Hello,
I would like to retrieve the coordinates of the vertices of a pre-selected rectangular face, but with coordinates relative to the active sketch.
The correct coordinates relative to the pre-selected face in the figure should be:
X 0 Y -49.27602687
X 30-Y 49.27602687
X 30 Y 28.00416462
X 0 Y 28.00416462
But the macro doesn't work correctly,
Could you help me? I enclose also the model on which to test and a picture on the face to be selected for testing.
Thanks to all
Here my macro
' Preconditions:
' (1) Part or Assembly is open.
' (2) Face of a component is selected.
'
' Postconditions: The four vertex coordinate relative to active sketch are return
'
'
'--------------------------------------
Option Explicit
Sub main()
Dim pSWApp As SldWorks.SldWorks
Dim pModel As SldWorks.ModelDoc2
Dim pSelMgr As SldWorks.SelectionMgr
Dim pSketch As SldWorks.Sketch
Dim pSketchSeg As SldWorks.SketchSegment
Dim pFace As SldWorks.Face2
Dim swLoop As SldWorks.Loop2
Dim swEdge As SldWorks.Edge
Dim vEdgeArr As Variant
Dim vEdge As Variant
Dim swCurve As SldWorks.Curve
Dim swSketch As SldWorks.Sketch
Dim swSketchSeg As SldWorks.SketchSegment
Dim swXForm As SldWorks.MathTransform
Dim swMathUtil As SldWorks.MathUtility
Dim swMathStartPt As SldWorks.MathPoint
Dim swMathEndPt As SldWorks.MathPoint
Dim vMidPts As Variant
Dim vCurveParam As Variant
Dim nStartPt(2) As Double
Dim nEndPt(2) As Double
Dim nEdgeCount As Long
Dim i As Long
Dim j As Long
Dim bRet As Boolean
Dim boolstatus As Boolean
Set pSWApp = CreateObject("SldWorks.Application")
Set pModel = pSWApp.ActiveDoc
Set pSelMgr = pModel.SelectionManager
Set pFace = pSelMgr.GetSelectedObject6(1, 0)
If pFace Is Nothing Then
boolstatus = pSWApp.SendMsgToUser2("Please select a face", _
swMbWarning, swMbOk)
Exit Sub
End If
pModel.InsertSketch2 True
pModel.SetAddToDB True
pModel.SetDisplayWhenAdded False 'Doesn't show the changes during
'the program execution
Set pSketch = pModel.GetActiveSketch2
Set swXForm = pSketch.ModelToSketchTransform 'Transform from model to sketch
Set swMathUtil = pSWApp.GetMathUtility
'Find loops of closed edges on the selected surface
Set swLoop = pFace.GetFirstLoop
While Not swLoop Is Nothing
i = i + 1
Debug.Print "Loop(" & i & ")"
Debug.Print " IsOuter = " & swLoop.IsOuter
Debug.Print " IsSingular = " & swLoop.IsSingular
Debug.Print ""
'Find the outer loop
If swLoop.IsOuter Then
vEdgeArr = swLoop.GetEdges: Debug.Assert UBound(vEdgeArr) >= 0
nEdgeCount = swLoop.GetEdgeCount
'Even number of edges are available here.
If Not nEdgeCount Mod 2 = 0 Then
boolstatus = pSWApp.SendMsgToUser2( _
"Please select the rectangular face...", _
swMbWarning, swMbOk)
pModel.InsertSketch2 True
bRet = pModel.EditRebuild3: Debug.Assert bRet
Exit Sub
End If
'Here start the problem
i = 0
For Each vEdge In vEdgeArr
Set swEdge = vEdge
vCurveParam = swEdge.GetCurveParams2
For j = 0 To 1
nStartPt(j) = vCurveParam(j)
nEndPt(j) = vCurveParam(j)
Set swMathStartPt = swMathUtil.CreatePoint((nStartPt))
Set swMathStartPt = swMathStartPt.MultiplyTransform(swXForm)
Set swMathEndPt = swMathUtil.CreatePoint((nEndPt))
Set swMathEndPt = swMathEndPt.MultiplyTransform(swXForm)
Debug.Print "Edge " & j & " X:" & (swMathStartPt.ArrayData(0) * 1000#) & " Y:" & (swMathStartPt.ArrayData(1) * 1000#) & " Z:" & (swMathStartPt.ArrayData(2) * 1000#)
Next j
Next vEdge
End If
Set swLoop = swLoop.GetNext
Wend
pModel.SetDisplayWhenAdded True
pModel.SetAddToDB False
End Sub
SolidworksApi macros