天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 31|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

    积分
    1308
    QQ
    发表于 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. }
    复制代码

     

     

     

     

    C++和CSharp增加AutoCAD的菜单menu
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-11-1 10:26 , Processed in 0.151950 second(s), 25 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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