我在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. 计算面积:
  • 对于 PolylinePolyline2d 对象,使用其 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

请先
NB∕T 10968-2022 水电工程勘察设计费计算标准
NB∕T 10968-2022 水电工程勘察设计费计算标准
1分钟前 有人购买 去瞅瞅看

社交账号快速登录

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