Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
8 replies to this topic

#1 hp1981

hp1981

    biết pan

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

Đã gửi 19 February 2008 - 01:32 PM

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 !
  • 0

#2 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 19 February 2008 - 08:54 PM

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

#3 hp1981

hp1981

    biết pan

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

Đã gửi 20 February 2008 - 08:36 AM

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.


File đây ạ !

http://www.cadviet.c...iles/Gui_CV.dwg

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

#4 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 20 February 2008 - 11:57 AM

File đây ạ !

http://www.cadviet.c...iles/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)
)
;;;-------------------------------------------------------------------------------

  • 0

#5 hp1981

hp1981

    biết pan

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

Đã gửi 20 February 2008 - 01:46 PM

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

#6 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 20 February 2008 - 05:10 PM

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?
  • 1

#7 hp1981

hp1981

    biết pan

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

Đã gửi 21 February 2008 - 09:40 AM

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.c...pfiles/KTRA.dwg
  • 0

#8 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 21 February 2008 - 11:28 AM

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

#9 Express

Express

    Chưa sử dụng CAD

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

Đã gửi 30 October 2009 - 04:20 PM

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