Đến nội dung


Hình ảnh
* * * * - 4 Bình chọn

Học AutoLisp


  • Please log in to reply
182 replies to this topic

#41 dungxaemdemnay

dungxaemdemnay

    Chưa sử dụng CAD

  • Members
  • Pip
  • 2 Bài viết
Điểm đánh giá: -1 (bình thường)

Đã gửi 16 November 2007 - 11:40 AM

Chỉ có thoát khỏi cả chương trình lisp (bằng lệnh exit hoặc quit) chứ không thể chỉ thoát khỏi lặp repeat.
Hơn nữa, để thoát khỏi một vòng lặp bằng cách bấm chuột phải còn phụ thuộc vào đoạn mã của bạn, có thể được và cũng có thể không được.

bác Nguyenhoangcođại chỉ mail ko mìnhcần hỏi bác mộtsố vấn đề. tk
  • -1

#42 meohoang

meohoang

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 811 Bài viết
Điểm đánh giá: 342 (khá)

Đã gửi 17 November 2007 - 10:47 PM

http://www.cadviet.com/upfiles/Tracdia2_1.rar

Bạn duy782006 ơi tôi có xem và nghiên cíu sơ sơ có 1 ít nhận xét sau:
lệnh CTD trong file tracdia.lsp mà bạn post lên chạy kèm với file giao diện tracdia.dcl
Bạn chú ý ltrong file tracdia.lsp sẽ yêu cầu người sử dụng mở file số liệu dạng data có đuôi file là *.CSV
Thường người dùng phải lập file này từ Excel (khi lưu file dùng format file là : CSV(comma delimited);
file chứa dữ liệu này cần có 4 cột số liệu : cột thứ 1 là số thứ tự,cột thứ 2 là tọa độ X, thứ 3 tđ Y, thứ 4 tọa độ Z.
Mục tiêu của file lisp này dùng để vẽ các điểm mia đo cao độ đã được xuất từ máy đo ra file dữ liệu
vào bản vẽ , sau đó ghi cao độ Z của N điểm đo và số thứ tự N của điểm đó.
File tracdia.lsp này viết đã lâu rồi cho nên trong dòng CODE lệnh "text" ko phù hợp với phiên bản Acad mới.
Tôi có sửa lại như sau; mời bạn xem rồi load lại chạy thử. Tôi đã test chạy tốt với Acad 2007.
Khi chương trình đọc file data *.CSV sẽ đọc từng dòng mối dòng data sẽ có dạng: "4,10003.683,5015.354,20.14"
Vì khi lưu file có format CSV(comma delimited) thì Excel sẽ tạo ra dạng các cột số liệu được ngăn bằng dấu ","
;;;-------------------------------------------------------------
(defun BeginDraw()
(setq OldOs (getvar "osmode") OldLay (getvar "clayer"))
(setvar "osmode" 0)
)
;;;-------------------------------------------------------------
(defun EndDraw() (setvar "osmode" OldOs) (setvar "clayer" Oldlay))
;;;-------------------------------------------------------------
(defun set_list(MyTile MyList MyVal / j x)
(start_list MyTile)
(setq j 0)
(while (setq x (nth j MyList)) (add_list x) (setq j (1+ j)))
(end_list)
(set_tile MyTile MyVal)
)
;;;-------------------------------------------------------------
(defun GetLay(/ Lay Laylist);;;; hàm này dùng để đọc danh sách các lớp đã có trong bản vẽ
(setq Lay (tblnext "LAYER" T) Laylist nil)
(While Lay (setq Laylist (append Laylist (list (cdr (assoc 2 Lay)))) Lay (tblnext "LAYER")))
(acad_strlsort Laylist)
)
;;;-------------------------------------------------------------
(defun Separate (S sym / i L ch) ;hàm này để loại trừ dấu phẩy "," trong file dữ liệu
(setq i 0 L nil)
(while (< i (strlen S))
(setq i (1+ i) ch (substr S i 1))
(if (= ch sym) (progn
(setq
L (append L (list (substr S 1 (- i 1))))
S (substr S (1+ i) (- (strlen S) i))
i 0
)
))
)
(append L (list S))
)
;;;-------------------------------------------------------------------
(Defun Dialog_TracDia(/ i i0 i1 i2)
(setq i (load_dialog "tracdia.dcl")) ;dòng code này đọc file tracdia.dcl giao diện để chọn các lớp vẽ
(if (not (new_dialog "inpoint" i)) (exit))
(action_tile "cancel" "(done_dialog)(setq Err \"*Cancel*\")(exit)")
(set_list "pt" LayList "0") ;các listbox chứa các lớp nếu ko có lớp nào cả thì đặt lớp là "0"
(set_list "el" LayList "0")
(set_list "nt" LayList "0")
(set_tile "txts" (rtos ts))
(action_tile "accept" (strcat ;;;đối với giao diện hàm action_tile sẽ tác động số liệu tại các listbox trong tracdia.dcl
"(setq i0 (atoi (get_tile \"pt\")) "
"i1 (atoi (get_tile \"el\")) "
"i2 (atoi (get_tile \"nt\")) "
"ts (atof (get_tile \"txts\"))) "
"(done_dialog)")
)
(start_dialog) (unload_dialog i)
(setq Lay0 (nth i0 Laylist) Lay1 (nth i1 Laylist) Lay2 (nth i2 Laylist))
)
;;;-------------------------------------------------------------------
(defun C:CTD( / Laylist fn ts f S L pn X Y Z1 Z p0 p1 p2 Lay0 Lay1 Lay2) ;;đây là hàm chính có C:CTD do đó sẽ đc Acad xem là lệnh và gõ CTD để chạy
(setq
fn (getfiled "Select Data File" "" "csv" 0);; dòng này gọi file data *.CSV (chương trình sẽ mở giao diện chọn nơi để file)
ts (getvar "TEXTSIZE") ;;dòng code này lấy biến hệ thống chứa chiều cao chữ
LayList (GetLay) ;;code gọi hàm GetLay đã tạo phía trên
)
(if fn (progn
(Dialog_Tracdia)
(setq f (open fn "r")) ;;dòng code này đặt biến f = file data *.CSV mà người dùng gọi vào
(read-line f) ;;đọc file
(BeginDraw)
(while (setq S (read-line f))
(setq
L (Separate S ",") ;;dòng này gọi hàm Separate loại trừ dấu phẩy hàm này có 2 đối mục S và ","
pn (nth 0 L) ;; dòng này đọc số thứ tự
X (atof (nth 1 L)) ;; dòng này đọc số tọa độ X và chuyển từ string sang Value
Y (atof (nth 2 L)) ;; dòng này đọc số tọa độ Y
Z1 (nth 3 L) ;; dòng này đọc số tọa độ Y
Z (atof Z1)
p0 (list X Y Z) ;; code này tạo ra tọa độ điểm đo
p1 (list X (+ Y (* ts 1.5)) Z) ;; code này tạo ra tọa độ điểm ghi text số thứ tự N
;;p2 (list X (+ Y (* ts 1.5)) Z) ;;theo tôi có thể o dùng dòng này
)
(setvar "clayer" Lay0) (command "point" p0)
(setvar "clayer" Lay2) (command "text" "j" "bc" p1 "" pn); tôi chỉnh lại code này để chạy được Acad 2007
(setvar "clayer" Lay1) (command "text" "j" "c" p0 "" Z1); tương tự nh trên
)
(EndDraw)
(close f)
(alert (strcat "Da ve het so lieu cao do gom co:" fn "diem" ))
));;;end if
)
;;;-------------------------------------------------------------
Riêng file tracdia.dcl tôi thấy ko có vấn đề gì vẫn chạy tốt, nếu bạn ko thích tiếng ANh thì sửa thành tiếng Việt
Cám ơn đã đọc các điều lạm bàn ở trên.
  • 1

#43 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1360 (rất tốt)

Đã gửi 19 November 2007 - 09:44 AM

Bạn duy782006 ơi tôi có xem và nghiên cíu sơ sơ có 1 ít nhận xét sau:
lệnh CTD trong file tracdia.lsp mà bạn post lên chạy kèm với file giao diện tracdia.dcl
Bạn chú ý ltrong file tracdia.lsp sẽ yêu cầu người sử dụng mở file số liệu dạng data có đuôi file là *.CSV
Thường người dùng phải lập file này từ Excel (khi lưu file dùng format file là : CSV(comma delimited);
file chứa dữ liệu này cần có 4 cột số liệu : cột thứ 1 là số thứ tự,cột thứ 2 là tọa độ X, thứ 3 tđ Y, thứ 4 tọa độ Z.
Mục tiêu của file lisp này dùng để vẽ các điểm mia đo cao độ đã được xuất từ máy đo ra file dữ liệu
vào bản vẽ , sau đó ghi cao độ Z của N điểm đo và số thứ tự N của điểm đó.
File tracdia.lsp này viết đã lâu rồi cho nên trong dòng CODE lệnh "text" ko phù hợp với phiên bản Acad mới.
Tôi có sửa lại như sau; mời bạn xem rồi load lại chạy thử. Tôi đã test chạy tốt với Acad 2007.
Khi chương trình đọc file data *.CSV sẽ đọc từng dòng mối dòng data sẽ có dạng: "4,10003.683,5015.354,20.14"
Vì khi lưu file có format CSV(comma delimited) thì Excel sẽ tạo ra dạng các cột số liệu được ngăn bằng dấu ","
;;;-------------------------------------------------------------
Riêng file tracdia.dcl tôi thấy ko có vấn đề gì vẫn chạy tốt, nếu bạn ko thích tiếng ANh thì sửa thành tiếng Việt
Cám ơn đã đọc các điều lạm bàn ở trên.


Cái này bác ssg mới viết tức thì đó bạn.
Cám ơn vì đã dịch và giải nghĩa. :bigsmile:

Hỏi thêm: meohoang la trai hay gái dậy ??
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#44 moc

moc

    Chưa sử dụng CAD

  • Members
  • Pip
  • 1 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 21 November 2007 - 09:14 PM

Bac cho em hoi la giao trih hoc Autolisp thi hoc theo giao trinh nao la hay nhat va mua o dau?
  • 0

#45 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 26 November 2007 - 02:28 PM

Thưa các Quý Anh trên diễn đàn,
Là kẻ đang mày mò học mót, tôi đã đọc các bài viết của các quý Anh, nhưng chả thấy ai nói về việc sử dụng Autolisp để viết hay cải tạo các file font của AutoCad cả (các file *.shx)
Xin cho hỏi là:
1/- Có dùng Autolisp để làm việc này được không?
2/- Nếu không thì có cách nào để viết hay cải tạo các file dạng *.shx
3/- Có ai cả gan nhận tôi làm đồ đệ trong việc học Autolisp thì cho xin đia chỉ email cá nhân để tiện liên hệ.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#46 dnhqs

dnhqs

    biết vẽ ellipse

  • Members
  • PipPip
  • 50 Bài viết
Điểm đánh giá: 6 (bình thường)

Đã gửi 26 November 2007 - 03:53 PM

Thưa các Quý Anh trên diễn đàn,
Là kẻ đang mày mò học mót, tôi đã đọc các bài viết của các quý Anh, nhưng chả thấy ai nói về việc sử dụng Autolisp để viết hay cải tạo các file font của AutoCad cả (các file *.shx)
Xin cho hỏi là:
1/- Có dùng Autolisp để làm việc này được không?
2/- Nếu không thì có cách nào để viết hay cải tạo các file dạng *.shx
3/- Có ai cả gan nhận tôi làm đồ đệ trong việc học Autolisp thì cho xin đia chỉ email cá nhân để tiện liên hệ.

Bạn phamthanhbinh oi
Mình cũng như bạn thôi cũng A, B, C về lisp nhưng mà mình nghĩ bạn vào dây (diễn đàn cadviet) thì ai chả là sư phụ. Mình không có gan làm sư phụ nhưng nếu bạn thích thì chúng ta là đông môn đi, mọi vấn đề cứ trao đổi cho cùng nâng cao công lực email: dnhqs@yahoo.com
  • 0

#47 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 15 December 2007 - 11:41 PM

Thưa Quý Anh meohoang và các Quý Anh trên diễn đàn,
Đọc bài viết của Quý Anh meohoang và các Quý Anh khác, tôi mót được nhiều thứ ra phết. Tuy nhiên vẫn có cái mót được mà chưa xài được vì ngu lâu chậm hiểu. Tỉ dụ như cái thằng getvar mà quý Anh meohoang có đề cập tới. Cho tôi hỏi:
1/- Cú pháp chuẩn của thằng getvar này như thế nào?
2/- Biến hệ thống khác với các biến thông thường như thế nào?
3/- Có phải là biến hệ thống là kết quả trả về của các hàm nội trú trong AutoCad hay không?
4/- Kết quả trả về của hàm getvar có phải chỉ là các dữ liệu dạng số hay có thể là các dạng khác nữa?
Rất mong các Quý Anh chỉ bảo giúp.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#48 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 16 December 2007 - 12:21 AM

Thưa Quý Anh meohoang và các Quý Anh trên diễn đàn,
Đọc bài viết của Quý Anh meohoang và các Quý Anh khác, tôi mót được nhiều thứ ra phết. Tuy nhiên vẫn có cái mót được mà chưa xài được vì ngu lâu chậm hiểu. Tỉ dụ như cái thằng getvar mà quý Anh meohoang có đề cập tới. Cho tôi hỏi:
1/- Cú pháp chuẩn của thằng getvar này như thế nào?
2/- Biến hệ thống khác với các biến thông thường như thế nào?
3/- Có phải là biến hệ thống là kết quả trả về của các hàm nội trú trong AutoCad hay không?
4/- Kết quả trả về của hàm getvar có phải chỉ là các dữ liệu dạng số hay có thể là các dạng khác nữa?
Rất mong các Quý Anh chỉ bảo giúp.

Xin trả lời bạn như sau:
1. Cú pháp chuẩn của thằng getvar là (getvar "tenbienhethong"). Ví dụ (getvar "clayer") trả về tên layer hiện hành.
2. Biến hệ thống khác với biến thông thường ở chỗ nó được ACAD sử dụng và liên quan mật thiết đến các lệnh của AutoCAD.
3. Biến hệ thống không phải là kết quả của hàm nội trú, nó là một ô nhớ như tất cả các biến khác, ô nhớ đặc biệt này có thể được lưu trong cấu hình cad, trong registry, trong file dwg, trong RAM.
4. Giá trị được trả về của hàm getvar là rất đa dạng phụ thuộc vào tính chất của biến đó, có thể là dạng số hoặc chữ (ví dụ tên layer thì không thể chỉ là số được).
  • 0

#49 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 01 January 2008 - 06:08 PM

Thưa Anh Nguyen Hoanh và cá quý Anh khác trên diễn đàn,
Qua trả lời của Anh Nguyen Hoanh, tôi có thủng ra đươc một tí nhưng vẫn bí rị à. Như vậy để xài được thằng getvar này, phải biết được tên các biến hệ thống được xài trong Acad, chớ đâu có xài ẩu được. Thế mà tôi mới chỉ mót được có mỗi mấy cái tên mà các quý Anh đã cho đăng đàn như "Area", "perimeter", "clayer",... thì làm sao xài phà phà được.
Vậy nên tôi lại đăng đàn nhờ các quý Anh mấy việc sau:
1/- Giới thiệu tổng quan về các biến hệ thống thường gặp trong Acad.
2/- Chỉ giùm tôi nơi có tài liệu tham khảo kỹ lưỡng hơn về mấy cái biến hệ thống này.
3/- Có ai có các lisp sử dụng cái thằng getvar này nhiều nhiều một tí thì chỉ giùm để tôi đi mót.
Cám ơn anh Nguyen hoanh và các Quý Anh trước nhé.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#50 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 01 January 2008 - 08:43 PM

Xin được trả lời bạn như sau:
1. Bạn mở AutoCAD, nhấn phím F1. Sau đó vào Command Reference rồi vào System Variables, ở đó người ta lý giải rất ngắn và rất rõ của từng biến hệ thống.
2. Giống câu 1.
3. Bạn vào chức năng search của diễn đàn, nhập từ khoá tìm kiếm là getvar, bạn sẽ có vô vàn ví dụ để xài.

Cũng xin được hỏi bạn 2 câu:
1. Tại sao bạn lại quan tâm quá về getvar! Lisp có bao nhiêu thứ, CAD cũng có bao nhiêu thứ không thấy bạn quan tâm.
2. Mục tiêu của bạn là gì? Nghĩa là bạn mong muốn hạ được con thú gì trước lúc nhả mũi tên khỏi cung tên?

Sở dĩ tôi hỏi vậy là vì không rõ về level lisp của bạn. Nếu ở level thấp thì chưa cần quan tâm đến getvar để làm gì, nếu ở level cao thì cũng không cần hỏi getvar nữa. Tức là getvar sẽ đến một cách âm thầm trong lúc ta thực hành autolisp (cũng như vô vàn các lệnh khác), nếu có hỏi thì thường câu hỏi sẽ ở dạng: 'tại sao tôi dùng getvar như thế này mà lại không được nhỉ' chứ không phải câu hỏi 'getvar là gì'.
  • 0

#51 meohoang

meohoang

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 811 Bài viết
Điểm đánh giá: 342 (khá)

Đã gửi 02 January 2008 - 02:34 PM

Thưa Anh Nguyen Hoanh và cá quý Anh khác trên diễn đàn,
Qua trả lời của Anh Nguyen Hoanh, tôi có thủng ra đươc một tí nhưng vẫn bí rị à. Như vậy để xài được thằng getvar này, phải biết được tên các biến hệ thống được xài trong Acad, chớ đâu có xài ẩu được. Thế mà tôi mới chỉ mót được có mỗi mấy cái tên mà các quý Anh đã cho đăng đàn như "Area", "perimeter", "clayer",... thì làm sao xài phà phà được.
Vậy nên tôi lại đăng đàn nhờ các quý Anh mấy việc sau:
1/- Giới thiệu tổng quan về các biến hệ thống thường gặp trong Acad.
2/- Chỉ giùm tôi nơi có tài liệu tham khảo kỹ lưỡng hơn về mấy cái biến hệ thống này.
3/- Có ai có các lisp sử dụng cái thằng getvar này nhiều nhiều một tí thì chỉ giùm để tôi đi mót.
Cám ơn anh Nguyen hoanh và các Quý Anh trước nhé.

Ngoài cách của Hoành bạn có thể dùng lệnh _.sysvdlg của Express rồi bấm xem giải thích cặn kẻ các biến hệ thống (phải cài Express mới có lệnh này)
Việc dùng lisp để lấy biến hệ thống phải tùy ý đồ của người viết code bạn ạ. Phải xông trận vào khu rừng mã lệnh rối rắm để mò và học dần ...sau mỗi trận chiến thì sáng dạ ra ngay ấy mà
  • 0

#52 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 02 January 2008 - 02:44 PM

Thưa anh Nguyen hoanh và các quý Anh trên diễn đàn,
Thú thực là tôi chả biết gì nhiều về autolísp này cả, vẫn còn đang đi mót mà. Cái anh Nguyen Hoanh hỏi làm tôi mắc cỡ muốn xỉu luôn.
Sở dĩ tôi hỏi về thằng getvar là vì trong lúc lang thang trên cánh đồng Autolisp để mót thì thấy nó, tôi nhặt lên để kiếm cách xài mà xài hổng được. Hỏi hoài cốt để hiểu cái mà các quý anh đã cho thôi chớ nào dám có tham vọng chi đâu.
Vốn là dân đi mót nên tôi cố gắng chắt chiu của mót được, cố gắng hiểu được cái mình có trong tay cho dù có thể nó chưa hoàn chỉnh, chỉ là những mảnh kiến thức rơi vãi của mọi người.
Hiện tại tôi mót được củ Autolisp của cụ Jeff Sanders quẳng trên mạng nên cũng đang cố gặm. Hy vọng có ngày hiểu được những điều các Quý Anh chỉ dạy.
Rất cám ơn anh Nguyen hoanh và các quý anh khác đã tận tình chỉ dạy. (Mặc dầu tôi ngu lâu chậm hiểu)
Vẫn biết Cad và autolisp còn mênh mông bát ngát lắm, tha hồ mà mót. Song trí lực có hạn nên tôi chỉ biết cố gắng tận lực, được gì xài nấy vậy, chả dám mơ mộng chi đâu.
À nhân tiện tôi xin lộ tẩy luôn là đúng như các Quý Anh đã xếp hạng, tôi vào cái loại chưa biết gì về Cad, mong được chỉ giáo nhiều nhiều.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#53 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 02 January 2008 - 02:52 PM

Cám ơn cả anh meo hoang nữa nhé, đọc bài của anh thấy sáng ra nhiều lắm. Rất mong được thọ giáo dài dài. Đa tạ, đa đa tạ.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#54 RomanHunter

RomanHunter

    Chưa sử dụng CAD

  • Members
  • Pip
  • 1 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 03 April 2008 - 09:24 AM

Em mới vào lần đầu thui, mà gặp toàn người tốt....em chân thành cảm ơn các bác
Mọi người đều như các bác thì Việt Nam sắp nổi như cồn rùi........Việt Nam muôn năm..............
  • 0

#55 thangsra

thangsra

    biết vẽ rectang

  • Members
  • PipPip
  • 83 Bài viết
Điểm đánh giá: 7 (bình thường)

Đã gửi 06 April 2008 - 09:00 PM

Phần 3:

Trong phần 2, chúng ta đã tạo được một chương trình lisp có giao tiếp với AutoCAD thông qua tên lệnh.
Tại phần 3 này, chúng ta sẽ viết một chương trình thực sự, có ích hẳn hoi.

Đó là chương trình tính diện tích của một đối tượng. Trên file hoclisp.lsp, hãy sửa tên hàm chao thành tdt và thêm các mã lệnh như sau:
(defun c:tdt( / sel ent dientich)
(princ "\nChao cadviet")

(setq sel (entsel "\nHay chon doi tuong: "))
(setq ent (car sel))
(command ".area" "o" ent)
(setq dientich (getvar "area"))
(princ "\nDien tich doi tuong vua roi la: ")
(princ dientich)
(princ "\nm2")

(princ)
)

Bạn thử appload file hoclisp.lsp mới và gọi lệnh tdt thử xem, chương trình sẽ yêu cầu bạn nhập vào 1 đối tượng. Và nó sẽ kết xuất diện tích đối tượng vừa rồi ra màn hình:
Command: tdt
Chao cadviet
Hay chon doi tuong: .area
Specify first corner point or [Object/Add/Subtract]: o
Select objects:
Area = 46546736.0000, Perimeter = 28320.0000

Command:
Dien tich doi tuong vua roi la: 4.65467e+007m2

Điều gì làm nên sự khác biệt này vậy: chúng ta hãy lần theo từng lệnh nhé.
- Lệnh (entsel "\nHay chon doi tuong: ") là lệnh trả về đối tượng được pick, kết quả trả về là một tập hợp gồm 2 thành phần: thứ nhất là đối tượng được pick, thứ 2 là tọa độ pick.
- Lệnh (setq sel (entsel "\nHay chon doi tuong: ")) là lệnh gán kết quả vừa pick vào biến sel. Bạn nhớ là lệnh (setq a :bigsmile: là gán giá trị a bằng giá trị b. Trong trường hợp này a là sel, b là kết quả của hàm entsel.
- Lệnh (car sel) là lệnh lấy giá trị đầu tiên của biến sel (biến sel có dạng tập hợp) tức là đối tượng được chọn.
- lệnh (setq ent (car sel)) là lệnh gán giá trị biến ent bằng ename của đối tượng được chọn. ename của một đối tượng là giá trị chỉ ra đối tượng trong một bản vẽ cad.
Như vậy, 2 dòng lệnh
(setq sel (entsel "\nHay chon doi tuong: "))
(setq ent (car sel))
có ý nghĩa là gán giá trị biến ent cho đối tượng vừa được chọn bằng phương pháp pick.

Tiếp đến, lệnh (command ".area" "o" ent) tương đương với gõ tại dòng lệnh command: .area rồi gõ tiếp o và pick đối tượng. Bạn nhớ là lệnh (command a b c d e f...) tương đương với việc gõ các giá trị a, b, c, d, e, f ... vào dòng lệnh của cad. Như vậy, lệnh trên tương đương với việc tính diện tích của đối tượng vừa được chọn.

- Lệnh (setq dientich (getvar "area")): gán giá trị biến dientich bằng giá trị của biến hệ thống AREA (biến hệ thống AREA chứa diện tích vừa được tính bằng lệnh AREA trước đó của cad).

-cụm lệnh:
(princ "\nDien tich doi tuong vua roi la: ")
(princ dientich)
(princ "m2")
chắc chắn bạn biết đó là lệnh viết dòng chữ 'Dien tich doi tuong vua roi la: ' diện tích đối tượng vừa rồi 'm2'.
Trên màn hình bạn còn nhìn thấy các dòng chữ khác ngoài dòng chữ trên đó là do các lệnh area của CAD sinh ra. Trong bài học sau chúng ta sẽ biết cách loại bỏ chữ này.


  • 0
It`s me !!

#56 thangsra

thangsra

    biết vẽ rectang

  • Members
  • PipPip
  • 83 Bài viết
Điểm đánh giá: 7 (bình thường)

Đã gửi 07 April 2008 - 09:30 AM

Làm thế nào để nhớ nhanh hết các tên hàm hả bác Hoành. Học cái này có giống học mấy ngôn ngữ lập trình không vậy. Với lại có sách gì tham khảo bác load lên cho anh em với.
  • 0
It`s me !!

#57 Toannd.slhpp

Toannd.slhpp

    Chưa sử dụng CAD

  • Members
  • Pip
  • 4 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 19 April 2008 - 11:13 PM

:bigsmile: em cũng là dân cơ khí nhưng bây giờ mới cs thời gian tiếp xúc với mạng nên bây giờ mới phát hiện ra forum này
  • 0

#58 sieutoc

sieutoc

    Chưa sử dụng CAD

  • Members
  • Pip
  • 1 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 22 April 2008 - 11:15 AM

Bác Hoành có thể cho em biết cách nào để chèn một file ảnh vào bản vẽ cad tại một vị trí ta đinh sẵn(không phải bằng thao tác chèn hình),mà sau đó khi ta ra rê chuột tới vị trí đó thì hình tự động hiện lên.
cảm ơn anh rất nhiều. mong được nhận câu trả lời sớm nhất

  • 0

#59 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 22 April 2008 - 12:54 PM

Bác Hoành có thể cho em biết cách nào để chèn một file ảnh vào bản vẽ cad tại một vị trí ta đinh sẵn(không phải bằng thao tác chèn hình),mà sau đó khi ta ra rê chuột tới vị trí đó thì hình tự động hiện lên.
cảm ơn anh rất nhiều. mong được nhận câu trả lời sớm nhất

Chịu!
  • 0

#60 ainhandilac

ainhandilac

    biết vẽ pline

  • Members
  • PipPip
  • 63 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 25 April 2008 - 09:28 AM

Bạn phân tích như thế nào mà dùng cadr?! Để lấy thông tin về đối tượng, bạn cần tìm hiểu về entity và hàm entget.
Ví dụ: (cdr (assoc 40 (entget (car (entsel))))) sẽ trả về bán kính đường tròn do người dùng select. Có bán kính tất nhiên biết chu vi.
Vấn đề là bạn có hiểu biểu thức trên không, cũng như có hiểu bản chất của thủ thuật mà bạn duy782006 đề xuất không?
Góp ý với bạn: hãy bắt đầu bằng những cái cơ bản nhất. Lập trình lisp không khó, nhưng không nên nóng vội!


Bac ssg đã tâm sự là muốn làm chủ được lệnh ssg (ssget)
không biết bây giờ bác đã thực hiện được chưa
nếu được rồi, mong bac chia sẻ cùng anh em về lệnh này
cảm ơn nhiều và mong hồi âm sớm
  • 0
SỐNG TRÊN ĐỜI CẦN CÓ NIỀM TIN