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;
}
}
}
}