我的第一个autocad 插件编写,可以自动列出图形中的全部边界对象的面积。

我在CAD中设置了几个边界对象,如何列出全部边界对象及其面积。

使用 LISP 脚本

(defun c:ListAreas ( / ss i ent area)
(setq ss (ssget '((0 . "LWPOLYLINE, POLYLINE"))))
(setq i 0)
(while (< i (sslength ss))
(setq ent (ssname ss i))
(setq area (cdr (assoc 40 (entget ent))))
(princ (strcat "\nObject " (itoa (+ i 1)) ": Area = " (rtos area 2 2) " sq. units"))
(setq i (1+ i))
)
(princ)
)

在命令行中输入 APPLOAD 加载此 LISP 脚本,然后输入 ListAreas 命令来列出所有边界对象的面积。

这个 AutoLISP 脚本用于列出选定的 LWPOLYLINE 和 POLYLINE 对象的面积。你提到想将这个脚本转换为 .NET C# 实现。以下是等效的 .NET 实现。

.NET C# 实现

这个 C# 代码使用 AutoCAD 的 .NET API 来实现相同的功能,即列出选定的多段线对象的面积。

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;

[assembly: CommandClass(typeof(MyCADPlugin.MyCommands))]

namespace MyCADPlugin
{
    public class MyCommands
    {
        [CommandMethod("ListAreas")]
        public void ListAreas()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            // 设置选择过滤器,仅选择 LWPOLYLINE 和 POLYLINE 对象
            TypedValue[] filterList = new TypedValue[]
            {
                new TypedValue((int)DxfCode.Start, "LWPOLYLINE,POLYLINE")
            };
            SelectionFilter filter = new SelectionFilter(filterList);

            // 选择对象
            PromptSelectionOptions opts = new PromptSelectionOptions();
            PromptSelectionResult res = ed.GetSelection(opts, filter);

            if (res.Status != PromptStatus.OK)
            {
                ed.WriteMessage("\nNo objects selected.");
                return;
            }

            SelectionSet selSet = res.Value;
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                int index = 1;
                foreach (SelectedObject selObj in selSet)
                {
                    if (selObj != null)
                    {
                        // 获取对象并检查是否为 Polyline 或 Polyline2d
                        Entity ent = trans.GetObject(selObj.ObjectId, OpenMode.ForRead) as Entity;
                        double area = 0;

                        if (ent is Polyline)
                        {
                            Polyline pl = ent as Polyline;
                            area = pl.Area;
                        }
                        else if (ent is Polyline2d)
                        {
                            Polyline2d pl2d = ent as Polyline2d;
                            area = pl2d.Area;
                        }

                        // 输出面积
                        ed.WriteMessage($"\nObject {index}: Area = {area:F2} sq. units");
                        index++;
                    }
                }
                trans.Commit();
            }
        }
    }
}

代码说明

  1. 命令属性:
  • [CommandMethod("ListAreas")] 标记了一个可以在 AutoCAD 中调用的命令 ListAreas。
  1. 选择过滤器:
  • TypedValue[] filterList 用于定义选择过滤器,限制用户只能选择 LWPOLYLINE 和 POLYLINE 对象。
  1. 事务管理:
  • Transaction 确保数据库操作可以在失败时回滚。
  1. 计算面积:
  • 对于 Polyline 和 Polyline2d 对象,使用其 Area 属性计算并输出面积。
  1. 输出结果:
  • 使用 Editor.WriteMessage 将每个对象的面积输出到命令行。

使用方法

  1. 编译项目:在 Visual Studio 中编译此项目以生成 DLL 文件。
  2. 加载到 AutoCAD:在 AutoCAD 中使用 NETLOAD 命令加载生成的 DLL。
  3. 运行命令:在命令行中输入 ListAreas,然后选择多个多段线对象,命令会输出它们的面积。

这个 .NET 实现不仅效率高,而且更具可扩展性和灵活性。你可以根据需要进一步扩展该功能。

注意要添加对 AutoCAD .NET API 程序集的引用。

1. 添加 AutoCAD .NET 程序集引用

在 Visual Studio 中:

  1. 右键点击你的项目名称,然后选择“添加引用”。
  2. 在“参考管理器”窗口中,选择“浏览”选项卡。
  3. 找到以下 DLL 文件并添加引用(通常位于 AutoCAD 安装目录下的 Program Files 文件夹中):
  • AcDbMgd.dll
  • AcMgd.dll
  • AcCoreMgd.dll
  • AdWindows.dll(有些功能可能需要) 这些 DLL 通常在路径 C:\Program Files\Autodesk\AutoCAD 202x\ 下。
  1. 添加这些引用后,点击“确定”按钮。

2. 确保使用正确的 .NET Framework 版本

AutoCAD 通常使用 .NET Framework 4.x 版本,确保你的项目目标框架版本与 AutoCAD 兼容。

  1. 右键点击你的项目名称,选择“属性”。
  2. 在“应用程序”选项卡中,检查并设置 目标框架 为 .NET Framework 4.x,例如 4.7.2 或更高。

3. 使用正确的命名空间和引用

在代码文件中,确保使用正确的命名空间:

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;

4. 编译并测试

现在你可以重新编译项目。编译成功后,使用 NETLOAD 命令加载生成的 DLL 文件到 AutoCAD 中,并执行你创建的命令。

通过这些步骤,Visual Studio 应该能够正确识别并使用 AutoCAD 的 .NET API,从而解决命名空间和程序集引用的问题。

0

评论0

请先
JTG/T 3912-01~08-2022 装配化箱形组合梁钢桥通用图合集下载
JTG/T 3912-01~08-2022 装配化箱形组合梁钢桥通用图合集下载
10分钟前 有人购买 去瞅瞅看
没有账号?注册  忘记密码?

社交账号快速登录

微信扫一扫关注
扫码关注后会自动登录网站