Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
viendinhngoc

Nhờ viết lisp chia Line hoặc Polyline thành nhiều đoạn Polyline

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

mình có yêu cầu thế này nhớ bác nào biết viết giùm mình với

1. m có 1 đường line hoặc poly

giao với nhiều đường line hoặc polyline giờ mình muốn tại chỗ giao nhau nó sẽ chia thành nhiều 1 đường polyline có nhiều đoạn

2. tiếp là 1 lisp chía 1 poLYLINE THÀNH 2 polyline riêng biệt

mình cảm ơn nhé

https://www.dropbox.com/s/9towy53mdr3mlzu/RQ.PNG

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

help me bác nào biết chỉ mình với

Câu hỏi của bạn khá tối nghĩa.

Ý 1: "Nhiều" là bao nhiêu?

Ý 2: bạn có bao nhiêu cách chia 1 cái bánh thành 2 phần? Một cách duy nhất hay hàng vạn cách? Chia Pline làm 2 cũng thế.

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

1. Ý bạn là muốn cắt pline thành nhiều đoạn tại giao điểm hay là vẫn chỉ là 1 pline nhưng có thêm đỉnh tại giao điểm?

2. Bạn dùng lệnh break để cắt 1 pline thành 2, không cần dùng lisp.

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

mình muốn có lisp chia cho nhanh như trong hình có nhiều đường thẳng giao với nó

mình muốn tại tất cả đường giao đều chia thanh pline

 

1. Ý bạn là muốn cắt pline thành nhiều đoạn tại giao điểm hay là vẫn chỉ là 1 pline nhưng có thêm đỉnh tại giao điểm?

2. Bạn dùng lệnh break để cắt 1 pline thành 2, không cần dùng lisp.

mình không dugnf break muốn cát thành 1pline nhiều đoạn nên break không đượ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

Bạn thử cái này xem. 

 

(defun c:brk(/ ent os)
  (vl-load-com)
  (defun ints (o1 o2 / l0 l)
    (setq l (vlax-Invoke (vlax-EName->vla-Object o1) "IntersectWith" (vlax-EName->vla-Object o2) acExtendBoth)
 l0 nil)
    (while l
      (setq l0 (append l0 (list (list (car l) (cadr l) (caddr l))))
   l (cdddr l)))
    l0
  )
  (command "undo" "be") 
  (setq ent (car (entsel "\nChon Line/Polyline bi cat:"))
os (getvar 'osmode))
  (setvar 'osmode 0)
  (prompt "\nChon cac Line/Polyline de cat:")
  (mapcar '(lambda(x) (mapcar '(lambda(y) (command "break" ent y y)) (ints ent x)))
    (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "LINE,*POLYLINE")))))))
  (command "undo" "e") (setvar 'osmode os)
)

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 thử cái này xem. 

 

(defun c:brk(/ ent os)
  (vl-load-com)
  (defun ints (o1 o2 / l0 l)
    (setq l (vlax-Invoke (vlax-EName->vla-Object o1) "IntersectWith" (vlax-EName->vla-Object o2) acExtendBoth)
 l0 nil)
    (while l
      (setq l0 (append l0 (list (list (car l) (cadr l) (caddr l))))
   l (cdddr l)))
    l0
  )
  (command "undo" "be") 
  (setq ent (car (entsel "\nChon Line/Polyline bi cat:"))
os (getvar 'osmode))
  (setvar 'osmode 0)
  (prompt "\nChon cac Line/Polyline de cat:")
  (mapcar '(lambda(x) (mapcar '(lambda(y) (command "break" ent y y)) (ints ent x)))
    (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "LINE,*POLYLINE")))))))
  (command "undo" "e") (setvar 'osmode os)
)

 

 

Cảm ơn lisp của bạn nhưng mình muốn là sau khi cắt nó là 1 polyline gồm nhiều polyline con ( giống kích chọn 1 poly thì chọn luôn tất cả poly ấy)

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

Hãy xem lại cách sử dụng lệnh break. mình vẫn break được ngon là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

m làm vẫn không được

làm trong bản vẽ mới thì được

https://www.dropbox.com/s/s64obhgys7irnzk/Ban%20in%20-%20Sua%20mat%20duong%20%285-4-14%29%20final%20Lam%20PL.dwg

chỗ mình cần cắt

khi chọn đối tượng

lần 1 thì nó không chọn được

phải tích lần 2 mới chọn đường cần cắt được

mà 2D polyline vơi polyline có khác gì nhau không

vì minh muốn lấy tọa độ polyline

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 dùng cái này. Chỉ dùng với pline không đoạn cong.

 

(defun c:tmp()
  (vl-load-com)
  (defun ints (o1 o2 / l0 l)
    (setq l (vlax-Invoke (vlax-EName->vla-Object o1) "IntersectWith" (vlax-EName->vla-Object o2) acExtendBoth)
 l0 nil)
    (while l
      (setq l0 (append l0 (list (list (car l) (cadr l) (caddr l))))
   l (cdddr l)))
    l0
  )
  (defun themdinh (v pt / entg li ptl entg1 )    
    (vla-addVertex (setq obj (vlax-ename->vla-object v))
       (1+  (fix (setq ptp (vlax-curve-getparamatpoint obj (vlax-curve-getClosestPointTo obj pt)))))
        (vlax-make-variant
            (vlax-safearray-fill
                (vlax-make-safearray vlax-vbdouble (cons 0 1))
                    (list (car (vlax-curve-getpointatparam obj ptp)) (cadr (vlax-curve-getpointatparam obj ptp)))
            )
        )
    )
  )
  ;;;
  (command "undo" "be") 
  (setq ent (car (entsel "\nChon Line/Polyline bi cat:")))
  (cond ((= (cdr (assoc 0 (entget ent))) "POLYLINE") (command "convertpoly" "L" ent ""))
((= (cdr (assoc 0 (entget ent))) "LINE") (command "pedit" ent "y" "" "") (setq ent (entlast))))
 
  (prompt "\nChon cac Line/Polyline de cat:")
  (mapcar '(lambda(x) (mapcar '(lambda(y) (themdinh ent y)) (ints ent x)))
    (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "LINE,*POLYLINE")))))))
  (command "undo" "e") (princ)
)

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 dùng cái này thử, cho phép chọn nhiều đường bị cắt 1 lúc.

Trong hình bạn đưa là dạng Heavy polyline, cad cũ hay xài. Bây giờ cad xài loại LWPolyline. Cả 2 đều là 2DPolyline nhưng cấu trúc khác nhau. 

 

(defun c:tmp(/ ss)
  (vl-load-com)
  (defun ints (o1 o2 mode / l0 l)
    (setq l (vlax-Invoke (vlax-EName->vla-Object o1) "IntersectWith" (vlax-EName->vla-Object o2) mode)
 l0 nil)
    (while l
      (setq l0 (append l0 (list (list (car l) (cadr l) (caddr l))))
   l (cdddr l)))
    l0
  )
  (defun themdinh (v pt / obj ptp)    
    (vla-addVertex (setq obj (vlax-ename->vla-object v))
       (1+  (fix (setq ptp (vlax-curve-getparamatpoint obj (vlax-curve-getClosestPointTo obj pt)))))
        (vlax-make-variant
            (vlax-safearray-fill
                (vlax-make-safearray vlax-vbdouble (cons 0 1))
                    (list (car (vlax-curve-getpointatparam obj ptp)) (cadr (vlax-curve-getpointatparam obj ptp)))
            )
        )
    )
  )
  ;;;
  (command "undo" "be")
  (prompt "\nChon Line/Polyline bi cat:")
  (setq ss (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "LINE,*POLYLINE")))))))
  (mapcar '(lambda(x) (cond ((= (cdr (assoc 0 (entget x))) "POLYLINE") (command "convertpoly" "L" x ""))
   ((= (cdr (assoc 0 (entget x))) "LINE") (command "pedit" x "y" "" "") (setq ss (subst (entlast) x ss))))) ss)
  (prompt "\nChon cac Line/Polyline de cat:")
  (mapcar '(lambda(x)
    (mapcar '(lambda(y)
      (mapcar '(lambda(z) (themdinh y z)) (ints x y acExtendBoth)))  ss))
 (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "LINE,*POLYLINE")))))))
  (command "undo" "e") (princ)
)

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

File của bạn đụng vấn đề về ucs, tôi sửa lại lisp để dùng với mọi ucs.

 

(defun c:tmp(/ ss)
  (vl-load-com)
  (defun ints (o1 o2 mo / l0 l)
    (setq l (vlax-Invoke (vlax-EName->vla-Object o1) "IntersectWith" (vlax-EName->vla-Object o2) mo)
l0 nil)
    (while l
      (setq l0 (append l0 (list (list (car l) (cadr l) (caddr l))))
 l (cdddr l)))
    l0
  )
 
  (defun themdinh (v pt / obj ptp)    
    (vla-addVertex (setq obj (vlax-ename->vla-object v))
       (1+ (fix (setq ptp (vlax-curve-getparamatpoint obj (vlax-curve-getClosestPointTo obj pt)))))
        (vlax-make-variant
            (vlax-safearray-fill
                (vlax-make-safearray vlax-vbdouble (cons 0 1))
                    (list (car  (trans (vlax-curve-getpointatparam obj ptp) 0 v))
 (cadr (trans (vlax-curve-getpointatparam obj ptp) 0 v)))))
    )  
  )
  ;;;
  (command "undo" "be")
  (prompt "\nChon Line/Polyline bi cat:")
  (setq ss (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "LINE,*POLYLINE")))))))
  (mapcar '(lambda(x) (cond ((= (cdr (assoc 0 (entget x))) "POLYLINE") (command "convertpoly" "L" x ""))
   ((= (cdr (assoc 0 (entget x))) "LINE") (command "pedit" x "y" "") (setq ss (subst (entlast) x ss))))) ss)
  (prompt "\nChon cac Line/Polyline de cat:")
  (mapcar '(lambda(x)
    (mapcar '(lambda(y)
      (mapcar '(lambda(z) (themdinh y z)) (ints x y acExtendBoth))) ss))
 (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "LINE,*POLYLINE")))))))
  (command "undo" "e") (princ)
)

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Ôi thấy vẫn cắt được mà, thậm chí 2 cái không chạm nhau vẫn cắt được (theo file bạn gửi).

Nếu không thì bạn gửi file không cắt được để tôi test lại.

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  

×