| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS | | | | SPS, eine Veranstaltung am 12.11.2024
|
Autor
|
Thema: API: Teil in Teil ersetzen (1731 / mal gelesen)
|
magiclg Mitglied Ingenieur
Beiträge: 2 Registriert: 03.12.2018 SWX 2017 SP3 Win 7 64 bit, SP1 Intel Xeon 2x3,3GHz 16GB RAM Nvidia Quadro M620
|
erstellt am: 03. Dez. 2018 11:29 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, nachdem ich hier schon mittlerweile ein paar Jahre lang lesender Besucher bin und auch schon viele gute Tipps, Ideen und Lösungen für die Makroprogrammierung in Solidworks bekommen habe, bin ich jetzt leider an einem Punkt angekommen, an dem ich nicht mehr weiter komme. Ich habe ein Makro geschrieben, um unsere Dateien nach den firmeninternen Vorgaben für Artikelnummern und -bezeichnungen zu kopieren bzw. revisionieren. Dabei werden benutzerdefinierte Eigenschaften automatisch gefüllt, Referenzen ersetzt, Teile ins SVN geaddet und vieles mehr. Damit ist die Fehlerrate deutlich gesunken und ein endloses Herumgeklicke in mehreren verschiedenen Programmen um im Windows-Explorer wurde zu wenigen Klicks und Copy-Paste reduziert. [Ach ja, es werden natürlich nur in geöffneten Dateien Referenzen ersetzt, die Verwendung in nicht geöffneten Teilen erhalten ich leider nur mit dem extremen Aufwand, jedes vorhandene Dokument zu laden und zu schauen ob darin auf das zu kopierende Dokument verwiesen wird. Den PDM-Explorer dürfen wir leider nicht benutzen und unser ERP-System läuft völlig unabhängig von SW.] Mein Problem: für Baugruppen und Zeichnungen habe ich die Lösungen gefunden, um die Referenzen anzupassen. Aber es gibt ein paar Teile, die als Teil-in-Teil-Feature (also über Einfügen->Teil) in andere Einzelteile gespeichert wurden (für Schweißbaugruppen, teilweise abgeleitete oder gespiegelte Teile,...). Zur besseren Lesbarkeit habe ich die Variablen hier angepasst: - Alter_Dateiname -> Einzelteil, das kopiert werden soll ("Beispielteil_A.SLDPRT") - Neuer_Dateipfad -> Neuer Speicherort ("C:\test\Beispielteil_B.SLDPRT") - Pfad_zum_Elternteil -> hier ist das Beispielteil_A als Feature verbaut ("C:\test\Schweissteil_A.SLDPRT") Ausprobiert habe ich bisher folgendes: 1)
Code:
Set swModel = swApp.ActivateDoc2(Pfad_zum_Elternteil, False, longstatus) swModel.ClearSelection2 True Set swSelMgr = swModel.SelectionManager result = swModel.Extension.SelectByID2(Alter_Dateiname, "BODYFEATURE", 0, 0, 0, False, 0, Nothing, swSelectOption_e.swSelectOptionDefault) result = swModel.ReplaceComponents2(Neuer_Dateipfad, "", True, 0, True)
Das ist der Weg den ich in der Baugruppe gehe, dort natürlich mit "COMPONENT" statt "BODYFEATURE". War zu erwarten dass es fehlschlägt, denn ich will ja eigentlich keine Komponente ersetzen, aber man kann's ja mal probieren ;) . Die Fehlermeldung ist "Laufzeitfehler '438': Objekt unterstützt diese Eigenschaft oder Methode nicht". Auch wenn ich "" statt "BODYFEATURE" schreibe oder zwischen den beiden results ein Stop einfüge und manuell das Feature bzw. den Volumenkörper auswähle. 2)
Code:
Set swModel = swApp.ActivateDoc2(Pfad_zum_Elternteil, False, longstatus) swApp.CloseDoc (Pfad_zum_Elternteil) Set swModel = Nothing result = swApp.ReplaceReferencedDocument(Pfad_zum_Elternteil, Alter_Dateiname, Neuer_Dateipfad)
Bei der Zeichnung ist das der funktionierende Weg. Das geht hier eigentlich auch, aber nur wenn das Elternteil NICHT geöffnet ist. Ich schließe es ja natürlich, aber das hilft nur wenn es selbst nicht z.B. in einer Baugruppe geöffnet ist. Dann müsste ich ermitteln, in welchen Baugruppen das Elternteil enthalten ist (ggf. die gaaaanz große Systembaugruppe), die Liste merken, alle schließen, Referenz ersetzen und für den Komfort alle aus der Liste wieder öffnen. Da ich teilweise 10 Minuten brauche, um die Systembaugruppe zu laden, nicht wirklich ein schöner Weg. Hat jemand noch eine Idee dazu? Man möge mir die eventuell etwas holprige Programmierung verzeihen, ich mache das nur nebenher. Danke schonmal für jede Hilfe! Viele Grüße Laszlo
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)
Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 04. Dez. 2018 10:26 <-- editieren / zitieren --> Unities abgeben: Nur für magiclg
Hallo Laszlo, interessanter Fall, das habe ich bisher auch immer nur mit ReplaceReferencedDocument mittels eines kleinen externen Progrämmchens ( http://solidworks.cad.de/prog_repairreference.htm ) gemacht - aber wie du schon geschrieben hast darf dafür das Dokument, in dem die Referenz korrigiert wird, in SoldiWorks nicht geöffnet sein. Ich bin beim Stöbern in der API Hilfe aber auf eine Combo getroffen, die du probieren könntest: ModelDoc2.ForceReleaseLocks in Kombination mit ModelDoc2.ForceReleaseLocks Ob das allerdings ein gangbarer Weg für Teil-in-Teil ist weiß ich nicht. Bei Baugruppenkomponenten gibt es ja so etwas wie "Komponente ersetzen", das mit offenen Baugruppen und Komponenten funktioniert, bei Teil-in-Teil aber nicht. Aber probieren kannst du es ja mal. Ciao, Stefan
------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)
Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 04. Dez. 2018 10:26 <-- editieren / zitieren --> Unities abgeben: Nur für magiclg
Hallo Laszlo, interessanter Fall, das habe ich bisher auch immer nur mit ReplaceReferencedDocument mittels eines kleinen externen Progrämmchens ( http://solidworks.cad.de/prog_repairreference.htm ) gemacht - aber wie du schon geschrieben hast darf dafür das Dokument, in dem die Referenz korrigiert wird, in SoldiWorks nicht geöffnet sein. Ich bin beim Stöbern in der API Hilfe aber auf eine Combo getroffen, die du probieren könntest: ModelDoc2.ForceReleaseLocks in Kombination mit ModelDoc2.ReloadOrReplace Ob das allerdings ein gangbarer Weg für Teil-in-Teil ist weiß ich nicht. Bei Baugruppenkomponenten gibt es ja so etwas wie "Komponente ersetzen", das mit offenen Baugruppen und Komponenten funktioniert, bei Teil-in-Teil aber nicht. Aber probieren kannst du es ja mal. Ciao, Stefan
------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
magiclg Mitglied Ingenieur
Beiträge: 2 Registriert: 03.12.2018 SWX 2017 SP3 Win 7 64 bit, SP1 Intel Xeon 2x3,3GHz 16GB RAM Nvidia Quadro M620
|
erstellt am: 04. Dez. 2018 16:46 <-- editieren / zitieren --> Unities abgeben:
Hallo Stefan, na wer sagt's denn, ich wusste hier wird mir geholfen! Folgender Code hat funktioniert: Code:
Set swModel = swApp.ActivateDoc2(Pfad_zum_Elternteil, False, longstatus) result_long = VRm_swModel.ForceReleaseLocks() ' 1 = released Set swModel = Nothing result = swApp.ReplaceReferencedDocument(Pfad_zum_Elternteil, Alter_Dateiname, Neuer_Dateipfad) Set swModel = swApp.OpenDoc6(Pfad_zum_Elternteil, swDocPART, 0, "", lErrors, lWarnings) swModel.ReloadOrReplace(False, Pfad_zum_Elternteil, True) ' 0 = OK, Fehlermeldungen http://help.solidworks.com/2017/english/api/swconst/SOLIDWORKS.Interop.swconst~SOLIDWORKS.Interop.swconst.swComponentReloadError_e.html
Danke sehr nochmal :-) Viele Grüße Laszlo [Ein paar Stichwörter für andere mit dem gleichen Problem: Part-in-Part, replace part in part, change reference, Teil ersetzen in Teil, Referenz Teil in Teil ersetzen, Insert -> Part, Einfügen -> Teil] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|