C#——把dxf文件读取显示在picturebox中(测试项目在链接下载)
C#——把dxf文件读取显示在picturebox中(测试项目在链接下载)
一、在开始之前需要安装一个NuGet包,步骤如下


二、安装完成以后新建一个类文件,把代码复制进去,并且进行应用就可以了
三、测试demo下载地址为链接:https://pan.baidu.com/s/1YUWDfgttDqjlY8HCRO5H0w?pwd=kfbl
提取码:kfbl,里面有不仅有demo还有测试用的dxf文件,如果对您有帮助,请点一个赞,谢谢
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using netDxf;
using System.Windows.Forms;
using System.Drawing;
namespace DxfHelper
{
class DxfHelper
{
string _path;
DxfDocument _dxfDocument;
public string Path { get => _path; set => _path = value; }
public DxfDocument DxfDocument { get => _dxfDocument; set => _dxfDocument = value; }
public DxfHelper(string path)
{
this.Path = path;
this.DxfDocument = netDxf.DxfDocument.Load(this.Path);
}
public bool DrawMapInPictureBox(PictureBox pictureBox,out string errorMsg)
{
errorMsg = "";//错误信息
PointF pointF1;//dxf抽象成矩形后左下角坐标
PointF pointF2;//dxf抽象成矩形后右上角坐标
float widthRate;//把dxf图形放进picturebox后的横向伸缩率
float highRate;//把dxf图形放进picturebox后的纵向伸缩率
try
{
#region*****************获取把dxf抽象成矩形以后的4个角的标准坐标********************************
if (this.DxfDocument.Circles.Any())
{
netDxf.Entities.Circle circle = this.DxfDocument.Circles.First();
pointF1 = new PointF(Convert.ToSingle(circle.Center.X), Convert.ToSingle(circle.Center.Y));
pointF2 = new PointF(Convert.ToSingle(circle.Center.X), Convert.ToSingle(circle.Center.Y));
}
else if (this.DxfDocument.Lines.Any())
{
netDxf.Entities.Line line = this.DxfDocument.Lines.First();
pointF1 = new PointF(Convert.ToSingle(line.StartPoint.X), Convert.ToSingle(line.StartPoint.Y));
pointF2 = new PointF(Convert.ToSingle(line.StartPoint.X), Convert.ToSingle(line.StartPoint.Y));
}
else if (this.DxfDocument.Splines.Any())
{
netDxf.Entities.Spline spline = this.DxfDocument.Splines.First();
pointF1 = new PointF(Convert.ToSingle(spline.ControlPoints[0].Position.X), Convert.ToSingle(spline.ControlPoints[0].Position.Y));
pointF2 = new PointF(Convert.ToSingle(spline.ControlPoints[0].Position.X), Convert.ToSingle(spline.ControlPoints[0].Position.Y));
}
else
{
pointF1 = new PointF(0, 0);
pointF2 = new PointF(0, 0);
}
foreach (var item in this.DxfDocument.Circles)
{
if (Convert.ToSingle(item.Center.X - item.Radius) < pointF1.X)
{
pointF1.X = Convert.ToSingle(item.Center.X - item.Radius);
}
if (Convert.ToSingle(item.Center.Y - item.Radius) < pointF1.Y)
{
pointF1.Y = Convert.ToSingle(item.Center.Y - item.Radius);
}
if (Convert.ToSingle(item.Center.X + item.Radius) > pointF2.X)
{
pointF2.X = Convert.ToSingle(item.Center.X + item.Radius);
}
if (Convert.ToSingle(item.Center.Y + item.Radius) > pointF2.Y)
{
pointF2.Y = Convert.ToSingle(item.Center.Y + item.Radius);
}
}
foreach (var item in this.DxfDocument.Lines)
{
if (Convert.ToSingle(item.StartPoint.X) < pointF1.X)
{
pointF1.X = Convert.ToSingle(item.StartPoint.X);
}
if (Convert.ToSingle(item.StartPoint.Y) < pointF1.Y)
{
pointF1.Y = Convert.ToSingle(item.StartPoint.Y);
}
if (Convert.ToSingle(item.StartPoint.X) > pointF2.X)
{
pointF2.X = Convert.ToSingle(item.StartPoint.X);
}
if (Convert.ToSingle(item.StartPoint.Y) > pointF2.Y)
{
pointF2.Y = Convert.ToSingle(item.StartPoint.Y);
}
if (Convert.ToSingle(item.EndPoint.X) < pointF1.X)
{
pointF1.X = Convert.ToSingle(item.EndPoint.X);
}
if (Convert.ToSingle(item.EndPoint.Y) < pointF1.Y)
{
pointF1.Y = Convert.ToSingle(item.EndPoint.Y);
}
if (Convert.ToSingle(item.EndPoint.X) > pointF2.X)
{
pointF2.X = Convert.ToSingle(item.EndPoint.X);
}
if (Convert.ToSingle(item.EndPoint.Y) > pointF2.Y)
{
pointF2.Y = Convert.ToSingle(item.EndPoint.Y);
}
}
foreach (var item in this.DxfDocument.Splines)
{
for (int i = 0; i < item.ControlPoints.Count; i++)
{
if (Convert.ToSingle(item.ControlPoints[i].Position.X) < pointF1.X)
{
pointF1.X = Convert.ToSingle(item.ControlPoints[i].Position.X);
}
if (Convert.ToSingle(item.ControlPoints[i].Position.Y) < pointF1.Y)
{
pointF1.Y = Convert.ToSingle(item.ControlPoints[i].Position.Y);
}
if (Convert.ToSingle(item.ControlPoints[i].Position.X) > pointF2.X)
{
pointF2.X = Convert.ToSingle(item.ControlPoints[i].Position.X);
}
if (Convert.ToSingle(item.ControlPoints[i].Position.Y) > pointF2.Y)
{
pointF2.Y = Convert.ToSingle(item.ControlPoints[i].Position.Y);
}
}
}
#endregion
#region*****************获取dxf图形与picturebox的伸缩比例**************************************
widthRate = (pointF2.X - pointF1.X) / pictureBox.Width;
highRate = (pointF2.Y - pointF1.Y) / pictureBox.Height;
#endregion
#region*****************绘制图形**************************************************************
float ridiusRate = (widthRate * widthRate + highRate * highRate);
ridiusRate = Convert.ToSingle(Math.Pow(ridiusRate, 0.5));
int circleNum = this.DxfDocument.Circles.Count();
List<netDxf.Entities.Circle> circlesList = new List<netDxf.Entities.Circle>();
foreach (var item in this.DxfDocument.Circles)
{
circlesList.Add(item);
}
Pen pen = new Pen(Color.Red, 2);
Graphics graphics = pictureBox.CreateGraphics();
graphics.Clear(Color.White);
for (int i = 0; i < circlesList.Count; i++)
{
float centerX = Convert.ToSingle(circlesList[i].Center.X);
float centerY = Convert.ToSingle(circlesList[i].Center.Y);
float radius = Convert.ToSingle(circlesList[i].Radius);
graphics.DrawEllipse(pen, (centerX - pointF1.X) / widthRate, (centerY - pointF1.Y) / highRate, radius / ridiusRate, radius / ridiusRate);
}
int lineNum = this.DxfDocument.Lines.Count();
List<netDxf.Entities.Line> linesList = new List<netDxf.Entities.Line>();
foreach (var item in this.DxfDocument.Lines)
{
linesList.Add(item);
}
for (int i = 0; i < linesList.Count; i++)
{
float point1X = Convert.ToSingle(linesList[i].StartPoint.X) - pointF1.X;
float point1Y = Convert.ToSingle(linesList[i].StartPoint.Y) - pointF1.Y;
float point2X = Convert.ToSingle(linesList[i].EndPoint.X) - pointF1.X;
float point2Y = Convert.ToSingle(linesList[i].EndPoint.Y) - pointF1.Y;
graphics.DrawLine(pen, point1X / widthRate, point1Y / highRate, point2X / widthRate, point2Y / highRate);
}
int spineLine = this.DxfDocument.Splines.Count();
List<netDxf.Entities.Spline> spinesList = new List<netDxf.Entities.Spline>();
foreach (var item in this.DxfDocument.Splines)
{
for (int i = 0; i < item.ControlPoints.Count; i++)
{
PointF pointBegin = new PointF(Convert.ToSingle(item.ControlPoints[i].Position.X) - pointF1.X, Convert.ToSingle(item.ControlPoints[i].Position.Y) - pointF1.Y);
if (i < item.ControlPoints.Count - 1)
{
PointF pointEnd = new PointF(Convert.ToSingle(item.ControlPoints[i + 1].Position.X) - pointF1.X, Convert.ToSingle(item.ControlPoints[i + 1].Position.Y) - pointF1.Y);
graphics.DrawLine(pen, pointBegin.X / widthRate, pointBegin.Y / highRate, pointEnd.X / widthRate, pointEnd.Y / highRate);
}
}
}
#endregion
}
catch (Exception ex)
{
errorMsg = ex.Message;
}
return true;
}
}
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)