Autor
|
Thema: Verschachtelte Körper bearbeiten (2043 mal gelesen)
|
geekv5 Mitglied Konstrukteur
Beiträge: 214 Registriert: 13.07.2011 Notebook<P>MSI GX660R Intel Core i5 460M 8GB DDR3 1GB Mobility HD5870 80GB Intel X25-M Postville 250GB HDD<P>Desktop<P>AMD Phenom II X4 965 1GB HD4890@ FirePro V8700 8GB DDR3-1600 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
|
erstellt am: 10. Nov. 2011 09:52 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, habe ein Makro geschrieben, was alle Körper eines Parts durchläuft (bodies.count) und den Namen mit dem Inhalt einer Variable vergleicht und bei Erfolg eine Operation durchführt (z.B. Name ändern).. Jetzt erfasst er allerdings nur Körper auf der ersten Ebene, aber keine Körper die in einem anderen verschachtelt sind (z.B. über Zusammenbau). Ich hoffe man versteht was ich meine.. Kennt ihr da eine Lösung? Gruß Stefan 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. Nov. 2011 10:13 <-- editieren / zitieren --> Unities abgeben: Nur für geekv5
Servus Am einfachsten ist wenn du auf die Körper direkt mit der Suche zugreifst, dann sollten alle Körper gefunden werden (siehe auch hier)) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
geekv5 Mitglied Konstrukteur
Beiträge: 214 Registriert: 13.07.2011 Notebook<P>MSI GX660R Intel Core i5 460M 8GB DDR3 1GB Mobility HD5870 80GB Intel X25-M Postville 250GB HDD<P>Desktop<P>AMD Phenom II X4 965 1GB HD4890@ FirePro V8700 8GB DDR3-1600 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
|
erstellt am: 10. Nov. 2011 10:40 <-- editieren / zitieren --> Unities abgeben:
|
geekv5 Mitglied Konstrukteur
Beiträge: 214 Registriert: 13.07.2011 Notebook<P>MSI GX660R Intel Core i5 460M 8GB DDR3 1GB Mobility HD5870 80GB Intel X25-M Postville 250GB HDD<P>Desktop<P>AMD Phenom II X4 965 1GB HD4890@ FirePro V8700 8GB DDR3-1600 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
|
erstellt am: 10. Nov. 2011 12:13 <-- editieren / zitieren --> Unities abgeben:
So hat ein bisschen gedauert aber es klappt.. Das Makro geht alle Körper der Reihe nach durch und löscht bei Erfolg das enthaltene Pad heraus.. Jetzt ist in dem Pad noch eine Skizze vorhanden, die er nicht mit löscht.. Gibt es einen delete Befehl, bei dem die enthaltene Skizze mit gelöscht wird, oder muss ich mich da drum herum wieseln? Edit: Versuche gerade beim Erzeugen der Skizze den Namen in ein Feld abzulegen, um dann später in meiner Löschprozedur darauf zugreifen zu können, allerdings bringt er mir bei bei folgender Zeile den Fehler "Subscript out of Range": Code:
HilfsGeo(HilfsGeoNr, 0) = PartName HilfsGeo(HilfsGeoNr, 1) = KoerperName HilfsGeo(HilfsGeoNr, 2) = pad1.Name HilfsGeo(HilfsGeoNr, 3) = sketch1.Name '<- Fehler Subscript Out Of Range, "msgbox (sketch1.Name)" gibt "Skizze.1" aus.. [code/]Code der Löschprozedur [code] Set documents1 = CATIA.Documents Dim partDocument1 As PartDocument Set partDocument1 = documents1.Item("Part1.CATPart") Dim selection1 As selection Set selection1 = partDocument1.selection Dim selection2 As selection Set selection2 = partDocument1.selection Dim pad1 As Pad Dim part1 As Part Set part1 = partDocument1.Part Dim bodies1 As Bodies Set bodies1 = part1.Bodies Dim body1 As Body Dim shapes1 As Shapes selection: selection1.Search "CATPrtSearch.BodyFeature,all" j = 1 While j < selection1.Count + 1 If selection1.Item(j).Value.Name = "body" Then Set body1 = bodies1.Item(selection1.Item(j).Value.Name) If Not body1.Shapes.Count = 0 Then Set shapes1 = body1.Shapes Dim test As String If shapes1.Item(1).Name = "geo" Then Set pad1 = shapes1.Item("geo") selection2.Clear selection2.Add pad1 selection2.Delete selection1.Clear selection1.Search "CATPrtSearch.BodyFeature,all" j = 0 End If End If End If j = j + 1 Wend End Sub
[Diese Nachricht wurde von geekv5 am 10. Nov. 2011 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. Nov. 2011 12:27 <-- editieren / zitieren --> Unities abgeben: Nur für geekv5
Servus Wäre es nicht einfach direkt nach dem Körper und Pad gleichzeitig zu suchen? selection1.Search "(CATPrtSearch.BodyFeature.Name=body & CATPrtSearch.Pad.Name=geo),all"Statt mit Schleife, zwischen Selektion zum löschen und erneuter Suche zu arbeiten? Die Zugehörige Skizze zu einem Pad solltest du über (ungetestet)zB: Set pad1 = shapes1.Item("geo") Set sketchPad = pad1.SketchBekommen (und ggf gleich selektieren) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
geekv5 Mitglied Konstrukteur
Beiträge: 214 Registriert: 13.07.2011 Notebook<P>MSI GX660R Intel Core i5 460M 8GB DDR3 1GB Mobility HD5870 80GB Intel X25-M Postville 250GB HDD<P>Desktop<P>AMD Phenom II X4 965 1GB HD4890@ FirePro V8700 8GB DDR3-1600 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
|
erstellt am: 10. Nov. 2011 12:32 <-- editieren / zitieren --> Unities abgeben:
Naja, hab mir deine Signatur zu herzen genommen Im Ernst, hätte ich gewusst, dass man nach zwei Sachen gleichzeitig suchen kann hätte ich es so gemacht.. Jetzt brauch ich erstmal nen Kaffee, dann teste ich deine Lösung 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. Nov. 2011 12:36 <-- editieren / zitieren --> Unities abgeben: Nur für geekv5
Servus ich muss mich korrigieren das gleichzeitige Suchen geht so leider nicht. Sollte aber über zwei Suchen nacheinander gehen (ungetestet): Code: Language="VBSCRIPT" Sub CATMain()Dim partDocument1 As Document Set partDocument1 = CATIA.ActiveDocument Dim selection1 As Selection Set selection1 = partDocument1.Selection dim oPad selection1.Search "(CATPrtSearch.BodyFeature.Name=body),all" selection1.Search "(CATPrtSearch.Pad.Name=geo),sel" for I = 1 to selection1.count Set oPad = selection1.item2(i).value selection1.add oPad.Sketch next selection1.delete End Sub
Gruß Bernd
------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
geekv5 Mitglied Konstrukteur
Beiträge: 214 Registriert: 13.07.2011 Notebook<P>MSI GX660R Intel Core i5 460M 8GB DDR3 1GB Mobility HD5870 80GB Intel X25-M Postville 250GB HDD<P>Desktop<P>AMD Phenom II X4 965 1GB HD4890@ FirePro V8700 8GB DDR3-1600 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
|
erstellt am: 10. Nov. 2011 12:55 <-- editieren / zitieren --> Unities abgeben:
Hm leider bekomme ich immer einen Automation Error bei selection1.Search "(CATPrtSearch.BodyFeature.Name=variable),all".. Kann das mit der Deklaration der Selektierung zusammenhängen? Code:
Dim selection1 As selection Set selection1 = productDocument1.selection
Führe das Makro nämlich in einer Produktstruktur aus.. Das oben von mir gepostete war nur ein Minimalbeispiel, was sich auf ein Part bezog.. 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. Nov. 2011 12:57 <-- editieren / zitieren --> Unities abgeben: Nur für geekv5
Servus Du musst die Zeile mit der Deklaration des Dokuments ändern (wie in deinem Urpsungsmakro): Dim partDocument1 As PartDocument Set partDocument1 = documents1.Item("Part1.CATPart")Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
geekv5 Mitglied Konstrukteur
Beiträge: 214 Registriert: 13.07.2011 Notebook<P>MSI GX660R Intel Core i5 460M 8GB DDR3 1GB Mobility HD5870 80GB Intel X25-M Postville 250GB HDD<P>Desktop<P>AMD Phenom II X4 965 1GB HD4890@ FirePro V8700 8GB DDR3-1600 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
|
erstellt am: 10. Nov. 2011 13:04 <-- editieren / zitieren --> Unities abgeben:
|
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 10. Nov. 2011 13:06 <-- editieren / zitieren --> Unities abgeben: Nur für geekv5
Servus Bist du in einem Par? Gibt es einen Körper und einen Pad mit dem entsprechenden Namen? (bei mir hat es funktioniert) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
geekv5 Mitglied Konstrukteur
Beiträge: 214 Registriert: 13.07.2011 Notebook<P>MSI GX660R Intel Core i5 460M 8GB DDR3 1GB Mobility HD5870 80GB Intel X25-M Postville 250GB HDD<P>Desktop<P>AMD Phenom II X4 965 1GB HD4890@ FirePro V8700 8GB DDR3-1600 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
|
erstellt am: 10. Nov. 2011 15:41 <-- editieren / zitieren --> Unities abgeben:
Komisch, er selektiert einfach nichts.. Habe nur ein Part offen mit einem "Hauptkörper" und einem "Körper.2", der einen "Block.1" beinhaltet. Code:
Sub CATMain()Dim partDocument1 As Document Set partDocument1 = CATIA.ActiveDocument Dim selection1 As selection Set selection1 = partDocument1.selection Dim oPad koerper = "Körper.2" geo = "Block.1" selection1.Search "(CATPrtSearch.BodyFeature.Name=koerper),all" selection1.Search "(CATPrtSearch.Pad.Name=geo),sel" MsgBox selection1.Count ' <- ist 0 For i = 1 To selection1.Count Set oPad = selection1.Item2(i).Value selection1.Add oPad.Sketch Next End Sub
Ich bin ratlos BTW. ich programmiere in VBA.. Edit: Bin jetzt mal in CATIA auf suchen und erweitert gegangen und hab mir folenden Filter erstellt: 'Part Design'.Körper.Name='Körper.2'&'Part Design'.Block.Name='Block.1' Suche ich nur nach dem "Körper.2" findet er ihn, suche ich nur nach "Block.1" findet er ihn auch, aber mit "&" verknüpft findet er nichts.. Kann das irgend eine CATIA Einstellung sein? [Diese Nachricht wurde von geekv5 am 10. Nov. 2011 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. Nov. 2011 16:33 <-- editieren / zitieren --> Unities abgeben: Nur für geekv5
Servus Das kann nicht gehen da deine Variablen in einem String (zwischen "") stehen, somit wird der nur nach "koerper" und "geo" gesucht. Versuch es mal so: Code: selection1.Search "(CATPrtSearch.BodyFeature.Name=" & koerper & "),all" selection1.Search "(CATPrtSearch.Pad.Name=" & geo & "),sel"
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. [Diese Nachricht wurde von bgrittmann am 10. Nov. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
geekv5 Mitglied Konstrukteur
Beiträge: 214 Registriert: 13.07.2011 Notebook<P>MSI GX660R Intel Core i5 460M 8GB DDR3 1GB Mobility HD5870 80GB Intel X25-M Postville 250GB HDD<P>Desktop<P>AMD Phenom II X4 965 1GB HD4890@ FirePro V8700 8GB DDR3-1600 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
|
erstellt am: 10. Nov. 2011 17:53 <-- editieren / zitieren --> Unities abgeben:
Hallo Bernd, da hätt ich eigentlich selbst drauf kommen müssen Deine Lösung funktioniert einwandfrei, einzig bei Körpern mit "-" z.B. "Koerper-1" nicht, mit Umlauten hat er allerdings keine Probleme.. Keine Ahnung ob es da noch einen Workaround gibt, ansonsten benenn ich die Körper halt einfach ohne Bindestrich, die Körper werden eh alle mit dem Makro erzeugt was später die Geometrie wieder löscht (ist nur Hilfsgeometrie wegen Veröffentlichungen und Skalierung).. Danke dir erstmal recht herzlich für deine Geduld 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: 10. Nov. 2011 18:00 <-- editieren / zitieren --> Unities abgeben: Nur für geekv5
Servus Versuch es mal mit ', zB so: Code: selection1.Search "(CATPrtSearch.BodyFeature.Name='" & koerper & "'),all" selection1.Search "(CATPrtSearch.Pad.Name='" & geo & "'),sel"
Dann sollten auch Sonderzeichen funktionieren.Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
geekv5 Mitglied Konstrukteur
Beiträge: 214 Registriert: 13.07.2011 Notebook<P>MSI GX660R Intel Core i5 460M 8GB DDR3 1GB Mobility HD5870 80GB Intel X25-M Postville 250GB HDD<P>Desktop<P>AMD Phenom II X4 965 1GB HD4890@ FirePro V8700 8GB DDR3-1600 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
|
erstellt am: 10. Nov. 2011 18:14 <-- editieren / zitieren --> Unities abgeben:
|
cevk Mitglied Entwicklung / Admin
Beiträge: 45 Registriert: 03.02.2005
|
erstellt am: 12. Dez. 2011 14:06 <-- editieren / zitieren --> Unities abgeben: Nur für geekv5
Hallo Stefan (geekv5) Du hast geschrieben: Jetzt erfasst er allerdings nur Körper auf der ersten Ebene, aber keine Körper die in einem anderen verschachtelt sind (z.B. über Zusammenbau). Das ist genau das was ich brauche, ich kann immer nur alle Bodies ansprechen, will aber nur die in der ersten Ebene haben. Vieleicht denke ich zu kompliziert aber wie hast Du das gemacht? Hast Du deinen alten Code noch? ------------------ Grüße aus dem Schwarzwald Viktor Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
geekv5 Mitglied Konstrukteur
Beiträge: 214 Registriert: 13.07.2011 Notebook<P>MSI GX660R Intel Core i5 460M 8GB DDR3 1GB Mobility HD5870 80GB Intel X25-M Postville 250GB HDD<P>Desktop<P>AMD Phenom II X4 965 1GB HD4890@ FirePro V8700 8GB DDR3-1600 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
|
erstellt am: 19. Dez. 2011 15:59 <-- editieren / zitieren --> Unities abgeben:
|
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 19. Dez. 2011 16:31 <-- editieren / zitieren --> Unities abgeben: Nur für geekv5
Servus Du könntest alle Bodies suchen, und danach prüfen ob diese in einer Booleschen-Operation verwendet wurden und dann ggf aus der Slection entfernen. zB (ungetestet): Code: Sub CATMain()Dim partDocument1 As Document Set partDocument1 = CATIA.ActiveDocument Dim selection1 As selection Set selection1 = partDocument1.selection dim oBody as Body selection1.Search "CATPrtSearch.BodyFeature,all" For i = selection1.Count to 1 Step -1 Set oBody = selection1.Item2(i).Value if oBody.InBooleanOperation then selection1.Remove2(i) end if Next End Sub
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |