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接口
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Diagnostics;
usingSystem.Runtime.InteropServices;
usingAutodesk.AutoCAD.Interop;
usingAutodesk.AutoCAD.Interop.Common;
usingAutodesk.AutoCAD.ApplicationServices;
usingAutodesk.AutoCAD.Runtime;
namespaceCSharpCOM
{
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接口的
相关推荐
### 利用C#进行AutoCAD的二次开发 在当今的计算机辅助设计(CAD)领域,AutoCAD作为一款广泛使用的专业软件,在建筑、机械、电子等多个行业中占据着重要的地位。随着技术的发展,用户对AutoCAD的功能需求也日益增长...
在本文中,我们将深入探讨如何使用C# WinForms来实现与AutoCAD dwg/dxf文件的交互,包括打开、浏览、导出点位坐标、线型信息以及进行图形元素分析的功能。这一技术对于进行CAD软件的二次开发尤其重要,能够帮助...
在C#编程环境中,开发一个应用来搜索本地计算机上安装的AutoCAD版本并实现.NET程序随CAD启动自动加载,涉及到的知识点主要包括C#语言基础、Windows注册表操作以及.NET Framework的自动化集成。以下是对这些知识点的...
在AutoCAD二次开发过程中,一般都是开发自定义的命令,然后在菜单栏/工具栏/菜单面板中添加对应的菜单,通过点击菜单调用开发的命令。 对于实现以上问题,传统的做法就是在二次开发类库中开发一个命令方法,并且...
- 测试新的启动脚本是否有效,重新启动AutoCAD。如果DLL成功加载,你应该能看到预期的功能。 - 部署到其他机器时,确保`acad.lsp`和`acad.pgp`文件以及DLL被正确地复制到相应位置,并根据需要修改注册表。 请注意...
在AutoCAD的二次开发中,动态加载C# DLL库可以通过反射(Reflection)机制实现,这样即使在调试过程中修改了DLL,也无需重新启动AutoCAD,只需重新加载库即可看到修改的效果。 Gcode,或者称为RS-274,是一种通用的...
### AUTOCAD C#二次开发知识点总结 #### 一、AUTOCAD二次开发概述 - **定义**: AUTOCAD二次开发是指在AUTOCAD的基础上,利用AUTOCAD提供的API接口或者开发工具,对AUTOCAD的功能进行扩展或定制,以满足特定需求的...
这通常涉及到生成DLL文件,并将其放置在AutoCAD的启动目录或加载到AutoCAD的启动组中。 10. **调试与测试**: 使用Visual Studio或其他调试工具,对代码进行调试和测试,确保在不同环境下都能正确运行和响应命令行...
《AutoCAD .NET开发指南-2012版》是一本深入探讨如何使用C#和VB.NET编程语言与AutoCAD进行交互的专业书籍。这本指南旨在帮助开发者掌握利用.NET Framework来扩展AutoCAD的功能,实现自定义化设计和自动化工作流程。 ...
.net C# 二次开发 AutoCAD 本节我们将学习如何使用 C# 开发 AutoCAD 二次开发的 Hello World 程序。我们将学习如何使用 Visual Studio .NET 创建一个新的类库工程,并使用 ObjectARX .NET 封装类来访问 AutoCAD。 ...
c#实时操作CAD文件,运用链接库的方式,实时打开和关闭CAD文件
部署时,需要将编译后的DLL文件和相关的配置文件(如addin.xml)放到AutoCAD的相应目录下,使插件在启动时自动加载。 这个压缩包中的代码实例可能涵盖了以上提到的一些或全部知识点,通过学习和实践这些代码,...