Falls beigefügt, eine Beschreibung der Punkte
(Danke an @Rim-B , der die Hauptfunktion erwähnt hat)
Assemblage1.zip (355.9 KB)
Option Explicit
Dim swApp As Object
Dim swmodel As ModelDoc2
Dim swpart As PartDoc
Dim swassembly As AssemblyDoc
Dim swMathUtils As SldWorks.MathUtility
Dim featmgr As FeatureManager
Dim pbodies As Variant
Dim selmgr As SelectionMgr
Const PI As Double = 3.14159265359
Sub main()
Set swApp = Application.SldWorks
Set swMathUtils = swApp.GetMathUtility
Set swassembly = swApp.ActiveDoc
Set swmodel = swApp.NewDocument("C:\ProgramData\SOLIDWORKS\SOLIDWORKS 2022\templates\Pièce.PRTDOT", 0, 0, 0)
Set swpart = swmodel
Set featmgr = swmodel.FeatureManager
Set selmgr = swmodel.SelectionManager
Dim comp As Component2
Dim vcomp As Variant, vc As Variant
vcomp = swassembly.GetComponents(False)
For Each vc In vcomp
Set comp = vc
Dim pos As Variant
pos = get_position(comp)
pbodies = swpart.GetBodies2(0, False)
swpart.InsertPart3 comp.GetPathName, 512, comp.ReferencedConfiguration()
select_bodies get_bodies(swpart, pbodies)
featmgr.InsertMoveCopyBody2 0, 0, 0, 0, 0, 0, 0, pos(5), pos(4), pos(3), False, 1
select_bodies get_bodies(swpart, pbodies)
featmgr.InsertMoveCopyBody2 pos(0), pos(1), pos(2), 0, 0, 0, 0, 0, 0, 0, False, 1
Next
End Sub
Function get_position(comp As Component2) As Variant
Dim pos(5) As Variant
Dim swTransform As SldWorks.MathTransform
Set swTransform = comp.Transform2
Dim r11 As Double, r12 As Double, r13 As Double
Dim r21 As Double, r22 As Double, r23 As Double
Dim r31 As Double, r32 As Double, r33 As Double
Dim r41 As Double, r42 As Double, r43 As Double
Dim r44 As Double
r41 = swTransform.ArrayData(9)
r42 = swTransform.ArrayData(10)
r43 = swTransform.ArrayData(11)
r44 = swTransform.ArrayData(12)
pos(0) = r41 * r44
pos(1) = r42 * r44
pos(2) = r43 * r44
Set swTransform = swTransform.Inverse
r11 = swTransform.ArrayData(0)
r12 = swTransform.ArrayData(1)
r13 = swTransform.ArrayData(2)
r21 = swTransform.ArrayData(3)
r22 = swTransform.ArrayData(4)
r23 = swTransform.ArrayData(5)
r31 = swTransform.ArrayData(6)
r32 = swTransform.ArrayData(7)
r33 = swTransform.ArrayData(8)
If r13 < 1 Then
If r13 > -1 Then
pos(3) = atan2(-r23, r33)
pos(4) = asin(r13)
pos(5) = atan2(-r12, r11)
Else
pos(3) = -atan2(r21, r22)
pos(4) = -PI / 2
pos(5) = 0
End If
Else
pos(3) = atan2(r21, r22)
pos(4) = PI / 2
pos(5) = 0
End If
get_position = pos
End Function
Function get_bodies(part As PartDoc, pbodies As Variant) As Variant
Dim cbodies As Variant, bod As Variant, bod1 As Variant
Dim vbodies() As Variant
Dim row As Integer
row = 0
Dim isnew As Boolean
Dim body As Body2
Dim body1 As Body2
cbodies = part.GetBodies2(0, False)
If Not IsEmpty(pbodies) Then
For Each bod In cbodies
isnew = True
Set body = bod
For Each bod1 In pbodies
Set body1 = bod1
If body.Name = body1.Name Then
isnew = False
End If
Next
If isnew = True Then
ReDim Preserve vbodies(row)
Set vbodies(row) = body
row = row + 1
End If
Next
Dim v As Variant
get_bodies = vbodies
Else
get_bodies = cbodies
End If
End Function
Sub select_bodies(bodies As Variant)
Dim seldata As SelectData
Dim bod As Variant
Dim body As Body2
Set seldata = selmgr.CreateSelectData
seldata.Mark = 1
swmodel.ClearSelection2 True
If Not IsEmpty(bodies) Then
For Each bod In bodies
Set body = bod
body.Select2 True, seldata
Next
End If
End Sub
Function atan2(Y As Double, X As Double) As Double
If X > 0 Then
atan2 = Atn(Y / X)
ElseIf X < 0 Then
atan2 = Sgn(Y) * (PI - Atn(Abs(Y / X)))
ElseIf Y = 0 Then
atan2 = 0
Else
atan2 = Sgn(Y) * PI / 2
End If
End Function
Function asin(X As Double) As Double
If Abs(X) = 1 Then
asin = X * PI / 2
Else
asin = Atn(X / Sqrt(1 - X * X))
End If
End Function
<< der Code keine Fehlerbehandlung aufweist, testen Sie nach Bedarf, ändern Sie die Pfadvorlage, API 2022>>