Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
13 replies to this topic

#1 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 04 January 2011 - 03:20 PM

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

#2 DuongTrungHuy

DuongTrungHuy

    biết lệnh copy

  • Members
  • PipPipPip
  • 116 Bài viết
Điểm đánh giá: 41 (tàm tạm)

Đã gửi 04 January 2011 - 03:46 PM

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

#3 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 04 January 2011 - 04:06 PM

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.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#4 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 04 January 2011 - 05:03 PM

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

#5 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 04 January 2011 - 10:12 PM

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

#6 DuongTrungHuy

DuongTrungHuy

    biết lệnh copy

  • Members
  • PipPipPip
  • 116 Bài viết
Điểm đánh giá: 41 (tàm tạm)

Đã gửi 05 January 2011 - 04:52 PM

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ư ý!
  • 2

#7 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 25 January 2011 - 03:45 PM

Đú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))

  • 0

#8 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 26 January 2011 - 03:17 PM

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

  • 0

#9 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 07 February 2011 - 08:43 PM

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

#10 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 08 February 2011 - 11:02 AM

;-------------------------
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.
  • 5

#11 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 08 February 2011 - 02:48 PM

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

#12 hieuhx68

hieuhx68

    biết vẽ circle

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

Đã gửi 09 June 2014 - 08:30 AM

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


  • 0

#13 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 09 June 2014 - 10:33 AM

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

  • 1

#14 hieuhx68

hieuhx68

    biết vẽ circle

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

Đã gửi 09 June 2014 - 10:47 AM

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 ạ.


  • 0