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

[Đã xong] lisp vẽ lỗ khoan

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

(defun c:lokhoan (/ c1 d d1 d2 d3 d4 c2 p1 p2 p3 p4 )

(setq c1 (getpoint "\n Nhap toa do ve:")

d (getreal "\n khoang cach giua 2 tam:")

d1 (getreal "\n duong kinh duong tron 1:")

d2 (getreal "\n duong kinh duong tron 2:")

d3 (getreal "\n duong kinh duong tron nho 1:")

d4 (getreal "\n duong kinh duong tron nho 2:")

)

(setq c2 (polar c1 0 d)

p1 (polar c1 (/ pi 2) (/ d1 2))

p2 (polar c2 (/ pi 2) (/ d2 2))

 

p3 (polar c1 0 (/ d1 2))

p4 (polar c2 0 (-(/ d2 2)))

)

(command "circle" c1 "d" d1

"circle" c2 "d" d2

"circle" c1 "d" d3

"circle" c2 "d" d4

"line" p1 p2 ""

"select" "last" ""

"mirror" "last" "" c1 c2 "N"

".trim" "p" "last" "" p3 p4 ""

)

)

Tui muốn vẽ hình như thế này

untitled.jpg

Nhưng không hiếu sai ở đâu mà chạy không đc.Mong các bác sửa giù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
Nguyen Hoanh    4.524

* Lisp của bạn chạy tốt, thuật toán sai.

Vì thế chịu, phải viết lại thôi.

 

* Đây là bài toán hình học không hề đơn giản. Mấu chốt bài toán là làm sao để vẽ được đường bao của nó. còn hai vòng tròn nhỏ bên trong thì chỉ là mắt muỗi thôi.

 

* tạm thời, đặt tên hình như sau:

vlkhoan.gif

 

* Ta phải xác định được các toạ độ p3, p4, p5, p6, p7, p8 từ các toạ độ p1, p2 và hai bán kính r1 và r2. Để từ đó lần lượt vẽ các đoạn thẳng p3-p4, p5-p6 và các cung tròn p3-p7-p5 và p4-p8-p6.

 

* Để xác định điểm các điểm này, ta sẽ xác định thông qua khoảng cách tương đối với các điểm gốc p1, p2 và các góc tương đối giữa vectơ tạo bởi chúng và hai điểm này với trục x. Tóm lại, chúng ta sẽ xác định toạ độ của chúng thông qua các hệ toạ độ cực với tâm toạ độ lần lượt là p1 và p2.

 

* Để xác định p3:

- cần xác định góc p1,p3.

- Để xác định góc p1,p3 ta thấy góc này bằng góc tuyệt đối giữa p1, p2 cộng thêm góc p2-p1-p3 (tạm đặt tên là g).

- g=arctan(b/a).

- a = r1-r2.

- b = căn bậc hai của bình phương cạnh huyền l trừ đi bình phương của a.

- l là khoảng cách giữa p1 và p2

 

* Tương tự như vậy với các đỉnh còn lại.

 

* Và như vậy, mã lệnh lisp sẽ là:

(defun c:lokhoan()  
 (setq p1 (getpoint "\nTam 1: ")
r1 (getdist p1 "\nBan kinh 1: ")
p2 (getpoint "\nTam 2: ")
r2 (getdist p2 "\nBan kinh 2: ")
l  (distance p1 p2)
a  (abs (- r1 r2))
b  (sqrt (- (* l l) (* a a)))
g  (atan b a)
p3 (polar p1 (+ (angle p1 p2) g) r1)
p4 (polar p2 (+ (angle p1 p2) g) r2)
p5 (polar p1 (- (angle p1 p2) g) r1)
p6 (polar p2 (- (angle p1 p2) g) r2)
p7 (polar p1 (+ (angle p1 p2) pi) r1)
p8 (polar p2 (+ (angle p2 p1) pi) r2)
 )
 (luuos)
 (setvar "osmode" 0)
 (command ".line" p3 p4 "")
 (command ".line" p5 p6 "")
 (command ".arc" p3 p7 p5)
 (command ".arc" p4 p8 p6)
 (traos)
 (princ "\nVao ban kinh duong tron thu nhat:")
 (command ".circle" p1 pause)
 (princ "\nVao ban kinh duong tron thu hai:")
 (command ".circle" p2 pause)
 (princ)
)
(defun luuos ()
 (setq
   HOANH_OSMODE   (getvar "OSMODE")
   HOANH_AUTOSNAP (getvar "AUTOSNAP")
 )
)
(defun traos ()
 (if HOANH_OSMODE
   (setvar "OSMODE" HOANH_OSMODE)
 )
 (if HOANH_AUTOSNAP
   (setvar "AUTOSNAP" HOANH_AUTOSNAP)
 )
)

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
DCL    21
* Lisp của bạn chạy tốt, thuật toán sai.

Vì thế chịu, phải viết lại thôi.

 

* Đây là bài toán hình học không hề đơn giản. Mấu chốt bài toán là làm sao để vẽ được đường bao của nó. còn hai vòng tròn nhỏ bên trong thì chỉ là mắt muỗi thôi.

 

* tạm thời, đặt tên hình như sau:

vlkhoan.gif

 

* Ta phải xác định được các toạ độ p3, p4, p5, p6, p7, p8 từ các toạ độ p1, p2 và hai bán kính r1 và r2. Để từ đó lần lượt vẽ các đoạn thẳng p3-p4, p5-p6 và các cung tròn p3-p7-p5 và p4-p8-p6.

 

* Để xác định điểm các điểm này, ta sẽ xác định thông qua khoảng cách tương đối với các điểm gốc p1, p2 và các góc tương đối giữa vectơ tạo bởi chúng và hai điểm này với trục x. Tóm lại, chúng ta sẽ xác định toạ độ của chúng thông qua các hệ toạ độ cực với tâm toạ độ lần lượt là p1 và p2.

 

* Để xác định p3:

- cần xác định góc p1,p3.

- Để xác định góc p1,p3 ta thấy góc này bằng góc tuyệt đối giữa p1, p2 cộng thêm góc p2-p1-p3 (tạm đặt tên là g).

- g=arctan(b/a).

- a = r1-r2.

- b = căn bậc hai của bình phương cạnh huyền l trừ đi bình phương của a.

- l là khoảng cách giữa p1 và p2

 

* Tương tự như vậy với các đỉnh còn lại.

 

* Và như vậy, mã lệnh lisp sẽ là:

(defun c:lokhoan()  
 (setq p1 (getpoint "\nTam 1: ")
r1 (getdist p1 "\nBan kinh 1: ")
p2 (getpoint "\nTam 2: ")
r2 (getdist p2 "\nBan kinh 2: ")
l  (distance p1 p2)
a  (abs (- r1 r2))
b  (sqrt (- (* l l) (* a a)))
g  (atan b a)
p3 (polar p1 (+ (angle p1 p2) g) r1)
p4 (polar p2 (+ (angle p1 p2) g) r2)
p5 (polar p1 (- (angle p1 p2) g) r1)
p6 (polar p2 (- (angle p1 p2) g) r2)
p7 (polar p1 (+ (angle p1 p2) pi) r1)
p8 (polar p2 (+ (angle p2 p1) pi) r2)
 )
 (luuos)
 (setvar "osmode" 0)
 (command ".line" p3 p4 "")
 (command ".line" p5 p6 "")
 (command ".arc" p3 p7 p5)
 (command ".arc" p4 p8 p6)
 (traos)
 (princ "\nVao ban kinh duong tron thu nhat:")
 (command ".circle" p1 pause)
 (princ "\nVao ban kinh duong tron thu hai:")
 (command ".circle" p2 pause)
 (princ)
)
(defun luuos ()
 (setq
   HOANH_OSMODE   (getvar "OSMODE")
   HOANH_AUTOSNAP (getvar "AUTOSNAP")
 )
)
(defun traos ()
 (if HOANH_OSMODE
   (setvar "OSMODE" HOANH_OSMODE)
 )
 (if HOANH_AUTOSNAP
   (setvar "AUTOSNAP" HOANH_AUTOSNAP)
 )
)

 

 

Đây là bài toán nghiêng về tính toán hình học hơn là viết lisp. Bác Hoành ơi đoạn lisp của bác chỉ đúng với một nửa thôi. Có nghĩa là nếu cho đường kính vòng tròn bên trái nhỏ hơn thì sẽ ra hình khác : 2 cạnh bên lúc này không phải tiếp tuyến với đường tròn nữa. Có lẽ phải phân biệt vòng tròn nào lớn hơn đặt ở đâu mới có công thức tính thích hợp.

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
Nguyen Hoanh    4.524
Đây là bài toán nghiêng về tính toán hình học hơn là viết lisp. Bác Hoành ơi đoạn lisp của bác chỉ đúng với một nửa thôi. Có nghĩa là nếu cho đường kính vòng tròn bên trái nhỏ hơn thì sẽ ra hình khác : 2 cạnh bên lúc này không phải tiếp tuyến với đường tròn nữa. Có lẽ phải phân biệt vòng tròn nào lớn hơn đặt ở đâu mới có công thức tính thích hợp.

Vẫn đúng mà!

 

DCL thử chưa?

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
DCL    21
Vẫn đúng mà!

 

DCL thử chưa?

 

Dcl đã thử rồi! Cụ thể đường kính vòng tròn 1 nhỏ hơn đường kính vòng tròn 2 thì không đúng. Định đưa hình lên cho rõ nhưng không được, xin hỏi bác thông thường đưa hình lên bằng cách nào?

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
Nguyen Hoanh    4.524
Dcl đã thử rồi! Cụ thể đường kính vòng tròn 1 nhỏ hơn đường kính vòng tròn 2 thì không đúng. Định đưa hình lên cho rõ nhưng không được, xin hỏi bác thông thường đưa hình lên bằng cách nào?

sorry!

 

tôi nhầm!

Đoạn lisp trên cần sửa lại một chút.

Mã lệnh (abs (- r1 r2)) cần phải sửa thành (- r1 r2) tức là bỏ hàm abs đi. Như vậy thì sẽ đúng trong mọi trường hợp.

 

Mã lệnh mới như sau:

(defun c:lokhoan()
(setq p1 (getpoint "\nTam 1: ")
r1 (getdist p1 "\nBan kinh 1: ")
p2 (getpoint "\nTam 2: ")
r2 (getdist p2 "\nBan kinh 2: ")
l (distance p1 p2)
[b]a (- r1 r2)[/b]
b (sqrt (- (* l l) (* a a)))
g (atan b a)
p3 (polar p1 (+ (angle p1 p2) g) r1)
p4 (polar p2 (+ (angle p1 p2) g) r2)
p5 (polar p1 (- (angle p1 p2) g) r1)
p6 (polar p2 (- (angle p1 p2) g) r2)
p7 (polar p1 (+ (angle p1 p2) pi) r1)
p8 (polar p2 (+ (angle p2 p1) pi) r2)
)
(luuos)
(setvar "osmode" 0)
(command ".line" p3 p4 "")
(command ".line" p5 p6 "")
(command ".arc" p3 p7 p5)
(command ".arc" p4 p8 p6)
(traos)
(princ "\nVao ban kinh duong tron thu nhat:")
(command ".circle" p1 pause)
(princ "\nVao ban kinh duong tron thu hai:")
(command ".circle" p2 pause)
(princ)
)
(defun luuos ()
(setq
HOANH_OSMODE (getvar "OSMODE")
HOANH_AUTOSNAP (getvar "AUTOSNAP")
)
)
(defun traos ()
(if HOANH_OSMODE
(setvar "OSMODE" HOANH_OSMODE)
)
(if HOANH_AUTOSNAP
(setvar "AUTOSNAP" HOANH_AUTOSNAP)
)
)

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


×