| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY wird von NVIDIA zum Händler des Jahres gewählt – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: Block auf Layer 0, LSP (3242 mal gelesen)
|
Daniel33 Mitglied Bau-Ing.
Beiträge: 6 Registriert: 27.08.2009 Autocad 2013 auf Windows XP
|
erstellt am: 27. Aug. 2009 13:34 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich bin was Dinge bezüglich LSP, Scripten etc. nicht gerade bewandert. Daher eine Frage: Da es in mir zukommenden Zeichnungen häufig vorkommt, dass die Elemente in Blöcken nicht auf Layer 0 liegen und zudem noch verschachtelt sind (wieso auch immer?) habe ich nach einem Befehl bzw. Makro gesucht, welches die Blöcke auf den Layer 0 legt. Da das Internet nicht soviel hergibt, habe ich lediglich einen Code gefunden. Den habe ich mittels Textdatei als lsp abgelegt und eingebunden. Bei der Ausführung des Befehls gibt er mit jeoch eine Fehlermeldung zurück. 1. Frage: Wie kann ich eine eingebundene lsp-Datei wieder entladen? 2. Frage: Wieso läuft der Code nicht, wie muss ich ihn einbinden? (Code: (defun c:make0 (/ oldblk oldblkname oldblkX oldblkY oldblkZ oldblkrot newblkname ) (setvar "osmode" 0) (setvar "blockeditlock" 0) (setq oldblk (entsel "\nSelect Block for Zero Makeover: ")) (setq oldblkname (vla-get-EffectiveName (vlax-ename->vla-object (car oldblk)))) (setq oldblkins (cdr (assoc 10 (entget (car oldblk))))) (setq oldblkX (cdr (assoc 41 (entget (car oldblk))))) (setq oldblkY (cdr (assoc 42 (entget (car oldblk))))) (setq oldblkZ (cdr (assoc 43 (entget (car oldblk))))) (setq oldblkrot (cdr (assoc 50 (entget (car oldblk))))) (setq newblkname (strcat "0-" oldblkname)) (if (= (tblsearch "block" newblkname) nil) (setq testflag 0) (setq testflag 1) ) (if (= testflag 0) (progn (COMMAND "-BEDIT" oldblkname) (command "bsaveas" (strcase (strcat "0-" oldblkname))) (command "change" "all" "" "p" "la" "0" "") (command "bsave") (command "bclose") (command "erase" oldblk "") )) (command "erase" oldblk "") (command "insert" newblkname oldblkins oldblkX oldblkY (/ (* 180 oldblkrot) pi) ) (gc) (princ) ) Codeende. 3. Frage: Gibt es für mein Layer-Block-Problem eine andere Lösung? Anmerkung: Verwendung von AutoCAD 2010. Vielen Dank. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 Hinweis: Meine Mitarbeit auf CAD.DE ist fakultativ, unentgeltlich und beruht nur auf einem ausgeprägtem Helfersyndrom.
|
erstellt am: 27. Aug. 2009 13:42 <-- editieren / zitieren --> Unities abgeben: Nur für Daniel33
zu 1.) gar nicht ... Zeichnung zu und wieder öffnen .. dann ist das Lisp nicht mehr da ... oder alle erzeugten Funktionen und Variablen nil setzen .. Z.B: (setq c:make0 nil) und die Funktion ist weg zu 2.) das Teil läuft bloß mit der englischen ACAD-Version, da die command-Aufrufe nicht internationalisiert sind ->(command "erase" oldblk "") müßte (command "_erase" oldblk "") heißen zu 3.) Ja, so. bei www.cadwiesel.de oder das etwas umfassendere ------------------ - 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 |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 27. Aug. 2009 13:44 <-- editieren / zitieren --> Unities abgeben: Nur für Daniel33
|
xem Mitglied Zeichner
Beiträge: 854 Registriert: 07.08.2008 Software: AutoCAD 2022 - 64bit Windows 10 Pro - 64bit PDFCreator 1.0.2 - 32bit Ghostscript 9.0 - 64bit PDF-XChange Viewer - 64bit GIMP 2.6.8 - 64bit MS Office 2013 - 32bit Opera 12 - 32bit MacroX - 32bit 7-zip - 64bit ----------------------- Hardware: Intel i5 680 3,6GHz @ 4GHz 8GB RAM 1333MHz nVidia GTX 460 1024MB Intel SSD 2.5 80GB X25-M Samsung SyncMaster 245B+ Iiyama ProLite E1900s Logitech mx518 Logitech G11 Roccat Sense Glacier Blue
|
erstellt am: 27. Aug. 2009 13:57 <-- editieren / zitieren --> Unities abgeben: Nur für Daniel33
ich hab da auch noch was: Code: ;Redefines ALL objects in any block in the drawing on layer 0. ;(c)Jay Garnett (email jgarnett@enteract.com) Written 1/14/97 ;web page http://www.enteract.com/~jgarnett/lispfactory.htm ;Updated 1/25/97 - added select mode ; ;NUKE.LSP redefines all objects in a block on layer 0, with color and linetype ;set to BYLAYER. NUKED blocks will then take on the properties of the layer ;that they are inserted on. The routine works by modifing objects in the block table, ;so the blocks never have to be exploded. ; ;The global method redefines ALL objects in every block in the current drawing, ;except dimensions, hatching or xrefs, even if they are on a layer that is ;frozen or turned off. ; ;The select method redefines blocks selected with any standard selection method, ;as well as any blocks nested in the selected block(s).(defun To-0( BLCK / BNAME BLIST E EDATA SPIN TMP ) ;;; Prints a pinwheel on the command line (defun Spin ( ) (setq SYM (cond ((= SYM nil) "-") ((= SYM "-") "\\") ((= SYM "\\") "|") ((= SYM "|") "/") ((= SYM "/") "-") ) ) (princ (strcat "\rScanning... " SYM " ")) );end spin (if (=(type BLCK)(read "LIST"))(setq TMP(car BLCK) BLIST(cdr BLCK) BLCK TMP TMP nil)) (setq BLCK(tblsearch "BLOCK" BLCK)) (if (and (/=(logand(cdr(assoc 70 BLCK))1)1) ;skips annomyous blocks (/= (logand(cdr(assoc 70 BLCK))4)4) ;skips xrefs );and (progn (setq E (cdr (assoc -2 BLCK))) (while E (if (=(cdr(assoc 0 (entget E))) "INSERT") ;If the object is a block (progn (setq BNAME(cdr(assoc 2(entget E)))) ;save the name to a list (if (not (member BNAME BLIST)) (if (not BLIST)(setq BLIST (list BNAME)) ;create the list if it doesn't exist (setq BLIST(append BLIST(list BNAME))) );if );if );progn );if (setq EDATA (entget E)) (if(assoc 62 EDATA) ;Resets object color to BYLAYER if it isn't. (setq EDATA(subst(cons 62 256)(assoc 62 EDATA)EDATA)) );if (if(assoc 6 EDATA) ;Resets object linetype to BYLAYER if it isn't. (setq EDATA(subst(cons 6 "BYLAYER")(assoc 6 EDATA)EDATA)) );if (setq EDATA(subst (cons 8 "0")(assoc 8 EDATA)EDATA));changes layer to 0 (entmod EDATA);updates entity (setq E (entnext E));get next enitiy, nil if end of block (Spin) );end while E );progn );if BLIST; returns names of any nested blocks );defun (defun C:NUKE( / BLK_NM CHOICE E EDATA IDX PK_BLK SS) (command "._undo" "m") (setq CHOICE "S") (initget "G S") (setq CHOICE(getkword (strcat "\n<G>lobal or <S>elect block: <" CHOICE "> "))) (if(not CHOICE)(setq CHOICE "S")) (if (= (strcase CHOICE) "G") ;global nuke (while (setq BLK_NM(tblnext "BLOCK" (null BLK_NM))) (TO-0 (cdr(assoc 2 BLK_NM))) );while ;nuke selected block (progn (prompt "\nSelect Block(s) to Nuke: ") (setq SS(ssget '((0 . "INSERT")))) (setq IDX 0) (repeat (sslength SS) (setq BLK(cdr(assoc 2 (entget(ssname SS IDX))))) (cond (PK_BLK (setq PK_BLK(append PK_BLK (list BLK)))) (T (setq PK_BLK(list BLK))) );cond (setq IDX(1+ IDX)) );repeat (while PK_BLK (setq PK_BLK(To-0 PK_BLK)) );while );progn );if (command "._regen") (princ "\rFinished ") (princ) );defun (prompt"\nNUKE zum Starten.")(princ)
und Code: (defun c:blk (/ *error* adoc lst_layer func_restore-layers) (defun *error* (msg) (func_restore-layers) (vla-endundomark adoc) (princ msg) (princ) ) ;_ end of defun (defun func_restore-layers () (foreach item lst_layer (vla-put-lock (car item) (cdr (assoc "lock" (cdr item)))) (vl-catch-all-apply '(lambda () (vla-put-freeze (car item) (cdr (assoc "freeze" (cdr item)))) ) ;_ end of lambda ) ;_ end of vl-catch-all-apply ) ;_ end of foreach ) ;_ end of defun (vl-load-com) (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))) ) ;_ end of vla-startundomark (vlax-for item (vla-get-layers adoc) (setq lst_layer (cons (list item (cons "lock" (vla-get-lock item)) (cons "freeze" (vla-get-freeze item)) ) ;_ end of list lst_layer ) ;_ end of cons ) ;_ end of setq (vla-put-lock item :vlax-false) (vl-catch-all-apply '(lambda () (vla-put-freeze item :vlax-false))) ) ;_ end of vlax-for (vlax-for blk (vla-get-blocks adoc) (if (and (equal (vla-get-islayout blk) :vlax-false) (equal (vla-get-isxref blk) :vlax-false) ) ;_ end of and (progn (vlax-for subent blk (vla-put-layer subent "0") (vla-put-color subent 0) (vla-put-lineweight subent aclnwtbyblock) (vla-put-linetype subent "byblock") ) ;_ end of vlax-for ) ;_ end of progn ) ;_ end of if ) ;_ end of vlax-for (func_restore-layers) (vla-endundomark adoc) (princ) ) ;_ end of defun
Wenn die Grundriss nicht weiter bearbeitet werden könnte man auch "BURST" verwenden. Da gibts auch eine gefixte Version. Wobei bei "BURST" alle blöcke aufgelöst werden! ------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Daniel33 Mitglied Bau-Ing.
Beiträge: 6 Registriert: 27.08.2009 Autocad 2013 auf Windows XP
|
erstellt am: 27. Aug. 2009 14:11 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank. Für selbst erstellte Blöcke (mit div. Layern) funktioniert das. Habe mal ein Beispiel angefügt, für Blöcke, bei denen dies nicht funktioniert. Ich verstehe diese Dinger nicht. Tauchen aber immer wieder auf. Hat jemand einen Rat? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 27. Aug. 2009 14:30 <-- editieren / zitieren --> Unities abgeben: Nur für Daniel33
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 Hinweis: Meine Mitarbeit auf CAD.DE ist fakultativ, unentgeltlich und beruht nur auf einem ausgeprägtem Helfersyndrom.
|
erstellt am: 27. Aug. 2009 14:32 <-- editieren / zitieren --> Unities abgeben: Nur für Daniel33
Zitat: Original erstellt von Daniel33: Vielen Dank. Für selbst erstellte Blöcke (mit div. Layern) funktioniert das. Habe mal ein Beispiel angefügt, für Blöcke, bei denen dies nicht funktioniert. Ich verstehe diese Dinger nicht. Tauchen aber immer wieder auf. Hat jemand einen Rat?
das liegt an der Zeile
(/=(logand(cdr(assoc 70 BLCK))1)1) ;skips annomyous blocks ersetz die mal durch (or (/= (logand(cdr(assoc 70 BLCK))1)1) (=(vl-string-search "*U" (cdr(assoc 2 BLCK)))0) ) ------------------ - 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 |
xem Mitglied Zeichner
Beiträge: 854 Registriert: 07.08.2008 Software: AutoCAD 2022 - 64bit Windows 10 Pro - 64bit PDFCreator 1.0.2 - 32bit Ghostscript 9.0 - 64bit PDF-XChange Viewer - 64bit GIMP 2.6.8 - 64bit MS Office 2013 - 32bit Opera 12 - 32bit MacroX - 32bit 7-zip - 64bit ----------------------- Hardware: Intel i5 680 3,6GHz @ 4GHz 8GB RAM 1333MHz nVidia GTX 460 1024MB Intel SSD 2.5 80GB X25-M Samsung SyncMaster 245B+ Iiyama ProLite E1900s Logitech mx518 Logitech G11 Roccat Sense Glacier Blue
|
erstellt am: 27. Aug. 2009 14:35 <-- editieren / zitieren --> Unities abgeben: Nur für Daniel33
Ich würde mal sagen es liegt daran das AutoCAD das Objekt zwar als Block anzeigt, aber es kein "richtiger" Block ist. Mit dem Blockeditor kommt man nicht rein, weil keiner da ... ------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Daniel33 Mitglied Bau-Ing.
Beiträge: 6 Registriert: 27.08.2009 Autocad 2013 auf Windows XP
|
erstellt am: 27. Aug. 2009 14:36 <-- editieren / zitieren --> Unities abgeben:
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 Hinweis: Meine Mitarbeit auf CAD.DE ist fakultativ, unentgeltlich und beruht nur auf einem ausgeprägtem Helfersyndrom.
|
erstellt am: 27. Aug. 2009 14:40 <-- editieren / zitieren --> Unities abgeben: Nur für Daniel33
anonyme Blöcke sind "Vom System (oder per Tool) erzeugte" ganz normale Blöcke , die sich nur durch den Flag im GC70 und den mit * beginnenden Blocknamen unterscheiden. Bemassungen, Referenzen dynamischer Blöcke z.B. referenzieren z.b. auch so einen anonymen Block. ------------------ - 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 |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 27. Aug. 2009 14:43 <-- editieren / zitieren --> Unities abgeben: Nur für Daniel33
Blöcke von denen man (Programmierer) ausgeht das sie den User nicht interessieren, bzw. nicht interessieren sollten. Eigentlich sollten es ausschließlich "Systemblöcke" sein welche von ACAD selbst erstellt werden. Ihrem Blocknamen ist ein "*" vorangestellt und sie werden in Dialogfeldern etc. normalerweise "übergangen" . Bemaßungen brauchen "Hilfsblöcke" und auch "Dynamische Blöcke" brauchen welche, usw. ------------------ die alte SUCHfunktion.. - System-Angaben - User:FAQ(Adesk) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2494 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2018/2019 (deu/eng) AEC-Collection 2019 (Revit und Zeugs) Wenn sich's nicht vermeiden läßt: D-A-CH Erweiterung (mies implementierter Schrott)
|
erstellt am: 28. Aug. 2009 08:52 <-- editieren / zitieren --> Unities abgeben: Nur für Daniel33
|