SolidWorks Componenten vervangen

Hallo forum!

 

Ik heb een korte vraag over de functie "ReplaceComponents" van de Solidworks API

 

Ziezo, het is me gelukt om de macro aan het werk te krijgen met betrekking tot de handmatige selectie en het vervangen van onderdelen, geweldig!

(Kleine overwinningsdans: <o> _o>  _o_ \o/)

 

Mijn probleem  komt er nu aan... Presentatie van de macro aan een collega, ze hebben plezier met het vervangen van onderdelen die  al in de assemblage aanwezig zijn

Het is leuk, we vervangen een schroef door een flens enz.

 

Hij besluit macro op een constructievere manier te proberen. Voer dus het pad en de naam van het vervangende onderdeel in, selecteer het onderdeel in de assemblage en......

Nou ja, niets... Het onderdeel in de assemblage wordt geselecteerd, maar niet vervangen...

 

Preciezere en beknoptere uitleg:

 

Montageonderdeel te vervangen + vervangend onderdeel in montage => werkt.

 

Deel van het geheel dat moet worden vervangen + vervangend onderdeel dat niet in het geheel zit => Geen.

 

Hier is de macro in kwestie als bijlage =)

 

Als je ideeën hebt over iets dat ik zou zijn vergeten / gemaakt als  een fout =/

 

Vriendelijk

Yoann


vba_remplacement_piece.txt

Hallo

 

Twee kleine suggesties zonder in de code te duiken:

 

Probeer het onderdeel in SolidWorks te openen (aangezien we het volledige pad hebben) en probeer vervolgens het te vervangen.

 

Anders, een beetje barbaarse methode, plaats het onderdeel in de assemblage, vervang het bestaande en verwijder het vervolgens (controleer of we het eerste exemplaar verwijderen!)

1 like

Hallo Lucas:)

 

Ik heb de eerste methode geprobeerd, het lijkt erop dat het vervangende onderdeel moet worden geopend om in aanmerking te worden genomen (en toegankelijk in beschrijfbaar misschien. Als dat het geval is, gaat het me een beetje irriteren omdat de onderdelen op EPDM staan...)

 

Maar wanneer u het afzonderlijk probeert te openen, houdt de vervanging geen rekening met het optreden van het te vervangen onderdeel =o

 

Voorbeeld:

 

In mijn assemblage heb ik:

 

SE-01

   -stuk01<1>

   -artikelnummer 02<1>

 

SE-02

   -....

   -....

 

-Artikel 03<1>

-Kamer01<5>

-Kamer02<9>

 

En als ik bijvoorbeeld het "part01<5>" wil wijzigen, selecteer ik het (door part01-5 te plaatsen), tot nu toe werkt alles prima, ik voer de naam van het geopende vervangende onderdeel er ook naast in, en het verandert niet het "part01<5>" zoals geselecteerd, maar het "part01<1>" =o

 

Dus de functie zou geen rekening houden met het voorval zoals ik dacht?

Want aan de andere kant, als ik het "Stuk03<1>" wil veranderen (of wat het ook is, zolang het maar de hoogste in de boom is), dan hoef ik me geen zorgen te maken =/

 

Ja, het onderdeel moet in het geheugen worden geladen, en hier is de vertaalde help

 

U kunt een geselecteerd onderdeel niet vervangen door een onderdeel met dezelfde naam, zelfs niet als de onderdelen zich in verschillende mappen bevinden. 

 

Het onderdeel moet een element op het hoogste niveau zijn. Het kan geen onderdeel zijn van een deelassemblage. Als de toepassing een onderdeel in de subassemblage moet vervangen, moet de subassemblage worden geopend en de component uit die assemblage worden gehaald

 

Met deze methode worden alle componentbestanden gesloten wanneer ze in een assembly worden opgeroepen. Als de componenten zijn gewijzigd, worden die wijzigingen niet automatisch opgeslagen. U moet de wijzigingen opslaan voordat de bestanden worden gesloten.

 

Om te voorkomen dat u documenten moet wijzigen voordat u het document opent, kunt u de API gebruiken

Ruilen. DocumentVisible(False, swDocumentTypes_e.swDocPART) zorg ervoor dat u deze instelt op True na het openen

Het document is open, maar niet zichtbaar

 

Voor de vervanging van voorvallen zou dit moeten werken, omdat het commando het geselecteerde onderdeel vervangt, zelfs als het andere voorvallen heeft, het is de selectie die zal worden vervangen

 

 

 

 

 

4 likes

Hallo jfaradon!

 

Bedankt voor je antwoord :-)

 

Ik vroeg me inderdaad af of ik dit deel van de API-hulp goed had begrepen gezien hoe het voor mij was. Nu weet ik zeker dat er ergens een binz is x)

 

Inderdaad, naast het vervangen van een niet-geselecteerd (en verborgen!) onderdeel, is deze... in een subset! =o

 

Ik heb dit toegevoegd: "Set swModel = swApp.OpenDoc6(swNewfile, 1, 0, "", Longstatus, Longwarnings)"

 

Om het vervangende onderdeel eerder te openen, maar dat wil het natuurlijk niet x) dat zie ik later wel

 

Als bijlage is hier een voor/na screenshot van de vervangfunctie.

 

Het gemarkeerde deel in de boom is het deel dat wordt  vervangen =/

 

 


replace.png

Dit is een functie die ik al heb gebruikt en die werkt... Ik zie niet echt wat er met je kan gebeuren

vooral omdat, van wat ik zie, de omkering wordt gedaan tussen stukken die niet dezelfde naam hebben?

 

Maar het is ingewikkeld om de gebruiker te vragen de naam van de component + het voorval in te voeren, waarom vraagt u hem niet om de component in de boom te selecteren, dus geen risico meer op fouten in de namen

 

Anders stelt de functie, het voorbeeld dat ik in de vorige vraag van Jean-Baptist heb geplaatst en dat ik hier plak, je in staat om de namen te krijgen en ze aan te bieden in een vervolgkeuzemenu in Combobox-stijl

 

 

Dim swDoc als SldWorks.ModelDoc2

Dim swAss als SldWorks.AssemblyDoc

Dim stOldFileName As String, stNewFileName As String

Dim bStatus als Booleaanse

 

Sub hoofd()

 

    Stel swApp = Toepassing.SldWorks in

    Stel swDoc in = swApp.ActiveDoc

    

    Als swDoc niets is, sluit dan Sub af

    Als swDoc.GetType <> swDocumentTypes_e.swDocASSEMBLY afsluit, sluit dan Sub af

    

    Stel swAss = swDoc in

   

    Dim swComponents als variant: swComponents = swAss.GetComponents(True)

    

    Voor i = 0 TB UBound(swComponents)

        MsgBox swComponents(i). Naam

    Volgend

    

 

Einde Sub

 

 

 

4 likes

Goedenavond allemaal,

 

Yoann, als het vervangen van een 'oud' onderdeel door een 'nieuw' onderdeel in een assemblage het onderwerp is, sta ik mezelf toe sceptisch te zijn. Waarvoor?

Nu al zijn de bestaande beperkingen tussen de oude 'en de andere delen, naar mijn mening, bijna allemaal wiebelig aan het worden! Tenzij het oude en het nieuwe veel overeenkomsten hebben (families van stukken). Tenzij er een super mega SW is die dit voor elkaar krijgt? Niet dromen!!

Als een limietvraag, aangezien een assemblage open is, is de vervanging van een onderdeel van een subassemblage onmogelijk. Om dit mogelijk te maken, zal het dan nodig zijn om de subassemblage te openen.

In termen van voorkomen is het SW die het voorkomen toewijst bij het handmatig toevoegen van een 'kloon'-onderdeel in een assemblage, het beheert het. De macro zal ook rekening moeten houden met het voorkomen van de oude munt.

 

Ten slotte is de [ReplaceComponents]-methode niet alles!

Naar mijn mening behandelt het de vervanging van een "oud" onderdeel door een "nieuw" onderdeel alleen als en alleen als dit laatste open is, of, nog beperkter, open en aanwezig in de montage.

 

Dus het idee, zoals Lucas zegt in de context van een nieuw vervangend onderdeel dat geen deel uitmaakt van de assemblage, is om het te openen, het in de assemblage te plaatsen, het voorkomen ervan te identificeren en uiteindelijk het oude te vervangen door het nieuwe.

 

A+

 

MC

1 like

Hallo

 

Allereerst wil ik mijn excuses aanbieden voor de reactietijd, ik moest aan iets heel anders werken en had geen tijd om er weer in te duiken dus

 

 

@CaronMaxime: Het is inderdaad meer dan gewaagd om de functie voor het vervangen van onderdelen in volledige macro te zetten, bijvoorbeeld vanwege de beperkingen. Maar mijn doel is heel specifiek, maak je geen zorgen! Mijn doel heeft te maken met formaatwijzigingen die meestal vrij lang duren in termen van afhandeling voor operators. Ik test ook mijn macro (die niet alleen bestaat uit vervangende componenten, maar ook uit verandering van dimensie, van beperkingen in de assemblage bijvoorbeeld.

 

 

Wat betreft de wiebelige beperkingen, ze zijn inderdaad een beetje, maar door de basisfunctie van solidworks te doorlopen, gebeurt hetzelfde met hen^^

 

@jfaradon: Bedankt voor je macro :o Het was inderdaad erg handig voor mij om de selectie combobox te maken die je noemt :-)

 

Ik ga deze vraag eindelijk afsluiten met deze :-)

 

Vriendelijk

 

Yoann