Tool- IFoxCAD
[删除(380066935@qq.com或微信通知)]
IFoxCAD: 基于.NET的Cad二次开发类库 (gitee.com)
IFoxCAD
释义
IFox中:
IF:为Inspire Function(中文名:跃动方程)的首字母缩写
Fox:起初 雪山飞狐(又狐哥) 在明经论坛发布了开源库,后来狐哥自己的项目进行了极大的丰富后形成NFox类库。
在 落魄山人(又小山山) 开始学习c#开发后,由于这个人过于懒,不想自己写基础的函数了,所以厚颜无耻的跟狐哥要来了 NFox 的源码。
在学习了一阵源码后,发现狐哥的代码惊天地,泣鬼神,惊为天人,直接跪服,从此成为狐哥的脑残粉。
为不使明珠蒙尘,特向狐哥申请是否可以开源,经原作者狐哥同意,正式发布 NFox 开源类库。
后来本人多次二逼操作后, NFox 莫名无法运行,找不到原因,以及原代码嵌套引用多,逻辑复杂,痛定思痛,遂放弃 NFox 的开发,基于 NFox 重构为 IFox ,重新发布开源项目,取名为
IF+Fox=IFox
,一语双关,简洁而不简单。当然这些都是掩饰,其实就是 I(爱)Fox(狐哥) 。
Inspire Function(中文名:跃动方程)及 IFoxCad 的名字均为小轩轩起名
介绍
基于.NET的Cad二次开发类库。
软件架构及相关说明
编译 IFox 源码工程
由于vs2022抛弃了某几个net版本,所以我们同时安装vs2019和vs2022,然后使用vs2022; 其中的原因是vs2019拥有全部net版本,而vs2022拥有最新的分析器和语法.
让 IFox 作为您的子模块
IFox的jing分支是一个多cad版本分支,您可以利用此作为您的git项目子模块.
子模块是以共享工程
的方式加入到您的工程的,其为IFoxCAD.Cad.Shared
:
千万不要用
IFoxCAD.Cad
内的工程作为引用,否则您将遭遇cad加载失效.一些全局命名空间的缺少,我们也建议您使用全局命名空间来补充, 您只需要按照
IFoxCAD.Cad
的GlobalUsings.cs
文件一样添加就好了.若您使用acad08版本,需要在您的工程中设置
ac2008
和ac2009
(大小写敏感)两个预定义标签. 方能启用08工程中缺少的09工程才有的类. 同时我们在IFoxCAD.Cad
中提供了这两个例子.
IFoxCad 项目模版
可以在vs扩展菜单-管理扩展中搜索ifoxcad,即可安装项目模板。使用项目模版可以方便的创建支持多目标多版本的使用ifoxcad类库的项目和类。如果无法在vs的市场里下载,就去上面的QQ群里下载。
安装教程
- 新建net standard 类库
- 修改项目
.csproj
的TargetFrameworks
为net45,保存重加载项目,这里需要注意和cad版本对照. - 右键项目,管理nuget程序包,搜索ifoxcad,安装最新版就可以了.
使用说明
快速入门
打开vs,新建一个standard类型的类库项目,注意,需要选择类型的时候一定要选standard2.0
双击项目,打开项目文件:
修改项目文件里的
<TargetFramework>netcore2.0</TargetFramework>
为<TargetFrameworks>NET45</TargetFrameworks>
。其中的net45,可以改为NET45以上的标准TFM(如:net45、net46、net47等等)。同时可以指定多版本。具体的详细的教程见 VS通过添加不同引用库,建立多条件编译。在
<PropertyGroup> xxx </PropertyGroup>
中增加<LangVersion>preview</LangVersion>
,主要是为了支持最新的语法,本项目采用了最新的语法编写。项目文件现在的内容类似如下:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net45</TargetFramework> <LangVersion>preview</LangVersion> </PropertyGroup> </Project>
右键项目文件,选择管理nuget程序包。
在nuget程序里搜索ifoxcad,直接选择最新的版本(如果您是 net40 或者 net35 的用户,可以安装 0.1.6 版本),然后点击安装IFoxCAD.Cad,nuget会自动安装ifoxcad依赖的库。(按下图绿色框框里选择浏览,程序包来源选择nuget.org,安装IFoxCAD.Cad包。IFoxCAD.Basal是IFoxCAD.Cad的依赖项会自动安装,如果要开发wpf界面的话,可以安装IFoxCAD.WPF,提供了简单的mvvm支持)
添加引用
using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.DatabaseServices; using IFoxCAD.Cad;
- 添加代码
[CommandMethod("hello")] public void Hello() { using var tr = new DBTrans(); var line1 = new Line(new Point3d(0, 0, 0), new Point3d(1, 1, 0)); tr.CurrentSpace.AddEntity(line1); // 如果您没有添加<LangVersion>preview</LangVersion>到项目文件里的话:按如下旧语法: // using(var tr = new DBTrans()) // { // var line1 = new Line(new Point3d(0, 0, 0), new Point3d(1, 1, 0)); // tr.CurrentSpace.AddEntity(line1); // } }
这段代码就是在cad的当前空间内添加了一条直线。
F6生成,然后打开cad,netload命令将刚刚生成的dll加载。
运行hello命令,然后缩放一下视图,现在一条直线和一个圆已经显示在屏幕上了。
天秀的自动加载与初始化
为了将程序集的初始化和通过写注册表的方式实现自动加载统一设置,减少每次重复的工作量,类裤提供了
AutoRegAssem
抽象类来完成此功能,只要在需要初始化的类继承AutoRegAssem
类,然后实现Initialize()
和Terminate()
两个函数就可以了。 特别强调的是,一个程序集里只能有一个类继承,不管是不是同一个命名空间。但是为了满足开闭原则,使用特性进行分段初始化是目前最佳选择
using Autodesk.AutoCAD.Runtime; using IFoxCAD.Cad; using System; using System.Reflection; /* * 自动执行接口 * 这里必须要实现一次这个接口,才能使用 IFoxInitialize 特性进行自动执行 */ public class CmdINI : AutoRegAssem { // 这里可以写任何普通的函数,也可以写下面 AutoTest 类里的实现了 IFoxInitialize 特性的初始化函数 // 继承AutoRegAssem的主要作用是写注册表用来自动加载dll,同时执行实现了 IFoxInitialize 特性的函数 // 注意这里的自动执行是在cad启动后,加载了dll之后执行,而不是运行命令后执行。 [IFoxInitialize] public void InitOne() { //TODO 您想在加载dll之后自动执行的函数 // 可以随便在哪里类里 可以多次实现 IFoxInitialize 特性 } } //其他的类中的函数: //实现自动接口之后,在任意一个函数上面使用此特性,减少每次改动 CmdINI 类 public class AutoTest { [IFoxInitialize] public void Initialize() { //TODO 您想在加载dll之后自动执行的函数 } [IFoxInitialize] public void InitTwo() { //TODO 您想在加载dll之后自动执行的函数 // 可以随便在哪里类里 可以多次实现 IFoxInitialize 特性 } [IFoxInitialize(isInitialize: false)] // 特性的参数为false的时候就表示卸载时执行的函数 public void Terminate() { //TODO 您想在关闭cad时自动执行的函数 } }
天秀的打开模式提权
由于cad的对象是有打开模式,是否可写等等,为了安全起见,在处理对象时,一般是用读模式打开,然后需要写数据的时候在提权为写模式,然后在降级到读模式,但是这个过程中,很容易漏掉某些步骤,然后cad崩溃。为了处理这些情况,内裤提供了提权类来保证读写模式的有序转换。
using(line.ForWrite()) //开启对象写模式提权事务 { //处理代码 } //关闭事务自动处理读写模式
未完待续。。。。