Files
Lesson 5.3 - align specific point on pin to specific point on block Associated model(s)
Code
Option Explicit
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swComp As SldWorks.Component2
Dim swMathUtil As SldWorks.MathUtility
Dim swBlockMathPt As SldWorks.MathPoint
Dim swPinMathPt As SldWorks.MathPoint
Dim swBlockTransform As SldWorks.MathTransform
Dim swPinTransform As SldWorks.MathTransform
Dim dblBlockPtParams(2) As Double
Dim dblPinPtParams(2) As Double
Dim vArrayData As Variant
Dim vBlockTransformData As Variant
Dim vPinTransformData As Variant
Dim i As Integer
Sub main()
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swAssy = swModel
Set swMathUtil = swApp.GetMathUtility
'Desired point relative to the pin origin
dblPinPtParams(0) = 0
dblPinPtParams(1) = 0.01
dblPinPtParams(2) = 0
'Desired point relative to the block origin
dblBlockPtParams(0) = 0.025
dblBlockPtParams(1) = 0
dblBlockPtParams(2) = -0.025
'Take into account dblPinPtParams if not the origin; whether added or subtracted depends on _
extrude feature direction in pin
dblBlockPtParams(0) = dblBlockPtParams(0) + dblPinPtParams(0)
dblBlockPtParams(1) = dblBlockPtParams(1) + dblPinPtParams(1)
dblBlockPtParams(2) = dblBlockPtParams(2) + dblPinPtParams(2)
'Turn block point into math point
Set swBlockMathPt = swMathUtil.CreatePoint(dblBlockPtParams)
'Convert math point to assembly space
Set swComp = swAssy.GetComponentByName("transform_test_block-1")
Set swBlockTransform = swComp.Transform2
Set swBlockMathPt = swBlockMathPt.MultiplyTransform(swBlockTransform)
'Get array data from math point
vArrayData = swBlockMathPt.ArrayData
'Get pin transform
Set swComp = swAssy.GetComponentByName("transform_test_pin-1")
Set swPinTransform = swComp.Transform2
'Modify pin transform so that pin location data matches math point data
vPinTransformData = swPinTransform.ArrayData
For i = 9 To 11
vPinTransformData(i) = vArrayData(i - 9)
Next i
'Modify pin transform so that rotation data matches block transform rotation data
vBlockTransformData = swBlockTransform.ArrayData
For i = 0 To 8
vPinTransformData(i) = vBlockTransformData(i)
Next i
'Create a transform from the new vPinTransformData and apply it to the pin
Set swBlockTransform = swMathUtil.CreateTransform(vPinTransformData)
swComp.Transform2 = swBlockTransform
swModel.ForceRebuild3 False
End Sub