中望cad坐标展点
本帖最后由 16699988885 于 2026-1-3 10:33 编辑侧边栏来自明经大佬vb.net改为c#开发 ,展点代码全部自己的展点有dat和xyz两种格式,适合测绘人员使用 凑合着看 轻点喷:handshake两个附件是部分主要代码,区分高程颜色展点还是挺好看
【后缀修改.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
};
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;
}
}
} 图层创建与管理:代码首先会创建必要的图层,以便将不同的点数据分类展示。这可以通过CASS的图层管理功能实现,或者通过编程接口直接操作CAD的图层。
坐标数据读取:代码需要读取野外测量得到的坐标数据,这些数据通常以特定的格式(如CSV或DAT)存储。代码会解析这些数据,并提取出每个点的X、Y坐标以及可能的高程信息。
点符号绘制:根据读取到的坐标数据,代码会在相应的图层上绘制点符号。这可能涉及到调用CASS的绘图函数,或者使用CAD的低级绘图命令。
属性赋值:对于每个点,代码可能会为其赋予属性,如点号、高程等。这些属性可以在后续的标注过程中使用。
展点步骤
除了编程代码,CASS还提供了图形界面的操作步骤来进行展点。根据搜索结果2,展点的步骤大致如下:
数据准备:将井下测点的点号、Y坐标、X坐标以及高程从一个工作表(如Sheet1)复制并粘贴到另一个工作表(如Sheet2)。确保数据正确无误地粘贴到指定的列中。
文件保存:将复制到Sheet2的数据保存为CSV格式的文件,并将其扩展名修改为DAT。
展点操作:在CASS中,通过“绘图处理”菜单下的“展野外测点点号”和“展高程点”命令,选择之前保存的DAT文件进行展点。展点完成后,可以对点号的颜色进行修改,并使用多段线将测点连接起来,形成巷道轮廓。
数据调整:最后,可能需要对重叠的点号和高程点的数值进行调整,以确保图纸的清晰度。
页:
[1]