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参数转换的类。

运行界面如下图所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1380844.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

2022年03月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;双精度浮点数的输入输出 输入一个双精度浮点数&#xff0c;保留8位小数&#xff0c;输出这个浮点数。 时间限制&#xff1a;1000 内存限制&#xff1a;65536 输入 只有一行&#xff0c;一个双精度浮点数。 输出 一行&#xff0c;保留8位小数的浮点数。 样例输…

Michael.W基于Foundry精读Openzeppelin第24期——ERC165Storage.sol

0. 版本 [openzeppelin]&#xff1a;v4.8.3&#xff0c;[forge-std]&#xff1a;v1.5.6 0.1 ERC165Storage.sol Github: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.3/contracts/utils/introspection/ERC165Storage.sol ERC165Storage合约是ERC165…

【Java学习】System.Console使用

背景 在自学《Java核心技术卷1》的过程中看到了对System.Console的介绍&#xff0c;编写下列测试代码&#xff0c; public class ConsoleTest {public static void main(String[] args) {Console cs System.console();String name cs.readLine("AccountInfo: ");…

React UI组件库

1 流行的开源React UI组件库 1 material-ui(国外) 官网: Material UI: React components based on Material Design github: GitHub - mui/material-ui: MUI Core: Ready-to-use foundational React components, free forever. It includes Material UI, which implements Go…

【网约车】 网约车管理解决方案

背景 自2014年7月以来&#xff0c;一些互联网企业陆续推出网络预约出租汽车服务&#xff0c;对于满足社会公众多样化、差异性出行需求发挥了积极作用。面对新一代信息技术的发展与相关行业的快速渗透&#xff0c;行业监管部门要顺应新技术和新应用的发展趋势&#xff0c;从促进…

Python实现微信小程序自动约车

目录 一、Fiddler抓取小程序包 二、分析抓到的包 一、获取全部车辆列表 二、获取班车停靠点 三、Python实现预约车辆 一、获取明天的日期 二、获取班车id 三、获取车辆停靠点 四、Server酱实现消息提示 四、利用宝塔面板&#xff0c;进行定时执行脚本&#xff0c;实现自动约…

微信小程序汽车租赁平台+后台管理系统

《微信小程序汽车租赁平台后台管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序做的汽车租赁前台和Java做的后台管理系统&#xff1a; 微信小程序——汽车租赁前台涉及技术&#xff1a;WXML 和 WXSS、JavaScript Ja…

有没有软件支持批量查询官方界面的快递号码

如果你想做好电子商务或物流行业&#xff0c;你一定不能虎头蛇尾。前端效率不够&#xff0c;必须做好后端的及时跟踪和维护。当大量快递以集中方式发出时&#xff0c;必须及时跟踪物流信息&#xff0c;掌握快递的动态。今天&#xff0c;小编将安利一个实用的辅助查询软件&#…

搭上锂电池公司Livent高速增长的顺风车

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 作为世界上为数不多的拥有完整产业链的锂生产商之一&#xff0c;Livent &#xff08;LTHM&#xff09;处于可以充分利用锂需求繁荣的位置。该公司正在做出明智的资本分配决策&#xff0c;继续扩大其上游和中游产能&#xf…

微信小程序使用物流查询插件

微信小程序使用物流查询插件 文章目录 微信小程序使用物流查询插件添加插件添加成功使用方式声明使用插件引入插件包 效果图 物流查询插件 添加插件 登录微信公众平台后台—>设置—>第三方设置—>添加插件搜索&#xff1a;物流服务 添加成功 使用方式 根据插件的开发…

顺丰快递单号查询接口物流路由跟踪信息快递鸟api对接教程

目录 1.完成前期准备工作2.API接口3.请求参数&#xff08;Headers&#xff09;4.请求参数&#xff08;Body&#xff09;5.返回参数&#xff08;Return&#xff09;6.请求完整报文&#xff08;示例&#xff09;7.成功返回报文&#xff08;示例&#xff09;8.失败返回报文&#x…

同时追踪顺心捷达多个单号物流,并分析派件时效

如何在电脑批量查询顺心捷达单号的信息&#xff1f;并分析派件时效&#xff0c;像派件前、派件后时效&#xff0c;可以分析吗&#xff1f;小编的回答当然是可以的&#xff0c;下面一起用快递批量查询高手来操作。 查询顺心捷达物流 进入快递批量查询高手&#xff0c;在“添加单…

快递查询软件,设置自动跟踪提醒,一键查询物流信息

快递是很多电商行业中相对来说必不可少的一环&#xff0c;因为随着大家的网购&#xff0c;发货量大了起来&#xff0c;快递也就多了&#xff0c;很多人每天可能就需要查询许许多多的快递物流。下面小编给大家分享一个新的技巧&#xff0c;下面一起来试试&#xff0c;希望能给大…

微信小程序 java物流车辆货物托运配送管理系统springboot

框架和微信小程序来完成对系统的设计。整个开发过程首先对货物管理系统小程序进行需求分析&#xff0c;得出货物管理系统小程序主要功能。接着对货物管理系统小程序进行总体设计和详细设计。 随着Internet的发展&#xff0c;人们的日常生活已经离不开网络。未来人们的生活与工…

C++初阶语法——缺省参数

前言&#xff1a;在C语言中&#xff0c;声明或定义函数时形参仅为类型和变量名组成&#xff0c;而在C中我们可以在声明和定义函数时为参数指定一个缺省值。 缺省参数在后面学习默认成员函数中的构造函数和析构函数也很重要。 这里写目录标题 缺省参数1.什么是缺省参数2.全缺省参…

干货|安服工程师技能手册详细总结

目录 &#xff08;一&#xff09;基础网络必备技能 &#xff08;二&#xff09;常见工具的使用 &#xff08;三&#xff09;渗透测试技能 &#xff08;四&#xff09;漏扫技能(报告&#xff0c;修复&#xff0c;独立支撑能力) &#xff08;五&#xff09;应急响应 &#xff08;…

网络安全-安全服务工程师-技能手册详细总结(建议学习収藏)

0x00 技能大纲 &#xff08;一&#xff09;基础网络必备技能 &#xff08;二&#xff09;常见工具的使用 &#xff08;三&#xff09;渗透测试技能 &#xff08;四&#xff09;漏扫技能(报告&#xff0c;修复&#xff0c;独立支撑能力) &#xff08;五&#xff09;应急响应 &am…

养猫日记之如何获得一只喵

坐标北京 第一周 最近这段时间一直想养一只猫咪&#xff0c;就开始各种查哪有卖猫的。 周末先是去了三旗百汇的花鸟鱼虫市场&#xff0c;里面就两三家卖猫的店&#xff0c;其他都是卖鱼的&#xff0c;养的几批鱼全是在那买的…感觉几家店里的猫都太少了&#xff0c;没有挑上合…

【美国大学生数学建模比赛】2020C题(总结和原创参赛论文)百度云请自取

最新想法&#xff1a; 本学期选修了下大数据&#xff0c;发现其实本题的解法还涉及到数据库、大数据各个层次数据处理和分布式数据流blabla&#xff0c;而之前那几天美赛做的还停留在最基础的数据处理层&#xff08;而且我现在觉得如果要做大的话不应该在这个层里面进行深度学…

数学建模之论文

一篇完整的数模论文 包括摘要 (最重要)、问题重述、模型假设和符号说明、模型建立与求解 (最长)、模型的优缺点与改进方法、参考文献和附录。 1. 摘要 (最重要) 论文研究的问题 使用的方法 得到的结果 每一部分的大致步骤。 2. 问题重述 将题目简述一遍即可&#xff0c…