Autor
|
Thema: mehrfach vorhandene Parts werden alle verändert (1736 mal gelesen)
|
triumvirn Mitglied
Beiträge: 15 Registriert: 09.01.2008
|
erstellt am: 31. Mai. 2008 20:12 <-- editieren / zitieren --> Unities abgeben:
Hallo! ich habe eine Struktur wie unten. wenn ich mehrere identische Parts in in Product lade, und ein Exemplar von dem mehrfach vorkommenden Part in einem Unterproduct liegt, und ich mit beispielsweise mit "child.Definition = "sgfgdg" ein spezielles dieser Parts ändere, werden augenblicklich alle Parts geändert. Ich kann keine getrennten(unterschiedlichen) Informationen reinscheiben. Außer bei "child.name" da ändert es nur bei einem Exemplar den Namen, und wen ich das andere Exemplar anspreche, dann ändert es den Namen einfach nicht. hat jemand eine Erklärung oder gar eine Lösung wie ich identische Parts einzeln "ansprechen" kann? Gruß Christoph Public Sub ID_set(ByRef prod) Dim children Set children = prod.products For i = 1 To children.Count Set child = children.Item(i) child.Definition = "sgfgdg" & count child.name = "test_" & count child.Revision = "test_rev_" & count child.PartNumber = "test2_" & count count=count+1 ID_set(child) Next End Function
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
M.Seidler Mitglied Dipl. Ing.
Beiträge: 600 Registriert: 08.01.2007 ABAQUS CAE 6.7-1 Ansys 12.1 Hyper Works 12
|
erstellt am: 01. Jun. 2008 08:44 <-- editieren / zitieren --> Unities abgeben: Nur für triumvirn
Hallo Christoph, ich bin zwar kein Programmierer, aber für mich klingt das nach einem Denkfehler . Es ist logisch, wenn Du einen Vertreter ein und des selben Parts änderst, dass auch alle anderen geändert werden. Stell Dir vor, Du hast eine Datei (sagen wir Hallo.txt). Zu dieser Datei gibt es verschiedene Verküpfungen (Eigene Dateien, Desktop, Temp). Egal welche der Verknüpfungen Du benutz, die Änderung ist wie nicht anders zu erwarten von allen Links aus einsehbar. Ich hoffe, dass ich Dein Problem richtig verstanden habe und Dir helfen konnte.
------------------ *********************** Gruß Der Markus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
triumvirn Mitglied
Beiträge: 15 Registriert: 09.01.2008
|
erstellt am: 01. Jun. 2008 19:00 <-- editieren / zitieren --> Unities abgeben:
Hallo Markus! Ganz so ist es leider nicht. Man kann ja eine Schraube mehrmals in ein Assembly Design einfügen, das heißt ja nicht, dass alle Schrauben die gleiche physische Representanz haben. Wenn ich beispielsweise manuell in CATIA dem einen gleichen Part den Namen "xyz" und dem zweiten gleichen Part den Namen "abc" zuweise, gibt er mir (z.B. mit msgbox) auch sauber getrennt "xyz" bzw. "abc" aus, also unterscheiden kann er sie prinzipiell schon. Bloß wenn ich diese Eigenschaften in einem Skript (Defintion, Revision, usw.) ändern will, macht er es entweder nur bei einem oder er macht es für alle. Es kann doch nicht sein, dass ich bei mehreren Schrauben/Gleichteile keine unterschiedlichen Informationen ablegen kann?! Gruß Christoph Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
M.Seidler Mitglied Dipl. Ing.
Beiträge: 600 Registriert: 08.01.2007 ABAQUS CAE 6.7-1 Ansys 12.1 Hyper Works 12
|
erstellt am: 01. Jun. 2008 19:38 <-- editieren / zitieren --> Unities abgeben: Nur für triumvirn
Hallo Christoph, wenn wir von ein und dem Selben Part sprechen, kannst Du natürlich keine unterschiedlichen Informationen einbringen. Die beiden Instances des Parts hingegen können Unterschiede aufweisen. Oder habe ich Dich immer noch nicht verstanden? ------------------ *********************** Gruß Der Markus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
Beiträge: 4755 Registriert: 27.09.2000 Dell precision M4300, 4GB Arbeitsspeicher NVidia FX360M Windows XP professional SP3 CATIA V5 R16SP9, R17SP8, R18SP8, R19SP4 Adobe Acrobat 8 Linux: Ubuntu 8.04LTS
|
erstellt am: 01. Jun. 2008 19:53 <-- editieren / zitieren --> Unities abgeben: Nur für triumvirn
Hallo zusammen, @M.Seidler: Du hast recht. Die Eigenschaft Name speichert den Namen der Instanz. Der kann und muss unterschiedlich sein. Alle anderen Informationen müssen gleich bleiben. Eine Schraube DIN EN ISO 4014 - M6x20 bleibt eine Schraube DIN EN ISO 4014 - M6x20, auch wenn die Instanz anders heißt. @triumvirn: Schau dir mal das Beispiel aus der Doku an. Viele Grüße, CEROG <Installationspfad der Doku>\German\online\German\CAAScdBase\CAAScdAutomationHome.htm ------------------ Meine Firma Wie stelle ich meine Fragen richtig? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
triumvirn Mitglied
Beiträge: 15 Registriert: 09.01.2008
|
erstellt am: 02. Jun. 2008 00:05 <-- editieren / zitieren --> Unities abgeben:
Danke! Ich schau mir sofort mal das Beispiel an. Zitat: Die Eigenschaft Name speichert den Namen der Instanz. Der kann und muss unterschiedlich sein.
Und genau das hab ich mir auch gedacht: Abfragen kann ich die Namen auch, sie sind logischerweise auch unterschiedlich, aber ändern kann ich nur eines davon. Beim anderen kann ich zwar child.name="veraendertxyz" aber es tut sich einfach nichts! Und das treibt mich halt in den Wahnsinn, weil ich nicht weiß warum. Aber schau mer mal, vielleicht bin ich ja nach der Lektüre schlauer! Gruß Christoph Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
triumvirn Mitglied
Beiträge: 15 Registriert: 09.01.2008
|
erstellt am: 02. Jun. 2008 00:44 <-- editieren / zitieren --> Unities abgeben:
|
Ex-Mitglied
Beiträge: 4755 Registriert: 27.09.2000 Dell precision M4300, 4GB Arbeitsspeicher NVidia FX360M Windows XP professional SP3 CATIA V5 R16SP9, R17SP8, R18SP8, R19SP4 Adobe Acrobat 8 Linux: Ubuntu 8.04LTS
|
erstellt am: 02. Jun. 2008 05:30 <-- editieren / zitieren --> Unities abgeben: Nur für triumvirn
|
triumvirn Mitglied
Beiträge: 15 Registriert: 09.01.2008
|
erstellt am: 02. Jun. 2008 08:26 <-- editieren / zitieren --> Unities abgeben:
Danke für das Beispiel. Soweit ich das einschätzen kann, mache ich doch eigentlich das gleiche oder was könnte ich anders machen? So wie ich es denke mache ich mit "Set child = children.Item(i)" doch das gleiche wie im Beispiel mit "Set oChildProduct1 = oRootChildren.AddNewProduct("Child_1_Type")" bloß will ich ja kein neues Product erzeugen, sondern will ein schon vorhandenes bearbeiten("child.name = "test_" & count" <--> "oChildProduct1.Name = "1st_Child"") Und genau das funktioniert bei mir ja dann nicht: "child.name = "test_" & count" führt beim zweiten baugleichen Teil zu keiner Änderung des Namens im Assembly obwohl es manuell ja funktioniert. Gruß Christoph übergeben wird "prod": Set doc = CATIA.ActiveDocument Set prod = doc.Product rekursiver Aufruf: Public Sub ID_set(ByRef prod as Product) Dim children as Product Set children = prod.products For i = 1 To children.Count Set child = children.Item(i) child.Definition = "sgfgdg" & count child.name = "test_" & count child.Revision = "test_rev_" & count child.PartNumber = "test2_" & count count=count+1 ID_set(child) Next End Function [Diese Nachricht wurde von triumvirn am 02. Jun. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
M.Seidler Mitglied Dipl. Ing.
Beiträge: 600 Registriert: 08.01.2007 ABAQUS CAE 6.7-1 Ansys 12.1 Hyper Works 12
|
erstellt am: 02. Jun. 2008 08:36 <-- editieren / zitieren --> Unities abgeben: Nur für triumvirn
Hallo triumvirn, wie gesagt, ich bin kein Progammierer. Aber müsste die Zeile "child.name = "test_" & count" nicht "set child.name = "test_" & count" lauten? ------------------ *********************** Gruß Der Markus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
BigCheese Mitglied Dipl-Ing
Beiträge: 130 Registriert: 12.05.2004 CATIA V5R19 SP3
|
erstellt am: 02. Jun. 2008 11:33 <-- editieren / zitieren --> Unities abgeben: Nur für triumvirn
Hallo triumvirn, ich habe eben Deine Codezeilen bei mir getestet. Sie funktionieren bei mir ohne Probleme... Allerdings macht ja eigentlich nur
Code: child.name = "test_" & count
darin einen Sinn. Den Rest kannst Du ja außerhalb definieren, da er ja für alle Instanzen gleich ist. Hast Du im Baum eigentlich auch die Instanznamen eingeblendet oder nur die PartNumber?Gruß, Alex
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
triumvirn Mitglied
Beiträge: 15 Registriert: 09.01.2008
|
erstellt am: 02. Jun. 2008 20:06 <-- editieren / zitieren --> Unities abgeben:
Hallo! @BigCheese: du hast Recht. nur child.Name macht Sinn, geht bei mir aber trotzdem nicht. Ich hab das Problem jetzt glaube ich genauer erkannt. Das child.Name Kommando funktioniert unabhängig von Part/Product nur in der ersten Ebene. Unterproducts können zwar über child.Name den Namen ausgeben aber nicht überschrieben werden. Selbst mit diesem popeligen Aufbau hier benennt CATIA nur die Teile auf der obersten Ebene um. Und ich weiß nicht warum. Screenshot nach ausführung des Test-Scriptes Code: Dim counter As IntegerDim counter As Integer Public Sub Catmain() Dim doc Dim prod As Product counter = 0 Set doc = CATIA.ActiveDocument Set prod = doc.Product search_and_select prod End Sub Sub search_and_select(ByRef prod As Product) 'Dim children As Products Set children = prod.Products Dim i Dim child As Product bo1 = False For i = 1 To children.Count children.Item(i).Name = counter children.Item(i).PartNumber = counter counter = counter + 1 search_and_select children.Item(i) Next End Sub
[Diese Nachricht wurde von triumvirn am 02. Jun. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
Beiträge: 4755 Registriert: 27.09.2000 Dell precision M4300, 4GB Arbeitsspeicher NVidia FX360M Windows XP professional SP3 CATIA V5 R16SP9, R17SP8, R18SP8, R19SP4 Adobe Acrobat 8 Linux: Ubuntu 8.04LTS
|
erstellt am: 02. Jun. 2008 20:13 <-- editieren / zitieren --> Unities abgeben: Nur für triumvirn
Hallo triumvirn. in dem Buch von Ziethen zur Makroprogrammierung unter CATIA V5 gibt es ein Beispiel, in dem alle Kindelemente eines Produktes ausgeben werden. Da solltest du mal reinschauen. Der Grund dafür, daß die unteren Ebenen nicht umbenannt werden ist einfach: Sie gehören nicht zu der Sammlung der Elemente, die du mit cildren.item aufrufst. Für die unteren Ebenen mußt du die Routine rekursiv aufrufen. Programmier dir doch einfach mal nen Makro, das in einer Schleife alles Namen von children.Item ausgibt. Viele Grüße, CEROG ------------------ Meine Firma Wie stelle ich meine Fragen richtig? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
triumvirn Mitglied
Beiträge: 15 Registriert: 09.01.2008
|
erstellt am: 02. Jun. 2008 20:30 <-- editieren / zitieren --> Unities abgeben:
Hallo CEROG! das verstehe ich nicht ganz. Mit "search_and_select children.Item(i)" (3. letzte Zeile bei meinem Beispielcode) rufe ich doch die Funktion rekursiv auf?! Ausgeben kann ichs ja: wenn ichs aber ändern will gehts nicht. Code: msgbox child.name 'AUSGABE: "alt" geht ja wunderbar child.name="neu" 'Überschreib(versuch) msgbox child.name 'AUSGABE wieder: "alt" hätte sich verändern sollen, tut es aber nicht
Sorry dass ich mich immer so Unprogrammiererhaft ausdrücke, mir fehlen einfach die Fachbegriffe. Deswegn versteht man mich manchmal schlecht. Gruß Christoph [Diese Nachricht wurde von triumvirn am 02. Jun. 2008 editiert.] [Diese Nachricht wurde von triumvirn am 02. Jun. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
Beiträge: 4755 Registriert: 27.09.2000 Dell precision M4300, 4GB Arbeitsspeicher NVidia FX360M Windows XP professional SP3 CATIA V5 R16SP9, R17SP8, R18SP8, R19SP4 Adobe Acrobat 8 Linux: Ubuntu 8.04LTS
|
erstellt am: 02. Jun. 2008 20:43 <-- editieren / zitieren --> Unities abgeben: Nur für triumvirn
|
triumvirn Mitglied
Beiträge: 15 Registriert: 09.01.2008
|
erstellt am: 02. Jun. 2008 20:46 <-- editieren / zitieren --> Unities abgeben:
|
Lusilnie Mitglied
Beiträge: 1486 Registriert: 13.07.2005
|
erstellt am: 02. Jun. 2008 22:53 <-- editieren / zitieren --> Unities abgeben: Nur für triumvirn
Hallo triumvirn, meiner Erfahrung nach muss Deine Zeile so lautet, um die rekursive Schleife auszuführen: Code: search_and_select children.Item(i).ReferenceProduct
Zwecks Erklärung schau mal da nach: http://ww3.cad.de/foren/ubb/Forum137/HTML/002726.shtml Eine andere Möglichkeit ist die Änderung folgender Zeile:Code: Set children = CATIA.ActiveDocument.GetItem(prod.PartNumber).Products
mfg, Lusilnie
------------------
Alle Aussagen zu DassaultSystemes-Produkten sind sehr optimistisch, selbst diese!!! frei nach größeren Geistern Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
BigCheese Mitglied Dipl-Ing
Beiträge: 130 Registriert: 12.05.2004 CATIA V5R19 SP3
|
erstellt am: 03. Jun. 2008 13:43 <-- editieren / zitieren --> Unities abgeben: Nur für triumvirn
Hallo nochmal, ich denke, ich habe Dein Problem nun langsam verstanden Dein Code verändert auch in den Unterprodukten die Instanznamen (children.item(i).Name), allerdings nicht die PartNumber. Dies liegt meines Erachtens nach einfach nur an Deinem counter. Sobald search_and_select rekursiv aufgerufen wird, springt der counter erstmal wieder zurück auf '0'. Somit würde die nächste PartNumber den Wert einer bereits vorhandenen annehmen, was aber nich geht, da eben 2 verschiedene Parts/Products nicht die gleiche PartNumber haben können. Du könntest z.B. den counter einfach mit übergeben, dann tut die ganze Sache. Ich hoffe, das war einigermaßen verständlich... Grüße, Alex
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
triumvirn Mitglied
Beiträge: 15 Registriert: 09.01.2008
|
erstellt am: 03. Jun. 2008 23:32 <-- editieren / zitieren --> Unities abgeben:
Hallo fleißige Helfer! You made my day!!! @BigCheese: das hatte ich auch schon mal falsch. aber ich hatte den "counter" als globale Variable. Der "Counter" wird schon ordentlich hochgezählt, das hab ich auch nachgeprüft. Aber sicherlich ein guter Hinweis! Vielen Dank für deine Bemühungen! @Lusilnie: danke vielmals! "search_and_select children.Item(i).ReferenceProduct" hat mir genau weitergeholfen! Jetzt kann ich wirklich alle Namen umbenennen! Irgendwann werd ich hoffentlich auch mal verstehen warum, aber für den Moment bin ich einfach mal damit zufrieden! Tausend Dank! So zwecks Doku für die Nachwelt stell ich mal den berichtigten Code nochmal hier rein: Code: Dim counter As IntegerPublic Sub CATMain() Dim doc Dim prod As Product counter = 0 Set doc = CATIA.ActiveDocument Set prod = doc.Product search_and_select prod End Sub Sub search_and_select(ByRef prod As Product) Dim children As Products Set children = prod.Products Dim i Dim child As Product Dim Name1 As String bo1 = False For i = 1 To children.Count Set child = children.Item(i) Name1 = counter & "_irgenetwas" ' Exemplarnamen müssen eindeutig sein, deswegen der counter child.Name = Name1 counter = counter + 1 search_and_select children.Item(i).ReferenceProduct Next End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |