Đến nội dung


Hình ảnh
- - - - -

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?


  • Please log in to reply
5 replies to this topic

#1 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 15 February 2009 - 09:11 PM

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.c...ntersection.zip
http://www.cadviet.c...rking_distances.

Hình đã gửi
Hình đã gửi
  • 0

#2 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 16 February 2009 - 09:41 AM

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

  • 0

#3 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 16 February 2009 - 02:45 PM

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?
  • 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 16 February 2009 - 03:35 PM

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

#5 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 16 February 2009 - 08:34 PM

Đú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.
  • 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 17 February 2009 - 09:14 AM

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

  • 3