# DotnetArxLearn **Repository Path**: xsyww/dotnet-arx-learn ## Basic Information - **Project Name**: DotnetArxLearn - **Description**: 学习.net cad二次开发的示例和联系工程 - **Primary Language**: Unknown - **License**: BSD-3-Clause - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2021-08-09 - **Last Updated**: 2025-07-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Dotnet Arx Learning 这里是我学习Dotnet Arx一些经验分享 ## vs项目 * 以cad2020为例,.net framework版本使用的是4.7 * 直接以类库编译生成的dll即可 * 项目引用arx库inc目录下所有的dll,引用的CopyLocal属性设置为false ## Dll命令入口 代码函数有两个可以被cad调用的入口,`IExtensionApplication`接口和属性`CommandMethod` ### `IExternalApplication`接口 ```csharp public class EmployeeExtApp : IExtensionApplication { public void Initialize() { // dll加载时被执行 } public void Terminate() { // 因为.net dll无法被手动卸载,所以这个方法是在cad关闭时被执行 } } ``` 如果不需要有自动执行和清理的代码,这两个方法可以是个空方法。 ### `CommandMethod`方法属性 可以在具体的方法上添加这个属性,并指定命令触发文本。 如下方的代码可以在加载dll后,命令行输入helloworld来触发这个函数被执行。 ```csharp [CommandMethod("helloworld")] public void HelloWorld() { Application.DocumentManager.MdiActiveDocument?.Editor.WriteMessage("HelloWorld!"); } ``` ## 加载优化 CAD是通过反射得到里面所有的IExternalApplication和CommandMethod的, 如果里面的这些可供执行的这两个东西很多,那么加载dll的时间就会变慢, 为了解决这个问题,可以使用以下的两个程序集属性来告诉cad我的dll里有哪些命令入口。 `ExtensionApplication` 和 `CommandClass` ```csharp [assmebly: ExtensionApplication(typeof(HelloWorld.HelloWorldApp))] [assmebly: CommandClass(typeof(HelloWorld.HelloWorldCommands))] namespace HelloWorld { public class HelloWorldApp : IExtensionApplication { // } public class HelloWorldCommands { [CommandMethod("hello")] public void SayHello() { // } } } ``` * `ExtensionApplication` 只能修饰实现了`IExtensionApplication`的类,且整个程序集中只能有一个。 * `CommandClass`则用来修饰内部有`CommandMethod`命令方法的类。它可以有多个。 ## Layouts and Plot Layout就是CAD中的布局,同时它也是打印相关参数的保存实体。 ### Layout获取 Layout是保存在LayoutDictionary中的。可以先通过db.LayoutDictionaryId获得DBDictionary, 然后通过GetAt(layoutName)方法来直接获取到对应id,继而直接得到Layout对象 ```csharp var layoutDictionary = trans.GetObject(db.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary; var layout = layoutDictionary.GetAt(layoutName).GetObject(OpenMode.ForRead) as Layout; ``` ## 菜单加载 2010以后的版本可以通过 `Application.LoadPartialMenu(cuixFile)` 方法来实现