Riconoscimento di una polilinea

Angelo2449

Utente Junior
Professione: Pensionato
Software: Autocad
Regione: Lombardia
#1
Salve a tutti,
vorrei controllare la selezione di una polilinea ed ho scritto questo :
Codice:
(while (= ed1 nil)
                (setq ed1 (entsel "\nSeleziona la Polilinea esterna : "))
            );;while

            (setq ed11 (entget (entlast)))
            (setq ed111 (cdr (assoc 0 ed11)))

            (princ "\n")
            (princ "ed111 >>>>>>>>>>>>>>>>>>>>>>>>>> ")
            (princ ed111)
            (princ "\n")

            (if (or (/= ed111 "LWPOLYLINE") (/= ed111 "POLYLINE"))
            (progn
                    (alert "Non hai selezionato una Polilinea!")
                (vl-exit-with-error "Uscita dal programma")
            );;progn
            );;if
Il codice non da errore, riconosce la selezione sbagliata ma non mi fa passare"
Questo è ik risultato :
Seleziona la Polilinea esterna :
ed111 >>>>>>>>>>>>>>>>>>>>>>>>>> LWPOLYLINE
Grazie.
 

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
#2
In primis Ed11 non la devi prelevare mediante entlast, ma mediante il suo nome (entlast è l'ultima entità creata, non l'ultima selezionata).
Come fai tu, prelevi sempre l'ultima entità creata che (presumo) è una polilinea.

In secondo luogo l'istruzione OR LWPLINE - PLINE ti restituisce sempre TRUE perchè anche quando il valore è LWPLINE esso è diverso da PLINE.
Sostituendo l'OR con un AND la gestione diventa corretta. infatti la condizione restituisce TRUE solo se il valore è diverso sia da LWPLINE che da PLINE. se invece il valore è un LWPLINE o un PLINE la condizione AND risulta nulla e quindi non si attiva l'alert.
Codice:
(setq Ed1 nil ed11 nil ed111 nil)
(while (= ed1 nil)
                (setq ed1 (entsel "\nSeleziona la Polilinea esterna : "))
            );;while

            (setq ed11 (entget (car ed1)))
            (setq ed111 (cdr (assoc 0 ed11)))

            (princ "\n")
            (princ "ed111 >>>>>>>>>>>>>>>>>>>>>>>>>> ")
            (princ ed111)
            (princ "\n")

            (if (and (/= ed111 "LWPOLYLINE")(/= ed111 "POLYLINE"))
            (progn
                    (alert "Non hai selezionato una Polilinea!")
                (vl-exit-with-error "Uscita dal programma")
            );;progn
            );;if
 
Professione: Pensionato
Software: Autocad
Regione: Lombardia
#4
Cristallo, ho ancora una domanda,
traccio una polilinea con :
Codice:
 (command "_pline" SpigExtSinUp SpigExtDesUp SpigExtDesDown SpigExtSinDown SpigExtSinUp "")
 (setq PL1 (entlast))
Successivamente con quest'altro codice :
Codice:
(if (> (atof AltezzaAmbienteDes) (atof AltezzaAmbienteSin))
        (progn
                (command "_extend" PL1 "" MuroSinSopra "")
                (princ)
         );;progn
 );;if
vorrei estendere MuroSinSopra (linea precedentemente tracciata) sino a > PL1 <, ciò provoca errore, illuminami, grazie.
Angelo.
 

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
#5
se ricordo bene non puoi estendere con il comando extend, perchè chiede un pick a video che tu non puoi passargli.
devi trovare geometricamente l'intersezione (mi pare la funzione LISP sia inters) e poi puntare al punto trovato.
 
Ultima modifica:
Professione: Pensionato
Software: Autocad
Regione: Lombardia
#6
Quindi dovrei prima tracciare un linea provvisoria verso > PL1 <, trovarne l'intersezione mediante il comando inters, eventualmente cancellare la linea provvisoria e tracciarne una nuova sino al punto trovato.
Sin qui va bene ma dovrei anche troncare una linea rispetto a > PL1 <, spero che il comando "_breack" finzioni!
Grazie.
 

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
#7
guarda la sintassi della funzione inters
non c'è bisogno della linea, bastano i punti che la definiscono. e puoi cercare anche un'intersezione sulla prosecuzione (flag onseg). Verifica mediante l'help.