# AutoCAD.EntityTools **Repository Path**: gwhsss/auto-cad.-entity-tools ## Basic Information - **Project Name**: AutoCAD.EntityTools - **Description**: CAD二次开发对实体类做出的扩展... 持续更新... 在我的日常开发中遇到的封装、一些基础的方法、类扩展 ... - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: https://gitee.com/gwhsss - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 3 - **Created**: 2025-01-01 - **Last Updated**: 2026-06-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: cad二次开发nuget库, cad二次开发 ## README ## AutoCAD Entity Tools AutoCAD Entity Tools 是一套功能强大的 AutoCAD 二次开发工具库,提供了丰富的扩展方法和实用工具,帮助初入门开发者更高效地进行 AutoCAD 应用程序开发。 本项目包含了一系列对 AutoCAD 对象模型的扩展,涵盖了实体操作、几何计算、文件处理、界面交互等多个方面,旨在简化常见的 CAD 开发任务,提高开发效率。 ## 安装教程 > dotnet add package AutoCAD.EntityTool --version 1.0.5 [nuget](https://www.nuget.org/packages/AutoCAD.EntityTool/) ![nuget包](Doc/images/nuget.png) ## AutoCAD .NET API 部分 ## 概述 - AutoCAD是一款功能强大的计算机辅助设计软件,由美国Autodesk公司开发。它用于二维和三维设计、绘图,并提供系统工具来创建、浏览、管理、打印、输出、共享和复用富含信息的设计图形。Autodesk公司自1982年成立以来,不断改进和完善AutoCAD系统,并推出多个新版本。AutoCAD已成为全球市场份额领先的CAD系统,在城市规划、建筑、测绘、机械、电子、造船、汽车等众多行业广泛应用。 - AutoCAD每个新版本都带来更新和更强大的功能。例如,AutoCAD设计中心、多文档设计环境、Internet驱动、对象捕捉功能、标注功能以及局部打开和局部加载功能。图纸集功能和字段对象,用于显示图形生命周期中可能修改的数据。动态块功能,允许定义自定义特性,方便在位调整块而无需重新定义或插入另一个块。自动缩放注释和多重引线功能。三维功能,参数化绘图功能,允许建立对象之间的几何关系和约束关系。 ![豪豪豪彡](Doc/images/cad%E7%95%8C%E9%9D%A2.png) - 尽管AutoCAD已经具备协助用户完成各种设计工作的功能,但用户还可以通过Autodesk和众多软件开发商开发的5000多种应用软件,将AutoCAD改造为满足各专业领域要求的专用设计工具。AutoCAD之所以成为全球绘图软件的领导者,主要因为它具有开放的体系结构,允许用户和开发者使用高级编程语言进行扩展和修改(即二次开发),以最大程度地满足用户的特殊需求。 - 从AutoCAD2006开始,Autodesk 为其开发增加了.NET API。:NET API提供了一系列托管的外包类(Managed Wrapper Class),使开发人员可在Microsoft. NET Frame-work下,使用任何支持.NET的语言,如VB. NET、C#和Managed C++等对Auto-CAD进行二次开发。其优点是完全面向对象,在拥有与C++相匹配的强大功能的同时,具有方便易用的特点,是较理想的AutoCAD二次开发工具。 ## DWG数据库 数据库是依照某种数据模型组织起来并存放二级存储器中的数据集合。 CAD技术发展的趋势是参数化、智能化、协同化。信息的集成,牵涉到大量数据的组织与管理,常需要借助于数据库来处理。DWG图纸文件实际上也是对象型数据库,里面的各种数据表 里记录着图形和非图形化的数据对象。 DWG文件实际上是对象型的数据库文件,里面存放着各种符号表与一个命名对象词典,见图所示。 ![豪豪豪彡](Doc/images/database_%E5%AF%B9%E8%B1%A1%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93.png) ## 声明命令 在 ObjectARX 中,“acrxEntryPoint”函数是 ARX 程序的载入点,程序的初始化和清除均可在该函数中进行,命令在入口函数中注册。而在.NET 中只需要将命令注册在一个带[CommandMethod()]属性的类中。如: ```csharp [assembly:CommandClass(typeof(Sample. CommandClass))] namespace Sample { class CommandClass { [CommandMethod(“MyCommand”)] public void MyCommand(){ //命令执行代码 } } } ``` 为加快加载速度,可在命名空间前加人[assembly:CommandClass(typeof(命名空间.类名))]属性描述,在加载程序时AutoCAD将直接注册相应命名空间下的类中的 命令。否则,AutoCAD 将搜索每个类里面注册的命令。 注册命令常用的两种形式: 1) CommandMethodAttribute (string globalName); 2) CommandMethodAttribute (string globalName, CommandFlags flags);其中 CommandFlags 枚举值可以用运算符“||”并联。CommandFlags 枚举值含义: CommandFlags 枚举值 ![豪豪豪彡](Doc/images/CommandFlags%20%E6%9E%9A%E4%B8%BE%E5%80%BC.png) *加载程序后自动运行应用程序的方法:定义命令类实现IExtensionApplication接 口。该接口包含 Initialize 与Terminate 两个函数。其中 Initialize 负责加载程序时的初始化操作,Terminate 则负责进行卸载程序时的清除操作。 ```csharp [assembly:ExtensionApplication(typeof(Sample. CommandClass))] namespace Sample { public class CommandClass:IExtensionApplication { public void Initialize() { //程序加载后立即执行的代码 } public void Terminate(){ } } } ``` 为加快加载速度,可在命名空间前加入[assembly:ExtensionApplication(typeof(命名空间.类名))]属性描述,在加载程序时AutoCAD将直接注册相应命名空间下的类 中的命令。否则 AutoCAD 将搜索 dll 中所有的类以找到实现 IExtensionApplication 接口 的类。 ## AutoCAD .NET API AutoCAD.NET API是 ObjectARX库在.NET 平台的封装,可被 Microsoft.NETFramework 所支持的任何语言访问。托管封装类实现了数据库功能并使可以编制读写 DWG文件的程序。托管封装类同时还提供了对AutoCAD界面元素的访问,包括命令行、特性对话框、AutoCAD编辑器及发布和打印组件。 对象是 AutoCAD.NET API 的主要构造块。每一个对象均精确代表一个 AutoCAD组件,它们之间又组成了不同的程序集和命名空间。AutoCAD.NET API有许多不同类型的对象。直线、圆弧、文字和标注等图形是对象;线型与标注样式等样式设置是对象;图层、组合和块等组织结构是对象;视图和视口等图形显示是对象;甚至DWG数据库里面的关系表、图形文档、AutoCAD应用程序本身也是对象。Application(应用程序)管理文档集合,将 Database(数据库)中的 Entity(实体) 显示在Document(文档)的视图中或将用户对Document(文档)的操作保存回Database(数据库)中。Database(数据库)中存放着各种容器(Symbol Tables-符号表、NameD-ictionaries-命名对象词典),容器中存放着特定的 DbObject(数据库对象)用于记录程序 运行过程中需要的数据。数据库的文件载体为 DWG文件。通过 AutoCAD 提供的二次开发APIs可以利用已定义好的对象及组件管理数据库及封装业务逻辑。 ### AutoCAD .NET 对象联系 ![豪豪豪彡](Doc/images/autocad.net%20%E5%AF%B9%E8%B1%A1%E8%81%94%E7%B3%BB.png) ### AutoCAD .NET 对象派生关系 ![豪豪豪彡](Doc/images/autocad.net%20%E5%AF%B9%E8%B1%A1%E6%B4%BE%E7%94%9F%E5%85%B3%E7%B3%BB.png) ## Autodesk.AutoCAD.ApplicationServices (应用程序服务) ### Application(应用程序) Application对象是 AutoCAD应用程序实例。通过 Application 对象可以获得操作当前应用程序相关的对象。也可以通过其属性及方法设置Auto-CAD程序的参数及系统变量。 ### AutoCAD 应用程序 ![豪豪豪彡](Doc/images/application-cad%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F.png) ### Application 对象关系 ![豪豪豪彡](Doc/images/application%20%E5%AF%B9%E8%B1%A1%E5%85%B3%E7%B3%BB.png) ### Application 属性 ![豪豪豪彡](Doc/images/application%20%E5%B1%9E%E6%80%A71.png) ### Application 方法 ![豪豪豪彡](Doc/images/application%20%E6%96%B9%E6%B3%95.png) ![豪豪豪彡](Doc/images/application%20%E6%96%B9%E6%B3%952.png) ### Application 事件 ![豪豪豪彡](Doc/images/application%20%E4%BA%8B%E4%BB%B6.png) ``` CSharp #region Application /// /// 修改标题 /// /// 标题 public void SetTitle(string title) { Autodesk.AutoCAD.Windows.Window MainWindow = Autodesk.AutoCAD.ApplicationServices.Application.MainWindow; MainWindow.Text = title; } /// /// 修改图标 /// /// 图标路径 public void SetIcon(string fileName) { Autodesk.AutoCAD.Windows.Window MainWindow = Autodesk.AutoCAD.ApplicationServices.Application.MainWindow; MainWindow.SetIcon(new Icon(fileName)); } /// /// 弹出警告框 /// /// 输出消息 public void Alert(string message) { Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(message); } #endregion ``` ## Document(文档) Document(文档)是AutoCAD的图纸文档,是 Database(数据库)的前端显示。应用程序按照一定的规则把 Database(数据库)中的图形信息通过文档显示给用户, 同时用户对 Document(文档)的操作也会写回数据库。 在后台修改数据库的时候为防止前台文档也同时修改所以必须先锁住文档,操作完成后再给文档解锁。一个文档与一个 Database(数据库)一一对应。 AutoCAD 可以同时打开多个文档,但当前文档只有一个。 获取当前文档的方法: Document doc=Autodesk,'AutoCAD.ApplicationServices.Application. DocumentManag er.MdiActiveDocument; ### 文档 ![豪豪豪彡](Doc/images/%E6%96%87%E6%A1%A3.png) ### 对象关系 ![豪豪豪彡](Doc/images/%E5%AF%B9%E8%B1%A1%E5%85%B3%E7%B3%BB.png) ### Document 属性 ![豪豪豪彡](Doc/images/document%20%E5%B1%9E%E6%80%A7.png) ### Document 方法 ![豪豪豪彡](Doc/images/document%20%E6%96%B9%E6%B3%951.png) ![豪豪豪彡](Doc/images/document%20%E6%96%B9%E6%B3%952.png) ### Document 事件 ![豪豪豪彡](Doc/images/document%20%E6%97%B6%E9%97%B4.png) ``` CSharp #region Document - 文档 /// /// 设置文档位置 /// /// 位置 public void SetDocLocation(Point position) { //Application.DocumentManager.MdiActiveDocument.Editor.SetImpliedSelection(new ObjectId[] { Application.DocumentManager.MdiActiveDocument.Database.CurrentSpaceId }); Document acDoc = Application.DocumentManager.MdiActiveDocument; acDoc.Window.WindowState = Window.State.Normal; acDoc.Window.SetLocation(position); } /// /// 设置文档大小 /// /// 大小尺寸 public void SetDocSize(Size size) { Document acDoc = Application.DocumentManager.MdiActiveDocument; acDoc.Window.WindowState = Window.State.Normal; acDoc.Window.SetSize(size); } /// /// 最小化文档 /// public void MinDoc() { Document acDoc = Application.DocumentManager.MdiActiveDocument; acDoc.Window.WindowState = Window.State.Minimized; } /// /// 最大化文档 /// public void MaxDoc() { Document acDoc = Application.DocumentManager.MdiActiveDocument; acDoc.Window.WindowState = Window.State.Maximized; } /// /// 创建一个标准模板纸图文档 /// public void NewDoc() { string strTemplatePath = "acad.dwt"; DocumentCollection acDocMgr = Application.DocumentManager; Document acDoc = acDocMgr.Add(strTemplatePath); acDocMgr.MdiActiveDocument = acDoc; } public void OpenDoc(string strFileName) { DocumentCollection acDocMgr = Application.DocumentManager; if (File.Exists(strFileName)) acDocMgr.Open(strFileName, false); else acDocMgr.MdiActiveDocument.Editor.WriteMessage($"\n文件 {strFileName} 不存在!"); } #endregion ``` ## Group (组) AutoCAD 中Group(组)是对象集合,提供了以组为单位操作实体对象的机制。组在某些方面类似于块,它是另一种将对象编组成命名集的方法, 组中的实体之间不需要具有相同的属性,是一种松散的结构,组合和拆散对组中对象并无性质上的影响。 在组中可以更容易地编辑单个对象,而在块中必须先分解才能编辑。与块不同的是,组不能与其他图形共享。 组可以有名称,也可以是匿名的。组属性可以在“对象编组”对话框中查看、 设置。 ### - ![豪豪豪彡](Doc/images/%E5%AF%B9%E8%B1%A1%E7%BC%96%E8%BE%91.png) ### Group 属性 ![豪豪豪彡](Doc/images/group%20%E5%B1%9E%E6%80%A72.png) ### Group 方法 ![豪豪豪彡](Doc/images/group%20%E6%96%B9%E6%B3%951.png) ![豪豪豪彡](Doc/images/group%20%E6%96%B9%E6%B3%952.png) ![豪豪豪彡](Doc/images/group%20%E6%96%B9%E6%B3%953.png) ![豪豪豪彡](Doc/images/group%20%E6%96%B9%E6%B3%956.png) ## Entity(实体) Entity(实体)是所有可视化对象的基类,定义了可视化对象的成员及实现了图形显示接口,可视化对象都继承它的特性。 ### 实体对象 ![豪豪豪彡](Doc/images/%E5%AE%9E%E4%BD%93%E5%AF%B9%E8%B1%A1.png) ### Entity 属性 ![豪豪豪彡](Doc/images/entity%20%E5%B1%9E%E6%80%A7.png) ### Entity 方法 ![豪豪豪彡](Doc/images/entity%20%E6%96%B9%E6%B3%95.png) ![豪豪豪彡](Doc/images/entity%20%E6%96%B9%E6%B3%952.png) ![豪豪豪彡](Doc/images/entity%20%E6%96%B9%E6%B3%953.png) ![豪豪豪彡](Doc/images/entity%20%E6%96%B9%E6%B3%95%204.png) ![豪豪豪彡](Doc/images/entity%20%E6%96%B9%E6%B3%955.png) ![豪豪豪彡](Doc/images/entity%20%E6%96%B9%E6%B3%956.png) ![豪豪豪彡](Doc/images/entity%20%E6%96%B9%E6%B3%957.png) ## Line(直线) ![豪豪豪彡](Doc/images/line%E7%9B%B4%E7%BA%BF1.png) ### Line属性 ![豪豪豪彡](Doc/images/line%E5%B1%9E%E6%80%A7.png) ### Parameter (0-直线长度) 描述点到直线的距离 ![豪豪豪彡](Doc/images/parameter%20%E6%8F%8F%E8%BF%B0%20%E9%95%BF%E5%BA%A6.png) ## Polyline (三维多段线) ![豪豪豪彡](Doc/images/%E4%B8%89%E7%BB%B4%E5%A4%9A%E6%AE%B5%E7%BA%BF.png) ### Polyline 属性 ![豪豪豪彡](Doc/images/polyline%20%E5%B1%9E%E6%80%A7.png) ### Parameter (0-多段线段数) 描述点在分段中的比例 - 三维多段线 Parameter ![豪豪豪彡](Doc/images/%E4%B8%89%E7%BB%B4%E5%A4%9A%E6%AE%B5%E7%BA%BF%20parameter.png) ### Polyline3d 方法 ![豪豪豪彡](Doc/images/polyline3d%20%E6%96%B9%E6%B3%951.png) ![豪豪豪彡](Doc/images/polyline%203d%20%E6%96%B9%E6%B3%952.png) ![豪豪豪彡](Doc/images/polyline3d%E6%96%B9%E6%B3%953.png) ## Arc (圆弧) ![豪豪豪彡](Doc/images/arc%20%E5%9C%86%E5%BC%A7.png) ### Arc属性 ![豪豪豪彡](Doc/images/arc%20%E5%B1%9E%E6%80%A71.png) ### Parameter (0-2Π)描述点在圆弧上的角度 - Arc 构造函数 ![豪豪豪彡](Doc/images/arc%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## Circle(圆) ![豪豪豪彡](Doc/images/circle%20%E5%9C%86.png) ### Circle 属性 ![豪豪豪彡](Doc/images/circle%20%E5%B1%9E%E6%80%A7.png) ### Parameter (0-2Π)描述点在圆弧上的角度 - Circle 构造函数 ![豪豪豪彡](Doc/images/circle%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## Ellipse (椭圆) ![豪豪豪彡](Doc/images/ellipse%20%E6%A4%AD%E5%9C%86.png) ### Ellipse椭圆 属性 ![豪豪豪彡](Doc/images/ellipse%20%E5%B1%9E%E6%80%A7.png) ![豪豪豪彡](Doc/images/ellipse%20%E5%B1%9E%E6%80%A72.png) ### Parameter (0-2Π)描述点在圆弧上的角度 Ellipse 方法 ![豪豪豪彡](Doc/images/ellipse%20%E6%96%B9%E6%B3%95.png) ### Ellipse 构造函数 ![豪豪豪彡](Doc/images/ellipse%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## Leader (引线) ![豪豪豪彡](Doc/images/leader%20%E5%BC%95%E7%BA%BF.png) ### Leader 属性 ![豪豪豪彡](Doc/images/leader%20%E5%B1%9E%E6%80%A7.png) ### Leader 方法 ![豪豪豪彡](Doc/images/leader%20%E6%96%B9%E6%B3%95.png) ### leader 构造函数 ![豪豪豪彡](Doc/images/leader%20%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## Spline (样条曲线) ![豪豪豪彡](Doc/images/spline%20%E6%A0%B7%E6%9D%A1%E6%9B%B2%E7%BA%BF.png) ### Spline(样条曲线)是经过一系列给定的自然过渡的光滑曲线 - spline 属性 ![豪豪豪彡](Doc/images/spline%20%E5%B1%9E%E6%80%A7.png) ### Spline 方法 ![豪豪豪彡](Doc/images/spline%20%E6%96%B9%E6%B3%951.png) ![豪豪豪彡](Doc/images/spline%20%E6%96%B9%E6%B3%952.png) ### Spline 构造函数 ![豪豪豪彡](Doc/images/spline%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## Xline(构造线) ![豪豪豪彡](Doc/images/%E6%9E%84%E9%80%A0%E7%BA%BF.png) ### Xline 属性 ![豪豪豪彡](Doc/images/xline%E5%B1%9E%E6%80%A7.png) ### Xline 构造函数 ![豪豪豪彡](Doc/images/xline%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## Ray (射线) ![豪豪豪彡](Doc/images/ray%20%E5%B0%84%E7%BA%BF.png) ### Ray 属性 ![豪豪豪彡](Doc/images/ray%20%E5%B1%9E%E6%80%A7.png) ### Ray 构造函数 ![豪豪豪彡](Doc/images/ray%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## DBText (单行文字) ![豪豪豪彡](Doc/images/%E5%8D%95%E8%A1%8C%E6%96%87%E5%AD%97.png) ### DBText 属性 ![豪豪豪彡](Doc/images/dbtext%20%E5%B1%9E%E6%80%A71.png) ![豪豪豪彡](Doc/images/dbtext%E5%B1%9E%E6%80%A72.png) ![豪豪豪彡](Doc/images/dbtext%E5%B1%9E%E6%80%A73.png) ### DBText 方法 ![豪豪豪彡](Doc/images/dbtext%20%E6%96%B9%E6%B3%95.png) ### DBText 构造函数 ![豪豪豪彡](Doc/images/dbtext%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## AttributeDefinition (属性定义) ![豪豪豪彡](Doc/images/attribute%20definition%20%E5%B1%9E%E6%80%A7.png) AttributeDefinition(属性定义)是附加在块对象上的各种文本数据,它是一种特殊的文本对象,可包含用户所需要的各种信息。 当插人图块时,系统将显示或提示输人属性数据。 属性定义可以直接加载到模型空间中显示,也可以通过AttributeReference(属性参照)添加到块参照中随块参照一起显示。 ### AttributeDefinaition 属性 ![豪豪豪彡](Doc/images/attributedefinition%E5%B1%9E%E6%80%A7.png) ### AttributeDefinition 方法 ![豪豪豪彡](Doc/images/attributedefinition%E6%96%B9%E6%B3%95.png) ### AttributeDefinition 构造函数 ![豪豪豪彡](Doc/images/attributedefinition%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%20.png) ## AttributeReference (属性参照) 块定义中的属性定义随块一起显示需要借助于AttributeReference(属性参照)。 ### AttributeReference 属性 ![豪豪豪彡](Doc/images/attribute%20definition%E5%B1%9E%E6%80%A7.png) ![豪豪豪彡](Doc/images/attribute%20definition%20%E5%B1%9E%E6%80%A72.png) ### AttributeReference 方法 ![豪豪豪彡](Doc/images/attributedefinition%20%E6%96%B9%E6%B3%95.png) ### AttributeReference 构造函数 ![豪豪豪彡](Doc/images/attribute%20reference%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## Mtext (多行文字) ![豪豪豪彡](Doc/images/mtext%E5%A4%9A%E8%A1%8C%E6%96%87%E5%AD%97.png) ### Mtext 属性 ![豪豪豪彡](Doc/images/mtext%20%E5%B1%9E%E6%80%A7.png) ![豪豪豪彡](Doc/images/mtext%E5%B1%9E%E6%80%A72.png) ![豪豪豪彡](Doc/images/mtext%E5%B1%9E%E6%80%A73.png) ### Mtext 方法 ![豪豪豪彡](Doc/images/mtext%20%E6%96%B9%E6%B3%951.png) ![豪豪豪彡](Doc/images/mtext%20%E6%96%B9%E6%B3%952.png) ### MText 构造函数 ![豪豪豪彡](Doc/images/mtext%20%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## BlockReference(参照块) ![参照块](Doc/images/%E5%8F%82%E7%85%A7%E5%9D%97.png) BlockReference(块参照)即AutoCAD图纸中的图块实体,作用是把块表中的块表记录赋予实体特性可以添加到模型空间中显示,并可以通过添加AttributeReference(属 性参照)将块定义中的AttributeDefinition(属性定义)随块参照显示。 ### BlockReference 属性 ![豪豪豪彡](Doc/images/blockreference%E5%B1%9E%E6%80%A7.png) ### BlockReference 方法 ![豪豪豪彡](Doc/images/blockreference%20%E6%96%B9%E6%B3%95.png) ### BlockReference 构造函数 ![豪豪豪彡](Doc/images/blockreference%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## Table (表格) ![豪豪彡](Doc/images/%E8%A1%A8%E6%A0%BCtable.png) AutoCAD图纸中常用Table来组织一些明细表、材料表之类的数据。表格是AutoCAD引用的外部数据表以块参照的形式在图形中的显示。 表格的数据与Excl文件连接需要借助DataLink(数据连接器)。 ### Table 属性 ![豪豪豪彡](Doc/images/table%20%E5%B1%9E%E6%80%A7.png) ### Table 方法 ![豪豪豪彡](Doc/images/table%20%E6%96%B9%E6%B3%95.png) ![豪豪豪彡](Doc/images/table%20%E6%96%B9%E6%B3%952.png) ![豪豪豪彡](Doc/images/table%20%E6%96%B9%E6%B3%953.png) ![豪豪豪彡](Doc/images/table%20%E6%96%B9%E6%B3%956.png) ### Table 构造函数 ![豪豪豪彡](Doc/images/table%20%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## Dimension (标注) 在图形设计中,标注是图形尺寸在图纸上的直观反映。一个完整的尺寸对象由尺寸标注线、尺寸界线、尺寸箭头和尺寸文字构成。 Dimension(标注)是AutoCAD中标注的基类。 ### 标注 ![豪豪豪彡](Doc/images/%E6%A0%87%E6%B3%A8.png) ### Dimension 属性 ![豪豪豪彡](Doc/images/dimension%20%E5%B1%9E%E6%80%A7.png) ![豪豪豪彡](Doc/images/dimension%20%E5%B1%9E%E6%80%A72.png) ### Dimension 方法 ![豪豪豪彡](Doc/images/dimension%E6%96%B9%E6%B3%95.png) ## AlignedDimension (对齐标注) ![豪豪豪彡](Doc/images/aligned%20dimension%20%E5%AF%B9%E9%BD%90%E6%A0%87%E6%B3%A8.png) ### AlignedDimension 属性 ![豪豪豪彡](Doc/images/aligned%20dimension%20%E5%B1%9E%E6%80%A71.png) ![豪豪豪彡](Doc/images/aligned%20dimension%E5%B1%9E%E6%80%A72.png) ### AlignedDimension 构造函数 ![豪豪豪彡](Doc/images/aligned%20dimension%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## ArcDimension (弧长标注) ![豪豪豪彡](Doc/images/arc%20dimension%20%E5%BC%A7%E9%95%BF%E6%A0%87%E6%B3%A8.png) ### ArcDimension 属性 ![豪豪豪彡](Doc/images/arcdimension%E5%B1%9E%E6%80%A7.png) ![豪豪豪彡](Doc/images/arcdimension%E5%B1%9E%E6%80%A72.png) ### ArcDimension 构造函数 ![豪豪豪彡](Doc/images/arcdimension%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## RotatedDimension (转角标注) ![豪豪豪彡](Doc/images/rotated%20dimension%20%E8%BD%AC%E8%A7%92%E6%A0%87%E6%B3%A8.png) ### RotatedDimension 属性 ![豪豪豪彡](Doc/images/rotated%20dimension%20%E5%B1%9E%E6%80%A7.png) ### RotatedDimension 构造函数 ![豪豪豪彡](Doc/images/rotated%20dimension%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## DiametricDimension (直径标注) ![豪豪豪彡](Doc/images/diametric%20dimension%20%E7%9B%B4%E5%BE%84%E6%A0%87%E6%B3%A8.png) ### 直径标注2 ![豪豪豪彡](Doc/images/%E7%9B%B4%E5%BE%84%E6%A0%87%E6%B3%A82.png) ### DiametricDimension 属性 ![豪豪豪彡](Doc/images/diameteric%20dimension%20%E5%B1%9E%E6%80%A7.png) ![豪豪豪彡](Doc/images/diametric%20dimension%20%E5%B1%9E%E6%80%A72.png) ### DiametricDimension 构造函数 ![豪豪豪彡](Doc/images/diameteric%20dimension%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## RadialDimension (半径标注) ![豪豪豪彡](Doc/images/radialdimension%20%E5%8D%8A%E5%BE%84%E6%A0%87%E6%B3%A8.png) ![豪豪豪彡](Doc/images/radial%20dimension%20%E5%8D%8A%E5%BE%84%E6%A0%87%E6%B3%A82.png) ### RadialDimension 属性 ![豪豪豪彡](Doc/images/radial%20dimension%20%E5%B1%9E%E6%80%A7.png) ![豪豪豪彡](Doc/images/radial%20dimension%E5%B1%9E%E6%80%A72.png) ### RadialDimension 构造函数 ![豪豪豪彡](Doc/images/radial%20dimension%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## OrdinateDimension (坐标标注) ![豪豪豪彡](Doc/images/ordinate%20dimension%20%E5%9D%90%E6%A0%87%E6%A0%87%E6%B3%A8.png) ### 坐标标注(二) ![豪豪豪彡](Doc/images/ordinate%20dimension%20%E5%9D%90%E6%A0%87%E6%A0%87%E6%B3%A82.png) ### OrdinateDimension 属性 ![豪豪豪彡](Doc/images/ordinate%20dimension%20%E5%B1%9E%E6%80%A7.png) ![豪豪豪彡](Doc/images/ordinate%20dimension%20%E5%B1%9E%E6%80%A72.png) ### OrdinateDimension 构造函数 ![豪豪豪彡](Doc/images/ordinate%20dimension%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## LineAngularDimension2 (角度标注) ![豪豪豪彡](Doc/images/line%20angular%20dimension2%20%E8%A7%92%E5%BA%A6%E6%A0%87%E6%B3%A8.png) ### 标注文字形式 ![豪豪豪彡](Doc/images/lineangular%20dimension%20%E6%A0%87%E6%B3%A8%E6%96%87%E5%AD%97%E5%BD%A2%E5%BC%8F.png) ### LineAngularDimension2 属性 ![豪豪豪彡](Doc/images/lineangular%20dimension2%20%E5%B1%9E%E6%80%A7.png) ### LineAngularDimension2 构造函数 ![豪豪豪彡](Doc/images/lineangulardimension%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## Region (免域) ![豪豪豪彡](Doc/images/region%20%E9%9D%A2%E5%9F%9F.png) 面域是具有物理特性(例如形心或质量中心)的使用形成闭合环的对象创建的二维闭合区域。 环可以由Line、Arc、Ellipse、Circle、Spline、Polyline3d、Polyline2d组合。 组成环的对象必须闭合或通过与其他对象共享端点而形成闭合的区域,面域可用于应用填充 和着色以及分析特性(例如面积),也可以通过布尔运算,求面域之间的交、并、差集,将现有面域组合成单个、复杂的面域。 ### Region 属性 ![豪豪豪彡](Doc/images/region%20%E5%B1%9E%E6%80%A7.png) ### Region 方法 ![豪豪豪彡](Doc/images/region%20%E6%96%B9%E6%B3%95.png) ### Region 构造函数 ![豪豪豪彡](Doc/images/region%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## Surface (表面) ![豪豪豪彡](Doc/images/surface%20%E8%A1%A8%E9%9D%A2.png) Surface(表面)是AutoCAD中所有表面实体的基类。 ### Surface 属性 ![豪豪豪彡](Doc/images/surface%20%E5%B1%9E%E6%80%A7.png) ### Surface 方法 ![豪豪豪彡](Doc/images/surface%20%E6%96%B9%E6%B3%95.png) ## ExtrudedSurface (拉伸表面) ![豪豪豪彡](Doc/images/extruded%20surface%20%E6%8B%89%E4%BC%B8%E8%A1%A8%E9%9D%A2.png) ### ExtrudedSurface 属性 ![豪豪豪彡](Doc/images/extruded%20surface%20%E5%B1%9E%E6%80%A7.png) ![豪豪豪彡](Doc/images/extruded%20surface%20%E5%B1%9E%E6%80%A72.png) ### ExtrudedSurface 方法 ![豪豪豪彡](Doc/images/extruded%20surface%20%E6%96%B9%E6%B3%95.png) ### ExtrudedSurface 构造函数 ![豪豪豪彡](Doc/images/extruded%20surface%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## LoftedSurface(放样表面) ... ## Hatch (填充) ![豪豪豪彡](Doc/images/hatch%20%E5%A1%AB%E5%85%85.png) Hatch(填充)可以更加直观地表现图纸中对象的材质或者图形层次关系。 ### Hatch 属性 ![豪豪豪彡](Doc/images/hatch%20%E5%B1%9E%E6%80%A7.png) ![豪豪豪彡](Doc/images/hatch%20%E5%B1%9E%E6%80%A72.png) ![豪豪豪彡](Doc/images/hatch%20%E5%B1%9E%E6%80%A73.png) ![豪豪豪彡](Doc/images/hatch%20%E5%B1%9E%E6%80%A76.png) ### Hatch 方法 ![豪豪豪彡](Doc/images/hatch%20%E6%96%B9%E6%B3%95.png) ![豪豪豪彡](Doc/images/hatch%20%E6%96%B9%E6%B3%952.png) ## Autodesk.AutoCAD.EditorInput(用户交互) ### Editor (命令行) Editor对象是AutoCAD界面中的命令行。AutoCAD与用户的交互(输入、输出)功能基本输人与输出功能通过Editor对象实现。 ![豪豪豪彡](Doc/images/editor%20%E5%91%BD%E4%BB%A4%E8%A1%8C.png) ### Editor 属性 ![豪豪豪彡](Doc/images/editor%20%E5%B1%9E%E6%80%A7.png) ### Editor 方法 ![豪豪豪彡](Doc/images/editor%20%E6%96%B9%E6%B3%95.png) ![豪豪豪彡](Doc/images/editor%20%E6%96%B9%E6%B3%951.png) ![豪豪豪彡](Doc/images/editor%20%E6%96%B9%E6%B3%953.png) ![豪豪豪彡](Doc/images/editor%20%E6%96%B9%E6%B3%952.png) ![豪豪豪彡](Doc/images/editor%20%E6%96%B9%E6%B3%95%205.png) ![豪豪豪彡](Doc/images/editor%20%E6%96%B9%E6%B3%956.png) ### Editor 事件 ![豪豪豪彡](Doc/images/editor%20%E4%BA%8B%E4%BB%B6.png) ## Jig(Just In Time Graphic即时绘图) Jig(即时绘图)根据用户输入的参数的序列形成图形预览,以便用户可以直观地设计出自己想要的图形。 ### Jig属性 ![豪豪豪彡](Doc/images/jig%E5%B1%9E%E6%80%A7.png) ### Jig 方法 ![豪豪豪彡](Doc/images/jig%20%E6%96%B9%E6%B3%95.png) ## EntityJig (单实体即时绘图) EntityJig(单实体即时绘图)用于实体对象的生成预览。 l.通过Editor.Drag()调用Sampler()方法获得采样数据。 2.通过Sampler()采样函数,读取这个动作的参数(角度、距离或点)。如果构成某对象需要多个步骤,可以通过一个do{}while循环重复调用Editor.Drag()重复采样。 3.每次采样后会自动运行Update()重载函数更新原对象。 4.采样结束后获取基类(EntityJig类)的Entity属性添加到数据库中。 ### EntityJig 过程 ![豪豪豪彡](Doc/images/entity%20jig%20%E8%BF%87%E7%A8%8B.png) ### EntityJig 属性 ![豪豪豪彡](Doc/images/entityjig%20%E5%B1%9E%E6%80%A7.png) ### 方法 ![豪豪豪彡](Doc/images/entityjig%E6%96%B9%E6%B3%95.png) ## DrawJig(拖拽即时绘图) DrawJig(拖拽即时绘图)用于复杂实体的拖动预览。 ### DrawJig 方法 ![豪豪豪彡](Doc/images/draw%20jig%20%E6%96%B9%E6%B3%95.png) ## Autodesk.AutoCAD.Geometry(几何) 几何对象命名空间中包含了几何对象,通过这些几何对象的运算以及几何关系可以很方便地分析图形的几何属性及对对象进行几何变换。 可以很方便地处理复杂的几何运算问题。 ## Vector3d(三维向量) Vector3d(三维向量)是空间中带方向的长度单位,是几何计算中最重要的工具之一,几何对象的移动、旋转、坐标变换等都涉及向量的运算。 Vector3d.Xaxis-X轴方向单位向量(1,0,0)。 Vector3d.Yaxis-Y轴方向单位向量(0,1,0)。 Vector3d.Zaxis-Z轴方向单位向量(0,0,1)。 ### Vector3d 属性 ![豪豪豪彡](Doc/images/vector3d%20%E5%B1%9E%E6%80%A7.png) ## Vector3d 方法 ![豪豪豪彡](Doc/images/vector%203d%20%E6%96%B9%E6%B3%95.png) ![豪豪豪彡](Doc/images/vector3d%20%E6%96%B9%E6%B3%952.png) ![豪豪豪彡](Doc/images/vector3d%20%E6%96%B9%E6%B3%953.png) ### Vector3d 运算符 ![豪豪豪彡](Doc/images/vector3d%20%E8%BF%90%E7%AE%97%E7%AC%A6.png) ### Vector3d 构造函数 ![豪豪豪彡](Doc/images/vector3d%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## Matrix3d(三维矩阵) 三维矩阵用于几何对象的变换操作(平移、旋转、投影、缩放、镜像)。 坐标的变换转换成了矩阵的乘积。 ## 三维矩阵 ![豪豪豪彡](Doc/images/%E4%B8%89%E7%BB%B4%E7%9F%A9%E9%98%B5.png) 注:矩阵前三列指定缩放和旋转,第四列为变换向量。R代表旋转、T代表变换。 ## 坐标变换 ![豪豪豪彡](Doc/images/%E5%9D%90%E6%A0%87%E5%8F%98%E6%8D%A2.png) ### Matrix3d 属性 ![豪豪豪彡](Doc/images/matrix%203d%20%E5%B1%9E%E6%80%A7.png) ### Matrix3d 方法 ![豪豪豪彡](Doc/images/matrxi3d%E6%96%B9%E6%B3%95.png) ### Matrix3d 构造函数 ![豪豪豪彡](Doc/images/matrix%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## Tolerance(容差) Tolerance(容差)表示向量或者点的误差范围,由它可以控制几何运算时的精度。 设定好精度范围后,在一个范围内的向量或者点计算时被视为相等。 ### Tolerance 属性 ![豪豪豪彡](Doc/images/Tolerance%20%E5%B1%9E%E6%80%A7.png) ### Tolerance 构造函数 ![豪豪豪彡](Doc/images/tolerance%20%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## Point3d(三维点) Point3d(三维点)描述三维空间中的点,用于表示空间的一个位置。 ### Point3d 属性 ![豪豪豪彡](Doc/images/Point3d%20%E5%B1%9E%E6%80%A7.png) ### Point3d 方法 ![豪豪豪彡](Doc/images/point3d%20%E6%96%B9%E6%B3%95.png) ![豪豪豪彡](Doc/images/point3d%E6%96%B9%E6%B3%952.png) ![豪豪豪彡](Doc/images/point3d%20%E6%96%B9%E6%B3%953.png) ### Point3d 运算符 ![豪豪豪彡](Doc/images/point3d%20%E8%BF%90%E7%AE%97%E7%AC%A6.png) ### Point3d 构造函数 ![豪豪豪彡](Doc/images/point3d%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.png) ## Ribbon (菜单) ![输入图片说明](Doc/images/ribbon%E8%8F%9C%E5%8D%95%E6%A0%8F.png) ## AutoCAD.EntityTool 部分 ## 项目结构 * **AutoCAD.EntityTools** - 核心库,包含所有 CAD 二次开发工具和扩展方法 * **AutoCAD.EntityTool.Tests** - 功能测试工具集 * **AutoCAD.EntityTools.ConsoleTests** - 控制台测试项目 * **AutoCAD.EntityToolsTests** - 单元测试项目 * **AutoCAD.EntityToolsViewTests** - WPF 界面测试项目 ... [obsolete] 标记方法-不稳定、待测试优化 ## 项目架构 AutoCAD Entity Tools 项目采用模块化设计,主要包括以下几个核心组件: ### 1. 实体操作模块 * **EntityTools** - 实体对象扩展方法,用于实体的创建、修改、查询等操作 - 实体获取:通过ObjectId获取实体(ToObjectIdGetEntity) - 实体操作:实体的移动、复制、旋转等变换操作 - 属性设置:设置实体的颜色、图层、线型等属性 - 批量处理:支持批量实体操作 - 事务管理:结合AutoCAD事务机制进行安全操作 * **LineTools** - 直线处理工具,包括相交、延伸、修剪等功能 - 长度计算:获取直线长度(GetLineLength) - 线段选择:支持用户交互式选择直线(SelectLine) - 平行线距离:计算平行线间的最短距离(CalculateShortestDistanceBetweenParallelLines) - 相交计算:判断直线是否相交及获取交点 - 修剪延伸:直线的修剪和延伸功能 - 几何变换:直线的平移、旋转等操作 * **ArcTools** - 圆弧对象扩展方法,提供圆弧几何计算功能 - 圆弧属性:获取圆弧长度、起始角度、终止角度等(GetArcLength、GetStartAngle、GetEndAngle) - 几何计算:圆弧与直线/圆弧的相交检测 - 圆弧构造:多种方式创建圆弧 - 参数提取:从圆弧中提取几何参数 * **PolylineTools** - 多段线处理工具,支持多段线的创建、编辑、布尔运算等 - 多段线创建:多种方式创建多段线 - 几何计算:计算多段线长度、面积等几何属性 - 点集操作:获取多段线顶点、插入顶点等 - 布尔运算:多段线间的合并、分割、相交等操作 - 转换操作:多段线与其他实体类型的相互转换 * **CurveTools** - 曲线处理工具,支持各种曲线的几何运算 - 曲线属性:获取曲线长度、起点终点等几何属性 - 曲线拟合:样条曲线生成与优化 - 交点计算:曲线间交点计算 - 曲线分割:按指定参数分割曲线 - 几何变换:曲线的平移、旋转、缩放等操作 * **BlockTools** - 块定义和块引用处理工具,支持块的插入、分解、属性修改等 - 块定义:创建和管理块定义(BlockDefinition) - 块插入:按指定位置、比例、旋转角度插入块 - 块属性:获取和修改块属性值 - 块分解:将块参照分解为独立实体 - 块替换:用其他块替换现有块参照 * **TextTools** - 文字对象处理工具 - 文字创建:创建单行和多行文字 - 文字样式:设置文字样式、高度、宽度因子等 - 文字修改:修改文字内容、位置、对齐方式 - 属性提取:从文字对象中提取内容、位置等信息 - 文字查找:按内容、位置等条件查找文字对象 * **DimensionTools** - 尺寸标注处理工具 - 标注创建:创建线性、径向、角度等多种类型尺寸标注 - 标注修改:修改标注文字、位置、样式等属性 - 标注提取:从标注中提取几何信息和数值 - 自动标注:根据几何实体自动生成相应标注 - 标注样式:设置和管理标注样式 ### 2. 几何计算模块 * **PointTools** - 点对象扩展方法,提供坐标计算、距离测量等功能 - 坐标转换:3D点与2D点之间的相互转换(Point3dToPoint2d、Point2dToPoint3d) - 中心点计算:获取两点间中心点、单点中心点等(GetCenterPointInTwoPointBetween、GetTwoPoint3dCenter、MidPoint等) - 几何计算:极坐标点、向量计算、角度计算等(PolarPoint、GetAngleToXAxis) - 点比较:支持容差的点相等判断(IsEqualTo、ArePointsEqual、PointAlmostEquals) - 点运算:点加减运算(Add、Sub) - 共线判断:判断三点是否在同一直线上(IsOnOneLine) - 距离计算:测量两点间距离(MeasureDistance) * **VectorTools** - 向量运算工具 - 向量计算:向量加减乘除、点积、叉积等运算 - 向量变换:向量的旋转、缩放、归一化 - 角度计算:计算向量间夹角 - 向量投影:向量在另一向量上的投影 - 距离计算:基于向量的距离和位置计算 * **UnitTools** - 单位转换和格式化工具 - 单位转换:不同长度、角度单位之间的转换 - 格式化输出:将数值按指定单位格式化输出 - 单位解析:从字符串解析单位值 - 单位设置:设置当前绘图单位 - 精度控制:控制单位显示精度 ### 3. 数据管理模块 * **LayerTools** - 图层管理扩展,支持图层的创建、修改、过滤等操作 - 图层创建:创建新图层并设置属性(CreateOrGetLayer) - 图层获取:获取所有图层名称(GetAllLayerName) - 图层过滤:按条件筛选图层 - 属性设置:设置图层颜色、线宽、状态等属性 - 图层切换:设置当前活动图层 - 图层管理:图层的冻结、锁定、颜色等批量操作 * **EditorTools** - 编辑器扩展,提供用户交互、选择集处理等功能 - 用户交互:获取用户输入的点、数值、字符串等 - 选择集:创建和管理实体选择集 - 选择过滤:按类型、属性等条件过滤选择 - 命令执行:执行AutoCAD命令 - 消息输出:向命令行输出消息 - 事务管理:结合编辑器的事务操作 * **TransactionTools** - 事务管理工具 - 事务控制:开始、提交、回滚事务 - 安全操作:确保数据库操作的安全性 - 批量处理:支持批量实体操作的事务管理 - 错误处理:事务执行过程中的异常处理 - 性能优化:合理使用事务提升性能 ### 4. 用户界面模块 * **ShowMessageTools** - 消息显示工具,提供多种消息框和通知方式 - 消息框:显示不同类型的消息框(信息、警告、错误) - 命令行输出:向AutoCAD命令行输出信息 - 通知窗口:显示临时通知消息 - 进度指示:显示长时间操作的进度 - 调试输出:便于调试的输出功能 * **Ribbon** - 功能区界面工具,包括 RibbonBuilderBase - 界面构建:创建和管理Ribbon功能区界面 - 按钮管理:添加、删除、配置功能区按钮 - 选项卡控制:管理功能区选项卡 - 界面定制:自定义界面外观和行为 - 响应事件:处理界面交互事件 * **PaletteHelper** - 停靠面板管理工具 - 面板创建:创建和初始化停靠面板 - 界面管理:管理面板界面元素 - 位置控制:控制面板停靠位置 - 状态管理:保存和恢复面板状态 - 事件处理:处理面板交互事件 * **Jig** - 包含 CircleJig、LineJig、RectangleJig 等动态绘制工具 - 动态预览:实时显示绘制过程中的实体预览 - 交互绘制:支持用户交互式的动态绘制 - 实体创建:完成绘制后自动创建实体 - 操作反馈:提供绘制过程中的视觉反馈 - 多种形状:支持圆形、直线、矩形等多种形状的动态绘制 ### 5. 系统工具模块 * **CadFileOperationTools** - 文件操作工具,支持 DWG/DXF 文件处理 - 文件保存:支持图形另存为指定路径(SaveAs) - 对象导出:将选定对象导出到新文件(ExportObjectsToFile) - 实体导出:导出实体列表到新文件(ExportEntitiesToFile) - 文件转换:支持不同格式间的转换 - 批量处理:支持批量文件操作 - 文件管理:文件路径管理和文件操作安全管理 * **Convert** - 文件格式转换工具,如 DwgToDxfConverter - DWG转DXF:将DWG格式转换为DXF格式 - DXF转DWG:将DXF格式转换为DWG格式 - 批量转换:支持批量文件格式转换 - 格式兼容:保证转换过程中数据的完整性 - 错误处理:转换过程中的错误处理和日志记录 * **Config** - 配置管理类,包括 ConfigPath 和 ImageHelper - 路径管理:管理应用程序配置文件路径(ConfigPath) - 图像处理:图像加载和处理功能(ImageHelper) - 配置读取:从配置文件读取设置 - 配置保存:保存应用程序配置 - 资源管理:管理应用程序资源文件 * **ExceptionTools** - 异常处理工具 - 异常捕获:统一的异常捕获和处理机制 - 错误报告:生成详细的错误报告信息 - 异常记录:记录异常日志和调试信息 - 错误处理:提供友好的错误处理方案 - 调试支持:协助开发者定位问题 * **RegistryManage** - AutoCAD 注册表管理工具 - 版本检测:检测系统中安装的AutoCAD版本 - 注册表读取:读取AutoCAD注册表信息 - 版本管理:管理不同版本的AutoCAD信息 - 环境配置:配置AutoCAD运行环境 - 信息查询:查询AutoCAD安装和配置信息 * **StringTools** - 字符串处理工具 - 字符串操作:字符串拼接、分割、替换等基本操作 - 格式化处理:字符串格式化和模板处理 - 验证功能:字符串格式验证 - 转换功能:字符串与其他数据类型之间的转换 - 搜索替换:高级字符串搜索和替换功能 * **DoubleTools** - 数值计算和单位转换工具 - 数值计算:浮点数运算和数学函数 - 单位转换:双精度数值的单位转换 - 精度控制:浮点数精度处理 - 数值验证:数值范围和有效性验证 - 数学函数:常用数学计算函数 ### 6. 辅助工具 * **GlobalUsings** - 全局引用配置 - 统一引用:项目中常用的命名空间引用 - 代码简化:减少重复的using语句 - 维护便利:集中管理全局引用 * **Common** - 包含通用工具类,如 RelayCommand - 命令实现:实现MVVM模式中的命令(RelayCommand) - 通用功能:提供项目中通用的辅助功能 - 工具集合:包含各种通用工具类 ### CAD-Versions ``` CSharp R15.0,AutoCAD 2002 R16.0,AutoCAD 2004 R16.1,AutoCAD 2005 R16.2,AutoCAD 2006 R17.0,AutoCAD 2007 R17.1,AutoCAD 2008 R17.2,AutoCAD 2009 R18.0,AutoCAD 2010 R18.1,AutoCAD 2011 R18.2,AutoCAD 2012 R19.0,AutoCAD 2013 R19.1,AutoCAD 2014 R20.0,AutoCAD 2015 R20.1,AutoCAD 2016 R21.0,AutoCAD 2017 R22.0,AutoCAD 2018 R23.0,AutoCAD 2019 R23.1,AutoCAD 2020 R24.0,AutoCAD 2021 R24.1,AutoCAD 2022 R24.2,AutoCAD 2023 R24.3,AutoCAD 2024 ``` ### CAD注册表加载插件方式 ``` CSharp // 创建注册服务实例 var registrationService = new AutoCAD.RegistryManage.AddinRegistrationService(); // 注册插件 bool success = registrationService.RegisterAddin( addinName: "AutoCAD.EntityTool.Tests测试", description: "用于提高工作效率...", filePath: @"D:\Desk\GUO项目文件夹\AutoCADEntityTool\auto-cad.-entity-tools\AutoCAD.EntityTool\AutoCAD.EntityTool.Tests\bin\Debug\AutoCAD.EntityTools.dll" ); // 显示结果 if (success) { Console.WriteLine("注册安装完成,按任意键退出..."); Console.WriteLine("注册完成"); // 假设这是扩展方法 } else { Console.WriteLine("部分或全部安装失败,按任意键退出..."); } ``` ### CAD-lsp加载插件方式 ``` CSharp internal class Program { static void Main(string[] args) { string currentDirectory = Directory.GetCurrentDirectory(); string dllPath = System.IO.Path.Combine(currentDirectory, "AutoCAD.EntityTool.Tests.dll");//要 netload 的 dll string lspFilePath = System.IO.Path.Combine(currentDirectory, "acaddoc.lsp");//support下的acaddoc.lsp文件 // 如果acaddoc.lsp文件存在,则更新文件内容,否则创建新文件 var autocadRegister = new AutoCadRegistry(); var ACAD = autocadRegister.GetAcadSupport_acadLsp("acad2016.lsp"); var insert = false; Console.WriteLine($" {dllPath} - 加载插件路径"); Console.WriteLine($" {lspFilePath} - cad - lsp路径"); if (File.Exists(lspFilePath)) { string[] lspLines = File.ReadAllLines(lspFilePath); for (int i = 0; i < lspLines.Length; i++) { if (lspLines[i].Contains("(command \"netload\"")) { lspLines[i] = $"(command \"netload\" \"{dllPath.Replace("\\", "\\\\")}\")"; insert = autocadRegister.InsertContentWithElevation(ACAD.FirstOrDefault(), lspLines[i]); } else if (lspLines[i].Contains("(command \"Regen\""))//刷新视图 { lspLines[i] = "(command \"Regen\" \" \" \"Regen\" \" \")"; insert = autocadRegister.InsertContentWithElevation(ACAD.FirstOrDefault(), lspLines[i]); } } File.WriteAllLines(lspFilePath, lspLines); } else { File.WriteAllText(lspFilePath, $"(command \"netload\" \"{dllPath.Replace("\\", "\\\\")}\")\n(command \"Regen\" \" \" \"Regen\" \" \")"); insert = autocadRegister.InsertContentWithElevation(ACAD.FirstOrDefault(), $"(command \"netload\" \"{dllPath.Replace("\\", "\\\\")}\")\n(command \"Regen\" \" \" \"Regen\" \" \")"); } if (insert) Console.WriteLine("成功"); else Console.WriteLine("失败"); Console.ReadKey(); } } ``` ## 快速开始 ### 环境要求 * AutoCAD 2015 或更高版本 * .NET Framework 4.5 或更高版本 * Visual Studio 2015 或更高版本 ### 安装方法 通过 NuGet 包管理器安装: ``` dotnet add package AutoCAD.EntityTool --version 1.0.5 ``` 或者在项目文件中直接添加引用: ```xml ``` ![豪豪豪彡](Doc/images/%E5%BF%85%E8%A6%81%E7%9A%84dll.png) ### 基本用法 ```csharp using AutoCAD.EntityTools; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.Runtime; [assembly: CommandClass(typeof(MyAutoCADCommands))] namespace MyAutoCADApplication { public class MyAutoCADCommands { [CommandMethod("MyCommand")] public void CreateLine() { try { var doc = Application.DocumentManager.MdiActiveDocument; using (doc.LockDocument()) { // 使用扩展方法创建直线并添加到模型空间 var line = new Line(Point3d.Origin, new Point3d(100, 100, 0)); doc.Database.AddEntityToModelSpace(line); // 使用扩展方法显示消息 "直线创建完成".CadAlert(); } } catch (System.Exception ex) { System.Windows.MessageBox.Show(ex.Message); } } } } ``` ### 主要测试方法 1. **实体操作** - 提供对各种 CAD 实体的便捷操作方法 2. **几何计算** - 包含点、线、面等各种几何计算功能 3. **JIG 绘制** - 支持动态绘制体验 4. **图层管理** - 简化的图层操作接口 5. **文件处理** - DWG/DXF 文件转换和处理 6. **界面集成** - 支持 Ribbon 界面和停靠面板 ``` CSharp /// /// 获取线线型 /// [CommandMethod(nameof(GetLineType))] /// /// 测试修剪短边 /// [CommandMethod(nameof(TrimValidShortSidesAtIntersectionsTest))] /// /// 获取线边界点 /// [CommandMethod(nameof(GetLineBoundPoints))] /// /// 获取直线长测试 /// [CommandMethod(nameof(GetLineLengthTest))] /// /// 获取直线是否相交测试 /// [CommandMethod(nameof(AreLinesIntersectingTest))] /// /// 获取直线的端点测试 /// [CommandMethod(nameof(FindOpenEndPointsTest))] /// /// LineJigTest 直线Jig测试 /// [CommandMethod(nameof(LineJig_Test))] /// /// 测试命令 - 转换DWG为DXF /// [CommandMethod("ConvertDwgToDxfTest")] /// /// 缩放到当前图形的范围测试 /// [CommandMethod(nameof(ZoomExtentsTest))] // 示例2:使用增强管理器 [CommandMethod(nameof(AdvancedScaleCommand))] /// /// 隐藏其他实体测试 /// [CommandMethod(nameof(HideOtherEntitiesTest))] /// /// 显示所有实体测试 /// [CommandMethod(nameof(ShowAllEntitiesTest))] //根据输入颜色 高亮实体 [CommandMethod("HighlightEntitiesByColorIndex")] public void HighlightEntitiesByColorIndex() //选择实体 获取该实体颜色 , 隐藏此颜色外其他实体 [CommandMethod("HideEntitiesByColorIndex")] public void HideEntitiesByColorIndex() //获取entity实体的colorindex [CommandMethod("GetEntityColorIndex")] ``` ### 所有的的测试命令 ``` CSharp /// /// 获取线线型 /// [CommandMethod(nameof(GetLineType))] /// /// 测试修剪短边 /// [CommandMethod(nameof(TrimValidShortSidesAtIntersectionsTest))] /// /// 获取线边界点 /// [CommandMethod(nameof(GetLineBoundPoints))] /// /// 获取直线长测试 /// [CommandMethod(nameof(GetLineLengthTest))] /// /// 获取直线是否相交测试 /// [CommandMethod(nameof(AreLinesIntersectingTest))] /// /// 获取直线的端点测试 /// [CommandMethod(nameof(FindOpenEndPointsTest))] /// /// LineJigTest 直线Jig测试 /// [CommandMethod(nameof(LineJig_Test))] /// /// 测试命令 - 转换DWG为DXF /// [CommandMethod("ConvertDwgToDxfTest")] /// /// 缩放到当前图形的范围测试 /// [CommandMethod(nameof(ZoomExtentsTest))] // 示例2:使用增强管理器 [CommandMethod(nameof(AdvancedScaleCommand))] /// /// 隐藏其他实体测试 /// [CommandMethod(nameof(HideOtherEntitiesTest))] /// /// 显示所有实体测试 /// [CommandMethod(nameof(ShowAllEntitiesTest))] //根据输入颜色 高亮实体 [CommandMethod("HighlightEntitiesByColorIndex")] public void HighlightEntitiesByColorIndex() //选择实体 获取该实体颜色 , 隐藏此颜色外其他实体 [CommandMethod("HideEntitiesByColorIndex")] public void HideEntitiesByColorIndex() //获取entity实体的colorindex [CommandMethod("GetEntityColorIndex")] ``` ![AutoCad.EntityTool](Doc/images/cadwindow.png) ### 封装方法 ##### Entity类扩展 ``` CSharp namespace AutoCAD.EntityTools { /// /// 实体扩展工具类 /// public static class EntityTools { /// /// 通过ObjectId数组获取对应的实体数组 /// /// AutoCAD数据库实例 /// 要查询的ObjectId数组 /// 与ObjectId数组对应的实体数组 public static Entity[] ToObjectIdGetEntity(this Database db, params ObjectId[] objIds) /// /// 通过ObjectId得到实体 /// /// 图形数据库 /// 要查询的ObjectId /// 实体对象 public static Entity ToObjectIdGetEntity(this Database db, ObjectId objId) /// /// 移动实体(优化版) /// /// 实体的ObjectId /// 移动源点 /// 移动的目标点 /// 是否移动成功 public static bool Move(this ObjectId id, Point3d sourcePt, Point3d targetPt) /// /// 创建直线并添加到模型空间 /// /// 图形数据库 /// 起点 /// 终点 /// 颜色索引 /// 直线ObjectId public static ObjectId AddLineToModelSpace(this Database db, Point3d startPoint, Point3d endPoint, short colorIndex = 1) /// /// 移动实体 /// /// 实体类型 /// 实体 /// 移动源点 /// 移动的目标点 public static void Move(this TEntity ent, Point3d sourcePt, Point3d targetPt) where TEntity : Entity /// /// 复制实体(安全版本) /// /// 实体的ObjectId /// 复制的源点 /// 复制的目标点 /// 复制实体的ObjectId public static ObjectId Copy(this ObjectId id, Point3d sourcePt, Point3d targetPt) /// /// 旋转实体(安全版本) /// /// 实体ObjectId /// 旋转基点 /// 旋转角度(弧度) /// 是否旋转成功 public static bool Rotate(this ObjectId id, Point3d basePt, double angle) /// /// 旋转实体(角度制版本) /// /// 实体ObjectId /// 旋转基点 /// 旋转角度(度) /// 是否旋转成功 public static bool RotateDegrees(this ObjectId id, Point3d basePt, double angleInDegrees) /// /// 显示所有实体 /// /// 文档对象 public static void ShowAllEntities(this Document doc) /// /// 隐藏除指定实体列表外的所有其他实体 /// /// 要保持可见的实体ObjectId列表 public static void HideOtherEntities(this List objectIdsToKeepVisible) /// /// 缩放实体(安全版本) /// /// 实体的ObjectId /// 缩放基点 /// 缩放比例 /// 是否缩放成功 public static bool Scale(this ObjectId id, Point3d basePt, double scaleFactor) /// /// 镜像实体(安全版本) /// /// 实体ObjectId /// 镜像点1 /// 镜像点2 /// 是否删除源对象 /// 镜像实体的ObjectId public static ObjectId Mirror(this ObjectId id, Point3d mirrorPt1, Point3d mirrorPt2, bool eraseSourceObject) /// /// 将指定的实体添加到AutoCAD图形数据库中的块表记录 /// /// 实体类型 /// 要添加到数据库的实体对象 /// 事务对象 /// 目标块表记录 /// 添加到数据库后实体的ObjectId public static ObjectId AddToDatabase(this TEntity entity, Transaction host, BlockTableRecord btr) where TEntity : Entity /// /// 将一组实体添加到AutoCAD图形数据库中的模型空间块表记录 /// /// 实体类型 /// 要添加到数据库的实体集合 /// 事务对象 /// 模型空间块表记录 /// 包含所有添加到数据库后实体的ObjectId的列表 public static List AddToDatabase(this ICollection entities, Transaction host, BlockTableRecord model_space) where TEntity : Entity /// /// 将一组实体添加到AutoCAD图形数据库中的指定块表记录 /// /// 实体类型 /// 事务对象 /// 块表记录对象 /// 要添加到数据库的实体数组 /// 包含所有添加到数据库后实体的ObjectId的列表 public static List AddEntityToDatabase(this Transaction trans, BlockTableRecord btr, params TEntity[] entities) where TEntity : Entity /// /// 修改实体的颜色 /// /// 实体Id /// 颜色索引 public static void ModifyEntityColorIndex(this ObjectId entityId, short newColorIndex) /// /// 将图形对象添加到图形文件中 /// /// 图形数据库 /// 图形对象 /// 图形的ObjectId public static ObjectId AddEntityToModelSpace(this Database db, Entity entity) /// /// 删除图像数据库实体 /// /// 当前文档 /// 实体id /// 是否删除成功 public static bool DeleteEntities(this Document doc, params ObjectId[] entityIds) /// /// 判断一个实体是否已经添加到图形数据库 /// /// 实体 /// public static bool IsEntityInDatabase(this Entity entity) /// /// 删除图像数据库实体 /// /// 文档 /// 实体id /// public static bool DeleteEntity(this Document doc, ObjectId entityId) /// /// 将图形对象添加到图形文件中 /// /// 图形数据库 /// 图形对象数组 /// 图形的ObjectId数组 public static ObjectId[] AddEntityToModelSpace(this Database db, params Entity[] entity) /// /// 修改图形颜色(未添加到图形数据库) /// /// 实体类型 /// 实体 /// 颜色索引 /// 文档对象 public static void ChangeEntityColor(this TEntity entity, short colorIndex, Document doc) where TEntity : Entity /// /// 修改图形颜色 /// /// 实体类型 /// 实体 /// 颜色索引 /// 文档对象 public static void ChangeEntityColor2(this TEntity entity, short colorIndex, Document doc) where TEntity : Entity /// /// 设置实体颜色、图层(安全版本) /// /// 实体类型,必须继承自AutoCAD的Entity类 /// 实体 /// 颜色索引 /// 图层名字 /// 如果图层不存在是否创建 /// 图层颜色索引(可选) public static void SetColorLayer(this TEntity entity, short colorIndex, string layerName, bool createIfNotExists = true, short layerColorIndex = 256) where TEntity : Entity /// /// 选择一个对象 /// /// 编辑器对象 /// 选择过滤器 /// 选择的ObjectId public static ObjectId SelectOne(this Editor ed, SelectionFilter filter = default) /// /// 删除图形对象 /// /// 图形对象的ObjectId public static void EraseEntity(this ObjectId entity) /// /// 删除图形对象 /// /// 图形对象的ObjectId数组 public static void EraseEntities(params ObjectId[] entIds) /// /// 通过ObjectId得到实体 /// /// 实体id数组 /// 图形数据库 /// 实体数组 public static Entity[] GetEntity(this ObjectId[] objIds, Database db) /// /// 通过ObjectId得到实体 /// /// 实体id /// 图形数据库 /// 实体对象 public static Entity GetEntity(this ObjectId objId, Database db) /// /// 通过ObjectId获取指定类型的实体 /// /// 实体类型 /// 文档对象 /// 实体ObjectId /// 打开模式 /// 是否打开已删除对象 /// 指定类型的实体 public static TEntity GetEntity(this Document doc, ObjectId objId, OpenMode openMode = OpenMode.ForRead, bool openErased = false) where TEntity : Entity /// /// 通过ObjectId获取实体(非泛型版本) /// /// 文档对象 /// 实体ObjectId /// 打开模式 /// 是否打开已删除对象 /// 实体对象 public static Entity GetEntity(this Document doc, ObjectId objId, OpenMode openMode = OpenMode.ForRead, bool openErased = false) /// /// 通过ObjectId得到实体 /// /// 图形数据库 /// 实体ObjectId /// 实体对象 public static Entity GetEntity(this Database db, ObjectId objId) /// /// 通过圆心、起点夹角绘制圆弧 /// /// 图形数据库 /// 圆心 /// 起点 /// 夹角(角度值) /// 圆弧ObjectId public static ObjectId AddArcToModelSpace(this Database db, Point3d center, Point3d startPoint, double degree) /// /// 通过三点绘制圆弧(起点、圆弧上一点、终点) /// /// 图形数据库 /// 圆弧的起始点 /// 圆弧上的点 /// 圆弧的终止点 /// 圆弧的ObjectId public static ObjectId AddArcToModelSpace(this Database db, Point3d startPoint, Point3d pointOnArc, Point3d endPoint) /// /// 绘制圆弧 /// /// 图形数据库 /// 圆弧所在圆的圆心点 /// 圆弧的半径 /// 圆弧的起始角度 /// 圆弧的终止角度 /// 圆弧ObjectId public static ObjectId AddArcToModelSpace(this Database db, Point3d center, double radius, double startDegree, double endDegree) /// /// 绘制直线 /// /// 图形数据库 /// 起点坐标 /// 直线长度 /// 与x轴正方向的角度 /// 直线ObjectId public static ObjectId AddLineToModelSpace(this Database db, Point3d startPoint, double length, double degree) /// /// 删除图形 /// /// 当前文档 /// 实体id列表 /// 是否删除成功 public static bool DeleteEntities(this Document doc, List entityIds) /// /// 删除图形数据库实体 /// /// 当前文档 /// 实体id数组 /// 是否删除成功 public static bool DeleteEntities(this Document doc, params ObjectId[] entityIds) /// /// 删除图形数据库实体 /// /// 当前文档 /// 实体id /// 是否删除成功 public static bool DeleteEntities(this Document doc, ObjectId entityId) /// /// 将实体集合添加到模型空间 /// /// 实体类型 /// 图形数据库 /// 实体集合 /// ObjectId数组 public static ObjectId[] AddEntityToModelSpace(this Database db, ICollection entitys) where TEntity : Entity /// /// 使用ObjectId来判断一个实体是否已经添加到图形数据库 /// /// 实体 /// 是否已添加到数据库 public static bool IsEntityInDatabase(this Entity entity) /// /// 安全删除实体(处理锁定图层等情况) /// /// 实体类型 /// 实体 /// 事务对象 public static void SafeEraseEntity(TEntity ent, Transaction tr) where TEntity : Entity /// /// 设置实体颜色、图层 /// /// 实体类型 /// 实体 /// 颜色索引 /// 图层名字 public static void SetColorLayer(this TEntity entity, short colorIndex, string layerName) where TEntity : Entity /// /// 设置多段线颜色、图层并闭合 /// /// 多段线 /// 颜色索引 /// 图层名字 /// 是否闭合 public static void SetPolylineColorLayer(this Polyline polyline, short colorIndex, string layerName, bool isClosed = true) /// /// 设置实体的可见性(隐藏或显示) /// /// 要操作的实体ID /// 是否显示 /// 操作是否成功 public static bool SetEntityVisibility(ObjectId objectId, bool isVisible) /// /// 隐藏指定实体 /// /// 实体ObjectId /// 是否隐藏成功 public static bool HideEntity(this ObjectId objectId) /// /// 显示指定实体 /// /// 实体ObjectId /// 是否显示成功 public static bool ShowEntity(this ObjectId objectId) /// /// 将ObjectId集合转换为Entity集合 /// /// 实体类型 /// ObjectId集合 /// 打开模式 /// 是否打开已删除对象 /// 实体集合 public static List ToEntities(this IEnumerable objectIds, OpenMode openMode = OpenMode.ForRead, bool openErased = false) where TEntity : Entity /// /// 将Entity集合转换为ObjectId集合 /// /// 实体类型 /// 实体集合 /// ObjectId集合 public static List ToObjectIds(this IEnumerable entities) where TEntity : Entity /// /// 将ObjectId集合转换为Entity集合(非泛型版本) /// /// ObjectId集合 /// 打开模式 /// 是否打开已删除对象 /// 实体集合 public static List ToEntities(this IEnumerable objectIds, OpenMode openMode = OpenMode.ForRead, bool openErased = false) } /// /// 获取块的包围盒(.NET Framework 4.8 兼容版) /// /// 实体 /// BlockBoxResult 包含包围盒和变换矩阵 public static BlockBoxResult GetBlockBox(this Entity entity) /// /// 根据点集创建多段线 /// /// 点集合的类型,必须实现 IEnumerable 接口 /// 点集合,用于定义多段线的顶点位置 /// AutoCAD 数据库对象,用于确定多段线所属的数据库上下文 /// 多段线创建选项,包含线宽、颜色、图层等属性设置,可选参数 /// 自定义操作委托,可在多段线创建后执行额外操作,可选参数 /// 创建的多段线对象 /// 当 points 或 db 参数为 null 时抛出 /// 当 points 集合为空或包含不足2个点时抛出 /// /// 此方法为 IEnumerable 提供扩展方法,简化多段线创建流程。 /// 支持通过 options 参数统一设置多段线属性,通过 customAction 参数执行自定义逻辑。 /// 创建的多段线会自动添加到指定数据库的当前空间中。 /// public static Polyline CreatePolyline(this IEnumerable points, Database db , PolylineOptions options = null, Action customAction = null) } ``` ##### Arc类扩展 ``` CSharp namespace AutoCAD.EntityTools { /// /// 圆弧工具类 /// public static class ArcTools { /// /// 计算两条平行圆弧之间的最短垂直距离 /// /// 第一条圆弧 /// 第二条圆弧 /// 几何容差(默认1e-5) /// 圆弧间的最短垂直距离,若不平行返回double.NaN [Obsolete("不稳定")] public static double CalculateShortestDistanceBetweenParallelArcs(this Arc arc1, Arc arc2, double tolerance = 1e-5) /// /// 判断两条圆弧是否平行且距离符合要求 /// /// 第一个圆弧 /// 第二个圆弧 /// 期望距离 /// 距离容差 /// 如果两条圆弧平行且距离在容差范围内返回true,否则返回false public static bool AreArcsParallelAndAtDistance(this Arc arc1, Arc arc2, double expectedDistance, double distanceTolerance) /// /// 增强版平行距离判断(支持直线和圆弧) /// /// 第一条墙线(直线或圆弧) /// 第二条墙线(直线或圆弧) /// 允许的距离数组 /// 距离容差(默认0.001) /// 如果墙线平行且距离在允许范围内返回true,否则返回false public static bool AreWallsParallelAndAtDistanceEnhanced( this Curve wall1, Curve wall2, double[] allowedDistances, double distanceTolerance = 0.001) /// /// 判断两条直线是否平行且距离符合要求 /// /// 第一条直线 /// 第二条直线 /// 期望距离 /// 距离容差 /// 如果两条直线平行且距离在容差范围内返回true,否则返回false public static bool AreLinesParallelAndAtDistance(Line line1, Line line2, double expectedDistance, double distanceTolerance) } } ``` #### Curve类扩展 ``` CSharp namespace AutoCAD.EntityTools { /// /// 曲线工具类 /// public static class CurveTools { /// /// 安全获取曲线对象(全面检查对象有效性) /// /// 当前事务 /// 要检查的曲线对象 /// 有效的曲线对象或null public static Curve GetValidCurve(this Transaction tr, Curve curve) /// /// 安全地计算曲线长度(解决 eInvalidOpenState 异常) /// /// 曲线对象 /// 曲线长度 public static double GetLength(this Curve curve) /// /// 尝试获取有效的曲线对象 /// /// 要检查的曲线对象 /// 当前事务 /// 有效的曲线对象或null public static Curve TryGetValidCurve(this Curve curve, Transaction tr) /// /// 安全的属性复制方法(不处理事务) /// /// 源曲线对象 /// 目标曲线对象 public static void CopyCommonCurvePropertiesSafe(this Curve source, Curve target) /// /// 检查实体是否可读 /// /// 要检查的实体 /// 如果实体可读返回true,否则返回false private static bool IsEntityValidForRead(Entity entity) /// /// 检查实体是否可写 /// /// 要检查的实体 /// 如果实体可写返回true,否则返回false private static bool IsEntityValidForWrite(Entity entity) /// /// 安全的XData复制 /// /// 源数据库对象 /// 目标数据库对象 private static void CopyXDataSafe(DBObject source, DBObject target) /// /// 复制扩展数据(XData) /// /// 源数据库对象 /// 目标数据库对象 private static void CopyXData(DBObject source, DBObject target) /// /// 复制超链接(安全版本) /// /// 源实体 /// 目标实体 private static void CopyHyperlinks(Entity source, Entity target) /// /// 复制实体通用属性(更通用的方法) /// /// 源实体 /// 目标实体 public static void CopyCommonProperties(this Entity source, Entity target) } } ``` ##### Point类扩展 ``` CSharp namespace AutoCAD.EntityTools { /// /// 点工具类 /// public static class PointTools { /// /// 将3D点转换为2D点,忽略Z坐标 /// /// 要转换的3D点 /// 转换后的2D点 public static Point2d Point3dToPoint2d(this Point3d point3d) /// /// 将2D点转换为3D点 /// /// 要转换的2D点 /// 转换后的3D点 public static Point2d Point2dToPoint3d(this Point2d point2d) /// /// 获取2D点的中心点 /// /// 要获取中心的2D点 /// 中心点 public static Point2d GetPoint2dCenter(this Point2d point2d) /// /// 获取3D点的中心点 /// /// 要获取中心的3D点 /// 中心点 public static Point3d GetPoint3dCenter(this Point3d point3d) /// /// 获取两个点之间的中心点 /// /// 起点 /// 终点 /// 中点 public static Point3d GetCenterPointInTwoPointBetween(this Point3d startPoint, Point3d endPoint) /// /// 获取从起点到终点的向量坐标 /// /// 起点坐标 /// 终点坐标 /// 向量坐标 public static Point3d GetPointArrivePointCoordinate(this Point3d startPoint, Point3d endPoint) /// /// 获取两个3D点之间的中心点 /// /// 起点 /// 终点 /// 中心点 public static Point3d GetTwoPoint3dCenter(this Point3d start, Point3d end) /// /// 获取两个2D点之间的中心点 /// /// 起点 /// 终点 /// 中心点 public static Point2d GetTwoPoint2dCenter(this Point2d start, Point2d end) /// /// 获取与给定点指定角度和距离的点 /// /// 基点 /// 角度 /// 距离 /// 计算后的点 public static Point3d PolarPoint(this Point3d point, double angle, double dist) /// /// 3D点转换为2D点 /// /// 3D点 /// 2D点 public static Point2d Point3dConvertToPoint2d(this Point3d point3d) /// /// 判断三点是否在同一条直线上 /// /// 第一个点 /// 第二个点 /// 第三个点 /// 是否在同一条直线上 public static bool IsOnOneLine(this Point3d firstPoint, Point3d secondPoint, Point3d thirdPoint) /// /// 计算两点中间点 /// /// 第一个点 /// 第二个点 /// 中间点 public static Point3d MidPoint(this Point3d p1, Point3d p2) /// /// 判断两个点是否相等,考虑小数点误差 /// /// 第一个点 /// 第二个点 /// 误差范围 /// 是否相等 public static bool ArePointsEqual(this Point3d p1, Point3d p2, double epsilon) /// /// 获得point X方向与point2的角度 /// /// 点1 /// 点2 /// 角度值 public static double GetAngleToXAxis(this Point3d point1, Point3d point2) /// /// 获取两个点之间的中心点(整数坐标) /// /// 起点 /// 终点 /// 中心点 public static Point3d GetCenterPointInTwoPointBetweenInt(this Point3d startPoint, Point3d endPoint) /// /// 判断两个点是否相等(考虑距离误差) /// /// 点1 /// 点2 /// 误差 /// 两个点是否相等 public static bool ArePointEquals(this Point3d point1, Point3d point2, double tolerance) /// /// 检查四个点是否共面 /// /// 点数组 /// 是否共面 public static bool PointsAreCoplanar(Point3d[] points) /// /// 点和点相加 /// /// 第一个点 /// 第二个点 /// 相加后的点 public static Point3d Add(this Point3d p1, Point3d p2) /// /// 点坐标相减(返回新点) /// /// 被减点 /// 减点 /// 坐标差的新点 public static Point3d Sub(this Point3d p1, Point3d p2) /// /// 2D点和点相加 /// /// 第一个点 /// 第二个点 /// 相加后的点 public static Point2d Add(this Point2d p1, Point2d p2) /// /// 2D点坐标相减(返回新点) /// /// 被减点 /// 减点 /// 坐标差的新点 public static Point2d Sub(this Point2d p1, Point2d p2) /// /// 测量两点之间的距离 /// /// 第一个点 /// 第二个点 /// 两点之间的距离 public static double MeasureDistance(Point3d point1, Point3d point2) } } ``` #### Polyline类扩展 ``` CSharp namespace AutoCAD.EntityTools { /// /// 多段线工具类 /// public static class PolylineTools { /// /// 计算两个平行多段线之间的距离 /// /// 第一条多段线 /// 第二条多段线 /// 距离值 public static double GetDistanceBetweenParallelPolylines(this Polyline pl1, Polyline pl2) /// /// 复制多段线属性 /// /// 源多段线 /// 目标多段线 public static void CopyPolylineProperties(this Polyline source, Polyline target) /// /// 判断多段线是否为矩形 /// /// 多段线对象 /// 如果是矩形返回true,否则返回false public static bool IsRectangle(Polyline pl) /// /// 判断多段线是否为矩形(优化版) /// /// 多段线对象 /// 如果是矩形返回true,否则返回false public static bool IsRectanglePolyline(Polyline pl) /// /// 隐藏图框内部实体 /// /// 图框多段线 /// 事务对象 /// 块表记录 /// 是否可见 public static void VisibleEntitiesInsideFrame(this Polyline frame, Transaction tr, BlockTableRecord btr, bool isVisible = false) /// /// 检查一个边界框是否完全包含另一个边界框 /// /// 外部边界框 /// 内部边界框 /// 是否包含 public static bool ContainsExtents(Extents3d outer, Extents3d inner) /// /// 检查实体是否在多段线内部 /// /// 要检查的实体 /// 多段线图框 /// 是否在多段线内部 public static bool IsEntityInsidePolyline(Entity ent, Polyline pl) /// /// 使用射线法检查点是否在多段线内部 /// /// 要检查的点 /// 多段线 /// 点是否在多段线内部 public static bool IsPointInsidePolyline(Point3d point, Polyline pl) /// /// 创建中心线 /// /// 第一条多段线 /// 第二条多段线 /// 距离容差 /// 中心线列表 public static List CreateCenterLineByExploding(this Polyline pline1, Polyline pline2, double distanceTolerance) /// /// 计算两条平行圆弧的中线 /// /// 第一条圆弧 /// 第二条圆弧 /// 中线圆弧 private static Arc CalculateArcCenterLine(Arc arc1, Arc arc2) /// /// 处理直线对 /// /// 第一条直线 /// 第二条直线 /// 中心多段线 /// 是否为首段 /// 距离容差 private static void ProcessLinePair(Line line1, Line line2, Polyline centerPline, bool isFirstSegment, double distanceTolerance) /// /// 计算两条平行直线的中线 /// /// 第一条直线 /// 第二条直线 /// 距离容差 /// 中线直线 private static Line CalculateLineCenterLine(Line line1, Line line2, double distanceTolerance) /// /// 获取两条平行直线两侧的端点对 /// /// 第一条直线 /// 第二条直线 /// 端点对元组 public static Tuple, Tuple> GetBothSideEndPoints(Line line1, Line line2) /// /// 获取点在直线上的投影点 /// /// 直线 /// 点 /// 投影点 private static Point3d GetProjectionPoint(Line line, Point3d point) /// /// 分解多段线为线段 /// /// 多段线 /// 线段列表 private static List ExplodePolyline(Polyline pline) /// /// 设置多段线宽度(完整版) /// /// 多段线 /// GlobalWidth 、 StartWidth 、 EndWidth 、SetVertexWidths /// /// /// public static Polyline SetWidth(this Polyline polyline, PolylineWidthOptions options) /// /// 设置多段线全局宽度(简化版) /// /// 多段线 /// 宽度 /// 返回多段线 /// /// public static Polyline SetConstantWidth(this Polyline polyline, double width) /// /// 设置多段线顶点宽度 /// /// 多段线 /// 顶点索引 /// 开端宽度 /// 结束宽度 /// /// /// /// public static Polyline SetVertexWidth(this Polyline polyline, int vertexIndex, double startWidth, double endWidth) /// /// 安全设置多段线宽度(不抛出异常) /// /// 多段线 /// 宽度 /// 异常信息 /// public static bool TrySetWidth(this Polyline polyline, double width, out string errorMessage) /// /// 批量设置多段线宽度 /// /// 多段线集合 /// 宽度 public static void SetWidths(this IEnumerable polylines, double width) /// /// 手选多段线 /// /// Editor /// 提示信息 /// public static Polyline SelectPolyline(this Editor ed , string prompt = "\n请选择多段线: ") /// /// 复制属性 /// /// 源多段线 /// 目标多段线 private static void CopyProperties(Polyline source, Polyline target) } } ``` ##### Editor类扩展 ``` CSharp namespace AutoCAD.EntityTools { /// /// 编辑器工具类 /// public static class EditorTools { /// /// 将AutoCAD编辑器的视图缩放到指定的3D范围 /// /// AutoCAD编辑器对象 /// 要缩放的3D范围 public static void Zoom(this Editor ed, Extents3d ext) /// /// 缩放至全部范围 /// /// AutoCAD编辑器对象 public static void ZoomExtents(this Editor ed) /// /// 选择一个实体 /// /// 编辑器对象 /// 提示信息 /// 实体类型 /// 实体ObjectId public static ObjectId GetEntity_(this Editor ed, string message, Type type = null) /// /// 获取选择集 /// /// 编辑器对象 /// 提示信息 /// 实体ObjectId列表 public static List GetSelection_(this Editor ed, string message) /// /// 选择一个点 /// /// 编辑器对象 /// 选择的3D点 public static Point3d GetPoint(this Editor ed) /// /// 选择所有线 /// /// 编辑器对象 /// 直线列表 public static List SelectAllLines(this Editor ed) /// /// 选择一个点 /// /// 编辑器对象 /// 提示信息 /// 选择的3D点 public static Point3d GetPoint3d(this Editor ed, string prompt) /// /// 选择一个点 /// /// 编辑器对象 /// 提示信息 /// 选择的3D点 public static Point3d GetPoint2(this Editor ed, string prompt) /// /// 选择实体(只选择线和多段线)并可选择过滤图层 /// /// AutoCAD编辑器对象 /// 提示信息 /// 图层名称 /// 是否允许多选 /// 用户选择的对象ID数组 public static ObjectId[] GetSelectionLineAndPolyLine(this Editor ed, string message, string layerName = "", bool allowMultiple = true) /// /// 选择实体(只选择线和多段线)并支持多个图层过滤 /// /// AutoCAD编辑器对象 /// 提示信息 /// 图层名称数组 /// 是否允许多选 /// 用户选择的对象ID数组 public static ObjectId[] GetSelectionLineAndPolyLine(this Editor ed, string message, string[] layerNames, bool allowMultiple = true) /// /// 选择实体并返回实体对象列表 /// /// AutoCAD编辑器对象 /// 提示信息 /// 图层名称 /// 事务对象 /// 实体对象列表 public static List GetSelectionLineAndPolyLineEntities(this Editor ed, string message, string layerName, Transaction transaction) /// /// 选择单个实体 /// /// AutoCAD编辑器对象 /// 提示信息 /// 图层名称 /// 选择的实体ObjectId public static ObjectId GetSingleSelectionLineOrPolyLine(this Editor ed, string message, string layerName = "") /// /// 获取圆和圆弧 /// /// 当前文档 /// 对象ID数组 public static ObjectId[] SelectAllCircleArcs(this Document doc) /// /// 获取圆和圆弧的中心点和半径 /// /// 当前文档 /// 对象ID数组 /// 中心点与半径的字典 public static Dictionary GetCircleArcCenterRadius(this Document doc, ObjectId[] objectIds) /// /// 获取圆和圆弧中心点和半径 /// /// 文档对象 /// 对象ID数组 /// 事务对象 /// 点比较容差 /// 中心点与半径的字典 public static Dictionary GetCircleArcCenterRadius(this Document doc, ObjectId[] objectIds, Transaction trans, double tolerance = 0.001) /// /// 获取直线 /// /// 当前文档 /// 直线列表 public static List SelectLines(this Document doc) /// /// 获取直线ID /// /// 当前文档 /// 直线ObjectId列表 public static List SelectLineIds(this Document doc) /// /// 获取指定图层上的多段线 /// /// 当前文档 /// 事务对象 /// 图层名称 /// 多段线ObjectId列表 public static List GetPolylineBySelectAndLayerName(this Document doc, Transaction trans, string layerName) /// /// 获取圆 /// /// 当前文档 /// 圆列表 public static List SelectCircles(this Document doc) /// /// 输入过滤类型,获得选择集 /// /// 过滤类型 /// 选择集 public static SelectionSet GetSelectionEx(TypedValue[] type = null) /// /// 获取选择集 /// /// 选择集 public static SelectionSet PickFirst() /// /// 选择所有实体 /// /// 编辑器对象 /// 选择过滤器 /// 实体ObjectId列表 public static List SelectAll_(this Editor ed, SelectionFilter filter = default) /// /// 获得用户输入的双精度浮点数 /// /// 提示信息 /// 默认值 /// 用户输入的值 public static double GetUserDouble(this string message, double defaultvalue = 0.0) /// /// 获得用户输入的双精度浮点数 /// /// 编辑器对象 /// 提示信息 /// 默认值 /// 用户输入的值 public static double GetUserDouble(this Editor ed, string message, double defaultvalue = 0.0) /// /// 获取用户是否删除源对象的选择 /// /// 编辑器对象 /// 默认选择 /// 用户选择 public static bool GetEraseSourceChoice(this Editor ed, bool defaultChoice = false) /// /// 获得用户输入的是或否选择 /// /// 编辑器对象 /// 提示信息 /// 默认选择 /// 用户选择 public static bool? GetUserYesOrNo(this Editor ed, string prompt = "\n是或否?[是(Y)/否(N)]", bool defaultChoice = false) /// /// 获取CAD鼠标当前位置坐标 /// /// 命令栏 /// 坐标(可能为null) public static Point3d? GetCurrentMouthPoint(this Editor ed) /// /// 获得用户输入的字符串 /// /// 提示信息 /// 用户输入的字符串 public static string GetUserMessage(this string message) /// /// 获得用户输入的字符串 /// /// 提示信息 /// 用户输入的字符串 public static string GetUserStr(this string message) /// /// 获得用户输入的点 /// /// 提示信息 /// 用户输入的点 public static Point3d? GetPoint(this string message) /// /// 选择点 /// /// 编辑器对象 /// 提示信息 /// 选择的点 public static Point3d GetPoint_(this Editor ed, string message) /// /// 获取用户输入的角度值 /// /// 编辑器对象 /// 提示信息 /// 默认角度值 /// 是否使用角度制 /// 是否允许不输入 /// 角度值 public static double? GetAngleFromUser(this Editor ed, string promptMessage = "\n请输入角度:", double? defaultValue = null, bool useDegrees = true, bool allowNone = true) /// /// 获取用户输入的角度值(带范围验证) /// /// 编辑器对象 /// 提示信息 /// 最小值 /// 最大值 /// 默认角度值 /// 是否使用角度制 /// 角度值 public static double? GetAngleInRange(this Editor ed, string promptMessage = "\n请输入角度:", double minValue = 0, double maxValue = 2 * Math.PI, double? defaultValue = null, bool useDegrees = true) /// /// 通过两点获取角度 /// /// 基点 /// 提示信息 /// 角度值 public static double? GetAngleByTwoPoints(Point3d basePoint, string promptMessage = "\n指定角度方向:") /// /// 通过过滤器获取实体 /// /// 编辑器对象 /// 过滤类型 /// 选择集 public static SelectionSet GetSelectionEntity(this Editor ed, TypedValue[] type = null) /// /// 通过过滤器获取实体 /// /// 编辑器对象 /// 选择集 public static SelectionSet SelectSet(this Editor ed) /// /// 刷新当前文档视图 /// /// 要刷新的文档对象 public static void RefreshView(this Document document) /// /// 缩放至全部范围 /// /// 要操作的文档对象 public static void ZoomExtents(this Document document) } } ``` ##### Layer类扩展 ``` CSharp namespace AutoCAD.EntityTools { /// /// 图层工具类 /// public static class LayerTools { /// /// 获取图层名 /// /// 事务对象 /// 文档对象 /// 图层名字列表 public static List GetAllLayerName(this Transaction trans, Document doc) /// /// 创建一个新的图层 /// /// 图形数据库 /// 图层名 /// 新添加的层表记录的ObjectId public static ObjectId AddLayer(this Database db, string layerName) /// /// 添加图层 /// /// 图层名 /// 图层颜色索引 public static void AddLayer(this string layName, int Index) /// /// 修改指定图层的颜色 /// /// 图形数据库 /// 图层名 /// 颜色索引值 /// 设置图层是否成功 public static bool SetLayerColor(this Database db, string layerName, short colorIndex) /// /// 获取当前图形中所有的图层 /// /// 图形数据库 /// 所有图层记录表 public static List GetAllLayers(this Database db) /// /// 删除指定名称的图层 /// /// 图形数据库 /// 要删除的图层名 /// 是否删除成功 public static bool DeleteLayer(this Database db, string layerName) /// /// 批量删除图层 /// /// 图形数据库 /// 要删除的图层名称数组 /// 成功删除的图层数量 public static int DeleteLayers(this Database db, params string[] layerNames) /// /// 删除所有空图层 /// /// 图形数据库 /// 成功删除的图层数量 public static int DeleteAllEmptyLayers(this Database db) /// /// 解锁指定图层(仅当前事务有效) /// /// 文档对象 /// 图层名称 /// 是否解锁成功 public static bool UnlockByLayer(this Document doc, string layerName) /// /// 锁定指定图层 /// /// 文档对象 /// 要锁定的图层名称数组 /// 成功锁定的图层数量 public static int LockLayers(this Document doc, params string[] layerNames) /// /// 锁定单个图层 /// /// 文档对象 /// 要锁定的图层名称 /// 是否成功锁定 public static bool LockLayer(this Document doc, string layerName) /// /// 通过交互选择锁定图层 /// /// 文档对象 /// 成功锁定的图层数量 public static int LockLayersInteractive(this Document doc) /// /// 锁定所有图层 /// /// 文档对象 /// 成功锁定的图层数量 public static int LockAllLayers(this Document doc) /// /// 获取所有图层名称 /// /// 文档对象 /// 图层名称列表 public static List GetAllLayerName(this Document doc) /// /// 设置指定实体的图层名称和颜色 /// /// 实体类型 /// 实体对象 /// 图层名称 /// 红色分量 /// 绿色分量 /// 蓝色分量 /// 事务对象 /// 文档对象 public static void SetLayer(this TEntity entity, string layerName, byte red, byte green, byte blue, Transaction trans, Document doc) where TEntity : Entity /// /// 解锁指定图层 /// /// 文档对象 /// 图层名称 /// 操作是否成功 public static bool UnlockLayer(this Document document, string layerName) /// /// 设置实体图层和颜色 /// /// 实体类型 /// 实体对象 /// 文档对象 /// 图层名称 /// 红色分量 /// 绿色分量 /// 蓝色分量 public static void SetLayer(this TEntity entity, Document doc, string layerName, byte red = 255, byte green = 0, byte blue = 0) where TEntity : Entity /// /// 检查指定图层上的所有实体中是否至少有一个是参考块 /// /// 图层名称 /// 如果至少有一个实体是参考块,则返回true;否则返回false public static bool HasBlockReferenceOnLayer(this string layerName) /// /// 通过图层名称选择实体 /// /// 文档对象 /// 图层名称数组 /// 选择提示信息 /// 是否允许不选择任何对象 /// 选择结果 public static ObjectId[] SelectEntitiesByLayer(this Document doc, string[] layerNames, string message = "\n选择对象:", bool allowNone = false) /// /// 创建基于图层名称的选择过滤器 /// /// 图层名称数组 /// 选择过滤器 public static SelectionFilter GetSelectionFilterByLayerName(params string[] layerNames) /// /// 设置实体图层和颜色 /// /// 实体对象 /// 图层名称 public static void SetDimensionEntityLayerAndColor(this Entity entity, string layerName) /// /// 设置实体图层和颜色 /// /// 实体类型 /// 实体列表 /// 图层名称 public static void SetEntityLayerAndColor(this List entitys, string layerName) where TEntity : Entity /// /// 更改指定实体的图层名称 /// /// 实体对象 /// 图层名称 public static void ChangeEntityLayer(this Entity entity, string layerName) /// /// 生成随机的ACI颜色索引(排除0和7) /// /// 颜色索引 public static short GetRandomColorIndex() /// /// 生成随机的深色ACI索引(适用于白底显示) /// /// 颜色索引 public static short GetRandomDarkColorIndex() /// /// 显示指定图层上的所有实体 /// /// 图层名称 /// 文档对象 public static void ShowAllEntitiesOnLayer(string layerName, Document doc) /// /// 获取指定图层上的所有实体 /// /// 图层名称 /// 文档对象 /// 实体列表 public static List GetAllEntitiesOnLayer(string layerName, Document doc) /// /// 显示所有图层 /// public static void ShowAllLayers() /// /// 隐藏除选中实体所在图层外的所有图层 /// public static void HideOtherLayers() } } ``` ##### Block类扩展 ``` CSharp namespace AutoCAD.EntityTool { /// /// 块工具类 /// public static class BlockTools { /// /// 创建一个块并添加到数据库中 /// /// 图形数据库 /// 块名 /// 实体列表 /// 块表记录的Id,失败返回ObjectId.Null public static ObjectId AddBlockTableRecord(this Database db, string blockName, List ents) /// /// 检查实体是否适合添加到块中 /// /// 要检查的实体 /// 目标数据库 /// 如果实体适合添加到块中返回true,否则返回false private static bool IsEntityValidForBlock(Entity entity, Database targetDb) /// /// 检查块名称是否有效 /// /// 要检查的块名称 /// 如果块名称有效返回true,否则返回false private static bool IsValidBlockName(string blockName) /// /// 检查实体是否有效 /// /// 要检查的实体 /// 如果实体有效返回true,否则返回false private static bool IsEntityValid(Entity entity) /// /// 检查实体是否有效(替代方法) /// /// 要检查的实体 /// 如果实体有效返回true,否则返回false private static bool IsEntityValid2(Entity entity) /// /// 从当前选择集创建块 /// /// 图形数据库 /// 块名 /// 基点 /// 块表记录的Id,失败返回ObjectId.Null public static ObjectId CreateBlockFromSelection(this Database db, string blockName, Point3d basePoint) /// /// 创建带有属性的块 /// /// 图形数据库 /// 块名 /// 实体列表 /// 属性字典 /// 块表记录的Id,失败返回ObjectId.Null public static ObjectId AddBlockWithAttributes(this Database db, string blockName, List ents, Dictionary attributes) /// /// 重载AddBlockTableRecord扩展函数,使其能接受不固定的实体对象 /// /// 图形数据库 /// 块名 /// 实体数组 /// 块表记录的Id public static ObjectId AddBlockTableRecord(this Database db, string blockName, params Entity[] ents) /// /// 在CAD图形中插入参照块 /// /// 表示块参照要加入的模型空间或图纸空间的Id /// 块参照要加入的图层名 /// 块参照所属的块名 /// 插入点 /// 缩放比例 /// 旋转角度 /// 实体Id public static ObjectId InsertBlockReference(this ObjectId spaceId, string layer, string blockName, Point3d position, Scale3d scale, double rotateAngle = 0) /// /// 块参照添加属性实体 /// /// 块表记录Id /// 要加入的块属性列表 public static void AddAttributeToBlock(this ObjectId blockId, List atts) /// /// 重载AddAttributeToBlock扩展函数,使其能接受不固定的属性定义对象 /// /// 块表记录Id /// 属性定义数组 public static void AddAttributeToBlock(this ObjectId blockId, params AttributeDefinition[] atts) /// /// CAD图形中插入带属性的块参照 /// /// 块参照要加入的模型空间或图纸空间的Id /// 块参照要加入的图层名 /// 块参照所属的块名 /// 插入点 /// 缩放比例 /// 旋转角度 /// 表示属性的名称与取值 /// 实体Id public static ObjectId InsertBlockReference(this ObjectId spaceId, string layer, string blockName, Point3d position, Scale3d scale, double rotateAngle, Dictionary attNameValues) /// /// 更新块参照中的属性值 /// /// 块参照Id /// 需要更新的属性名称与取值 /// 事务对象(可选) public static void UpdateAttributeInBlock(this ObjectId blockRefId, Dictionary attNameValues, Transaction transaction = null) /// /// 更新块属性选项 /// public class UpdateAttributeOptions /// /// 增强版:更新块参照中的属性值 /// /// 块参照Id /// 需要更新的属性名称与取值 /// 更新选项 /// 如果更新成功返回true,否则返回false public static bool UpdateAttributesInBlock(this ObjectId blockRefId, Dictionary attNameValues, UpdateAttributeOptions options = null) /// /// 设置属性定义的通用样式 /// /// 属性定义 /// 属性文字的可见性 public static void SetStyleForAtt(this AttributeDefinition att, bool invisible) /// /// 读取块中的属性值 /// /// 图形数据库 /// 块名 /// 属性字典 public static Dictionary ReadDataInBlock(this Database db, string blockName) /// /// 获取动态块的动态属性值 /// /// 动态块的ObjectId /// 需要查找的动态属性名 /// 动态属性值 public static string GetDynamicBlockValue(this ObjectId blockId, string propName) /// /// 获取动态块的动态属性值 /// /// 图形数据库 /// 块名 /// 需要查找的动态属性名 /// 动态属性值 public static string GetDynamicBlockValue(this Database db, string blockName, string propName) /// /// 获得动态块的所有动态属性 /// /// 动态块的ObjectId /// 动态属性集合 public static DynamicBlockReferencePropertyCollection GetDynProperties(this ObjectId blockId) /// /// 设置动态块的动态属性 /// /// 动态块的ObjectId /// 动态属性的名称 /// 动态属性的值 public static void SetDynamicBlockValue(this ObjectId blockId, string propName, object value) /// /// 获取特定类型的所有实体 /// /// 实体类型 /// 图形数据库 /// 打开模式 /// 是否打开已删除的实体 /// 类型为T的实体列表 public static List GetEntsInDatabase(this Database db, OpenMode mode, bool OpenErased) where T : Entity /// /// 只需要以读的方式获取数据库中特定类型的实体 /// /// 实体类型 /// 图形数据库 /// 实体列表 public static List GetEntsInDatabase(this Database db) where T : Entity /// /// 获取特定类型(模型空间中)的所有实体 /// /// 实体类型 /// 图形数据库 /// 打开模式 /// 是否打开已删除的实体 /// 类型为T的实体列表 public static List GetEntsInModelSpace(this Database db, OpenMode mode, bool OpenErased) where T : Entity /// /// 获取特定类型(模型空间中)的所有实体 /// /// 块参照类型 /// 图形数据库 /// 打开模式 /// 是否打开已删除的实体 /// 类型为T的实体列表 public static List GetEntsInModelSpaces(this Database db, OpenMode mode, bool OpenErased) where T : BlockReference /// /// 获取特定类型的所有实体 /// /// 实体类型 /// 图形数据库 /// 打开模式 /// 是否打开已删除的实体 /// 类型为T的实体列表 public static List GetSelections(this Database db, OpenMode mode, bool OpenErased) where T : Entity /// /// 获取动态块/非动态块的块名 /// /// 块参照对象 /// 返回块名字符串,如果块参照不存在则返回null public static string GetBlockName(this BlockReference bref) /// /// 动态块的读取(DWG) /// /// DWG文件名 /// 动态块名 public static void InitialZwBlockReference(this string blockDWGName, string blockName) /// /// 根据想要显示的值去显示 /// /// 块参照对象 /// 块名 public static void CheckBlockPropertyValue(this BlockReference br, string blockName) /// /// 修改动态块属性 /// /// 动态块名 /// 修改的属性名 /// 修改的属性值 /// 事务 public static void ModifyDynamicBlockParameter(this string blockName, string paramName, object paramValue, Transaction trans) /// /// 从外部文件导入块 /// /// 目标数据库 /// 包含完整路径的外部文件名 public static void ImportBlocksFromDwg(this Database destDb, string sourceFileName) /// /// 找到自定义属性的类型 /// /// 文档 /// 块名 public static void GetPropType(this Document doc, string blockName) /// /// 动态块个数 /// /// 当前文档 /// 实体数量 public static double RecursionBlock(this Document doc) /// /// 递归块引用 /// /// 块参照 /// 实体列表 private static List GetBlockEntity(this BlockReference refblock) /// /// 插入一个块 /// /// 文档 /// 提示消息 /// 如果插入成功返回true,否则返回false public static bool InsertBlock(this Document doc, string message = "请输入块名称") /// /// 创建一个块 /// /// 当前文档 /// 提示信息 /// 实体 public static Entity CreateBlock(this Document doc, string message) } } ``` ##### Line类扩展 ``` CSharp namespace AutoCAD.EntityTools { /// /// 直线工具类 /// public static class LineTools { /// /// 获取直线长度 /// /// 直线对象 /// 直线长度 public static double GetLineLength(this Line line) /// /// 计算两条平行线之间的最短距离 /// /// 第一条直线 /// 第二条直线 /// 几何容差 /// 最短距离,如果不平行返回double.NaN public static double CalculateShortestDistanceBetweenParallelLines(this Line line1, Line line2, double tolerance) /// /// 检查直线相交并在相交处裁剪两条线的短边(仅当短边有长度时) /// /// 文档对象 /// 直线ObjectId列表 public static void TrimValidShortSidesAtIntersections(this Document doc, List lineIds) /// /// 计算两条平行曲线之间的中线(支持不等长情况) /// /// 第一条曲线 /// 第二条曲线 /// 距离容差 /// 中线列表(可能包含多条线段) public static List CalculateCenterLines(this Curve curve1, Curve curve2, double distanceTolerance) /// /// 计算两条平行直线的中线(优化版) /// /// 第一条直线 /// 第二条直线 /// 距离容差 /// 中线对象,如果输入无效则返回null public static Line CalculateLineCenterLine(Line line1, Line line2, double distanceTolerance) /// /// 获取点在直线上的投影点 /// /// 直线对象 /// 要投影的点 /// 投影点 public static Point3d GetProjectionPoint(Line line, Point3d point) } } ``` #### Exception类扩展 ``` CSharp namespace AutoCAD.EntityTools { /// /// 异常处理工具类 /// public static class ExceptionTools { /// /// 处理异常 /// /// 异常对象 /// 发生错误的函数名 public static void HandleEntityToolErrorSend(this Exception ex, string errorFunction) /// /// 处理实体工具异常 /// /// 异常对象 /// 发生错误的函数名 /// 是否显示警报对话框 /// 是否记录到Trace public static void HandleEntityToolError(this Exception ex, string errorFunction, bool showAlert = true, bool logToTrace = true) /// /// 构建错误消息 /// /// 异常对象 /// 发生错误的函数名 /// 格式化后的错误消息 public static string BuildErrorMessage(this Exception ex, string errorFunction) /// /// 输出到CAD消息 /// /// 错误消息 /// 异常对象 public static void OutputToCadMessages(this string errorMessage, Exception ex) /// /// 显示警报消息 /// /// 异常对象 /// 发生错误的函数名 public static void ShowAlertMessage(this Exception ex, string errorFunction) /// /// 获取用户友好的错误消息 /// /// 异常对象 /// 用户友好的错误消息 public static string GetUserFriendlyMessage(this Exception ex) /// /// 记录到Trace /// /// 异常对象 /// 错误消息 public static void LogToTrace(this Exception ex, string errorMessage) /// /// 记录到Windows事件日志 /// /// 异常对象 public static void LogToEventLog(this Exception ex) /// /// 处理异常处理程序本身的异常 /// /// 异常处理程序抛出的异常 public static void HandleHandlerException(this Exception handlerEx) /// /// 简化的异常处理扩展方法 /// /// 异常对象 /// 上下文信息 public static void HandleSimple(this Exception ex, string context = null) } } ``` #### Dimension扩展 ``` CSharp /// /// 在曲线上创建建筑样式长度标注 /// /// 曲线 /// database /// 曲线长度标注选项 /// 返回 /// public static AlignedDimension CreateLengthDimension(this Curve curve,Database db, LengthDimensionOptions options = null) /// /// 曲线长度标注选项 /// public class LengthDimensionOptions { /// 文字前缀(如:长度、L=等) public string TextPrefix { get; set; } = ""; /// 文字后缀 public string TextSuffix { get; set; } = ""; /// 文字位置 public DimensionTextPosition TextPosition { get; set; } = DimensionTextPosition.Above; /// 标注样式名 public string DimensionStyle { get; set; } = "Standard"; /// 基础文字高度 public double BaseTextHeight { get; set; } = 2.0; /// 基础延伸线长度 public double BaseExtensionLength { get; set; } = 1.5; /// 箭头大小比例 public double ArrowSizeScale { get; set; } = 1.0; public int ColorIndex { get; set; } = 3; /// 标注偏移距离(相对于曲线) public double OffsetDistance { get; set; } = 10.0; } ``` #### String类扩展 ``` CSharp namespace AutoCAD.EntityTools { /// /// 字符串工具类 /// public static class StringTools { /// /// 将Point3d转换为标准坐标字符串 (X,Y,Z) /// /// 三维点 /// 小数位数(默认3位) /// 格式化的坐标字符串 public static string ToCoordinateString(this Point3d point, int decimalPlaces = 3) /// /// 将Point2d转换为标准坐标字符串 (X,Y) /// /// 二维点 /// 小数位数(默认3位) /// 格式化的坐标字符串 public static string ToCoordinateString(this Point2d point, int decimalPlaces = 3) /// /// 处理字符串中的换行符 /// /// 输入字符串 /// 处理后的字符串 public static string ProcessNewLines(this string input) /// /// 从字符串解析Point3d (支持X,Y,Z或X,Y格式) /// /// 坐标字符串 /// 解析后的Point3d public static Point3d ParsePoint3d(string coordString) /// /// 获取点的X坐标字符串 /// /// 三维点 /// 小数位数 /// X坐标字符串 public static string GetXString(this Point3d point, int decimalPlaces = 3) /// /// 获取点的Y坐标字符串 /// /// 三维点 /// 小数位数 /// Y坐标字符串 public static string GetYString(this Point3d point, int decimalPlaces = 3) /// /// 获取点的Z坐标字符串 /// /// 三维点 /// 小数位数 /// Z坐标字符串 public static string GetZString(this Point3d point, int decimalPlaces = 3) /// /// 将点转换为WKT(Well-Known Text)格式 /// /// 三维点 /// WKT格式字符串 public static string ToWktString(this Point3d point) /// /// 将点转换为JSON格式 /// /// 三维点 /// JSON格式字符串 public static string ToJsonString(this Point3d point) /// /// 计算两点之间的距离 /// /// 第一个点 /// 第二个点 /// 两点之间的距离 public static double DistanceTo(this Point3d point1, Point3d point2) /// /// 将Point3d转换为Point2d(丢弃Z坐标) /// /// 三维点 /// 二维点 public static Point2d ToPoint2d(this Point3d point) /// /// 将Point2d转换为Point3d(Z坐标设为0) /// /// 二维点 /// 三维点 public static Point3d ToPoint3d(this Point2d point) } } ``` ##### Double类扩展 ``` CSharp namespace AutoCAD.EntityTools { /// /// 双精度浮点数工具类 /// public static class DoubleTools { /// /// 检查两个双精度浮点数是否在指定的误差范围内几乎相等 /// /// 第一个双精度浮点数 /// 第二个双精度浮点数 /// 差值 /// 最大绝对误差 /// 如果两个数在误差范围内几乎相等返回true,否则返回false public static bool AlmostEqualNorm(this double a, double b, double diff, double maximumAbsoluteError) /// /// 检查两个双精度浮点数是否在指定的误差范围内几乎相等 /// /// 第一个双精度浮点数 /// 第二个双精度浮点数 /// 最大绝对误差 /// 如果两个数在误差范围内几乎相等返回true,否则返回false public static bool AlmostEqual(this double a, double b, double maximumAbsoluteError) /// /// 检查双精度浮点数是否在指定的误差范围内接近零 /// /// 要检查的数值 /// 误差范围 /// 如果数值在误差范围内接近零,则返回true;否则返回false public static bool IsZero(this double value, double epsilon) /// /// 将字符串解析为整数,如果解析失败则返回默认值 /// /// 要解析的字符串 /// 默认值 /// 解析后的整数值或默认值 public static int ParseToIntOrDefault(this string input, int defaultValue = 0) } } ``` #### Text类扩展 ``` CSharp namespace AutoCAD.EntityTools { /// /// 文字工具类 /// public static class TextTools { /// /// 在指定位置插入文字(支持颜色和字号) /// /// 文档对象 /// 插入点坐标 /// 颜色索引(ACI颜色) /// 文字内容 /// 文字高度 /// 图层名(可选) /// 插入的文字ObjectId public static ObjectId InsertText(this Document doc, Point3d position, short colorIndex, string text, double textHeight, string layerName = "0") /// /// 批量插入文字(高性能版) /// /// 文档对象 /// 位置集合 /// 颜色索引 /// 文字内容集合 /// 文字高度 /// 插入的文字ObjectId列表 public static List InsertTexts(this Document doc, IEnumerable positions, short colorIndex, IEnumerable texts, double textHeight) /// /// 在指定位置插入文字(支持颜色和字号) /// /// 位置 /// 文字内容 /// 图层名 /// 颜色索引 /// 文字高度 /// 多行文字对象 public static MText InsertText(this Point3d location, string msg, string layerName, int colorIndex = 4, double height = 350) /// /// 在指定位置显示文字 /// /// 位置 /// 信息索引 /// 文字高度 /// 多行文字对象 public static MText ShowText(this Point3d location, int i, double height = 80) } } ``` #### ShowMessage扩展 ``` CSharp namespace AutoCAD.EntityTools { /// /// 消息显示工具类 /// public static class ShowMessageTools { /// /// 弹窗提示 /// /// 提示字符 public static void CadAlert(this string str) /// /// 命令行提示 /// /// 提示字符 public static void CadMessage(this string str) /// /// 命令行提示 /// /// 提示字符 public static void CadMessage2(this string str) /// /// 命令行提示操作结果 /// /// 操作是否成功 /// 操作名称 public static void CadMessage(this bool isSuccess, string operation) /// /// EntityTool对话框 /// /// 输出信息 public static void EntityToolMessage(this string message) /// /// 显示进度条 /// /// 提示消息 /// 更新进度条后的延迟时间(毫秒) /// 实体数组 public static void ShowProgressBar(this string showMessage, int time = 100, params TEntity[] entities) where TEntity : Entity } } ``` #### Unit扩展 ``` CSharp namespace AutoCAD.EntityTools { /// /// 单位转换工具类 /// public static class UnitTools { /// /// 角度转弧度 /// /// 角度 /// 弧度 public static double DegreeToAngle(this double degree) /// /// 弧度转角度 /// /// 弧度 /// 角度 public static double AngleToDegree(this double angle) } } ``` #### Vector扩展 ``` CSharp namespace AutoCAD.EntityTools { /// /// 向量工具类 /// public static class VectorTools { } /// /// 向量比较器(考虑容差) /// public class VectorEqualityComparer : IEqualityComparer { private readonly double _tolerance; /// /// 构造函数 /// /// 容差值 public VectorEqualityComparer(double tolerance) /// /// 比较两个向量是否相等(考虑容差) /// /// 第一个向量 /// 第二个向量 /// 如果向量相等返回true,否则返回false public bool Equals(Vector3d v1, Vector3d v2) /// /// 获取向量的哈希码 /// /// 向量对象 /// 哈希码 public int GetHashCode(Vector3d obj) } } ``` #### CadFileOperation ``` CSharp namespace AutoCAD.EntityTools { /// /// CAD文件操作工具类 /// public static class CadFileOperationTools { /// /// 保存当前图形 /// /// 当前文档 public static void SaveCurrentDrawing(this Document doc) /// /// 另存当前图形 /// /// 当前文档 public static void SaveDrawingAs(this Document doc) /// /// 导出选定对象到新文件 /// /// 要导出的对象ID列表 /// 目标文件路径 public static void ExportObjectsToFile(this List objectIds, string filePath) /// /// 导出选定对象到新文件(带交互选择) /// /// 当前文档 public static void ExportSelectedObjects(this Document doc) /// /// 创建新图纸 /// /// 当前文档 public static void CreateNewDrawing(this Document doc) } } ``` #### Ribbon封装类调用示例 ``` CSharp namespace AutoCAD.EntityTool.Tests { /// /// 测试功能的Ribbon命令实现 /// public class TestRibbonCommand : RibbonCommand { public RelayCommand RunCommand { get; set; } public RelayCommand InsertTextTestCommand { get; set; } public RelayCommand CadAlertTestCommand { get; set; } public TestRibbonCommand() { InitializeCommands(); } /// /// 初始化命令 /// private void InitializeCommands() { RunCommand = new RelayCommand(() => SendCommand(nameof(Demo.Run))); InsertTextTestCommand = new RelayCommand(() => SendCommand(nameof(TextToolsTest.InsertTextTest))); CadAlertTestCommand = new RelayCommand(() => SendCommand(nameof(ShowMessageToolsTest.CadAlertTest))); } /// /// 重写获取命令的方法 /// public override ICommand GetCommand(string commandName) { switch (commandName) { case "RunCommand": return RunCommand; case "InsertTextTestCommand": return InsertTextTestCommand; case "CadAlertTestCommand": return CadAlertTestCommand; default: return null; } } } /// /// 测试功能的Ribbon构建器 /// public class TestRibbonBuilder : RibbonBuilderBase { public TestRibbonBuilder() : base() { } /// /// 重写初始化配置 /// protected override void InitializeDefaults() { // 自定义配置 _tabId = "_TestTab"; _tabTitle = "测试功能区"; _configXmlPath = Path.Combine(ConfigPath._ProfilePath2, "TestConfig.xml"); //_iconsBasePath = Path.Combine(ConfigPath.AssemblyRunRootPath, "TestIcons"); _iconsBasePath = Path.Combine(ConfigPath.AssemblyRunRootPath); // 自定义面板 _panelConfigs.Clear(); _panelConfigs.Add(new PanelConfig { Title = "测试工具", Orientation = Orientation.Vertical }); // 初始化命令 _ribbonCommand = new TestRibbonCommand(); } /// /// 重写命令获取方法 /// protected override ICommand GetCommand(string commandName) { // 可以在这里添加自定义的命令映射 return base.GetCommand(commandName); } /// /// 重写按钮创建方法 /// protected override void CreateButton(ICommand command, string text, string image, out RibbonButton button, string expandimgPath, string commandName, string title, string content, string expandcontent, Orientation orientation = Orientation.Horizontal) { base.CreateButton(command, text, image, out button, expandimgPath, commandName, title, content, expandcontent, orientation); //// 自定义按钮样式 //button.Description = $"测试功能: {text}"; //button.ToolTip = $"执行测试命令: {text}"; } } // 程序集注册 //[assembly: ExtensionApplication(typeof(TestAppStart))] /// /// 测试功能的AppStart实现 /// public class TestAppStart : AppStartBase { /// /// 加载UI界面 /// protected override void LoadUI() { _ribbonBuilder = CreateRibbonBuilder(); if (_ribbonBuilder != null) { bool result = _ribbonBuilder.CreateRibbon(); if (result) { "测试功能Ribbon界面加载完成".CadMessage2(); } else { "测试功能Ribbon界面加载失败".CadMessage2(); } } } protected override void LoadDependencies() { //不加载任何依赖项 } /// /// 创建Ribbon构建器 /// protected override RibbonBuilderBase CreateRibbonBuilder() { return new TestRibbonBuilder(); } } } _configXmlPath = Path.Combine(ConfigPath._ProfilePath2, "TestConfig.xml"); var imagePath32 = Path.Combine(_iconsBasePath, "icons", $"{image}32.png"); var imagePath16 = Path.Combine(_iconsBasePath, "icons", $"{image}16.png");