Đến nội dung


Hình ảnh
* * * - - 17 Bình chọn

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


  • Please log in to reply
2851 replies to this topic

#1141 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 27 April 2012 - 11:40 AM

Làm thế nào để đóng bản vẽ hiện hành bằng lisp (không dùng command hay vb) các bác nhẩy?
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#1142 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 27 April 2012 - 12:01 PM

Các bác hăng hái viết thế ^^ THeo e còn phụ thuộc khái niệm "chứa" của bạn ấy như thế nào, và đôi khi, có khi chỉ 1 2 dòng thôi là đủ ^^

Hề hề hề,
hình như bạn này muốn dùng VBA chứ không phải lisp bác ạ....
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#1143 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5448 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 27 April 2012 - 12:20 PM

Làm thế nào để đóng bản vẽ hiện hành bằng lisp (không dùng command hay vb) các bác nhẩy?

Dùng cái này xem:

;----- by Joe Burke
;; JB 12/5/2008
;; Save and close all open documents.
(defun c:SaveCloseAll ( / *acad* ad)
(vl-load-com)
(setq *acad* (vlax-get-acad-object)
ad (vla-get-ActiveDocument *acad*)
)
(vlax-for x (vla-get-documents *acad*)
(if (not (equal x ad))
(progn
(vlax-invoke x 'Save)
(vlax-invoke x 'Close)
)
)
)
(command "._close" "yes")
) ;end

  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#1144 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 27 April 2012 - 12:26 PM

Câu hỏi của mình rất rõ ràng mà bác Hà.
- Code trên đóng tất cả bản vẽ Không phải hiện hành bằng lisp.
- và đóng bản vẽ hiện hành bằng command
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#1145 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 27 April 2012 - 02:13 PM

Làm thế nào để đóng bản vẽ hiện hành bằng lisp (không dùng command hay vb) các bác nhẩy?

Dùng luôn sendkeys a nhé. k thì dùng Sendcommand của VBA
Ví dụ nhanh :

(defun ST:SendKeys (keys / ws)
(vlax-invoke-method (setq ws (vlax-create-object "WScript.Shell")) 'sendkeys keys)
(vlax-release-object ws)
(princ)
)
(defun c:test()
(setq named? (= (getvar 'DWGTITLED ) 1)
edited? (not (zerop (getvar 'DBMOD)))
)
(ST:SendKeys
(cond ((and named? (not edited?)) "^{F4}")
((and named? edited?) "^{F4}Y")
(T );Do sth if ever save before
)
))

  • 3

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#1146 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 27 April 2012 - 03:01 PM

Cấu trúc hàm trên lạ quá. mình chưa dùng kiểu này bao giờ. nhìn vào chuỗi trong điều kiện hàm cond thì mình đoán là nó fát lệnh alt+F4 (cái này là lệnh của window áp dụng cho mọi application chạy trong môi trường của nó thì fải) nếu trường hợp bản vẽ có thay đổi thông tin so với lúc mới mở thì mặc định cad sẽ hỏi có lưu bản vẽ hay không và ta thêm lựa chọn Yes. Đúng không ketxu?
Tuy nhiên nó không chạy được với máy của mình. sau khi gõ lệnh test thì nó dừng lại, in ra giá trị -1 ở command và con trỏ ở trạng thái chờ nhập dữ liệu.
Dùng sendcommand thì không được với trường hợp của mình. bởi nó bản chất vẫn là command-đội lốt lisp.

Mình đang viết 1 ứng dụng quản lý bản vẽ. trong đó có 1 số thao tác mở và đóng bản vẽ thực hiện trong các hàm callback, được gọi bởi các reactor liên kết với 1 số sự kiện trong chương trình. Chết dở ở chỗ hàm Callback của reactor không cho phép sử dụng command dưới bất kỳ hình thức nào, chỉ được phép sử dụng ActiveX.
Nhìn vào cách thức thực hiện đóng bản vẽ trong hàm sendkeys của bạn thì có lẽ nó sẽ áp dụng được cho trường hợp của mình. nhưng chưa biết vì sao nó không hoạt động tốt với máy của mình thôi. WinXP SP3, Cad2010 và 2013, không cài đặt gói VBA
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#1147 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 27 April 2012 - 03:44 PM

-1 rơi vào trường hợp bản vẽ chưa từng được lưu(chưa có tên - vẫn là Drawing1), ketxu vẫn để + ghi chú để bác viết thêm vào (ví dụ thêm tên file, lưu bằng vla-save, rồi lại gọi lại chính hàm c:test.
Ví dụ như :


(defun ST:SendKeys (keys / ws)
(vlax-invoke-method (setq ws (vlax-create-object "WScript.Shell")) 'sendkeys keys)
(vlax-release-object ws)
(princ)
)
(defun c:test()
(setq named? (= (getvar 'DWGTITLED ) 1)
edited? (not (zerop (getvar 'DBMOD)))
)
(ST:SendKeys
(cond ((and named? (not edited?)) "^{F4}")
((and named? edited?) "^{F4}Y")
(T (vla-save (vla-get-activedocument (vlax-get-acad-object)) )(c:test));Do sth if ever save before
)
))

  • 2

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#1148 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 27 April 2012 - 05:19 PM

Tuyệt vời Kétxù ạ. Đúng như dự đoán, nó chạy ngon trong hàm callback rồi, cảm ơn bạn rất nhiều :D
Thêm tý nhé. Mình có thể tham khảo cấu trúc của "Keys" ở đâu? hàm sendkeys này lợi hại quá!
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#1149 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 27 April 2012 - 08:12 PM

Tuyệt vời Kétxù ạ. Đúng như dự đoán, nó chạy ngon trong hàm callback rồi, cảm ơn bạn rất nhiều :D
Thêm tý nhé. Mình có thể tham khảo cấu trúc của "Keys" ở đâu? hàm sendkeys này lợi hại quá!

Trong thư viện MSDN có bác ạ ^^ Hi vọng e sớm được dùng thử sản phẩm của bác :D
http://msdn.microsof...3(v=vs.84).aspx
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#1150 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 28 April 2012 - 08:00 AM

Trong thư viện MSDN có bác ạ ^^ Hi vọng e sớm được dùng thử sản phẩm của bác :D
http://msdn.microsof...3(v=vs.84).aspx

Ok man! :D
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#1151 hvn8006

hvn8006

    biết vẽ arc

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

Đã gửi 28 April 2012 - 08:40 AM

Các bác cho em hỏi autolisp có phải là lập trình không ah. Nó giống và khác với VBA như thế nào. nếu đi tìm hiểu thì mình nên theo cái nào thì tốt hơn ah. cảm ơn CADVIET!!!!
  • 0
tiền và phụ nữ là lý do cho nhiều sai lầm trong đời!!!!!!!!

#1152 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 28 April 2012 - 10:08 AM

VBA hiện giờ không còn được hỗ trợ chính thức cho cad nữa bạn ạ. Bạn buộc phải tải thêm gói cài đặt VBA cho các bản cad từ 2010 trở đi. tương lai thì chưa biết thế nào, nhưng có vẻ động thái này là 1 phần trong kế hoạch dần dần loại bỏ VBA ra khỏi cad.
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#1153 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5448 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 28 April 2012 - 11:50 AM

Làm sao để biết 1 system variable là read-only, với lisp? Bác nào biết xin chỉ giùm, thanks!
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#1154 duy267

duy267

    biết vẽ point

  • Members
  • PipPip
  • 96 Bài viết
Điểm đánh giá: 7 (bình thường)

Đã gửi 29 April 2012 - 10:07 PM

Bạn thử Code này nhé!
Quick code


(defun c:LPA(/ ssc)
(defun Tue-dxf (dxf ename)(cdr(assoc dxf (entget ename))))
(defun Tue-ss-list (L-ss-vlaobj / n L Lst ssg vlaobj)

(mapcar 'set '(ssg vlaobj) L-ss-vlaobj)
(setq L (sslength ssg))
(Repeat L
(setq ename (ssname ssg (setq L (1- L))))
(setq Lst (cons (if vlaobj (vlax-ename->vla-object ename) ename) Lst))
)
)
(defun Tue-ent-Lpoint(e / i Lpoint);Tue-dxf
(if (wcmatch (Tue-dxf 0 e) "*POLYLINE")
(progn
(if (= (type e) 'VLA-OBJECT) (setq e (vlax-vla-object->ename e)))
(setq i -1)
(Repeat (if (wcmatch (Tue-dxf 0 e) "*POLYLINE") (fix (1+ (vlax-curve-getEndParam e))) 2)
(setq Lpoint (append Lpoint (list (vlax-curve-getPointatParam e (setq i (1+ i))))))
)
)
)
(if (wcmatch (Tue-dxf 0 e) "LINE")
(setq Lpoint (append Lpoint (list (Tue-dxf 10 e) (Tue-dxf 11 e))))
)
Lpoint
)

(setq ssc (ssadd))
(if (setq ss (ssget '((0 . "*POLYLINE"))))
(Progn
(command "zoom" "e")
(foreach x (Tue-ss-list (list ss))
(if (ssget "cp" (Tue-ent-Lpoint x) (list (cons 0 "*TEXT") (cons 1 "*A*")))
(setq ssc (ssadd x ssc))
)
)
(if (= (sslength ssc) 0) (alert "\n Khong co PLINE nao co chua *TEXT ki tu A"))
)
)
(command "zoom" "p")
(sssetfirst ssc ssc)
)
@DoanVanHa: Sorry bác! Tue_NV có sự nhầm lẫn trong các lệnh của CAD :blush:

Cảm ơn bác. Lisp rất tuyệt. Thì ra nó nằm ở cái đoạn
(if (ssget "cp" (Tue-ent-Lpoint x) (list (cons 0 "*TEXT") (cons 1 "*A*"))) (setq ssc (ssadd x ssc)))
Dựa vào lisp của bác em viết lại

(defun c:Chon (/ lstent khung lst1 ssc ent)
(setq lstent (acet-ss-to-list (setq khung (ssget '((0 . "LWPOLYLINE") (70 . 1))))))
(command "regenauto" "ON")
(command "zoom" "e")
(setq ssc (ssadd))
(foreach ent lstent
(setq lst1 (acet-geom-vertex-list ent))
(if (ssget "cp" lst1 (list (cons 0 "*TEXT") (cons 1 "*A*")))
(setq ssc (ssadd ent ssc))
)
)
(if (= (sslength ssc) 0) (alert "\n Khong co PLINE nao co chua *TEXT ki tu A"))
(command "zoom" "p")
(sssetfirst ssc ssc)
)
Em chỉ cần thế thôi. Không biết có cách nào viết ngắn hơn không.
  • 0

#1155 duy267

duy267

    biết vẽ point

  • Members
  • PipPip
  • 96 Bài viết
Điểm đánh giá: 7 (bình thường)

Đã gửi 29 April 2012 - 10:12 PM

Các bác hăng hái viết thế ^^ THeo e còn phụ thuộc khái niệm "chứa" của bạn ấy như thế nào, và đôi khi, có khi chỉ 1 2 dòng thôi là đủ ^^

Bác hãy tưởng tượng nếu đường WLPOLYLINE là một cái vòng thì ký tự A chỉ có thể chạy lòng vòng bên trong cái vòng ấy (có thể nằm trên vòng). Bác có cách nào viết ngắn hơn không? Thanks.
  • 0

#1156 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5448 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 29 April 2012 - 10:48 PM

Làm sao để biết 1 system variable là read-only, với lisp? Bác nào biết xin chỉ giùm, thanks!

Câu hỏi trên chưa có trả lời. Hôm nay nãy sinh thêm một câu hỏi nữa: làm sao lấy được giá trị default của tất cả system variable?
Bác nào biết xin chỉ giùm, thanks!
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#1157 duy267

duy267

    biết vẽ point

  • Members
  • PipPip
  • 96 Bài viết
Điểm đánh giá: 7 (bình thường)

Đã gửi 30 April 2012 - 09:16 AM

Các bác cho hỏi khi em xài hàm (command "ZOM" "E") thì có một vài trường hợp bản vẽ bị biến mất hoàn toàn. Bác nào biết được nguyên nhân và cách khắc phục xin chỉ giúp. Thanks.
  • 0

#1158 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5448 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 30 April 2012 - 09:34 AM

Các bác cho hỏi khi em xài hàm (command "ZOM" "E") thì có một vài trường hợp bản vẽ bị biến mất hoàn toàn. Bác nào biết được nguyên nhân và cách khắc phục xin chỉ giúp. Thanks.

Không bao giờ biến mất! Có thể nó quá nhỏ nên bạn không thấy mà thôi. Thông thường là do trên bản vẽ có nhiều layer bị off. Nếu bạn làm chưa được thì post bản vẽ lên.
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#1159 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 30 April 2012 - 01:58 PM

Làm sao để biết 1 system variable là read-only, với lisp? Bác nào biết xin chỉ giùm, thanks!

Lisp đây bác:

(defun svr (sv)
(vl-load-com)
(setvar "cmdecho" 1)
(command sv)
(if (vl-string-search "read only" (getvar "lastprompt")) T nil)
)

Câu hỏi trên chưa có trả lời. Hôm nay nãy sinh thêm một câu hỏi nữa: làm sao lấy được giá trị default của tất cả system variable?
Bác nào biết xin chỉ giùm, thanks!

1. Câu hỏi của bác : Tue_NV đã trả lời....
2. Tất cả các system variable chưa lấy được bằng Lisp (ngoài phương pháp liệt kê).
Nên nếu chấp nhận phương pháp liệt kê thì ta cũng có thể Lấy giá trị của các SystemVAR liệt kê đã thiết lập trong CAD bằng hàm (getvar "lastprompt") như code trên
P/S : Không hiểu Default của bác là gì? Phải chăng là giá trị nguyên thủy của nó? Mà CAD không gọi giá trị này = Default bác à.
  • 2

#1160 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5448 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 30 April 2012 - 03:52 PM

Lisp đây bác:
...
1. Câu hỏi của bác : Tue_NV đã trả lời....
2. Tất cả các system variable chưa lấy được bằng Lisp (ngoài phương pháp liệt kê).
Nên nếu chấp nhận phương pháp liệt kê thì ta cũng có thể Lấy giá trị của các SystemVAR liệt kê đã thiết lập trong CAD bằng hàm (getvar "lastprompt") như code trên
P/S : Không hiểu Default của bác là gì? Phải chăng là giá trị nguyên thủy của nó? Mà CAD không gọi giá trị này = Default bác à.

1). Cám ơn bác Tue_NV. Lisp tạm ổn nhưng chưa triệt để, vì có 1 số sys_var read_only đặc biệt như "area", "lenslength"... thì báo lỗi.
2). Theo tôi hiểu default là giá trị mặc định khi cài đặt acad, tức là giá trị initial trong 3 giá trị new, current, initial của dialoge lệnh sysvdlg. Không biết có đúng không?
Có thể lấy các giá trị mặc định từ file "defaults.scr", tuy nhiên file này không cung cấp đầy đủ các giá trị.
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.