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ình có thể giúp bạn đó ! Hiện tại mình có 1 lisp có thể tạo ra 1lúc gần 400 file sld từ 400 file dwg trong cùng thư mục và lưu tên cùng đường dẫn của các file sld và dwg đó trong 1 file lba! Khi nào muốn lấy thư viện thì chỉ cần gọi file lba đó lên ! Bạn có thể tham khảo cole của chương trình ! Nếu bạn muốn mình sẽ post lên ! Hiên tại mình ko ở nhà nên ko post lên đc!

Bạn có thể cho mình xin để học hỏi không? cám ơn bạn trước.

Cách của bác ssg bày thì làm được nhưng hơi lâu không biết của bạn dùng cách gì mà nghe tả có vẻ rất nhanh 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
Bạn có thể cho mình xin để học hỏi không? cám ơn bạn trước.

Cách của bác ssg bày thì làm được nhưng hơi lâu không biết của bạn dùng cách gì mà nghe tả có vẻ rất nhanh thì phải.

http://www.cadviet.com/upfiles/TaoLib.rar

Bạn dùng thử xem! Rồi bạn có thể sửa cho nó 1 chút đc ko! Vẫn có đoi chỗ bất tiện! Có gì bạn cứ hỏi mình !

  • 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
http://www.cadviet.com/upfiles/TaoLib.rar

Bạn dùng thử xem! Rồi bạn có thể sửa cho nó 1 chút đc ko! Vẫn có đoi chỗ bất tiện! Có gì bạn cứ hỏi mình !

 

Mình xem trong 3 file lisp bạn gửi thì chỉ có 1 lệnh là LIBRARY . Gọi lên xuất hiện hộp thoại có nút tạo mới nhưng khi chọn thì bảo là phải tạo bản vẽ mới thì mới tạo được thư viện.

Mình chưa hiểu cách dùng bạn chỉ giúp được không.

Mình quan tâm đến đoạn chọn 1 thư mục sẽ tạo ra các *.sld ấy 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
Mình xem trong 3 file lisp bạn gửi thì chỉ có 1 lệnh là LIBRARY . Gọi lên xuất hiện hộp thoại có nút tạo mới nhưng khi chọn thì bảo là phải tạo bản vẽ mới thì mới tạo được thư viện.

Mình chưa hiểu cách dùng bạn chỉ giúp được không.

Mình quan tâm đến đoạn chọn 1 thư mục sẽ tạo ra các *.sld ấy mà.

Truoc tiên bạn phải load lisp vào,load ở dạng dùng cho những lần sau nữa, ko phải load tam thời !Chắc bạn đã quá rõ !

Bạn nhập lệnh Library, hộp htoại hiên ra !Chọn tạo mới!Chọn đường dẫn tới nơi thư mục mà bạn chứa các file dwg !List các file dwg sẽ hiện ra bên phải ! Bạn chọn file đầu tiên! Sau đó bạn nhấn Shift cùng với mũi tên đi xuống để chọn đc nhiều file 1 lúc! Sau đó nhấn đồng ý ! Chương trình sẽ hỏi bạn nơi lưu các file SLD và nơi lưu file LBA ( File danh sách )

Còn điều mà bạn nói ! Chưông trình sẽ tạo thư viện dựa theo thư mục và tạo 1lúc nhiều thư viện( không giống với cách thông thường là mở bản vẽ và cho tưnhg đối tượng 1 vào thư viện ) nên bạn sẽ phải mở 1 bản vẽ mới và tạo thư việ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
Truoc tiên bạn phải load lisp vào,load ở dạng dùng cho những lần sau nữa, ko phải load tam thời !Chắc bạn đã quá rõ !

Bạn nhập lệnh Library, hộp htoại hiên ra !Chọn tạo mới!Chọn đường dẫn tới nơi thư mục mà bạn chứa các file dwg !List các file dwg sẽ hiện ra bên phải ! Bạn chọn file đầu tiên! Sau đó bạn nhấn Shift cùng với mũi tên đi xuống để chọn đc nhiều file 1 lúc! Sau đó nhấn đồng ý ! Chương trình sẽ hỏi bạn nơi lưu các file SLD và nơi lưu file LBA ( File danh sách )

Còn điều mà bạn nói ! Chưông trình sẽ tạo thư viện dựa theo thư mục và tạo 1lúc nhiều thư viện( không giống với cách thông thường là mở bản vẽ và cho tưnhg đối tượng 1 vào thư viện ) nên bạn sẽ phải mở 1 bản vẽ mới và tạo thư viện!

 

Mình đã load cho các lần dùng sau rồi nhưng nó vẩn bảo phải tạo bản vẽ mới. Liệu lisp của bạn có liên kiết với file nào nửa không (ngoaì 3 file bạn gử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
Mình đã load cho các lần dùng sau rồi nhưng nó vẩn bảo phải tạo bản vẽ mới. Liệu lisp của bạn có liên kiết với file nào nửa không (ngoaì 3 file bạn gửi). ?

Mình chưa hiểu cái mà bạn bảo là phải tạo bản vẽ mới ! Mình đang dùng bình thường, kể cả khi mở 1 bản vẽ đã có rồi dùng cái đó !Mình không nghĩ no liên quan gì đâu ! Bởi vì chương trình tạo ra 1 thư viện dự vào những file cad có trong 1 thư mục nên không ảnh hưởng gì tới file cad mà mình đang mở cả! Hiện giờ mình dùng rất tôt !

Bạn vào đây dăng kí tài khoản rồi download 2 file đó về ! Cài cả 2file, cài cái nào trước cũng đc! Trong đó có cái thư viện đó đấy !

http://forum.sanchoikientruc.vn/viewtopic.php?t=1737

Còn đây là File nguyên gốc của nó mà mình download của mấy ông nc ngoài về !

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

  • 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
Anh có thể tạo giúp e trong list đó có các cột được không ! Ví dụ như là trong bảng layer thì có các cột là linetype, lineweight...e muốn trong bảng list box đó của e có các cột ma nội dung các cột chỉ là các text thôi!

 

Cái này thị chịu thôi, Hình như "layer properties manager" Không viết bằng DCL. Nhờ các cao thủ trong diễn đàn giúp 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
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.

E không thể sư dụng đc chức năng cài đặt layer trong lisp của anh đc ! Khi e chuyển đến layer mà e muốn làm việc thì lisp dcl không thể chuyển đc băndf chúc năng cài đặt layer ! Mạc dù lisp có bào là bạn đang làm việc tren lisp mà e vừa chọn !

 

E có 1 câu hỏi muốn nhò a giúp đỡ : Ví dụ như e có 1 chương trình viết bằng lisp ! Làm thế nào để hạn chế số người dùng vậy anh ! kiểu như ai muốn cài đặt và sử dụng thì phải phone cho mình ấy ! Theo dạng như khi cài lisp vào cad, nó sẽ ăn vào registry và trả ra 1 giá trị nào đó cho người sử dụng biết ! Từ giá tri dó người sử dụng liên hệ với tác giả để có số mã cuối cùng và sử dụng số mã đó để đăng kí sử dụng !

Rất mong anh 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ấ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 đề:

<a href="http://www.cadviet.com/upfiles/Geo.zip" target="_blank">http://www.cadviet.com/upfiles/Geo.zip</a>

 

Unzip và đọc readme.txt

Chào ssg, mình cũng đã làm như bạn hương dẫn rồi mà khi tạo ra *.txt ---> nhấn OK xong là file *.txt lại biến mất là sao hả bạn, và mình cũng chả thấy file *.slb đâu cả. Nếu tạo ra file *.txt bàng thủ công thi tạo ra *.slb bằng cách nào, mình không rõ lắm về khoản nay.

Khi dùng lệnh SLB2 xong thì máy báo thế này thì là xong rồi hả bạn:

Command: SLB2

shell

OS Command: slidelib D:\1AVUONG\LISP DOWN\Lisp VAL 1.0\symbol\dong

vat\VUONG222.slb < D:\1AVUONG\LISP DOWN\Lisp VAL 1.0\symbol\dong vat\mylist.txt

Command: T

khi xong rồi nó lại có dòng command: T là sao? Bạn chỉ giúp mình với, mì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
Chào ssg, mình cũng đã làm như bạn hương dẫn rồi mà khi tạo ra *.txt ---> nhấn OK xong là file *.txt lại biến mất là sao hả bạn, và mình cũng chả thấy file *.slb đâu cả. Nếu tạo ra file *.txt bàng thủ công thi tạo ra *.slb bằng cách nào, mình không rõ lắm về khoản nay.

Khi dùng lệnh SLB2 xong thì máy báo thế này thì là xong rồi hả bạn:

Command: SLB2

shell

OS Command: slidelib D:\1AVUONG\LISP DOWN\Lisp VAL 1.0\symbol\dong

vat\VUONG222.slb < D:\1AVUONG\LISP DOWN\Lisp VAL 1.0\symbol\dong vat\mylist.txt

Command: T

khi xong rồi nó lại có dòng command: T là sao? Bạn chỉ giúp mình với, mình cảm ơn

Bạn thử lại với bài viết mới nhất của mình trong topic này (thời gian: Mar 19 2008, 03:11 PM)

  • 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 thử lại với bài viết mới nhất của mình trong topic này (thời gian: Mar 19 2008, 03:11 PM)

Cảm ơn bạn ssg nhiều, mình đã ngâm cứu mất hơn ....1 buổi và cũng đã làm được rồi. Mình cũng hiểu về lisp sơ sơ thôi, nói chung là cũng như trẻ con tập nói vậy

Phải công nhận là 4rum Cadviet có nhiều cao thủ thật, mình học hỏi được rất nhiều từ diễn đàn này. Cảm ơn tất cả anh em, chúc anh em thành công hơn trong cuộc số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
Bạn thử lại với bài viết mới nhất của mình trong topic này (thời gian: Mar 19 2008, 03:11 PM)

Mình là mem mới của Cadviet, mình có cái này muốn hỏi mà Search hoài không thấy nên mạn phép post vô đây. Lisp tính diện tích hay tính chiều dài đối tượng khi ra kết quả thì phải bật F2 lên mới biết được, kể thì cũng hơi bất tiện thật (vi mình thường không dùng thanh Command). Mình xin hỏi các AE Pro là để kết quả hiển thị lên trong bảng Autocad mes.... thì trong Lisp mình làm cách nào. Mình hơi yếu về Lisp. Cảm ơn trước

Cadviet thật là bổ ích, cảm ơn các admin

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 là mem mới của Cadviet, mình có cái này muốn hỏi mà Search hoài không thấy nên mạn phép post vô đây. Lisp tính diện tích hay tính chiều dài đối tượng khi ra kết quả thì phải bật F2 lên mới biết được, kể thì cũng hơi bất tiện thật (vi mình thường không dùng thanh Command). Mình xin hỏi các AE Pro là để kết quả hiển thị lên trong bảng Autocad mes.... thì trong Lisp mình làm cách nào. Mình hơi yếu về Lisp. Cảm ơn trước

Cadviet thật là bổ ích, cảm ơn các admin

Bác thích xuất ra ngoai màn hình à

OK

tặng bác.

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

  • 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ác thích xuất ra ngoai màn hình à

OK

tặng bác.

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

Cảm ơn bạn MANHHUNG, lisp ban cho cũng gần giống như lisp tính diện tích rồi chèn kết quả váo đó. Ý mình muốn hỏi là: muốn kết quả hiển thị trong bảng Autocad Mesage cho trực quan hơn và khỏi mất công xoá kết quả chèn vào màn hình. (hơi lười)

mình ví dụ nhé: trong Lisp tính tổng chiều dài các đối tượng, sau khi chon xong --> enter sẽ báo trong bảng autocad message là có bao nhiêu đối tượng được chọn, và tổng chiều dài là bao nhiêu. mong các anh chỉ bảo thêm.

cảm ơn sự nhiệt tình của các 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à bác chỉnh sửa cho nó đúng ý bác!

Cảm ơn bạn MANHHUNG, qua lisp của bạn mình cũng đã điều chỉnh lisp của mình được 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ảm ơn bạn MANHHUNG, qua lisp của bạn mình cũng đã điều chỉnh lisp của mình được rồi.

hình như có phiên bản ghost11.0 rồi mà bạn vẫn còn là ghost8.3, phải chăng đó có 1 ý nghĩa?

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
hình như có phiên bản ghost11.0 rồi mà bạn vẫn còn là ghost8.3, phải chăng đó có 1 ý nghĩa?

À, ghost thì bạn biết rồi, mình thích cái tên này và cả chương trình này nữa. nó rất tiện dụng trong giai đoạn máy tính nhiều virus như hiện nay, còn 8.3 chẳng qua là năm sinh của mình thôi. dùng thế cho dễ nhớ và cho giống với phiên bản của ghost ấy mà. chắc anh em diễn đàn lớn tuổi hơn mình nhiều. mong anh em cadviet chỉ bảo cho em vơi :s_big:

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 cho Tue_NV hỏi chổ này với :

 

Tue_NV thử tạo 1 popup_list trong 1 dialog.

-> Kết quả là muốn hiện tên của Phần tử của 1 List ten trong AutoCAD mesage

Ví dụ mình chọn "so 2" trong dialog thì chỉ hiện ra "2" trong AutoCAD mesage (hàm alert)

Tue_NV muốn kết quả là "so 2" trong AutoCAD mesage (chính là phần tử "so 2" trong list ten)

 

Khi trở lại dialog thì không biết làm sao mà Dialog lại hiện "so 0" trong popup_list.

Tue_NV muốn nó trở lại chính phần tử mà mình đã chọn trước đó (tức chính là "so 2" đã chọn trước đó) nhưng không được.

 

Đây là file .dcl

(defun c:lb (/ dcl_id ten phepchon)
(vl-load-com)
(while (not (vl-position phepchon '(0 1)))
 (setq dcl_id (load_dialog "listbox.dcl"))

(IF (not (new_dialog "LB" dcl_id))
   (exit)
)
(setq ten '("so 0" "so 1" "so 2" "so 3" "so 4" "so 5" 
	    "so 6" "so 7" "so 8" "so 9" "so 10" "so 11" 
	    "so 12" "so 13" "so 14"))
(start_list "C")			
 	(mapcar 'add_list ten)			
 	(end_list)
(action_tile "cancel" "(done_dialog 0)")		
(action_tile "accept" "(done_dialog 1)" ) 
(action_tile "C" "(setq a $value) ")
(action_tile "th" "(set_tile \"C\" a) (done_dialog 3)")

 (setq phepchon (start_dialog))
    (COND 
((= phepchon 3) (progn (alert a) (set_tile "C" a)))
    )
);while
 (unload_dialog DCL_ID)

 (princ)
)

Kiến thức về .dcl còn hạn chế nhiều quá. Mong nhận được sự giúp đỡ của các bác.

Tue_NV xin chân thà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ác cho Tue_NV hỏi chổ này với :

 

Tue_NV thử tạo 1 popup_list trong 1 dialog.

-> Kết quả là muốn hiện tên của Phần tử của 1 List ten trong AutoCAD mesage

Ví dụ mình chọn "so 2" trong dialog thì chỉ hiện ra "2" trong AutoCAD mesage (hàm alert)

Tue_NV muốn kết quả là "so 2" trong AutoCAD mesage (chính là phần tử "so 2" trong list ten)

 

Khi trở lại dialog thì không biết làm sao mà Dialog lại hiện "so 0" trong popup_list.

Tue_NV muốn nó trở lại chính phần tử mà mình đã chọn trước đó (tức chính là "so 2" đã chọn trước đó) nhưng không được.

 

Đây là file .dcl

(defun c:lb (/ dcl_id ten phepchon)
(vl-load-com)
(while (not (vl-position phepchon '(0 1)))
 (setq dcl_id (load_dialog "listbox.dcl"))

(IF (not (new_dialog "LB" dcl_id))
   (exit)
)
(setq ten '("so 0" "so 1" "so 2" "so 3" "so 4" "so 5" 
	    "so 6" "so 7" "so 8" "so 9" "so 10" "so 11" 
	    "so 12" "so 13" "so 14"))
(start_list "C")			
 	(mapcar 'add_list ten)			
 	(end_list)
(action_tile "cancel" "(done_dialog 0)")		
(action_tile "accept" "(done_dialog 1)" ) 
(action_tile "C" "(setq a $value) ")
(action_tile "th" "(set_tile \"C\" a) (done_dialog 3)")

 (setq phepchon (start_dialog))
    (COND 
((= phepchon 3) (progn (alert a) (set_tile "C" a)))
    )
);while
 (unload_dialog DCL_ID)

 (princ)
)

Kiến thức về .dcl còn hạn chế nhiều quá. Mong nhận được sự giúp đỡ của các bác.

Tue_NV xin chân thành cảm ơn.

Chào bác Tue_NV,

Trước hết phải nói ngay là mình không dám múa rìu qua mắt thợ đâu. Song theo như mình hiểu một chút về hộp thoại thì:

1/- Vì sao bác phải sử dụng nút (button) th ở đây???

2/- Cái kết quả có trong alert của CAD là giá trị của a mà a theo dịnh nghĩa của bác chỉ là giá trị của hộp thoại tức là giá trị của done_dialog chứ đâu phải giá trị của biến lựa chọn ????

3/- Trong code lisp của bác chưa thấy có hàm lưu biến để lưu lại giá trị của biến được lựa chọn.

4/- Code lisp của bác mình thấy hơi khó hiểu hơn code của ông Jeffy Sander khi sử dụng với hộp thoại popup list.

Bác có thể tham khảo cái cách làm của ông Jeffy Sander ở đây nhé

http://www.cadviet.com/upfiles/2/dialog_co...l_language4.doc

Các phần chữ Việt là do mình tự dịch thôi, đúng sai bác bỏ qua nhé, phần gốc tiếng Anh là của ổng. Với trình độ của bác mình tin bác sẽ thấu hiểu nó tốt hơn mình và chắc chắn nó có thể đáp ứng cái yêu cầu mà bác đặt ra.

Riêng về việc khi mở lại hộp thoại thì các giá trị chọn lần trước đó sẽ hiển thị chứ không phải giá trị đầu tiên trong list thì mình cũng không chắc chắn lắm về khả năng giải quyết do chưa hiểu rõ những điều ông ấy viết. Bác thử thay thế cái khoảng trăng ở dòng value bằng tên biến mà bác định đặt cho cái giá trị bác chọn xem nhé.

Chúc bác thành công.

  • 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
Các bác cho Tue_NV hỏi chổ này với :

 

Tue_NV thử tạo 1 popup_list trong 1 dialog.

-> Kết quả là muốn hiện tên của Phần tử của 1 List ten trong AutoCAD mesage

Ví dụ mình chọn "so 2" trong dialog thì chỉ hiện ra "2" trong AutoCAD mesage (hàm alert)

Tue_NV muốn kết quả là "so 2" trong AutoCAD mesage (chính là phần tử "so 2" trong list ten)

 

Khi trở lại dialog thì không biết làm sao mà Dialog lại hiện "so 0" trong popup_list.

Tue_NV muốn nó trở lại chính phần tử mà mình đã chọn trước đó (tức chính là "so 2" đã chọn trước đó) nhưng không được.

 

Đây là file .dcl

(defun c:lb (/ dcl_id ten phepchon)
(vl-load-com)
(while (not (vl-position phepchon '(0 1)))
 (setq dcl_id (load_dialog "listbox.dcl"))

(IF (not (new_dialog "LB" dcl_id))
   (exit)
)
(setq ten '("so 0" "so 1" "so 2" "so 3" "so 4" "so 5" 
	    "so 6" "so 7" "so 8" "so 9" "so 10" "so 11" 
	    "so 12" "so 13" "so 14"))
(start_list "C")			
 	(mapcar 'add_list ten)			
 	(end_list)
(action_tile "cancel" "(done_dialog 0)")		
(action_tile "accept" "(done_dialog 1)" ) 
(action_tile "C" "(setq a $value) ")
(action_tile "th" "(set_tile \"C\" a) (done_dialog 3)")

 (setq phepchon (start_dialog))
    (COND 
((= phepchon 3) (progn (alert a) (set_tile "C" a)))
    )
);while
 (unload_dialog DCL_ID)

 (princ)
)

Kiến thức về .dcl còn hạn chế nhiều quá. Mong nhận được sự giúp đỡ của các bác.

Tue_NV xin chân thành cảm ơn.

Lâu lắm ssg mới vào lại diễn đàn thăm anh em!

Trước hết, ssg xin có lời chân thành cám ơn Tue_NV đã rất nhiệt tình để tạo nên "sức sống" cho diễn đàn Lisp suốt thời gian qua. Bản thân ssg, vì hoàn cảnh riêng, không thể tham gia thường xuyên với anh em được. Ssg đã đề nghị anh Hoành "xóa tên" ssg khỏi danh sách Mod, hoặc chí ít cũng đừng đưa nick lên ở đầu box "Điều hành: ssg, ...." nữa. Ghi như vậy mà cả mấy tháng chẳng thấy tăm hơi khó coi lắm! Nhân đây, ssg khẩn thiết mong anh Hoành xem xét lại nguyện vọng trên của ssg một lần nữa.

 

Về dialog, bạn Tue_NV xem thử code sửa như sau có đúng ý bạn không?

(defun c:lb2 (/ dcl_id ten phepchon a)
(if (not a) (setq a "0"))
(vl-load-com)
(while (not (vl-position phepchon '(0 1)))
 (setq dcl_id (load_dialog "listbox.dcl"))
 (if (not (new_dialog "LB" dcl_id)) (exit))
 (setq ten '("so 0" "so 1" "so 2" "so 3" "so 4" "so 5" 
 "so 6" "so 7" "so 8" "so 9" "so 10" "so 11" 
 "so 12" "so 13" "so 14"))
 (start_list "C")			
 (mapcar 'add_list ten)			
 (end_list)
 (action_tile "cancel" "(done_dialog 0)")		
 (action_tile "accept" "(done_dialog 1)" ) 
 (action_tile "C" "(setq a $value) ")
 (action_tile "th" "(done_dialog 3)")
 (set_tile "C" a)
 (setq phepchon (start_dialog))
 (if (= phepchon 3) (alert (nth (atoi a) ten)))
);while
(unload_dialog DCL_ID)
(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
Lâu lắm ssg mới vào lại diễn đàn thăm anh em! :cheers:

................

Về cơ bản Lisp của bác SSG đã giải quyết đuợc vấn đề.

 

Xin bổ sung vài ý :

1. Kiểu và giá trị trả về của popup_list : (action_tile "C" "(setq a $value) ")

- Kiểu của $valueSTR (string)

- Giá trị trả về $valuethứ tự của danh sách trong popup_list.

Vd : "0" , "1", "2", .... "n"

Do đó để lấy đuợc "Phần tử trong List ten", phải nhờ đến hàm (nth n lst), truớc đó phải đổi kiểu của biến a ra kiểu số nguyên.

(nth (atoi a) lst) -> ph/tử thứ a trong list ten

 

2. Khi trở lại dialog thì muốn nó trở lại chính phần tử đã chọn trước đó

dùng hàm (set_tile key value) để gán giá trị cho dialog

(set_tile "C" a)

Để tránh lỗi khi lần đầu gọi dialog (lúc này giá trị của biến a=nil), gán cho biến a giá trị "0"

(setq a "0")

 

3. Trong T/hợp này giá trị của biến ten không thay đổi do đó nên đưa ra ngoài vòng lặp WHILE

tuơng tự với dòng (load_dialog "listbox.dcl")

 

Gửi Tue_NV code có thay thế nội dung biến ten bằng danh sách các Layer trong bản vẽ.

(defun c:lb3 (/ a dcl_id phepchon ten)
 (defun GetLayerLst(/ tbl tbl_lst)
   (setq tbl (tblnext "layer" 1) tbl_lst nil)
   (while tbl
     (setq tbl_lst (cons (cdr (assoc 2 tbl)) tbl_lst))
     (setq tbl (tblnext "layer"))    )
   (vl-sort tbl_lst '<))
;main
 (setq dcl_id (load_dialog "listbox.dcl"))
 (setq ten (GetLayerLst)
a "0")

 (while (not (vl-position phepchon '(0 1)))    
   (if (not (new_dialog "LB" dcl_id))
     (exit))
   (start_list "C")
   (mapcar 'add_list ten)
   (end_list)    
   (set_tile "C" a)
   (action_tile "C" "(setq a $value)")    
   (action_tile "cancel" "(done_dialog 0)")
   (action_tile "accept" "(done_dialog 1)" )
   (action_tile "th" "(done_dialog 3)")
   (setq phepchon (start_dialog))
   (if (= phepchon 3)
     (alert (nth (atoi a) ten)))
   );while
 (unload_dialog DCL_ID)
 (if (= phepchon 1) (alert (strcat "Ban da chon Layer : "(nth (atoi a) ten))))
 (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

Cảm ơn anh gia_bach, bác ssg, bác PhamThanhBinh thật nhiều. :cheers:

Tue_NV đã hiểu được bản chất vấn đề rồi. Lời giải thích của anh gia_bach rất cụ thể, chi tiết.

Các bác cho Tue_NV hỏi thêm 1 vấn đề về cách tạo file *chm hoặc *.hlp như thế nào ạ?

 

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

Tue_NV đã lên mạng tìm kiếm trình "Microsoft HTML Help Image Editor" và download về nhưng không biết cách sử dụng.

Giao diện lúc đầu vào thì chương trình có nút open để mở -> Nhưng khi mở thì nó yêu cầu mở file ảnh Bitmap (*.bmp,*.dib) thôi. Đây là giao diện của nó và cách sử dụng thì Tue_NV chưa được biết :

help_2.jpg

 

Tue_NV muốn tạo file Help để phục vụ cho việc giúp đỡ (Help) được tốt hơn. Thể hiện như file mcvhelp.chm của bác ssg hay là file help trong bộ ACV của bác NguyenHoanh

 

Rất mong các bác có kinh nghiệm về vấn đề này chia sẻ 1 chút kinh nghiệm cách tạo file Help

Xin chân thành cảm ơn các bác. :s_big:

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 cho Tue_NV hỏi thêm 1 vấn đề về cách tạo file *chm hoặc *.hlp như thế nào ạ?

Tue_NV đã lên mạng tìm kiếm trình "Microsoft HTML Help Image Editor"

........

Không phải "Microsoft HTML Help Image Editor" mà là Microsoft HTML Help Workshop trong đó bao gồm : "HTML Help Image Editor" và "HTML Help Workshop", sau khi cài đặt dùng "HTML Help Workshop".

 

hoặc :

- AM WORD2CHM tham khảo bài của lamtecco2 trên CadViet : http://www.cadviet.com/forum/index.php?showtopic=2337

 

- WinCHM Pro : http://www.download.com.vn/developer+tools...winchm-pro.aspx

 

- PowerCHM : http://www.download.com.vn/data+file/more+...werchm-5-7.aspx

  • 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

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

×