Konwertowanie zestawu na plik autonomiczny

Witaj @Rim-b
Doskonałe!! Ale nie idealnie... To jest dokładnie oczekiwany efekt końcowy, z wyjątkiem umiejscowienia.

Wstawiam część arkusza blachy do głównej części arkusza blachy, ale nie mogę jej ustawić zgodnie z potrzebami. Czy możliwe jest obracanie wstawionej blachy, czy jesteśmy ograniczeni do tłumaczenia tylko podczas wstawiania?

Początkowy pomysł przejścia przez montaż polegał głównie na uproszczeniu pozycjonowania, zanim wszystko skończy się pożyczką.

Witam

Nie, istnieją funkcje montażowe (przesuwanie z wiązaniami).
Ale szczerze mówiąc, to fabryka gazu, widziana z mojego okna, to, co próbujesz zrobić.
Musisz wybrać odpowiedni tryb przy uruchamianiu (montaż lub część w części), ponieważ "konwersja" później to wiele godzin pracy. Nie jestem nawet pewien, czy makro może to zrobić bez generowania błędów pozycjonowania, a przynajmniej będzie musiało poświęcić godziny na tego typu rozwój.

2 polubienia

Często korzystam z funkcji insert part i potwierdzam twój dir cyril, rzecz skacze przy najmniejszej zmianie w drzewie sw nie lubi się zbytnio bawić paskiem odzyskiwania,
Nie sądzę też, żeby dla kopii funkcji z makrem można było zmodyfikować otwór lub usunięcie materiału ślepego lub przez wszystko bez wpływu na inne ciała!

3 polubienia

Witam

Wstawianie części w części działa. Z drugiej strony, jeśli masz więcej niż kilkanaście części, zarządzanie nimi może bardzo szybko stać się kłopotliwe. Jeśli chcesz, aby to zadziałało, najlepszą rzeczą do zrobienia jest prawdopodobnie nie używanie wiązań podczas wstawiania części, a jedynie pozycji.
Możliwym rozwiązaniem byłoby być może zgrupowanie elementów, które pasują do siebie (a więc tworzenie podczęści), a następnie włożenie tuzina elementów do pokoju.

Uwaga: Jeśli chodzi o odbudowę, w każdym przypadku może to być trudne do opanowania.

1 polubienie

Tak, potwierdzam i jest to dość karzące, gdy klient wysyła Ci ASM na przykład w formacie STEP lub innym neutralnym formacie, aby zmusić Cię do przeprowadzenia symulacji RDM. Nie wspominając o tym, że tracisz wszystkie ograniczenia w tym procesie.

Powodzenia :cold_face:

2 polubienia

Witam.
Dziękuję wszystkim za bardzo pouczające odpowiedzi!

Tak więc, przetestowałem wstawienie części do części, plik waży 2 razy mniej niż zespół z tą samą częścią wirtualną.
Fakt, że waga przechodzi od podwójnej do pojedynczej, nie jest bez znaczenia.

Czytając ten temat, mam jednak wrażenie, że wirtualizacja części w zespole pozostaje zdecydowanie najprostszym, najbardziej praktycznym i elastycznym rozwiązaniem.
Szkoda, że plik waży dwa razy więcej...
Sztuczka z siusianiem jest rzeczywiście interesującą możliwością, @froussel

Sprawdzając w lapi, wydaje mi się, że jest grywalny:

  1. Przeglądaj komponenty jeden po drugim

  2. Umożliwia pobranie położenia i orientacji komponentu względem początku układu współrzędnych zespołu.

  3. Wstaw komponent do części i przerwij połączenie.

  4. Wykrywanie nowych ciał (trochę ból głowy!) .

  5. Zastosuj orientację i przemieszczenie do tych nowych obiektów

Zrywając ogniwo, funkcje wstawionej części są odzyskiwane w drzewie, cud polega na tym, że SW stosuje je tylko do nowych ciał (modyfikuje definicję i obszary działania wszystkich ciał do automatycznego😀 wyboru), co pozwala uniknąć problemu, o którym wspomniałem wcześniej, więc ogniwo jest łamane w drzewie i stabilne,

Jedynym bimolem, jaki znajduję, jest to, że ciała te są ustawione w stosunku do początku części, a nie przez oddziaływania naprężeń.
Nie mówiąc już o tym, że struktura drzewa będzie bardzo, bardzo długa w zależności od liczby komponentów i ich złożoności

3 polubienia

W przypadku załączenia, opis punktów
(Podziękowania dla @Rim-B , który wspomniał o głównej funkcji)






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

<< kod jest pozbawiony obsługi błędów, przetestuj w razie potrzeby, zmodyfikuj szablon ścieżki, API 2022>>

2 polubienia

Witam @Lynkoa15
DZIĘKUJĘ! To makro wygląda świetnie. Testuję to tak szybko, jak to możliwe.

Tylko jedno. Na jednym z moich makr w procesie tworzenia musiałem zastosować rotacje widoków i aby uzyskać jak najdokładniejszą wartość PI, napisałem tak:

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

Ten kod pobiera liczbę PI i dzieli ją przez 180, aby zmienić stopnie na radiany.
(Na przykład (3 * DtR) konwertuje 3 stopnie na radiany)

Krótko mówiąc, aby mieć "idealne" PI w VBA , potrzebujesz tego kodu:

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

Kiedy mówię "idealny", oczywiście mieści się to w limicie dziesiętnym typu Double (#).

Oczywiście korzystanie ze stałej ma swoją zaletę, o ile pamiętasz pierwsze 14/15 miejsc po przecinku liczby pi (3,14159265358979)

1 polubienie