using ACadSharp; using ACadSharp.Entities; using Autodesk.Revit.DB; using ShrlAlgoToolkit.RevitAddins.Common.Assists; using ShrlAlgoToolkit; using ShrlAlgoToolkit.RevitAddins; namespace ShrlAlgoToolkit.RevitAddins.Common.Assists; public static class DWGAssist { private static void OnNotification(object sender, ACadSharp.IO.NotificationEventArgs e) { } /// /// 获取模型中的所有实体 /// /// /// public static CadObjectCollection GetAllEntitiesInModel(this CadDocument doc) { // 获取所有绘图实体所在的模型空间 var modelSpace = doc.BlockRecords["*Model_Space"]; // 获取模型空间中的所有实体 return modelSpace.Entities; } /// /// 获取模型中的所有实体 /// /// /// public static CadObjectCollection GetAllEntitiesInCAD(this CadDocument doc) { // 获取dwg中的所有实体 return doc.Entities; } public static List> GetTextByLayer(ImportInstance dwg, string textLayerName) { var keyValuePairs = new List>(); 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(str, loc)); } else { keyValuePairs.Add(new KeyValuePair(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(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 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); } /// /// 读取dxf文件 /// /// dxf filePath path /// public static CadDocument ReadDxf(string file) { return new ACadSharp.IO.DxfReader(file, OnNotification).Read(); } /// /// 读取dxg文件 /// /// dwg filePath path /// public static CadDocument ReadDwg(string file) { return new ACadSharp.IO.DwgReader(file, OnNotification).Read(); } /// /// 写一个ascii dxf文件 /// /// /// public static void WriteAsciiDxf(this CadDocument doc, string filePath) { ACadSharp.IO.DxfWriter.Write(filePath, doc); } /// /// 编写一个二进制的dxf文件 /// /// /// public static void WriteBinaryDxf(this CadDocument doc, string filePath) { ACadSharp.IO.DxfWriter.Write(filePath, doc); } /// /// 获取模型中的同名所有块 /// /// /// /// public static IEnumerable GetInsertEntities(this CadDocument doc, string blockName) { //获取正在使用你要找的块的插入实例 return doc.Entities.OfType().Where(e => e.Block.Name == blockName); } /// /// 关于如何创建实体并将其添加到绘图中的例子 /// 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); } }