Autor
|
Thema: Leere Bodies suchen, selektieren und löschen (6786 mal gelesen)
|
kalanja Mitglied Entwicklungsing.
Beiträge: 1239 Registriert: 29.10.2001 Dell Precision M3800 Mobile Workstation i7 2,2GHz - 16GB RAM Nvidia Quadro K1100 Treiber: 353.62 Windows 10 Pro (x64) V5 R21 x64 SP6
|
erstellt am: 16. Apr. 2010 11:21 <-- editieren / zitieren --> Unities abgeben:
hallo! ich bin gerade am ausmisten innerhalb von modellen. ich hab V4 modelle (baugruppen) konvertiert, wo ich eigentlich keine normteile drin haben will, damit die files kleiner und das gesamte assy performanter wird. wir sprechen hier von mehreren tausend teilen mit hunderten von normteilen. gibt es eine einfache möglichkeit nach leeren bodies zu suchen? ich hab bis jetzt nix gefunden (auch mit der forensuche). irgendwelche ideen wie ich da vorgehen könnte? die normteile lassen sich über farbe auswählen, wenn ich dann lösche, werden nur die solids innerhalb des bodies geschlöcht, die leeren bodies bleiben aber im modell. gruß mario Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
music Mitglied CATIA Anwendungsberater
Beiträge: 158 Registriert: 22.08.2002
|
erstellt am: 16. Apr. 2010 13:53 <-- editieren / zitieren --> Unities abgeben: Nur für kalanja
|
kalanja Mitglied Entwicklungsing.
Beiträge: 1239 Registriert: 29.10.2001 Dell Precision M3800 Mobile Workstation i7 2,2GHz - 16GB RAM Nvidia Quadro K1100 Treiber: 353.62 Windows 10 Pro (x64) V5 R21 x64 SP6
|
erstellt am: 16. Apr. 2010 16:03 <-- editieren / zitieren --> Unities abgeben:
|
bgrittmann Moderator Konstrukteur
Beiträge: 11849 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 16. Apr. 2010 17:05 <-- editieren / zitieren --> Unities abgeben: Nur für kalanja
Servus Oder kurz ein Makro dafür schreiben Der kern des Makros könnte so aussehen: Code: Language="VBSCRIPT"Sub CATMain() Set oDoc = CATIA.ActiveDocument Set oPart = oDoc.Part Set oSel = oDoc.Selection oSel.clear 'Schleife über alle Bodies for x = oPart.bodies.count to 1 step -1 Set oBody = oPart.bodies.item(x) if oBody.shapes.count =0 then oSel.add oBody oSel.delete oSel.clear end if next End Sub
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. [Diese Nachricht wurde von bgrittmann am 16. Apr. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kalanja Mitglied Entwicklungsing.
Beiträge: 1239 Registriert: 29.10.2001 Dell Precision M3800 Mobile Workstation i7 2,2GHz - 16GB RAM Nvidia Quadro K1100 Treiber: 353.62 Windows 10 Pro (x64) V5 R21 x64 SP6
|
erstellt am: 19. Apr. 2010 08:23 <-- editieren / zitieren --> Unities abgeben:
|
eckhaard Mitglied Dipl.Ing.
Beiträge: 137 Registriert: 02.11.2003
|
erstellt am: 21. Jul. 2015 11:07 <-- editieren / zitieren --> Unities abgeben: Nur für kalanja
|
cimnese Mitglied --
Beiträge: 45 Registriert: 13.10.2009 Catia V5 SP7 R20
|
erstellt am: 23. Jul. 2015 07:13 <-- editieren / zitieren --> Unities abgeben: Nur für kalanja
|
Trilemma Mitglied staatl. gepr. Techniker
Beiträge: 255 Registriert: 20.08.2010 Catia V5 R19 SP8 Windows7 64bit 12GB 2,93GHz Dell Precision T3500
|
erstellt am: 23. Jul. 2015 07:59 <-- editieren / zitieren --> Unities abgeben: Nur für kalanja
Versuch das mal, is allerdings VS2010 Code:
Private Sub Button5_Click(sender As System.Object, e As System.EventArgs) Handles Button5.Click Dim CATIA CATIA = GetObject(, "CATIA.application") Dim oDoc Dim oPart Dim oSel Dim oGeoSet oDoc = CATIA.ActiveDocument oPart = oDoc.Part oSel = oDoc.Selection oSel.clear() 'Schleife über alle GeoSets For x = oPart.HybridBodies.count To 1 Step -1 oGeoSet = oPart.HybridBodies.item(x) If oGeoSet.HybridShapes.Count = 0 And oGeoSet.HybridSketches.Count = 0 Then oSel.add(oGeoSet) oSel.delete() oSel.clear() End If Next MsgBox("Makro is' fertig!") End Sub
Gruß Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11849 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 23. Jul. 2015 08:18 <-- editieren / zitieren --> Unities abgeben: Nur für kalanja
Servus Peter Kleine Ergänzung dazu: ich würde noch prüfen ob in dem GeoSet keine weiteren GeoSets sind: Code: If oGeoSet.HybridShapes.Count = 0 And oGeoSet.HybridSketches.Count = 0 And oGeoSet.HybridBodies.count = 0 Then
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Trilemma Mitglied staatl. gepr. Techniker
Beiträge: 255 Registriert: 20.08.2010 Catia V5 R19 SP8 Windows7 64bit 12GB 2,93GHz Dell Precision T3500
|
erstellt am: 23. Jul. 2015 08:41 <-- editieren / zitieren --> Unities abgeben: Nur für kalanja
|
RSchulz Moderator² Head of CAD, Content & Collaboration / IT-Manager
Beiträge: 5541 Registriert: 12.04.2007 @Work Lenovo P510 Xeon E5-1630v4 64GB DDR4 Quadro P2000 256GB PCIe SSD 512GB SSD SmarTeam V5-6 R2016 Sp04 CATIA V5-6 R2016 Sp05 E3.Series V2019 Altium Designer/Concord 19 Win 10 Pro x64
|
erstellt am: 23. Jul. 2015 08:51 <-- editieren / zitieren --> Unities abgeben: Nur für kalanja
Hallo zusammen, schau mal hier, da sollte so ziemlich alles drin sein, was dieses Thema abdeckt...
Code:
Public Function Check_Part_IsEmpty(ByVal CheckPart As MECMOD.Part, Optional ByRef EmptyElements() As String = Nothing, Optional ByRef isSurfaceModel As Boolean = False) As Boolean '------------------------------------------------------------------------------- ' checks if the Part is not empty '------------------------------------------------------------------------------- ' True = Part is empty ' False = Part is not empty ' Optional EmptyElements: Returns a List of Empty Features and Bodies ' Optional isSurfaceModel: Returns if Body(solid) or HybridBody(only surfaces) is used '------------------------------------------------------------------------------- Dim oBodies As MECMOD.Bodies Dim oBody As MECMOD.Body Dim oHybBody As MECMOD.HybridBody Dim oHybBodies As MECMOD.HybridBodies Dim oSketches As MECMOD.Sketches Dim oSketch As MECMOD.Sketch Dim i As Integer = 0 Dim FoundGeometry As Boolean = False Dim FoundSurfaces As Boolean = False Dim IsEmpty As Boolean = True Try oBodies = CheckPart.Bodies For Each oBody In oBodies If oBody.Shapes.Count = 0 And oBody.Sketches.Count = 0 And oBody.HybridBodies.Count = 0 Then If IsNothing(EmptyElements) = False Then EmptyElements(EmptyElements.Count - 1) = "Körper" & "Ÿ" & oBody.Name & "Ÿ" & CheckPart.Name & "\" & oBody.Name ReDim Preserve EmptyElements(EmptyElements.Count) End If Else If oBody.Sketches.Count <> 0 Then oSketches = oBody.Sketches For i = 1 To oSketches.Count oSketch = oSketches.Item(i) If oSketch.GeometricElements.Count = 0 Then If IsNothing(EmptyElements) = False Then EmptyElements(EmptyElements.Count - 1) = "Skizze" & "Ÿ" & oSketch.Name & "Ÿ" & CheckPart.partnumber & "\" & oBody.Name & "\" & oSketch.Name ReDim Preserve EmptyElements(EmptyElements.Count) End If End If Application.DoEvents() Next End If FoundGeometry = True IsEmpty = False End If Application.DoEvents() Next oHybBodies = CheckPart.HybridBodies For Each oHybBody In oHybBodies If oHybBody.HybridShapes.Count = 0 And oHybBody.HybridSketches.Count = 0 And oHybBody.HybridBodies.Count = 0 Then If IsNothing(EmptyElements) = False Then EmptyElements(EmptyElements.Count - 1) = "Körper" & "Ÿ" & oHybBody.Name & "Ÿ" & CheckPart.Name & "\" & oHybBody.Name ReDim Preserve EmptyElements(EmptyElements.Count) End If Else If oHybBody.HybridShapes.Count <> 0 Then FoundSurfaces = True End If IsEmpty = False End If Application.DoEvents() Next If FoundGeometry = False And FoundSurfaces = True Then isSurfaceModel = True End If Return IsEmpty Catch ex As Exception EmptyElements(EmptyElements.Count - 1) = "Fehler" & "Ÿ" & "Fehler" & "Ÿ" & "Fehler" ReDim Preserve EmptyElements(EmptyElements.Count) Return IsEmpty MsgBox(ex.ToString, MsgBoxStyle.Critical, "Fehler in Functions: Check_Part_IsEmpty") End Try End Function
Das ganze ist wohl im .Net und gehört zu einer Eigenentwicklung ala QChecker; sollte aber alles auch für VBA ableitbar sein... ------------------ MFG Rick Schulz Nettiquette (CAD.de) - Was ist die Systeminfo? - Wie man Fragen richtig stellt. - Unities
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator 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. Jul. 2015 11:43 <-- editieren / zitieren --> Unities abgeben: Nur für kalanja
Hallo Leut, ich hab mal versucht die Quersumme aus den bisherigen Lösch-Beiträgen zusammen zu fassen. Ergebnis nachfolgend:
Code:
Dim oSel As SelectionSub CATMain() Dim oDoc As PartDocument Dim oPart As Part Dim oBody As Body Dim oHB As HybridBody Dim n As Integer Set oDoc = CATIA.ActiveDocument Set oPart = oDoc.Part Set oSel = oDoc.Selection CATIA.RefreshDisplay = False DelEmptyGeoSets oPart oSel.Clear 'Schleife über alle Bodies For n = oPart.Bodies.Count To 1 Step -1 Set oBody = oPart.Bodies.Item(n) DelEmptyGeoSets oBody If (oBody.Shapes.Count + oBody.hybridBodies.Count + oBody.Sketches.Count = 0) _ And Not (oBody Is oPart.MainBody) Then oSel.Add oBody 'Debug.Print oBody.Name oSel.Delete oSel.Clear End If Next CATIA.RefreshDisplay = True oPart.Update DoEvents End Sub Function DelEmptyGeoSets(oParent As Object) As Integer Dim oHB As HybridBody Dim n As Integer Dim i As Integer oSel.Clear 'part-hybrid-bodies For n = oParent.hybridBodies.Count To 1 Step -1 Set oHB = oParent.hybridBodies.Item(n) If oHB.hybridBodies.Count > 0 Then DelEmptyGeoSets oHB If (oHB.GeometricElements.Count + oHB.HybridSketches.Count + oHB.HybridShapes.Count) = 0 Then oSel.Add oHB i = i + 1 'Debug.Print oHB.Name oSel.Delete oSel.Clear End If Next DelEmptyGeoSets = i End Function
Das Skript löscht zuerst alle leeren Geosets im Part, danach alle leeren Parts. Falls ein Geoset im Geoset im Part liegt etc., wird das auch rekursiv untersucht. Berichtet! Enjoy, Joe
------------------ The problem with the world is that the intelligent people are full of doubts, while the stupid ones are full of confidence. ~Charles Bukowski Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Trilemma Mitglied staatl. gepr. Techniker
Beiträge: 255 Registriert: 20.08.2010 Catia V5 R19 SP8 Windows7 64bit 12GB 2,93GHz Dell Precision T3500
|
erstellt am: 23. Jul. 2015 12:02 <-- editieren / zitieren --> Unities abgeben: Nur für kalanja
|
joehz Moderator 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. Jul. 2015 13:46 <-- editieren / zitieren --> Unities abgeben: Nur für kalanja
Hallo Peter, zu Fall 2: Heisst das, dass der Set gelöscht wird? Tschau, Joe ------------------ The problem with the world is that the intelligent people are full of doubts, while the stupid ones are full of confidence. ~Charles Bukowski [Diese Nachricht wurde von joehz am 23. Jul. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Trilemma Mitglied staatl. gepr. Techniker
Beiträge: 255 Registriert: 20.08.2010 Catia V5 R19 SP8 Windows7 64bit 12GB 2,93GHz Dell Precision T3500
|
erstellt am: 23. Jul. 2015 13:48 <-- editieren / zitieren --> Unities abgeben: Nur für kalanja
|
cimnese Mitglied --
Beiträge: 45 Registriert: 13.10.2009 Catia V5 SP7 R20
|
erstellt am: 23. Jul. 2015 14:45 <-- editieren / zitieren --> Unities abgeben: Nur für kalanja
|
joehz Moderator 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. Jul. 2015 15:11 <-- editieren / zitieren --> Unities abgeben: Nur für kalanja
OK. Zweiter Versuch. Fall2: Code:
Dim oSel As SelectionSub CATMain() Dim oDoc As PartDocument Dim oPart As Part Dim oBody As Body Dim oHB As HybridBody Dim n As Integer Set oDoc = CATIA.ActiveDocument Set oPart = oDoc.Part Set oSel = oDoc.Selection CATIA.RefreshDisplay = False DelEmptyGeoSets oPart oSel.Clear 'Schleife über alle Bodies For n = oPart.Bodies.Count To 1 Step -1 Set oBody = oPart.Bodies.Item(n) DelEmptyGeoSets oBody If (oBody.Shapes.Count + oBody.hybridBodies.Count + oBody.Sketches.Count = 0) _ And Not (oBody Is oPart.MainBody) Then oSel.Add oBody ' Debug.Print oBody.Name oSel.Delete oSel.Clear End If Next CATIA.RefreshDisplay = True oPart.Update ' DoEvents End Sub Function DelEmptyGeoSets(oParent As Object) As Integer Dim oHB As HybridBody Dim n As Integer Dim i As Integer oSel.Clear 'part-hybrid-bodies For n = oParent.hybridBodies.Count To 1 Step -1 Set oHB = oParent.hybridBodies.Item(n) If oHB.hybridBodies.Count > 0 Then DelEmptyGeoSets oHB If (oHB.GeometricElements.Count + oHB.HybridSketches.Count + _ oHB.HybridShapes.Count + oHB.hybridBodies.Count) = 0 Then oSel.Add oHB i = i + 1 ' Debug.Print oHB.Name oSel.Delete oSel.Clear End If Next DelEmptyGeoSets = i End Function
Ich hab die Abfrage um HybridBodies erweitert. Ausserdem Hab ich die 'Debug.Print' und 'DoEvents' - Anweisungen auskommentiert. Die Skript-Engine mag die scheinbar nicht. @cimnese: Entweder den Code komplett in eine Textdatei(Notepad) kopieren und als 'DelEmptyBodies.CATScript' abspeichern oder den Code im VBA-Editor in ein leeres Modul kopieren, Modul umbenennen, abspeichern. Letztere Lösung kommt für Dich im Moment wohl weniger in Frage. Have fun. Joe ------------------ The problem with the world is that the intelligent people are full of doubts, while the stupid ones are full of confidence. ~Charles Bukowski Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cimnese Mitglied --
Beiträge: 45 Registriert: 13.10.2009 Catia V5 SP7 R20
|
erstellt am: 23. Jul. 2015 15:45 <-- editieren / zitieren --> Unities abgeben: Nur für kalanja
|
joehz Moderator 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. Jul. 2015 16:13 <-- editieren / zitieren --> Unities abgeben: Nur für kalanja
Hallo Leut', Ich hab das Makro testhalber auf ein BMW-Grundmodell angewandt. Falls die Modell-Struktur so aussieht, wie auf dem Bild: Nachher sieht die Struktur anders aus :-) Ob das OK ist, mus jeder selber wissen. Tschau, Joe ------------------ The problem with the world is that the intelligent people are full of doubts, while the stupid ones are full of confidence. ~Charles Bukowski Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Trilemma Mitglied staatl. gepr. Techniker
Beiträge: 255 Registriert: 20.08.2010 Catia V5 R19 SP8 Windows7 64bit 12GB 2,93GHz Dell Precision T3500
|
erstellt am: 24. Jul. 2015 06:39 <-- editieren / zitieren --> Unities abgeben: Nur für kalanja
|
joehz Moderator 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: 24. Jul. 2015 11:25 <-- editieren / zitieren --> Unities abgeben: Nur für kalanja
|
Nutzvieh Mitglied Entwicklungskonstrukteur
Beiträge: 4 Registriert: 23.05.2016 Windows 7 Professional SP1 64 Bit Intel Xeon 3,7GHz 64GB RAM Catia V5 R26
|
erstellt am: 09. Feb. 2018 06:52 <-- editieren / zitieren --> Unities abgeben: Nur für kalanja
Hallo zusammen. Ich muss jetzt mal den alten Beitrag rauskramen und ich hoffe das mir noch jemand weiterhelfen kann. Bei der suche nach einem Makro, das mir leere Geo-Sets löscht bin ich über das von Joe gestolpert. Funktioniert soweit ganz gut. Danke dafür. Was mir aber aufgefallen ist, leider löscht das Makro auch Geo-Sets in denen sich nur ein Axis System befindet. Über den Sinn nur ein Axis System in einem Geo-Set zu haben lässt sich bestimmt streiten. Kommt aber durchaus mal vor. Jetzt bin ich nach wie vor leider nicht so bewandert mit der Makro-Programmierung um das selbst auszubessern. Ich haben versucht es da einzufügen wo es mir logisch erschien. Das hat dann aber dazu geführt das es nicht mehr funktionierte. Eingefügt hab ich folgendes: Zitat: Function DelEmptyGeoSets(oParent As Object) As Integer Dim oHB As HybridBody Dim n As Integer Dim i As Integer oSel.Clear 'part-hybrid-bodies For n = oParent.hybridBodies.Count To 1 Step -1 Set oHB = oParent.hybridBodies.Item(n) If oHB.hybridBodies.Count > 0 Then DelEmptyGeoSets oHB If (oHB.GeometricElements.Count + oHB.HybridSketches.Count + _ oHB.HybridShapes.Count + oHB.hybridBodies.Count + o.HB.AxisSystems.Count) = 0 Then oSel.Add oHB i = i + 1 ' Debug.Print oHB.Name oSel.Delete oSel.Clear End If Next DelEmptyGeoSets = i End Function
War aber nicht so wirklich zielführend. Ist vielleicht jemand hier der mir sagen kann was nicht passt und wie ich es fixe? Wäre sehr nett. Schon mal Danke. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11849 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 11. Feb. 2018 12:38 <-- editieren / zitieren --> Unities abgeben: Nur für kalanja
Servus AFAIR kann man Achsensystem in GeoSet nicht direkt ansprechen. Das geht vermutlich über den komplexeren Umweg: GeoSet selektieren und per Suche nach den Achsensystem in der Selektion suchen. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |