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ị

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.

Dạ u của em là (distance pt1 pt2) đó anh. Ở trong tập lệnh setq,ngay trước dòng tính tmp1tmp2 đó ạ.

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

Dạ anh nhiệt tình góp ý là tốt với em lắm rồi, em giận sao được ạ:).

Sau đây em xin 'mổ xẻ' một số ý kiến góp ý của anh như sau:

 

1. Ý của anh là em phải setq một giá trị nào đó cho biến a, lay1, lay2 trước ạ. Vậy là trước khi gọi mấy hàm này cần phải setq giá trị cho nó trước rồi. Không biết có cách nào mà gói gọn cả gán giá trị và kiểm tra tính hợp lệ của nó không ạ? À mà trong lisp chỉ có định nghĩa hàm (defun) chứ không có thủ tục (procedure) ạ ?

2. Dạ, nhưng giá sử như layer mà chưa có (nghĩa là mình muốn tạo mới) thì đánh vào cũng được ạ. Nhưng dù sao em cũng sẽ thử cách lấy layer bằng cách pick điểm.

3a. Dạ cái này em quên chưa kiểm tra, em chỉ kiểm tra là 2a < distance pt1 pt2 , thôi ạ, em sẽ thử bổ sung

3b. Dạ cái này thì em cũng chưa kiểm tra

3c. Vì thế em đã dùng strcase đó ạ

3d. Cái này thì mới đối với em, em sẽ thử tìm hiểu xem thế nào ạ

3e. Còn thứ này anh, làm thế nào để lưu được giá trị mặc định, nghĩa là khi mình hỏi người dùng là có muốn tạo layer nào không, vì nó chưa có, với ý niệm là nếu người dùng muốn thì chỉ cần nhấn Enter, kiểu như:

The layer does not exist. Do you want to create this layer ? (Y/N): <Y>, người dùng muốn tạo thì chỉ cần nhấn enter, hoặc y , hoặc Y. Nghĩa là mình mặc định giá trị Y cho biến hỏi này í ạ.

 

Chúc cả nhà một ngày vui vẻ !

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

a của bạn ??? ^^

a của em được lấy từ hàm CheckLength mà em gọi ở phía trên đấy ạ, còn hàm CheckLength thì em đã định nghĩa phía dưới rồi ạ :

 

(defun Checklength ( a 1st 2nd)
(setq a (getreal "\nThe length of the first (third) line: "))
(while (>= (* 2 a) (distance 1st 2nd))
	(setq a (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: "))
)
)

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

Dạ anh nhiệt tình góp ý là tốt với em lắm rồi, em giận sao được ạ:).

Sau đây em xin 'mổ xẻ' một số ý kiến góp ý của anh như sau:

 

1. Ý của anh là em phải setq một giá trị nào đó cho biến a, lay1, lay2 trước ạ. Vậy là trước khi gọi mấy hàm này cần phải setq giá trị cho nó trước rồi. Không biết có cách nào mà gói gọn cả gán giá trị và kiểm tra tính hợp lệ của nó không ạ? À mà trong lisp chỉ có định nghĩa hàm (defun) chứ không có thủ tục (procedure) ạ ?

2. Dạ, nhưng giá sử như layer mà chưa có (nghĩa là mình muốn tạo mới) thì đánh vào cũng được ạ. Nhưng dù sao em cũng sẽ thử cách lấy layer bằng cách pick điểm.

3a. Dạ cái này em quên chưa kiểm tra, em chỉ kiểm tra là 2a < distance pt1 pt2 , thôi ạ, em sẽ thử bổ sung

3b. Dạ cái này thì em cũng chưa kiểm tra

3c. Vì thế em đã dùng strcase đó ạ

3d. Cái này thì mới đối với em, em sẽ thử tìm hiểu xem thế nào ạ

3e. Còn thứ này anh, làm thế nào để lưu được giá trị mặc định, nghĩa là khi mình hỏi người dùng là có muốn tạo layer nào không, vì nó chưa có, với ý niệm là nếu người dùng muốn thì chỉ cần nhấn Enter, kiểu như:

The layer does not exist. Do you want to create this layer ? (Y/N): <Y>, người dùng muốn tạo thì chỉ cần nhấn enter, hoặc y , hoặc Y. Nghĩa là mình mặc định giá trị Y cho biến hỏi này í ạ.

 

Chúc cả nhà một ngày vui vẻ !

Chà, hơi mõi đây!

1. Nguyên tắc chung là: giải quyết thằng trái đến thằng phải, giải quyết thằng trên đến thằng dưới. Vì vậy, muốn 1 hàm được thực thi thì nó phải quen mặt mấy thằng đó đã.

2. Tạo giá trị mặc định là cực kỳ lợi hại đấy. Ví dụ trong bài toán của bạn: lúc nào cũng phải nhập tên 2 layer thì oải lắm.

Bác SSG có 1 bài về vấn đề này, tôi quên link cũ nên copy cho bạn bằng link mới đây.

3. Khống chế dữ liệu nhập bằng hàm (initget) cũng cực kỳ lợi hại luôn. Ví dụ trong bài toán của bạn: khi pt1 trùng pt2 thì sẽ có phép chia a (a khác 0) cho 0. Nguy hiểm chứ?

4. Bạn cố gắng dùng công cụ để tìm kiếm trên diễn đàn này. Gần như... cái gì cũng có. Tôi mót hoài mà không hết lúa.

Chúc bạn vui.

http://www.cadviet.com/upfiles/3/tao_gia_tri_mac_dinh.

  • 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

Chà, hơi mõi đây!

1. Nguyên tắc chung là: giải quyết thằng trái đến thằng phải, giải quyết thằng trên đến thằng dưới. Vì vậy, muốn 1 hàm được thực thi thì nó phải quen mặt mấy thằng đó đã.

2. Tạo giá trị mặc định là cực kỳ lợi hại đấy. Ví dụ trong bài toán của bạn: lúc nào cũng phải nhập tên 2 layer thì oải lắm.

Bác SSG có 1 bài về vấn đề này, tôi quên link cũ nên copy cho bạn bằng link mới đây.

3. Khống chế dữ liệu nhập bằng hàm (initget) cũng cực kỳ lợi hại luôn. Ví dụ trong bài toán của bạn: khi pt1 trùng pt2 thì sẽ có phép chia a (a khác 0) cho 0. Nguy hiểm chứ?

4. Bạn cố gắng dùng công cụ để tìm kiếm trên diễn đàn này. Gần như... cái gì cũng có. Tôi mót hoài mà không hết lúa.

Chúc bạn vui.

http://www.cadviet.com/upfiles/3/tao_gia_tri_mac_dinh.

Cảm ơn anh đã quan tâm, em nhấn thanks cho bài viết của em nhưng hôm nay em thank hết côta rồi, nên để mai vậy :D. Cái link anh đưa bị die rồi hay sao í ạ, để em lục trên 4rum coi. Dù sao cũng rất cảm ơn anh rất 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

Em đã sửa lại như sau, giờ lisp đã chạy OK, nhưng có vẻ vẫn cần phải gọt giũa tiếp (em chưa làm phần kiểm tra 2 điểm pt1 và pt2 có trùng nhau hay không:D).

;;; Create 3 lines, that lie on a line, and on different layers
;;; written by pdle
(defun C:lp (/ pt1 pt2 X1 Y1 Z1 X2 Y2 Z2 u tmp1 tmp2)
(setq	pt1 (getpoint "\nSpecify the first point: ")
		pt2 (getpoint "\nSpecify the second point: ")		
)
(ImportData)
(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))))
);;; Calculate the points' coordinates
(Line pt1 tmp1 lay1);;; Create the first line
(Line pt2 tmp2 lay1);;; Create the third line
(Line tmp1 tmp2 lay2);;; Create the second line
)
(defun Line (1st 2nd Lay) 
(entmakex (list (cons 0 "LINE") (cons 10 1st ) (cons 11 2nd ) (cons 8 Lay)))
);;; Create a line from by 2 points and it's on a defined layer
(defun ImportData (/ OK lay1pre lay2pre apre amax amin   ) 
(setq OK nil)(if (= lay1 nil) (setq lay1pre "0") (setq lay1pre lay1))
(while (not OK )  
	(setq lay1 (getstring (strcat "\nSpecify the layer of the 1st and 3rd <" lay1pre ">: ")) )
	(if (= lay1 "") (setq lay1 lay1pre))
	(if (not (tblsearch "layer" lay1)) 
	(progn 
		(setq ask (getstring (strcat "The layer " lay1 " does not exist. Do you want to create this layer ? (Y/N) : ")))
			(if (= (strcase ask) "Y") 
			(progn (command "-layer" "new" lay1 "") (setq OK T))
			)
	)
	(setq OK T)
	)
);;; The part of importing the layer of the 1st and 3rd lines
(setq OK nil)(if (= lay2 nil) (setq lay2pre "0") (setq lay2pre lay2))
(while (not OK )  
	(setq lay2 (getstring (strcat "\nSpecify the layer of the 2nd <" lay2pre ">: ")) )
	(if (= lay2 "") (setq lay2 lay2pre))
	(if (not (tblsearch "layer" lay2)) 
	(progn 
		(setq ask (getstring (strcat "The layer " lay2 " does not exist. Do you want to create this layer ? (Y/N): ")))
			(if (= (strcase ask) "Y") 
			(progn (command "-layer" "new" lay2 "") (setq OK T))
			)
	)
	(setq OK T)
	)
);;; The part of importing the layer of the 2nd line
(setq 	
	OK nil
	amax (* 0.5 (distance pt1 pt2))
	amin 0.001
)
(if (= a nil) (setq apre 0.338) (setq apre a))
(while (not OK )  
	(setq a (getreal (strcat "\nThe length of the 1st and 3rd <" (rtos apre) ">: ")) )
	(if (= a nil) (setq a apre))
	(if (or (>= (* 2 a) (distance pt1 pt2)) (>= 0 a) )
		(setq ask (getstring "\n amax= " (rtos amax) " amin= " (rtos amin))) (setq OK T)
	)		
);;; The part of importing the length of the 1st and 3rd lines
);;; Import the layers and the length

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  

×