TuttoCAD Forum

TuttoCAD Forum
[ Home | Registrati | Discussioni Attive | Discussioni Recenti | Segnalibro | Msg privati | Sondaggi Attivi | Utenti | Album Fotografico | Download | | Cerca | FAQ ]
Nome Utente:
Password:
Salva Password
Password Dimenticata?

 Tutti i Forum
 1 - TuttoCAD Software
 AutoLISP
 CAL (Geometric Calculator) in Autolisp
 Nuova Discussione  Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
I seguenti utenti stanno leggendo questo Forum Qui c'è:
Autore Discussione Precedente Discussione Discussione Successiva  

joseph
Utente Master



Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore


1884 Messaggi

Inserito il - 30 novembre 2011 : 17:30:26  Mostra Profilo Invia a joseph un Messaggio Privato  Rispondi Quotando
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

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 01 dicembre 2011 : 07:51:38  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
eccellente spiegazione joseph
Torna all'inizio della Pagina

joseph
Utente Master



Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore


1884 Messaggi

Inserito il - 02 dicembre 2011 : 11:14:15  Mostra Profilo Invia a joseph un Messaggio Privato  Rispondi Quotando
Ho integrato e sostituito gli appunti precedenti con una nuova versione riveduta e corretta.
Torna all'inizio della Pagina
  Discussione Precedente Discussione Discussione Successiva  
 Nuova Discussione  Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
Vai a:
TuttoCAD Forum © 2001-2010 CADLandia Torna all'inizio della Pagina
Pagina generata in 0,29 secondi.