Chuyển đến nội dung
Diễn đàn CADViet
mr.thanh2610

[NHỜ CHỈNH SỬA] Về vấn đề lisp chọn đối tượng theo màu

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

Tình hình mình đang gặp một vấn đề về chọn đối tượng theo màu, em có sưu tầm một Lisp của bác Doan Van Ha nhưng gặp một số vấn đề:

1.Lisp chỉ chọn một số màu cơ bản còn một số màu khác chọn thì báo lỗi (hình đính kèm)

2.Em muốn quét chọn xong thì có thể chọn luôn đối tượng có thế copy, move... (chứ lisp này muốn copy thì phải dùng thêm lệnh copy và tham số P) hơi lâu 1 tí  ^_^

Nhờ anh, chị em nào sửa giúp mình với nhé, xin cảm ơn nhiều 

P/S: mình dỡ mấy cái món này nên nhờ vả anh em hoài ngại quá :)

(defun c:ha () (setq ss (ssget (list (assoc 62 (entget (car (entsel "\nDoi tuong mau :"))))))))

 

Capture.PNG

  • Vote giảm 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
3 giờ trước, mr.thanh2610 đã nói:

Tình hình mình đang gặp một vấn đề về chọn đối tượng theo màu, em có sưu tầm một Lisp của bác Doan Van Ha nhưng gặp một số vấn đề:

1.Lisp chỉ chọn một số màu cơ bản còn một số màu khác chọn thì báo lỗi (hình đính kèm)

2.Em muốn quét chọn xong thì có thể chọn luôn đối tượng có thế copy, move... (chứ lisp này muốn copy thì phải dùng thêm lệnh copy và tham số P) hơi lâu 1 tí  ^_^

Nhờ anh, chị em nào sửa giúp mình với nhé, xin cảm ơn nhiều 

P/S: mình dỡ mấy cái món này nên nhờ vả anh em hoài ngại quá :)


(defun c:ha () (setq ss (ssget (list (assoc 62 (entget (car (entsel "\nDoi tuong mau :"))))))))

+ Sửa lại code theo yêu cầu của bạn ở mục chọn đối tượng :

+ Code chỉ áp dụng cho đối tượng theo màu cố định , chứ không chọn theo màu "By Layer". Bạn cần phân biệt điều này.

(defun c:ha ( / lst1 lst2)
  (setq lst1 (acet-ss-to-list (ssget (list (assoc 62 (entget (car (entsel "\nDoi tuong mau :"))))))))
  (setq lst2 (ssadd))
  (foreach name lst1 (ssadd name lst2))
  (sssetfirst nil lst2))

  • Vote tăng 1
  • Vote giảm 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
3 giờ trước, Danh Cong đã nói:

+ Sửa lại code theo yêu cầu của bạn ở mục chọn đối tượng :

+ Code chỉ áp dụng cho đối tượng theo màu cố định , chứ không chọn theo màu "By Layer". Bạn cần phân biệt điều này.

(defun c:ha ( / lst1 lst2)
  (setq lst1 (acet-ss-to-list (ssget (list (assoc 62 (entget (car (entsel "\nDoi tuong mau :"))))))))
  (setq lst2 (ssadd))
  (foreach name lst1 (ssadd name lst2))
  (sssetfirst nil lst2))

Cảm ơn bạn đã giúp đỡ, thì ra vấn đề mình hiểu chưa tới là lỗi không chọn được do là màu By layer, thế bạn chỉnh giúp mình chọn màu theo By layer luôn được không, xin cảm ơn

  • Vote giảm 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

lâu rùi ko vọc vạch lsp, bạn xem thử ^^

(defun c:ha ( / lst1 lst2 clr cly)
(setq ent (car (entsel "\nDoi tuong mau :")))
(if ent
	(progn
		(setq clr (cdr (assoc 62 (entget ent))))
		(setq cly (cdr (assoc 8 (entget ent))))
		(if clr
			(progn
				(setq lst1 (acet-ss-to-list (ssget "x" (list (cons 62 clr)))))
				(setq lst2 (ssadd))
				(foreach name lst1 (ssadd name lst2))
				(sssetfirst nil lst2)
			)
			(progn	
				(setq lst1 (acet-ss-to-list (ssget "x" (list (cons 8 cly)))))
				(setq lst2 (ssadd))
				(foreach name lst1 (ssadd name lst2))
				(sssetfirst nil lst2)
			)
		)
	)
)	
(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
17 giờ trước, mr.thanh2610 đã nói:

Cảm ơn bạn đã giúp đỡ, thì ra vấn đề mình hiểu chưa tới là lỗi không chọn được do là màu By layer, thế bạn chỉnh giúp mình chọn màu theo By layer luôn được không, xin cảm ơn

+ Chỉ thêm 1 câu: Lọc đối tượng theo màu của "By Layer" sẽ làm bài toán khó gấp vài lần lên , chứ không hề đơn giản như bạn nghĩ nữa đâu.

Ví dụ: Bạn muốn lọc các đối tượng có màu là "1". Sẽ có 2 trường hợp sảy ra:

TH1: Đối tượng có màu là 1  --> Đã giải quyết.

TH2: Đối tượng có màu thuộc layer bất kỳ , và layer này có màu là 1.

          B2.1  ---> Phải lọc toàn bộ danh sách Layer có trong bản vẽ, xem có Layer nào có màu là 1 hay không. Tạo ra 1 danh sách Layer kiểm tra.

          B2.2  ---> Xét 1 loạt các đối tượng chọn: Xem nó có thuộc danh sách layer kiểm tra này không, và có màu là "By layer" không. vv....

 

---> Giờ mình đang bận bịu việc khác, nên không giúp cho bạn được.

Nếu danh sách layer của bạn ít, làm thủ công được thì giải quyết bằng công cụ "Filter" trong Cad cũng được. Không thì ngồi mài răng chờ bác bào rảnh rỗi viết cho bạ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
1 giờ trước, Danh Cong đã nói:

+ Chỉ thêm 1 câu: Lọc đối tượng theo màu của "By Layer" sẽ làm bài toán khó gấp vài lần lên , chứ không hề đơn giản như bạn nghĩ nữa đâu.

Ví dụ: Bạn muốn lọc các đối tượng có màu là "1". Sẽ có 2 trường hợp sảy ra:

TH1: Đối tượng có màu là 1  --> Đã giải quyết.

TH2: Đối tượng có màu thuộc layer bất kỳ , và layer này có màu là 1.

          B2.1  ---> Phải lọc toàn bộ danh sách Layer có trong bản vẽ, xem có Layer nào có màu là 1 hay không. Tạo ra 1 danh sách Layer kiểm tra.

          B2.2  ---> Xét 1 loạt các đối tượng chọn: Xem nó có thuộc danh sách layer kiểm tra này không, và có màu là "By layer" không. vv....

 

---> Giờ mình đang bận bịu việc khác, nên không giúp cho bạn được.

Nếu danh sách layer của bạn ít, làm thủ công được thì giải quyết bằng công cụ "Filter" trong Cad cũng được. Không thì ngồi mài răng chờ bác bào rảnh rỗi viết cho bạn. 

ây cũng lòng vòng nhỉ, thôi dù sao cũng cảm ơn bạn, chắc mài mòn răng đợi cao nhân thôi :)

  • Vote giảm 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ọn theo bylayer của bạn nó hơi rộng mình hiểu vậy, bạn nên đặt trường hợp hay ví dụ củ thể để dễ hình dung, theo ý của anh Mod trình bày mình hiểu nôm na là dựa trên màu của đối tượng đc chọn  làm mẫu đầu tiên không cần biết có đúng màu chính chủ không, sau đó quét vùng đối tượng rồi lọc ra highlight các đối tượng có màu giống đối tượng mẫu, bạn chạy thử, lâu rùi ko viết code nên  biến đặt nó hơi lung tung ^^

(defun c:ha ( / lst1 lst2 clr cly ss2 ds_ent ds_ent2 ds_ent3 mau mau2 mau_lay_goc ds_ent2_1 ds_ent5 ds_ent4)
(setq ent (car (entsel "\nDoi tuong mau :")))
(if ent
	(progn
		(setq clr (cdr (assoc 62 (entget ent))))
		(setq cly (cdr (assoc 8 (entget ent))))
		(if clr
			(progn
				(setq lst1 (acet-ss-to-list (ssget "x" (list (cons 62 clr)))))
				(setq lst2 (ssadd))
				(foreach name lst1 (ssadd name lst2))
				(sssetfirst nil lst2)
			)
			(progn
				(setq mau_lay_goc (vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) cly)))
			;----------------------------------------------------------------------------------------------------------------------
				(prompt "chon vung: ")
				(setq ss2 (ssget))
				(if ss2 
						(progn
							(setq ds_ent (ss2ent ss2)) 
							;(setq ds_lay_chon (mapcar '(lambda (x) (cdr (assoc 8 (entget x)))) ds_ent))
							(foreach k ds_ent
								(setq mau (cdr (assoc 62 (entget k ))))
								(if (= mau nil) (setq ds_ent2 (append (list k) ds_ent2))   (setq ds_ent2_1 (append (list k) ds_ent2_1))  ) 
							)
							;--------------------
							(foreach k ds_ent2 
								(setq mau2 (vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) (cdr (assoc 8 (entget k )))  )))
								(if (= mau2  mau_lay_goc) (setq ds_ent3 (append (list k) ds_ent3)))
							)
							;---------------------------------------------------------------
							(foreach k ds_ent2_1 (setq mau4 (cdr (assoc 62 (entget k ))))
								(if (= mau4 mau_lay_goc) (setq ds_ent4 (append (list k) ds_ent4)))
							)
							;----------------------------------------------------------
							(setq ds_ent5 (append ds_ent3 ds_ent4))	
							;------------------------------------------------------------
							(setq lst2 (ssadd))
							(foreach name ds_ent5 (ssadd name lst2))
							(sssetfirst nil lst2)
						)
				)			
			);end progn clr
		); end if clr
	);end progn ent
)	
(princ)
			
)
(defun ss2ent (ss / i Le e);;;Convert ss to list of ename
(setq i 0)
(repeat (sslength ss)
(setq e (ssname ss i)
Le (append Le (list e))
i (1+ i)    ))
Le)
;===============

-bạn copy them code phần dưới vô code trên mình copy thiếu ^^

Chỉnh sửa theo nhoclangbat
thiếu chút hihi
  • 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ình như hơi đi xa quá.

(defun c:ha(/ en)  (sssetfirst nil (ssget (list (cond ((assoc 420 (setq en (entget(car(entsel  "\nDoi tuong mau :")))))) ((assoc 62 en)) ((cons 62 256)))))))

 

  • 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
52 phút trước, ngokiet đã nói:

Hình như hơi đi xa quá.


(defun c:ha(/ en)  (sssetfirst nil (ssget (list (cond ((assoc 420 (setq en (entget(car(entsel)))))) ((assoc 62 en)) ((cons 62 256)))))))

+ Bình luận tí cho xôm xôm gia đình thôi bác ơi ^^. Mà code bác tương đương bác #Nhoclangbat mà :)

+ Mà hỏi dại bác tí. (assoc 420) trả về gì vậy ạ. Em chưa làm với mấy số to to này bao giờ :v

 

  • Vote tăng 1
  • Vote giảm 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
2 phút trước, Danh Cong đã nói:

+ Bình luận tí cho xôm xôm gia đình thôi bác ơi ^^. Mà code bác tương đương bác #Nhoclangbat mà :)

+ Mà hỏi dại bác tí. (assoc 420) trả về gì vậy ạ. Em chưa làm với mấy số to to này bao giờ :v

 

Code 420 là truecolor. code 62 là màu 0..256 - 0 ByBlock, 256 là Bylayer. Nhưng 256 chỉ dùng cho ssget. entget không đọc được.

Mình nghĩ là chọn theo màu thôi. Nếu bylayer thì cái nào bylayer thì chọn thôi. Màu của layer không quan trọng.

  • Like 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 code bác #ngokiet thì chắc bỏ qua bước chọn đối tượng mẫu, quét thẳng phát lọc ra thằng nào bylayer thì chọn không phải thì nó tự loại ra mất tiêu rù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
50 phút trước, nhoclangbat đã nói:

- theo code bác #ngokiet thì chắc bỏ qua bước chọn đối tượng mẫu, quét thẳng phát lọc ra thằng nào bylayer thì chọn không phải thì nó tự loại ra mất tiêu rùi ^^

Sorry mỉnh quên thêm "\nDoi tuong mau :". Mình sửa lại rồ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
12 giờ trước, nhoclangbat đã nói:

-ý chọn theo bylayer của bạn nó hơi rộng mình hiểu vậy, bạn nên đặt trường hợp hay ví dụ củ thể để dễ hình dung, theo ý của anh Mod trình bày mình hiểu nôm na là dựa trên màu của đối tượng đc chọn  làm mẫu đầu tiên không cần biết có đúng màu chính chủ không, sau đó quét vùng đối tượng rồi lọc ra highlight các đối tượng có màu giống đối tượng mẫu, bạn chạy thử, lâu rùi ko viết code nên  biến đặt nó hơi lung tung ^^


(defun c:ha ( / lst1 lst2 clr cly ss2 ds_ent ds_ent2 ds_ent3 mau mau2 mau_lay_goc ds_ent2_1 ds_ent5 ds_ent4)
(setq ent (car (entsel "\nDoi tuong mau :")))
(if ent
	(progn
		(setq clr (cdr (assoc 62 (entget ent))))
		(setq cly (cdr (assoc 8 (entget ent))))
		(if clr
			(progn
				(setq lst1 (acet-ss-to-list (ssget "x" (list (cons 62 clr)))))
				(setq lst2 (ssadd))
				(foreach name lst1 (ssadd name lst2))
				(sssetfirst nil lst2)
			)
			(progn
				(setq mau_lay_goc (vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) cly)))
;----------------------------------------------------------------------------------------------------------------------
				(prompt "chon vung: ")
				(setq ss2 (ssget))
				(if ss2 
						(progn
							(setq ds_ent (ss2ent ss2)) 
;(setq ds_lay_chon (mapcar '(lambda (x) (cdr (assoc 8 (entget x)))) ds_ent))
							(foreach k ds_ent
								(setq mau (cdr (assoc 62 (entget k ))))
								(if (= mau nil) (setq ds_ent2 (append (list k) ds_ent2))   (setq ds_ent2_1 (append (list k) ds_ent2_1))  ) 
							)
;--------------------
							(foreach k ds_ent2 
								(setq mau2 (vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) (cdr (assoc 8 (entget k )))  )))
								(if (= mau2  mau_lay_goc) (setq ds_ent3 (append (list k) ds_ent3)))
							)
;---------------------------------------------------------------
							(foreach k ds_ent2_1 (setq mau4 (cdr (assoc 62 (entget k ))))
								(if (= mau4 mau_lay_goc) (setq ds_ent4 (append (list k) ds_ent4)))
							)
;----------------------------------------------------------
							(setq ds_ent5 (append ds_ent3 ds_ent4))	
;------------------------------------------------------------
							(setq lst2 (ssadd))
							(foreach name ds_ent5 (ssadd name lst2))
							(sssetfirst nil lst2)
						)
				)			
			);end progn clr
		); end if clr
	);end progn ent
)	
(princ)
			
)
  • cadvietlisp.lsp
    lisp help
  •  

(defun ss2ent (ss / i Le e);;;Convert ss to list of ename
(setq i 0)
(repeat (sslength ss)
(setq e (ssname ss i)
Le (append Le (list e))
i (1+ i)    ))
Le)
;===============

-bạn copy them code phần dưới vô code trên mình copy thiếu ^^

Cảm ơn bạn, nhoclangbat

Trường hợp 1:Theo mình thử thì thấy lisp của bạn hay ở chỗ chọn được tất cả màu theo bylayer khi chọn đối tượng mẫu và quét vùng chọn(còn đối tượng màu cố định, tự đặt thì không chọn).

Trường hợp 2:Còn phần chọn theo màu cố định thì chọn đối tượng mẫu thì nó tự chọn hết luôn (hơi bất tiện) thì cái này theo mình cái Lisp của anh Doan Van Ha làm tốt cái này (bạn có thể chỉnh theo của anh Ha giúp mình với)

Trường hợp 3:Mình góp ý thêm 1 trường hợp này là chọn đối tượng có 1 màu không phân biệt màu cố định hay by layer đều chọn được hết.

Góp ý: theo ý tưởng của mình thì gõ lệnh xuất hiện danh sách chọn 1.chọn đối tượng theo màu By layer, 2. Chọn đối tượng theo màu cố định, 3.Chọn đối tượng theo cả 2 ....

Mình văn chương hơi dỡ nên có gì anh em thông cảm nhé...!

Xin cảm ơn tất cả anh em đã nhiệt tình giúp đỡ

11 giờ trước, ngokiet đã nói:

Hình như hơi đi xa quá.


(defun c:ha(/ en)  (sssetfirst nil (ssget (list (cond ((assoc 420 (setq en (entget(car(entsel  "\nDoi tuong mau :")))))) ((assoc 62 en)) ((cons 62 256)))))))

 

Cảm ơn bạn, ngokiet

Minh thử lisp của bạn thì trường hợp chọn màu cố định thì tốt, còn chọn màu By layer thì mình thấy nó chọn tất cả đối tượng màu là by layer, ý của mình giống theo lisp của bác nhoclangbat

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 cách hiểu dân dã của mình thì 3 trường của bạn có thể gôm làm 1, chủ yếu thằng mẫu đầu tiên nó mang màu đang hiển thị là gì thì vùng chọn sẽ lọc tất cả đối tượng có màu đó ko quan tâm bylayer hay tùy chọn chỉ cần màu nó đang hiển thị giống màu mẫu ban đầu chọn ^^, code thử vội đi ngoại nghiệp

(defun c:ha ( / lst1 lst2 clr cly ss2 ds_ent ds_ent2 ds_ent3 mau mau2 mau_lay_goc ds_ent2_1 ds_ent5 ds_ent4)
(setq ds_layer (K:dsbg "layer"))
(setq ent (car (entsel "\nDoi tuong mau :")))
(if ent
	(progn
		(setq clr (cdr (assoc 62 (entget ent))))
		(setq cly (cdr (assoc 8 (entget ent))))
		(if clr
			(progn
			    (prompt "chon vung: ")
				(setq lst1 (acet-ss-to-list (ssget "x" (list (cons 62 clr)))))
				(setq lst2 (ssadd))
				(foreach name lst1 (ssadd name lst2))
				(sssetfirst nil lst2)
			)
			(progn
				(setq mau_lay_goc (vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) cly)))
			;----------------------------------------------------------------------------------------------------------------------
				(prompt "chon vung: ")
				(setq ss2 (ssget))
				(if ss2 
						(progn
							(setq ds_ent (ss2ent ss2)) 
							;(setq ds_lay_chon (mapcar '(lambda (x) (cdr (assoc 8 (entget x)))) ds_ent))
							(foreach k ds_ent
								(setq mau (cdr (assoc 62 (entget k ))))
								(if (= mau nil) (setq ds_ent2 (append (list k) ds_ent2))   (setq ds_ent2_1 (append (list k) ds_ent2_1))  ) 
							)
							;--------------------
							(foreach k ds_ent2 
								(setq mau2 (vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) (cdr (assoc 8 (entget k )))  )))
								(if (= mau2  mau_lay_goc) (setq ds_ent3 (append (list k) ds_ent3)))
							)
							;---------------------------------------------------------------
							(foreach k ds_ent2_1 (setq mau4 (cdr (assoc 62 (entget k ))))
								(if (= mau4 mau_lay_goc) (setq ds_ent4 (append (list k) ds_ent4)))
							)
							;----------------------------------------------------------
							(setq ds_ent5 (append ds_ent3 ds_ent4))	
							;------------------------------------------------------------
							(setq lst2 (ssadd))
							(foreach name ds_ent5 (ssadd name lst2))
							(sssetfirst nil lst2)
						)
				)			
			);end progn clr
		); end if clr
	);end progn ent
)	
(princ)
			
)

 
;1- ham lay ten cac phan tu trong 1 tab
(defun K:dsbg (table / lst phu)
(tblnext table t)
(while (setq phu (tblnext table nil))
(setq lst (cons (cdr (assoc 2 phu)) lst))
)
)
;=========================================
;==================
(defun ss2ent (ss / i Le e);;;Convert ss to list of ename
(setq i 0)
(repeat (sslength ss)
(setq e (ssname ss i)
Le (append Le (list e))
i (1+ i)    ))
Le)
;=====================================================================================================================
(defun c:ha2 ( / lst1 lst2 clr cly ss2 ds_ent ds_ent2 ds_ent3 mau mau2 mau_lay_goc ds_ent2_1 ds_ent5 ds_ent4 ds_ss_new clr_ex lay_k ds_ss clr_k)
(setq ent (car (entsel "\nDoi tuong mau :")))
(if ent
(progn
	(setq cly (cdr (assoc 8 (entget ent))))
	(setq clr_ex (if (= (setq clr (cdr (assoc 62 (entget ent)))) nil) 
					(vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) cly)) clr)) 
;---------------------------------------------------------------------------
	(prompt "chon vung: ")
	(setq ss2 (ssget))
	(if ss2 
		(progn
			(setq ds_ss (ss2ent ss2))
			(foreach k ds_ss
				(setq lay_k (cdr (assoc 8 (entget k))))
				(setq clr_k (if (= (setq clr1 (cdr (assoc 62 (entget k)))) nil) 
					(vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) lay_k)) clr1))
			;-------------------------------------------------------------------------------
				(if (= clr_k clr_ex)
					(setq ds_ss_new (append (list k) ds_ss_new))
				)
			)
			(setq lst2 (ssadd))
			(foreach name ds_ss_new (ssadd name lst2))
			(sssetfirst nil lst2)
		)
	);end if ss2
);end pron
);end if ent
(princ)
)










lệnh ha2

  • 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
1 giờ} trướ}c, nhoclangbat đã nói:

-theo cách hiểu dân dã của mình thì 3 trường của bạn có thể gôm làm 1, chủ yếu thằng mẫu đầu tiên nó mang màu đang hiển thị là gì thì vùng chọn sẽ lọc tất cả đối tượng có màu đó ko quan tâm bylayer hay tùy chọn chỉ cần màu nó đang hiển thị giống màu mẫu ban đầu chọn ^^, code thử vội đi ngoại nghiệp


(defun c:ha ( / lst1 lst2 clr cly ss2 ds_ent ds_ent2 ds_ent3 mau mau2 mau_lay_goc ds_ent2_1 ds_ent5 ds_ent4)
(setq ds_layer (K:dsbg "layer"))
(setq ent (car (entsel "\nDoi tuong mau :")))
(if ent
	(progn
		(setq clr (cdr (assoc 62 (entget ent))))
		(setq cly (cdr (assoc 8 (entget ent))))
		(if clr
			(progn
			    (prompt "chon vung: ")
				(setq lst1 (acet-ss-to-list (ssget "x" (list (cons 62 clr)))))
				(setq lst2 (ssadd))
				(foreach name lst1 (ssadd name lst2))
				(sssetfirst nil lst2)
			)
			(progn
				(setq mau_lay_goc (vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) cly)))
;----------------------------------------------------------------------------------------------------------------------
				(prompt "chon vung: ")
				(setq ss2 (ssget))
				(if ss2 
						(progn
							(setq ds_ent (ss2ent ss2)) 
;(setq ds_lay_chon (mapcar '(lambda (x) (cdr (assoc 8 (entget x)))) ds_ent))
							(foreach k ds_ent
								(setq mau (cdr (assoc 62 (entget k ))))
								(if (= mau nil) (setq ds_ent2 (append (list k) ds_ent2))   (setq ds_ent2_1 (append (list k) ds_ent2_1))  ) 
							)
;--------------------
							(foreach k ds_ent2 
								(setq mau2 (vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) (cdr (assoc 8 (entget k )))  )))
								(if (= mau2  mau_lay_goc) (setq ds_ent3 (append (list k) ds_ent3)))
							)
;---------------------------------------------------------------
							(foreach k ds_ent2_1 (setq mau4 (cdr (assoc 62 (entget k ))))
								(if (= mau4 mau_lay_goc) (setq ds_ent4 (append (list k) ds_ent4)))
							)
;----------------------------------------------------------
							(setq ds_ent5 (append ds_ent3 ds_ent4))	
;------------------------------------------------------------
							(setq lst2 (ssadd))
							(foreach name ds_ent5 (ssadd name lst2))
							(sssetfirst nil lst2)
						)
				)			
			);end progn clr
		); end if clr
	);end progn ent
)	
(princ)
			
)

 
;1- ham lay ten cac phan tu trong 1 tab
(defun K:dsbg (table / lst phu)
(tblnext table t)
(while (setq phu (tblnext table nil))
(setq lst (cons (cdr (assoc 2 phu)) lst))
)
)
;=========================================
;==================
(defun ss2ent (ss / i Le e);;;Convert ss to list of ename
(setq i 0)
(repeat (sslength ss)
(setq e (ssname ss i)
Le (append Le (list e))
i (1+ i)    ))
Le)
;=====================================================================================================================
(defun c:ha2 ( / lst1 lst2 clr cly ss2 ds_ent ds_ent2 ds_ent3 mau mau2 mau_lay_goc ds_ent2_1 ds_ent5 ds_ent4 ds_ss_new clr_ex lay_k ds_ss clr_k)
(setq ent (car (entsel "\nDoi tuong mau :")))
(if ent
(progn
	(setq cly (cdr (assoc 8 (entget ent))))
	(setq clr_ex (if (= (setq clr (cdr (assoc 62 (entget ent)))) nil) 
					(vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) cly)) clr)) 
;---------------------------------------------------------------------------
	(prompt "chon vung: ")
	(setq ss2 (ssget))
	(if ss2 
		(progn
			(setq ds_ss (ss2ent ss2))
			(foreach k ds_ss
				(setq lay_k (cdr (assoc 8 (entget k))))
				(setq clr_k (if (= (setq clr1 (cdr (assoc 62 (entget k)))) nil) 
					(vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) lay_k)) clr1))
;-------------------------------------------------------------------------------
				(if (= clr_k clr_ex)
					(setq ds_ss_new (append (list k) ds_ss_new))
				)
			)
			(setq lst2 (ssadd))
			(foreach name ds_ss_new (ssadd name lst2))
			(sssetfirst nil lst2)
		)
	);end if ss2
);end pron
);end if ent
(princ)
)










lệnh ha2

Vẫn chưa được bạn à, cái này chỉ giải quyết được 1/2 trường hợp 3: chọn được đối tượng có màu by layer và đối tượng có màu tùy chọn trùng nhau [1/2 trường hợp là vì mình thấy khi chọn đối tượng có màu By layer thì nó cho chọn vùng quét, còn đối tượng có màu tùy chọn thì nó tự chọn tất cả luôn không cho chọn vùng quét (hơi bất tiện)]

Ý mình là: Lisp có thể có 3 tùy chọn cho 3 trường hợp:  Gõ lệnh : ha -> xuất hiện bảng chọn ----> 1.chọn đối tượng theo màu By layer

                                                                                                                                                                         2. Chọn đối tượng theo màu tùy chọn (theo cách gọi của bạn)

                                                                                                                                                                         3.Chọn đối tượng theo cả màu By layer và màu tùy chọn

----> chọn đối tượng ----> quét vùng chọn.

Khi nào bạn hay anh em nào có thời gian  thì giúp mình với nhé, xin 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
3 phút trước, mr.thanh2610 đã nói:

Vẫn chưa được bạn à, cái này chỉ giải quyết được 1/2 trường hợp 3: chọn được đối tượng có màu by layer và đối tượng có màu tùy chọn trùng nhau [1/2 trường hợp là vì mình thấy khi chọn đối tượng có màu By layer thì nó cho chọn vùng quét, còn đối tượng có màu tùy chọn thì nó tự chọn tất cả luôn không cho chọn vùng quét (hơi bất tiện)]

Ý mình là: Lisp có thể có 3 tùy chọn cho 3 trường hợp:  Gõ lệnh : ha -> xuất hiện bảng chọn ----> 1.chọn đối tượng theo màu By layer

                                                                                                                                                                         2. Chọn đối tượng theo màu tùy chọn (theo cách gọi của bạn)

                                                                                                                                                                         3.Chọn đối tượng theo cả màu By layer và màu tùy chọn

----> chọn đối tượng ----> quét vùng chọn.

Khi nào bạn hay anh em nào có thời gian  thì giúp mình với nhé, xin cảm ơn

Bạn @nhoclangbat  nói đúng đó, chung quy chỉ chọn đối tượng mẫu để lấy màu nó đang hiển thị, chứ mấy ai chọn tất cả đối tượng là "Bylayer - bất kể màu gì đâu" ( chọn cái này dùng quickselect cho nhanh )

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

Lisp của mình chỉ lọc theo thuột tính color của autocad.

 Bình thường thì lọc object này thường chỉ bật 1 layer nên mình nghĩ ko cần nhiều.

Nhưng theo bác ấy thì mình nghĩ lọc theo màu thể hiện chứ không phải màu thuột tính.

Nghĩa là 

- Nếu chọn obj màu x thì chọn tất cả obj màu x và obj màu bylayer có layer màu x.

- Nếu chọn obj mau bylayer thì chọn tất cả obj màu bylayer có layer cùng màu obj và obj có màu là màu của layer obj mẫu.

Nhưng cái này mình thấy ko cần thiết 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
19 phút trước, ngokiet đã nói:

Lisp của mình chỉ lọc theo thuột tính color của autocad.

 Bình thường thì lọc object này thường chỉ bật 1 layer nên mình nghĩ ko cần nhiều.

Nhưng theo bác ấy thì mình nghĩ lọc theo màu thể hiện chứ không phải màu thuột tính.

Nghĩa là 

- Nếu chọn obj màu x thì chọn tất cả obj màu x và obj màu bylayer có layer màu x.

- Nếu chọn obj mau bylayer thì chọn tất cả obj màu bylayer có layer cùng màu obj và obj có màu là màu của layer obj mẫu.

Nhưng cái này mình thấy ko cần thiết lắm.

Mạn phép lấy lisp các bạn đã post ( đặc biệt là của bạn @nhoclangbat ) sửa lại theo ý của chủ thớt

Lisp sẽ có 4 tùy chọn ( đáp ứng mọi nhu cầu luôn ^^). Lênh là HA

1. theo bylayer : miễn là color là bylayer thì sẽ chọn

2. theo màu của layer: layer màu gì sẽ chọn theo màu đó và chỉ các đối tượng là bylayer

3. theo màu của đối tượng, ko tính đối tượng có màu bylayer

4. theo màu đang hiển thị: cứ là màu này là chọn tất

(Defun c:ha ( )
(setq ansbvc (cond (ansbvc) ("HA4")))
(initget "HA1 HA2 HA3 HA4")
(setq ansbvc (cond ((getkword (strcat "\nChon mau theo [bylayer HA1/mau layer HA2/mau doi tuong HA3/mau hien thi HA4]<" ansbvc ">"))) (ansbvc)))
  

                                                            (if (= ansbvc "HA1") (progn (c:HA1)))
                                                            (if (= ansbvc "HA2") (progn (c:HA2)))
                                                            (if (= ansbvc "HA3") (progn (c:HA3)))
                                                            (if (= ansbvc "HA4") (progn (c:HA4)))

  (princ)
)
(defun c:ha1(/ )  (sssetfirst nil (ssget (list (cons 62 256)))))
(defun c:ha3 ( / lst1 lst2 clr cly ss2 ds_ent ds_ent2 ds_ent3 mau mau2 mau_lay_goc ds_ent2_1 ds_ent5 ds_ent4)
(setq ds_layer (K:dsbg "layer"))
(setq ent (car (entsel "\nDoi tuong mau :")))
(if ent
	(progn
		(setq clr (cdr (assoc 62 (entget ent))))
		(setq cly (cdr (assoc 8 (entget ent))))
		(if clr
			(progn
			    (prompt "chon vung: ")
				(setq lst1 (acet-ss-to-list (ssget (list (cons 62 clr)))))
				(setq lst2 (ssadd))
				(foreach name lst1 (ssadd name lst2))
				(sssetfirst nil lst2)
			)
			(progn
				(setq mau_lay_goc (vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) cly)))
;----------------------------------------------------------------------------------------------------------------------
				(prompt "chon vung: ")
				(setq ss2 (ssget))
				(if ss2 
						(progn
							(setq ds_ent (ss2ent ss2)) 
;(setq ds_lay_chon (mapcar '(lambda (x) (cdr (assoc 8 (entget x)))) ds_ent))
							(foreach k ds_ent
								(setq mau (cdr (assoc 62 (entget k ))))
								(if (= mau nil) (setq ds_ent2 (append (list k) ds_ent2))   (setq ds_ent2_1 (append (list k) ds_ent2_1))  ) 
							)
;--------------------
							(foreach k ds_ent2 
								(setq mau2 (vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) (cdr (assoc 8 (entget k )))  )))
								(if (= mau2  mau_lay_goc) (setq ds_ent3 (append (list k) ds_ent3)))
							)
;---------------------------------------------------------------
							(foreach k ds_ent2_1 (setq mau4 (cdr (assoc 62 (entget k ))))
								(if (= mau4 mau_lay_goc) (setq ds_ent4 (append (list k) ds_ent4)))
							)
;----------------------------------------------------------
							(setq ds_ent5 (append ds_ent3 ds_ent4))	
;------------------------------------------------------------
							(setq lst2 (ssadd))
							(foreach name ds_ent5 (ssadd name lst2))
							(sssetfirst nil lst2)
						)
				)			
			);end progn clr
		); end if clr
	);end progn ent
)	
(princ)
			
)

 
;1- ham lay ten cac phan tu trong 1 tab
(defun K:dsbg (table / lst phu)
(tblnext table t)
(while (setq phu (tblnext table nil))
(setq lst (cons (cdr (assoc 2 phu)) lst))
)
)
;=========================================
;==================
(defun ss2ent (ss / i Le e);;;Convert ss to list of ename
(setq i 0)
(repeat (sslength ss)
(setq e (ssname ss i)
Le (append Le (list e))
i (1+ i)    ))
Le)
;=====================================================================================================================
(defun c:ha2 ( / lst1 lst2 clr cly ss2 ds_ent ds_ent2 ds_ent3 mau mau2 mau_lay_goc ds_ent2_1 ds_ent5 ds_ent4 ds_ss_new clr_ex lay_k ds_ss clr_k)
(setq ent (car (entsel "\nDoi tuong mau :")))
(if ent
(progn
	(setq cly (cdr (assoc 8 (entget ent))))
	(setq clr_ex (vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) cly))) 
;---------------------------------------------------------------------------
	(prompt "chon vung: ")
	(setq ss2 (ssget))
	(if ss2 
		(progn
			(setq ds_ss (ss2ent ss2))
			(foreach k ds_ss
				(setq lay_k (cdr (assoc 8 (entget k))))
				(setq clr_k (vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) lay_k)))
;-------------------------------------------------------------------------------
				(if (= clr_k clr_ex)
					(setq ds_ss_new (append (list k) ds_ss_new))
				)
			)
			(setq lst2 (ssadd))
			(foreach name ds_ss_new (ssadd name lst2))
			(sssetfirst nil lst2)
		)
	);end if ss2
);end pron
);end if ent
(princ)
)
(defun c:ha4 ( / lst1 lst2 clr cly ss2 ds_ent ds_ent2 ds_ent3 mau mau2 mau_lay_goc ds_ent2_1 ds_ent5 ds_ent4 ds_ss_new clr_ex lay_k ds_ss clr_k)
(setq ent (car (entsel "\nDoi tuong mau :")))
(if ent
(progn
	(setq cly (cdr (assoc 8 (entget ent))))
	(setq clr_ex (if (= (setq clr (cdr (assoc 62 (entget ent)))) nil) 
					(vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) cly)) clr)) 
;---------------------------------------------------------------------------
	(prompt "chon vung: ")
	(setq ss2 (ssget))
	(if ss2 
		(progn
			(setq ds_ss (ss2ent ss2))
			(foreach k ds_ss
				(setq lay_k (cdr (assoc 8 (entget k))))
				(setq clr_k (if (= (setq clr1 (cdr (assoc 62 (entget k)))) nil) 
					(vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) lay_k)) clr1))
;-------------------------------------------------------------------------------
				(if (= clr_k clr_ex)
					(setq ds_ss_new (append (list k) ds_ss_new))
				)
			)
			(setq lst2 (ssadd))
			(foreach name ds_ss_new (ssadd name lst2))
			(sssetfirst nil lst2)
		)
	);end if ss2
);end pron
);end if ent
(princ)
)
(princ)

 

  • Like 1
  • 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
7 phút trước, Biet ve CAD đã nói:

Mạn phép lấy lisp các bạn đã post ( đặc biệt là của bạn @nhoclangbat ) sửa lại theo ý của chủ thớt

Lisp sẽ có 4 tùy chọn ( đáp ứng mọi nhu cầu luôn ^^). Lênh là HA

1. theo bylayer : miễn là color là bylayer thì sẽ chọn

2. theo màu của layer: layer màu gì sẽ chọn theo màu đó và chỉ các đối tượng là bylayer

3. theo màu của đối tượng, ko tính đối tượng có màu bylayer

4. theo màu đang hiển thị: cứ là màu này là chọn tất


(Defun c:ha ( )
(setq ansbvc (cond (ansbvc) ("HA4")))
(initget "HA1 HA2 HA3 HA4")
(setq ansbvc (cond ((getkword (strcat "\nChon mau theo [bylayer HA1/mau layer HA2/mau doi tuong HA3/mau hien thi HA4]<" ansbvc ">"))) (ansbvc)))
  

                                                            (if (= ansbvc "HA1") (progn (c:HA1)))
                                                            (if (= ansbvc "HA2") (progn (c:HA2)))
                                                            (if (= ansbvc "HA3") (progn (c:HA3)))
                                                            (if (= ansbvc "HA4") (progn (c:HA4)))

  (princ)
)
(defun c:ha1(/ )  (sssetfirst nil (ssget (list (cons 62 256)))))
(defun c:ha3 ( / lst1 lst2 clr cly ss2 ds_ent ds_ent2 ds_ent3 mau mau2 mau_lay_goc ds_ent2_1 ds_ent5 ds_ent4)
(setq ds_layer (K:dsbg "layer"))
(setq ent (car (entsel "\nDoi tuong mau :")))
(if ent
	(progn
		(setq clr (cdr (assoc 62 (entget ent))))
		(setq cly (cdr (assoc 8 (entget ent))))
		(if clr
			(progn
			    (prompt "chon vung: ")
				(setq lst1 (acet-ss-to-list (ssget (list (cons 62 clr)))))
				(setq lst2 (ssadd))
				(foreach name lst1 (ssadd name lst2))
				(sssetfirst nil lst2)
			)
			(progn
				(setq mau_lay_goc (vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) cly)))
;----------------------------------------------------------------------------------------------------------------------
				(prompt "chon vung: ")
				(setq ss2 (ssget))
				(if ss2 
						(progn
							(setq ds_ent (ss2ent ss2)) 
;(setq ds_lay_chon (mapcar '(lambda (x) (cdr (assoc 8 (entget x)))) ds_ent))
							(foreach k ds_ent
								(setq mau (cdr (assoc 62 (entget k ))))
								(if (= mau nil) (setq ds_ent2 (append (list k) ds_ent2))   (setq ds_ent2_1 (append (list k) ds_ent2_1))  ) 
							)
;--------------------
							(foreach k ds_ent2 
								(setq mau2 (vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) (cdr (assoc 8 (entget k )))  )))
								(if (= mau2  mau_lay_goc) (setq ds_ent3 (append (list k) ds_ent3)))
							)
;---------------------------------------------------------------
							(foreach k ds_ent2_1 (setq mau4 (cdr (assoc 62 (entget k ))))
								(if (= mau4 mau_lay_goc) (setq ds_ent4 (append (list k) ds_ent4)))
							)
;----------------------------------------------------------
							(setq ds_ent5 (append ds_ent3 ds_ent4))	
;------------------------------------------------------------
							(setq lst2 (ssadd))
							(foreach name ds_ent5 (ssadd name lst2))
							(sssetfirst nil lst2)
						)
				)			
			);end progn clr
		); end if clr
	);end progn ent
)	
(princ)
			
)

 
;1- ham lay ten cac phan tu trong 1 tab
(defun K:dsbg (table / lst phu)
(tblnext table t)
(while (setq phu (tblnext table nil))
(setq lst (cons (cdr (assoc 2 phu)) lst))
)
)
;=========================================
;==================
(defun ss2ent (ss / i Le e);;;Convert ss to list of ename
(setq i 0)
(repeat (sslength ss)
(setq e (ssname ss i)
Le (append Le (list e))
i (1+ i)    ))
Le)
;=====================================================================================================================
(defun c:ha2 ( / lst1 lst2 clr cly ss2 ds_ent ds_ent2 ds_ent3 mau mau2 mau_lay_goc ds_ent2_1 ds_ent5 ds_ent4 ds_ss_new clr_ex lay_k ds_ss clr_k)
(setq ent (car (entsel "\nDoi tuong mau :")))
(if ent
(progn
	(setq cly (cdr (assoc 8 (entget ent))))
	(setq clr_ex (vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) cly))) 
;---------------------------------------------------------------------------
	(prompt "chon vung: ")
	(setq ss2 (ssget))
	(if ss2 
		(progn
			(setq ds_ss (ss2ent ss2))
			(foreach k ds_ss
				(setq lay_k (cdr (assoc 8 (entget k))))
				(setq clr_k (vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) lay_k)))
;-------------------------------------------------------------------------------
				(if (= clr_k clr_ex)
					(setq ds_ss_new (append (list k) ds_ss_new))
				)
			)
			(setq lst2 (ssadd))
			(foreach name ds_ss_new (ssadd name lst2))
			(sssetfirst nil lst2)
		)
	);end if ss2
);end pron
);end if ent
(princ)
)
(defun c:ha4 ( / lst1 lst2 clr cly ss2 ds_ent ds_ent2 ds_ent3 mau mau2 mau_lay_goc ds_ent2_1 ds_ent5 ds_ent4 ds_ss_new clr_ex lay_k ds_ss clr_k)
(setq ent (car (entsel "\nDoi tuong mau :")))
(if ent
(progn
	(setq cly (cdr (assoc 8 (entget ent))))
	(setq clr_ex (if (= (setq clr (cdr (assoc 62 (entget ent)))) nil) 
					(vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) cly)) clr)) 
;---------------------------------------------------------------------------
	(prompt "chon vung: ")
	(setq ss2 (ssget))
	(if ss2 
		(progn
			(setq ds_ss (ss2ent ss2))
			(foreach k ds_ss
				(setq lay_k (cdr (assoc 8 (entget k))))
				(setq clr_k (if (= (setq clr1 (cdr (assoc 62 (entget k)))) nil) 
					(vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) lay_k)) clr1))
;-------------------------------------------------------------------------------
				(if (= clr_k clr_ex)
					(setq ds_ss_new (append (list k) ds_ss_new))
				)
			)
			(setq lst2 (ssadd))
			(foreach name ds_ss_new (ssadd name lst2))
			(sssetfirst nil lst2)
		)
	);end if ss2
);end pron
);end if ent
(princ)
)
(princ)

 

Thế thì lại mạnh quá rồi anh. @@

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ó 1 HA là hàng thiệt, còn các HA1, HA2,..., HAn là hàng Iphone không chính hãng nhe! Mọi người lưu ý khi mua hàng!

Hehe! Các anh chặt chém HA này quá!

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
12 phút trước, Doan Van Ha đã nói:

Có 1 HA là hàng thiệt, còn các HA1, HA2,..., HAn là hàng Iphone không chính hãng nhe! Mọi người lưu ý khi mua hàng!

Hehe! Các anh chặt chém HA này quá!

he he, cũng do cách ăn ở của bác thôi!

(cách đặt tên)

  • Like 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
26 phút trước, Danh Cong đã nói:

Thế thì lại mạnh quá rồi anh. @@

Đang siêu sayan cấp 3, cố phát lên cấp 4, bạn nào có time cho lên cấp 5  là chọn được nhiều màu mẫu cùng lúc nữa ^^

  • Vote giảm 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
(defun c:sscolor(/ lays objm y x420 x62 lays)
  (princ "\nSelect obj mau:")
  (or (setq objm (acet-ss-to-list (ssget))) (exit))
  (initget "A B")
  (if (eq (getkword "Chon kieu [A Theo thuoc tinh/B Theo the hien]") "B")
    (progn
      (foreach x objm
	(cond ((setq y (cdr(assoc 420 (setq x (entget x)))))
	       (or (member y x420) (setq x420 (cons y x420))))
	      ((setq y (cdr(assoc 62 x)))
	       (or (member y x62) (setq x62 (cons y x62))))
	      ((setq y (cdr(assoc 420 (setq x (entget (tblobjname "Layer" (cdr(assoc 8 x))))))))
	       (or (member y x420) (setq x420 (cons y x420))))
	      ((setq y (cdr(assoc 62 x)))
	       (or (member y x62) (setq x62 (cons y x62))))))
      (vlax-for x (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
	(setq x (entget(vlax-vla-object->ename x)))
	(if (or (member (cdr (assoc 420 x)) x420) (and (not (cdr (assoc 420 x))) (member (cdr (assoc 62 x)) x62)))
	  (setq Lays (if lays (strcat lays "," (cdr(assoc 2 x))) (cdr(assoc 2 x))))))
      (sssetfirst nil (ssget
			(append '((-4 . "<OR"))
				(mapcar '(lambda(a) (cons 62 a)) x62)
				(mapcar '(lambda(a) (cons 420 a)) x420)
				(if lays
				  (list '(-4 . "<AND") (cons 8 lays) '(62 . 256) '(-4 . "AND>")))
				'((-4 . "OR>"))))))
    (progn
      (foreach x objm
	(cond ((setq y (cdr(assoc 420 (setq x (entget x)))))
	       (or (member y x420) (setq x420 (cons y x420))))
	      ((setq y (cond ((cdr(assoc 62 x))) (256)))
	       (or (member y x62) (setq x62 (cons y x62))))))
      (sssetfirst nil (ssget (append '((-4 . "<OR"))
				     (mapcar '(lambda(a) (cons 62 a)) x62)
				     (mapcar '(lambda(a) (cons 420 a)) x420)
				     '((-4 . "OR>")))))))
  (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
10 phút trước, ngokiet đã nói:

Hình như Lisp của bạn các màu truecolor không thực hiện đúng vì truecolor nó cũng có trả về màu gần đúng là (assoc 62)

Truecolor là cad nó bổ sung sau nên nó thêm ở code 420 nhưng vì tương thích với lisp cũ nên vẫn có màu gần đúng ở code 62.

Mình thích lọc ở ssget cho có vẽ trực quan hơn nên mình bổ sung lisp này


(defun c:sscolor(/ lays objm y x420 x62 lays)
  (princ "\nSelect obj mau:")
  (or (setq objm (acet-ss-to-list (ssget))) (exit))
  (initget "A B")
  (if (eq (getkword "Chon kieu [A Theo thuoc tinh/B Theo the hien]") "B")
    (progn
      (foreach x objm
	(cond ((setq y (cdr(assoc 420 (setq x (entget x)))))
	       (or (member y x420) (setq x420 (cons y x420))))
	      ((setq y (cdr(assoc 62 x)))
	       (or (member y x62) (setq x62 (cons y x62))))
	      ((setq y (cdr(assoc 420 (setq x (entget (tblobjname "Layer" (cdr(assoc 8 x))))))))
	       (or (member y x420) (setq x420 (cons y x420))))
	      ((setq y (cdr(assoc 62 x)))
	       (or (member y x62) (setq x62 (cons y x62))))))
      (vlax-for x (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
	(setq x (entget(vlax-vla-object->ename x)))
	(if (or (member (cdr (assoc 420 x)) x420) (member (cdr (assoc 62 x)) x62))
	  (setq Lays (if lays (strcat lays "," (cdr(assoc 2 x))) (cdr(assoc 2 x))))))
      (sssetfirst nil (ssget
			(append '((-4 . "<OR"))
				(mapcar '(lambda(a) (cons 62 a)) x62)
				(mapcar '(lambda(a) (cons 420 a)) x420)
				(if lays
				  (list '(-4 . "<AND") (cons 8 lays) '(62 . 256) '(-4 . "AND>")))
				'((-4 . "OR>"))))))
    (progn
      (foreach x objm
	(cond ((setq y (cdr(assoc 420 (setq x (entget x)))))
	       (or (member y x420) (setq x420 (cons y x420))))
	      ((setq y (cond ((cdr(assoc 62 x))) (256)))
	       (or (member y x62) (setq x62 (cons y x62))))))
      (sssetfirst nil (ssget (append '((-4 . "<OR"))
				     (mapcar '(lambda(a) (cons 62 a)) x62)
				     (mapcar '(lambda(a) (cons 420 a)) x420)
				     '((-4 . "OR>")))))))
  (princ))

- Chọn mẫu có thể nhiều mẫu được.

- Màu truecolor vẫn chọn đúng.

Có 2 kiểu lọc theo mình nói ở trên.

Vừa chạy thử lisp, nếu mẫu là truecolor thì lọc chuẩn đối tượng truecolor, còn mẫu là màu cons 62 thì lấy luôn cả màu truecolor gần giống màu cons 62 ấy

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
2 giờ trước, Biet ve CAD đã nói:

Mạn phép lấy lisp các bạn đã post ( đặc biệt là của bạn @nhoclangbat ) sửa lại theo ý của chủ thớt

Lisp sẽ có 4 tùy chọn ( đáp ứng mọi nhu cầu luôn ^^). Lênh là HA

1. theo bylayer : miễn là color là bylayer thì sẽ chọn

2. theo màu của layer: layer màu gì sẽ chọn theo màu đó và chỉ các đối tượng là bylayer

3. theo màu của đối tượng, ko tính đối tượng có màu bylayer

4. theo màu đang hiển thị: cứ là màu này là chọn tất

  • ha_ha1_ha3_ha2_ha4.lsp
    lisp help
  •  

(Defun c:ha ( )
(setq ansbvc (cond (ansbvc) ("HA4")))
(initget "HA1 HA2 HA3 HA4")
(setq ansbvc (cond ((getkword (strcat "\nChon mau theo [bylayer HA1/mau layer HA2/mau doi tuong HA3/mau hien thi HA4]<" ansbvc ">"))) (ansbvc)))
  

                                                            (if (= ansbvc "HA1") (progn (c:HA1)))
                                                            (if (= ansbvc "HA2") (progn (c:HA2)))
                                                            (if (= ansbvc "HA3") (progn (c:HA3)))
                                                            (if (= ansbvc "HA4") (progn (c:HA4)))

  (princ)
)
(defun c:ha1(/ )  (sssetfirst nil (ssget (list (cons 62 256)))))
(defun c:ha3 ( / lst1 lst2 clr cly ss2 ds_ent ds_ent2 ds_ent3 mau mau2 mau_lay_goc ds_ent2_1 ds_ent5 ds_ent4)
(setq ds_layer (K:dsbg "layer"))
(setq ent (car (entsel "\nDoi tuong mau :")))
(if ent
	(progn
		(setq clr (cdr (assoc 62 (entget ent))))
		(setq cly (cdr (assoc 8 (entget ent))))
		(if clr
			(progn
			    (prompt "chon vung: ")
				(setq lst1 (acet-ss-to-list (ssget (list (cons 62 clr)))))
				(setq lst2 (ssadd))
				(foreach name lst1 (ssadd name lst2))
				(sssetfirst nil lst2)
			)
			(progn
				(setq mau_lay_goc (vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) cly)))
;----------------------------------------------------------------------------------------------------------------------
				(prompt "chon vung: ")
				(setq ss2 (ssget))
				(if ss2 
						(progn
							(setq ds_ent (ss2ent ss2)) 
;(setq ds_lay_chon (mapcar '(lambda (x) (cdr (assoc 8 (entget x)))) ds_ent))
							(foreach k ds_ent
								(setq mau (cdr (assoc 62 (entget k ))))
								(if (= mau nil) (setq ds_ent2 (append (list k) ds_ent2))   (setq ds_ent2_1 (append (list k) ds_ent2_1))  ) 
							)
;--------------------
							(foreach k ds_ent2 
								(setq mau2 (vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) (cdr (assoc 8 (entget k )))  )))
								(if (= mau2  mau_lay_goc) (setq ds_ent3 (append (list k) ds_ent3)))
							)
;---------------------------------------------------------------
							(foreach k ds_ent2_1 (setq mau4 (cdr (assoc 62 (entget k ))))
								(if (= mau4 mau_lay_goc) (setq ds_ent4 (append (list k) ds_ent4)))
							)
;----------------------------------------------------------
							(setq ds_ent5 (append ds_ent3 ds_ent4))	
;------------------------------------------------------------
							(setq lst2 (ssadd))
							(foreach name ds_ent5 (ssadd name lst2))
							(sssetfirst nil lst2)
						)
				)			
			);end progn clr
		); end if clr
	);end progn ent
)	
(princ)
			
)

 
;1- ham lay ten cac phan tu trong 1 tab
(defun K:dsbg (table / lst phu)
(tblnext table t)
(while (setq phu (tblnext table nil))
(setq lst (cons (cdr (assoc 2 phu)) lst))
)
)
;=========================================
;==================
(defun ss2ent (ss / i Le e);;;Convert ss to list of ename
(setq i 0)
(repeat (sslength ss)
(setq e (ssname ss i)
Le (append Le (list e))
i (1+ i)    ))
Le)
;=====================================================================================================================
(defun c:ha2 ( / lst1 lst2 clr cly ss2 ds_ent ds_ent2 ds_ent3 mau mau2 mau_lay_goc ds_ent2_1 ds_ent5 ds_ent4 ds_ss_new clr_ex lay_k ds_ss clr_k)
(setq ent (car (entsel "\nDoi tuong mau :")))
(if ent
(progn
	(setq cly (cdr (assoc 8 (entget ent))))
	(setq clr_ex (vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) cly))) 
;---------------------------------------------------------------------------
	(prompt "chon vung: ")
	(setq ss2 (ssget))
	(if ss2 
		(progn
			(setq ds_ss (ss2ent ss2))
			(foreach k ds_ss
				(setq lay_k (cdr (assoc 8 (entget k))))
				(setq clr_k (vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) lay_k)))
;-------------------------------------------------------------------------------
				(if (= clr_k clr_ex)
					(setq ds_ss_new (append (list k) ds_ss_new))
				)
			)
			(setq lst2 (ssadd))
			(foreach name ds_ss_new (ssadd name lst2))
			(sssetfirst nil lst2)
		)
	);end if ss2
);end pron
);end if ent
(princ)
)
(defun c:ha4 ( / lst1 lst2 clr cly ss2 ds_ent ds_ent2 ds_ent3 mau mau2 mau_lay_goc ds_ent2_1 ds_ent5 ds_ent4 ds_ss_new clr_ex lay_k ds_ss clr_k)
(setq ent (car (entsel "\nDoi tuong mau :")))
(if ent
(progn
	(setq cly (cdr (assoc 8 (entget ent))))
	(setq clr_ex (if (= (setq clr (cdr (assoc 62 (entget ent)))) nil) 
					(vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) cly)) clr)) 
;---------------------------------------------------------------------------
	(prompt "chon vung: ")
	(setq ss2 (ssget))
	(if ss2 
		(progn
			(setq ds_ss (ss2ent ss2))
			(foreach k ds_ss
				(setq lay_k (cdr (assoc 8 (entget k))))
				(setq clr_k (if (= (setq clr1 (cdr (assoc 62 (entget k)))) nil) 
					(vla-get-color (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) lay_k)) clr1))
;-------------------------------------------------------------------------------
				(if (= clr_k clr_ex)
					(setq ds_ss_new (append (list k) ds_ss_new))
				)
			)
			(setq lst2 (ssadd))
			(foreach name ds_ss_new (ssadd name lst2))
			(sssetfirst nil lst2)
		)
	);end if ss2
);end pron
);end if ent
(princ)
)
(princ)

 

Cảm ơn bác, mình đã thử và 1 và 4 rất tốt.Còn:

2. Ý của mình là chỉ một đối tượng cùng hoặc khác layer nhưng cùng màu, cùng bylayer thì chọn(không chọn được đối tượng cùng màu nhưng bylayer đã đổi để trùng màu)  , lisp bác cùng layer nhưng khác màu thì vẫn chọn (ví dụ layer có bylayer màu đỏ, mình đổi sang màu xanh nó vẫn chọn)  

3. (Ngược lại với thằng 2)Ý của mình là chỉ một đối tượng cùng hoặc khác layer nhưng cùng màu(màu theo điều chỉnh, không phải màu bylayer, đối tượng cùng màu nhưng mà màu bylayer thì không chọn), lisp của bác trường hợp đối tượng cùng layer hoặc khác layer thì nếu chọn trước đối tượng đã thay đổi màu thì chọn được tất cả đối tượng có màu cùng(trừ đối tượng bylayer- cái này tốt), nhưng mình chọn ngược lại đối tượng cùng màu là bylayer thì nó chọn được luôn đối tượng cùng màu

À mà mình góp ý  1 trường hợp nữa mà mình gọi là trường hợp 5.Chọn tất cả các color có màu tùy chon (ngược lại với cái "1. theo bylayer : miễn là color là bylayer thì sẽ chọn")

P/S: Cảm ơn anh em nhiều, anh em nhiệt tình quá, ngày nay Vote nhiều nên hết lượt nên anh em thông cảm nếu không Vote được nhé , xin cảm ơn

Chỉnh sửa theo mr.thanh2610
Nhầm lẫ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

×