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ị

Thực ra em tham khảo các hàm của bác. Em không dùng vì kết quả trả về khác với em. Em tạo ra 1 danh sách chứ không phải là 1 chuỗi string.

Cách thức mở file thì.......cái này em mặc định OK rồi nên cũng không để ý lắm. Hii. 

Đỏ: hàm của tôi tạo ra 1 list, trong list cũng không có string nào cả. Thanhduan thử đọc kết quả trả về chưa?

 

((C1 (P 4.966 3.277) (P 11.632 7.723) (P 17.779 4.347) (T 9.231 6.644) (T 20.103 1.069)) 

(C2 (P 4.855 8.792) (P 12.383 2.158) (P 21.547 6.564) (T 15.522 8.782) (T 21.191 4.376)) 

(C3 (P 2.656 1.109) (P 13.758 9.941) (P 21.266 3.277) (T 6.088 1.03) (T 11.869 6.624) (T 21.094 3.277)...)

  • 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ào anh chị,

 Em có viết 1 đoạn lisp nhỏ để load các file  lisp trong 1 folder chỉ định truớc như sau:

 

(defun C:AutoLoad_TranSon (/ dd lstfile lstpath path pathlsp)

(vl-load-com)
(setvar "Modemacro" "@ Tran Cong Son _ Detail SS")
(setq lstpath (list "D:\\My Documents\\Desktop\\Scrip"
"D:\\4.AutoLisp\\2.Tran Son_AutoLisp"
);;;List cac Folder can Load
)
(foreach path lstpath
(setq lstdir (vl-directory-files path "*" -1)
lstdir (vl-remove-if '(lambda (x) (wcmatch x ".,..")) lstdir)
pathlsp (list)
)
(if lstdir
(setq pathlsp (append pathlsp (mapcar '(lambda (x) (strcat path "\\" x)) lstdir)))
(setq pathlsp (cons path pathlsp))
)
(foreach dd pathlsp
(setq lstfile (vl-directory-files dd "*.lsp")
lstfile (vl-remove "Autoload File Lisp-Tran Son.LSP" lstfile))
(mapcar '(lambda (x) (vl-load-all (strcat dd "\\" x))) lstfile)
)
)
(princ)
)
(C:AutoLoad_TranSon)

 

Hôm qua nó chạy bình thường nhưng hôm nay load nó hiện thông báo trên commmandline như thế này ạ

 
Command: AUTOLOAD_TRANSON
; error: VLISP: internal: Document application(.VLX) not found

 

Anh chị check giúp em COde có sai chỗ nào không với...

Em 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

Chào anh chị,

 Em có viết 1 đoạn lisp nhỏ để load các file  lisp trong 1 folder chỉ định truớc như sau:

 

(defun C:AutoLoad_TranSon (/ dd lstfile lstpath path pathlsp)

(vl-load-com)

(setvar "Modemacro" "@ Tran Cong Son _ Detail SS")

(setq lstpath (list "D:\\My Documents\\Desktop\\Scrip"

"D:\\4.AutoLisp\\2.Tran Son_AutoLisp"

);;;List cac Folder can Load

)

(foreach path lstpath

(setq lstdir (vl-directory-files path "*" -1)

lstdir (vl-remove-if '(lambda (x) (wcmatch x ".,..")) lstdir)

pathlsp (list)

)

(if lstdir

(setq pathlsp (append pathlsp (mapcar '(lambda (x) (strcat path "\\" x)) lstdir)))

(setq pathlsp (cons path pathlsp))

)

(foreach dd pathlsp

(setq lstfile (vl-directory-files dd "*.lsp")

lstfile (vl-remove "Autoload File Lisp-Tran Son.LSP" lstfile))

(mapcar '(lambda (x) (vl-load-all (strcat dd "\\" x))) lstfile)

)

)

(princ)

)

(C:AutoLoad_TranSon)

 

Hôm qua nó chạy bình thường nhưng hôm nay load nó hiện thông báo trên commmandline như thế này ạ

 
Command: AUTOLOAD_TRANSON
; error: VLISP: internal: Document application(.VLX) not found

 

Anh chị check giúp em COde có sai chỗ nào không với...

Em cảm ơn,

1/ Code của bạn không có vấn đề gì. Nhưng bất tiện ở chỗ : khi tìm đường dẫn tới thư mục giả sử là A thì :

a) Nếu trong A có các file *.lsp và các thư mục C, D thì nó không load các file trong A mà chỉ load các file trong C, D

b) Nếu trong A chí có các file *.lsp thì nó mới load các file này :)

2/ Bạn nói báo lỗi :

 
Command: AUTOLOAD_TRANSON
; error: VLISP: internal: Document application(.VLX) not found
Tôi cũng không hiểu sao có lỗi này vì bạn load có chọn lọc là các file *,lsp :wub: .
3/ Chú ý đặc biệt : Các thư mục và file tuyệt đối không gõ dấu Vietnamese khi load các file ứng dụng của Autocad.
  • 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ú ý dành cho tất cả các member là khi Post câu hỏi và trả lời thì 4room dấu mất tiêu 1 số đoạn khiến người đọc chẳng hiểu gì :D

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/ Code của bạn không có vấn đề gì. Nhưng bất tiện ở chỗ : khi tìm đường dẫn tới thư mục giả sử là A thì :

a) Nếu trong A có các file *.lsp và các thư mục C, D thì nó không load các file trong A mà chỉ load các file trong C, D

B) Nếu trong A chí có các file *.lsp thì nó mới load các file này :)

2/ Bạn nói báo lỗi :

 
Command: AUTOLOAD_TRANSON
; error: VLISP: internal: Document application(.VLX) not found
Tôi cũng không hiểu sao có lỗi này vì bạn load có chọn lọc là các file *,lsp :wub: .
3/ Chú ý đặc biệt : Các thư mục và file tuyệt đối không gõ dấu Vietnamese khi load các file ứng dụng của Autocad.

 

 

Cảm ơn @pphung183

  1. Em thiếu trường hợp này ^^hi.Để em nghiên cứu Code thêm ^^.Cho em hỏi thêm tí: Có cách nào ,khi mình load lần đầu tiên ,nó sẽ lưu luôn đường dẫn zô cái biến lstpath nứ không a??
  2. Hì hục 1 ngày thứ 7 ,ruốt cuộc cũng tìm ra lỗi rồi anh ^^ Nguyên nhân do em dùng lisp này của chị ThuyLinh313: http://www.cadviet.com/forum/topic/66851-da-xong-tu-dong-bat-tat-che-do-go-tieng-viet-trong-cad/
  3. Không chỉ cho Autocad mà các phần mêm khác cũng nên làm như vậy ạ ^^

P/s: Dạo này em gõ comment ,cái con trỏ chuột hay chuyển về đầu dòng và copy past 1 số thông tin vào bài gửi thì nó lại bị che mờ hoặc ẩn đi -->gây khó chịu cho người đọc lắm ạ.Hix.Các a Mod xem lại 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 em hỏi chút về thuật toán.

Em có 1 list

 

(setq L1 (list '(2 3) '(4 7) '(12 4) '(1 34) '(56 9) '(0 23)))

Ngoài thuật toán sort ra, em muốn lấy ra danh sách nào mà có phần tử đầu tiên nhỏ nhất trong danh sách ấy được không ạ? (Ví dụ trên thì kết quả trả về (0 23) )

Nếu dùng hàm apply 'min.....thì áp dụng được 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 cho em hỏi chút về thuật toán.

Em có 1 list

Ngoài thuật toán sort ra, em muốn lấy ra danh sách nào mà có phần tử đầu tiên nhỏ nhất trong danh sách ấy được không ạ? (Ví dụ trên thì kết quả trả về (0 23) )

Nếu dùng hàm apply 'min.....thì áp dụng được không ạ?

 

 Em nghĩ dùng Vl-sort nhanh hơn chứ.^^

 Nếu apply'min thì như vây đuợc ko ạ

(setq l2 (apply 'min (mapcar 'car l1))

lst (list l2 (cadr (assoc l2 l1))))

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

(car (vl-sort l1 '(lambda(x y) (< (car x) (car y)))))

(assoc (apply 'min (mapcar 'car l1)) l1)

Hii. Vậy mà em không nghĩ ra. Cách 1 thì em làm dc rồi.

Không biết 1 trong 2 cách thì thằng nào tốc độ nhanh hơn hả bác?

Em 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

Chào các anh chị,


Em đang viết đoạn Lisp để chỉnh sưa bảng thông kê cho cốt thép như file đính kèm.


http://www.cadviet.com/upfiles/5/142392_thong_ke_thep_2.dwg


Em có đọc bài viết của a Tue_NV ở trang này http://www.cadviet.c...ong-block-dong/ .Trong đoạn video đó,anh Tue_NV có viết lisp để  ED 1  giá trị trong Block thuộc tính  (ví dụ như số lượng thép, chiều dài, phi,...) thì nó update kết quả luôn (chiều dài,khối lượng ).Do trong topic đó anh Tuệ đã nói "không cho không được" nên em mạo muội nhờ các anh chị giải thích giúp em  1 vài vấn đề sau được không ạ:


  1. Trong lisp Làm sao chỉnh sửa Text trong block ATT nó hiện bảng như edit Text bình thường .(giống như a Tuệ đã làm)
  2. Ở chỗ Update giá trị có phải a Tuệ dùng Field để update hay dùng chức năng gì ạ? 
  3. Sẵn anh chị cho em vài đoạn code mẫu hoặc giải thích giúp em cách dùng Field trong Lisp như thế nào với,.Hoặc cho em vài đường link để tham khảo cũng được ạ 

Mong anh chị giúp đỡ .Em chân thành 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

1. Edit text hay edit att? Bản vẽ cao hơn 2007 không đọc được.

2. Đợi tác giả.

3. Google Field thì đọc 1 năm không xuể.

Sorry anh ,lúc sáng em upload file được mà giờ up lên toàn bị IT chặn hết.

ANh chị nào convert file về 2007 giúp em với

 

@a Hạ:

  1. Edit text trong block ATT à a
  2. Anh xem video của a Tue xem sao ạ (em cũng đang đợi tin a Tuệ đây)
  3. Cảm ơn a,em cũng đang tham khảo trên này.Nhưng chưa hiểu các tạo các Field trong Lisp 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

B

 

 

Chào các anh chị,

Em đang viết đoạn Lisp để chỉnh sưa bảng thông kê cho cốt thép như file đính kèm.

http://www.cadviet.com/upfiles/5/142392_thong_ke_thep_2.dwg

Em có đọc bài viết của a Tue_NV ở trang này http://www.cadviet.c...ong-block-dong/ .Trong đoạn video đó,anh Tue_NV có viết lisp để  ED 1  giá trị trong Block thuộc tính  (ví dụ như số lượng thép, chiều dài, phi,...) thì nó update kết quả luôn (chiều dài,khối lượng ).Do trong topic đó anh Tuệ đã nói "không cho không được" nên em mạo muội nhờ các anh chị giải thích giúp em  1 vài vấn đề sau được không ạ:

  1. Trong lisp Làm sao chỉnh sửa Text trong block ATT nó hiện bảng như edit Text bình thường .(giống như a Tuệ đã làm)
  2. Ở chỗ Update giá trị có phải a Tuệ dùng Field để update hay dùng chức năng gì ạ? 
  3. Sẵn anh chị cho em vài đoạn code mẫu hoặc giải thích giúp em cách dùng Field trong Lisp như thế nào với,.Hoặc cho em vài đường link để tham khảo cũng được ạ 

Mong anh chị giúp đỡ .Em chân thành cảm ơn!

 

Giống như bạn Tuệ thì chỉ có bạn Tuệ trả lời được. Nhưng mình nghĩ trình lisp của bạn đã có đủ khả năng làm thống kê thép bằng block chứa att. 

1.Bạn làm 1 hàm con đọc att trong block cần đọc được tag và giá trị.

2.Bạn lại làm 1 hàm con có khả năng sửa  giá trị có tag chỉ định trong block.

Cứ chọn 1 att trong block dùng hàm 1. Nhập giá trị cần sửa. Dùng hàm 2 chỉnh chính nó và các tag khác sau khi cộng trừ nhân chia.

  • 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

B

 

Giống như bạn Tuệ thì chỉ có bạn Tuệ trả lời được. Nhưng mình nghĩ trình lisp của bạn đã có đủ khả năng làm thống kê thép bằng block chứa att. 

1.Bạn làm 1 hàm con đọc att trong block cần đọc được tag và giá trị.

2.Bạn lại làm 1 hàm con có khả năng sửa  giá trị có tag chỉ định trong block.

Cứ chọn 1 att trong block dùng hàm 1. Nhập giá trị cần sửa. Dùng hàm 2 chỉnh chính nó và các tag khác sau khi cộng trừ nhân chia.

Em cảm ơn a Duy,

  1. Lấy giá trị TagString và TextString của Block ATT em làm được ạ
  2. Sửa TagString có giá trị Tag chỉ định thì em cũng  tạm ổn
  3. Màu Xanh:  Em chỉ biết nhập giá trị cần sửa = hàm getstring hoặc getreal thôi ạ.Chứ làm cho nó trực quan giống như Edit Dtext bình thường (như a Tuệ đã làm ) em suy nghĩ mãi mà chưa ra cách nên mới nhờ các anh chị ạ.

Cách làm của em:

  1. Chọn Block Att để lấy các TagString và Text String
  2. Dùng (car (nentsel"\Chon Text trong Block ATT can Edit:")) để chọn cái Text Block ATT cần sửa.-->Thắc mắc:Ở Lisp a Tuệ chỉ làm 1 bước là đã tới cái Text trong Block ATT -->Cái này em làm chưa được 
  3. Nhập giá trị và lisp tự tính

Các anh chị xem từ bước 2 em có được entityname con của Blockatt -->Có cách nào mà từ bước 2 có thể lấy Entity của Block và các TagString,Textstring của Block ATT đó không ạ (không cần chọn block ở bước 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ái màu xanh:

Sau khi lấy được tính chất của Tag đó  => ẩn tag đó đi => entmake Text có một số tính chất của Tag (Textstring, Style, Heigth, Pos ...) => Edit text => Lấy giá trị mới của text này gán vào Tag và cho hiện lên=> Xóa text entmake.

Chỉ 1 bước: (defun c:test () (setq ent (entsel)) (setq a-ent (nentselp (cadr ent))))

  • 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 hay dùng lisp này để sữa nhanh các đối tượng có Text :) :

(defun c:edt (/ ent subent tn) 
(setq ent (entsel "\nPick chon Text : ")) 
(setq subent (car (nentselp (cadr ent))))
(setq tn (lisped (cdr (assoc 1 (entget subent)))))
(entmod (subst (cons 1 tn) (assoc 1 (entget subent)) (entget subent)))
(entupd (car ent))
(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

Cái màu xanh:

Sau khi lấy được tính chất của Tag đó  => ẩn tag đó đi => entmake Text có một số tính chất của Tag (Textstring, Style, Heigth, Pos ...) => Edit text => Lấy giá trị mới của text này gán vào Tag và cho hiện lên=> Xóa text entmake.

Chỉ 1 bước: (defun c:test () (setq ent (entsel)) (setq a-ent (nentselp (cadr ent))))

Cảm ơn a quocmanh04tt

Tối qua về mày mò ra cũng giống như a vậy,code em dùng:

(setq ent (entsel"\Chon Text trong Block ATT can Edit:")
               p1 (cadr ent)
               e2 (car (nentselp p1)));;chỗ này có thể dùng (ssget point '((0 . "INSERT"))) cũng được
 
Màu xanh: Giờ mới đọc cmt của anh , nên em sẽ thử xem sao,em code có chỗ nào vướng mắc em sẽ post hỏi tiếp ạ
 
@a pphung : Em cảm ơn nhưng cái này không phải cái em cần anh ơi,vì em muốn Edit trực tiếp chỗ cái Text của Block ATT cho dễ thẫy ấy mà 

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

@ Tr. Cong Son: Cấu tạo Block của mình bằng các Attribute (không sử dụng Field trong block thống kê thép tròn).

Hướng đi đúng theo quocmanh đã viết ^_^

  • 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

@ Tr. Cong Son: Cấu tạo Block của mình bằng các Attribute (không sử dụng Field trong block thống kê thép tròn).

Hướng đi đúng theo quocmanh đã viết ^_^

 

Thanks a Tuệ,

Anh chị cho em hỏi:em dùng code này để lấy list (Tagstring . Textstring) 

 

(setq ent (entsel "\Chon Text trong Block ATT can Edit:")

e2 (car (nentselp (cadr ent)))

obj (vlax-ename->vla-object ent)

lstATT (Getatt obj)

)

 

(defun GetAtt (obj)

(mapcar '(lambda (att) (cons (vla-get-TagString att) (vla-get-TextString att)))

(vlax-invoke obj 'GetAttributes)

)

)

 
Nhưng dùng thì có hồi được ,hồi báo lỗi như vậy:  ActiveX Server returned the error: unknown name: "GETATTRIBUTES"
Anh chị giải thích cho em biết và cách khắc phục như thế nào ko ạ?
Em cảm ơn
Chỉnh sửa theo Tr.CongSon

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

 

Thanks a Tuệ,

Anh chị cho em hỏi:em dùng code này để lấy list (Tagstring . Textstring) 

 

(setq ent (entsel "\Chon Text trong Block ATT can Edit:")

e2 (car (nentselp (cadr ent)))

obj (vlax-ename->vla-object ent)

lstATT (Getatt obj)

)

 

(defun GetAtt (obj)

(mapcar '(lambda (att) (cons (vla-get-TagString att) (vla-get-TextString att)))

(vlax-invoke obj 'GetAttributes)

)

)

 
Nhưng dùng thì có hồi được ,hồi báo lỗi như vậy:  ActiveX Server returned the error: unknown name: "GETATTRIBUTES"
Anh chị giải thích cho em biết và cách khắc phục như thế nào ko ạ?
Em cảm ơn

 

 

Bạn có thể kiểm tra ename đó có tồn tại dxf 66 khong? trước khi lấy  "GETATTRIBUTES"

  • 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

Sao bác Tue_NV trích dẫn được code của Tr.CongSon mà em thì chẳng thấy code trong bài viết của Tr.CongSon nhỉ (bài #2651 và #2653)?

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

×