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


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


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

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

感谢现在改

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

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

网友答: 两个附件的代码,没有展点的代码呀。

网友答:
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
        };

        [CommandMethod("ELEVPOINTS", CommandFlags.Modal)]
        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[2], out double x) &&
                                double.TryParse(ptdata[3], out double y) &&
                                double.TryParse(ptdata[4], 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[BlockTableRecord.ModelSpace], 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;
        }

        [CommandMethod("EP", CommandFlags.Modal)]
        public void ImportElevationPointsAlias()
        {
            ImportElevationPoints();
        }

        [CommandMethod("HELP_ELEVPOINTS", CommandFlags.Modal)]
        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[colorIndex];
        }
    }
}

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

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

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

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

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

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

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

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

数据调整:最后,可能需要对重叠的点号和高程点的数值进行调整,以确保图纸的清晰度。
  • 上一篇:闲谈,代理全部cad版本的接口
  • 下一篇:没有了