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

[Yêu cầu] Lisp tìm tập hợp các hình chữ nhật có diện tích bất kỳ

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

Nhờ anh em trên diễn đàn viết dùm đoạn code tìm tập hợp các hình chữ nhật có diện tích nhỏ hơn 50. Xin cảm ơn nhiề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

Nhờ anh em trên diễn đàn viết dùm đoạn code tìm tập hợp các hình chữ nhật có diện tích nhỏ hơn 50. Xin cảm ơn nhiều.

Bạn cần nói rõ hơn:

- Hình chữ nhật đó được vẽ bằng line hay lwpolyline... Tốt nhất là upload bản vẽ lên

- Tìm ra rồi làm gì: xuất kết quả ra file, hay để delete, copy...

Lisp dưới đây chọn các hình chữ nhật vẽ bằng Lwpolyline, có diện tích < 50. Trả về list các ename.

;Doan Van Ha - CADViet.com - Ngay 15-02-2012
;Muc dich: chon cac hinh chu nhat co S < 50. Tra ve list cac ename.
(defun C:HA( / lstent lst lst1)
(vl-load-com)
(princ "\nChon cac doi tuong: ")
(setq lstent (acet-ss-to-list (ssget '((-4 . "<AND") (0 . "LWPOLYLINE") (-4 . "<OR") (90 . 4) (90 . 5) (-4 . "OR>") (-4 . "AND>")))))
(foreach ent lstent
 (setq lst (acet-geom-vertex-list ent))
 (if (and (equal (distance (nth 0 lst) (inters (nth 0 lst) (nth 2 lst) (nth 1 lst)  (nth 3 lst))) (distance (nth 1 lst) (inters (nth 0 lst) (nth 2 lst) (nth 1 lst)  (nth 3 lst))) 1E-8)
           	(equal (distance (nth 1 lst) (inters (nth 0 lst) (nth 2 lst) (nth 1 lst)  (nth 3 lst))) (distance (nth 2 lst) (inters (nth 0 lst) (nth 2 lst) (nth 1 lst)  (nth 3 lst))) 1E-8)
           	(equal (distance (nth 2 lst) (inters (nth 0 lst) (nth 2 lst) (nth 1 lst)  (nth 3 lst))) (distance (nth 3 lst) (inters (nth 0 lst) (nth 2 lst) (nth 1 lst)  (nth 3 lst))) 1E-8)
           	(equal (distance (nth 3 lst) (inters (nth 0 lst) (nth 2 lst) (nth 1 lst)  (nth 3 lst))) (distance (nth 0 lst) (inters (nth 0 lst) (nth 2 lst) (nth 1 lst)  (nth 3 lst))) 1E-8)
           	(< (vlax-curve-getArea ent) 50))
  (setq lst1 (cons ent lst1))))
lst1)

  • 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

Hehe Không ngờ bác trả lời sớm vậy. Thanks bác Hà nhiều lắm. Hình chữ nhật được tạo bời đường Line hay lwpolyline thì em hiểu rồi, cái mà em chưa hiểu là cái dòng màu đỏ đó. Thì ra cần phải thêm cái vòng lặp Foreach vào. Mục đích của em là tìm ra được entname của một nhóm đối tương nào đó thỏa mảng một hay nhiều điều kiện cho trước mà không có trong dxf của chúng, từ đó mình sẽ dễ dàng truy xuất đối tượng như xóa, copy, move...và rất nhiều việc khác nữa. Hàm acet-ss-to-list và hàm acet-geom-vertex-list hay quá. Trước giờ toàn truy xuất thông qua dxf thật mất công. Nhưng em có một chút thắc mắt là cái dòng lst1 ờ cuối lisp có ý nghĩa gì vì nếu bỏ đi thì lisp vẫn chạy ngon lành.

Nhân tiện hỏi bác Hà thêm một câu: có thể tìm tập hợp các hcn trên mà có thứ tự ưu tiên theo ý mình được không, ví dụ ưu tiên từ trái qua phải (hcn bên trái đầu tiên sẽ có index=0, tiếp theo là 1,2...n) khi lấy điểm góc trái dưới làm chuẩn. Nghe nói hàm vl-sort có thể làm được việc này.

Một lần nữa xin chân thành cảm ơn 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

Hehe Không ngờ bác trả lời sớm vậy. Thanks bác Hà nhiều lắm. Hình chữ nhật được tạo bời đường Line hay lwpolyline thì em hiểu rồi, cái mà em chưa hiểu là cái dòng màu đỏ đó. Thì ra cần phải thêm cái vòng lặp Foreach vào. Mục đích của em là tìm ra được entname của một nhóm đối tương nào đó thỏa mảng một hay nhiều điều kiện cho trước mà không có trong dxf của chúng, từ đó mình sẽ dễ dàng truy xuất đối tượng như xóa, copy, move...và rất nhiều việc khác nữa. Hàm acet-ss-to-list và hàm acet-geom-vertex-list hay quá. Trước giờ toàn truy xuất thông qua dxf thật mất công. Nhưng em có một chút thắc mắt là cái dòng lst1 ờ cuối lisp có ý nghĩa gì vì nếu bỏ đi thì lisp vẫn chạy ngon lành.

Nhân tiện hỏi bác Hà thêm một câu: có thể tìm tập hợp các hcn trên mà có thứ tự ưu tiên theo ý mình được không, ví dụ ưu tiên từ trái qua phải (hcn bên trái đầu tiên sẽ có index=0, tiếp theo là 1,2...n) khi lấy điểm góc trái dưới làm chuẩn. Nghe nói hàm vl-sort có thể làm được việc này.

Một lần nữa xin chân thành cảm ơn bác.

 

Dòng lst1 ở cuối dùng để lấy lst1 cho kết quả hàm trả về

Câu hỏi của bạn :

(vl-sort   
(vl-remove-if-not             	;Xoa phan tu khong thoa ham dieu kien
 '(lambda(x)(< (vla-get-Area (vlax-ename->vla-object x)) 50)) 	;Ham dieu kien
  (acet-ss-to-list          	;List dieu kien
(ssget (list (cons 0 "LWPOLYLINE")(cons 90 4) (cons 70 1)))  ;Bo loc HCN
  )
)
'(lambda(a B)            	;Ham sap xep. Phan tu a se dung truoc b neu ham tra ve T
(<               	;Chieu sap xep
 (car (apply 'mapcar (cons 'min (acet-geom-vertex-list a))))	;Loc ra diem trai HCN
 (car (apply 'mapcar (cons 'min (acet-geom-vertex-list B))))
))
)

Mình ví dụ với HCN vẽ Rectang. Bạn đọc dòng mình chú thích nhé, có gì khó hiểu cứ hỏi ^^

  • 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

Bạn cần nói rõ hơn:

- Hình chữ nhật đó được vẽ bằng line hay lwpolyline... Tốt nhất là upload bản vẽ lên

- Tìm ra rồi làm gì: xuất kết quả ra file, hay để delete, copy...

Lisp dưới đây chọn các hình chữ nhật vẽ bằng Lwpolyline, có diện tích < 50. Trả về list các ename.

;Doan Van Ha - CADViet.com - Ngay 15-02-2012
;Muc dich: chon cac hinh chu nhat co S < 50. Tra ve list cac ename.
(defun C:HA( / lstent lst lst1)
(vl-load-com)
(princ "\nChon cac doi tuong: ")
(setq lstent (acet-ss-to-list (ssget '((-4 . "<AND") (0 . "LWPOLYLINE") (-4 . "<OR") (90 . 4) (90 . 5) (-4 . "OR>") (-4 . "AND>")))))
(foreach ent lstent
 (setq lst (acet-geom-vertex-list ent))
 (if (and (equal (distance (nth 0 lst) (inters (nth 0 lst) (nth 2 lst) (nth 1 lst)  (nth 3 lst))) (distance (nth 1 lst) (inters (nth 0 lst) (nth 2 lst) (nth 1 lst)  (nth 3 lst))) 1E-8)
           	(equal (distance (nth 1 lst) (inters (nth 0 lst) (nth 2 lst) (nth 1 lst)  (nth 3 lst))) (distance (nth 2 lst) (inters (nth 0 lst) (nth 2 lst) (nth 1 lst)  (nth 3 lst))) 1E-8)
           	(equal (distance (nth 2 lst) (inters (nth 0 lst) (nth 2 lst) (nth 1 lst)  (nth 3 lst))) (distance (nth 3 lst) (inters (nth 0 lst) (nth 2 lst) (nth 1 lst)  (nth 3 lst))) 1E-8)
           	(equal (distance (nth 3 lst) (inters (nth 0 lst) (nth 2 lst) (nth 1 lst)  (nth 3 lst))) (distance (nth 0 lst) (inters (nth 0 lst) (nth 2 lst) (nth 1 lst)  (nth 3 lst))) 1E-8)
           	(< (vlax-curve-getArea ent) 50))
  (setq lst1 (cons ent lst1))))
lst1)

Điều kiện logic sau hàm IF có thể viết gọn hơn :

;;;;;;


 (if (and  (null (inters (nth 0 lst) (nth 1 lst) (nth 2 lst) (nth 3 lst)))
             (equal (abs (sin (- (angle (nth 0 lst) (nth 3 lst)) (angle (nth 0 lst) (nth 1 lst))))) 1.0 1E-8)
        	(< (vlax-curve-getArea ent) 50))
;;;;;

Hình thang có 1 góc vuông là Hình chữ nhật

  • 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

Điều kiện logic sau hàm IF có thể viết gọn hơn :

Hình thang có 1 góc vuông là Hình chữ nhật

 

^^

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

Rất cảm ơn 3 bác đã tận tình giúp đỡ, thật là có nhiều cách để lọc điều kiện mà em vẫn chưa biết. Hiện tại chưa có gì để hỏi vì cần có thời gian đọc và hiểu nữa hehe. Một lần nữa xin chân thành cảm ơn các 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

 

^^

 

 

^^

Hề hề hề,

Nếu có 1 ắt phải có hai và thế là nó được gọi là Hình thang vuông.

Nếu có hai góc vuông cùng kề một cạnh đáy thì nó sẽ có 4 góc vuông và có quyền gọi nó là Hình chữ nhật.

Hề hề hề.

  • 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

Điều kiện logic sau hàm IF có thể viết gọn hơn :

;;;;;;


 (if (and  (null (inters (nth 0 lst) (nth 1 lst) (nth 2 lst) (nth 3 lst)))
             (equal (abs (sin (- (angle (nth 0 lst) (nth 3 lst)) (angle (nth 0 lst) (nth 1 lst))))) 1.0 1E-8)
    		(< (vlax-curve-getArea ent) 50))
;;;;;

Hình thang có 1 góc vuông là Hình chữ nhật

Hình bình hành có 1 góc vuông mới là Hình chữ nhật . Sorry :wub:

 

;;;;;;

 (if (and  (null (inters (nth 0 lst) (nth 1 lst) (nth 2 lst) (nth 3 lst)))
             (null (inters (nth 0 lst) (nth 3 lst) (nth 1 lst) (nth 2 lst)))
             (equal (abs (sin (- (angle (nth 0 lst) (nth 3 lst)) (angle (nth 0 lst) (nth 1 lst))))) 1.0 1E-8)
    		(< (vlax-curve-getArea ent) 50))
;;;;;

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

Sáng giờ "mất mạng", giờ mới vào Internet được. Thấy các bác bàn về điều kiện HCN cũng vui vui. Trong llsp của tôi bị dư 1 điều kiên: nó là hệ quả tất yếu của 3 điều kiện còn lại (không xét đk S<50).

@Tue_NV: có lẽ bác sơ ý.

@PTB: của bác cũng 3 điều kiện.

Ngoài ra, nó còn nhiều cách, ví dụ:

- Hình bình hành có 1 góc vuông (3đk).

- Hình có 3 góc vuông (3đk).

Có cách nào để xác định HCN chỉ bằng 2 đk không nhỉ?

(Ác thay là phải dùng "equal", chứ dùng hàm "=" thì đơn giản hơn).

P/S: ngồi viết lâu quá, up xong thì thấy ý kiến bác Tue_NV ở trên, srr.

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

Sáng giờ "mất mạng", giờ mới vào Internet được. Thấy các bác bàn về điều kiện HCN cũng vui vui. Trong llsp của tôi bị dư 1 điều kiên: nó là hệ quả tất yếu của 3 điều kiện còn lại (không xét đk S<50).

@Tue_NV: có lẽ bác sơ ý.

@PTB: của bác cũng 3 điều kiện.

Ngoài ra, nó còn nhiều cách, ví dụ:

- Hình bình hành có 1 góc vuông (3đk).

- Hình có 3 góc vuông (3đk).

Có cách nào để xác định HCN chỉ bằng 2 đk không nhỉ?

(Ác thay là phải dùng "equal", chứ dùng hàm "=" thì đơn giản hơn).

P/S: ngồi viết lâu quá, up xong thì thấy ý kiến bác Tue_NV ở trên, srr.

xác định HCN chỉ bằng 2 điều kiện đây bạn


(if (and  (equal (ACET-GEOM-MIDPOINT (nth 1 lst) (nth 3 lst)) (ACET-GEOM-MIDPOINT (nth 0 lst) (nth 2 lst)) 1E-8)     
             (equal (abs (sin (- (angle (nth 0 lst) (nth 3 lst)) (angle (nth 0 lst) (nth 1 lst))))) 1.0 1E-8)
     (< (vlax-curve-getArea ent) 50))

  • Vote tăng 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

Các bác tham gia nhiệt tình quá, cách của bác Tuệ ngắn thật. Em cũng xin góp một chút hàm lọc HCN (hơi dài).

(if (and
(equal (* (distance (nth 0 lst) (nth 2 lst)) (distance (nth 0 lst) (nth 2 lst))) (+ (* (distance (nth 0 lst) (nth 1 lst)) (distance (nth 0 lst) (nth 1 lst))) (* (distance (nth 1 lst) (nth 2 lst)) (distance (nth 1 lst) (nth 2 lst)))) 1E-8)
(equal (* (distance (nth 0 lst) (nth 2 lst)) (distance (nth 0 lst) (nth 2 lst))) (+ (* (distance (nth 0 lst) (nth 3 lst)) (distance (nth 0 lst) (nth 3 lst))) (* (distance (nth 2 lst) (nth 3 lst)) (distance (nth 2 lst) (nth 3 lst)))) 1E-8)
))

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ác bác tham gia nhiệt tình quá, cách của bác Tuệ ngắn thật. Em cũng xin góp một chút hàm lọc HCN (hơi dài).

(if (and
(equal (* (distance (nth 0 lst) (nth 2 lst)) (distance (nth 0 lst) (nth 2 lst))) (+ (* (distance (nth 0 lst) (nth 1 lst)) (distance (nth 0 lst) (nth 1 lst))) (* (distance (nth 1 lst) (nth 2 lst)) (distance (nth 1 lst) (nth 2 lst)))) 1E-8)
(equal (* (distance (nth 0 lst) (nth 2 lst)) (distance (nth 0 lst) (nth 2 lst))) (+ (* (distance (nth 0 lst) (nth 3 lst)) (distance (nth 0 lst) (nth 3 lst))) (* (distance (nth 2 lst) (nth 3 lst)) (distance (nth 2 lst) (nth 3 lst)))) 1E-8)
))

Bạn xem lại thử nhé :

Tứ giác ABCD có ABC là tam giác vuông tại B và tam giác ADC vuông tại D thì chưa chắc nó là 1 hình chữ nhật đâu nhé.

Để xây dựng phép tính lũy thừa bạn có thể dùng hàm expt

Ví dụ :

Command: (expt 2 4)

16

Command: (expt 3.0 2.0)

9.0

 

Bây giờ thì không được sử dụng hàm AND nữa (đồng nghĩa sau hàm If chỉ có 1 điều kiện logic duy nhất) -> Xây dựng hàm kiểm tra tứ giác ABCD có phải là hình chữ nhật hay không qua câu đố ở đây :

http://www.cadviet.c...00

 

Xin mời bạn duy267 và các bác tham gia giải đố cho vui

  • 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

Bạn xem lại thử nhé :

Tứ giác ABCD có ABC là tam giác vuông tại B và tam giác ADC vuông tại D thì chưa chắc nó là 1 hình chữ nhật đâu nhé.

Để xây dựng phép tính lũy thừa bạn có thể dùng hàm expt

Ví dụ :

Command: (expt 2 4)

16

Command: (expt 3.0 2.0)

9.0

 

Bây giờ thì không được sử dụng hàm AND nữa (đồng nghĩa sau hàm If chỉ có 1 điều kiện logic duy nhất) -> Xây dựng hàm kiểm tra tứ giác ABCD có phải là hình chữ nhật hay không qua câu đố ở đây :

http://www.cadviet.c...00

 

Xin mời bạn duy267 và các bác tham gia giải đố cho vui

Hehe vậy là em đã sai, tứ giác có 2 góc vuông đối diện là tứ giác nội tiếp đường tròn. Càm ơn bác về hàm expt, thật tuyệt nay mới biết.

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  

×