16699988885 发表于 3 天前

中望cad坐标展点

本帖最后由 16699988885 于 2026-1-3 10:33 编辑


侧边栏来自明经大佬vb.net改为c#开发 ,展点代码全部自己的展点有dat和xyz两种格式,适合测绘人员使用 凑合着看 轻点喷:handshake两个附件是部分主要代码,区分高程颜色展点还是挺好看

qifeifei 发表于 3 天前

【后缀修改.cs】会被管理员警告;劝你改用压缩包格式;亲测~

16699988885 发表于 3 天前

qifeifei 发表于 2026-1-3 11:17
【后缀修改.cs】会被管理员警告;劝你改用压缩包格式;亲测~

感谢现在改

d1742647821 发表于 前天 09:28

16699988885 发表于 2026-1-3 12:27
感谢现在改

txt没毛病,本来就是文本格式,不会给下载者造成困扰

bg3xs 发表于 昨天 06:08

两个附件的代码,没有展点的代码呀。

16699988885 发表于 昨天 14:20

bg3xs 发表于 2026-1-5 06:08
两个附件的代码,没有展点的代码呀。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using ZwSoft.ZwCAD.ApplicationServices;
using ZwSoft.ZwCAD.DatabaseServices;
using ZwSoft.ZwCAD.EditorInput;
using ZwSoft.ZwCAD.Geometry;
using ZwSoft.ZwCAD.Runtime;
using ZwSoft.ZwCAD.Colors;


namespace ElevationPointsImporter
{
    public class ElevPointsImporter
    {
      // 定义颜色列表,每个图层使用不同颜色
      private static readonly List<short> ColorList = new List<short>
      {
            1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
            11, 12, 13, 14, 15, 16, 17, 18, 19, 20
      };

      
      public void ImportElevationPoints()
      {
            Document doc = ZwSoft.ZwCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            try
            {
                // 选择DAT文件
                PromptOpenFileOptions fileOpts = new PromptOpenFileOptions("选择DAT数据文件")
                {
                  Filter = "DAT文件 (*.dat)|*.dat|所有文件 (*.*)|*.*",
                  DialogName = "选择DAT数据文件"
                };

                PromptFileNameResult fileResult = ed.GetFileNameForOpen(fileOpts);
                if (fileResult.Status != PromptStatus.OK)
                {
                  ed.WriteMessage("\n未选择文件!");
                  return;
                }

                string filename = fileResult.StringResult;

                // 验证文件是否存在
                if (!File.Exists(filename))
                {
                  ed.WriteMessage($"\n文件不存在: {filename}");
                  return;
                }

                ed.WriteMessage("\n开始导入数据...");

                // 查找或创建图层
                string layerName = "SHD";
                int i = 1;
                short layerColorIndex = 0;

                // 查找可用的图层名
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                  LayerTable lt = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForRead);

                  while (lt.Has(layerName))
                  {
                        layerName = "SHD" + i.ToString();
                        i++;
                  }

                  // 计算颜色索引
                  layerColorIndex = GetLayerColor(i - 1);

                  // 创建新图层
                  LayerTableRecord ltr = new LayerTableRecord
                  {
                        Name = layerName,
                        Color = Color.FromColorIndex(ColorMethod.ByAci, layerColorIndex),
                        IsPlottable = true
                  };

                  lt.UpgradeOpen();
                  lt.Add(ltr);
                  tr.AddNewlyCreatedDBObject(ltr, true);

                  // 设置当前图层
                  db.Clayer = ltr.ObjectId;

                  tr.Commit();
                }

                // 导入点数据
                int pointCount = ImportPoints(filename, layerName, layerColorIndex);

                ed.WriteMessage($"\n数据导入完成!已创建 {pointCount} 个高程点在图层 \"{layerName}\" 上");
                ed.WriteMessage($"\n图层颜色索引: {layerColorIndex}");
                ed.WriteMessage("\n所有高程数值已创建为文字对象。");
            }
            catch (System.Exception ex)
            {
                ed.WriteMessage($"\n错误: {ex.Message}");
            }
      }



      // 导入点数据
      private int ImportPoints(string filename, string layerName, short layerColorIndex)
      {
            int pointCount = 0;

            // 读取文件数据到内存中
            var pointData = new List<(double x, double y, double z)>();
            using (var fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read, 65536))
            using (var reader = new StreamReader(fs))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                  if (!string.IsNullOrWhiteSpace(line))
                  {
                        string[] ptdata = ParseCsvLine(line);

                        if (ptdata.Length == 5)
                        {
                            if (double.TryParse(ptdata, out double x) &&
                              double.TryParse(ptdata, out double y) &&
                              double.TryParse(ptdata, out double z))
                            {
                              pointData.Add((x, y, z));
                            }
                        }
                  }
                }
            }

            // 在AutoCAD主线程中处理数据库操作
            Document doc = ZwSoft.ZwCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            
            // 处理前1000个实体的批次
            int processedCount = 0;
            for (int i = 0; i < pointData.Count; i += 1000)
            {
                var batch = pointData.Skip(i).Take(1000).ToList();
               
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                  BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
                  BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt, OpenMode.ForWrite);

                  // 获取标准文字样式ID
                  TextStyleTable tt = (TextStyleTable)tr.GetObject(db.TextStyleTableId, OpenMode.ForRead);
                  ObjectId textStyleId = tt["Standard"];

                  foreach (var (x, y, z) in batch)
                  {
                        // 创建高程文字对象
                        DBText text = new DBText
                        {
                            Position = new Point3d(x, y, z),
                            Height = 0.4,
                            TextString = z.ToString("F3"), // 仅高程数值,保留3位小数
                            Layer = layerName,
                            TextStyleId = textStyleId,
                            Rotation = 0.0,
                            WidthFactor = 1.0,
                            HorizontalMode = TextHorizontalMode.TextLeft,
                            VerticalMode = TextVerticalMode.TextBase
                        };

                        // 设置文字颜色(使用与图层相同的颜色)
                        text.Color = Color.FromColorIndex(ColorMethod.ByAci, layerColorIndex);

                        btr.AppendEntity(text);
                        tr.AddNewlyCreatedDBObject(text, true);
                        pointCount++;
                        processedCount++;
                  }

                  tr.Commit();
                }
            }

            return pointCount;
      }

      
      public void ImportElevationPointsAlias()
      {
            ImportElevationPoints();
      }

      
      public void ShowHelp()
      {
            Editor ed = ZwSoft.ZwCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;

            ed.WriteMessage("\n使用说明:");
            ed.WriteMessage("\n1. 输入命令 ELEVPOINTS 或 EP 开始导入");
            ed.WriteMessage("\n2. 选择格式为: 点号,,X,Y,Z 的DAT文件");
            ed.WriteMessage("\n3. 脚本会在每个坐标点位置创建文字对象");
            ed.WriteMessage("\n4. 文字内容仅为高程数值(保留三位小数)");
            ed.WriteMessage("\n5. 所有文字对象均创建在 SHD 系列图层上");
            ed.WriteMessage("\n6. 如果SHD图层已存在,则会创建SHD1、SHD2等");
            ed.WriteMessage("\n7. 每个新图层使用不同的颜色,便于区分");
      }

      /// <summary>
      /// 解析CSV行(格式:点号,,X,Y,Z)
      /// </summary>
      private string[] ParseCsvLine(string line)
      {
            // 使用Span<T>优化的解析方法,减少字符串分配
            var parts = new List<string>(5);
            int start = 0;
            int count = 0;
            
            for (int i = 0; i < line.Length; i++)
            {
                if (line == ',')
                {
                  parts.Add(line.Substring(start, i - start));
                  start = i + 1;
                  count++;
                  if (count == 4) // 我们只需要5个元素,已经有4个逗号
                  {
                        // 添加最后一部分
                        parts.Add(line.Substring(start));
                        break;
                  }
                }
            }
            
            // 如果还没达到5个部分(例如最后没有逗号),添加剩余部分
            if (parts.Count < 5 && start < line.Length)
            {
                parts.Add(line.Substring(start));
            }
            
            return parts.ToArray();
      }

      /// <summary>
      /// 获取图层颜色索引
      /// </summary>
      private short GetLayerColor(int layerIndex)
      {
            int colorIndex = layerIndex % ColorList.Count;
            return ColorList;
      }
    }
}

SXYCZPYLHP2 发表于 8 小时前

图层创建与管理:代码首先会创建必要的图层,以便将不同的点数据分类展示。这可以通过CASS的图层管理功能实现,或者通过编程接口直接操作CAD的图层。

坐标数据读取:代码需要读取野外测量得到的坐标数据,这些数据通常以特定的格式(如CSV或DAT)存储。代码会解析这些数据,并提取出每个点的X、Y坐标以及可能的高程信息。

点符号绘制:根据读取到的坐标数据,代码会在相应的图层上绘制点符号。这可能涉及到调用CASS的绘图函数,或者使用CAD的低级绘图命令。

属性赋值:对于每个点,代码可能会为其赋予属性,如点号、高程等。这些属性可以在后续的标注过程中使用。

展点步骤
除了编程代码,CASS还提供了图形界面的操作步骤来进行展点。根据搜索结果2,展点的步骤大致如下:

数据准备:将井下测点的点号、Y坐标、X坐标以及高程从一个工作表(如Sheet1)复制并粘贴到另一个工作表(如Sheet2)。确保数据正确无误地粘贴到指定的列中。

文件保存:将复制到Sheet2的数据保存为CSV格式的文件,并将其扩展名修改为DAT。

展点操作:在CASS中,通过“绘图处理”菜单下的“展野外测点点号”和“展高程点”命令,选择之前保存的DAT文件进行展点。展点完成后,可以对点号的颜色进行修改,并使用多段线将测点连接起来,形成巷道轮廓。

数据调整:最后,可能需要对重叠的点号和高程点的数值进行调整,以确保图纸的清晰度。
页: [1]
查看完整版本: 中望cad坐标展点