Sostituire i punti con un blocco

Andrea Bertocco

Utente poco attivo
professione: progettista
software: autocad
regione: veneto
salve a tutti,
mi stavo domandando se esiste una procedura che mi mermette di sostituire il punto di autocad con un blocco generico contenente un attributo visibile.

Faccio un sempio: importo da un file excel/txt dei punti con le loro coordinate geo referenziate , la visualizzazione su autocad è una serie di punti colocati secondo X e Y.
A questo punto vorrei sostituirli con un blocco chiamato PL avente un attributo "COD " visibile.

E' possibile ?
Grazie
 

confutatis

Guest
Codice:
(defun C:P2B ()
 (setq gru   (ssget '((0 . "POINT")))
       index -1
 )
 (repeat (sslength gru)
  (setq point (cdr (assoc 10 (entget (ssname gru (setq index(1+ index)))))))
  (command "_INSERT" "PL" point 1 1 0 "")
 )
 (command "_ERASE" gru "")
 (princ)
)
 

GP.

Utente Senior
professione: Nientologo
software: uozapp
regione: Vercelli
(defun C:p2B...

:finger:


Per tranquillità, occhio ad OSMODE e ATTDIA:

Codice:
(defun C:P2B ()
 (setq attD (getvar "ATTDIA"))
 (setq os (getvar "OSMODE"))
 (setvar "ATTDIA" 0)
 (setvar "OSMODE" 0)
 (setq gru   (ssget '((0 . "POINT")))
       index -1
 )
 (repeat (sslength gru)
  (setq point (cdr (assoc 10 (entget (ssname gru (setq index(1+ index)))))))
  (command "_INSERT" "PL" point 1 1 0 "")
 )
 (command "_ERASE" gru "")
 (setvar "ATTDIA" attD)
 (setvar "OSMODE" os)
 (princ)
)
 

confutatis

Guest
Certo! Ma con questo andazzo ci mettiamo pure la gestione degli errori, degli UNDO e invece di poche righe di codice ne facciamo 200, stile LeeMac! :biggrin::biggrin:

ah, già, dimenticavo...
Nel lisp si può compattare il tutto...
Codice:
(defun C:P2B ()(setq attD(getvar "ATTDIA")os(getvar "OSMODE"))(setvar "ATTDIA" 0)(setvar "OSMODE" 0)(setq gru(ssget '((0 . "POINT")))index -1)(repeat(sslength gru)(command "_INSERT" "PL" (cdr(assoc 10(entget(ssname gru(setq index(1+ index)))))) 1 1 0 ""))(command "_ERASE" gru "")(setvar "ATTDIA" attD)(setvar "OSMODE" os)(princ))

Visto? Con una sola riga di codice abbiamo risolto tutto!!:tongue::tongue:
 

Andrea Bertocco

Utente poco attivo
professione: progettista
software: autocad
regione: veneto
ho fatto al verifica ma alcuni punti vengono cancellati e non sostituiti . Sbaglio qualcosa ? I punti hanno un vincolo di vicinanza ? se assieme alle coordinate X e Y importo " codice vecchio" e "codice nuovo" posso associarlli al nuovo blocco che andrà a sostituire i punti generati ?
 

confutatis

Guest
I punti, appartenenti alla variabile gru, vengono tutti cancellati alla fine con (command "_ERASE" gru ""). Non ci sono vincoli, né osnap, il programma prende le coordinate che trova. Al limite posta il dwg che vediamo.
 

confutatis

Guest
Avevi detto che il blocco conteneva un solo attributo visibile e invece c'erano 6 attributi invisibili...

(defun C:p2B ()
(setq attD (getvar "ATTDIA"))
(setq os (getvar "OSMODE"))
(setvar "ATTDIA" 0)
(setvar "OSMODE" 0)
(setq gru (ssget '((0 . "POINT")))
index -1
)
(repeat (sslength gru)
(setq point (cdr (assoc 10 (entget (ssname gru (setq index(1+ index)))))))
(command "_INSERT" "PL" point 1 0)
)
(command "_ERASE" gru "")
(setvar "ATTDIA" attD)
(setvar "OSMODE" os)
(princ)
)
 

confutatis

Guest
Bisognerebbe inserire, a seconda del blocco inserito (quanti attributi ci sono, se sono visibili o meno, preassegnati, ecc...), delle condizioni per evitare messaggi di errore. In questo caso funziona.
 

Joseph

Utente Standard
professione: studio e sperimento
software: autocad 2012
regione: lombardia
Piccola variante:
sostituire la riga:
(command "_INSERT" "PL" point 1 1 0 "")
con
(entmake (list '(0 . "INSERT") '(2 . "PL") point))
 

confutatis

Guest
Mancava il cons a point...

(entmake (list '(0 . "INSERT") '(2 . "PL") (cons 10 point)))

Se non si hanno esigenze particolari riguardo la scala e l'angolo di rotazione la funzione entmake è molto meglio di INSERT.
 

GP.

Utente Senior
professione: Nientologo
software: uozapp
regione: Vercelli
L'ultima soluzione è quella che spazza via i vari settaggi iniziali (ed oltretutto è più veloce), ma con ATTREQ = 0 andava bene anche il primo lisp.
 

Andrea Bertocco

Utente poco attivo
professione: progettista
software: autocad
regione: veneto
Scusate, la mia poca dimesticche sulla materia, ma mi sono perso qualcosa nelle vostre giuste oesservazioni.
Mi sembra di aver capito che:
se ho una tabella con X e Y definiti in modo univoco;
se ad ogni punto do un valore univoco
se a questo punto associo altre informazioni di diversa natura .......
si può fare quanto segue ?
sostituire il classico punto di autocad con un blocco precreato con n attributi e associargli le varie info ?
Pazzesco non ci credo! Magagari mi dite che colorate il blocco con un colore diverso secondo una variabile predefinita su uno degli attributi ? Pazzesco dove sono stato tutto questo tempo ?
Faccio un esembio:
X = 10
Y =10
Cod Univoco =ab1234
Cod vecchio =1P
Tipo Lamp = SAP ( oppure Hg oppure LED oppure ALTRO )
Io posso vedere il mio blocco con il Cod univoco e colorato secondo il tipo di lampada.
Fantastico quanto sono incredule.
BRAVI sono esterefatto.
 

Joseph

Utente Standard
professione: studio e sperimento
software: autocad 2012
regione: lombardia
Per Confutatis, riguardo al cons.
Scusa la fretta, dovevo postare l'intero codice.

(setq pts (ssget "X" (list '(0 . "POINT"))))
(repeat (setq i (sslength pts))
(setq p1 (assoc 10 (entget (ssname pts (setq i (1- i))))))
(entmake (list '(0 . "INSERT") '(2 . "PL") p1))
)
 

confutatis

Guest
La sostituisci integralmente al codice che ti avevo postato la prima volta. Dato che la "X" di ssget serve a selezionare tutti i punti che trova, se desideri effettuare una selezione manualmente, in una zona ben determinata, basta che scrivi:
(setq pts (ssget (list '(0 . "POINT"))))
 

Joseph

Utente Standard
professione: studio e sperimento
software: autocad 2012
regione: lombardia
Per Andrea, che sembra molto interessato all'argomento, a integrazione di quello che ha precisato Termin.., scusa, Confutatis:

(ssget "_X") seleziona tutti gli oggetti principali del database, anche fuori dallo schermo, anche posti su piani disattivati e/o congelati.
Esiste però un'opzione NON documentata di ssget:
(setq pts (ssget "_A" )) che seleziona tutti gli oggetti del database (come ssget "X") , tranne quelli situati su piani congelati.

Ciao
 

Statistiche forum

Discussioni
59,370
Messaggi
505,771
Utenti registrati
111,039
Ultimo utente registrato
Vincenzo 10

Utenti online

Top