Thứ Tư, 7 tháng 4, 2010

Hướng dẩn viết lisp bài 21:

Bạn nên theo dỏi theo tên bài viết tăng từ nhỏ tới lớn thì mới đúng trình tự!

*Đến lúc này kiến thức về lisp của bạn đã đủ để viết lisp đánh cos cao độ rồi. Mình làm mẫu để bạn có thể quen dần với cách đặt và giải quyết vần đề bằng lisp nhé.
*Đặt vấn đề:
-Khi vẽ bạn có nhu cầu đánh cao độ cho các mặt đứng, mặt cắt. Cách thông thường là bạn có sẳn cái BLOCK rồi chèn vào COPY để tại các vị trí cần thiết xong đo và sửa các gía trị của text cho phù hợp. Cái phiền là bạn phải đo, tính theo tỉ lệ vẽ từ đó mới có giá trị điền vào các text, còn phải thêm dấu phía trước giá trị text nửa. Ví dụ +3.600.
-Giải quyết vấn đề bằng cách làm các công việc sau:
a/Tạo 1 BLOCK có tên caodo.dwg lưu vào thư mục nào đó (ở đây mình dùng C:\tailieukythuat\dwg\caodo.dwg). Khi tạo Block này bạn nên tạo ở Layer 0 có màu là bylayer, để khi chèn vào nó đi theo các thông số của layer hiện hành. Điểm chèn BLOCK nằm đúng mũi tên của BLOCK.
b/Viết lisp với các chức năng sau:
+Hỏi 1 mét vẽ bằng bao nhiêu: (dùng getreal)
+Hỏi chọn điểm đánh cao độ: (dùng getpoint)
+Hỏi chọn cao độ 0.000: (dùng getpoint) lúc này lưu chế độ bắt điểm lại và gán chế độ bắt điểm bằng 128 (bắt vuông góc).
+Chèn BLOCK caodo.dwg vào điểm đánh cao độ vừa chọn. Lúc này gán chế độ bắt điểm bằng 0.
+Tính toán tọa độ để viết text căn cứ vào tọa độ điểm vừa chèn.
+Đo khoảng cách từ điểm đánh cao độ đến điểm có cao độ 0.000.
+Chia khoảng cách đo được cho giá trị vẽ 1 mét.
+Làm tròn sau dấu phẩy là 3 chử số: (dùng rtos)
+Lấy giá trị y của điểm đánh cos trừ cho giá trị y của điểm cao độ 0.000
+Nếu giá trị này >0 thì gán dấu phía trước của text là dấu +.
+Nếu giá trị này <0 thì gán dấu phía trước của text là dấu -.
+Nếu giá trị này =0 thì gán dấu phía trước của text là dấu .
+Viết text gồm dấu phía trước và giá trị cao độ tại điểm vừa tính được.
-Dưới đây là hình minh họa về hình dáng BLOCK cao độ, các thông số về tọa độ viết text so với điểm chèn, độ lớn text mình sử dụng trong đoạn lisp mẫu.


(defun c:cos ()
(command "undo" "be")
(setq motmet (getreal "\nMot met ban ve bang bao nhieu: "))
(setq luubatdiem (getvar "osmode"))
(setq a (getpoint "\nChon diem muon danh cos: "))
(setvar "osmode" 128)
(setq b (getpoint a"\nChon cao do 0.000: "))
(setvar "osmode" 0)
(setq daiab (distance a b))
(setq giatri (/ daiab motmet))
(setq c (list (- (car a) 250) (+ (cadr a) 410)))
(setq trenduoi (- (cadr a) (cadr b)))
(if (= trenduoi 0) (PROGN
(setq dau "%%p ")
)
)
(if (> trenduoi 0) (PROGN
(setq dau "+ ")
)
)
(if (< trenduoi 0) (PROGN
(setq dau "- ")
)
)
(setq noidung (strcat dau (rtos giatri 2 3)))
(command "-style" "tlkt" "VNI-HELVE" "0" "1" "0" "n" "n")
(command ".TEXT" c 250 0 noidung)
(command "INSERT" "c:\\tailieukythuat\\dwg\\caodo.dwg" a 1 1 0)
(setvar "osmode" luubatdiem)
(command "undo" "end")
(princ)
)

Bạn để ý dòng dùng INSERT block caodo.dwg nhé phần đường dẩn đến file phải dùng \\ để thể hiện thư mục vì khi đọc lisp sẽ bỏ bớt một dấu \. Hoặc bạn thể hiện bằng dấu xẹt ngược cũng được:
(command "INSERT" "c:\\tailieukythuat\\dwg\\caodo.dwg" a 1 1 0)
(command "INSERT" "c:/tailieukythuat/dwg/caodo.dwg" a 1 1 0)

2 nhận xét:

  1. Trời ai mà nói vậy? Viết lisp cho cad thì phải rành cad chứ vì nó là gộp các bước thực hiện của cad vào thành 1 lệnh mà.

    Trả lờiXóa
  2. Ha Ha vậy mà em cứ tưởng ,em chỉ biết mấy cái lệnh vẽ cơ bản thôi hè này em sẽ cố gắng học . Ha ha Mai em Thi tiếp rồi bi giờ phải học bài cái đã mai em sẽ tiếp tục. Em sắp thành công 1 bài ví dụ tự làm đầu tiên của riêng em rồi ha ha vui lắm cám ơn anh Duy nhé .

    Trả lờiXóa