Autore |
Discussione |
Terminator
Utente Master
725 Messaggi |
Inserito il - 11 novembre 2010 : 11:19:58
|
Sappiamo tutti (o quasi) che esiste una funzione per verificare se c'è un punto di intersezione fra due linee. Per esigenze di lavoro dovevo verificare in un programma l'intersezione fra un arco e una linea. Ho quindi creato la suddetta funzione e l'ho chiamata ainters
Sintassi: (ainters entità-arco entità-linea)
La funzione restituisce una lista con al suo interno i punti di intersezione, se esistono, e possono essere uno o due. Se non c'è intersezione la funzione restituisce nil. Le coordinate dei punti di intersezione si trovano sull'UCS dell'arco.
NB: l'UCS modificato è quello dove si trova l'arco
Scarica allegato:
ainters.zip 2,33 KB
|
Modificato da - Terminator in Data 11 novembre 2010 11:29:27
|
|
n/a
deleted
Prov.: Estero
Città: Sieradz (PL)
5926 Messaggi |
Inserito il - 11 novembre 2010 : 11:41:07
|
| Messaggio di Terminator Le coordinate dei punti di intersezione si trovano sull'UCS dell'arco.
|
Stai forse dicendo che linea ed arco possono giacere a quote Z differenti?
|
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 11 novembre 2010 : 11:48:28
|
No, la funzione prima di tutto controlla che arco e linea siano sullo stesso piano |
Modificato da - Terminator in data 11 novembre 2010 11:49:13 |
|
|
n/a
deleted
Prov.: Estero
Città: Sieradz (PL)
5926 Messaggi |
Inserito il - 11 novembre 2010 : 12:04:01
|
Perdonami, ma se linea ed arco sono complanari, allora la frase "Le coordinate dei punti di intersezione si trovano sull'UCS dell'arco" e' superflua.
Sarebbe invece necessaria se linea ed arco fossero su piani Z differenti, ossia se la tua routine calcolasse le cosiddette "intersezioni apparenti".
|
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 11 novembre 2010 : 12:14:48
|
La funzione inters funziona allo stesso modo, ti restituisce le coordinate solo se le linee sono complanari e non calcola le intersezioni apparenti. |
|
|
GP
Utente Master
Regione: Piemonte
Prov.: Vercelli
2776 Messaggi |
Inserito il - 11 novembre 2010 : 12:15:39
|
Nella variabile Lista_p vengono memorizzati i punti di intersezione degli oggetti ENT1 e ENT2, se giacciono sullo stesso piano.
(vl-load-com)
(setq ENT1 (vlax-ename->vla-object (car (entsel))))
(setq ENT2 (vlax-ename->vla-object (car (entsel))))
(setq INT (vlax-invoke ENT1 'IntersectWith ENT2 acExtendNone))
(cond (INT
(repeat (/ (length INT) 3)
(setq Lista_p (cons (list (car INT)(cadr INT)(caddr INT)) Lista_p))
(setq INT (cdddr INT))
)
)
) |
|
|
n/a
deleted
Prov.: Estero
Città: Sieradz (PL)
5926 Messaggi |
Inserito il - 11 novembre 2010 : 12:24:22
|
Ma infatti, e' quindi vero che l'UCS delle coordinate d'intersezione appartiene ad entrambi (linea+arco) e non solo all'arco, come invece sosteneva il grande T alle ore 11:19:58...
|
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 11 novembre 2010 : 12:48:10
|
Quello che volevo dire è che se l'arco giace sull'UCS globale e la linea ha coordinate (3,3) e (5,5) NON possono essere complanari. Mi sembra chiaro che se c'è un intersezione anche l'UCS sia comune! Ringrazio caldamente GP per l'intervento. Non ho avuto il tempo di studiarmi tutti gli ActiveX e se devo essere onesto non conoscevo la funzione richiamata da vlax-invoke. Una volta di più c'è sempre e ci sarà sempre tanto da imparare. |
Modificato da - Terminator in data 11 novembre 2010 12:53:16 |
|
|
n/a
deleted
Prov.: Estero
Città: Sieradz (PL)
5926 Messaggi |
Inserito il - 11 novembre 2010 : 13:12:32
|
| Messaggio inserito da Terminator se l'arco giace sull'UCS globale e la linea ha coordinate (3,3) e (5,5) NON possono essere complanari
|
Come no, T???
I punti 3,3 e 5,5 giacciono al 100% sul piano X-Y globale, cioe' esattamente nel medesimo UCS dell'arco!!
A parte 'sta questione di lana caprina, la domanda da ignorante che faccio ad entrambi e' la seguente: le 11 righe di codice di GP danno lo stesso identico risultato delle 477 righe di codice di Terminator?
|
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 11 novembre 2010 : 13:26:52
|
Ti sembrano complanari questi????? (vedi dwg allegato)
Ad ogni modo ti rispondo al quesito: Il risultato è lo stesso, ma il mio programma risale ai tempi pre-ActiveX. La funzione di GP inoltre permette di essere molto più flessibile dato che funziona su ogni tipo di entità.
Scarica allegato:
ucs.zip 7,76 KB |
|
|
n/a
deleted
Prov.: Estero
Città: Sieradz (PL)
5926 Messaggi |
Inserito il - 11 novembre 2010 : 13:41:33
|
| Messaggio inserito da Terminator la linea ha coordinate (3,3) e (5,5)
|
Se tu scrivi 3,3 e 5,5 per convenzione mondiale la Z=0 e' sottintesa, quindi la linea sara' perfettamente complanare ad un arco giacente sull'ucs globale.
Se invece cambi le carte in tavole, aggiungendo Z diverse per gli estremi della linea, e' normale che non esista complanarita'...
Direi di chiuderla qua, perche' stiamo passando dalla tecnica alla filosofia.
|
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 11 novembre 2010 : 14:14:24
|
Acc...è vero, scusa, la z bisogna specificarla... era giusto (3,3,3) (5,5,5)
Va bè, come non detto. |
Modificato da - Terminator in data 13 novembre 2010 12:44:40 |
|
|
n/a
deleted
Prov.: Estero
Città: Sieradz (PL)
5926 Messaggi |
Inserito il - 11 novembre 2010 : 14:33:36
|
T, per il miracolo che sai, ti sono debitore in eterno, e quindi ti si perdona tutto, tranquillo...
|
|
|
Giuseppe Mauro
Amministratore
Regione: Campania
Prov.: Napoli
2705 Messaggi |
Inserito il - 11 novembre 2010 : 15:19:32
|
Io sono convinto che Anto' non riesce a litigare con l'uomo sul crocifisso, solo perche' non gli risponde. Se fosse dotato di voce, sono sicuro che lo vedremmo schiodarsi dalla croce e prendere a calci nel didietro il buon antonio |
|
|
n/a
deleted
Prov.: Estero
Città: Sieradz (PL)
5926 Messaggi |
Inserito il - 11 novembre 2010 : 15:26:17
|
Hai ragione Peppe, ma tu devi capire che io sono ignorante come una capra, ma una capra precisa, quindi per me (3,3) e' e sara' sempre uguale a (3,3,0) come tardivamente ha confermato l'ottimo Terminator.
Sai come la penso al riguardo: non possiamo lasciar passare tutto sotto silenzio, altrimenti il livello tecnico di Cadlandia degrada inesorabilmente.
|
|
|
Giuseppe Mauro
Amministratore
Regione: Campania
Prov.: Napoli
2705 Messaggi |
Inserito il - 11 novembre 2010 : 16:04:16
|
Non si tratta di lasciar passare. Si tratta di mettere "una patch" quando si parla. Hai fatto una tua osservazione. Bene, basta 1 volta. La seconda volta, diventa polemica sterile e (soprattutto) irritante.
Puoi essere preciso nella sostanza, ma non nelle sottigliezze. Ti propongo un dialogo surreale tra te e me, assumendo le tue "pignolerie" Antonio:"Ciao Peppe" Peppe: "Ciao... ma scusa me sei Antonio Vinci?" Antonio: "Certo che si, non lo vedi il nick?" Peppe: "Si lo vedo, ma che ne so se sei l'Antonio quello polacco?" Antonio "Certo che sono io...." Peppe: "Si ma quanti figli hai?" Antonio "OH! Ma sei impazzito" Peppe: "No Antonio, e che conosco un altro Antonio Vinci che si e' trasferito in Polonia.." Antonio: "Ok, ho un figlio.." Peppe: "Si ma quando sei nato?" Antonio: "Cavolo questo sta dando i numeri..." Peppe: "No Antonio e' che anche il tuo omologo ha un solo figlio..."
Smetto perche potrei continuare per almeno altre 100 righe... Come vedi c'e' differenza tra essere precisi, essere pignoli ed essere polemici. E per come la vedo, tu oscilli tra la seconda e la terza.
|
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 12 novembre 2010 : 06:27:57
|
Il problema degli output di funzioni vlax-invoke e simili è che il loro formato è sempre una lista unica (8.0 4.0 0.0 5.0 4.3 0.0 ......), nel caso specifico la variabile INT. Noi però abbiamo l'esigenza di raggruppare gli elementi della variabile INT nel formato che noi conosciamo: ((8.0 4.0 0.0)(5.0 4.3 0.0)......), che è poi l'output finale.
Per questo motivo GP aveva scritto la routine: (repeat (/ (length INT) 3) (setq Lista_p (cons (list (car INT)(cadr INT)(caddr INT)) Lista_p)) (setq INT (cdddr INT)) )
Dato che nella programmazione la routine sopra accennata ricorre spesso, ho creato la seguente funzione:
(array2lista listacoordinate numero)
argomenti: listacoordinate = lista di numeri, la variabile INT per intenderci numero = intero che rappresenta il numero di elementi per gruppo (quasi sempre 3, nel caso di lwpolyline 2, ma volendo posso inserire qualsiasi numero)
(defun array2lista (listacoordinate numero / listaparziale index listafinale) (setq listaparziale '() listafinale '() ) (setq index 0) (while (< index (length Listacoordinate)) (repeat numero (if (/= (nth index listacoordinate) nil) (progn (setq listaparziale (append (list (nth index listacoordinate)) listaparziale)) (setq index (1+ index)) ) ) ) (setq listaparziale (reverse listaparziale) listaparziale (list listaparziale) listafinale (append (list (nth 0 listaparziale)) listafinale) listaparziale nil ) ) (princ "\n")(setq listafinale (reverse listafinale)) )
In questo modo il programma subisce un'ulteriore riduzione di righe di codice:
(vl-load-com) (setq ENT1 (vlax-ename->vla-object (car (entsel "\Selezionare primo oggetto: "))) ENT2 (vlax-ename->vla-object (car (entsel "\nSelezionare secondo oggetto: "))) INT (vlax-Invoke ENT1 'IntersectWith ENT2 acExtendNone) ) (if INT (array2lista INT 3) )
Per amor di precisione e logica avremmo potuto scrivere anche: (vla-IntersectWith ENT1 ENT2 acExtendNone) Ma questo avrebbe comportato una difficile gestione della variabile INT non restituita nel formato lista
Mi sa che butterò il programma ainters nel water...
PS: Antoniovinci, hai contato anche le righe bianche nel codice? Io le uso spesso per chiarezza e poi volendo un programma lisp si potrebbe scrivere tutto in una riga senza indentazione alcuna. Dato che sei moooolto preciso, avresti dovuto contare solo le righe effettive... |
Modificato da - Terminator in data 12 novembre 2010 13:53:34 |
|
|
GP
Utente Master
Regione: Piemonte
Prov.: Vercelli
2776 Messaggi |
Inserito il - 12 novembre 2010 : 10:34:34
|
Non ho capito due cose:
1) la differenza tra Lista_p e listafinale 2) perchè il reverse? |
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 12 novembre 2010 : 12:00:28
|
1) Un nome come un altro. Dovevo distinguere le tre liste iniziale, parziale e finale, potevo chiamarle anche pippo, pluto e paperino: (setq pippo listacoordinate pluto listaparziale paperino listafinale) 2) Perché le funzioni append e cons hanno il riprovevole vizio di inserire l'elemento non in fondo alla lista ma all'inizio e quindi bisogna capovolgere l'ordine della lista. In alcuni casi non è necessario, ma in altri potrei avere l'esigenza di ottenere la lista finale con gli elementi nello stesso ordine di quelli contenuti nella variabile INT.
Approfitto per un'ottimizzazione della funzione:
(defun array2lista (listacoordinate numero / listaparziale index listafinale) (setq listaparziale '() listafinale '() ) (setq index 0) (while (< index (length Listacoordinate)) (repeat numero (if (/= (nth index listacoordinate) nil) (progn (setq listaparziale (cons (nth index listacoordinate) listaparziale)) (setq index (1+ index)) ) ) ) (setq listaparziale (reverse listaparziale) ;;; listaparziale (list listaparziale) <-- riga eliminata listafinale (cons listaparziale listafinale) listaparziale nil ) ) (princ "\n") (setq listafinale (reverse listafinale)) )
|
Modificato da - Terminator in data 13 novembre 2010 12:48:56 |
|
|
aforza
Utente Master
Regione: Italia
Prov.: Padova
Città: Cavarzere(VE)-Monselice(PD)
1798 Messaggi |
Inserito il - 12 novembre 2010 : 14:09:12
|
ciao,
questa serviva proprio, grazie mille
ciao |
Andrea Forza
CadWorx 2014 & Plant3D AutoCAD 2014 su Seven 64bit - Dell Vostro i7 ram 8gb - doppio monitor Hanns-g 22" |
|
|
Giuseppe Mauro
Amministratore
Regione: Campania
Prov.: Napoli
2705 Messaggi |
Inserito il - 13 novembre 2010 : 18:41:08
|
| Messaggio inserito da Terminator
1) Un nome come un altro. Dovevo distinguere le tre liste iniziale, parziale e finale, potevo chiamarle anche pippo, pluto e paperino: (setq pippo listacoordinate pluto listaparziale paperino listafinale) 2) Perché le funzioni append e cons hanno il riprovevole vizio di inserire l'elemento non in fondo alla lista ma all'inizio e quindi bisogna capovolgere l'ordine della lista. In alcuni casi non è necessario, ma in altri potrei avere l'esigenza di ottenere la lista finale con gli elementi nello stesso ordine di quelli contenuti nella variabile INT.
Approfitto per un'ottimizzazione della funzione:
(defun array2lista (listacoordinate numero / listaparziale index listafinale) (setq listaparziale '() listafinale '() ) (setq index 0) (while (< index (length Listacoordinate)) (repeat numero (if (/= (nth index listacoordinate) nil) (progn (setq listaparziale (cons (nth index listacoordinate) listaparziale)) (setq index (1+ index)) ) ) ) (setq listaparziale (reverse listaparziale) ;;; listaparziale (list listaparziale) <-- riga eliminata listafinale (cons listaparziale listafinale) listaparziale nil ) ) (princ "\n") (setq listafinale (reverse listafinale)) )
|
Termi, quando aggiorni un post, magari con cose piccolissime, segnalalo sotto, altrimenti non si comprende come mai il post ritorna tra i recenti. Nel caso specifico, a sensazione, credo tu abbia sistemato qualche parentesi nel listato, ma in questo modo non so se adesso quella che ho io non e' piu l'ultima versione, capisci?
Alla prox |
|
|
Discussione |
|