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

本文档详细介绍了如何使用C#和netDxf库来操作DXF文件,包括修改现有线段的位置、更新文字标签的内容和坐标、绘制新线以及创建和填充块元素。示例代码涵盖了从读取文件到保存修改的完整流程,适用于需要对DXF文件进行编程修改的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
            }
        }
    }
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

生生不息0.o

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

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

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

打赏作者

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

抵扣说明:

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

余额充值