如何实现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

这里给大家讲解一下如何实现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();
}
}
}