Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
Danh Cong

[Đã xong][Hỏi] Cách lọc đối tượng.

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

Chào các bác ạ. Em có câu hỏi, muốn nhờ các bác trợ giúp ạ.

Trong hình vẽ của em là 1 nhóm các  "Cặp" đối tượng Block.

Các block này giống nhau , em để màu đỏ với xanh chỉ là để dễ phân biệt thôi ạ.

Em muốn lọc các đối tượng Block nằm bên dưới mỗi "cặp" , tức là block màu đỏ.    ( Trong ảnh là 5 cặp block )

Em muốn code lisp để lọc nhưng ko biết làm như thế nào, mong các bác trợ giúp ạ.

:)))) Em xin cám ơn.

 

[Hoi] - Cach loc doi tuong.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

C1 Lấy hết block rồi duyệt gần nhất theo Insertion Point, được cặp nào thì xóa khỏi tập chọn
C2 : Định khoảng delta max, rồi duyệt từng block, dùng ssget CP/WP để chọn thằng gần nhất, xóa khỏi tập chọn
C3 : Số lượng quá lớn thì vẫn có thể làm 1 trong 2 cách trên, nhưng chặt nhỏ ra thành nhiều vùng tập chọn ^^

  • 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

Nhầm nều như ý thằng Công chính xác là nó đứng xiên xiên một góc fix như hình minh họa bác ạ. Bác cũng đang giải hướng đó. Còn cháu thì đang nghĩ theo hướng  Nearest Pair ^^

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

C1 Lấy hết block rồi duyệt gần nhất theo Insertion Point, được cặp nào thì xóa khỏi tập chọn
C2 : Định khoảng delta max, rồi duyệt từng block, dùng ssget CP/WP để chọn thằng gần nhất, xóa khỏi tập chọn
C3 : Số lượng quá lớn thì vẫn có thể làm 1 trong 2 cách trên, nhưng chặt nhỏ ra thành nhiều vùng tập chọn ^^

+ Theo hướng của anh thì khả thi với bài toán của em nhất.

 

@Doan Van Ha : Block của cháu nó ko liền nhau, nên cách của a KetXu áp dụng khả thi hơn ạ. :))

Cám ơn bác và cả anh nhiệt tình giúp đỡ :)))

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

Xoay trục toạ độ theo hướng nghiên đó rồi sorf cái 

Là xong mà.

nếu nó trùng nhau thì kiểm tra thêm 1 chút là được.

Còn cách khác là sort 1 chiều rồi kiểm tra cũng dc. Tham khảo bài này mình có viết lọc text

 

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

Xoay trục toạ độ theo hướng nghiên đó rồi sorf cái 

Là xong mà.

nếu nó trùng nhau thì kiểm tra thêm 1 chút là được.

Còn cách khác là sort 1 chiều rồi kiểm tra cũng dc. Tham khảo bài này mình có viết lọc text

 

Vâng, cám ơn bác nhé. Để em nghiên cứ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

bạn dùng lệnh fill thử xem,  gõ fill enter, sau đó b1;  chọn đối tượng cần lọc. b2: xoá tất các thuộc tính lọc chỉ chừa lại tên block và layer (hoặc color)  gì đó. sau đó apply . quét vùng chọn chứa đối tượng cần lọc.

image.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
17 giờ trước, thuvuithugian đã nói:

bạn dùng lệnh fill thử xem,  gõ fill enter, sau đó b1;  chọn đối tượng cần lọc. b2: xoá tất các thuộc tính lọc chỉ chừa lại tên block và layer (hoặc color)  gì đó. sau đó apply . quét vùng chọn chứa đối tượng cần lọc.

+  Trường hợp này các Block trùng Name, trùng Layer nên ko thể áp dụng :))  Dù sao cũng cám ơn bạn đã góp vui :v :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
Vào lúc 18/3/2021 tại 17:59, Danh Cong đã nói:

Chào các bác ạ. Em có câu hỏi, muốn nhờ các bác trợ giúp ạ.

Trong hình vẽ của em là 1 nhóm các  "Cặp" đối tượng Block.

Các block này giống nhau , em để màu đỏ với xanh chỉ là để dễ phân biệt thôi ạ.

Em muốn lọc các đối tượng Block nằm bên dưới mỗi "cặp" , tức là block màu đỏ.    ( Trong ảnh là 5 cặp block )

Em muốn code lisp để lọc nhưng ko biết làm như thế nào, mong các bác trợ giúp ạ.

:)))) Em xin cám ơn.

 

[Hoi] - Cach loc doi tuong.png

Đã xử lý được chưa 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

Bài toán được giải trên cơ sở khoảng cách giữa cặp xanh-đỏ là bé nhất so với các block còn lại. 

 

;;; khoảng cách 2 entity
(DEFUN khoangcach  (e1 e2)
  (DISTANCE (CDR (ASSOC 10 (ENTGET e1)))
            (CDR (ASSOC 10 (ENTGET e2)))
            )
  )

;;; trả về T nếu e1(Y) < e2 (Y)
(DEFUN y_be_hon  (e1 e2 / p1 p2)
  (SETQ p1 (CDR (ASSOC 10 (ENTGET e1)))
        p2 (CDR (ASSOC 10 (ENTGET e2)))
        )
  (< (CADR p1) (CADR p2))
  )


;;; nếu thỏa mãn khoảng cách d từ e1 đến 1 entity trong list sẽ trả về 1 entity đó, còn lại trả về nil 
(DEFUN timdiemthoaman  (e1 ls d / e3)

  (FOREACH e2  ls1
    (PROGN
      (SETQ d1 (khoangcach e1 e2))
      (IF (AND (= d1 d)
               (y_be_hon e1 e2)

               )
        (SETQ e3 e2)
        )
      )
    )

  e3
  )

;;;;; loc lay cac gia tri can tim
(DEFUN loclist  (ls d / ls2)
  (FOREACH e1  ls
    (IF (SETQ e2 (timdiemthoaman e1 ls d))
      (SETQ ls2 (APPEND ls2 (LIST e1)))
      )
    )
  ls2

  )

(SETQ ss1 (SSGET '((0 . "INSERT"))))
(SETQ ss (ss->ent ss1))
(SETQ e1  (CAR ss)
      e3  (CADR ss)
      ls1 (CDDR ss))

;;lấy khoảng cách bất kỳ
(SETQ d (khoangcach e1 e3))

 

;; so sánh để lấy khoảng bé nhất
(FOREACH e2  ls1
  (PROGN
    (SETQ d1 (khoangcach e1 e2))
    (IF (< d1 d)
      (SETQ d d1)
      )
    )
  )


(setq ls1 (loclist ss d))
(setq ss2 (ssadd))
(foreach n ls1
  (ssadd  n ss2)
  )
;;; ss2 la selection phần màu đỏ

;;(command "move" ss2 "" pause pause)

 

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

Nếu bác muốn lọc riêng từng loại block cùng layer theo màu thì có thể thử tool này nhé. 

 

Tool này có lọc theo cự ly với các block giống nhau về name, color, layer, scale ..., tức là giống nhau về mọi thứ, chỉ khác x,y,z thôi được không bạ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
7 phút trước, 7o7 đã nói:

Tool này có lọc theo cự ly với các block giống y chang nhau về name, color, layer, scale ... không bạn?

cái này chỉ mới dừng lại ở lọc theo các điều kiện : name, color , layer và kết hợp giữa các điều kiện thôi nhé 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
1 phút trước, CongNguyen91bn đã nói:

cái này chỉ mới dừng lại ở lọc theo các điều kiện : name, color , layer và kết hợp giữa các điều kiện thôi nhé bác.

Vậy là bác không đọc yêu cầu ở mục #1 của bác @Danh Cong rồi, mất công bác ấy lại phải cảm ơn bác vì đã góp vui 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
22 giờ trước, 7o7 đã nói:

Vậy là bác không đọc yêu cầu ở mục #1 của bác @Danh Cong rồi, mất công bác ấy lại phải cảm ơn bác vì đã góp vui rồi!!

Chắc Công nó tiện tay quảng cáo CTools 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

Em xin lỗi các bác :)) Mấy hôm ko dùng máy tính nên ko vô vào bình luận xem code các bác được :)))

@Doan Nguyen Van :)) Mình chưa xử lý code, nên chưa biết thế nào.

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 21/3/2021 tại 23:35, CongNguyen91bn đã nói:

Nếu bác muốn lọc riêng từng loại block cùng layer theo màu thì có thể thử tool này nhé. 

 

:))) Tool hữu dụng đó bạn, nhưng ko phải yêu cầu trong bài toán của mình.

A @KetXu :  Em có quảng cáo Tool đâu :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

Code em vừa tạo sơ cua đáp ứng vừa đủ nhu cầu của em.

:)))

Điều kiện áp dụng : 

+ Khoảng cách giữa các cặp Block không nhỏ hơn khoảng cách giữa 2 đối tượng Block trong 1 cặp.

+ Block 2 nằm dưới Block 1 trong 1 cặp.

File cad của em cần mỗi như thế này thôi. Cám ơn các bác đã nhiệt tình giúp đỡ :)))

 

; DIS  :   Nhap khoang cach tim kiem Block  = khoang cach min DAL giua 2 block gan nhat
(defun c:TEST (/ DIS DXF_10 DXF_OBJ LST_1 LST_2 OBJ_1 OBJ_2 P1 P2 SS)
  (vl-load-com)
  (defun dxf (id obj) (cdr (assoc id (entget obj))))
  ; ---------------------------------------------------------------------------------------
  (defun RFL (I L / L1 L2)
  (setq L1 (reverse (cdr (member I (reverse L)))))
  (setq L2 (cdr(member I L)))
  (append L1 L2)
  )
  ; ----------------------------------------------------------------------------------------
  (setq dis (getreal "\nNhap khoang cach tim kiem:"))
  (setq lst_1 (acet-ss-to-list (ssget '((0 . "INSERT")))))
  (setq lst_2 '())

  (while  (> (length lst_1) 0)
        (progn
          (setq obj_1 (nth 0 lst_1))
          
              (setq dxf_obj (entget obj_1))
            (setq dxf_10 (dxf 10 obj_1))
      
          (setq P1 (list (- (car dxf_10) dis) (- (cadr dxf_10) dis) 0.0))
          (setq P2 (list (+ (car dxf_10) dis) (+ (cadr dxf_10) dis) 0.0))
      
            (setq obj_2 (nth 0 (RFL obj_1 (acet-ss-to-list (ssget "C" P1 P2)))))
          
      

          (setq lst_1 (RFL obj_1 lst_1))
          (setq lst_1 (RFL obj_2 lst_1))

          (if (> (cadr (dxf 10 obj_1)) (cadr (dxf 10 obj_2)))
              (setq lst_2 (append lst_2 (list obj_2)))
              (setq lst_2 (append lst_2 (list obj_1)))
          )
      )
    )
(setq ss (SSADD))
  (foreach name lst_2 (ssadd name ss))
    (SSSETFIRST  nil ss )
  )

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

:))) Tool hữu dụng đó bạn, nhưng ko phải yêu cầu trong bài toán của mình.

A @KetXu :  Em có quảng cáo Tool đâu :v

A bảo thằng Thành Công kia cơ 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

Liệu có cách nào lọc các đối tượng dạng điểm nhanh nhất có thể không? Đệ qui thì rất lâu nếu số lượng nhiều. Chắc theo cách của @ketxu 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

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
Đăng nhập để thực hiện theo  

×