Get Differences Between Parts Example (VBA)
This examples shows how to get the differences between two parts.
'----------------------------------------------
'
' Problem:
' When
a part is designed for injection molding, many small
' design
details must be added for the injection molding
' process.
Typically, these are draft angles, thickening
' of
walls, additional ribs, and so on. Quite often, without
' specialized
knowledge and experience, these are added
' to
the model, by mold maker, after the part has been
' designed
by a designer.
'
' It
is often desirable to find out what changes
' have
been made to the original model. This is usually
' done
to determine the change in the amount of material for
' the
revised part.
'
' This
sample code uses several geometry- and
' topology-related
APIs to find the differences and
' reverse
difference between two parts.
'
' Preconditions:
' (1)
Two parts are open.
' (2)
Both parts are single body parts.
' (3)
Both parts only contain solid bodies.
'
' Postconditions:
' Depending
on the differences between parts, one or two new parts
' showing
the differences are created.
'
' Notes:
' (1)
This example is not intended to be a replacement for SolidWorks
' Utilities
comparison utility. This code illustrates
' the
use of several geometric and topological APIs.
' (2)
The new parts can contain one or more solid bodies.
' (3)
This code is intended to run on parts that are similar.
'
'----------------------------------------------
Option Explicit
Sub CreateDiffPart _
( _
swApp
As SldWorks.SldWorks, _
vBodyResArr
As Variant _
)
Dim
vBodyRes As
Variant
Dim
swBodyRes As
SldWorks.body2
Dim
swPartRes As
SldWorks.PartDoc
Dim
swFeatRes As
SldWorks.feature
If
IsEmpty(vBodyResArr) Then Exit Sub
Set
swPartRes = swApp.NewPart
For
Each vBodyRes In vBodyResArr
Set
swBodyRes = vBodyRes
Set
swFeatRes = swPartRes.CreateFeatureFromBody3(swBodyRes,
False, _
swCreateFeatureBodyCheck
+ swCreateFeatureBodySimplify): Debug.Assert Not swFeatRes Is Nothing
Next
End
Sub
Sub main()
Const
sPartName1 As
String = "d:\samples\block.sldprt"
Const
sPartName2 As
String = "d:\samples\blockfillet.sldprt"
Dim
swApp As
SldWorks.SldWorks
Dim
swModel1 As
SldWorks.ModelDoc2
Dim
swPart1 As
SldWorks.PartDoc
Dim
swBody1 As
SldWorks.body2
Dim
swBody1Copy As
SldWorks.body2
Dim
swBody1Copy2 As
SldWorks.body2
Dim
swModel2 As
SldWorks.ModelDoc2
Dim
swPart2 As
SldWorks.PartDoc
Dim
swBody2 As
SldWorks.body2
Dim
swBody2Copy As
SldWorks.body2
Dim
swBody2Copy2 As
SldWorks.body2
Dim
vswBody1 As
Variant
Dim
vswBody2 As
Variant
Dim
vBodyResArr1 As
Variant
Dim
vBodyResArr2 As
Variant
Dim
nRetval As
Long
Dim
bRet As
Boolean
Set
swApp = Application.SldWorks
Set
swModel1 = swApp.GetOpenDocumentByName(sPartName1)
Set
swModel2 = swApp.GetOpenDocumentByName(sPartName2)
Set
swPart1 = swModel1
Set
swPart2 = swModel2
'
Get all of the visible bodies in each part
vswBody1
= swPart1.GetBodies2(swSolidBody,
True)
vswBody2
= swPart2.GetBodies2(swSolidBody,
True)
Set
swBody1 = vswBody1(0)
Set
swBody2 = vswBody2(0)
Set
swBody1Copy = swBody1.Copy
Set
swBody2Copy = swBody2.Copy
Set
swBody1Copy2 = swBody1.Copy
Set
swBody2Copy2 = swBody2.Copy
vBodyResArr1
= swBody1Copy2.Operations2(SWBODYCUT,
swBody2Copy2, nRetval): Debug.Assert swBodyOperationNoError = nRetval
vBodyResArr2
= swBody2Copy.Operations2(SWBODYCUT,
swBody1Copy, nRetval): Debug.Assert swBodyOperationNoError = nRetval
If
IsEmpty(vBodyResArr1) And IsEmpty(vBodyResArr2) Then Exit Sub
Debug.Print
"Part1 =
" & swModel1.GetPathName
Debug.Print
"Part2 =
" & swModel2.GetPathName
If
Not IsEmpty(vBodyResArr1) Then
Debug.Print
" Diffs(1-2)
=
" & UBound(vBodyResArr1) + 1
End
If
If
Not IsEmpty(vBodyResArr2) Then
Debug.Print
" Diffs(2-1)
=
" & UBound(vBodyResArr2) + 1
End
If
CreateDiffPart
swApp, vBodyResArr1
CreateDiffPart
swApp, vBodyResArr2
End Sub
'------------------------------------------