Autor
|
Thema: Strukturbaum umbenennen (4724 mal gelesen)
|
Construkter Mitglied Konstrukteur
Beiträge: 13 Registriert: 06.08.2013 Win 7 64Bit Intel Xeon E31270 @3.4GHz (8 CPUs) 16 GB RAM NVIDIA Quadro 2000<P>Catia V5 R19
|
erstellt am: 07. Aug. 2013 07:57 <-- editieren / zitieren --> Unities abgeben:
Morgen Catia Community, wie man sieht bin neu im Forum und hoffe ich mach alles richtig Ich arbeite derzeit in einer kleinen Werkzeugbau Firma und soll irgendwie eine Lösung finden wie man bei weiter kopierten Baugruppen "einfach, schnell und günstig" die Benennung (nur Teilenummer)im Strukturbaum ändern kann... Hab eigentlich keine Lösung bzw Lösungsweg gefunden bis auf ein Makro, da ich aber null Ahnung in VBE Programmierung besitze stehe ich wieder vor einer Wand. Hätte hier im Forum schon gesucht bin aber leider nicht fündig geworden. Aufgabenstellung wäre:
Strukturbaum besitzt mehrere catproducts und catparts und die sollen geändert werden aber nur in der Teilenummer und der Exemplarname soll aber immer gleich bleiben. Benennung z.B.: 20_2530__fg524__weg1500__bsi__grundplatte_asm.catproduct 20_2530__fg524__weg1500__bsi__grundplatte_ut.catpart Wenn ich jetzt die Baugruppe kopiere muss ich auch die Benennung ändern und das ist ziemlich aufwendig, das Makro soll so funktionieren das man die einzelnen Werte eingibt und es so austauscht wie "Suchen und ersetzen" im Excel oder so.
Benennung die sich ändern bzw austauschen soll: 20_2530 fg524 weg1500 bsi Hoffe, mir kann hier irgend jemand helfen, sehe sonst selbst keinen Ausweg mehr für die Aufgabenstellung. Danke schon einmal für jedwede Hilfe Grüß Sebastian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 07. Aug. 2013 08:29 <-- editieren / zitieren --> Unities abgeben: Nur für Construkter
Servus Willkommen im Forum. Zu solch einem Problem gibt es schon andere Diskussionen (zB hier und hier). Wie umfangreich (und ggf komplex) das Makro dabei sein muss, hängt von mehreren Faktoren ab: - sollen die Dateinamen auch geändert werden - was sollt mit den Zeichnungen passieren ggf wäre es für euch einfacher (und billiger) ein fertiges Tool dazu zu kaufen. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
K.Siebert Mitglied Tech Zeichner
Beiträge: 415 Registriert: 19.05.2007 Win XP Catia V5 R19 Catia V5 R24
|
erstellt am: 07. Aug. 2013 08:31 <-- editieren / zitieren --> Unities abgeben: Nur für Construkter
|
Construkter Mitglied Konstrukteur
Beiträge: 13 Registriert: 06.08.2013 Win 7 64Bit Intel Xeon E31270 @3.4GHz (8 CPUs) 16 GB RAM NVIDIA Quadro 2000<P>Catia V5 R19
|
erstellt am: 07. Aug. 2013 10:11 <-- editieren / zitieren --> Unities abgeben:
Hallo, hab mir jetzt die Makros angeschaut, das Makro "suchen und ersetzen" finde ich sehr gut aber möchte die Funktion 4x hintereinander verwenden ohne das es sich schließt. Sowie das Makro "FILENAME WIRD ZUM PARTNUMBER" von DasDon nur hier wird der Exemplarname auch geändert. Das Makro müsste man abändern da ich den Exemplarname nicht abändern darf. @bgrittmann: zu den Aufgaben des Makro -> Abändern von 4 unterschiedlichen Bezeichnungen sowie der Dateiname soll gleich wie die Teilenummer sein Könnte man die zwei Makros verbinden das ich zuerst 4x die Funktion "suchen und ersetzen" habe und sofort im Anschluss "FILENAME WIRD ZUM PARTNUMBER"???
[Diese Nachricht wurde von Construkter am 07. Aug. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
K.Siebert Mitglied Tech Zeichner
Beiträge: 415 Registriert: 19.05.2007 Win XP Catia V5 R19 Catia V5 R24
|
erstellt am: 07. Aug. 2013 13:24 <-- editieren / zitieren --> Unities abgeben: Nur für Construkter
Hallo, Code: Sub CATMain()Zaehler = 0 For i = 1 to 4 Zaehler = Zaehler + 1 Set actProd = CATIA.ActiveDocument.Product origstr = Inputbox ("Eingeben welcher Name oder Nummer ersetzt werden soll!!! ", "Suche und Ersetze (Suche)" & " Durchlauf:" & Zaehler) newstr = Inputbox ("Zu ersetzenden Namen oder Nummer eingeben", "Suche und Ersetze (Ersetze)" & " Durchlauf:" & Zaehler)
traverse actProd, origstr, newstr next FILENAME_WIRD_ZUM_PARTNUMBER
End Sub Sub traverse(Prod, origstr, newstr)
set refp = Prod.ReferenceProduct if instr(refp.Name, origstr) then newpname = Replace(refp.Name, origstr, newstr) refp.Name = newpname end if if instr(refp.PartNumber, origstr) then newpnum = Replace(refp.PartNumber, origstr, newstr) refp.PartNumber = newpnum end if Set prods = Prod.Products pc = prods.Count If pc > 0 then For i = 1 to pc traverse prods.Item(i), origstr, newstr Next End If End Sub Sub FILENAME_WIRD_ZUM_PARTNUMBER
'---------- hier Code dazwischen ----------------------
'---------- hier Code dazwischen ---------------------- end sub
Du musst jetzt einfach nur noch den gewünschten Code hinein kopieren. und die Zeile ausklammern (hier bin ich mir nicht ganz sicher) '-------------------- 'ADDS PARTNUMBER AND OLD INSTANCE NUMBER AS NEW INSTANCENAME tmp = SPLIT(oChild.Name,".") oChild.Name = oChild.PartNumber & "." & tmp(UBOUND(tmp)) '-------------------- ausklammern = ->'<- (ist ein hochkomma)
------------------ Sei Schlau bleib Dumm !!?!! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Construkter Mitglied Konstrukteur
Beiträge: 13 Registriert: 06.08.2013 Win 7 64Bit Intel Xeon E31270 @3.4GHz (8 CPUs) 16 GB RAM NVIDIA Quadro 2000<P>Catia V5 R19
|
erstellt am: 07. Aug. 2013 16:10 <-- editieren / zitieren --> Unities abgeben:
Hallo, habe einmal versucht das Makro zusammen bauen. Im Grunde funktioniert es schon richtig gut (das mit dem Ausklammern hat funktioniert) aber jetzt löscht es den alten Datenstand im Explorer nicht mehr es, speichert nur den neuen. Habe mir den Code schon mehrmals durchgesehen, versteh aber nicht wiso er den alten nicht mehr löscht...
Anbei den Code den ich benutze:
Sub CATMain()
Zaehler = 0 For i = 1 to 4 Zaehler = Zaehler + 1 Set actProd = CATIA.ActiveDocument.Product origstr = Inputbox ("Eingeben welcher Name oder Nummer ersetzt werden soll!!! ", "Suche und Ersetze (Suche)" & " Durchlauf:" & Zaehler) newstr = Inputbox ("Zu ersetzenden Namen oder Nummer eingeben", "Suche und Ersetze (Ersetze)" & " Durchlauf:" & Zaehler)
traverse actProd, origstr, newstr next DIM answer DIM acDoc DIM acProd SET acDoc = CATIA.ActiveDocument SET acProd = acDoc.Product acProd.ApplyWorkMode DESIGN_MODE answer = MSGBOX("do you wish to delete the original file?",36,"DELETION") WalkThroughTree acProd CATIA.DisplayFileAlerts = true END_MESSAGE END SUB Sub traverse(Prod, origstr, newstr) set refp = Prod.ReferenceProduct if instr(refp.Name, origstr) then newpname = Replace(refp.Name, origstr, newstr) refp.Name = newpname end if if instr(refp.PartNumber, origstr) then newpnum = Replace(refp.PartNumber, origstr, newstr) refp.PartNumber = newpnum end if Set prods = Prod.Products pc = prods.Count If pc > 0 then For i = 1 to pc traverse prods.Item(i), origstr, newstr Next End If End Sub SUB WalkThroughTree(oParent) DIM iProduct DIM oChild FOR iProduct = 1 TO oParent.Products.Count SET oChild = oParent.Products.Item(iProduct) IF oChild.Parameters.Count <> 0 THEN IF oChild.Parameters.Item(oChild.Parameters.Count).ValueAsString = "true" THEN '-------------------- 'ADDS PARTNUMBER AND OLD INSTANCE NUMBER AS NEW INSTANCENAME ‘tmp = SPLIT(oChild.Name,".") ‘oChild.Name = oChild.PartNumber & "." & tmp(UBOUND(tmp)) '-------------------- 'SENDS CHILDREN WITH NO CHILDREN TO SAVE AND CHILDREN WITH CHILDERN TO WALTHROUGH (BOTTOM UP) IF oChild.Products.Count = 0 THEN SaveAsPartNumber oChild.ReferenceProduct ELSE WalkThroughTree oChild.ReferenceProduct END IF END IF END IF NEXT '-------------------- 'SENDS THE PRODUCT TO SAVE AFTER ALL CHILDREN HAVE BEEN SAVED IF oChild.Parameters.Item(oChild.Parameters.Count).ValueAsString = "true" THEN IF oParent.Products.Count > 0 THEN SaveAsPartNumber oParent END IF END IF END SUB '------------------------------------- '------------------------------------- SUB SaveAsPartNumber (oProd) DIM objToDelete DIM orginalPath DIM oDoc CATIA.DisplayFileAlerts = false FOR EACH oDoc IN CATIA.Documents IF TYPENAME(oDoc) = "ProductDocument" OR TYPENAME(oDoc) = "PartDocument" THEN IF oDoc.Product.PartNumber = oProd.PartNumber THEN objToDelete = oDoc.FullName orginalPath = oDoc.Path & "\" IF oProd.HasAMasterShapeRepresentation THEN 'A PART HAS A MASTERSHAPEREPREASENTATION IF CATIA.FileSystem.FileExists(orginalPath & oProd.PartNumber & ".CATPart") = FALSE THEN oDoc.SaveAs(orginalPath & oProd.PartNumber & ".CATPart") IF answer = 6 THEN CATIA.FileSystem.DeleteFile(objToDelete) END IF ELSE IF CATIA.FileSystem.FileExists(orginalPath & oProd.PartNumber & ".CATProduct") = FALSE THEN oDoc.SaveAs(orginalPath & oProd.PartNumber & ".CATProduct") IF answer = 6 THEN CATIA.FileSystem.DeleteFile(objToDelete) END IF END IF END IF END IF NEXT END SUB '------------------------------------- '---------------------------------------- SUB END_MESSAGE() MSGBOX MACRO_NAME & " " & MACRO_VERS & " finished." _ & vbLF & "Please check results" & vbLF & _ "-----------------------------------" & vbLF & _ "-----------------------------------" & vbLF & _ "macro written by:" & vbLF & _ "DasDon" , vbyes, MACRO_NAME & " " & MACRO_VERS END SUB Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 07. Aug. 2013 17:28 <-- editieren / zitieren --> Unities abgeben: Nur für Construkter
Servus IMHO ist die Variabel "answer" nur in der CATMain gesetzt, die anderen Routine können nicht darauf zugreifen. Deshalb musst du zB diese Variabel als global definieren (oder als Input an die anderen Routinen weiterreichen) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
K.Siebert Mitglied Tech Zeichner
Beiträge: 415 Registriert: 19.05.2007 Win XP Catia V5 R19 Catia V5 R24
|
erstellt am: 07. Aug. 2013 17:35 <-- editieren / zitieren --> Unities abgeben: Nur für Construkter
Hallo, Sollte so Funktionieren das einzige was ich gemacht habe das ich jetzt beide Sub’s getrennt voneinander in einer SubMain aufrufe. Der Exemplarname wird nicht angepasst. Folgende Zeile ist für den Exemplarname zuständig: 'oChild.Name = oChild.PartNumber & "." & tmp(UBOUND(tmp)) Code: MACRO_NAME = "ReNameFileNameAsPartNumber" MACRO_VERS = "V1.1" 'VER: V1.1 CATCHES DEACTIVATED PRODUCTS AND OPEN DOCUMENTS OTHER THAN CATPRODUCT AND CATPART 'DESC: RENAMES THE THE FILE NAMES OF CATPRODUCTS AND CATPARTS TO THAT OF THE PARTNUMBER 'DEPENDING ON THE ANSWER GIVEN THE ORIGINAL FILES WILL BE DELETED 'PREP: ALL DOCUMENTS MUST BE CLOSED APART FROM THE DOCUMENT TO WORK ON 'LANG: CATVBS 'DATE: 08/08/2013
'CREA: Original of DasDon see http://ww3.cad.de/foren/ubb/Forum137/HTML/004777.shtml (Changes of K.Siebert) '------------------------------------------- DIM answer '------------------------------------------- Sub CATMain()
Suche_Ersetze Delete_File end Sub
'------------------------------------- Start Suche Ersetze ------------------------------------------- Sub Suche_Ersetze Zaehler = 0 For i = 1 to 4 Zaehler = Zaehler + 1 Set actProd = CATIA.ActiveDocument.Product origstr = Inputbox ("Eingeben welcher Name oder Nummer ersetzt werden soll!!! ", "Suche und Ersetze (Suche)" & " Durchlauf:" & Zaehler) newstr = Inputbox ("Zu ersetzenden Namen oder Nummer eingeben", "Suche und Ersetze (Ersetze)" & " Durchlauf:" & Zaehler)
traverse actProd, origstr, newstr next End Sub Sub traverse(Prod, origstr, newstr) set refp = Prod.ReferenceProduct if instr(refp.Name, origstr) then newpname = Replace(refp.Name, origstr, newstr) refp.Name = newpname end if if instr(refp.PartNumber, origstr) then newpnum = Replace(refp.PartNumber, origstr, newstr) refp.PartNumber = newpnum end if Set prods = Prod.Products pc = prods.Count If pc > 0 then For i = 1 to pc traverse prods.Item(i), origstr, newstr Next End If End Sub '------------------------------------- Ende Suche Ersetze ------------------------------------------- SUB Delete_File() DIM acDoc DIM acProd SET acDoc = CATIA.ActiveDocument SET acProd = acDoc.Product acProd.ApplyWorkMode DESIGN_MODE answer = MSGBOX("do you wish to delete the original file?",36,"DELETION") WalkThroughTree acProd CATIA.DisplayFileAlerts = true END_MESSAGE END SUB '------------------------------------- '------------------------------------- SUB WalkThroughTree(oParent) DIM iProduct DIM oChild FOR iProduct = 1 TO oParent.Products.Count SET oChild = oParent.Products.Item(iProduct) IF oChild.Parameters.Count <> 0 THEN IF oChild.Parameters.Item(oChild.Parameters.Count).ValueAsString = "true" THEN '-------------------- 'ADDS PARTNUMBER AND OLD INSTANCE NUMBER AS NEW INSTANCENAME tmp = SPLIT(oChild.Name,".") 'oChild.Name = oChild.PartNumber & "." & tmp(UBOUND(tmp)) '-------------------- 'SENDS CHILDREN WITH NO CHILDREN TO SAVE AND CHILDREN WITH CHILDERN TO WALTHROUGH (BOTTOM UP) IF oChild.Products.Count = 0 THEN SaveAsPartNumber oChild.ReferenceProduct ELSE WalkThroughTree oChild.ReferenceProduct END IF END IF END IF NEXT '-------------------- 'SENDS THE PRODUCT TO SAVE AFTER ALL CHILDREN HAVE BEEN SAVED IF oChild.Parameters.Item(oChild.Parameters.Count).ValueAsString = "true" THEN IF oParent.Products.Count > 0 THEN SaveAsPartNumber oParent END IF END IF END SUB '------------------------------------- '------------------------------------- SUB SaveAsPartNumber (oProd) DIM objToDelete DIM orginalPath DIM oDoc CATIA.DisplayFileAlerts = false FOR EACH oDoc IN CATIA.Documents IF TYPENAME(oDoc) = "ProductDocument" OR TYPENAME(oDoc) = "PartDocument" THEN IF oDoc.Product.PartNumber = oProd.PartNumber THEN objToDelete = oDoc.FullName orginalPath = oDoc.Path & "\" IF oProd.HasAMasterShapeRepresentation THEN 'A PART HAS A MASTERSHAPEREPREASENTATION IF CATIA.FileSystem.FileExists(orginalPath & oProd.PartNumber & ".CATPart") = FALSE THEN oDoc.SaveAs(orginalPath & oProd.PartNumber & ".CATPart") IF answer = 6 THEN CATIA.FileSystem.DeleteFile(objToDelete) END IF ELSE IF CATIA.FileSystem.FileExists(orginalPath & oProd.PartNumber & ".CATProduct") = FALSE THEN oDoc.SaveAs(orginalPath & oProd.PartNumber & ".CATProduct") IF answer = 6 THEN CATIA.FileSystem.DeleteFile(objToDelete) END IF END IF END IF END IF NEXT END SUB '------------------------------------- '---------------------------------------- SUB END_MESSAGE() MSGBOX MACRO_NAME & " " & MACRO_VERS & " finished." _ & vbLF & "Please check results" & vbLF & _ "-----------------------------------" & vbLF & _ "-----------------------------------" & vbLF & _ "macro written by:" & vbLF & _ "DasDon" , vbyes, MACRO_NAME & " " & MACRO_VERS END SUB '----------------------------------------
------------------ Sei Schlau bleib Dumm !!?!! [Diese Nachricht wurde von K.Siebert am 08. Aug. 2013 editiert.] [Diese Nachricht wurde von K.Siebert am 08. Aug. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Construkter Mitglied Konstrukteur
Beiträge: 13 Registriert: 06.08.2013 Win 7 64Bit Intel Xeon E31270 @3.4GHz (8 CPUs) 16 GB RAM NVIDIA Quadro 2000<P>Catia V5 R19
|
erstellt am: 08. Aug. 2013 08:33 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen, Siebert, dein Makro funktioniert perfekt, dankeschön Bernd, entschuldige aber ich versteh bei deinem Post nur Bahnhof Gibt es vielleicht hier im Netz ne kleine Doku das mann die Scripte leichter verstehen kann??? Möchte mich selber auch damit auskennen was hier so in Hieroglyphen steht. Gruß Sebastian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
K.Siebert Mitglied Tech Zeichner
Beiträge: 415 Registriert: 19.05.2007 Win XP Catia V5 R19 Catia V5 R24
|
erstellt am: 08. Aug. 2013 08:56 <-- editieren / zitieren --> Unities abgeben: Nur für Construkter
|
Construkter Mitglied Konstrukteur
Beiträge: 13 Registriert: 06.08.2013 Win 7 64Bit Intel Xeon E31270 @3.4GHz (8 CPUs) 16 GB RAM NVIDIA Quadro 2000<P>Catia V5 R19
|
erstellt am: 05. Dez. 2013 18:43 <-- editieren / zitieren --> Unities abgeben:
Servus, muss leider diesen Tread doch nocheinmal weiterführen... Hab mich in letzter Zeit schon so gut es ging in die Makros gestürzt bin jetzt aber doch wieder zum stehen gekommen.
Strukturbaum: - ca. 300 verschiedene Bauteile (teilweise auch mehr, sind aber grundsätzlich kleine Teile) - teilweise im context kontruiert - Products bzw Parts öfters verbaut aber unter verschiedenen Products - CGR - Files bzw Komponenten sind vorhanden, dürften aber kein Problem sein es sind keine "entladene" Teile vorhanden sowie CATDUAV5 hab ich auch schon über jedes BT gelassen
Benennung Strukturbaum: kein Problem, wird alles so abgeändert wie es eingegeben wurde
Benennung Dateifile: und hier steckt irgendwo der Teufel im Detail: Das Makro speichert ca.10-15 Teile (immer unterschiedlich) und dann bricht es mit eine Fehlermeldung ab. Wenn ich jetzt das Makro editieren möchte komme ich auf diese Zeile: IF oProd.HasAMasterShapeRepresentation THEN 'A PART HAS A MASTERSHAPEREPREASENTATION IF CATIA.FileSystem.FileExists(orginalPath & oProd.PartNumber & ".CATPart") = FALSE THEN oDoc.SaveAs(orginalPath & oProd.PartNumber & ".CATPart") IF answer = 6 THEN CATIA.FileSystem.DeleteFile(objToDelete) END IF Hat da mal einer eine Ahnung was hier das Problem sein könnte??? Hab das Makro am Anfang über das Netzlaufwerk laufen lassen sowie im nachhinein auch am Desktop, bei beiden kommt eine Fehlermeldung, kann somit nicht am Dateipfad liegen... Gibt es eigentlich eine maximale Dateinamenlänge? Schönen Abend (Krampustag ) Gruß Sebastian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 05. Dez. 2013 21:20 <-- editieren / zitieren --> Unities abgeben: Nur für Construkter
Servus Und wie lautet die Fehlermeldung. Wie lang der Pfad/Dateinamen sein darf hängt vom Betriebssystem ab. Vermutlich ist bei 255 Zeichen die Grenze (liefert zumindest die Internet-Suche) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
K.Siebert Mitglied Tech Zeichner
Beiträge: 415 Registriert: 19.05.2007 Win XP Catia V5 R19 Catia V5 R24
|
erstellt am: 08. Dez. 2013 00:29 <-- editieren / zitieren --> Unities abgeben: Nur für Construkter
|
Construkter Mitglied Konstrukteur
Beiträge: 13 Registriert: 06.08.2013 Win 7 64Bit Intel Xeon E31270 @3.4GHz (8 CPUs) 16 GB RAM NVIDIA Quadro 2000<P>Catia V5 R19
|
erstellt am: 10. Dez. 2013 17:00 <-- editieren / zitieren --> Unities abgeben:
Hallo, anbei ein Foto der Fehlermeldung. fehler_meldung.jpg Habe schon eine Versuchs ASM erstellt mit: Parts Products CGRs Komponenten entladenen Parts / Products Parts: keine Probleme / Änderung des Dateinames erfolgreich Products: keine Probleme / Änderung des Dateinames erfolgreich CGRs: keine Probleme / nur ein Änderung der Strukturbaumbenennung, Dateifile bleibt gleich aber keine Fehlermeldung Komponenten: keine Probleme / nur ein Änderung der Strukturbaumbenennung, Dateifile gibt es ja keines --> keine Fehlermeldung entladenen Parts / Products: Probleme / es wird nicht geändert und Fehlermeldung --> Fehlermeldung_entladenes_part.png
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |