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

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

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

Vì bạn chỉ xử lý code DXF 50 nên Tui đoán bạn muốn quay Text theo góc nhập vào. (bởi vì với các đối tượng khác như ARC, LINE... thì phải sử dụng cách khác )

Hơn nữa trong LISP nói chung : đơn vị góc được tính bằng Radian chứ không phải độ.

do đó bạn cần chuyển đổi từ độ -> radian

(defun deg->rad (f_ang)

(setq f_ang (* pi (/ f_ang 180.0)))

)

 

đây là LISP đã sửa đổi, hy vọng đúng ý bạn.

(defun c:xoay ( / ss i e d )
(if (not rt0) (setq rt0 45))
(setq rt (getint(strcat "\n Gia tri Rotate : <" (itoa rt0) "> :")))
(if (not rt) (setq rt rt0) (setq rt0 rt))
(setq rt1 (* pi (/ rt 180.0)))
(setq ss (ssget  '((0 . "TEXT")))
i 0)
(while
(< i (sslength ss))
(setq
e (ssname ss i)
d (entget e)
d (subst (cons 50 rt1) (assoc 50 d) d)
i (1+ i)
)
(entmod d)
)
(princ)
)

 

Chào bác gia_bach

Lisp bác sửa hoàn toàn đúng ý em, em đã sai lỗi cơ bản thế mà lại không biết.Hihi

 

@Bạn Tue_NV

Đúng như bác gia_bach nói, mình muốn xoay đối tượng là Text và Block trong bản vẽ.

Mình muốn dùng lisp này để xoay tất cả các đối tượng Text và Block mà không thay đổi điểm đặt của các đối tượng đó.

 

Cám ơn bác gia_bach và bạn Tue_NV đã quan tâm nha.

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 gia_bach

Lisp bác sửa hoàn toàn đúng ý em, em đã sai lỗi cơ bản thế mà lại không biết.Hihi

 

@Bạn Tue_NV

Đúng như bác gia_bach nói, mình muốn xoay đối tượng là Text và Block trong bản vẽ.

Mình muốn dùng lisp này để xoay tất cả các đối tượng Text và Block mà không thay đổi điểm đặt của các đối tượng đó.

 

Cám ơn bác gia_bach và bạn Tue_NV đã quan tâm nha.

Chào bạn Tuan_thietkedien,

Bạn lưu ý trong lisp của bác Gia_bach, với một số trường hợp khi góc quay nằm trong khoảng pi/2 đến 3pi/2 , text sẽ bị lộn ngược đấy nhé.

Mặt khác trong lisp đó không đề cập tới các đối tượng là block như bạn nói. Với block thì việc quay block theo góc không có gì trở ngại lắm nhưng với text thì bạn cần lưu ý trường hợp text lộn ngược bạn nhé.

  • 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 bạn Tuan_thietkedien,

Bạn lưu ý trong lisp của bác Gia_bach, với một số trường hợp khi góc quay nằm trong khoảng pi/2 đến 3pi/2 , text sẽ bị lộn ngược đấy nhé.

Mặt khác trong lisp đó không đề cập tới các đối tượng là block như bạn nói. Với block thì việc quay block theo góc không có gì trở ngại lắm nhưng với text thì bạn cần lưu ý trường hợp text lộn ngược bạn nhé.

 

Chào bạn phamthanhbinh

Thông thường mình chỉ xoay Text với góc 30 và 45 độ thôi, và để lisp chọn thêm đối tượng Block mình cũng thêm vào dòng ssget chữ Insert rồi.

 

Cám ơn bạn đã góp ý nha.

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ạn phamthanhbinh

Thông thường mình chỉ xoay Text với góc 30 và 45 độ thôi, và để lisp chọn thêm đối tượng Block mình cũng thêm vào dòng ssget chữ Insert rồi.

 

Cám ơn bạn đã góp ý nha.

Chào bạn TuanThietkedien

Việc xử lý Text không bị lộn ngược trong mọi trường hợp thì bạn có thể xem thêm trong bài viết này :

http://www.cadviet.com/forum/index.php?sho...205&st=1660

  • 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ó cái này muốn hỏi. Khi làm việc với Block và lấy cơ sở dữ liệu của Block Dynamic thì thấy tên Block mã DXF là 2 bị biến đổi đi không còn đúng như tên Block ở Edit block nữa. Chính vì vậy việc Lisp lưu tên Block để sau chọn nhóm Block là ...vô ích.

Ví dụ. Tên block là "ranhgach" nhưng khi lấy mã DXF thì nó ra là (2 . "*U3") . Mọi người có biết quy luật đặt tên của Dynamic Block này khô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
Mình có cái này muốn hỏi. Khi làm việc với Block và lấy cơ sở dữ liệu của Block Dynamic thì thấy tên Block mã DXF là 2 bị biến đổi đi không còn đúng như tên Block ở Edit block nữa. Chính vì vậy việc Lisp lưu tên Block để sau chọn nhóm Block là ...vô ích.

Ví dụ. Tên block là "ranhgach" nhưng khi lấy mã DXF thì nó ra là (2 . "*U3") . Mọi người có biết quy luật đặt tên của Dynamic Block này không ?

Sau một lúc tìm tòi thì phát hiện ra cái này. Tên Dynamic Block không thể lấy được theo cách thông thường mà phải lấy bằng một trong 2 cách sau:

+ Cách 1:

(vl-load-com)
(setq tenblock (vla-get-EffectiveName
			 (vlax-ename->vla-object
			   (car (entsel "\nSelect block: "))
			 )
		   )
)

 

+ Cách 2:

(and
(assoc 360
	   (setq ed
			  (entget
				(ssname
				  (ssget "_:E:S" '((0 . "INSERT")))
				  0
				)
			  )
	   )
) ;_ {setq
(repeat	3
  (setq	ed
		 (entget (cdr (assoc 360 ed)))
  ) ;_ {setq
) ;_ {repeat
(setq ed (entget (cdr (assoc 340 ed))))
 ) ;_ {and
 (setq tenblock (cdr (assoc 2 ed)))

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 thấy trên diễn đàn các bạn hay dùng hàm tìm giao điểm hai đối tượng như thế này : (vla-IntersectWith ob1 ob2 acExtendNone), nhưng chỉ với đối tượng 2D. Còn đối tượng 3D có cao độ bất kỳ thỉ dùng như thế nào, có tìm đc giao điểm không? Có thể tìm đc giao điểm của chúng trên mặt phẳng XY mà không làm thay đổi dữ liệu của chúng đc kg? Bạn nào biết, xin chỉ giúp. 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
Mình thấy trên diễn đàn các bạn hay dùng hàm tìm giao điểm hai đối tượng như thế này : (vla-IntersectWith ob1 ob2 acExtendNone), nhưng chỉ với đối tượng 2D. Còn đối tượng 3D có cao độ bất kỳ thỉ dùng như thế nào, có tìm đc giao điểm không? Có thể tìm đc giao điểm của chúng trên mặt phẳng XY mà không làm thay đổi dữ liệu của chúng đc kg? Bạn nào biết, xin chỉ giúp. Cám ơn

Theo mình thì hàm này vẫn đúng với đối tượng 3D. Còn nếu chỉ tim giao điểm trên mặt phẳng XY thì bạn dùng mẹo thử xem: cho tất cả đối tượng cần lấy giao về 1 mặt phằng (lệnh flaten j đó) rồi lấy giao điểm sau đó lại undo đối tượng lại, chỉ lấy mỗi list giao điểm thôi (dùng Undo mark và Undo back)

  • 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

Cac bạn cho minh hỏi file có dạng *.fas trong autocad có thuộc loại phai lsp không? có cách nào để đọc và chỉnh sủa file đó không? Cách tạo ra file dó nhw thế nào? Rất mong được các bạn chỉ giúp cang nhanh càng tốt. Cảm ơn rấ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

Cho Tú hỏi chút:

-khi viết lisp mình dùng biến nào để khi nhập 2 điểm thì nó xuất hiện 1 nét hỗ trợ vậy.

- VD: (setq PT1 (getpoint "\n chon diêm 1:")

PT2 (getpoint "\n chon diem 2:")

)

Trong cad khi chọn từ điểm 1 đến điểm 2 có 1 nét hỗ trợ. 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
Cho Tú hỏi chút:

-khi viết lisp mình dùng biến nào để khi nhập 2 điểm thì nó xuất hiện 1 nét hỗ trợ vậy.

- VD: (setq PT1 (getpoint "\n chon diêm 1:")

PT2 (getpoint "\n chon diem 2:")

)

Trong cad khi chọn từ điểm 1 đến điểm 2 có 1 nét hỗ trợ. Xin cám ơn

Sửa:

(setq PT1 (getpoint "\n chon diêm 1:")

PT2 (getpoint PT1"\n chon diem 2:")

)

  • 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

Thêm 1 câu nữa nha:

-Hàm nào để nhận được giá trị trong popup_list và chọn ok thì gán cho 1 biến.

VD: có dialog

:popup_list{

list = "\n atama";

}

ok_cancel;

bây giờ mình muốn khi nhấn ok thì chữ atama gán cho 1 biến TH. 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
Thêm 1 câu nữa nha:

-Hàm nào để nhận được giá trị trong popup_list và chọn ok thì gán cho 1 biến.

VD: có dialog

:popup_list{

list = "\n atama";

}

ok_cancel;

bây giờ mình muốn khi nhấn ok thì chữ atama gán cho 1 biến TH. Xin cám ơn

Chào bạn minhtu2004,

Để có thể lấy giá trị của biến từ một hộp thoại DCL nói chung và một popup_list nói riêng bạn cần phải sử dụng hàm lưu biến (saveVars) bạn ạ. Ví dụ:

(defun SaveVars ()

(setq th (get_tile "MyValue"))

)

Trong đó MyValue là tên của cái popup_list mà bạn sẽ lấy giá trị từ đó.

Trong cái ví dụ bạn đưa ra, cú pháp sai lắm đấy bạn ạ. Bạn nên xem lại thất kỹ phần lý thuyết về cách tạo các hộp thoại DCL trước khi nghĩ đến việc sử dụng nó bạn ạ. Đừng vội vàng áp dụng khi chưa thật hiểu kỹ về nó bạn nhé.

Chúc bạn 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
Cac bạn cho minh hỏi file có dạng *.fas trong autocad có thuộc loại phai lsp không? có cách nào để đọc và chỉnh sủa file đó không? Cách tạo ra file dó nhw thế nào? Rất mong được các bạn chỉ giúp cang nhanh càng tốt. Cảm ơn rất nhiều

 

file fas là file lsp đã mã hóa, không đọc đc, chắc mục đích không cho đọc sửa j đc. Cũng có vài ct dịch ngược lại nhưng theo mình đọc cái file dịch ngược đó còn khó hiểu hơn file gốc.

Cách tạo file fas cũng đơn giản:

-mở vlisp bằng lệnh vlide trong acad.

-chọn menu file->make application->new application wizard rồi làm theo hướng dẫ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

-Đây là đọan code mình làm thử bạn xem dùm.

NB : dialog{

label = "Thu";

:popup_list{

label = "Chon";

list = "Atama \nNegarami";

value = 0;

edit_width = 30;

key = "btn";

}

ok_cancel;

}

Đây là đọan lisp:

(defun SaveVars()

(setq LE(get_tile "btn"))

)

(defun c:tu()

(setq dcl_id (load_dialog "tmp.dcl"))

(new_dialog "NB" dcl_id)

(start_dialog)

(unload_dialog dcl_id)

(setq PT1(getpoint "\n Chon diem thu 1:")

PT2(getpoint PT1"\n Chon diem thu 2:")

)

(command "leader" PT1 PT2 "A" LE "")

(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
-Đây là đọan code mình làm thử bạn xem dùm.

NB : dialog{

label = "Thu";

:popup_list{

label = "Chon";

list = "Atama \nNegarami";

value = 0;

edit_width = 30;

key = "btn";

}

ok_cancel;

}

Đây là đọan lisp:

(defun SaveVars()

(setq LE(get_tile "btn"))

)

(defun c:tu()

(setq dcl_id (load_dialog "tmp.dcl"))

(new_dialog "NB" dcl_id)

(start_dialog)

(unload_dialog dcl_id)

(setq PT1(getpoint "\n Chon diem thu 1:")

PT2(getpoint PT1"\n Chon diem thu 2:")

)

(command "leader" PT1 PT2 "A" LE "")

(princ)

)

Chào bạn Minhtu2004,

Đọc đoạn code của bạn thấy khái niệm của bạn về việc sử dụng các hộp thoại trong lập trình autolisp còn mỏng quá bạn ạ. Bạn không thể tạo cái popup_list ở trong file DCL được. File DCL chỉ giúp bạn định dạng hộp thoại tức là hiển thị ra màn hình dạng hộp thoại mà bạn muốn sử dụng. Còn nội dung của các tile trong hộp thoại phải được bạn làm trong file lsp chớ. Sửa lại đoạn code của bạn không phải quá khó nhưng bạn sẽ không hiểu được vấn đề. Vì vậy mình đề nghị bạn hãy tìm hiểu kỹ hơn về vấn đề sử dụng hộp thoại, các cấu trúc cú pháp cơ bản trong file DCL, cách nhập dữ liệu cho các tile của hộp thoại,.......

Bạn có thể tham khảo việc lấy dữ liệu từ hộp thoại với popup_list qua ví dụ cụ thể ở đây: http://www.cadviet.com/upfiles/Hopthoaivoipopuplist.doc

Sau khi bạn đọc kỹ ví dụ này, hãy thử áp dụng vào yêu cầu của bạn, có chỗ nào chưa được bạn hãy post lên, chúng ta cùng giải quyết.

Đây chỉ là một ví dụ đơn gỉan, để hiểu rõ hơn về vấn đề này bạn nên tìm hiểu thêm các tài liệu khác nữa nhé.

Chúc bạn thành cô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

có đồng chí nào cho hỏi với :

trên layer 1, có duy nhất 1 Mtext, làm sao có thể chọn Mtext đó một cách tự động và lọc ra nội dung của text đó??

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ó đồng chí nào cho hỏi với :

trên layer 1, có duy nhất 1 Mtext, làm sao có thể chọn Mtext đó một cách tự động và lọc ra nội dung của text đó??

cám ơn nhiều

ôi, làm được rồi, vui quá

LISP muôn năm :(

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ó đồng chí nào cho hỏi với :

trên layer 1, có duy nhất 1 Mtext, làm sao có thể chọn Mtext đó một cách tự động và lọc ra nội dung của text đó??

cám ơn nhiều

Đây bạn : (cdr(assoc 1 (entget(ssname (ssget "x" '((0 . "MTEXT") (8 . "Layer1"))) 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
Đây bạn : (cdr(assoc 1 (entget(ssname (ssget "x" '((0 . "MTEXT") (8 . "Layer1"))) 0))))

ôi, sao hàm của bạn mình nhập kg đưọc,

của mình như thế này thì được :

(cdr (assoc 1 (entget (ssname (ssget "x" (list (cons 0 "mtext") (cons 8 "b-data"))) 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
có đồng chí nào cho hỏi với :

trên layer 1, có duy nhất 1 Mtext, làm sao có thể chọn Mtext đó một cách tự động và lọc ra nội dung của text đó??

cám ơn nhiều

Lúc đầu bạn nói là trên layer 1, có duy nhất 1 Mtext thì mình viết là layer1

Còn Layer của bạn muốn tìm là b-data thì phải sửa lại là :

(cdr(assoc 1 (entget(ssname (ssget "x" '((0 . "MTEXT") (8 . "b-data"))) 0))))

mới đúng phải không bạ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
Lúc đầu bạn nói là trên layer 1, có duy nhất 1 Mtext thì mình viết là layer1

Còn Layer của bạn muốn tìm là b-data thì phải sửa lại là :

(cdr(assoc 1 (entget(ssname (ssget "x" '((0 . "MTEXT") (8 . "b-data"))) 0))))

mới đúng phải không bạn?

ồ xin lỗi về chỗ tên layer, vần đề là có thêm hàm (cons 0 "mtext") cái này không giống cái bạn = (0 . "MTEXT")

mình kg hiểu lắm

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

×