Run rotation animation for the component using SOLIDWORKS API
This macro demonstrates how to run a smooth animation of components rotation around Y axis of the component using the presentation transforms via IComponent2::PresentationTransform SOLIDWORKS API method.
This allows to only move the components for visual purposes without changing the geometry. Component will be moved regardless if it is fully defined in space (by mates or fix constraint). And the mates are still preserved.
- Select any component in the assembly and run the macro
- Component is rotated around its Y axis
- To stop the animation clear the selection (deselect all objects)
- To modify the speed of the rotation change the optional speed parameter of RunRotationAnimation method
If Not swComp Is Nothing Then
RunRotationAnimation swModel, swComp, 2 'speed x2
Else
MsgBox "Please select component"
End If
Note
In order to enable presentation mode it is required to set the IAssemblyDoc::EnablePresentation proeprty to True.
It is required to set this property to False after the animation is finished otherwise all SOLIDWORKS menues will be locked:
{ width=300 }
Const PI As Double = 3.14159265359
Dim swApp As SldWorks.SldWorks
Sub main()
Set swApp = Application.SldWorks
Dim swModel As SldWorks.ModelDoc2
Set swModel = swApp.ActiveDoc
If Not swModel Is Nothing Then
Dim swSelMgr As SldWorks.SelectionMgr
Set swSelMgr = swModel.SelectionManager
Dim swComp As SldWorks.Component2
Set swComp = swSelMgr.GetSelectedObjectsComponent4(1, -1)
If Not swComp Is Nothing Then
RunRotationAnimation swModel, swComp
Else
MsgBox "Please select component"
End If
Else
MsgBox "Please open assembly"
End If
End Sub
Sub RunRotationAnimation(assy As SldWorks.AssemblyDoc, comp As SldWorks.Component2, Optional speed As Double = 1)
Dim swSelMgr As SldWorks.SelectionMgr
Set swSelMgr = assy.SelectionManager
Dim rotStep As Double
rotStep = PI * 2 / 360 * speed
Dim curAng As Double
Dim swModelView As SldWorks.ModelView
Set swModelView = assy.ActiveView
assy.EnablePresentation = True
While swSelMgr.GetSelectedObjectCount2(-1) <> 0
For curAng = 0 To PI * 2 Step rotStep
Dim animStep As MathTransform
Set animStep = GetTransform(comp, curAng)
comp.PresentationTransform = animStep
swModelView.GraphicsRedraw Nothing
DoEvents
Next
Wend
assy.EnablePresentation = False
End Sub
Function GetTransform(comp As SldWorks.Component2, angle As Double) As MathTransform
Dim swMathUtils As SldWorks.MathUtility
Set swMathUtils = swApp.GetMathUtility
Dim swOrigPt As SldWorks.MathPoint
Dim dPt(2) As Double
dPt(0) = 0: dPt(1) = 0: dPt(2) = 0
Set swOrigPt = swMathUtils.CreatePoint(dPt)
Set swOrigPt = swOrigPt.MultiplyTransform(comp.Transform2)
Dim swAxisVec As SldWorks.MathVector
Dim dVec(2) As Double
dVec(0) = 0: dVec(1) = 1: dVec(2) = 0
Set swAxisVec = swMathUtils.CreateVector(dVec)
Set swAxisVec = swAxisVec.MultiplyTransform(comp.Transform2)
Set GetTransform = swMathUtils.CreateTransformRotateAxis(swOrigPt, swAxisVec, angle)
End Function