btronic

Roughen lsp

Jun 25th, 2012
1,043
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; ROUGHEN.LSP: Routine to "roughen" a polyline
  2.  
  3. ;  copyright 1993 by Mark Middlebrook, Daedalus Consulting
  4. ;  prepared for AutoCAD Power Tools,  12 Sept 93
  5. ;------------------------------------------------------------------------
  6.  
  7. (defun C:ROUGHEN (/ olderr basicziglen roughness en etype en1 en2 vtx1 vtx2
  8.                     seglen segang inclen zignum ziglen zigdist
  9.                     wanderdist wanderang newvtx seed)
  10.  
  11.    ;error handler
  12.    (setq olderr *error*)
  13.    (defun *error* (msg)
  14.       (if (= msg "quit / exit abort")
  15.          (princ)
  16.          (princ (strcat "error: " msg))
  17.       )
  18.       (setq *error* olderr)
  19.       (princ)
  20.    )
  21.  
  22.    ;set desired length and roughness of "zigzags" here:  
  23.    (setq basicziglen (* 0.2 (getvar "DIMSCALE")) ;larger is longer segment
  24.          roughness (* 0.07 (getvar "DIMSCALE"))  ;larger is rougher amplitude
  25.    )
  26.  
  27.    (setq ocmd (getvar "CMDECHO"))
  28.    (setvar "CMDECHO" 0)
  29.  
  30.    (setq en (car (entsel "\nSelect a Polyline or Line: "))
  31.          etype (cdr (assoc 0 (entget en)))
  32.    )
  33.  
  34.    (cond
  35.       ((equal etype "LINE")                     ;is entity a Line?
  36.          (command "._PEDIT" en "_Yes" "_eXit")  ;make it a Pline
  37.          (setq en (entlast)                     ;reset en
  38.                etype (cdr (assoc 0 (entget en)))
  39.          )
  40.       )
  41.    )
  42.  
  43.    (cond
  44.       ((equal etype "POLYLINE")              ;is entity a Pline?
  45.          (setq en1 (entnext en)                 ;first vertex
  46.                en2 (entnext en1)                ;second vertex
  47.          )
  48.          (command "._PEDIT" en "_Edit")         ;edit vertex
  49.  
  50.          (while (/= "SEQEND" (cdr (assoc 0 (entget en2))))
  51.             (setq vtx1 (cdr (assoc 10 (entget en1)))
  52.                   vtx2 (cdr (assoc 10 (entget en2)))
  53.                   seglen (distance vtx1 vtx2)
  54.                   segang (angle vtx1 vtx2)
  55.                   zignum (fix (/ seglen basicziglen)) ;# of "zigzags"...
  56.                   zignum (max zignum 2)               ; but not less than 2
  57.                   ziglen (/ seglen zignum)            ;zigzag length
  58.                   zigdist ziglen
  59.                   i 2
  60.             )
  61.  
  62.             (repeat (1- zignum)
  63.                (setq newvtx (polar vtx1 segang zigdist)  ;vertex init. loc.
  64.                      wanderdist (* roughness (randnum))
  65.                      wanderang (if (= (rem i 2) 1)       ;wander back & forth
  66.                                     (+ segang (/ pi 4))
  67.                                     (- segang (/ pi 4))
  68.                                );if
  69.                );setq
  70.                (command "_Insert" newvtx "_Next"
  71.                         "_Move" (polar newvtx wanderang wanderdist))
  72.                (setq zigdist (+ ziglen zigdist)
  73.                      i (1+ i)
  74.                )
  75.             );repeat
  76.  
  77.             (command "_Next")
  78.             (setq en1 en2
  79.                   en2 (entnext en1)
  80.             )
  81.          );while
  82.  
  83.          (command "_eXit" "_eXit")     ;exit PEDIT
  84.          (redraw en)
  85.       );entity is a Pline
  86.  
  87.       (T (prompt "\nEntity is not a Polyline or Line."))
  88.    );cond
  89.  
  90.    (setvar "CMDECHO" ocmd)
  91.    (setq *error* olderr)
  92.    (princ)
  93. );defun
  94.  
  95. ;Random number generation function - based on the linear
  96. ; congruential method as presented in Doug Cooper's book
  97. ; Condensed Pascal, pp. 116-117.
  98. ; Returns a random number between 0 and 1.
  99. (defun randnum ()
  100.    (if (not seed) (setq seed (getvar "DATE")))
  101.    (setq modulus 65536
  102.          multiplier 25173
  103.          increment 13849
  104.          seed (rem (+ (* multiplier seed) increment) modulus)
  105.          random (/ seed modulus)
  106.    )
  107. )
  108.  
  109. (prompt "\nROUGHEN loaded.  Type ROUGHEN to run it.")
  110. (princ)
RAW Paste Data