cad.net开发

最近要做一个cad文件的7参数坐标转换的程序,想基于cad进行二次开发,初次学习。

为了方便快捷开发,基于cad.net进行二次开发,网上查了很多资料,有基于acad等各种,总是遇到这样那样的问题,经过自己研究,最终选择了直接开发命令的方式进行开发,但有时候还是用到acad相关函数,比如将Docmuent转换为AcadDocument进行相关操作等

( Autodesk.AutoCAD.Interop.AcadDocument acadDoc = adoc.GetAcadDocument() as Autodesk.AutoCAD.Interop.AcadDocument;
            acadDoc.SendCommand("zoom e\n");

)。

如果直接用document的SendStringToExecute执行cad命令,由于是异步的,需要等到动态库执行完成才执行命令,不满足我的要求,因此,转换为acad文档进行同步命令执行。

1、开发环境搭建

(1)vs版本:vs2015

(2)cad版本:cad2018

(3)cad.net开发包(2个,objectarx库和.net库):Autodesk_ObjectARX_2018_Win_64_and_32_Bit.sfx.exe,AutoCAD_2018_dotnet_wizards。

开发包可以网上找,也可以官网下载,官网地址为:

https://www.autodesk.com/developer-network/platform-technologies/autocad

官网.net下载如下图(objectarx貌似需要注册才能下载,我是网上下载的,由于网上找的.net库老是不行,所以通过官网下载):

逐次安装以上软件,就可以进行开发了。

2、开发入门

安装完成后,打开vs,就可以新建cad.net的开发了。

在vs中新建项目,选择cad模板,如下图所示:

安装完cad.net才能在模板中选择autocad 2018 plugin in,.net框架选择4.6,完成后,就建立了一个cad插件程序。

新建完成后,主要有两个文件:

myCommands.cs写命令,myPlugin.cs设置插件相关信息。

(1)插件初始化(myPlugin.cs)

比如,我要在插件初始化时检查实际,并在完成后提示插件加载成功等消息,在myPlugin.cs的初始化函数void IExtensionApplication.Initialize()中添加如下代码:

 Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            MyCommands.isLinced = checkTime(2020, 7, 7);
            if (MyCommands.isLinced)
            {
                ed.WriteMessage("\n加载 坐标转换成功!\n坐标转换命令:\n ZBSH\n\n\n");
                load();
            }
            else
            {
                ed.WriteMessage("\n加载 坐标转换 失败!\n时间过期!!!!!!\n");
            }

其中checkTime函数是我自己写的时间许可,检查完后根据需要提示相关信息。

 void IExtensionApplication.Terminate()函数为插件退出执行的函数。

(2)命令编写(myCommands.cs)

在myCommands.cs中加入一个命令,比如新建dwg命令,

[CommandMethod("NewDwg", CommandFlags.Modal)]
        public void NewDwg()
        {
            string tmppath = "acad.dwt";
            DocumentCollection dcol = Application.DocumentManager;   
                  
            Document adoc = dcol.Add(tmppath);
            dcol.MdiActiveDocument = adoc;     
        }

这样在cad中输入“newdwg”命令即可实现新建dwg功能。

(3)执行命令

调试状态下直接F5运行程序(Debug模式),即可调试(通过cad模板新建的项目,已经将调试里面的启动外部程序设置为cad执行程序了,因此不需要自己设置)。

编译完成后,自动打开cad程序。

在cad中输入命令“netload”(每次启动都需要输入该命令,全局设置请百度),

选择生成目录下的dll文件,可显示信息,如下图所示:

然后输入“newdwg”命令,即可新建一个dwg文件。

部署时,通过release编译,加载方式也是一样,打开cad程序,先执行“netload”命令,加载dll文件,然后就可以输入相关命令了。

3、7参数坐标转换

我自己做了一个窗体,选择控制点进行坐标转换(具体转换程序百度)。

[CommandMethod("sh", "zbsh", "zbsh", CommandFlags.Modal | CommandFlags.UsePickSet)]
        public void MyCommand() // This method can have any name
        {
            // Put your command code here
            if (!checkLince())
            {
                return;
            }
            frmZBZH frm = new frmZBZH();
            System.Windows.Forms.IWin32Window w = System.Windows.Forms.Form.FromHandle(Application.MainWindow.Handle);
            frm.Show(w);
        }

写转换代码就和.net写是一样的了。

private void transFromOneFile(string dwgFile, Transform7CSH tf, ref List<string> allNotSupported, bool onlyMove = false)
        {
            if (null == allNotSupported)
            {
                allNotSupported = new List<string>();
            }
            Autodesk.AutoCAD.ApplicationServices.DocumentCollection dcol = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager;
            Autodesk.AutoCAD.ApplicationServices.Document adoc = dcol.Open(dwgFile, false);
            //dcol.MdiActiveDocument = adoc;
            //dcol.MdiActiveDocument = adoc;
            //dcol.MdiActiveDocument.LockDocument();
            adoc.LockDocument();//必须锁定,否则 acTrans.GetObject利用OpenMode.ForWrite会出错
            // adoc = dcol.MdiActiveDocument;
            Database acCurDb = adoc.Database;
            using (Transaction acTrans = acCurDb.TransactionManager.StartOpenCloseTransaction())
            {
                // Open the Block table for read
                BlockTable acBlkTbl;
                acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
                                                OpenMode.ForRead) as BlockTable;

                // Open the Block table record Model space for write
                BlockTableRecord acBlkTblRec;
                acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
                                                OpenMode.ForWrite) as BlockTableRecord;
                List<string> notSupported = new List<string>();
                foreach (ObjectId asObjId in acBlkTblRec)
                {
                    DBObject obj = acTrans.GetObject(asObjId, OpenMode.ForWrite);
                    bool ok = transformEntity(obj, acTrans, tf, onlyMove);
                    if (false == ok)
                    {
                        string strobj = obj.ToString();
                        if (false == notSupported.Contains(strobj))
                        {
                            notSupported.Add(strobj);
                        }
                        if (false == allNotSupported.Contains(strobj))
                        {
                            allNotSupported.Add(strobj);
                        }
                    }
                }
                if (notSupported.Count > 0)
                {
                    txtmsg.AppendText(string.Format("文件\"{0}\"不支持的格式:\n", dwgFile));
                    txtmsg.AppendText(string.Join(";\n", notSupported));
                    txtmsg.AppendText("\n");
                }
                // Commit the changes and dispose of the transaction
                acTrans.Commit();
            }
            // 缩放到视图,用这个才是同步执行
            //Autodesk.AutoCAD.Interop.AcadApplication app = Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication as Autodesk.AutoCAD.Interop.AcadApplication;
            //app.ActiveDocument.SendCommand("zoom e\n");
            Autodesk.AutoCAD.Interop.AcadDocument acadDoc = adoc.GetAcadDocument() as Autodesk.AutoCAD.Interop.AcadDocument;
            acadDoc.SendCommand("zoom e\n");
            // adoc.SendStringToExecute("\003\003zoom\ne\n", false, true, true);//异步执行,需要等到执行完后才执行该命令
            // 关闭
            if (chkCloseDealedFile.Checked)
            {
                //adoc.SendStringToExecute("e\n", false, true, true);
                adoc.CloseAndSave(adoc.Database.Filename);
                adoc.Dispose();
                acCurDb.Dispose();
            }
        }

其中transformEntity()函数,实现实体的坐标转换。

Transform7CSH类是我写的7参数转换的类。

运行界面如下图所示:

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AutoCAD .net开发人员手册中文版 文档介绍: 当前版本为20101128版,为第一个CHM版本,如需更新版本,请及时关注http://www.01vb.com,也可以查看CHM文件中的前言部分的版本通知。 因本版本制作仓促,还有如下不完善的内容。 1、还有一章内容没有翻译完成; 2、目录部分和索引部分还是英文版本,但具体页面中全部是中英文对照(有些在提示中有些在翻译上面)。 本《AutoCAD .NET 开发人员手册》由01VB编程站翻译并提供,版权所有,原英文版本版权归原版权所有者所有。本手册为免费版本,可在网上随意发送,但必须注明出处(01VB编程站及网站链接http://www.01vb.com)及翻译者。 序言 自从 AutoCAD 支持使用 .NET 开发以来,所有关于 .NET 的官方开发资料全部是英文版本,给国内开发者的学习带来了一定的阻碍,为了给广大 .NET 爱好者提供更多方便,于是决定翻译一部分资料。 因本人英文水平及CAD二次开发水平有限,翻译的资料中也许有表达不清楚的地方,请大家谅解,也可以在资料底部找到留言的链接,给我留言或直接点击QQ联系我。 01VB编程站是一个非营利性的网站,但是,网站要生存,必须有经济来源。因此,本人在本手册中的投放了广告,但是,广告都是在正文内容的底部,不影响阅读。原则上我不鼓励大家点击上面的广告,除非真的对广告内容感兴趣。因广告给您带来的不便,还望谅解。 最近一段时间,老婆一直生病,始终没有痊愈,在此,我希望老婆能快点儿好起来, 并想对她说一句:老婆,别哭,好好养病,病痛在你身,也疼在我心。你累了,我会背你;钱花光了,我会去挣,身体是第一位的。如果你也想给我老婆送上祝福,请留言,谢谢!(2010.11.24) 翻译历史 2010年8月中旬 开始,期间由于本人生病,中断了几天,还有部分内容没有翻译完成,仍然在翻译中。 11.6 更新《图层状态管理器的使用》部分。 11.07 更新《文字样式》部分 11.08 更新完《创建和编辑AutoCAD图元》这章。 11.11 更新 《标注的概念》 部分 11.12 更新《创建标注》部分 11.15 更新完 《创建引线和注释》 部分 11.20 更新完《形位公差》 部分 11.24 更新到 《在三维空间中编辑 》 11.28 修正手册中的脚本错误,进行CHM格式文档的制作并在01VB编程站首发。 感谢 《AutoCAD .NET 开发人员手册》的翻译过程得到 明经通道 网站 "明经 AutoCAD.NetApi 群"中许多网友的帮助,像 MCCAD、雪山飞狐、Still等等,另外还有其它人记不清楚了,因为太多太多,总之两个字,谢谢。 版权 本开发人员手册版权属01VB编程站网站所有。 翻译者:黄明新(平凡)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值