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) { } /// /// 获取模型中的所有实体 /// /// /// public static CadObjectCollection GetAllEntitiesInModel(string file) { var doc = ACadSharp.IO.DwgReader.Read(file); // 获取所有绘图实体所在的模型空间 var modelSpace = doc.BlockRecords["*Model_Space"]; // 获取模型空间中的所有实体 return modelSpace.Entities; } /// /// 获取dwg所在的路径 /// /// /// 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> GetTextByLayer(ImportInstance dwg, string textLayerName) { var keyValuePairs = new List>(); 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(str, loc)); } else { keyValuePairs.Add(new KeyValuePair(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(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 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) { } /// /// 读取dxf文件 /// /// dxf file path /// public static void ReadDxf(string file, Action action) { using ACadSharp.IO.DxfReader reader = new(file); var doc = reader.Read(); action.Invoke(doc); } /// /// Read a dwg file /// /// dwg file path /// public static void ReadDwg(string file, Action action) { using ACadSharp.IO.DwgReader reader = new(file); var doc = reader.Read(); action.Invoke(doc); } /// /// 写一个ascii dxf文件 /// /// /// public void WriteAsciiDxf(string file, ACadSharp.CadDocument doc) { using ACadSharp.IO.DxfWriter writer = new(file, doc, false); writer.OnNotification += Writer_OnNotification; writer.Write(); } /// /// 编写一个二进制的dxf文件 /// /// /// public void WriteBinaryDxf(string file, ACadSharp.CadDocument doc) { using ACadSharp.IO.DxfWriter writer = new(file, doc, true); writer.OnNotification += Writer_OnNotification; writer.Write(); } /// /// 获取模型中的所有块 /// /// /// /// public static IEnumerable GetInsertEntities(string file, string blockName) { var doc = ACadSharp.IO.DwgReader.Read(file); //获取正在使用你要找的块的插入实例 return doc.Entities.OfType().Where(e => e.Block.Name == blockName); } /// /// 关于如何创建实体并将其添加到绘图中的例子 /// 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); } }