Skip to main content

Compare model views transformations using SOLIDWORKS API

Model View Orientation{ width=250 }

This example demonstrates how to compare two model views in part or assembly using SOLIDWORKS API.

Macro will identify the changes and display the result if

  • Views are the same
  • Views are of different orientation (i.e. rotated)
  • Views are of different translation (i.e. moved)
  • Views are of different scale

Macro is using user defined type ViewData to store the orientation, translation and scale of the view. This structure is not linked to the view and represents the snapshot of view transformation.

Result of the CompareViewData function is defined as CompareViewResult_e flag enumerator. This allows to return specific change in the view orientation or combination of changes.

  • Open the model and start the macro.
  • Macro will pause the execution once the data from the first view is read.
  • Change the view and continue the execution of the macro.
  • Result is displayed in the message box.
Type ViewData
ViewScale As Double
Orientation As SldWorks.MathTransform
Translation As SldWorks.MathVector
End Type

Enum CompareViewResult_e
Same = 0
DiffOrientation = 2 ^ 0
DiffTranslation = 2 ^ 1
DiffScale = 2 ^ 2
End Enum

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 swView As SldWorks.ModelView
Set swView = swModel.ActiveView

If Not swView Is Nothing Then

Dim origViewData As ViewData
origViewData = GetViewData(swView)

Stop 'move the view now

Dim newViewData As ViewData
newViewData = GetViewData(swView)

Dim compRes As CompareViewResult_e
compRes = CompareViewData(origViewData, newViewData)

If compRes = Same Then
MsgBox "Views are the same"
Else
Dim msg As String

If compRes And DiffOrientation Then
msg = msg & vbLf & "Orientation"
End If

If compRes And DiffTranslation Then
msg = msg & vbLf & "Translation"
End If

If compRes And DiffScale Then
msg = msg & vbLf & "Scale"
End If

MsgBox "Views are not the same. Differences:" & msg

End If

Else
MsgBox "Please open part or assembly"
End If

Else
MsgBox "Please open the model"
End If

End Sub

Function GetViewData(view As SldWorks.ModelView) As ViewData

Dim data As ViewData

Set data.Orientation = view.Orientation3
Set data.Translation = view.Translation3
data.ViewScale = view.Scale2

GetViewData = data

End Function

Function CompareViewData(firstViewData As ViewData, secondViewData As ViewData) As CompareViewResult_e

Dim res As CompareViewResult_e
res = Same

If Not CompareArrays(firstViewData.Orientation.ArrayData, secondViewData.Orientation.ArrayData) Then
res = res + DiffOrientation
End If

If Not CompareArrays(firstViewData.Translation.ArrayData, secondViewData.Translation.ArrayData) Then
res = res + DiffTranslation
End If

If firstViewData.ViewScale <> secondViewData.ViewScale Then
res = res + DiffScale
End If

CompareViewData = res

End Function

Function CompareArrays(firstArr As Variant, secondArr As Variant) As Boolean

If UBound(firstArr) = UBound(secondArr) Then

Dim i As Integer

For i = 0 To UBound(firstArr)
If firstArr(i) <> secondArr(i) Then
CompareArrays = False
Exit Function
End If
Next

CompareArrays = True
Else
CompareArrays = False
End If

End Function