caut ruc chuong trinh

7
CHÖÔNG IV: CAÁU TRUÙC TRONG CHÖÔNG TRÌNH CUÛA AutoLISP Caáu truùc trong AutoLISP coù ñuû ñaëc tröng cuûa nhöõng caáu truùc chuaån cuûa ngoân ngöõ laäp trình. Ñoù seõ laø nhöõng caáu truùc If-Then-Else, While,Cond, Progn. Trong phaàn naøy baïn seõ tieáp tuïc tìm hieåu theâm veà caùc haøm cuûa AutoLISP. IV.1 Caùc haøm logic Trong AutoLISP söû duïng ba haøm thoâng duïng cuûa toaùn logic: and (vaø), or (hoaëc laø) vaø not (phuû ñònh). Caùc haøm hoaøn traû hoaëc T neáu ñieàu kieän ñöôïc thoaû maõn, hoaëc nil cho tröôøng hôïp ngöôïc laïi. Giaû söû chuùng ta coù A vaø B ñeàu thoaû maõn T coøn C laø nil. Caùc bieåu thöùc döôùi ñaây seõ hoaøn traû nhö sau: (and a b c) -> nil (and a b) -> T (or a b c) -> T (not (or a b)) -> nil Haøm IF Trong laäp trình haøm IF xuaát hieän thöôøng xuyeân. Nghóa ñaày ñuû cuûa haøm naøy “ if -then- else”, ñöôïc giaûi thích baèng caâu: “ neáu ñieàu kieän neâu ra laø T, thì thöïc hieän bieåu thöùc ñaàu, baèng khoâng (ñöôïc hieåu laø nil) haõy thöïc hieän bieåu thöùc sau”. Bieåu thöùc cuûa IF coù daïng: (if <test1 > <test2>... ) Ví duï: (if (= a b ) (princ “a = b\n” )) (if (> a b ) (princ “ a > b\n”)) coøn bieåu thöùc sau: (if test “ DUNG” “ SAI”) ñöôïc hieåu cuï theå nhö sai: ( if test “ DUNG” ; neáu laø T, haõy hoaøn traû “ DUNG” “ SAI” ; neáu nil, haõy hoaøn traû “ SAI” ) Khai trieån ñoïan chöông trình treân coù theå taïo moät pheùp thöû daïng sau : (defun TEST() (prompt “Phep thu Dung/Sai?”) (if ( = ( ds “n Dung hay Sai <D/S> ?“) “D” ) (princ “\nDUNG\n” ) (princ “\SAI\n”) ) () ) Caâuù truùc COND Caáu truùc COND laøm vieäc gioáng nhö IF, ngoaïi tröø khaû naêng cuûa noù coù theå xöû lyù raát nhieàu ñieàu kieän thöû nghieäm. Noùi caùch khaùc, COND coù theå thay cho nhieàu haøm IF cuøng moät luùc COND hoaøn traû giaù trò ñöôïc tính sau cuøng. Sô ñoà COND coù theå hieåu nhö hình döôùi ñaây: (cond ((test )........................) ((test )........................) ..................................... ) 52

Upload: reyuer-euru

Post on 01-Oct-2015

213 views

Category:

Documents


0 download

DESCRIPTION

etwyw

TRANSCRIPT

  • CHNG IV: CAU TRUC TRONG CHNG TRNH CUA AutoLISP Cau truc trong AutoLISP co u ac trng cua nhng cau truc chuan cua ngon ng lap trnh. o se la nhng cau truc If-Then-Else, While,Cond, Progn. Trong phan nay ban se tiep tuc tm hieu them ve cac ham cua AutoLISP.

    IV.1 Cac ham logic Trong AutoLISP s dung ba ham thong dung cua toan logic: and (va), or (hoac la) va not (phu nh). Cac ham hoan tra hoac T neu ieu kien c thoa man, hoac nil cho trng hp ngc lai. Gia s chung ta co A va B eu thoa man T con C la nil. Cac bieu thc di ay se hoan tra nh sau:

    (and a b c) -> nil (and a b) -> T (or a b c) -> T (not (or a b)) -> nil

    Ham IF Trong lap trnh ham IF xuat hien thng xuyen. Ngha ay u cua ham nay if -then-else, c giai thch bang cau: neu ieu kien neu ra la T, th thc hien bieu thc au, bang khong (c hieu la nil) hay thc hien bieu thc sau. Bieu thc cua IF co dang: (if ... ) V du: (if (= a b ) (princ a = b\n )) (if (> a b ) (princ a > b\n)) con bieu thc sau: (if test DUNG SAI) c hieu cu the nh sai: ( if test DUNG ; neu la T, hay hoan tra DUNG SAI ; neu nil, hay hoan tra SAI ) Khai trien oan chng trnh tren co the tao mot phep th dang sau : (defun TEST() (prompt Phep thu Dung/Sai?) (if ( = ( ds n Dung hay Sai ?) D ) (princ \nDUNG\n ) (princ \SAI\n) ) () )

    Cau truc COND Cau truc COND lam viec giong nh IF, ngoai tr kha nang cua no co the x ly rat nhieu ieu kien th nghiem. Noi cach khac, COND co the thay cho nhieu ham IF cung mot luc COND hoan tra gia tr c tnh sau cung. S o COND co the hieu nh hnh di ay: (cond ((test )........................) ((test )........................) ..................................... )

    52

  • V du: 1. (setq chon ( strcase (getstring Kieu (C90/C45/RED/TEE):))) 2. (cond 3. ( ( = chon C90) ( prompt cut 90)) 4. ( ( = chon C45) ( prompt cut 45)) 5. ( ( = chon RED) ( prompt thu cap)) 6. ( ( = chon TEE) ( prompt Te T)) 7. ( chon (prompt Nham roi ban oi)) 8. ) ;

    Gia s ban can bao cho ngi dung biet la chng trnh can nap, v du chng trnh (defun C: TD1() .......................... ) a c thc thi hay cha, ban co the viet nh sau: (if (not C:TD1) (load td1) (princ TD1 a san sang)) Neu dung ham cond ban se viet di dang: (cond ((not C:TD1) (load td1) (C:TD1 ( princ TD1 a san sang)) ) Ham PROGN

    (progn expr...) Ham Progn tap hp cac bieu thc lai thanh mot bieu thc va bat tat ca bieu thc cung hoat ong theo mot tn hieu chung do Progn nh. Neu ham IF ch co mot then va sau else ch co mot bieu thc c the hien th, Progn chap nhan cach lam cua nhieu bieu thc if trong nhom. e minh hoa cach dung ham progn ban xem ky cac giai thch v du sau: 1. (if test ; la ham if vi ieu kien test 2. (progn ; neu T, hay thc hien... 3. (setvar ORTHOMODE 1) 4. DUNG ; hoan tra UNG 5. ) 6. ( progn ; neu nil, hay thc hien 7. (setvar ORTHOMODE 0) 8. SAI ; HOAN TRA sai 9. ) 10. ) Vong lap hu han repeat Khi muon thc hien mot so ong tac theo mot so lan xac nh trc, ban co the dung vong lap n gian va co gii han repeat: (repeat number expr...) Trong ham nay number la so nguyen dng ch so lan can thc hien cho cac bieu thc expr. Ham ch hoan tra gia tr cua bieu thc cuoi cung sau lan tnh cui cung. V du: (setq m 1 n 100)

    53

  • (repeat 5 (setq m ( + m 1))) n ( + n 100) ) ; repeat Sau phep tnh ( 5 lan tnh) m c gan 6 con n c gan 600 va hoan tra 600. Lap co ieu kien while

    (while test expr...) Ham while khao cu ieu kien test, neu test khong phai nil mi thc hien cac bieu thc expr... cong viec keo dai khong han nh cho en khi ieu kien test la nil. V du :

    (setq count 2 data (A B C D)) (while (< count 6) (print (nth count data)) (setq count (1+ count)) ) -> C D 6

    X ly danh sach vi ham FOREACH Ham foreach tach tng danh muc khoi danh sach va dung no lam bien tam thi cho cac bieu thc con lai trong chng trnh. No hoan tra ket qua cua bieu thc cuoi.

    (foreach symbol list expr...) Ham thi hanh bieu thc expr theo cach thc sau, lan lt gan cac thanh phan cua danh sach list vao ky hieu symbol, roi a symbol a c gan o vao bieu thc e thi hanh. V du:

    (foreach s (i j k) (print s) ) tng ng vi cac bieu thc c thay the sau: (print i) (print j) (print k)

    IV. 2 Chng trnh con va chng trnh e qui Chng trnh con trong AutoLISP c xet di dang subroutine nh ten goi trong ngon ng lap trnh. Moi chng trnh con lam mot viec cu the, c soan mot cach ro rang co cau truc chat che va de sa cha khi co sai sot. Chng trnh chnh se lan lt goi cac chng trnh con khi x ly cong viec cu the. V du di ay mieu ta mot chng trnh ve vong tron co ng knh ghi trong danh sach. Chng trnh gom ba chng trnh con: chng trnh ve hnh tron ve(), chng trnh lap danh sach cac ng knh cho trc danh sach() va chng trnh diam() oc ng knh. 1. ; ; ; chng trnh ve cac vong tron 2. ; ; ; chng trnh con so 1 3. (define ve() 4. (diam) 5. (foreach pt (danhsach) 6. (command CIRCLE pt D #diam) 7. ); foreach 8. ) ; defun ve

    54

  • 9. ; ; ; chng trnh con so 2 10. (defun danhsach ( /pt pl) 11. (while (setq pt (getpoint \nDiem:)) 12. (setq pl (append pl (list pt ))) 13. ) 14. ) 15. ( if # diam nil (setq #diam 0.5)) 16.; ; ; chng trnh con so ba 17. (defun diam (/ tmdia) 18. (prompt \nDiam:) 19. (princ #diam) 20. (setq tmdia (getdist dist:)) 21. (if tmdia (setq #diam tmdia)) 22. ) 23.; ; ; 24.; tap hp lai 25. (danhsach) 26. (ve) 27. 28.

    Cac dang ham tien ch thong dung

    Chung ta can lap san nhng mau ham tien ch thong dung, tao de dang cho cong viec lap trnh. Nhng chng trnh con co ten goi COKHONG sau ay at ra cau hoi thoai vi ngi dung Co ung hay Khong ? va yeu cau ngi dung phai tra li bang cach anh t ban phm mot trong hai ky t C hoac K. Cac ky t C, K co the dang chu thng, khong nhat thiet phai la ch in.

    Chng trnh th nhat: ; COKHONG ch cau tra li : C,c, K hoac c ; se hoan tra C hoac K ; v du s dung (cokhong Hay cho biet Co hay Khong? :)

    1. (defun COKHONG (ck) 2. (while (not ( member ans (C K ))) 3. (setq ans 4. (strcase ; nang thanh ch in 5. (getstring ck )))) 6. ) ; defun

    Chng trnh th hai cung co ten goi, cung lam mot chc nang song c viet di dang gan gia tr au co kiem tra qua ham getword.

    ; COKHONG i cau tra li co hay khong ?

    ; hoan tra cua AutoLISP C hoac K

    ;v du ( cokhong Hay cho biet Co hay Khong? :) 1. (defun COKHONG (ck) 2. (iniget 1 C c K k)

    55

  • 3. (setq ans (strcase 4. (getword ck) 5. ) 6. )

    Chng trnh e qui Trong chng trnh dang nay, AutoLISP cho phep s dung ngay chng trnh mieu ta chnh no. V du: tnh giai tha cua mot so nguyen co dang nh sau:

    (defun factor( y))

    (cond (( = 0 y) 1)

    (t ( * y ( factor ( 1 - y))))

    )

    )

    ( defun c:FACT (/ x)

    (initget 7)

    (setq x (getint Cho so nguyen:))

    (factor (factor x))

    )

    IV. 3 Menu

    Vi AutoLISP ban co the tao cac menu tuy s thch. Cac menu trc tiep giup ban thao tac nhe nhang va chnh xac hn. Co the s dung ngay cac menu co san trong AutoCAD e ho tr luc ve va khi can co the tao menu hoan toan mi. Kch hoat menu ban se dung ham menucmd cua AutoLISP :

    (menucmd menu)

    Chuoi menu c thay the bang cac ma so va ten goi cua menu theo dang: code = menuname Trong o code co ngha: bn goi menu nut bam s goi menu man hnh pn goi menu keo len xuong, vi n- nhom menu n =1...10 i goi menu hnh tng icon V du s dung ban nhn thay trong chng trnh tiep theo.

    (defun testmn( / p11 p2) (menucmd s=osnapb) (setq p1 (getpoint \nP1 :) p2 (getpoint \nP2 :)) (command LINE p1 p2 ) ) iem khac gia chng trnh nay va chng trnh tng t chung ta a gap nhieu lan

    nam dong (menucmd s=osnapb). Trong dong nay ten goi menu osnapb la cua AutoCAD, ma s bao hieu ang dung menu man hnh. Khi nap xong chng trnh, ong thi vi s xuat

    56

  • hien dong ch P1 : tren mien lenh cua AutoCAD, mot menu OSNAPB cua man hnh xuat hien ngay giup ban bat cac oi tng chnh xac hn.

    Khi dung menu keo len xuong tnh hnh co ve khac hn. Thay dong th hai cua chng trnh nho nay bang cac ham s dung menu keo len xuong ban se thay s cach biet.

    (defun testmn( / p11 p2) (menucmd p1= filters) (menucmd p1=*) (setq p1 (getpoint \nP1 :) p2 (getpoint \nP2 :)) (command LINE p1 p2 ) ) Menu cot keo len xuong v tr p1 (au tien, nam ben tai man hnh) c hien ra ch

    ban su dung.

    Cac file menu co dang : XXX. MNU. Trong AutoCAD a cai at san cac file.mnu chuan v du acad.mnu, tutor.mnu. Moi menu co the co menu cap thap hn hoac cac thu tuc lam cong viec khai trien y cua menu chnh. Mot so dang thc ban can nh neu muon viet mot thu tuc hoac v mo.

    Tieu e lenh at trong dau ([ ]) Menu man hnh anh dau bang ba ngoi sao, v du ***SCREEN Menu cap di anh dau bang hai sao, v du **m Goi Menu cap di $S= Nhng ky t ac biet gianh cho viec viet cac file menu bao gom: \ ngng giay lat e nhap d lieu + tiep tuc cho dong di khi viet v mo * dau t ong lap lai hoac dau trang, dau ; RETURN ^D giong nh Ctrl+D ^G tng t Ctrl+G ^C *cancel* ^Q bao dau hieu cho may in ^X xoa buffer nhap ^B Ctrl+B ^M RETURN ^H BACKSPACE IV. 4 Thong bao thong tin cac ham e giup tm loi va co cach sa cha cac sai sot trong cac ham,can thiet phai theo doi

    cac ham va thong bao ay u thong tin ve chung. Ham lam viec o co ten trace (trace functions...) Con ham untrace lam nhiem vu xoa bo cac vet tch ma trace a bo cong tm ra. (untrace functions...) V du s dung cua hai ham tren co the la: (trace hamso)

    57

  • 58

    -> HAMSO (untrace hamso) ->HAMSO

    Chng trnh e qui