获取宗地内所有房屋占地面积主要步骤:
-
获取当前AutoCAD应用中的活动文档、数据库和编辑器对象,以便进行交互操作。
-
创建一个外部多段线的选择过滤器
outerFilter
,限制用户只能选择图层为"宗地"上的LWPOLYLINE对象作为外部边界。 -
提示用户根据设定的过滤器规则选择实体,并获取用户的选择结果。
-
如果用户成功选择了实体,则开启事务处理,确保数据一致性。
-
遍历所有被选中的外部多段线,对每个多段线执行以下操作: a. 确认多段线闭合且至少有一个顶点。 b. 将多段线的所有顶点坐标收集到
outerPoints
集合中。 c. 创建一个窗口选择过滤器innerFilter
,用于让用户选择位于外部多段线内部的其他LWPOLYLINE实体。 d. 使用多边形窗口方式让用户进行内部实体的选择,并获取选择结果。 -
计算房屋面积(
areaFW
)、房屋附属面积(areaFWFS
)及总面积(total_area
),并初始化这三个变量为0。 -
针对用户在内部区域成功选择的每个闭合多段线,检查实体的XData信息以判断其类型,并据此计算相应的面积:
- 若实体属于特定类型的建筑主体部分,则通过读取XData中的层数信息乘以多段线面积来计算面积,并累加至总房屋面积。
- 若实体属于飘楼、阳台等附属设施类型,则进一步筛选出特定图层上的文本对象,依据文本内容计算面积,将面积累加至房屋附属面积。
-
最后,在循环结束后输出累计得到的总面积。
完整代码
[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())// 开始事务处理以确保