|  |  | 
|  | 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:  Farbe von Objekt ändern (5772 mal gelesen) | 
 | cadplayer Ehrenmitglied
 CADniker
 
      
 
      Beiträge: 1838Registriert: 28.04.2009
 Windows 1064bit 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 und AutoLISPler
 
      
 
      Beiträge: 1781Registriert: 11.10.2004
 Window 11ACAD 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: 13533Registriert: 30.11.2003
 . |    erstellt am: 30. Nov. 2009 13:16  <-- editieren / zitieren -->    Unities abgeben:           Nur für cadplayer   | 
                        | cadplayer Ehrenmitglied
 CADniker
 
      
 
      Beiträge: 1838Registriert: 28.04.2009
 Windows 1064bit 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: 154Registriert: 21.03.2002
 |    erstellt am: 01. Dez. 2009 08:11  <-- editieren / zitieren -->    Unities abgeben:           Nur für cadplayer   | 
                        | cadffm Moderator
 良い精神
 
         
 
  
 
      Beiträge: 22689Registriert: 03.06.2002
 Alles |    erstellt am: 01. Dez. 2009 10:15  <-- editieren / zitieren -->    Unities abgeben:           Nur für cadplayer   | 
                        | cadplayer Ehrenmitglied
 CADniker
 
      
 
      Beiträge: 1838Registriert: 28.04.2009
 Windows 1064bit 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: 123Registriert: 06.02.2009
 XP Professional SP2Intel 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.lspbeides 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: 266Registriert: 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: 1838Registriert: 28.04.2009
 Windows 1064bit 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: 123Registriert: 06.02.2009
 XP Professional SP2Intel 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: 266Registriert: 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: 13533Registriert: 30.11.2003
 . |    erstellt am: 02. Dez. 2009 17:44  <-- editieren / zitieren -->    Unities abgeben:           Nur für cadplayer   | 
                        | Steff179 Mitglied
 Geomatiker
 
   
 
      Beiträge: 266Registriert: 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: 900Registriert: 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: 266Registriert: 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: 900Registriert: 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üftsah 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: 266Registriert: 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 und AutoLISPler
 
      
 
      Beiträge: 1781Registriert: 11.10.2004
 Window 11ACAD 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örnhttp://www.bosse-engineering.com
 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |