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.
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.
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.
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.
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
*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
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
te doen
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
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
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.
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.
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!
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.
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
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:
-
Blader één voor één door de componenten
-
Haal de positie en oriëntatie van het onderdeel op ten opzichte van de oorsprong van de assemblage.
-
Plaats het onderdeel in een onderdeel en verbreek de schakel.
-
Het detecteren van nieuwe lichamen (een beetje hoofdpijn!) .
-
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
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>>