185 lines
6.6 KiB
C#
185 lines
6.6 KiB
C#
using System.IO;
|
||
|
||
using ACadSharp;
|
||
using ACadSharp.Entities;
|
||
|
||
using Autodesk.Revit.DB;
|
||
|
||
using CommunityToolkit.Diagnostics;
|
||
|
||
namespace Sai.RvKits;
|
||
|
||
public class CadSharperUtil(string path)
|
||
{
|
||
public ACadSharp.CadDocument CadDocument { get; private set; } = ACadSharp.IO.DwgReader.Read(path, OnNotification);
|
||
|
||
private static void OnNotification(object sender, ACadSharp.IO.NotificationEventArgs e) { }
|
||
|
||
/// <summary>
|
||
/// 获取模型中的所有实体
|
||
/// </summary>
|
||
/// <param name="file"></param>
|
||
/// <returns></returns>
|
||
public static CadObjectCollection<ACadSharp.Entities.Entity> GetAllEntitiesInModel(string file)
|
||
{
|
||
var doc = ACadSharp.IO.DwgReader.Read(file);
|
||
|
||
// 获取所有绘图实体所在的模型空间
|
||
var modelSpace = doc.BlockRecords["*Model_Space"];
|
||
|
||
// 获取模型空间中的所有实体
|
||
return modelSpace.Entities;
|
||
}
|
||
/// <summary>
|
||
/// 获取dwg所在的路径
|
||
/// </summary>
|
||
/// <param name="dwg"></param>
|
||
/// <returns></returns>
|
||
public static string GetDwgPath(ImportInstance dwg)
|
||
{
|
||
var cadLinkType = dwg.Document.GetElement(dwg.GetTypeId()) as CADLinkType;
|
||
Guard.IsNotNull(cadLinkType);
|
||
var filePath = cadLinkType.GetExternalFileReference().GetLinkedFileStatus() == LinkedFileStatus.Loaded
|
||
? ModelPathUtils.ConvertModelPathToUserVisiblePath(cadLinkType?.GetExternalFileReference().GetAbsolutePath())
|
||
: throw new InvalidOperationException("该dwg不是链接");
|
||
return !File.Exists(filePath) ? throw new InvalidOperationException("链接文件路径不存在") : filePath;
|
||
}
|
||
|
||
public static List<KeyValuePair<string, XYZ>> GetTextByLayer(ImportInstance dwg, string textLayerName)
|
||
{
|
||
var keyValuePairs = new List<KeyValuePair<string, XYZ>>();
|
||
var dwgTransform = dwg!.GetTransform();
|
||
var path = CadSharperUtil.GetDwgPath(dwg);
|
||
using ACadSharp.IO.DwgReader reader = new(path);
|
||
var cadDocument = reader.Read();
|
||
var entities = cadDocument.Entities.Where(entity => (entity is ACadSharp.Entities.MText || entity is ACadSharp.Entities.TextEntity) && entity.Layer.Name == textLayerName);
|
||
foreach (var entity in entities)
|
||
{
|
||
if (entity is ACadSharp.Entities.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 ACadSharp.Entities.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 void DwgEntitiesToNewFile(string input, string output)
|
||
{
|
||
/* --- 注意事项 ---
|
||
* ACadSharp无法写入已读的dwg/dxf文件,原因是在写dxf时文件结构有问题 *目前的解决方法是移动实体并将其保存在一个新文件中。
|
||
*/
|
||
var doc = ACadSharp.IO.DwgReader.Read(input);
|
||
|
||
//转移实体的新文件
|
||
ACadSharp.CadDocument transfer = new();
|
||
doc.Header.Version = doc.Header.Version;
|
||
|
||
//将实体移到所创建的文件中
|
||
List<ACadSharp.Entities.Entity> entities = new(doc.Entities);
|
||
foreach (var item in entities)
|
||
{
|
||
var e = doc.Entities.Remove(item);
|
||
transfer.Entities.Add(e);
|
||
}
|
||
|
||
//保存文件
|
||
using ACadSharp.IO.DxfWriter writer = new(output, doc, false);
|
||
writer.OnNotification += Writer_OnNotification;
|
||
writer.Write();
|
||
}
|
||
|
||
private void Writer_OnNotification(object sender, ACadSharp.IO.NotificationEventArgs e) { }
|
||
|
||
/// <summary>
|
||
/// 读取dxf文件
|
||
/// </summary>
|
||
/// <param name="file">dxf file path</param>
|
||
/// <param name="action"></param>
|
||
public static void ReadDxf(string file, Action<ACadSharp.CadDocument> action)
|
||
{
|
||
using ACadSharp.IO.DxfReader reader = new(file);
|
||
var doc = reader.Read();
|
||
action.Invoke(doc);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Read a dwg file
|
||
/// </summary>
|
||
/// <param name="file">dwg file path</param>
|
||
/// <param name="action"></param>
|
||
public static void ReadDwg(string file, Action<ACadSharp.CadDocument> action)
|
||
{
|
||
using ACadSharp.IO.DwgReader reader = new(file);
|
||
var doc = reader.Read();
|
||
action.Invoke(doc);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 写一个ascii dxf文件
|
||
/// </summary>
|
||
/// <param name="file"></param>
|
||
/// <param name="doc"></param>
|
||
public void WriteAsciiDxf(string file, ACadSharp.CadDocument doc)
|
||
{
|
||
using ACadSharp.IO.DxfWriter writer = new(file, doc, false);
|
||
writer.OnNotification += Writer_OnNotification;
|
||
writer.Write();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 编写一个二进制的dxf文件
|
||
/// </summary>
|
||
/// <param name="file"></param>
|
||
/// <param name="doc"></param>
|
||
public void WriteBinaryDxf(string file, ACadSharp.CadDocument doc)
|
||
{
|
||
using ACadSharp.IO.DxfWriter writer = new(file, doc, true);
|
||
writer.OnNotification += Writer_OnNotification;
|
||
writer.Write();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取模型中的所有块
|
||
/// </summary>
|
||
/// <param name="file"></param>
|
||
/// <param name="blockName"></param>
|
||
/// <returns></returns>
|
||
public static IEnumerable<Insert> GetInsertEntities(string file, string blockName)
|
||
{
|
||
var doc = ACadSharp.IO.DwgReader.Read(file);
|
||
|
||
//获取正在使用你要找的块的插入实例
|
||
return doc.Entities.OfType<ACadSharp.Entities.Insert>().Where(e => e.Block.Name == blockName);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 关于如何创建实体并将其添加到绘图中的例子
|
||
/// </summary>
|
||
public static void CreateEntities()
|
||
{
|
||
ACadSharp.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);
|
||
}
|
||
|
||
|
||
}
|