Autor
|
Thema: Strukturbaum traversieren und mit Simplify rausschreiben (3043 mal gelesen)
|
SaftLaden Mitglied
Beiträge: 32 Registriert: 16.04.2009
|
erstellt am: 16. Apr. 2009 09:33 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich möchte den Strukturbaum traversieren und die einzelnen Baugruppen mit der Simplification-Funktion mit voreingestellter Auflösung rausschreiben. Die Dateinamen sollen gleich den Parnumbern sein. Alles voll automatisch. Ich habe nun auch schon ein paar interessante Themen in diesem Forum gefunden. Allerdings laufen bei mir weder die Skripte die dort angegeben sind noch die aus der Automation-hilfe. Die Skripte bringen immer bei der Definition von Variablen einen Fehler: z.B. Dim oDoc As Document Woran liegt das? Muss ich irgendwas spezielles installieren? Achja, arbeite hier auf ner 64bit-Maschine. R17 SP3 Vielen Dank im Voraus! Holger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RSchulz Moderator² Head of CAD, Content & Collaboration / IT-Manager
Beiträge: 5541 Registriert: 12.04.2007 @Work Lenovo P510 Xeon E5-1630v4 64GB DDR4 Quadro P2000 256GB PCIe SSD 512GB SSD SmarTeam V5-6 R2016 Sp04 CATIA V5-6 R2016 Sp05 E3.Series V2019 Altium Designer/Concord 19 Win 10 Pro x64
|
erstellt am: 16. Apr. 2009 09:59 <-- editieren / zitieren --> Unities abgeben: Nur für SaftLaden
Hallo Holger, du musst evtl. die vba6.msi ausführen/installieren. Diese ist auf einer der Installations-CD´s zu finden. ------------------ MFG Rick Schulz Nettiquette (CAD.de) Konfuzius sprach: "Wer sich das Alte noch einmal vor Augen führt, um das Neue zu verstehen, der kann anderen ein Lehrer sein." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SaftLaden Mitglied
Beiträge: 32 Registriert: 16.04.2009
|
erstellt am: 16. Apr. 2009 10:02 <-- editieren / zitieren --> Unities abgeben:
|
RSchulz Moderator² Head of CAD, Content & Collaboration / IT-Manager
Beiträge: 5541 Registriert: 12.04.2007 @Work Lenovo P510 Xeon E5-1630v4 64GB DDR4 Quadro P2000 256GB PCIe SSD 512GB SSD SmarTeam V5-6 R2016 Sp04 CATIA V5-6 R2016 Sp05 E3.Series V2019 Altium Designer/Concord 19 Win 10 Pro x64
|
erstellt am: 16. Apr. 2009 10:19 <-- editieren / zitieren --> Unities abgeben: Nur für SaftLaden
Es gibt im Softwaremanager dafür keinen Eintrag, falls du das meinst. Man könnte allerhöchstens schauen, ob die DLL´s da sind die installiert wurden, aber dazu kann ich dir nicht viel sagen, da ich nicht weis welche DLL´s installiert bzw. aktuallisiert werden. Ich habe gerade mal geschaut ... schau mal, ob du die vbskco32.dll in deinem SYSWOW64-Ordner hast, dass müsste eine von den installierten sein. (Sicher bin ich mir jedoch nicht) ------------------ MFG Rick Schulz Nettiquette (CAD.de) Konfuzius sprach: "Wer sich das Alte noch einmal vor Augen führt, um das Neue zu verstehen, der kann anderen ein Lehrer sein." [Diese Nachricht wurde von RSchulz am 16. Apr. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SaftLaden Mitglied
Beiträge: 32 Registriert: 16.04.2009
|
erstellt am: 16. Apr. 2009 10:31 <-- editieren / zitieren --> Unities abgeben:
|
SaftLaden Mitglied
Beiträge: 32 Registriert: 16.04.2009
|
erstellt am: 16. Apr. 2009 13:31 <-- editieren / zitieren --> Unities abgeben:
An einem anderen 32bit Rechner laufen nun die Skripts teilweise. Allerdings komme ich doch nicht so wirklich weiter. Hat hier schonmal jemand ein Skript erstellt um den Baum zu traversieren und dann die einzelnen Baugruppen mit Simplfy als cgr rauszuschreiben? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SaftLaden Mitglied
Beiträge: 32 Registriert: 16.04.2009
|
erstellt am: 17. Apr. 2009 10:28 <-- editieren / zitieren --> Unities abgeben:
Wollte nur mal Zwischenstand melden. Traversieren kann ich jetzt schon. Als nächstes werde ich die einzelnen Stufen mit Simplify rauschreiben. Probleme bekomme ich dann evtl. noch mit den Transformationen und den Bennenungen... Melde mich dann evtl. noch mal mit Dicken Fragen Ansonsten schönes Wochenende!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SaftLaden Mitglied
Beiträge: 32 Registriert: 16.04.2009
|
erstellt am: 17. Apr. 2009 12:32 <-- editieren / zitieren --> Unities abgeben:
Hallo Leute, es geht voran... Also, schaffe es jetzt zu traversieren. Kann mir jemand weiterhelfen mit folgendem Problem: Ich möchte den Strukturbaum beim Speichern als Ordnerstruktur in Windows nachbilden: Dabei soll der Ordner den namen der entsprechenden Baugruppe erhalten (also neuen Ordner anlegen) In einem Ordner befinden sich dann die entsprechenden cgrs der darunterliegenden Baugruppen Jede Baugruppe die weitere unterknoten enthält, bekommt einen weiteren Unterordner u.s.w. Achja, das zweite Problem: wie bekomme ich die globalen Koordinaten des zu speichernden Teils heraus? Danke im Voraus! [Diese Nachricht wurde von SaftLaden am 23. Apr. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tberger Mitglied Application Manager CATIA V5 / V6
Beiträge: 1385 Registriert: 13.01.2007 WIN 7 64bit V5R21SP3HF49 3DX/V6 R2016x
|
erstellt am: 17. Apr. 2009 12:55 <-- editieren / zitieren --> Unities abgeben: Nur für SaftLaden
Hallo Holger, ich habe dein Skript nicht getestet, aber zu deiner Aussage "die cgr's auf den unteren Ebenen haben nicht mehr die richtigen Koordinaren" faellt mir nur ein, dass diese soweit fuer die Unterbaugruppen-Sicht natuerlich stimmen. Deine Unterbaugruppen werden im Vergleich zur Hauptbaugruppe verschoben sein, deshalb die Translation der "unteren" cgr's. Wenn du anstelle eines Unterproducts mit Replace eine deiner neu erszeugten Unterbaugruppen-cgr's einsetzt, stimmt die Position dann auch wieder. Das Rueckzurechnen ist denke ich im Bezug auf Sichern in ein cgr nicht so einfach bis unmoeglich. Vielleicht ein Workaround hierzu: fuer jede Baugruppe des jeweiligen "unteren Levels" muesste in der Hauptbaugruppe eine weitere neue Unterbaugruppe eingefuegt werden und die Teile mit Copy und Paste dort eingefuegt werden. Wenn danach dein cgr-Makro diese scannt, wird die "richtige Position" im Vergleich zur Hauptbaugruppe fuer die einzelne Unterbaugruppe wiedergegeben. Also koennte das Struktogramm ungefaehr so aussehen: SCAN ueber Baugruppe nach Unterbaugruppen der Kinder Pro gefundene Enkel/Urenkel-Baugruppe in Hauptbaugruppe alle beteiligten Products und Parts als neue Unterbaugruppe einfuegen Nach SCAN weiterer SCAN, der nur 1 Ebene (direkte Kinder) ausliest und mit deinem bisherigen Code rausschreibt. Danach alle eingefuegten Baugruppen rausschmeissen bzw. Dokument schliessen und urspruengliches Dokument wieder laden falls gewuenscht. Gruesse aus dem Rheinland Thomas
------------------ CATIA - eine Laune der Natur ... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SaftLaden Mitglied
Beiträge: 32 Registriert: 16.04.2009
|
erstellt am: 17. Apr. 2009 14:27 <-- editieren / zitieren --> Unities abgeben:
Hallo Thomas, klingt nach nem Plan. Allerdings dachte ich, es wäre möglich die lokalen Koordinaten auf globale Koordinaten umrechnen zu lassen. Koordinatentransformation und so...Vielleicht finde ich da dann doch noch was. Versuche nebenbei gerade das Erstellen von Windowsordnern in meinem Skript zu ermöglichen, um die Dateien jeweils in nen neuen Ordner zu speichern. Nur macht folgende Funktion gar nichts: ' Existiert der Ordner? If Not oFSO.FolderExists("F:\temp") Then ' Nein! Jetzt erstellen... If oFSO.CreateFolder("F:\temp") Then ' Ordner wurde korrekt erstellt! End If End If Muss ich da irgendwo in meinem Skript angeben, dass er die passende dll includen soll? Grüße! Holger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lusilnie Mitglied
Beiträge: 1486 Registriert: 13.07.2005
|
erstellt am: 17. Apr. 2009 21:10 <-- editieren / zitieren --> Unities abgeben: Nur für SaftLaden
Hallo SaftLaden, wenn Du "Hilfe" zur Koordinatentransformation brauchst, schau Dir mal die in der CATIA-Hilfe vorhandenen Makros "DMUPstCopyPasteKeepAbsolutePosition.CATScript" und "DMUPstCutPasteKeepAbsolutePosition.CATScript" an. Dort wird dies anschaulich vorgeführt. 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 |
SaftLaden Mitglied
Beiträge: 32 Registriert: 16.04.2009
|
erstellt am: 20. Apr. 2009 08:58 <-- editieren / zitieren --> Unities abgeben:
Danke Lusilnie, super! Jedoch, wie befürchtet sind die von Dir genannte Script nicht auf meinem Rechner vorhanden. Gibts die evtl. auch auf irgendner Internetseite zum downloaden? Unser Support braucht da wieder so ewig Viele Grüße! Holger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SaftLaden Mitglied
Beiträge: 32 Registriert: 16.04.2009
|
erstellt am: 20. Apr. 2009 09:13 <-- editieren / zitieren --> Unities abgeben:
|
SaftLaden Mitglied
Beiträge: 32 Registriert: 16.04.2009
|
erstellt am: 20. Apr. 2009 11:23 <-- editieren / zitieren --> Unities abgeben:
Da hab ich dann glatt mal ne frage dazu. Das Skript läuft leider nicht durch. Steigt bei der letzten Zeile, des folgend angegebenen Quelltextes aus. Methode wird nicht unterstützt. Sub CATMain() ' Retrieve the Groups collection Dim cGroups As AnyObject Set cGroups = CATIA.ActiveDocument.Product.GetTechnologicalObject("Groups") ' Create a group with selected products Dim oGroup As Group Set oGroup = cGroups.AddFromSel If (oGroup.CountExplicit = 0) Then Msgbox "No product selected" Else ' Acquire the component to paste onto Dim oSelection As Selection Set oSelection = CATIA.ActiveDocument.Selection oSelection.Clear Dim sIID(0) sIID(0) = "Product" Dim sOutputState As String sOutputState = oSelection.SelectElement(sIID, "Select the component to paste onto", true) 'Hier Meldung, dass Methode durch Objekt nicht unterstützt Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lusilnie Mitglied
Beiträge: 1486 Registriert: 13.07.2005
|
erstellt am: 20. Apr. 2009 22:49 <-- editieren / zitieren --> Unities abgeben: Nur für SaftLaden
Hallo SaftLaden, Du arbeitest doch mit R17? Die Methode "SelectElement" wird seit R16 nicht mehr unterstützt! Du musst nun "SelectElement2" verwenden: Code: sOutputState = oSelection.SelectElement2(sIID, "Select the component to paste onto", true)
Eventuell solltest Du auch die Selection "oSelection" ohne Typ deklarieren bzw. den Typ "auskommetieren", etwa so:Code: Dim oSelection 'As Selection
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 |
SaftLaden Mitglied
Beiträge: 32 Registriert: 16.04.2009
|
erstellt am: 21. Apr. 2009 17:44 <-- editieren / zitieren --> Unities abgeben:
Du bist a echter ***** Werde mich morgen nochmal dem Skript widmen und schauen, ob ichs updaten kann. Kannst Du eigentlich ein Buch(außer der Hilfe) empfehlen um das Skripten zu lernen? Viele Grüße! Holger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
denyo_1 Moderator Manager
Beiträge: 2506 Registriert: 10.08.2005 HP Compaq 8710w, Intel Core Duo T7700, 2,40 Ghz, 3GB RAM, Windows XP Professionel @32bit, Quadro FX 1600M, CATIA V5 R19 SP3
|
erstellt am: 21. Apr. 2009 17:53 <-- editieren / zitieren --> Unities abgeben: Nur für SaftLaden
|
SaftLaden Mitglied
Beiträge: 32 Registriert: 16.04.2009
|
erstellt am: 22. Apr. 2009 08:37 <-- editieren / zitieren --> Unities abgeben:
Hallo Daniel, ja der Spaß an der Sache ist auf jeden Fall vorhanden. Punkte 1 bis 5 werden daher auch fleißig abgearbeitet. Manchmal geht mir nur etwas der Überblick über die Objektstruktur in CATIA verloren. Ein bischen hilft mir jedoch meine Erfahrung bei der Programmierung von Szenegraphen... Viele Grüße! Holger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SaftLaden Mitglied
Beiträge: 32 Registriert: 16.04.2009
|
erstellt am: 23. Apr. 2009 10:15 <-- editieren / zitieren --> Unities abgeben:
So jetzt hab ich in Bezug aufs verstehen nochmal Fragen 1:Warum wird cGroups als AnyObject deklariert? Ich dachte cGroups müsste als Groups oder Collection deklariert werden?? (Collection ist ja keine Ableitung von AnyObject) 2:Ist es so, dass GetTechnologicalObject("Groups") alle Knoten meines geöffneten Produktes ausgibt? Sub CATMain() ' Retrieve the Groups collection Dim cGroups As AnyObject Set cGroups = CATIA.ActiveDocument.Product.GetTechnologicalObject("Groups") ' Create a group with selected products Dim oGroup As Group Set oGroup = cGroups.AddFromSel If (oGroup.CountExplicit = 0) Then Msgbox "No product selected" Else ' Acquire the component to paste onto Dim oSelection As Selection Set oSelection = CATIA.ActiveDocument.Selection oSelection.Clear Dim sIID(0) sIID(0) = "Product" Dim sOutputState As String sOutputState = oSelection.SelectElement(sIID, "Select the component to paste onto", true)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SaftLaden Mitglied
Beiträge: 32 Registriert: 16.04.2009
|
erstellt am: 23. Apr. 2009 15:21 <-- editieren / zitieren --> Unities abgeben:
Jetzt muss ich gleich nochmal was fragen. Und zwar kapier ich die GetAbs Funktion nicht ' *********************************************************************** ' ' Purpose: Retrieve the absolute position of a product. ' ' Inputs : oProduct Product the product ' oRoot Product the root product ' ' Outputs: position Array array corresponding to position of the product ' ' *********************************************************************** Sub GetAbsPosition ( ByRef oProduct, ByRef oRoot, ByRef position ) If (oProduct.Name = oRoot.Name) Then position( 0) = 1.0 position( 1) = 0.0 position( 2) = 0.0 position( 3) = 0.0 position( 4) = 1.0 position( 5) = 0.0 position( 6) = 0.0 position( 7) = 0.0 position( 8) = 1.0 position( 9) = 0.0 position(10) = 0.0 position(11) = 0.0 Else Dim positionToFather(11) Dim fatherAbsolutePosition(11) oProduct.Position.GetComponents positionToFather GetAbsPosition oProduct.Parent.Parent, oRoot, fatherAbsolutePosition MatrixProduct positionToFather, fatherAbsolutePosition, position End If End Sub Soweit ich das lesen kann: Falls das übergebene Produkt gleich dem RootProdukt wird die Position auf den globalen Ursprung gesetzt. Was passiert aber im Else Teil? Denn Sinn kapier ich nicht. Wird hier nicht immer wieder die Funktion in sich aufgerufen, so lange bis auch wieder das rootProdukt erreicht ist? Wann wird die letzte Zeile des ElseTeils überhaupt abgearbeitet? Die wird doch nie aufgerufen oder? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
zoltan.bekesi Mitglied
Beiträge: 321 Registriert: 22.10.2006 Job: CATIA V5R19 / XP 32bit MS Office 2003 Microstation V8 2004 Edition DELL Precision M6300
|
erstellt am: 23. Apr. 2009 17:10 <-- editieren / zitieren --> Unities abgeben: Nur für SaftLaden
Hallo Holger, das ist eine rekursive Funktion. Es ist notwendig, da jedes Product nur seine Position bezüglich den übergegebenen Product enthält. Wenn du in der ersten Ebene bist (nur Root über den Product), dann besteht die Transformation zur akutellen Product nur aus einen Teil, du kannst die Transformation gleich speichern. Wenn du aber schon in den Zweiten Ebene bist, musst du die Transformation von Root auf Ebene1 mit der Transformation von Ebene1 auf Ebene2 "zusammenführen". Wenn du noch eine dritte Ebene hast, dann nochmals. Nehmen wir folgenden Baum als Beispiel: RootProduct +Product1_Ebene1 +Part1_Ebene2 +Product2_Ebene1 +Product3_Ebene2 +Part2_Ebene3 Die rekursive Funktion arbeitet wie folgt: 1)Es werden die Products der ersten Ebene in eine Schleife durchgelaufen 2)Du bist bei Product1_Ebene1: Eltern=Root --> Transformation Speichern 3)Hat Product1_Ebene1 Kinder? --> Ja 4)Es wird eine Schleife mit den Parts/Products der Ebene 2 unter Product1_Ebene1 durchgelaufen 5)Du bist bei Part1_Ebene2: Eltern<>Root, Else Zweig --> *Tranformation zu der Elternteil wird ausgelesen. *Funktion wird nochmals mit der Elternteil aufgerufen *Es wird quasi nochmals 2) ausgeführt *Es wird die resultierende Transformation berechnet (es ist der Produkt der beiden Transformationen) 6)Du bist bei Product2_Ebene1: Eltern=Root --> Transformation Speichern 7)Hat Product2_Ebene1 Kinder? --> Ja 8)Es wird eine Schleife mit den Parts/Products der Ebene 2 unter Product2_Ebene1 durchgelaufen 9)Du bist bei Product3_Ebene2: Eltern<>Root, Else Zweig --> *Tranformation zu der Elternteil wird ausgelesen. *Funktion wird nochmals mit der Elternteil aufgerufen *Es wird quasi nochmals 6) ausgeführt *Es wird die resultierende Transformation berechnet (es ist der Produkt der beiden Transformationen) 10)Hat Product3_Ebene2 Kinder? --> Ja 11)Du bist bei Part2_Ebene3: Eltern<>Root, Else Zweig --> *Tranformation zu der Elternteil wird ausgelesen. *Funktion wird nochmals mit der Elternteil aufgerufen *Es wird quasi nochmals 9) ausgeführt *Es wird die resultierende Transformation berechnet (es ist der Produkt der beiden Transformationen) Ich hoffe, die Erklärung bringt dich weiter. Gruß, Zoltan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SaftLaden Mitglied
Beiträge: 32 Registriert: 16.04.2009
|
erstellt am: 23. Apr. 2009 17:51 <-- editieren / zitieren --> Unities abgeben:
Hallo Zoltan, super vielen Dank für Deine Antwort! Ich checks aber leider noch nicht ganz..Siehe text->
Zitat: Original erstellt von zoltan.bekesi: Hallo Holger,das ist eine rekursive Funktion. Es ist notwendig, da jedes Product nur seine Position bezüglich den übergegebenen Product enthält. Wenn du in der ersten Ebene bist (nur Root über den Product), dann besteht die Transformation zur akutellen Product nur aus einen Teil, du kannst die Transformation gleich speichern. Wenn du aber schon in den Zweiten Ebene bist, musst du die Transformation von Root auf Ebene1 mit der Transformation von Ebene1 auf Ebene2 "zusammenführen". Wenn du noch eine dritte Ebene hast, dann nochmals. Nehmen wir folgenden Baum als Beispiel: RootProduct +Product1_Ebene1 +Part1_Ebene2 +Product2_Ebene1 +Product3_Ebene2 +Part2_Ebene3 Die rekursive Funktion arbeitet wie folgt: 1)Es werden die Products der ersten Ebene in eine Schleife durchgelaufen 2)Du bist bei Product1_Ebene1: Eltern=Root --> Transformation Speichern 3)Hat Product1_Ebene1 Kinder? --> Ja Wo wird diese Abfrage gemacht? Ich hatte gedacht die Funktion geht durch ....Parent.Parent in der Hierarchie nach oben(also Richtung root)!? Außerdem checke ich immer noch nicht wann die Zeile MatrixProduct positionToFather, fatherAbsolutePosition, position überhaupt gelesen wird, wenn vorher doch immer wieder die Funktion GetAbs aufgerufen wird?? Also im Programmtext wieder nach oben gesprungen wird. 4)Es wird eine Schleife mit den Parts/Products der Ebene 2 unter Product1_Ebene1 durchgelaufen 5)Du bist bei Part1_Ebene2: Eltern<>Root, Else Zweig --> *Tranformation zu der Elternteil wird ausgelesen. *Funktion wird nochmals mit der Elternteil aufgerufen *Es wird quasi nochmals 2) ausgeführt *Es wird die resultierende Transformation berechnet (es ist der Produkt der beiden Transformationen) 6)Du bist bei Product2_Ebene1: Eltern=Root --> Transformation Speichern 7)Hat Product2_Ebene1 Kinder? --> Ja 8)Es wird eine Schleife mit den Parts/Products der Ebene 2 unter Product2_Ebene1 durchgelaufen 9)Du bist bei Product3_Ebene2: Eltern<>Root, Else Zweig --> *Tranformation zu der Elternteil wird ausgelesen. *Funktion wird nochmals mit der Elternteil aufgerufen *Es wird quasi nochmals 6) ausgeführt *Es wird die resultierende Transformation berechnet (es ist der Produkt der beiden Transformationen) 10)Hat Product3_Ebene2 Kinder? --> Ja 11)Du bist bei Part2_Ebene3: Eltern<>Root, Else Zweig --> *Tranformation zu der Elternteil wird ausgelesen. *Funktion wird nochmals mit der Elternteil aufgerufen *Es wird quasi nochmals 9) ausgeführt *Es wird die resultierende Transformation berechnet (es ist der Produkt der beiden Transformationen) Ich hoffe, die Erklärung bringt dich weiter. Gruß, Zoltan
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SaftLaden Mitglied
Beiträge: 32 Registriert: 16.04.2009
|
erstellt am: 23. Apr. 2009 18:36 <-- editieren / zitieren --> Unities abgeben:
Ich hab jetzt nochmal einen kleinen Test mit dem Past und Copy script gemacht. Und zwar habe ich mit Hilfe des Skripts mehrere Bauteile aus einer tiefen Hierarchiebene in die erste Kopiert. Anschließend habe ich die sich nun auf der ersten Ebene befindlichen Bauteile einzeln als cgr-Files rausgeschrieben. Tja und siehe da die Bauteile waren nach erneutem reinladen dere einzelnen cgrs zueinander versetzt?? Dürfte ja eigentlich nicht sein, wenn dass Skript die Positionen vorher absolut gesetzt hat. Versteht das jemand? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
zoltan.bekesi Mitglied
Beiträge: 321 Registriert: 22.10.2006 Job: CATIA V5R19 / XP 32bit MS Office 2003 Microstation V8 2004 Edition DELL Precision M6300
|
erstellt am: 23. Apr. 2009 19:54 <-- editieren / zitieren --> Unities abgeben: Nur für SaftLaden
Hallo Holger, du hast recht, meine Beschreibung ist eher der Idealfall, wie es gehen sollte. Ich habe in der Hilfe nach den kompletten Skript gesucht. Die Funktion ist zwar rekursiv, aber nicht so komplett, wie ich es beschrieben habe. Zuerst die einfachere Antwort: MatrixProduct wird aufgerufen, sobald z.B. die vierte Stern in 5). Code: oProduct.Position.GetComponents positionToFather 'Position bezüglich Elternteil auslesen GetAbsPosition oProduct.Parent.Parent, oRoot, fatherAbsolutePosition 'Aufruf einer weiterer Instanz der Funktion MatrixProduct positionToFather, fatherAbsolutePosition, position 'wenn obere Zeile zurückkehrt (es wird, da der Baum nicht unendlich tief sein kann), wird diese Zeile ausgeführt End If
Der Skript in der Hilfedatei angelt sich nicht komplett durch den Baum, es werden nur die vor der Makrostart selektierte Products durchgelaufen. Von der Skript kannst du nur die Transformationen verwerten. Für rekursive Suche im Baum ist es nicht geeignet. In diesen Beitrag Rekursion im Baum findest du zum Beispiel ein Beispiel für die Rekursion. In diesen Skript musst du anstatt "Zählen" die Transformation berechnen. Ist aber generell die Frage, wie du die Struktur nachbauen möchtest. Die einfachste Weg wäre, die gesamte Produktstruktur bis zum letzten Part nachbauen (Transformation zu Eltern abfragen, Product einfügen, Transformation anwenden) und am Part den CGR einzufügen. Ich habe ein Skript beigelegt, wo die Rekursion im Baum gemacht wird. (Hier findest du die bisher fehlende Schritte aus meine Beschreibung) Unter VBA wird ins Immediate Window einiges über jeden Product/Part ausgegeben. Die obere Teil ist recht einfach aufgebaut. In VBA kannst du auch Schritt für Schritt ausführen und so die Verzweigung der Programmlauf kennenlernen. Als Kommentare habe ich angegeben, wo du wegen Struktur neuaufbauen welche Teile einfügen solltest. Das müsste dich um einiges näher ans Ziel bringen. Hierzu muss ich noch anmerken, dass es unter DMU eigentlich ein Befehl gibt (nur leider weiß ich die Name nicht mehr), was ein Product als eine Struktur von Products/CGRs speichert, wie es die CATIA Cache Management tut. Vielleicht weiß es ja jemand hier im Forum. Das könnte dein Leben ggf. noch einfacher machen. Gruß, Zoltan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SaftLaden Mitglied
Beiträge: 32 Registriert: 16.04.2009
|
erstellt am: 24. Apr. 2009 14:11 <-- editieren / zitieren --> Unities abgeben:
Nochmal dickes Danke! Hat mir richtig geholfen. Jetzt hab ich das rekursive Durchlaufen eines Baumes echt kapiert. Für mein Problem müsste ich doch jetzt nur während der Baum durchlaufen wird, für jeden Knoten die Position auf den eins darüber liegenden Knoten umrechnen (und natürlich jeweils anschließend sofort aktualisieren). Wie rechne ich dies aus? Beispiel Berechnung Absolute Position von Child1.1.1 Parent1 (parent1rel Child1.1 (child1.1rel) Child1.1.1 (child1.1.1rel) Um die absolute Position von Child1.1.1 zu bekommen muss ich jweils eine Matrixmultiplikation durchführen? 1: child1.1Absolut=Child1.1rel * parent1rel 2: child1.1.1Absolut = child1.1.1rel*child1.1Absolut Stimmt das? Oder muss ich mit der Inversen multiplizieren?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
zoltan.bekesi Mitglied
Beiträge: 321 Registriert: 22.10.2006 Job: CATIA V5R19 / XP 32bit MS Office 2003 Microstation V8 2004 Edition DELL Precision M6300
|
erstellt am: 24. Apr. 2009 16:52 <-- editieren / zitieren --> Unities abgeben: Nur für SaftLaden
Hallo Holger, Parent 1 (hat keine Transformation ist "fix") Child1.1 (Transformation zu Parent1 (ausgelesen) = Transf_Child11_Parent1) Child1.1.1 (Transformation zu Child1.1 (ausgelesen) = Transf_Child111_Child11) Wenn du den cgr von Child1.1.1 in den Ursprung von Child1.1.1 erstellt und es unter NewParent1 einfügen willst so, dass die originale Position erhalten bleibt, dann musst du Transf_Child111_Child11*Transf_Child11_Parent1 als Transformation anwenden (d.h. in zwei Schritten zurück zur Ursprung). Reihenfolge ist auch wichtig Wenn du nur eine Ebene zurückgehen willst, brauchst du nichts multiplizieren. Wolltest du ein Achsensystem erzeugen, was den Ursprung von Parent1 im Ursprung von Child1.1.1 anzeigt, dann bräuchtest du die Inverse (für die Definition der Achsensystem). Gruß, Zoltan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SaftLaden Mitglied
Beiträge: 32 Registriert: 16.04.2009
|
erstellt am: 27. Apr. 2009 09:47 <-- editieren / zitieren --> Unities abgeben:
Danke! Das heißt wenn ich ein Produkt auf absolute Koordinaten umrechnen möchte, muss ich den Baum von unten nach oben durchlaufen und jeweils Trafo = Trafo * ElternTrafo Berechenen. Werde das mal testen Jetzt habe ich aber noch ein anderes Problem. Und zwar soll der Nutzer die Tesselierungsstufe eingeben. Problem ist, dass nur der Wert vor dem Komma verwendet wird. Warum checke ich nicht. Ich habe sowohl Punkt als auch Komma versucht. Wenn ich die Zahl hart codiere gehts??? Genauigkeit = InputBox("Gewünschte Tessellierungsstufe eingeben:") Set document1 = simplifications1.ComputeSimplification(group1,Genauigkeit) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
zoltan.bekesi Mitglied
Beiträge: 321 Registriert: 22.10.2006 Job: CATIA V5R19 / XP 32bit MS Office 2003 Microstation V8 2004 Edition DELL Precision M6300
|
erstellt am: 27. Apr. 2009 20:27 <-- editieren / zitieren --> Unities abgeben: Nur für SaftLaden
Hallo Holger, versuche es mit CDbl(Eingabestring) anstatt einfach die Rückkehrwert der Eingabe zu übergeben. Implizite Konversion führt nicht immer zur richtigen Ergebnis. Ich habe auch mal als Lösung gesehen, am Anfang der Applikation ein bekannter String auf Double zu konvertieren (mit Komma und Punkt) und so entscheiden, welcher Trennzeichen verwendet wird. Unter .NET ist es dann etwas einfacher, aber bei mir war die genannte Methode auch sehr hilfreich. Gruß, Zoltan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |