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

[Yêu cầu] – Lisp Trim hàng loạt đoạn thẳng nằm giữa nhiều đoạn thẳng song song.

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

Anh sơ ý post lên bản vẽ bị thừa 1 line nên mới vậy. Em down lại bản vẽ anh vừa up (link cũ) hoặc tự phóng tác ra thì sẽ thấy không sai đâu.

Cám ơn các Doan Van Ha và mọi người đã giúp đỡ, bây giờ thì đúng ý của em rồi, hì :)

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ắc lại:

 

Minh họa (dùng lisp bác PTB mà bạn Hoằn cứ chắc như đinh đóng cột):

http://www.cadviet.c...7029_trim_2.dwg

 

Hề hề hề,

Bác DoanvanHa ơi, sở dĩ kết quả bác chạy ra như vầy là do cái đường ngang thứ 3 từ dưới lên của bác có trùng một số các đoạn thẳng khác bác ạ, Bởi thế nên khi lấy tập hợp các điểm cắt thì nó bị dư ra nên cắt sai mà thôi. Nếu không bị trùng bác kiểm tra lại sẽ thấy nó không quá tệ đâu bác ạ.

Hề hề hề,....

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ề,

Bác DoanvanHa ơi, sở dĩ kết quả bác chạy ra như vầy là do cái đường ngang thứ 3 từ dưới lên của bác có trùng một số các đoạn thẳng khác bác ạ, Bởi thế nên khi lấy tập hợp các điểm cắt thì nó bị dư ra nên cắt sai mà thôi. Nếu không bị trùng bác kiểm tra lại sẽ thấy nó không quá tệ đâu bác ạ.

Hề hề hề,....

Srr bác là quá trình test chưa xóa hết các đường. Tuy nhiên, sau khi xóa chúng đị thì test lại nó vẫn chưa đúng ý đồ chủ topic bác ạ. Vì của bác ra toàn "khung cửa sổ 2 nhà cuối phố" :lol:

http://www.cadviet.com/upfiles/3/67029_trim_3.dwg

67029_trim_ptb2.png

  • 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

Srr bác là quá trình test chưa xóa hết các đường. Tuy nhiên, sau khi xóa chúng đị thì test lại nó vẫn chưa đúng ý đồ chủ topic bác ạ. Vì của bác ra toàn "khung cửa sổ 2 nhà cuối phố" :lol:

http://www.cadviet.c...7029_trim_3.dwg

 

Hề hề hề,

Sở dĩ nó ra khung cửa sổ chắc là do bác chọn một phát hết tất cả các line. Lisp mình viết hơi khác một chút, đó là không phải chọn một lúc tất cả các đường rồi sau đó chọn phương dọc hay ngang như chủ thớt đã nói mà mình làm cái việc chọn các đường cần cắt trước. Muốn ngang hay dọc thì người dùng sẽ tự chọn ở đây. Sau khi đã có các đường cần cắt mới chọn dao cắt sau bác ạ. Việc chọn dao cắt này do chính cái đường cần cắt nó chọn các line giao với nó. Thế rồi nó cắt cách quãng thôi.

Vì vậy nếu hình của bác gửi bác có thể chọn cắt thanh dọc hay thanh ngang trước đều OK cả bác ạ. Bác hãy thử lại nhé.

Mình gửi kèm đây cái lisp có chỉnh sửa thêm một chút để overkill những thằng trùng nhau trước khi cắt và săp xếp lại các point cắt theo param thay vì theo tọa độ x bác ạ. Như vậy thì các line có nằm xiên xẹo gì cũng có thể cắt được bác ạ.

http://www.cadviet.com/upfiles/3/5194_multitrim_2.lsp

Chúc bác vui.

  • 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

Lisp Trim 2n Lines này bởi 2m Lines khác, mà các Lines này song song với trục X và Y.

(defun C:HA( / ssd ssb layo lay lst3 lst4 pd pc p i)
;Doan Van Ha - CADViet.com - Ngay 10/12/2012
;Chuc nang: Trim 2n Lines boi 2m Lines khac. Cac Lines nay // voi truc X va Y.
(vl-load-com) (command "undo" "be") (setq layo (getvar "clayer"))
(if
 (and
  (princ "\nChon cac Line lam dao cat...")
  (setq ssd (ssget '((0 . "Line"))))
  (princ "\nChon cac Line bi cat...")
  (setq ssb (ssget '((0 . "Line")))))
 (progn
  (foreach ent1 (vl-remove-if 'listp (mapcar 'cadr (ssnamex ssb)))
   (setq lay (cdr (assoc 8 (entget ent1))))
   (setq lst3 (list (setq pd (cdr (assoc 10 (entget ent1)))) (setq pc (cdr (assoc 11 (entget ent1))))))
   (foreach ent2 (vl-remove-if 'listp (mapcar 'cadr (ssnamex ssd)))
(if (setq p (car (acet-geom-intersectwith ent1 ent2 0)))
     (setq lst3 (cons p lst3))))
   (if (equal (cadr pd) (cadr pc) 1E-8)
(setq lst4 (cons (list lay (vl-sort lst3 '(lambda (p1 p2) (> (car p1) (car p2))))) lst4))
(setq lst4 (cons (list lay (vl-sort lst3 '(lambda (p1 p2) (> (cadr p1) (cadr p2))))) lst4)))
   (vla-delete (vlax-ename->vla-object ent1)))
  (foreach lst (reverse lst4)
   (setq i 0)
   (repeat (/ (length (cadr lst)) 2)
(setvar "clayer" (car lst))
(entmake (list (cons 0 "LINE") (cons 10 (nth i (cadr lst))) (cons 11 (nth (1+ i) (cadr lst)))))
(setq i (+ i 2))))))
(setvar "clayer" layo) (command "undo" "end") (princ))

 

bác có thể thê m cắt được cả đối tượng là Pline được không ạ!

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ác có thể thê m cắt được cả đối tượng là Pline được không ạ!

Pline gấp khúc hay Pline thẳng chỉ gồm 2 điểm? Nếu là Pline thẳng chỉ gồm 2 điểm thì bạn tìm chữ "Line" và thay bằng chữ "Pline" là được. Riêng chữ "LINE" thì giữ nguyê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

trường hợp cả đường PLine làm dao cắt và các PLine bị cắt đều là Pline gấp khúc anh ạ!

Hề hề hề,

Hãy dùng thử cái lisp của mình coi có được không nhé.

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  

×