`
isiqi
  • 浏览: 16488336 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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接口

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接口的

//Copyright2005-2007byAutodesk,Inc.
//
//Permissiontouse,copy,modify,anddistributethissoftwarein
//objectcodeformforanypurposeandwithoutfeeisherebygranted,
//providedthattheabovecopyrightnoticeappearsinallcopiesand
//thatboththatcopyrightnoticeandthelimitedwarrantyand
//restrictedrightsnoticebelowappearinallsupporting
//documentation.
//
//AUTODESKPROVIDESTHISPROGRAM"ASIS"ANDWITHALLFAULTS.
//AUTODESKSPECIFICALLYDISCLAIMSANYIMPLIEDWARRANTYOF
//MERCHANTABILITYORFITNESSFORAPARTICULARUSE.AUTODESK,INC.
using<spa
分享到:
评论

相关推荐

    利用C#进行AutoCAD的二次开发

    ### 利用C#进行AutoCAD的二次开发 在当今的计算机辅助设计(CAD)领域,AutoCAD作为一款广泛使用的专业软件,在建筑、机械、电子等多个行业中占据着重要的地位。随着技术的发展,用户对AutoCAD的功能需求也日益增长...

    C#winfrm-打开AutoCAD dwg/dxf文件并导出点位坐标及线型信息。

    在本文中,我们将深入探讨如何使用C# WinForms来实现与AutoCAD dwg/dxf文件的交互,包括打开、浏览、导出点位坐标、线型信息以及进行图形元素分析的功能。这一技术对于进行CAD软件的二次开发尤其重要,能够帮助...

    C#实现搜索出本机安装的AutoCAD

    在C#编程环境中,开发一个应用来搜索本地计算机上安装的AutoCAD版本并实现.NET程序随CAD启动自动加载,涉及到的知识点主要包括C#语言基础、Windows注册表操作以及.NET Framework的自动化集成。以下是对这些知识点的...

    C#二次开发AutoCAD动态加载自定义菜单和命令 .pdf

    在AutoCAD二次开发过程中,一般都是开发自定义的命令,然后在菜单栏/工具栏/菜单面板中添加对应的菜单,通过点击菜单调用开发的命令。 对于实现以上问题,传统的做法就是在二次开发类库中开发一个命令方法,并且...

    AutoCAD二次开发(C#)完成后,如何实现CAD启动时自动加载dll(不必输入netload)?

    - 测试新的启动脚本是否有效,重新启动AutoCAD。如果DLL成功加载,你应该能看到预期的功能。 - 部署到其他机器时,确保`acad.lsp`和`acad.pgp`文件以及DLL被正确地复制到相应位置,并根据需要修改注册表。 请注意...

    AutoCAD二次开发,C#建DLL库,加WPF库及调用

    在AutoCAD的二次开发中,动态加载C# DLL库可以通过反射(Reflection)机制实现,这样即使在调试过程中修改了DLL,也无需重新启动AutoCAD,只需重新加载库即可看到修改的效果。 Gcode,或者称为RS-274,是一种通用的...

    AUTOCAD C#二次开发

    ### AUTOCAD C#二次开发知识点总结 #### 一、AUTOCAD二次开发概述 - **定义**: AUTOCAD二次开发是指在AUTOCAD的基础上,利用AUTOCAD提供的API接口或者开发工具,对AUTOCAD的功能进行扩展或定制,以满足特定需求的...

    【这个不是C#代码】AutoCAD二次开发-监听命令行内容

    这通常涉及到生成DLL文件,并将其放置在AutoCAD的启动目录或加载到AutoCAD的启动组中。 10. **调试与测试**: 使用Visual Studio或其他调试工具,对代码进行调试和测试,确保在不同环境下都能正确运行和响应命令行...

    《AutoCAD .NET开发指南-2012版》_C#和VB.NET

    《AutoCAD .NET开发指南-2012版》是一本深入探讨如何使用C#和VB.NET编程语言与AutoCAD进行交互的专业书籍。这本指南旨在帮助开发者掌握利用.NET Framework来扩展AutoCAD的功能,实现自定义化设计和自动化工作流程。 ...

    .net C#二次开发AutoCAD

    .net C# 二次开发 AutoCAD 本节我们将学习如何使用 C# 开发 AutoCAD 二次开发的 Hello World 程序。我们将学习如何使用 Visual Studio .NET 创建一个新的类库工程,并使用 ObjectARX .NET 封装类来访问 AutoCAD。 ...

    c#操作CAD(实时打开关闭)

    c#实时操作CAD文件,运用链接库的方式,实时打开和关闭CAD文件

    c# AutoCAD二次开发实例

    部署时,需要将编译后的DLL文件和相关的配置文件(如addin.xml)放到AutoCAD的相应目录下,使插件在启动时自动加载。 这个压缩包中的代码实例可能涵盖了以上提到的一些或全部知识点,通过学习和实践这些代码,...

Global site tag (gtag.js) - Google Analytics