Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
pfievxd

Vẽ vuông góc với 1 Pline bất kì

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

pfievxd    6

Chào mọi người, mình có viết 1 lisp về vẽ vuông với 1 pline bất kì từ 1 điểm thuộc pline đó, check thử thì chạy ngon với polyline và spline nhưng với arc thì ko okie :D , tất nhiên với các đối tượng là arc thì chỉ cần nối điểm đó với tâm của nó cũng được, nhưng mình đoán là phải có cách làm tổng quát khỏi phải chia trường hợp khi xét với các đối tượng dạng curve, Hướng giải quyết của em là đang ngắm nghía cái mã DXF 42 và tìm hiểu xem bulge nó là cái gì có thể sử dụng cho bài toán trên hay ko :D Các bác cho ý kiến với ah (Hì, có mỗi câu hỏi mà làm hẳn topic, bác admin thấy ko cần thì cứ remove ah.)

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
Chào mọi người, mình có viết 1 lisp về vẽ vuông với 1 pline bất kì từ 1 điểm thuộc pline đó.

Có hàm con

(vlax-curve-getClosestPointTo ent d1)

Trong đó ent là tên đối tượng Poly, d1 là 1 điểm ngoài đường Poly.Giá trị trả về là 1 điểm trên đường cong gần điểm d1 nhất.

Bạn khai thác ý tưởng từ đây xem!

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
phamthanhbinh    3.123
Có hàm con

(vlax-curve-getClosestPointTo ent d1)

Trong đó ent là tên đối tượng Poly, d1 là 1 điểm ngoài đường Poly.Giá trị trả về là 1 điểm trên đường cong gần điểm d1 nhất.

Bạn khai thác ý tưởng từ đây xem!

Hề hề hề.

Bạn thử tham khảo cái hàm này coi sao. Nó trả về vec tơ pháp tuyến của đường cong tại điểm đang xét thuộc đường cong. Tuy nhiên bạn cần phải lấy được parameter của điểm đó. Có thể sử dụng hàm (vlax-curve-getParamAtPoint curve-obj point) để có được điều này.

 

vlax-curve-getSecondDeriv Function

 

Returns the second derivative (in WCS) of a curve at the specified location

 

(vlax-curve-getSecondDeriv curve-obj param)

 

Arguments

 

curve-obj

 

The VLA-object to be measured.

 

param

 

A number specifying a parameter on the curve.

 

Return Values

 

A 3D vector list, if successful; otherwise nil.

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
pfievxd    6

@Phamthanhbinh: em cứ tưởng cái vlax-curve-getSecondDeriv là lấy đạo hàm bậc 2 chứ biggrin.gif nhưng mà hình học 12 quên quên rồi, để em ôn lại cái đã

@DuongTrungHuy : Ý mình là từ điểm trên Pline mà còn điểm ở ngoài pline vẽ vuông góc thì okie roài

(Defun c:ddd()
 (Vl-load-com)
 (Setq Pline (Car(Entsel"\n Pline : "))
Point (Getpoint"\n Chon diem : ")
Param (Vlax-curve-getparamatpoint Pline Point)
Pt    (Vlax-curve-getsecondderiv Pline Param)
)
 (Princ))

Kết quả là bao h cũng là (0 0 0)! Hay là dùng FirstDeriv các bác 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
Tue_NV    3.841
@Phamthanhbinh: em cứ tưởng cái vlax-curve-getSecondDeriv là lấy đạo hàm bậc 2 chứ biggrin.gif nhưng mà hình học 12 quên quên rồi, để em ôn lại cái đã

@DuongTrungHuy : Ý mình là từ điểm trên Pline mà còn điểm ở ngoài pline vẽ vuông góc thì okie roài

(Defun c:ddd()
 (Vl-load-com)
 (Setq Pline (Car(Entsel"\n Pline : "))
Point (Getpoint"\n Chon diem : ")
Param (Vlax-curve-getparamatpoint Pline Point)
Pt    (Vlax-curve-getsecondderiv Pline Param)
)
 (Princ))

Kết quả là bao h cũng là (0 0 0)! Hay là dùng FirstDeriv các bác nhỉ

Kết quả là bao h cũng là (0 0 0)!

=> Thiệt không?

Bạn đã thử lấy biến Point trên phân đoạn cong của 1 Curve chưa?

Đây là kiến thức cơ bản cửa lớp 12. Đề nghị bạn về ôn lại

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
Kết quả là bao h cũng là (0 0 0)! Hay là dùng FirstDeriv các bác nhỉ

Đúng đó Bạn vlax-curve-getFirstDeriv là hàm xđịnh đạo hàm bậc nhất tại điểm đó còn vlax-curve-getSecondDeriv là đạo hàm bậc 2.Các đoạn thẳng có đạo hàm bậc 2 = 0...

Biết vecto tiếp tuyến bạn tìm được vecto pháp tuyến và như vậy Bài toán đã được giải xong!

Chúc Bạn như ý!

  • Vote tăng 2

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
pfievxd    6
Đúng đó Bạn vlax-curve-getFirstDeriv là hàm xđịnh đạo hàm bậc nhất tại điểm đó còn vlax-curve-getSecondDeriv là đạo hàm bậc 2.Các đoạn thẳng có đạo hàm bậc 2 = 0...

Biết vecto tiếp tuyến bạn tìm được vecto pháp tuyến và như vậy Bài toán đã được giải xong!

Chúc Bạn như ý!

Okie, bài toán đã giải xong, giai đoạn tiếp theo mình muốn vẽ sang trái và sang phải (1 cách tương đối thôi nha)

Dưới đây là code mình viết, sai nhoe :)( các bác chỉ giáo cho với ah

 

(Defun AngP(Pl Pt / Goc P 1st)
 (Vl-load-com)
 (Setq P    (Vlax-curve-getparamatpoint Pl Pt)
1st  (Vlax-curve-getfirstderiv Pl P)
)
 (If (=(Car 1st)0)
   (Setq Goc(/ pi 2))
   (If (>=(Cadr 1st)0)
     (Setq Goc(Atan (/(Cadr 1st)(Car 1st))))
     (Setq Goc(+ pi(Atan (/(Cadr 1st)(Car 1st)))))
     ))
 Goc)
(Defun VGT(Pline Point Dist)(Polar Point (+(AngP Pline Point)(* pi 0.5)) Dist))
(Defun VGP(Pline Point Dist)(Polar Point (-(AngP Pline Point)(* pi 0.5)) Dist))
(Defun c:VG()
 (Setq Pline (Car(Entsel "\n Chon Polyline : "))
Point (Getpoint "\n Chon diem tren Polyline : ")
Ag    (AngP Pline Point))
 ;(Princ Ag)
 (COmmand "LINE" Point (VGT Pline Point 100) "")
 (COmmand "LINE" Point (VGP Pline Point 10)  "")
 (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
gia_bach    1.442
Chào mọi người, mình có viết 1 lisp về vẽ vuông với 1 pline bất kì từ 1 điểm thuộc pline đó, check thử thì chạy ngon với polyline và spline nhưng với arc thì ko okie :s_big: , tất nhiên với các đối tượng là arc thì chỉ cần nối điểm đó với tâm của nó cũng được, nhưng mình đoán là phải có cách làm tổng quát khỏi phải chia trường hợp khi xét với các đối tượng dạng curve, Hướng giải quyết của em là đang ngắm nghía cái mã DXF 42 và tìm hiểu xem bulge nó là cái gì có thể sử dụng cho bài toán trên hay ko :) Các bác cho ý kiến với ah (Hì, có mỗi câu hỏi mà làm hẳn topic, bác admin thấy ko cần thì cứ remove ah.)

pfievxd thử lisp này :

(defun c:Vg (/ curve pt ang vs)
 (if (and
(setq curve (car (entsel "\nChon Curve : ")))
(setq pt (getpoint "\n Chon diem tren Curve : ")))
   (progn
     (setq VS (* 0.1 (getvar "Viewsize")))
     (setq pt (vlax-curve-getClosestPointTo curve (trans pt 1 0))
    ang (angle '(0 0) (Vlax-curve-getfirstderiv curve (vlax-curve-getParamAtPoint curve pt))) )
     (entmake (list '(0 . "LINE")(cons 10 pt)(cons 11 (polar pt (+ ang (/ pi 2) ) vs))(cons 62 3) ))
     (entmake (list '(0 . "LINE")(cons 10 pt)(cons 11 (polar pt (- ang (/ pi 2) ) vs))(cons 62 4) ))
     ))
 (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
pfievxd    6

pfievxd thử lisp này :

(defun c:Vg (/ curve pt ang vs)
 (if (and
(setq curve (car (entsel "\nChon Curve : ")))
(setq pt (getpoint "\n Chon diem tren Curve : ")))
   (progn
     (setq VS (* 0.1 (getvar "Viewsize")))
     (setq pt (vlax-curve-getClosestPointTo curve (trans pt 1 0))
    ang (angle '(0 0) (Vlax-curve-getfirstderiv curve (vlax-curve-getParamAtPoint curve pt))) )
     (entmake (list '(0 . "LINE")(cons 10 pt)(cons 11 (polar pt (+ ang (/ pi 2) ) vs))(cons 62 3) ))
     (entmake (list '(0 . "LINE")(cons 10 pt)(cons 11 (polar pt (- ang (/ pi 2) ) vs))(cons 62 4) ))
     ))
 (princ) )

;-------------------------

Vừa từ quê lên, chúc cả nhà 1 năm mới may mắn và thành công!

HX,cách code lisp của cao thủ có khác, thật đáng học hỏi ...

Em đoán rằng sự khác biệt ở đây nằm ở : (vlax-curve-getClosestPointTo curve (trans pt 1 0)) nên đã đọc lại Help, tiếc là ko hiểu lắm về cái hàm trans, bác có thể chỉ bảo thêm được ko ah

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
gia_bach    1.442

;-------------------------

Vừa từ quê lên, chúc cả nhà 1 năm mới may mắn và thành công!

HX,cách code lisp của cao thủ có khác, thật đáng học hỏi ...

Em đoán rằng sự khác biệt ở đây nằm ở : (vlax-curve-getClosestPointTo curve (trans pt 1 0)) nên đã đọc lại Help, tiếc là ko hiểu lắm về cái hàm trans, bác có thể chỉ bảo thêm được ko ah

Giải thích thêm về LISP : Vẽ line vuông góc với 1 Curve

Khi dùng hàm GetPoint có khả năng user pick điểm không nằm trên Curve nên cần dùng hàm

(vlax-curve-getClosestPointTo curve pt) để tìm điểm gần nhất trên Curve từ điểm pick (do hàm GetPoint trả về)

 

Nhưng hàm (vlax-curve-getClosestPointTo curve pt) lại yêu cầu đối số pt là điểm trên hệ tọa độ WCS.

Nên phải gọi hàm (trans pt 1 0) : chuyển từ hệ tọa độ nguời dùng UCS sang hệ tọa độ WCS.

 

Có điểm nằm trên Curve, gọi hàm (vlax-curve-getParamAtPoint curve pt) để lấy thông số param tại điểm đó.

 

Tiếp theo gọi hàm (Vlax-curve-getfirstderiv curve param) để lấy đạo hàm bậc nhất tại điểm đó.

 

Về Ý nghĩa hình học của đạo hàm chắc bạn đã rõ, tham khảo

 

Các buớc tiếp theo tuơng tự LISP của bạn.

  • Vote tăng 5

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
pfievxd    6

Hì, nút thanks đâu mất rồi :) bác gia_bach giải thích đặc biệt cặn kẽ chi tiết, giờ e mới biết về cái vụ vlax-curve-getclosestpointto lấy point trong WCS đấy

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

 

Okie, bài toán đã giải xong, giai đoạn tiếp theo mình muốn vẽ sang trái và sang phải (1 cách tương đối thôi nha)

Dưới đây là code mình viết, sai nhoe laugh.gif( các bác chỉ giáo cho với ah

 

(Defun AngP(Pl Pt / Goc P 1st)  (Vl-load-com)  (Setq P    (Vlax-curve-getparamatpoint Pl Pt)	1st  (Vlax-curve-getfirstderiv Pl P)	)  (If (=(Car 1st)0)    (Setq Goc(/ pi 2))    (If (>=(Cadr 1st)0)      (Setq Goc(Atan (/(Cadr 1st)(Car 1st))))      (Setq Goc(+ pi(Atan (/(Cadr 1st)(Car 1st)))))      ))  Goc)(Defun VGT(Pline Point Dist)(Polar Point (+(AngP Pline Point)(* pi 0.5)) Dist))(Defun VGP(Pline Point Dist)(Polar Point (-(AngP Pline Point)(* pi 0.5)) Dist))(Defun c:VG()  (Setq Pline (Car(Entsel "\n Chon Polyline : "))	Point (Getpoint "\n Chon diem tren Polyline : ")	Ag    (AngP Pline Point))  ;(Princ Ag)  (COmmand "LINE" Point (VGT Pline Point 100) "")  (COmmand "LINE" Point (VGP Pline Point 10)  "")  (Princ))

Xin lỗi mọi người em lại đào mộ topic này lên. Nhưng thực tế líp trên của bác Gia_bach quá hay, tiện lợi. Em mong bác bổ sung thêm 1 ứng dụng nữa thì quá tuyệt ạ, bác cho chọn thêm chiều dài của đuờng vuông góc cần vẽ, còn nó nằm về cả 2 bên cũng không sao chỉ cần del nó đi cũng ko vấn đề gì. Em cảm ơn mọi người

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
gia_bach    1.442

Xin lỗi mọi người em lại đào mộ topic này lên. Nhưng thực tế líp trên của bác Gia_bach quá hay, tiện lợi. Em mong bác bổ sung thêm 1 ứng dụng nữa thì quá tuyệt ạ, bác cho chọn thêm chiều dài của đuờng vuông góc cần vẽ, còn nó nằm về cả 2 bên cũng không sao chỉ cần del nó đi cũng ko vấn đề gì. Em cảm ơn mọi người

Update theo yêu cầu :

(defun c:Vg (/ curve pt ang )
  (if (setq curve (car (entsel "\nChon Curve : ")))
    (progn
      (or *len (setq *len 50))
      (initget 6)
      (setq *len (cond ((getdist (strcat "\nChieu dai <" (rtos *len) "> :"))) (*len)))
      (while (setq pt (getpoint "\n Chon diem tren Curve : "))
	(setq pt (vlax-curve-getClosestPointTo curve (trans pt 1 0))
	      ang (angle '(0 0) (Vlax-curve-getfirstderiv curve (vlax-curve-getParamAtPoint curve pt))) )
	(entmake (list '(0 . "LINE")(cons 10 pt)(cons 11 (polar pt (+ ang (/ pi 2) ) *len))(cons 62 3) ))
	(entmake (list '(0 . "LINE")(cons 10 pt)(cons 11 (polar pt (- ang (/ pi 2) ) *len))(cons 62 4) )) )))
  (princ) )
  • 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
hieuhx68    0

 

Update theo yêu cầu :

(defun c:Vg (/ curve pt ang )
  (if (setq curve (car (entsel "\nChon Curve : ")))
    (progn
      (or *len (setq *len 50))
      (initget 6)
      (setq *len (cond ((getdist (strcat "\nChieu dai <" (rtos *len) "> :"))) (*len)))
      (while (setq pt (getpoint "\n Chon diem tren Curve : "))
	(setq pt (vlax-curve-getClosestPointTo curve (trans pt 1 0))
	      ang (angle '(0 0) (Vlax-curve-getfirstderiv curve (vlax-curve-getParamAtPoint curve pt))) )
	(entmake (list '(0 . "LINE")(cons 10 pt)(cons 11 (polar pt (+ ang (/ pi 2) ) *len))(cons 62 3) ))
	(entmake (list '(0 . "LINE")(cons 10 pt)(cons 11 (polar pt (- ang (/ pi 2) ) *len))(cons 62 4) )) )))
  (princ) )

Thanks bác nhiều ạ. Vậy là lips đã hoàn thiện ngon lành rồi ạ.

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


×