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

[Yêu cầu] viết lisp thống kê bản vẽ

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

Chào anh gia_bach

Em bị lỗi sắp xếp với hàm vl-sort như bài viết số 19 của em trong topic này :

http://www.cadviet.c...showtopic=16609

Em chưa biết cách giải quyết sao cho trọn vẹn vấn đề này.

Mong anh gia_bach hướng dẫn thêm về thuật toán sắp xếp này. Nếu có thể, anh có thể minh họa cho em một đoạn code nhỏ để em về ngâm cứu thêm ạ. Em đang "bí" đoạn sắp xếp này

Cảm ơn anh rất nhiều laugh.gif

Như Tue_NV đã biết : Hàm vl-sort nó sắp xếp các kí tự chuỗi theo alphabet.

Vậy ý tưởng là đối với các kí tự số. trước khi so sánh ta convert các chuỗi này thành chuỗi có chiều dài bằng nhau bằng cách thêm các kí tự không (zero) phía trước nó.

 

Vd : (setq L (list "1" "2" "10" "11" "12" "98" "99" "100"))

chuyển thành : (setq L (list "001" "002" "010" "011" "012" "098" "099" "100"))

 

hay : (list "KC-1" "KC-2" "KC-10" "KC-12" "KC-105" "KC-200")

chuyển thành : (list "KC-001" "KC-002" "KC-010" "KC-012" "KC-105" "KC-200")

thì hàm vl-sort luôn cho kết quả chính xác.

 

Vấn đề đặt ra : Trong các số đã cho làm sao tìm được số lớn nhất (số có chiều dài lớn nhất) ?

Đây là bài toán liên quan đến chi phí thời gian và độ chính xác.

Nghĩa là khi yêu cầu độ chính xác cao thì chi phí thời gian sẽ tăng tỉ lệ thuận.

Trong bài toán Thống kê bản vẽ, thông thường các số lên đến hàng trăm (hàng ngàn ?).

Như vậy chọn chiều dài là 4 (hàng vạn) có thể chấp nhận được. :cheers:

 

Đây là hàm đổi các chuỗi có kí tự số thành chuỗi có chiều dài bàng nhau (chiều dài của các chuỗi số bằng 4 )

(defun NormalizeNumberInString (str / ch i pat ret count buf)  (setq i 	0	pat   '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9")	ret   ""	count 4 )  (while (/= (setq ch (substr str (setq i (1+ i)) 1)) "")    (if (vl-position ch pat)      (progn	(setq buf ch)	(while (vl-position (setq ch (substr str (setq i (1+ i)) 1)) pat)  	(setq buf (strcat buf ch)))	(while (< (strlen buf) count) (setq buf (strcat "0" buf)))	(setq ret (strcat ret buf))) )    (setq ret (strcat ret ch)) )  ret)

cách sử dụng :

(setq lst (list "KC-1" "KC-2" "KC-10" "KC-12" "KC-105" "KC-200"))

 

(setq lst (vl-sort lst '(lambda (x y) (< (NormalizeNumberInString x) (NormalizeNumberInString y)) ) ) )

 

 

Chào funnyzui và bác Giabach.

Tuy không đọc được mã Lisp trích xuất Block thuộc tính của giabach, nhưng Thiep đoán rằng giabach đã dùng các hàm VL xử lý Table chỉ từ cad2008 mới có. Nếu đúng vậy thì giabach nên dùng các hàm (vlax-method-applicable-p objmethod)

......

Cám ơn thiep đã có góp ý.

Việc sử dụng hàm (vlax-property-available-p) chỉ cho biết là trong trường hợp này hàm đó có sử dụng được hay không.

Nếu không sử dụng được, câu hỏi đặt ra là : Vậy có hàm nào có chức năng tương tự hay không ?

Câu trả lời chỉ có được khi có Cad 2007 đã Install.

 

Đọc hết 2 phần Viết Lisp theo yêu cầu,không khỏi dị ứng với thái độ của bác này...Góp ý toàn kiểu châm chọc,khích bác,so sánh giữa ACA với LISP...Thường thì nên giữ thái độ đó nếu mình làm tốt hơn người ta khi ở cùng 1 địa vị

to : ketxu

Đồng ý với ý kiến của Tue_NV :

Thế đấy, Cuộc đời, nếu không "tranh cãi" thì không thể tiến bộ được

  • 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ám ơn thiep đã có góp ý.

Việc sử dụng hàm (vlax-property-available-p) chỉ cho biết là trong trường hợp này hàm đó có sử dụng được hay không.

Nếu không sử dụng được, câu hỏi đặt ra là : Vậy có hàm nào có chức năng tương tự hay không ?

Câu trả lời chỉ có được khi có Cad 2007 đã Install.

Chào Giabach, vấn đề là để lisp chạy một mạch trơn tru từ đầu đến cuối, khi viết lisp nếu biết các version Cad mới có các lệnh mới thì chúng ta phải dùng các hàm (vlax-method-applicable-p objmethod), (vlax-property-available-p obj prop [check-modify]) cho các version cad cũ vẫn chạy lisp được. Ví dụ: từ cad 2004 mới có hàm addTable, từ cad 2008 mới có hàm RepeatTopLabels, BreakSpacing ... Khi chạy lisp với cad có version cũ, đụng đến hàm không thực hiện được thì sẽ có 1 thông báo cho người dùng biết là người dùng đang sử dụng Cad đời cũ, lisp sẽ chạy tiếp phần còn lại, người viết lisp nên lường trước và có những mã lisp xử lý cho thích hợp để giảm thiểu các tình huống lỗi xảy ra. Vì lisp của Giabach không xử lý trường hợp này nên mới có hiện tượng như Tue_NV nói:

"Các hàm các hàm VL xử lý Table thì đã có từ CAD2006 rồi bác ạ. Có 1 điều mà Tue_NV không thể hiểu nổi là cái Table lại bị "trống rỗng" như tình trạng của funnizui.

Bác có thể giải thích rõ hơn 1 chút nữa về cách làm của bác thể hiện trong Code trên được không? Cảm ơn bác"

funnyzui chạy lisp chỉ đến khi tạo đến table thì dừng đột ngột vì không hiểu các hàm mới lạ.

Là dậy đó... chúc các bạn thành công!

  • 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 Giabach, vấn đề là để lisp chạy một mạch trơn tru từ đầu đến cuối, khi viết lisp nếu biết các version Cad mới có các lệnh mới thì chúng ta phải dùng các hàm (vlax-method-applicable-p objmethod), (vlax-property-available-p obj prop [check-modify]) cho các version cad cũ vẫn chạy lisp được. Ví dụ: từ cad 2004 mới có hàm addTable, từ cad 2008 mới có hàm RepeatTopLabels, BreakSpacing ... Khi chạy lisp với cad có version cũ, đụng đến hàm không thực hiện được thì sẽ có 1 thông báo cho người dùng biết là người dùng đang sử dụng Cad đời cũ, lisp sẽ chạy tiếp phần còn lại, người viết lisp nên lường trước và có những mã lisp xử lý cho thích hợp để giảm thiểu các tình huống lỗi xảy ra. Vì lisp của Giabach không xử lý trường hợp này nên mới có hiện tượng như Tue_NV nói:

"Các hàm các hàm VL xử lý Table thì đã có từ CAD2006 rồi bác ạ. Có 1 điều mà Tue_NV không thể hiểu nổi là cái Table lại bị "trống rỗng" như tình trạng của funnizui.

Bác có thể giải thích rõ hơn 1 chút nữa về cách làm của bác thể hiện trong Code trên được không? Cảm ơn bác"

funnyzui chạy lisp chỉ đến khi tạo đến table thì dừng đột ngột vì không hiểu các hàm mới lạ.

Là dậy đó... chúc các bạn thành công!

" ... đụng đến hàm không thực hiện được thì sẽ có 1 thông báo cho người dùng biết là người dùng đang sử dụng Cad đời cũ, lisp sẽ chạy tiếp phần còn lại, ..."

Chạy tiếp phần còn lại để làm gì ?

Viết LISP tạo bảng mà "cái Table lại bị trống rỗng" thì vứt LISP đi cho rồi, để làm chi ?

 

Có lẽ cách tốt nhất là ngay từ đầu, kiểm tra và thông báo :

LISP này không chạy được với CAD 2006, 2007 ....

Bạn muốn sài thì nâng cấp lên cad2008 hay 2010.

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
" ... đụng đến hàm không thực hiện được thì sẽ có 1 thông báo cho người dùng biết là người dùng đang sử dụng Cad đời cũ, lisp sẽ chạy tiếp phần còn lại, ..."

Chạy tiếp phần còn lại để làm gì ?

Viết LISP tạo bảng mà "cái Table lại bị trống rỗng" thì vứt LISP đi cho rồi, để làm chi ?

 

Có lẽ cách tốt nhất là ngay từ đầu, kiểm tra và thông báo :

LISP này không chạy được với CAD 2006, 2007 ....

Bạn muốn sài thì nâng cấp lên cad2008 hay 2010.

Không đâu bác Giabach ạ, bác đừng có nóng vội, nếu bỏ các hàm xử lý table mà Cad 2007 không có, hoặc "rào" thêm các hàm (vlax-method-applicable-p objmethod), (vlax-property-available-p obj prop [check-modify]) như Thiep nói, thì Cad 2007 vẫn tạo ra table có data. Bác cứ thử xem! cái Table không bị trống rỗng đâ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

Mấy hôm nay có dịp xài Lisp Thống kê bản vẽ của gia_bach để làm mục lục bàn vẽ cho các Bộ môn

Phải nói rằng Lisp rất hợp thời, chạy rất ổn.

 

Một yêu cầu nhỏ nữa thôi nhờ gia-bach chỉnh sửa

Đó là: Có thể tắt Form giới thiệu ban đầu khi load lênh ExBlk.VLX được k?

Vì mỗi lần mở CAD thì nó hiện ra không cần thiết.

 

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
Yêu cầu này thực hiện lâu rồi.

trinhvqh sử dụng link ở bài 125 : http://www.cadviet.com/forum/index.php?sho...ost&p=96140

Chào các bác , em là thành viên mới , em có sử dụng Lisp thống kê bản vẽ của bác Gia Bạch nhưng không hiểu sao Lisp của bác cứ chạy được 1 thời gian thì lại mất tác dụng ( cụ thể : khi dùng lệnh : Exblk thì có hiện bảng chọn thuộc tính lên , sau khi chọn xong , nhấp OK thì không thấy có tác dụng gì hết . Em đã thử lại trên những bản vẽ đã thống kê đều không dùng được nữa ) . Lấy lisp đó sang máy khác thì xài được nhưng 1 thời gian thì lại hết ( giống như bác Gia bạch set thời gian , số lần sử dụng vậy ) . Có ai bị trường hợp này chưa hướng dẫn em với , Thanks . :iluvyousmiley:

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 bác , em là thành viên mới , em có sử dụng Lisp thống kê bản vẽ của bác Gia Bạch nhưng không hiểu sao Lisp của bác cứ chạy được 1 thời gian thì lại mất tác dụng ( cụ thể : khi dùng lệnh : Exblk thì có hiện bảng chọn thuộc tính lên , sau khi chọn xong , nhấp OK thì không thấy có tác dụng gì hết . Em đã thử lại trên những bản vẽ đã thống kê đều không dùng được nữa ) . Lấy lisp đó sang máy khác thì xài được nhưng 1 thời gian thì lại hết ( giống như bác Gia bạch set thời gian , số lần sử dụng vậy ) . Có ai bị trường hợp này chưa hướng dẫn em với , Thanks . :iluvyousmiley:

Có thể có một bài hướng dẫn sử dụng lisp này thì hay, mình copy về mà ko biết dùng như thế nào cho chuẩn 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
Yêu cầu này thực hiện lâu rồi.

trinhvqh sử dụng link ở bài 125 : http://www.cadviet.com/forum/index.php?sho...ost&p=96140

Cảm ơn bác Gia_bach.

Lisp của bác rất hữu ích Nhưng em vẫn chưa sử dụng được.

Em có thể "ghi ra file" nhưng không "tạo bảng" được

Rất mong các anh trên diễn đàn hướng dẫn và sửa lỗi

 

bao_bang.jpg

sau khi bấm vào "tao bang" thì không ra bả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
Cảm ơn bác Gia_bach.

Lisp của bác rất hữu ích Nhưng em vẫn chưa sử dụng được.

Em có thể "ghi ra file" nhưng không "tạo bảng" được

Rất mong các anh trên diễn đàn hướng dẫn và sửa lỗi

 

bao_bang.jpg

sau khi bấm vào "tao bang" thì không ra bảng

Thanks

Hề hề hề,

Có nhẽ cái CAD của bạn đang xài không có phần hỗ trợ tạo bảng chăng??? Bạn xài CAD nào và đã cài Express Tool chưa hè????

  • 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
Hề hề hề,

Có nhẽ cái CAD của bạn đang xài không có phần hỗ trợ tạo bảng chăng??? Bạn xài CAD nào và đã cài Express Tool chưa hè????

Ước gì có thể tặng bác "more than a thank you" thật vinh dự được bác giúp 2 topic liền

1. Cad của em 2007 và 2011 đều không tạo bảng và đã sử dụng được thống kê block (tạo bảng) của bac Gia_bach http://www.cadviet.com/forum/index.php?sho...amp;#entry94041

2. Sau khi dùng một số lisp như inan, thống kê... thì lisp không có tác dụng nữa >>> phải ghost lại máy.

3. giờ thì em dùng vacxin của anh Nguyen Hoanh http://www.cadviet.com/forum/index.php?sho...mp;#entry102588

 

Nhờ các cao thủ bắt bệ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
Chào newmember, nguoi_tho_mo.

Cám ơn các bạn đã sử dụng và góp ý.

Lisp thống kê bản vẽ đang có vấn đề ! <_<

Sẽ Update trong thời gian sớm nhất.

Cám ơn bác gia_bach đã quan tâm tới lỗi của em.

Rất mong bác sớm hoàn thiện phục vụ cho bà con nông dân như em

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 Giabach, vấn đề là để lisp chạy một mạch trơn tru từ đầu đến cuối, khi viết lisp nếu biết các version Cad mới có các lệnh mới thì chúng ta phải dùng các hàm (vlax-method-applicable-p objmethod), (vlax-property-available-p obj prop [check-modify]) cho các version cad cũ vẫn chạy lisp được. Ví dụ: từ cad 2004 mới có hàm addTable, từ cad 2008 mới có hàm RepeatTopLabels, BreakSpacing ... Khi chạy lisp với cad có version cũ, đụng đến hàm không thực hiện được thì sẽ có 1 thông báo cho người dùng biết là người dùng đang sử dụng Cad đời cũ, lisp sẽ chạy tiếp phần còn lại, người viết lisp nên lường trước và có những mã lisp xử lý cho thích hợp để giảm thiểu các tình huống lỗi xảy ra. ............
Chào thiep

Vấn đề ở Cad 2007 là do hàm vla-MergeCells :

- Cad 2007 bị lỗi khi gọi (vla-MergeCells TblObj 0 0 0 col)

 

- khắc phục bằng cách bẫy lỗi :

(vl-catch-all-error-p (vl-catch-all-apply (function(lambda () (vla-MergeCells TblObj 0 0 0 col)) )))

Cám ơn nhiều.

 

Chào newmember, nguoi_tho_mo.

Cám ơn các bạn đã sử dụng và góp ý.

Lisp thống kê bản vẽ đang có vấn đề ! <_<

Sẽ Update trong thời gian sớm nhất.

Update Lisp thống kê bản vẽ

(fix lỗi trong CAD 2007)

  • 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

Theo ý tại hạ thì nên gộp chung các lệnh về thống kê thành một lệnh

Khi thực hiện lệnh Thongke thì hiện ra Form trong đó có nhiều Tab để người dùng lựa chọn

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

Vấn đề ở Cad 2007 là do hàm vla-MergeCells :

- Cad 2007 bị lỗi khi gọi (vla-MergeCells TblObj 0 0 0 col)

 

- khắc phục bằng cách bẫy lỗi :

(vl-catch-all-error-p (vl-catch-all-apply (function(lambda () (vla-MergeCells TblObj 0 0 0 col)) )))

Cám ơn nhiều.

Update Lisp thống kê bản vẽ

(fix lỗi trong CAD 2007)

 

link download here

 

Em vừa dùng thử trên cad 2007 thì không tạo đc bảng bác ạ. ấn tạo bảng nó không hiện lên gì cả.Khi dùng trên 2008 thì tốt nhưng sao e đã để font mặc định là font của các tag cần thống kê mà nó vẫn lỗi font. phải vào bảng chỉnh lại font thì nó mới ra đúng. Thank

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 vừa dùng thử trên cad 2007 thì không tạo đc bảng bác ạ. ấn tạo bảng nó không hiện lên gì cả.Khi dùng trên 2008 thì tốt nhưng sao e đã để font mặc định là font của các tag cần thống kê mà nó vẫn lỗi font. phải vào bảng chỉnh lại font thì nó mới ra đúng. Thank

Hiện giờ tôi không có cad 2007 nên không biết chính xác lỗi đuợc. Hôm qua tôi đã thử chạy trên cad 2007 thì đuợc.

 

nguyentuyen6 thử chạy lại với file cad "Drawing List.dwg" trong file đính kèm, nhớ để TableStyle hiện hành là CadViet, sau khi chạy xong mới đổi TableStyle xem sao ?

(nhiều khả năng là do lỗi này ?)

  • 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
Theo ý tại hạ thì nên gộp chung các lệnh về thống kê thành một lệnh

Khi thực hiện lệnh Thongke thì hiện ra Form trong đó có nhiều Tab để người dùng lựa chọn

Cám ơn góp ý của trinhvqh.

Form trong đó có nhiều Tab : hiện nay tôi chưa biết cách làm trong LISP ! <_<

Khi nào rảnh rỗi chuyển qua AutoCad .NET may ra ...

hãy đợi đấy ...

  • 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
Hiện giờ tôi không có cad 2007 nên không biết chính xác lỗi đuợc. Hôm qua tôi đã thử chạy trên cad 2007 thì đuợc.

 

nguyentuyen6 thử chạy lại với file cad "Drawing List.dwg" trong file đính kèm, nhớ để TableStyle hiện hành là CadViet, sau khi chạy xong mới đổi TableStyle xem sao ?

(nhiều khả năng là do lỗi này ?)

 

Hì !!! chào bác gia_bach. em vừa thử lại thì lại chạy ngon bác ạ. Còn vụ font thì phải vào trong TableStyle chỉnh thì nó mới đúng. Cảm ơn bác nhiều lắ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

chương trình thống kê bản vẽ đã hết thời gian sử dụng, bác Gia_bach có thể gửi lại chương trình này được không vậy, thanks 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

Chiến trường đã tan, em trở về với việc nhà bề bộn. Xin lỗi bác vì chưa trả lời được bác sớm.

Đây là đoạn Code ví dụ về Link giữa 2 thuộc tính của Block (lấy chính từ lisp này)

(defun C:LGT (/ obn Tkq)
(setq obn (vlax-ename->vla-object (car (nentsel "\nChon doi tuong nguon")))
			obd	(vlax-ename->vla-object (car (nentsel "\nChon text dich")))
			Tkq	(strcat "%<\\AcObjProp Object(%<\\_ObjId "
									(rtos (vla-get-objectid obn) 2 0)
									">%).TextString>%"
					)
)
(vla-put-textstring obd Tkq)
(vla-update obd)
(vl-cmdf "regen")
(princ)
)

Lisp này rất hay, nataca có thể áp dụng để link giá trị block thuộc tích bằng cách cộng, trừ, nhân, chia với 1 giá trị được không?

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

Update Lisp thống kê bản vẽ

 

link download here password : cadviet.com

Nhờ bác gia_bach nhắc lại điều kiện sử dụng giúp em với.

Có bản vẽ em dùng thoải mái, có bản vẽ báo

** Error: bad argument type: lselsetp nil **,

mà code không ngó được nên em gần như mù tịt ^^ (các bản vẽ đều có khung ATT Block ạ )

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

Dạo này bận quá nên ít vào CadViet.

Vì không có "vật chứng" nên anh cũng không rõ tại sao?!

Em gửi file bị lỗi xem sao ?

File đó đây anh ạ. Em đã tìm ra thằng gây lỗi, là cái block trong khung duy nhất có nội dung ở Chi tiết sàn (mà em để lại). Chỉ cần xóa thằng này đi thì lại xài vô tư ^^

http://www.cadviet.com/upfiles/3/pack_kc_nha_58a_gui_a_gia_bach.rar

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

 

File đó đây anh ạ. Em đã tìm ra thằng gây lỗi, là cái block trong khung duy nhất có nội dung ở Chi tiết sàn (mà em để lại). Chỉ cần xóa thằng này đi thì lại xài vô tư ^^
http://www.cadviet.c..._a_gia_bach.rar

Lisp bị lỗi với Anonymous blocks.
 
  • 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

×