C#操作dxf文件修改和绘制线、标签、块元素

C#操作dxf文件修改和绘制线、标签、块元素

我们在日常开发时,偶尔会遇到对dxf文件进行操作的需求,往往是对dxf中进行绘制线、标签和块元素,这里我给大家提供一些代码用于实现这些需求,如果觉得有用希望给我一个赞。

在dxf文件中修改和绘制线

下面是获取实时掘进面图层,并对线的坐标进行重新设值操作

//读取文件:新建DxfDocument实例1并读取对应路径的dxf文件。
DxfDocument dxf = DxfDocument.Load(dxfpath);
   if (dxf != null)
   {
       int count = dxf.Lines.Count();
       if (count > 0)
       {
           foreach (netDxf.Entities.Line line in dxf.Lines)
           {
               string mlayername = line.Layer.Name;
               if (mlayername == "实时掘进面")
               {
                   line.StartPoint = v3start;
                   line.EndPoint = v3end;
               }
           }
       }
   }
   bool issecced = dxf.Save(dxfpath, false);

下面是在dxf中绘制一条线元素

//读取文件:新建DxfDocument实例1并读取对应路径的dxf文件。
DxfDocument dxf = DxfDocument.Load(dxfpath);
if (dxf != null)
{
    netDxf.Entities.Line mline = new netDxf.Entities.Line();
    mline.StartPoint = v3start;
    mline.EndPoint = v3end;
    dxf.AddEntity(mline);
}
bool issecced = dxf.Save(dxfpath, false);

在dxf文件中修改和绘制文字标签

下面是获取实时日期图层,并对文字标签的内容进行重新设置,对文字标签的坐标进行重新设值操作

//读取文件:新建DxfDocument实例1并读取对应路径的dxf文件。
DxfDocument dxf = DxfDocument.Load(dxfpath);
if (dxf != null)
{
    int count = dxf.MTexts.Count();
    if (count > 0)
    {
        foreach (netDxf.Entities.MText line in dxf.MTexts)
        {
            string mlayername = line.Layer.Name;
            string name = line.Value;
            if (mlayername == "实时日期")
            {
                //获取当前年月日
                DateTime mtime = DateTime.Parse(enddate);
                var year = mtime.Year.ToString().Substring(2, 2);
                var month = mtime.Month.ToString().PadLeft(2, '0');
                var day = mtime.Day.ToString().PadLeft(2, '0');
                int mmonth = int.Parse(month);
                int mday = int.Parse(day);
                line.Value = mmonth + @"\P月" + @"\P " + mday + @"\P日";
                line.Position = new Vector3((v3start.X + 10 + v3end.X + 10) / 2, (v3start.Y - 10 + v3end.Y - 10) / 2, 0);
            }
        }
    }
}
bool issecced = dxf.Save(dxfpath, false);

下面是在dxf文件中添加一个文字标签

//读取文件:新建DxfDocument实例1并读取对应路径的dxf文件。
DxfDocument dxf = DxfDocument.Load(dxfpath);
if (dxf != null)
{
    netDxf.Entities.MText mtext = new netDxf.Entities.MText();
    mtext.Height = 15;
    mtext.RectangleWidth = 15;
    mtext.Value = ocenaName;
    mtext.Style.FontStyle = netDxf.Tables.FontStyle.Bold;
    mtext.Position = new Vector3(v3Start.X - 20, v3Start.Y + 15, 0);
    dxf.AddEntity(mtext);
}
bool issecced = dxf.Save(dxfpath, false);

在dxf文件中绘制块元素

下面是在dxf中绘制块元素

//读取文件:新建DxfDocument实例1并读取对应路径的dxf文件。
DxfDocument dxf = DxfDocument.Load(dxfpath);
if (dxf != null)
{
	//加载CAD线性材质,第一个是材质路径,第二个是材质编号
    HatchPattern pattern = new HatchPattern("hatch\\acad.pat", "ESCHER");
    pattern.Scale = 1.5;
    pattern.Angle = 30;
    LwPolyline poly = new LwPolyline();
    poly.Vertexes.Add(new LwPolylineVertex(-22 + v3Start.X, -11 + v3Start.Y));
    poly.Vertexes.Add(new LwPolylineVertex(22 + v3Start.X, -11 + v3Start.Y));
    poly.Vertexes.Add(new LwPolylineVertex(22 + v3Start.X, 11 + v3Start.Y));
    poly.Vertexes.Add(new LwPolylineVertex(-22 + v3Start.X, 11 + v3Start.Y));
    poly.IsClosed = true;//图形需要封闭
    Block block = new Block("MyBlock");
    block.Entities.Add(poly);
    //给封闭图形填充
    List<HatchBoundaryPath> boundary = new List<HatchBoundaryPath>
    {
        new HatchBoundaryPath(new List<EntityObject> {poly})
    };
    Hatch hatch = new Hatch(pattern, boundary, true);
    AciColor color = new AciColor(Color.Blue);
    hatch.Color = color;
    dxf.AddEntity(hatch);
}
bool issecced = dxf.Save(dxfpath, false);

材质编号示例图
材质编号示例图
完整代码,我放下面了,可以直接作为一个类使用,如果大家觉得我的文章起到了作用或者解决你的问题,麻烦给我一个赞鼓励鼓励!谢谢!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using netDxf;
using netDxf.Blocks;
using netDxf.Collections;
using netDxf.Entities;
using netDxf.Header;
using netDxf.Objects;
using netDxf.Tables;
using netDxf.Units;
using System.Drawing;
using System.Windows.Forms;

namespace AnalyseSystem.BLL
{
    class MyDxf
    {
        #region 变量
        /// <summary>
        /// 材质路径
        /// </summary>
        private static string filepath = Application.StartupPath + "\\texture\\acad.pat";
        #endregion
        /// <summary>
        /// 构造函数
        /// </summary>
        public MyDxf()
        {

        }
        /// <summary>
        /// 修改实时掘进面位置和实时日期
        /// </summary>
        /// <param name="dxfpath"></param>
        /// <param name="v3start"></param>
        /// <param name="v3end"></param>
        public void DrawPolyon(string dxfpath, Vector3 v3start, Vector3 v3end, string enddate)
        {
            try
            {
                //读取文件:新建DxfDocument实例1并读取对应路径的dxf文件。
                DxfDocument dxf = DxfDocument.Load(dxfpath);
                if (dxf != null)
                {
                    int count = dxf.MTexts.Count();
                    if (count > 0)
                    {
                        foreach (netDxf.Entities.MText line in dxf.MTexts)
                        {
                            string mlayername = line.Layer.Name;
                            string name = line.Value;
                            if (mlayername == "实时日期")
                            {
                                //获取当前年月日
                                DateTime mtime = DateTime.Parse(enddate);
                                var year = mtime.Year.ToString().Substring(2, 2);
                                var month = mtime.Month.ToString().PadLeft(2, '0');
                                var day = mtime.Day.ToString().PadLeft(2, '0');
                                int mmonth = int.Parse(month);
                                int mday = int.Parse(day);
                                line.Value = mmonth + @"\P月" + @"\P " + mday + @"\P日";
                                line.Position = new Vector3((v3start.X + 10 + v3end.X + 10) / 2, (v3start.Y - 10 + v3end.Y - 10) / 2, 0);
                            }
                        }
                    }
                    count = dxf.Lines.Count();
                    if (count > 0)
                    {
                        foreach (netDxf.Entities.Line line in dxf.Lines)
                        {
                            string mlayername = line.Layer.Name;
                            if (mlayername == "实时掘进面")
                            {
                                line.StartPoint = v3start;
                                line.EndPoint = v3end;
                            }
                        }
                    }
                }
                bool issecced = dxf.Save(dxfpath, false);
            }
            catch (System.Exception ep) { }
        }
        /// <summary>
        /// 绘制实时掘进面位置
        /// </summary>
        /// <param name="dxfpath"></param>
        /// <param name="v3start"></param>
        /// <param name="v3end"></param>
        public void DrawLine(string dxfpath, Vector3 v3start, Vector3 v3end, string enddate)
        {
            try
            {
                //读取文件:新建DxfDocument实例1并读取对应路径的dxf文件。
                DxfDocument dxf = DxfDocument.Load(dxfpath);
                if (dxf != null)
                {
                    netDxf.Entities.Line mline = new netDxf.Entities.Line();
                    mline.StartPoint = v3start;
                    mline.EndPoint = v3end;
                    dxf.AddEntity(mline);
                }
                bool issecced = dxf.Save(dxfpath, false);
                //System.GC.Collect(System.GC.GetGeneration(dxf));
            }
            catch (System.Exception ep) { }
        }
        /// <summary>
        /// 绘制地音探头名称
        /// </summary>
        /// <param name="dxfpath"></param>
        /// <param name="v3Start"></param>
        /// <param name="v3End"></param>
        /// <param name="ocenaName"></param>
        public void DrawText(string dxfpath, Vector3 v3Start, string ocenaName)
        {
            try
            {
                //读取文件:新建DxfDocument实例1并读取对应路径的dxf文件。
                DxfDocument dxf = DxfDocument.Load(dxfpath);
                if (dxf != null)
                {
                    netDxf.Entities.MText mtext = new netDxf.Entities.MText();
                    mtext.Height = 15;
                    mtext.RectangleWidth = 15;
                    mtext.Value = ocenaName;
                    mtext.Style.FontStyle = netDxf.Tables.FontStyle.Bold;
                    mtext.Position = new Vector3(v3Start.X - 20, v3Start.Y + 15, 0);
                    dxf.AddEntity(mtext);
                }
                bool issecced = dxf.Save(dxfpath, false);
            }
            catch (System.Exception ep) { }
        }
        /// <summary>
        /// 绘制地音探头块
        /// </summary>
        /// <param name="dxfpath"></param>
        /// <param name="v3Start"></param>
        public void DrawBlock(string dxfpath, Vector3 v3Start)
        {
            try
            {
                //读取文件:新建DxfDocument实例1并读取对应路径的dxf文件。
                DxfDocument dxf = DxfDocument.Load(dxfpath);
                if (dxf != null)
                {
                    //HatchPattern pattern = new HatchPattern("hatch\\acad.pat", "ESCHER");
                    HatchPattern pattern = new HatchPattern(filepath, "ESCHER");
                    pattern.Scale = 1.5;
                    pattern.Angle = 30;
                    LwPolyline poly = new LwPolyline();
                    poly.Vertexes.Add(new LwPolylineVertex(-22 + v3Start.X, -11 + v3Start.Y));
                    poly.Vertexes.Add(new LwPolylineVertex(22 + v3Start.X, -11 + v3Start.Y));
                    poly.Vertexes.Add(new LwPolylineVertex(22 + v3Start.X, 11 + v3Start.Y));
                    poly.Vertexes.Add(new LwPolylineVertex(-22 + v3Start.X, 11 + v3Start.Y));
                    poly.IsClosed = true;//图形需要封闭
                    Block block = new Block("MyBlock");
                    block.Entities.Add(poly);
                    //给封闭图形填充
                    List<HatchBoundaryPath> boundary = new List<HatchBoundaryPath>
                    {
                        new HatchBoundaryPath(new List<EntityObject> {poly})
                    };
                    Hatch hatch = new Hatch(pattern, boundary, true);
                    AciColor color = new AciColor(Color.Blue);
                    hatch.Color = color;
                    dxf.AddEntity(hatch);
                }
                bool issecced = dxf.Save(dxfpath, false);
            }
            catch (System.Exception ep)
            {
                //错误信息写入日志文件
                WriteLog.WriteMessage(ep.ToString());
                return;
            }
        }
    }
}
  • 16
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
DXF文件中,我们最关心的是如何得到模型上各个点的坐标,并且用这些点连成许多个三用形,构成面,进而绘制出整个模型。在DXF文件的结构中,我们已经看到,DXF文件先叙述实体上各个点的坐标,然后叙述实体上有多少个面,每个面由哪些点构成。这样,我们至少需要2个数组来存储一个实体的信息,一个用于存储点的坐标,一个用于存储点序,我们可以把这2个数组放到一个结构中,如果模型中实体的数目不止一个是,我们就用这个结构来定义一个数组。在本文中,我们使用      Visual C++ 6.0 来写一个读取DXF文件的小程序。     在实际应用中,模型中实体的数目以及实体中点和面的数目都是不定的,为了有效地利用内存,我们选择MFC类库中的聚合类CobArray类所创建的对象vertex,      sequence来存储和管理实体的点坐标和点序。     CObArray类是一个用来存放数组类的聚合类,它能根据要存进来的数组(或结构)多少自动进行自身大小的高速,而且这个类本身具有的成员函数使得我们对它的对象的操作更加方便、快捷,用它编的程序也易于读懂。     三维实体模型的模型信息中的一部分信息可以在标题段中读出,通过读取变量名为$UCSORG的三个变量,可以得到三维实体在世界坐标系中自身所定义的用户坐标系原点的三维坐标。通过读取$EXTMAX,$EXTMIN可以获知三维实体在世界坐标系中的范围,而其它部分的信息只有读完了全部DXF文件后才可以通过计算确定。对于三维实体模型的全部点坐标、点序,可以在实体段中按照前面介绍的DXF文件基本结构读出。现
C#中,可以使用AutoCAD的COM组件或者开源的DXF解析库来读取和处理DXF文件,并使用.NET GDI+图形库在控件上面绘制。 以下是一个使用DXFSharp库读取和显示DXF文件的示例代码: ``` using System.Drawing; using System.Windows.Forms; using DXFSharp; class DXFViewer : Control { private DXFDocument dxf; public DXFViewer() { // 读取DXF文件 dxf = DXFDocument.Load("example.dxf"); } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); Graphics g = e.Graphics; // 设置绘图参数 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; // 绘制实体 foreach (DXFEntity entity in dxf.Entities) { if (entity is DXFPolyline) { DXFPolyline polyline = (DXFPolyline) entity; PointF[] points = polyline.Vertices.Select(v => new PointF((float) v.X, (float) v.Y)).ToArray(); g.DrawLines(Pens.Black, points); } else if (entity is DXFCircle) { DXFCircle circle = (DXFCircle) entity; float x = (float) circle.Center.X - (float) circle.Radius; float y = (float) circle.Center.Y - (float) circle.Radius; float diameter = (float) circle.Radius * 2; g.DrawEllipse(Pens.Black, x, y, diameter, diameter); } else if (entity is DXFArc) { DXFArc arc = (DXFArc) entity; float x = (float) arc.Center.X - (float) arc.Radius; float y = (float) arc.Center.Y - (float) arc.Radius; float diameter = (float) arc.Radius * 2; float startAngle = (float) (arc.StartAngle / Math.PI * 180); float sweepAngle = (float) (arc.SweepAngle / Math.PI * 180); g.DrawArc(Pens.Black, x, y, diameter, diameter, startAngle, sweepAngle); } } } } ``` 以上代码演示了如何读取DXF文件并使用.NET GDI+图形库在控件上面绘制DXF文件中的实体。您可以根据需要进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

生生不息0.o

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

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

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

打赏作者

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

抵扣说明:

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

余额充值