Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
17 replies to this topic

#1 viendinhngoc

viendinhngoc

    biết vẽ ellipse

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

Đã gửi 07 June 2014 - 05:11 PM

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....mdr3mlzu/RQ.PNG


  • 0

#2 viendinhngoc

viendinhngoc

    biết vẽ ellipse

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

Đã gửi 08 June 2014 - 09:54 PM

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


  • 0

#3 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 08 June 2014 - 10:16 PM

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


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

viendinhngoc

    biết vẽ ellipse

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

Đã gửi 09 June 2014 - 08:05 PM

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


  • 0

#5 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 14 June 2014 - 08:48 AM

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.


  • 0

#6 viendinhngoc

viendinhngoc

    biết vẽ ellipse

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

Đã gửi 17 June 2014 - 02:43 PM

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


  • 0

#7 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 17 June 2014 - 03:15 PM

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

  • 0

#8 viendinhngoc

viendinhngoc

    biết vẽ ellipse

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

Đã gửi 17 June 2014 - 09:08 PM

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)


  • 0

#9 viendinhngoc

viendinhngoc

    biết vẽ ellipse

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

Đã gửi 17 June 2014 - 10:37 PM

https://www.dropbox....inal Lam PL.dwg

sao file này mình không dùng brk được nhỉ


  • 0

#10 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 18 June 2014 - 03:55 AM

https://www.dropbox....inal Lam PL.dwg

sao file này mình không dùng brk được nhỉ

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, 


  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#11 viendinhngoc

viendinhngoc

    biết vẽ ellipse

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

Đã gửi 18 June 2014 - 07:22 AM

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

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

https://www.dropbox....inal Lam PL.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


  • 0

#12 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 18 June 2014 - 04:31 PM

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

  • 0

#13 viendinhngoc

viendinhngoc

    biết vẽ ellipse

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

Đã gửi 19 June 2014 - 10:26 PM

sao mình dùng lip tmp. nó vẫn khogn căt được bạn nhỉ lúc dùng lệnh xong nó vẫn hế

mà 2D polyline với polylin có khác nhau ntn bạn nhỉ


  • 0

#14 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 20 June 2014 - 08:16 AM

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

  • 0

#15 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 22 June 2014 - 08:24 AM

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

  • 0

#16 viendinhngoc

viendinhngoc

    biết vẽ ellipse

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

Đã gửi 29 June 2014 - 07:43 AM

cảm ơn bạn

nhưng khi đường cắt chỉ chạm vào nhau thi fkhoong cắt đươc

phải cắt hẳn qua nhau

bạn có thể sửa lại không


  • 0

#17 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 29 June 2014 - 10:08 AM

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.


  • 0

#18 viendinhngoc

viendinhngoc

    biết vẽ ellipse

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

Đã gửi 29 June 2014 - 01:38 PM

giờ m thử lại được rồi

chả biết sao thê

cảm ơn bạn nhé


  • 0