Đến nội dung


Hình ảnh
- - - - -

[Hỏi] Hàm polar


  • Please log in to reply
31 replies to this topic

#21 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5449 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 18 May 2011 - 12:00 AM

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

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#22 pdle

pdle

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 286 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 18 May 2011 - 12:18 AM

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ế ạ ?
  • 0
Share your knowledge. It is a way to achieve immortality !

***

PS: Nếu bài viết của mình có ích, xin hãy "Bình chọn cho bài viết này" nhé :D

#23 pdle

pdle

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 286 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 18 May 2011 - 05:56 AM

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 ạ :)
  • 0
Share your knowledge. It is a way to achieve immortality !

***

PS: Nếu bài viết của mình có ích, xin hãy "Bình chọn cho bài viết này" nhé :D

#24 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 18 May 2011 - 08:29 AM

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

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#25 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5449 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 18 May 2011 - 09:26 AM

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

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#26 pdle

pdle

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 286 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 18 May 2011 - 02:45 PM

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 đó ạ.
  • 0
Share your knowledge. It is a way to achieve immortality !

***

PS: Nếu bài viết của mình có ích, xin hãy "Bình chọn cho bài viết này" nhé :D

#27 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 18 May 2011 - 03:06 PM

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

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#28 pdle

pdle

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 286 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 18 May 2011 - 03:17 PM

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ẻ !
  • 0
Share your knowledge. It is a way to achieve immortality !

***

PS: Nếu bài viết của mình có ích, xin hãy "Bình chọn cho bài viết này" nhé :D

#29 pdle

pdle

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 286 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 18 May 2011 - 03:20 PM

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

  • 0
Share your knowledge. It is a way to achieve immortality !

***

PS: Nếu bài viết của mình có ích, xin hãy "Bình chọn cho bài viết này" nhé :D

#30 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5449 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 18 May 2011 - 04:23 PM

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.c...a_tri_mac_dinh.
  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#31 pdle

pdle

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 286 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 18 May 2011 - 04:30 PM

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.c...a_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.
  • 0
Share your knowledge. It is a way to achieve immortality !

***

PS: Nếu bài viết của mình có ích, xin hãy "Bình chọn cho bài viết này" nhé :D

#32 pdle

pdle

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 286 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 19 May 2011 - 06:13 AM

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


  • 0
Share your knowledge. It is a way to achieve immortality !

***

PS: Nếu bài viết của mình có ích, xin hãy "Bình chọn cho bài viết này" nhé :D