Đến nội dung


Hình ảnh
- - - - -

Lisp vẽ đường vuông góc với mặt phẳng XY!


  • Please log in to reply
10 replies to this topic

#1 congtrinh5

congtrinh5

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 05 September 2007 - 03:58 PM

Các anh ơi em đang cần 1 lisp có nội dung như sau:
Khi chạy chương trình hỏi chọn 1 điểm trong không gian(không nằm trong mặt phẳng XY)
sau đó chương trình sẽ tự động vẽ 1 line từ điểm đó dóng vuông góc với mặt XY
(điểm thứ 2 nằm trong mặt phẳng XY)
các anh giúp em nha, em cám ơn?!
  • 0

#2 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 05 September 2007 - 04:18 PM

Các anh ơi em đang cần 1 lisp có nội dung như sau:
Khi chạy chương trình hỏi chọn 1 điểm trong không gian(không nằm trong mặt phẳng XY)
sau đó chương trình sẽ tự động vẽ 1 line từ điểm đó dóng vuông góc với mặt XY
(điểm thứ 2 nằm trong mặt phẳng XY)
các anh giúp em nha, em cám ơn?!

Lệnh là LZ:
(defun c:lz( / p)
(entmake (list
(cons 0 "LINE")
(cons 10 (setq p (trans (getpoint "\nVao diem: ") 1 0)))
(cons 11 (reverse (cons 0.0 (cdr (reverse p)))))))
(princ)
)

  • 0

#3 congtrinh5

congtrinh5

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 05 September 2007 - 04:41 PM

Lệnh là LZ:

(defun c:lz( / p)
(entmake (list
(cons 0 "LINE")
(cons 10 (setq p (trans (getpoint "\nVao diem: ") 1 0)))
(cons 11 (reverse (cons 0.0 (cdr (reverse p)))))))
(princ)
)

Anh Hoanh ơi nếu như mặt phẳng XY không phải hệ toạ độ thế giới (world)
mà là hệ địa phương do mình tự chọn thì lisp nó chạy không chính xác anh à,
có cách nào khắc phục không anh?!
  • 0

#4 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 05 September 2007 - 05:01 PM

Anh Hoanh ơi nếu như mặt phẳng XY không phải hệ toạ độ thế giới (world)
mà là hệ địa phương do mình tự chọn thì lisp nó chạy không chính xác anh à,
có cách nào khắc phục không anh?!

Lisp vừa rồi luôn đưa điểm thứ 2 về mặt phẳng xOy của thệ toạ độ World.

Lisp dưới đây đưa điểm thứ 2 về mặt phẳng xOy của hệ toạ độ UCS của mình, lệnh vẫn là LZ
(defun c:LZ(/) (command ".line" pause ".xy" "@" "0,0,0" ""))
  • 0

#5 congtrinh5

congtrinh5

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 06 September 2007 - 01:49 PM

Lisp vừa rồi luôn đưa điểm thứ 2 về mặt phẳng xOy của thệ toạ độ World.

Lisp dưới đây đưa điểm thứ 2 về mặt phẳng xOy của hệ toạ độ UCS của mình, lệnh vẫn là LZ
(defun c:LZ(/) (command ".line" pause ".xy" "@" "0,0,0" ""))

Anh hoanh oi, em đangcần 1 lisp nữa có nội dung gần giống lisp trên như sau:
chọn rectang (hay region) rồi chương trình tự động extrude xuống mặt XY(cũng là mặt UCS) liệu
có được không hở anh?!
  • 0

#6 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 06 September 2007 - 02:17 PM

Anh hoanh oi, em đangcần 1 lisp nữa có nội dung gần giống lisp trên như sau:
chọn rectang (hay region) rồi chương trình tự động extrude xuống mặt XY(cũng là mặt UCS) liệu
có được không hở anh?!

Quá được, rất đơn giản chỉ cần 1 dòng.
Nhưng bạn thử viết đi, từ những đoạn lisp mẫu vừa rồi.

Hãy tự tin, nếu viết sai tôi sẽ sửa giúp.
  • 0

#7 congtrinh5

congtrinh5

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 06 September 2007 - 03:20 PM

1 dòng thì khó quá, em viết thế này:

(defun c:extZ(/)
(setq kc (distance "@" "0,0,0"))
(command ".extrude" pause ".xy" kc ""))

Ý tưởng của em là lấy ra khoảng cách để extrude là "kc"
Nhưng hình như em thấy không ổn ở (distance "@" "0,0,0") thì phải?
  • 0

#8 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 06 September 2007 - 03:54 PM

1 dòng thì khó quá, em viết thế này:

(defun c:extZ(/)
(setq kc (distance "@" "0,0,0"))
(command ".extrude" pause ".xy" kc ""))

Ý tưởng của em là lấy ra khoảng cách để extrude là "kc"
Nhưng hình như em thấy không ổn ở (distance "@" "0,0,0") thì phải?


Bạn làm gần đúng rồi.

Bạn gặp khó khăn do có 1 lệnh mà bạn chưa biết, đó là (entsel) hàm này chọn 1 đối tượng bằng cách pick điểm. Giá trị trả về là tên của đối tượng và điểm pick. Khi dùng lệnh này chúng ta mới có tọa độ của 1 điểm nằm trên đối tượng extrude được.

(defun c:extZ()
(command ".extrude" (entsel) "" "d" "@" ".xy" "@" "0")
)

Do lệnh extrude có sự khác biệt giữa các đời AutoCAD. Nên lệnh extZ phía trên có thể không đúng với các autoCAD đời thấp. Tôi đang dùng ACAD2008. Nhưng bạn có thể tự thay đổi nếu bạn hiểu lệnh.
Hình như các đời AutoCAD thấp hơn không cần phải nhập tham số d (direction)
  • 0

#9 congtrinh5

congtrinh5

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 06 September 2007 - 08:34 PM

Bạn làm gần đúng rồi.

Bạn gặp khó khăn do có 1 lệnh mà bạn chưa biết, đó là (entsel) hàm này chọn 1 đối tượng bằng cách pick điểm. Giá trị trả về là tên của đối tượng và điểm pick. Khi dùng lệnh này chúng ta mới có tọa độ của 1 điểm nằm trên đối tượng extrude được.

(defun c:extZ()
(command ".extrude" (entsel) "" "d" "@" ".xy" "@" "0")
)

Do lệnh extrude có sự khác biệt giữa các đời AutoCAD. Nên lệnh extZ phía trên có thể không đúng với các autoCAD đời thấp. Tôi đang dùng ACAD2008. Nhưng bạn có thể tự thay đổi nếu bạn hiểu lệnh.
Hình như các đời AutoCAD thấp hơn không cần phải nhập tham số d (direction)

Vâng thưa anh em đã sửa là(em dùng cad 2005):
(defun c:extZ()
(command ".extrude" (entsel) "" "@" ".xy" "@" "0" "")
)
chạy ngon anh à, nhưng anh ơi nó không extrude xuống mặt XY đâu mà nó luôn ngược lên trên?
Làm thế nào để extrude xuống mặt XY mà không cần quan tâm đến chiều trục Z nhỉ??
  • 0

#10 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 07 September 2007 - 12:48 PM

Vâng thưa anh em đã sửa là(em dùng cad 2005):
(defun c:extZ()
(command ".extrude" (entsel) "" "@" ".xy" "@" "0" "")
)
chạy ngon anh à, nhưng anh ơi nó không extrude xuống mặt XY đâu mà nó luôn ngược lên trên?
Làm thế nào để extrude xuống mặt XY mà không cần quan tâm đến chiều trục Z nhỉ??


Chúng ta sẽ cải tiến lisp extZ để có thể extrude theo hướng ngược với cao độ của đối tượng. Bằng cách: chúng ta sẽ xác định chiều cao Z của điểm pick và nhập vào giá trị -Z trong lệnh extrude.

Cách làm: chúng ta sẽ lưu kết quả của hàm (entsel) vào một biến sel. Sau đó, tính giá trị Z của điểm vừa pick, nhân giá trị này với -1, ta sẽ có cao độ H cần extrude (h có thể âm, có thể dương). Điểm pick cuối cùng được AutoCAD lưu trong biến hệ thống lastpoint, chúng ta có thể dùng hàm getvar để lấy giá trị của nó. Hàm caddr là hàm lấy phần tử thứ 3 của 1 biến (là trục Z, vì 1 điểm có 3 phần tử là X Y Z). Như vậy, lệnh trở thành:

(defun c:extZ()
(setq
sel (entsel)
h (* -1.0 (caddr (getvar "lastpoint")))
)
(command ".extrude" sel "" h)
)

Với ví dụ này, bạn bắt đầu làm quen với AutoLisp rồi đấy. Bạn để ý một điều khác biệt trong tư duy của Autolisp và các tư duy về phép tính thông thường là cấu trúc (tênhàm thamsố1 thamsố2 ..) Chẳng hạn: thay vì lệnh
h=-1.0 * caddr(getvar("lastpoint)) thì lisp sẽ trở thành (setq h (* -1.0 (caddr (getvar "lastpoint"))))
  • 0

#11 congtrinh5

congtrinh5

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 07 September 2007 - 04:10 PM

Chúng ta sẽ cải tiến lisp extZ để có thể extrude theo hướng ngược với cao độ của đối tượng. Bằng cách: chúng ta sẽ xác định chiều cao Z của điểm pick và nhập vào giá trị -Z trong lệnh extrude.

Cách làm: chúng ta sẽ lưu kết quả của hàm (entsel) vào một biến sel. Sau đó, tính giá trị Z của điểm vừa pick, nhân giá trị này với -1, ta sẽ có cao độ H cần extrude (h có thể âm, có thể dương). Điểm pick cuối cùng được AutoCAD lưu trong biến hệ thống lastpoint, chúng ta có thể dùng hàm getvar để lấy giá trị của nó. Hàm caddr là hàm lấy phần tử thứ 3 của 1 biến (là trục Z, vì 1 điểm có 3 phần tử là X Y Z). Như vậy, lệnh trở thành:

(defun c:extZ()
(setq
sel (entsel)
h (* -1.0 (caddr (getvar "lastpoint")))
)
(command ".extrude" sel "" h)
)

Với ví dụ này, bạn bắt đầu làm quen với AutoLisp rồi đấy. Bạn để ý một điều khác biệt trong tư duy của Autolisp và các tư duy về phép tính thông thường là cấu trúc (tênhàm thamsố1 thamsố2 ..) Chẳng hạn: thay vì lệnh
h=-1.0 * caddr(getvar("lastpoint)) thì lisp sẽ trở thành (setq h (* -1.0 (caddr (getvar "lastpoint"))))

Với cad 2005 em sửa là:
(defun c:extZ()
(setq
sel (entsel)
h (* -1.0 (caddr (getvar "lastpoint")))
)
(command ".extrude" sel "" h "0" "");;=====thêm tham số góc là 0===
)
;;==Chạy ngon=========
Nhưng Anh hoành ơi, khi lisp chạy trên hệ địa phuơng (UCS) nó không chạy
lại bị lỗi như lần trước anh à? Lần này báo là:
Specify height of extrusion or [Path]: 0.000000000000000
Value must be nonzero.
; error: Function cancelled
Lại phiền anh sửa giúp rồi?!!
  • 0