运行环境Visual Studio 2022 c# cad2016 cass10
通过面积计算得到扩展数据,宗地面积 ,房屋占地面积,房屋使用面积
一、主要步骤
- 获取当前AutoCAD应用中的活动文档、数据库和编辑器对象。
- 创建一个选择过滤器,限制用户只能选择"宗地"图层上的LWPOLYLINE对象作为外部边界。
- 提示用户根据上述规则进行实体选择,并获取选择结果。
- 遍历所有被选中的外部多段线,确保所选多段线是闭合的且至少有一个顶点。
- 创建并填充一个表示外部多段线边界坐标的点集合。
- 使用多边形窗口选择方式让用户选择位于外部多段线内的实体。
- 遍历用户在内部区域所选的所有闭合多段线,计算房屋面积和附属面积。
- 计算宗地面积和输出结果。
二、完整代码
internal class zdfwmj
{
public static List<string> filelist1 = new List<string>();
public static List<string> filelist2 = new List<string>();
public void fwzymj()
{
// 获取当前AutoCAD应用中的活动文档、数据库和编辑器对象
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
string SelectedLayerName = CreatePalette.SelectedLayerName;
NumberContainer numberContainer = new NumberContainer();
//ed.WriteMessage("选择的图层:" + SelectedLayerName + "\n");
// 创建一个选择过滤器,限制用户只能选择"宗地"图层上的LWPOLYLINE对象作为外部边界
SelectionFilter outerFilter = new SelectionFilter(new TypedValue[] {
new TypedValue((int)DxfCode.Start, "LWPOLYLINE"),
new TypedValue((int)DxfCode.LayerName, SelectedLayerName)
});
// 提示用户根据上述规则进行实体选择,并获取选择结果
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))// 读取所选多段线
{
// 确保所选多段线是闭合的且至少有一个顶点
double totalArea = 0; // 总面积
double totalAreaZdmj = 0; // 总面积
double totalAreaSYmj = 0; // 总面积
if (outerPolyline.Closed && outerPolyline.NumberOfVertices > 0)
{
// 创建并填充一个表示外部多段线边界坐标的点集合
Point3dCollection outerPoints = new Point3dCollection();
for (int i = 0; i < outerPolyline.NumberOfVertices; i++)
{
Point3d point = outerPolyline.GetPoint3dAt(i);
// 获取多边形的中心点
Point3d center = GetCenterOfPolyline(outerPolyline);
// 定义你的扩展因子,比如 1.5 表示扩大1.5倍
double scaleFactor = 1.2;
// 将顶点向中心点平移,然后按比例缩放
Point3d scaledPoint = new Point3d(
(point.X - center.X) * scaleFactor + center.X,
(point.Y - center.Y) * scaleFactor + center.Y,
(point.Z - center.Z) * scaleFactor + center.Z
);
// 创建并设置文本对象
DBText text = new DBText();
text.TextString = i.ToString();
//text.Height = 1; // 文字高度设为1个单位
text.Position = scaledPoint;
将文本添加到模型空间
//using (Transaction transaction = db.TransactionManager.StartTransaction())
//{
// BlockTable bt = transaction.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
// BlockTableRecord ms = transaction.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
// ms.AppendEntity(text);
// transaction.AddNewlyCreatedDBObject(text, true);
// transaction.Commit();
//}
outerPoints.Add(scaledPoint);
}
// 创建一个窗口选择过滤器,用于选择位于外部多段线内的所有实体
SelectionFilter innerFilter = new SelectionFilter(new TypedValue[] {
new TypedValue((int)Dxf