Come copiare un blocco lungo una polilinea

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'") 
Compago