TheSwamp

Code Red => AutoLISP (Vanilla / Visual) => Topic started by: yasser.mahran on March 09, 2016, 09:05:38 AM

Title: Lisp for Coloring entities by Elevation in RGB Colors (Gradient)
Post by: yasser.mahran on March 09, 2016, 09:05:38 AM
Hey all, I was searching for a lisp that would do the following: Color entities (polylines/lines) according to their elevation in RGB Gradient manner, what so far I came with is a lisp that would color point clouds but I couldn't use, and some non-free tools like EzySurf (Extra) and Carlson Civil but both use ACI Index, therefore options are limited, and so elevations, What I need is a one that could color entitis in RGB colors, let's say I have a set of polylines, minimum has zero elevation, maximum is 45, so I need the color of the lowest one to be (0,0,0)-Absolute Black, and the color of the highest to be (255,255,255) i.e absolute white, and the ones between to be gradient of both? and thanks in advance!
Title: Re: Lisp for Coloring entities by Elevation in RGB Colors (Gradient)
Post by: ChrisCarlson on March 09, 2016, 09:49:26 AM
Need some more information, will you really have more than 255 different elevations? You list a min. elevation, is there a maximum?

 
Title: Re: Lisp for Coloring entities by Elevation in RGB Colors (Gradient)
Post by: yasser.mahran on March 09, 2016, 09:57:24 AM
Actually I have more than  255, contour line every 0.5 m for 180 meters, that would be 180*2=360 elevations, but since maximum is 255, it will be just fine, maximum elevation is 45 cm (180 m)
Title: Re: Lisp for Coloring entities by Elevation in RGB Colors (Gradient)
Post by: Lee Mac on March 09, 2016, 10:02:14 AM
This old code will get you started for polylines: Elevation Colour Map (http://www.cadtutor.net/forum/showthread.php?72778-altitude-by-color-hypsomtric-gradient&p=497017&viewfull=1#post497017)
Title: Re: Lisp for Coloring entities by Elevation in RGB Colors (Gradient)
Post by: yasser.mahran on March 09, 2016, 10:19:53 AM
that code is fine, however I was looking for something that would allow more elevations, I actually have more than 255, PLUS I need the colors to be GRADIENT between two colors, this code is similar to "color contours by elevation" function in Carlson Civil tools, What I was looking for is something that would give the following result: (http://i.stack.imgur.com/C31CQ.png), see? coloring in a Gradient manner
Title: Re: Lisp for Coloring entities by Elevation in RGB Colors (Gradient)
Post by: ronjonp on March 09, 2016, 10:26:28 AM
You could try this .. welcome to TheSwamp :)

Code - Auto/Visual Lisp: [Select]
  1. (defun c:clrelev (/ _dxf co i mx n out ss)
  2.   (defun _dxf (code ename)
  3.     (if (and ename (= (type ename) 'ename))
  4.       (cdr (assoc code (entget ename '("*"))))
  5.     )
  6.   )
  7.   (if (setq ss (ssget ":L" (list '(0 . "lwpolyline,line"))))
  8.     (progn
  9.                  (vlax-get-acad-object)
  10.                  (strcat "AutoCAD.AcCmColor." (substr (getvar "acadver") 1 2))
  11.                )
  12.       )
  13.       (foreach x (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
  14.         (setq out (cons (list x
  15.                               (if (= "LINE" (_dxf 0 x))
  16.                                 (apply 'max (list (last (_dxf 10 x)) (last (_dxf 11 x))))
  17.                                 (_dxf 38 x)
  18.                               )
  19.                         )
  20.                         out
  21.                   )
  22.         )
  23.       )
  24.       (if (zerop (setq mx (apply 'max (mapcar 'cadr out))))
  25.         (print "Largest Elevation is Zero...")
  26.         (progn
  27.           (setq i (/ 255. mx))
  28.           (foreach x out
  29.             (if (minusp (cadr x))
  30.               (print "Negative Elevation")
  31.               (progn
  32.                 (setq n (fix (* i (cadr x))))
  33.                 (if (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-setrgb (list co n n n))))
  34.                   (vl-catch-all-apply 'vla-put-truecolor (list (vlax-ename->vla-object (car x)) co))
  35.                 )
  36.               )
  37.             )
  38.           )
  39.         )
  40.       )
  41.     )
  42.   )
  43.   (princ)
  44. )
Title: Re: Lisp for Coloring entities by Elevation in RGB Colors (Gradient)
Post by: yasser.mahran on March 09, 2016, 12:41:20 PM
EXCELLENT! Can you just be more generous and give hints about how someone could play with color values so that it the gradient can be used between any two colors? I mean (n n n) is the color, ain't it? anyways, million thanks!
Title: Re: Lisp for Coloring entities by Elevation in RGB Colors (Gradient)
Post by: Lee Mac on March 09, 2016, 01:23:32 PM
Here's another, adjust the colour ranges to suit (RGB values between 0-255):
Code - Auto/Visual Lisp: [Select]
  1. (defun c:zmap ( / cma cmi del elv enx idx lst pct rng sel zmn zmx )
  2.     (setq cmi '(255   0   0) ;; Minimum colours
  3.           cma '(255 255   0) ;; Maximum colours
  4.           zmx 0.0
  5.           zmn 0.0
  6.     )
  7.     (if (setq sel (ssget "_:L" '((0 . "LINE,LWPOLYLINE"))))
  8.         (progn
  9.             (repeat (setq idx (sslength sel))
  10.                 (setq enx (entget (ssname sel (setq idx (1- idx))))
  11.                       elv (if (= "LINE" (cdr (assoc 0 enx)))
  12.                               (max (cadddr (assoc 10 enx)) (cadddr (assoc 11 enx)))
  13.                               (cdr (assoc 38 enx))
  14.                           )
  15.                       lst (cons (list enx elv) lst)
  16.                       zmx (max zmx elv)
  17.                       zmn (min zmn elv)
  18.                 )
  19.             )
  20.             (setq rng (mapcar '- cma cmi)
  21.                   del (- zmx zmn)
  22.             )
  23.             (if (equal 0.0 del 1e-8)
  24.                 (princ "\nNo change in elevation.")
  25.                 (foreach itm lst
  26.                     (setq pct (/ (- (cadr itm) zmn) del))
  27.                     (entmod
  28.                         (append (car itm)
  29.                             (list
  30.                                 (cons 420
  31.                                     (apply 'LM:rgb->true
  32.                                         (mapcar '(lambda ( a b ) (+ a (* b pct))) cmi rng)
  33.                                     )
  34.                                 )
  35.                             )
  36.                         )
  37.                     )
  38.                 )
  39.             )
  40.         )
  41.     )
  42.     (princ)
  43. )
  44.  
  45. ;; RGB -> True  -  Lee Mac
  46. ;; Args: r,g,b - [int] Red, Green, Blue values
  47.  
  48. (defun LM:RGB->True ( r g b )
  49.     (logior (lsh (fix r) 16) (lsh (fix g) 8) (fix b))
  50. )
  51.  

Colour Conversion function from here (http://lee-mac.com/colourconversion.html#rgbtru).
Title: Re: Lisp for Coloring entities by Elevation in RGB Colors (Gradient)
Post by: ronjonp on March 09, 2016, 01:33:02 PM
EXCELLENT! Can you just be more generous and give hints about how someone could play with color values so that it the gradient can be used between any two colors? I mean (n n n) is the color, ain't it? anyways, million thanks!
The (n n n) represents (Red Green Blue) each with a value of 0-255. Look at the graphic below to see how the number change colors.
Title: Re: Lisp for Coloring entities by Elevation in RGB Colors (Gradient)
Post by: dgorsman on March 09, 2016, 05:38:35 PM
In order to establish a gradient between two RGB colors you can do a linear interpolation between each of the three values (R, G, B) based on the number of steps needed.  For example, if the (R) value changes from 10 to 200, and you need 50 steps, then each step changes the (R) value by (200 - 10)/50 or 3.8.  RGB colors are integers so there will have to be some kind of rounding or truncation applied to the final value.
Title: Re: Lisp for Coloring entities by Elevation in RGB Colors (Gradient)
Post by: yasser.mahran on March 10, 2016, 03:28:25 AM
Thanks Lee! it works perfectly, amd thanks Ron for clarifying, yup I know about RGB, i is probably the increment, wonderful script, a lot of people were looking for it, now we can create elevation maps with autocad, and Yes dgorsman, I know values won't be exact, but rounded will be just fine!