| |
| 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, eine Pressemitteilung
|
Autor
|
Thema: Block im Block sprengen (4134 mal gelesen)
|
Jungspunt Mitglied
Beiträge: 21 Registriert: 14.06.2009
|
erstellt am: 14. Jun. 2009 14:10 <-- editieren / zitieren --> Unities abgeben:
Hi Ich habe bei Cadwiesel eine Lisp gefunden wie man die Layer innerhalb eines Blockes auf Layer 0 setzt und als Layerfarbe vonLayer. Damit Nehmen die Blöcke automatisch die Farbe des Layers an. Bei meine Blöcken geht das aber leider nicht, denn es befinden sich innerhalb des Blockes noch Blöcke die auch gesprengt werden müssen. Damit würde sich dann auch der Layer automatisch auf 0 Setzen. Wie muss ich jetzt die Lisp erweitern damit das geht? 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)
Danke
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
autocart Mitglied Technischer Redakteur
Beiträge: 698 Registriert: 08.09.2003 If you want to help and want to respect other people's questions, then, please: Please, ALWAYS assume that I already tried to search for an answer to my question. Thx. Also, please, DON'T ask me what the "actual" goal of my question is. Please, firstly just answer it directly as stated - if you know an answer and want to give it. Only secondly, add other commments. Many, many, many thanks in advance!
|
erstellt am: 14. Jun. 2009 21:46 <-- editieren / zitieren --> Unities abgeben: Nur für Jungspunt
Hallo Jungspunt! Zitat: Original erstellt von Jungspunt: Ich habe bei Cadwiesel eine Lisp gefunden wie man die Layer innerhalb eines Blockes auf Layer 0 setzt und als Layerfarbe vonLayer.
Du meinst wahrscheinlich " Elemente innerhalb eines Blockes", oder? Außerdem macht es grundsätzlich mehr Sinn (abgesehen von Ausnahmen), wenn man die Farbe von Elementen auf Layer 0 innerhalb von Blöcken auf "vonBlock" stellt und nicht auf "vonLayer". Zitat: Original erstellt von Jungspunt: Bei meine Blöcken geht das aber leider nicht, denn es befinden sich innerhalb des Blockes noch Blöcke die auch gesprengt werden müssen. Damit würde sich dann auch der Layer automatisch auf 0 Setzen.
Was bedeutet in deinem Satz "auch"? Und wieso stört das Ursprungen die Layer-Eigenschaft? Wenn ich ursprunge, bleiben die Blockelemente auf dem Layer, auf dem sie auch vorher waren. Was willst du genau? -> bitte genaue Beschreibung. ------------------ Gruß, Stephan www.stbartl.at "Every thing should be made as simple as possible but not simpler." - Albert Einstein Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 15. Jun. 2009 08:04 <-- editieren / zitieren --> Unities abgeben: Nur für Jungspunt
@Jungspunt genau DAS macht das gepostete Lisp ! Ob die Blockreferenzen verschachtelt, unverschachtelt oder garnicht in der Datei vorkommen ist uninteressant, "jeder Block" wird überarbeitet. AUSNAHME: anonyme Blöcke (1.Zeichen im Blocknamen ist ein Sternchen) Diese werden von Nuke "vorsichtshalber" nicht bearbeitet, denn diese werden auch für die Darstellung von Bemaßungen etc. benötigt. Also: Dein Problem sind NICHT verschachtelte Blöcke ! höchstens Unbenannte..
Test: Im Lisp folgende Zeile mit einem Semikolon auskommentieren und durch nachstehende Zeile ersetzen: Code: alt => ;(/=(logand(cdr(assoc 70 BLCK))1)1) ;skips annomyous blocks neu => (not(wcmatch (cdr(assoc 2 BLCK)) "`*D#*"))
------------------ die alte SUCHfunktion.. - System-Angaben - User:FAQ(Adesk) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Jungspunt Mitglied
Beiträge: 21 Registriert: 14.06.2009
|
erstellt am: 15. Jun. 2009 22:10 <-- editieren / zitieren --> Unities abgeben:
Hallo cadffm un dautocart. Es geht damit leider auch nicht. Wenn ich den Block anschließend öffne dann ist zwar innerhalb des blockes alles auf Layer 0 gestellt. Trotzdem nimmt der Block nicht die Layerfarbe an. (Ist ziemlich paradox ich weiß) Es muss unbedingt alles gesprengt werden innerhalb des Blockes. Warum das so ist weiß ich auch nicht der block ist ein Element das mit Pit Cad erstellt wurde. Einer Erweiterung für Autocad. Die hab ich aber nicht. Bisher musste ich also immer um den Block die Layerfarbe aufzuzwingen den Block öffnen und darin alles 2 mal sprengen. Dann gings. Vielleicht gibt es eine Möglichkeit die lisp von Jay daraufhin anzupassen. Ich wäre dafür sehr dankbar.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
autocart Mitglied Technischer Redakteur
Beiträge: 698 Registriert: 08.09.2003 If you want to help and want to respect other people's questions, then, please: Please, ALWAYS assume that I already tried to search for an answer to my question. Thx. Also, please, DON'T ask me what the "actual" goal of my question is. Please, firstly just answer it directly as stated - if you know an answer and want to give it. Only secondly, add other commments. Many, many, many thanks in advance!
|
erstellt am: 15. Jun. 2009 22:47 <-- editieren / zitieren --> Unities abgeben: Nur für Jungspunt
Wenn du dir sicher bist, wie sich die Zeichnung verhalten sollte, sie es aber nicht so tut, dann häng bitte eine Bsp-Zeichnung an. So wäre es leichter, das Problem nachzuvollziehen. Danke. ------------------ Gruß, Stephan www.stbartl.at "Every thing should be made as simple as possible but not simpler." - Albert Einstein Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Jungspunt Mitglied
Beiträge: 21 Registriert: 14.06.2009
|
erstellt am: 30. Jun. 2009 20:16 <-- editieren / zitieren --> Unities abgeben:
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 30. Jun. 2009 21:19 <-- editieren / zitieren --> Unities abgeben: Nur für Jungspunt
|
autocart Mitglied Technischer Redakteur
Beiträge: 698 Registriert: 08.09.2003
|
erstellt am: 01. Jul. 2009 13:53 <-- editieren / zitieren --> Unities abgeben: Nur für Jungspunt
Hab es mal als 2004er-Datei abgespeichert. Es dürfte daran liegen, dass du, Jungspunt, als innerste Elemente (der Blöcke) überall Vielflächennetze hast, deren Unterelemente wiederum auf dem Layer "3H_RU-VL" liegen und anscheinend die Farbe "vonLayer" haben. Wenn ich die Netze ursprunge, passt wieder alles. Warum die Netze aber so sind, liegt warscheinlich in der Frage, wie sie erzeugt wurden. Mit entmod kann man die Layer und Farbe vielleicht ändern. Mit der normalen AutoCAD-Benutzer-Oberfläche hab ich keinen Weg gefunden, allerdings kenn ich mich mit Vielflächennetzen nicht so gut aus. ------------------ Gruß, Stephan www.stbartl.at "Every thing should be made as simple as possible but not simpler." - Albert Einstein [Diese Nachricht wurde von autocart am 01. Jul. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 01. Jul. 2009 14:42 <-- editieren / zitieren --> Unities abgeben: Nur für Jungspunt
Hallo, interessantes Verhalten... mit (setq EDATA(subst (cons 8 "0")(assoc 8 EDATA)EDATA));changes layer to 0 passiert nix dann (setq EDATA(subst (cons 8 "AM_0")(assoc 8 EDATA)EDATA));changes layer to AM_0 weiß --> es geht und nun nochmal (setq EDATA(subst (cons 8 "0")(assoc 8 EDATA)EDATA));changes layer to 0 und es geht doch ... habe aber gerade nicht die Zeit es mir genauer anzuschauen mfg heiko
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
autocart Mitglied Technischer Redakteur
Beiträge: 698 Registriert: 08.09.2003
|
erstellt am: 01. Jul. 2009 17:43 <-- editieren / zitieren --> Unities abgeben: Nur für Jungspunt
also... nix entmod, da wird man ja wahnsinning! ActiveX ist hier das Zauberwort. (vl-load-com) und dann für jedes Vielflächennetz: Code: (setq ename ...); hier irgentwie den ename des Vielflächennetzes finden - ich hab's testweise mit (car(entsel)) gemacht, ist aber für die Automatisierung natürlich nicht zu empfehlen (vla-put-layer (vlax-ename->vla-object ename) "0")
Am einfachsten wäre vielleicht im obigen Lisp die Zeile (setq EDATA(subst (cons 8 "0")(assoc 8 EDATA)EDATA));changes layer to 0 auszukommentieren und nach (entmod EDATA);updates entity die Zeile (vla-put-layer (vlax-ename->vla-object E) "0") einzubauen und am Anfang des lisp muss noch irgentwo (vl-load-com) stehenEDIT: Und wenn du als Farbe "vonBlock" willst, musst du noch als weiter Zeile nach (entmod EDATA) (vla-put-color (vlax-ename->vla-object E) "0") einbauen und am besten die entsprechenden Zeilen, wo die Farbe entmodet wird auskommentieren. Den Linientyp, der da auch im lisp vorkommt, behandle ich jetzt nicht. EDIT2: Bzgl. BricsCAD (für die, die es interessiert): In Bcad funkt es grundsätzlich auch, nur hat (zumindest) der äußerste Block noch irgenteinen Datenbank-Fehler, sodass das Bcad-entnext zunächst die einzelnen "Insert"-Objekte IM Block nicht fand (und sich dadurch optisch gar nichts änderte). Ich musste zuerst eine Prüfung (engl. Audit) machen und gefundene Fehler beheben (Bcad fand übrigens 3 Fehler, Acad nur 1en). Danach funkte es in Bcad auch OHNE ActiveX (also nur mit entmod) super. In Acad konnte ich es ohne ActiveX gar nicht lösen, auch dann nicht, wenn ich die von Bcad "reparierte" Zeichnung lud. So haben beide Programme ihre Vor- und Nachteile. ------------------ Gruß, Stephan www.stbartl.at "Every thing should be made as simple as possible but not simpler." - Albert Einstein [Diese Nachricht wurde von autocart am 02. Jul. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Jungspunt Mitglied
Beiträge: 21 Registriert: 14.06.2009
|
erstellt am: 02. Jul. 2009 21:24 <-- editieren / zitieren --> Unities abgeben:
|