IssacVIEW头像

LabVIEW导入CAD的DXF文件

AutoCAD操作

1. 创建属性定义

  1. 按ESC,退出CAD内所有操作→输入ATTDEF后回车
    在这里插入图片描述

  2. 输入属性定义,只需要输入标记为NO→点击确定
    在这里插入图片描述
    在界面上就会显示NO
    在这里插入图片描述

  3. 画一个十字架,此处可以先画一个1mm半径的圆,再根据横竖顶点来画,最后删除圆。
    在这里插入图片描述

  4. 选中NO,把NO移动到十字架中心
    在这里插入图片描述

  5. 工具栏→创建块
    在这里插入图片描述

  6. 填写块定义→点击确定

  • 勾选"基点"的"在屏幕上指定"
  • 勾选"对象"的"在屏幕上指定"
  • 名称填写为"XY_POINT"
    在这里插入图片描述
  1. 基点:选中十字架中点
    在这里插入图片描述
  2. 对象:逆时针选中所有对象,包括NO和十字架→创建块完成
    在这里插入图片描述

2. 插入标注

  1. 假设说有一个圆形
    2.

  2. 菜单栏:插入→工具栏:插入→选中刚才创建的XY_POINT
    在这里插入图片描述

  3. 把XY_POINT块移动到圆心,左键点击→弹出编辑属性,在NO中输入序号,此处为1
    在这里插入图片描述

  4. 完成标注,如果有多个点则需要将所有点标注,并指定对应的序号
    在这里插入图片描述

  5. 另存为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

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--