Đến nội dung


Hình ảnh
- - - - -

Chia Polyline kín thành các Polyline kín


  • Please log in to reply
9 replies to this topic

#1 Polyline

Polyline

    biết lệnh mirror

  • Members
  • PipPipPip
  • 159 Bài viết
Điểm đánh giá: 18 (tàm tạm)

Đã gửi 15 July 2013 - 02:31 PM

118851_divideclosepolyline.pngMình muốn chia một PLine kín thành các Pline kín nhỏ hơn (Xem ảnh).

Có thể chia bằng đường chéo hoặc đường bất kỳ, có thể chia thành 2 mảnh hoặc nhiều hơn.


  • 0

#2 Polyline

Polyline

    biết lệnh mirror

  • Members
  • PipPipPip
  • 159 Bài viết
Điểm đánh giá: 18 (tàm tạm)

Đã gửi 15 July 2013 - 02:45 PM

Ồ, mình quên mất, nhờ mod nào thêm hộ mình chữ [Yêu cầu] vào trước tiêu đề bài viết, xin cám ơn!


  • 0

#3 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 July 2013 - 03:02 PM

Mình muốn chia một PLine kín thành các Pline kín nhỏ hơn (Xem ảnh).

Có thể chia bằng đường chéo hoặc đường bất kỳ, có thể chia thành 2 mảnh hoặc nhiều hơn.

Với những chữ màu đỏ thì điều kiện đầu vào là như thế nào? Chia làm 2 thì sao? Chia làm N thì sao? User phải nhập cái gì?


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


#4 Polyline

Polyline

    biết lệnh mirror

  • Members
  • PipPipPip
  • 159 Bài viết
Điểm đánh giá: 18 (tàm tạm)

Đã gửi 15 July 2013 - 03:10 PM

Cám ơn bác HA!

Cách chia thế này bác ạ, trước hết chọn PLine kín cần chia.

Sau đó chia bằng cách pick 2 điểm cắt ngang qua PLine đó. Có thể làm nhiều lần như vậy để chia.


  • 0

#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 15 July 2013 - 05:24 PM

Cám ơn bác HA!

Cách chia thế này bác ạ, trước hết chọn PLine kín cần chia.

Sau đó chia bằng cách pick 2 điểm cắt ngang qua PLine đó. Có thể làm nhiều lần như vậy để chia.

 

Cái này đơn giản, đâu cần Lisp, chỉ cần BOUNDARY 2 vùng kín lại và xóa cái Pline cần chia là xong.


  • 0

#6 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 July 2013 - 06:23 PM

Cái này đơn giản, đâu cần Lisp, chỉ cần BOUNDARY 2 vùng kín lại và xóa cái Pline cần chia là xong.

Giải pháp này chỉ khả thi khi Pline kín không chứa/cắt các đối tượng khác.


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


#7 Polyline

Polyline

    biết lệnh mirror

  • Members
  • PipPipPip
  • 159 Bài viết
Điểm đánh giá: 18 (tàm tạm)

Đã gửi 15 July 2013 - 06:25 PM

Đây cũng là một ý tưởng. Tuy nhiên khi bản vẽ phức tạp và có nhiều đối tượng chồng chéo lên nhau thì lệnh Boundary -> Pick sẽ không còn đơn giản nữa!


  • 0

#8 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 15 July 2013 - 09:54 PM

Đây cũng là một ý tưởng. Tuy nhiên khi bản vẽ phức tạp và có nhiều đối tượng chồng chéo lên nhau thì lệnh Boundary -> Pick sẽ không còn đơn giản nữa!

 

Bạn up hình đơn giản không có đối tượng chồng chéo thì câu trả lời đơn gian là thế. Nếu đối tượng chống chéo thì câu trả lời cũng đơn giản, sử dụng CAD giải quyết ngon lành:

Bạn xem video :

http://www.youtube.com/watch?v=-swgoVQ89A4&feature=youtu.be


  • 1

#9 Polyline

Polyline

    biết lệnh mirror

  • Members
  • PipPipPip
  • 159 Bài viết
Điểm đánh giá: 18 (tàm tạm)

Đã gửi 16 July 2013 - 12:09 PM

Bạn có ... bài nhạc hay quá, rất hợp gu mình! :)

Câu trả lời của bạn rất công phu, có cả clip đi kèm, nếu có nhiều người như bạn thì chất lượng của diễn đàn sẽ tăng lên rất nhiều.

Việc dùng một hình đơn giản để thể hiện là phù hợp bạn ạ - trong tính kết cấu, nó giống như việc chuyển từ sơ đồ thực về sơ đồ tính vậy! Hơn nữa, việc dùng một hình đơn giản nhằm giúp người xem loại bỏ những thông tin gây nhiễu không cần thiết khác.

Nếu bạn chia PLine thành 2 phần, cách làm của bạn hoàn toàn hợp lý. Nhưng nếu bạn chia thành ... 20 phần, nó sẽ phát sinh những vấn đề mới:

- 2 phần ngoài mép có thể làm theo cách của bạn (chọn thuộc tính Close trong Properties).

- Đối với các phần bên trong bạn phải vẽ các Line nối các điểm mới bị ngắt, sau đó nối chúng lại với nhau. Sau khi nối xong bạn sẽ mất Line đó đi, và phải vẽ thêm một Line nữa (trùng với Line bị mất) và tiếp tục nối cho để tạo ra Pline kín mới.

 

Hơn nữa, đây là công việc đơn điệu, chậm và nhàm chán, đó là lý do mình cần có một Lisp để làm việc này bạn ạ!

Sau khi các vấn đề trên được giải quyết, mình dự định sẽ mở rộng ra cho Pline có ARC và Pline đã bị "SPLINE hóa" nữa.


  • 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 July 2013 - 02:06 PM

Lisp chia đôi nhiều lần 1 Pline kín không chứa Arc. Vòng lặp cho đến khi Enter thì ngừng chia.

;; Chia Pline kin khong chua Arc thanh 2 Pline kin. Vong lap den khi Enter thi dung.
;; Doan Van Ha - CadViet.com - 16/7/2013
(defun C:HA( / #List:Subtract1 #List:SubList LM:Collinear-p1 #List:InsertNth LWPoly ent p1 p2 lst i lst1 n1 n2)
 (defun #List:Subtract1(lst1 lst2)
  (foreach n (reverse (cdr (reverse (cdr lst2))))
   (setq lst1 (vl-remove n lst1))))
 (defun #List:SubList(lst start len / i tmp)
  (setq len (if len (min len (- (length lst) start)) (- (length lst) start)) i (+ start len))
  (repeat len
   (setq tmp (cons (nth (setq i (1- i)) lst) tmp))))
 (defun #List:InsertNth(x n lst)
  ((lambda(i) (apply 'append (mapcar '(lambda(a) (if (= n (setq i (1+ i))) (list x a) (list a))) lst))) -1))
 (defun LWPoly (lst cls)
  (entmakex (append (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline") (cons 90 (length lst)) (cons 70 cls)) (mapcar (function (lambda (p) (cons 10 p))) lst))))
 (defun LM:Collinear-p1 (p1 pg p2)
  (equal (+ (distance p1 pg) (distance p2 pg)) (distance p1 p2) 1E-8))
;; main function
 (command "undo" "be")
 (while
  (and
   (setq ent (car (entsel "\nChon Pline kin: ")))
   (setq p1 (getpoint "\nPick diem thu 1 tren Pline: "))
   (setq p2 (getpoint p1 "\nPick diem thu 2 tren Pline: ")))
  (setq lst (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget ent))))
  (setq i -1 lst1 lst)
  (repeat (1- (length lst1))
   (if (LM:Collinear-p1 (nth (setq i (1+ i)) lst1) p1 (nth (1+ i) lst1))
    (setq lst (#List:InsertNth p1 (1+ i) lst1))))
  (setq i -1 lst1 lst)
  (repeat (1- (length lst1))
   (if (LM:Collinear-p1 (nth (setq i (1+ i)) lst1) p2 (nth (1+ i) lst1))
    (setq lst (#List:InsertNth p2 (1+ i) lst1))))
  (setq n1 (min (vl-position p1 lst) (vl-position p2 lst)))
  (setq n2 (max (vl-position p1 lst) (vl-position p2 lst)))
  (LWPoly (setq lst1 (#List:SubList lst n1 (- n2 n1 -1))) 1)
  (LWPoly (#List:Subtract1 lst lst1) 1)
  (entdel ent))
 (command "undo" "e"))
 

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