Stampa Pagina | Chiudi Finestra

Eliminare i vertici di una polilinea

Stampato da: TuttoCAD Forum
URL Discussione: http://www.cadlandia.com/topic.asp?TOPIC_ID=11403
Stampato il: 25 aprile 2024

Discussione:


Autore Discussione: Jarjarfix1
Oggetto: Eliminare i vertici di una polilinea
Inserito il: 08 gennaio 2009 17:53:31
Messaggio:

Buona sera a tutti.
Da un po di tempo utilizzo il Lisp (che riporto sotto) per eliminare i vertici delle mie polilinee 2d. Purtroppo mi sono accorto che, dopo aver utilizzato il programmino, le mie polilinee 2d si sono trasformate in polilinne 3d. Questo non mi permette di unirle con altre polilinee.
Da perfetto ignorante in materia di programmazione Lisp ci chiedo se si riesce a modificare il programma in modo che le polilinee rimangano 2d.
Grazie a tutti

(defun c:EV () ;;; elimina un vertice della polilinea.
(setvar "cmdecho" 0)
(setq lista-punti nil)
(setq lista-puntiZ nil)
(setq clay(getvar "clayer"))
(setq RF0(car(entsel "\n Seleziona la polilinea: ")))
(if RF0 (vai6))
(princ)
)
;---------------------------------------------------------------------
(defun vai6 ()
(if (or (= (cdr (assoc 0 (entget RF0))) "LWPOLYLINE")(= (cdr (assoc 0 (entget RF0))) "POLYLINE"))
(progn
(setq lista-punti nil)
(setq Xmin 100000000.00)
(setq Ymin 100000000.00)
(setq Xmax -100000000.00)
(setq Ymax -100000000.00)
(setq Ramo(entget RF0))
(if (= (cdr(assoc 0 Ramo)) "POLYLINE")
(progn
(setq 0ent0(entnext RF0))
(setq 0ent(entget 0ent0))
(setq 0entT(cdr(assoc 0 0ent)))
(while (/= 0entT "SEQEND")
(setq X(car (cdr(assoc 10 0ent))))
(setq Y(cadr (cdr(assoc 10 0ent))))
(setq Z(caddr (cdr(assoc 10 0ent))))
(setq lista-punti(cons (list X Y Z) lista-punti))
(setq 0ent0(entnext 0ent0))
(setq 0ent(entget 0ent0))
(setq 0entT(cdr(assoc 0 0ent)))
(if (< X Xmin)(setq Xmin X))
(if (< Y Ymin)(setq Ymin Y))
(if (> X Xmax)(setq Xmax X))
(if (> Y Ymax)(setq Ymax Y))
)
)
)
(if (= (cdr (assoc 0 Ramo)) "LWPOLYLINE")
(progn
(setq lista-punti0(member (assoc 10 Ramo) Ramo))
(setq cont 0)
(repeat (/ (- (length lista-punti0) 1) 4)
(setq cod(nth cont lista-punti0))
(setq lista-punti(cons (list (cadr cod) (caddr cod) 0) lista-punti))
(if (< X Xmin)(setq Xmin X))
(if (< Y Ymin)(setq Ymin Y))
(if (> X Xmax)(setq Xmax X))
(if (> Y Ymax)(setq Ymax Y))
(setq cont(+ cont 4))
)
))
(initget (+ 1 2 128))
(setq Vpoli(getpoint "\n Seleziona il vertice da eliminare: "))
(setq Vpoli (list (car Vpoli) (cadr Vpoli)))
(setq kk 0)
(repeat (length lista-punti)
(setq E1(nth kk lista-punti))
(setq XY(list (car E1) (cadr E1)))
(if (not (equal XY Vpoli 0.0001))
(setq lista-puntiZ(cons E1 lista-puntiZ))
)
(setq kk(+ kk 1))
)
(setq lista-puntiZ(reverse lista-puntiZ))
(setq ent(entget RF0))
(setq piano(cdr(assoc 8 ent)))
(command "_erase" RF0 "" )
(CreaPolilinea lista-puntiZ)
))
)
;---------------------------------------------------------------------
(defun CreaPolilinea (lista-vertici)
(entmake (list
(cons 0 "POLYLINE")
(cons 8 piano)
(cons 70 8)
)
)
(setq k 0)
(repeat (length lista-vertici)
(setq V(nth k lista-vertici))
(setq VX(car V))
(setq VY(cadr V))
(setq VQ(caddr V))
(entmake (list
(cons 0 "VERTEX")
(cons 8 piano)
(cons 10 (list VX VY VQ))
(cons 70 32)
)
)
(setq k(+ k 1))
)
(entmake (list (cons 0 "SEQEND") (cons 8 piano)))
)
;---------------------------------------------------------------------
(princ "\n Digitare EV per lanciare il programma")
(princ "\n <Copyright: ing. Claudio Granuzzo - 2002> ")
(princ)

Risposte:


Autore Risposta: GP
Inserita il: 08 gennaio 2009 22:35:32
Messaggio:

Dovrebbe funzionare:


(defun c:EV () ;;; elimina un vertice della polilinea.
(setvar "cmdecho" 0)
(setq lista-punti nil)
(setq lista-puntiZ nil)
(setq clay(getvar "clayer"))
(setq RF0(car(entsel "\n Seleziona la polilinea: ")))
(if RF0 (vai6))
(princ)
)
;---------------------------------------------------------------------
(defun vai6 ()
(if (or (= (cdr (assoc 0 (entget RF0))) "LWPOLYLINE")(= (cdr (assoc 0 (entget RF0))) "POLYLINE"))
(progn
(setq lista-punti nil)
(setq Xmin 100000000.00)
(setq Ymin 100000000.00)
(setq Xmax -100000000.00)
(setq Ymax -100000000.00)
(setq Ramo(entget RF0))
(if (= (cdr(assoc 0 Ramo)) "POLYLINE")
(progn
(SETQ TIPO_PL (CDR (ASSOC 70 Ramo)))
(setq 0ent0(entnext RF0))
(setq 0ent(entget 0ent0))
(setq 0entT(cdr(assoc 0 0ent)))
(while (/= 0entT "SEQEND")
(setq X(car (cdr(assoc 10 0ent))))
(setq Y(cadr (cdr(assoc 10 0ent))))
(setq Z(caddr (cdr(assoc 10 0ent))))
(setq lista-punti(cons (list X Y Z) lista-punti))
(setq 0ent0(entnext 0ent0))
(setq 0ent(entget 0ent0))
(setq 0entT(cdr(assoc 0 0ent)))
(if (< X Xmin)(setq Xmin X))
(if (< Y Ymin)(setq Ymin Y))
(if (> X Xmax)(setq Xmax X))
(if (> Y Ymax)(setq Ymax Y))
)
)
)
(if (= (cdr (assoc 0 Ramo)) "LWPOLYLINE")
(progn
(setq lista-punti0(member (assoc 10 Ramo) Ramo))
(setq cont 0)
(SETQ TIPO_PL (CDR (ASSOC 70 Ramo)))
(repeat (/ (- (length lista-punti0) 1) 4)
(setq cod(nth cont lista-punti0))
(setq lista-punti(cons (list (cadr cod) (caddr cod) 0) lista-punti))
(if (< X Xmin)(setq Xmin X))
(if (< Y Ymin)(setq Ymin Y))
(if (> X Xmax)(setq Xmax X))
(if (> Y Ymax)(setq Ymax Y))
(setq cont(+ cont 4))
)
))
(initget (+ 1 2 128))
(setq Vpoli(getpoint "\n Seleziona il vertice da eliminare: "))
(setq Vpoli (list (car Vpoli) (cadr Vpoli)))
(setq kk 0)
(repeat (length lista-punti)
(setq E1(nth kk lista-punti))
(setq XY(list (car E1) (cadr E1)))
(if (not (equal XY Vpoli 0.0001))
(setq lista-puntiZ(cons E1 lista-puntiZ))
)
(setq kk(+ kk 1))
)
(setq lista-puntiZ(reverse lista-puntiZ))
(setq ent(entget RF0))
(setq piano(cdr(assoc 8 ent)))
(command "_erase" RF0 "" )
(CreaPolilinea lista-puntiZ)
))
)
;---------------------------------------------------------------------
(defun CreaPolilinea (lista-vertici)
(entmake (list
(cons 0 "POLYLINE")
(cons 8 piano)
(cons 70 8) ----> cancellare la riga
(CONS 70 TIPO_PL)
)
)
(setq k 0)
(repeat (length lista-vertici)
(setq V(nth k lista-vertici))
(setq VX(car V))
(setq VY(cadr V))
(setq VQ(caddr V))
(entmake (list
(cons 0 "VERTEX")
(cons 8 piano)
(cons 10 (list VX VY VQ))
(cons 70 32) ----> cancellare la riga
(cons 70 0)
)
)
(setq k(+ k 1))
)
(entmake (list (cons 0 "SEQEND") (cons 8 piano)))
)
;---------------------------------------------------------------------
(princ "\n Digitare EV per lanciare il programma")
(princ "\n <Copyright: ing. Claudio Granuzzo - 2002> ")
(princ)


Autore Risposta: Jarjarfix1
Inserita il: 09 gennaio 2009 09:51:47
Messaggio:

Ho provato ma purtroppo non funziona più nemmeno il comando.
Questo è il messaggio che mi viene riportato

Seleziona la polilinea: ; errore: no function definition: VAI6


Autore Risposta: GP
Inserita il: 09 gennaio 2009 11:56:45
Messaggio:

Boh, a me funzia.

Incolla il testo che ho postato sopra cancellando le linee che ho evidenziato in rosso.

Facce sape'


Autore Risposta: arri
Inserita il: 09 gennaio 2009 12:18:28
Messaggio:

Citazione:
Messaggio inserito da GP

Boh, a me funzia.

Incolla il testo che ho postato sopra cancellando le linee che ho evidenziato in rosso.

Facce sape'



per evitare questi disguidi basta che gli anteponi il punto e virgola (alle righe da cancellare) così diventano ininfluenti per chi copia incolla tutto


Autore Risposta: Jarjarfix1
Inserita il: 09 gennaio 2009 14:29:48
Messaggio:

Con il "punto e virgola" fuinziona tutto alla perfezione....Grazie mille


Autore Risposta: GP
Inserita il: 09 gennaio 2009 16:33:18
Messaggio:

Citazione:
Messaggio inserito da arri


per evitare questi disguidi basta che gli anteponi il punto e virgola (alle righe da cancellare) così diventano ininfluenti per chi copia incolla tutto

E' una cosa che faccio normalmente, ma spesso capita di incollare solo porzioni di lisp e il punto e virgola, essendo poco visibile, sistematicamente "scappa" a qualcuno, è per questo che ho preferito evidenziare, però hai ragione.



Citazione:
Messaggio inserito da Jarjarfix1

Con il "punto e virgola" fuinziona tutto alla perfezione....Grazie mille

Invece cancellando la riga rossa no?


Autore Risposta: Jarjarfix1
Inserita il: 06 dicembre 2012 16:13:53
Messaggio:

A distanza di tempo ho riprovato a installare questo lisp ma non riesco a farlo funzionare.
L'errore che mi da è il seguente

Comando: _EV
Seleziona la polilinea: ; errore: tipo di argomento errato: consp 0

Ho autocad 2012 full mentre prima (quando funzionava) avevo la versione 2008.
Qualcuno mi sa essere d'aiuto?
Grazie in anticipo


Autore Risposta: GP
Inserita il: 06 dicembre 2012 17:35:47
Messaggio:

Visto che utilizzi la 2012 posizionati sul grip del vertice da eliminare, viene visualizzata in automatico l'opzione per la rimozione.


Autore Risposta: Jarjarfix1
Inserita il: 06 dicembre 2012 17:38:38
Messaggio:

Mi stento stupido per non essermene accorto........grazie mille


TuttoCAD Forum : http://www.cadlandia.com/

© 2001-2010 CADLandia

Chiudi Finestra