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ị

Doan Van Ha    2.676

Chúc mừng em đã hoàn thành tác phẩm. Tặng em hàm này, viết trau chuốt hơn, và tốc độ chắc chắn sẽ nhanh hơn các hàm ở trên.

; Doc va sap xep 1 file *.txt thanh 1 list gom cac nhom khac nhau.
(defun C:HA (/ fn group)
 (setq group "COC")
 (if (setq fn (getfiled "Select File" (getvar "dwgprefix") "txt" 8))
  (HA fn group)))
(defun HA (fn group / fr line lst1 lst2) 
 (setq fr (open (findfile fn) "r"))
 (while (setq line (read-line fr))
  (if (vl-string-search group line)
   (setq lst2 (append lst2 (list lst1))
         lst1 (list (read (vl-string-trim "\t" (vl-string-trim group line)))))
   (setq lst1 (Rcons (Ptr->L line) lst1))))
 (close fr)
 (cdr (append lst2 (list lst1))))
(defun Rcons (ele lis)
 (reverse (cons ele (reverse lis))))
(defun Ptr->L(ptr)
 (read (strcat "(" ptr ")")))
  • 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
thanhduan2407    227

 

Chúc mừng em đã hoàn thành tác phẩm. Tặng em hàm này, viết trau chuốt hơn, và tốc độ chắc chắn sẽ nhanh hơn các hàm ở trên.

; Doc va sap xep 1 file *.txt thanh 1 list gom cac nhom khac nhau.
(defun C:HA (/ fn group)
 (setq group "COC")
 (if (setq fn (getfiled "Select File" (getvar "dwgprefix") "txt" 8))
  (HA fn group)))
(defun HA (fn group / fr line lst1 lst2) 
 (setq fr (open (findfile fn) "r"))
 (while (setq line (read-line fr))
  (if (vl-string-search group line)
   (setq lst2 (append lst2 (list lst1))
         lst1 (list (read (vl-string-trim "\t" (vl-string-trim group line)))))
   (setq lst1 (Rcons (Ptr->L line) lst1))))
 (close fr)
 (cdr (append lst2 (list lst1))))
(defun Rcons (ele lis)
 (reverse (cons ele (reverse lis))))
(defun Ptr->L(ptr)
 (read (strcat "(" ptr ")")))

Thật tuyệt vời bác ạ! Em cảm ơn bác! Tốc độ rất tuyệt. Mong được học lỏm của bác nhiều hơn nữ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
nhoclangbac    3

Thật tuyệt vời bác ạ! Em cảm ơn bác! Tốc độ rất tuyệt. Mong được học lỏm của bác nhiều hơn nữa. ^^

Nhoc thấy lạ là sao dùng (setq fr (open (findfile fn) "r")) chi cho dài dòng. Sao không chơi luôn (setq fr (open fn "r"))   :P

(open filename mode)

filename : Một chuỗi chỉ định tên và phần mở rộng của các tập tin được mở. Nếu bạn không xác định tên đường dẫn đầy đủ của tập tin, hàm open coi như bạn đang đề cập đến filename tại thư mục bản vẽ AutoCAD mặc định (bản vẽ đang mở).

  • 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
thanhduan2407    227

Thanhduan nên bao cafe cho nhoclangbac đi nhé! Cái tội viết thừa dẫn đến vạ lây cho người khác. <_<

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. 

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
Doan Van Ha    2.676

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
Tr.CongSon    41

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

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

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
Tr.CongSon    41

 

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

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
Tr.CongSon    41

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

(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
Tr.CongSon    41

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
Doan Van Ha    2.676

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

  • 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.CongSon    41

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

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
Tr.CongSon    41

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

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

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

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


×