Hello!
Can you please tell me how to take the X Y coordinates of a vertex in a drawing space?
My macro is giving incorrect data.
Should be 85, 205, 0.
What's my mistake?
Hello!
Can you please tell me how to take the X Y coordinates of a vertex in a drawing space?
My macro is giving incorrect data.
Should be 85, 205, 0.
What's my mistake?
My code:
Option Explicit
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swView As SldWorks.view
Dim swModelDocExt As SldWorks.ModelDocExtension
Dim Comp As SldWorks.Component2
Dim swVertex As SldWorks.Vertex
Dim vComps As Variant
Dim vComp As Variant
Dim vVerts As Variant
Dim vVert As Variant
Dim vEdges As Variant
Dim vEdge As Variant
Dim boolstatus As Boolean
Dim swSelMgr As SldWorks.SelectionMgr
Dim selData As SldWorks.SelectData
Dim i As Long
Dim horizontStartEnt As SldWorks.Vertex
Dim horizontEndEnt As SldWorks.Vertex
Dim verticalStartEnt As SldWorks.Vertex
Dim verticalEndEnt As SldWorks.Vertex
Dim horizontStartPtCoord As Variant
Dim horizontEndPtCoord As Variant
Dim verticalStartPtCoord As Variant
Dim verticalEndPtCoord As Variant
Sub main()
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swDraw = swModel
Set swModelDocExt = swDraw.Extension
Set swSelMgr = swDraw.SelectionManager
swDraw.ClearSelection2 True
Set swView = swDraw.GetFirstView
Set swView = swView.GetNextView
Set selData = swSelMgr.CreateSelectData
selData.view = swView
vComps = swView.GetVisibleComponents
Set Comp = vComps(0)
vVerts = swView.GetVisibleEntities2(Comp, swViewEntityType_e.swViewEntityType_Vertex)
If Not IsEmpty(vVerts) Then
Set horizontStartEnt = vVerts(LBound(vVerts))
swDraw.ClearSelection2 True
boolstatus = horizontStartEnt.Select4(True, selData)
boolstatus = swDraw.GraphicsRedraw2
End If
horizontStartPtCoord = horizontStartEnt.GetPoint
Debug.Print "Model space (X,Y,Z) - (" & horizontStartPtCoord(0) * 1000 & ", " & horizontStartPtCoord(1) * 1000 & ", " & horizontStartPtCoord(2) * 1000 & ")"
Debug.Print
Dim swViewTransform As SldWorks.MathTransform
Set swViewTransform = GetViewToSheetTransform(swDraw, swView)
Dim swMathUtils As mathUtility
Set swMathUtils = swApp.GetMathUtility
Dim swMathPt As SldWorks.MathPoint
Set swMathPt = swMathUtils.CreatePoint(horizontStartPtCoord)
Set swMathPt = swMathPt.MultiplyTransform(swViewTransform)
Dim vStartPt As Variant
vStartPt = swMathPt.ArrayData
Debug.Print "Drawing space (X,Y,Z) - (" & vStartPt(0) * 1000 & ", " & vStartPt(1) * 1000 & ", " & vStartPt(2) * 1000 & ")"
Debug.Print
'Must by 85, 205, 0
End Sub
Function GetViewToSheetTransform(draw As SldWorks.DrawingDoc, view As SldWorks.view) As SldWorks.MathTransform
Dim swMathUtils As SldWorks.mathUtility
Dim swSheet As SldWorks.Sheet
Set swMathUtils = swApp.GetMathUtility
Set swSheet = view.Sheet
Dim vSheetPrps As Variant
vSheetPrps = swSheet.GetProperties
Dim sheetScaleNom As Double
Dim sheetScaleDenom As Double
sheetScaleNom = vSheetPrps(2)
sheetScaleDenom = vSheetPrps(3)
Dim dSheetData(15) As Double
dSheetData(0) = 1: dSheetData(1) = 0: dSheetData(2) = 0: dSheetData(3) = 0
dSheetData(4) = 1: dSheetData(5) = 0: dSheetData(6) = 0: dSheetData(7) = 0
dSheetData(8) = 1: dSheetData(9) = 0: dSheetData(10) = 0: dSheetData(11) = 0
dSheetData(12) = sheetScaleNom / sheetScaleDenom: dSheetData(13) = 0: dSheetData(14) = 0: dSheetData(15) = 0
Dim swSheetTransform As SldWorks.MathTransform
Set swSheetTransform = swMathUtils.CreateTransform(dSheetData)
Set GetViewToSheetTransform = view.ModelToViewTransform.Multiply(swSheetTransform.Inverse())
End Function
Hello. Try this:
Option Explicit
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swView As SldWorks.view
Dim swModelDocExt As SldWorks.ModelDocExtension
Dim Comp As SldWorks.Component2
Dim swVertex As SldWorks.Vertex
Dim vComps As Variant
Dim vComp As Variant
Dim vVerts As Variant
Dim vVert As Variant
Dim vEdges As Variant
Dim vEdge As Variant
Dim boolstatus As Boolean
Dim swSelMgr As SldWorks.SelectionMgr
Dim selData As SldWorks.SelectData
Dim i As Long
Dim horizontStartEnt As SldWorks.Vertex
Dim horizontEndEnt As SldWorks.Vertex
Dim verticalStartEnt As SldWorks.Vertex
Dim verticalEndEnt As SldWorks.Vertex
Dim horizontStartPtCoord As Variant
Dim horizontEndPtCoord As Variant
Dim verticalStartPtCoord As Variant
Dim verticalEndPtCoord As VariantSub main()
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swDraw = swModel
Set swModelDocExt = swDraw.Extension
Set swSelMgr = swDraw.SelectionManagerswDraw.ClearSelection2 True
Set swView = swDraw.GetFirstView
Set swView = swView.GetNextViewSet selData = swSelMgr.CreateSelectData
selData.view = swViewvComps = swView.GetVisibleComponents
'Çàäàåì óñëîâíûå íà÷àëüíûå òî÷êè äëÿ ïðîñòàíîâêè ðàçìåðîâ
Set Comp = vComps(0)
vVerts = swView.GetVisibleEntities2(Comp, swViewEntityType_e.swViewEntityType_Vertex)
If Not IsEmpty(vVerts) Then
Set horizontStartEnt = vVerts(LBound(vVerts))swDraw.ClearSelection2 True
boolstatus = horizontStartEnt.Select4(True, selData)
boolstatus = swDraw.GraphicsRedraw2
End IfhorizontStartPtCoord = horizontStartEnt.GetPoint
Debug.Print "Model space (X,Y,Z) - (" & horizontStartPtCoord(0) * 1000 & ", " & horizontStartPtCoord(1) * 1000 & ", " & horizontStartPtCoord(2) * 1000 & ")"
Debug.PrintDim swModelToViewXForm As SldWorks.MathTransform
Set swModelToViewXForm = swView.ModelToViewTransformDim swViewTransform As SldWorks.MathTransform
Set swViewTransform = drawingToViewTransform(swView).InverseDim swMathUtils As MathUtility
Set swMathUtils = swApp.GetMathUtilityDim swMathPt As SldWorks.MathPoint
Set swMathPt = swMathUtils.CreatePoint(horizontStartPtCoord)
Set swMathPt = swMathPt.MultiplyTransform(swModelToViewXForm)
Set swMathPt = swMathPt.MultiplyTransform(swViewTransform)Dim vStartPt As Variant
vStartPt = swMathPt.ArrayDataDebug.Print "Drawing space (X,Y,Z) - (" & vStartPt(0) * 1000 & ", " & vStartPt(1) * 1000 & ", " & vStartPt(2) * 1000 & ")"
Debug.Print
'Must by 85, 205, 0End Sub
Function drawingToViewTransform(swView As SldWorks.view) As SldWorks.MathTransform
Dim swMathUtil As SldWorks.MathUtility
Dim transformData(15) As Double
Set swMathUtil = swApp.GetMathUtility
transformData(0) = Cos(swView.Angle)
transformData(1) = Sin(swView.Angle)
transformData(2) = 0#
transformData(3) = -Sin(swView.Angle)
transformData(4) = Cos(swView.Angle)
transformData(5) = 0#
transformData(6) = 0#
transformData(7) = 0#
transformData(8) = 1#
transformData(9) = swView.Position(0)
transformData(10) = swView.Position(1)
transformData(11) = 0#
transformData(12) = swView.ScaleDecimal
transformData(13) = 0#
transformData(14) = 0#
transformData(15) = 0#
Set drawingToViewTransform = swMathUtil.CreateTransform(transformData)
End Function
Is it possible to make the transformation happen correctly, regardless of how the view is inserted into the drawing?
replace:
Set swMathPt = swMathPt.MultiplyTransform(swModelToViewXForm)
Set swMathPt = swMathPt.MultiplyTransform(swViewTransform)
by:
Set swMathPt = swMathPt.MultiplyTransform(swViewTransform)
Set swMathPt = swMathPt.MultiplyTransform(swModelToViewXForm)
Hello!
Fifi Riri, Macro tested, for drawing a part, the macro works fine even if the part consists of several bodies.
But for an assembly drawing, the macro returns incorrect data. How to fix it?
Can I make the macro work for both the part drawing and the assembly drawing?
Hello,
You need to get the component, then use Transform2 to get the transform
2012 SOLIDWORKS API Help - Transform2 Property (IComponent2)
I don't have time to dig into your macro right now, but usually, it helps to understand the underlying matrix transformations a bit better. Because I still find it hard myself, I wrote down everything I know about matrix transformations in SolidWorks:
https://cadbooster.com/nl/complete-overview-of-matrix-transformations-in-the-solidworks-api/
replace:
Set swMathPt = swMathPt.MultiplyTransform(swModelToViewXForm)
Set swMathPt = swMathPt.MultiplyTransform(swViewTransform)
by:
Set swMathPt = swMathPt.MultiplyTransform(swViewTransform)
Set swMathPt = swMathPt.MultiplyTransform(swModelToViewXForm)