Autor
|
Thema: Problem Instancenamen zuweisen (1521 mal gelesen)
|
HeinHein Mitglied Dipl Ing Maschinenbau
Beiträge: 44 Registriert: 16.02.2012 cgr und models Namen ermitteln
|
erstellt am: 17. Jul. 2013 20:26 <-- editieren / zitieren --> Unities abgeben:
Hallo, BS: Windows XP CATIA V5 R16 ich bin am verzweifeln. Gegenwärtig schreibe ich in VBScript ein Snchronisationsscript. Dabei soll u.a. der Instancename eines Subassemblies an den Dateinamen angepasst werden. Das es in CATIA mit Instancenamen Probleme gibt (was manuelle Instancenamenänderungen sowie via CATScript funktioniert, jedoch nicht via VBScript) hat das Forenmitglied TomTom bereits geschildert. Aus diesem Grund rufe ich zur Änderung des Instancenamens aus meinem VBScript ein CATScript auf. Die Zuweisung eines neuen Instancenamens scheint CATIA zu ignorieren. Hier ein Codeschnipsel
Code: Dim k as Integer 'Index Instance Dim ok as Boolean Dim instanceSoll as String dim instanceVorher On Error Resume Next k=0 ok=False instanceVorher=objItem.Name Do k = k + 1 Err.Clear instanceSoll=sName & "." & k objItem.Name = instanceSoll if Err.Number = 0 then ok=true message="" message = message & "objProductParent : " & vbTab & vbTab & objProductParent.name & chr(13) message = message & "k : " & vbTab & vbTab & k & chr(13) message = message & "Soll : " & vbTab & vbTab & instanceSoll & chr(13) message = message & "vorher : " & vbTab & vbTab & instanceVorher & chr(13) message = message & "nachher : " & vbTab & objItem.Name & chr(13) msgbox message, vbinformation, "Ergebnis" end if'Err.Number = 0 Loop Until ok=true On Error Goto 0
Nach der Zeile objItem.Name = instanceSoll gibt CATIA jedoch den Wert von instanceVorher zurück. Das kann man auch im Strukturbaum nachvollziehen, d.h. Die Zeile objItem.Name = instanceSoll wurde ignoriert. Es wurde aber auch kein Fehler ausgegeben! Was mache ich falsch??????? Über einen Hinweis würde ich mich sehr freuen. Gruss HeinHein ------------------ HeinHein 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: 17. Jul. 2013 22:04 <-- editieren / zitieren --> Unities abgeben: Nur für HeinHein
Servus Wo hast du die Schleife über die einzelnen Instanzen (Products-Collection)? In deinem Code wird der Zähler k zwar hochgezählt, aber das "objItem" bleibt das gleiche. Was ist "objItem"? Tritt der Fehler nur bei bestimmten Parts/Products/Componenten auf? Wo hat TomTom schon mal das gleiche Problem beschrieben? Gruß Bernd PS: Bitte Systeminfo ausfüllen (im Profil) ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ptit.tom Mitglied CAD-Berater
Beiträge: 114 Registriert: 11.02.2005 win10, CATIA R19 bis R30
|
erstellt am: 18. Jul. 2013 08:38 <-- editieren / zitieren --> Unities abgeben: Nur für HeinHein
|
HeinHein Mitglied Dipl Ing Maschinenbau
Beiträge: 44 Registriert: 16.02.2012 cgr und models Namen ermitteln
|
erstellt am: 18. Jul. 2013 09:50 <-- editieren / zitieren --> Unities abgeben:
Hallo Bernd, hallo Florent ich werde mein Script auf das nötigste herunterbrechen und es heute abend ins Forum stellen. Vielleicht findet jemand die wunde Stelle. Gruss HeinHein ------------------ HeinHein Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HeinHein Mitglied Dipl Ing Maschinenbau
Beiträge: 44 Registriert: 16.02.2012 cgr und models Namen ermitteln
|
erstellt am: 18. Jul. 2013 17:12 <-- editieren / zitieren --> Unities abgeben:
Hallo hier die wesentlichsten Teile vom code Code:
'=== Class members ====== private Sub MainSub Dim f_i '1. Step acvtivate assy window Set m_objWindowsOpen = m_objCATIA.Windows for f_i = 1 to m_objWindowsOpen.count 'msgbox(m_objCATIA.windows.item(f_i).name),vbinformation, "CATIA Windows" If m_objCATIA.windows.item(f_i).name=m_NameMainAssemblyNameShort Then m_objCATIA.windows.item(f_i).Activate exit for End If' next '2. getActive Product Set m_objMainProduct=m_objCATIA.ActiveDocument.Product '2. Synchrone all models of assembly call synchronizeAffectedModels(m_objMainProduct,m_SettingSynchronizeInstanceName) End Sub'MainSub Function synchronizeAffectedModels(f_objcurrProduct, treadInstanceName) dim f_a 'loop Dim f_objProductsOfcurrent dim f_message dim f_index dim f_fileNameFull 'file name with full path Dim f_fileNameBrutto 'file name with wildcard Dim f_fileNameNetto 'file name without wildcard Dim f_treadInstanceName 'Festlegung, ob Instanz synchronisiert werden soll - Behandlung ja oder nein dim f_PartNumberBefore 'PartNumber vor Manipulation Dim f_match dim f_errorNumber dim f_errTest on error goto 0 f_treadInstanceName=treadInstanceName f_fileNameBrutto = "" f_fileNameNetto = "" f_PartNumberBefore = "" 'Aktion mit dem CurrentProduct 'msgbox "Type name : " & TypeName(f_objcurrProduct) If TypeName(f_objcurrProduct) = "Product" Then 'Unterscheidung, ob es der Produktknoten oder das File selbst ist if f_objcurrProduct.Products.count = 0 then '****************************************************** '*** *** '*** It is a part -> product.count=0 *** '*** *** '****************************************************** '1. Get file name with wildcard -> filenameBrutto f_fileNameBrutto="" f_fileNameFull=f_objcurrProduct.GetMasterShapeRepresentationPathName' f_index=instrRev(f_fileNameFull,"\") f_fileNameBrutto=Right(f_fileNameFull, len(f_fileNameFull)-f_index) Else '****************************************************** '*** *** '*** It is a product node -> product.count>0 *** '*** *** '****************************************************** f_fileNameFull=f_objcurrProduct.ReferenceProduct.Parent.FullName f_index=instrRev(f_fileNameFull,"\") f_fileNameBrutto=Right(f_fileNameFull, len(f_fileNameFull)-f_index) end if'f_objcurrProduct.Products.count = 0 '2. Get file name without wildcard -> filenameNetto If Right(f_fileNameBrutto, 6) = ".model" Then f_match = ".model" If Right(f_fileNameBrutto, 4) = ".cgr" Then f_match = ".cgr" If Right(f_fileNameBrutto, 8) = ".CATPart" Then f_match = ".CATPart" If Right(f_fileNameBrutto, 11) = ".CATProduct" Then f_match = ".CATProduct" If Right(f_fileNameBrutto, 11) = ".CATDrawing" Then f_match = ".CATDrawing" f_fileNameNetto = replace(f_fileNameBrutto,f_match,"") '4. Task 1. Part number synchrone by file name f_PartNumberBefore = f_objcurrProduct.PartNumber 'save old part number If Not f_fileNameNetto=f_PartNumberBefore Then 'Synchronisation is mandatory f_objcurrProduct.Product.PartNumber = f_fileNameNetto End If'If Not f_fileNameNetto=f_PartNumberBefore if not TypeName(f_objcurrProduct.Parent.Parent.Parent.Parent)="Application" then 'wenn es nicht das topassembly ist If f_treadInstanceName Then call FUNC_Rename_BugFix(f_objcurrProduct, f_fileNameNetto) End If'tread instance name end if'TypeName(f_objcurrProduct.Parent.Parent) End If'TypeName(f_objcurrProduct.Products.Item(f_a)) = "Product" '****************************************************** '*** *** '*** Rekursion - analyse list *** '*** *** '****************************************************** set f_objProductsOfcurrent=f_objcurrProduct.Products f_a=0 Do while f_a < f_objProductsOfcurrent.Count f_a = f_a+1 call synchronizeAffectedModels(f_objProductsOfcurrent.Item(f_a), f_treadInstanceName) Loop End function'synchronizeAffectedModels Function FUNC_Rename_BugFix(oItem, sName) 'oItem ist die Instanz (also das .Product) 'sName = nuer InstanceName ohne .Index const catScriptLibraryTypeDirectory=1 'aus CATIA Objektkatalog F2 Dim f_message Dim f_objDokFather Dim aObject1(2) on error goto 0 If TypeName(oItem.Parent.Parent.Parent.Parent) = "Application" Then Set f_objDokFather = m_objCATIA.Documents.Item(oItem.Parent.Parent.ReferenceProduct.Parent.Name) Else Set f_objDokFather = m_objCATIA.Documents.Item(oItem.Parent.Parent.Parent.Parent.ReferenceProduct.Parent.Name) End If Set aObject1(0) = oItem Set aObject1(1) = f_objDokFather aObject1(2) = sName On Error Resume Next Err.Clear m_objCATIA.SystemService.ExecuteScript m_ScriptPath, catScriptLibraryTypeDirectory, "InstRename_BugFix.CATScript", "CATMain", aObject1 If Err.Number <> 0 Then MsgBox "Problem beim Ausführen des InstRename_BugFix_mini.CATScript. " & vbLf & " Abbruch.", 16, "Unbekannter Fehler." End If On Error GoTo 0 End Function'xxxxxx
Lasst euch nicht verwirren, ein Grossteil dient dabei nur der Dateinamensextraktion Wichtig wird es ab der Function FUNC_Rename_BugFix diese ruft dann das CatScript auf. Hier das CATScript genannt InstRename_BugFix.CATScript Code: Sub CATMain(objItem, objFather, sName) Dim objProductParent 'das uebergeordnete Produkt Dim message ' dim NameItem dim NameProductParent If objItem.Name = objFather.Name Then NameProductParent = objItem.Parent.Parent.ReferenceProduct.Parent.Name NameItem = objItem.Name 'Instance Name else NameProductParent = objItem.Parent.Parent.Name 'Funktioniert, wenn es die InstanceNummer ist NameItem = objItem.Name 'Instance Name end if If objItem.Name = objFather.Name Then 'msgbox "CATScript Fall 1" Set objProductParent = Catia.Documents.Item(NameProductParent) 'filename of main assembly Set objItem = objProductParent.Product.Products.Item(NameItem) end if If objItem.Name <> objFather.Name Then 'msgbox "CATScript Fall 2" Set objProductParent = objFather.Product.Products.Item(NameProductParent)'error occurs 'part number of father Set objItem = objProductParent.Products.Item(NameItem) End if '--- der kleinst Möglich Index (z.B. .1) für die Instanz 'On Error Resume Next on error goto 0 Dim k as Integer Dim ok as Boolean Dim instanceSoll as String dim instanceVorher k=0 ok=False instanceVorher=objItem.Name Do k = k + 1 Err.Clear instanceSoll=sName & "." & k objItem.Name = instanceSoll 'if Err.Number = 0 then ok=true message="" message = message & "objProductParent : " & vbTab & vbTab & objProductParent.name & chr(13) message = message & "k : " & vbTab & vbTab & k & chr(13) message = message & "Soll : " & vbTab & vbTab & instanceSoll & chr(13) message = message & "vorher : " & vbTab & vbTab & instanceVorher & chr(13) message = message & "nachher : " & vbTab & objItem.Name & chr(13) msgbox message, vbinformation, "Erfolg???" 'end if'Err.Number = 0 Loop Until ok=true On Error Goto 0 End Sub'CATMain
Es geht halt darum, dass Catia die Instancenamenszuweisung ignoriert. Für den entscheidenen Hinweis wäre ich wirklich dankbar. Gruss HeinHein ------------------ HeinHein Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|