FamousWhy.ro Forum: Autolisp - FamousWhy.ro Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Autolisp Limbaj de programare sub AutoCAD

#1 User is offline   QvoVadis Icon

  • Membru Avansat
  • PipPipPip
  • Group: Membri Avansaţi
  • Posts: 628
  • Joined: 18-January 08
  • Gender:Male
  • Location:Constanta

Posted 07 April 2008 - 04:54 PM


"AutoLISP este un subset al limbajului LISP, mai precis al X-LISP-ului. AutoLISP este o variantă de LISP care conţine un subset de funcţii LISP şi un set de funcţii specializate īn prelucrarea desenelor AutoCAD. AutoLISP este un limbaj de programare neprocedural care prelucrează liste de simboluri şi nu date numerice cum o fac limbajele procedurale. Simbolurile sunt reprezentări ale unor obiecte care au o anumită semnificaţie. Simbolul este echivalentul variabilelor din limbajele procedurale. Un simbol poate fi folosit pentru a reprezenta caracteristici geometrice. Scopul unui simbol nu este neapărat de a comunica o valoare numerică, ci poate avea o destinaţie complexă pentru care, īn alte limbaje, se fac eforturi considerabile īn faza de implementare pentru modelarea şi reprezentarea acestuia. Acesta este şi motivul pentru care firma AutoDesk a inclus īn programul de desenare/proiectare AutoCAD interpretorul AutoLISP.
Orice comandă AutoCAD, după introducerea acesteia, este transferată interpretorului de comenzi. Acesta este o procedură care compară şirul de caractere introdus cu toate comenzile cunoscute AutoCAD. Dacă şirul de caractere introdus este acelaşi cu o comandă AutoCAD, deciziile programului se vor face īn funcţie de comanda introdusă.
Dacă interpretorul de comenzi găseşte o paranteză rotundă deschisă, presupune că tot ce urmează după acesta este o expresie AutoLISP care va ţine pānă la īnchiderea parantezei rotunde, iar expresia este transferată interpretorului AutoLISP īn vederea evaluării.
Īn limbajele de programare clasice, utilizatorul are un set de tipuri de date predefinite de la care poate pleca pentru a-şi defini tipuri noi de date utilizānd metodele de structurare accesibile limbajului. Acest lucru nu este posibil şi īn AutoLISP, īn care utilizatorul foloseşte numai tipuri predefinite de date (īntreg; real; şir de caractere; simbol; listă; fişier; subprogram sau funcţie internă AutoLISP; subprogram sau funcţii ADS; nume de entitate; mulţime de selecţie). Astfel, datele de tip număr sunt grupate īn două clase: fracţionare sau reale (REAL), respectiv nefracţionare sau īntregi (INTEGER). Datele de tip şir sunt colecţii de caractere cuprinse īntre ghilimele. Datele de tip nume de entitate, respectiv mulţime de selecţie sunt implementate pentru a permite accesul la entităţile AutoCAD. Datele de tip listă sunt cuprinse īntre paranteze rotunde şi sunt formate din elemente separate prin spaţii.
AutoLISP recunoaşte o singură structură de date şi anume, lista. Aceasta este formată din simboluri (atomi), numere, şiruri sau orice alte tipuri de date valide. Simbolurile listei sunt cuprinse īntre paranteze rotunde. O listă, la rāndul ei, poate conţine alte liste. Īntotdeauna elementele listei vor fi separate prin spaţii.
Există 2 clase de liste: lista standard (evaluată de AutoLISP), respectiv lista precedată de apostrof (care nu este evaluată de AutoLISP).
Regula de bază a listelor standard constă īn faptul că primul element al listei trebuie să fie o funcţie AutoLISP validă, urmată de numărul corect de argumente ale funcţiei.
Obiectul de bază al AutoLISP-ului este simbolul, care prezintă un aspect dual: nume, respectiv legătură. Atribuirea unei valori unui simbol constă īn legarea simbolului la acea valoare. Valoarea şi nu simbolul determină tipul informaţiei reprezentate. Īn AutoLISP nu se poate realiza o legătură simultană la valoare şi la funcţie, simbolul fiind legat numai la una singură.
Īn AutoLISP nu există operatori, ci numai funcţii.
Funcţia reprezintă un set de comenzi LISP care determină o activitate specifică a programului. AutoLISP recunoaşte două tipuri de funcţii: interne, respectiv definite de utilizator.
Din categoria funcţiilor interne, fac parte: funcţiile aritmetice; funcţiile de manipulare a listelor; funcţii specifice AutoLISP. Funcţiile interne se mai numesc şi primitive AutoLISP.
Funcţiile definite de utilizator se realizează prin funcţia defun.
Interpretorul AutoLISP prelucrează liste de forma (nume_funcţie argumente). Cānd interpretorul īntālneşte o listă, verifică mai īntāi primul simbol al acesteia. Dacă acesta este un nume valid de funcţie, transferă restul listei (argumentele) īn corpul funcţiei unde se va prelucra lista rămasă.
Greşeala cea mai frecventă īn programarea sub AutoLISP constă īn gestionarea parantezelor rotunde. Parantezele rotunde sunt cele prin care interpretorul AutoCAD face deosebirea dintre comenzile specifice şi expresiile AutoLISP. Este obligatoriu ca parantezele rotunde să apară īn pereche adică, pentru fiecare paranteză rotundă deschisă să existe corespondentul unei paranteze rotunde īnchise.
Principalele caracteristici ale limbajului AutoLISP, sunt:
· majoritatea funcţiilor necesită parametrii sau argumente (argumentul sau parametrul este o variabilă independentă care determină rezultatul returnat de funcţie);
· o funcţie returnează īntotdeauna o valoare;
· orice simbol declarat īn lista de parametrii a unei funcţii este legat la o valoare atāta timp cāt se execută funcţia;
· o funcţie returnează īntotdeauna valoarea ultimului simbol sau a listei evaluate īn corpul acesteia."

Exemplu: Calcularea lui n!

(DEFUN C:fact()
(princ "\nProgram pentru calcularea lui n!")
(setq num (getint "\nIntroduceti numarul: ")
pas 1
i 1)
(while (<= i num)
(setq i (+ i 1)
pas (* pas i))
)
(prompt (strcat "\nValoarea lui n! este: " (rtos num) "!" "=" (rtos pas)))
(princ)
)

(Sursa: P.A. Programarea calculatoarelor si limbaje de programare. UOC, 2005)
0

#2 User is offline   QvoVadis Icon

  • Membru Avansat
  • PipPipPip
  • Group: Membri Avansaţi
  • Posts: 628
  • Joined: 18-January 08
  • Gender:Male
  • Location:Constanta

Posted 23 April 2008 - 03:15 PM

Desenare interactiva a triunghiurilor in mediul grafic Acad

(DEFUN C:triung()
(SETQ pts (GETPOINT "Punct de start: ")
lungx (GETREAL "Lungime pe x: ")
lungy (GETREAL "Lungime pe y: ")
crdx (LIST (CAR pts))
crdy (CADR pts)
)
(WHILE (NOT (NULL lungx))
(SETQ crdx (CONS lungx crdx)
ptx2 (APPLY '+ crdx)
)
(COMMAND "LINE" pts (LIST ptx2 crdy)
(LIST ptx2 (+ lungy crdy)) "C")
(COMMAND "ZOOM" "E")
(SETQ lungx (GETREAL "Introduceti alta cateta pe x: "))
)
(PRINC "Au fost introduse urmatoarele lungimi de catete (x):\n")
(PRINC crdx)
)
0

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users