Đến nội dung


Hình ảnh
- - - - -

[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ỳ


  • Please log in to reply
13 replies to this topic

#1 duy267

duy267

    biết vẽ point

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

Đã gửi 15 February 2012 - 07:49 PM

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.
  • 0

#2 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 15 February 2012 - 07:55 PM

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)

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


#3 duy267

duy267

    biết vẽ point

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

Đã gửi 15 February 2012 - 11:03 PM

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.
  • 0

#4 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 15 February 2012 - 11:44 PM

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 ^^
  • 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


#5 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 16 February 2012 - 09:04 AM

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
  • 1

#6 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 16 February 2012 - 11:28 AM

Đ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


^^
  • 0

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


#7 duy267

duy267

    biết vẽ point

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

Đã gửi 16 February 2012 - 11:34 AM

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.
  • 0

#8 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 16 February 2012 - 02:05 PM


^^



^^

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ề.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#9 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 16 February 2012 - 02:24 PM

Đ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))
;;;;;

  • 0

#10 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 16 February 2012 - 02:47 PM

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.
  • 0

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


#11 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 16 February 2012 - 04:12 PM

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))

  • 2

#12 duy267

duy267

    biết vẽ point

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

Đã gửi 16 February 2012 - 08:41 PM

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)
))

  • 0

#13 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 16 February 2012 - 09:09 PM

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
  • 1

#14 duy267

duy267

    biết vẽ point

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

Đã gửi 16 February 2012 - 11:58 PM

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.
  • 0