| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für CATIA & Co. |
| |
 | KISTERS 3DViewStation: Schnelligkeit und Präzision in dem neuen JT-Importer, eine Pressemitteilung
|
Autor
|
Thema: Hybridbodies im SpecTree von unten nach oben durchlaufen (1497 mal gelesen)
|
Bolle Mitglied

 Beiträge: 48 Registriert: 12.03.2003
|
erstellt am: 25. Jul. 2003 18:12 <-- editieren / zitieren --> Unities abgeben:         
Hallo, ich möchte von einen selektierten Punkt aus den zugehörigen Hybridbody auslesen und falls dieser Hybridbody in einem anderen steckt, dann auch diesen usw. Ich habe mir folgendes Script überlegt: Dim oParentObject As AnyObject Dim oSelected As SelectedElement oSelected = ... selektierter Punkt ('ist gegeben) Set oParentObject = oSelected.parent do until typename(oParentObject) = "Part" msgbox "Typ: " & typename(oParentObject) & " Name: " & oParentObject.name Set ParentObject = oParentObject.parent loop Wenn ich jetzt z.B. 3 Hybridbodys habe OpenBody1 | OpenBody2 | OpenBody3 | Punkt1 und starte vom Punkt1 aus, dann wird der OpenBody3 gefunden, aber als nächstes wird OpenBody1 ausgegeben. Der Openbody2 wird immer übersprungen, dabei ist er doch parent von Openbody3 oder sehe ich das falsch ? Kann mir jemand dsagen, wie ich sämtliche Hybridbodys der Hierarchie auslesen kann? Gruß Bolle
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
louis Mitglied Geschäftsführer

 Beiträge: 93 Registriert: 07.05.2001 V5 R19/R2014, WIN7, Visual Basic6.0 SP6
|
erstellt am: 25. Jul. 2003 19:28 <-- editieren / zitieren --> Unities abgeben:          Nur für Bolle
Hallo, es wundert mich, dass Du als Parent von Body 3 den Body1 angezeigt bekommst. Normalerweise liegen ALLE HybridBodies unter Part2.HybridBodies. Die Struktur wie Du sie im Baum siehst ist NICHT gleich der Speicherstruktur. Am besten sieht man das mit Bodies. Wenn diese mit Hinzufuegenen addiert werden, sind trotzdem alle unter Part2.Bodies zu finden. Wo die Baumstruktur gespeichert wird weiss ich auch noch nicht - lerne aber gerne dazu. Viele Gruesse Louis Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
u01dz Mitglied

 Beiträge: 76 Registriert: 12.07.2003 V5R15GA
|
erstellt am: 26. Jul. 2003 07:35 <-- editieren / zitieren --> Unities abgeben:          Nur für Bolle
Hi zusammen, wenn es sich nicht gerade um einen Bug in einem Servicepack handelt, gibt die Methode "HybridBodies" der Klassen "Part" und "HybridBody" jeweils eine Liste aller geöffneten Körper auf der ersten Hierarchieebene des Objektes aus. Geschachtelte geöffnete Körper werden nicht berücksichtigt (Buch "Effiziente Konstruktion mit Makros", S. 202 und 377). Beispiel: Sub CATMain() ' Struktur im CATPart: ' Hauptkörper ' Geöffneter Körper 1 ' - Geöfneter Körper 2 ' - Geöffneter Körper 3 Dim HBodiesErsterRang, HBodiesZweiterRang As HybridBodies Set HBodiesErsterRang = CATIA.ActiveDocument.Part.HybridBodies MsgBox (HBodiesErsterRang.Count) ' Ergebnis ist 1 Set HBodiesZweiterRang = HBodiesErsterRang.Item(1).HybridBodies MsgBox (HBodiesZweiterRang.Count) ' Ergebnis ist 2 End Sub
------------------ Tschüß, Dieter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
u01dz Mitglied

 Beiträge: 76 Registriert: 12.07.2003 V5R15GA
|
erstellt am: 26. Jul. 2003 08:02 <-- editieren / zitieren --> Unities abgeben:          Nur für Bolle
... und nun die Antwort: Wie kann ich den geöffneten Körper eines Punktes bestimmen? Ein Punkt gehört der Klasse "HybridShape" an. Ein "HybridShape" ist wiederum von der Klasse "AnyObject" abgeleitet, welche über die Eigenschaft "Parent" verfügt, um das übergeordnete Objekt des Punktes zu ermitteln ("Effiziente Konstruktion mit Makros, S. 383 und 146). Allerdings erhält man damit das Listenobjekt "HybridShapes", dem der Punkt angehört. "HybridShapes" ist wiederum eine Eigenschaft eines geöffneten Körpers ("Effiziente Konstruktion mit Makros", S. 202). Aus diesem Grund muss die Eigenschaft Parent zweimal angewendet werden, um den geöffneten Körper zu erhalten. Beispiel: Sub CATMain() ' Baumstruktur: ' Hauptkörper ' Geöffneter Körper 1 ' - Geöffneter Körper 2 ' - Punkt ' Referenz des Puntkes holen ---------------------------------------- Dim Punkt as HybridShape Set Punkt = CATIA.ActiveDocument.Part.HybridBodies.Item(1).HybridBodies.Item(1).HybridShapes.Item(1) ' Das Objekt des Punktes kann natürlich auch über Search, Selection, etc. ermittelt werden. ' Ich habe das Beispiel so gewählt, damit man es selbst nachbauen und ausprobieren kann. ' Geöffneten Körper bestimmen ---------------------------------------- Dim HBody As CATBaseDispatch Set HBody = Punkt.Parent.Parent MsgBox(HBody.Name) End Sub ------------------ Tschüß, Dieter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
u01dz Mitglied

 Beiträge: 76 Registriert: 12.07.2003 V5R15GA
|
erstellt am: 26. Jul. 2003 08:05 <-- editieren / zitieren --> Unities abgeben:          Nur für Bolle
|
Bolle Mitglied

 Beiträge: 48 Registriert: 12.03.2003
|
erstellt am: 28. Jul. 2003 16:11 <-- editieren / zitieren --> Unities abgeben:         
Danke erstmal für die Beiträge. aber das Problem besteht immer noch ... Dim HBody As CATBaseDispatch Set HBody = Punkt.Parent.Parent MsgBox(HBody.Name) ... gibt 'Geöffneter Körper 2' zurück. Soweit so gut. Nur wenn ich Set HBody = Punkt.Parent.Parent.Parent schreibe, dann erhalte ich nicht 'Geöffneter Körper 1' sondern eine HybridBodies Collection. Und da liegt halt das Problem. Ich kann mich mit .parents nicht den Baum hinaufhangeln. Gruß Bolle Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Steffen Hohmann Mitglied
 
 Beiträge: 446 Registriert: 06.03.2002
|
erstellt am: 29. Jul. 2003 08:19 <-- editieren / zitieren --> Unities abgeben:          Nur für Bolle
Hallo Bolle, Du bist auf dem richtigen Weg. Punkt --> HybridShape Punkt.Parent --> HybridShapes (Collection) Punkt.Parent.Parent --> HybridBody Punkt.Parent.Parent.Parent --> HybridBodies (Collection) Punkt.Parent.Parent.Parent.Parent --> HybridBody Punkt.Parent.Parent.Parent.Parent.Parent --> HybridBodies (Collection) Punkt.Parent.Parent.Parent.Parent.Parent.Parent --> Hybridbody Punkt.Parent.Parent.Parent.Parent.Parent.Parent.Parent --> HybridBodies (Collection) ... ... Punkt.Parent.Parent. ...... .Parent --> Part Wie Du siehst, mußt Du 2-mal die Parent-Methode anwenden, um zum übergeordneten Hybridbody zu gelangen. Ob es ein HybridBody ist kan man mit TypeOf überprüfen.
If TypeOf Punkt.Parent.Parent.usw. Is HybridBody Then Gruss Steffen
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bolle Mitglied

 Beiträge: 48 Registriert: 12.03.2003
|
erstellt am: 31. Jul. 2003 12:05 <-- editieren / zitieren --> Unities abgeben:         
Hallo Steffen, wenn ich das so mache, wie du es beschrieben hast, dann bekomme ich noch den ersten (von unten) Openbody. Dannach liefert mir aber parent.parent nicht den Openbody der Ebene darüber, sondern den Openbody zwei ebenen weiter. Das ist ja das merkwürdige, das ich nicht verstehe. Gruß Bolle Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bobby_Joe2001 Mitglied Konstrukteur

 Beiträge: 81 Registriert: 15.01.2006
|
erstellt am: 28. Apr. 2006 15:01 <-- editieren / zitieren --> Unities abgeben:          Nur für Bolle
Hallo, hab jetzt nach knapp 3 Jahren das Problem auch  Hat da mittlerweile einer eine Lösung? Ich habe eine Skizze (siehe Anhang) in geschachtelten Geometrischen Sets und will alle Instanzen mit der Parent Eigenschaft durchlaufen. Nur Catia überspringt immer ein Geometrisches Set. Sub CATMain()
Set MyParent = CATIA.ActiveDocument.Selection.Item(1).Value Do Set MyParent = MyParent.Parent Debug.Print MyParent.Name Loop Until MyParent.Name = "CNEXT" End Sub
Ich bekommen folgende Liste: Sketches INSTANZ_10 HybridBodies INSTANZ_8 HybridBodies INSTANZ_6 HybridBodies INSTANZ_4 HybridBodies INSTANZ_2 HybridBodies TESTMODELL_STRUKTUR_UEBERGEBEN TESTMODELL_STRUKTUR_UEBERGEBEN.CATPart CNEXT Wie kann ich jetzt aber z.B. auf das Geometrische Set "INSTANZ_9" zugreifen? ------------------ Du musst die Leute einmal richtig ärgern, dann wirst du endlich ernst genommen. Konrad Adenauer Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAMiCADse Mitglied
 
 Beiträge: 177 Registriert: 17.02.2006 V5,R19,SP9
|
erstellt am: 28. Apr. 2006 16:58 <-- editieren / zitieren --> Unities abgeben:          Nur für Bolle
Erstmal Hallo an alle! Nachdem ich mich schon eine ganze Weile 'readonly' durchs Forum bewege, nun endlich mein erster Beitrag... @Bobby_Joe2001 Das Problem hat mich auch schon Nerven gekostet. Wenn Du den HybridBody auch als HybridBody deklarierst, dann funktionierts. In deinem Bsp. also folgende Zeile einfügen: Code: Dim MyParent As HybridBody
Warum das so ist habe ich bis jetzt auch noch nicht verstanden, aber zumindest läuft es so. Gruß CAMiCADse Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bobby_Joe2001 Mitglied Konstrukteur

 Beiträge: 81 Registriert: 15.01.2006
|
erstellt am: 29. Apr. 2006 10:11 <-- editieren / zitieren --> Unities abgeben:          Nur für Bolle
Zitat: Original erstellt von CAMiCADse: Erstmal Hallo an alle! Nachdem ich mich schon eine ganze Weile 'readonly' durchs Forum bewege, nun endlich mein erster Beitrag...@Bobby_Joe2001 Das Problem hat mich auch schon Nerven gekostet. Wenn Du den HybridBody auch als HybridBody deklarierst, dann funktionierts. In deinem Bsp. also folgende Zeile einfügen: Code: Dim MyParent As HybridBody
Warum das so ist habe ich bis jetzt auch noch nicht verstanden, aber zumindest läuft es so. Gruß CAMiCADse
Willkommen im Board! Das is schonmal nen guter Tip, Catia tickt echt manchmal extrem komisch. Nur wie mach ichs in VB-Script? Ich will das auch in Makros einbauen, die unter Unix laufen sollen. Da kann ich VBA nicht nehmen. Und in VB-Script gehen die "Dim" Anweisungen nicht und in CATScript haben sie denk ich keine Auswirkung. ------------------ Du musst die Leute einmal richtig ärgern, dann wirst du endlich ernst genommen. Konrad Adenauer Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |