AutoCAD操作
1. 创建属性定义
-
按ESC,退出CAD内所有操作→输入
ATTDEF后回车

-
输入属性定义,只需要输入标记为
NO→点击确定

在界面上就会显示NO

-
画一个十字架,此处可以先画一个1mm半径的圆,再根据横竖顶点来画,最后删除圆。

-
选中NO,把NO移动到十字架中心

-
工具栏→创建块

-
填写块定义→点击确定
- 勾选"基点"的"在屏幕上指定"
- 勾选"对象"的"在屏幕上指定"
- 名称填写为"XY_POINT"

- 基点:选中十字架中点

- 对象:逆时针选中所有对象,包括NO和十字架→创建块完成

2. 插入标注
-
假设说有一个圆形

-
菜单栏:插入→工具栏:插入→选中刚才创建的XY_POINT

-
把XY_POINT块移动到圆心,左键点击→弹出编辑属性,在NO中输入序号,此处为1

-
完成标注,如果有多个点则需要将所有点标注,并指定对应的序号

-
另存为DXF→命名为xytest

代码
环境
在nuget包中下载netDxf,版本2023.11.10

代码
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using netDxf;
using netDxf.Entities;
namespace CadPointReader
{
/// <summary>
/// DXF 点位读取接口,供 LabVIEW 通过 .NET 调用节点使用。
/// </summary>
public static class DxfPointReader
{
/// <summary>
/// 读取指定图块的 NO 属性及插入点 XY 坐标,
/// 按 NO 的数字大小升序排列。
/// </summary>
/// <param name="dxfPath">DXF 文件完整路径。</param>
/// <param name="blockName">标记图块名称,例如 XY_POINT。</param>
/// <param name="numbers">排序后的编号,保留原始文本。</param>
/// <param name="xs">与编号一一对应的 X 坐标。</param>
/// <param name="ys">与编号一一对应的 Y 坐标。</param>
/// <param name="errorMessage">成功为空,失败为具体原因。</param>
/// <returns>成功返回 true,失败返回 false。</returns>
/// <remarks>
/// 仅读取直接插入模型空间的普通图块。
/// 不递归读取嵌套图块,不支持动态块名称解析。
/// 坐标为世界坐标系 WCS,单位与图纸一致,不自动转换为毫米。
/// NO 必须是正整数;1 和 01 视为重复编号。
/// </remarks>
public static bool ReadPoints(
string dxfPath,
string blockName,
out string[] numbers,
out double[] xs,
out double[] ys,
out string errorMessage)
{
numbers = new string[0];
xs = new double[0];
ys = new double[0];
errorMessage = string.Empty;
try
{
if (string.IsNullOrWhiteSpace(dxfPath))
throw new ArgumentException("DXF 文件路径不能为空。");
if (!File.Exists(dxfPath))
throw new FileNotFoundException(
"找不到 DXF 文件。", dxfPath);
if (string.IsNullOrWhiteSpace(blockName))
throw new ArgumentException("图块名称不能为空。");
string targetName = blockName.Trim();
DxfDocument document = DxfDocument.Load(dxfPath);
if (document == null)
throw new InvalidDataException(
"DXF 加载失败,请确认文件有效且版本受支持。");
// 明确仅枚举模型空间中的实体。
document.Entities.ActiveLayout = "Model";
var points = new List<PointData>();
var usedNumbers = new HashSet<int>();
foreach (Insert insert in document.Entities.Inserts)
{
if (!string.Equals(
insert.Block.Name,
targetName,
StringComparison.OrdinalIgnoreCase))
{
continue;
}
string numberText = null;
foreach (netDxf.Entities.Attribute attribute
in insert.Attributes)
{
if (string.Equals(
attribute.Tag,
"NO",
StringComparison.OrdinalIgnoreCase))
{
numberText = attribute.Value;
break;
}
}
string position = string.Format(
CultureInfo.InvariantCulture,
"X={0:G17}, Y={1:G17}",
insert.Position.X,
insert.Position.Y);
if (string.IsNullOrWhiteSpace(numberText))
{
throw new InvalidDataException(
"图块缺少 NO 属性或编号为空:" + position);
}
numberText = numberText.Trim();
int number;
if (!int.TryParse(
numberText,
NumberStyles.None,
CultureInfo.InvariantCulture,
out number) || number <= 0)
{
throw new InvalidDataException(
"NO 必须是正整数,当前值为“"
+ numberText + "”:" + position);
}
if (!usedNumbers.Add(number))
{
throw new InvalidDataException(
"发现重复编号:" + numberText);
}
double x = insert.Position.X;
double y = insert.Position.Y;
if (double.IsNaN(x) || double.IsInfinity(x)
|| double.IsNaN(y) || double.IsInfinity(y))
{
throw new InvalidDataException(
"编号 " + numberText + " 的坐标无效。");
}
points.Add(new PointData
{
Number = number,
NumberText = numberText,
X = x,
Y = y
});
}
if (points.Count == 0)
{
throw new InvalidDataException(
"模型空间中未找到图块:“"
+ targetName + "”。");
}
points.Sort((a, b) => a.Number.CompareTo(b.Number));
var resultNumbers = new string[points.Count];
var resultXs = new double[points.Count];
var resultYs = new double[points.Count];
for (int i = 0; i < points.Count; i++)
{
resultNumbers[i] = points[i].NumberText;
resultXs[i] = points[i].X;
resultYs[i] = points[i].Y;
}
numbers = resultNumbers;
xs = resultXs;
ys = resultYs;
return true;
}
catch (Exception ex)
{
errorMessage = ex.Message;
return false;
}
}
private sealed class PointData
{
public int Number { get; set; }
public string NumberText { get; set; }
public double X { get; set; }
public double Y { get; set; }
}
}
}
LabVIEW调用

转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/weixin_41303851/article/details/168551105



