| |
| KISTERS 3DViewStation: Effektiver Know-how-Schutz von sensiblen Produktdaten, eine Pressemitteilung
|
Autor
|
Thema: SelectElement2 (1918 / mal gelesen)
|
Desken Mitglied
Beiträge: 24 Registriert: 12.03.2019 Intel Xeon Cpu E5-1620 32Gb Ram Catia V5
|
erstellt am: 12. Mrz. 2019 10:27 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe folgendes Problem bei meiner CatVBA Programmierung: Ich habe ein Produkt mit mehreren Parts. Nun soll der Nutzer aufgefordert werden, aus einem Part mehrere Flächen/Elemente zu selektieren (entweder durch einzelnes Markieren oder durch aufspannen eines Kastens mit der Maus).Die selektierten Elemente sollen dann in eine anderes Part im Produkt als "dumme" Flächen kopiert werden. Bisher bin ich soweit, dass der Nutzer nur 1 Element auswählen kann. Müsste irgendwie eine Schleife oder Ähnliches durchgelaufen werden? Bin Neuling in der VBA Programmierung und würde mich über Hilfe oder Codeschnippsel freuen. Viele Grüße Dennis Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 12. Mrz. 2019 18:09 <-- editieren / zitieren --> Unities abgeben: Nur für Desken
Servus Dennis Willkommen im Forum. Bitte Systeminfo ausfüllen. Der Ablauf könnte sein: - Elemente der Multiselektion in einem Array abspeichern
- Array abarbeiten: Element einzeln selektieren, kopieren, einfügen
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Desken Mitglied
Beiträge: 24 Registriert: 12.03.2019 Intel Xeon Cpu E5-1620 32Gb Ram Catia V5
|
erstellt am: 13. Mrz. 2019 09:36 <-- editieren / zitieren --> Unities abgeben:
Hallo Bernd, danke für die Antwort. An ein Array habe ich auch schon gedacht. Wie würde ich in einem Array die Elemente selektieren. Müsste jedes Element einzeln bearbeitet werden? Es kann eine große Menge an Elemente werden ... Ich probiere die Selektion gerade mit der SelectElement3. Kannst du mir dabei ein Tipp geben, wie ich vom Assemply ins Shape Design wechseln kann? Ich kann die Elemente aus einem Part kopieren, aber nicht in ein anderes Part des Produktes einfügen. Öffnen eines neuen Fensters mittels StartWorkbench"Workbenchid" führt nicht zum erfolg. Ein neues Fenster wird zwar im Shape geöffnet, die Arbeitsumgebung im Produkt wird aber nicht gewechselt Danke Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 13. Mrz. 2019 17:42 <-- editieren / zitieren --> Unities abgeben: Nur für Desken
Servus Beispiel zum Kopieren in ein anders Part des Products: siehe zB hier. Zum selektieren von den im Array gespeicherten Elementen: Code: for i = LBound(oArrayBuffer) to UBound(oArrayBuffer) oSel.Clear oSel.Add oArrayBuffer(i) oSel.Copy 'hier weiter Code für das Einfügen next
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Desken Mitglied
Beiträge: 24 Registriert: 12.03.2019 Intel Xeon Cpu E5-1620 32Gb Ram Catia V5
|
erstellt am: 14. Mrz. 2019 14:43 <-- editieren / zitieren --> Unities abgeben:
Hallo Bernd, danke für die Antwort, das hilft mir weiter. Gibt es einen Befehl, der prüft, ob ein Element in einem Geoset oder doch in einem Body ist? Würde es dann in einer If-Schleife verpacken. If Element in Geoset, dann kopieren... if Element in Body, dann Extract usw. Grüße Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 14. Mrz. 2019 14:50 <-- editieren / zitieren --> Unities abgeben: Nur für Desken
|
Desken Mitglied
Beiträge: 24 Registriert: 12.03.2019 Intel Xeon Cpu E5-1620 32Gb Ram Catia V5
|
erstellt am: 15. Mrz. 2019 09:18 <-- editieren / zitieren --> Unities abgeben:
Hallo Bernd, kannst du mir den Befehl .parent.parent genauer erklären? Würde z.B " Selektion" meine ausgewählten Elemente beinhalten, welche in einem Body liegen: If Selektion.Parent.Parent.TypeName = "Bodybezeichnung" Then CATIA.StartCommand ...? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 15. Mrz. 2019 09:27 <-- editieren / zitieren --> Unities abgeben: Nur für Desken
Servus Du musst auch auf das selektierte Element zugreifen: Code: Set oSelElement = oSel.item2(1).Value MsgBox (TypeName(oSelElement.Parent.Parent))
Vermutlich muss du für dein Vorhaben nicht die Workbench wechseln. StartCommands würde ich nur benutzen wenn es nicht anders geht. Gruß Bernd PS: Falls du in VBA programmierst: schau dir mal das Watch- und Local-Fenster an. ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Desken Mitglied
Beiträge: 24 Registriert: 12.03.2019 Intel Xeon Cpu E5-1620 32Gb Ram Catia V5
|
erstellt am: 15. Mrz. 2019 09:57 <-- editieren / zitieren --> Unities abgeben:
Da stehe ich im Moment auf dem Schlauch. Hier ist mein Code, der die Selektion anfordert: Dim UserSel As Object Set UserSel = Document.SELECTION UserSel.Clear InputObjectType(0) = "AnyObject": iMsg = "Select curves..."
MsgBox "Bitte bestätigen und die Elemente selektieren" Status = UserSel.SelectElement3(InputObjectType, iMsg, _ False, CATMultiSelTriggWhenUserValidatesSelection, True) If ((Status = "Cancel") Or (Status = "Undo") Or (Status = "Redo")) Then Exit Sub ' CrCount = UserSel.Count Dim oSelElement As Object Set oSelElement = Status.Value MsgBox (TypeName(oSelElement.Parent.Parent)) CATIA.ActiveDocument.SELECTION.Copy Im letzten Schritt vor der MsgBox kommt der Fehler ,dass ihm das Objekt noch fehlt. Das Local Fenster kenne ich schon, auf jeden Fall sehr sinnvoll. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 15. Mrz. 2019 10:06 <-- editieren / zitieren --> Unities abgeben: Nur für Desken
Servus Schau bitte mal in die Doku was dir SelectElement3 zurück liefert. Du musst auch ein selektiertest Element (und nicht alle) ansprechen: Code: Set oSelElement = UserSel.item(1).Value 'das erste selektierte Element
Gruß Bernd PS: Vorsicht mit dem Filter bei der Selektion. Möglichst weit einschränken, sonst fällt deine Makro ggf voll auf die Nase. ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Desken Mitglied
Beiträge: 24 Registriert: 12.03.2019 Intel Xeon Cpu E5-1620 32Gb Ram Catia V5
|
erstellt am: 15. Mrz. 2019 10:31 <-- editieren / zitieren --> Unities abgeben:
|
Desken Mitglied
Beiträge: 24 Registriert: 12.03.2019 Intel Xeon Cpu E5-1620 32Gb Ram Catia V5
|
erstellt am: 15. Mrz. 2019 10:54 <-- editieren / zitieren --> Unities abgeben:
Du meintest, StartCommands sollten lieber vermieden werden. Wenn bei mir jetzt das ausgewählte Element ein Solid ist, also in einem Body steckt, soll davon ein "dummes" Multiple Extract gemacht werden und die dadurch erzeugte Fläche weiter verwendet werden. Geht es denn überhaupt, den StartCommand "Multiple Extract zu umgehen? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 15. Mrz. 2019 11:12 <-- editieren / zitieren --> Unities abgeben: Nur für Desken
Servus Hast du dazu schon mal in die V5Automation.chm geschaut oder versucht was dazu der Makrorekorder ausspuckt? (AddNewExtractMulti hört sich doch vielversprechend an) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Desken Mitglied
Beiträge: 24 Registriert: 12.03.2019 Intel Xeon Cpu E5-1620 32Gb Ram Catia V5
|
erstellt am: 15. Mrz. 2019 12:33 <-- editieren / zitieren --> Unities abgeben:
Die Automationdatei habe ich auch schon durchgestöbert, nur den Befehl nicht gefunden. AddNewExtractMulti ist genau das, was ich gesucht habe. Folgendes habe ich: If TypeName(oSelElement.Parent.Parent) = "Body" Then Dim partDocument1 As PartDocument Set partDocument1 = CATIA.ActiveDocument Dim part1 As Part Set part1 = partDocument1.Part Dim hybridBodies1 As HybridBodies Set hybridBodies1 = part1.HybridBodies Dim hybridBody1 As HybridBody Set hybridBody1 = hybridBodies1.Add() hybridBody1.AddNewExtractMulti (oSelElement) End If Bei der Zuweisung, von welchem Element ein Extract gemacht werden soll, kommt noch ein Fehler. Aber oSelElement sollte doch schon durch UserSel.Item(1).Value definiert sein, oder liege ich da falsch? Vielen Danke für die Antworten Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 15. Mrz. 2019 13:34 <-- editieren / zitieren --> Unities abgeben: Nur für Desken
Servus Hast du die Fehlermeldung gelesen? Und auch verstanden? Ein HybridBody hat nicht die Methode AddNewExtractMulti und erwartet vermutlich auch einen bestimmten Input (siehe Doku). Schau dir zB mal dazu die Makroaufzeichnung an. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Desken Mitglied
Beiträge: 24 Registriert: 12.03.2019 Intel Xeon Cpu E5-1620 32Gb Ram Catia V5
|
erstellt am: 18. Mrz. 2019 11:20 <-- editieren / zitieren --> Unities abgeben:
Hey Bernd, wie du schon erahnt hast, fehlt ihm das Inputobjekt. Den Macrorecorder habe ich mal laufen lassen, das hilft mir schon bei den folgenden Befehlen weiter. Jedoch bekomme ich es noch nicht hin, den Befehl AddNewExtractMulti mit meinem erzeugten Geoset zu verbinden. Der Recorder schreibt etwas mit HybridShapeFactories, das ist mir leider noch ziemlich unbekannt... Folgendes habe ich: Dim oSelElement As Object Set oSelElement = UserSel.Item(1).Value If TypeName(oSelElement.Parent.Parent) = "Body" Then Dim partDocument1 As PartDocument Set partDocument1 = CATIA.ActiveDocument Dim part1 As Part Set part1 = partDocument1.Part Dim hybridBodies1 As HybridBodies Set hybridBodies1 = part1.HybridBodies Dim hybridBody1 As HybridBody Set hybridBody1 = hybridBodies1.Add() Das klapp, es wird ein neues Geoset erstellt, wenn sich die Selektion in einem Body befindet. Hier ist das, was der Recorder zu Beginn ausgibt: Sub CATMain() Dim partDocument1 As PartDocument Set partDocument1 = CATIA.ActiveDocument Dim part1 As Part Set part1 = partDocument1.Part Dim bodies1 As Bodies Set bodies1 = part1.Bodies Dim body1 As Body Set body1 = bodies1.Item("Result of 5NA807111_TM012__TRAEGER STF VORN_17-08-2015_00.1\TRAEGER") Dim shapes1 As Shapes Set shapes1 = body1.Shapes Dim solid1 As Solid Set solid1 = shapes1.Item("Solid.1") Dim reference1 As Reference Set reference1 = part1.CreateReferenceFromObject(solid1) Dim reference2 As Reference Set reference2 = part1.CreateReferenceFromObject(solid1) Dim hybridShapeFactory1 As HybridShapeFactory Set hybridShapeFactory1 = part1.HybridShapeFactory Dim hybridShapeExtractMulti1 As HybridShapeExtractMulti Set hybridShapeExtractMulti1 = hybridShapeFactory1.AddNewExtractMulti(reference2) Dim reference3 As Reference Set reference3 = part1.CreateReferenceFromObject(solid1) Ab hier folgen dann die Einstellungen des Extract. Es klappt nur noch nicht, das vom Recorder mit meinem Code zu verbinden... Vielleicht hast du ja noch einen Tipp, danke!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 18. Mrz. 2019 11:59 <-- editieren / zitieren --> Unities abgeben: Nur für Desken
Servus Dennis Was HybridShapeFactory siehe V5Automation, ein Hybridshape zu einem geoSet hinzufügen geht über AppendHybridShape. So könnten die beiden Codes zusammengefasst werden: Code: If TypeName(oSelElement.Parent.Parent) = "Body" Then Dim partDocument1 As PartDocument Set partDocument1 = CATIA.ActiveDocument Dim part1 As Part Set part1 = partDocument1.Part Dim hybridBodies1 As HybridBodies Set hybridBodies1 = part1.HybridBodies Dim hybridBody1 As HybridBody Set hybridBody1 = hybridBodies1.Add() Dim refSelElement As Reference Set refSelElement = part1.CreateReferenceFromObject(oSelElement) Dim hybridShapeFactory1 As HybridShapeFactory Set hybridShapeFactory1 = part1.HybridShapeFactory Dim hybridShapeFactory1 As HybridShapeFactory Set hybridShapeFactory1 = part1.HybridShapeFactory Set hybridShapeExtractMulti1 = hybridShapeFactory1.AddNewExtractMulti(refSelElement) ....
Was mich entwas wundert: du wolltest doch in ein CATProduct die Flächen selektieren lassen, somit sollte hier Set partDocument1 auf die Nase fallen. Ja nach dem was du für die Selektion zulässt (zB Teilflächen (BREP) wirst du noch auf weitere Probleme stoßen. Deshalb den Filter möglichst weit einschränken. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Desken Mitglied
Beiträge: 24 Registriert: 12.03.2019 Intel Xeon Cpu E5-1620 32Gb Ram Catia V5
|
erstellt am: 18. Mrz. 2019 15:20 <-- editieren / zitieren --> Unities abgeben:
Danke, das klappt jetzt!. Habe es jetzt nochmal etwas anders aufgebaut. Ein Produkt wird nicht mehr erzeugt, sondern einzelne Parts geöffnet und die Flächen als Variable gespeichert. Es klappe jetzt super, der Nutzer wählt die Fläche aus, ist sie in einem Body bzw ein Solid, wird sie als "Datum" extrahiert und weiter verarbeitet. Danke bis hier schonmal Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Desken Mitglied
Beiträge: 24 Registriert: 12.03.2019 Intel Xeon Cpu E5-1620 32Gb Ram Catia V5
|
erstellt am: 19. Mrz. 2019 10:36 <-- editieren / zitieren --> Unities abgeben:
Gibt es eine Möglichkeit, ein Join von den Elementen eines Arrays zu machen?. Der Nutzer wählt Flächen aus, diese werden in einem Array gespeichert und sollen schließlich zu einem Join zusammengefasst werden. Hier ist mein Code bisher: ' Auswahl festlegen ------------------- Dim Was1(0) Was1(0) = "Face": iMsg = "Select curves..." '-------------------------------------- MsgBox "Bitte bestätigen und die Elemente selektieren!" Hier auch noch eine Fragen: Kann man mehrere Auswahlfilter festlegen? Z.b "Face" und "Solid" getrennt durch oder? Es geht wahrscheinlich, ich komme nur noch nicht drauf, in welcher Form das Programm es haben will, habe schon vieles probiert.
' Dim Auswahl Auswahl = UserSel.SelectElement3(Was1, iMsg, _ False, CATMultiSelTriggWhenUserValidatesSelection, True)
If ((Auswahl = "Cancel") Or (Auswahl = "Undo") Or (Auswahl = "Redo")) Then Exit Sub ' CrCount = UserSel.Count CrCount = Auswahl.Count 'Selektierten Elemente in ein Array speichern--------------------------------------------- Dim AuswahlArray() ReDim AuswahlArray(UserSel.Count) For N = 1 To UserSel.Count Set AuswahlArray(N) = UserSel.Item(N).Value Next Danke!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 19. Mrz. 2019 17:55 <-- editieren / zitieren --> Unities abgeben: Nur für Desken
Servus Denis Bitte Code in entsprechenden Tags posten. zum Filter: du kann doch den Array mit mehr Elementen dimensionieren: Code: Dim Was1(1) Was1(0) = "Face" Was1(1) = "Solid"
Zu deinem Join: mit AddNewJoin den Join erstellen und mit AddElement weitere Elemente hinzufügen (siehe Doku und Forensuche) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |