您好,
会员登录 快速注册
退出 ( 条未读消息)
关于本站 意见反馈 首页

公告:小宅博客网可以开发票了,需要发票的,去群里找群主哈!!
全部文章分类
  • 人工智能 >

  • 编程语言 >

  • WPF系列 >

  • ASP.NET系列 >

  • Linux >

  • 数据库 >

  • 嵌入式 >

  • WEB技术 >

  • PLC系列 >

  • 微服务与框架 >

  • 小宅DIY >

  • 学习资料 >

OpenCv基础 ANN车牌识别 yolov5车牌识别 指针式仪表识别 ROS系列 YOLO Halcon Detectron2 昇腾AI ChatGPT在线体验 英伟达JETSON ChatGLM ChatTTS FunASR 地平线 ByteTrack 魔搭社区 LangChain
C C# C++ Python Java Go
WPF
ASP.NET小功能 GPS定位系统-MVC GPS定位系统-VUE ASP.NET WebRTC
Linux Linux内核 Shell MakeFile
MySql SqlServer Oracle
STM8 STM32 51单片机
VUE入门 HTML JavaScript CSS layui镜像网站 ElementUi中文官网 element-plus 图标
三菱 欧姆龙 西门子 施耐德 松下 台达
IOTSharp IOTGateway ABP FRAMEWORK Docker
亚克力音响 编程仙途:智驭万法
面试题与技巧 Python入门技能树 微软C#教程
首页 编程之美 工具下载 全国就业 流量地图 文心一言
C#
内容简介 1、C#环境下使用EF操作MySql 2、实现串口通信 3、TCP通信 4、读写SqlServer数据库 5、读写ini配置文件 6、实现远程升级 7、调用打印机 8、AES数据加密与解密 AES加解密(RijndaelManaged版) 9、FTP的上传和下载 10、封装dll到exe 11、重写Button控件 12、重写Labeld控件 13、重写DataGridView控件 14、重写TabControl控件 15、重写ProgressBar控件 16、加载状态弹窗设计 17、模拟按键精灵 18、24种数据校验算法 19、C#如何调用opencv 20、地图上显示GPS坐标 21、使用EPPlus导出/导入xlsx格式的Excel报表和曲线图 22、exe程序生成安装包 23、DataGridView控件列控制 24、json解析 25、自定义委托事件 26、xml文件的生成与读取 27、DataGridView实现翻页效果 28、如何实现CAD dxf文件的读取 29、StopWatch的使用 30、Async与Await 同步与异步操作 31、关闭登录窗体打开主窗体的方法 32、SQLite数据库的操作 33、MD5数据加密 34、DES数据加密与解密 35、获取本地IP地址 36、打开与保存文件 37、静态图表显示(曲线图) 38、动态图表显示(曲线图) 39、根据公网IP获取地址信息 40、List转DataTable 41、C#下实现Ping操作 42、父窗体中嵌入子窗体 43、获取MySql数据库列表 44、WebSocket通讯 45、Mqtt客户端与服务端通讯 46、使用QRCode生成二维码 47、AForge调用摄像头 48、Emgu.CV调用摄像头 49、获取以太网网卡IP 50、DataGridView全选与定位 51、如何获取系统中所有程序的句柄 遍历指定目录下的所有文件 ​NPOI Excel报表的导入与导出 常用正则表达式字符串格式判断 Task和Thread的启停操作 C# 一些常用小功能1 C# 一些常用小功能2 如何使用C#来发送QQ邮件 Aspose.Slides文档格式转换 C# GDI+ 画心形 跳动动画 使用Remoting实现RPC RabbitMQ.消息发布与订阅 .Net Core 微信/支付宝 官方Demo C# OCR图片文字识别 Quartz 计划任务 文字语音播报 winform基于百度地图的电子围栏、路径规划、小车导航实现 Visual Studio C盘数据迁移,解决C盘空间不足的问题 Kafka通讯(Kafka-Net版) Kafka通讯(Confluent.Kafka版) 获取变量Description描述 C# 将PDF文档转换为Word文档 C# MVC 多图片上传预览
27、DataGridView实现翻页效果
29、StopWatch的使用
激萌の小宅 小宅博客网 C#

文章作者:激萌の小宅

促销:¥0

价格:¥0

配送方式: 购买后立即生效(如购买异常,请联系站长)
付款之后一定要等待自动跳转结束,否则购买可能会失败
  • 0 天

    有效期

  • 0

    总销量

  • 3

    累计评价

如何实现CAD dxf文件的读取 - (第二十八讲)


视频讲解如下:


CSDN源码下载

https://download.csdn.net/download/gs1069405343/20086400

网盘下载,提取码:lq0d

https://pan.baidu.com/s/1NVW8suoqTmxSqF4Q28duoA


DXF参考手册:http://docs.autodesk.com/ACD/2011/CHS/filesDXF/WS1a9193826455f5ff18cb41610ec0a2e719-79fe.htm

QQ截图20220417175510.jpg


这里给大家讲解一下如何实现CAD dxf文件的读取


读取dxf需要安装两个插件netDXF和OpenCvSharp3-AnyCPU,netDXF是用于解析dxf文件用的,OpenCvSharp3-AnyCPU是用来进行图像显示的。

演示效果如下


using netDxf;
using netDxf.Blocks;
using netDxf.Entities;
using netDxf.Objects;
using OpenCvSharp;
using OpenCvSharp.Extensions;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

namespace MyDxf
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Shown(object sender, EventArgs e)
        {
            //Rectangle dis = pictureBox1.DisplayRectangle;
            //Bitmap image = new Bitmap(dis.Width, dis.Height);
            //Graphics graphics = Graphics.FromImage(image);
            //SolidBrush brush = new SolidBrush(Color.Black);
            //graphics.FillRectangle(brush, dis);
            //Pen pen = new Pen(Color.Blue, 2f);
            //Pen pen2 = new Pen(Color.Blue, 200f);
            //Pen pen3 = new Pen(Color.FromArgb(50, 50, 50), 1f);
            //for (int i = 0; (i * 40) < dis.Height; i++)
            //{
            //    graphics.DrawLine(pen3, 0, 40 * i, dis.Width, 40 * i);
            //}
            //for (int i = 0; (i * 40) < dis.Width; i++)
            //{
            //    graphics.DrawLine(pen3, 40 * i, 0, 40 * i, dis.Height);
            //}
            //pictureBox1.Image = image;
        }
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBox1.SelectedIndex == 0)
            {
                numericUpDown1.Value = 1;
                numericUpDown2.Value = 2000;
                numericUpDown3.Value = 2800;
            }
            if (comboBox1.SelectedIndex == 1)
            {
                numericUpDown1.Value = (decimal)0.12;
                numericUpDown2.Value = 18300;
                numericUpDown3.Value = 25800;
            }
            if (comboBox1.SelectedIndex == 2)
            {
                numericUpDown1.Value = (decimal)0.6;
                numericUpDown2.Value = 3500;
                numericUpDown3.Value = 4500;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            DxfDocument dxf = DxfDocument.Load("DxfFile\\一帆风顺2.dxf");
            //ShowDxfDocumentInformation(dxf);
            //return;

            // 初始化 画布
            Rectangle dis = pictureBox1.DisplayRectangle;
            Mat srcImage = new Mat(new OpenCvSharp.Size(dis.Width, dis.Height), MatType.CV_8UC3, Scalar.All(0));

            double siz = (double)numericUpDown1.Value; // 缩放比例
            int sx = (int)numericUpDown2.Value; // 左右移动
            int sy = (int)numericUpDown3.Value; // 上下移动

            srcImage = DxfHatch(dxf, siz, sx, sy, srcImage);
            srcImage = DxfLayouts(dxf, siz, sx, sy, srcImage);
            srcImage = DxfPolyline(dxf, siz, sx, sy, srcImage);
            srcImage = DxfSpline(dxf, siz, sx, sy, srcImage);
            srcImage = DxfInserts(dxf, siz, sx, sy, srcImage);

            // 把opencv的图片显示到pictureBox1
            Mat resize_image = new Mat();
            Cv2.Resize(srcImage, resize_image, new OpenCvSharp.Size(), 1, 1, InterpolationFlags.Linear);
            Cv2.Flip(resize_image, resize_image, FlipMode.X);
            Bitmap bitmap = BitmapConverter.ToBitmap(resize_image);
            pictureBox1.Image = bitmap;
        }

        private List<List<OpenCvSharp.Point>> OneHatch(HatchBoundaryPath bdp)
        {
            List<OpenCvSharp.Point> pos1 = new List<OpenCvSharp.Point>();
            List<OpenCvSharp.Point> pos2 = new List<OpenCvSharp.Point>();
            for (int i = 0; i < bdp.Edges.Count(); i++)
            {
                if (bdp.Edges[i].Type == HatchBoundaryPath.EdgeType.Line)
                {
                    HatchBoundaryPath.Line l = bdp.Edges[i] as HatchBoundaryPath.Line;
                    pos1.Add(new OpenCvSharp.Point(l.Start.X, l.Start.Y));
                    pos1.Add(new OpenCvSharp.Point(l.End.X, l.End.Y));
                }
                if (bdp.Edges[i].Type == HatchBoundaryPath.EdgeType.Spline)
                {
                    HatchBoundaryPath.Spline l = bdp.Edges[i] as HatchBoundaryPath.Spline;
                    foreach (Vector3 cp in l.ControlPoints)
                    {
                        pos2.Add(new OpenCvSharp.Point(cp.X, cp.Y));
                    }
                }
            }
            return new List<List<OpenCvSharp.Point>>() { pos1, pos2 };
        }
        private Mat OneInsert(DxfDocument dxf, Insert ns, double siz, int sx, int sy, Mat srcImage)
        {
            Block block = dxf.Blocks.FirstOrDefault(x => x.Name == ns.Block.Name);
            Scalar scalar = new Scalar(ns.Color.B, ns.Color.G, ns.Color.R);

            foreach (EntityObject eObj in block.Entities)
            {
                List<OpenCvSharp.Point> pos = new List<OpenCvSharp.Point>();
                if (eObj.Type == EntityType.Insert)
                {
                    Insert eo = eObj as Insert;
                    srcImage = OneInsert(dxf, eo, siz, sx, sy, srcImage);
                }
                else if (eObj.Type == EntityType.Spline)
                {
                    Spline eo = eObj as Spline;
                    scalar = new Scalar(eo.Color.B, eo.Color.G, eo.Color.R);
                    foreach (SplineVertex sv in eo.ControlPoints)
                    {
                        pos.Add(new OpenCvSharp.Point((int)(sv.Position.X / siz - sx), (int)(sv.Position.Y / siz - sy)));
                    }
                }
                else if (eObj.Type == EntityType.LightWeightPolyline)
                {
                    LwPolyline eo = eObj as LwPolyline;
                    scalar = new Scalar(eo.Color.B, eo.Color.G, eo.Color.R);
                    foreach (LwPolylineVertex l in eo.Vertexes)
                    {
                        pos.Add(new OpenCvSharp.Point((int)(l.Position.X / siz - sx), (int)(l.Position.Y / siz - sy)));
                    }
                }
                else if (eObj.Type == EntityType.Hatch)
                {
                    Hatch eo = eObj as Hatch;
                    scalar = new Scalar(eo.Color.B, eo.Color.G, eo.Color.R);
                    foreach (HatchBoundaryPath bdp in eo.BoundaryPaths)
                    {
                        List<OpenCvSharp.Point> pos1 = new List<OpenCvSharp.Point>();
                        List<OpenCvSharp.Point> pos2 = new List<OpenCvSharp.Point>();
                        List<List<OpenCvSharp.Point>> poss = OneHatch(bdp);
                        for (int i = 0; i < poss[0].Count(); i++)
                        {
                            pos1.Add(new OpenCvSharp.Point(poss[0][i].X / siz - sx, poss[0][i].Y / siz - sx));
                        }
                        for (int i = 0; i < poss[1].Count(); i++)
                        {
                            pos1.Add(new OpenCvSharp.Point(poss[1][i].X / siz - sx, poss[1][i].Y / siz - sx));
                        }
                        for (int i = 0; i < pos1.Count() - 1; i++)
                        {
                            Cv2.Line(srcImage, pos1[i], pos1[i + 1], scalar, 1, LineTypes.AntiAlias, 0);
                        }
                        for (int i = 0; i < pos2.Count() - 1; i++)
                        {
                            Cv2.Line(srcImage, pos2[i], pos2[i + 1], scalar, 1, LineTypes.AntiAlias, 0);
                        }
                    }
                }
                else if (eObj.Type == EntityType.Line)
                {
                    Line eo = eObj as Line;
                    scalar = new Scalar(eo.Color.B, eo.Color.G, eo.Color.R);
                    pos.Add(new OpenCvSharp.Point((int)(eo.StartPoint.X / siz - sx), (int)(eo.StartPoint.Y / siz - sy)));
                    pos.Add(new OpenCvSharp.Point((int)(eo.EndPoint.X / siz - sx), (int)(eo.EndPoint.Y / siz - sy)));
                }
                else
                    Console.WriteLine(eObj.Type);

                for (int i = 0; i < pos.Count() - 1; i++)
                {
                    Cv2.Line(srcImage, pos[i], pos[i + 1], scalar, 1, LineTypes.AntiAlias, 0);
                }
            }
            return srcImage;
        }
        private Mat DxfHatch(DxfDocument dxf, double siz, int sx, int sy, Mat srcImage)
        {
            foreach (Hatch h in dxf.Hatches)
            {
                foreach (HatchBoundaryPath bdp in h.BoundaryPaths)
                {
                    Scalar scalar = new Scalar(h.Color.B, h.Color.G, h.Color.R);
                    List<OpenCvSharp.Point> pos1 = new List<OpenCvSharp.Point>();
                    List<OpenCvSharp.Point> pos2 = new List<OpenCvSharp.Point>();
                    List<List<OpenCvSharp.Point>> pos = OneHatch(bdp);
                    for (int i = 0; i < pos[0].Count(); i++)
                    {
                        pos1.Add(new OpenCvSharp.Point(pos[0][i].X / siz - sx, pos[0][i].Y / siz - sx));
                    }
                    for (int i = 0; i < pos[1].Count(); i++)
                    {
                        pos1.Add(new OpenCvSharp.Point(pos[1][i].X / siz - sx, pos[1][i].Y / siz - sx));
                    }
                    for (int i = 0; i < pos1.Count() - 1; i++)
                    {
                        Cv2.Line(srcImage, pos1[i], pos1[i + 1], scalar, 1, LineTypes.AntiAlias, 0);
                    }
                    for (int i = 0; i < pos2.Count() - 1; i++)
                    {
                        Cv2.Line(srcImage, pos2[i], pos2[i + 1], scalar, 1, LineTypes.AntiAlias, 0);
                    }
                }
            }
            return srcImage;
        }
        private Mat DxfInserts(DxfDocument dxf, double siz, int sx, int sy, Mat srcImage)
        {
            foreach (Insert ns in dxf.Inserts)
            {
                srcImage = OneInsert(dxf, ns, siz, sx, sy, srcImage);
            }
            return srcImage;
        }
        private Mat DxfPolyline(DxfDocument dxf, double siz, int sx, int sy, Mat srcImage)
        {
            foreach (LwPolyline l in dxf.LwPolylines)
            {
                List<OpenCvSharp.Point> pos = new List<OpenCvSharp.Point>();
                foreach (LwPolylineVertex lw in l.Vertexes)
                {
                    pos.Add(new OpenCvSharp.Point((int)(lw.Position.X / siz - sx), (int)(lw.Position.Y / siz - sy)));
                }

                Scalar scalar = new Scalar(l.Color.B, l.Color.G, l.Color.R);
                for (int i = 0; i < pos.Count() - 1; i++)
                {
                    Cv2.Line(srcImage, pos[i], pos[i + 1], scalar, 1, LineTypes.AntiAlias, 0);
                }
                if (l.IsClosed) Cv2.Line(srcImage, pos[0], pos[pos.Count() - 1], scalar, 1, LineTypes.AntiAlias, 0);
            }
            return srcImage;
        }
        private Mat DxfSpline(DxfDocument dxf, double siz, int sx, int sy, Mat srcImage)
        {
            foreach (Spline l in dxf.Splines)
            {
                List<OpenCvSharp.Point> pos = new List<OpenCvSharp.Point>();
                foreach (SplineVertex lv in l.ControlPoints)
                {
                    pos.Add(new OpenCvSharp.Point((int)(lv.Position.X / siz - sx), (int)(lv.Position.Y / siz - sy)));
                }
                foreach (OpenCvSharp.Point p in pos)
                {
                    Cv2.Circle(srcImage, p, 1, Scalar.Red, -1);
                }
                Scalar scalar = new Scalar(l.Color.B, l.Color.G, l.Color.R);
                for (int i = 0; i < pos.Count() - 1; i++)
                {
                    Cv2.Line(srcImage, pos[i], pos[i + 1], scalar, 1, LineTypes.AntiAlias, 0);
                }
                if (l.IsClosed) Cv2.Line(srcImage, pos[0], pos[pos.Count() - 1], scalar, 1, LineTypes.AntiAlias, 0);
            }
            return srcImage;
        }
        private Mat DxfLayouts(DxfDocument dxf, double siz, int sx, int sy, Mat srcImage)
        {
            foreach (Layout o in dxf.Layouts)
            {
                List<DxfObject> entities = dxf.Layouts.GetReferences(o.Name);
                foreach (EntityObject entity in entities)
                {
                    foreach (Hatch dx in entity.Reactors)
                    {
                        foreach (HatchBoundaryPath bdp in dx.BoundaryPaths)
                        {
                            Scalar scalar = new Scalar(dx.Color.B, dx.Color.G, dx.Color.R);
                            List<OpenCvSharp.Point> pos1 = new List<OpenCvSharp.Point>();
                            List<OpenCvSharp.Point> pos2 = new List<OpenCvSharp.Point>();
                            List<List<OpenCvSharp.Point>> pos = OneHatch(bdp);
                            for (int i = 0; i < pos[0].Count(); i++)
                            {
                                pos1.Add(new OpenCvSharp.Point(pos[0][i].X / siz - sx, pos[0][i].Y / siz - sx));
                            }
                            for (int i = 0; i < pos[1].Count(); i++)
                            {
                                pos1.Add(new OpenCvSharp.Point(pos[1][i].X / siz - sx, pos[1][i].Y / siz - sx));
                            }
                            for (int i = 0; i < pos1.Count() - 1; i++)
                            {
                                Cv2.Line(srcImage, pos1[i], pos1[i + 1], scalar, 1, LineTypes.AntiAlias, 0);
                            }
                            for (int i = 0; i < pos2.Count() - 1; i++)
                            {
                                Cv2.Line(srcImage, pos2[i], pos2[i + 1], scalar, 1, LineTypes.AntiAlias, 0);
                            }
                        }
                    }
                }
            }
            return srcImage;
        }

        private static void ShowDxfDocumentInformation(DxfDocument dxf)
        {
            Console.WriteLine("图层数: {0}", dxf.Layers.Count);
            foreach (var o in dxf.Layers)
            {
                Console.WriteLine("\t图层名称:{0}; 参照数: {1}", o.Name, dxf.Layers.GetReferences(o).Count);
            }

            Console.WriteLine("线型数: {0}", dxf.Linetypes.Count);
            foreach (var o in dxf.Linetypes)
            {
                Console.WriteLine("\t线型名称:{0}; 参照数: {1}", o.Name, dxf.Linetypes.GetReferences(o.Name).Count);
            }
            Console.WriteLine();

            Console.WriteLine("文字样式: {0}", dxf.TextStyles.Count);
            foreach (var o in dxf.TextStyles)
            {
                Console.WriteLine("\t文字样式名称:{0}; 参照数: {1}", o.Name, dxf.TextStyles.GetReferences(o.Name).Count);
            }
            Console.WriteLine();

            Console.WriteLine("形状样式: {0}", dxf.ShapeStyles.Count);
            foreach (var o in dxf.ShapeStyles)
            {
                Console.WriteLine("\t形状样式名称:{0}; 参照数: {1}", o.Name, dxf.ShapeStyles.GetReferences(o.Name).Count);
            }
            Console.WriteLine();

            Console.WriteLine("标注样式: {0}", dxf.DimensionStyles.Count);
            foreach (var o in dxf.DimensionStyles)
            {
                Console.WriteLine("\t标注样式名称:{0}; 参照数: {1}", o.Name, dxf.DimensionStyles.GetReferences(o.Name).Count);
            }
            Console.WriteLine();

            Console.WriteLine("多线样式: {0}", dxf.MlineStyles.Count);
            foreach (var o in dxf.MlineStyles)
            {
                Console.WriteLine("\t多线样式名称:{0}; 参照数: {1}", o.Name, dxf.MlineStyles.GetReferences(o.Name).Count);
            }
            Console.WriteLine();

            Console.WriteLine("区块数: {0}", dxf.Blocks.Count);
            foreach (var o in dxf.Blocks)
            {
                Console.WriteLine("\t区块名称:{0}; References count: {1}", o.Name, dxf.Blocks.GetReferences(o.Name).Count);
                //Debug.Assert(ReferenceEquals(o.Layer, dxf.Layers[o.Layer.Name]), "Object reference not equal.");

                //foreach (var e in o.Entities)
                //{
                //    Debug.Assert(ReferenceEquals(e.Layer, dxf.Layers[e.Layer.Name]), "Object reference not equal.");
                //    Debug.Assert(ReferenceEquals(e.Linetype, dxf.Linetypes[e.Linetype.Name]), "Object reference not equal.");
                //    Debug.Assert(ReferenceEquals(e.Owner, dxf.Blocks[o.Name]), "Object reference not equal.");
                //    foreach (var x in e.XData.Values)
                //    {
                //        Debug.Assert(ReferenceEquals(x.ApplicationRegistry, dxf.ApplicationRegistries[x.ApplicationRegistry.Name]), "Object reference not equal.");
                //    }

                //    Text txt = e as Text;
                //    if (txt != null) 
                //        Debug.Assert(ReferenceEquals(txt.Style, dxf.TextStyles[txt.Style.Name]), "Object reference not equal.");

                //    MText mtxt = e as MText;
                //    if (mtxt != null) 
                //        Debug.Assert(ReferenceEquals(mtxt.Style, dxf.TextStyles[mtxt.Style.Name]), "Object reference not equal.");

                //    Dimension dim = e as Dimension;
                //    if (dim != null)
                //    {
                //        Debug.Assert(ReferenceEquals(dim.Style, dxf.DimensionStyles[dim.Style.Name]), "Object reference not equal.");
                //        Debug.Assert(ReferenceEquals(dim.Block, dxf.Blocks[dim.Block.Name]), "Object reference not equal.");
                //    }

                //    MLine mline = e as MLine;
                //    if (mline != null) 
                //        Debug.Assert(ReferenceEquals(mline.Style, dxf.MlineStyles[mline.Style.Name]), "Object reference not equal.");

                //    netDxf.Entities.Image img = e as netDxf.Entities.Image;
                //    if (img != null) 
                //        Debug.Assert(ReferenceEquals(img.Definition, dxf.ImageDefinitions[img.Definition.Name]), "Object reference not equal.");

                //    Insert ins = e as Insert;
                //    if (ins != null)
                //    {
                //        Debug.Assert(ReferenceEquals(ins.Block, dxf.Blocks[ins.Block.Name]), "Object reference not equal.");
                //        foreach (var a in ins.Attributes)
                //        {
                //            Debug.Assert(ReferenceEquals(a.Layer, dxf.Layers[a.Layer.Name]), "Object reference not equal.");
                //            Debug.Assert(ReferenceEquals(a.Linetype, dxf.Linetypes[a.Linetype.Name]), "Object reference not equal.");
                //            Debug.Assert(ReferenceEquals(a.Style, dxf.TextStyles[a.Style.Name]), "Object reference not equal.");
                //        }
                //    }
                //}

                //foreach (var a in o.AttributeDefinitions.Values)
                //{
                //    Debug.Assert(ReferenceEquals(a.Layer, dxf.Layers[a.Layer.Name]), "Object reference not equal.");
                //    Debug.Assert(ReferenceEquals(a.Linetype, dxf.Linetypes[a.Linetype.Name]), "Object reference not equal.");
                //    foreach (var x in a.XData.Values)
                //    {
                //        Debug.Assert(ReferenceEquals(x.ApplicationRegistry, dxf.ApplicationRegistries[x.ApplicationRegistry.Name]), "Object reference not equal.");
                //    }
                //}
            }
            Console.WriteLine();

            Console.WriteLine("布局: {0}", dxf.Layouts.Count);
            foreach (var o in dxf.Layouts)
            {
                //Debug.Assert(ReferenceEquals(o.AssociatedBlock, dxf.Blocks[o.AssociatedBlock.Name]), "Object reference not equal.");

                Console.WriteLine("\t{0}; References count: {1}", o.Name, dxf.Layouts.GetReferences(o.Name).Count);
                List<DxfObject> entities = dxf.Layouts.GetReferences(o.Name);
                foreach (var e in entities)
                {
                    EntityObject entity = e as EntityObject;
                    if (entity != null)
                    {
                        Debug.Assert(ReferenceEquals(entity.Layer, dxf.Layers[entity.Layer.Name]), "Object reference not equal.");
                        Debug.Assert(ReferenceEquals(entity.Linetype, dxf.Linetypes[entity.Linetype.Name]), "Object reference not equal.");
                        Debug.Assert(ReferenceEquals(entity.Owner, dxf.Blocks[o.AssociatedBlock.Name]), "Object reference not equal.");
                        foreach (var x in entity.XData.Values)
                        {
                            Debug.Assert(ReferenceEquals(x.ApplicationRegistry, dxf.ApplicationRegistries[x.ApplicationRegistry.Name]), "Object reference not equal.");
                        }
                    }

                    Text txt = e as Text;
                    if (txt != null) Debug.Assert(ReferenceEquals(txt.Style, dxf.TextStyles[txt.Style.Name]), "Object reference not equal.");

                    MText mtxt = e as MText;
                    if (mtxt != null) Debug.Assert(ReferenceEquals(mtxt.Style, dxf.TextStyles[mtxt.Style.Name]), "Object reference not equal.");

                    Dimension dim = e as Dimension;
                    if (dim != null)
                    {
                        Debug.Assert(ReferenceEquals(dim.Style, dxf.DimensionStyles[dim.Style.Name]), "Object reference not equal.");
                        Debug.Assert(ReferenceEquals(dim.Block, dxf.Blocks[dim.Block.Name]), "Object reference not equal.");
                    }

                    MLine mline = e as MLine;
                    if (mline != null) Debug.Assert(ReferenceEquals(mline.Style, dxf.MlineStyles[mline.Style.Name]), "Object reference not equal.");

                    netDxf.Entities.Image img = e as netDxf.Entities.Image;
                    if (img != null) Debug.Assert(ReferenceEquals(img.Definition, dxf.ImageDefinitions[img.Definition.Name]), "Object reference not equal.");

                    Insert ins = e as Insert;
                    if (ins != null)
                    {
                        Debug.Assert(ReferenceEquals(ins.Block, dxf.Blocks[ins.Block.Name]), "Object reference not equal.");
                        foreach (var a in ins.Attributes)
                        {
                            Debug.Assert(ReferenceEquals(a.Layer, dxf.Layers[a.Layer.Name]), "Object reference not equal.");
                            Debug.Assert(ReferenceEquals(a.Linetype, dxf.Linetypes[a.Linetype.Name]), "Object reference not equal.");
                            Debug.Assert(ReferenceEquals(a.Style, dxf.TextStyles[a.Style.Name]), "Object reference not equal.");
                        }
                    }
                }
            }
            Console.WriteLine();

            // the entities lists contain the geometry that has a graphical representation in the drawing across all layouts,
            // to get the entities that belongs to a specific layout you can get the references through the Layouts.GetReferences(name)
            // or check the EntityObject.Owner.Record.Layout property
            Console.WriteLine("ENTITIES:");
            Console.WriteLine("\t{0}; count: {1}", EntityType.Arc, dxf.Arcs.Count());
            //Console.WriteLine("\t{0}; count: {1}", EntityType.AttributeDefinition, dxf.AttributeDefinitions.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Circle, dxf.Circles.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Dimension, dxf.Dimensions.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Ellipse, dxf.Ellipses.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Face3D, dxf.Faces3d.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Hatch, dxf.Hatches.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Image, dxf.Images.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Insert, dxf.Inserts.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Leader, dxf.Leaders.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Polyline, dxf.LwPolylines.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Line, dxf.Lines.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Mesh, dxf.Meshes.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.MLine, dxf.MLines.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.MText, dxf.MTexts.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Point, dxf.Points.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.PolyfaceMesh, dxf.PolyfaceMeshes.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Polyline, dxf.Polylines.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Shape, dxf.Shapes.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Solid, dxf.Solids.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Spline, dxf.Splines.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Text, dxf.Texts.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Ray, dxf.Rays.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Underlay, dxf.Underlays.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Viewport, dxf.Viewports.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Wipeout, dxf.Wipeouts.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.XLine, dxf.XLines.Count());
            Console.WriteLine();
        }
    }
}
27、DataGridView实现翻页效果
29、StopWatch的使用

友情链接: CSDN激萌の小宅 95知识库 自考题库 罗分明个人网络博客 精益编程leanboot

小宅博客  www.bilibili996.com All Rights Reserved. 备案号: 闽ICP备2024034575号

网站经营许可证  福建省福州市 Copyright©2021-2025 版权所有

小宅博客
首页 智能家居 地图定位
公告:小宅博客网可以开发票了,需要发票的,去群里找群主哈!!

文章作者:激萌の小宅

促销:¥0

价格:¥0

配送方式: 购买后立即生效(如购买异常,请联系站长)
付款之后一定要等待自动跳转结束,否则购买可能会失败
  • 0 天

    有效期

  • 0

    总销量

  • 3

    累计评价

如何实现CAD dxf文件的读取 - (第二十八讲)


视频讲解如下:


CSDN源码下载

https://download.csdn.net/download/gs1069405343/20086400

网盘下载,提取码:lq0d

https://pan.baidu.com/s/1NVW8suoqTmxSqF4Q28duoA


DXF参考手册:http://docs.autodesk.com/ACD/2011/CHS/filesDXF/WS1a9193826455f5ff18cb41610ec0a2e719-79fe.htm

QQ截图20220417175510.jpg


这里给大家讲解一下如何实现CAD dxf文件的读取


读取dxf需要安装两个插件netDXF和OpenCvSharp3-AnyCPU,netDXF是用于解析dxf文件用的,OpenCvSharp3-AnyCPU是用来进行图像显示的。

演示效果如下


using netDxf;
using netDxf.Blocks;
using netDxf.Entities;
using netDxf.Objects;
using OpenCvSharp;
using OpenCvSharp.Extensions;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

namespace MyDxf
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Shown(object sender, EventArgs e)
        {
            //Rectangle dis = pictureBox1.DisplayRectangle;
            //Bitmap image = new Bitmap(dis.Width, dis.Height);
            //Graphics graphics = Graphics.FromImage(image);
            //SolidBrush brush = new SolidBrush(Color.Black);
            //graphics.FillRectangle(brush, dis);
            //Pen pen = new Pen(Color.Blue, 2f);
            //Pen pen2 = new Pen(Color.Blue, 200f);
            //Pen pen3 = new Pen(Color.FromArgb(50, 50, 50), 1f);
            //for (int i = 0; (i * 40) < dis.Height; i++)
            //{
            //    graphics.DrawLine(pen3, 0, 40 * i, dis.Width, 40 * i);
            //}
            //for (int i = 0; (i * 40) < dis.Width; i++)
            //{
            //    graphics.DrawLine(pen3, 40 * i, 0, 40 * i, dis.Height);
            //}
            //pictureBox1.Image = image;
        }
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBox1.SelectedIndex == 0)
            {
                numericUpDown1.Value = 1;
                numericUpDown2.Value = 2000;
                numericUpDown3.Value = 2800;
            }
            if (comboBox1.SelectedIndex == 1)
            {
                numericUpDown1.Value = (decimal)0.12;
                numericUpDown2.Value = 18300;
                numericUpDown3.Value = 25800;
            }
            if (comboBox1.SelectedIndex == 2)
            {
                numericUpDown1.Value = (decimal)0.6;
                numericUpDown2.Value = 3500;
                numericUpDown3.Value = 4500;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            DxfDocument dxf = DxfDocument.Load("DxfFile\\一帆风顺2.dxf");
            //ShowDxfDocumentInformation(dxf);
            //return;

            // 初始化 画布
            Rectangle dis = pictureBox1.DisplayRectangle;
            Mat srcImage = new Mat(new OpenCvSharp.Size(dis.Width, dis.Height), MatType.CV_8UC3, Scalar.All(0));

            double siz = (double)numericUpDown1.Value; // 缩放比例
            int sx = (int)numericUpDown2.Value; // 左右移动
            int sy = (int)numericUpDown3.Value; // 上下移动

            srcImage = DxfHatch(dxf, siz, sx, sy, srcImage);
            srcImage = DxfLayouts(dxf, siz, sx, sy, srcImage);
            srcImage = DxfPolyline(dxf, siz, sx, sy, srcImage);
            srcImage = DxfSpline(dxf, siz, sx, sy, srcImage);
            srcImage = DxfInserts(dxf, siz, sx, sy, srcImage);

            // 把opencv的图片显示到pictureBox1
            Mat resize_image = new Mat();
            Cv2.Resize(srcImage, resize_image, new OpenCvSharp.Size(), 1, 1, InterpolationFlags.Linear);
            Cv2.Flip(resize_image, resize_image, FlipMode.X);
            Bitmap bitmap = BitmapConverter.ToBitmap(resize_image);
            pictureBox1.Image = bitmap;
        }

        private List<List<OpenCvSharp.Point>> OneHatch(HatchBoundaryPath bdp)
        {
            List<OpenCvSharp.Point> pos1 = new List<OpenCvSharp.Point>();
            List<OpenCvSharp.Point> pos2 = new List<OpenCvSharp.Point>();
            for (int i = 0; i < bdp.Edges.Count(); i++)
            {
                if (bdp.Edges[i].Type == HatchBoundaryPath.EdgeType.Line)
                {
                    HatchBoundaryPath.Line l = bdp.Edges[i] as HatchBoundaryPath.Line;
                    pos1.Add(new OpenCvSharp.Point(l.Start.X, l.Start.Y));
                    pos1.Add(new OpenCvSharp.Point(l.End.X, l.End.Y));
                }
                if (bdp.Edges[i].Type == HatchBoundaryPath.EdgeType.Spline)
                {
                    HatchBoundaryPath.Spline l = bdp.Edges[i] as HatchBoundaryPath.Spline;
                    foreach (Vector3 cp in l.ControlPoints)
                    {
                        pos2.Add(new OpenCvSharp.Point(cp.X, cp.Y));
                    }
                }
            }
            return new List<List<OpenCvSharp.Point>>() { pos1, pos2 };
        }
        private Mat OneInsert(DxfDocument dxf, Insert ns, double siz, int sx, int sy, Mat srcImage)
        {
            Block block = dxf.Blocks.FirstOrDefault(x => x.Name == ns.Block.Name);
            Scalar scalar = new Scalar(ns.Color.B, ns.Color.G, ns.Color.R);

            foreach (EntityObject eObj in block.Entities)
            {
                List<OpenCvSharp.Point> pos = new List<OpenCvSharp.Point>();
                if (eObj.Type == EntityType.Insert)
                {
                    Insert eo = eObj as Insert;
                    srcImage = OneInsert(dxf, eo, siz, sx, sy, srcImage);
                }
                else if (eObj.Type == EntityType.Spline)
                {
                    Spline eo = eObj as Spline;
                    scalar = new Scalar(eo.Color.B, eo.Color.G, eo.Color.R);
                    foreach (SplineVertex sv in eo.ControlPoints)
                    {
                        pos.Add(new OpenCvSharp.Point((int)(sv.Position.X / siz - sx), (int)(sv.Position.Y / siz - sy)));
                    }
                }
                else if (eObj.Type == EntityType.LightWeightPolyline)
                {
                    LwPolyline eo = eObj as LwPolyline;
                    scalar = new Scalar(eo.Color.B, eo.Color.G, eo.Color.R);
                    foreach (LwPolylineVertex l in eo.Vertexes)
                    {
                        pos.Add(new OpenCvSharp.Point((int)(l.Position.X / siz - sx), (int)(l.Position.Y / siz - sy)));
                    }
                }
                else if (eObj.Type == EntityType.Hatch)
                {
                    Hatch eo = eObj as Hatch;
                    scalar = new Scalar(eo.Color.B, eo.Color.G, eo.Color.R);
                    foreach (HatchBoundaryPath bdp in eo.BoundaryPaths)
                    {
                        List<OpenCvSharp.Point> pos1 = new List<OpenCvSharp.Point>();
                        List<OpenCvSharp.Point> pos2 = new List<OpenCvSharp.Point>();
                        List<List<OpenCvSharp.Point>> poss = OneHatch(bdp);
                        for (int i = 0; i < poss[0].Count(); i++)
                        {
                            pos1.Add(new OpenCvSharp.Point(poss[0][i].X / siz - sx, poss[0][i].Y / siz - sx));
                        }
                        for (int i = 0; i < poss[1].Count(); i++)
                        {
                            pos1.Add(new OpenCvSharp.Point(poss[1][i].X / siz - sx, poss[1][i].Y / siz - sx));
                        }
                        for (int i = 0; i < pos1.Count() - 1; i++)
                        {
                            Cv2.Line(srcImage, pos1[i], pos1[i + 1], scalar, 1, LineTypes.AntiAlias, 0);
                        }
                        for (int i = 0; i < pos2.Count() - 1; i++)
                        {
                            Cv2.Line(srcImage, pos2[i], pos2[i + 1], scalar, 1, LineTypes.AntiAlias, 0);
                        }
                    }
                }
                else if (eObj.Type == EntityType.Line)
                {
                    Line eo = eObj as Line;
                    scalar = new Scalar(eo.Color.B, eo.Color.G, eo.Color.R);
                    pos.Add(new OpenCvSharp.Point((int)(eo.StartPoint.X / siz - sx), (int)(eo.StartPoint.Y / siz - sy)));
                    pos.Add(new OpenCvSharp.Point((int)(eo.EndPoint.X / siz - sx), (int)(eo.EndPoint.Y / siz - sy)));
                }
                else
                    Console.WriteLine(eObj.Type);

                for (int i = 0; i < pos.Count() - 1; i++)
                {
                    Cv2.Line(srcImage, pos[i], pos[i + 1], scalar, 1, LineTypes.AntiAlias, 0);
                }
            }
            return srcImage;
        }
        private Mat DxfHatch(DxfDocument dxf, double siz, int sx, int sy, Mat srcImage)
        {
            foreach (Hatch h in dxf.Hatches)
            {
                foreach (HatchBoundaryPath bdp in h.BoundaryPaths)
                {
                    Scalar scalar = new Scalar(h.Color.B, h.Color.G, h.Color.R);
                    List<OpenCvSharp.Point> pos1 = new List<OpenCvSharp.Point>();
                    List<OpenCvSharp.Point> pos2 = new List<OpenCvSharp.Point>();
                    List<List<OpenCvSharp.Point>> pos = OneHatch(bdp);
                    for (int i = 0; i < pos[0].Count(); i++)
                    {
                        pos1.Add(new OpenCvSharp.Point(pos[0][i].X / siz - sx, pos[0][i].Y / siz - sx));
                    }
                    for (int i = 0; i < pos[1].Count(); i++)
                    {
                        pos1.Add(new OpenCvSharp.Point(pos[1][i].X / siz - sx, pos[1][i].Y / siz - sx));
                    }
                    for (int i = 0; i < pos1.Count() - 1; i++)
                    {
                        Cv2.Line(srcImage, pos1[i], pos1[i + 1], scalar, 1, LineTypes.AntiAlias, 0);
                    }
                    for (int i = 0; i < pos2.Count() - 1; i++)
                    {
                        Cv2.Line(srcImage, pos2[i], pos2[i + 1], scalar, 1, LineTypes.AntiAlias, 0);
                    }
                }
            }
            return srcImage;
        }
        private Mat DxfInserts(DxfDocument dxf, double siz, int sx, int sy, Mat srcImage)
        {
            foreach (Insert ns in dxf.Inserts)
            {
                srcImage = OneInsert(dxf, ns, siz, sx, sy, srcImage);
            }
            return srcImage;
        }
        private Mat DxfPolyline(DxfDocument dxf, double siz, int sx, int sy, Mat srcImage)
        {
            foreach (LwPolyline l in dxf.LwPolylines)
            {
                List<OpenCvSharp.Point> pos = new List<OpenCvSharp.Point>();
                foreach (LwPolylineVertex lw in l.Vertexes)
                {
                    pos.Add(new OpenCvSharp.Point((int)(lw.Position.X / siz - sx), (int)(lw.Position.Y / siz - sy)));
                }

                Scalar scalar = new Scalar(l.Color.B, l.Color.G, l.Color.R);
                for (int i = 0; i < pos.Count() - 1; i++)
                {
                    Cv2.Line(srcImage, pos[i], pos[i + 1], scalar, 1, LineTypes.AntiAlias, 0);
                }
                if (l.IsClosed) Cv2.Line(srcImage, pos[0], pos[pos.Count() - 1], scalar, 1, LineTypes.AntiAlias, 0);
            }
            return srcImage;
        }
        private Mat DxfSpline(DxfDocument dxf, double siz, int sx, int sy, Mat srcImage)
        {
            foreach (Spline l in dxf.Splines)
            {
                List<OpenCvSharp.Point> pos = new List<OpenCvSharp.Point>();
                foreach (SplineVertex lv in l.ControlPoints)
                {
                    pos.Add(new OpenCvSharp.Point((int)(lv.Position.X / siz - sx), (int)(lv.Position.Y / siz - sy)));
                }
                foreach (OpenCvSharp.Point p in pos)
                {
                    Cv2.Circle(srcImage, p, 1, Scalar.Red, -1);
                }
                Scalar scalar = new Scalar(l.Color.B, l.Color.G, l.Color.R);
                for (int i = 0; i < pos.Count() - 1; i++)
                {
                    Cv2.Line(srcImage, pos[i], pos[i + 1], scalar, 1, LineTypes.AntiAlias, 0);
                }
                if (l.IsClosed) Cv2.Line(srcImage, pos[0], pos[pos.Count() - 1], scalar, 1, LineTypes.AntiAlias, 0);
            }
            return srcImage;
        }
        private Mat DxfLayouts(DxfDocument dxf, double siz, int sx, int sy, Mat srcImage)
        {
            foreach (Layout o in dxf.Layouts)
            {
                List<DxfObject> entities = dxf.Layouts.GetReferences(o.Name);
                foreach (EntityObject entity in entities)
                {
                    foreach (Hatch dx in entity.Reactors)
                    {
                        foreach (HatchBoundaryPath bdp in dx.BoundaryPaths)
                        {
                            Scalar scalar = new Scalar(dx.Color.B, dx.Color.G, dx.Color.R);
                            List<OpenCvSharp.Point> pos1 = new List<OpenCvSharp.Point>();
                            List<OpenCvSharp.Point> pos2 = new List<OpenCvSharp.Point>();
                            List<List<OpenCvSharp.Point>> pos = OneHatch(bdp);
                            for (int i = 0; i < pos[0].Count(); i++)
                            {
                                pos1.Add(new OpenCvSharp.Point(pos[0][i].X / siz - sx, pos[0][i].Y / siz - sx));
                            }
                            for (int i = 0; i < pos[1].Count(); i++)
                            {
                                pos1.Add(new OpenCvSharp.Point(pos[1][i].X / siz - sx, pos[1][i].Y / siz - sx));
                            }
                            for (int i = 0; i < pos1.Count() - 1; i++)
                            {
                                Cv2.Line(srcImage, pos1[i], pos1[i + 1], scalar, 1, LineTypes.AntiAlias, 0);
                            }
                            for (int i = 0; i < pos2.Count() - 1; i++)
                            {
                                Cv2.Line(srcImage, pos2[i], pos2[i + 1], scalar, 1, LineTypes.AntiAlias, 0);
                            }
                        }
                    }
                }
            }
            return srcImage;
        }

        private static void ShowDxfDocumentInformation(DxfDocument dxf)
        {
            Console.WriteLine("图层数: {0}", dxf.Layers.Count);
            foreach (var o in dxf.Layers)
            {
                Console.WriteLine("\t图层名称:{0}; 参照数: {1}", o.Name, dxf.Layers.GetReferences(o).Count);
            }

            Console.WriteLine("线型数: {0}", dxf.Linetypes.Count);
            foreach (var o in dxf.Linetypes)
            {
                Console.WriteLine("\t线型名称:{0}; 参照数: {1}", o.Name, dxf.Linetypes.GetReferences(o.Name).Count);
            }
            Console.WriteLine();

            Console.WriteLine("文字样式: {0}", dxf.TextStyles.Count);
            foreach (var o in dxf.TextStyles)
            {
                Console.WriteLine("\t文字样式名称:{0}; 参照数: {1}", o.Name, dxf.TextStyles.GetReferences(o.Name).Count);
            }
            Console.WriteLine();

            Console.WriteLine("形状样式: {0}", dxf.ShapeStyles.Count);
            foreach (var o in dxf.ShapeStyles)
            {
                Console.WriteLine("\t形状样式名称:{0}; 参照数: {1}", o.Name, dxf.ShapeStyles.GetReferences(o.Name).Count);
            }
            Console.WriteLine();

            Console.WriteLine("标注样式: {0}", dxf.DimensionStyles.Count);
            foreach (var o in dxf.DimensionStyles)
            {
                Console.WriteLine("\t标注样式名称:{0}; 参照数: {1}", o.Name, dxf.DimensionStyles.GetReferences(o.Name).Count);
            }
            Console.WriteLine();

            Console.WriteLine("多线样式: {0}", dxf.MlineStyles.Count);
            foreach (var o in dxf.MlineStyles)
            {
                Console.WriteLine("\t多线样式名称:{0}; 参照数: {1}", o.Name, dxf.MlineStyles.GetReferences(o.Name).Count);
            }
            Console.WriteLine();

            Console.WriteLine("区块数: {0}", dxf.Blocks.Count);
            foreach (var o in dxf.Blocks)
            {
                Console.WriteLine("\t区块名称:{0}; References count: {1}", o.Name, dxf.Blocks.GetReferences(o.Name).Count);
                //Debug.Assert(ReferenceEquals(o.Layer, dxf.Layers[o.Layer.Name]), "Object reference not equal.");

                //foreach (var e in o.Entities)
                //{
                //    Debug.Assert(ReferenceEquals(e.Layer, dxf.Layers[e.Layer.Name]), "Object reference not equal.");
                //    Debug.Assert(ReferenceEquals(e.Linetype, dxf.Linetypes[e.Linetype.Name]), "Object reference not equal.");
                //    Debug.Assert(ReferenceEquals(e.Owner, dxf.Blocks[o.Name]), "Object reference not equal.");
                //    foreach (var x in e.XData.Values)
                //    {
                //        Debug.Assert(ReferenceEquals(x.ApplicationRegistry, dxf.ApplicationRegistries[x.ApplicationRegistry.Name]), "Object reference not equal.");
                //    }

                //    Text txt = e as Text;
                //    if (txt != null) 
                //        Debug.Assert(ReferenceEquals(txt.Style, dxf.TextStyles[txt.Style.Name]), "Object reference not equal.");

                //    MText mtxt = e as MText;
                //    if (mtxt != null) 
                //        Debug.Assert(ReferenceEquals(mtxt.Style, dxf.TextStyles[mtxt.Style.Name]), "Object reference not equal.");

                //    Dimension dim = e as Dimension;
                //    if (dim != null)
                //    {
                //        Debug.Assert(ReferenceEquals(dim.Style, dxf.DimensionStyles[dim.Style.Name]), "Object reference not equal.");
                //        Debug.Assert(ReferenceEquals(dim.Block, dxf.Blocks[dim.Block.Name]), "Object reference not equal.");
                //    }

                //    MLine mline = e as MLine;
                //    if (mline != null) 
                //        Debug.Assert(ReferenceEquals(mline.Style, dxf.MlineStyles[mline.Style.Name]), "Object reference not equal.");

                //    netDxf.Entities.Image img = e as netDxf.Entities.Image;
                //    if (img != null) 
                //        Debug.Assert(ReferenceEquals(img.Definition, dxf.ImageDefinitions[img.Definition.Name]), "Object reference not equal.");

                //    Insert ins = e as Insert;
                //    if (ins != null)
                //    {
                //        Debug.Assert(ReferenceEquals(ins.Block, dxf.Blocks[ins.Block.Name]), "Object reference not equal.");
                //        foreach (var a in ins.Attributes)
                //        {
                //            Debug.Assert(ReferenceEquals(a.Layer, dxf.Layers[a.Layer.Name]), "Object reference not equal.");
                //            Debug.Assert(ReferenceEquals(a.Linetype, dxf.Linetypes[a.Linetype.Name]), "Object reference not equal.");
                //            Debug.Assert(ReferenceEquals(a.Style, dxf.TextStyles[a.Style.Name]), "Object reference not equal.");
                //        }
                //    }
                //}

                //foreach (var a in o.AttributeDefinitions.Values)
                //{
                //    Debug.Assert(ReferenceEquals(a.Layer, dxf.Layers[a.Layer.Name]), "Object reference not equal.");
                //    Debug.Assert(ReferenceEquals(a.Linetype, dxf.Linetypes[a.Linetype.Name]), "Object reference not equal.");
                //    foreach (var x in a.XData.Values)
                //    {
                //        Debug.Assert(ReferenceEquals(x.ApplicationRegistry, dxf.ApplicationRegistries[x.ApplicationRegistry.Name]), "Object reference not equal.");
                //    }
                //}
            }
            Console.WriteLine();

            Console.WriteLine("布局: {0}", dxf.Layouts.Count);
            foreach (var o in dxf.Layouts)
            {
                //Debug.Assert(ReferenceEquals(o.AssociatedBlock, dxf.Blocks[o.AssociatedBlock.Name]), "Object reference not equal.");

                Console.WriteLine("\t{0}; References count: {1}", o.Name, dxf.Layouts.GetReferences(o.Name).Count);
                List<DxfObject> entities = dxf.Layouts.GetReferences(o.Name);
                foreach (var e in entities)
                {
                    EntityObject entity = e as EntityObject;
                    if (entity != null)
                    {
                        Debug.Assert(ReferenceEquals(entity.Layer, dxf.Layers[entity.Layer.Name]), "Object reference not equal.");
                        Debug.Assert(ReferenceEquals(entity.Linetype, dxf.Linetypes[entity.Linetype.Name]), "Object reference not equal.");
                        Debug.Assert(ReferenceEquals(entity.Owner, dxf.Blocks[o.AssociatedBlock.Name]), "Object reference not equal.");
                        foreach (var x in entity.XData.Values)
                        {
                            Debug.Assert(ReferenceEquals(x.ApplicationRegistry, dxf.ApplicationRegistries[x.ApplicationRegistry.Name]), "Object reference not equal.");
                        }
                    }

                    Text txt = e as Text;
                    if (txt != null) Debug.Assert(ReferenceEquals(txt.Style, dxf.TextStyles[txt.Style.Name]), "Object reference not equal.");

                    MText mtxt = e as MText;
                    if (mtxt != null) Debug.Assert(ReferenceEquals(mtxt.Style, dxf.TextStyles[mtxt.Style.Name]), "Object reference not equal.");

                    Dimension dim = e as Dimension;
                    if (dim != null)
                    {
                        Debug.Assert(ReferenceEquals(dim.Style, dxf.DimensionStyles[dim.Style.Name]), "Object reference not equal.");
                        Debug.Assert(ReferenceEquals(dim.Block, dxf.Blocks[dim.Block.Name]), "Object reference not equal.");
                    }

                    MLine mline = e as MLine;
                    if (mline != null) Debug.Assert(ReferenceEquals(mline.Style, dxf.MlineStyles[mline.Style.Name]), "Object reference not equal.");

                    netDxf.Entities.Image img = e as netDxf.Entities.Image;
                    if (img != null) Debug.Assert(ReferenceEquals(img.Definition, dxf.ImageDefinitions[img.Definition.Name]), "Object reference not equal.");

                    Insert ins = e as Insert;
                    if (ins != null)
                    {
                        Debug.Assert(ReferenceEquals(ins.Block, dxf.Blocks[ins.Block.Name]), "Object reference not equal.");
                        foreach (var a in ins.Attributes)
                        {
                            Debug.Assert(ReferenceEquals(a.Layer, dxf.Layers[a.Layer.Name]), "Object reference not equal.");
                            Debug.Assert(ReferenceEquals(a.Linetype, dxf.Linetypes[a.Linetype.Name]), "Object reference not equal.");
                            Debug.Assert(ReferenceEquals(a.Style, dxf.TextStyles[a.Style.Name]), "Object reference not equal.");
                        }
                    }
                }
            }
            Console.WriteLine();

            // the entities lists contain the geometry that has a graphical representation in the drawing across all layouts,
            // to get the entities that belongs to a specific layout you can get the references through the Layouts.GetReferences(name)
            // or check the EntityObject.Owner.Record.Layout property
            Console.WriteLine("ENTITIES:");
            Console.WriteLine("\t{0}; count: {1}", EntityType.Arc, dxf.Arcs.Count());
            //Console.WriteLine("\t{0}; count: {1}", EntityType.AttributeDefinition, dxf.AttributeDefinitions.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Circle, dxf.Circles.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Dimension, dxf.Dimensions.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Ellipse, dxf.Ellipses.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Face3D, dxf.Faces3d.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Hatch, dxf.Hatches.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Image, dxf.Images.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Insert, dxf.Inserts.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Leader, dxf.Leaders.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Polyline, dxf.LwPolylines.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Line, dxf.Lines.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Mesh, dxf.Meshes.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.MLine, dxf.MLines.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.MText, dxf.MTexts.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Point, dxf.Points.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.PolyfaceMesh, dxf.PolyfaceMeshes.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Polyline, dxf.Polylines.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Shape, dxf.Shapes.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Solid, dxf.Solids.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Spline, dxf.Splines.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Text, dxf.Texts.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Ray, dxf.Rays.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Underlay, dxf.Underlays.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Viewport, dxf.Viewports.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.Wipeout, dxf.Wipeouts.Count());
            Console.WriteLine("\t{0}; count: {1}", EntityType.XLine, dxf.XLines.Count());
            Console.WriteLine();
        }
    }
}