Đến nội dung


Hình ảnh
- - - - -

Thống kê đối tượng trong bản vẽ!


  • Please log in to reply
12 replies to this topic

#1 bktec84

bktec84

    biết vẽ arc

  • Members
  • PipPip
  • 45 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 15 April 2010 - 12:42 AM

Sau khi tìm kiếm trên diễn đàn về việc thống kê và đếm số đối tượng, cũng như đã từng sử dụng nhiều lần các lệnh qselect lệnh filter; getsel; nhận thấy mỗi phương pháp đều có cái hay của nó, tìm hoài không thấy cái gì có thể làm giúp mình vấn đề sau, lên nhờ các bác viết dùm cái lisp thực hiện yêu cầu: Đếm số đối thượng.
Lisp làm theo trình tự sau:
- Đánh lệnh.
- Chọn đối tượng mẫu: block.
- Xóa block trùng nhau.
- Chọn vùng tìm kiếm.
- hiện thị kết quả: "Số lượng block là: x"
Chú ý: không cần hiển thị trên màn hình dòng kết quả là "Số luợng block là:x" mà chỉ cần hiện thị ở phần trên dòng command thôi. Cảm ơn các anh.
Nếu bác nào có thuật toán hay thì có thể tổng quát lên như sau:
- Chọn đối tượng mẫu.
- Chọn vùng tìm kiếm.
- Xóa đối tượng trùng nhau.
- hiện thị kết quả: "số lượg là:x"
Với điều kiện tìm kiếm là các đối tượng phải giống nhau y hệt. tức là các đối tượng sinh ra từ lệnh copy.
  • 1

#2 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1360 (rất tốt)

Đã gửi 15 April 2010 - 06:54 AM

Sau khi tìm kiếm trên diễn đàn về việc thống kê và đếm số đối tượng, cũng như đã từng sử dụng nhiều lần các lệnh qselect lệnh filter; getsel; nhận thấy mỗi phương pháp đều có cái hay của nó, tìm hoài không thấy cái gì có thể làm giúp mình vấn đề sau, lên nhờ các bác viết dùm cái lisp thực hiện yêu cầu: Đếm số đối thượng.
Lisp làm theo trình tự sau:
- Đánh lệnh.
- Chọn đối tượng mẫu: block.
- Xóa block trùng nhau.
- Chọn vùng tìm kiếm.
- hiện thị kết quả: "Số lượng block là: x"
Chú ý: không cần hiển thị trên màn hình dòng kết quả là "Số luợng block là:x" mà chỉ cần hiện thị ở phần trên dòng command thôi. Cảm ơn các anh.
Nếu bác nào có thuật toán hay thì có thể tổng quát lên như sau:
- Chọn đối tượng mẫu.
- Chọn vùng tìm kiếm.
- Xóa đối tượng trùng nhau.
- hiện thị kết quả: "số lượg là:x"
Với điều kiện tìm kiếm là các đối tượng phải giống nhau y hệt. tức là các đối tượng sinh ra từ lệnh copy.

Đối tượng trùng nhau là 1 vị trí có >2 đối tượng hay cứ đối tượng giống y như mẫu thì xóa?
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#3 bktec84

bktec84

    biết vẽ arc

  • Members
  • PipPip
  • 45 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 15 April 2010 - 08:58 AM

Đối tượng trùng nhau là 1 vị trí có >2 đối tượng hay cứ đối tượng giống y như mẫu thì xóa?

Đối tượng trùng là: 1 vị có > 2 đối tượng giống y như đối tượng mẫu. Những đối tượng khác với đối tượng mẫu nhưng cùng vị trí đó thì không xoá.
  • 0

#4 hoa35ktxd

hoa35ktxd

    biết lệnh move

  • Members
  • PipPipPip
  • 125 Bài viết
Điểm đánh giá: 38 (tàm tạm)

Đã gửi 15 April 2010 - 11:43 PM

Đối tượng trùng là: 1 vị có > 2 đối tượng giống y như đối tượng mẫu. Những đối tượng khác với đối tượng mẫu nhưng cùng vị trí đó thì không xoá.

Bạn thử cái này nhé:
(defun c:BlCount()
(setq BlName (cdr(assoc 2 (entget (car (entsel "\nHay chon Block mau: " )))))
ss (ssget (list (cons 0 "INSERT") (cons 2 BlName)))
Len (sslength ss)
I -1
Count 0
StrPoints ""
Ss_Del (ssadd))
(while (setq Ent (ssname ss (setq I (1+ I))))
(setq StrPoint (strcat (rtos (cadr (assoc 10 (entget ent)))) "-" (rtos (caddr (assoc 10 (entget ent))))))
(if (null (vl-string-search StrPoint StrPoints))
(setq StrPoints (strcat StrPoints ";" StrPoint)
Count (1+ Count))
(setq Ss_del (ssadd Ent ss_del))
)
)
(if (> (sslength ss_Del) 0) (command "Erase" ss_del ""))
(Prompt (strcat "\nSo luong block \"" BlName "\" la: " (rtos count)))
(Princ)
)

  • 2

#5 bktec84

bktec84

    biết vẽ arc

  • Members
  • PipPip
  • 45 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 16 April 2010 - 12:22 AM

Chào anh!
Thực ra lisp của anh đã đáp ứng được nhu cầu của em rồi nhưng qua kiểm tra em nhận thấy một vài ý như sau:
- Lisp thật ra chỉ dựa vào tên của block để nhận dạng chứ không dựa vào các đặc tính khác như: block đã bị quay, hay đã scale lên x lần nào đó... như lúc đầu nói em muốn đếm những đối tượng GIỐNG HỆT như đối tượng mẫu.
- anh có thể mở rộng đếm số đối tượng với yêu cầu trên nhưng đối tượng là line, pline, spline, c, acr được không ah? (ý này theo em hơi khó).
- Anh có thể phát triển dùm em cái lệnh GETSEL trong cad được không? lệnh này chọn toàn bộ đối tượng trong bản vẽ, trong khi em chỉ cần chọn đối tượng trong 1 vùng.
Mong anh sửa dùm cài lisp này và hộ em cái ý thứ 3 nhé. Thank bác lần nữa!
  • 0

#6 hoa35ktxd

hoa35ktxd

    biết lệnh move

  • Members
  • PipPipPip
  • 125 Bài viết
Điểm đánh giá: 38 (tàm tạm)

Đã gửi 16 April 2010 - 01:40 AM

- Tất cả các ý của bạn đều có thể làm được tuy nhiên để làm được thì đòi hỏi phải đầu tư thêm time và rất phức tạp vì phải phân loại Scale, rotatay còn nếu chỉ so sánh với đối tượng mẫu thì chỉ cần thêm vài đoạn mã nữa là ổn, tùy theo yêu cầu cụ thể của bạn bạn hãy chịu khó nghiên cứu và phát triển, code của tôi chưa chắc đã là hay, bạn hãy tìm tòi và tham khảo thêm.
- Lệnh SSGET trong code của tôi là lệnh cho phép bạn chọn theo vùng rồi đó, có phải là chọn tất cả đâu, nếu là tự động chọn tất cả câu lệnh sẽ là thế này:
(ssget "x" (list (cons 0 "INSERT") (cons 2 BlName)))
Còn đây là code so sánh với Block mẫu
(defun c:BlCount ()
(setq BL (entget (car (entsel "\nHay chon Block mau: "))))
(if (not (null BL))
(progn
(prompt "\nChon vung chua cac Block:")
(setq ss (ssget (list (assoc 0 BL)
(assoc 2 BL)
(assoc 41 BL)
(assoc 42 BL)
(assoc 43 BL)
(assoc 50 BL)
)
)
I -1
Count 0
StrPoints ""
Ss_Del (ssadd)
)
)
)
(while (setq Ent (ssname ss (setq I (1+ I))))
(setq EntG (Entget Ent)
StrPoint (strcat (rtos (cadr (assoc 10 EntG)))
"-"
(rtos (caddr (assoc 10 EntG)))
)
)
(if (null (vl-string-search StrPoint StrPoints))
(setq StrPoints (strcat StrPoints ";" StrPoint)
Count (1+ Count)
)
(setq Ss_del (ssadd Ent ss_del))
)
)
(if (> (sslength ss_Del) 0)
(progn
(setq LenDel (sslength ss_del))
(command "Erase" ss_del "")
)
)
(Prompt
(strcat "\nSo luong block \""
(cdr (assoc 2 BL))
"\" la: "
(rtos count)
"\nSo luong Block bi xoa la: "
(rtos Lendel)
)
)
(Princ)
)

  • 0

#7 bktec84

bktec84

    biết vẽ arc

  • Members
  • PipPip
  • 45 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 16 April 2010 - 08:15 AM

Thôi phần đếm block thì bác cứ để em dựa vào code của bác rồi phát triển lên.Thank bác!
Nhưng còn ý 3 của em là em hỏi cái lệnh GETSEL trong cad( mặc định có rồi). chứ không phải hàm SSGET trong code của anh anh đâu. Em muốn anh phát triển lệnh GETSEL trong cad lên vì lệnh này trong cad mặc định là chọn tất cả các đối tượng trong bản vẽ với điều kiện là cùng layer và cùng loại đối tượng. Tuy nhiên nó không cho chọn đối tượng theo vùng, Mong anh phát triên lên hộ em với.
  • 0

#8 bktec84

bktec84

    biết vẽ arc

  • Members
  • PipPip
  • 45 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 16 April 2010 - 08:41 AM

Anh ơi cái code của anh chạy ra bị lỗi như sau:
Command: BLCOUNT
Hay chon Block mau:
Chon vung chua cac Block:
Select objects: Specify opposite corner: 3 found
Select objects:
bad argument type: numberp: nil
Anh kiểm tra lại dùm.
  • 0

#9 bktec84

bktec84

    biết vẽ arc

  • Members
  • PipPip
  • 45 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 16 April 2010 - 08:46 AM

Đây là code của lệnh Getsel mong các anh giúp để có thể chọn đối tượng theo vùng được.
http://www.cadviet.c...es/2/getsel.lsp
  • 0

#10 hoa35ktxd

hoa35ktxd

    biết lệnh move

  • Members
  • PipPipPip
  • 125 Bài viết
Điểm đánh giá: 38 (tàm tạm)

Đã gửi 16 April 2010 - 01:23 PM

Thực sự tôi cũng chưa biết đến chức năng hàm GETSEL bạn đưa ra, vừa đọc 1 lúc chưa hiểu kịp nhưng tôi chỉ thắc về khái niệm "vùng" của bạn.
Theo tôi hiểu bạn muốn liệt kê những block có "hình thù" y xì nhau, code của tôi chưa phân biệt về layer, nếubạn chỉ muốn đếm các tối tượng có cùng layer với đối tượng mẫu bạn chỉ cần sửa
(setq ss (ssget (list (assoc 0 BL)
(assoc 2 BL)
(assoc 41 BL)
(assoc 42 BL)
(assoc 43 BL)
(assoc 50 BL)
)
)
Thành
(setq ss (ssget (list (assoc 0 BL)
(assoc 2 BL)
(assoc 41 BL)
(assoc 42 BL)
(assoc 43 BL)
(assoc 50 BL)
(assoc 8 BL)
)
)
Là Ok.
  • 0

#11 bktec84

bktec84

    biết vẽ arc

  • Members
  • PipPip
  • 45 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 16 April 2010 - 01:35 PM

Em nghi anh nhầm khái niệm HÀM và LỆNH rồi. em nói là lệnh GETSEL trong Express cơ chứ không fải là hàm trong Lisp. còn líp mà anh chỉnh sửa như trên là ok rồi nhưng ý em nói là nó không chạy được. nó chạy đúng đến lúc phân biệt xong đối tượng nhưng không hiên thị được ở kết quả hàm Prin. Mong anh test lại hộ.
  • 0

#12 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 16 April 2010 - 02:18 PM

Em nghi anh nhầm khái niệm HÀM và LỆNH rồi. em nói là lệnh GETSEL trong Express cơ chứ không fải là hàm trong Lisp. còn líp mà anh chỉnh sửa như trên là ok rồi nhưng ý em nói là nó không chạy được. nó chạy đúng đến lúc phân biệt xong đối tượng nhưng không hiên thị được ở kết quả hàm Prin. Mong anh test lại hộ.

Bạn sửa lại code lisp getsel.lsp trong Express như sau :
Mở file getsel.lsp lên :
Command: ai_editcustfile -> gõ ai_editcustfile

Custom File to edit: getsel.lsp -> gõ getsel.lsp

file getsel.lsp hiện lên -> bạn chỉnh sửa :

Sửa : dòng (setq SS (ssget "_X" SSLST))
thành dòng : (setq SS (ssget SSLST))

Sửa : dòng (setq SS (ssget "_X"))
thành dòng : (setq SS (ssget))

Save và đóng file getsel.lsp lại.

Load file Lisp getsel.lsp và sử dụng
Command :(load "getsel.lsp")

Chúc thành công
  • 1

#13 CUONG20051982

CUONG20051982

    biết lệnh extend

  • Members
  • PipPipPip
  • 196 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 08 September 2012 - 12:00 PM

Chào anh!
Thực ra lisp của anh đã đáp ứng được nhu cầu của em rồi nhưng qua kiểm tra em nhận thấy một vài ý như sau:
- Lisp thật ra chỉ dựa vào tên của block để nhận dạng chứ không dựa vào các đặc tính khác như: block đã bị quay, hay đã scale lên x lần nào đó... như lúc đầu nói em muốn đếm những đối tượng GIỐNG HỆT như đối tượng mẫu.
- anh có thể mở rộng đếm số đối tượng với yêu cầu trên nhưng đối tượng là line, pline, spline, c, acr được không ah? (ý này theo em hơi khó).
- Anh có thể phát triển dùm em cái lệnh GETSEL trong cad được không? lệnh này chọn toàn bộ đối tượng trong bản vẽ, trong khi em chỉ cần chọn đối tượng trong 1 vùng.
Mong anh sửa dùm cài lisp này và hộ em cái ý thứ 3 nhé. Thank bác lần nữa!



Bạn nào có thể giải quyết hộ vấn đề trên được không? Mình cũng đang cần cái lisp có thể đếm được tất cả các loại đối tượng có trên bản vẽ. Không chỉ riêng Block. và khi đếm thì các đối tượng nào giống nhau mà nằm đè lên nhau thì xóa bỏ.
Cảm ơn!
  • 0