cg-Cad

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.

PATH3D.LSP
[1] Le misure suggerite.



PATH3D.LSP
[2] Le misure modificate.



PATH3D.LSP
[3] Particolare del vialetto in pianta.



PATH3D.LSP
[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