Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
pdle

[Hỏi] Hàm polar

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

Đây là UCS trong bản vẽ của em:

1-10.jpg

Em muốn vẽ 3 đoạn thẳng liên tiếp nhau từ pt1 đến pt2, trong đó đoạn đầu tiên từ pt1 về hướng pt2, có độ dài là a, và đoạn cuối từ pt2 về hướng pt1 cũng có độ dài là a. Em đã viết một lisp như sau:

;;; Creates a line by an angle and a distance
;;; written by pdle
(defun C:lipo ()
(setq	pt1 (getpoint "\nSpecify the first point: ")
		pt2 (getpoint "\nSpecify the second point: ")
		a   (getreal  "\nThe length of the line: ")
)
(Line pt1 (setq tmp1 (polar pt1 (angle pt1 pt2) a)))
(Line pt2 (setq tmp2 (polar pt2 (angle pt2 pt1) a)))
(Line tmp1 tmp2)
)
(defun Line (1st 2nd) (entmakex (list (cons 0 "LINE") (cons 10 1st) (cons 11 2nd))));;; Create a line by the first and end point

Nhưng khi nhập vào commandline lênh lipo và các tham số của nó thì không vẽ được các đường như mong muốn.

Đây là bản vẽ này: http://www.mediafire.com/?ff58b8kmiy62e6j

 

Tuy nhiên khi em load lisp này vào một bản vẽ 2D bình thường thì nó lại chạy rất ổn!

 

Xin mọi người cho ý kiến, giúp em vớ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

Đây là UCS trong bản vẽ của em:

1-10.jpg

Em muốn vẽ 3 đoạn thẳng liên tiếp nhau từ pt1 đến pt2, trong đó đoạn đầu tiên từ pt1 về hướng pt2, có độ dài là a, và đoạn cuối từ pt2 về hướng pt1 cũng có độ dài là a. Em đã viết một lisp như sau:

;;; Creates a line by an angle and a distance
;;; written by pdle
(defun C:lipo ()
(setq	pt1 (getpoint "\nSpecify the first point: ")
		pt2 (getpoint "\nSpecify the second point: ")
		a   (getreal  "\nThe length of the line: ")
)
(Line pt1 (setq tmp1 (polar pt1 (angle pt1 pt2) a)))
(Line pt2 (setq tmp2 (polar pt2 (angle pt2 pt1) a)))
(Line tmp1 tmp2)
)
(defun Line (1st 2nd) (entmakex (list (cons 0 "LINE") (cons 10 1st) (cons 11 2nd))));;; Create a line by the first and end point

Nhưng khi nhập vào commandline lênh lipo và các tham số của nó thì không vẽ được các đường như mong muốn.

Đây là bản vẽ này: http://www.mediafire.com/?ff58b8kmiy62e6j

 

Tuy nhiên khi em load lisp này vào một bản vẽ 2D bình thường thì nó lại chạy rất ổn!

 

Xin mọi người cho ý kiến, giúp em với ạ !

Theo định nghĩa góc trong hàm polar thì đó là góc tạo với trục X. Bạn kiểm tra lại 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

Theo định nghĩa góc trong hàm polar thì đó là góc tạo với trục X. Bạn kiểm tra lại xem.

Em hiểu là như thế, nhưng trong bản vẽ không gian của em, nó lại không định hướng theo trục X thì phải. Thực hiện lệnh nhưng chẳng thấy đâu cả (pt1 va pt2 cùng thuộc một mặt phẳng XOY).

Trong khi các bản vẽ 2D thì lisp đó chạy vô tư :D

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

Em hiểu là như thế, nhưng trong bản vẽ không gian của em, nó lại không định hướng theo trục X thì phải. Thực hiện lệnh nhưng chẳng thấy đâu cả (pt1 va pt2 cùng thuộc một mặt phẳng XOY).

Trong khi các bản vẽ 2D thì lisp đó chạy vô tư :D

1. Nếu zoom "e" bạn sẽ thấy 3 line được tạo ra, nhưng không đúng vị trí.

2. Để vẽ đúng bạn thay hàm entmakex bởi entmake là được.

P/S: Cám ơn bác Tue_NV đã trả lời ở dưới. Tôi sorry dòng số 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

Em hiểu là như thế, nhưng trong bản vẽ không gian của em, nó lại không định hướng theo trục X thì phải. Thực hiện lệnh nhưng chẳng thấy đâu cả (pt1 va pt2 cùng thuộc một mặt phẳng XOY).

Trong khi các bản vẽ 2D thì lisp đó chạy vô tư :D

Bạn thay hàm con LINE của bạn thành hàm này :

(defun Line (1st 2nd) (entmakex (list (cons 0 "LINE") (cons 10 (trans 1st 1 0)) (cons 11 (trans 2nd 1 0)))))

 

1. Nếu zoom "e" bạn sẽ thấy 3 line được tạo ra, nhưng không đúng vị trí.

2. Để vẽ đúng bạn thay hàm entmakex bởi entmake là được.

1. Đúng

2. Sai

  • Vote tăng 3

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

Bạn thay hàm con LINE của bạn thành hàm này :

(defun Line (1st 2nd) (entmakex (list (cons 0 "LINE") (cons 10 (trans 1st 1 0)) (cons 11 (trans 2nd 1 0)))))

 

Cảm ơn anh Tue_NV đã cho em biết thêm về hàm trans. Tiếc là chỉ được thank có 1 lần thôi :D

Hàm này theo em hiểu là sẽ chuyển tọa độ của một điểm từ hệ trục tọa độ này sang hệ trục tọa độ khác. Chẳng hạn (trans 1st 1 0) sẽ trả về tọa độ của điểm 1st trong hệ trục tọa độ WCS. Không biết em hiểu như thế có đúng không nữa?

 

Trong bài toán của em, để các đường thẳng vẽ ra nằm trong mặt phẳng mong muốn, như trong hình vẽ minh họa:

3-6.jpg

nghĩa là đoạn thẳng được tạo ra bởi lisp (đánh dấu vuông đỏ), phải nằm trên cùng một mặt phẳng với các đoạn thẳng được đánh dấu tròn đỏ,thì cần phải đổi cả CS nữa, nghĩa là dùng thêm cả lệnh UCS như sau:

;;; Creates a line by an angle and a distance
;;; written by pdle
(defun C:lp ()
(setq	pt1 (getpoint "\nSpecify the first point: ")
		pt2 (getpoint "\nSpecify the second point: ")
		pt3 (getpoint "\nSpecify a point on the plane: ")
		a   0.338
		lay1 "GirderTube10"
		lay2 "GirderBamN8"
)
(ChangeCS pt1 pt2 pt3)
(Line pt1 (setq tmp1 (polar pt1 (angle pt1 pt2) a)) lay1)
(Line pt2 (setq tmp2 (polar pt2 (angle pt2 pt1) a)) lay1)
(Line tmp1 tmp2 lay2)

)
(defun Line (1st 2nd Lay) 
(entmakex (list (cons 0 "LINE") (cons 10 (trans 1st 1 0)) (cons 11 (trans 2nd 1 0)) (cons 8 Lay)))
);;; Create a line by the first and end point
(defun ChangeCS (Origin Xdirec XYPlane)
(command "UCS" (trans Origin 1 0) (trans Xdirec 1 0) (trans XYPlane 1 0)"")
)

 

Nhưng kết quả vẫn không được như mong muốn, nghĩa là:

1. Hệ CS mới tạo ra thì có trục X không hướng từ Pt1 đến Pt2. Các trục X Y Z quay lung tung, không như mong muốn là xác định bởi gốc Pt1, trục X là Pt1 Pt2, và điểm nằm trên XOY là Pt3

2. Có lẽ vì thế mà đoạn thẳng vẽ ra cũng không đúng yêu cầu:

4-3.jpg

 

Mong mọi người giúp em với ạ :D

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

Đi theo con đường bá đạo là vẽ ra rồi quay (kết hợp xoay trục tọa độ) là được bạ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

Đi theo con đường bá đạo là vẽ ra rồi quay (kết hợp xoay trục tọa độ) là được bạn ạ.

Nhưng như thế thì vất quá anh ạ. Em có phải vẽ hàng trăm đường như thế trên các mặt khác nhau :(.

 

Anh nào giúp em với :D

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

Nhưng như thế thì vất quá anh ạ. Em có phải vẽ hàng trăm đường như thế trên các mặt khác nhau :(.

 

Anh nào giúp em với :D

Tạo cái hàm con sau đó dùng các tham số thì chắc ko chậm lắm đâ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

Tạo cái hàm con sau đó dùng các tham số thì chắc ko chậm lắm đâu.

Thì trong lisp của em cũng có một cái hàm con:

(defun ChangeCS (Origin Xdirec XYPlane)
 (command "UCS" (trans Origin 1 0) (trans Xdirec 1 0) (trans XYPlane 1 0)"")
)

 

Nhưng mà hình như là chưa chuẩn thì phải :D

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

Thì trong lisp của em cũng có một cái hàm con:

(defun ChangeCS (Origin Xdirec XYPlane)
 (command "UCS" (trans Origin 1 0) (trans Xdirec 1 0) (trans XYPlane 1 0)"")
)

 

Nhưng mà hình như là chưa chuẩn thì phải :D

Có phải như thế này không?

http://www.cadviet.com/upfiles/3/lp.lsp

  • 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

Thì trong lisp của em cũng có một cái hàm con:

(defun ChangeCS (Origin Xdirec XYPlane)
 (command "UCS" (trans Origin 1 0) (trans Xdirec 1 0) (trans XYPlane 1 0)"")
)

 

Nhưng mà hình như là chưa chuẩn thì phải :D

Mình chẳng mò mẫm với 3D bao giờ, cũng nông cạn, nên chỉ có 1 vài điều nhắn nhủ ^^

- Có phải bạn đang trans đến 2 lần ??

- Công việc liên tiếp bạn nên cho vào While

- Các phép toán về góc thường dựa theo trục X làm căn cứ, nên cái này cần phải chuẩn nè

- Trong phép xoay trục, điểm pt3 quan trọng lắm, nên bạn nên bắt vào 1 điểm có từ trước ^^

P/S : không ngờ cái lisp bạn yêu cầu viết hôm nọ để ứng dụng trong việc này. Chúc bạn sớm thành công

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

Mình chẳng mò mẫm với 3D bao giờ, cũng nông cạn, nên chỉ có 1 vài điều nhắn nhủ ^^

- Có phải bạn đang trans đến 2 lần ??

- Công việc liên tiếp bạn nên cho vào While

- Các phép toán về góc thường dựa theo trục X làm căn cứ, nên cái này cần phải chuẩn nè

- Trong phép xoay trục, điểm pt3 quan trọng lắm, nên bạn nên bắt vào 1 điểm có từ trước ^^

P/S : không ngờ cái lisp bạn yêu cầu viết hôm nọ để ứng dụng trong việc này. Chúc bạn sớm thành công

Ura, em đã tìm ra rồi các anh ạ :D. Sau khi đọc kĩ lại hàm entmakex (cám ơn anh ketxu đã cho em biết về hàm này :)) em nhận ra là các code dxf 10 và 11 (điểm đầu và điểm cuối) là tọa độ của các điểm ấy so với WCS, như vậy là nó không phụ thuộc UCS.

Ngoài ra việc sử dụng polar trong việc vẽ đoạn thẳng là khá "nhạy cảm" vì nó phụ thuộc vào hướng của trục X của UCS. Do vậy em đã quyết định tính tọa độ theo hình học giải tích.

Và cuối cùng em đã thành công :D. Cảm ơn cả nhà đã giúp đỡ em rất tận tình. Sau đây là code cái lisp của em.

À em nói qua về yêu cầu bài toán của em một tí:

Yêu cầu: vẽ mô hình dây của một kết cấu cầu ở dạng file .dxf, dùng để import vào chương trình tính toán Femap-Nastran. Mỗi thanh thẳng của khung được cấu tạo từ 2 loại vật liệu: 2 đầu là thép, ở giữa là vật liệu composite. Ngoài ra ở các vị trí khác nhau thì kích thước của các thành phần sử dụng các vật liệu cũng khác nhau, do đó đòi hỏi phân ra các layer rõ ràng để thuận tiện cho việc mô hình hóa về sau.

 

;;; Creates a line by an angle and a distance
;;; written by pdle
(defun C:lp ()
(setq	pt1 (getpoint "\nSpecify the first point: ")
		pt2 (getpoint "\nSpecify the second point: ")
		a   0.338
		lay1 "GirderTube10"
		lay2 "GirderBamN8"
)
(setq
	X1 (nth 0 pt1)
	Y1 (nth 1 pt1)
	Z1 (nth 2 pt1)
	X2 (nth 0 pt2)
	Y2 (nth 1 pt2)
	Z2 (nth 2 pt2)
	u  (distance pt1 pt2)
	tmp1 (list (+ X1 (* (/ a u) (- X2 X1))) (+ Y1 (* (/ a u) (- Y2 Y1))) (+ Z1 (* (/ a u) (- Z2 Z1))))
	tmp2 (list (+ X2 (* (/ a u) (- X1 X2))) (+ Y2 (* (/ a u) (- Y1 Y2))) (+ Z2 (* (/ a u) (- Z1 Z2))))
)
(Line pt1 tmp1 lay1)
(Line pt2 tmp2 lay1)
(Line tmp1 tmp2 lay2)

)
(defun Line (1st 2nd Lay) 
(entmakex (list (cons 0 "LINE") (cons 10 1st ) (cons 11 2nd ) (cons 8 Lay)))
);;; Create a line by the first and end point

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

Ura, em đã tìm ra rồi các anh ạ :D. Sau khi đọc kĩ lại hàm entmakex (cám ơn anh ketxu đã cho em biết về hàm này :)) em nhận ra là các code dxf 10 và 11 (điểm đầu và điểm cuối) là tọa độ của các điểm ấy so với WCS, như vậy là nó không phụ thuộc UCS.

Ngoài ra việc sử dụng polar trong việc vẽ đoạn thẳng là khá "nhạy cảm" vì nó phụ thuộc vào hướng của trục X của UCS. Do vậy em đã quyết định tính tọa độ theo hình học giải tích.

Và cuối cùng em đã thành công :D. Cảm ơn cả nhà đã giúp đỡ em rất tận tình. Sau đây là code cái lisp của em.

À em nói qua về yêu cầu bài toán của em một tí:

Yêu cầu: vẽ mô hình dây của một kết cấu cầu ở dạng file .dxf, dùng để import vào chương trình tính toán Femap-Nastran. Mỗi thanh thẳng của khung được cấu tạo từ 2 loại vật liệu: 2 đầu là thép, ở giữa là vật liệu composite. Ngoài ra ở các vị trí khác nhau thì kích thước của các thành phần sử dụng các vật liệu cũng khác nhau, do đó đòi hỏi phân ra các layer rõ ràng để thuận tiện cho việc mô hình hóa về sau.

 

;;; Creates a line by an angle and a distance
;;; written by pdle
(defun C:lp ()
(setq	pt1 (getpoint "\nSpecify the first point: ")
		pt2 (getpoint "\nSpecify the second point: ")
		a   0.338
		lay1 "GirderTube10"
		lay2 "GirderBamN8"
)
(setq
	X1 (nth 0 pt1)
	Y1 (nth 1 pt1)
	Z1 (nth 2 pt1)
	X2 (nth 0 pt2)
	Y2 (nth 1 pt2)
	Z2 (nth 2 pt2)
	u  (distance pt1 pt2)
	tmp1 (list (+ X1 (* (/ a u) (- X2 X1))) (+ Y1 (* (/ a u) (- Y2 Y1))) (+ Z1 (* (/ a u) (- Z2 Z1))))
	tmp2 (list (+ X2 (* (/ a u) (- X1 X2))) (+ Y2 (* (/ a u) (- Y1 Y2))) (+ Z2 (* (/ a u) (- Z1 Z2))))
)
(Line pt1 tmp1 lay1)
(Line pt2 tmp2 lay1)
(Line tmp1 tmp2 lay2)

)
(defun Line (1st 2nd Lay) 
(entmakex (list (cons 0 "LINE") (cons 10 1st ) (cons 11 2nd ) (cons 8 Lay)))
);;; Create a line by the first and end point

Tôi theo dõi và thử lsp trên thì hệ trục vẫn giữ nguyên, còn 3 line thì nó vẫn "bay" bạn à.

Bạn có thử cái ở #11 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

Có phải như thế này không?

http://www.cadviet.com/upfiles/3/lp.lsp

Em đã làm lại rồi anh ạ, không cần lệnh ucs nữa ạ. Dù sao cũng cảm ơn anh đã quan tâm. Mà em đã cảm ơn bằng hành động rồi đấy ạ, hihi :). Chúc anh sức khỏe :)

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ôi theo dõi và thử lsp trên thì hệ trục vẫn giữ nguyên, còn 3 line thì nó vẫn "bay" bạn à.

Bạn có thử cái ở #11 chưa.

Không bay đâu anh à. Mà cái #11 là cái gì hả anh ?

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

Em đã làm lại rồi anh ạ, không cần lệnh ucs nữa ạ. Dù sao cũng cảm ơn anh đã quan tâm. Mà em đã cảm ơn bằng hành động rồi đấy ạ, hihi :). Chúc anh sức khỏe :)

Thì cái bạn mới tải lên: 3 line nó "bay" xa lắm. Tôi thử trên máy mình thì thấy vậ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

Thì cái bạn mới tải lên: 3 line nó "bay" xa lắm. Tôi thử trên máy mình thì thấy vậy

Em hiểu tại sao rồi anh ạ. Vì cái của em không dùng hàm trans nữa, mà trong cái file em upload lên đây, UCS đã bị thay. Nếu vẫn giữ nguyên cái CS này rồi dùng lisp thì nó vẫn bay xa.

Nhưng nếu anh dùng lệnh UCS rồi chuyển về WCS thì mượt lắm anh ạ. Anh test hộ em với coi chuẩn không nha :)

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

Em hiểu tại sao rồi anh ạ. Vì cái của em không dùng hàm trans nữa, mà trong cái file em upload lên đây, UCS đã bị thay. Nếu vẫn giữ nguyên cái CS này rồi dùng lisp thì nó vẫn bay xa.

Nhưng nếu anh dùng lệnh UCS rồi chuyển về WCS thì mượt lắm anh ạ. Anh test hộ em với coi chuẩn không nha :)

1. Cái #11 là ở trang 11, như hiện tại của bạn là #18.

2. Nếu dùng hàm (command "line" ...) thì cũng ok luô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

1. Cái #11 là ở trang 11, như hiện tại của bạn là #18.

2. Nếu dùng hàm (command "line" ...) thì cũng ok luôn.

Nhưng command "line" không set được layer anh ạ :D. Entmakex vẫn mạnh hơn thì phả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

Nhưng command "line" không set được layer anh ạ :D. Entmakex vẫn mạnh hơn thì phải ạ

Entmakex có nhiều ưu điểm hơn command (trên CADViet đã có bài phân tích rồi). Còn set layer thì dùng thêm 1 lệnh nữ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

Entmakex có nhiều ưu điểm hơn command (trên CADViet đã có bài phân tích rồi). Còn set layer thì dùng thêm 1 lệnh nữa

Lệnh gì 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

Em đã thêm vào cái lisp phía trên phần kiểm tra độ dài a, và kiểm tra sự tồn tại của layer nhập vào, nhưng lại báo lỗi : ; error: bad argument type: numberp: nil

;;; written by pdle
(defun C:lp (/ a X1 X2 Y1 Y2 Z1 Z2 pt1 pt2 lay1 lay2 tmp1 tmp2 u)
(setq	pt1 (getpoint "\nSpecify the first point: ")
		pt2 (getpoint "\nSpecify the second point: ")
)
(Checklength a pt1 pt2)
(Importlayer lay1 "the first and third lines: ")
(Importlayer lay2 "the second line: ")
	(setq
	X1 (nth 0 pt1)
	Y1 (nth 1 pt1)
	Z1 (nth 2 pt1)
	X2 (nth 0 pt2)
	Y2 (nth 1 pt2)
	Z2 (nth 2 pt2)
	u  (distance pt1 pt2)
	tmp1 (list (+ X1 (* (/ a u) (- X2 X1))) (+ Y1 (* (/ a u) (- Y2 Y1))) (+ Z1 (* (/ a u) (- Z2 Z1))))
	tmp2 (list (+ X2 (* (/ a u) (- X1 X2))) (+ Y2 (* (/ a u) (- Y1 Y2))) (+ Z2 (* (/ a u) (- Z1 Z2))))
)
(Line pt1 tmp1 lay1)
(Line pt2 tmp2 lay1)
(Line tmp1 tmp2 lay2)
)
(defun Line (1st 2nd Lay) 
(entmakex (list (cons 0 "LINE") (cons 10 1st ) (cons 11 2nd ) (cons 8 Lay)))
)
(defun Importlayer (layername message ) 
(setq 	layername (getstring (strcat "\nSpecify the layer of " message)))
(while (not (tblsearch "layer" layername))
	(setq layerask (getstring "The layer does not exist. Do you want to create this layer ? (Y/N): "))
	(if (= (strcase layerask) "Y") (command "-layer" "new" layername ""))
	(if (/= (strcase layerask) "Y")(setq layername (getstring (strcat "\nSpecify the layer of " message))))
)
)
(defun Checklength ( len 1st 2nd)
(setq len (getreal "\nThe length of the first (third) line: "))
(while (>= (* 2 len) (distance 1st 2nd))
	(setq len (getreal "\nThe sum of lengths of the first and the third lines is above the distance from the first point to the second. Give a new value: "))
)
)

 

Mong mọi người cho ý kiế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

Em đã thêm vào cái lisp phía trên phần kiểm tra độ dài a, và kiểm tra sự tồn tại của layer nhập vào, nhưng lại báo lỗi : error: bad argument type: numberp: nil

	tmp1 (list (+ X1 (* (/ a u) (- X2 X1))) (+ Y1 (* (/ a u) (- Y2 Y1))) (+ Z1 (* (/ a u) (- Z2 Z1))))
	tmp2 (list (+ X2 (* (/ a u) (- X1 X2))) (+ Y2 (* (/ a u) (- Y1 Y2))) (+ Z2 (*(/ a u) (- Z1 Z2))))


 

Mong mọi người cho ý kiến ạ :)

u của bạn đâu ??

 

P/s : Đã có bài test về tốc độ cũng như ưu thế của entmake so với command, nên chắc không còn j bàn cãi nữa ^^. Nếu pdle không có ý định thao tác ngược lại với các đối tượng tạo ra thì chỉ cần entmake thôi, không cần entmakex nữ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

Em đã thêm vào cái lisp phía trên phần kiểm tra độ dài a, và kiểm tra sự tồn tại của layer nhập vào, nhưng lại báo lỗi : ; error: bad argument type: numberp: nil

;;; written by pdle
(defun C:lp (/ a X1 X2 Y1 Y2 Z1 Z2 pt1 pt2 lay1 lay2 tmp1 tmp2 u)
(setq	pt1 (getpoint "\nSpecify the first point: ")
		pt2 (getpoint "\nSpecify the second point: ")
)
(Checklength a pt1 pt2)
(Importlayer lay1 "the first and third lines: ")
(Importlayer lay2 "the second line: ")
	(setq
	X1 (nth 0 pt1)
	Y1 (nth 1 pt1)
	Z1 (nth 2 pt1)
	X2 (nth 0 pt2)
	Y2 (nth 1 pt2)
	Z2 (nth 2 pt2)
	u  (distance pt1 pt2)
	tmp1 (list (+ X1 (* (/ a u) (- X2 X1))) (+ Y1 (* (/ a u) (- Y2 Y1))) (+ Z1 (* (/ a u) (- Z2 Z1))))
	tmp2 (list (+ X2 (* (/ a u) (- X1 X2))) (+ Y2 (* (/ a u) (- Y1 Y2))) (+ Z2 (* (/ a u) (- Z1 Z2))))
)
(Line pt1 tmp1 lay1)
(Line pt2 tmp2 lay1)
(Line tmp1 tmp2 lay2)
)
(defun Line (1st 2nd Lay) 
(entmakex (list (cons 0 "LINE") (cons 10 1st ) (cons 11 2nd ) (cons 8 Lay)))
)
(defun Importlayer (layername message ) 
(setq 	layername (getstring (strcat "\nSpecify the layer of " message)))
(while (not (tblsearch "layer" layername))
	(setq layerask (getstring "The layer does not exist. Do you want to create this layer ? (Y/N): "))
	(if (= (strcase layerask) "Y") (command "-layer" "new" layername ""))
	(if (/= (strcase layerask) "Y")(setq layername (getstring (strcat "\nSpecify the layer of " message))))
)
)
(defun Checklength ( len 1st 2nd)
(setq len (getreal "\nThe length of the first (third) line: "))
(while (>= (* 2 len) (distance 1st 2nd))
	(setq len (getreal "\nThe sum of lengths of the first and the third lines is above the distance from the first point to the second. Give a new value: "))
)
)

 

Mong mọi người cho ý kiến ạ :)

Bạn nhờ góp ý thì tôi góp ý cho trọn vậy:

1. Lỗi của bạn ở chỗ: bạn gọi một hàm mà các biến của nó thì nằm đằng sau nó, làm sao nó hiểu.

2. Chọn layer mà phải nhập tên vào thì khổ lắm. Bạn chuyển qua pick đối tượng để lấy layer thì hay hơn.

3. Đã kiểm tra dữ liệu nhập thì còn nhiều rắc rối lắm, ví dụ:

3a. a<0 thì sao.?

3b. pt1 trùng pt2 thì sao.?

3c. "Y" khác "y" nhé bạn.

3d. Kiểm tra "Y" "N" nên dùng (initget "Y N")

3e. Hình như còn vài thứ nữa...

Góp ý chân thành, mong bạn đừng giận. Khi bạn viết chương trình dài hơi thì bước kiểm tra dữ liệu nhập còn lắm nhiêu khê nữa.

Chúc bạn vui.

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
Đăng nhập để thực hiện theo  

×