Chuyển đến nội dung
Diễn đàn CADViet
ssg

Hướng dẫn lập trình Lisp

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

Cám ơn các Bác.

PP đang định dùng Lisp để vẽ mặt lưới 3D như bản vẽ dưới đây.

Thông số cho trước: L1, L2, L3 , L4, L5, H1, H2, R1, R2 và angle 25 độ.

http://www.cadviet.com/upfiles/2/ve_mat_luoi_3d.dwg

 

(Mới "nghiên kíu" thôi, chứ chưa viết gì cả)

 

Xin bác Tue_nv sửa thêm lisp vẽ phân giác để cho phép User chỉ cần select 3 điểm P0, Px, Py và input chiều dài line X.

(defun c:VPG (/ oldos prdiem ssa p ent prd prc pd pc eL dhuong hs
diem listdiem listdp xmin xmax ymin ymax)
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 3)
(setvar "cmdecho" 0)
(setvar "edgemode" 1)
(setq ssa (ssadd) i 0 listdiem (list) listdp (list))
(while (setq p (getpoint "\n Chon trung diem doan bo goc :") )
(while (or (null (nentselp p))
(not (wcmatch (cdr(assoc 0 (entget(car (nentselp p))))) "*LINE,ARC"))
)
(setq p (getpoint "\n Chon trung diem doan bo goc :")))
(setq ent (car(nentselp p)))
(setq prdiem (vlax-curve-getParamAtPoint ent p))
(setq prd (- prdiem 0.5) prc (+ prdiem 0.5))
(if (or (= prdiem 0) (= prdiem (vlax-curve-getEndParam ent)) )
(progn
(setq prd 0.5)
(setq prc (- (vlax-curve-getEndParam ent) 0.5))
) )
;;;;;;
(setq pd (vlax-curve-getPointAtParam ent prd)
pc (vlax-curve-getPointAtParam ent prc) )
(setvar "osmode" 0)
(command "Xline" "B" p pd pc "") (setq eL (entlast))
(setq dhuong (cdr(assoc 11 (entget (entlast)))))
(setq hs (distance pd pc))
(setq diem (list (+ (car p) (* (car dhuong) hs))
(+ (cadr p) (* (cadr dhuong) hs)) 0)) 
(command "line" p diem "")
(setq ssa (ssadd (entlast) ssa))
(entdel eL)
(setq listdiem (append listdiem (list diem)))
(setq listdp (append listdp (list p)))
(setvar "osmode" 3)
);while
(setq xmin (- (caar(vl-sort listdp '(lambda (x1 x2)
(< (car x1) (car x2)) ) ))
hs))
(setq xmax (+ (caar(vl-sort listdp '(lambda (x1 x2)
(> (car x1) (car x2)) ) ))
hs))
(setq ymin (- (cadar(vl-sort listdp '(lambda (x1 x2)
(< (cadr x1) (cadr x2)) ) ))
hs))
(setq ymax (+ (cadar(vl-sort listdp '(lambda (x1 x2)
(> (cadr x1) (cadr x2)) ) ))
hs))
(vla-zoomwindow (vlax-get-acad-object)
(vlax-3d-point (list xmin ymin 0))
(vlax-3d-point (list xmax ymax 0)) )
(command "extend" ssa "" "F")
(foreach x listdiem (command x)) 
(command "" "")
(setvar "osmode" oldos)
(setvar "modemacro" "Chuc ban lam viec hieu qua - Tue_NV-0955193619")
)

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ám ơn các Bác.

PP đang định dùng Lisp để vẽ mặt lưới 3D như bản vẽ dưới đây.

Thông số cho trước: L1, L2, L3 , L4, L5, H1, H2, R1, R2 và angle 25 độ.

http://www.cadviet.com/upfiles/2/ve_mat_luoi_3d.dwg

 

(Mới "nghiên kíu" thôi, chứ chưa viết gì cả)

 

Xin bác Tue_nv sửa thêm lisp vẽ phân giác để cho phép User chỉ cần select 3 điểm P0, Px, Py và input chiều dài line X

Chào Phiphi. Lisp trên là Tue_NV viết cho bạn svba1608. Lisp thực hiện chỉ khi User pick từng trung điểm của đoạn bo góc hay đó là giao điểm của 2 phân đoạn PLINE tạo nên góc. Vì bài toán của svba là bài toán bất kì. Nó chẳng tuân theo 1 quy luật nào cả, cho nên mới viết như vậy. Còn nếu các đa tuyến tạo theo 1 quy luật nhất định thì khi thực hiện Lisp sẽ nhanh hơn, cũng chẳng cần select 3 điểm P0, Px, Py như của Phiphi nói mà Lisp tự động chọn cho mình và thực thi luôn

 

input chiều dài line X : cái này Phiphi nói chưa hiểu. Thế nào là input chiều dài line X?

chiều dài line X là chiều dài // trục X chăng? Nó không // trục Ox được không?

Phiphi nên rút kinh nghiệm là mình nên nói 1 cách rõ ràng hơn. và mình nghĩ bài toán này bạn nên post vào topic "Viết Lisp theo yêu cầu" thì thích hợp hơ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
Chào Phiphi. Lisp trên là Tue_NV viết cho bạn svba1608. Lisp thực hiện chỉ khi User pick từng trung điểm của đoạn bo góc hay đó là giao điểm của 2 phân đoạn PLINE tạo nên góc. Vì bài toán của svba là bài toán bất kì. Nó chẳng tuân theo 1 quy luật nào cả, cho nên mới viết như vậy. Còn nếu các đa tuyến tạo theo 1 quy luật nhất định thì khi thực hiện Lisp sẽ nhanh hơn, cũng chẳng cần select 3 điểm P0, Px, Py như của Phiphi nói mà Lisp tự động chọn cho mình và thực thi luôn

 

input chiều dài line X : cái này Phiphi nói chưa hiểu. Thế nào là input chiều dài line X?

chiều dài line X là chiều dài // trục X chăng? Nó không // trục Ox được không?

Phiphi nên rút kinh nghiệm là mình nên nói 1 cách rõ ràng hơn. và mình nghĩ bài toán này bạn nên post vào topic "Viết Lisp theo yêu cầu" thì thích hợp hơn đó.

Xin lổi bác Tue_nv nhé.

Ý PP là vẽ 1 đường phân giác có chiều dài = X. Đây là đoạn phân giác của 2 line P0,Px và P0,Py được tạo bởi 3 điểm P0, Px và Py.

Trong bản vẽ PP đã post trên, đó là các đoạn 300 và 100 của 4 góc dùng để căng tấm lưới Hyper shape.

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 so minh không thể down load được tai lieu hoc Lisp, hệ thống báo là concurrent hits exceeded, bac nao co co the gui vao mail giup minh duoc khong:

My mail: duongnguyenwe@gmail.com

Best regard!

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ác bạn hướng dẫn giúp mình cách gởi một text vào hộp soạn thảo kiểu edit text và sau khi chính sửa lấy nội dung chúng ra một biến. Xin 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
Các bạn hướng dẫn giúp mình cách gởi một text vào hộp soạn thảo kiểu edit text và sau khi chính sửa lấy nội dung chúng ra một biến. Xin cám ơn

 

 

Trong khi chờ đợi có người giải thích thì bạn tải file Này về xem cách mình viết có giúp được vấn đề của bạn không! để hiểu thêm về tác dụng của lệnh bạn xem chủ đề :

http://www.cadviet.com/forum/index.php?sho...near&start=

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
Trong khi chờ đợi có người giải thích thì bạn tải file Này về xem cách mình viết có giúp được vấn đề của bạn không! để hiểu thêm về tác dụng của lệnh bạn xem chủ đề :

http://www.cadviet.com/forum/index.php?sho...near&start=

Cám ơn bạn. Nhưng có cách nào sd edit box có sẵn của Cad mà kg phải viết DCL kg

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ác bạn cho mình hỏi tý. Trong lisp, làm thế nào để khởi động Wipeout. Vì tạo file có dùng Wipeout để khi insert ra cho nó che cái đối tượng nó đè lên, nhưng nếu chưa gọi lệnh Wipeout thì nó chẳng thấy gì. Các bạn chỉ giúp mình nhé. 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
Các bạn cho mình hỏi tý. Trong lisp, làm thế nào để khởi động Wipeout. Vì tạo file có dùng Wipeout để khi insert ra cho nó che cái đối tượng nó đè lên, nhưng nếu chưa gọi lệnh Wipeout thì nó chẳng thấy gì. Các bạn chỉ giúp mình nhé. Cám ơn

Không thấy ai trả lời cả. Nhân vừa mới tìm ra nên đưa các bạn tham khảo vậy.

Đối với BV, nếu bạn chưa gọi lệnh Wipeout thì khi insert block có sd wipeout, nó sẽ kg thấy gì. Để khởi động wipeout, bạn cho câu lệnh sau vào lisp

(IF (= (TYPE C:WIPEOUT) 'SUBR) (arxload "wipeout"))

Ghi chú : file wipeout.arx phải có trong đường dẫn cad

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
anh ssg ơi anh cho em yahoo của anh đi hì!

Chào bạn!

Theo ssg hiểu là bạn muốn trao đổi riêng với ssg về một số vấn đề gì đó? Ssg cũng thường nhận được một số tin nhắn với nội dung tương tự như vậy. Trong đa số các trường hợp, ssg đã có câu trả lời chung như thế này:

Mọi vấn đề, nếu không mang tính cá nhân riêng tư, bạn hãy post công khai trên diễn đàn, sẽ có rất nhiều người quan tâm đến vấn đề bạn nêu và cùng nhau trao đổi, chia sẻ, học hỏi lẫn nhau. Điều đó có ích hơn gấp ngàn lần việc trao đổi riêng giữa 2 người. CADVIET phát triển được như hôm nay một phần cũng là nhờ tinh thần cộng đồng ấy.

Mong rằng bạn, cũng như một số bạn đã từng gởi tin nhắn riêng với ý muốn trao đổi chuyên môn hiểu cho.

Chúc bạn vui khi tham gia diễn đàn.

  • 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

Chào các bác, ai giúp mình viết đoạn lisp có thể thay đổi các giá trị trong BLOCK có thuộc tính rồi các giá trị khác trong BLOCK đó thay đổi theo một công thức nào đó, Ví dụ như file thống kê thép sau: http://www.cadviet.com/upfiles/2/00.dwg , khi thay đổi chiều dài thì tổng chiều dài, trọng lượng cũng thay đổi theo. Cám ơn 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
Cám ơn các Bác.

PP đang định dùng Lisp để vẽ mặt lưới 3D như bản vẽ dưới đây.

Thông số cho trước: L1, L2, L3 , L4, L5, H1, H2, R1, R2 và angle 25 độ.

http://www.cadviet.com/upfiles/2/ve_mat_luoi_3d.dwg

 

(Mới "nghiên kíu" thôi, chứ chưa viết gì cả)

...

PP vừa viết thử đoạn code dưới đây dùng để vẽ mặt lưới như bản vẽ post như trên.

Nhờ các Bác check và bổ sung để vẽ được như bản vẽ mẫu 3D trên.

Cám ơn nhiều.

;Lenh VML (Ve Mat Luoi) Phiphi- Cadviet.com
;===============================================

(defun C:VML (/ p1 p2 p3 p4 Edge1 Edge2 Edge3 Edge4)
(vl-load-com)

(setq col (getvar "cecolor"))
(setq OLDSNAP (getvar "OSMODE")			;store system variables
     OLDBLIP (getvar "BLIPMODE")
    OLDLIGHT (getvar "HIGHLIGHT")
);setq
;===============================================
(setvar "CMDECHO" 0)				;change system variables
(setvar "BLIPMODE" 0)
(setvar "OSMODE" 0)
(command "Undo" "Begin")
(command "ucs" "World")

(Setq
p1(getpoint "\n Diem goc P1: ")
p2(getpoint "\n Diem P2: ")
p3(getpoint "\n Diem P3: ")
p4(getpoint "\n Diem P4: "))

(command "layer" "m" "S_edge1" "C" "4" "" "")
;(command "ucs" "3" p2 p3 p1)

(vl-cmdf "_arc" p2 "E" p1 "A" "-25")
(setq Edge1 (entlast))
(vl-cmdf "_arc" p2 "E" p3 "A" "25")
(setq Edge2 (entlast))

(command "layer" "m" "S_edge2" "C" "5" "" "")
;(command "ucs" "3" p4 p1 p3)

(vl-cmdf "_arc" p4 "E" p3 "A" "-25")
(setq Edge3 (entlast))
(vl-cmdf "_arc" p4 "E" p1 "A" "25")
(setq Edge4 (entlast))

(command "layer" "m" "S_sail" "C" "41" "" "")
(command "_edgesurf"  Edge1 Edge2 Edge3 Edge4 "")
(setq sail (entlast))

;(command "MOVE" sail "" P1 P3)
(command "ucs" "World")

;===============================================
(setvar "cecolor" col) 
(setvar "OSMODE" OLDSNAP)			;reset system variables
(setvar "BLIPMODE" OLDBLIP)
(setvar "HIGHLIGHT" OLDLIGHT)
(princ)						;exit quietly
(prompt"\nDone\n")
(command "Undo" "End")
);defun
(prompt "\n Lenh VML (Ve Mat Luoi) ")

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ự tay mình lập một chương trình Lisp có gì khác so với nhờ ai đó làm? Chưa cần xét kết quả, điểm khác nhau rất cơ bản là bạn sẽ có được cái cảm giác rất là khoái chí (không thể diễn tả) khi chạy thử chương trình.

Ssg lập topic này không ngoài mục đích tạo điều kiện cho các bạn tự mình tìm hiểu và khám phá cái cảm giác "khoái chí không thể diễn tả" nói trên.

Với tinh thần "Share is Receive", ssg cũng mong các bạn đã thành thạo Lisp quan tâm giúp đỡ các bạn mới để cộng đồng Lisp của CadViet ngày càng đông vui và tạo được nhiều chương trình hữu ích.

Để bắt đầu, ssg post lại một bài viết cũ, nhưng có lẽ vẫn còn mới đối với một số bạn. Hy vọng sẽ giúp được chút gì đó cho các bạn mới tiếp cận với Lisp:

 

http://www.cadviet.com/upfiles/Relax_1.zip

 

Download, giải nén rồi đọc file *.doc

Bài viết của bạn "ssg" hay quá , bạn có thể tiếp tục thêm vài bài viết khác để anh em có thể học hỏi được không, chứ đọc sách thì khó hiểu hơn bạn viế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

Không hiểu tại sao trong bản vẽ này không sử dụng các method : explode; getboundingbox đối với Block thuộc tính được.

Block này có tên là coc d600

Khi sử dụng method explode thì CAD lại báo lỗi này :

; error: Automation Error. Invalid input

 

Còn khi sử dụng method getboundingbox thì không thể tìm được các điểm max, min được

 

Tại sao vậy nhỉ? Trong khi các bản vẽ khác lại sử dụng được?

 

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

 

Nguyên nhân tại sao vậy nhỉ???

Tue_NV không biết vì cớ làm sao?

Rất mong nhận được sự giúp đỡ của các bác.

Tue_NV xin 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
Không hiểu tại sao trong bản vẽ này không sử dụng các method : explode; getboundingbox đối với Block thuộc tính được.

Block này có tên là coc d600

Khi sử dụng method explode thì CAD lại báo lỗi này :

; error: Automation Error. Invalid input

 

Còn khi sử dụng method getboundingbox thì không thể tìm được các điểm max, min được

 

Tại sao vậy nhỉ? Trong khi các bản vẽ khác lại sử dụng được?

 

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

 

Nguyên nhân tại sao vậy nhỉ???

Tue_NV không biết vì cớ làm sao?

Rất mong nhận được sự giúp đỡ của các bác.

Tue_NV xin cảm ơn.

Tue_NV sài phiên bản CAD nào ?

Test trên CAD 2008, mọi chuyện bình thườ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

Khi sd lệnh insert với hộp thoại, ta dễ dàng chèn một file cùng tên vào để thay thế block có sẵn trong bản vẽ. Nhưng ở chế độ dòng lệnh, lệnh insert mặc định dùng block có trên bản vẽ mà kg dùng file mặc dù ta đã đánh đầy đủ đường dẫn đến file cần thiết.

Làm thế nào viết một lisp sd lệnh insert (không dùng hộp thoại) để chèn một file vào thay thế một block cùng tên đã có trong bản vẽ. Xin các bạn hướng dẫn. 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
Khi sd lệnh insert với hộp thoại, ta dễ dàng chèn một file cùng tên vào để thay thế block có sẵn trong bản vẽ. Nhưng ở chế độ dòng lệnh, lệnh insert mặc định dùng block có trên bản vẽ mà kg dùng file mặc dù ta đã đánh đầy đủ đường dẫn đến file cần thiết.

Làm thế nào viết một lisp sd lệnh insert (không dùng hộp thoại) để chèn một file vào thay thế một block cùng tên đã có trong bản vẽ. Xin các bạn hướng dẫn. Cám ơn

Chào bác Trungngamy,

Bác xài thử code này xem có đúng ý bác không nhé:

(command "insert" "~")

Chúc bác 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
Chào bác Trungngamy,

Bác xài thử code này xem có đúng ý bác không nhé:

(command "insert" "~")

Chúc bác vui.

Cám ơn bạn. Mình thử rồi, kg đc bạn ạ, khi gặp "~" nó mở hộp thoại.

 

Mình đã tự làm đc rồi. Để thay một file khác thành block đã có. Làm như sau

(command "_.insert" "tenblockcu=tenfilemoi" ^C)

Tenfilemoi có thể khác tenblockcu và phải có trong thư mục hiện hành hoặc trong các đường dẫn cad hoặc đầy đủ đường dẫn

Mình đưa lên để các bạn tham khảo chơi. Có thể sẽ có cách khác

  • 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

- Mình cũng đã tự làm được một số ứng dụng hỗ trợ công việc. Xin góp một tẹo với diễn đàn.

- Sách: mình chỉ dùng 2 tập của tác giả Nguyễn Hữu Lộc Tp.HCM

- Tham khảo: Help, một số Web về từng chủ đề như: Dialog, Menu ....

- Ý tưởng: hầu hết xuất phát từ thực tế mình vấp phải. Ngày nào cũng phải làm mà làm đi làm lại nó cay cú lắm, tại sao không lập cho "máy vi tính" nó chạy.

- Ngoài ra, diễn đàn Cadviet.com đã cung cấp hầu hết các ý tưởng cho mình. Chỉ có điều trên diễn đàn chỉ đủ không gian nêu được vấn đề, hoặc cách xử lý cơ bản. Còn để một ứng dụng "sống" được, mình cần thể hiện một cách quy củ hơn. Đặc biệt khâu trình bày, khâu ktra lỗi, khâu xuất nhập ra file...

- Mình thừa nhận DuyLisp của mình có nhái lại một số ý tưởng (như một số bạn đã "lói"). Nếu bạn chạy bản Full, sẽ thấy nó hơn hẳn về cấp độ so với những lisp nhỏ lẻ được post trên diễn đàn. Mình chỉ nhái lại ý tưởng thôi, còn code gần như ko sử dụng. Mình nghĩ diễn đàn không phải là nơi mình có thể xin đầy đủ 100% tài liệu. Đây là ngôi nhà chung giúp bạn khai thông các bế tắc, để từ đó có kiến thức tối thiểu để đọc sách, để vun đắp cho "đứa con" của mình. Dù gì, bạn phải đặt được cái tôi trong chương trình mình làm ra.

- Mình thấy cách hướng dẫn qua file "Relax" của bác ssg mang ý tưởng rất tổng thể. Cho anh em một cái nhìn tổng quan về Lisp. Cách này có ích cho cả những người đã tập tành lisp như chúng tôi. Mong bác phát huy nhiều hơn nữa.

Dạo này đi công trường nhiều wá, không thăm hỏi được anh em. Cho gửi lời chào đến anh em và ban quản trị 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

Mình có vần đề tìm điểm vuông góc như sau: hỏi chọn điểm thứ nhất a, thứ hai b và thứ ba c. Góc tạo bởi ba và bc lại không phải là 90 dộ mà lệch 1 chút. Cần lấy độ dài từ b đến c và xác định lại điểm c sao cho góc giữa ba và bc là 90 độ. Mình đã viết 1 đoạn gải quyết vấn đề này nhưng ví dụ chia mặt phẳng oxy ra làm 4 phần thì có 1 phần tư hình vẽ sẽ bị lộn ngược nghĩa là điểm c sau khi xác định lại lại mằm đối xứng với điểm c cũ qua trục ba. Bác nào tìm ra nguyên nhân hoặc chỉnh giúp mình đoạn này với. Cám ơn!

 

(DEFUN c:ve4diem ( )

(setq a (getpoint "\nChon diem 1: "))

(setq b (getpoint a"\nChon diem 2: "))

(setq ct (getpoint b"\nChon diem 3: "))

(setq luubatdiem (getvar "osmode"))

(setvar "osmode" 0)

 

(setq daiab (distance a b))

(setq gocab (angle b a))

 

(setq gocbct (angle b ct))

(setq daibct (distance b ct))

 

(setq gocchenhlech (- gocbct gocab))

 

(Cond

((< gocab gocbct)

(setq goclech (+ (- gocbct gocab) (/ pi 2)))

)

((> gocab gocbct)

(setq goclech (- (- gocbct gocab) (/ pi 2)))

)

)

 

(setq goctinhra (- gocbct goclech))

(setq c (polar b goctinhra daibct))

(setq d (polar c gocab daiab))

 

(command "pline" a b c d a "")

 

(setvar "osmode" luubatdiem)

(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
Mình có vần đề tìm điểm vuông góc như sau: hỏi chọn điểm thứ nhất a, thứ hai b và thứ ba c. Góc tạo bởi ba và bc lại không phải là 90 dộ mà lệch 1 chút. Cần lấy độ dài từ b đến c và xác định lại điểm c sao cho góc giữa ba và bc là 90 độ. Mình đã viết 1 đoạn gải quyết vấn đề này nhưng ví dụ chia mặt phẳng oxy ra làm 4 phần thì có 1 phần tư hình vẽ sẽ bị lộn ngược nghĩa là điểm c sau khi xác định lại lại mằm đối xứng với điểm c cũ qua trục ba. Bác nào tìm ra nguyên nhân hoặc chỉnh giúp mình đoạn này với. Cám ơn!

 

(DEFUN c:ve4diem ( )

(setq a (getpoint "\nChon diem 1: "))

(setq b (getpoint a"\nChon diem 2: "))

(setq ct (getpoint b"\nChon diem 3: "))

(setq luubatdiem (getvar "osmode"))

(setvar "osmode" 0)

 

(setq daiab (distance a :cheers:)

(setq gocab (angle b a))

 

(setq gocbct (angle b ct))

(setq daibct (distance b ct))

 

(setq gocchenhlech (- gocbct gocab))

 

(Cond

((< gocab gocbct)

(setq goclech (+ (- gocbct gocab) (/ pi 2)))

)

((> gocab gocbct)

(setq goclech (- (- gocbct gocab) (/ pi 2)))

)

)

 

(setq goctinhra (- gocbct goclech))

(setq c (polar b goctinhra daibct))

(setq d (polar c gocab daiab))

 

(command "pline" a b c d a "")

 

(setvar "osmode" luubatdiem)

(princ)

)

Vấn đề của bạn có thể đuợc hiểu như sau :

Từ điểm B trên đuờng thẳng AB, tìm điểm C sao cho :

- CB vuông góc với BA

- CB có độ dài cho truớc

- C gần với 1 điểm C' cho truớc.

 

sẽ có 2 điểm C1 và C2 thõa điều kiện :

- CB vuông góc với BA

- CB có độ dài cho truớc

C1 và C2 đối xứng nhau qua đ/t AB

 

(setq C1 (polar b (+ gocab (/ pi 2)) daibct))

(setq C2 (polar b (- gocab (/ pi 2)) daibct))

 

So sánh khoảng cách giữa điểm C1 và C2 đến điểm C' cho truớc, tìm đuợc kết quả.

(if (< (distance ct C1) (distance ct C2))

(setq c C1)

(setq c C2))

 

Code của bạn :

(DEFUN c:ve4diem ()
 (setq a (getpoint "\nChon diem 1: "))
 (setq b (getpoint a "\nChon diem 2: "))
 (setq ct (getpoint b "\nChon diem 3: "))
 (setq luubatdiem (getvar "osmode"))
 (setvar "osmode" 0)

 (setq daiab (distance a b ))
 (setq gocab (angle b a))

 (setq gocbct (angle b ct))
 (setq daibct (distance b ct))

 (setq c1 (polar b (+ gocab (/ pi 2)) daibct)
c2 (polar b (- gocab (/ pi 2)) daibct))
 (if (< (distance ct c1) (distance ct c2))
   (setq c c1)
   (setq c c2))

 (setq d (polar c gocab daiab))

 (command "pline" a b c d a "")

 (setvar "osmode" luubatdiem)
 (princ)
)

  • 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
Mình có vần đề tìm điểm vuông góc như sau: hỏi chọn điểm thứ nhất a, thứ hai b và thứ ba c. Góc tạo bởi ba và bc lại không phải là 90 dộ mà lệch 1 chút. Cần lấy độ dài từ b đến c và xác định lại điểm c sao cho góc giữa ba và bc là 90 độ. Mình đã viết 1 đoạn gải quyết vấn đề này nhưng ví dụ chia mặt phẳng oxy ra làm 4 phần thì có 1 phần tư hình vẽ sẽ bị lộn ngược nghĩa là điểm c sau khi xác định lại lại mằm đối xứng với điểm c cũ qua trục ba. Bác nào tìm ra nguyên nhân hoặc chỉnh giúp mình đoạn này với. Cám ơn!

...

Trước đây mình cũng có viết một hàm vẽ HCN với yêu cầu khác của bạn một chút.

Bạn có thể tham khảo để thấy được kết quả trong khi chọn điểm thứ ba.

(defun RectangPts (p1 p2 rp3 rp4 / a )
(setq a (angle p1 p2))
(set rp4 (inters p1 (polar p1 (+ a (/ pi 2)) 100) (eval rp3) (polar (eval rp3) a 100) nil))
(set rp3 (polar (eval rp4) a (distance p1 p2)))
)

(defun C:RotateRectang (/ n p1 p2 p3 p4 a grdat om)
(setq p1 (getpoint "\nPoint 1:") p2 (getpoint p1 "\nPoint 2:") a (angle p1 p2))
(while (/= 3 n)
	(setq grdat (grread t 7 0) n (car grdat) p3 (cadr grdat))
(if (eq 5 n)
		(progn
			(redraw)(RectangPts p1 p2 'p3 'p4 )
			(grvecs (list -7 p1 p2 p2 p3 p3 p4 p4 p1) )
	)	)
)
(setq om (getvar "osmode"))
(setvar "osmode" 0)
(redraw)(RectangPts p1 p2 'p3 'p4 )
(command "PLINE" p1 p2 p3 p4 "c" )
(setvar "osmode" om)
)

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 có một vấn đề cần hỏi: làm sao tắt mở được chế độ "osnap" trong auto lisp để khi chạy lệnh lisp không bị bắt điểm lung tung, 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

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


×