找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 37|回复: 0

C++和CSharp增加AutoCAD的菜单menu

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-9-26 10:33:16 | 显示全部楼层 |阅读模式
  1. void
  2. addMenuThroughCom()
  3. {
  4.     AutoCAD::IAcadApplication *pAcad;
  5.     AutoCAD::IAcadMenuBar *pMenuBar;
  6.     AutoCAD::IAcadMenuGroups *pMenuGroups;
  7.     AutoCAD::IAcadMenuGroup *pMenuGroup;
  8.     AutoCAD::IAcadPopupMenus *pPopUpMenus;
  9.     AutoCAD::IAcadPopupMenu *pPopUpMenu;
  10.     AutoCAD::IAcadPopupMenuItem *pPopUpMenuItem;
  11.     HRESULT hr = NOERROR;
  12.     LPUNKNOWN pUnk = NULL;
  13.     LPDISPATCH pAcadDisp = acedGetIDispatch(TRUE);
  14.     if(pAcadDisp==NULL)
  15.         return;
  16.     hr = pAcadDisp->QueryInterface(AutoCAD::IID_IAcadApplication,(void**)&pAcad);
  17.     pAcadDisp->Release();
  18.     if (FAILED(hr))
  19.         return;
  20.     pAcad->put_Visible(true);
  21.     pAcad->get_MenuBar(&pMenuBar);
  22.     pAcad->get_MenuGroups(&pMenuGroups);
  23.     pAcad->Release();
  24.     long numberOfMenus;
  25.     pMenuBar->get_Count(&numberOfMenus);
  26.     pMenuBar->Release();
  27.     VARIANT index;
  28.     VariantInit(&index);
  29.     V_VT(&index) = VT_I4;
  30.     V_I4(&index) = 0;
  31.     pMenuGroups->Item(index, &pMenuGroup);
  32.     pMenuGroups->Release();
  33.    
  34.     pMenuGroup->get_Menus(&pPopUpMenus);
  35.     pMenuGroup->Release();
  36.     WCHAR wstrMenuName[256];
  37.     #ifdef UNICODE
  38.         _tcscpy(wstrMenuName, L"AsdkComAccess");
  39.     #else  // !UNICODE
  40.         MultiByteToWideChar(CP_ACP, 0, "AsdkComAccess", -1, wstrMenuName, 256);
  41.     #endif // !UNICODE
  42.     // Enables the menu to be loaded/unloaded with the same command.
  43.     if (!bIsMenuLoaded) {
  44.         pPopUpMenus->Add(wstrMenuName, &pPopUpMenu);
  45.         if (pPopUpMenu != NULL) {
  46.             WCHAR wstrMenuItemName[256];
  47.             WCHAR wstrMenuItemMacro[256];
  48.             #ifdef UNICODE
  49.                 _tcscpy(wstrMenuItemName, L"&Add A ComCircle");
  50.                 _tcscpy(wstrMenuItemMacro, L"AsdkComCircle ");
  51.             #else  // !UNICODE
  52.                 MultiByteToWideChar(CP_ACP, 0, "&Add A ComCircle", -1, wstrMenuItemName, 256);
  53.                 MultiByteToWideChar(CP_ACP, 0, "AsdkComCircle ", -1, wstrMenuItemMacro, 256);
  54.             #endif // !UNICODE
  55.             VariantInit(&index);
  56.             V_VT(&index) = VT_I4;
  57.             V_I4(&index) = 0;
  58.             pPopUpMenu->AddMenuItem(index, wstrMenuItemName, wstrMenuItemMacro, &pPopUpMenuItem);
  59.             VariantInit(&index);
  60.             V_VT(&index) = VT_I4;
  61.             V_I4(&index) = 1;
  62.             pPopUpMenu->AddSeparator(index, &pPopUpMenuItem);
  63.             #ifdef UNICODE
  64.                 _tcscpy(wstrMenuItemName, L"Auto&LISP Example");
  65.                 _tcscpy(wstrMenuItemMacro, L"(prin1 /"Hello/") ");
  66.             #else  // !UNICODE
  67.                 MultiByteToWideChar(CP_ACP, 0, "Auto&LISP Example", -1, wstrMenuItemName, 256);
  68.                 MultiByteToWideChar(CP_ACP, 0, "(prin1 /"Hello/") ", -1, wstrMenuItemMacro, 256);
  69.             #endif // !UNICODE
  70.             VariantInit(&index);
  71.             V_VT(&index) = VT_I4;
  72.             V_I4(&index) = 2;
  73.             pPopUpMenu->AddMenuItem(index, wstrMenuItemName, wstrMenuItemMacro, &pPopUpMenuItem);
  74.             VariantInit(&index);
  75.             V_VT(&index) = VT_I4;
  76.             V_I4(&index) = numberOfMenus - 2;
  77.             pPopUpMenu->InsertInMenuBar(index);
  78.    
  79.             pPopUpMenuItem->Release();
  80.             bIsMenuLoaded = true;
  81.         } else {
  82.             acutPrintf(_T("/nMenu not created."));
  83.         }
  84.     } else {
  85.         VariantInit(&index);
  86.         V_VT(&index) = VT_BSTR;
  87.         V_BSTR(&index) = wstrMenuName;
  88.         pPopUpMenus->RemoveMenuFromMenuBar(index);
  89.         VariantClear(&index);
  90.         bIsMenuLoaded = false;
  91.     }
  92.     pPopUpMenus->Release();
  93. }
  94. 二 C++基于MFC的
  95. void
  96. addMenuThroughMfcCom()
  97. {
  98.     TRY
  99.     {
  100.         CAcadApplication IAcad(acedGetAcadWinApp()->GetIDispatch(TRUE));
  101.         CAcadMenuBar IMenuBar(IAcad.get_MenuBar());
  102.         long numberOfMenus;
  103.         numberOfMenus = IMenuBar.get_Count();
  104.         CAcadMenuGroups IMenuGroups(IAcad.get_MenuGroups());
  105.         VARIANT index;
  106.         VariantInit(&index);
  107.         V_VT(&index) = VT_I4;
  108.         V_I4(&index) = 0;
  109.         CAcadMenuGroup IMenuGroup(IMenuGroups.Item(index));
  110.         CAcadPopupMenus IPopUpMenus(IMenuGroup.get_Menus());
  111.         CString cstrMenuName = _T("AsdkComAccess");
  112.         VariantInit(&index);
  113.         V_VT(&index) = VT_BSTR;
  114.         V_BSTR(&index) = cstrMenuName.AllocSysString();
  115.         IDispatch* pDisp=NULL;
  116.         //see if the menu is already there
  117.         TRY{pDisp = IPopUpMenus.Item(index); pDisp->AddRef();} CATCH(COleDispatchException,e){}END_CATCH;
  118.         if (pDisp==NULL) {
  119.             //create it
  120.             CAcadPopupMenu IPopUpMenu(IPopUpMenus.Add(cstrMenuName));
  121.             VariantInit(&index);
  122.             V_VT(&index) = VT_I4;
  123.             V_I4(&index) = 0;
  124.             IPopUpMenu.AddMenuItem(index, _T("&Add A ComCircle"), _T("_AsdkMfcComCircle "));
  125.             VariantInit(&index);
  126.             V_VT(&index) = VT_I4;
  127.             V_I4(&index) = 1;
  128.             IPopUpMenu.AddSeparator(index);
  129.             VariantInit(&index);
  130.             V_VT(&index) = VT_I4;
  131.             V_I4(&index) = 2;
  132.             IPopUpMenu.AddMenuItem(index, _T("Auto&LISP Example"), _T("(prin1 /"Hello/") "));
  133.             pDisp = IPopUpMenu.m_lpDispatch;
  134.             pDisp->AddRef();
  135.         }
  136.         CAcadPopupMenu IPopUpMenu(pDisp);
  137.         if (!IPopUpMenu.get_OnMenuBar())
  138.         {
  139.             VariantInit(&index);
  140.             V_VT(&index) = VT_I4;
  141.             V_I4(&index) = numberOfMenus - 2;;
  142.             IPopUpMenu.InsertInMenuBar(index);
  143.         }
  144.         else
  145.         {
  146.             VariantInit(&index);
  147.             V_VT(&index) = VT_BSTR;
  148.             V_BSTR(&index) = cstrMenuName.AllocSysString();
  149.             IPopUpMenus.RemoveMenuFromMenuBar(index);
  150.             VariantClear(&index);
  151.         }
  152.         pDisp->Release();
  153.     }
  154.     CATCH(COleDispatchException,e)
  155.     {
  156.         e->ReportError();
  157.         e->Delete();
  158.     }
  159.     END_CATCH;
  160. }
  161. 三 C#基于COM接口
  162. using  System;
  163. using  System.Collections.Generic;
  164. using  System.Text;
  165. using  System.Diagnostics;
  166. using  System.Runtime.InteropServices;
  167. using  Autodesk.AutoCAD.Interop;
  168. using  Autodesk.AutoCAD.Interop.Common;
  169. using  Autodesk.AutoCAD.ApplicationServices;
  170. using  Autodesk.AutoCAD.Runtime;
  171. namespace  CSharpCOM
  172. {
  173.     public class Class1
  174.     {
  175.         public Class1() { }
  176.         [CommandMethod("AM")]
  177.         public static void AddMenuCom()
  178.         {
  179.             AcadApplication app = (AcadApplication)Marshal.GetActiveObject("AutoCAD.Application.17");
  180.             AcadMenuBar menuBar = app.MenuBar;
  181.             AcadMenuGroup menuGroup = app.MenuGroups.Item(0);
  182.             AcadPopupMenus menus = menuGroup.Menus;
  183.             AcadPopupMenu mymenu = menus.Add("MyMenu");
  184.             mymenu.AddMenuItem(0, "Hello", "hello");
  185.             mymenu.AddSeparator(1);
  186.             mymenu.AddMenuItem(2, "Hello2", "hello");
  187.             AcadPopupMenu ext = mymenu.AddSubMenu(3, "Ext");
  188.             ext.AddMenuItem(0, "Hello", "hello");
  189.             ext.AddSeparator(1);
  190.             ext.AddMenuItem(2, "Hello2", "hello");
  191.             mymenu.InsertInMenuBar(menuBar.Count - 2);
  192.         }
  193.         [CommandMethod("hello")]
  194.         public static void Hello()
  195.         {
  196.             AcadApplication app = (AcadApplication)Marshal.GetActiveObject("AutoCAD.Application.17");
  197.             app.ActiveDocument.Utility.Prompt("Hello/n");
  198.         }
  199.     }
  200. }
  201. 四 CSharp基于ACUI.DLL接口的
  202. //  Copyright 2005-2007 by Autodesk, Inc.
  203. //
  204. // Permission to use, copy, modify, and distribute this software in
  205. // object code form for any purpose and without fee is hereby granted,
  206. // provided that the above copyright notice appears in all copies and
  207. // that both that copyright notice and the limited warranty and
  208. // restricted rights notice below appear in all supporting
  209. // documentation.
  210. //
  211. // AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.
  212. // AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
  213. // MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE.  AUTODESK, INC.
  214. using  System;
  215. using  System.IO;
  216. using  System.Runtime.InteropServices;
  217. using  System.Text;
  218. using  Autodesk.AutoCAD.Runtime;
  219. using  Autodesk.AutoCAD.ApplicationServices;
  220. using  Autodesk.AutoCAD.EditorInput;
  221. using  Autodesk.AutoCAD.DatabaseServices;
  222. using  Autodesk.AutoCAD.Customization;
  223. namespace  CuiSamp
  224. {
  225.     /// <summary>
  226.     /// Summary description for Class1.
  227.     /// </summary>
  228.     public class CuiSamp
  229.     {
  230.         members
  231.         //Default Constructor
  232.         public CuiSamp()
  233.         {
  234.             // retrieve the location of, and open the ACAD Main CUI File
  235.             string mainCuiFile = (string)Application.GetSystemVariable("MENUNAME");
  236.             mainCuiFile += ".cui";
  237.             cs = new CustomizationSection(mainCuiFile);
  238.             string entCuiFile = (string)Application.GetSystemVariable("ENTERPRISEMENU");
  239.             if (entCuiFile.Equals("."))
  240.                 entCsLoaded = false;
  241.             else
  242.             {
  243.                 entCs = new CustomizationSection(entCuiFile);
  244.                 entCsLoaded = true;
  245.             }
  246.             // Code for loading all partial CUI's listed in the main CUI file
  247.             partials = new CustomizationSection[cs.PartialCuiFiles.Count];
  248.             int i = 0;
  249.             foreach (string fileName in cs.PartialCuiFiles)
  250.             {
  251.                 if (File.Exists(fileName))
  252.                 {
  253.                     partials[i] = new CustomizationSection(fileName);
  254.                     i++;
  255.                 }
  256.             }
  257.             numPartialFiles = i;
  258.         }
  259.         // Command: savecui
  260.         // This Command saves all open CUI Files that have been modified
  261.         [CommandMethod("savecui")]
  262.         public void saveCui()
  263.         {
  264.             // Save all Changes made to the CUI file in this session.
  265.             // If changes were made to the Main CUI file - save it
  266.             // If changes were made to teh Partial CUI files need to save them too
  267.             if (cs.IsModified)
  268.                 cs.Save();
  269.             for (int i = 0; i < numPartialFiles; i++)
  270.             {
  271.                 if (partials[i].IsModified)
  272.                     partials[i].Save();
  273.             }
  274.             if (entCsLoaded && entCs.IsModified)
  275.                 entCs.Save();
  276.             // Here we unload and reload the main CUI file so the changes to the CUI file could take effect immediately.
  277.             //string flName = cs.CUIFileBaseName;
  278.             //Application.SetSystemVariable("FILEDIA", 0);
  279.             //Application.DocumentManager.MdiActiveDocument.SendStringToExecute("cuiunload " + flName + " ", false, false, false);
  280.             //Application.DocumentManager.MdiActiveDocument.SendStringToExecute("cuiload " + flName + " filedia 1 ", false, false, false);
  281.             //Application.SetSystemVariable("FILEDIA", 1);
  282.         }
  283.         // Command: addmenu
  284.         // This Command adds a new menu to all workspaces called Custom Menu, which contains 2 sub items
  285.         // The Menu is first added to the Main CUI File and then added to all it's workspaces.
  286.         [CommandMethod("addmenu")]
  287.         public void addMenu()
  288.         {
  289.             if (cs.MenuGroup.PopMenus.IsNameFree("CustomMenu"))
  290.             {
  291.                 System.Collections.Specialized.StringCollection pmAliases = new System.Collections.Specialized.StringCollection();
  292.                 pmAliases.Add("POP12");
  293.                 PopMenu pm = new PopMenu("CustomMenu", pmAliases, "CustomMenu", cs.MenuGroup);
  294.                 addItemsToPM(pm);
  295.                 addMenu2Workspaces(pm);
  296.             }
  297.             else
  298.                 ed.WriteMessage("CustomMenu already Exists/n");
  299.         }
  300.         // Add new Items to a PopMenu
  301.         private void addItemsToPM(PopMenu pm)
  302.         {
  303.             PopMenuItem pmi = new PopMenuItem(pm, -1);
  304.             pmi.MacroID = "ID_AUGI"; pmi.Name = "Autodesk User Group International";
  305.             pmi = new PopMenuItem(pm, -1);
  306.             pmi = new PopMenuItem(pm, -1);
  307.             pmi.MacroID = "ID_CustomSafe"; pmi.Name = "Online Developer Center";
  308.         }
  309.         // Add the menu to all the workspaces
  310.         private void addMenu2Workspaces(PopMenu pm)
  311.         {
  312.             foreach (Workspace wk in cs.Workspaces)
  313.             {
  314.                 WorkspacePopMenu wkpm = new WorkspacePopMenu(wk, pm);
  315.                 wkpm.Display = 1;
  316.             }
  317.         }
  318.         // Command: remmenu
  319.         // This Command deletes the menu added above from the Main CUI File and any
  320.         //  workspaces that it was added to.
  321.         [CommandMethod("remmenu")]
  322.         public void remMenu()
  323.         {
  324.             // Find Index of the desired MenuItem
  325.             // Remove it from all Workspaces that it exists in
  326.             // Omitting this step leaves nasty left-overs in the Workspace files
  327.             // Remove it from the Cui files' Menu List
  328.             PopMenu pm = cs.MenuGroup.PopMenus.FindPopWithAlias("POP12");
  329.             if (pm != null)
  330.             {
  331.                 foreach (Workspace wk in cs.Workspaces)
  332.                 {
  333.                     WorkspacePopMenu wkPm = wk.WorkspacePopMenus.FindWorkspacePopMenu(pm.ElementID, pm.Parent.Name);
  334.                     if (wkPm != null)
  335.                         wk.WorkspacePopMenus.Remove(wkPm);
  336.                 }
  337.                 cs.MenuGroup.PopMenus.Remove(pm);    // Deletes the Menu from ACAD Menu Group
  338.             }
  339.         }
  340.         // Command: addtoolbar
  341.         // Creates a new toolbar called "New Toolbar", and adds it to all workspaces.
  342.         // This toolbar contains a Toolbar control for named view, button for drawing
  343.         // a pline, and a flyout that uses the "Draw" tool bar.
  344.         [CommandMethod("addtoolbar")]
  345.         public void addToolbar()
  346.         {
  347.             Toolbar newTb = new Toolbar("New Toolbar", cs.MenuGroup);
  348.             newTb.ToolbarOrient = ToolbarOrient.floating;
  349.             newTb.ToolbarVisible = ToolbarVisible.show;
  350.             ToolbarControl tbCtrl = new ToolbarControl(ControlType.NamedViewControl, newTb, -1);
  351.             ToolbarButton tbBtn = new ToolbarButton(newTb, -1);
  352.             tbBtn.Name = "PolyLine";
  353.             tbBtn.MacroID = "ID_Pline";
  354.             ToolbarFlyout tbFlyout = new ToolbarFlyout(newTb, -1);
  355.             tbFlyout.ToolbarReference = "DRAW";
  356.             foreach (Workspace wk in cs.Workspaces)
  357.             {
  358.                 WorkspaceToolbar wkTb = new WorkspaceToolbar(wk, newTb);
  359.                 wk.WorkspaceToolbars.Add(wkTb);
  360.                 wkTb.Display = 1;
  361.             }
  362.         }
  363.         // Command: remtoolbar
  364.         // This Command removes the toolbar added above from the Main CUI File and any
  365.         // workspaces that it was added to.
  366.         [CommandMethod("remtoolbar")]
  367.         public void remToolbar()
  368.         {
  369.             Toolbar tbr = cs.MenuGroup.Toolbars.FindToolbarWithName("New Toolbar");
  370.             if (tbr != null)
  371.             {
  372.                 foreach (Workspace wk in cs.Workspaces)
  373.                 {
  374.                     WorkspaceToolbar wkTb = wk.WorkspaceToolbars.FindWorkspaceToolbar(tbr.ElementID, tbr.Parent.Name);
  375.                     if (wkTb != null)
  376.                         wk.WorkspaceToolbars.Remove(wkTb);
  377.                 }
  378.                 cs.MenuGroup.Toolbars.Remove(tbr);    // Deletes the toolbar from ACAD Menu Group
  379.             }
  380.         }
  381.         // Command: cuiall
  382.         // Issuing this command will run the methods to make all changes to the UI
  383.         // This will add the custom menu, toolbar, and shortcut, as well as
  384.         // dock the Properties palette on the right side.
  385.         [CommandMethod("addcui")]
  386.         public void AddMenuAndToobar()
  387.         {
  388.             addMenu();
  389.             addToolbar();
  390.             saveCui();
  391.         }
  392.         [CommandMethod("remcui")]
  393.         public void RemMenuAndToolbar()
  394.         {
  395.             remMenu();
  396.             remToolbar();
  397.             saveCui();
  398.         }
  399.     }
  400. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-27 22:06 , Processed in 0.170725 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表