Konvertieren einer Assembly in eine eigenständige Datei

Hallo @Rim-b
Ausgezeichnet!! Aber nicht perfekt... Dies ist genau das erwartete Endergebnis, mit Ausnahme der Platzierung.

Ich füge ein Blechteil in das Basis-Blechteil ein, kann es aber nicht wie gewünscht positionieren. Ist es möglich, das eingelegte Blech zu drehen oder sind wir auf die Verschiebung während des Einsetzens beschränkt?

Die ursprüngliche Idee, eine Montage zu durchlaufen, bestand hauptsächlich darin, die Positionierung zu vereinfachen, bevor alles in einem Kredit endete.

Hallo

Nein, es gibt Baugruppenfunktionen (Verschieben mit Abhängigkeiten).
Aber ehrlich gesagt, es ist eine Gasfabrik, von meinem Fenster aus gesehen, was Sie versuchen zu tun.
Sie müssen beim Start den richtigen Modus wählen (Baugruppe oder Teil innerhalb eines Teils), da das anschließende "Konvertieren" Stunden und Stunden Arbeit erfordert. Ich bin mir nicht einmal sicher, ob ein Makro dies tun kann, ohne Positionierungsfehler zu erzeugen, oder zumindest Stunden für diese Art der Entwicklung aufwenden muss.

2 „Gefällt mir“

Ich benutze oft die Insert-Part-Funktion und bestätige Ihr Verzeichnis Cyril, das Ding springt bei der kleinsten Änderung im Baum sw spielt nicht gerne zu viel mit der Wiederherstellungsleiste,
Für das Kopieren einer Funktion mit Makro glaube ich auch nicht, ich sehe nicht, wie man ein Loch oder ein Entfernen von Blindmaterial oder durch alles ändern kann, ohne die anderen Körper zu beeinflussen!

3 „Gefällt mir“

Hallo

Das Einfügen eines Teils in ein Teil funktioniert. Auf der anderen Seite, wenn Sie mehr als ein Dutzend Teile haben, kann es sehr schnell mühsam werden, es zu verwalten. Wenn Sie möchten, dass es funktioniert, ist es am besten, beim Einfügen von Teilen wahrscheinlich keine Abhängigkeiten zu verwenden, sondern nur Positionen.
Eine mögliche Lösung wäre vielleicht, Gruppierungen von Teilen zu machen, die zusammenpassen (also Unterstücke bilden) und dann ein Dutzend Teile in einen Raum einzufügen.

NB: Was den Wiederaufbau angeht, kann es auf jeden Fall schwierig sein, das zu bewältigen.

1 „Gefällt mir“

Ja, ich bestätige und es ist ziemlich bestrafend, wenn ein Kunde Ihnen ein ASM im STEP-Format oder einem anderen neutralen Format sendet, um Sie dazu zu bringen, eine RDM-Simulation durchzuführen. Ganz zu schweigen davon, dass Sie dabei alle Einschränkungen verlieren.

Viel Glück :cold_face:

2 „Gefällt mir“

Hallo.
Vielen Dank an alle für Ihre sehr informativen Antworten!

Also, ich habe das Einfügen eines Teils in ein Teil getestet, die Datei wiegt 2-mal weniger als eine Baugruppe, bei der das gleiche Teil virtuell gemacht wurde.
Die Tatsache, dass das Gewicht von doppelt auf einfach geht, ist nicht zu vernachlässigen.

Beim Lesen dieses Themas habe ich jedoch den Eindruck, dass die Virtualisierung der Teile in einer Baugruppe bei weitem die einfachste, praktischste und flexibelste Lösung bleibt.
Schade, dass die Mappe doppelt so viel wiegt...
Der Pinkel-Trick ist in der Tat eine interessante Möglichkeit, @froussel

Wenn ich mir Lapi anschaue, scheint es mir, dass es spielbar ist:

  1. Durchsuchen Sie die Komponenten nacheinander

  2. Rufen Sie die Position und Ausrichtung der Komponente relativ zum Baugruppenursprung ab.

  3. Fügen Sie die Komponente in ein Bauteil ein, und heben Sie die Verknüpfung auf.

  4. Neue Leichen aufspüren (ein bisschen Kopfschmerzen!) .

  5. Wenden Sie Orientierung und Verschiebung auf diese neuen Körper an

Durch das Unterbrechen der Verknüpfung werden die Funktionen des eingefügten Teils im Baum wiederhergestellt, das Wunder besteht darin, dass SW sie nur auf neue Körper anwendet (es ändert die Definition und die Aktionsbereiche aller Körper auf eine automatische😀 Auswahl), wodurch das Problem vermieden wird, das ich zuvor erwähnt habe, so dass die Verknüpfung im Baum unterbrochen und stabil ist,

Das einzige Bimol, das ich finde, ist, dass diese Körper in Bezug auf den Teileursprung positioniert sind, nicht durch Spannungswechselwirkungen.
Das soll nicht heißen, dass die Baumstruktur sehr, sehr lang sein wird, abhängig von der Anzahl der Komponenten und ihrer Komplexität

3 „Gefällt mir“

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>>

2 „Gefällt mir“

Hallo @Lynkoa15
VIELEN DANK! Dieses Makro sieht großartig aus. Ich teste es so schnell wie möglich.

Nur eine Sache. Bei einem meiner Makros während der Entwicklung musste ich Ansichtsrotationen anwenden, und um den genauesten PI-Wert zu erhalten, schrieb ich Folgendes:

Dim DtR# '(DegToRad)
DtR = (4 * Atn(1)) / 180   ' "Constante" de conversion degrés en radians (Pi/180)

Dieser Code ruft PI ab und dividiert ihn durch 180, um die Grad in Bogenmaß zu ändern.
(Beispiel: (3 * DtR) wandelt 3 Grad in Bogenmaß um)

Kurz gesagt, um einen "perfekten" PI in VBA zu haben , benötigen Sie diesen Code:

Dim PI# '(THE_number)
PI = (4 * Atn(1))   ' "Constante" Pi calculée

Wenn ich "perfekt" sage, liegt es offensichtlich innerhalb der Dezimalgrenze des Typs Double (#).

Natürlich ist es von Vorteil, eine Konstante zu verwenden, solange Sie sich an die ersten 14/15 Dezimalstellen von Pi erinnern (3,14159265358979)

1 „Gefällt mir“