| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für CATIA & Co. |
| |
 | KISTERS 3DViewStation: Unterstützung für 3D CAD Kollaboration mit Lieferanten, eine Pressemitteilung
|
Autor
|
Thema: Körper per Catscript mehrmals entfernen! (2420 mal gelesen)
|
ChristianWW Mitglied KONSTRUKTEUR/ CAM PROGRAMMIERER

 Beiträge: 31 Registriert: 21.10.2013
|
erstellt am: 22. Jan. 2015 14:36 <-- editieren / zitieren --> Unities abgeben:         
Hallo, Ausgangssituation: 1. Ich habe ein Part mit mehreren Bodies geöffnet. 2.Im Strukturbaum des Parts steht an erster Stelle der Body mit dem Namen AZK_Beschriftung in dem eine Skizze+Block sich befindet.Unter diesem befinden sich weitere Bodies mit isolieren Volumen.( können 2 oder auch mal 20 sein ). 3. Nun möchte ich per Makro den Body AZK_Beschriftung der Reihe nach von jedem noch vorhandenem Body abziehen(Entfernen mit Boolscher Operation). Im Angehängten Bild sieht man meine Ausgangssituation. Hoffe ihr könnt mit helfen
Mfg Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
       
 Beiträge: 12054 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 22. Jan. 2015 15:02 <-- editieren / zitieren --> Unities abgeben:          Nur für ChristianWW
Servus Ich würde so vorgehen: - MainBody in Bearbeitung setzen - Schleife über alle Körper - für jeden Körper prüfen: - Körper ist nicht der MainBody - Körper ist nicht "verboolet" - Körper ist nicht leer - Körper mit "AddNewRemove" abziehenUps, Frage falsch gelesen Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ChristianWW Mitglied KONSTRUKTEUR/ CAM PROGRAMMIERER

 Beiträge: 31 Registriert: 21.10.2013
|
erstellt am: 22. Jan. 2015 15:08 <-- editieren / zitieren --> Unities abgeben:         
Hallo, das ging ja flott Ich hab mal was zusammen geschrieben was mir schon mal den ersten körper überspringt und die restlich in der Msgbox ausgibt. Weiter komm ich nicht!!!! Sub CATMain()
Dim partDocument1 As Document Set partDocument1 = CATIA.ActiveDocument Dim part1 As Part Set part1 = partDocument1.Part Dim bodies1 As Bodies Set bodies1 = part1.Bodies Dim bodies2 As Bodies Set bodies2 = part1.Bodies Dim body1 As Body Set body1 = bodies1.Item("AZK_SCHRIFT") set Selection1 = CATIA.ActiveDocument.Selection selection1.Search "CATPrtSearch.BodyFeature,all" Dim Imax As Integer Imax = selection1.Count For n = 2 To Imax Set body2 = selection1.Item(n).value MsgBox body2.name next End Sub Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
       
 Beiträge: 12054 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 22. Jan. 2015 17:00 <-- editieren / zitieren --> Unities abgeben:          Nur für ChristianWW
Servus Ich würde nicht über die Selektion gehen sondern über die Bodies-Collection (ungetestet): Code: Sub CATMain()Dim partDocument1 As Document Set partDocument1 = CATIA.ActiveDocument Dim part1 As Part Set part1 = partDocument1.Part Dim shapeFactory1 As ShapeFactory Set shapeFactory1 = part1.ShapeFactory Dim bodies1 As Bodies Set bodies1 = part1.Bodies Dim RemoveBody As Body Set RemoveBody = bodies1.Item("AZK_SCHRIFT") dim oBody as Body for each oBody in bodies1 if oBody <> RemoveBody then 'Body in Bearbeitung setzen part1.bodies1 = oBody Dim remove1 As Remove Set remove1 = shapeFactory1.AddNewRemove(body2) part1.Update end if next End Sub
Vorsicht: Der Abzugskörper darf nicht der MainBody sein. Gruß Bernd
------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ChristianWW Mitglied KONSTRUKTEUR/ CAM PROGRAMMIERER

 Beiträge: 31 Registriert: 21.10.2013
|
erstellt am: 22. Jan. 2015 17:10 <-- editieren / zitieren --> Unities abgeben:         
|
bgrittmann Moderator Konstrukteur
       
 Beiträge: 12054 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 22. Jan. 2015 17:23 <-- editieren / zitieren --> Unities abgeben:          Nur für ChristianWW
|
ChristianWW Mitglied KONSTRUKTEUR/ CAM PROGRAMMIERER

 Beiträge: 31 Registriert: 21.10.2013
|
erstellt am: 23. Jan. 2015 07:09 <-- editieren / zitieren --> Unities abgeben:         
Guten Morgen, so Systeminfo ausgefüllt sorry hatte ich vergessen. if oBody isNot RemoveBody then bzw. if oBody is Not RemoveBody then funktioniert auch nicht. Es kommt die gleiche Fehlermeldung.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
       
 Beiträge: 12054 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 23. Jan. 2015 07:42 <-- editieren / zitieren --> Unities abgeben:          Nur für ChristianWW
|
ChristianWW Mitglied KONSTRUKTEUR/ CAM PROGRAMMIERER

 Beiträge: 31 Registriert: 21.10.2013
|
erstellt am: 23. Jan. 2015 07:50 <-- editieren / zitieren --> Unities abgeben:         
|
joehz Mitglied Freiberuflicher Konstrukteur
   
 Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 23. Jan. 2015 14:02 <-- editieren / zitieren --> Unities abgeben:          Nur für ChristianWW
Hallo Christian, worum ich Dich gerne bitten würde: Zeichne bitte mit dem Makro-Rekorder auf, wie Du bisher vorgegangen bist. Anders ausgedrückt: Zeige mir, dass es möglich ist, ein-und-denselben Body von verschiedenen anderen Bodies abzuziehen. Ich glaub Dir nicht. Tschau, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
       
 Beiträge: 12054 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 23. Jan. 2015 14:10 <-- editieren / zitieren --> Unities abgeben:          Nur für ChristianWW
Servus Christian Hast du schon versucht das Makro zu verstehen? (gemäß Kommentar sollte da zB "InWorkObject" irgendwie rein) @Joe: Mehrfaches entfernen von einem Körper geht. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Mitglied Freiberuflicher Konstrukteur
   
 Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 23. Jan. 2015 15:30 <-- editieren / zitieren --> Unities abgeben:          Nur für ChristianWW
Hallo Bernd, I stand corrected. Da geht tatsächlich makro-technisch mehr als händisch. Code:
Sub RemoveMulti() Dim oAD As Document Dim oADP As Part Dim oBds As Bodies Dim RemoveBody As Body 'body to remove Dim oSF As ShapeFactory Dim oBody As Body 'body to remove from Dim oRemv As Remove 'remove op Set oAD = CATIA.ActiveDocument Set oADP = oAD.Part Set oSF = oADP.ShapeFactory Set oBds = oADP.Bodies Set RemoveBody = oBds.Item("StarDustBody") For Each oBody In oBds If (oBody.Name = "StarDustBody" = False) _ And (oBody.Name = "PartBody" = False) Then oADP.InWorkObject = oBody 'Body in Bearbeitung setzen Set oRemv = oSF.AddNewRemove(RemoveBody) oADP.Update End If Next End Sub
Tschau, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ChristianWW Mitglied KONSTRUKTEUR/ CAM PROGRAMMIERER

 Beiträge: 31 Registriert: 21.10.2013
|
erstellt am: 28. Jan. 2015 08:34 <-- editieren / zitieren --> Unities abgeben:         
|
joehz Mitglied Freiberuflicher Konstrukteur
   
 Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 28. Jan. 2015 13:15 <-- editieren / zitieren --> Unities abgeben:          Nur für ChristianWW
Ich hab jetzt mal die Anregung vom Bernd aufgegriffen und die If-Abfrage abgeändert. Dummerweise folgt Catia/VB nicht der angebotenen Logik. Sowohl für MainBody als auch für RemoveBody wird immer beim Vergleich mit oBody 'False' zurückgegeben. Irgendwie funktioniert der Vergleich mit oBody so nicht, sprich produziert falsche Ergebnisse. Code:
Sub RemoveMulti() Dim oAD As Document Dim oADP As Part Dim oBds As Bodies Dim RemoveBody As Body 'body to remove Dim oSF As ShapeFactory Dim oBody As Body 'body to remove from Dim oRemv As Remove 'remove op Set oAD = CATIA.ActiveDocument Set oADP = oAD.Part Set oSF = oADP.ShapeFactory Set oBds = oADP.Bodies Set RemoveBody = oBds.Item("StarDustBody") For Each oBody In oBds If Not(oBody is RemoveBody ) And Not(oBody is oADP.MainBody) Then 'If (oBody.Name = "StarDustBody" = False) _ And (oBody.Name = "PartBody" = False) Then oADP.InWorkObject = oBody 'Body in Bearbeitung setzen Set oRemv = oSF.AddNewRemove(RemoveBody) oADP.Update End If Next End Sub
@Bernd: Hast Du ein funktionierendes Beispiel? (Scratching head...) Joe
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Mitglied Freiberuflicher Konstrukteur
   
 Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 28. Jan. 2015 15:52 <-- editieren / zitieren --> Unities abgeben:          Nur für ChristianWW
Ich leg nochmal nach. So funktioniert's: Code:
Sub RemoveMulti() Dim oAD As Document Dim oADP As Part Dim oBds As Bodies Dim RemoveBody As Body 'body to remove Dim oSF As ShapeFactory Dim oBody As Body 'body to remove from Dim oRemv As Remove 'remove op Dim i As Integer Set oAD = CATIA.ActiveDocument Set oADP = oAD.Part Set oSF = oADP.ShapeFactory Set oBds = oADP.Bodies Set RemoveBody = oBds.Item("StarDustBody") ' For Each oBody In oBds For i = 1 To oBds.Count Set oBody = oBds.Item(i) If Not (oBody Is RemoveBody) And Not (oBody Is oADP.MainBody) Then 'If (oBody.Name = "StarDustBody" = False) _ And (oBody.Name = "PartBody" = False) Then oADP.InWorkObject = oBody 'Body in Bearbeitung setzen Set oRemv = oSF.AddNewRemove(RemoveBody) oADP.Update End If Next End Sub
Jetzt stellt sich die Frage, was Catia an der For-Each-Version nicht mag. Aus der Online-Hilfe zu For-Each
Zitat:
SyntaxFor Each element In group [statements] [Exit For] [statements] Next [element] For collections, element can only be aVariant variable, a generic object variable, or any specific object variable. For arrays, element can only be a Variant variable.
Ich hab nach und nach alle 'as Body'-Deklarationen auskommentiert. Trotzdem: No cigar. Tschau, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Mitglied Freiberuflicher Konstrukteur
   
 Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 28. Jan. 2015 19:16 <-- editieren / zitieren --> Unities abgeben:          Nur für ChristianWW
Hab's gefunden. Es waren tatsächlich die Deklarationen. So ffunktioniert's:
Code:
Sub RemoveMulti() Dim oAD As Document Dim oADP As Object 'Part Dim oBds As Object 'Bodies Dim RemoveBody As Body 'body to remove Dim oSF As ShapeFactory Dim oBody As Body 'body to remove from Dim oRemv As Remove 'remove op Set oAD = CATIA.ActiveDocument Set oADP = oAD.Part Set oSF = oADP.ShapeFactory Set oBds = oADP.Bodies Set RemoveBody = oBds.Item("StarDustBody") For Each oBody In oBds If Not (oBody Is RemoveBody) And Not (oBody Is oADP.MainBody) Then oADP.InWorkObject = oBody 'Body in Bearbeitung setzen Set oRemv = oSF.AddNewRemove(RemoveBody) oADP.Update End If Next End Sub
Die meisten Beispiele im I-Net vergleichen mit Part.Body.Name. Jetzt weiss ich warum. Tschau, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |