Jump to content
Invision Community
Sign in to follow this  
trinhhoanghieu090

{Xin giup do] Viet autolisp nhu File Cad

Recommended Posts

Trước tiên mời các pro xem file cad của em trước rồi em sẽ trình bày, đây là file cad của em.

http://www.cadviet.com/upfiles/3/133631_ve__luoi_o_vuong.dwg

 

 Mong các pro viết cho em một Lisp thay thế cho các công đoạn thủ công em phải vẽ như sau:

 

Trường hợp một:

 

B1: Đầu tiên là vẽ một hình chữ nhật với chiều chiều theo trục x và chiều theo trục y được nhập vào trên dòng lệnh, sau đó pick tâm  hình chữ nhật này (giao điểm của 2 đường chéo) vào một điểm có sẵn trên cad.

B2: Array 2 cạnh của hình AB, AD lần lượt với khoảng cách theo trục X là a và khoảng cách theo trục y là b ( Nếu các pro mà viết được cho em cái lisp mà phải tính array theo bao nhiêu cột và bao nhiêu hàng thì hay quá)

 

Trường hợp hai:

 

B1: Đầu tiên là vẽ một hình chữ nhật với 2 đỉnh được pick  điểm có sẵn trên cad.

B2: Hoàn toàn giống như trên

Vì đây chỉ là một công đoạn rất nhỏ trong một quá trình vẽ bằng cad của em. Các pro bỏ chút thời gian làm cho em cái lisp nhé.

Share this post


Link to post
Share on other sites
Tot77    501

Bạn thử cái này.

 

(defun ve(pt / p1 p2 p3 p4 n)
  (entmake (list (cons 0  "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline")
  (cons 90 4) (cons 70 1) (cons 62 1)
  (cons 10 (setq p1 (polar (polar pt pi (* 0.5 ng)) -1.5708 (* 0.5 du))))
  (cons 10 (setq p2 (polar p1 0 ng)))
  (cons 10 (setq p3 (polar p2 1.5708 du)))
  (cons 10 (setq p4 (polar p3 pi ng)))))
  (setq n 0)
  (repeat (1- song)
    (entmake (list (cons 0 "LINE") (cons 62 3)
  (cons 10 (polar p4 0 (* (setq n (1+ n)) d1)))
  (cons 11 (polar p1 0 (* n d1)))))
  )
  (setq n 0)
  (repeat (1- sodu)
    (entmake (list (cons 0 "LINE") (cons 62 3)
  (cons 10 (polar p1 1.5708 (* (setq n (1+ n)) d2)))
  (cons 11 (polar p2 1.5708 (* n d2)))))
  ) 
)
 
(defun c:vov1(/ ng du song sodu pt d1 d2)
  (setq ng (getreal "\nNgang: ")
du (getreal "\nDung: ")
song (getint "\nSo o ngang: ")
sodu (getint "\nSo o dung: ")
pt (getpoint "\nDiem: ")
d1 (/ ng song 1.0)
d2 (/ du sodu 1.0)
  ) (ve pt)
) 
 
(defun c:vov2(/ pt pt1 pt2 ng du song sodu d1 d2)
  (setq pt1 (getpoint "\nDiem1: ")
pt2 (getpoint "\nDiem2: ")
pt (polar pt1 (angle pt1 pt2) (* 0.5 (distance pt1 pt2)))
ng (abs (- (car pt2) (car pt1)))
du (abs (- (cadr pt2) (cadr pt1)))
song (getint "\nSo o ngang: ")
sodu (getint "\nSo o dung: ")
d1 (/ ng song 1.0)
d2 (/ du sodu 1.0)
  ) (ve pt)
) 

Share this post


Link to post
Share on other sites

Thanks Pro   Tot77 nhiều nhé.Em có thể nhờ thêm Pro chút nữa được không. Trong dòng lệnh thay vì nhập " Số ô ngang" và "Số ô đứng" mình "nhập lại là khoảng cách giữa các Line" không". Ví Dụ chiều dài  ngang =1000 ta chọn 10 ô thì khoảng cách mỗi ô là 10m, giờ ta nhập luôn là 10m vào ấy. Và các đường vẽ ra là polyline màu trắng nhé (vì mình dùng kết hợp với lisp khác nữa). Thanks bạn nhiều.

Share this post


Link to post
Share on other sites

Vậy nếu không chia hết thì ô cuối kích thước sẽ khác pk?

 

Đúng rồi Pro ạ. Khi đó kích thước ô bên phải ngoài cùng theo chiều ngang à ô phía trên cùng theo chiều đứng sẽ khác. Pro làm giúp em một phần nữa là sau khi vẽ xong tất cả thì xoá cái hình chữ nhật ban đầu đi. Sorry Pro nhé tại phần yêu cầu  thiếu đúng một chữ quan trọng nhất: " Nếu các pro mà viết được cho em cái lisp mà Không phải tính array theo bao nhiêu cột và bao nhiêu hàng thì hay quá)". :D

Share this post


Link to post
Share on other sites
Tot77    501

Sao bạn nói để cái pline màu trắng cho lệnh sau rồi giờ lại nói xoá đi?

Nếu xoá thì đâu cần vẽ cái đó làm gì. Nói chung khi yêu cầu thì bạn nên cụ thể và nhất quán 1 chút,

chứ ai cũng ngại viết đi sửa lại.

Share this post


Link to post
Share on other sites

Hi, có chút hiểu nhầm ở đây anh ạ. Ý em là tất cả các lỉne mình vẽ ra để màu trắng ấy. Còn cái vụ xoá hình vuông thì thôi để em tự xử cũng được. Pro giúp em nốt tí nhé. Thanks pro

Share this post


Link to post
Share on other sites
Tot77    501

Vậy thì đây.

 

(defun ve(pt / p1 p2 p3 p4 n)
 (setq p1 (polar (polar pt pi (* 0.5 ng)) -1.5708 (* 0.5 du))
       p2 (polar p1 0 ng)
       p3 (polar p2 1.5708 du)
       p4 (polar p3 pi ng)
       n 0
  )
  (repeat (if (= 0 (rem ng song)) (1- (fix (/ ng song))) (fix (/ ng song)))
    (entmake (list (cons 0 "LINE") (cons 62 7)
  (cons 10 (polar p4 0 (* (setq n (1+ n)) song)))
  (cons 11 (polar p1 0 (* n song)))))
  )
  (setq n 0)
  (repeat (if (= 0 (rem du sodu)) (1- (fix (/ du sodu))) (fix (/ du sodu)))
    (entmake (list (cons 0 "LINE") (cons 62 7)
  (cons 10 (polar p1 1.5708 (* (setq n (1+ n)) sodu)))
  (cons 11 (polar p2 1.5708 (* n sodu)))))
  )
  (princ)
)
 
(defun c:vov1(/ ng du song sodu pt)
  (setq ng (getreal "\nNgang: ")
du (getreal "\nDung: ")
song (getint "\nKT ngang o: ")
sodu (getint "\nKT dung o: ")
pt (getpoint "\nDiem: ")
  ) (ve pt)
) 
 
(defun c:vov2(/ pt pt1 pt2 ng du song sodu)
  (setq pt1 (getpoint "\nDiem1: ")
pt2 (getpoint "\nDiem2: ")
pt (polar pt1 (angle pt1 pt2) (* 0.5 (distance pt1 pt2)))
ng (abs (- (car pt2) (car pt1)))
du (abs (- (cadr pt2) (cadr pt1)))
song (getint "\nKT ngang o: ")
sodu (getint "\nKT dung o: ")
  ) (ve pt)
)
 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×