Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
Phiphi-

Cách vẽ giao điểm của một 3D Polyline hoặc 3D Spline với mặt cong của một khối tròn?

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

Xin các Bác chỉ giúp cách vẽ giao điểm của một 3D Polyline hoặc 3D Spline với mặt cong của một khối tròn.

Thực chất bài toán là vẽ các điểm trên 3D Polyline hoặc 3D Spline cách khoảng đều nhau theo đường thẳng từ point A đến point B...

(không phải theo chiều dài của cung). Nếu có LISP thì xin vui lòng chia sẽ. Cám ơn nhiều.

 

http://www.cadviet.com/upfiles/Intersection.zip

http://www.cadviet.com/upfiles/Marking_distances.

 

intersectionsf1.jpg

w931.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
1. Xin các Bác chỉ giúp cách vẽ giao điểm của một 3D Polyline hoặc 3D Spline với mặt cong của một khối tròn.

2. Thực chất bài toán là vẽ các điểm trên 3D Polyline hoặc 3D Spline cách khoảng đều nhau theo đường thẳng từ point A đến point B...

(không phải theo chiều dài của cung). Nếu có LISP thì xin vui lòng chia sẽ. Cám ơn nhiều.

1. Bó tay, chưa nghĩ ra cách gì! Với lại đây cũng không phải là mục tiêu của bạn.

2. Bạn dùng thử lisp sau. Chương trình "chơi" được với mọi đối tượng 2D và 3D: line, pline, spline, arc... Muốn thay đổi độ chính xác thì thay đổi giá trị của biến fuzz:

;;;=================================
;;;CHIA DOI TUONG VOI KHOANG CACH DEU THEO DUONG THANG
;;;Ap dung cho moi doi tuong 2D va 3D: line, pline, spline, arc...
;;;Appload va go lenh CK
;;;Written by ssg - www.cadviet.com - February 2009
;;;=================================

;;;-------------------------------------------------------------
(defun LenCurve (cur) ;;;Length of curve, return Real
(vlax-curve-getDistAtParam cur (vlax-curve-getEndParam cur))
)
;;;=================================
(defun C:CK(  / e k p ps pe L fuzz kc p0 flag p1 OK kc1)
(vl-load-com)
;;;SO LIEU BAN DAU
(setq
   e (car (entsel "\nChon curve:"))
   k (getreal "\nKhoang cach giua 2 diem theo duong thang:")
   p (getpoint "\nDiem bat dau:")
   ps (vlax-curve-getStartPoint e)
   pe (vlax-curve-getEndPoint e)
   L (LenCurve e)
   fuzz 0.00000001
)
;;;THIET LAP CAC DIEU KIEN
(cond
   ((equal p ps fuzz) (setq kc k p0 ps flag 1))
   ((equal p pe fuzz) (setq kc (- L k) p0 pe flag -1))
   ((alert "Phai chon diem bat dau tai 1 trong 2 dau mut!"))
)
;;;CHIA KHOANG
(setq p1 p0)
(while p1
   (setq OK nil)
   (while (not OK)
       (setq
           p1 (vlax-curve-getPointAtDist e kc)
           kc1 (distance p0 p1)
       )
       (if (equal kc1 k fuzz) (setq OK T) (setq kc (+ kc (* flag (- k kc1)))))
       (if (equal p1 ps fuzz) (exit))
   )
   (if p1 (entmake (list (cons 0 "POINT") (cons 10 p1))))
   (setq p0 p1)
   (setq kc (+ kc (* flag k)))
)
(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
1. Bó tay, chưa nghĩ ra cách gì! Với lại đây cũng không phải là mục tiêu của bạn.

2. Bạn dùng thử lisp sau. Chương trình "chơi" được với mọi đối tượng 2D và 3D: line, pline, spline, arc... Muốn thay đổi độ chính xác thì thay đổi giá trị của biến fuzz:

Thanks you bác Ssg, quả là bài tóan này thật rắc rối. Giờ vẫn chưa biết mần sao nữa ?

Lisp trên cho dim chính xác với 2D Spine nhưng làm sao để thay đổi giá trị của biến fuzz nhằm cho ra dim đạt được độ chính xác max vậy bác Ssg?

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
Thanks you bác Ssg, quả là bài tóan này thật rắc rối. Giờ vẫn chưa biết mần sao nữa ?

Lisp trên cho dim chính xác với 2D Spine nhưng làm sao để thay đổi giá trị của biến fuzz nhằm cho ra dim đạt được độ chính xác max vậy bác Ssg?

Ssg đã test khá kỹ, lisp hiện tại cho độ chính xác 0.00000001 drawing unit, với mọi loại curve (đối tượng có dạng đường), bất kể 2D hay 3D: line, polyline, 3dpolyline, 2dspline, 3dspline... Bạn thử vẽ các line nối các điểm kết quả của trình lisp tạo ra, kiểm tra chiều dài của nó (bằng lengthen hoặc mo) sẽ thấy rõ. Muốn tăng độ chính xác thì thêm số 0 vào ở chỗ fuzz 0.00000001 trong chương trình.

 

Tuy nhiên, ssg không nghĩ là độ chính xác với 8 chữ số thập phân lại không đáp ứng được yêu cầu của bạn. Qua cách nói của bạn thì ssg hiểu rằng, hình như bạn đã diễn đạt chưa đúng ý bạn muốn bằng mô hình giao điểm của curve và khối cầu. Thực chất cái bạn muốn có phải là khoảng cách đo được trên hình chiếu bằng của các điểm chứ không phải là khoảng cách giữa các điểm?

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

Đúng là LISP của bác Ssg viết đã insert các Points trên đường 3D Spline theo khoảng cách từ Point đến Point thật chính xác. Để đặt đúng các aligned dim cho các khoảng cách này thì cần phải dởi UCS có 1 trục đi qua 2 points vì các points này ở các toạ độ 3D. PP có thử dùng Lisp Auto-aligned dim của Bác viết, nhưng dim sẽ không cho đúng giá trị thật của các lines nối từ point đến point.

PP đã dùng mô hình giao điểm của curve (đúng ra là 3D Spine) và khối cầu mục đích là bảo đảm khoảng cách từ tâm đến bất kỳ 1 điểm nào trên bề mặt luôn bằng bán kính của khối cầu, bất kể đường 3D Pline hoặc 3D Spine nằm trong khối cầu dài ngắn ntn cũng không quan trọng. Nếu insert được Point tại giao điểm là giải được bài toán. Nhưng LISP của bác Ssg đã giải quyết được rồi.

LISP này sẽ được sử dụng cho 1 drafter đang vẽ các khối concrete (3D) dài khoảng 4m đặt dọc đường dài có địa hình cong queo, cao thấp. Thay mặt người bạn, xin thành thật cám ơn bác Ssg thật nhiều.

Luôn tiện, bác Ssg post cho PP cái LISP dùng để insert các Points tại các giao điểm của các Line/Pline/Spline (chỉ cần trên mặt phằng XY) sau khi dùng mouse quét qua các objects. Thanks you Bác. PP.

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
Luôn tiện, bác Ssg post cho PP cái LISP dùng để insert các Points tại các giao điểm của các Line/Pline/Spline (chỉ cần trên mặt phằng XY) sau khi dùng mouse quét qua các objects.

Đây bạn:

;;;-----------------------------------------------------
(defun ss2ent (ss / i Le e) ;;;Convert ss to list of ename
(setq i 0)
(repeat (sslength ss) 
   (setq
       e (ssname ss i)
       Le (append Le (list e))
       i (1+ i)
   )
)
Le
)
;;;-----------------------------------------------------
(defun Inters (e1 e2 / ob1 ob2 g L i kq)
(vl-load-com)
(setq
   ob1 (vlax-ename->vla-object e1)
   ob2 (vlax-ename->vla-object e2)
   g (vlax-variant-value (vla-IntersectWith ob1 ob2 acExtendNone))
)
(if (/= (vlax-safearray-get-u-bound g 1) -1) (setq L (vlax-safearray->list g)))
(setq i 0)
(repeat (/ (length L) 3)
   (setq kq (append (list (list (nth i L) (nth (+ i 1) L) (nth (+ i 2) L))) kq))
   (setq i (+ i 3))
)
kq
)
;;;-----------------------------------------------------
(defun C:IP ( / Le e0 e Lp p) ;;;Intersection Points
(setq Le (ss2ent (ssget '((0 . "LINE,POLYLINE,LWPOLYLINE,SPLINE")))))
(repeat (1- (length Le))
   (setq Le (vl-remove (setq e0 (car Le)) Le))
   (foreach e Le (setq Lp (append Lp (inters e0 e)))) 
)
(foreach p Lp (entmake (list (cons 0 "POINT") (cons 10 (list (car p) (cadr p) 0.0)))))
(princ)
)
;;;-----------------------------------------------------

  • Vote tăng 3

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  

×