Newsgroup: it.comp.software.cad
Titolo: Un aiuto per AutoLISP

Salve a tutti,
ho un problema da risolvere ma non riesco a trovare la soluzione !!!...
Ho la necessità di rilevare con un comando simile a "LINE" se sto
intersecando o meno una linea già esistente,mi spiego meglio.Supponiamo di
avere su un disegno una linea tracciata dal punto 0,0 al punto 10,0, a
questo punto traccio una seconda linea dal punto 5,-5 al punto 5,10.
Ora dovrei trovare un routine in grado di "sentire" l'intersezione delle due
linee,ovvero mi dovrebbe avertire che ho appena tracciato una linea sopra ad
un'altra.
Ovviamente non ho la possibilià di selezionare la linea intersecata,la sola
entità nota è qualla che ho appena tracciata ed è quella che interseca.
Avrei bisogno quanto meno di un aiuto sulla logica di  come potrei risolvere
questo problema (ovviamente se qualche anima pia avesse un pezzo di lisp
sarebbe ben accetto)
Un grazie anticipato a tutti coloro che sono in grado di aiutarmi.
R.Zanni
--
Posted from 
ro...@linux.assicomitalia.it
 [194.184.172.7] (may be forged) 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 meglio. [...]
La piegazione e' chiara e il problema e' interessante, provero' a pensarci;
cosi' su due piedi non saprei.
Di lisp pronti sull'argomento non so se ne ho, ma non credo.
Ti faro' sapere.
Mi sarebbe utile sapere  intanto due cose sulle preesistenze cioe' le linee
da controllare:
- sono poche o tante;
- sono solo delle linee "LINE" o anche polilinee archi cerchi ecc?
Soprattutto la seconda e' importante di info, se sono solo line e non ne
sono una marea e' facile, nello scrivere mi e' gia' vento in mente come
farlo...
Intanto rispondi va!.
metti un tag se ti va ai messaggi che parlano di lisp, chiaramente il titolo
era chiaro, quindi non era indispensabile.
Vado di fretta, scusa la poca chiarezza.
--
Ciao Giovanni

Ciao R.Zanni,
come ti dicevo, avevo pensato qualcosa, ecco qua sotto, questo posso fare
per ora, tu intanto rispondi alle domande che ti avevo fatto e a queste
altre:
- il problema e' binimensionale o tridimensionale.
- se interseca cosa vuoi che faccia la procedura?
- se non interseca cosa vuoi che faccia la procedura?
- controllo tutti i layer o solo il corrente?
-tu lispi?
-come mai ti serve questa strana cosa?
Spero sia un buon inizio, se ti servono chiarimenti, ti prego di scrivermi
in privato e ti do il numero di telefono, per telefono perderei meno tempo,
e ne ho poco, grazie.
Chiaramente se va bene cosi' togli pure gli "alert" che sono solo per
dirti cosa fa la procedura che ho preparato, ho pensato di scriverti i punti
delle intersezioni casomai ti servissero ed inoltre che se la linea
intersecava tu non volessi disegnarla.
Ti saluto.
---cut---cut---cut---cut---cut---cut---cut---cut---cut---cut---cut---cut---c
ut---
;---
(defun SELEZOBJ (ogg lay £att / £sel)
(setq £sel (list (cons 0 ogg)(cons 8 lay)))
(foreach att £att (setq £sel (append £sel (list (cons (nth 0 att) (nth 1
att))))))
(ssget "x" £sel))
;---
(defun CONTAOBJ (ogg lay  £att / ss)
(if (setq ss (SELEZOBJ ogg lay £att)) (sslength ss) 0))
;---
(defun c:lint (/ PT1 PT2 #lin slin PTint verifica intersezione)
(setq PT1 (getpoint "\nprimo punto della linea"))
(setq PT2 (getpoint PT1 "\nsecondo punto della linea"))
(setq #lin (CONTAOBJ "LINE" "*" nil)) ;tutte le linee
(setq slin (SELEZOBJ "LINE" "*" nil)) ;tutte le linee
(setq cont 0)
(repeat #lin
     (setq nlin  (ssname slin cont))
     (setq PTint (inters PT1 PT2 (cdr (assoc 10 (entget nlin))) (cdr (assoc
11 (entget nlin))) T))
     (if PTint (progn (alert "intersezione rilevata")
        (princ "\n intersezione rilevata nel punto: ") (princ PTint) (princ
"\n")
        (setq intersezione T)))
     (setq cont (1+ cont)))
(if intersezione
  (progn (alert "Ciao R.Zanni che devo fare? Io non sapendolo non faccio
nulla"))
  (progn (alert "Ciao R.Zanni che devo fare? Io non sapendolo ti disegno
solo la linea")
         (command "_line" PT1 PT2 "")))
(print))
;---
---cut---cut---cut---cut---cut---cut---cut---cut---cut---cut---cut---cut---c
ut---

Tanto per cominciare grazie per la tua solerte e cortese risposta.
Le linea da controllare tanto per cominciare, ed alleggerire il problema,
potrebbe essere la prima che incontro.
L'entità da controllare è una "LINEA".
Cordiali saluti
R.Zanni
PS
Non so se posso contraccambiare ma,nel caso potessi rendermi utile...
Scrivo lisp da diversi anni ed ho sviluppato programmi ed utility FREEWARE
già distribuiti in rete.
Vedi rzcv.zip su 
www.caddepot.com
.


Ciao R.
Giovanni ha risposto bene, occorre qualche informazione in più.
Se le linee sono tante e se tu vuoi un comando che quando le interseca si
accorga automaticamente del fatto ed esegua qualche altra cosa il problema
è nei tempi di controllo di tutte le linee del disegno aperto.
Si può fare un comando ricorsivo (per ora parliamo delle sole linee ma
certo che (vedi Giovanni) se ci sono altre entità il discorso si allarga)
che controlli ogni entità. 
Sarò un pò spartano...
Dovrebbe essere un comando che tira una linea inserito in un ciclo while (
per ripetere il tutto):
(initget 7)
(setq p1 (getpoint"\nPrimo vertice inserimento barre :  "))
(initget 7)
(setq p2 (getcorner"\nSecondo vertice inserimento barre :  " p1))
(command "_line" p1 p2 "") 
Poi dovresti fare un gruppo di selezione con una fence tra i due punti.
(setq ss (ssget "f" p1 p2))
Altro ciclo while per  il controllo di ogni entità trovata in ss (se sono
linee) e prelevamento dei dati dei vertici:
(if ss (progn
	(setq lung (sslength ss))
	(setq cont 0)
	(repeat lung
		(setq noment (ssname ss cont))
        		(setq datent (entget noment))
        		(setq tipent (cdr (assoc 0 datent )))
		(if (= tipent "LINE")
	        	(progn
			(setq p1e (cdr (assoc 10 datent )))
	        		(setq p2e (cdr (assoc 11 datent )))
		))
	)
	(setq cont (1+ cont))
))			
Poi un controllo sull'intersezione :
(if (inters p1 p2 p1e p2e) (progn       e fai quello che ti serve......
Giovanni ha detto l'altra volta che ero stato troppo buono a mettere il
programma già fatto, oggi sono stato più cattivo.  :)
Più che altro non ho il programma in oggetto, questo l'ho scritto con
qualche pezzo fatto qua e là, ma dovrebbe esserti sufficiente per
concludere (sempre che funziona) il tutto. :)
Ciao Mario Scavroni

 Vedi rzcv.zip su 
www.caddepot.com
.
ecco perche' il tuo nome (come dicevo) mi suonava familiare, credo di averti
scaricato, ma mai provato.
Ho letto il txt, il programma sembra interessantissimo, ma mi pare non funga
sotto Acad2K sbaglio?
C'e' ne e' mica una rel. per il 2000?
Che altro hai fatto?
Manda pure se ti va.
Quanto a rzcv, se fa quello che dice come lo penso io ti faccio fin d'ora i
complimenti.
Mi piacerebbe in tal caso vederci dentro... il tuo aver arxato il programma
non mi fa ben sperare, chissa' magari potresti pero' raccontarmi il flusso
del programma in termini concettuali, l'argomento e' molto interessante e
proiezioni et similia sono diciamo il mio hobby, tieni comunque presente che
cio' che arriva al mio indirizzo come riservato tale rimane, e sono sicuro
che dopo approfondita conoscenza fimnirai per farmelo vedere sto' codice.
:-)
Se ti interessa, c'e'  una Mailing List ML che si va formando sull'autolisp,
se vuoi ti mando l'invito per iscriverti oppure vai al sito:
http://www.egroups.com/
e cerca la ML: autolisp-ita
la ne trovi anche altre non in italiano, ma molto interessanti.
lisp-livre
lisp

 programma già fatto, oggi sono stato più cattivo.  :)
Era un complimento, non un rimprovero. :-)
Poi basta fare una volta per uno, sai tipo i due poliziotti agli
interrogatori,
c'e' quello  buono e quello cattivo... :-)
Forte sta cosa dei TAG, ora ritolgo la C e lascio lisp.
Ma tu li usi sti TAG per settare delle regole?
Si? Comodo no?
No? Se vuoi ti spiego come farlo.
--
Ciao Giovanni

Grazie per la velocissima ed esauriente risposta
Ciao
R.Zanni
--
Posted from 
linux.assicomitalia.it
 [194.184.172.7] (may be forged) 


grazie per la risposta, non importa se "cattiva" o meno è stato comunque un
interssamento utile
Ciao
R.Zanni
--
Posted from 
ro...@linux.assicomitalia.it
 [194.184.172.7] (may be forged) 


 in tal senso, magari imparando pure il C.
Sarò sintetico: "Pure" io vorrei imparare il C. ( e arx ovviamente) da dove
si può partire (non dico agevolmente) ma perlomeno per non sbatterci troppo
la testa? :)
Ciao mario Scavroni

Ciao,Giovanni
l'rzcv ho appena finito di "tradurlo" per R2000.
Ho provato il tuo codice e devo dire che funziona molto bene !!!
Per quanto riguarda il "C", purtroppo non è nelle mie conoscienze nonostante
ARX,questo l'ho ottenuto con Visual-Lisp (aimè).
Passando alla "sbirciata", in seguito ti avere quantomeno il flusso del lsp
(magari in privato).
Ripeto,non ho scoperto l'acqua calda però è pur sempre stata una bella
faticata...
P.S.
Ovviamente grazie anche al lispista Mario per la sua pronta collaborazione.
Ancora un grazie e alla prossima
R. Zanni


Ciao Rodolfo, scusa se ti disturbo ma come fai a compilare un arx che io
sul visual lisp non trovo nulla ?
(a proposito, che brutto il termine "lispista" ) :))
Ciao Mario Scavroni

Ciao Mario,
stai utilizzando il 2000?, se č cosě in Visual non prevede l'uscia ARX
(comunque mi sto documentando ulteriormente),cosa che nel R14 era
contemplata.
Utilizzando la versione 2000 ti devi accontentare dei file *.fas e *.vlx
comunque abbastanza veloci rispetto al lisp.
Per quanto riguarda la "sicurezza" del file "compilato" č comunque binario
ed abbastanza "ingarbugliato" per essere sbirciato velocemente.
Ciao Rodolfo
PS
In effetti non č un gran nomignolo...
PS
Nel caso trovassi prima di me la soluzione per l'ARX ti prego, se
potrai/vorrai di farmelo sapere.


 In effetti non è un gran nomignolo...
Lispista ? Terribile (si potrebbe pensare a "PROGRAMMATORI GALATTICI DI
AUTOISP" ma mi sembra esagerato) :))  
Ciao Mario Scavroni