Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
khanh10

Nhờ sữa lisp dùng while?

Các bài được khuyến nghị

Nhờ các pro giúp mình cái lisp này với.

Mình có làm cái lisp vẽ cái canopy, trong lisp mỗi khi vẽ xong thì mình block nó lại. Nhưng mỗi khi mình dùng 2 lần trở lên thì cái block tạo ra bị trùng tên nên ko thể block được nữa. Vì thế mình bổ sung thêm vòng lặp while để duyệt tên block nhưng bị lỗi. Nhờ các bác giúp sữa giúp mình với nhé!

Quote

;; khanh
;;; lenh ve CANOPY
(defun c:can (/ p i h h1 b l q1 q2 q3 q4 q5 q6 q7 tm1 tm2 tm3 tm4 tm5 tm6 tm7 tm8 tm9 oldos tana a sec1 sec2 b c d1 d2)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq old_layer (getvar "clayer"))
(setq lay1 (tblsearch "layer" "roof"))
(if (= lay1 nil) (command "-layer" "n" "roof" "c" "252" "roof" "lw" 0.15 "roof" ""))
(setq lay2 (tblsearch "layer" "hatch"))
(if (= lay2 nil) (command "-layer" "n" "hatch" "c" "8" "hatch" "lw" 0.09 "hatch" ""))
(setq lay3 (tblsearch "layer" "thay"))
(if (= lay3 nil) (command "-layer" "n" "thay" "c" "4" "thay" "lw" 0.15 "thay" ""))
(setq lay4 (tblsearch "layer" "block"))
(if (= lay4 nil) (command "-layer" "n" "block" "c" "21" "block" "lw" 0.09 "block" ""))
(setq lay5 (tblsearch "layer" "gutter"))
(if (= lay5 nil) (command "-layer" "n" "gutter" "c" "6" "gutter" "lw" 0.3 "gutter" ""))
(setvar "clayer" "roof")
(initget "MC MD MB")
(setq st (getkword "\nchon loai mat canh, mat dung hay mat bang (MC/MD/MB):"))
(setq p (getpoint "\nNhap chon vi tri dat:"))
(setq i (getreal "\nNhap do doc mai (%):"))
(setq tana (/ i 100))
(setq a (atan tana))
(if (= st "MC")
  (progn 
       (setq b (getreal "\nNhap chieu rong canopy:"))
    (setq p1 (polar p 0 b))
    (setq p2 (polar p1 (/ (* pi 90) 180) 200))
    (setq p0 (polar p2 pi 150))
    (setq p3 (polar p0 (/ (* pi 90) 180) 200))
    (setq p4 (polar p3 (/ (* (- 180 (/ (* a 180) pi)) pi) 180) (/ (- b 150) (cos a))))
      (command "pline" p p1 p2 "a" p3 "l" p4 "c")
    (setq sec1 (entlast))
    (command "change" sec1 "" "p" "la" "thay" "")
    (command "hatch" "ANSI32" 600 45 sec1 "")
    (command "change" "l" "" "p" "la" "hatch" "")
    
    (setq n 1 ch1 "canopy")
    (setq bl1 (strcat ch1 (itoa n)))
    (while (tblsearch "block" bl1)
    (
        (setq n (1+ n))
        (setq bl1 (strcat ch1 (itoa n)))
        )
    )

    (command "-block" bl1 p "c" "non" p1 "non" p4 "")
    (command "-insert" bl1 p "" "" "" )
  )
)
(if (= st "MD")
  (progn 
       (setq l (getreal "\nNhap chieu dai canopy:"))
    (setq b (getreal "\nNhap chieu rong canopy:"))
    (setq h (+ 400 (* tana (- b 150))))
    (setq p1 (polar p 0 l))
    (setq p2 (polar p1 (/ (* pi 90) 180) h))
    (setq p3 (polar p 0 150))
    (setq p4 (polar p3 (/ (* pi 90) 180) h))
    (setq p5 (polar p1 pi 150))
    (setq p6 (polar p5 (/ (* pi 90) 180) h))
    (setq p7 (polar p3 (/ (* pi 90) 180) 200))
    (setq p8 (polar p5 (/ (* pi 90) 180) 200))
    (setq p9 (polar p7 (/ (* pi 45) 180) 200))
    (command "rectangle" p p2)
      (command "line" p3 p4 "")
    (command "line" p5 p6 "")
    (command "line" p7 p8 "")
    (command "-hatch" "p" "ANSI32" 600 45 p9 "")
    (command "change" "l" "" "p" "la" "hatch" "")
    (command "-block" "2canopy" p "c" "non" p2 "non" p "")
    (command "-insert" "2canopy" p "" "" "" )
  )
)
(if (= st "MB")
  (progn 
       (setq l (getreal "\nNhap chieu dai canopy:"))
    (setq b (getreal "\nNhap chieu rong canopy:"))
    (setq p1 (polar p 0 l))
    (setq p2 (polar p1 (/ (* pi 90) 180) b))
    (setq p3 (polar p 0 150))
    (setq p4 (polar p3 (/ (* pi 90) 180) b))
    (setq p5 (polar p1 pi 150))
    (setq p6 (polar p5 (/ (* pi 90) 180) b))
    (setq p7 (polar p3 (/ (* pi 45) 180) 300))
    (setq p8 (polar p (/ (* pi 90) 180) b))
    (setq p9 (polar p8 (/ (* pi 270) 180) 150))
    (setq p10 (polar p9 (/ (* pi 270) 180) 200))
    (setq p11 (polar p10 (/ (* pi 270) 180) 300))
    (setq p12 (polar p11 (/ (* pi 270) 180) 500))
    (command "rectangle" p p2)
      (command "line" p3 p4 "")
    (command "line" p5 p6 "")
    (command "-hatch" "p" "ANSI32" 700 45 p7 "")
    (command "change" "l" "" "p" "la" "hatch" "")
    (command "line" p4 p6 "")
    (setq sec1 (entlast))
    (command "move" sec1 "" p8 p9)
    (command "copy" "l" "" p9 p10 "")
    (command "copy" "l" "" p10 p11 "")
    (command "copy" "l" "" p11 p12 "")
    (command "-block" "3canopy" p "c" "non" p2 "non" p "")
    (command "-insert" "3canopy" p "" "" "" )
  )
)
(setvar "clayer" old_layer)
(setvar "osmode" oldos)
(princ)
)

Cái vùng chử màu đỏ là mình bổ sung thêm nhưng bị lỗi! Thanks.

  • Vote giảm 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Duyệt các block có tên "canopy+số liên tiếp" để tìm số đuôi lớn nhất . Khi không tìm được nữa thì lấy n vào làm tên block mới. 

(setq n 1)
(while (setq bl1 (tblsearch "block" (strcat "canopy" (itoa n)))) 
       (setq n (1+ n)) 

(setq  bl1 (strcat "canopy" (itoa n)))
      )

 

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Nếu mục đích chỉ là để khỏi trùng tên thì sao ko quăng thằng 'MILLISECS vào chổ thằng n

Hoặc chắc chắn hơn tí thì (strcat "canopy" (rtos (getvar 'date))  (itoa  (getvar 'millisecs))) ...

  • Like 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Kịp thời}}, hiepttr cho biết:

Nếu mục đích chỉ là để khỏi trùng tên thì sao ko quăng thằng 'MILLISECS vào chổ thằng n

Hoặc chắc chắn hơn tí thì (strcat "canopy" (rtos (getvar 'date))  (itoa  (getvar 'millisecs))) ...

BẠN CÓ THỂ NÓI Ý NGHĨA CỦA ĐOẠN NÀY KHÔNG: (strcat "canopy" (rtos (getvar 'date))  (itoa  (getvar 'millisecs)))! MÌNH MỚI TÌM HIỂU LISP NÊN GÀ LẮM! ^^

  • Vote giảm 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
1 giờ} trướ}c, khanh10 cho biết:

BẠN CÓ THỂ NÓI Ý NGHĨA CỦA ĐOẠN NÀY KHÔNG: (strcat "canopy" (rtos (getvar 'date))  (itoa  (getvar 'millisecs)))! MÌNH MỚI TÌM HIỂU LISP NÊN GÀ LẮM! ^^

Bạn có biết viết hoa là bất lịch sự không !

Bạn muốn hiểu ý nghĩa thì hãy hiểu cách sử dụng từng câu lệnh: "Strcat", "rtos" "getvar", "itoa" là gì. Chứ giải thích mất thời gian lắm ! Khuyến khích tự tìm hiểu.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

nếu bạn cảm thấy vậy thì cho mình xin lỗi!

Chẳng qua mình không hiểu biến date và millisecs là như thế nào, đối số trả về là gì thôi!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

+ Cách thức viết bài có trong : http://www.cadviet.com/forum/topic/5888-viết-yêu-cầu-request-và-trả-lời-response-như-thế-nào/

Bài viết chữ "HOA" có thể bị xóa và khóa nick. Bạn nên chú ý.

+ Các biến "Date", "millisecs" có thể tìm hiểu toàn bộ biến hệ thống trong cad  bằng cách gõ trong cad : "SYSVDLG" + google dịch.

 

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cám ơn bạn! Nhưng thật sự không tìm thấy biến millisecs, còn biến date thì trả về số thực! Nhờ bạn giải thích giúp mình biến millisecs với thé! tks

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay
Đăng nhập để thực hiện theo  

×