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

[Hỏi] Cách load menu bằng lisp, không dùng lệnh "Menuload"

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

Hiện tại mình đã tạo được cho mình 1 bộ Tool Lisp tương đối hoàn chỉnh và cho vào trong 1 thư mục đặt ở ổ C:\\.

Vướng mắc cuối cùng của mình là viết ra một hàm lisp load cái menu của mình lên khi mình gọi lệnh.

Ví dụ cho rõ ràng chút:

-- Mình tạo một hàm lisp có chức năng thực hiện 3 việc sau:

1. Bước đầu, load 1 lisp tổng có chứa tất cả các lệnh cần thiết. (để lấy đường dẫn cho bước 2).

 

2. Add vào trong Support File Search Path đường dẫn đến thư mục chứa những thứ kèm theo khi dùng lisp (như: file dwg, dialog...).

 

3. Load menu đã tạo sẵn lên thanh công cụ của CAD.

 

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

Ý 1 và 2 đã giải quyết xong, còn ý 3 nữa là xong mà mò mẫm hoài không ra được. Mọi người giúp giùm nhá.

Àh!!! Nhớ là cả 3 bước này được thực hiện trong 1 lần gọi lệnh nhá. Ví như ta gõ trên command: RUN [enter] ----> Lisp sẽ thực hiện cả 3 bước trên.

---- Đợi comment thô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

Dùng command "Menuload" thì mình có nghĩ tới nhưng làm sao để brower chọn file *.cui thì mình chịu... Cái này phải sao bạn chỉ dù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

Khi add suport rồi, thì thay vì phải gõ đầy đủ đường dẫn của file, Bạn chỉ cần gõ tên file là được

Cái này bạn tham khảo thêm lisp di động của anh Duy2006

  • 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

Ví dụ về 2 dòng lisp để load và hiện lên menu:

(command "menuload" "Test.cui")

(menucmd "P16=+Tien_ich.POP16")

Từ đó, bạn có thể gom thành 3 trong 1.

Chú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

Ví dụ về 2 dòng lisp để load và hiện lên menu:

(command "menuload" "Test.cui")

(menucmd "P16=+Tien_ich.POP16")

Từ đó, bạn có thể gom thành 3 trong 1.

Chúc thành công.

 

Hê hê! Đã làm được. Thanks các sư huynh nhìu. Nhưng mà cho hỏi 1 chút về cái dòng

(menucmd "P16=+Tien_ich.POP16")

Dòng này nó có chức năng load menu lên thanh công cụ, nhưng P16 đó là gì vậy, mình thay nó bằng những số khác nhỏ hơn hay lớn hơn có được 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

"File" <=> P1

"Edit" <=> P2

"View" <=> P3

...

"Help" <=> P12

Bạn cứ thử đặt nó, VD thay vì P16 thì sửa lại thành P1 hoặc P20, để biết xem nó thế nào nhé!

Cám ơn mà sao quên tick "Like this" hoài nhỉ? :lol:

  • 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 đưa lên đây file lisp mình dùm để chèn đường dẫn vào Support File Search Path và add menu tự động lên thanh công cụ.

Lisp này còn sai ở chỗ dòng add menuload, vì khi gõ lệnh add xong thì trong hộp thoại Menuload nó đã hiễn thị tên menu cần chèn vào rồi, nhưng trên thanh công cụ nó chưa xuất hiện menu của mình lên trên đó.

Một điều nữa, với trường hợp qua những máy tính khác nhau thì cái P15 (menucmd "P15=+ISO.POP15") nó không giống nhau. Vậy thì làm thế nào để nhận biết được cái này.

Mọi người giúp nhá.

 

(defun c:add()



 (defun lastload( / K)
(setq K (strcat
   "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\"
   "CurrentVersion\\Explorer\\ComDlg32\\OpenSaveMRU\\*"
   ))
(vl-registry-read K (substr (vl-registry-read K "MRUList") 1 1))
);end lastload


(defun addspath(s)
 (setenv "ACAD" (strcat (getenv "ACAD") ";" s))
);end addspath

 (setvar "cmdecho" 0)
 (addspath (vl-filename-directory (LastLoad)))
 (addspath (strcat (vl-filename-directory (LastLoad)) "\\Library_shape"))

 (load (strcat (vl-filename-directory (LastLoad)) "\\IN_tplot.lsp"))
 (load (strcat (vl-filename-directory (LastLoad)) "\\01_VTCo_A3utilities.lsp"))

 (command ".menuload" "ISO-Vinx.cui")
 (menucmd "P15=+ISO.POP1")
)

  • 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 chú ý dòng code này:

(menucmd "P15=+ISO.POP1")

POP1 và ISO phải đúng tên trong file cui. Bạn kiểm tra lại xem nhé (kiểm tra từ file mnu thì dễ hơn).

Trong trường hợp vẫn không được thì bạn post file cui và mnu lên nhé.

P/S: hỏi thêm: bạn đang xài win nào vậy (vista, win7, xp, 98, 95...)?

  • 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

Hiện tại mình sử dụng Cad2007 và Cad2010 trên nền Winxp.

Và mình tạo menu bằng lệnh cui của CAD2007 (để có thể sử dụng luôn cho những CAD lớn hơn).

Thì khi mình tạo file menu (*.cui) và xuất ra nó chỉ có 1 file đuôi là *.cui thôi...chứ mình không thấy file nào là *.mnu cả.

Khi mình dùng lệnh menuload và load bằng tay lên thì nó xuất hiện thêm file cùng tên có đuôi là *.mnr

Mình đem lên đây để bạn xem qua.

 

http://www.mediafire...vv16uw0kca590av

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

1). Cách viết đúng:

(command ".menuload" "ISO-Vinx.cui")

(menucmd "P15=+ISO-VINX.POP1")

Bạn chú ý các chữ màu đỏ và màu xanh. Nó phải giống 2 dòng dưới đây lấy ra từ *.cui:

<MenuGroup Name="ISO-VINX">

<Alias>POP1</Alias>

Đồng thời, cái hiện lên trên menu là ISO thì được lấy ra từ dòng này:

<Name xlate="true" UID="XLS_0001">ISO</Name>

srr vì ở trên tôi viết nhầm. Nói chung thì hiểu rõ file cui hơi bị... khó!

2). Sở dĩ tôi hỏi bạn phiên bản Win là vì hàm lastload của bạn nó không chạy được trong 1 số Win (VD: Win7).

  • 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

Hiện tại mình sử dụng Cad2007 và Cad2010 trên nền Winxp.

Và mình tạo menu bằng lệnh cui của CAD2007 (để có thể sử dụng luôn cho những CAD lớn hơn).

Thì khi mình tạo file menu (*.cui) và xuất ra nó chỉ có 1 file đuôi là *.cui thôi...chứ mình không thấy file nào là *.mnu cả.

Khi mình dùng lệnh menuload và load bằng tay lên thì nó xuất hiện thêm file cùng tên có đuôi là *.mnr

Mình đem lên đây để bạn xem qua.

 

http://www.mediafire...vv16uw0kca590av

 

Tạo menu thì theo mình nên viết bằng file mns cho nó dể dòm chứ cái cui nó rối ben ngó phát ớn.

-file mns khi load lên cad nó tự dịch ra thành cui

-Cái mnr là file biên dịch của các hình ảnh dùng hiển thị icon trên các thanh công cụ.

Các bài viết về mns trên diển đàn nhiều vô kể bạn lội xem.

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 Duy!

CUI hay MNS/MNU đều có những ưu/nhược riêng:

- Tạo bằng MNS/MNU thì rất dễ đọc, dòm vô là hiểu. Nhưng phải là người biết viết file menu mới kham nổi.

- Tạo bằng CUI thì dòm vô tẩu hỏa nhập ma, nhưng cách tạo thì người không biết viết menu cũng chơi được, lại thêm có thể chèn icon được.

Xin lỗi: xâm phạm tác quyền của bác ở từ "DÒM" một lần nữa nhé! :lol:

  • 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

Viết menu bằng MNS/MNU là cái hạn chế của mình, mặc dù là có đọc qua những bài viết về cách viết nó nhưng mà chưa định hình được cái sườn của nó như thế nào để viết cho ok hết...

 

Nên nếu bác Duy có thời gian thì từ cái form menu của em (link mediafile phía trên) bác có thể viết lại giúp em vài dòng bằng file MNS để mình có thể so sánh cấu trúc của nó để mót thêm được tí gì không.

---

Quay lại với chủ đề của topic thì em cảm ơn bác Doan Van Ha nhiều nhiều vì đã hướng dẫn tận tình và nhờ đó mình đã thực hiện được ý đồ...dù rằng chỉ là áp dụng thôi chứ hiểu hết ngọn ngành thì chưa.

 

Bác cho em hỏi thêm mấy ý, từ file cui của em bác làm cách nào có thể xem được những dòng này, em thử mở file cui bằng trình Vlisp thì nó ra 1 đóng nhìn chóng mặt luôn.

 

 

<MenuGroup Name="ISO-VINX">

<Alias>POP1</Alias>

<Name xlate="true" UID="XLS_0001">ISO</Name>

 

Vấn đề nữa là hàm lastload của em bị hạn chế ở 1 số win như bác nói vậy thì phải sử lý như thế nào thì nó mới tương thích được hết được với những Win như vista, win7, xp, 98, 95...Những vấn đề này hỏi để học thôi nên nếu rỗi thì bác giúp em.

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

1). Câu hỏi 1: nhấn F3 hoặc F4 để xem.

2). Câu hỏi 2: hàm lastload của bạn lỗi với Win7. Hàm lastload dưới đây không lỗi với Win7. Kết hợp cả 2 hàm lastload thì có thể chạy tốt với các Win... cho tới bây giờ. Còn mai mốt có Win mới thì... chịu! Cái này chắc phải hỏi bác Window???

3).Trả lời thay bác Duy: từ file CUI mà viết lại file MNS hoặc MNU thì chắc là quá... Ẹ!

(defun LASTLOAD()
(setq path (vl-registry-read (strcat "HKEY_CURRENT_USER\\" (vlax-product-key) "\\Profiles\\" (vla-get-activeprofile (vla-get-profiles (vla-get-preferences (vlax-get-acad-object)))) "\\Dialogs\\Appload") "MainDialog"))
(if path (setq path (substr path 1 (- (strlen path) 1)))))

  • 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

Hê hê! Thanks bác đã tận tình....

Vậy thì em sẽ giữ chính kiến của mình trung thành với *.cui ...

-----

Àh hỏi bác thêm câu nữa....Sao tick like cho bác thêm nữa mà không được 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

1). Tùy quan điểm mà "trung thành" thôi!

2). "Like This" cấp chủ quyền mỗi ngày mấy phát thôi. Để tránh lạm phát mà. Lâu nay vẫn bị người ta nợ hoài, hẹn mai trả, rốt cuộc xù luôn. :D

  • 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

Hê hê!!! Trả nợ cho bác rồi nhá....Cái này cũng kẹt nhỉ, ví như 10 người góp ý muốn Like this hết 10 người mà không đủ để Like thì thiệt thòi nhỉ..:)

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

(defun c:add-contents()

 (defun lastload( / K)
(setq K (strcat "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\" "CurrentVersion\\Explorer\\ComDlg32\\OpenSaveMRU\\*" ))
(vl-registry-read K (substr (vl-registry-read K "MRUList") 1 1))
)

 (load (strcat (vl-filename-directory (LastLoad)) "\\IN_tplot.lsp"))
 (load (strcat (vl-filename-directory (LastLoad)) "\\01_VTCo_A3utilities.lsp"))
 )

 

Bác cho em hỏi thêm cái này.... với cái lisp trên "C:add-contents" thì chức năng của nó là load những lisp đã được chỉ định sẵn, lên trên bản vẽ hiện thời ngay lúc đó...

Vậy như muốn sửa lại chức năng của nó là load luôn vào "Contents", để tiện cho những bản vẽ sau thì mình phải làm như thế nào.

--

Em có mò mẫm trong regidit thì thấy mỗi lần mình add 1 file mới vào "contents" thì nó sẽ lưu lại tại đường dẫn này.

"HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R18.0\ACAD-8001:409\Profiles\Initial Setup Profile\Dialogs\Appload\Startup\....."

Biết rằng dòng này "R18.0\ACAD-8001:409" sẽ thay đổi theo vesion của CAD.

Khi ta add 1 file mới thì file "NumStartup" nó sẽ nhảy lên 1 giá trị và giá trị trước đó sẽ là đường dẫn của file lisp mình vừa load...

Thế nên em muốn bác giúp làm cách nào dùng lisp để có thể đụng đến thằng này....

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 biết bạn theo lisp đã lâu chưa, mà toàn đặt ra những câu hỏi khó. Nếu còn khó nữa thì chắc tôi phải nhờ trợ giúp của khán giả hoặc gọi điện thoại cho người thân thôi!

1). Xét về hiệu quả của việc add lisp vào contents tự động thì không hiệu quả lắm. Bởi bạn chỉ cần gom tất cả file lisp vào 1 folder. Sau đó viết hàm load tất cả folder này. Và sau đó nữa là add file chứa hàm này vào contents là xong.

2). Tuy nhiên, vì bạn đã hỏi nên cũng cố tìm tòi mà trả lời: lisp dưới đây dùng để add 1 file lisp vào contents. Có 2 điều xãy ra:

2a). Sau khi add xong, tắt cad khởi động lại thì sẽ thấy nó chình ình trong contens. Nếu sau khi add mà bạn dùng lệnh APPLOAD, rồi mới tắt cad khởi động lại thì dã tràng xa cát biển đông.

2b). Như đã nói ở phần trước, cái này chạy trên Win7 thì OK (máy tôi), còn máy bạn XP thì tôi không bảo hiểm nhân mạng.

2c). Nếu bạn hỏi tôi vì sao có những chuyện "lạ đời" như vậy thì tôi sẽ hỏi Ơi Trồng.

;----- Add 1 file to Startup Suite, EX: (f:appload_startup_add "D:\\HA\\test.lsp")
(defun f:appload_startup_add (f2 / pth lst i)
(if
 (and
  (findfile f2)
  (not (member (strcase f2) (mapcar 'strcase (setq lst (f:appload_startup_files))))))
 (progn
  (vl-registry-write (setq pth (f:appload_startup_path)) (strcat (setq i (itoa (1+ (length lst)))) "Startup") f2)
  (vl-registry-write pth "NumStartup" i)))
i)
(defun f:appload_startup_path ()
(strcat "HKEY_CURRENT_USER\\" (vlax-product-key) "\\Profiles\\"
 (vla-get-ActiveProfile (vla-get-Profiles (vla-get-Preferences (vlax-get-acad-object)))) "\\Dialogs\\Appload\\Startup"))
(defun f:appload_startup_files ( / pth lst i f)
(setq pth (f:appload_startup_path)
      	i 0)
(while (setq f (vl-registry-read pth (strcat (itoa (setq i (1+ i))) "Startup")))
 (setq lst (cons f lst)))
lst)

  • 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

Hê! Em theo lisp cũng chưa lâu, khoảng đâu hơn nữa năm....viết còn ẹ lắm...

Em nảy ra những vấn đề trên là khi ngồi mày mò tự dưng trong đầu xuất hiện ra ý tưởng rồi ngồi lượm nhặt các bài trên diễn đàn thôi, cái nào không có thì mới hỏi các cao thủ như bác....

Hề hề...Dù gì cũng thanks bác đã tận tình....Được bác chỉ cho vài chiêu mà thấy công lực lên được chút rồi...:)

-----

Em còn mấy chục câu để hỏi nữa mà thôi, đợi em search trên forum rồi mò trước đã, ko có thì em lại đăng đàn xin thọ giáo vậy :)

Nếu được, bác có cuốn sách nào về lisp, vlisp, dialog... cho em tham khảo với....tự mò mà ra nó mới sướng bác ạh :)

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 học từ 3 nguồn: Cadviet, search google, help của cad. Bạn cứ chịu khó search, chịu khó lục cadviet, chịu khó đọc help thì nó lên tay lên chân thôi.

"... tự mò mà ra nó mới sướng bác ạh" => không cần bàn cãi: mò thì thích rồi; mò mà ra nữa thì quá sướng chứ lị!

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ó file .Cui tạo menu như sau

Giờ mình muốn load file cui bằng lisp mà không được:

;Tao menu bang lisp
(Defun C:ts()
(command "menuload" "C:\Tools-DS(VBA)\DS-HTKT.cui")
(menucmd "P17=+DS-HTKT.POP1")
(princ))

http://www.cadviet.com/upfiles/3/48467_dshtkt.rar

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

Gửi bạn đoạn Code này, mình đã vận dụng được.....thay tên menu và vận dụng nó theo cách của bạn nhé>

 

(progn
 	(setq menu  "C:\\ISO-Vinx.cui")
 	(setq acadobj (vlax-get-acad-object))
 	(setq menus (vla-get-menuGroups acadobj))
 	(setq flag nil)
 	(vlax-for n menus
(if (= (vla-get-name n) "ISO-Vinx")
  (setq flag T)
  )
(terpri)
)
 	(if (= flag nil)
(progn
 	(vla-load menus menu)
 	(setq PD1 (vla-item (vla-get-menus (vla-item menus "ISO-Vinx")) 0))
 	(vla-InsertInMenubar PD1 15)
 	)
 	)    
 	(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 thấy avi612 có menu rất đẹp, tuy nhiên trong file bạn gửi có 2 file mnu và mnr.

Bạn có thể gửi cho mình cả bộ được không? Mình sẽ tham khảo cách làm của bạn.

Chân thành cảm ơn bạn rất nhiều.

P/s: Các bác có tài liệu tham khảo gì về cách tạo menu, toolbar thì cho mình xin với. Cảm ơn các bác.

Tài liệu tiếng Anh 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

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


×