C# cass10 面积计算

文章描述了一个在VisualStudio2022环境中,使用C#编程语言操作CAD(如Cass10)实现的功能,通过选择宗地图层的LWPOLYLINE对象,获取用户选择的实体,计算房屋面积和附属面积,最后输出宗地面积和房屋相关信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

运行环境Visual Studio 2022 c# cad2016 cass10

通过面积计算得到扩展数据,宗地面积 ,房屋占地面积,房屋使用面积

一、主要步骤

  1. 获取当前AutoCAD应用中的活动文档、数据库和编辑器对象。
  2. 创建一个选择过滤器,限制用户只能选择"宗地"图层上的LWPOLYLINE对象作为外部边界。
  3. 提示用户根据上述规则进行实体选择,并获取选择结果。
  4. 遍历所有被选中的外部多段线,确保所选多段线是闭合的且至少有一个顶点。
  5. 创建并填充一个表示外部多段线边界坐标的点集合。
  6. 使用多边形窗口选择方式让用户选择位于外部多段线内的实体。
  7. 遍历用户在内部区域所选的所有闭合多段线,计算房屋面积和附属面积。
  8. 计算宗地面积和输出结果。

二、完整代码

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值