Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
4 replies to this topic

#1 taybacincc

taybacincc

    biết vẽ circle

  • Members
  • PipPip
  • 34 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 03 November 2014 - 10:56 PM

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.


  • 0

#2 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 04 November 2014 - 07:44 AM

Đâ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.


  • 1

#3 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 04 November 2014 - 08:24 AM

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

  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#4 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5451 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 04 November 2014 - 08:26 AM

Xin lỗi delete phần đã post vì nhiều quá sinh loãng.


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#5 taybacincc

taybacincc

    biết vẽ circle

  • Members
  • PipPip
  • 34 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 04 November 2014 - 09:29 AM

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


  • 0