VERSION 5.00
Object = "{6EBD9146-D219-11D2-ADE5-0000C00F4EF9}#1.9#0"; "halconx.dll"
Begin VB.Form MatchingForm
Caption = "Matching and Measurement Demo"
ClientHeight = 8970
ClientLeft = 60
ClientTop = 345
ClientWidth = 11790
LinkTopic = "Form1"
ScaleHeight = 598
ScaleMode = 3 'Pixel
ScaleWidth = 786
StartUpPosition = 3 'Windows Default
Begin HALCONXLibCtl.HWindowXCtrl HXCtrl
Height = 7380
Left = 240
OleObjectBlob = "matching.frx":0000
TabIndex = 0
Top = 240
Width = 9690
End
Begin VB.CommandButton CreateBtn
Caption = "Create Model"
Height = 495
Left = 10200
TabIndex = 8
Top = 240
Width = 1215
End
Begin VB.Timer Timer
Interval = 1
Left = 10320
Top = 4200
End
Begin VB.CommandButton StopBtn
Caption = "Stop"
Height = 495
Left = 10200
TabIndex = 2
Top = 1680
Width = 1215
End
Begin VB.CommandButton StartBtn
Caption = "Start"
Height = 495
Left = 10200
TabIndex = 1
Top = 960
Width = 1215
End
Begin VB.Label MeasureDIstLabel
Caption = "Minimum lead distance: "
Height = 255
Left = 3720
TabIndex = 11
Top = 8160
Width = 2415
End
Begin VB.Label MeasureTimeLabel
Caption = "Time: "
Height = 255
Left = 1080
TabIndex = 10
Top = 8160
Width = 855
End
Begin VB.Label MeasureNumLabel
Caption = "Number of leads: "
Height = 255
Left = 2040
TabIndex = 9
Top = 8160
Width = 1575
End
Begin VB.Label MatchingScoreLabel
Caption = "Score: "
Height = 255
Left = 2040
TabIndex = 7
Top = 7800
Width = 1215
End
Begin VB.Label MatchingTimeLabel
Caption = "Time: "
Height = 255
Left = 1080
TabIndex = 6
Top = 7800
Width = 855
End
Begin VB.Label MeasureLabel
Caption = "Measure:"
Height = 255
Left = 240
TabIndex = 5
Top = 8160
Width = 735
End
Begin VB.Label MatchingLabel
Caption = "Matching:"
Height = 255
Left = 240
TabIndex = 4
Top = 7800
Width = 735
End
Begin VB.Label Copyright
Alignment = 2 'Center
Caption = "?2000-2015 MVTec Software GmbH"
BeginProperty Font
Name = "MS Sans Serif"
Size = 9.75
Charset = 0
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 255
Left = 240
TabIndex = 3
Top = 8640
Width = 10935
End
End
Attribute VB_Name = "MatchingForm"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
' HALCON/VB pattern matching and measure example
'
' ?2000-2015 MVTec Software GmbH
'
' Purpose:
' This example program shows the use of pattern matching with shape models
' to locate an object. Furthermore, it shows how to use the detected position
' and rotation of the object to construct search spaces for inspection tasks.
' In this particular example, the print on an IC is used to find the IC. From
' the found position and rotation, two measurement rectangles are constructed
' to measure the spacing between the leads of the IC. Because of the lighting
' used in this example, the leads have the saturated gray value of 255 at
' several positions and rotations, which enlarges the apparent width of the
' leads, and hence seems to reduce the spacing between the leads, although the
' same board is used in all images.
Option Explicit
Dim Window As HWindowX
Dim Framegrabber As New HFramegrabberX
Dim Img As HImageX, ImgReduced As HImageX, ModelImage As HImageX
Dim Rectangle As New HRegionX, ModelRegion As HRegionX, ModelRegionTrans As HRegionX
Dim Rectangle1 As New HRegionX, Rectangle2 As New HRegionX
Dim ShapeModel As New HShapeModelX
Dim Row As Variant, Column As Variant, Area As Variant
Dim Rect1Row As Double, Rect1Col As Double
Dim Rect2Row As Double, Rect2Col As Double
Dim RectPhi As Double, RectLength1 As Double, RectLength2 As Double
Dim Sys As New HSystemX
Dim Tuple As New HTupleX
Dim Matrix As New HHomMat2DX
Dim Measure1 As New HMeasureX, Measure2 As New HMeasureX
Dim ImgWidth As Variant, ImgHeight As Variant
Private Sub Form_Load()
Set Window = HXCtrl.HalconWindow
Call Window.SetPart(0, 0, 491, 645)
Call Framegrabber.OpenFramegrabber("File", 1, 1, 0, 0, 0, 0, "default", -1, "default", _
-1, "default", "board/board.seq", "default", 1, -1)
Set Img = Framegrabber.GrabImage()
Call Window.DispImage(Img)
ImgWidth = Img.GetImageSize(ImgHeight)
Call Rectangle.GenRectangle1(188, 182, 298, 412)
Area = Rectangle.AreaCenter(Row, Column)
Rect1Row = Row - 102
Rect1Col = Column + 5
Rect2Row = Row + 107
Rect2Col = Column + 5
RectPhi = 0
RectLength1 = 170
RectLength2 = 5
CreateBtn.Enabled = True
StartBtn.Enabled = False
StopBtn.Enabled = False
Timer.Enabled = False
End Sub
Private Sub CreateBtn_Click()
CreateBtn.Enabled = False
Call Window.SetColor("red")
Call Window.SetDraw("margin")
Call Window.SetLineWidth(3)
Call Window.DispRegion(Rectangle)
Set ImgReduced = Img.ReduceDomain(Rectangle)
Set ModelImage = ImgReduced.InspectShapeModel(ModelRegion, 1, 30)
Call Rectangle1.GenRectangle2(Rect1Row, Rect1Col, RectPhi, RectLength1, RectLength2)
Call Rectangle2.GenRectangle2(Rect2Row, Rect2Col, RectPhi, RectLength1, RectLength2)
Call ShapeModel.CreateShapeModel(ImgReduced, 4, 0, Tuple.TupleRad(360), Tuple.TupleRad(1), _
"none", "use_polarity", 30, 10)
Call Window.SetColor("green")
Call Window.SetDraw("fill")
Call Window.DispRegion(ModelRegion)
Call Window.SetColor("blue")
Call Window.SetDraw("margin")
Call Window.DispRegion(Rectangle1)
Call Window.DispRegion(Rectangle2)
StopBtn.Enabled = False
StartBtn.Enabled = True
End Sub
Private Sub StartBtn_Click()
Timer.Enabled = True
CreateBtn.Enabled = False
StopBtn.Enabled = True
StartBtn.Enabled = False
End Sub
Private Sub StopBtn_Click()
Timer.Enabled = False
CreateBtn.Enabled = False
StopBtn.Enabled = False
StartBtn.Enabled = True
End Sub
Private Sub Timer_Timer()
Action
End Sub
Private Sub Action()
Dim S1 As Double, S2 As Double
Dim RowCheck As Variant, ColumnCheck As Variant
Dim AngleCheck As Variant, Score As Variant
Dim Rect1RowCheck As Variant, Rect1ColCheck As Variant
Dim Rect2RowCheck As Variant, Rect2ColCheck As Variant
Dim RowEdgeFirst1 As Variant, ColumnEdgeFirst1 As Variant
Dim AmplitudeFirst1 As Variant, RowEdgeSecond1 As Variant
Dim ColumnEdgeSecond1 As Variant, AmplitudeSecond1 As Variant
Dim IntraDistance1 As Variant, InterDistance1 As Variant
Dim RowEdgeFirst2 As Variant, ColumnEdgeFirst2 As Variant
Dim AmplitudeFirst2 As Variant, RowEdgeSecond2 As Variant
Dim ColumnEdgeSecond2 As Variant, AmplitudeSecond2 As Variant
Dim IntraDistance2 As Variant, InterDistance2 As Variant
Dim NumLeads As Long, MinDistance As Variant
Set Img = Framegrabber.GrabImage()
Call Window.DispImage(Img)
' Find the IC in the current image.
S1 = Sys.CountSeconds()
RowCheck = ShapeModel.FindShapeModel(Img, 0, Tuple.TupleRad(360), 0.7, 1, 0.5, "least_squares", _
4, 0.7, ColumnCheck, AngleCheck, Score)
S2 = Sys.CountSeconds()
MatchingTimeLabel = "Time: " & Format(((S2 - S1) * 1000), "0.00")
MatchingScoreLabel = "Score: "
If Not IsEmpty(RowCheck) And Not IsArray(RowCheck) Then
MatchingScoreLabel = "Score: " & Format(Score, "0.00000")
' Rotate the model for visualization purposes.
Call Matrix.VectorAngleToRigid(Row, Column, 0, RowCheck, ColumnCheck, AngleCheck)
Set ModelRegionTrans = ModelRegion.AffineTransRegion(Matrix, "false")
Call Window.SetColor("green")
Call Window.SetDraw("fill")
Call Window.DispRegion(ModelRegionTrans)
' Compute the parameters of the measurement rectangles.
Rect1RowCheck = Matrix.AffineTransPixel(Rect1Row, Rect1Col, Rect1ColCheck)
Rect2RowCheck = Matrix.AffineTransPixel(Rect2Row, Rect2Col, Rect2ColCheck)
' For visualization purposes, generate the two rectangles as regions and display them.
Call Rectangle1.GenRectangle2(Rect1RowCheck, Rect1ColCheck, RectPhi + AngleCheck, _
RectLength1, RectLength2)
Call Rectangle2.GenRectangle2(Rect2RowCheck, Rect2ColCheck, RectPhi + AngleCheck, _
RectLength1, RectLength2)
Call Window.SetColor("blue")
Call Window.SetDraw("margin")
Call Window.DispRegion(Rectangle1)
Call Window.DispRegion(Rectangle2)
' Do the actual masurements.
S1 = Sys.CountSeconds()
Call Measure1.GenMeasureRectangle2(Rect1RowCheck, Rect1ColCheck, RectPhi + AngleCheck, _
RectLength1, RectLength2, ImgWidth, ImgHeight, _
"bilinear")
Call Measure2.GenMeasureRectangle2(Rect2RowCheck, Rect2ColCheck, RectPhi + AngleCheck, _
RectLength1, RectLength2, ImgWidth, ImgHeight, _
"bilinear")
RowEdgeFirst1 = Measure1.MeasurePairs(Img, 2, 90, "positive", "all", ColumnEdgeFirst1, _
AmplitudeFirst1, RowEdgeSecond1, ColumnEdgeSecond1, _
AmplitudeSecond1, IntraDistance1, InterDistance1)
RowEdgeFirst2 = Measure2.MeasurePairs(Img, 2, 90, "positive", "all", ColumnEdgeFirst2, _
AmplitudeFirst2, RowEdgeSecond2, ColumnEdgeSecond2, _
AmplitudeSecond2, IntraDistance2, InterDistance2)
S2 = Sys.CountSeconds()
MeasureTimeLabel = "Time: " & Format(((S2 - S1) * 1000), "0.00")
Call Window.SetColor("red")
Call Window.DispLine(Tuple.TupleSub(RowEdgeFirst1, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _
Tuple.TupleSub(ColumnEdgeFirst1, Tuple.TupleMult(RectLength2, Sin(AngleCheck))), _
Tuple.TupleAdd(RowEdgeFirst1, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _
Tuple.TupleAdd(ColumnEdgeFirst1, Tuple.TupleMult(RectLength2, Sin(AngleCheck))))
Call Window.DispLine(Tuple.TupleSub(RowEdgeSecond1, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _
Tuple.TupleSub(ColumnEdgeSecond1, Tuple.TupleMult(RectLength2, Sin(AngleCheck))), _
Tuple.TupleAdd(RowEdgeSecond1, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _
Tuple.TupleAdd(ColumnEdgeSecond1, Tuple.TupleMult(RectLength2, Sin(AngleCheck))))
Call Window.DispLine(Tuple.TupleSub(RowEdgeFirst2, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _
Tuple.TupleSub(ColumnEdgeFirst2, Tuple.TupleMult(RectLength2, Sin(AngleCheck))), _
Tuple.TupleAdd(RowEdgeFirst2, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _
Tuple.TupleAdd(ColumnEdgeFirst2, Tuple.TupleMult(RectLength2, Sin(AngleCheck))))
Call Window.DispLine(Tuple.TupleSub(RowEdgeSecond2, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _
Tuple.TupleSub(ColumnEdgeSecond2, Tuple.TupleMult(RectLength2, Sin(AngleCheck))), _
Tuple.TupleAdd(RowEdgeSecond2, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _
Tuple.TupleAdd(ColumnEdgeSecond2, Tuple.TupleMult(RectLength2, Sin(AngleCheck))))
NumLeads = Tuple.TupleLength(IntraDistance1) + Tuple.TupleLength(IntraDistance2)
MeasureNumLabel = "Number of leads: " & Format(NumLeads, "00")
MinDistance = Tuple.TupleMin(Tuple.TupleConcat(InterDistance1, InterDistance2))
MeasureDIstLabel = "Minimum lead distance: " & Format(MinDistance, "#0.000")
End If
End Sub
相同功能的VB6版本代码如下:
VERSION 5.00 Object = "{6EBD9146-D219-11D2-ADE5-0000C00F4EF9}#1.9#0"; "halconx.dll" Begin VB.Form MatchingForm Caption = "Matching and Measurement Demo" ClientHeight = 8970 ClientLeft = 60 ClientTop = 345 ClientWidth = 11790 LinkTopic = "Form1" ScaleHeight = 598 ScaleMode = 3 'Pixel ScaleWidth = 786 StartUpPosition = 3 'Windows Default Begin HALCONXLibCtl.HWindowXCtrl HXCtrl Height = 7380 Left = 240 OleObjectBlob = "matching.frx":0000 TabIndex = 0 Top = 240 Width = 9690 End Begin VB.CommandButton CreateBtn Caption = "Create Model" Height = 495 Left = 10200 TabIndex = 8 Top = 240 Width = 1215 End Begin VB.Timer Timer Interval = 1 Left = 10320 Top = 4200 End Begin VB.CommandButton StopBtn Caption = "Stop" Height = 495 Left = 10200 TabIndex = 2 Top = 1680 Width = 1215 End Begin VB.CommandButton StartBtn Caption = "Start" Height = 495 Left = 10200 TabIndex = 1 Top = 960 Width = 1215 End Begin VB.Label MeasureDIstLabel Caption = "Minimum lead distance: " Height = 255 Left = 3720 TabIndex = 11 Top = 8160 Width = 2415 End Begin VB.Label MeasureTimeLabel Caption = "Time: " Height = 255 Left = 1080 TabIndex = 10 Top = 8160 Width = 855 End Begin VB.Label MeasureNumLabel Caption = "Number of leads: " Height = 255 Left = 2040 TabIndex = 9 Top = 8160 Width = 1575 End Begin VB.Label MatchingScoreLabel Caption = "Score: " Height = 255 Left = 2040 TabIndex = 7 Top = 7800 Width = 1215 End Begin VB.Label MatchingTimeLabel Caption = "Time: " Height = 255 Left = 1080 TabIndex = 6 Top = 7800 Width = 855 End Begin VB.Label MeasureLabel Caption = "Measure:" Height = 255 Left = 240 TabIndex = 5 Top = 8160 Width = 735 End Begin VB.Label MatchingLabel Caption = "Matching:" Height = 255 Left = 240 TabIndex = 4 Top = 7800 Width = 735 End Begin VB.Label Copyright Alignment = 2 'Center Caption = "?2000-2015 MVTec Software GmbH" BeginProperty Font Name = "MS Sans Serif" Size = 9.75 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 255 Left = 240 TabIndex = 3 Top = 8640 Width = 10935 End End Attribute VB_Name = "MatchingForm" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = True Attribute VB_Exposed = False ' HALCON/VB pattern matching and measure example ' ' ?2000-2015 MVTec Software GmbH ' ' Purpose: ' This example program shows the use of pattern matching with shape models ' to locate an object. Furthermore, it shows how to use the detected position ' and rotation of the object to construct search spaces for inspection tasks. ' In this particular example, the print on an IC is used to find the IC. From ' the found position and rotation, two measurement rectangles are constructed ' to measure the spacing between the leads of the IC. Because of the lighting ' used in this example, the leads have the saturated gray value of 255 at ' several positions and rotations, which enlarges the apparent width of the ' leads, and hence seems to reduce the spacing between the leads, although the ' same board is used in all images. Option Explicit Dim Window As HWindowX Dim Framegrabber As New HFramegrabberX Dim Img As HImageX, ImgReduced As HImageX, ModelImage As HImageX Dim Rectangle As New HRegionX, ModelRegion As HRegionX, ModelRegionTrans As HRegionX Dim Rectangle1 As New HRegionX, Rectangle2 As New HRegionX Dim ShapeModel As New HShapeModelX Dim Row As Variant, Column As Variant, Area As Variant Dim Rect1Row As Double, Rect1Col As Double Dim Rect2Row As Double, Rect2Col As Double Dim RectPhi As Double, RectLength1 As Double, RectLength2 As Double Dim Sys As New HSystemX Dim Tuple As New HTupleX Dim Matrix As New HHomMat2DX Dim Measure1 As New HMeasureX, Measure2 As New HMeasureX Dim ImgWidth As Variant, ImgHeight As Variant Private Sub Form_Load() Set Window = HXCtrl.HalconWindow Call Window.SetPart(0, 0, 491, 645) Call Framegrabber.OpenFramegrabber("File", 1, 1, 0, 0, 0, 0, "default", -1, "default", _ -1, "default", "board/board.seq", "default", 1, -1) Set Img = Framegrabber.GrabImage() Call Window.DispImage(Img) ImgWidth = Img.GetImageSize(ImgHeight) Call Rectangle.GenRectangle1(188, 182, 298, 412) Area = Rectangle.AreaCenter(Row, Column) Rect1Row = Row - 102 Rect1Col = Column + 5 Rect2Row = Row + 107 Rect2Col = Column + 5 RectPhi = 0 RectLength1 = 170 RectLength2 = 5 CreateBtn.Enabled = True StartBtn.Enabled = False StopBtn.Enabled = False Timer.Enabled = False End Sub Private Sub CreateBtn_Click() CreateBtn.Enabled = False Call Window.SetColor("red") Call Window.SetDraw("margin") Call Window.SetLineWidth(3) Call Window.DispRegion(Rectangle) Set ImgReduced = Img.ReduceDomain(Rectangle) Set ModelImage = ImgReduced.InspectShapeModel(ModelRegion, 1, 30) Call Rectangle1.GenRectangle2(Rect1Row, Rect1Col, RectPhi, RectLength1, RectLength2) Call Rectangle2.GenRectangle2(Rect2Row, Rect2Col, RectPhi, RectLength1, RectLength2) Call ShapeModel.CreateShapeModel(ImgReduced, 4, 0, Tuple.TupleRad(360), Tuple.TupleRad(1), _ "none", "use_polarity", 30, 10) Call Window.SetColor("green") Call Window.SetDraw("fill") Call Window.DispRegion(ModelRegion) Call Window.SetColor("blue") Call Window.SetDraw("margin") Call Window.DispRegion(Rectangle1) Call Window.DispRegion(Rectangle2) StopBtn.Enabled = False StartBtn.Enabled = True End Sub Private Sub StartBtn_Click() Timer.Enabled = True CreateBtn.Enabled = False StopBtn.Enabled = True StartBtn.Enabled = False End Sub Private Sub StopBtn_Click() Timer.Enabled = False CreateBtn.Enabled = False StopBtn.Enabled = False StartBtn.Enabled = True End Sub Private Sub Timer_Timer() Action End Sub Private Sub Action() Dim S1 As Double, S2 As Double Dim RowCheck As Variant, ColumnCheck As Variant Dim AngleCheck As Variant, Score As Variant Dim Rect1RowCheck As Variant, Rect1ColCheck As Variant Dim Rect2RowCheck As Variant, Rect2ColCheck As Variant Dim RowEdgeFirst1 As Variant, ColumnEdgeFirst1 As Variant Dim AmplitudeFirst1 As Variant, RowEdgeSecond1 As Variant Dim ColumnEdgeSecond1 As Variant, AmplitudeSecond1 As Variant Dim IntraDistance1 As Variant, InterDistance1 As Variant Dim RowEdgeFirst2 As Variant, ColumnEdgeFirst2 As Variant Dim AmplitudeFirst2 As Variant, RowEdgeSecond2 As Variant Dim ColumnEdgeSecond2 As Variant, AmplitudeSecond2 As Variant Dim IntraDistance2 As Variant, InterDistance2 As Variant Dim NumLeads As Long, MinDistance As Variant Set Img = Framegrabber.GrabImage() Call Window.DispImage(Img) ' Find the IC in the current image. S1 = Sys.CountSeconds() RowCheck = ShapeModel.FindShapeModel(Img, 0, Tuple.TupleRad(360), 0.7, 1, 0.5, "least_squares", _ 4, 0.7, ColumnCheck, AngleCheck, Score) S2 = Sys.CountSeconds() MatchingTimeLabel = "Time: " & Format(((S2 - S1) * 1000), "0.00") MatchingScoreLabel = "Score: " If Not IsEmpty(RowCheck) And Not IsArray(RowCheck) Then MatchingScoreLabel = "Score: " & Format(Score, "0.00000") ' Rotate the model for visualization purposes. Call Matrix.VectorAngleToRigid(Row, Column, 0, RowCheck, ColumnCheck, AngleCheck) Set ModelRegionTrans = ModelRegion.AffineTransRegion(Matrix, "false") Call Window.SetColor("green") Call Window.SetDraw("fill") Call Window.DispRegion(ModelRegionTrans) ' Compute the parameters of the measurement rectangles. Rect1RowCheck = Matrix.AffineTransPixel(Rect1Row, Rect1Col, Rect1ColCheck) Rect2RowCheck = Matrix.AffineTransPixel(Rect2Row, Rect2Col, Rect2ColCheck) ' For visualization purposes, generate the two rectangles as regions and display them. Call Rectangle1.GenRectangle2(Rect1RowCheck, Rect1ColCheck, RectPhi + AngleCheck, _ RectLength1, RectLength2) Call Rectangle2.GenRectangle2(Rect2RowCheck, Rect2ColCheck, RectPhi + AngleCheck, _ RectLength1, RectLength2) Call Window.SetColor("blue") Call Window.SetDraw("margin") Call Window.DispRegion(Rectangle1) Call Window.DispRegion(Rectangle2) ' Do the actual masurements. S1 = Sys.CountSeconds() Call Measure1.GenMeasureRectangle2(Rect1RowCheck, Rect1ColCheck, RectPhi + AngleCheck, _ RectLength1, RectLength2, ImgWidth, ImgHeight, _ "bilinear") Call Measure2.GenMeasureRectangle2(Rect2RowCheck, Rect2ColCheck, RectPhi + AngleCheck, _ RectLength1, RectLength2, ImgWidth, ImgHeight, _ "bilinear") RowEdgeFirst1 = Measure1.MeasurePairs(Img, 2, 90, "positive", "all", ColumnEdgeFirst1, _ AmplitudeFirst1, RowEdgeSecond1, ColumnEdgeSecond1, _ AmplitudeSecond1, IntraDistance1, InterDistance1) RowEdgeFirst2 = Measure2.MeasurePairs(Img, 2, 90, "positive", "all", ColumnEdgeFirst2, _ AmplitudeFirst2, RowEdgeSecond2, ColumnEdgeSecond2, _ AmplitudeSecond2, IntraDistance2, InterDistance2) S2 = Sys.CountSeconds() MeasureTimeLabel = "Time: " & Format(((S2 - S1) * 1000), "0.00") Call Window.SetColor("red") Call Window.DispLine(Tuple.TupleSub(RowEdgeFirst1, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _ Tuple.TupleSub(ColumnEdgeFirst1, Tuple.TupleMult(RectLength2, Sin(AngleCheck))), _ Tuple.TupleAdd(RowEdgeFirst1, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _ Tuple.TupleAdd(ColumnEdgeFirst1, Tuple.TupleMult(RectLength2, Sin(AngleCheck)))) Call Window.DispLine(Tuple.TupleSub(RowEdgeSecond1, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _ Tuple.TupleSub(ColumnEdgeSecond1, Tuple.TupleMult(RectLength2, Sin(AngleCheck))), _ Tuple.TupleAdd(RowEdgeSecond1, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _ Tuple.TupleAdd(ColumnEdgeSecond1, Tuple.TupleMult(RectLength2, Sin(AngleCheck)))) Call Window.DispLine(Tuple.TupleSub(RowEdgeFirst2, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _ Tuple.TupleSub(ColumnEdgeFirst2, Tuple.TupleMult(RectLength2, Sin(AngleCheck))), _ Tuple.TupleAdd(RowEdgeFirst2, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _ Tuple.TupleAdd(ColumnEdgeFirst2, Tuple.TupleMult(RectLength2, Sin(AngleCheck)))) Call Window.DispLine(Tuple.TupleSub(RowEdgeSecond2, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _ Tuple.TupleSub(ColumnEdgeSecond2, Tuple.TupleMult(RectLength2, Sin(AngleCheck))), _ Tuple.TupleAdd(RowEdgeSecond2, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _ Tuple.TupleAdd(ColumnEdgeSecond2, Tuple.TupleMult(RectLength2, Sin(AngleCheck)))) NumLeads = Tuple.TupleLength(IntraDistance1) + Tuple.TupleLength(IntraDistance2) MeasureNumLabel = "Number of leads: " & Format(NumLeads, "00") MinDistance = Tuple.TupleMin(Tuple.TupleConcat(InterDistance1, InterDistance2)) MeasureDIstLabel = "Minimum lead distance: " & Format(MinDistance, "#0.000") End If End Sub