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

Lisp vẽ nối tiếp đường thẳng?

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

Mong các huynh giúp e lisp này với? e muốn vẽ nối tiếp 1 đường pline đã có, hiện tại e đang phải làm thủ công bằng cách vẽ pline mới có start point là điểm cuối của pline trước rồi phải dùng lệnh nối line thành pline. e muốn nhờ các bác viết giúp lisp vẽ nối tiếp 1 đường thẳng, nghĩa là có 1 đường pline đang vẽ dở, bây giờ mình muỗn vẽ tiếp pline còn đang dang dở ấy. cảm ơn 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
Mong các huynh giúp e lisp này với? e muốn vẽ nối tiếp 1 đường pline đã có, hiện tại e đang phải làm thủ công bằng cách vẽ pline mới có start point là điểm cuối của pline trước rồi phải dùng lệnh nối line thành pline. e muốn nhờ các bác viết giúp lisp vẽ nối tiếp 1 đường thẳng, nghĩa là có 1 đường pline đang vẽ dở, bây giờ mình muỗn vẽ tiếp pline còn đang dang dở ấy. cảm ơn các bác nhiều

Thử xem, lệnh NP. Nếu chưa đúng ý thì reply:

(defun C:NP( / p ss);;;Noi tiep pline
(setq
 p (getpoint "\nChon diem cuoi line, pline hoac arc:")
 ss (ssget "c" p p '((0 . "LINE,POLYLINE,LWPOLYLINE,ARC")))
)
(command "pline" p (getpoint p "\nDiem tiep theo:") "")
(command "pedit" (entlast) "j" ss "" "")
(princ)
)

  • Vote tăng 2

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
Thử xem, lệnh NP. Nếu chưa đúng ý thì reply:

(defun C:NP( / p ss);;;Noi tiep pline
(setq
 p (getpoint "\nChon diem cuoi line, pline hoac arc:")
 ss (ssget "c" p p '((0 . "LINE,POLYLINE,LWPOLYLINE,ARC")))
)
(command "pline" p (getpoint p "\nDiem tiep theo:") "")
(command "pedit" (entlast) "j" ss "" "")
(princ)
)

Bác Ssg à, Bác có thể cải tiến hơn 1 chút nữa là sau khi dùng lệnh np sẽ vẽ được đường pline 1 cách bình thường,ở đây e thấy lisp này chỉ nỗi thêm 1 đường line, nếu mình muốn vẽ nối tiếp nhiều đường thì bất tiện quá, cảm ơn bác nhiều nhiều 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
Bác Ssg à, Bác có thể cải tiến hơn 1 chút nữa là sau khi dùng lệnh np sẽ vẽ được đường pline 1 cách bình thường,ở đây e thấy lisp này chỉ nỗi thêm 1 đường line, nếu mình muốn vẽ nối tiếp nhiều đường thì bất tiện quá, cảm ơn bác nhiều nhiều nha!!

Bạn thử lại với cái này xem sao:

;;;----------------------------------------------------------
(defun C:NP( / p1 ss e1 Lp p2 p e2) ;;;Noi tiep pline
(setq
 p1 (getpoint "\nChon diem cuoi line, pline hoac arc:")
 ss (ssget "c" p1 p1 '((0 . "LINE,LWPOLYLINE,ARC")))
 e1 (ssname ss 0)
 Lp (list p1)
)
(while (setq p2 (getpoint p1 "\nChon diem tiep theo (hoac Enter de ket thuc):"))
 (grdraw p1 p2 255)
 (setq Lp (append Lp (list p2)) p1 p2)
)
(command "pline") (foreach p Lp (command p)) (command "")
(setq e2 (entlast))
(if (= (cdr (assoc 0 (entget e1))) "LWPOLYLINE")
 (command "pedit" e1 "j" e2 "" "")
 (command "pedit" e1 "y" "j" e2 "" "")
)
(command "regen")
)
;;;----------------------------------------------------------

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

Nhân tiện, ssg muốn thỉnh giáo các "chuyên gia Lisp" một chút. Ssg gặp rất nhiều trường hợp phải gọi command để tạo đối tượng nhưng chưa hoàn thành lệnh vì tuỳ thuộc vào ý muốn của user. Sau đó, mình lại muốn xử lý tiếp các đối tượng được tạo bởi chính command này.

 

Lấy ví dụ ở trên, nếu viết như vầy (không phải gọi grdraw, append... lằng nhằng!):

 

(defun C:NP2( / p1 ss e1 Lp e2) ;;;Noi tiep pline

(setq

p1 (getpoint "\nChon diem cuoi line, pline hoac arc:")

ss (ssget "c" p1 p1 '((0 . "LINE,LWPOLYLINE,ARC")))

e1 (ssname ss 0)

)

(command "pline" p1 pause)

(setq e2 (entlast))

(if (= (cdr (assoc 0 (entget e1))) "LWPOLYLINE")

(command "pedit" e1 "j" e2 "" "")

(command "pedit" e1 "y" "j" e2 "" "")

)

(command "regen")

)

 

Dòng code tô đỏ có "ý đồ" là sau khi thực hiện xong command "pline", AutoCAD sẽ trả quyền điều khiển và mình có thể làm gì đó tuỳ thích. Đáng tiếc là không phải như vậy! Khi gặp "pause", AutoCAD gác lại đó và tiếp tục thực thi các dòng code bên dưới. Khi kết thúc chương trình nó mới quay lại công việc dở dang của command "pline". Kết quả cuối cùng, cái mà nó tạo ra không phải là e2 như "ý đồ" mình muốn -> "pedit" không có tác dụng!

 

Các bạn có thủ thuật gì để giải quyết vấn đề trên không?

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
...

(command "pline" p1 pause)

...

Dòng code tô đỏ có "ý đồ" là sau khi thực hiện xong command "pline", AutoCAD sẽ trả quyền điều khiển và mình có thể làm gì đó tuỳ thích. Đáng tiếc là không phải như vậy! Khi gặp "pause", AutoCAD gác lại đó và tiếp tục thực thi các dòng code bên dưới. Khi kết thúc chương trình nó mới quay lại công việc dở dang của command "pline". Kết quả cuối cùng, cái mà nó tạo ra không phải là e2 như "ý đồ" mình muốn -> "pedit" không có tác dụng!

 

Các bạn có thủ thuật gì để giải quyết vấn đề trên không?

Bác thử sửa thành như sau:

(command "pline" p1)

(while (

(command pause)

)

(alert "Vua ket thuc lenh Pline")

 

Lý do là mỗi lệnh pause chỉ nhận một thao tác input, mà ta không thể biết trước người sử dụng sẽ thao tác bao nhiêu lần input. Có một cách là kiểm tra xem dòng command có đang chờ nhập liệu không, nếu có thì gửi thông điệp pause để chờ người dùng nhập, nếu không thì mới thực hiện lệnh tiếp theo của mình. Biến hệ thống CMDACTIVE cho biết dòng command có đang phải chờ lệnh hay là đang available.

  • Vote tăng 3

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
Bác thử sửa thành như sau:

(command "pline" p1)

(while (< 0 (getvar "CMDACTIVE"))

(command pause)

)

(alert "Vua ket thuc lenh Pline")

 

Lý do là mỗi lệnh pause chỉ nhận một thao tác input, mà ta không thể biết trước người sử dụng sẽ thao tác bao nhiêu lần input. Có một cách là kiểm tra xem dòng command có đang chờ nhập liệu không, nếu có thì gửi thông điệp pause để chờ người dùng nhập, nếu không thì mới thực hiện lệnh tiếp theo của mình. Biến hệ thống CMDACTIVE cho biết dòng command có đang phải chờ lệnh hay là đang available.

Tuyệt! Cám ơn anh Hoành nhiều!

Chương trình NP sửa lại đơn giản như sau:

 

(defun C:NP( / p ss e1 e2) ;;;Noi tiep pline
(setq
 p (getpoint "\nChon diem cuoi line, pline hoac arc:")
 ss (ssget "c" p p '((0 . "LINE,LWPOLYLINE,ARC")))
 e1 (ssname ss 0)
)
(command "pline" p)
(while (< 0 (getvar "CMDACTIVE")) (command pause))
(setq e2 (entlast))
(if (= (cdr (assoc 0 (entget e1))) "LWPOLYLINE")
 (command "pedit" e1 "j" e2 "" "")
 (command "pedit" e1 "y" "j" e2 "" "")
)
(princ)
)

 

Ssg hỏi thêm anh Hoành cái này nữa. Ssg thường dùng dấu móc nhọn <...> để gán các giá trị mặc định trong các dòng nhắc lệnh. Ví dụ:

mocnhon2.jpg

với hàm ý nếu user không muốn nhập điểm nữa thì Enter để kết thúc vòng lặp. Kiểu này đúng như phong cách của chính AutoCAD. Ví dụ:

Command: OFFSET

Specify offset distance or [Through] <5.0000>:

Nếu user Enter sẽ chấp nhận giá trị offset distance trong cặp móc nhọn là 5.0 mà không cần nhập số.

Tuy nhiên, khi cho vào trong codebox của diễn đàn, dấu móc nhọn bị mã hoá khác đi, không giữ được nguyên trạng nữa. Anh Hoành có thể xử lý chỗ này được không?

  • 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
Ssg hỏi thêm anh Hoành cái này nữa. Ssg thường dùng dấu móc nhọn <...> để gán các giá trị mặc định trong các dòng nhắc lệnh. Ví dụ:

"(while (setq p2 (getpoint p1 "\nDiem tiep theo :")) ...)" với hàm ý nếu user không muốn nhập điểm nữa thì Enter để kết thúc vòng lặp. Kiểu này đúng như phong cách của chính AutoCAD. Ví dụ:

Command: OFFSET

Specify offset distance or [Through] :

Nếu user Enter sẽ chấp nhận giá trị offset distance trong cặp móc nhọn là 5.0 mà không cần nhập số.

Tuy nhiên, khi cho vào trong codebox của diễn đàn, dấu móc nhọn bị mã hoá khác đi, không giữ được nguyên trạng nữa. Anh Hoành có thể xử lý chỗ này được không?

Hiện nay thì codebox đang bị lỗi do hiểu dấu mở ngoặc là mã HTML. Nếu bác cách ra một dấu cách, ví dụ thì không sao, bởi hệ thống nhận ra đó không phải là HTML .

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
Hiện nay thì codebox đang bị lỗi do hiểu dấu mở ngoặc là mã HTML. Nếu bác cách ra một dấu cách, ví dụ < or Enter to exit> thì không sao, bởi hệ thống nhận ra đó không phải là HTML .

Không chỉ trong codebox, cả ở ngoài cũng bị! Ssg phải insert hình để minh hoạ!

  • 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
Tuyệt! Cám ơn anh Hoành nhiều!

Chương trình NP sửa lại đơn giản như sau:

 

(defun C:NP( / p ss e1 e2) ;;;Noi tiep pline
(setq
 p (getpoint "\nChon diem cuoi line, pline hoac arc:")
 ss (ssget "c" p p '((0 . "LINE,LWPOLYLINE,ARC")))
 e1 (ssname ss 0)
)
(command "pline" p)
(while (< 0 (getvar "CMDACTIVE")) (command pause))
(setq e2 (entlast))
(if (= (cdr (assoc 0 (entget e1))) "LWPOLYLINE")
 (command "pedit" e1 "j" e2 "" "")
 (command "pedit" e1 "y" "j" e2 "" "")
)
(princ)
)

 

Ssg hỏi thêm anh Hoành cái này nữa. Ssg thường dùng dấu móc nhọn <...> để gán các giá trị mặc định trong các dòng nhắc lệnh. Ví dụ:

mocnhon2.jpg

với hàm ý nếu user không muốn nhập điểm nữa thì Enter để kết thúc vòng lặp. Kiểu này đúng như phong cách của chính AutoCAD. Ví dụ:

Command: OFFSET

Specify offset distance or [Through] <5.0000>:

Nếu user Enter sẽ chấp nhận giá trị offset distance trong cặp móc nhọn là 5.0 mà không cần nhập số.

Tuy nhiên, khi cho vào trong codebox của diễn đàn, dấu móc nhọn bị mã hoá khác đi, không giữ được nguyên trạng nữa. Anh Hoành có thể xử lý chỗ này được không?

Tuyệt vời quá!!thanks bác nhiều 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

Bai viet so 10

Hiện nay thì codebox đang bị lỗi do hiểu dấu mở ngoặc là mã HTML. Nếu bác cách ra một dấu cách, ví dụ thì không sao, bởi hệ thống nhận ra đó không phải là HTML .

Chào bác Hoành

Đúng như lời của bác ssg nói : Ngay cả ở ngoài cũng bị lỗi này :

 

Đây là bài viết đó :

Bai viet so 10

 

Ngoài ra, những đoạn Code nằn trong Codebox cũng bị lỗi ở bài viết số 3 của bác Hoành

 

Mong bác Hoành quan tâm. Cảm ơn bá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

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  

×