Hot News aus dem CAD.de-Newsletter:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  SolidWorks
  API: Teil in Teil ersetzen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:   API: Teil in Teil ersetzen (161 mal gelesen)
magiclg
Mitglied
Ingenieur

Sehen Sie sich das Profil von magiclg an!   Senden Sie eine Private Message an magiclg  Schreiben Sie einen Gästebucheintrag für magiclg

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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)



Sehen Sie sich das Profil von StefanBerlitz an!   Senden Sie eine Private Message an StefanBerlitz  Schreiben Sie einen Gästebucheintrag für StefanBerlitz

Beiträge: 8751
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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für magiclg 10 Unities + Antwort hilfreich

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)



Sehen Sie sich das Profil von StefanBerlitz an!   Senden Sie eine Private Message an StefanBerlitz  Schreiben Sie einen Gästebucheintrag für StefanBerlitz

Beiträge: 8751
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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für magiclg 10 Unities + Antwort hilfreich

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

Sehen Sie sich das Profil von magiclg an!   Senden Sie eine Private Message an magiclg  Schreiben Sie einen Gästebucheintrag für magiclg

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2018 CAD.de | Impressum | Datenschutz