Đến nội dung


Hình ảnh
- - - - -

Lisp thêm đỉnh pline tại giao điểm của pline và các line khác


  • Please log in to reply
30 replies to this topic

#21 thanhlong.hygt

thanhlong.hygt

    biết vẽ pline

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

Đã gửi 26 September 2013 - 01:07 PM

E đã test bác ạ.

- Test Lisp cũ trước khi sửa được 292 đỉnh chứ không phải 299 đỉnh ạ. E dùng lisp chứ không biết kiểm tra số đỉnh như thế nào. tại có đỉnh trùng nhau mà

- Test lisp sau khi sửa thì báo lỗi không chạy được bác ạ. Hay e sửa và thêm không đúng chỗ không biết

 

/- Thêm các dòng code :...
vào phía dưới dòng code (command "undo" "be") và phía trên dòng code (setq obj (vlax-ename->vla-object pl)

Giữa hai dòng này e thấy còn mấy dòng nữa ạ

 

Thonng bao loi:

"Command: ii undo Enter the number of operations to undo or
[Auto/Control/BEgin/End/Mark/Back] <1>: be
Command:
Chon pline muon them dinhzoom
Specify corner of window, enter a scale factor (nX or nXP), or
[All/Center/Dynamic/Extents/Previous/Scale/Window/Object] <real time>: e
Command:
Error: no function definition: GESTRING; error: An error has occurred inside
the *error* functionAutoCAD variable setting rejected: "cmdecho" nil"

 

Tối kiến của e là có thể giải bài toán bằng cách vẽ pline theo đường dẫn đi qua các đỉnh đường dẫn và các điểm giao cắt.

Liệu theo cách này thì code bác viết có dễ hơn k ạ. 


  • 0

#22 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 26 September 2013 - 04:47 PM

E đã test bác ạ.

- Test Lisp cũ trước khi sửa được 292 đỉnh chứ không phải 299 đỉnh ạ. E dùng lisp chứ không biết kiểm tra số đỉnh như thế nào. tại có đỉnh trùng nhau mà

- Test lisp sau khi sửa thì báo lỗi không chạy được bác ạ. Hay e sửa và thêm không đúng chỗ không biết

 

/- Thêm các dòng code :...
vào phía dưới dòng code (command "undo" "be") và phía trên dòng code (setq obj (vlax-ename->vla-object pl)

Giữa hai dòng này e thấy còn mấy dòng nữa ạ

 

Thonng bao loi:

"Command: ii undo Enter the number of operations to undo or
[Auto/Control/BEgin/End/Mark/Back] <1>: be
Command:
Chon pline muon them dinhzoom
Specify corner of window, enter a scale factor (nX or nXP), or
[All/Center/Dynamic/Extents/Previous/Scale/Window/Object] <real time>: e
Command:
Error: no function definition: GESTRING; error: An error has occurred inside
the *error* functionAutoCAD variable setting rejected: "cmdecho" nil"

 

Tối kiến của e là có thể giải bài toán bằng cách vẽ pline theo đường dẫn đi qua các đỉnh đường dẫn và các điểm giao cắt.

Liệu theo cách này thì code bác viết có dễ hơn k ạ. 

Hề hề hề,

1/- Lỗi tại dòng code (getstring ....) chứ không phải là (gestring ....) . Lỗi này do mình đánh máy nhầm vì mình sử dụng kiểu gõ Vni nên nhiều lúc bị mất các ký tự.

2/- Cái tối kiến của bạn sáng ra trò chứ chả tới nỗi tù mù. Song nó chỉ thích hợp khi polyline của bạn toàn các phân đoạn thẳng chứ không chứa arc. nếu polyline mà chứa arc thì nó sẽ vẽ ra một polyline mới không trùng với pline cũ bạn ạ. 

3/- Thực ra cũng có thể làm theo cái tối kiến của bạn, song vì mình chưa hiểu rõ các cấu tạo polyline theo hình bạn gửi nên chả dám chọc ngoáy nhiều, chỉ là tận dụng những gì mình đã biết đẻ xử lý chứ chửa dám chui sâu vào trong ...... quần .... chúng..... nó.

4/- Để đền bù cho cái lỗi cẩu thả của mình, bạn hãy download lại lisp dưới đây và test nhé

5/- Sở dĩ bạn chỉ  có được 292 đỉnh là do khi bạn chọn đối tượng cho tập hợp các line giao cắt bạn đã rê chuột làm màn hình thiếu mất một vài line đó. Cần lưu ý điều này, khi chọn vùng chứa các đối tượng line, nên lăn chuột giữa để sao cho có thể nhìn thấy hết toàn bộ vùng chọn và chỉ cần chọn một phát là ăn ngay, không phải rê hay kéo chuột thêm nữa.

6/- Do mình chưa test đoạn code bổ sung nên thực ra nó còn vài lỗi không hay nữa nhưng vẫn có thể chạy được. Mình đã sửa lại và bổ sung nó trong lisp dưới đây. bạn download lại và check nhé. Lisp này cho phép hai kiểu chọn layer chứa các line cần tìm giao cắt.

a/- nếu bạn nhớ được tên lớp của nó thì nhập tên lớp này khi lisp yêu cầu bạn nhập tên lớp chứa các line cần tìm giao cắt.

b/- Trong trường hợp bạn không nhớ tên lớp này, bạn cứ nhấn enter khi lisp hỏi như vậy để bỏ qua và lisp sẽ yêu cầu bạn chọn đối tượng line mau. Khi đó bạn pick chọn vào một đối tượng line bất lý trong số các line cần tìm giao cắt. lisp sẽ tự tìm ra tên của layer chứa nó để tìm các đối tượng còn lại.

 

Chúc bạn vui.

http://www.cadviet.c...xpolyline_1.lsp


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

#23 thanhlong.hygt

thanhlong.hygt

    biết vẽ pline

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

Đã gửi 26 September 2013 - 07:46 PM

Thank bác vì món quà bác tặng.

E đã test lại thì thấy lỗi với đường polyline ạ. Đối với đường polyline kết quả sau khi chạy lisp chỉ cắt đối tượng ở điểm giao thứ nhất ạ. e cũng không biết về sự khác nhau giữa đường poline và đường 2d polyline lắm. chỉ thi thoảng dùng lệnh plinetype chọn biến hệ thống là 0 or 1 or 2 rồi dùng lệnh pe chọn 2d polyline thì nó chuyển thành polyline ạ. Chuyển ngược lại thì không được


  • 0

#24 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 26 September 2013 - 10:37 PM

Thank bác vì món quà bác tặng.

E đã test lại thì thấy lỗi với đường polyline ạ. Đối với đường polyline kết quả sau khi chạy lisp chỉ cắt đối tượng ở điểm giao thứ nhất ạ. e cũng không biết về sự khác nhau giữa đường poline và đường 2d polyline lắm. chỉ thi thoảng dùng lệnh plinetype chọn biến hệ thống là 0 or 1 or 2 rồi dùng lệnh pe chọn 2d polyline thì nó chuyển thành polyline ạ. Chuyển ngược lại thì không được

Hề hề hề.

Bạn hãy gửi cái bản vẽ bạn test không được ấy lên để mình check lại 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.

#25 thanhlong.hygt

thanhlong.hygt

    biết vẽ pline

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

Đã gửi 26 September 2013 - 11:26 PM

Dạ vâng đây bác ạ http://www.cadviet.c...5_chen_dinh.dwg

vẫn là file cũ e up lên. e vẽ đường pline và các line giao cắt rồi test. Nếu bác ngại tài về thì dùng file cũ e up trước cũng vậy ạ.

thank bác.


  • 0

#26 thanhlong.hygt

thanhlong.hygt

    biết vẽ pline

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

Đã gửi 27 September 2013 - 12:16 AM

Bác xem giúp e với ạ. Trường hợp đường 2d polyline trong bản vẽ này  http://www.cadviet.c...5_file_lodi.dwg  thì lệnh trên báo lỗi

 

 

báo lỗi trên cad2005

"

Command: ii undo Enter the number of operations to undo or
[Auto/Control/BEgin/End/Mark/Back] <1>: be
Command:
Chon pline muon them dinh
Nhap ten layer chua cac line can tim giao cat voi pline

Chon line giao cat mau
Select objects: Specify opposite corner: 21 found

Select objects:  break Select object:
Specify first break point:
Specify second break point:
At least one break point must be on polyline.*Invalid*

"


  • 0

#27 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 27 September 2013 - 10:21 AM

Bác xem giúp e với ạ. Trường hợp đường 2d polyline trong bản vẽ này  http://www.cadviet.c...5_file_lodi.dwg  thì lệnh trên báo lỗi

 

 

báo lỗi trên cad2005

"

Command: ii undo Enter the number of operations to undo or
[Auto/Control/BEgin/End/Mark/Back] <1>: be
Command:
Chon pline muon them dinh
Nhap ten layer chua cac line can tim giao cat voi pline

Chon line giao cat mau
Select objects: Specify opposite corner: 21 found

Select objects:  break Select object:
Specify first break point:
Specify second break point:
At least one break point must be on polyline.*Invalid*

"

Hề hề hề,

Lỗi là do bạn không đọc kỹ hướng dẫn sử dụng trước khi dùng thuốc đây mà.

Nó bị lỗi là hoàn toàn đúng vì đường polyline của bạn tạo ra là lwpolyline.

Mình đã nói ngay từ đầu là lisp này chỉ chạy đúng với bản vẽ có cấu trúc đường polyline đ1ung như file bạn gửi, tức là nó phải là POLYLINE chứ không phải LWPOLYLINE.

Mình cũng đã giải thích về vấn đề này rồi mà.

Đường lwpolyline khi break sẽ chỉ tạo ra một polyline mới còn phần đầu của nó vẫn giữ nguyên tên gọi cũ. Do vậy khi dùng hàm (entnext ...) để lấy các đối tượng tạo ra sau đối tượng cuối cùng trên bản vẽ thì nó sẽ khôing lấy được phần lwpolyline này và như vậy nó chỉ có thể tạo được các đỉnh cho polyline mới tạo ra mà thôi. rất không may cho bạn là line cần tìm giao cắt đầu tiên lại nằm ở phía cuối của đường polyline. Vì vậy bạn chỉ có thể tạo được một đỉnh mà thôi. Sau đó lisp sẽ không tìm được các giao cắt nữa. và báo lỗi.

Còn đường polyline có cấu trúc như bản vẽ bạn gửi thì khi break sẽ tạo ra hai đối tượng mới và khi dùng hàm entnext sẽ lấy được cả hai đối tượng mới này để joint lại thành một đối tượng mới bạn ạ.

Với đường polyline là lwpolyline bạn phải sử dụng một cấu trúc lisp khác chứ không dùng chung với líp này được.

Nếu muốn dùng chung thì mình phải học mót thêm nhiều nhiều nữa đã mới hy vọng có thể sửa được.

Vì vậy có hai cách tùy bạn lựa chọin trong khi chờ đợi.

1/- với lwpolyline, bạn dùng lisp của bác ketxu. với Polyline có thể dùng lisp của mình.

2/- Ghep hai lisp này vào một file và khi dùng thì tùy loại polyline mà chọn 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.

#28 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 27 September 2013 - 03:02 PM

Lisp này chỉ dùng cho lwpolyline, vì vậy bạn dùng lệnh convert của CAD để chuyển thành lwpolyline

 

(defun AppendLs (ls e)(append (if ls ls nil) (list e)))
(defun ObjInters (o1 o2 id / g ps n)
    (setq    g    (vlax-invoke o1 'IntersectWith o2 id)    ps '())
    (while g (setq    ps (AppendLs ps (list (car g) (cadr g) (caddr g))) g (cdddr g))    )    ps
)
(defun Bulge (p1 p2 r / a)
    (setq a (/ (distance p1 p2) 2 r))
    (setq a (/ (atan (/ a (sqrt (- 1 (* a a))))) 2))
    (/ (sin a) (cos a))
)

(defun C:II ( / b fz i l li lp lq ls n ob om p p1 p2 r ss) ; Insert vertex at intersections
    (setq i 0 fz 0.1) ; sai so giao diem lech so voi dinh pline
    (princ "Chon pline:")    (setq ss (ssget ":S") ob (vlax-ename->vla-object (ssname ss 0)) )
    (princ "Chon cac duong giao:")
    (setq ls (mapcar 'vlax-ename->vla-object
                                     (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "*LINE")(8 . "ENTCOC"))))))))
    (foreach o ls
        (setq p (car(ObjInters ob o acExtendNone)) lp (AppendLs lp p))    
        (setq lq (AppendLs lq (vlax-curve-getParamAtPoint ob (vlax-curve-getClosestPointTo ob p)))))
    (setq li (vl-sort-i lq '>) )
    (foreach i li
        (setq n (fix (nth i lq)) p (nth i lp))
        (setq p1 (vlax-curve-getPointAtParam ob n) p2 (vlax-curve-getPointAtParam ob (1+ n)))
        (if (and  (< fz (distance p p1)) (< fz (distance p p2)))
            (progn
                (setq b (vlax-invoke Ob 'GetBulge n))
                (vlax-invoke Ob 'AddVertex (1+ n) (list (car p)(cadr p)))
                (if (/= b 0)
                    (progn
                        (setq r (/ (distance p1 p2) 2 (sin (* 2 (atan b)))))
                        (vlax-invoke Ob 'SetBulge n (Bulge p p1 r))
                        (vlax-invoke Ob 'SetBulge (1+ n) (Bulge p p2 r))))
            )
        ))

)

  • 1

#29 thanhlong.hygt

thanhlong.hygt

    biết vẽ pline

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

Đã gửi 28 September 2013 - 08:41 PM

Lisp này chỉ dùng cho lwpolyline, vì vậy bạn dùng lệnh convert của CAD để chuyển thành lwpolyline

 

(defun AppendLs (ls e)(append (if ls ls nil) (list e)))
(defun ObjInters (o1 o2 id / g ps n)
    (setq    g    (vlax-invoke o1 'IntersectWith o2 id)    ps '())
    (while g (setq    ps (AppendLs ps (list (car g) (cadr g) (caddr g))) g (cdddr g))    )    ps
)
(defun Bulge (p1 p2 r / a)
    (setq a (/ (distance p1 p2) 2 r))
    (setq a (/ (atan (/ a (sqrt (- 1 (* a a))))) 2))
    (/ (sin a) (cos a))
)

(defun C:II ( / b fz i l li lp lq ls n ob om p p1 p2 r ss) ; Insert vertex at intersections
    (setq i 0 fz 0.1) ; sai so giao diem lech so voi dinh pline
    (princ "Chon pline:")    (setq ss (ssget ":S") ob (vlax-ename->vla-object (ssname ss 0)) )
    (princ "Chon cac duong giao:")
    (setq ls (mapcar 'vlax-ename->vla-object
                                     (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "*LINE")(8 . "ENTCOC"))))))))
    (foreach o ls
        (setq p (car(ObjInters ob o acExtendNone)) lp (AppendLs lp p))    
        (setq lq (AppendLs lq (vlax-curve-getParamAtPoint ob (vlax-curve-getClosestPointTo ob p)))))
    (setq li (vl-sort-i lq '>) )
    (foreach i li
        (setq n (fix (nth i lq)) p (nth i lp))
        (setq p1 (vlax-curve-getPointAtParam ob n) p2 (vlax-curve-getPointAtParam ob (1+ n)))
        (if (and  (< fz (distance p p1)) (< fz (distance p p2)))
            (progn
                (setq b (vlax-invoke Ob 'GetBulge n))
                (vlax-invoke Ob 'AddVertex (1+ n) (list (car p)(cadr p)))
                (if (/= b 0)
                    (progn
                        (setq r (/ (distance p1 p2) 2 (sin (* 2 (atan b)))))
                        (vlax-invoke Ob 'SetBulge n (Bulge p p1 r))
                        (vlax-invoke Ob 'SetBulge (1+ n) (Bulge p p2 r))))
            )
        ))

)

Thank bác ạ. mấy hôm nay e ít thời gian quá nên giờ mới vào thank các bác được


  • 0

#30 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 30 September 2013 - 09:58 AM

Thank bác ạ. mấy hôm nay e ít thời gian quá nên giờ mới vào thank các bác được

Hề hề hề,

Gửi bạn lisp mình đã thử sửa để có thể làm việc với lwpolyline. Theo một vài mẫu test mà bạn gửi lên và mình tự bịa thì có vẻ ổn. Son bạnn nên check kỹ lưỡng hơn trước khi dùng nhé.

http://www.cadviet.c...xpolyline_2.lsp


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

#31 huaductiep

huaductiep

    biết vẽ rectang

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

Đã gửi 26 February 2016 - 09:04 AM

Bác có thể giúp em add thêm point tại các điểm giao của đường cong thuộc lớp "TK" & "TL" với đường line "mcn" không ah? chứ líp trên em thử chưa dc :(

 

 

File cad http://www.cadviet.c..._add_vertex.dwg


  • 0