Chuyển đến nội dung
Diễn đàn CADViet
pfievxd

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

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

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

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

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

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

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

 

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

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

 

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

các bác có thể sửa giúp mình lisp này tý được ko ah.lisp này có thể chỉnh lại khi vẽ qua 1 điểm rồi chọn điểm thứ 2 vẽ tiếp và nhập lại chiều dài khác và tiếp tục cho các điểm khác luôn chứ ko cần gọi lại lệnh khi đã vẽ qua 1 điểm. mình cảm ơn nhiều!

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
Vào lúc 9/6/2014 tại 10:33, gia_bach đã nó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) )

anh cho em  hỏi ở dòng: 

ang ( angle '(0 0) (Vlax-curve-getfirstderiv curve (vlax-curve-getParamAtPoint curve pt))) )

thì '(0 0) nó có nghĩa là gì ạ?

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
4 phút trước, phat1998 đã nói:

anh cho em  hỏi ở dòng: 

ang ( angle '(0 0) (Vlax-curve-getfirstderiv curve (vlax-curve-getParamAtPoint curve pt))) )

thì '(0 0) nó có nghĩa là gì ạ?

'(0 0): tọa độ điểm có x=0 và y=0

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
2 phút trước, Doan Van Ha đã nói:

'(0 0): tọa độ điểm có x=0 và y=0

trong công thức ( angle ( pt1 pt2)) thì ở đây là điểm (0,0) và còn lại thì lại là hàm vlax-curve-getfirstdiriv cho kết quả là đạo hàm. em ko hiểu chỗ này lắm. anh giải thích cho em đc ko ạ?

 

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
11 phút trước, phat1998 đã nói:

trong công thức ( angle ( pt1 pt2)) thì ở đây là điểm (0,0) và còn lại thì lại là hàm vlax-curve-getfirstdiriv cho kết quả là đạo hàm. em ko hiểu chỗ này lắm. anh giải thích cho em đc ko ạ?

 

Help nói rõ 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
28 phút trước, phat1998 đã nói:

trong công thức ( angle ( pt1 pt2)) thì ở đây là điểm (0,0) và còn lại thì lại là hàm vlax-curve-getfirstdiriv cho kết quả là đạo hàm. em ko hiểu chỗ này lắm. anh giải thích cho em đc ko ạ?

 

Bạn hiểu thể nào là đạo hàm, tại sao bạn cho rằng kết quả là đạo hà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
1 phút trước, Doan Nguyen Van đã nói:

Bạn hiểu thể nào là đạo hàm, tại sao bạn cho rằng kết quả là đạo hàm ? 

em đọc trên help thì hàm vlax-curve-getfirstderiv cho kết quả đao hàm bậc nhất tại điểm đang xét. mấy bác phía trên cũng nói thế ạ

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
3 phút trước, phat1998 đã nói:

em đọc trên help thì hàm vlax-curve-getfirstderiv cho kết quả đao hàm bậc nhất tại điểm đang xét. mấy bác phía trên cũng nói thế ạ

Có thể bạn chưa hiểu rõ ý rồi, kết quả tạo ra là 1 point, nếu xét riêng point đó với gốc tọa độ thì được 1 phương trình đường thẳng đi qua 2 điểm (0 . 0) và điểm kết quả, Nên nó được gọi là đạo hàm bậc nhất. Tương ứng với kết quả bạn mong muốn 

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
2 phút trước, Doan Nguyen Van đã nói:

Có thể bạn chưa hiểu rõ ý rồi, kết quả tạo ra là 1 point, nếu xét riêng point đó với gốc tọa độ thì được 1 phương trình đường thẳng đi qua 2 điểm (0 . 0) và điểm kết quả, Nên nó được gọi là đạo hàm bậc nhất. Tương ứng với kết quả bạn mong muốn 

à em đã hiểu. em cảm ơn ạ!

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

×