Newsgroup: it.discussioni.geometri
Titolo: Programma lisp

Chi ha un lisp che legge da un file .txt il nome punto, la Nord, la Est e 
disegna su cad il punto con il nome vicino?
come questo:
Prova.txt:
101,256.323,25.123
ecc.
Servirebbe quando si hanno le stampe dal catasto dei frazionamenti che, 
letti sullo scanner e opportunamente manipolati per aggiungere le virgole, 
in automatico disegnano tutti i punti per una riconfinazione.
-- 
Ciao 

il grande fardello ha scritto:

Un attimo di pazienza che arriva ...
-- 
Ciao
Maci

 Maci
si si anche a me 

http://www.sepram.com/applicazioni_lisp.htm
qua trovi una serie di cose molte utili.
Frà

 Frà
Si, ma non funzionano. Si bloccano quasi subito.
-- 
Ciao 

il grande fardello ha scritto:

Prova un po' questo; così al volo funziona, ma naturalmente la cavia sei 
tu e quindi lo devi testare ben bene.
All'inizio sono definite delle variabili che sono personalizzabili.
La stessa virgola di separazione "ril:sep" può essere modificata, per 
esempio in un "|" o, perché no, anche uno spazio " ".
*******************************
;;; Restituisci un rilievo da un elenco di punti
; variabili generali
(setq ril:dx 0.15 ;offset X posizione testo
       ril:dy 0.05 ;offset Y posizione testo
       ril:ht 0.40 ;altezza testo
       ril:sep "," ;separatore valori nel file
       ril:rot 0.0 ;rotazione del testo
)
(defun c:rest_ril ()
   (setq ril:file (getfiled "Scegli file coordinate" "" "txt" 4))
   (setq ril:desc (open ril:file "r"))
   (setq ril:riga t)
   (while ril:riga
     (setq ril:riga (read-line ril:desc))
     (if ril:riga
       (progn
	(setq ril:pos 0
	      ril:lung (strlen ril:riga)
	      ril:pt (ril:val)
	      ril:N (atof (ril:val))
	      ril:E (atof (ril:val))
	)
	(command "_.point" "_non" (list ril:E ril:N))
	(command "_.text" "_non" (list (+ ril:E ril:dx) (+ ril:N ril:dy)) 
ril:ht ril:rot ril:pt)
       )
     )
   )
   (princ)
)
(defun ril:val ()
   (setq ril:chr "")
   (while (/= ril:chr ril:sep)
     (setq ril:pos (1+ ril:pos)
           ril:chr (substr ril:riga ril:pos 1)
     )
     (if (> ril:pos ril:lung)
       (setq ril:chr ril:sep)
     )
   )
   (setq ril:ret (substr ril:riga 1 (1- ril:pos ))
         ril:riga (substr ril:riga (1+ ril:pos) ril:lung)
	ril:pos 0
   )
   (eval ril:ret)
)
(princ "\nUtility per ricostruire un rilievo da un elenco di coordinate 
caricata.\nby Maci 24.01.09\nDigita 'rest_ril' per avviare il comando")
(princ)
***************
-- 
Ciao
Maci

il grande fardello <nonte...@virgilio.it.invalid> ha scritto:

Domanda: i lisp funzionano solo su autocad full o anche su LT?
Comunque se sei riuscito a scannerizzare ed a correggere le piccole 
incongruenze (virgole, punti, simbolo "|", etc) ed hai li tipo di file 
che hai proposto: 101,256.323,25.123 non te lo importa il tuo programma 
di topografia?
Ho fatto la prova con leica win driver (programma in dotazione dello 
strumento) e importa i file di testo con estensione xyz.
Ti consiglio questo applicativo gratuito:
http://www.leosh.com/2007/dwn_leolink.asp
Fammi sapere
Ciao Nicolas

 Domanda: i lisp funzionano solo su autocad full o anche su LT?
Ciao Roberto

 
http://www.leosh.com/2007/dwn_leolink.asp
Ho Leonardo e leolink.
Leonardo le importa invertite, quindi c'è da gestirle, Leolink non importa i 
file csv o txt.
E poi leonardo riassegna i codici nuovi da 1 a....
Con Autocad invece selezioni il punto, gli dai il codice e sullo schermo 
della stazione totale ti trovi il disegno e i codici come li avevi su CAD.
Con il lisp inoltre puoi invertire le coordinate e ti restituisce il disegno 
non speculare.
-- 
Ciao 

il grande fardello ha scritto:

L'hai provato il mio lisp? Funge?
-- 
Ciao
Maci

 L'hai provato il mio lisp? Funge?
Ueh! Maci ma sei un macho!
Funziona!
Allora mettiamolo a punto:
1- il testo adesso è ruotato a 0 gons; portalo a 100 o fai chiedere 
all'utente
2- fai chiedere all'utente l'altezza testo
3- posiziona il testo spostato di +h testo a destra e + h testo in alto
4- crea due nuovi layer: punti e ci metti il point, nomi e ci metti il text.
Toglimi una curiosità: il linguaggio che hai usato contiene quel ril: e poi 
i comandi _.point, oppure _non
che non ho visto mai nei vecchi manuali per il lisp.
Ma sai ormai sono vecchio; ho fatto qualche programma con tantatanta fatica 
e tantetante ore e mi sono stancato.
Però sono sempre curioso (è per mantenermi giovane).
Dammi una spigazione in pvt dell'andamento delle routine a questo ind. 
bertinigiacomolumacavirgiliopuntoit
--
Ciao, e grazie ancora.

 L'hai provato il mio lisp? Funge?
Al tempo.
Non so perché ma la prima volta l'ho provato su un disegno già aperto ed ha 
funzionato.
Poi ho aperto un nuovo disegno, con lo stesso formato di unità, e i punti li 
ha disegnato giusti ma i testi sono usciti tutti uguali "0.000000000000000" 
e ruotati a zero.
Perché?
-- 
Ciao 

> L'hai provato il mio lisp? Funge?
Questo lisp l'ho fatto per trasferire i libretti prego su cad e a me 
funziona bene.
Per chi volesse approfittare:
; *********************************************************************
; DISEGNA UN PUNTO DI COORDINATE CARTESIANE DIGITATE - LIBRETTI PREGEO 
(Punto per cartesiane)
; *********************************************************************
(defun c:cartesia (/ ht xnomep ynomep postx nomep nomep1 nomestr stringa os 
x y pt pt1)
(setvar "blipmode" 1)
(setvar "AUNITS" 2)
(setvar "ANGDIR" 1)
(setvar "ANGBASE" ( * pi 0.5))
(setvar "AUPREC" 4)
(setvar "LUNITS" 2)
(setvar "LUPREC" 3)
(setvar "PDMODE" 3)
(setvar "PDSIZE" -2.0000)
(setvar "cmdecho" 0)
(IF (= (TBLSEARCH "LAYER" "TESTI") NIL)
(COMMAND "_LAYER" "_N" "TESTI" "_C" "1" "TESTI" ""));fine if
(IF (= (TBLSEARCH "LAYER" "PUNTI") NIL)
(COMMAND "_LAYER" "_N" "PUNTI" "_C" "3" "PUNTI" ""));fine if
;se HTES non è impostato, preimposta HTES
(if (not htes) (setq htes 4.0));fine if
;chiede l'altezza per il testo
(setq ht (getreal (strcat "\nAltezza testi <" (rtos htes 2 2) ">: ")));fine 
setq
;se HT non è stato impostato, significa che è stato confermato HTES, quindi 
lo assegna
(if ht (setq htes ht));fine if
(command "stile" "" "" htes "" "" "" "" "")
(setq nomep (getint "\n \n \nNome per il primo punto = n.<1>: "))
(if (not nomep)(setq nomep 1)); se è stato dato INVIO, fissa il nomepunto 
con 1 (default)
(setq NOMESTR (itoa nomep)); fissa una variabile stringa, uguale al numero 
del nomepunto
(setq PT1 T); imposta "vero" la variabile PT1
(setq os (getvar "osmode")); fissa i dati di OSMODE prima di entrare nel 
While-loop
(while PT1 ;finchè X è diversa da nil, prosegue il ciclo
(setq pt1 (getpoint "\nSeleziona punto: "))
(if pt1
(progn
(setq x (car pt1))
(setq y (cadr pt1))
(setq pt (list x y))
(setq xnomep (+ x htes))
(setq ynomep (+ y htes))
(setq postx (list xnomep ynomep))
(setvar "osmode" 0)
(command "layer" "R" "Punti" "" "punto" pt "layer" "R" "Testi" "" "testo" 
postx 100 NOMESTR)
(setq nomep (1+ nomep)
NOMESTR (itoa nomep)
nomep (getint (strcat "\n \n \nPunto successivo n.<" NOMESTR ">: "))
);fine setq
(if nomep (setq NOMESTR (itoa nomep))(setq nomep (atoi nomestr)));fine if
);fine progn
);fine if
);fine while
(setvar "osmode" os); reimposta OSMODE, una volta terminato il While-loop
(prompt "\n \nTerminato")
(princ)
);fine defun
-- 
Ciao 

il grande fardello ha scritto:

Così al volo (rivedrò più avanti tutto il discorso, ora non ho molto 
tempo); non è che in questo nuovo disegno c'è impostato uno stile di 
testo con altezza fissa? Se così fosse AutoCAD, durante l'esecuzione del 
comando "testo", salta la rchiesta relativa all'altezza e quindi il 
valore "0.0" dell'angolo di rotazione viene assegnato al nome del punto
.
Occorrerebbe inserire nella routine un piccolo controllo per vedere se 
appunto lo stile di testo è impostato in questo modo. Non ora :-)
Per quanto riguarda spostamento testi rispetto al punto, altezza testi e 
valore di rotazione (0.0 o 100g) non avevo previsto un input esplicito, 
ma fissato le variabili all'inizio del file. Si possono personalizzare 
da lì.
-- 
Ciao
Maci

 Però sono sempre curioso (è per mantenermi giovane).
E' per questo che ogni tanto mi diverto a fare qualcosa del genere.
Ed ora la routine aggiornata:
*******************************
;;; Restituisci un rilievo da un elenco di punti
; variabili generali di default
(setq ril:dx 0.15        ;offset X posizione testo
       ril:dy 0.05        ;offset Y posizione testo
       ril:ht 0.40        ;altezza testo
       ril:sep ","        ;separatore valori nel file
       ril:rot 0.0        ;rotazione del testo
       ril:lap "punti"    ;layer su cui disegnare i punti
       ril:lat "nomi"     ;layer su cui scrivere i testi
)
(defun c:rest_ril ()
   (if (null (tblsearch "layer" ril:lap)) (command ".-layer" "_n" 
ril:lap ""))
   (if (null (tblsearch "layer" ril:lat)) (command ".-layer" "_n" 
ril:lat ""))
   (setq ril:htt (cdr (assoc 40 (tblsearch "style" (getvar "TEXTSTYLE")))))
   (setq ril:htt (if (= 0.0 ril:htt) T nil))
   (if (null ril:htt) (command "_.style" "" "" ril:ht "" "" "" "" ""))
   (setq ril:file (getfiled "Scegli file coordinate" "" "txt" 4))
   (setq ril:desc (open ril:file "r"))
   (setq ril:riga t)
   (setq ril:con 0)
   (while ril:riga
     (setq ril:riga (read-line ril:desc))
     (if ril:riga
       (progn
	(setq ril:pos 0
	      ril:lung (strlen ril:riga)
	      ril:pt (ril:val)
	      ril:N (atof (ril:val))
	      ril:E (atof (ril:val))
	      ril:con (1+ ril:con)
	)
	(setvar "CLAYER" ril:lap)
	(command "_.point" "_non" (list ril:E ril:N))
	(setvar "CLAYER" ril:lat)
	(command "_.text" "_non" (list (+ ril:E ril:dx) (+ ril:N ril:dy)))
	(if ril:htt (command ril:ht))
	(command ril:rot ril:pt)
       )
     )
   )
   (alert (strcat "\nSono stati importati correttamente " (itoa ril:con) 
" punti."))


 Al plurale, bene, tu a cosa pensi?
Penso che hai i 00 quadri in fatto di programmazione in lisp.
Comunque ho visto che aprendo autocad senza dwt personalizzato il tuo 
programma
funziona perfettamente.
Filtro i testi e li metto sul layer testi; idem per i punti.
In due minuti ho un disegno perfetto.
Grazie ancora.
Ti sono debitore, io e quelli che l'hanno utilizzato.
-- 
Ciao 

 
Con la nuova versione che ho postato ieri dovrebbe essere tutto risolto, 
incluso i layer.
Grazie per la birra, quando ci sarà l'occasione :-)
-- 
Ciao
Maci

"Maci" <maci...@pippo.pip> ha scritto nel messaggio
news:Efdgl.11720$
8Z....@tornado.fastwebnet.it

Al SAIE di Bologna se ci sarai anche il pranzo.
-- 
Ciao