joseph
Utente Master
Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore
1884 Messaggi |
Inserito il - 30 novembre 2011 : 17:30:26
|
Sicuramente molti conoscono l'esistenza della Calcolatrice rapida di Autocad, delle funzioni trigonometriche e delle funzioni abbreviate, (p.es. con la funz MEE si può ricercare il punto medio di un segmento, ed anche l'uso della funzione trasparente 'CAL per introdurre espressioni di calcolo aritmetico o trigonometrico alla riga di comando.
Qui di seguito, invece, ho provato ad inserire l'uso della calcolatrice all'interno del codice Autolisp. La funzione CAL, nei casi seguenti, verrà introdotta, senza apice, e l'espressione da valutare sarà racchiusa fra virgolette doppie (cal "......") Per prima cosa caricare l'applicazione GEOMCAL, se non è stata ancora caricata. (arxload "geomcal.arx")
Cominciamo con 2 esempi per dimostrare che si può ottenere lo stesso risultato utilizzando Autolisp o la calcolatrice CAL. Si può osservare che Cal permette di utilizzare le regole standard sulla priorità delle operazioni matematiche. (setq n (cal "sqrt(1000 * (9/121))")) ;uso della Calcolatrice (setq n (sqrt (* 1000 (/ 9.0 121)))) ;senza calcolatrice ->8.62439
(setq P1 (cal "cur")) ;uso della Calcolatrice (setq P1 (getpoint)) ;senza calcolatrice ->(1474.07 1485.84 0.0)
Rimandando alla Guida la conoscenza delle singole funzioni, l'uso delle espressioni alla riga di comando con CAL trasparente o l'uso della Calcolatrice Rapida, mostro di seguito alcuni esempi di applicazione delle funzioni di CAL, anche all'interno del codice Autolisp.
1^ GRUPPO (setq P1 (cal "cur")) ; scegliere un punto a caso a video ->(1000.0 300.0 0.0)
- Traslazione di un punto Poichè le coordinate uscite sono riferite al sistema UCS posso, se necessario, riferirle (traslarle) al sistema WCS. Negli esempi seguenti l'origine UCS è posta in (500,250). (setq p11 (cal "u2w (P1)")) ->(1500.0 550.0 0.0)
- Spostamento di un punto (setq p1 (list 1000 300 0)) ;oppure (setq P1 (cal "cur")) (setq P11 (cal "p1+200*[5,4]")) ;ricavo un 2^punto spostato di (500,400) -> (1500.0 700.0 0.0)
- spostamwento di (200,200) rispetto al punto selezionato sullo schermo (cal "cur + [200,200]")
- FUNZ. dpl(p,p1,p2) ;calcola la distanza min. fra il punto P e la retta passante per P1-P2 (setq dist (cal "dpl(cen,end,end)")) ;perpend dal centro di un cerchio al segmento definito dai 2 estremi
2^GRUPPO - Ricavare nuovi punti dal preced.P1 che hanno solo alcune coord. diverse da zero (setq xp1 (cal "xof(P1)")) -> (1000.0 0.0 0.0) (setq yp1 (cal "yof(P1)")) ;analog. zof, xyof, xzof, yzof -> (0.0 300.0 0.0)
- ricavare solo il valore di una coordinata (setq rx-p1 (cal "rxof(P1)")) ->1000.0 (setq ry-p1 (cal "ryof(p1)")) ->300.0
3^GRUPPO (sugli angoli e funzioni trigon.) (setq tg (cal "tang (45)")) ; "la funz. tan non esiste in Autolisp" (setq x (cal "ASIN (alfa)")) ; seno di un angolo in gradi decimali (setq rd (cal "D2R (45)")) ;trasforma un angolo da gradi a rad (setq gr (cal "R2D (1.73)")) ;trasforma un angolo da rad a gradi (setq Ang (cal "ang(p1,p2,p3)") ;angolo fra i due segm, P1-P2 e P2-P3
4^GRUPPO (con VisualLisp) (setq *doc* (vla-get-ActiveDocument (vlax-get-Acad-Object)) *ms* (vla-get-ModelSpace *doc*)) - disegnare un cerchio Cer1 con raggio R1=500 e un cerchio concentrico di raggio R2=1/4 R1
;1^cerchio (setq Cer1 (vla-addcircle *ms* (vlax-3d-point (getpoint "\nPick the center point for a circle: ")) 500.0)) ;2^cerchio (con l'uso di CAL) (setq Cer2 (vla-addcircle *ms* (vlax-3d-point (cal "u2w(cen)")) (cal "rad*0.25"))) - poichè vlax- lavora in WCS, mentre cal lavora in UCS, occorre trasformare le coord. del centro con la funz. u2w.
5^GRUPPO: (Uso dei vettori abbinato al comando SPOSTA) (setq P1 (cal "cur")) ; scegliere un punto a caso a video -> (-5416.63 8102.51 0.0) (setq ctr (cal "cen")) ; scegliere il centro di un cerchio a video ->(-3775.86 8720.24 0.0) (setq vect (cal "vec(p1,ctr)")) -> (1640.78 617.738 0.0) ;coordinate x,y del vettore che va da P1 a ctr (cal "abs (vect)") ;lunghezza del vettore ->1753.21 SPOSTA-Selez.oggetti-Invio- spostamento: !vect (2 volte Invio)
;oppure (setq vect (cal "200*vec1(p1,ctr)")) -> (187.174 70.4693 0.0) ;vettore di modulo 200 nella direzione P1-ctr (cal "abs (vect)") -> 200.0 ;lunghezza del vettore ;in particolare: (cal "vec1(p1,ctr)") -> (0.93587 0.352347 0.0) ;coordinate x,y del vettore unitario (cal "abs(vec1(p1,ctr))") -> 1.0 ; lunghezza del vettore unitario
PROBLEMI VARI A0) Perpendicolare, di lungh data, in un punto di un segmento; caso diverso dalla funz (dpl) che restituisce la perpend. da un punto esterno al segmento (setq PP (cal "ctr+300*nor(p1,ctr)")) ;vettore perpend. a P1-ctr; nor=vett.unitario (command "_line" ctr pp "") segmento lungo 300, perpend. in ctr (setq angol (cal "ang(ctr,pp,p1)")); 90gradi
(setq pt (cal "plt(p1,ctr,0.25)")) ;punto che si trova a 1/4 da p1 (setq Ppt (cal "pt+300*nor(p1,ctr)")) ; (command "_line" pt ppt "") ; perpend nel punto Pt
(setq pt (cal "pld (p1,ctr,100)")) ;punto che si trova a 100 unità da p1 (setq Ppt (cal "pt+300*nor(p1,ctr)")) ; (command "_line" pt ppt "") ; perpend nel punto Pt
A1) Innalzare un segmento perp. (L=600) dal baricentro di un triangolo dato
;1^soluz. ; selezionare i 3 estremi finali o iniziali dei lati, per 2 volte (setq bar (cal "(end+end+end)/3")) ;baricentro (setq perp (cal "bar+600*nor(end,end,end)")) ;estremo superiore della perpend (command "_line" bar perp "")
;2^soluz. (setq bar (cal "(end+end+end)/3")) ;baricentro (setq perp (cal "bar+(600*[1,0,0]&[0,1,0])")) (command "_line" bar perp "") ;in questo caso si è utilizzato l'operatore & (prod.vettoriale); ;esso restituisce un vettore perpendicolare al piano contenente i 2 vettori dati, ;che in questo caso sono di valore unitario e formano tra loro un angolo di 90 gradi. A2) Innalzare un segmento perp. (L=600) da un punto interno di un quadrilatero
; - dall'inters. delle 2 diagonali (setq intrs (cal "ille")) ;selez. i 4 punti finali dei lati (a 2 a 2 opposti) (setq perp (cal "intrs+600*nor(end,end,end)")) ;estremo superiore della perpend. (command "_line" intrs perp "")
; - dall'inters. delle 2 mediane (setq intrs1 (cal "ill(mid,mid,mid,mid)")) ;selez. i 4 punti medi dei lati (a 2 a 2 opposti) (setq perp (cal "intrs+600*nor(end,end,end)")) ;estremo superiore della perpend (command "_line" intrs1 perp "")
NOTA1: i punti che sono argomenti delle funzioni di 'CAL (ang, dist, dpl, dpp, ill, ilp, nor, pld, plt, rxof e simili, u2w, w2u, vec, vec1) possono essere solo modi Snap (END, INS, MID, CEN, ecc) o variabili ricavate da operazioni di OSnap, p.es.:(setq ctr (cal "cen")), per cui sono valide le forme del tipo: (setq bar (cal "(end+end+end)/3")) ; sono solo punti di Snap (setq pt (cal "pld (p1,ctr,100)")) ; se p1 e ctr sono variabili derivate da Snap ma non è valido (setq pt (cal "pld (p1,ctr,100)")) ; se p1 è ricavato, p.es., da (setq pt(getpoint) ;o simili
NOTA2: Le funzioni a scelta rapida presuppongono sempre l'osnap FINE (end), infatti terminano tutte in -e (dee, ille, mee, ecc).
NOTA3: I punti vengono immessi nella forma [x,y,z] e non, come in Autolisp, nela forma (x,y,z). Esempio: (setq bar (cal "([40,30,0]+end+end)/3")) ; è un formato valido (setq bar (cal "((40,30,0)+end+end)/3")) ; dà risultato nullo
|
Modificato da - joseph in Data 02 dicembre 2011 16:13:26
|
|