Autor
|
Thema: Umbenennen von Parts (2853 mal gelesen)
|
Struppi0909 Mitglied Konstrukteur
Beiträge: 18 Registriert: 27.05.2010 Win XP Pro SP3 P4; 2,40GHz; 4GB GeForce 9800GT;512MB CatiaV5R19SP3
|
erstellt am: 27. Mai. 2010 12:36 <-- editieren / zitieren --> Unities abgeben:
Hallo ich habe ein Makro wo die Namen der Parts (Instancename und Part Number) und der Produkte umgeschrieben werden. Beispiel: aaa_ET001 aaa_ET002 Bei Suchen und Ersetzen gebe ich aaa_ an und kann z.B bbb_ dadurch ersetzen. Ergebnis: bbb_ET001 bbb_ET002 Das funktioniert auch einwandfrei. Habe ich aber diese Konstellation: aaa_ET001 bbb_ET001 und ersetze die aaa_ in z.B. ccc_ bricht das Makro ab, da das Makro aaa_ET001 schon umgeschrieben ist in ccc_ET001 und das zweite Part kann nicht umgeschrieben werden in ccc_ET001 da es ja mittlerweile existiert. Ich würde gerne diesen Fehler abfangen mit einer msgbox wo darauf verwiesen wird das dieses Part nicht unbenannt werden kann, da schon ein Part existiert mit dem gleichen Namen. Ich bin nicht wirklich der Makroguru und habe auch schon in diesem Forum geschaut, aber leider nichts in dieser Richtung gefunden. Für eure Hilfe bedanke ich mich schon im voraus. ------------------ Struppi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MICHLICK Mitglied CAD Methodik Entwickler (CATIA; NX)
Beiträge: 454 Registriert: 20.06.2001 Der Aufwand bei Änderungen ist groß, wenn die Finger schneller klicken als das Gehirn denkt.
|
erstellt am: 27. Mai. 2010 14:59 <-- editieren / zitieren --> Unities abgeben: Nur für Struppi0909
Hallo, eine Möglichkeit wäre z.B. nach dem "neuen" Namen zu suchen bevor Du die Instanzen umbenennst. Falls Du da einen Treffer hast, kannst Du eine Input-Box aufscheinen lassen, indem Du den Namen vorblendest und dem Anwender damit die Möglichkeit lässt selbst einen neuen Namen zu vergeben. Entweder den Kompletten Namen oder nur den Prefix. Das liegt dann bei Dir. Allerdings mußt Du dann natürlich noch einmal prüfen ob der eingegebene Name schon in der Baugruppe existiert. ------------------ Gruß Michael B. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Struppi0909 Mitglied Konstrukteur
Beiträge: 18 Registriert: 27.05.2010 Win XP Pro SP3 P4; 2,40GHz; 4GB GeForce 9800GT;512MB CatiaV5R19SP3
|
erstellt am: 27. Mai. 2010 16:37 <-- editieren / zitieren --> Unities abgeben:
Hi Michael die Antwort hört sich sehr gut an, nur habe ich nicht das Wissen das zu realisieren, da ich noch in den "Makrokinderschuhen" stecke und mir das alles selbst beibringe bzw. in Fachliteratur nachlese oder hier mich kundig mache. Gruß ------------------ Struppi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EngineeredByRobberts Mitglied Ingenieur
Beiträge: 109 Registriert: 27.04.2010 Dell Precision 690 Windows XP V5R19SP3 V5R17SP0
|
erstellt am: 27. Mai. 2010 16:54 <-- editieren / zitieren --> Unities abgeben: Nur für Struppi0909
|
Struppi0909 Mitglied Konstrukteur
Beiträge: 18 Registriert: 27.05.2010 Win XP Pro SP3 P4; 2,40GHz; 4GB GeForce 9800GT;512MB CatiaV5R19SP3
|
erstellt am: 27. Mai. 2010 18:29 <-- editieren / zitieren --> Unities abgeben:
Hallo ich stelle hier mal das Makro rein, da ich nicht weiß, wie ich das machen soll und wo ich diesen Befehl eintragen soll. Option Explicit
Private Sub cmdUmwandeln_Click() If (txtzuersetzenderString.Text = "") Then lblBeschreibung.ForeColor = vbBlue lblBeschreibung.Caption = "Bitte geben Sie den zu ersetzenden String ein!" Exit Sub End If If (txtzuschreibenderString.Text = "") Then lblBeschreibung.ForeColor = vbBlue lblBeschreibung.Caption = "Bitte geben Sie den zu schreibenden String ein!" Exit Sub End If If (CATIA.Documents.Count = 0) Then lblBeschreibung.Caption = "Umwandlung beendet!" Exit Sub End If lblBeschreibung.ForeColor = vbBlack lblBeschreibung.Caption = "Bitte warten - Umwandlung wird ausgeführt..." Dim Teilename_alt As String Dim Teilename_neu As String If TypeOf CATIA.ActiveDocument Is ProductDocument Then Teilename_alt = CATIA.ActiveDocument.Product.Name Teilename_neu = Replace(Teilename_alt, txtzuersetzenderString, txtzuschreibenderString) If Teilename_alt <> Teilename_neu Then CATIA.ActiveDocument.Product.PartNumber = Teilename_neu Else lblBeschreibung.Caption = "Dieses Programm sucht nach einem String in der" & Chr(13) _ & "Aufbaustruktur des aktuell geöffneten Produktes" & Chr(13) _ & "und ersetzt ihn durch einen Neuen." lblBeschreibung.ForeColor = vbRed MsgBox ("Das Makro funktioniert nur bei CATProducts!") cmdUmwandeln.Enabled = True cmdSchliessen.Enabled = True frmHauptformular.Repaint Exit Sub End If Call umbenennen(CATIA.ActiveDocument.Product) lblBeschreibung.Caption = "Umwandlung beendet!" lblBeschreibung.ForeColor = vbBlue frmHauptformular.Repaint cmdUmwandeln.Enabled = True cmdSchliessen.Enabled = True frmHauptformular.Repaint Exit Sub Errorhandler: MsgBox ("Ein Fehler ist aufgetreten - Makroabbruch!") frmHauptformular.Repaint cmdUmwandeln.Enabled = True cmdSchliessen.Enabled = True frmHauptformular.Repaint End Sub Private Sub cmdSchliessen_Click() End End Sub Private Sub lblBeschreibung_Click()
End Sub Private Sub UserForm_Activate() lblBeschreibung.Caption = "Dieses Programm sucht nach einem String in der" & Chr(13) _ & "Aufbaustruktur des aktuell geöffneten Produktes" & Chr(13) _ & "und ersetzt ihn durch einen Neuen." lblBeschreibung.ForeColor = vbRed frmHauptformular.Repaint End Sub Function umbenennen(Produktname) Dim myDocuments As Documents Dim Teilename_alt As String Dim Teilename_neu As String Dim Exemplarname_alt As String Dim Exemplarname_neu As String Dim i As Long For i = 1 To Produktname.Products.Count Teilename_alt = Produktname.Products.Item(i).PartNumber Teilename_neu = Replace(Teilename_alt, txtzuersetzenderString, txtzuschreibenderString) Exemplarname_alt = Produktname.Products.Item(i).Name Exemplarname_neu = Replace(Exemplarname_alt, txtzuersetzenderString, txtzuschreibenderString) If Teilename_alt <> Teilename_neu Then Produktname.Products.Item(i).PartNumber = Teilename_neu If Exemplarname_alt <> Exemplarname_neu Then Produktname.Products.Item(i).Name = Exemplarname_neu 'R E K U R S I O N If TypeName(Produktname.Products.Item(i)) = "Product" Then Call umbenennen(Produktname.Products.Item(i).ReferenceProduct) End If Next End Function Gruß
------------------ Struppi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EngineeredByRobberts Mitglied Ingenieur
Beiträge: 109 Registriert: 27.04.2010 Dell Precision 690 Windows XP V5R19SP3 V5R17SP0
|
erstellt am: 27. Mai. 2010 19:48 <-- editieren / zitieren --> Unities abgeben: Nur für Struppi0909
|
Struppi0909 Mitglied Konstrukteur
Beiträge: 18 Registriert: 27.05.2010 Win XP Pro SP3 P4; 2,40GHz; 4GB GeForce 9800GT;512MB CatiaV5R19SP3
|
erstellt am: 11. Jun. 2010 10:00 <-- editieren / zitieren --> Unities abgeben:
Hallo Robert, danke für deine Unterstützung, leider wird bei deinem Befehl das Makro abgebrochen und ich weiß immer noch nicht als Benutzer woran der Fehler lag. Ich hätte gerne eine Lösung indem ein MsgBox aufgeht und dem Benutzer sagt: Teil kann nicht unbenannt werden da es schon existiert.Und dann müßte für den Benutzer die Partnumber bzw Instancename angezeigt bekommen woran es gescheitert ist. So in etwa habe ich mir das vorgestellt ------------------ Gruß Struppi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EngineeredByRobberts Mitglied Ingenieur
Beiträge: 109 Registriert: 27.04.2010 Dell Precision 690 Windows XP V5R19SP3 V5R17SP0
|
erstellt am: 11. Jun. 2010 11:17 <-- editieren / zitieren --> Unities abgeben: Nur für Struppi0909
'On Error Resume Next' sollte eigentlich den Abbruch verhindern? Ich habe mal ein Beispiel beigefügt (CATScript), allerdings mit ein Textfile als Ausgabe anstatt von ein Messagebox ------------------ - Robert Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Struppi0909 Mitglied Konstrukteur
Beiträge: 18 Registriert: 27.05.2010 Win XP Pro SP3 P4; 2,40GHz; 4GB GeForce 9800GT;512MB CatiaV5R19SP3
|
erstellt am: 14. Jun. 2010 12:21 <-- editieren / zitieren --> Unities abgeben:
Hi Robert dein Script ist OK. Nur leider prüft dein Script über den Dateinamen die Part Number bzw.den Instancename und gleicht in mit dem Dateiname ab. Die Part Number bzw.den Instancename werden abgeglichen und notfalls ersetzt und als text-File heraus geschrieben. Das ist auch OK. Nach deinem script haben die Dateien dieses Format(Soweit OK) Beispiel: Dateiname/ Part Number/ Instancename aaa_ET001/aaa_ET001/aaa_ET001 bbb_ET001/bbb_ET001/bbb_ET001 Wenn ich aber jetzt mein script darüber laufen lasse, das die Part Number verändert bekomme ich weiterhin eine Fehlermeldung. Beispiel: aus aaa wird bbb Dateiname/Part Number/ Instancename aaa_ET001/aaa_ET001(bbb_ET001)/aaa_ET001 <---Fehlermeldung da die Part Number schon existiert, (kann nicht umbenannt werden) bbb_ET001/bbb_ET001/bbb_ET001
Ich hätte jetzt für mein Script eine msgbox die aufgeht und sagt "aaa_ET001 kann nicht in bbb_ET001 umbenannt werden da sie schon existiert." Mir würde es schon reichen wenn das script mir im Strukturbaum zeigt welches Bauteil es nicht umbenennen kann. Im Moment hält das Script an und ich weiß nicht welches Bauteil den Fehler verursacht!!! Bei mir existieren ca 150 Bauteile, mit diversen Unterprodukten. Wenn das Script abbricht, muß ich im Moment alles händisch durchsuchen, welche Part Number den Fehler verursacht hat. Ich stelle das Script "suchen und ersetzen" einmal rein: Sub traverse(Prod, origstr, newstr) set refp = Prod.ReferenceProduct if instr(refp.Name, origstr) then newpname = Replace(refp.Name, origstr, newstr) refp.Name = newpname <----------- hier entsteht immer die Fehlermeldung 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 CATMain() Set actProd = CATIA.ActiveDocument.Product origstr = Inputbox ("Eingeben welcher Name oder Nummer ersetzt werden soll!!! ", "Suche und Ersetze (Suche)") newstr = Inputbox ("Zu ersetzenden Namen oder Nummer eingeben", "Suche und Ersetze (Ersetze)") traverse actProd, origstr, newstr End Sub Wie gesagt mir würde es schon reichen wenn im Strukturbaum das Part "leuchten" würde das nicht umbenannt werden konnte!!!!
Ich hoffe ich habe mein Problem soweit ich konnte richtig erklärt. ------------------ Gruß Struppi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
roccat Mitglied Konstrukteur
Beiträge: 172 Registriert: 19.02.2010 WinXP/Win7 Office XP/2007 Catia V5 R16-R19, VB6.0, VBA, BASCOM-AVR VB .Net 2010
|
erstellt am: 14. Jun. 2010 12:40 <-- editieren / zitieren --> Unities abgeben: Nur für Struppi0909
Hallo Struppi, du kannst ja bei einem Fehler das entsprechende Part in einer Selection reinhauen und ein center graph draufmachen. Ich gebe sowas auch gern in einer listbox aus und schreibe die Fehlerhaften Producte in ein Array dan kannst du alle fehlerhaften elemente Auflisten und Click im Listeneintrag das passende Product abrufen musst das Array bloss Global Dimen. Der Möglichkeiten gibts da viele. z.B. Function traverse(Prod, origstr, newstr) Dim MyDocument As Document Dim MySelection As Selection Set MyDocument = CATIA.ActiveDocument Set MySelection = MyDocument.Selection On Error GoTo Errorhandler Set refp = Prod.ReferenceProduct If InStr(refp.Name, origstr) Then newpname = Replace(refp.Name, origstr, newstr) refp.Name = newpname '<----------- hier entsteht immer die Fehlermeldung 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 Errorhandler: MySelection.Clear MySelection.Add Prod CATIA.StartCommand "Center graph" End End Function Sub CATMain() Set actProd = CATIA.ActiveDocument.Product origstr = InputBox("Eingeben welcher Name oder Nummer ersetzt werden soll!!! ", "Suche und Ersetze (Suche)") newstr = InputBox("Zu ersetzenden Namen oder Nummer eingeben", "Suche und Ersetze (Ersetze)") traverse actProd, origstr, newstr End Sub Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Struppi0909 Mitglied Konstrukteur
Beiträge: 18 Registriert: 27.05.2010 Win XP Pro SP3 P4; 2,40GHz; 4GB GeForce 9800GT;512MB CatiaV5R19SP3
|
erstellt am: 14. Jun. 2010 13:40 <-- editieren / zitieren --> Unities abgeben:
Hi roccat danke für deine Hilfe, aber ich kann das mit meinen Programmierkenntnissen leider nicht verwirklichen. Desweitern habe ich ein *.catscript und leider nicht ein *catvba. Das Makro bricht bei "On Error GoTo Errorhandler" ab!!! Kopiere ich dein Script in ein *.catvba, dann läuft es zwar aber es wird nichts umbenannt (Das wäre ein gutes Ergebnis) und mein oberstes Prudukt "leuchtet" auf, wenn man das so sagen kann, aber deswegen sehe ich immer noch nicht welches Part den Fehler verursacht. Sorry!!!
------------------ Gruß Struppi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
roccat Mitglied Konstrukteur
Beiträge: 172 Registriert: 19.02.2010 WinXP/Win7 Office XP/2007 Catia V5 R16-R19, VB6.0, VBA, BASCOM-AVR VB .Net 2010
|
erstellt am: 14. Jun. 2010 14:13 <-- editieren / zitieren --> Unities abgeben: Nur für Struppi0909
Sry Catscript, das hab ich nicht gesehen. bei der Error abfrage kannst du dann reinschreiben was du willst, das "exit function" kannst du auch weglassen dann überspringt er den Fehler und arbeitet alles weitere ab. Dann wäre es aber sinnvoll alle Fehlerhaften Dokumente zum Schluss aufzulisten. dann versuchs mal so: Function traverse(Prod, origstr, newstr) Set MyDocument = CATIA.ActiveDocument Set MySelection = MyDocument.Selection Err.Clear On Error Resume Next Set refp = Prod.ReferenceProduct If InStr(refp.Name, origstr) Then newpname = Replace(refp.Name, origstr, newstr) refp.Name = newpname '<----------- hier entsteht immer die Fehlermeldung End If If InStr(refp.PartNumber, origstr) Then newpnum = Replace(refp.PartNumber, origstr, newstr) refp.PartNumber = newpnum End If If Err.Number <> 0 Then MsgBox "Fehler bei : " & Prod.PartNumber & " [" & Prod.Name & "]", vbOKOnly, "Fehler" MySelection.Clear MySelection.Add Prod CATIA.StartCommand "Center graph" Exit Function 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 On Error GoTo 0 End Function Sub CATMain() Set actProd = CATIA.ActiveDocument.Product origstr = InputBox("Eingeben welcher Name oder Nummer ersetzt werden soll!!! ", "Suche und Ersetze (Suche)") newstr = InputBox("Zu ersetzenden Namen oder Nummer eingeben", "Suche und Ersetze (Ersetze)") traverse actProd, origstr, newstr End Sub Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Struppi0909 Mitglied Konstrukteur
Beiträge: 18 Registriert: 27.05.2010 Win XP Pro SP3 P4; 2,40GHz; 4GB GeForce 9800GT;512MB CatiaV5R19SP3
|
erstellt am: 14. Jun. 2010 16:03 <-- editieren / zitieren --> Unities abgeben:
Hallo roccat Das ist das was ich gesucht bzw. gebraucht habe. Jetzt sehe ich im Baum ein Part "leuchten" + Text und ich weiß das dort der Fehler versteckt ist. Dankeschön an alle die mir geholfen habe, besonders roccat.Danke. ------------------ Gruß Struppi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |