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

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

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

congtrinh5    0

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?!

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

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
congtrinh5    0
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?!

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

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
congtrinh5    0
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?!

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

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

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?

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

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
congtrinh5    0
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ỉ??

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

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
congtrinh5    0
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?!!

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


×