| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| Request a special discount on NVIDIA RTX 5000 Ada Generation GPU !, eine Pressemitteilung
|
Autor
|
Thema: Farbe von Objekt ändern (5290 mal gelesen)
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 30. Nov. 2009 12:18 <-- editieren / zitieren --> Unities abgeben:
Hi! Steh grad auf´m Schlauch. Bei dem Ansatz möchte ich gern die Farbe des zu ändernden Objektes vorher bestimmen. Ich vermute die assoc-liste wird nicht so nicht richtig erzeugt. Kann da mal ein Profi ran ?! (defun c:f1() (setq FARBE (getstring "\nwert für eine farbe eingeben\n")) ; (setq FARBE 1) (and(setq OBJ(car(Entsel))) (setq OBJ(entget OBJ)) (or(and(assoc 62 OBJ) (setq OBJ(subst (cons 62 FARBE)(assoc 62 OBJ)OBJ)) ) (setq OBJ(append OBJ (list(cons 62 FARBE)))) ) (entmod OBJ) ) )
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 30. Nov. 2009 12:24 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 30. Nov. 2009 13:16 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 30. Nov. 2009 14:39 <-- editieren / zitieren --> Unities abgeben:
besten Dank! Ich möchte da gleich mit einer weiteren Funktion anschliessen, die die Farbe des Layer ändert vom gewählten Objekt (defun c:fl() (setq obj (entget (car (entsel "\nobjekt wählen\n"))) lname (cdr(assoc 8 obj))) (command "layer" "c" (acad_colordlg 256) lname "") ) könnte ich denn auch die Farbe von layern, die in einer externen Referenz liegen ändern ?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Britt Mitglied
Beiträge: 154 Registriert: 21.03.2002
|
erstellt am: 01. Dez. 2009 08:11 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 01. Dez. 2009 10:15 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 01. Dez. 2009 10:52 <-- editieren / zitieren --> Unities abgeben:
Einsame Spitze - beste Hilfestellung und Tips von allen hier die 2 routinen Einmal zum ändern der Farbe eines Layers in der Zeichnung (defun c:fl() (setq obj (entget (car (entsel "\nobjekt wählen\n"))) lname (cdr(assoc 8 obj))) (command "layer" "c" (acad_colordlg 256) lname "") ) zum zweiten zum ändern der Farbe eines xrefs-layers (defun c:flx() (setq obj (entget (car (nentsel "\nobjekt wählen\n"))) lname (cdr(assoc 8 obj))) (command "layer" "c" (acad_colordlg 256) lname "") ) Gruss cp Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bikerholic Mitglied Bauzeichner Straßenbau
Beiträge: 123 Registriert: 06.02.2009 XP Professional SP2 Intel Pentium x86 2.40GHz 1GB-Ram, Maxtor 60GB NVIDIA GeForce4 MX 420 mit 64MB AutoCAD 2005&2008&2010(Civil3D)+SP2+Expresstools google und ich san beste freunde ;)
|
erstellt am: 02. Dez. 2009 10:34 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
servus cp ein verbesserungs vorschlag das deutsche autocad versteht kein c für color sprich entweder _c oder fa bei (command "layer" "c" eintragen und ich hätte da noch was als anternative im angebot von cadwerk.com colorchg.lsp beides in einem befehl und es werden nur objekte akzeptiert die auch von layer sind und bei den xref layern wird auch die eingestellte farbe für den layer angezeit und nicht von layer schönen tag noch tschau björn
------------------ Wenn Arbeit etwas schoenes und erfreuliches waere, haetten die Reichen sie nicht den Armen ueberlassen. [Paul Lafargue] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Steff179 Mitglied Geomatiker
Beiträge: 266 Registriert: 09.08.2007 AutoCAD 2014
|
erstellt am: 02. Dez. 2009 11:45 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
hallo cadplayer gebe auch noch meinen senf dazu mach doch noch die variabeln lokal (defun c:flx( / obj lname) "dein code" ) musste mir auch zuerst gesagt werden bis ich das beachtete gruss steff Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 02. Dez. 2009 13:25 <-- editieren / zitieren --> Unities abgeben:
immerzu... - ich bin offen wie ... - nee das sag ich hier mal lieber nicht - ich bin anständig Prima Vorschläge, werd ich in Zukunft mit einbauen. Mann dankt nun hab ich auch geschnallt, was genau "nentsel" bewirkt ihr braucht also jetzt nur die Funktion flx aufrufen (defun c:flx(/obj lname) "ändert Farbe von internen und externen layern" (setq obj (entget (car (nentsel "\nobjekt wählen\n"))) lname (cdr(assoc 8 obj))) (command "layer" "fa" (acad_colordlg 256) lname "") ) wie schaffe ich es aber das "ändert Farbe von internen und externen layern" tatsächlich im Textfenster (F2)angezeigt wird ?
[Diese Nachricht wurde von cadplayer am 02. Dez. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bikerholic Mitglied Bauzeichner Straßenbau
Beiträge: 123 Registriert: 06.02.2009 XP Professional SP2 Intel Pentium x86 2.40GHz 1GB-Ram, Maxtor 60GB NVIDIA GeForce4 MX 420 mit 64MB AutoCAD 2005&2008&2010(Civil3D)+SP2+Expresstools google und ich san beste freunde ;)
|
erstellt am: 02. Dez. 2009 16:25 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von cadplayer: wie schaffe ich es aber das "ändert Farbe von internen und externen layern" tatsächlich im Textfenster (F2)angezeigt wird ?
^^mit prompt so (prompt"\nändert Farbe von internen und externen layern")(princ) im ganzen dann so (defun c:flx (/ obj lname) (prompt"\nändert Farbe von internen und externen layern")(princ) (setq obj (entget (car (nentsel "\nobjekt wählen\n"))) lname (cdr(assoc 8 obj))) (command "layer" "fa" (acad_colordlg 256) lname "") ) tschau björn
------------------ Wenn Arbeit etwas schoenes und erfreuliches waere, haetten die Reichen sie nicht den Armen ueberlassen. [Paul Lafargue] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Steff179 Mitglied Geomatiker
Beiträge: 266 Registriert: 09.08.2007 AutoCAD 2014
|
erstellt am: 02. Dez. 2009 16:47 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
wenn du noch auf (command) verzichten willst, dann schau dir das mal an vieleicht kannst du was damitt anfangen Code:
(setq lay (entget(tblobjname "LAYER" lname))) (setq lfarbe (cdr (assoc 62 lay))) (setq NeueFarbe (cdar(acad_truecolordlg lfarbe))) (if NeueFarbe (entmod (subst(cons 62 NeueFarbe)(assoc 62 lay) lay)) )
gruss steff Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 02. Dez. 2009 17:44 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
Steff179 Mitglied Geomatiker
Beiträge: 266 Registriert: 09.08.2007 AutoCAD 2014
|
erstellt am: 03. Dez. 2009 14:41 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
hallo thomas hast recht da habe ich wirklich einen schei... gebaut wurde mir fast übel als ich das bemerkte. hätte besser de (acad_colordlg) genommen da ich truecolor e nie brauche. hat mich jetzt aber doch gewurmt und hab mich dran gesetzt. ergebniss sieht so aus: Code:
(defun c:LF ( / lay ent obj lname lfarbe NeuFarbe) (defun Truecolor2List (gc1 gc2 FarbList Lst / lst1 lst2) (setq i 0) (while (/= (car(nth i lst)) gc1) (setq lst1 (append (list(nth i lst))lst1)) (setq i (1+ i)) ) (setq lst1 (append (list(nth i lst))lst1)) (setq lst1 (reverse lst1)) ;----- (setq i 0) (setq lst (reverse lst)) (while (/= (car(nth i lst)) gc2) (setq lst2 (append (list(nth i lst))lst2)) (setq i (1+ i)) ) (setq lst2 (append (list(nth i lst))lst2)) (setq lst (append lst1 FarbList lst2)) lst );end Truecolor2List (while(not (and (setq ent (car(nentsel "\nObjekt wählen: ")))))) (setq obj (entget ent)) (setq lname (cdr (assoc 8 obj))) (setq lay (entget(tblobjname "LAYER" lname))) (cond ((/= (assoc 430 lay) nil)(setq lfarbe (assoc 430 lay))) ((/= (assoc 420 lay) nil)(setq lfarbe (assoc 420 lay))) ((/= (assoc 62 lay) nil)(setq lfarbe (assoc 62 lay))) ) (setq NeueFarbe (acad_truecolordlg lfarbe)) (setq lay (Truecolor2List 70 6 NeueFarbe lay)) (if NeueFarbe (progn (entmod lay) (princ "\nDie Farbe wurde geändert! ") ) ) (princ) )
funktioniert ganz gut. die funktion Truecolor2List würde jemand anderst sicher schlanker hinkrigen aber im moment habe ich ein anderes problem. ausgangslage: (entget (tblobjname "layer" "layer1")) ((-1 . <Objektname: 7dbf3e70> ) (0 . "LAYER") (330 . <Objektname: 7dbf3c10> ) (5 . "4E") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (2 . "Layer1") (70 . 0) (62 . 1) (6 . "Continuous") (290 . 1) (370 . -3) (390 . <Objektname: 7dbf3c78> )) nach ändern auf ein farbbuch:
(entget (tblobjname "layer" "layer1")) ((-1 . <Objektname: 7dbf3e70> ) (0 . "LAYER") (330 . <Objektname: 7dbf3c10> ) (5 . "4E") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (2 . "Layer1") (70 . 0) (62 . 134) (420 . 303519) (430 . "RAL DESIGN$RAL 190 60 40") (6 . "Continuous") (290 . 1) (370 . -3) (390 . <Objektname: 7dbf3c78> )) wider ändern auf eine grundfarbe:
(entget (tblobjname "layer" "layer1")) ((-1 . <Objektname: 7dbf3e70> ) (0 . "LAYER") (330 . <Objektname: 7dbf3c10> ) (5 . "4E") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (2 . "Layer1") (70 . 0) (62 . 1) (6 . "Continuous") (290 . 1) (370 . -3) (390 . <Objektname: 7dbf3c78> )) so weit so gut. jetzt habe ich aber das problem das wenn ich die layersteuerung öffne dort immer noch "RAL 190 60 40" angezeigt wird. wenn ich dann die farbe in der layersteuerung ändere ist die ausgangslage die farbe 1 unter "Farbe wählen". was habe ich übersehen? muss ich das irgendwie refreschen oder wo liegt das problem? 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: 03. Dez. 2009 15:21 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
dein Truecolor2List ist echt cond bricht nach dem ersten "Treffer" ab... ------------------ Mfg Heiko Elefantenjagd in Afrika "... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..." (www.uni-leipzig.de/~rotheh/elefant.htm) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Steff179 Mitglied Geomatiker
Beiträge: 266 Registriert: 09.08.2007 AutoCAD 2014
|
erstellt am: 03. Dez. 2009 15:27 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
ja ich weiss das die zum ist bin gerade am lambda apply ect. wider mal am studieren wenn ich da mal durchblicke sollte es schöner gehen. aber das problem hat gar nichts mit cond zu tun... cond muss nach dem ersten treffer abbrechen ist so gewollt... ist ja nur für den aktuellen rückgabewert der farbe des layers... gruss steff 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: 03. Dez. 2009 15:33 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: aber das problem hat gar nichts mit cond zu tun... cond muss nach dem ersten treffer abbrechen ist so gewollt... ist ja nur für den aktuellen rückgabewert der farbe des layers...
mag sein, hab ich nicht überprüft sah beim lesen nur so aus und ich dachte es ändern sich die 3gc's ------------------ Mfg Heiko Elefantenjagd in Afrika "... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..." (www.uni-leipzig.de/~rotheh/elefant.htm) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Steff179 Mitglied Geomatiker
Beiträge: 266 Registriert: 09.08.2007 AutoCAD 2014
|
erstellt am: 04. Dez. 2009 11:59 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
so nach einem tag mapcar seite repetieren, beispile anschauen und kopfzerbrechen hab ich eine neue funktion gschriben bei der wenn man sie anschaut, hoffe ich, nicht gleich wird. nochmal den ganzen code: Code:
(defun c:LF ( / ent lay lfarbe nfarbe) (defun gcinsert (vorher nachher neu lst / part) ;bsp. für neu ((5 . 5)(7 . 7)) (setq part 0) (apply 'append (mapcar '(lambda(a) (cond ((=(car a)vorher)(setq part 1)) ((=(car a)nachher)(setq part 3)) ) (cond ((= part 0)(list a)) ((= part 1)(setq part 2)(append (list a) neu)) ((= part 3)(list a)) ('T nil) ) );end lambda lst);end mapcar );end apply );end defun (while(not(and (setq ent (car(nentsel "\nObjekt wählen: ")))))) (setq lay (entget(tblobjname "LAYER" (cdr (assoc 8 (entget ent)))))) ;best. layerfarbe für truecolordlg ermitteln -> wenn 430 vorhanden ;farbbuch, wenn 420 truecolor ect. (cond ((/= (assoc 430 lay) nil)(setq lfarbe (assoc 430 lay))) ((/= (assoc 420 lay) nil)(setq lfarbe (assoc 420 lay))) ((/= (assoc 62 lay) nil)(setq lfarbe (assoc 62 lay))) ) (setq nfarbe (acad_truecolordlg lfarbe)) (setq lay (gcinsert 70 6 nfarbe lay)) (if nfarbe (progn (entmod lay) (princ "\nDie Farbe wurde geändert! ") ) ) (princ) )
das eigentliche problem bleibt aber bestehen. das wenn ein farbbuch gewählt wurde und nanach wider auf eine der 255 farben zurückgestellt wird in der layersteuerung das nicht korrekt angezeigt. bei truecolor funktioniert es wunderbahr. ich vermute jetzt mal das dies wider mal eine situation ist bei der man nicht um (command) herumkommt. es sei den jemand belehrt mich eines besseren, was häufig vorkommt gruss steff ps.: thx 2 joern bosse deine funktion war mir ein supper leitfaden. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 04. Dez. 2009 12:57 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hallo Steff, ich habe nochmal getestet. Mit folgendem Code scheint alles in Ordnung zu sein, es sei denn Du wählst erst ein Farbbuch aus (d.h. der GC 430 wird in die GC-Liste geschrieben) und danach z.B. eine RGB-Farbe. Bei der Rückgabe der entmod-Funktion wird dann zwar die Liste ohne 430 Code angezeigt, aber intern ist der 430 immer noch drinne Wenn ich dann wieder das Element anwähle, dann wird mit im Farbdialog wieder das Farbbuch vorgeschlagen, bekomme ich mit entmod nicht weg. Naja, ein bißchen zum grübeln was fürs Wochendende:
Code:
(defun c:LF ( / ent lay lfarbe nfarbe farbe) ;end defun (while(setq ent (car(nentsel "\nObjekt wählen: "))) (setq lay (entget(tblobjname "LAYER" (cdr (assoc 8 (entget ent)))))) ;best. layerfarbe für truecolordlg ermitteln -> wenn 430 vorhanden ;farbbuch, wenn 420 truecolor ect. (setq farbe (cond ((assoc 430 lay)(assoc 430 lay)) ((assoc 420 lay)(assoc 420 lay)) ((assoc 62 lay)(assoc 62 lay)))) (if(setq nfarbe (acad_truecolordlg farbe)) (progn (entmod (apply 'append (list(LF:lay_vor_62 lay)nfarbe(LF:lay_nach_62 lay)))) (princ "\nDie Farbe wurde geändert! ")))) (princ) )(defun LF:lay_vor_62 (lay / lay_vor_62) (while (and lay (/= (car(car lay))62)) (setq lay_vor_62 (cons(car lay)lay_vor_62) lay (cdr lay))) (reverse lay_vor_62)) (defun LF:lay_nach_62 (lay / lay_nach_62) (setq lay (reverse lay)) (while (and lay (/= (car(car lay))62)) (setq lay_nach_62 (cons(car lay)lay_nach_62) lay (cdr lay))) (vl-remove-if '(lambda(A) (member (car A) '(420 430)))lay_nach_62))
Der Code ist fast wie Deiner, ein wenig hier und da geändert, kannst ja nochmal durchstöbern. ------------------ viele Grüße Jörn http://www.bosse-engineering.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |