Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
taybacincc

Nhờ cách anh giúp về hàm vl-remove

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

Chào các ACE trên diễn đàn !!

Em có 1 câu hỏi nhờ các ACE trên diễn đàn chỉ giúp e với ạ.

Chả là e muốn chọn ra 1 nhóm đối tượng với 1 hay nhiều điều kiện lọc trong 1 nhóm đối tượng khác đã được chọn trước đó. E cũng viết được vài cái lisp cùi cùi rồi nên cũng biết sử dụng hàm ssget với điều kiện lọc nhưng nếu thế mà chọn nhiều nhóm đối tượng với các điều kiện lọc khác nhau thì sẽ phải chọn nhiều lần nên e muốn chọn 1 lần rồi lọc ra các nhóm đối tượng mình cần.

Ví dụ: E dùng hàm ssget để chọn 1 nhóm đối tượng rồi e muốn lọc ra nhóm ss1 là các pline thuộc layer 1,  nhóm ss2 thuộc layer 2, nhóm ss3 là dtext để tính toán chẳng hạn.

E thấy các a hay dùng hàm vl-remove-if  hay vl-remove gì đó nhưng e lại không hiểu lắm nên làm không ra.

Nếu được các anh viết cho 1 đoạn code rồi giải thích có được không ạ ?

Cảm ơn các ACE.

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

Đây là code theo mô tả của bạn.

 

(defun c:test ()
  (defun dxf (id v) (cdr (assoc id (entget v))))
  (setq ss (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget))))
ss1 (vl-remove-if-not '(lambda (x) (and (= (dxf 0 x) "LWPOLYLINE")  (= (dxf 8 x) "LAYER1"))) ss)
ss2 (vl-remove-if-not '(lambda (x) (= (dxf 8 x) "LAYER2")) ss)
ss3 (vl-remove-if-not '(lambda (x) (= (dxf 0 x) "TEXT")) ss)
  )
)

Giải thích :

ss là list gồm các đtượng được chọn.

ss1 :   loại bỏ các ptu của ss nếu không phải là pline và không thuộc layer1

ss2  :  loại bỏ các ptu của ss nếu không  thuộc layer2

ss3 :   loại bỏ các ptu của ss nếu không phải là 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

(vl-remove-if 'hàm list) : kiểm tra từng phần tử trong list, nếu phần tử đó làm cho hàm thoả mãn (~ #nil) thì xoá

(vl-remove-if-not 'hàm list) : kiểm tra từng phần tử trong list, nếu phần tử đó làm cho hàm không thoả mãn (~nil) thì xoá

Trong đó hàm có thể là đã được định nghĩa từ trước hoặc sử dụng lambda

 

 

(setq l '(1 2 3 0 4))
(vl-remove-if 'zerop l) : bằng 0 thì xoá
(vl-remove-if-not 'zerop l) : không bằng 0 thì xoá
(vl-remove-if '(lambda(x)(> x 1)) l) : lớn hơn 1 thì xoá
(vl-remove-if-not '(lambda(x)(> x 1)) l) : k lớn hơn 1 thì xoá
 
  • 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

Cảm ơn Anh Tot77, Anh Ket và Anh Đoàn Văn Hà nha. Anh Hà cứ để code đấy. Mỗi code lại có cái hay riêng mà, có nhiều cách khác nhau thì bọn e mới mót được nhiều thứ chứ.

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  

×