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)

11 nhận xét:

  1. Chào anh Duy !
    Anh cho em hỏi :
    (setq c (list (- (car a) 250) (+ (cadr a) 410 )))
    + Xa 250 + Ya 410 là sao ? Khi em cho lisp chạy thì vị trí của text không nằm trên cao độ và size của nó rất lớn . Em đang vẽ ở tỉ lệ 1-1 (getreal "\n Mot met = bao nhieu :") em nhập 1
    Anh Duy chỉ giúp em nhé

    Trả lờiXóa
  2. Để học tốt được Lisp thì em phải biết mã dxf và biến hệ thống đúng không anh , em có lên mạng tìm nhưng tìm không được anh Duy có tài liệu không send cho em với.Mấy bài ví dụ của anh rất hay nhưng anh mới dùng có ít hàm quá à , em có tham khảo thêm ở trên diễn đàn cadviet , ketcau nhưng đó chỉ là trao đổi những kinh nghiệm và mọi người đều biết sơ sơ cả rùi . còn như em thì chẳng biết gì cả , đọc thêm tài liệu thì tài liệu viết cũng rõ nhưng không có ví dụ kèm theo nên em cũng chẳng hiểu được nhiều . Em biết anh cũng bận lắm , không rảnh rỗi gì nhưng trong 1 tuần anh có thể viết 1 bài hướng dẫn chúng em được không ? Em đòi hỏi có quá lắm không hi hi tại rất thích học lisp và hơi chậm hiểu nên muốn nhờ tới anh . Có quá đáng thì cũng xin anh bỏ qua cho em nhé .
    Chúc anh luôn vui vẻ
    Cám ơn anh

    Trả lờiXóa
  3. Do mình vẽ 1 mét = 1000 nên cái text của mình có độ cao là 250. Phần hỏi 1 mét bằng bao nhiêu của lisp chỉ là để tính toán giá trị khoảng cách thôi.
    Nếu bạn vẽ 1 mét bằng 1 thì chỉnh lại thành
    (setq c (list (- (car a) 0.25) (+ (cadr a) 0.41 )))



    (command ".TEXT" c 0.25 0 noidung)

    Vì đây là xác định điểm c dùng làm vị trí viết text và viết text tại điểm c độ lớn là 0.25 góc quay 0 nội dung là noidung.
    Bạn đọc tới bài này rồi và Mình đã giải thích cách xác định 1 điểm và cách viết 1 dòng text rồi chứ. Khi làm qua ví dụ nào thì bạn nên nhớ luôn các vần đề sẽ áp dụng vì sau đó thì mình ko nhắc lại cái vần đề này trong bài nửa mà.

    Trả lờiXóa
  4. cám ơn anh đã chỉ , ha ha em có nhớ đó chứ nhưng tại cứ mỗi lần chạy là text có size rất lớn và em đã thử đặt lại tỉ lệ bản vẽ nhưng vẫn không được có lẽ là do em tạo cái block cao độ nhỏ quá . Em không rành Acad lắm hi hi tại lang thang trên mạng thấy mọi người kháo nhau rằng viết Lisp thì không cần phải giỏi vẽ Acad đâu chỉ cần biết căn bản là được hi hi để khắc phục nhược điểm hè này em sẽ tu luyện cả 2 món .

    Trả lờiXóa
  5. 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
  6. 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
  7. (setq c (list (- (car a) 250) (+ (cadr a) 410))); dòng này em chưa hiểu lắm anh Duy à. Anh có thể giải thích rõ giúp em được không ạ. Tại sao điểm c có tọa độ là Xa - 250, Ya + 410?

    Trả lờiXóa
  8. a là điểm đầu của mũi tên ký hiệu cos. Mình muốn cái text nằm lui lại so với điểm đó 250 và cao hơn điểm đó 410 thì phải thế thôi.

    Trả lờiXóa
  9. sao lisp này em viết lại mà vẫn không chạy được nhỉ?

    Trả lờiXóa
  10. đây anh, anh xem giúp em nó sai ở đâu nhé:


    (defun c:cos1 ()
    (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)))
    (setq "-style" "Tuan" "VNI-HELVE" "0" "1" "0" "n" "n")
    (setq ".text" c 250 noidung)
    (command "insert" "C:\\Users\\TUAN\\Desktop\\lisp\\caodo.dwg" a 1 1 0)
    (setvar "osmode" luubatdiem)
    (command "undo" "end")
    (princ)
    )

    Trả lờiXóa

Khi viết nhận xét mong bạn không đứng vai trò nặc danh! Bạn có thể chọn Name/Url trong đó Url là http://duy782006.blogspot.com/ như vậy hay hơn nặc danh bạn nhé.