| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
Autor
|
Thema: saveAs von Baugruppen-childs. SW nimmt alte referenzen?! (1725 mal gelesen)
|
Bruggmann Mitglied Konstrukteur (& Nachdiplomstudium Software-Engineering)

 Beiträge: 85 Registriert: 17.03.2004 Workstation: Fujitsu Siemens P4 3.2GHz 2.0 GB RAM Win XP SP1 - SW2005 SP0.1 (PDM: Smarteam)<P>Laptop: Compaq Evo 800w P4 2GHz 500MB RAM WinXP SP2 - SW2005 SP0.1 (PDM: ec-Manager, eigenes Tool..)
|
erstellt am: 21. Jun. 2004 08:49 <-- editieren / zitieren --> Unities abgeben:         
hi all mein makro öffnet eine baugruppe und liest alle parts in dieser aus. diese parts werden dann einzeln geöffnet: Set Part = swApp.OpenDoc6(quellPath & filename & ".sldprt", swDocPART, swOpenDocOptions_Silent, "", nErrors, nWarnings) anschliessend mit neuer nummer gespeichert: retval = swModel.SaveAs4(zielPath & newPartNrFull & "-" & childNr & ".sldprt", swSaveAsCurrentVersion, swSaveAsOptions_SaveReferenced, nErrors, nWarnings) dann wird das aktive dokument geschlossen: partTitle = Part.GetTitle swApp.CloseDoc partTitle und nach allen childs wird uâuch noch die baugruppe unter neuer nummer gespeichert: retval = swModel.SaveAs4(zielPath & newPartNrFull & ".sldasm", swSaveAsCurrentVersion, swSaveAsOptions_SaveReferenced, nErrors, nWarnings) ABER: es funktioniert nicht! alle neuen dateien existieren in meinem zielpfad, aber die zielbaugruppe hat immernoch die alten childs drin, und nicht die neuen.. was mache ich falsch? gruss stefan ------------------ ---------- encom GmbH Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
JR Mitglied Konstrukteur
 
 Beiträge: 106 Registriert: 21.10.2003
|
erstellt am: 21. Jun. 2004 10:56 <-- editieren / zitieren --> Unities abgeben:          Nur für Bruggmann
Hallo Stefan, so wie ich das verstehe willst Du per Makro eine Baugruppe und deren Teile kopieren. Dazu würde ich erst mit dem FileSystemObjekt die entsprechenden Dateien in das Zielverzeichnis kopieren und anschließend die Referenzen mit der Methode ReplaceReferencedDocument() vom SolidWorks-Objekt austauschen. Das geht auch wesentlich schneller als mit Open() und SaveAS(). Dabei mußt Du darauf achten die Referenzen der Bauteile in der Baugruppe, aber auch die Referenz der Baugruppe in den Bauteilen auszutauschen. Sonst tritt der von Dir beschriebene Effekt mit den alten Referenzen auf. Code:
Dim fso Dim SWX As SldWorks.SldWorksSet fso = CreateObject("Scripting.FileSystemObject") fso.CopyFile quelle, ziel, True Set SWX = Application.SldWorks SWX .ReplaceReferencedDocument DokumentName, AlterReferenzName, NeuerReferenzName
Hoffe das hilft Dir weiter. Gruß Jörn
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bruggmann Mitglied Konstrukteur (& Nachdiplomstudium Software-Engineering)

 Beiträge: 85 Registriert: 17.03.2004 Workstation: Fujitsu Siemens P4 3.2GHz 2.0 GB RAM Win XP SP1 - SW2005 SP0.1 (PDM: Smarteam)<P>Laptop: Compaq Evo 800w P4 2GHz 500MB RAM WinXP SP2 - SW2005 SP0.1 (PDM: ec-Manager, eigenes Tool..)
|
erstellt am: 21. Jun. 2004 11:06 <-- editieren / zitieren --> Unities abgeben:         
hmm, das muss ich mir mal näher ansehen.. aber muss im file auch noch die eigneschaften löschen und neu schreiben etc.. hab mir auch noch kurz ein testmakro mit copydocument geschrieben, aber da kommt irgendwie nur die baugruppe, aber nicht die childs mit: Set swApp = Application.SldWorks Dim oldAsm As String Dim newAsm As String Dim oldChilds() As Variant Dim newChilds() As Variant oldAsm = "C:\Dokumente und Einstellungen\ENCOM-SB\Desktop\test\Baugruppe1.SLDASM" newAsm = "C:\Dokumente und Einstellungen\ENCOM-SB\Desktop\test\NEW_Baugruppe1.SLDASM" ReDim Preserve oldChilds(0) oldChilds(0) = "C:\Dokumente und Einstellungen\ENCOM-SB\Desktop\test\Teil1.SLDPRT" ReDim Preserve oldChilds(1) oldChilds(1) = "C:\Dokumente und Einstellungen\ENCOM-SB\Desktop\test\Teil2.SLDPRT" ReDim Preserve newChilds(0) newChilds(0) = "C:\Dokumente und Einstellungen\ENCOM-SB\Desktop\test\NEW_Teil1.SLDPRT" ReDim Preserve newChilds(1) newChilds(1) = "C:\Dokumente und Einstellungen\ENCOM-SB\Desktop\test\NEW_Teil2.SLDPRT" Const swMoveCopyOptionsOverwriteExistingDocs = 1 retVal = swApp.CopyDocument(oldAsm, newAsm, oldChilds(), newChilds(), swMoveCopyOptionsOverwriteExistingDocs)
------------------ ---------- encom GmbH Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
JR Mitglied Konstrukteur
 
 Beiträge: 106 Registriert: 21.10.2003
|
erstellt am: 21. Jun. 2004 11:19 <-- editieren / zitieren --> Unities abgeben:          Nur für Bruggmann
Hier nochmal ein besseres Beispiel. Code:
Dim fso Dim SWX As SldWorks.SldWorksSet fso = CreateObject("Scripting.FileSystemObject") Set SWX = Application.SldWorks ' Baugruppe und Bauteile kopieren fso.CopyFile Baugruppe.sldasm, BaugruppeKopie.sldasm, True fso.CopyFile Bauteil1.sldprt, Bauteil1Kopie.sldprt, True fso.CopyFile Bauteil2.sldprt, Bauteil2Kopie.sldprt, True ' Referenz vom 1. kopierten Bauteil in der kopierten Baugruppe austauschen SWX .ReplaceReferencedDocument BaugruppeKopie.sldasm, Bauteil1.sldprt, Bauteil1Kopie.sldprt ' Referenz vom 2. kopierten Bauteil in der kopierten Baugruppe austauschen SWX .ReplaceReferencedDocument BaugruppeKopie.sldasm, Bauteil2.sldprt, Bauteil2Kopie.sldprt ' Referenz der Baugruppe im 1. kopierten Bauteil austauschen SWX .ReplaceReferencedDocument Bauteil1Kopie.sldprt, Baugruppe.sldasm, BaugruppeKopie.sldasm ' Referenz der Baugruppe im 2. kopierten Bauteil austauschen SWX .ReplaceReferencedDocument Bauteil2Kopie.sldprt, Baugruppe.sldasm, BaugruppeKopie.sldasm
Gruß Jörn
[Diese Nachricht wurde von JR am 21. Jun. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bruggmann Mitglied Konstrukteur (& Nachdiplomstudium Software-Engineering)

 Beiträge: 85 Registriert: 17.03.2004 Workstation: Fujitsu Siemens P4 3.2GHz 2.0 GB RAM Win XP SP1 - SW2005 SP0.1 (PDM: Smarteam)<P>Laptop: Compaq Evo 800w P4 2GHz 500MB RAM WinXP SP2 - SW2005 SP0.1 (PDM: ec-Manager, eigenes Tool..)
|
erstellt am: 21. Jun. 2004 11:30 <-- editieren / zitieren --> Unities abgeben:         
|
Bruggmann Mitglied Konstrukteur (& Nachdiplomstudium Software-Engineering)

 Beiträge: 85 Registriert: 17.03.2004 Workstation: Fujitsu Siemens P4 3.2GHz 2.0 GB RAM Win XP SP1 - SW2005 SP0.1 (PDM: Smarteam)<P>Laptop: Compaq Evo 800w P4 2GHz 500MB RAM WinXP SP2 - SW2005 SP0.1 (PDM: ec-Manager, eigenes Tool..)
|
erstellt am: 23. Jun. 2004 10:17 <-- editieren / zitieren --> Unities abgeben:         
also, mein makro zum SaveAs von baugruppen steht. aber mit dem referenzieren von ansichten in der zeichnungsableitung habe ich noch etwas probleme! die neue zeichnungsdatei is mit dem neuen modell verknüpft, aber die ansichten beziehen sich noch auf die alte modelldatei.. wie referenziere ich diese ansichten neu? gruss stefan ------------------ ---------- encom GmbH Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
JR Mitglied Konstrukteur
 
 Beiträge: 106 Registriert: 21.10.2003
|
erstellt am: 23. Jun. 2004 10:49 <-- editieren / zitieren --> Unities abgeben:          Nur für Bruggmann
Wenn Du die Zeichnungen auch kopierst, kannst Du die Referenzen in Zeichnungen eigentlich genauso wie oben beschreiben austauschen. Code:
swApp.ReplaceReferencedDocument ZeichnungKopie.slddrw, Bauteil1.sldprt, Bauteil1Kopie.sldprt
Ich verwende das so in einem Projekt von mir und das funktioniert problemlos (alle Referenzen zeigen auf die Kopie). Gruß Jörn
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bruggmann Mitglied Konstrukteur (& Nachdiplomstudium Software-Engineering)

 Beiträge: 85 Registriert: 17.03.2004 Workstation: Fujitsu Siemens P4 3.2GHz 2.0 GB RAM Win XP SP1 - SW2005 SP0.1 (PDM: Smarteam)<P>Laptop: Compaq Evo 800w P4 2GHz 500MB RAM WinXP SP2 - SW2005 SP0.1 (PDM: ec-Manager, eigenes Tool..)
|
erstellt am: 23. Jun. 2004 11:00 <-- editieren / zitieren --> Unities abgeben:         
hmm, eigentlich verwende ich schon genau diese funktion.. muss mal genau nachsehen ob irgendwas mit den variabeln falsch läuft.. so in etwa soltle es aussehen: 'newChilds(x) =kopie.slddrw 'oldChilds(x - 1) = orig.sldprt 'newChilds(x - 1) =kopie.sldprt ' SWX .ReplaceReferencedDocument newChilds(x), oldChilds(x - 1), newChilds(x - 1) ------------------ ---------- encom GmbH Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
JR Mitglied Konstrukteur
 
 Beiträge: 106 Registriert: 21.10.2003
|
erstellt am: 23. Jun. 2004 11:05 <-- editieren / zitieren --> Unities abgeben:          Nur für Bruggmann
|
Bruggmann Mitglied Konstrukteur (& Nachdiplomstudium Software-Engineering)

 Beiträge: 85 Registriert: 17.03.2004 Workstation: Fujitsu Siemens P4 3.2GHz 2.0 GB RAM Win XP SP1 - SW2005 SP0.1 (PDM: Smarteam)<P>Laptop: Compaq Evo 800w P4 2GHz 500MB RAM WinXP SP2 - SW2005 SP0.1 (PDM: ec-Manager, eigenes Tool..)
|
erstellt am: 23. Jun. 2004 11:14 <-- editieren / zitieren --> Unities abgeben:         
|
Bruggmann Mitglied Konstrukteur (& Nachdiplomstudium Software-Engineering)

 Beiträge: 85 Registriert: 17.03.2004 Workstation: Fujitsu Siemens P4 3.2GHz 2.0 GB RAM Win XP SP1 - SW2005 SP0.1 (PDM: Smarteam)<P>Laptop: Compaq Evo 800w P4 2GHz 500MB RAM WinXP SP2 - SW2005 SP0.1 (PDM: ec-Manager, eigenes Tool..)
|
erstellt am: 23. Jun. 2004 12:26 <-- editieren / zitieren --> Unities abgeben:         
ok danke! habe das problem gelöst diese funktion war korret, aber es stimmte was nicht mit einer abfrage im voraus.. mein makro liest nun die aktuelle baugruppe inkl. unterbaugruppen und gleichnamigen zeichnungen aus. erstellt eine liste in der man umbenennen kannw as man möchte (ähnlich referenzen in 'speichern unter'), kopiert dann diese files und referenziert sie neu zu einander. vereinfacht also das manuelle indexieren von baugruppen oder parts daraus, da sicher keine zeichnungen etc vergessen gehen. ich werde das script noch etwas bearbeiten und testen, dann kommt es online! gruss stefan ------------------ ---------- encom GmbH Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
T. Steffen Mitglied Konstrukteur
 
 Beiträge: 339 Registriert: 27.03.2002
|
erstellt am: 23. Jun. 2004 13:09 <-- editieren / zitieren --> Unities abgeben:          Nur für Bruggmann
|
Michel_11 Mitglied Technischer Zeichner

 Beiträge: 22 Registriert: 14.08.2004
|
erstellt am: 25. Jul. 2005 17:15 <-- editieren / zitieren --> Unities abgeben:          Nur für Bruggmann
Hallo, ich bin nun auch mit der Thematik der Referenzen beschäftigt. Der Lösungsansatz mit : swApp.ReplaceReferencedDocument(...) funktioniert. Ich verstehe nur nicht die anderen Befehle der SWX -API , die dem Wortlaut nach auch Referenzen verändern. Vielleicht kann mir hier jemand etwas erläutern . Ich meine Methode-1, Methode-3 meines Beispiels... Wie wird der Befehl bei Methode-1 korrekt verwendet? Wäre echt super. Ich habe zwar nun durch die Beiträge hier einen Lösungsweg, doch würde mich interessieren ob man bei geöffneter Baugruppe auch an den Referenzen arbeiten kann... Ferner verstehe ich noch nicht die Ausführungen zu 'gebrochenen Referentzen' ??? Was sollte man verwenden (wenn man an eine verbindliche Konstruktionsrichtlinie denkt) ' ****************************************************************************** ' * Thema : Ändern externer Referenzen - macro writen on 07/25/05 by Michl ' ****************************************************************************** const swExternalReferenceBroken = 0 const swExternalReferenceLocked = 1 const swExternalReferenceInContext = 3 const swExternalReferenceOutOfContext = 4 const swExternalReferenceDangling = 5 Dim swApp As Object Dim swPart As Object Dim swModel As Object Dim swAssy As Object Dim swConfig As Object Dim swComponent As Object Dim swChild As Object Dim bRet As Boolean Dim aRet As Variant Sub main() Dim Partfiles As String Dim i As Integer Dim varChildren As Variant Dim Child_newFile As String Dim swAssy_File As String Set swApp = CreateObject("SldWorks.Application") Set swPart = swApp.ActiveDoc Set swModel = swApp.ActiveDoc Set swAssy = swModel Set swSelMgr = swModel.SelectionManager Set swSelComp = swSelMgr.GetSelectedObjectsComponent(1) swAssy_File = "c:\work\2005\07\3DSW\3D-UJoint.sldasm" Set swConfig = swModel.GetActiveConfiguration 'Die Eltern-Komponente setzen: Set swComponent = swConfig.GetRootComponent 'Die Pointer auf die Kinder in eine Variante 'einlesen: varChildren = swComponent.GetChildren For i = 0 To UBound(varChildren) Set swChild = varChildren(i) 'aktuelles Child selektieren aRet = swChild.Select2(True, 0) If swChild.Name = "3D-Spider-1" Then Child_newFile = "c:\work\2005\06\3DSW\3D-Spider.sldprt" 'Prüfen ob Datei vorhanden ist MsgBox Dir(Child_newFile) '[-- Methode 1 --] ' bRet = swAssy.ReplaceComponents(swAssy_File, "", True, True) ' Error-Methode 1: 438, Objekt unterstützt diese Eigenschaft oder Methode nicht) '[-- Methode 2 --] referencingDoc = swAssy_File referencendDoc = swChild.getpathname newReference = Child_newFile bRet = swApp.ReplaceReferencedDocument(referencingDoc, referencendDoc, newReference) ' Error-M2 : keiner ; bRet = false ' geht anscheinend nur bei geschlossener Baugruppen-Datei, Test war da OK '[-- Methode 3 --] bRet = swChild.ReplaceReference(newReference) ' Error-M3 : keiner ; bRet = true ' aber Referenz wird nicht geändert 'ändere Eigenschaften ändern (funktioniert) swChild.visible True End If Partfiles = Partfiles & "(" & swChild.Name & ") " & swChild.getpathname & vbCrLf swModel.ClearSelection2 (True) 'MsgBox Child.ReferencedConfiguration Next i End Sub
------------------ Bin schon gespannt wer alles antwortet Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |