c# cass10 获取宗地内所有封闭线段的面积

获取面积的主要流程如下:

  1. 获取当前AutoCAD应用中的活动文档、数据库和编辑器对象。
  2. 创建一个选择过滤器,限制用户只能选择"宗地"图层上的LWPOLYLINE对象作为外部边界。
  3. 提示用户根据上述规则进行实体选择,并获取选择结果。
  4. 检查用户是否成功选择了实体。
  5. 开始事务处理以确保数据一致性。
  6. 遍历所有被选中的外部多段线。
  7. 读取所选多段线,并确保它是闭合的且至少有一个顶点。
  8. 创建一个表示外部多段线边界坐标的点集合。
  9. 创建一个窗口选择过滤器,用于选择位于外部多段线内的所有实体。
  10. 使用多边形窗口选择方式让用户选择位于外部多段线内的实体,并获取选择结果。
  11. 检查用户是否成功在内部区域进行了实体选择。
  12. 遍历用户在内部区域所选的所有闭合多段线。
  13. 获取多段线的面积,并输出到编辑器中。

在AutoCAD应用程序中,我们经常需要计算图形的面积。下面是一个示例方法,演示了如何获取AutoCAD中多段线的面积。

首先,我们需要获取当前活动的文档、数据库和编辑器对象。这可以通过以下代码实现:

Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;

接下来,我们需要限制用户只能选择"宗地"图层上的多段线对象作为外部边界。为此,我们创建一个选择过滤器,并将其应用于选择命令。代码如下:

SelectionFilter outerFilter = new SelectionFilter(new TypedValue[] {
    new TypedValue((int)DxfCode.Start, "LWPOLYLINE"),
    new TypedValue((int)DxfCode.LayerName, "宗地")
});
PromptSelectionResult outerSelRes = ed.GetSelection(outerFilter);

然后,我们检查用户是否成功选择了实体。如果选择成功,我们开始一个事务处理以确保数据一致性。代码如下:

if (outerSelRes.Status == PromptStatus.OK)
{
    using (Transaction tr = db.TransactionManager.StartTransaction())
    {
        // 遍历所有被选中的外部多段线
        foreach (ObjectId outerId in outerSelRes.Value.GetObjectIds())
        {
            // 读取所选多段线
            using (Polyline outerPolyline = (Polyline)tr.GetObject(outerId, OpenMode.ForRead))
            {
                // 确保所选多段线是闭合的且至少有一个顶点
                if (outerPolyline.Closed && outerPolyline.NumberOfVertices > 0)
                {
                    // 创建一个表示外部多段线边界坐标的点集合
                    Point3dCollection outerPoints = new Point3dCollection();
                    for (int i = 0; i < outerPolyline.NumberOfVertices; i++)
                    {
                        Point3d point = outerPolyline.GetPoint3dAt(i);
                        outerPoints.Add(point);
                    }

                    // 创建一个窗口选择过滤器,用于选择位于外部多段线内的所有实体
                    SelectionFilter innerFilter = new SelectionFilter(new TypedValue[] {
                        new TypedValue((int)DxfCode.Start, "LWPOLYLINE")
                    });

                    // 使用多边形窗口选择方式让用户选择位于外部多段线内的实体
                    PromptSelectionResult innerSelRes = ed.SelectWindowPolygon(outerPoints, innerFilter);

                    // 检查用户是否成功在内部区域进行了实体选择
                    if (innerSelRes.Status == PromptStatus.OK)
                    {
                        SelectionSet innerSelectionSet = innerSelRes.Value;
                        // 遍历用户在内部区域所选的所有闭合多段线
                        foreach (ObjectId id2 in innerSelectionSet.GetObjectIds())
                        {
                            using (Polyline polyline2 = (Polyline)tr.GetObject(id2, OpenMode.ForRead))
                            {
                                if (polyline2.Closed && polyline2.NumberOfVertices > 0)
                                {
                                    // 获取多边形的面积
                                    double area = polyline2.Area;
                                    ed.WriteMessage($"\n内部多段线 {id2} 内部的总多边形面积为: {area.ToString("0.00")}");
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

以上代码中,我们首先检查用户是否成功选择了外部多段线作为边界。然后,我们创建一个包含外部多段线边界坐标的点集合。接下来,我们使用多边形窗口选择方式,让用户选择位于外部多段线内的实体。最后,我们遍历用户在内部区域所选的所有闭合多段线,并计算其面积。

这是一个简单的示例,演示了如何在AutoCAD中获取多段线的面积。您可以根据自己的需求进行修改和扩展。

完整代码

    [CommandMethod("GetArea")]
    public void GetArea()
    {
        // 获取当前AutoCAD应用中的活动文档、数据库和编辑器对象
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Database db = doc.Database;
        Editor ed = doc.Editor;

        // 创建一个选择过滤器,限制用户只能选择"宗地"图层上的LWPOLYLINE对象作为外部边界
        SelectionFilter outerFilter = new SelectionFilter(new TypedValue[] {
    new TypedValue((int)DxfCode.Start, "LWPOLYLINE"),
    new TypedValue((int)DxfCode.LayerName, "宗地")
});
        // 提示用户根据上述规则进行实体选择,并获取选择结果
        PromptSelectionResult outerSelRes = ed.GetSelection(outerFilter);
        // 检查用户是否成功选择了实体
        if (outerSelRes.Status == PromptStatus.OK)
        {
            using (Transaction tr = db.TransactionManager.StartTransaction())// 开始事务处理以确保数据一致性
            {
                foreach (ObjectId outerId in outerSelRes.Value.GetObjectIds())// 遍历所有被选中的外部多段线
                {
                    using (Polyline outerPolyline = (Polyline)tr.GetObject(outerId, OpenMode.ForRead))// 读取所选多段线
                    {
                        // 确保所选多段线是闭合的且至少有一个顶点
                        if (outerPolyline.Closed && outerPolyline.NumberOfVertices > 0)
                        {
                            // 创建并填充一个表示外部多段线边界坐标的点集合
                            Point3dCollection outerPoints = new Point3dCollection();
                            for (int i = 0; i < outerPolyline.NumberOfVertices; i++)
                            {
                                Point3d point = outerPolyline.GetPoint3dAt(i);
                                outerPoints.Add(point);
                            }

                            // 创建一个窗口选择过滤器,用于选择位于外部多段线内的所有实体
                            SelectionFilter innerFilter = new SelectionFilter(new TypedValue[] {
                        new TypedValue((int)DxfCode.Start, "LWPOLYLINE")
                    });
                            // 使用多边形窗口选择方式让用户选择位于外部多段线内的实体
                            PromptSelectionResult innerSelRes = ed.SelectWindowPolygon(outerPoints, innerFilter);
                            // 检查用户是否成功在内部区域进行了实体选择
                            if (innerSelRes.Status == PromptStatus.OK)
                            {
                                SelectionSet innerSelectionSet = innerSelRes.Value;
                                // 遍历用户在内部区域所选的所有闭合多段线
                                foreach (ObjectId id2 in innerSelectionSet.GetObjectIds())
                                {
                                    using (Polyline polyline2 = (Polyline)tr.GetObject(id2, OpenMode.ForRead))
                                    {
                                        if (polyline2.Closed && polyline2.NumberOfVertices > 0)
                                        {
                                            double area = polyline2.Area;
                                            ed.WriteMessage($"\n内部多段线 {id2} 内部的总多边形面积为: {area.ToString("0.00")}");
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }

 //感谢大家的点赞,收藏,转发,关注

你可能感兴趣的:(CAD二次开发,c#)