Files
Shrlalgo.RvKits/Sai.RvKits/CadSharperUtil.cs
2024-09-22 11:05:41 +08:00

185 lines
6.6 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 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);
}
}