C# ObjectArx cad二次开发
1 环境搭建:安装CAD 和objectArx库,这里安装的是cad2012和objectArx2010 ,vs是2010
2 新建一个类库项目,引用objectArx安装目录下inc文件夹下的AcDbMgd.dll和AcMgd.dll,这里注意X86和X64系统的区别
3 添加两个类,一个继承IExtensionApplication接口,这个是dll的入口,cad会从这个类加载程序做一些初始化的操作;另外一个可以写自定义的一些cad命令
cad的引用:
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Windows;
using Autodesk.AutoCAD.Interop;
using Autodesk.AutoCAD.Interop.Common;
可以添加程序集目录,方便快速加载,其中两个类,第一个类标识为入口继承IExtensionApplication接口,第二个类为自定义的命令
[assembly: ExtensionApplication(typeof(cadObjArx.CADExetensionCls))]
[assembly: CommandClass(typeof(cadObjArx.CADCommandS))]
代码:
这里只做两个简单的例子,更加深入的需要看cad的开发手册。。。。。
namespace cadObjArx
{
public class CADExetensionCls : IExtensionApplication
{
public void Initialize()
{//加载dll的时候执行相关加载操作 Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
ed.WriteMessage("\n加载cadObjArx\n");
load();
} public void Terminate()
{//这个是推出时执行
Document doc = Application.DocumentManager.MdiActiveDocument;
doc.LockDocument(DocumentLockMode.NotLocked, "", "", false);
}
private void load()
{ //这里添加一个工具条,添加一个按钮绑定下面的InitT命令
//这个是通过引用cad的com组件实现的,需要引用cad的Autodesk.AutoCAD.Interop和Autodesk.AutoCAD.Interop.Common两个com组件,
AcadMenuGroups menugroups = (AcadMenuGroups)Application.MenuGroups;
AcadToolbar toolbar = menugroups.Item().Toolbars.Add("Test");
AcadToolbarItem item = toolbar.AddToolbarButton(toolbar.Count, "InitT", "测试", "InitT\n");
item.SetBitmaps("设置16x16.bmp", "设置32x32.bmp");
toolbar.Dock(AcToolbarDockStatus.acToolbarDockTop);
}
}
public class CADCommandS
{
[CommandMethod("InitT",CommandFlags.Modal)]//特性标识,标识这个是cad命令
public void Init()
{//这里做个测试,命令行中输出一句话,按下上面添加的按钮或者在命令行中输入命令就会被执行
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
ed.WriteMessage("测试init\n"); } [CommandMethod("ListEntities")]
public void ListEntities()
{//这个是遍历当前cad打开的文档中的对象//在命令行中写命令即可执行
Document acDoc = Application.DocumentManager.MdiActiveDocument;
Database acCurDb = acDoc.Database;
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
BlockTable acBlkTbl;
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable; BlockTableRecord acBlkTblRec;
acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
int nCnt = ;
acDoc.Editor.WriteMessage("\nModel space objects: ");
foreach (ObjectId acObjId in acBlkTblRec)
{
acDoc.Editor.WriteMessage("\n" + acObjId.ObjectClass.DxfName +":"+ acObjId.Handle.Value.ToString());
nCnt = nCnt + ;
} if (nCnt == )
{
acDoc.Editor.WriteMessage("\nNo objects found.");
}
else
{
acDoc.Editor.WriteMessage("\nTotal {0} objects.", nCnt);
} }
}
}
}
4 调试,在项目属性中,设置调试->启动外部程序,指定cad的启动路径,指定工作目录为当前程序的生成目录,既可调试。
这里每次调试后,都要在启动cad后,通过netload命令加载dll,比较麻烦,可以在上面的工作目录下添加一个lsp脚本文件cad2012.lsp,里面添加一条加载的语句(command "netload" "cadObjArx.dll")
这样每次启动调试后,cad为自动加载目录下的cadObjArx.dll。可以指定命令行参数为一个dwg文件的路径,这样每次cad会直接打开一个固定文件方便调试
还有一个问题,因为上面引用了两个objectArx的库,系统默认会把这两个库复制到生成目录下,会导致莫名奇妙的加载失败,设置成不输出后,就正常了。
5 部署,可以再建一个可执行程序的项目,通过调用com组件的方式来启动cad和加载dll,也可以用上面那个方式吧lsp脚本文件和要使用的cad文件放在同一目录下,cad为自动执行脚本
下面通过一个控制台程序启动cad并加载dll
        Console.WriteLine("start..");
            string sProgID = "AutoCAD.Application.18.2";
            try
            {
                if (System.Diagnostics.Process.GetProcessesByName("acad").Count() > )//判断当前有没cad在运行
                {
                    Console.WriteLine("获取打开的cad");
                    acApp = (AcadApplication)Marshal.GetActiveObject(sProgID);//获取当前运行的cad对象
                }
                else
                {
                    Console.WriteLine("open cad");
                    acApp = new AcadApplication();//没有直接建一个
                    acApp.Visible = true;
                }
            }
            catch (Exception exc)
            {
                Console.WriteLine(exc.Message);
            }
            if (acApp != null)
            {
                Console.WriteLine("netload begin ");
                try
                {//加载dll
                    string dllPath = @"D:\workspace\test\cadObjArx\bin\Debug\cadObjArx.dll";
                    string sCommand = "(command \"netload\" \"{0}\")\n";
                    dllPath = dllPath.Replace("\\", "\\\\");
                    acApp.ActiveDocument.SendCommand(string.Format(sCommand, dllPath));
                }
                catch (Exception exload)
                {
                    Console.WriteLine("netload err:{0}", exload.Message);
                }
            }
C# ObjectArx cad二次开发的更多相关文章
- C#+ObjectArx CAD二次开发(2)
		
前面开了一个头,这里添加几个功能的实现, //添加图层 private void LoadLayer() { Document acDoc = Application.DocumentManager. ...
 - CAD二次开发起步
		
1 环境搭建(VS 2017 + CAD 2019) CAD版本一般要比VS版本晚两年以上,比如我现在使用VS2017,则CAD要用2019版,至于CAD2018能不能用没试验过,有兴趣的小伙伴可以试 ...
 - Cad 二次开发关于SelectCrossingPolygon和SelectFence返回结果Status为error的小测试
		
CAD2008的二次开发,有个很奇怪的现象,只要你选择的点集不在当前视图上SelectCrossingPolygon和SelectFence返回结果Status就会为error,所以要获取正确的结果, ...
 - CAD二次开发
		
用C#有一段时间了,由于单位需要,开始接触CAD二次开发,网上一搜,加入CAD开发的群,零零碎碎看了一些文章和博客,没有系统地的知识,能解决一些小问题.最近开始系统学习,再次推荐两本书,一本事纸质版的 ...
 - 推荐两个不错的CAD二次开发(.Net)手册
		
推荐两个不错的CAD二次开发(.Net)手册 http://www.mjtd.com/helpcenter/netguide/index.html http://www.ceesky.com/book ...
 - CAD 二次开发 -- 自动加载开发的DLL
		
CAD二次开发可以采用写扩展DLL的方式实现.该DLL的函数可以被CAD调用. 但是调用前,必须用命令netload 将该dll加载到CAD. 其实可以修改注册表,当CAD软件启动后,自动加载扩展DL ...
 - C#进行CAD二次开发环境配置
		
最近被公司分配到了做CAD二次开发.也是初次接触这方面的东西,其实是有些无从下手的感觉.因为公司这边也没有人有时间带我,只能是自己看书,然后再写一些Demo,再结合实际的应用来一点点的学习.废话不多说 ...
 - CAD二次开发中浮动面板不浮动的问题
		
CAD二次开发中创建了一个浮动面板,想让它创建出来后以浮动状态显示, 但是DockSides.None设置完后,面板还是不浮动.搞了很久,最后原来是 需要先设置Visible,再设置DockSides ...
 - CAD二次开发控件,dwg控件,网页DWG控件,手机浏览编辑DWG控件
		
梦想绘图插件5.2(MxDraw5.2) 是国内最强,最专业的CAD开发插件(控件),不需要AutoCAD就能独立运行. 控件使用VC 2010开发,具有30万行代码规模,最早从2007年第一个版本完 ...
 
随机推荐
- 3.mouseenter和mouseover事件的区别
			
<html> <head> <meta charset="UTF-8"> <script src="jquery-3.3.1.j ...
 - 构建docker镜像
			
一.通过docker commit命令构建镜像 docker commit 构建镜像可以想象为是将运行的镜像进行重命名另存一份.我们先创建一个容器,并在容器里做出修改,就像修改代码一样,最后再将修改提 ...
 - 数据库分库分表配置sharding-jdbc
			
@Bean(name = "shardingDataSource", destroyMethod = "close") @Qualifier("sha ...
 - javascript高级程序设计---js事件思维导图
			
绘制思维软件与平时用的笔记,以及导出功能,这三个问题综合起来,于是我把思维导图分开画 1.js事件的基本概念 2.js事件的事件处理程序 3.js事件的事件对象
 - python学习之路---day23--模块
			
模块基本小结if __name__ == '__main__':一:import 引入模块模块:是一个包含python定义和声明的文件,文件名就是模块名字加上.py后缀,所有的py文件都可以看成是一个 ...
 - Apache 去掉 www
			
1 用phpstudy的网友打开“其他选项菜单”- “配置文件”-httpd-conf.找到 #LoadModule rewrite_module modules/mod_rewrite.so 把这一 ...
 - C++_代码重用4-多重继承
			
继承使用时要注意,默认是私有派生.所以要公有派生时必须记得加关键字Public. MI(Multi Inheritance)会带来哪些问题?以及如何解决它们? 两个主要问题: 从两个不同的基类继承同名 ...
 - sharepoint_study_4
			
描述:如何向sharepoint自定义列表,新建(编辑)页面的网站栏后,添加一个快捷方式? 如图示: 解决: 1.在SharePoint Designer中打开该自定义列表 2.右键NewForm.a ...
 - SPOJ - DQUERY 莫队
			
题意:给定\(a[1...n]\),\(Q\)次询问,每次统计\([L,R]\)范围内有多少个不同的数字 xjb乱写就A了,莫队真好玩 #include<iostream> #includ ...
 - 前端 s  标签获取值
			
1. s标签获取action中的值: <s:property value="#parameters.mySessionPropKey"/> or <s:prop ...