Lisp »Tips 'n Tricks
»Path3d.lsp
Il Lisp è una libera interpretazione del classico lisp per piastrellare un vialetto da giardino.
In cosa è diverso dall'originale?
Chiede solo 2 punti estremi del vialetto.
Eliminate le funzioni drawout() e gp_err().
Disegna in 3D.
Il Lisp cerca il file DCL nel percorso segnato in rosso nel codice sorgente.
Procedura:
Seleziona il vertice sinistro in basso
Seleziona il vertice destro in alto
Inserisci le misure nella finestra di dialogo e/o conferma con Invio.
[1] Le misure suggerite.
[2] Le misure modificate.
[3] Particolare del vialetto in pianta.
[4] Particolare del vialetto in vista 3D.
Autore: Claudio Piccini
//path3d.dcl
path3d : dialog {
label = "path";
: boxed_radio_row {
label = "Forma delle piastrelle";
: radio_button {
label = "Poligono";
key = "gp_poly";
}
: radio_button {
label = "Cerchio";
key = "gp_circ";
value = "1";
}
}
: edit_box {
label = "Spessore della piastrella";
key = "gp_spes";
edit_width = 6;
}
: edit_box {
label = "Raggio della piastrella";
key = "gp_trad";
edit_width = 6;
}
: edit_box {
label = "Spaziatura fra le piastrelle";
key = "gp_spac";
edit_width = 6;
}
: edit_box {
label = "Numero di lati";
key = "gp_side";
edit_width = 4;
}
: row {
: spacer { width = 1; }
: button {
label = "OK";
key = "accept";
width = 8;
fixed_width = true;
}
: button {
label = "Annulla";
is_cancel =true;
key = "cancel";
width = 8;
fixed_width = true;
}
: spacer { width = 1; }
}
}
|
;;;
;;; Path3d.lsp - 6 Febbraio 2004
;;; (C) by Claudio Piccini
;;; http://www.cg-cad.com/
;;;
;;; Piastrella in 3d una superficie quadrata o rettangolare
;;; con piastrelle circolari e poligonali.
;;;
;;; Basato su PATH.LSP - Autodesk, Inc.
;;;
(defun myerror (s)
(if (/= s "Function cancelled")
(princ (strcat "\nError: " s))
)
(ripVar)
(princ)
)
(defun salVar (/ p1 p2 ss)
(setq orto (getvar "orthomode"))
(setq snapp (getvar "osmode"))
(setq snm (getvar "snapmode"))
(setq piano (getvar "clayer"))
(setq nomeDir (getvar "dwgprefix"))
)
(defun ripVar ()
(command "_redraw")
(setvar "cmdecho" 1)
(setvar "osmode" snapp)
(setvar "snapmode" snm)
(setvar "orthomode" orto)
(setvar "clayer" piano)
(setq *error* olderr)
(princ)
)
(defun g2r (a)
(* pi (/ a 180.0))
)
(defun gp_dialog ()
(setq tshape "Cerchio")
(setq spes 0.3)
(setq trad 0.5)
(setq tspac 0.1)
(setq tsides 8)
(setq dcl_id (load_dialog "c:/pick/lisp/path3d.dcl"))
(if (not (new_dialog "path3d" dcl_id)) (exit))
(set_tile "gp_spes" "0.3")
(set_tile "gp_trad" "0.5")
(set_tile "gp_spac" "0.1")
(mode_tile "gp_side" 1)
(set_tile "gp_side" "8")
(action_tile "gp_circ" "(setq tshape \"Cerchio\")(mode_tile \"gp_side\" 1)")
(action_tile "gp_poly" "(setq tshape \"Poligono\")(mode_tile \"gp_side\" 0)")
(action_tile "cancel" "(done_dialog)(setq gperr \"\")(exit)")
(action_tile "accept"
(strcat
"(progn (setq spes (atof (get_tile \"gp_spes\")))"
"(setq trad (atof (get_tile \"gp_trad\")))"
"(setq tspac (atof (get_tile \"gp_spac\")))"
"(setq tsides (atoi (get_tile \"gp_side\")))"
"(done_dialog))"
)
)
(start_dialog)
(unload_dialog dcl_id)
(if (= tshape "Cerchio")
(defun gp_tile () (command "_circle" pltile trad))
(defun gp_tile () (command "_polygon" tsides pltile "" trad))
)
)
(defun drow (pd offset)
(setvar "snapang" pangle)
(setq pfirst (polar sp pangle pd))
(setq pctile (polar pfirst angp90 offset))
(setq pltile pctile)
(while (< (distance pfirst pltile) (- dY2 trad))
(gp_tile)
(setq pltile (polar pltile angp90 (+ tspac trad trad)))
)
(setq pltile (polar pctile angm90 (+ tspac trad trad)))
(while (< (distance pfirst pltile) (- dY2 trad))
(gp_tile)
(setq pltile (polar pltile angm90 (+ tspac trad trad)))
)
)
(defun drawtiles ()
(setq pdist (+ trad tspac))
(setq off 0.0)
(while (<= pdist (- plength trad))
(drow pdist off)
(setq pdist
(+ pdist (* (+ tspac trad trad) (sin (g2r 60)))))
(if (= off 0.0)
(setq off (* (+ tspac trad trad) (cos (g2r 60))))
(setq off 0.0)
)
)
)
(defun c:path3d (/ p1 p2 ss)
(setq olderr *error* *error* myerror)
(setvar "cmdecho" 0)
(salVar)
(setvar "blipmode" 1)
(command "osnap" "_non")
(setq p1 (getpoint "\nSeleziona il vertice sinistro in basso"))
(setq p2 (getpoint "\nSeleziona il vertice destro in alto"))
(setq dist12 (distance p1 p2))
(setq ang (angle p1 p2))
(setq dX (* dist12 (cos ang))) ; lunghezza del vialetto
(princ "\nLunghezza (proiezione su X): ")
(princ dX)
(setq ang (angle p1 p2))
(setq dY (* dist12 (sin ang))) ; altezza del vialetto
(princ " Altezza (proiezione su Y): ")
(princ dY)
; se non esiste il layer SIMBOLI lo crea
(if (not (tblsearch "LAYER" "SIMBOLI"))
(progn
(setq regen (getvar "REGENMODE"))
(setvar "REGENMODE" 0)
(command "_layer" "_m" "SIMBOLI")
(command "_c" "2" "SIMBOLI")
(command "")
(setvar "REGENMODE" regen)
)
)
; rende attivo il layer SIMBOLI
(command "_layer" "_s" "simboli" "")
(command "_color" "BYLAYER")
(setq dY2 (/ dY 2))
(setq sp (list (car p1) (+ (cadr p1) dY2)))
(setq ep (list (car p2) (- (cadr p2) dY2)))
(setq pangle (angle sp ep))
(setq plength (distance sp ep))
(setq angp90 (+ pangle (g2r 90)))
(setq angm90 (- pangle (g2r 90)))
(gp_dialog)
(drawtiles)
; estrude le piastrelle
(setq ss (ssget "_W" p1 p2)) ; gruppo di selezione delle piastrelle
(command "_extrude" ss "" spes 0)
(ripVar)
)
;;;eof
|
Lisp »Tips 'n Tricks
|