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

Giao diện hộp thoại trong AutoLisp

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

Mời mọi người thảo luận!

:unsure: :unsure: :) :unsure:

Mấy hôm nay www.cadviet.com bị làm sao thế a Hoành, em đăng ký thành viên,cung bị mất lun,bài viết của e cũng bị mất lun.

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ời mọi người thảo luận!

:bigsmile: :) :) :)

 

 

Cái này cực hay mà lâu quá sao không thấy ai hết. Xin phép bác Hòanh lên tiếng trước nhé

 

Đây là file layer.DCL

LAYER:dialog {	
label="www.cadviet.Dialog000";
spacer_1;
:boxed_radio_column{
	label="Cai dat Layer";
	:radio_button{
		label="Su dung Layer hien huu";
		key="IsCuLA";			
		}
	:radio_button{
		label="Cai dat Layer";
		key="IsSetLA";
		}
	:popup_list{
		key="La";
		}
	}
ok_cancel;
}

 

Còn đâ là file LISP

(DEFUN DIALOG000 ()
 (setq DCL_ID_DIALOG (load_dialog "layer.DCL"))
 (if (not(new_dialog "LAYER" DCL_ID_DIALOG)) (exit))  
 (action_tile "IsCuLA" "(Is_Chk)")
 (action_tile "IsSetLA" "(Is_Chk)")  
 (mode_tile "La" (atoi IsCuLa))

 (action_tile "accept" "(GETOPTVALUE) (done_dialog 1)")
 (action_tile "cancel" "(GETOPTVALUE) (done_dialog 2)")
 (start_list "La")  
 (mapcar 'add_list LiLa)
 (end_list)
 (SETOPTVALUE)
 (setq RES(start_dialog))
 (if (= 1 RES)
(DOSOMETHING)
(DONOTHING)
 )
 (unload_dialog DCL_ID_DIALOG) 
)

(DEFUN DOSOMETHING(/ msg)  
 (if (= IsSetLa "1")
(setq la la_temp)
 )
 (setq msg (strcat "Ban dang lam viec tren layer " (nth (atoi la) LiLa)))
 (alert msg)
)

(DEFUN DONOTHING()
 (alert "Khong lam gi ca!")
)

(DEFUN INIT()
 (CREALILA)
 (if (Null IsCuLa)
(setq IsCuLa "1")
 )  
 (if (Null IsSetLa)
(setq IsSetLa "0")
 )
 (if (Null la)
(setq la "0")
 )
)

(DEFUN Is_Chk ()
 (if (= (get_tile "IsSetLA") "1")
(mode_tile "La" 0)
(mode_tile "La" 1)
 )
)


(DEFUN SETOPTVALUE()  
 (set_tile  "IsCuLA" IsCuLa)  
 (set_tile "IsSetLA" IsSetLa)	
 (set_tile "La" la)
)

(DEFUN GETOPTVALUE()
 (setq IsCuLa (get_tile "IsCuLA"))
 (setq IsSetLa (get_tile "IsSetLA"))  
 (setq la_temp (get_tile "La"))
)

(DEFUN CREALILA (/ NL)
 (setq LiLa (List))
 (setq NL (tblnext "LAYER" T))  
 (while NL	
(setq LiLa (append LiLa (list (cdr (assoc 2 NL)))))
(setq NL (tblnext "LAYER"))
 )
 (setq LiLa (Acad_strlsort LiLa))
)

(DEFUN EXCUTE()
 (INIT)
 (DIALOG000)
)

(DEFUN C:DCL()
 (EXCUTE)
)

 

Các bạn lấy về chạy với lệnh DCL, đọan code này có chức năng lấy layer hiện hữu

 

Cách viết của tôi có vẽ hơi dài dòng, tôi cố gắng chia ra thật nhỏ function code để hi vọng các bạn dễ hiểu.

Các câu hỏi các bạn cứ POST lên và tôi sẽ cố gắng trả lờ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

Có lẽ cái này khó quá hay dễ quá mà sao ít người quan tâm bác Hòanh ah.

Thôi kệ, không sao. Tôi sẽ giải thích rõ ràng về cách sử dụng và thể hiện một dialog như thế nào để trông có vẻ pro một chút.

 

Trong định nghĩa về dialog tôi dùng hai radio_button và một pop_list

:radio_button{
		label="Su dung Layer hien huu";
		key="IsCuLA";			
		}
	:radio_button{
		label="Cai dat Layer";
		key="IsSetLA";
		}
	:popup_list{
		key="La";
		}

 

Việc sử dụng radio_button cho phép bạn lựa chọn một trong số nhiều option (bao giờ cũng chỉ một trong số nhiều, hi vọng sẽ có cơ hội nói về việc lựa chọn bằng toggle: lựa chọn nhiều option )

 

Còn sử dụng popup_list là dùng để hiện thị layer name trong bản vẽ hiện hành

popup_list này được gắn với một list Layername liLa (List LiLa tạo bởi DEFUN CREALILA (/ NL))

(start_list "La")  
 (mapcar 'add_list LiLa)
 (end_list)

 

Việc vẽ ra một dialog thì không khó, vấn đề là thao tác trên giao diện ấy như thế nào:

Đối với giao diện ở đây, cho phép người dùng có hai sự lựa chọn, chọn layer để thao tác hay dùng layer hiện hữu. Để nhìn pro một chút tôi disable list Layer khi người dùng chọn "Su dung Layer hien huu" và enable list layer khi người dùng chọn "Cai dat Layer"

(action_tile "IsCuLA" "(Is_Chk)")
 (action_tile "IsSetLA" "(Is_Chk)")  
 (mode_tile "La" (atoi IsCuLa))

 

Sau khi đã lựa chọn người dùng nhấn nút OK, chương trình sẽ thực hiện action được gọi với các option được lựa chọn, ở đây tôi dùng một DEFUN GETOPTVALUE() để lưu lại các option và một DEFUN SETOPTVALUE() để trả về các option

 

(action_tile "accept" "(GETOPTVALUE) (done_dialog 1)")
 (action_tile "cancel" "(GETOPTVALUE) (done_dialog 2)")

....

 (setq RES(start_dialog))
 (if (= 1 RES)
(DOSOMETHING)
(DONOTHING)
 )

 

 

Các DEFUN DOSOMETHING và DEFUN DOTHING sẽ là các action khi người dùng nhấn nút OK

 

...

Hi vọng với một vài dòng trên sẽ có ích được các bạn trong việc xây dựng ứng dụng cho mình...

 

Trong cách tổ chức chương trình tôi tách ra những DEFUN thật nhỏ, để cho việc sữa chữa hay nâng cấp chương trình dễ dàng hơn

.... và nhìn cũng có vẻ pro hơn, các bạn nhỉ!

Heheheheheheheh

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

Giúp mình với. Mình đang tạo một popup_list nhưng mình đang vướng ở chỗ.

 

Mình có 12 list (value được đánh số tử 0 -11) nhưng trong dòng lệnh của Lisp mình không biết lệnh nào để lấy giá trị của value này

 

Mình muốn lấy giá trị của value : vidu 1 --> bạn đã chọn list1

 

 

Gấp gấp, cần gấ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
Giúp mình với. Mình đang tạo một popup_list nhưng mình đang vướng ở chỗ.

 

Mình có 12 list (value được đánh số tử 0 -11) nhưng trong dòng lệnh của Lisp mình không biết lệnh nào để lấy giá trị của value này

 

Mình muốn lấy giá trị của value : vidu 1 --> bạn đã chọn list1

Gấp gấp, cần gấp

 

bạn có 2 cách:

1. Dùng hàm (get_tile "listkey") để lấy giá trị index của phần tử được chọn. VD, phần tử đầu tiên sẽ có giá trị "0".

2. Bạn dùng (set_action "listkey" "(setq listindex $value)") từ lúc khởi tạo hộp thoại. Và biến listindex sẽ luôn mang giá trị index của danh sách.

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
Giúp mình với. Mình đang tạo một popup_list nhưng mình đang vướng ở chỗ.

 

Mình có 12 list (value được đánh số tử 0 -11) nhưng trong dòng lệnh của Lisp mình không biết lệnh nào để lấy giá trị của value này

 

Mình muốn lấy giá trị của value : vidu 1 --> bạn đã chọn list1

Gấp gấp, cần gấp

========Tao danh sach ====================

(setq dsfont (fontlist))

(start_list "pop_fontTIEUDE")

(mapcar '(lambda (x) (add_list x)) dsfont)

(end_list)

(setq nn (length dsfont))

(setq n 0)

(while (and (< n nn) (/= (nth n dsfont) fontTIEUDE))

(setq n (1+ n))

)

 

========gán giá trị của biến fontTEUDE cho gtrị hiện tại của danh sách và ứng xử cho action_tile==================

(set_tile "pop_fontTIEUDE" (itoa n))

(action_tile "pop_fontTIEUDE" "(set_tile \"pop_fontTIEUDE\" (get_tile \"pop_fontTIEUDE\"))

(if (= $reason 1) (progn (mode_tile \"edit_txthigh1\" 2) (mode_tile \"edit_txthigh1\" 3)))")

 

========Gán gia trị hiện tại của danh sách cho biến fontTIEUDE của chương trình================================

(setq fontTIEUDE (nth (atoi (get_tile "pop_fontTIEUDE")) dsfont))

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
Nói chung là không hiểu lắm. Bác coi lại cho em 2 file này nhé :

http://www.cadviet.com/upfiles/list.dcl

http://www.cadviet.com/upfiles/list_1.lsp

 

Xem sai chỗ nèo giúp hộ cái các bác.

Bác viết lỗi nhiều lắm, kể ra thì nhiều lắm.

Kg biết Bác muốn "action" kiểu gì nên đưa ra 2 trường hợp cho bác

1 - Tile có tên "list1" sẽ nhận giá trị khi bấm "nhập số liệu"

2 - Tile có tên "list1" sẽ nhận giá trị khi select popup_list "lst_1"

 

file list_1.lsp của Bác đây

(defun c:lb1 ()

(setq DCL_ID (load_dialog "list.dcl"))

(if (not (new_dialog "list" DCL_ID )) (exit))

 

(action_tile "lst_1" "(setq lst_1 (get_tile \"lst_1\")) ")

(action_tile "nsl" "(cond ((= lst_1 \"0\") (set_tile \"list1\" \"10\" ))

((= lst_1 \"1\") (set_tile \"list1\" \"20\" ))

)

")

(action_tile "thoat" "(done_dialog)")

(start_dialog)

(unload_dialog DCL_ID)

(princ)

)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun c:lb2 ()

(setq DCL_ID (load_dialog "list.dcl"))

(if (not (new_dialog "list" DCL_ID )) (exit))

 

(setq lst_1 (get_tile "lst_1"))

(cond ((= lst_1 "0") (set_tile "list1" "10" ))

((= lst_1 "1") (set_tile "list1" "20" ))

)

 

(action_tile "lst_1" "(setq lst_1 (get_tile \"lst_1\"))

(cond ((= lst_1 \"0\") (set_tile \"list1\" \"10\" ))

((= lst_1 \"1\") (set_tile \"list1\" \"20\" ))

)

")

 

(action_tile "thoat" "(done_dialog)")

(start_dialog)

(unload_dialog DCL_ID)

(princ)

 

Và đây là file list.dcl

list : dialog {

label = "List box : " ;

:row {

:popup_list {

label = "Lua chon" ;

width = 20;

list = "list0 \nlist1 ";

key = "lst_1";

}

: column {

label = "Bang thong bao" ;

:edit_box {

edit_width = 10;

label = "Da chon " ;

key = "list1" ;

}

 

}}

errtile;

:row {

:button{

label="Nhan so lieu";

key ="nsl";

// action = "(set_tile \"list1\" \"10\")";

width = 10;

}

:button{

label="Thoat";

key="thoat";

width = 10;

}

}

is_cancel=true;

}

------------------------------------------------------------------

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
Bác viết lỗi nhiều lắm, kể ra thì nhiều lắm.

Kg biết Bác muốn "action" kiểu gì nên đưa ra 2 trường hợp cho bác

1 - Tile có tên "list1" sẽ nhận giá trị khi bấm "nhập số liệu"

2 - Tile có tên "list1" sẽ nhận giá trị khi select popup_list "lst_1"

 

file list_1.lsp của Bác đây

(defun c:lb1 ()

(setq DCL_ID (load_dialog "list.dcl"))

(if (not (new_dialog "list" DCL_ID )) (exit))

 

(action_tile "lst_1" "(setq lst_1 (get_tile \"lst_1\")) ")

(action_tile "nsl" "(cond ((= lst_1 \"0\") (set_tile \"list1\" \"10\" ))

((= lst_1 \"1\") (set_tile \"list1\" \"20\" ))

)

")

(action_tile "thoat" "(done_dialog)")

(start_dialog)

(unload_dialog DCL_ID)

(princ)

)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun c:lb2 ()

(setq DCL_ID (load_dialog "list.dcl"))

(if (not (new_dialog "list" DCL_ID )) (exit))

 

(setq lst_1 (get_tile "lst_1"))

(cond ((= lst_1 "0") (set_tile "list1" "10" ))

((= lst_1 "1") (set_tile "list1" "20" ))

)

 

(action_tile "lst_1" "(setq lst_1 (get_tile \"lst_1\"))

(cond ((= lst_1 \"0\") (set_tile \"list1\" \"10\" ))

((= lst_1 \"1\") (set_tile \"list1\" \"20\" ))

)

")

 

(action_tile "thoat" "(done_dialog)")

(start_dialog)

(unload_dialog DCL_ID)

(princ)

 

Và đây là file list.dcl

list : dialog {

label = "List box : " ;

:row {

:popup_list {

label = "Lua chon" ;

width = 20;

list = "list0 \nlist1 ";

key = "lst_1";

}

: column {

label = "Bang thong bao" ;

:edit_box {

edit_width = 10;

label = "Da chon " ;

key = "list1" ;

}

 

}}

errtile;

:row {

:button{

label="Nhan so lieu";

key ="nsl";

// action = "(set_tile \"list1\" \"10\")";

width = 10;

}

:button{

label="Thoat";

key="thoat";

width = 10;

}

}

is_cancel=true;

}

------------------------------------------------------------------

 

 

Anh có thể viết cho e 1 file lisp, 1file dcl, trong file dcl có 1 list_box lấy nội dung từ 1file TXT nào đó, mục đích của e là tạo ra 1 hộp thoại hướng dẫn ngưòi dùng (chứa trong file txt) về 1 cái gì đó thôi!!

Giúp e nhé Bro

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 có thể viết cho e 1 file lisp, 1file dcl, trong file dcl có 1 list_box lấy nội dung từ 1file TXT nào đó, mục đích của e là tạo ra 1 hộp thoại hướng dẫn ngưòi dùng (chứa trong file txt) về 1 cái gì đó thôi!!

Giúp e nhé Bro

 

Kiểu này chuối lắm dùng file *.chm hoặc *.hlp hay hơn nhiều

code đây không biết có đúng ý bạn không?

Thuty.dcl:

(defun read-txt (filename / open_f line_r list-out file_read)
(setq list-out nil)
(if (/= (findfile filename) nil)
 (progn  
 (setq file_read (open filename "r"))
 (while
 (/= nil
 (setq line_r (read-line file_read))
  )
 (setq list-out (append list-out (list line_r)))
  )
 (close file_read)
)
(princ)  
)
list-out
)
;;;;;;;;;;;;;;;
;==== Load and check dialog ===========
; dia_name : string
(defun loadcl ( dia_name)
 (if (= -1 (setq dcl_id (load_dialog (strcat dia_name ".dcl"))))
(progn
  (alert (strcat dia_name ".dcl" "not found")
  (setq dialogloaded nil)
)		 
);p
(setq dialogloaded 1)
);f
);defun
;;;;;;;;;;;=========================
(defun c:show (/ fname  l1  dcl_id dialogloaded)
 (setq fname (getfiled "chon file"  "c:\\"  "*" 16)); lựa chọn file
;(setq fname "c:\\abc\\abc.txt"); hoặc chỉ định file
 (if (and
(/= fname nil)
(> (loadcl "thuty") 0); load and check dialog 
  ) 
  (if (not (new_dialog "thuty" dcl_id))
 (exit); Error
 (progn;else
		(start_list "doctxt")	 
		(mapcar' add_list (read-txt fname))  
		(end_list)
		(start_dialog)						 
		(done_dialog)
	(unload_dialog dcl_id)
);p

  );if1 
  );if
 (princ)
);defun

Have fun

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ác có thể cho em 1 lisp ví dụ về dialog được không ah . Khi đánh lệnh ABC.. gì đó thì sẽ hiện lên bảng dialog . 1 bên là có 3 dòng với nội dung "hình tròn" "hình vuông" "tam giác" , bên kia là slide của 3 hình đó . Khi mình click vào hình slide hay dòng chữ thì sẽ thực thi ngay lệnh chứ không cần phải nhấp ok . Tất nhiên sau khi click sẽ có giai đoạn nhập R đường tròn , cạnh hình vuông hoặc kích thước tam giác .

Lisp này để em học hỏi , chứ nhiều lisp trên máy quá phức tạp và rất dài , em còn học nhiều nên chưa hiểu hết .

Em 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
Kiểu này chuối lắm dùng file *.chm hoặc *.hlp hay hơn nhiều

code đây không biết có đúng ý bạn không?

Thuty.dcl:

(defun read-txt (filename / open_f line_r list-out file_read)
(setq list-out nil)
(if (/= (findfile filename) nil)
 (progn  
 (setq file_read (open filename "r"))
 (while
 (/= nil
 (setq line_r (read-line file_read))
  )
 (setq list-out (append list-out (list line_r)))
  )
 (close file_read)
)
(princ)  
)
list-out
)
;;;;;;;;;;;;;;;
;==== Load and check dialog ===========
; dia_name : string
(defun loadcl ( dia_name)
 (if (= -1 (setq dcl_id (load_dialog (strcat dia_name ".dcl"))))
(progn
  (alert (strcat dia_name ".dcl" "not found")
  (setq dialogloaded nil)
)		 
);p
(setq dialogloaded 1)
);f
);defun
;;;;;;;;;;;=========================
(defun c:show (/ fname  l1  dcl_id dialogloaded)
 (setq fname (getfiled "chon file"  "c:\\"  "*" 16)); lựa chọn file
;(setq fname "c:\\abc\\abc.txt"); hoặc chỉ định file
 (if (and
(/= fname nil)
(> (loadcl "thuty") 0); load and check dialog 
  ) 
  (if (not (new_dialog "thuty" dcl_id))
 (exit); Error
 (progn;else
		(start_list "doctxt")	 
		(mapcar' add_list (read-txt fname))  
		(end_list)
		(start_dialog)						 
		(done_dialog)
	(unload_dialog dcl_id)
);p

  );if1 
  );if
 (princ)
);defun

Have fun

 

Thanks Pro đã viết cho e nhưng ko đúng với ý e lắm! Anh viết lại hộ e như thế này đc ko:

Sau khi gõ lệnh, sẽ hiện ra hôp thoại "Doc file txt" luôn, không phải chọn đường dẫn nữa, mà em thắc mác cái "dùng file *.chm hoặc *.hlp hay hơn nhiều" của bác nó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
Thanks Pro đã viết cho e nhưng ko đúng với ý e lắm! Anh viết lại hộ e như thế này đc ko:

Sau khi gõ lệnh, sẽ hiện ra hôp thoại "Doc file txt" luôn, không phải chọn đường dẫn nữa, mà em thắc mác cái "dùng file *.chm hoặc *.hlp hay hơn nhiều" của bác nói?

Àh, em hiểu rồi, chỉ cần bỏ doạn code về chọn file là đc, để ở chế độ chỉ định file, mà cái dùng file *.chm hoặc *.hlp hay hơn nhiều" của bác nói giải thích cho e ty 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
Thanks Pro đã viết cho e nhưng ko đúng với ý e lắm! Anh viết lại hộ e như thế này đc ko:

Sau khi gõ lệnh, sẽ hiện ra hôp thoại "Doc file txt" luôn, không phải chọn đường dẫn nữa, mà em thắc mác cái "dùng file *.chm hoặc *.hlp hay hơn nhiều" của bác nói?

bạn sửa dòng lệnh (setq fname (getfiled "chon file" "c:\\" "*" 16)) thành (setq fname "tenfilebancan.txt") là đượ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
bạn sửa dòng lệnh (setq fname (getfiled "chon file" "c:\\" "*" 16)) thành (setq fname "tenfilebancan.txt") là được.

Anh có biết cách tạo TAB trong file DCL 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à em thắc mác cái "dùng file *.chm hoặc *.hlp hay hơn nhiều" của bác nói?

Bạn unzip file này, copy vào thư mục gốc của acad:

 

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

 

Sau đó gõ biểu thức lisp sau tại dòng nhắc Command sẽ thấy cái "hay hơn nhiều" nói trên:

 

(help "mcvhelp.chm")

 

Muốn biết cách tạo *chm hoặc *.hlp, bạn tìm hiểu trình "Microsoft HTML Help Image Editor" hoặc nhiều trình khác có chức năng tương tự. Cái này khá phổ biến, bạn tìm đâu cũng có.

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ác có thể cho em 1 lisp ví dụ về dialog được không ah . Khi đánh lệnh ABC.. gì đó thì sẽ hiện lên bảng dialog . 1 bên là có 3 dòng với nội dung "hình tròn" "hình vuông" "tam giác" , bên kia là slide của 3 hình đó . Khi mình click vào hình slide hay dòng chữ thì sẽ thực thi ngay lệnh chứ không cần phải nhấp ok . Tất nhiên sau khi click sẽ có giai đoạn nhập R đường tròn , cạnh hình vuông hoặc kích thước tam giác .

Lisp này để em học hỏi , chứ nhiều lisp trên máy quá phức tạp và rất dài , em còn học nhiều nên chưa hiểu hết .

Em cảm ơn rất nhiều .

Bạn đọc code của Mechanical CadViet sẽ thấy có đủ cái bạn cần. Nếu còn vướng mắc, mình sẽ làm một ví dụ đơn giản để bạn dễ hiểu hơn. Thư thả nhé, hiện giờ mình đang bận, chỉ có thể có vài gợi ý để bạn tự tìm hiểu trước:

- Các File *.sld, *.slb và các lệnh Acad liên quan đến chúng. Nếu bạn có thể tự tạo được một file *.slb theo ý thích thì xem như bạn đã hiểu phần này.

- Đối tượng Image và Image_button trong dialog.

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 chỉ mới biết tạo file *.sld thôi , chưa tạo được *.slb . Mình đã làm theo như file help nhưng máy cứ báo là nó không hiểu lệnh slidelib .

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 chỉ mới biết tạo file *.sld thôi , chưa tạo được *.slb . Mình đã làm theo như file help nhưng máy cứ báo là nó không hiểu lệnh slidelib .

Bạn chưa đọc kỹ Help đó thôi:

The following operating system command line syntax constructs a slide library:

slidelib library [ < slidelist ]

Đó là lệnh nhập cho hệ điều hành chứ không phải cho Acad. Trong môi trường Acad, bạn có thể gọi lệnh của hệ điều hành thông qua: (command "shell")

 

Bạn tham khảo 2 lisp sau mình vẫn thường dùng để tạo *.sld và *.slb:

;;;--------------------------------------------------------------------------------------
(defun C:SLD();;;Make *.sld file
(command "mslide" (getstring "\nSlide name:"))
(alert "Finish make sld file")
)
;;;--------------------------------------------------------------------------------------
(defun C:SLB(/ Myname);;;Make *.slb file
(setq MyName (getstring "\nSLB file name:"))
(command "shell" (strcat "dir *.sld/b > " MyName ".txt"))
(command "shell" (strcat "slidelib " MyName " < " MyName ".txt"))
(alert "Finish make slb file")
)
;;;--------------------------------------------------------------------------------------

Toàn bộ kết quả nhận được (*sld và *.slb) nằm ở thư mục gốc của Acad. Bạn đọc code sẽ hiểu ra vấn đề và có thể chỉnh sửa chương trình theo ý 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

Mình đã thử và vẫn chưa tạo được flie slb như mong muốn được , vẫn không điều khiển được nó . Có phải bản chất của slb là tập hợp các sld lại ? và tại sao phải dùng slb trong khi đã có sẵn sld 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
Các bác có thể cho em 1 lisp ví dụ về dialog được không ah . Khi đánh lệnh ABC.. gì đó thì sẽ hiện lên bảng dialog . 1 bên là có 3 dòng với nội dung "hình tròn" "hình vuông" "tam giác" , bên kia là slide của 3 hình đó . Khi mình click vào hình slide hay dòng chữ thì sẽ thực thi ngay lệnh chứ không cần phải nhấp ok . Tất nhiên sau khi click sẽ có giai đoạn nhập R đường tròn , cạnh hình vuông hoặc kích thước tam giác .

Lisp này để em học hỏi , chứ nhiều lisp trên máy quá phức tạp và rất dài , em còn học nhiều nên chưa hiểu hết .

Em cảm ơn rất nhiều .

Bạn thu đoạn code này xem,

Tự tạo lay file *.Sld nhé

"htron.sld"

"hvuong.sld"

" htamgiac.sld"

đặt đường dẫn ở đoạn này

" im (strcat "c:\\" image)" trong funtion (fill-im) mình đang để là ổ c:\

Hy vọng giúp được bạn. Mình buông súng lâu rồi nên bây giờ viết chắc củ chuối lắm <_<

Nếu bạn không muốn lặp lại main dialog thì bỏ phần "(while ( >= redia 2 )" ở C:show đi

thuty.dcl

thuty: dialog{
label= "thu image button";
 :boxed_column {
:row{	
:icon_ima{
	key ="tron";
	}
:icon_ima{
	key ="vuong";

	}
:icon_ima{
	key ="tamgiac";

	}
 } //row  
: retirement_button {
		label		   = " Exit  ";
		key			 = "accept";
		is_default	  = true;
  }


 }//boxed_colum
}

// lap mot cai rieng >>> lap lai nhieu lan
icon_ima: image_button {
	color					= 0;
	allow_accept			= true;
	fixed_height			= true;
	fixed_width			 = true;
width 			=25;
height 			=9;

}


hinhtron: dialog{
label="hinh tron";
:edit_box{
	label	= "nhap ban kinh R";
	key	= "bankinh";
	value	= "0.0";

}

ok_cancel;
}

hinhvuong: dialog{
label="hinh vuong";
:edit_box{
	label	= "chieu dai canh";
	key	= "canh";
	value	= "0.0";

}

ok_cancel;

}

hinhtamgiac: dialog{
label="Hinh tam giac";
:edit_box{
	label	= "canh gi cung duoc";
	key	= "canhtamgiac";
	value	= "100.0";

}
:edit_box{
	label	= "goc gi cung duoc";
	key	= "goctamgiac";
	value	= 0.0;

}

ok_cancel;

}

 

Thuty.lsp

;;; load dialog
(defun loadcl (dia_name)
 (if (= -1 (setq dcl_id (load_dialog (strcat dia_name ".dcl"))))
(progn
  (alert (strcat dia_name ".dcl" "not found")
  (setq dialogloaded nil)
 )		 
) 
(setq dialogloaded 1)
) 
)
;;;=========================
;;; thu tuc dua anh nen 
(defun fill-im (image key / width height im)
(setq 	width (dimx_tile  key)
		  height (dimy_tile key)
;********************* CHU Y *****************************
; dat duong dan den file chua anh - image la anh can dua nen
;************************************************************
	im (strcat "c:\\" image)
	)
(start_image key)
(slide_image 0 0  width height im)  
(end_image)
)
;;; htron , hvuong , htamgiac la anh can dua nen
;;; thu tuc nay chi lam gon chuong trinh 
(defun appear-images ()
 (fill-im "htron" "tron")
 (fill-im "hvuong" "vuong")
 (fill-im "htamgiac" "tamgiac")

)
;;; Load subdialog tranh lap lai nhieu lan 
(defun td (dialogname)
  (if (not (new_dialog dialogname dcl_id)) (exit))
  (start_dialog)
  (done_dialog)
; dat mot so cac function kiem tra va lam viec voi subdialog

);end defun
;;;
;;; Chu y  chi la vi du ve cach hien thi dialog thoi
(defun td1 ()
  (if (not (new_dialog "hinhtron" dcl_id)) (exit))
  (start_dialog)
;CHU Y DAY CHI LA VI DU VE CANH HIEN THI DIALOG THOI
; 2 cach hien thi dialog thi dieu khien sub dialog khac nhau
; do thoi gian co han chi lay vi du thoi.

);end defun
;;;

(defun c:show (/ dcl_id dialogloaded redia r)
 (setq redia 2)
 (loadcl "thuty")
 (if (/= nil dialogloaded)
(progn
   (while ( >= redia 2 )
	  (progn
	  (if (not (new_dialog "thuty" dcl_id)) (exit)); break when error
	  (appear-images)
		  (action_tile  "tron" "(td1)(done_dialog 3)")
		  (action_tile  "vuong" "(setq r $key)(done_dialog 4)")
		  (action_tile  "tamgiac" "(setq r $key)(done_dialog 5)")
	  (action_tile  "accept" "(done_dialog 1)")
			(setq redia (start_dialog))
;;; Co mot so cach de goi Funtion khi tac dong Image
;;; Minh chi gioi thieu 2 cach thoi, khong co thoi gian
;;; Cach 1	  
		  (cond
	((eq r "vuong") (td "hinhvuong"))
	((eq r "tamgiac") (td "hinhtamgiac"))	
	  )
	  (setq r nil)
;;; cach 2
;;;			  (cond
;;;		((= redia 4) (td "hinhvuong"))
;;;		((= redia 5) (td "hinhtamgiac"))	
;;;		  ) 

	  );p
 );w
  (unload_dialog dcl_id)
  );p-f
(print "Error")
 );if  
);defun

Have fun,

Roberto Nguyen

  • 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 đã thử và vẫn chưa tạo được flie slb như mong muốn được , vẫn không điều khiển được nó . Có phải bản chất của slb là tập hợp các sld lại ? và tại sao phải dùng slb trong khi đã có sẵn sld rồi ?

Tất nhiên, chỉ dùng *.sld, thậm chí không cần, dùng ngay bản vẽ *.dwg cũng được. Tuy nhiên, *.slb có những cái hay hơn:

1) Đúng như bạn nhận định, *.slb là một package của các *.sld. Khi cấp cho người dùng chương trình của bạn không phải kéo theo dài lê thê một "đoàn quân" mấy chục, có khi hàng trăm cái *.sld, mà chỉ cần 1 file *.slb duy nhất (Autodesk cũng làm như vậy mà). Khi đã "chơi" món này, ai cũng thấy khoái chí và không bao giờ chịu làm một vài cái *.sld

2) Dùng *.slb bạn mới có thể làm được cái gọi là Image_Tile_Menu. Món này cũng hay lắm đó. Bạn vào: Menu - Draw - Surfaces - 3D Surfaces sẽ thấy.

3) Chẳng hiểu bạn thao tác thế nào mà không tạo được *.slb? Có 2 động tác để tạo *.slb từ các *.sld:

- Tạo file *.txt, là một list chứa các tên file *.sld. (động tác này làm thủ công cũng được, chẳng cần lệnh liếc gì)

- Tạo *.slb từ *.txt trên

Xin hỏi thêm: bạn đang dùng phiên bản Cad nào? Sau khi chạy function (C:SLB...) mình gởi ở trên, bạn có nhận được *.txt không? Nếu có, thử chạy lại (C:SLB...) lần nữa xem. Nếu vẫn không được, đọc kỹ lại Help của bản Cad bạn đang dùng, chắc chắn phải tạo được! Không lẽ Autodesk lừa bạn à?

 

Bạn dùng thử chương trình sau, đúng yêu cầu mà bạn đã nêu. Từ từ "ngâm cứu" code của nó sẽ hiểu ra mọi vấn đề:

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

 

Unzip và đọc readme.txt

  • 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 đang dùng cad08 . Mình vẫn tạo được file *.slb nhưng mà nó lại không chứa thông tin gì hết . Mình dùng lisp của bác ssg và dùng command shell của cad nhưng vẫn ko được , chỉ tạo ra file rỗng , có gì lưu ý về nơi đặt file *.sld không ?

 

Mình chuyển qua làm theo đoạn help này

In the Command Prompt window, at the prompt, enter CD <folder location of slides> to change folders.

As an example: CD “c:\symbol”

 

At the prompt, enter the following syntax to create the slide library:

slidelib mark <mark.txt (mark.txt chứa danh sách các *.sld , tất cả các file *.txt và *.sld nằm trong thư mục c:\symbol)

 

Mình không hiểu tại sao trong command promt nó lại báo ko hiểu lệnh slidelib .

 

Cám ơn bạn đã nhiệt tình 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

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

×