MACRO LIBRARY

Lesson 5.3 - align specific pt on pin to specific pt on block

Free public access. No account or subscription required.

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