Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
10 replies to this topic

#1 namhai

namhai

    biết vẽ rectang

  • Members
  • PipPip
  • 81 Bài viết
Điểm đánh giá: 18 (tàm tạm)

Đã gửi 24 September 2009 - 02:17 PM

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
  • 0
Hãy làm việc hết mình rồi mọi điều tốt đẹp sẽ đến với bạn.....

#2 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 24 September 2009 - 05:54 PM

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

  • 2

#3 namhai

namhai

    biết vẽ rectang

  • Members
  • PipPip
  • 81 Bài viết
Điểm đánh giá: 18 (tàm tạm)

Đã gửi 24 September 2009 - 08:35 PM

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!!
  • 0
Hãy làm việc hết mình rồi mọi điều tốt đẹp sẽ đến với bạn.....

#4 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 24 September 2009 - 09:43 PM

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")
)
;;;----------------------------------------------------------

  • 0

#5 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 24 September 2009 - 10:15 PM

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?
  • 0

#6 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 25 September 2009 - 12:00 AM

...
(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 (< 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.
  • 3

#7 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 25 September 2009 - 07:30 AM

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ụ:
Hình đã gửi
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?
  • 1

#8 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 25 September 2009 - 07:39 AM

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] <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?

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

#9 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 25 September 2009 - 07:43 AM

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ạ!
  • 1

#10 namhai

namhai

    biết vẽ rectang

  • Members
  • PipPip
  • 81 Bài viết
Điểm đánh giá: 18 (tàm tạm)

Đã gửi 25 September 2009 - 07:49 AM

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ụ:
Hình đã gửi
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!!
  • 0
Hãy làm việc hết mình rồi mọi điều tốt đẹp sẽ đến với bạn.....

#11 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 25 September 2009 - 07:56 AM

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ụ < or Enter to exit> 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
  • 0