C#启动AutoCAD

void
addMenuThroughCom()
{

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

HRESULThr
=NOERROR;
LPUNKNOWNpUnk
=NULL;
LPDISPATCHpAcadDisp
=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();
longnumberOfMenus;
pMenuBar
->get_Count(&numberOfMenus);
pMenuBar
->Release();

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

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

pMenuGroup
->get_Menus(&pPopUpMenus);
pMenuGroup
->Release();

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

//Enablesthemenutobeloaded/unloadedwiththesamecommand.
if(!bIsMenuLoaded){
pPopUpMenus
->Add(wstrMenuName,&pPopUpMenu);

if(pPopUpMenu!=NULL){

WCHARwstrMenuItemName[
256];
WCHARwstrMenuItemMacro[
256];
#ifdefUNICODE
_tcscpy(wstrMenuItemName,L
"&AddAComCircle");
_tcscpy(wstrMenuItemMacro,L
"AsdkComCircle");
#else//!UNICODE
MultiByteToWideChar(CP_ACP,
0,"&AddAComCircle",-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);

#ifdefUNICODE
_tcscpy(wstrMenuItemName,L
"Auto&LISPExample");
_tcscpy(wstrMenuItemMacro,L
"(prin1\"Hello\")");
#else//!UNICODE
MultiByteToWideChar(CP_ACP,
0,"Auto&LISPExample",-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(
"\nMenunotcreated."));
}

}
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
{
CAcadApplicationIAcad(acedGetAcadWinApp()
->GetIDispatch(TRUE));

CAcadMenuBarIMenuBar(IAcad.get_MenuBar());

longnumberOfMenus;
numberOfMenus
=IMenuBar.get_Count();

CAcadMenuGroupsIMenuGroups(IAcad.get_MenuGroups());

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

CAcadMenuGroupIMenuGroup(IMenuGroups.Item(index));

CAcadPopupMenusIPopUpMenus(IMenuGroup.get_Menus());

CStringcstrMenuName
=_T("AsdkComAccess");

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

IDispatch
*pDisp=NULL;

//seeifthemenuisalreadythere
TRY{pDisp=IPopUpMenus.Item(index);pDisp->AddRef();}CATCH(COleDispatchException,e){}END_CATCH;

if(pDisp==NULL){
//createit
CAcadPopupMenuIPopUpMenu(IPopUpMenus.Add(cstrMenuName));

VariantInit(
&index);
V_VT(
&index)=VT_I4;
V_I4(
&index)=0;
IPopUpMenu.AddMenuItem(index,_T(
"&AddAComCircle"),_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&LISPExample"),_T("(prin1\"Hello\")"));

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


CAcadPopupMenuIPopUpMenu(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
{
publicclassClass1
{
publicClass1(){}

[CommandMethod(
"AM")]
publicstaticvoidAddMenuCom()
{
AcadApplicationapp
=(AcadApplication)Marshal.GetActiveObject("AutoCAD.Application.17");
AcadMenuBarmenuBar
=app.MenuBar;
AcadMenuGroupmenuGroup
=app.MenuGroups.Item(0);
AcadPopupMenusmenus
=menuGroup.Menus;
AcadPopupMenumymenu
=menus.Add("MyMenu");

mymenu.AddMenuItem(
0,"Hello","hello");
mymenu.AddSeparator(
1);
mymenu.AddMenuItem(
2,"Hello2","hello");
AcadPopupMenuext
=mymenu.AddSubMenu(3,"Ext");
ext.AddMenuItem(
0,"Hello","hello");
ext.AddSeparator(
1);
ext.AddMenuItem(
2,"Hello2","hello");
mymenu.InsertInMenuBar(menuBar.Count
-2);
}


[CommandMethod(
"hello")]
publicstaticvoidHello()
{
AcadApplicationapp
=(AcadApplication)Marshal.GetActiveObject("AutoCAD.Application.17");
app.ActiveDocument.Utility.Prompt(
"Hello\n");
}



}

}


四 CSharp基于ACUI.DLL接口的

// Copyright2005-2007byAutodesk,Inc.
//
// Permissiontouse,copy,modify,anddistributethissoftwarein
// objectcodeformforanypurposeandwithoutfeeisherebygranted,
// providedthattheabovecopyrightnoticeappearsinallcopiesand
// thatboththatcopyrightnoticeandthelimitedwarrantyand
// restrictedrightsnoticebelowappearinallsupporting
// documentation.
//
// AUTODESKPROVIDESTHISPROGRAM"ASIS"ANDWITHALLFAULTS.
// AUTODESKSPECIFICALLYDISCLAIMSANYIMPLIEDWARRANTYOF
// MERCHANTABILITYORFITNESSFORAPARTICULARUSE.AUTODESK,INC.
using
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值