Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Jin Yong

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

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

tomboy    20
-Mình có block khung như trong file. Mình muốn lấy điểm 1 và điểm 2 như trong hình theo từng block.

- http://www.cadviet.com/upfiles/2/1.dwg

bạn ơi,máy của mình xài cad 2004 nên không mở đc bản vẽ đó, bạn có thể lưu bản vẽ sang cad 2004 rồi post lên đc không. Thanhks

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
gia_bach    1.442
-Mình có block khung như trong file. Mình muốn lấy điểm 1 và điểm 2 như trong hình theo từng block.

- http://www.cadviet.com/upfiles/2/1.dwg

Bạn tham khảo Lisp sau :

(defun C:test(/ ent pt1 pt1X pt1Y pt2X pt2Y)
 (setq ent (car (entsel "\nChon Block:")))
 (if (and (= (cdr (assoc 0 (entget ent))) "INSERT")
   (= (cdr (assoc 2 (entget ent))) "A1図枠"));block name
   (progn
     (setq ent (entget ent)
    pt1 (cdr (assoc 10 ent))
    pt1X (car pt1)
    pt1Y (cadr pt1)
    pt2X (+(*(cdr (assoc 41 ent))841) pt1X);ch/rong: 841
    pt2Y (+(*(cdr (assoc 42 ent))594) pt1Y);ch/cao : 594
    )
     (princ (strcat "\n Diem1 X = " (rtos pt1X) "; Y = " (rtos pt1Y)))
     (princ (strcat "\n Diem2 X = " (rtos pt2X) "; Y = " (rtos pt2Y)))
     ;(list (list pt1X pt1Y) (list pt2X pt2Y))
     )
  )
 (princ)
 )

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
Minh_Ha    1

-Trước tiên mình cám ơn bạn gia_bach đã giúp mình, và mình đã dùng đọan code đó để vẽ đường chéo. Bây giờ mình muốn chọn n Block chứ không phải 1 Block như hiện tại và đây là đọan code, bạn chỉ dùm nha.

(defun C:test(/ ent pt1 pt1X pt1Y pt2X pt2Y)

(setq ent (car (entsel "\nChon Block:")))

(if (and (= (cdr (assoc 0 (entget ent))) "INSERT")

(= (cdr (assoc 2 (entget ent))) "1"));block name

(progn

(setq ent (entget ent)

pt1 (cdr (assoc 10 ent))

pt1X (car pt1)

pt1Y (cadr pt1)

pt2X (+(*(cdr (assoc 41 ent))841) pt1X);ch/rong: 841

pt2Y (+(*(cdr (assoc 42 ent))594) pt1Y);ch/cao : 594

)

;(princ (strcat "\n Diem1 X = " (rtos pt1X) "; Y = " (rtos pt1Y)))

;(princ (strcat "\n Diem2 X = " (rtos pt2X) "; Y = " (rtos pt2Y)))

(list (list pt1X pt1Y) (list pt2X pt2Y))

)

)

(setq D1 (list pt1X pt1Y))

(setq D2 (list pt2X pt2Y))

(command "line" D1 D2 "")

(princ)

)

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
Tue_NV    3.841
-Trước tiên mình cám ơn bạn gia_bach đã giúp mình, và mình đã dùng đọan code đó để vẽ đường chéo. Bây giờ mình muốn chọn n Block chứ không phải 1 Block như hiện tại và đây là đọan code, bạn chỉ dùm nha.

Tue_NV thấy cái này không cần đến Lisp -> Chỉ cần 1 lệnh Refedit là ta có thể kẻ được đuờng chéo cho n block đấy bạn Minh Ha à

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
Thaistreetz    515

(if n_chia_het_cho_2 thenDoThis elseDoThis)

 

Phép toán nào giúp lọc được các giá trị của n là số chẵn được nhỉ? em đã thử search help bằng từ khóa div 2 nhưng không có

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
Tue_NV    3.841
(if n_chia_het_cho_2 thenDoThis elseDoThis)

 

Phép toán nào giúp lọc được các giá trị của n là số chẵn được nhỉ? em đã thử search help bằng từ khóa div 2 nhưng không có

Đây : (setq n 12)

(= (rem n 2) 0) -> T

(/= (rem n 2) 0) -> nil

  • Vote tăng 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
Minh_Ha    1
Tue_NV thấy cái này không cần đến Lisp -> Chỉ cần 1 lệnh Refedit là ta có thể kẻ được đuờng chéo cho n block đấy bạn Minh Ha à

Tue_NV hiểu sai ý mình rồi. Mình xin lỗi vì không nói rõ mục đích. Vẽ đường line đó chỉ là ví dụ. Mình dùng đọan code trên để in hàng lọat trong cad vì công ty mình dùng cadLT nên không dùng đươc Mplot.vlx của bạn Nguyen Hoanh. Mong bạn gíup dùm.

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
gia_bach    1.442
-Trước tiên mình cám ơn bạn gia_bach đã giúp mình, và mình đã dùng đọan code đó để vẽ đường chéo. Bây giờ mình muốn chọn n Block chứ không phải 1 Block như hiện tại và đây là đọan code, bạn chỉ dùm nha.

..................

Bạn chạy thử lisp này.

(defun C:test(/ vl ov ss e)
 (defun draw_line(ent / pt1 pt1X pt1Y pt2X pt2Y)
   (setq pt1 (cdr (assoc 10 ent))
  pt1X (car pt1)
  pt1Y (cadr pt1)
  pt2X (+(*(cdr (assoc 41 ent))841) pt1X);ch/rong: 841
  pt2Y (+(*(cdr (assoc 42 ent))594) pt1Y);ch/cao : 594
  )
   (entmake (list '(0 . "LINE")(cons 10 (list pt1X pt1Y))(cons 11 (list pt2X pt2Y))(cons 62 6)) )
   (entmake (list '(0 . "LINE")(cons 10 (list pt1X pt2Y))(cons 11 (list pt2X pt1Y))(cons 62 6)) );bonus
   )
 (command "undo" "be")
 (setq vl '("osmode" "orthomode" "cmdecho") ; Sys Var list
       ov (mapcar 'getvar vl))           ; Get Old values
 (setvar "osmode" 0) (setvar "orthomode" 0) (setvar "cmdecho" 0)
 (princ "\nChon Block khung ten :")
 (if(setq ss (ssget (list (cons 0 "INSERT")(cons 2 "A1図枠"))))
   (foreach e (mapcar 'entget (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
     (draw_line e)
     )
   )
 (mapcar 'setvar vl ov) ; reset Sys Vars
 (command "undo" "e")(princ)
 )

  • Vote tăng 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
Minh_Ha    1

-Mình thật sự cám ơn bạn gia_bach đọan code của bạn giúp cho mình rất nhiều. Bây giờ mình chỉ việc chọn tất cả các block trong bản vẽ là in tòan bộ bản vẽ đó ra máy in. Một lần nữa cám ơn bạn. Sẽ nhờ bạn giúp đỡ lần sau nữa nha.

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
Minh_Ha    1

-Trong lisp lam sao lưu được giá trị nhập vào cho những lần sau thực hiện lệnh.VD: mình có đọan code sau:

(defun c:aa1()

(setq LA (getvar "Clayer"))

(initget 1 "P DT")

(setq BT (getkword "\n Tinh dien tich Pick hoac chon doi tuong?

:"))

(if (= BT "P")

- khi đánh lệnh aa1 và nhập giá trị P thì lần sau thực hiện lệnh không cần nhập lại. Mong được sự giúp đỡ.

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
thiep    263
-Trong lisp lam sao lưu được giá trị nhập vào cho những lần sau thực hiện lệnh.VD: mình có đọan code sau:

(defun c:aa1()

(setq LA (getvar "Clayer"))

(initget 1 "P DT")

(setq BT (getkword "\n Tinh dien tich Pick hoac chon doi tuong?

:"))

(if (= BT "P")

- khi đánh lệnh aa1 và nhập giá trị P thì lần sau thực hiện lệnh không cần nhập lại. Mong được sự giúp đỡ.

Bạn xem đoạn mã ví dụ sau đây:

(defun c:Pick-Select ()
 (setq	bit (cond (bit)
	  ("Pick")
    )
 )
 (initget "Pick Select")
 (setq	Tmp (strcat "\nAnother Quension? [Pick/Select] <" bit ">: ")
bit    (cond ((getkword Tmp))
	     (bit)
       )
 )
 (if (eq bit "Pick")
   (Print "Toi chon picK")
   (Print "Toi chon select")
 )
 (princ)
)

Bạn chỉ cần đánh P hay S, lần sau chỉ cần enter

  • Vote tăng 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
Thaistreetz    515

Tại sao có những lisp em viết chạy bình thường, nhưng mỗi lần gõ lệnh xong thì cad lại báoUnknown command "tenlenh". Press F1 for help.

mặc dù báo như thế nhưng lisp vẫn chạy ra được kết quả. cái dòng Unknown command "tenlenh". Press F1 for help thực sự khiến em thấy khó chịu lắm

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
Tue_NV    3.841
Tại sao có những lisp em viết chạy bình thường, nhưng mỗi lần gõ lệnh xong thì cad lại báoUnknown command "tenlenh". Press F1 for help.

mặc dù báo như thế nhưng lisp vẫn chạy ra được kết quả. cái dòng Unknown command "tenlenh". Press F1 for help thực sự khiến em thấy khó chịu lắm

Ví dụ 1 cái đi bạ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
Thaistreetz    515

Một ví dụ của em.

(defun C:stt()
(command "undo" "Begin" "")
(if (not i) (setq i 1))
(if (not a) (setq a 1))
(setq	i1 (getreal (strcat"\nSTT bat dau < " (rtos i 2 0) " >: "))
a1 (getreal (strcat"\nSo gia < " (rtos a 2 0) " >: " 	)))
(if i1 (setq i i1))
(if a1 (setq a a1))
(while
(setq res (entsel (strcat "\nChon text de ghi STT thu " (rtos i 2 0) "")))
(setq res (entget (car res)))
(setq res (entmod (subst (cons 1 (rtos i 2 0)) (assoc 1 res) res)))
(setq i (+ i a))
);while
(command "undo" "end" "")
(princ)
)

Code này không khác mấy so với code của anh. nó vẫn chạy được nhưng luôn kèm theo dòng thông báo ấy, còn của anh thì chẳng sao cả. em chẳng hiểu vì sao nữa. :bigsmile:

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
gia_bach    1.442
(defun C:stt()
(command "undo" "Begin" "")
............
(command "undo" "end" "")
(princ)
)

Vấn đề của bạn ở dòng Lệnh UNDO

(command "undo" "Begin" "") -> (command "undo" "Begin")

(command "undo" "end" "") -> (command "undo" "end" )

xóa 2 dấu nháy phía cuối lệnh.

  • Vote tăng 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
Thaistreetz    515
Vấn đề của bạn ở dòng Lệnh UNDO

(command "undo" "Begin" "") -> (command "undo" "Begin")

(command "undo" "end" "") -> (command "undo" "end" )

xóa 2 dấu nháy phía cuối lệnh.

cảm ơn anh Gia Bach nhé. đúng là có những lúc sai sót ở những chỗ không ngờ vì ta vẫn đinh ninh rằng nó đúng. :bigsmile:

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
svba1608    624

Nhờ các anh, các chị giải đáp giùm em:

Tại sao trong bản vẽ này của em: http://www.cadviet.com/upfiles/2/nhaso5.dwg, các dim đều không thể sử dụng lisp CUTDIM:

"Command: cd

Please select dimension object!

Select objects: 1 found

 

Select objects:

Point to trim or extend:

Error: bad DXF group: (13)"

Thậm chí cả lệnh Tr cũng không dùng được.

Cảm ơn các anh, các 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
Tue_NV    3.841
Nhờ các anh, các chị giải đáp giùm em:

Tại sao trong bản vẽ này của em: http://www.cadviet.com/upfiles/2/nhaso5.dwg, các dim đều không thể sử dụng lisp CUTDIM:

"Command: cd

Please select dimension object!

Select objects: 1 found

 

Select objects:

Point to trim or extend:

Error: bad DXF group: (13)"

Thậm chí cả lệnh Tr cũng không dùng được.

Cảm ơn các anh, các chị!

Em xem ở bài viết sau :

Bai viet so 10

 

Và Lisp này đã được Tue_NV cải tiến : Khi cắt dim để lại phần chân dim bằng nhau :

Bai viet so 8

  • Vote tăng 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
phamthanhbinh    3.123

Chào các bác,

Hiện tại mình gặp một vấn đề như sau:

Trong quá trình ứng dụng lisp đối với một bản vẽ, mình muốn mở một bản vẽ khác để sử lý rồi sau đó đóng bản vẽ này lại và tiếp tục chạy lisp trên bản vẽ cũ.

Vậy xin hỏi các bác như sau:

1/- Có thể dùng lisp thực hiện nhiệm vụ này hay không? Cách tạo code để thực hiện nhiệm vụ đó.

2/- Nếu không thể, có cách lập trình bằng ngôn ngữ nào khác để thực hiện nhiệm vụ này không?

 

Thanks các bác nhiề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
nataca    553
Chào các bác,

Hiện tại mình gặp một vấn đề như sau:

Trong quá trình ứng dụng lisp đối với một bản vẽ, mình muốn mở một bản vẽ khác để sử lý rồi sau đó đóng bản vẽ này lại và tiếp tục chạy lisp trên bản vẽ cũ.

Vậy xin hỏi các bác như sau:

1/- Có thể dùng lisp thực hiện nhiệm vụ này hay không? Cách tạo code để thực hiện nhiệm vụ đó.

2/- Nếu không thể, có cách lập trình bằng ngôn ngữ nào khác để thực hiện nhiệm vụ này không?

 

Thanks các bác nhiều.

Em chưa hiểu mở bản vẽ khác để xử lý là như thế nào. Tức là bản vẽ khác có dùng đến lisp của bản vẽ hiện thời hay không? Bản vẽ khác mở trong lúc lisp đang thực hiện ở bản vẽ này? Hay là trong khi đang chờ lisp thực hiện đối với bản vẽ này thì ta mở bản vẽ khác rồi làm j với nó thì làm mà không động chạm tới bản vẽ cũ?

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
phamthanhbinh    3.123
Yêu cầu chưa rõ ràng lắm. Bạn nên giải thích thêm cho rõ hơn.

Hề hề,

Khổ quá, văn dốt vũ dát nên làm khổ các bác,

Là thế này ạ:

Mình đang làm việc với bản vẽ A đang mở, dùng lisp để sử lý một số cái linh tinh trong đó, khổ nỗi nó lại có dình dáng ít nhiều tới bản vẽ B nên phải mở nó ra để sử lý rốt ráo. Sau khi sử lý xong trên cái bản vẽ B thì đóng nó lại và quay trở về bản vẽ A để chạy nốt phần còn lại của lisp.

Trước nay mình toàn phải mở thằng B ra sử lý trước rồi mới chạy lisp trên bản vẽ A. Bây giờ mình muốn chèn thêm một đoạn lisp vào cái lisp cũ để nó làm hộ mình cái việc này (mở bản vẽ B ra trong khi lisp đang chạy và sử lý sau đó đóng nó lại). Thế nhưng loay hoay hoài mà chả mở được các bác ạ.

Mình đã thử xài lệnh open trong lisp nhưng không được các bác ạ.

Khổ thế nên mới định hỏi thăm các bác xem có cách nào chơi được nó không , để căn bệnh lười của mình nó thêm nặng ý mà.

Thanks các bác đã quan tâm.

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
Tue_NV    3.841
Hề hề,

Khổ quá, văn dốt vũ dát nên làm khổ các bác,

Là thế này ạ:

Mình đang làm việc với bản vẽ A đang mở, dùng lisp để sử lý một số cái linh tinh trong đó, khổ nỗi nó lại có dình dáng ít nhiều tới bản vẽ B nên phải mở nó ra để sử lý rốt ráo. Sau khi sử lý xong trên cái bản vẽ B thì đóng nó lại và quay trở về bản vẽ A để chạy nốt phần còn lại của lisp.

Trước nay mình toàn phải mở thằng B ra sử lý trước rồi mới chạy lisp trên bản vẽ A. Bây giờ mình muốn chèn thêm một đoạn lisp vào cái lisp cũ để nó làm hộ mình cái việc này (mở bản vẽ B ra trong khi lisp đang chạy và sử lý sau đó đóng nó lại). Thế nhưng loay hoay hoài mà chả mở được các bác ạ.

Mình đã thử xài lệnh open trong lisp nhưng không được các bác ạ.

Khổ thế nên mới định hỏi thăm các bác xem có cách nào chơi được nó không , để căn bệnh lười của mình nó thêm nặng ý mà.

Thanks các bác đã quan tâm.

Giả sử file In A1 (06-04-09)2.dwg nằm trong ổ D :.

Cách gọi nó (mở nó) ra như sau :

(defun c:pgp()
(command "_ai_editcustfile" "D:\\In A1 (06-04-09)2.dwg")
(princ)
)

Bạn xem thêm bài viết của Tue_NV ở đây : Bai viet so 5, bai viet so 6

Hy vọng bạn sẽ thú vị về nó

:s_big:

  • Vote tăng 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
Thaistreetz    515

Trong khi vẽ, đôi khi ta chọn đối tượng trước rồi mới gõ lệnh và cad hiểu những đối tượng vừa chọn đó là để phục vụ cho lệnh vừa nhập. VD: khi muốn xóa một đối tượng nào đó, ta có thể chọn đối tượng trước hoặc sau khi gõ lênh erase. Vậy muốn làm việc này với lisp thì ta phải viết như thế nào?

Cụ thể với lisp sử dụng hàm SSGET ngay đầu lisp để chọn đối tượng muốn xử lý.

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


×