.Net/C#读取CAD软件dwg、dxf数据表实体

.Net/C#读取CAD软件dwg、dxf数据表实体

使用ACadSharp库读取CAD软件dwg数据表实体

文末附ACadSharp.dll库文件及源码

CadDocReader

using ACadSharp;
using ACadSharp.Entities;
using ACadSharp.IO;
using CSMath;
using System.Text.RegularExpressions;

namespace NCad.Toolkits
{
    internal class CadDocReader
    {
        public CadDocReader(string filePath)
        {
            this.FilePath = filePath;
        }

        public string FilePath { get; private set; }

        public void ReadTable()
        {
            string filePath = this.FilePath;
            if (!File.Exists(filePath))
            {
                throw new FileNotFoundException(filePath);
            }
            CadDocument cadDocument = LoadCadDocument(filePath);
            foreach (var blockRecord in cadDocument.BlockRecords)
            {
                // 过滤非表实体
                if (!blockRecord.Name.StartsWith("*T"))
                {
                    continue;
                }
                if (blockRecord.Entities.Count < 1)
                {
                    continue;
                }
                for (int i = 0; i < blockRecord.Entities.Count; ++i)
                {
                    Entity entity = blockRecord.Entities[i];
                    if (entity.ObjectName.EndsWith("TEXT"))
                    {
                        MText mText = entity as MText;
                        // 实体文本内容
                        string entityText;
                        // 锚点
                        XYZ insertPoint;
                        if (mText == null)
                        {
                            TextEntity textEntity = entity as TextEntity;
                            entityText = textEntity.Value;
                            insertPoint = textEntity.InsertPoint;
                        }
                        else
                        {
                            entityText = mText.Value;
                            insertPoint = mText.InsertPoint;
                        }
                        // 移除文本字体样式字符
                        if (!string.IsNullOrEmpty(entityText))
                        {
                            string pattern = @"\\f.*?;";
                            entityText = Regex.Replace(entityText, pattern, string.Empty).TrimStart('{').TrimEnd('}');
                        }
                        Console.Write(entityText);
                        Console.Write("\t");
                    }
                }
                Console.WriteLine();
                Console.WriteLine();
            }
        }

        /// <summary>
        /// 加载CAD文档
        /// </summary>
        /// <param name="filePath">文件路径</param>
        /// <returns>CAD文档</returns>
        /// <exception cref="NotSupportedException">文件类型不支持异常</exception>
        private CadDocument LoadCadDocument(string filePath)
        {
            string extension = Path.GetExtension(filePath);
            CadDocument cadDocument = null;
            if (extension.Equals(".dwg", StringComparison.OrdinalIgnoreCase))
            {
                DwgReader dwgReader = null;
                try
                {
                    dwgReader = new DwgReader(filePath);
                    cadDocument = dwgReader.Read();
                }
                catch
                {
                    throw;
                }
                finally
                {
                    dwgReader?.Dispose();
                }
            }
            else if (extension.Equals(".dxf", StringComparison.OrdinalIgnoreCase))
            {
                DxfReader dxfReader = null;
                try
                {
                    dxfReader = new DxfReader(filePath);
                    cadDocument = dxfReader.Read();
                }
                catch
                {
                    throw;
                }
                finally
                {
                    dxfReader?.Dispose();
                }
            }
            else
            {
                throw new NotSupportedException($"文件:{filePath},不支持类型:{extension}");
            }
            return cadDocument;
        }
    }
}

调用代码

string dwgFile = "D:\\admin\\Desktop\\测试图-测绘&dfx&表格\\8东8支8北\\01-夏茅站结构总平面图.dwg";
CadDocReader cadDocReader = new CadDocReader(dwgFile);
cadDocReader.ReadTable();

测试输出

用地信息列表    类型    权属单位        地块面积(㎡)  拆迁/临迁房屋面积(㎡) 征地    AAAAAAA 5674.3934       0.0000  征地    BBBBBBB 5297.4953       0.0000  借地    CCCCCCCC        92314.0540      0.0000  拆迁    DDDDDDD 2497.0416      23213213.6568    临迁    EEEEEEE 1456.0170       343423434.5650  临迁    FFFFFFF 494.0636        453535.7878     临迁   GGGGGGG  494.0468        567676.6760     临迁    HHHHHHH 558.6505        645546.8780     临迁    IIIIIII 682.7144       3432424.8787     临迁    JJJJJJJ 682.7144        5676767.4342    临迁    KKKKKKK 682.7144        2324324.67868

在这里插入图片描述

ACadSharp.dll库文件及源码

https://shaoshao.lanzouw.com/b0ny05i9a
密码:4ih4

ACadSharp是一个开源库,用于读写AutoCAD DWG文件格式。要使用ACadSharp库创建一个新的DWG文件,你需要遵循以下步骤: 1. 首先,确保你已经安装了ACadSharp库。你可以通过NuGet包管理器在你的项目中安装它。 2. 接下来,在你的代码中引用ACadSharp库的命名空间。 3. 创建一个新的DWG文档实例。 4. 使用API提供的方法向DWG文档中添加元素,例如块(Blocks)、图层(Layers)、直线(Lines)、圆弧(Circles)等。 5. 保存你的DWG文档到文件系统中。 下面是一个简单的示例代码,演示了如何创建一个包含一个图层和一条直线的DWG文件: ```csharp using ACadSharp; using ACadSharp.Entities; using ACadSharp.IO; using System.IO; class Program { static void Main(string[] args) { // 创建一个新的DWG文档实例 Document doc = new Document(); // 获取图纸空间 图纸空间图纸空间 = doc.P图纸空间; // 创建一个图层 Layer layer = new Layer("NewLayer"); doc.Layers.Add(layer); // 添加图层到图纸空间 图纸空间.CurrentLayer = layer; // 创建一条直线 Line line = new Line(new Point(0, 0, 0), new Point(100, 0, 0)); 图纸空间.AddEntity(line); // 保存DWG文件 DwgWriter writer = new DwgWriter(); using (Stream stream = new FileStream("NewDrawing.dwg", FileMode.Create)) { writer.Write(doc, stream); } } } ``` 上述代码创建了一个新的DWG文件`NewDrawing.dwg`,其中包含一个名为`NewLayer`的图层和一条从(0,0,0)到(100,0,0)的直线。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Winemonk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值