Chuyển đến nội dung
Diễn đàn CADViet
Jin Yong

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

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

sao phần HELP 2004 không có autolisp nhi?

nhiều lúc muốn tra ý nghĩa của một hàm cũng không biết làm thế nào?

các bác nào có kinh nghiệm chỉ rùm với :)

Hề hề hề,

Có đấy, mình cũng đang dùng Cad2004 và sử dụng Help Developer để tham khảo về lisp. Bạn hãy thử xem có đáp ứng được yêu cầu của bạn không nhé.

Chúc bạn vui.

  • 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

Mình bắt buộc phải dùng Visual lisp để xóa xdata của đối tượng. Nếu dùng Entmod của autolisp thì đơn giản, nhưng với visual thì thấy khó quá. Nhờ các bác trợ 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

Mình tình cờ phát hiện ra Vlide xác nhận các chuỗi variant-valuesafearray-value là các chuỗi được bảo vệ. ban đầu mình tưởng chúng là các hằng hoặc các đối số của các hàm Vla hay Vlax nhưng kiểm tra lại thì không phải. Chúng chính xác là các hàm. Và chúng tương đương với 2 hàm lần lượt là vlax-variant-valuevlax-safearray->list. Nghĩa là sử dụng như nhau, chả thấy khác tẹo nào (không fải kiểu như vlax-invoke nhé, mình mới chỉ kiểm thử với một vài kiểu variant và safearray, chưa kiểm tra hết).Tìm trong help thì không thấy đả động gì đến 2 thằng này.

Bằng cách trên thì mình cũng đã tìm ra rất nhiều hàm kiểu như 2 hàm trên và có tính chất tương đương với các hàm vlax khác. Như vậy là đã có một số thứ Autodesk đã không công khai cho người dùng. Có bác nào có thông tin gì về việc này không? mình tìm trên mạng thấy mù mờ quá.

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

Mình đọc Help của Autocad chỉ thấy nói đến hàm VL-, VLAX- và VLR- chứ không thấy hàm VLA-. Vậy xin hỏi anh em muốn tìm hiểu về hàm VLA- này thì kiếm ở đâu, vì các bác viết code rất hay dùng. Xin cảm ơ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ó nằm trong phần ActiveX and VBA reference. Các hàm VLA-* chính là các Methods của VBA được viết sang ngôn ngữ lisp. bạn hỏi thêm google để nhận được hướng dẫn cụ thể hơn vì nói đến mấy hàm này thì dài dòng lắm, mà chưa chắc mình đã nói đúng :D

  • 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

Mình đọc Help của Autocad chỉ thấy nói đến hàm VL-, VLAX- và VLR- chứ không thấy hàm VLA-. Vậy xin hỏi anh em muốn tìm hiểu về hàm VLA- này thì kiếm ở đâu, vì các bác viết code rất hay dùng. Xin cảm ơn.

Giới thiệu bạn 1 web để tìm hiểu thêm về các hàm "vla-"

http://www.afralisp.net/archive/methods/methods_ref.htm

  • 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

Nó nằm trong phần ActiveX and VBA reference. Các hàm VLA-* chính là các Methods của VBA được viết sang ngôn ngữ lisp. bạn hỏi thêm google để nhận được hướng dẫn cụ thể hơn vì nói đến mấy hàm này thì dài dòng lắm, mà chưa chắc mình đã nói đúng :D

Em đã đọc qua phần Methods cùa cad nhưng cảm giác rất mông lung vì kiến thức VB chỉ là con số 0. Nếu bác có thể xin hướng dẩn đôi chút về nó. Nếu kèm theo ví dụ nữa thì tuyệt vời. Xin cảm ơn.

Giới thiệu bạn 1 web để tìm hiểu thêm về các hàm "vla-"

http://www.afralisp....methods_ref.htm

Tuyệt vời bác Hà, nếu có thời gian em sẽ tìm hiểu về thằng này. Xin cảm ơn 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

Các bác cho em hỏi có hàm nào để kiểm tra xem một đường LWPOLYLINE kín (ví dụ hình chữ nhật) có chứa ký tự A hay không (A nằm trong đường LWPOLYLINE; A la "*TEXT"). Mục đích của em là tìm tập hợp các đường LWPOLYLINE có chứa ký tự A. Xin cảm ơn các 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

Các bác cho em hỏi có hàm nào để kiểm tra xem một đường LWPOLYLINE kín (ví dụ hình chữ nhật) có chứa ký tự A hay không (A nằm trong đường LWPOLYLINE; A la "*TEXT"). Mục đích của em là tìm tập hợp các đường LWPOLYLINE có chứa ký tự A. Xin cảm ơn các bác.

Hề hề hề,

Hàm sẵn có thì mình chửa biết. Nhưng nếu là hàm do người dùng tạo ra thì có thể đấy 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

Các bác cho em hỏi có hàm nào để kiểm tra xem một đường LWPOLYLINE kín (ví dụ hình chữ nhật) có chứa ký tự A hay không (A nằm trong đường LWPOLYLINE; A la "*TEXT"). Mục đích của em là tìm tập hợp các đường LWPOLYLINE có chứa ký tự A. Xin cảm ơn các bác.

Cad thì không có nhưng lisp thì làm được 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

Các bác cho em hỏi có hàm nào để kiểm tra xem một đường LWPOLYLINE kín (ví dụ hình chữ nhật) có chứa ký tự A hay không (A nằm trong đường LWPOLYLINE; A la "*TEXT"). Mục đích của em là tìm tập hợp các đường LWPOLYLINE có chứa ký tự A. Xin cảm ơn các bác.

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:

  • 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

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à đủ ^^

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

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

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

  • 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

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

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

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

  • 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

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

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

  • 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

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á!

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

  • 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

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


×