Een assembly converteren naar een zelfstandig bestand

Ik bevestig ac-cobra, met welk doel? Het gebeurt eerder omgekeerd, en bovenal zal het de publicatie van de plannen bemoeilijken, anders is de top-down modellering niet genoeg!?

Ja, het verminderen van het gewicht maakt deel uit van het doel.
Ik wil ook een onafhankelijk "compleet geassembleerd object" bestand hebben, compleet maar niet afhankelijk van externe referenties. Dit faciliteert, deelt, bewaart en zorgt er in ieder geval voor dat het object hoe dan ook kan worden geëxploiteerd.

1 like

In mijn ideale wereld zou ik een macro programmeren die gewoon een leeg PRT-bestand zou maken van een open assembly, de bomen van elk onderdeel in de assembly zou extraheren en ze naar de PRT zou kopiëren (items hernoemen indien nodig), maar de lokale oorsprong van elk onderdeel zou wijzigen door de oorsprong van de assembly, om ervoor te zorgen dat hun plaatsing overeenkomt met de assembly.

1 like

Het is een los onderdeel dat je buiten de assemblage bewaart dat je kunt verplaatsen en dan worden de schakels verbroken...

Dus allereerst bedankt voor de truc die ik niet kende en die op een dag onvermijdelijk nuttig voor me zal zijn. :+1:
Helaas reageert het niet op het verzoek, maar ik begrijp de verwarring omdat het woord "samenvoegen" dat ik gebruikte niet het meest geschikt is. We moesten "groep" begrijpen.

Ik ben een beetje verloren, omdat ik niet echt begrijp of ik een deel met lichamen moet hebben of niet, omdat het niet kan worden gewijzigd en het visuele hetzelfde zal zijn als een bestand dat is opgeslagen in prt.

2 likes

Dus allereerst wordt mijn fout bij het herkennen van functies veroorzaakt door de schroeven uit de gereedschapskist. Als ik ze uitsluit van de lening, gaat de erkenning goed. Het is jammer, maar ach, laten we zeggen dat het al niet slecht is.
Behalve dan dat je blijkbaar voor elk geïmporteerd object handmatig een functieherkenning moet uitvoeren, het ene na het andere... We kunnen geen meervoudige erkenning doen??

Ik heb me waarschijnlijk slecht uitgedrukt, maar om duidelijker te zijn, laten we zeggen dat ik wil wat "ASM registreren als PRT" doet, behalve dat ik geen nutteloze reconversies van geometrieconversies wil moeten ondergaan, noch een (des!!) erkenning van functies. Ik wil functies, relaties, citaten, originele namen behouden. Een stomme klonen van de originele boom van elke kamer* in een andere gemeenschappelijke ruimte, weet je. (nog meer qd Ik zie de tijd die het kost om de functies te herkennen en dat je het opnieuw moet opstarten voor elk van de onderdelen..., en ze dan hernoemen...). In de gemeenschappelijke ruimteboom moeten de kamerbomen worden gehiërarchiseerd in afzonderlijke mappen van de kamernamen.

We zouden meer op de "join" tool zijn, maar zonder samen te voegen, gewoon een toevoeging van elke boom*, zoals het is, de een na de ander in het nieuwe doeldeel. Een aaneenschakeling zonder conversie dus. En altijd, idealiter, in aparte mappen (in de featureManager eh).

Het lijkt erop dat alleen een macro aan deze eisen kan voldoen :thinking:

*Als ik het heb over "originele boom", bedoel ik "alle functies, plannen, enz. waaruit de kamer bestaat".

Wat je in feite wilt, is werken aan de meerdere functies van je onderdelen van de assemblage in een onderdeel, ik weet niet of ik me goed heb uitgedrukt :upside_down_face::woozy_face::upside_down_face::woozy_face:

Sterker nog, ik zou willen dat alle onderdelen van een assemblage "ingebed" zijn, zoals ze in één PRT zitten.
Het enige verschil dat zichtbaar is in de boom is dat het gele "deel" icoon overgaat in een blauw "map" icoon.

En inderdaad, het zou je in staat stellen om alle "onderdelen" (hun functies gegroepeerd in mappen) vanuit de gemeenschappelijke ruimte te bewerken.

Ik denk niet dat het mogelijk is om dat :expressionless: :expressionless: te doen :expressionless:
De enige manier is om te anticiperen en te bouwen in een kamer met meerdere lichamen en het zal je niet helpen in termen van het lichter maken van het onderdeel in vergelijking met een montage, omdat het de functies zijn die zwaar zijn ...
Veel succes, want je hebt wat nodig :stuck_out_tongue_winking_eye: :crazy_face: :stuck_out_tongue_winking_eye: :crazy_face:

Hallo
Kortom, wat je zou willen doen is de functie " onderdeel invoegen " gebruiken, maar in plaats van een onderdeel zou het een assemblage zijn (onmogelijk met deze opdracht) en in staat zijn om de optie " voortplanten vanuit het originele onderdeel" te gebruiken. Ik geef aan dat je de link met het originele onderdeel moet verbreken om de bouwboom te herstellen.

Behalve met een macro die elk deel van de assemblage één voor één zou nemen en dit commando zou gebruiken, zie ik het niet.
Veel succes

1 like

Hallo @Sylk

Het hele probleem zit hem in deze twee woorden: uitpakken en kopiëren. Met andere woorden: copy/paste...

Het scannen van de assemblage componentenboom om de " bron " -onderdelen te identificeren is gemakkelijk denkbaar, maar voor zover ik weet is er geen kopieer- en plakprocedure van de build-boom van elk " bron " -onderdeel in hetzelfde " bestemmings " -onderdeel.
De enige entiteiten die van het ene deel naar het andere kunnen worden " gekopieerd " zijn schetsen, rondingen, oppervlakken en lichamen, geen geometrische kenmerken.

Bij gebrek aan aaneenschakeling in een onderdeel kan een andere weg worden verkend, waardoor de back-up kan worden teruggebracht tot één enkel bestand: virtualiseer alle componenten, d.w.z. integreer ze in het assemblagedocument.
De logica voldoet aan uw verwachtingen, zelfs als het uiteindelijke document een assemblage is en geen onderdeel.
De functie " Virtueel maken" bestaat in de SolidWorks API's. De koppelingen van de gevirtualiseerde onderdelen naar de originele onderdelen worden verbroken, maar de build-boom blijft behouden.

Vriendelijke groeten.

1 like

Hallo @Rim-b
Uitstekend!! Maar niet perfect... Dit is precies het verwachte eindresultaat, behalve de plaatsing.

Ik plaats een plaatwerkonderdeel in het hostplaatwerk, maar ik kan het niet naar wens positioneren. Is het mogelijk om het ingebrachte plaatwerk te roteren of zijn we beperkt tot vertaling alleen tijdens het invoegen?

Het aanvankelijke idee om een assemblage te doorlopen was vooral om de positionering eenvoudig te maken, voordat het allemaal in een lening belandde.

Hallo

Nee, er zijn montagefuncties (verplaatsen met beperkingen).
Maar eerlijk gezegd is het een gasfabriek, gezien vanuit mijn raam, wat je probeert te doen.
Je moet bij het opstarten de juiste modus kiezen (assemblage of onderdeel in een deel) want "converteren" achteraf is uren en uren werk. Ik weet niet eens zeker of een macro het kan doen zonder positioneringsfouten te genereren of in ieder geval uren aan dit soort ontwikkeling te moeten besteden.

2 likes

Ik gebruik vaak de functie voor het invoegen van een deel en ik bevestig je dir cyril, het ding springt bij de minste verandering in de boom sw houdt er niet van om te veel met de herstelbalk te spelen,
Voor de kopie van een functie met macro denk ik ook niet, ik zie niet in hoe je een gat of een verwijdering van blind materiaal of door alles heen kunt wijzigen zonder de andere lichamen te beïnvloeden!

3 likes

Hallo

Het invoegen van een onderdeel in een onderdeel werkt. Aan de andere kant, als je meer dan een dozijn onderdelen hebt, kan het heel snel een gedoe zijn om te beheren. Als u wilt dat het werkt, kunt u het beste waarschijnlijk geen beperkingen gebruiken bij het invoegen van onderdelen, maar alleen posities.
Een mogelijke oplossing zou misschien zijn om groeperingen te maken van stukken die bij elkaar passen (dus substukken maken) en dan een dozijn stukken in een kamer in te voegen.

NB: Wat de reconstructie betreft, kan het in ieder geval moeilijk te beheren zijn.

1 like

Ja, ik bevestig het en het is behoorlijk bestraffend als een klant je bijvoorbeeld een ASM in STEP-formaat of een ander neutraal formaat stuurt om je een RDM-simulatie te laten doen. Om nog maar te zwijgen van het feit dat je alle beperkingen in het proces verliest.

Succes :cold_face:

2 likes

Hallo.
Dank u allen voor uw zeer informatieve antwoorden!

Dus ik heb het invoegen van een onderdeel in een onderdeel getest, het bestand weegt 2 keer minder dan een assemblage met hetzelfde onderdeel virtueel gemaakt.
Het feit dat het gewicht van dubbel naar enkel gaat, is niet te verwaarlozen.

Bij het lezen van dit onderwerp heb ik echter de indruk dat het virtualiseren van de onderdelen in een assemblage verreweg de eenvoudigste, meest praktische en flexibele oplossing blijft.
Wat jammer dat de map twee keer zoveel weegt...
De plastruc is inderdaad een interessante mogelijkheid, @froussel

Als ik lapi incheck, lijkt het mij dat het speelbaar is:

  1. Blader één voor één door de componenten

  2. Haal de positie en oriëntatie van het onderdeel op ten opzichte van de oorsprong van de assemblage.

  3. Plaats het onderdeel in een onderdeel en verbreek de schakel.

  4. Het detecteren van nieuwe lichamen (een beetje hoofdpijn!) .

  5. Pas oriëntatie en verplaatsing toe op deze nieuwe lichamen

Door de link te verbreken, worden de functies van het ingevoegde deel hersteld in de boom, het wonder is dat SW ze alleen toepast op nieuwe lichamen (het wijzigt de definitie en actiegebieden van alle lichamen naar een automatische😀 selectie) die het probleem vermijdt dat ik eerder noemde, dus de link is verbroken de boom en stabiel,

Het enige verschil dat ik vind, is dat deze lichamen zijn gepositioneerd ten opzichte van de oorsprong van het deel, niet door stressinteracties.
Om niet te zeggen dat de boomstructuur heel, heel lang zal zijn, afhankelijk van het aantal componenten en hun complexiteit

3 likes

Indien bijgevoegd een beschrijving van de punten
(Met dank aan @Rim-B die de hoofdfunctie noemde)






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

<< de code vrij is van foutafhandeling, test indien nodig, wijzig de padsjabloon, API 2022>>

2 likes