Chuyển đến nội dung
Diễn đàn CADViet
hp1981

Lisp convert đường Polyline 2D thành đường Polyline 3D

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

Em đang cần một Lisp convert đường Polyline 2D thành đường Polyline 3D, cụ thể là nếu em có một đường PL được chia thành các đoạn L1, L2... với độ dốc của mỗi đoạn là i = 2%. Lisp sẽ thực hiện tính toán chiều dài của mỗi đoạn sau đó gán cao độ cho mỗi đoạn đó. Điểm 1 có cao độ là +10, điểm2 có cao độ là +(10 - L1*2%), điểm 3 có cao độ là +(10-L2*2%).

 

Cảm ơn các bác trướ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
Em đang cần một Lisp convert đường Polyline 2D thành đường Polyline 3D, cụ thể là nếu em có một đường PL được chia thành các đoạn L1, L2... với độ dốc của mỗi đoạn là i = 2%. Lisp sẽ thực hiện tính toán chiều dài của mỗi đoạn sau đó gán cao độ cho mỗi đoạn đó. Điểm 1 có cao độ là +10, điểm2 có cao độ là +(10 - L1*2%), điểm 3 có cao độ là +(10-L2*2%).

 

Cảm ơn các bác trước !

Bạn hãy upload file DWG lên, chứa cả Polyline 2D gốc và Polyline 3D mà bạn muốn convert thà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
File đây ạ !

 

http://www.cadviet.com/upfiles/Gui_CV.dwg

 

Cảm ơn các bác trước nhé

Tên lệnh là M32 (Make 3Dpoly from 2Dpoly). Độ cao điểm bắt đầu và độ dốc theo mặc định là 80 và 10%, người dùng không cần nhập số, chỉ Enter hoặc có thể thay đổi tuỳ ý. Chương trình tự động lưu lại giá trị của lần nhập trước. Tuỳ chọn giữ hoặc del 2DPline nguyên thuỷ.

 

;;;-------------------------------------------------------------------------------
(defun getVert (e / i L) ;;;Return list of all vertex from pline e
(setq i 0 L nil)
(vl-load-com)
(repeat (fix (+ (vlax-curve-getEndParam e) 1))
   (setq L (append L (list (vlax-curve-getPointAtParam e i))))
   (setq i (1+ i))
)
L
)
;;;-------------------------------------------------------------------------------
(defun C:M32( / p0 ss e h0 sl0 vl h sl oldos p1 ans) ;;;Make 3dpline from 2dpline
(setq
   p0 (getpoint "\nSpecify start point of 2Dpolyline:")
   ss (ssget "c" p0 p0 '((0 . "LWPOLYLINE")))
)
(if ss (setq e (ssname ss 0)) (progn (alert "2DPolyline not found!") (exit)))
(if (not h0) (setq h0 80))
(if (not sl0) (setq sl0 10))
(setq
   h (getreal (strcat "\nElevation of this point <" (rtos h0) ">:"))
   sl (getreal (strcat "\nSlope <" (rtos sl0 2 2) "%>:"))
   vl (getvert e)
   oldos (getvar "osmode")
)
(if h (setq h0 h) (setq h h0))
(if sl (setq sl0 sl) (setq sl sl0))
(if (not (equal p0 (car vl))) (setq  vl (reverse vl) p0 (car vl)))
(setvar "osmode" 0)
(command "3dpoly")
(foreach p1 vl
   (setq
       h (- h (* 0.01 sl (distance p0 p1)))
       p0 p1
   )
   (command (list (car p1) (cadr p1) h))
)
(command "")
(setvar "osmode" oldos)
(initget "Y N")
(setq ans (getkword "\nDelete original 2DPolyline? [Yes/No] :"))
(if (= ans "Y") (command "erase" 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ên lệnh là M32 (Make 3Dpoly from 2Dpoly). Độ cao điểm bắt đầu và độ dốc theo mặc định là 80 và 10%, người dùng không cần nhập số, chỉ Enter hoặc có thể thay đổi tuỳ ý. Chương trình tự động lưu lại giá trị của lần nhập trước. Tuỳ chọn giữ hoặc del 2DPline nguyên thuỷ.

 

Cảm ơn bác ssg, nhưng bác có thể coi thêm cho em một chút ở cái lisp của bác được không? Vì chiều dài của đoạn PL ấy..lại bị kéo dài thêm một chút.

Ví dụ : Chiều dài ban đầu của em là 110.00 thì sau khi chạy chiều dài mới là 110.0055.

 

Một lần nữa cám ơn bá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
Cảm ơn bác ssg, nhưng bác có thể coi thêm cho em một chút ở cái lisp của bác được không? Vì chiều dài của đoạn PL ấy..lại bị kéo dài thêm một chút.

Ví dụ : Chiều dài ban đầu của em là 110.00 thì sau khi chạy chiều dài mới là 110.0055.

 

Một lần nữa cám ơn bác.

Mình đã kiểm tra kỹ, không có gì sai cả! Kết quả chạy với file *.dwg của bạn trùng hoàn toàn với đường mà bạn đã vẽ mẫu.

Toạ độ x và y các đỉnh của 3dpoly trùng với các đỉnh của 2dpoly, trong khi đó z thay đổi theo độ dốc nên chiều dài chúng khác nhau là tất nhiên. Trong ví dụ của bạn 2dpoly dài 53.0000 còn 3dpoly dài 53.2643 đó thôi?

  • 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
Mình đã kiểm tra kỹ, không có gì sai cả! Kết quả chạy với file *.dwg của bạn trùng hoàn toàn với đường mà bạn đã vẽ mẫu.

Toạ độ x và y các đỉnh của 3dpoly trùng với các đỉnh của 2dpoly, trong khi đó z thay đổi theo độ dốc nên chiều dài chúng khác nhau là tất nhiên. Trong ví dụ của bạn 2dpoly dài 53.0000 còn 3dpoly dài 53.2643 đó thôi?

 

Em up File này lên cho Bác kiểm tra giúp em, Nếu có thể bác viết giùm em luôn chèn Text cao độ tại mỗi điểm đấy nhé !

 

http://www.cadviet.com/upfiles/KTRA.dwg

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
Em up File này lên cho Bác kiểm tra giúp em, Nếu có thể bác viết giùm em luôn chèn Text cao độ tại mỗi điểm đấy nhé !

 

http://www.cadviet.com/upfiles/KTRA.dwg

 

Đáng tiếc, 2dpline mẫu bạn up lên hôm nọ không có cung tròn! Bạn phải nghiêm túc rút kinh nghiệm về việc này!

 

Có 2 vấn đề:

1) Nếu 2dpoly chứa cung tròn, không thể dựng 3dpoly được. Khi thay đổi z theo độ dốc, cung tròn sẽ thành 1 phần của đường xoắn vít trụ (cylindrical helix của cad đời mới, giống như đường ren của bu lông). Kết quả mà chương trình có thể tạo được sẽ gồm nhiều đối tượng rời rạc: nhiều đoạn 3dpoly nối với nhau qua cylindrical helix. Khi đó, chương trình sẽ phức tạp hơn nhiều, và bạn có chấp nhận kết quả như vậy không?

 

2) Giả sử bạn chấp nhận kết quả trên, mình cũng không thể làm tiếp được nữa, mong bạn thông cảm cho.

  • 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
Tên lệnh là M32 (Make 3Dpoly from 2Dpoly). Độ cao điểm bắt đầu và độ dốc theo mặc định là 80 và 10%, người dùng không cần nhập số, chỉ Enter hoặc có thể thay đổi tuỳ ý. Chương trình tự động lưu lại giá trị của lần nhập trước. Tuỳ chọn giữ hoặc del 2DPline nguyên thuỷ.

 

;;;-------------------------------------------------------------------------------
(defun getVert (e / i L) ;;;Return list of all vertex from pline e
(setq i 0 L nil)
(vl-load-com)
(repeat (fix (+ (vlax-curve-getEndParam e) 1))
   (setq L (append L (list (vlax-curve-getPointAtParam e i))))
   (setq i (1+ i))
)
L
)
;;;-------------------------------------------------------------------------------
(defun C:M32( / p0 ss e h0 sl0 vl h sl oldos p1 ans) ;;;Make 3dpline from 2dpline
(setq
   p0 (getpoint "\nSpecify start point of 2Dpolyline:")
   ss (ssget "c" p0 p0 '((0 . "LWPOLYLINE")))
)
(if ss (setq e (ssname ss 0)) (progn (alert "2DPolyline not found!") (exit)))
(if (not h0) (setq h0 80))
(if (not sl0) (setq sl0 10))
(setq
   h (getreal (strcat "\nElevation of this point <" (rtos h0) ">:"))
   sl (getreal (strcat "\nSlope <" (rtos sl0 2 2) "%>:"))
   vl (getvert e)
   oldos (getvar "osmode")
)
(if h (setq h0 h) (setq h h0))
(if sl (setq sl0 sl) (setq sl sl0))
(if (not (equal p0 (car vl))) (setq  vl (reverse vl) p0 (car vl)))
(setvar "osmode" 0)
(command "3dpoly")
(foreach p1 vl
   (setq
       h (- h (* 0.01 sl (distance p0 p1)))
       p0 p1
   )
   (command (list (car p1) (cadr p1) h))
)
(command "")
(setvar "osmode" oldos)
(initget "Y N")
(setq ans (getkword "\nDelete original 2DPolyline? [Yes/No] :"))
(if (= ans "Y") (command "erase" e ""))
(princ)
)
;;;-------------------------------------------------------------------------------

 

 

Mình có thử lisp "m32.lsp" của SSP, nhưng sao khi thực hiện lệnh thì gặp vấn đề như bên dưới và Exit thoát lệnh luôn. Lỗi như sau

(Command: m322

Specify start point of 2Dpolyline:; error: too many arguments

Command:)

Xin nhờ SSP chỉ giúp. Xin cảm ơn nhiều

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

×