Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Blockinhalt löschen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Blockinhalt löschen (1130 mal gelesen)
ryfCAD
Mitglied
Architekt


Sehen Sie sich das Profil von ryfCAD an!   Senden Sie eine Private Message an ryfCAD  Schreiben Sie einen Gästebucheintrag für ryfCAD

Beiträge: 126
Registriert: 21.06.2005

ryfCAD rC Architektur für AutoCAD und GstarCAD

erstellt am: 10. Mai. 2020 17:55    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Guten Tag,

ich benötige eine Unterfunktion um in Blöcken, und nur in Blöcken, Schraffuren oder Solids oder Texte oder Masse zu löschen.
Hier mein Ansatz mit dem Problem, dass ich bei der Funktion Element löschen weder mit VL noch mit command weiter komme.

Der zweite Code den ich im Forum gefunden habe funktioniert einwandfrei, mit einer Ausnahme: Es werden auch Elemente ausserhalb des Blockes tangiert, was ich nicht will. Ich habe den zweiten Code auch schon angepasst und nur den 2. Teil ab "(vlax-for BLOCK" laufen lassen, ohne Erfolg.

Sitze nun schon einige Zeit an diesem Problem und bin dankbar für jeden Hinweis.


-------------------------------------------------------------------------------------
Hier mein Ansatz:


(defun inBlockOperation ()
  (setq countr 0 blklist '())
  (if
    (setq Obj (ssget "_X" '((0 . "INSERT"))))
    (repeat
      (sslength Obj)
      (setq elem (ssname Obj countr))
      (setq element (tblobjname "BLOCK" (cdr (assoc 2 (entget elem)))))
      (if (not (member element blklist))
      (progn
        (setq blklist (cons element blklist))
        (while
          (not
            (= (cdr (assoc 0 (entget element))) "ENDBLK")
          )
          (if
          (= (cdr (assoc 1 (entget element))) "HATCH")
          (progn
            ;------------------
            ;Element löschen
            ;------------------
            ;(vla-delete (vlax-ename->vla-object element)) ;geht nicht, nil
            ;(command "_.erase" element "") ;geht nicht: ausserhalb Bereich
          )
        )
        (setq element (entnext element))
      )
    )
  )
  (setq countr (+ countr 1))
  )
)
)

-------------------------------------------------------------------------------------
Hier der Code der auch Elemente ausserhalb des Blockes tangiert:


(defun C  EL-SOLID( / BLOCK )
  (vl-load-com)  
  (vlax-for LAYOUT (vla-get-layouts(vla-get-activedocument(vlax-get-acad-object)))
    (vlax-for ITEM (setq BLOCK (vla-get-Block LAYOUT))
      (if(and(=(strcase(vla-get-objectname  ITEM))(strcase "AcDbHatch"))
            (wcmatch (strcase(vla-get-PatternName ITEM)) "SOLID*")
        )
        (vl-catch-all-error-p
          (vl-catch-all-apply              
            'vla-delete
            (list ITEM)
          )
        )      
      )
    )
  )                                        
  (vlax-for BLOCK (vla-get-blocks(vla-get-activedocument(vlax-get-acad-object)))
    (vlax-for ITEM BLOCK  
      (if(and(=(strcase(vla-get-objectname  ITEM))(strcase "AcDbHatch"))
              (wcmatch (strcase(vla-get-PatternName ITEM)) "SOLID*")
          )
        (vl-catch-all-error-p
          (vl-catch-all-apply              
            'vla-delete
            (list ITEM)
          )
        )      
      )
    )        
  )
  (vla-regen(vla-get-activedocument (vlax-get-acad-object)) acAllViewports)
)

------------------
Auch für LT gibt es Lösungen, aber Lisp erleichtert das Leben ungemein

[Diese Nachricht wurde von ryfCAD am 10. Mai. 2020 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

ryfCAD
Mitglied
Architekt


Sehen Sie sich das Profil von ryfCAD an!   Senden Sie eine Private Message an ryfCAD  Schreiben Sie einen Gästebucheintrag für ryfCAD

Beiträge: 126
Registriert: 21.06.2005

ryfCAD rC Architektur für AutoCAD und GstarCAD

erstellt am: 10. Mai. 2020 17:58    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Sorry, die Codeformatierung meines Ansatzes wurde zerschossen.

[Diese Nachricht wurde von ryfCAD am 10. Mai. 2020 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

cadffm
Moderator
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 10. Mai. 2020 18:14    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für ryfCAD 10 Unities + Antwort hilfreich

Dein Ansatz, nicht im Detail geprüft, schaut richtig ob ein Objekt vom Typ ENDBLK ist,
aber falsch ob es ein Objekt HATCH ist.
Gruppencode 0 ist der Objekttyp, nicht 1


Der andere Code enthält ja einen fast identischen Part.
Ich bin sicher du kannst es auch damit lösen.
Tip: Lasse dir einfach mal die Objektnamen ausgeben statt etwas zu löschen, einfach um in einer minimalen Testdatei zu sehen was da so durch die Schleifen verarbeitet wird.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

cadffm
Moderator
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 10. Mai. 2020 18:20    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für ryfCAD 10 Unities + Antwort hilfreich

Ergänzung zu meinem TIP: ich meinte die Blocknamen!
Also mit (alert(vla-get-Name DeinvlaOBJ))

Leere Datei, vielleicht ein Block oder zwei, das reicht zum Test.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

ryfCAD
Mitglied
Architekt


Sehen Sie sich das Profil von ryfCAD an!   Senden Sie eine Private Message an ryfCAD  Schreiben Sie einen Gästebucheintrag für ryfCAD

Beiträge: 126
Registriert: 21.06.2005

ryfCAD rC Architektur für AutoCAD und GstarCAD

erstellt am: 10. Mai. 2020 18:26    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Das wars, zu lange am Compi gesessen. Ein Durchlauf funktioniert, der zweite gibt eine Fehlermeldung:

Befehl inblockoperation)
; Fehler: Argument type error: lentityp nil

------------------
Auch für LT gibt es Lösungen, aber Lisp erleichtert das Leben ungemein

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

ryfCAD
Mitglied
Architekt


Sehen Sie sich das Profil von ryfCAD an!   Senden Sie eine Private Message an ryfCAD  Schreiben Sie einen Gästebucheintrag für ryfCAD

Beiträge: 126
Registriert: 21.06.2005

ryfCAD rC Architektur für AutoCAD und GstarCAD

erstellt am: 10. Mai. 2020 18:29    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

ich lösche mittels:
(vla-delete (vlax-ename->vla-object element))

ein Durchgang ist OK. danach die Fehlermeldung.

------------------
Auch für LT gibt es Lösungen, aber Lisp erleichtert das Leben ungemein

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

CADmium
Moderator
Maschinenbaukonstrukteur




Sehen Sie sich das Profil von CADmium an!   Senden Sie eine Private Message an CADmium  Schreiben Sie einen Gästebucheintrag für CADmium

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 11. Mai. 2020 07:15    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für ryfCAD 10 Unities + Antwort hilfreich

Gut kopiert und schlecht geändert ? 

Probiers hiermit

(defun C ELHATCHINBLOCK(/ BLOCK ITEM)
  (vlax-for BLOCK (vla-get-blocks(vla-get-activedocument(vlax-get-acad-object)))
    (if(=(vla-get-islayout BLOCK):vlax-false)
      (vlax-for ITEM BLOCK 
        (if(and(=(strcase(vla-get-objectname  ITEM))(strcase "AcDbHatch"))
              ;(wcmatch (strcase(vla-get-PatternName ITEM)) "SOLID*")
            )
          (vl-catch-all-error-p(vl-catch-all-apply 'vla-delete(list ITEM)))     
        )
      )       
    )
  ) 
  (vla-regen(vla-get-activedocument (vlax-get-acad-object)) acAllViewports) 
)

------------------
Also ich finde Unities gut ... und andere sicher auch
---------------------------------------
  - Thomas -          
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

ryfCAD
Mitglied
Architekt


Sehen Sie sich das Profil von ryfCAD an!   Senden Sie eine Private Message an ryfCAD  Schreiben Sie einen Gästebucheintrag für ryfCAD

Beiträge: 126
Registriert: 21.06.2005

ryfCAD rC Architektur für AutoCAD und GstarCAD

erstellt am: 11. Mai. 2020 07:38    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

@CADmium: funktioniert! Besten Dank! Suche noch den Unterschied von Code 2, 2. Abschnitt, zu deiner Lösung.

Frage: weshalb ist meine Funktion an der Stelle von (setq element (entnext element)) ins Stocken geraten?
Die repeat- Schlaufe wird mit der Anzahl der gefundenen Blöcken begrenz, funktioniert.
Die while- Schlaufe wird mit (= (cdr (assoc 0 (entget element))) "ENDBLK") begrenzt, funktioniert nicht, weshalb?

Besten Dank!!!


(defun inBlockOperation ()
  (setq countr 0 blklist '())
  (if
    (setq Obj (ssget "_X" '((0 . "INSERT"))))
    (repeat
      (sslength Obj)
      (setq elem (ssname Obj countr))
      (setq element (tblobjname "BLOCK" (cdr (assoc 2 (entget elem)))))
      (if (not (member element blklist))
      (progn
        (setq blklist (cons element blklist))
        (while
          (not
            (= (cdr (assoc 0 (entget element))) "ENDBLK")
          )
          (if
            (= (cdr (assoc 1 (entget element))) "HATCH")
            (progn
            ;(vla-delete (vlax-ename->vla-object element))  *als Variante*
              (entdel element)
            )
          )
          (setq element (entnext element))
        )
      )
    )
    (setq countr (+ countr 1))
    )
  )
)

------------------
Auch für LT gibt es Lösungen, aber Lisp erleichtert das Leben ungemein

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

CADmium
Moderator
Maschinenbaukonstrukteur




Sehen Sie sich das Profil von CADmium an!   Senden Sie eine Private Message an CADmium  Schreiben Sie einen Gästebucheintrag für CADmium

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 11. Mai. 2020 07:53    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für ryfCAD 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von ryfCAD:

Frage: weshalb ist meine Funktion an der Stelle von (setq element (entnext element)) ins Stocken geraten?



ungetestet .... nach dem Löschen fehlt vielleicht der Bezug für entnext ...

Tipp : sammle erst in der while-Schleife alle Schraffurobjekte in einer Liste und lösch die nach Beendigung der Whileschleife ... z.B: so

(defun inBlockOperation ( / LISTE)
  (setq countr 0 blklist '())
  (if
    (setq Obj (ssget "_X" '((0 . "INSERT"))))
    (repeat
      (sslength Obj)
      (setq elem (ssname Obj countr))
      (setq element (tblobjname "BLOCK" (cdr (assoc 2 (entget elem)))))
      (if (not (member element blklist))
      (progn
        (setq LISTE nil)
        (setq blklist (cons element blklist))
        (while
          (not
            (= (cdr (assoc 0 (entget element))) "ENDBLK")
          )
          (if
            (= (cdr (assoc 1 (entget element))) "HATCH")
            (progn
              (setq LISTE (cons ELEMENT LISTE))
            )
          )
          (setq element (entnext element))
        )
        (mapcar
          '(lambda(X)(vla-delete (vlax-ename->vla-object X)))
          LISTE
        ) 
      )
    )
    (setq countr (+ countr 1))
    )
  )
)

(auch ungetestet  )

------------------
Also ich finde Unities gut ... und andere sicher auch
---------------------------------------
  - Thomas -          
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

ryfCAD
Mitglied
Architekt


Sehen Sie sich das Profil von ryfCAD an!   Senden Sie eine Private Message an ryfCAD  Schreiben Sie einen Gästebucheintrag für ryfCAD

Beiträge: 126
Registriert: 21.06.2005

ryfCAD rC Architektur für AutoCAD und GstarCAD

erstellt am: 11. Mai. 2020 08:14    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

leider:

; Fehler: Argument type error: lentityp nil


Aber Ok. Deine Lösung funktioniert nun sowohl für Schraffuren und angepasst auch für nur Solid-Schraffuren.

Anmerkung: Deine schon lange veröffentlichte Lösung ist auch toll, wenn alle Schraffuren oder Solid-Schraffuren gelöscht werden sollen!
Da ich mich mit der direkten Manipulation von Elementen noch nicht auskenne, arbeite ich oft über (command).

Oft werden Zeichnungen mit Blöcken zur Weiterbearbeitung abgegeben. Innerhalb der Blöcke befindet sich oft unnützer Balast wie Schraffuren, Texte, Masse etc. Eine entsprechende Bereinigung NUR innerhalb der Blöcke ist sehr nützlich und der Code kann entsprechend perfekt angepasst werden: "AcDbHatch" "AcDbText" "AcDbDimension" etc.

Besten Dank!

------------------
Auch für LT gibt es Lösungen, aber Lisp erleichtert das Leben ungemein

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz