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

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

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

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.

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

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
Đố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á.

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
Đố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)
)

  • 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

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!

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ấ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)
)

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

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

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.

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

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

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

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

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!

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

×