Come copiare un blocco lungo una polilinea
- Details
- Category: Lisp
- Published on Tuesday, 06 December 2011 17:29
- Hits: 432
Lo scopo di questo programmino è quello di copiare ripetutamente un determinato blocco con un intervallo a scelta.
Questa funzione è molto utile se si vuole impostare una metrica su una particolare linea, che sia curva o squadrata.
;Lo scopo di questo programmino è quello di copiare ripetutamente ;un determinato blocco con un intervallo a scelta. ;questa funzione è molto utile se si vuole impostare ;una metrica su una particolare linea, che sia curva o squadrata. (defun C:cppl(/ ang cumm_dist dis dist_list leng obj pt) ;carico alcune librerie che userò in seguito (vl-load-com) (graphscr) ;imposto la variabile "dis" a zero (setq dis 0.0) ;chiedo all'utente di selezionare una polilinea che associo alla variabile "obj" (setq obj (vlax-ename->vla-object (car (entsel "\nSelezionare polilinea guida :")))) ;ne calcolo la lunghezza e la memorizzo nella variabile "leng" (setq leng (vlax-curve-getdistatpoint obj (vlax-curve-getendpoint obj))) ;chiedo all'utente di inserire l'intervallo tra le varie ripetizioni (initget 2) (setq intervallo (getdist "\nInserire intervallo :")) ;chiedo di selezionare il blocco che dovrà essere ripetuto lungo la linea (setq elemento (car(entsel "\nSelezionare blocco da ripetere :")) ) ;ne ricavo il nome (setq elemento1 (entget elemento )) (setq nome_elemento (cdr (assoc 2 elemento1))) ;nome blocco ;chiedo se alla successione dei blocchi va associato un testo indicante la distanza (initget 0 "Si No") (setq ok_numerazione (getkword "\nInserire numerazione progressiva? (Si o No):")) (if (= ok_numerazione nil) (setq ok_numerazione "Si")) ;se è stato scelto di inserire la numerazione allora chiedo la grandezza del testo (if (= ok_numerazione "Si") (setq altezza_testo (getreal "\nInserire altezza testo:"))) ;creazione della successione di blocchi lungo la polilinea ;fino a che la variabile "dis" sarà minore della lunghezza della polilinea (while (< dis leng) ;ricavo il punto corrispondente alla distanza "dis" sulla curva" e lo memorizzo in "pt" (setq pt (vlax-curve-getpointatdist obj dis)) ;ricavo l'angolo: (setq ang ( angle '(0 0 0) ( vlax-curve-getfirstderiv obj ( vlax-curve-getparamatpoint obj pt ) ) )) ;inserisco il blocco scelto in precedenza: (vlax-invoke ( vla-get-modelspace ( vla-get-activedocument (vlax-get-acad-object) ) ) 'InsertBlock pt nome_elemento 1 1 1 ang) ;se si è scelto di inserire la numerazione allora inserisce il testo (if (= ok_numerazione "Si") (setq new_text (vlax-invoke (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)) ) 'AddText (rtos dis 2 4 ) pt altezza_testo ) ) ) ;incremento la distanza lungo la polilinea di un intervallo prescelto (setq dis (+ dis intervallo)) ) (princ) ) (princ "File caricato correttamente!\nPer copiare un blocco su una polilinea digitare 'cppl'")

