| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
 | Von Digital Twins bis Hochleistungs-Computing: PNY präsentiert seine Zukunftstechnologien für die Industrie von morgen, eine Pressemitteilung
|
Autor
|
Thema: Blöcke auf Layern auswählen (710 mal gelesen)
|
Jowo76 Mitglied

 Beiträge: 16 Registriert: 09.12.2008 AutoCad 2007, 2008, 2009
|
erstellt am: 29. Jul. 2009 09:34 <-- editieren / zitieren --> Unities abgeben:         
Guten Morgen, wieder wende ich mich an Euch. Ich habe mehrere Layer (layer 1 bis layer x) auf denen Blöcke liegen. Die Blöcke sind in diesem Fall teilweise mit und teilweise ohne Attribute. Nun muss ich alle Blöcke, welche auf diesen Layern liegen aus der Zeichnung löschen. Ich hatte mir das so vorgestellt und bin natürlich gegen die Wand gerannt: Dim Sset As AcadSelectionSet Dim obj As AcadBlockReference Dim ftype As Integer Dim fdata As Variant ftype = 2 fdata = "Layer" & "*"
Set Sset = ThisDrawing.SelectionSets.Add("select")
Sset.Select acSelectionSetAll, , , ftype, fdata For Each obj In Sset obj.Delete Next Sset.Delete Bitte um Gedankenstoß in die richtige Richtung. ------------------ Jowo76 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 29. Jul. 2009 09:50 <-- editieren / zitieren -->
Hi, fast richtig, aber der Filter muss ein Array sein, also richtig: Code: Dim ftype(0) As Integer Dim fdata(0) As Variant... ftype(0) = 2 fdata(0) = "Layer*"
- alfred - ------------------ www.hollaus.at |
Jowo76 Mitglied

 Beiträge: 16 Registriert: 09.12.2008 AutoCad 2007, 2008, 2009
|
erstellt am: 29. Jul. 2009 09:53 <-- editieren / zitieren --> Unities abgeben:         
|
Jowo76 Mitglied

 Beiträge: 16 Registriert: 09.12.2008 AutoCad 2007, 2008, 2009
|
erstellt am: 29. Jul. 2009 10:40 <-- editieren / zitieren --> Unities abgeben:         
Noch eine Frage: Die Blöcke werden jetzt gelöscht. Wie muss ich die Filter definieren damit auch Regionen und 3d-Objekte auf diesen Layern gelöscht werden? habs so versucht, aber die Kreise(Regionen) bleiben. ftype(0) = -4 ftype(1) = -4 ftype(2) = 2 ftype(3) = 0 ftype(4) = -4 ftype(5) = -4 fdata(0) = "<AND" fdata(1) = "<OR" fdata(2) = "Layer*" fdata(3) = "circle" fdata(4) = "OR>" fdata(5) = "AND>" ------------------ Jowo76 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 29. Jul. 2009 10:41 <-- editieren / zitieren -->
BTW wenn Du nach Layernamen filtern willst, dann muss ftype(0) = 8 sein, der DXFCode 2 steht für Namen wie Blockname o.ä. - alfred - ------------------ www.hollaus.at |
Ex-Mitglied
|
erstellt am: 29. Jul. 2009 11:09 <-- editieren / zitieren -->
Hi, also Deines lass ich mal aus. Code: Dim ftype(1) As Integer Dim fdata(1) As Variant... ftype(0) = 8 'Layernamen-Filter fdata(0) = "Layer*" ftype(1) = 0 'Geometrietyp-Filter fdata(1) = "REGION,CIRCLE,INSERT"
Du kannst im Filter, wie oben gezeigt, die Elementtypen (oder Layernamen) einfach mit Komma hintereinanderschreiben, das gleicht einer OR Bedingung. Für 3D-Objekte kann ich Dir keine pauschale Antwort geben, denn deren gibt es viele und da gibt's nicht einen Objekttyp dafür, der alles 3D-artige umfasst. - alfred - ------------------ www.hollaus.at |
Jowo76 Mitglied

 Beiträge: 16 Registriert: 09.12.2008 AutoCad 2007, 2008, 2009
|
erstellt am: 29. Jul. 2009 11:13 <-- editieren / zitieren --> Unities abgeben:         
|
Jowo76 Mitglied

 Beiträge: 16 Registriert: 09.12.2008 AutoCad 2007, 2008, 2009
|
erstellt am: 29. Jul. 2009 11:33 <-- editieren / zitieren --> Unities abgeben:         
Hallo Alfred, nun bekomme ich die Fehlermeldung Typen unverträglich. Das Programm steigt bei der Zeile "For each obj in Sset .." aus. Das selectionset im Überwachunsfenster hat aber 2840 Einträge(kommt ungefähr hin) und erkennt diese als Regionen und Kreise. Die 3d-Objekte sind Zylinder (erstellt mit .AddExtrudedSolid).
Bitte nochmals um Deine Hilfe ------------------ Jowo76 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 29. Jul. 2009 11:43 <-- editieren / zitieren -->
Hi, wie hast Du denn 'obj' deklariert? Wenn Du nicht weisst, wie AutoCAD die Elemente intern nennt bzw, die Namen, die Du bei Geometrietyp im Filter eintragen musst, dann kannst Du in der Befehlszeile eingeben: (entget (car (entsel))) ...damit bekommst Du die Lisp-Schreibweise der Elemente und kannst nachsehen, nach welchen Eigenschaften Du filtern kannst. Weitere Gefahr mit 'For ... Each' im Zusammenhang mit Löschen ==> Du hast ein Buch vor Dir liegen, Du reisst die Seite 1 raus und gibst dann 'den Befehl' auf die nächste Seite zu blättern ==> da kann jetzt sein: a) Du verlangst von einer Seite, die nicht mehr existiert, die Seitennummer, damit Du weisst, welches die nächste ist b) Du landest auf Seite 3 (und bist komfortabel die Seite 2 übersprungen) Also bei Löschen immer kritisch sein und ev. anders herum aufzäumen: Code: Dim i as Integer For i = tSSet.Count -1 To 0 Step -1 tSSet(i).Delete Next
...ist zwar eine Spur langsamer, aber damit zerstörst Du keine internen Pointer! - alfred -
------------------ www.hollaus.at [Diese Nachricht wurde von a.n. am 29. Jul. 2009 editiert.] |
Jowo76 Mitglied

 Beiträge: 16 Registriert: 09.12.2008 AutoCad 2007, 2008, 2009
|
erstellt am: 29. Jul. 2009 11:48 <-- editieren / zitieren --> Unities abgeben:         
|
Jowo76 Mitglied

 Beiträge: 16 Registriert: 09.12.2008 AutoCad 2007, 2008, 2009
|
erstellt am: 29. Jul. 2009 13:06 <-- editieren / zitieren --> Unities abgeben:         
Und nochmal bin ich hier. Es funktioniert nun alles .. bis auf die Zylinder, die sind hartnäckig und bleiben am Papier. Diese werden als "3DSOLID" bezeichnet. (hab ich dann mit "(cdr(assoc 0(entget(entlast))))" ermittelt dein Code wollte nicht) Hier nochmal mein Code ... vielleicht hilft das:
Dim Sset As AcadSelectionSet Dim ftype(0 To 2) As Integer Dim fdata(0 To 2) As Variant ftype(0) = 8 ftype(1) = 0 ftype(2) = 100 'Ich habe hier keine Ahnung welcher Wert hier richtig ist fdata(0) = "Layer*" fdata(1) = "REGION,CIRCLE,INSERT" fdata(2) = "3DSOLID" Set Sset = ThisDrawing.SelectionSets.Add("select") Sset.Select acSelectionSetAll, , , ftype, fdata Dim i As Integer For i = Sset.Count - 1 To 0 Step -1 Sset(i).Delete Next Sset.Delete ThisDrawing.Regen acActiveViewport ------------------ Jowo76 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 29. Jul. 2009 13:12 <-- editieren / zitieren -->
Hi, Zitat: dein Code wollte nicht
...Danke für den Hinweis, aber es war nur eine Klammer am Ende zu wenig (hab's auch schon korrigiert). Zitat:
fdata(0) = "Layer*" fdata(1) = "REGION,CIRCLE,INSERT" fdata(2) = "3DSOLID"
==> damit machst Du aus ODER ein UND ==> selektiere Elemente die 'region' (oder 'circle' oder 'insert') UND gleichzeitig '3DSOLID' sind, dass das nicht geht, ist klar. Also: Zitat: fdata(0) = "Layer*" fdata(1) = "REGION,CIRCLE,INSERT,3DSOLID"
...und oben die Arraygrenzen entsprechend auf (0 to 1) korrigieren. - alfred - ------------------ www.hollaus.at |
Jowo76 Mitglied

 Beiträge: 16 Registriert: 09.12.2008 AutoCad 2007, 2008, 2009
|
erstellt am: 29. Jul. 2009 13:17 <-- editieren / zitieren --> Unities abgeben:         
|