Files
ShrlAlgoToolkit/ShrlAlgoToolkit.RevitAddins/Common/Assists/DWGAssist.cs
2026-02-24 11:34:18 +08:00

159 lines
5.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using ACadSharp;
using ACadSharp.Entities;
using Autodesk.Revit.DB;
namespace ShrlAlgoToolkit.RevitAddins.Common.Assists;
public static class DWGAssist
{
private static void OnNotification(object sender, ACadSharp.IO.NotificationEventArgs e) { }
/// <summary>
/// 获取模型中的所有实体
/// </summary>
/// <param name="doc"></param>
/// <returns></returns>
public static CadObjectCollection<Entity> GetAllEntitiesInModel(this CadDocument doc)
{
// 获取所有绘图实体所在的模型空间
var modelSpace = doc.BlockRecords["*Model_Space"];
// 获取模型空间中的所有实体
return modelSpace.Entities;
}
/// <summary>
/// 获取模型中的所有实体
/// </summary>
/// <param name="doc"></param>
/// <returns></returns>
public static CadObjectCollection<Entity> GetAllEntitiesInCAD(this CadDocument doc)
{
// 获取dwg中的所有实体
return doc.Entities;
}
public static List<KeyValuePair<string, XYZ>> GetTextByLayer(ImportInstance dwg, string textLayerName)
{
var keyValuePairs = new List<KeyValuePair<string, XYZ>>();
var dwgTransform = dwg!.GetTransform();
var path = dwg.GetFilePath();
using ACadSharp.IO.DwgReader reader = new(path);
var cadDocument = reader.Read();
var entities = cadDocument.Entities.Where(entity => (entity is MText || entity is TextEntity) && entity.Layer.Name == textLayerName);
foreach (var entity in entities)
{
if (entity is MText mText)
{
var loc = dwgTransform.OfPoint(new XYZ(mText.InsertPoint.X, mText.InsertPoint.Y, mText.InsertPoint.Z) / 304.8);
if (mText.Value.Contains(@"\f") && mText.Value.Contains(@"|b") && mText.Value.Contains(@"i0"))//多行字体编码问题
{
var str = mText.Value.Split(';').Last().TrimEnd('}');
keyValuePairs.Add(new KeyValuePair<string, XYZ>(str, loc));
}
else
{
keyValuePairs.Add(new KeyValuePair<string, XYZ>(mText.Value, loc));
}
}
if (entity is TextEntity text)
{
var loc = dwgTransform.OfPoint(new XYZ(text.InsertPoint.X, text.InsertPoint.Y, text.InsertPoint.Z) / 304.8);
keyValuePairs.Add(new KeyValuePair<string, XYZ>(text.Value, loc));
}
}
return keyValuePairs;
}
public static void DwgEntitiesToNewFile(this CadDocument doc, string output)
{
/* --- 注意事项 ---
* ACadSharp无法写入已读的dwg/dxf文件原因是在写dxf时文件结构有问题 *目前的解决方法是移动实体并将其保存在一个新文件中。
*/
//转移实体的新文件
CadDocument transfer = new();
doc.Header.Version = doc.Header.Version;
//将实体移到所创建的文件中
List<Entity> entities = new(doc.Entities);
foreach (var item in entities)
{
var e = doc.Entities.Remove(item);
transfer.Entities.Add(e);
}
//保存文件
ACadSharp.IO.DxfWriter.Write(output, doc);
}
/// <summary>
/// 读取dxf文件
/// </summary>
/// <param name="file">dxf filePath path</param>
/// <param name="action"></param>
public static CadDocument ReadDxf(string file)
{
return new ACadSharp.IO.DxfReader(file, OnNotification).Read();
}
/// <summary>
/// 读取dxg文件
/// </summary>
/// <param name="file">dwg filePath path</param>
/// <param name="action"></param>
public static CadDocument ReadDwg(string file)
{
return new ACadSharp.IO.DwgReader(file, OnNotification).Read();
}
/// <summary>
/// 写一个ascii dxf文件
/// </summary>
/// <param name="filePath"></param>
/// <param name="doc"></param>
public static void WriteAsciiDxf(this CadDocument doc, string filePath)
{
ACadSharp.IO.DxfWriter.Write(filePath, doc);
}
/// <summary>
/// 编写一个二进制的dxf文件
/// </summary>
/// <param name="filePath"></param>
/// <param name="doc"></param>
public static void WriteBinaryDxf(this CadDocument doc, string filePath)
{
ACadSharp.IO.DxfWriter.Write(filePath, doc);
}
/// <summary>
/// 获取模型中的同名所有块
/// </summary>
/// <param name="file"></param>
/// <param name="blockName"></param>
/// <returns></returns>
public static IEnumerable<Insert> GetInsertEntities(this CadDocument doc, string blockName)
{
//获取正在使用你要找的块的插入实例
return doc.Entities.OfType<Insert>().Where(e => e.Block.Name == blockName);
}
/// <summary>
/// 关于如何创建实体并将其添加到绘图中的例子
/// </summary>
public static void CreateEntities()
{
CadDocument doc = new();
ACadSharp.Entities.Point pt = new() { Location = new CSMath.XYZ(10, 10, 0) };
ACadSharp.Entities.Line line = new() { StartPoint = CSMath.XYZ.Zero, EndPoint = new CSMath.XYZ(5, 5, 0) };
doc.Entities.Add(pt);
doc.Entities.Add(line);
}
}