一、在开始之前需要安装一个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;
        }
    }
}
 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐