Lisp »Tips 'n Tricks
»Funzioni ricorsive in AutoLISP
»1
| 2
| 3
| 4
| 5
| 6
| 7 a
, b
, c
, d
, e
>II
>III
>IV
>V
>VI
>VII
CESP.LSP
Con le funzioni ricorsive è possibile disegnare motivi decorativi, ad esempio questo lisp disegna un cespuglio.
;;;
;;; cesp.lsp - 9 Marzo 2004
;;; (C) 2004 by Claudio Piccini.
;;; www.cg-cad.com
;;;
;;; disegna un cespuglio
;;;
(defun myerror (s)
(if (/= s "Function cancelled")
(princ (strcat "\nError: " s))
)
(ripVar)
(princ)
)
(defun salVar ()
(setq orto (getvar "orthomode"))
(setq snapp (getvar "osmode"))
(setq snm (getvar "snapmode"))
(setq piano (getvar "clayer"))
)
(defun ripVar ()
(command "_redraw")
(setvar "cmdecho" 1)
(setvar "osmode" snapp)
(setvar "snapmode" snm)
(setvar "orthomode" orto)
(setvar "clayer" piano)
(setvar "cecolor" "BYLAYER")
(setq *error* olderr)
(princ)
)
; converte angolo da gradi in radianti
(defun g2r (a)
(* pi (/ a 180.0))
)
(defun disegna (lung ang)
(if (< lung n)
(progn
(setq p3 (polar p1 ang lung))
(command "_line" p1 p3 "")
(setq p1 (polar p1 ang lung))
)
(progn
(disegna (/ lung (sqrt 2.0))(+ (* ang -1)(g2r 15)))
(command "_color" "_green")
(disegna (/ lung (sqrt 2.0))(+ (* ang -1)(g2r 90)))
(command "_color" "_yellow")
(disegna (/ lung (sqrt 2.0))(- (* ang -1)(g2r 45)))
)
)
)
(defun c:cesp (/ p1 p2 ang lung n
olderr orto snapp snm piano
)
(setq olderr *error* *error* myerror)
(setvar "cmdecho" 0)
(salVar)
(command "_osnap" "_non")
(setq p1 (getpoint "\nprimo punto:"))
(setq p2 (getpoint p1 "\nsecondo punto: "))
;tenersi bassi con il numero di iterazioni
(setq n (getint "\nnumero iterazioni: "))
(setq ang (angle p1 p2))
(setq lung (distance p1 p2))
(setq n (/ lung n))
(disegna lung ang)
(ripVar)
)
;;;eof
|
Test del LISP
Command: cesp
primo punto:
secondo punto:
numero iterazioni: 8
Command: cesp
primo punto:
secondo punto:
numero iterazioni: 12
STAR.LSP
; Star -- Draw a Star
; Original by Carl Guerin !!/11/92
;
; Modified by Claudio Piccini, www.cg-cad.com
; 9 Marzo 2004
(defun sstar (outrad n / count)
(if (and (> n 0)(> outrad inrad))
(progn
(command "_PLINE")
(setq Count 0)
(while (< Count Points)
(command (polar Center (* Count Incr) OutRad))
(if (= Count 0)
(command "_width" "0" "0")
)
(command (polar center (+ (* Count Incr) Incr2) InRad))
(setq Count (1+ Count))
)
(command "_close")
(sstar (- outrad dim) (- n 1))
)
)
)
; Star -- Draw a Star
(defun C:STAR ( / outrad inrad points incr incr2)
(setvar "cmdecho" 0)
(setq snapp (getvar "osmode"))
(command "_osnap" "_non")
(initget 1)
(setq Center (getpoint "\nCenter of Star: "))
(initget (+ 1 2 4))
(setq OutRad (getdist "\nOutside Radius: " Center))
(initget (+ 1 2 4))
(setq InRad (getdist "\nInside Radius: " Center))
(initget (+ 1 2 4))
(setq Points (getint "\nNumber of Points: "))
(while (< Points 2)
(prompt "\nMust have at least 2 points!\n")
(initget (+ 1 2 4))
(setq Points (getint "\nNumber of Points: "))
)
(setq Incr (/ (* 2 pi) Points))
(setq Incr2 (/ Incr 2))
(setq n (getint "\nNumero iterazioni: "))
(setq dim (/ outrad n))
(sstar outrad n)
(setvar "osmode" snapp)
(command "_redraw")
(setvar "cmdecho" 1)
(princ)
)
|
STAR2.LSP
; Star -- Draw a Star
; Original by Carl Guerin !!/11/92
;
; Modified by Claudio Piccini, www.cg-cad.com
; 9 Marzo 2004
(defun sstar (outrad n / count)
(if (> n 0)
(progn
(command "_PLINE")
(setq Count 0)
(while (< Count Points)
(command (polar Center (* Count Incr) OutRad))
(if (= Count 0)
(command "_width" "0" spes)
)
(command (polar center (+ (* Count Incr) Incr2) InRad))
(setq Count (1+ Count))
(if (= Count Points)
(command "_width" spes "0")
)
)
(command "_close")
(setq spes 0)
(command "_color" "_yellow")
(sstar (- outrad dim) (- n 1))
)
)
)
(defun C:STAR ( / outrad inrad points incr incr2)
(setvar "cmdecho" 0)
(setq snapp (getvar "osmode"))
(command "_osnap" "_non")
(initget 1)
(setq Center (getpoint "\nCenter of Star: "))
(initget (+ 1 2 4))
(setq OutRad (getdist "\nOutside Radius: " Center))
(initget (+ 1 2 4))
(setq InRad (getdist "\nInside Radius: " Center))
(initget (+ 1 2 4))
(setq Points (getint "\nNumber of Points: "))
(while (< Points 2)
(prompt "\nMust have at least 2 points!\n")
(initget (+ 1 2 4))
(setq Points (getint "\nNumber of Points: "))
)
(setq Incr (/ (* 2 pi) Points))
(setq Incr2 (/ Incr 2))
(setq n (getint "\nNumero iterazioni: "))
(setq spes (/ inrad 3))
(setq dim (/ outrad n))
(command "_color" "_red")
(sstar outrad n)
(command "_color" "_BYLAYER")
(setvar "osmode" snapp)
(command "_redraw")
(setvar "cmdecho" 1)
(princ)
)
|
Test del LISP
Command: star
Center of Star:
Outside Radius:
Inside Radius:
Number of Points: 100
Numero iterazioni: 100
Lisp »Tips 'n Tricks
Ultimo Aggiornamento_Last Update: 9 Marzo 2004
|