| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für CATIA & Co. | | | | KISTERS 3DViewStation - Der Schlüssel zur Einsparung von CAD-Lizenzen, eine Pressemitteilung
|
Autor
|
Thema: Aus geöffnetem CatProduct einzelne CatParts öffnen (427 / mal gelesen)
|
JoFa97 Mitglied Student
Beiträge: 32 Registriert: 24.10.2023 CATIA V5
|
erstellt am: 22. Apr. 2024 13:40 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich habe folgende Situation: mein aktives Dokument ist ein CATProduct eines Getriebes. Ich iteriere davon durch den Strukturbaum durch alle Parts und greife verschiedene Daten ab über Vb.net. Die Iteration durch den Strukturbaum ist eine separate Funktion und hier nicht dargestellt. Wenn ich beim jeweiligen Part angekommen bin, sieht meine Funktion zur Datenextraktion so aus: Code:
Private Shared Sub WritePartParameters(part As Product, sw As StreamWriter, Part_Name_Count As Integer) Dim Name = part.Name Dim Mass = Create_Inertia_mass(part) Dim Volume = Create_Volume(part) Dim Surface = Create_Area(part) Dim Gravity = Create_Gravity(part) Dim Inertia_Matrix = Create_Inertia_Matrix(part) Dim Inertia_Principal_Axes = Create_Principal_Axes(part) Dim Inertia_Principal_Moments = Create_Principal_Moments(part) sw.WriteLine(Name + ";" + Mass + ";" + Volume + ";" + Surface + ";" + Gravity + ";" + Inertia_Matrix + ";" + Inertia_Principal_Axes + ";" + Inertia_Principal_Moments + ";") End Sub
So weit alles gut. Nun soll dem eine Funktion hinzugefügt werden, nämlich zum Erstellen einer Bounding Box. Diese Funktion funktioniert auch fehlerfrei, aber bis jetzt nur auf manuell geöffnete Parts, die dann das Active Document sind. Der Anfang der Funktion sieht so aus: Code:
Public Shared Sub Bounding_Box(part) Dim CATIA As Object CATIA = GetObject(, "CATIA.Application") Dim partDocument1 = CATIA.ActiveDocument Dim part1 = partDocument1.Part ...
Jetzt ist es so, dass diese Funktion halt den geöffnete Part als ActiveDocument benötigt. Ich weiß, dass es Möglichkeiten gibt über Documents.Open(Filepath) oder Systems.IO....(Filepath) diese Parts zu öffnen, allerdings ist das relativ umständlich (viele Parts enthalten Leerzeichen, diese werden von dem Befehl nicht angenommen. Ich müsste als vorher eine Funktion schreiben diese alle umzubenennen), und außerdem nicht sehr robust. Gibt es eine Möglichkeit, da ihr ja mein Vorgehen jetzt seht, das ganze so wie bei den anderen Funktionen auch, über den Übergabeparameter "part" zu lösen? Wie kann ich die Parts, da ich ja eh durch den Strukturbaum iteriere, zu gegebener Zeit möglichst leicht öffnen um meinen Bounding Box Code darauf anzuwenden? Es wäre SUPER, wenn mir da jemand weiterhelfen kann. Danke und Liebe Grüße ------------------ Joshua Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12014 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 22. Apr. 2024 13:49 <-- editieren / zitieren --> Unities abgeben: Nur für JoFa97
Servus Joshua Wenn du schon über den Baum einer Baugruppe iterierst kommst du von der Instanz zB: Code: Set PartProduct = MyInstance.ReferenceProduct Set PartDocument = MyInstance.ReferenceProduct.Parent
auf das jeweilige Product/Document des PartDocuments. Dann benötigst du das Part als ActiveDocument nicht unbedingt. Warum willst du nochmal per GetObject auf Catia zugreifen? Einmal am Anfang deines Programms sollte ja reichen, und dann nur die Variable/das Object übergeben oder als globales Object nutzen. Gruß Bernd PS: Warum Leerzeichen bei Dateinamen solche Probleme bei dir verursachen erschließest sich mir nicht. PS2: Wie wird es bei zB Create_Inertia_mass gemacht? Da wird ja auch das Part (Product des Parts) übergeben. ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
JoFa97 Mitglied Student
Beiträge: 32 Registriert: 24.10.2023 CATIA V5
|
erstellt am: 23. Apr. 2024 09:37 <-- editieren / zitieren --> Unities abgeben:
Hallo Bernd, ich probiere jetzt also erstmal aus: - Übergabe von part als Parameter - Dim PartDocument = part.ReferenceProduct.Parent - CATIA.Documents.Open(PartDocument) Ich weiß nicht, ob das das ist, was du meinst. Ich habe mal im Forum geschaut, im Prinzip ist mein Problem ja ein ähnliches wie das hier: https://ww3.cad.de/foren/ubb/Forum137/HTML/006872.shtml, nur dass ich kein SubProduct, sondern einen Part öffnen möchte. Bzgl "Dann benötigst du das Part als ActiveDocument nicht unbedingt.", bin ich mir halt unsicher, mein Skript bezogen auf einen in Catia geöffneten CatPart erstellt ein Achsensystem, fügt eine Powercopy ein etc., und mit dem Übergabeparameter, wie ich es zb. bei Inertia mache, hat es nicht funktioniert. Deshalb bin ich davon ausgegangen, der Part muss tatsächlich geöffnet sein als ActiveDocument.
Zum PS: Leerzeichen und Ausrufezeichen werden vom .Open Befehl über den Path tatsächlich nicht erkannt Zum PPS: Als Übergabeparameter für diese Funktionen kriegen sie den Part, das ActiveDocument ist aber das Product. Hier ist mein Code, ich markiere die Zeile, welche im Strukturbaum des Products die Parts sucht, und diesen dann als Return wiedergibt für meine Funktionen: Code:
Public Shared Sub ProcessProduct(product As Product, sw As StreamWriter, ByRef Part_Name_Count As Integer) For Each component As AnyObject In product.Products If component.Products.Count > 0 Then ProcessProduct(component, sw, Part_Name_Count) Else Dim part = component ''Diese Zeile gibt den Part wieder, die nächste wendet die Funktionen an'' WritePartParameters(part, sw, Part_Name_Count) Part_Name_Count += 1 End If Next End Sub
------------------ Joshua Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Randle Mitglied CAD/PLM Consultant
Beiträge: 744 Registriert: 12.04.2003 Win10 x64 CATIA V5 R18, R19, R21, R27-29
|
erstellt am: 23. Apr. 2024 09:59 <-- editieren / zitieren --> Unities abgeben: Nur für JoFa97
Hallo, bei deiner Funktion Create_Inertia_mass übergibst du das Product (lediglich der Name der Variablen lautet "Part"). Für deine BoundingBox (vermute ich) brauchst du aber den Typ "PartDocument" (und davon "abgeleitet" sicher auch das Part). Gruß Randle ------------------ Planung ersetzt Fehler durch Irrtum! [Diese Nachricht wurde von Randle am 23. Apr. 2024 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12014 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 23. Apr. 2024 12:04 <-- editieren / zitieren --> Unities abgeben: Nur für JoFa97
Servus Joschua Schau dir mal die anderen Funktionen/Routinen (zB Inertia_Matrix) an, was die aus dem übergebenen Product (vermutlich eine Instanz) machen. ggf kannst du da was abkupfern. Und nur dass dein Beispiel-Makro mit dem ActiveDocument arbeitet heißt nicht dass du das auch so machen muss. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|