现在的位置: 首页 > 综合 > 正文

C#启动AutoCAD

2013年05月11日 ⁄ 综合 ⁄ 共 6241字 ⁄ 字号 评论关闭

void
addMenuThroughCom()
{

    AutoCAD::IAcadApplication 
*pAcad;
    AutoCAD::IAcadMenuBar 
*pMenuBar;
    AutoCAD::IAcadMenuGroups 
*pMenuGroups;
    AutoCAD::IAcadMenuGroup 
*pMenuGroup;
    AutoCAD::IAcadPopupMenus 
*pPopUpMenus;
    AutoCAD::IAcadPopupMenu 
*pPopUpMenu;
    AutoCAD::IAcadPopupMenuItem 
*pPopUpMenuItem;

    HRESULT hr 
= NOERROR;
    LPUNKNOWN pUnk 
= NULL;
    LPDISPATCH pAcadDisp 
= acedGetIDispatch(TRUE); 
    
if(pAcadDisp==NULL)
        
return;

    hr 
= pAcadDisp->QueryInterface(AutoCAD::IID_IAcadApplication,(void**)&pAcad);
    pAcadDisp
->Release();
    
if (FAILED(hr))
        
return;

    pAcad
->put_Visible(true);
    pAcad
->get_MenuBar(&pMenuBar);
    pAcad
->get_MenuGroups(&pMenuGroups);
    pAcad
->Release();
    
long numberOfMenus;
    pMenuBar
->get_Count(&numberOfMenus);
    pMenuBar
->Release();

    VARIANT index;
    VariantInit(
&index);
    V_VT(
&index) = VT_I4;
    V_I4(
&index) = 0;

    pMenuGroups
->Item(index, &pMenuGroup);
    pMenuGroups
->Release();
    
    pMenuGroup
->get_Menus(&pPopUpMenus);
    pMenuGroup
->Release();

    WCHAR wstrMenuName[
256];
    #ifdef UNICODE
        _tcscpy(wstrMenuName, L
"AsdkComAccess");
    
#else  // !UNICODE
        MultiByteToWideChar(CP_ACP, 
0"AsdkComAccess"-1, wstrMenuName, 256); 
    
#endif // !UNICODE

    
// Enables the menu to be loaded/unloaded with the same command.
    if (!bIsMenuLoaded) {
        pPopUpMenus
->Add(wstrMenuName, &pPopUpMenu);

        
if (pPopUpMenu != NULL) {

            WCHAR wstrMenuItemName[
256];
            WCHAR wstrMenuItemMacro[
256];
            #ifdef UNICODE
                _tcscpy(wstrMenuItemName, L
"&Add A ComCircle");
                _tcscpy(wstrMenuItemMacro, L
"AsdkComCircle ");
            
#else  // !UNICODE
                MultiByteToWideChar(CP_ACP, 
0"&Add A ComCircle"-1, wstrMenuItemName, 256); 
                MultiByteToWideChar(CP_ACP, 
0"AsdkComCircle "-1, wstrMenuItemMacro, 256); 
            
#endif // !UNICODE

            VariantInit(
&index);
            V_VT(
&index) = VT_I4;
            V_I4(
&index) = 0;
            pPopUpMenu
->AddMenuItem(index, wstrMenuItemName, wstrMenuItemMacro, &pPopUpMenuItem);

            VariantInit(
&index);
            V_VT(
&index) = VT_I4;
            V_I4(
&index) = 1;
            pPopUpMenu
->AddSeparator(index, &pPopUpMenuItem);

            #ifdef UNICODE
                _tcscpy(wstrMenuItemName, L
"Auto&LISP Example");
                _tcscpy(wstrMenuItemMacro, L
"(prin1 /"Hello/"");
            
#else  // !UNICODE
                MultiByteToWideChar(CP_ACP, 
0"Auto&LISP Example"-1, wstrMenuItemName, 256); 
                MultiByteToWideChar(CP_ACP, 
0"(prin1 /"Hello/""-1, wstrMenuItemMacro, 256); 
            
#endif // !UNICODE

            VariantInit(
&index);
            V_VT(
&index) = VT_I4;
            V_I4(
&index) = 2;
            pPopUpMenu
->AddMenuItem(index, wstrMenuItemName, wstrMenuItemMacro, &pPopUpMenuItem);

            VariantInit(
&index);
            V_VT(
&index) = VT_I4;
            V_I4(
&index) = numberOfMenus - 2;
            pPopUpMenu
->InsertInMenuBar(index);
    
            pPopUpMenuItem
->Release();
            bIsMenuLoaded 
= true;
        }
 else {
            acutPrintf(_T(
"/nMenu not created."));
        }

    }
 else {
        VariantInit(
&index);
        V_VT(
&index) = VT_BSTR;
        V_BSTR(
&index) = wstrMenuName;
        pPopUpMenus
->RemoveMenuFromMenuBar(index);
        VariantClear(
&index);
        bIsMenuLoaded 
= false;
    }


    pPopUpMenus
->Release();
}

二 C++基于MFC的

void
addMenuThroughMfcCom()
{
    TRY
    
{
        CAcadApplication IAcad(acedGetAcadWinApp()
->GetIDispatch(TRUE));

        CAcadMenuBar IMenuBar(IAcad.get_MenuBar());

        
long numberOfMenus;
        numberOfMenus 
= IMenuBar.get_Count();

        CAcadMenuGroups IMenuGroups(IAcad.get_MenuGroups());

        VARIANT index;
        VariantInit(
&index);
        V_VT(
&index) = VT_I4;
        V_I4(
&index) = 0;

        CAcadMenuGroup IMenuGroup(IMenuGroups.Item(index));

        CAcadPopupMenus IPopUpMenus(IMenuGroup.get_Menus());

        CString cstrMenuName 
= _T("AsdkComAccess");

        VariantInit(
&index);
        V_VT(
&index) = VT_BSTR;
        V_BSTR(
&index) = cstrMenuName.AllocSysString();

        IDispatch
* pDisp=NULL;

        
//see if the menu is already there
        TRY{pDisp = IPopUpMenus.Item(index); pDisp->AddRef();} CATCH(COleDispatchException,e){}END_CATCH;

        
if (pDisp==NULL) {
            
//create it
            CAcadPopupMenu IPopUpMenu(IPopUpMenus.Add(cstrMenuName));

            VariantInit(
&index);
            V_VT(
&index) = VT_I4;
            V_I4(
&index) = 0;
            IPopUpMenu.AddMenuItem(index, _T(
"&Add A ComCircle"), _T("_AsdkMfcComCircle "));

            VariantInit(
&index);
            V_VT(
&index) = VT_I4;
            V_I4(
&index) = 1;
            IPopUpMenu.AddSeparator(index);

            VariantInit(
&index);
            V_VT(
&index) = VT_I4;
            V_I4(
&index) = 2;
            IPopUpMenu.AddMenuItem(index, _T(
"Auto&LISP Example"), _T("(prin1 /"Hello/""));

            pDisp 
= IPopUpMenu.m_lpDispatch;
            pDisp
->AddRef();
        }


        CAcadPopupMenu IPopUpMenu(pDisp);
        
if (!IPopUpMenu.get_OnMenuBar())
        
{
            VariantInit(
&index);
            V_VT(
&index) = VT_I4;
            V_I4(
&index) = numberOfMenus - 2;;
            IPopUpMenu.InsertInMenuBar(index);
        }

        
else
        
{
            VariantInit(
&index);
            V_VT(
&index) = VT_BSTR;
            V_BSTR(
&index) = cstrMenuName.AllocSysString();
            IPopUpMenus.RemoveMenuFromMenuBar(index);
            VariantClear(
&index);
        }

        pDisp
->Release();
    }

    CATCH(COleDispatchException,e)
    
{
        e
->ReportError();
        e
->Delete();
    }

    END_CATCH;
}

三 C#基于COM接口

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;

using Autodesk.AutoCAD.Interop;
using Autodesk.AutoCAD.Interop.Common;

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Runtime;

namespace CSharpCOM
{
    
public class Class1
    
{
        
public Class1() { }

        [CommandMethod(
"AM")]
        
public static void AddMenuCom()
        
{
            AcadApplication app 
= (AcadApplication)Marshal.GetActiveObject("AutoCAD.Application.17");
            AcadMenuBar menuBar 
= app.MenuBar;
            AcadMenuGroup menuGroup 
= app.Me

抱歉!评论已关闭.