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ị

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

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

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.

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

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

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.

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

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

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

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

  • 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

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

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

1.) Bác thử code sau: (chỉ có biến lenslength là biến "ngoại lai"), còn lại thì OK. Bác thử nhé


(defun svr (sv)
(vl-load-com)
(setvar "cmdecho" 1)
(command "setvar" sv)
(while (= (getvar "cmdactive") 1) (command ""))
(if (or (vl-string-search "read only" (getvar "lastprompt"))
    	(= (strcase sv) "LENSLENGTH")
  )
T nil)
)

2.) Cái này theo Tue_NV hiểu là initial Value.

Cái này có thể là liệt kê ra thôi, không có cách lấy, nếu lấy chỉ là lấy giá trị đã Set cho biến thôi bác ạ

  • 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

1.) Bác thử code sau: (chỉ có biến lenslength là biến "ngoại lai"), còn lại thì OK. Bác thử nhé

...

2.) Cái này theo Tue_NV hiểu là initial Value.

Cái này có thể là liệt kê ra thôi, không có cách lấy, nếu lấy chỉ là lấy giá trị đã Set cho biến thôi bác ạ

1). OK rồi.

2). File "defaults.scr" có thể lấy được initial value bằng lisp mà bác, nhưng tiếc là 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

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.

Đây là bản vẽ, bác hãy kiểm tra dùm em. Thanks.

http://www.cadviet.c...103999_vd_1.dwg

 

Em đã up lại. Lần đầu up File nên hơi lúng túng :D

Chỉnh sửa theo Tue_NV

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

Đây là bản vẽ, bác hãy kiểm tra dùm em. Thanks.

http://www.cadviet.c...103999_vd_1.dwg

Em đã up lại. Lần đầu up File nên hơi lúng túng :D

Sau khi zoom "E" bạn nhìn kỹ trên màn hình sẽ thấy:

- Phía dưới ở giữa có 1 chấm nhỏ: đó chính là hình của bạn (492 đối tượng).

- Phía trên ở giữa có 1 chấm nhỏ: đó chính là 4 đối tượng arc mà có lẽ bạn không mong muốn có, và là trở ngại chính khiến bạn zoom "E" bất thành.

Bây giờ bạn xoá tất cả cái trên đi và zoom "E" lại 1 lần nữa là OK ngay thôi.

  • 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

Sau khi zoom "E" bạn nhìn kỹ trên màn hình sẽ thấy:

- Phía dưới ở giữa có 1 chấm nhỏ: đó chính là hình của bạn (492 đối tượng).

- Phía trên ở giữa có 1 chấm nhỏ: đó chính là 4 đối tượng arc mà có lẽ bạn không mong muốn có, và là trở ngại chính khiến bạn zoom "E" bất thành.

Bây giờ bạn xoá tất cả cái trên đi và zoom "E" lại 1 lần nữa là OK ngay thôi.

OK. Em đã thử và đã thành công. Thanks bác rất nhiều. Nhưng em vẫn chưa hiểu những Arc này tạo ra từ đâ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

1). OK rồi.

2). File "defaults.scr" có thể lấy được initial value bằng lisp mà bác, nhưng tiếc là không đủ.

2.) File "defaults.scr" bản chất là sự liệt kê mà 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

2.) File "defaults.scr" bản chất là sự liệt kê mà bác

Không biết bác và tôi có hiểu nhầm nhau trong cách diễn đạt hay không? Ý tôi là dựa vào file "defaults.scr" thì có thể lấy được giá trị default để gán cho tất cả sysvar ấy mà. Ý định này nãy sinh từ 1 số câu hỏi của bạn đọc, đại ý là "không biết em đã tick nhầm cái gì mà tự nhiên bây giờ em không làm được chuyện này chuyện nọ...". Do đó tôi muốn chuyển các sysvar về default cho họ.

Bác đọc code này sẽ hiểu rõ hơn ý tưởng của tôi.

(defun C:HA1( / scr)
(setq scr (findfile "Defaults.scr"))
(command "SCRIPT" scr)
(princ))
(defun C:HA2( / scr pr dong)
(vl-load-com)
(setq scr (findfile "Defaults.scr"))
(setq pr (open scr "r"))
(while (setq dong (read-line pr))
 (vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) (strcat dong " ")))
(close pr)
(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

Không biết bác và tôi có hiểu nhầm nhau trong cách diễn đạt hay không? Ý tôi là dựa vào file "defaults.scr" thì có thể lấy được giá trị default để gán cho tất cả sysvar ấy mà. Ý định này nãy sinh từ 1 số câu hỏi của bạn đọc, đại ý là "không biết em đã tick nhầm cái gì mà tự nhiên bây giờ em không làm được chuyện này chuyện nọ...". Do đó tôi muốn chuyển các sysvar về default cho họ.

Bác đọc code này sẽ hiểu rõ hơn ý tưởng của tôi.

(defun C:HA1( / scr)
(setq scr (findfile "Defaults.scr"))
(command "SCRIPT" scr)
(princ))
(defun C:HA2( / scr pr dong)
(vl-load-com)
(setq scr (findfile "Defaults.scr"))
(setq pr (open scr "r"))
(while (setq dong (read-line pr))
 (vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) (strcat dong " ")))
(close pr)
(princ))

Thì đúng là sự liệt kê. File "Defaults.scr" là những dòng (setvar .... biến chứ không lấy ra giá trị initial Value của biến hệ thống

 

Liệt kê tất cả biến hệ thống đầy đủ hơn file "Defaults.scr" và setvar Trong Lisp không phải suy nghĩ gì 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

Thì đúng là sự liệt kê. File "Defaults.scr" là những dòng (setvar .... biến chứ không lấy ra giá trị initial Value của biến hệ thống

Liệt kê tất cả biến hệ thống đầy đủ hơn file "Defaults.scr" và setvar Trong Lisp không phải suy nghĩ gì cả bác ạ!

Ái dà! Sao tôi vẫn chưa "thông" được nhỉ!

LIệt kê tất cả sysvar thì được rồi. Nhưng tôi muốn đặt tất cả giá trị sysvar về giá trị ban đầu như khi mới cài cad ấy. Vậy làm sao biết được tất cả giá trị ban đầu đó để set nó về? Có thể được không hả 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

OK. Em đã thử và đã thành công. Thanks bác rất nhiều. Nhưng em vẫn chưa hiểu những Arc này tạo ra từ đâu?

Chỉ có người tạo ra bản vẽ của bạn mới biết được câu hỏi của bạn thôi. Như bác Hà đã nói khi zoom e mà bạn ko nhìn thấy không có nghĩa là các đối tượng biến mất mà nó quá nhỏ và nằm cách nhau quá xa. Còn bản vẽ của bạn mà hỏi bác Hà tại sao thì chắc bác Hà cũng trả lời như tôi vậy thôi.

  • 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

Chỉ có người tạo ra bản vẽ của bạn mới biết được câu hỏi của bạn thôi. Như bác Hà đã nói khi zoom e mà bạn ko nhìn thấy không có nghĩa là các đối tượng biến mất mà nó quá nhỏ và nằm cách nhau quá xa. Còn bản vẽ của bạn mà hỏi bác Hà tại sao thì chắc bác Hà cũng trả lời như tôi vậy thôi.

Hì hì! Tôi trả lời khác bác, là: "Bạn hỏi tôi thì tôi biết hỏi ai?"

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 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ắc phục các bản vẽ kiểu này thì có 1 mẹo rất đơn giản:

- Khi đánh lệnh:

Command: e

ERASE

Select objects: all

- Sau đó Bạn unselect các đối tượng mà Bạn muốn giữ lại (dùng phím Shift + Click chuột)

- Enter để loại bỏ các đối tượng thừa

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

em đang dùng win7 , với cad 2007, ở công ty thì ap dc lisp cad, nhưng về nhà dùng lap lại ko dc. đang làm đồ án mà ức chế quá, dù tìm mọi diễn đàn mà ko có câu trả lời, xin các pro chỉ giáo giúp em với, khi em load lisp thì nó hiện lên cái dòng này " :excl: unknown command "CD" . Press F1 to help"

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

em đang dùng win7 , với cad 2007, ở công ty thì ap dc lisp cad, nhưng về nhà dùng lap lại ko dc. đang làm đồ án mà ức chế quá, dù tìm mọi diễn đàn mà ko có câu trả lời, xin các pro chỉ giáo giúp em với, khi em load lisp thì nó hiện lên cái dòng này " :excl: unknown command "CD" . Press F1 to help"

Up cái lisp đó lên xem nhé!

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ách nào để thay đổi tính chất "Text view direction" của dimension không các bác: left to right <-> right to left.

Mình có lệnh đổi chiều tất cả các đối tượng có thể fải thực hiện đổi chiều. trừ thằng dimension này thì chưa làm đượ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


×