Chuyển đến nội dung
Diễn đàn CADViet
NgọcH

Chọn và lọc đối tượng

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

Chào mọi người. Mọi người cho e hỏi có thể dùng filter để lọc và chọn các đối tượng bị đè lên nhau không ạ. E ngồi mò mà không ra. E muốn chọn những đường tròn bị đối tượng khác (Block, đường line,...) đè lên

ghbsaehbeshntbedrs.png

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

Bạn toàn toàn search được hướng dẫn trên Youtube cũng với những từ như trên. Chỉ cần thay cụm từ "Chào mọi người" thành "Autocad".

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

Bạn toàn toàn search được hướng dẫn trên Youtube cũng với những từ như trên. Chỉ cần thay cụm từ "Chào mọi người" thành "Autocad".

E có tìm hiểu trên web và youtobe rồi nhưng chỉ có hướng dẫn chọn đường tròn. ở đây e chỉ muốn chọn các đường tròn bị đè để xóa đi và không muốn xóa các đường tròn xung quanh không bị đè 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

Filter sẽ đảm bảo khi select một vùng, những đối tượng không được filter sẽ không bị lựa chọn.

Còn như ý của bạn, chỉ cần gõ lệnh là nó tự chọn những đường tròn giao với line. Bạn cần phải trả phí để có người viết một lệnh đặc thù như thế.

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

1. Filter không lọc được

2. Về lý thuyết, coi các các đường tròn bị đè là đường tròn có giao cắt với đối tượng khác.

Cách 1:  Đưa các đường tròn vào tập hợp A;  các đối tượng còn lại vào tập hợp B.  Nếu 1 phần tử thuộc A giao (intersect) với ít nhất 1 phần tử thuộc B thì nhét đường tròn vào tập hợp C.

Cách 2:  Đưa các đường tròn vào tập hợp A.  Từ toạ độ và bán kính 1 đường tròn, tính ra 6 điểm nội tiếp đường tròn.   Chọn (Select polygon) bằng 6 điểm này, nếu chọn được phần tử thì nhét đường tròn vào vào tập hợp C.

*

Cách 1 chạy chậm nhưng chính xác.  Cách 2 nhanh nhưng gần đúng thô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
1 giờ} trướ}c, ZIS3 đã nói:

@NgọcH

1. Filter không lọc được

2. Về lý thuyết, coi các các đường tròn bị đè là đường tròn có giao cắt với đối tượng khác.

Cách 1:  Đưa các đường tròn vào tập hợp A;  các đối tượng còn lại vào tập hợp B.  Nếu 1 phần tử thuộc A giao (intersect) với ít nhất 1 phần tử thuộc B thì nhét đường tròn vào tập hợp C.

Cách 2:  Đưa các đường tròn vào tập hợp A.  Từ toạ độ và bán kính 1 đường tròn, tính ra 6 điểm nội tiếp đường tròn.   Chọn (Select polygon) bằng 6 điểm này, nếu chọn được phần tử thì nhét đường tròn vào vào tập hợp C.

*

Cách 1 chạy chậm nhưng chính xác.  Cách 2 nhanh nhưng gần đúng thôi.

làm theo cách 1 thì sẽ chạy lâu quá không ạ, mình có khoảng 30.000 phần tử và khoảng 300 phần tử giao nhau. chắc phải học thêm vba để làm. cảm ơn b

 

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

Bạn đưa file test lên nhờ bác Dương Nhật Duy làm phát là ra ngay ấy mà.

E gà lắm bác ơi, gì chứ ai mà ra đề bài kiểu hình học, tương quan giữa các đối tượng là e cáo lui luôn :v

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:test ( / CK CK1 LISTCIRCLE LISTLINE SS)
(setq ss (mapcar 'vlax-ename->vla-object (ACET-SS-TO-LIST(ssget))))
(setq listcircle (vl-remove-if-not '(lambda (obj) (= "AcDbCircle" (vla-get-ObjectName obj))) ss)
      listline (vl-remove-if '(lambda (obj) (= "AcDbCircle" (vla-get-ObjectName obj))) ss))
(foreach circle listcircle
  (setq ck nil)
  (foreach line listline    
     (setq ck1 (vlax-invoke circle 'intersectwith line acextendnone))
    (if ck1 (setq ck ck1))   
    )
  (if ck (vla-delete circle))
  )
  )

 

  • 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
Vào lúc 8/8/2024 tại 15:15, cuongtk2 đã nói:

(defun c:test ( / CK CK1 LISTCIRCLE LISTLINE SS)
(setq ss (mapcar 'vlax-ename->vla-object (ACET-SS-TO-LIST(ssget))))
(setq listcircle (vl-remove-if-not '(lambda (obj) (= "AcDbCircle" (vla-get-ObjectName obj))) ss)
      listline (vl-remove-if '(lambda (obj) (= "AcDbCircle" (vla-get-ObjectName obj))) ss))
(foreach circle listcircle
  (setq ck nil)
  (foreach line listline    
     (setq ck1 (vlax-invoke circle 'intersectwith line acextendnone))
    (if ck1 (setq ck ck1))   
    )
  (if ck (vla-delete circle))
  )
  )

 

thực sự cảm ơn a rất nhiều, nó hoạt động rất hiệu quả. thay vì nó xóa luôn thì mình có thể cho nó chọn đối tượng đó thôi được không 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

Bác @cuongtk2 có thể sửa lại thành như sau được không?:

Gõ lệnh > chọn đối tượng (line, pline, cycle, block...). Kết thúc lệnh sẽ chọn những đối tượng mà line hay block...đó cắt qua.

Lúc đó người dùng muốn di chuyển, copy hay xoá...thủ công thôi. Em nghĩ cái này phù hợp với nhiều người dù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
(defun c:test ( / CK CK1 LISTCIRCLE LISTLINE SS nss)
(setq ss (mapcar 'vlax-ename->vla-object (ACET-SS-TO-LIST(ssget))))
(setq listcircle (vl-remove-if-not '(lambda (obj) (= "AcDbCircle" (vla-get-ObjectName obj))) ss)
      listline (vl-remove-if '(lambda (obj) (= "AcDbCircle" (vla-get-ObjectName obj))) ss))
  (SETQ nss (ssadd))
(foreach circle listcircle
  (setq ck nil)
  (foreach line listline  
    (if (vlax-invoke circle 'intersectwith line acextendnone)
      (setq ck T))   ;if
    );foreach
  (if ck (setq nss (ssadd  (vlax-vla-object->ename circle) nss ))
    );if
  );foreach
  (command "select" nss "")
 ; (command "select" "_P" )  xu ly tiep theo cho nss 
  )

 

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, cuongtk2 đã nói:

(defun c:test ( / CK CK1 LISTCIRCLE LISTLINE SS nss)
(setq ss (mapcar 'vlax-ename->vla-object (ACET-SS-TO-LIST(ssget))))
(setq listcircle (vl-remove-if-not '(lambda (obj) (= "AcDbCircle" (vla-get-ObjectName obj))) ss)
      listline (vl-remove-if '(lambda (obj) (= "AcDbCircle" (vla-get-ObjectName obj))) ss))
  (SETQ nss (ssadd))
(foreach circle listcircle
  (setq ck nil)
  (foreach line listline  
    (if (vlax-invoke circle 'intersectwith line acextendnone)
      (setq ck T))   ;if
    );foreach
  (if ck (setq nss (ssadd  (vlax-vla-object->ename circle) nss ))
    );if
  );foreach
  (command "select" nss "")
 ; (command "select" "_P" )  xu ly tiep theo cho nss 
  )

có cách nào mà nó chọn luôn không cần gõ lại lệnh khum 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

Bác Cường ơi, cùng chủ đề chọn và lọc đối tượng. Cháu đang gặp vấn đề chọn và lọc đối tượng là block bất kỳ đang đè lên polyline, polyline kín,  line, nếu được bác giúp cháu với , cháu cảm ơn bác rất nhiều ạ
ý tưởng của cháu cụ thể như sau:
- gõ lệnh cbl
- chọn 1 block mẫu có sẵn trên bản vẽ tìm để tìm hết những block cùng định dạng đang đè lên l,pl
- quét khu vực cần tìm block bị đè
kết quả được các đối tượng block bị đè (có thể copy, chỉnh sửa hoặc thay thế đi)

chọn block đè polyline.pdf

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:test ( / CK CK1 LISTblock LISTLINE SS nss dungblock)
  (setq ent (car (entsel "\nChon block mau:")))
  (if (null ent) (exit))
  (setq   obj (vlax-ename->vla-object ent)
             objname (vla-get-ObjectName obj))
  (if (/= "AcDbBlockReference" objname) (exit))
  (setq blname (vla-get-EffectiveName obj))
  ;; ham de loc block + name
  (defun dungblock(obj blname / objname)
    (setq objname (vla-get-ObjectName obj))
    (if (= objname "AcDbBlockReference")
      (if (= blname (vla-get-EffectiveName obj)) t nil)
        nil)
    )
  
(setq ss (mapcar 'vlax-ename->vla-object (ACET-SS-TO-LIST(ssget))))
(setq listblock (vl-remove-if-not '(lambda (obj) (dungblock obj blname)) ss)
      listline (vl-remove-if '(lambda (obj) (dungblock obj blname)) ss))
  (SETQ nss (ssadd))
(foreach block listblock
  (setq ck nil)
  (foreach line listline  
    (if (vlax-invoke block 'intersectwith line acextendnone)
      (setq ck T))   ;if
    );foreach
  (if ck (setq nss (ssadd  (vlax-vla-object->ename block) nss ))
    );if
  );foreach
  (SSSETFIRST nil nss ) ;hien thi tap hop chon
  )

 

  • 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

giả sử có trường hợp: các đối tượng đè là hình vuông hoặc hình tròn có kích thước khác nhau ( ví dụ có đường tròn bán kính 50, 100. hình vuông cạnh 50, 100) thì lisp kia a có thể thêm 1 thao tác là chọn đối tượng muốn xóa sau khi gõ lệnh không ạ.

- ví dụ e chỉ muốn xóa đường tròn bán kinh 50 thì sẽ có thêm 1 bước chọn object (đường tròn bán kính 50) hoặc xóa hình vuông thì chọn hình vuông,... và nó chỉ xóa những đối tượng cùng thuộc tính, kích thước với đối tượng mình đã chọn.

- A có thể làm 2 lisp:

+ xóa luôn ko cần chọn đối tượng sau khi lọc

+ có chọn đối tượng sau khi lọc

ví e test 2 lisp a gửi thì lisp chọn đối tượng nó chạy sẽ lâu hơn là ko cần chọn đối tượng.

e cảm ơ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

Cái này khó ở chỗ bạn sử dụng thuộc tính gì để lọc đối tượng, vì nó không nhất quán nên khó thể dùng 1 lệnh.

Nghĩa là bạn pick vào 1 mẫu, bạn có nghĩ là mình có thể lấy được những giá trị gì ở mẫu đó. Với đường tròn thì có mỗi bán kính.

Nhưng với 1 polyline mà bạn gọi là hình vuông nó phải đảm bảo điều kiện tối thiểu có 4 cạnh dài = nhau và vuông góc.

Tất nhiên nó có thể xử lý được, nhưng không muốn tốn thời gian vào việ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
4 giờ trước, cuongtk2 đã nói:

(defun c:test ( / CK CK1 LISTblock LISTLINE SS nss dungblock)
  (setq ent (car (entsel "\nChon block mau:")))
  (if (null ent) (exit))
  (setq   obj (vlax-ename->vla-object ent)
             objname (vla-get-ObjectName obj))
  (if (/= "AcDbBlockReference" objname) (exit))
  (setq blname (vla-get-EffectiveName obj))
  ;; ham de loc block + name
  (defun dungblock(obj blname / objname)
    (setq objname (vla-get-ObjectName obj))
    (if (= objname "AcDbBlockReference")
      (if (= blname (vla-get-EffectiveName obj)) t nil)
        nil)
    )
  
(setq ss (mapcar 'vlax-ename->vla-object (ACET-SS-TO-LIST(ssget))))
(setq listblock (vl-remove-if-not '(lambda (obj) (dungblock obj blname)) ss)
      listline (vl-remove-if '(lambda (obj) (dungblock obj blname)) ss))
  (SETQ nss (ssadd))
(foreach block listblock
  (setq ck nil)
  (foreach line listline  
    (if (vlax-invoke block 'intersectwith line acextendnone)
      (setq ck T))   ;if
    );foreach
  (if ck (setq nss (ssadd  (vlax-vla-object->ename block) nss ))
    );if
  );foreach
  (SSSETFIRST nil nss ) ;hien thi tap hop chon
  )

 

Bác Cường ơi, cháu cảm ơn bác rất nhiều về chiếc lisp. bánh chín vừa miếng bác ạ
Cháu chúc bác và gia đình luôn luôn mạnh khỏe ạ
Nhận tiện cháu còn 2 vấn đề lọc nữa đó là :
1.Chọn các block hoặc text có trong nhiều polyline kín (polyline kín đều chung trong 1 lớp layer)
- command : test
- chọn vào line hoặc polyline trên bản vẽ
- quét chọn khu vực cần tìm
Kết quả thu được các đối tượng chứa trong polyline đó (có thể copy, thay thế hoặc chỉnh sửa)
2.Chọn các polyline đang bị hở 
- command : test1
- quét chọn khu vực cần tìm
Kết quả thu được các polyline đang hở  (có thể copy, thay thế hoặc chỉnh sửa)
Cho cháu xin được cảm ơn bác lần nữa, mong được bác giúp đỡ ạ, cháu cảm ơn bác rất nhiều.

chọn nhanh các polyline hở.pdf

chọn block hoặc text trong nhiều polyline kín.pdf

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
23 giờ trước, cuongtk2 đã nói:

(defun c:test ( / CK CK1 LISTCIRCLE LISTLINE SS nss)
(setq ss (mapcar 'vlax-ename->vla-object (ACET-SS-TO-LIST(ssget))))
(setq listcircle (vl-remove-if-not '(lambda (obj) (= "AcDbCircle" (vla-get-ObjectName obj))) ss)
      listline (vl-remove-if '(lambda (obj) (= "AcDbCircle" (vla-get-ObjectName obj))) ss))
  (SETQ nss (ssadd))
(foreach circle listcircle
  (setq ck nil)
  (foreach line listline  
    (if (vlax-invoke circle 'intersectwith line acextendnone)
      (setq ck T))   ;if
    );foreach
  (if ck (setq nss (ssadd  (vlax-vla-object->ename circle) nss ))
    );if
  );foreach
  (command "select" nss "")
 ; (command "select" "_P" )  xu ly tiep theo cho nss 
  )

 

e cảm ơn a, e nhận thấy lisp nó không xóa được các block phức tạp như gồm nhiều đoạn thẳng khác nhau hoặc block chứa nhiều đường cong và thi thoảng lisp nó không hoạt động. a có biết nguyên nhân vì sao 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

Đối với các đối tượng phức tạp kiểu Block, hay Text thì điều kiện "giao nhau" nên được hiểu khác đi là:  Vùng bao (Bounding box) của 2 đối tượng đó giao nhau.

*

Lệnh tìm giao điểm (intersectwith) có đặc thù là phải nằm trong vùng hiển thị thì mới trả lại kết quả.

Nếu cái giao điểm nó nằm ngoài vùng hiển thị của CAD thì thường là không tìm được

Điều này cũng đúng cho cả các trường hợp chọn đối tượng (select), trừ SelectAll.

Đấy là lý do bạn thấy Lisp lúc được lúc không.

*

Liên quan đến method intersectwith của VBA, tôi từng bị 1 trường hợp lỗi khá kỳ dị:  2 đường Polyline rõ ràng có giao nhau, có nằm trong vùng hiển thị, đồng phẳng... nhưng không tìm được giao điểm.  Sau một hồi loay hoay phát hiện 1 Polyline nét đứt, Polyline còn lại cắt qua đúng cái chỗ "đứt" nên không tìm được giao điể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
Vào lúc 13/8/2024 tại 20:28, nguyensang9798@gmail.com đã nói:

Bác Cường ơi, cháu cảm ơn bác rất nhiều về chiếc lisp. bánh chín vừa miếng bác ạ
Cháu chúc bác và gia đình luôn luôn mạnh khỏe ạ
Nhận tiện cháu còn 2 vấn đề lọc nữa đó là :
1.Chọn các block hoặc text có trong nhiều polyline kín (polyline kín đều chung trong 1 lớp layer)
- command : test
- chọn vào line hoặc polyline trên bản vẽ
- quét chọn khu vực cần tìm
Kết quả thu được các đối tượng chứa trong polyline đó (có thể copy, thay thế hoặc chỉnh sửa)
2.Chọn các polyline đang bị hở 
- command : test1
- quét chọn khu vực cần tìm
Kết quả thu được các polyline đang hở  (có thể copy, thay thế hoặc chỉnh sửa)
Cho cháu xin được cảm ơn bác lần nữa, mong được bác giúp đỡ ạ, cháu cảm ơn bác rất nhiều.

chọn nhanh các polyline hở.pdf

chọn block hoặc text trong nhiều polyline kín.pdf

Gửi bạn cái lisp chọn đối tượng bên trong nhiều polyline kín 

Nguồn trên mạng.

Chon doi tuong ben trong Polyline_sop.lsp

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

Gửi bạn cái lisp chọn đối tượng bên trong nhiều polyline kín 

Nguồn trên mạng.

Chon doi tuong ben trong Polyline_sop.lsp

có lisp nào để kiểm tra bên trong polyline có đối tượng (là layer khác) hay ko b

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

×