Autor
|
Thema: Makroprogrammierung Startschwierigkeiten (4938 mal gelesen)
|
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 09. Sep. 2013 10:19 <-- editieren / zitieren --> Unities abgeben:
Hallo, arbeite mich gerade in die Makroprogrammierung ein. Bisherige Programmiererfahrung: VBA, C++, Matlab. Möchte zum Einstieg ein Makro programmieren, welches einen Body die Eigenschaft hide bzw. show ändern. Diverse Fachliteratur hat mir bis jetzt nicht weitergeholfen. In den Büchern gibt es zwar Beispiele, aber der Code wird finde ich nicht erklärt. Zur Info, Strukturbaum sieht so aus:
Code: PartBody --> leer Body.2 --> Pad.1 Body.3 --> Pad.2
Mein erstes Problem ist die Auswahl. Damit ich eine Eigenschaft ändern kann muss ich das Pad.1 zunächst auswählen? "Insert Object Solution" liefert mir das: Code: Set partDocument1 = CATIA.ActiveDocument Set part1 = partDocument1.PartSet bodies1 = part1.Bodies Set body1 = bodies1.Item("Body.2") Set shapes1 = body1.Shapes Set pad1 = shapes1.Item("Pad.1")
Ist das Pad.1 nun ausgewählt? Was ist der Unterschied zwischen Selction (z. B. Dim VARIABLE as Selction)? Wie kann ich jetzt die VisProperties von Pad.1 ändern? Makrorecording liefert mir diesen Code:
Code: Sub CATMain()Dim partDocument1 As Document Set partDocument1 = CATIA.ActiveDocument Dim selection1 As Selection Set selection1 = partDocument1.Selection Dim visPropertySet1 As VisPropertySet Set visPropertySet1 = selection1.VisProperties Dim part1 As Part Set part1 = partDocument1.Part Dim bodies1 As Bodies Set bodies1 = part1.Bodies Dim body1 As Body Set body1 = bodies1.Item("Body.3") Set bodies1 = body1.Parent Dim bSTR1 As String bSTR1 = body1.Name selection1.Add body1 Set visPropertySet1 = visPropertySet1.Parent Dim bSTR2 As String bSTR2 = visPropertySet1.Name Dim bSTR3 As String bSTR3 = visPropertySet1.Name visPropertySet1.SetShow 1 selection1.Clear End Sub
Ich verstehe den Code nicht. Ich möchte nur die Eigenschaft VisProperty ändern. Warum der so viele Variablen deklariert ist mir schleierhaft. Danke schonmal für Eure Hilfe! PS.: Gibt es einen art Debugger wie in C++ / Matlab zum fehlerfinden?
[Diese Nachricht wurde von N2high am 09. Sep. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 09. Sep. 2013 11:47 <-- editieren / zitieren --> Unities abgeben:
ich hab das Problem jetzt gelöst Code: set Selection1 = CATIA.ActiveDocument.Selection selection1.Search "Name=Pad.1,all" 'Auswahl von Pad.1 via Fkt suchen'set Element = selection1.VisProperties 'Element.SetShow 1 'Hide Show mit Zusatzveriable selection1.VisProperties.SetShow 1 'Hide Show ohne Zusatzveriable
nun möchte ich via if/else eine Meldung ausgeben falls das Objekt bereits versteckt ist. Den Status sollte ich über selection1.VisProperties.GetShow bekommen und möchte ihn in einer Integer Variable speichern. Code: dim status As Integer status = selection1.VisProperties.GetShow
So geht es jedoch nicht. Gibt es eine Hilfe wo ich finde was GetShow zurück gibt? (Denke mal 0 oder 1) bzw. eine art Debugger? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DasDon Mitglied Konstruktuer
Beiträge: 169 Registriert: 25.07.2011 R18 SP2. WIN
|
erstellt am: 09. Sep. 2013 12:03 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
moin moin, bin auch kein meister, aber hier meine Antwort. Zitat: Ist das Pad.1 nun ausgewählt? Was ist der Unterschied zwischen Selction (z. B. Dim VARIABLE as Selction)?
Item("Pad.1") ist als Object Pad1 referenziert. Selektiert ist hier nichts. Zitat:
Ich verstehe den Code nicht. Ich möchte nur die Eigenschaft VisProperty ändern. Warum der so viele Variablen deklariert ist mir schleierhaft.
Das macht CATIA so, warum weiß ich auch nicht. Aber man gewöhnt sich dran. Man muss nur die Syntax etwas verstehen, dann kann man einiges in eins zusammen fassen. zb:
Code: Dim selection1 As Selection Set selection1 = CATIA.ActiveDocument.selection
oder
Code: Dim visProp As VisProperties set VisProperties = CATIA.ActiveDocument.selection.VisProperties
Zitat: PS.: Gibt es einen art Debugger wie in C++ / Matlab zum fehlerfinden?
=Alt + F11 oder Tools->Macros->Visual Basic Editor Code:
Sub CATMain()Dim oBody As Body Set oBody = CATIA.ActiveDocument.Part.Bodies.Item("Body.2") '--->das ist der direkter weg. 'sollte es keinen Body mit dem Namen "Body.2" im geöffneten Document geben, 'wird das makro abstürtzen. dim oSelection As Selection set oSelection = CATIA.ActiveDocument.Selection 'damit haben wir einen Objekt der die Selektion des AktivenDokuments wieder gibt ' hier müssen wir nun das Body hinzufügen.
oSelection.Add(oBody) ' das Show/Hide wird wie im aufgenommen makro gezeigt über VisProperties gesteuert bzw ' VisProperties.SetShow ' VisProperties bewirkt sich auf alle Elemente der Selection aus! oSelection.VisProperties.SetShow 1 End Sub
Damit wird es durchlaufen, aber wie gesagt, es schlechter geht es fast nicht mehr. Das Makro ist sehr fehler anfällig. Gruß, 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: 09. Sep. 2013 12:49 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
Servus Was dir "getShow" zurückliefert kannst in der V5Automation.chm nachschauen. Ein Beispiel von dort: Code: Dim showstate As CatVisPropertyShow Set visProperties1 = CATIA.ActiveDocument.Selection.VisProperties visProperties1.GetShow showstate MsgBox "show = " & showstate
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 09. Sep. 2013 14:58 <-- editieren / zitieren --> Unities abgeben:
Code: set Selection1 = CATIA.ActiveDocument.Selection selection1.Search "Name=Pad.1,all" 'Auswahl von Pad.1 via Fkt suchenselection1.VisProperties.SetShow 1
ich erzeuge hier mit der Methode VisProperties die Klasse VisPropertySet von dieser ich wiederum mit der Methode SetShow das Atribut Hide/Show ändern kann. Hab ich das korrekt verstanden? Möchte das ganze nun übertragen auf ein neues Problem: Ich wähle mir ein Geometrie-Objekt aus und Catia soll die Art zurück geben. Als Klasse brauch ich laut meinem Buch "GeometricElement". Aber welche Methode? --------------------------------------------------------------------------------- bin wieder etwas weiter: Code: Set partDocument1 = CATIA.ActiveDocumentSet part1 = partDocument1.Part Set hybridBodies1 = part1.HybridBodies Set hybridBody1 = hybridBodies1.Item("Geometrical Set.1") set art = hybridBody1.GeometricElements
nun müsste in art eine Liste sein mit den jeweiligen Objekten sein? Ausgegeben bekomme ich diese jedoch nicht
[Diese Nachricht wurde von N2high am 09. Sep. 2013 editiert.] 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: 09. Sep. 2013 17:34 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
Servus "GeometricElements" sind AFAIR die Elemente in einer Skizze. Über de Methode "GeometricType" kann man von diesen den Typ ausgeben lassen. Allgemein geht das teilweise auch über "TypeName" also zB Element markieren und folgendes Script durchlaufen lassen: Code: Sub CATMain() Dim osel As Object Set osel = CATIA.ActiveDocument.Selection MsgBox osel.Item2(1).Name & " = " & TypeName(osel.Item2(1).Value) End Sub
Grß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 09. Sep. 2013 20:59 <-- editieren / zitieren --> Unities abgeben:
danke bgrittmann Ich möchte den Typ eines Intersect's (Punkt oder Gerade) auslesen. Denke die Methode mit dem Namen geht da nicht. hier die Objektauflösung von Catia Code: Sub CATMain() Set partDocument1 = CATIA.ActiveDocument Set part1 = partDocument1.Part Set bodies1 = part1.Bodies Set body1 = bodies1.Item("Hauptkörper") Set hybridShapes1 = body1.HybridShapes Set hybridShapeIntersection1 = hybridShapes1.Item("Verschneiden.1") End Sub
Als Methode von welchem Objekt kann ich jetzt GeometricTyp anwenden? Gibt es einen Ort wo ich das nachschauen kann? Im Objektbrowser finde ich das nicht 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: 09. Sep. 2013 21:50 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
Servus Schau dir dazu mal die Methode "GetGeometricalFeatureType" an: Code: Sub CATMain() Dim partDocument1 As partDocument Dim part1 As part Dim hybridBody As hybridBody Dim hybridShapes1 As Hybridshapes Dim hybridShapeIntersection1 As Hybridshape Dim hybridShapeFactory As hybridShapeFactorySet partDocument1 = CATIA.ActiveDocument Set part1 = partDocument1.part Set hybridBody = part1.hybridBodies.Item(1) Set hybridShapes1 = hybridBody.Hybridshapes Set hybridShapeIntersection1 = hybridShapes1.Item("Verschneiden.2") Set hybridShapeFactory = part1.hybridShapeFactory MsgBox hybridShapeFactory.GetGeometricalFeatureType(hybridShapeIntersection1) End Sub
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 09. Sep. 2013 22:16 <-- editieren / zitieren --> Unities abgeben:
|
DasDon Mitglied Konstruktuer
Beiträge: 169 Registriert: 25.07.2011 R18 SP2. WIN
|
erstellt am: 10. Sep. 2013 09:13 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
|
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 10. Sep. 2013 11:18 <-- editieren / zitieren --> Unities abgeben:
hier ist mein Code mit dem es funktioniert: Code: Sub CATMain()Set partDocument1 = CATIA.ActiveDocument Set part1 = partDocument1.Part Set hybridBodies1 = part1.HybridBodies Set hybridBody1 = hybridBodies1.Item("abc") Set hybridBodies2 = hybridBody1.HybridBodies Set hybridBody2 = hybridBodies2.Item("Geometrical Set.1") Set hybridShapes1 = hybridBody2.HybridShapes Set hybridShapeIntersection1 = hybridShapes1.Item("Intersect.1") Set hybridShapeFactory = part1.hybridShapeFactory art=hybridShapeFactory.GetGeometricalFeatureType(hybridShapeIntersection1) Select Case art Case "1" MsgBox "Intersect ist ein Punkt", vbOKOnly + vbInformation Case "3" MsgBox "Intersect ist eine Gerade",vbOKOnly + vbInformation Case Else MsgBox "Art des Intersect konnte NICHT bestimmt werden",vbOKOnly + vbCritical End Select End Sub
Gibt es eine Möglichkeit das ganze Änderungsfreundlicher zu machen, sprich nach dem Intersect zu suchen mit Namen? Falls die Struktur geändert wird.
[Diese Nachricht wurde von N2high am 10. Sep. 2013 editiert.] 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: 10. Sep. 2013 11:42 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
Servus Ja klar kann man das Strukturunabhäniger machen: - Intersect vom User selektieren lassen - mit der Suche alle Intersects suchen (zB nur in einem GeoSet, oder in einem gewählten GeoSet) - ... (siehe dazu auch Forensuche, Literatur und Doku) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 10. Sep. 2013 12:28 <-- editieren / zitieren --> Unities abgeben:
mit Code: set Selection1 = CATIA.ActiveDocument.Selection selection1.Search "Name=Intersect.1,all"
kann ich das Intersect selektieren, allerdings wie ich das mit Code: hybridShapeFactory.GetGeometricalFeatureType()
"verbinde" ist mir noch nicht klar Code: hybridShapeFactory.GetGeometricalFeatureType(selection1.Search "Name=Intersect.1,all")
funktioniert nicht Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DasDon Mitglied Konstruktuer
Beiträge: 169 Registriert: 25.07.2011 R18 SP2. WIN
|
erstellt am: 10. Sep. 2013 12:31 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
|
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 10. Sep. 2013 12:32 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
Servus Mit "selection1.Search" hast du alle bzw ggf mehrere Intersects gesucht. Mit "selection1.item2(1).value" kannst du zB auf das erste selektierte Element zugreifen. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 10. Sep. 2013 12:58 <-- editieren / zitieren --> Unities abgeben:
das wars danke zu vollständigkeit hier mein Code: Code: Sub CATMain()Set partDocument1 = CATIA.ActiveDocument Set part1 = partDocument1.Part set Selection1 = CATIA.ActiveDocument.Selection selection1.Search "Name=Intersect.2,all" set intersect = selection1.item2(1).value art=part1.hybridShapeFactory.GetGeometricalFeatureType(intersect) Select Case art Case "1" MsgBox "Intersect ist ein Punkt", vbOKOnly + vbInformation Case "3" MsgBox "Intersect ist eine Gerade",vbOKOnly + vbInformation Case Else MsgBox "Art des Intersect konnte NICHT bestimmt werden",vbOKOnly + vbCritical End Select End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DasDon Mitglied Konstruktuer
Beiträge: 169 Registriert: 25.07.2011 R18 SP2. WIN
|
erstellt am: 10. Sep. 2013 13:06 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
moin moin, freut mich das du zum Ergebnis gekommen bist, aber dürfte ich fragen warum du dieses macro brauchst? Es scheint mir relative fehlerhaft zu sein. Sobald intersect.2 intersect.3 heisst oder es zwei elemente mit dem namen Intersect.2 gibt, bekommst du nicht die richtige Antwort-Msgbox. Ausserdem für sowas "simples" ist die manuelle funktion STRG+F->"*intersect.2" einhacken->Search->reframe on. schon fast genau so schnell. Gruß, Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 10. Sep. 2013 13:33 <-- editieren / zitieren --> Unities abgeben:
Ich habe ein Part mit mehreren Intersects. Diese heißen alle unterschiedlich und sind keine Standartnamen. Darum ist das mit den Namen gewollt. Je nach dem was bei dem Intersect herauskommt ( Punkt oder Gerade) muss eine andere Logik ablaufen. Ich bin es einfach leid jedes mal manuell nach zu schauen was herauskommt und die entsprechende Logik dann auszuwählen. Wenn Du weitere Verbesserungsvorschläge hast, immer her damit Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DasDon Mitglied Konstruktuer
Beiträge: 169 Registriert: 25.07.2011 R18 SP2. WIN
|
erstellt am: 10. Sep. 2013 14:02 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
|
ferdo Mitglied engineer
Beiträge: 34 Registriert: 15.04.2009 Windows 7, 64 CATIA v5r25 , 3DEXPERIENCE on cloud
|
erstellt am: 10. Sep. 2013 15:24 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
Hallo, In CATScript Sub CATMain() Set partDocument1 = CATIA.ActiveDocument Set part1 = partDocument1.Part set Selection1 = CATIA.ActiveDocument.Selection selection1.Search "Name=Intersect*,all" For i = 1 TO selection1.Count set intersect = selection1.item2(i).value art=part1.hybridShapeFactory.GetGeometricalFeatureType(intersect) Select Case art Case "1" MsgBox "Intersection " & intersect.Name & " is a Point", vbOKOnly + vbInformation Case "3" MsgBox "Intersection " & intersect.Name & " is a Line",vbOKOnly + vbInformation Case Else MsgBox "Type of Intersection was not determined",vbOKOnly + vbCritical End Select Next End Sub ------------------ Best regards Fernando Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 10. Sep. 2013 17:01 <-- editieren / zitieren --> Unities abgeben:
vielen Dank! Das als Schleife zu programmieren wäre mein nächster Schritt gewesen Steh nun vor einem neuen Problem. Je nach dem ob ein Punkt oder Gerade herauskommt muss ein gewisses Geoset aktiviert bzw. deaktiviert werden. Bin ähnlich vorgegangen: Code: ... set Selection2 = CATIA.ActiveDocument.Selection selection2.Search "Name=Intersect_123,all" 'Suche nach Geosetset intersect2 = selection2.item2(1).value 'Erstes Element der Suche auswaehlen part1.Inactivate intersect2
Die Methode schlägt jedoch fehl. Was muss mein bei Geoset's beachten? Mit einem Pad funktioniert es [Diese Nachricht wurde von N2high am 10. Sep. 2013 editiert.] 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: 10. Sep. 2013 17:27 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
Servus Was hast du selektiert? Kannst du manuell ein GeoSet aktivieren/deaktivieren? Bei mir geht es nicht, dann geht es wohl auch nicht per Makro. (ggf kannst nur alle Elemente darunter deaktivieren oder per StartCommand "Komponenten deaktivieren" aufrufen) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 10. Sep. 2013 17:46 <-- editieren / zitieren --> Unities abgeben:
manuell funktioniert es bei mir. Hab mal den Makrorecorder im Testpart laufen lassen: Code: Sub CATMain()Set partDocument1 = CATIA.ActiveDocument Set part1 = partDocument1.Part Set bodies1 = part1.Bodies Set body1 = bodies1.Item("PartBody") Set hybridBodies1 = body1.HybridBodies Set hybridBody1 = hybridBodies1.Item("qwert") Set hybridShapes1 = hybridBody1.HybridShapes Set hybridShapePointCoord1 = hybridShapes1.Item("Point.4") part1.Inactivate hybridShapePointCoord1 part1.UpdateObject hybridBody1 End Sub
damit funktioniert es auch. Daraus schleiße ich: um part1.Inactivate zum laufen zu bringen brauche ich also eine Variable vom Typ HybridShape. Code: set Selection2 = CATIA.ActiveDocument.Selection selection2.Search "Name=Intersect_123,all" set intersect2 = selection2.item2(1).value
das liefert mir aber ein AnyObject Wie ich jetzt aus meinem selectierten AnyObject ein HybridShape mache weiß ich allerdings noch nicht
[Diese Nachricht wurde von N2high am 10. Sep. 2013 editiert.] 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: 10. Sep. 2013 18:14 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
Servus Als was hast du intersect2 dimensioniert? Was liefert dir TypeName(intersect2 ) zurück? Ist "part1" deklariert? ggf solltest du die Suche gleich einschränken, dass nur Verschneidungen gesucht werden. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. [Diese Nachricht wurde von bgrittmann am 10. Sep. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 11. Sep. 2013 09:11 <-- editieren / zitieren --> Unities abgeben:
ich bin davon abgekommen die Geosets zu Aktivieren bzw Deaktiveren sondern möchte die Sachen, welche zuvor darin waren programmieren. Denke so kann ich mehr lernen. Als einfachsten Fall dachte ich, nehme ich das Intersect als Referenz und mach einen Punkt mit X,Y,Z jeweils 0. Macht zwar keinen Sinn, da ich das Intersect gleich verwenden könnte, möchte das nur zum Verständis machen Code: Sub CATMain()Set partDocument1 = CATIA.ActiveDocument Set part1 = partDocument1.Part Set Wzk3D = part1.HybridShapeFactory Set h_pkt = part1.FindObjectByName ("Intersect.4") Set ref = part1.CreateReferenceFromObject (h_pkt) set Pkt = Wzk3D.AddNewPointCoordWithReference (0,0,0,h_pkt) Set HBody = part1.HybridBodies.Item ("Geometrical_Set.2") HBody.AppendHybridShape Pkt Part1.Update End Sub
das ganze funktioniert so lange, wie das Geoset in der Struktur direkt unter dem CATparts ist. Ist dazwischen ein weiteres Geoset funktioniert die Sache nicht mehr. Gibt es hier eine Möglichkeit das ganze Änderungsfreundlich zu machen? Sprich unabhängig wo das Geoset sich nun befindet?
[Diese Nachricht wurde von N2high am 11. Sep. 2013 editiert.] 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: 11. Sep. 2013 09:19 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
Servus Über Name auf Element zuzugreifen ist immer etwas gefährlich (Fehlerbehandlung falls Element nicht vorhanden ist). Du könntest: - über h_pkt.parent.parent das GeoSet auslesen wo sich die Verschneidung befindet und dort auch deinen Punkt erstellen (was passiert wenn mehre Elemente "Intersect.4" heißen??) - über eine Suche das GeoSet (per Namen) suchen - das GeoSet vom User wählen lassen - .... Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 11. Sep. 2013 09:55 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von bgrittmann: - über h_pkt.parent.parent das GeoSet auslesen wo sich die Verschneidung befindet und dort auch deinen Punkt erstellen (was passiert wenn mehre Elemente "Intersect.4" heißen??)
super mit parent.parent konnte ich das Geoset auslesen :) Ich verwende in meinem eigentlichen Part keine Standardnamen. So kann ich halbwegs sichergehen, die Optimale Lösung ist das nicht. Dafür fehlt mir noch das Knowhow ;) Das hier ist mein Versuchspart. Hab nun parent.parent hinzugefügt. Allerdings funktioniert das ganze nur mit Geoset direkt unterhalb des CATparts. Anbei meine Teststruktur. Mit "Geometrical_Set.1" funktioniert das ganze nicht, mit "Geometrical_Set.2" wiederrum schon Code: Sub CATMain()Set partDocument1 = CATIA.ActiveDocument Set part1 = partDocument1.Part Set Wzk3D = part1.HybridShapeFactory Set h_pkt = part1.FindObjectByName ("Intersect.3") Set ref = part1.CreateReferenceFromObject (h_pkt) set Pkt = Wzk3D.AddNewPointCoordWithReference (0,0,0,h_pkt) Set HBody = part1.HybridBodies.Item (h_pkt.parent.parent.name) HBody.AppendHybridShape Pkt Part1.Update End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DasDon Mitglied Konstruktuer
Beiträge: 169 Registriert: 25.07.2011 R18 SP2. WIN
|
erstellt am: 11. Sep. 2013 09:59 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
moin, wo und was spuckt er als fehler meldung aus? Eigentlich müsste HybridBodies. eine KOllektion alle HYBRID Bodies im Part1. sein. Auf welchen "Baum" level sie sich befinden müsste egal sein.
[Diese Nachricht wurde von DasDon am 11. Sep. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 11. Sep. 2013 10:04 <-- editieren / zitieren --> Unities abgeben:
die Fehlermeldung hab ich als Anhang angehängt. Die Fett markierte Zeile ist es Code: Sub CATMain()Set partDocument1 = CATIA.ActiveDocument Set part1 = partDocument1.Part Set Wzk3D = part1.HybridShapeFactory Set h_pkt = part1.FindObjectByName ("Intersect.1") Set ref = part1.CreateReferenceFromObject (h_pkt) set Pkt = Wzk3D.AddNewPointCoordWithReference (0,0,0,h_pkt) Set HBody = part1.HybridBodies.Item (h_pkt.parent.parent.name) HBody.AppendHybridShape Pkt Part1.Update End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DasDon Mitglied Konstruktuer
Beiträge: 169 Registriert: 25.07.2011 R18 SP2. WIN
|
erstellt am: 11. Sep. 2013 10:18 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
mein fehler! part.HybridBodies listet nur alle HYBodies die auf level1 des Baumes sind! Um es einfach zu halten würde ich es so machen Code: Sub CATMain()Set partDocument1 = CATIA.ActiveDocument Set part1 = partDocument1.Part Set Wzk3D = part1.HybridShapeFactory Set h_pkt = part1.FindObjectByName ("Intersect.2") Set ref = part1.CreateReferenceFromObject (h_pkt) set Pkt = Wzk3D.AddNewPointCoordWithReference (0,0,0,h_pkt) Set HBody = part1.FindObjectByName (h_pkt.parent.parent.name) HBody.AppendHybridShape Pkt Part1.Update End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 11. Sep. 2013 10:30 <-- editieren / zitieren --> Unities abgeben:
|
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 11. Sep. 2013 10:37 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
|
DasDon Mitglied Konstruktuer
Beiträge: 169 Registriert: 25.07.2011 R18 SP2. WIN
|
erstellt am: 11. Sep. 2013 10:38 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
moin, ich habe mir im VBA Editor part1 als Watch Objekt hinzugefügt und dann gesehen das unter Hybridbodies nur 2 Elemente waren, Nämlich 123 und Geometrical_Set.2. Ich würde dir empfehlen den VBA Editor zubenutzen bei schwerigkeiten. Ich habe das CATIA Macro scripten ohne ihn gelernt, aber gerade am amfang spart es viel Zeit beim Debuggen. Einfach das WatchTool fenster benutzen. Gruß, Dean Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DasDon Mitglied Konstruktuer
Beiträge: 169 Registriert: 25.07.2011 R18 SP2. WIN
|
erstellt am: 11. Sep. 2013 10:40 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
|
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 11. Sep. 2013 11:10 <-- editieren / zitieren --> Unities abgeben:
kann ich dem Punkt gleich bei der Erstellung einen Namen zuweisen? Oder den Standardnamen lassen und nachträglich ändern. Dann muss ich halt wieder selektieren usw. ... [Diese Nachricht wurde von N2high am 11. Sep. 2013 editiert.] 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: 11. Sep. 2013 11:59 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
|
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 13. Sep. 2013 15:03 <-- editieren / zitieren --> Unities abgeben:
Danke hat geklappt. Ich möchte nun ein neues Geoset in bereits vorhandenes Geoset einfügen Code: name_new_geoset_parent = "Test" name_new_geoset = "123" Set Hbody = part1.FindObjectByName(name_new_geoset_parent) Set HKoerper = Hbody.HybridBodies.Add HKoerper.Name = name_new_geoset
bekomme so dann die Fehlermeldung: Object variable or With block variable not set (Error 91) in der fettgedruckten ZeileHabe daraufhin die Variablen deklariert:
Code: name_new_geoset_parent = "Test" name_new_geoset = "123"Dim Hbody As Hybridbodies Set Hbody = part1.FindObjectByName(name_new_geoset_parent) Dim Hbody As HybridBody Set HKoerper = Hbody.HybridBodies.Add HKoerper.Name = name_new_geoset
Die Fehlermeldung kommt aber immer noch. Wo liegt das Problem? [Diese Nachricht wurde von N2high am 13. Sep. 2013 editiert.] 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: 13. Sep. 2013 15:11 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
Servus Ein Hybribody hat keine eigene COllection mit Hybridbodies, du kannst direkt "Add" nutzen (wie es auch sicher intellisens vorschlägt): Code: Dim name_new_geoset_parent As String Dim name_new_geoset As Stringname_new_geoset_parent = "Test" name_new_geoset = "123" Dim Hbody As hybridBodies Set Hbody = part1.FindObjectByName(name_new_geoset_parent) Dim HKoerper As hybridBody Set HKoerper = Hbody.add HKoerper.Name = name_new_geoset
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |