Normalmente da una polilinea bisogna estrapolare i suoi vertici e la curvatura ad ogni vertice. Questi dati sono sempre annidati e ogni volta bisogna usare le solite funzioni di ricerca car, cadr, nth, ecc...
A questo scopo ho creato una nuova funzione che mi restituisce una lista dati sintetica della polilinea, contenente solo le coordinate dei vertici e la curvatura ad ogni vertice, che poi, fra l'altro, sono i dati più usati. L'ultimo codice 42 viene inserito solo se la polilinea è chiusa e l'ultimo elemento è la direzione di estrusione che mi aiuta a capire in quale UCS è stata creata la polilinea. Le coordinate dei punti sono infatti quelli dell'UCS di costruzione della polilinea.
Sintassi:
(listpoly entità_polilinea)
Argomento:
entità_polilinea - una polilinea selezionata
(defun listpoly (poly / index lispoly lispoly2 ultimo)
(setq lispoly (member (assoc 10 (entget poly)) (entget poly))
lispoly (vl-remove (assoc 40 lispoly) lispoly)
lispoly (vl-remove (assoc 41 lispoly) lispoly)
)
(if (assoc 91 lispoly)
(setq lispoly (vl-remove (assoc 91 lispoly) lispoly))
)
(setq index 0)
(repeat (cdr (assoc 90 (entget poly)))
(setq lispoly2 (vl-remove (car (nth index lispoly)) (nth index lispoly))
lispoly2 (consr (cdr (assoc 38 (entget poly))) lispoly2)
lispoly (subst lispoly2 (nth index lispoly) lispoly)
)
(setq index (+ index 2))
)
(if (or (= (cdr (assoc 70 (entget poly))) 0)
(= (cdr (assoc 70 (entget poly))) 128)
)
(progn
(setq ultimo (last lispoly))
(setq lispoly (reverse (cons ultimo (cddr (reverse lispoly)))))
)
lispoly
)
)
Come si è potuto notare c'è anche un'altra funzione, la funzione consr:
Sintassi:
(consr elemento lista)
argomenti:
elemento - elemento da aggiungere alla lista
lista - una lista...
(defun consr (elemento lista)
(reverse(cons elemento (reverse lista)))
)
la funzione cons mi inserisce l'elemento sempre all'inizio della lista e questo non mi serve quasi mai, dopo devo fare ulteriori manipolazioni per avere l'elemento alla fine.
La semplice funzione consr, invece, mi inserisce direttamente l'elemento alla fine senza bisogno di ulteriori modifiche.
Spero che il tutto possa tornare utile anche a qualcun altro e se c'è già qualche altra funzione che svolge questo compito fra le vlax-, vla, vl, vorrà dire che non me ne sono accorto!