2025-04-24 20:56:44 +08:00
|
|
|
|
using ACadSharp;
|
2024-09-22 11:05:41 +08:00
|
|
|
|
using ACadSharp.Entities;
|
|
|
|
|
|
|
|
|
|
|
|
using Autodesk.Revit.DB;
|
|
|
|
|
|
|
2026-02-21 16:31:24 +08:00
|
|
|
|
using ShrlAlgoToolkit.RevitAddins.Common.Assists;
|
|
|
|
|
|
using ShrlAlgoToolkit;
|
|
|
|
|
|
using ShrlAlgoToolkit.RevitAddins;
|
2025-02-10 20:53:40 +08:00
|
|
|
|
|
2026-02-21 16:31:24 +08:00
|
|
|
|
namespace ShrlAlgoToolkit.RevitAddins.Common.Assists;
|
2024-09-22 11:05:41 +08:00
|
|
|
|
|
2024-10-27 00:19:48 +08:00
|
|
|
|
public static class DWGAssist
|
2024-09-22 11:05:41 +08:00
|
|
|
|
{
|
|
|
|
|
|
private static void OnNotification(object sender, ACadSharp.IO.NotificationEventArgs e) { }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取模型中的所有实体
|
|
|
|
|
|
/// </summary>
|
2025-02-10 20:53:40 +08:00
|
|
|
|
/// <param name="doc"></param>
|
2024-09-22 11:05:41 +08:00
|
|
|
|
/// <returns></returns>
|
2025-07-11 09:20:23 +08:00
|
|
|
|
public static CadObjectCollection<Entity> GetAllEntitiesInModel(this CadDocument doc)
|
2024-09-22 11:05:41 +08:00
|
|
|
|
{
|
|
|
|
|
|
// 获取所有绘图实体所在的模型空间
|
|
|
|
|
|
var modelSpace = doc.BlockRecords["*Model_Space"];
|
|
|
|
|
|
|
|
|
|
|
|
// 获取模型空间中的所有实体
|
|
|
|
|
|
return modelSpace.Entities;
|
|
|
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
2024-10-27 00:19:48 +08:00
|
|
|
|
/// 获取模型中的所有实体
|
2024-09-22 11:05:41 +08:00
|
|
|
|
/// </summary>
|
2024-10-27 00:19:48 +08:00
|
|
|
|
/// <param name="doc"></param>
|
2024-09-22 11:05:41 +08:00
|
|
|
|
/// <returns></returns>
|
2025-07-11 09:20:23 +08:00
|
|
|
|
public static CadObjectCollection<Entity> GetAllEntitiesInCAD(this CadDocument doc)
|
2024-09-22 11:05:41 +08:00
|
|
|
|
{
|
2024-10-27 00:19:48 +08:00
|
|
|
|
// 获取dwg中的所有实体
|
|
|
|
|
|
return doc.Entities;
|
2024-09-22 11:05:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static List<KeyValuePair<string, XYZ>> GetTextByLayer(ImportInstance dwg, string textLayerName)
|
|
|
|
|
|
{
|
|
|
|
|
|
var keyValuePairs = new List<KeyValuePair<string, XYZ>>();
|
|
|
|
|
|
var dwgTransform = dwg!.GetTransform();
|
2024-10-27 00:19:48 +08:00
|
|
|
|
var path = dwg.GetFilePath();
|
2024-09-22 11:05:41 +08:00
|
|
|
|
using ACadSharp.IO.DwgReader reader = new(path);
|
|
|
|
|
|
var cadDocument = reader.Read();
|
2025-07-11 09:20:23 +08:00
|
|
|
|
var entities = cadDocument.Entities.Where(entity => (entity is MText || entity is TextEntity) && entity.Layer.Name == textLayerName);
|
2024-09-22 11:05:41 +08:00
|
|
|
|
foreach (var entity in entities)
|
|
|
|
|
|
{
|
2025-07-11 09:20:23 +08:00
|
|
|
|
if (entity is MText mText)
|
2024-09-22 11:05:41 +08:00
|
|
|
|
{
|
|
|
|
|
|
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));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-07-11 09:20:23 +08:00
|
|
|
|
if (entity is TextEntity text)
|
2024-09-22 11:05:41 +08:00
|
|
|
|
{
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
2025-07-11 09:20:23 +08:00
|
|
|
|
public static void DwgEntitiesToNewFile(this CadDocument doc, string output)
|
2024-09-22 11:05:41 +08:00
|
|
|
|
{
|
|
|
|
|
|
/* --- 注意事项 ---
|
2024-10-27 00:19:48 +08:00
|
|
|
|
* ACadSharp无法写入已读的dwg/dxf文件,原因是在写dxf时文件结构有问题 *目前的解决方法是移动实体并将其保存在一个新文件中。
|
|
|
|
|
|
*/
|
2024-09-22 11:05:41 +08:00
|
|
|
|
|
|
|
|
|
|
//转移实体的新文件
|
2025-07-11 09:20:23 +08:00
|
|
|
|
CadDocument transfer = new();
|
2024-09-22 11:05:41 +08:00
|
|
|
|
doc.Header.Version = doc.Header.Version;
|
|
|
|
|
|
|
|
|
|
|
|
//将实体移到所创建的文件中
|
2025-07-11 09:20:23 +08:00
|
|
|
|
List<Entity> entities = new(doc.Entities);
|
2024-09-22 11:05:41 +08:00
|
|
|
|
foreach (var item in entities)
|
|
|
|
|
|
{
|
|
|
|
|
|
var e = doc.Entities.Remove(item);
|
|
|
|
|
|
transfer.Entities.Add(e);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//保存文件
|
2025-12-28 11:47:54 +08:00
|
|
|
|
ACadSharp.IO.DxfWriter.Write(output, doc);
|
2024-09-22 11:05:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 读取dxf文件
|
|
|
|
|
|
/// </summary>
|
2024-10-27 00:19:48 +08:00
|
|
|
|
/// <param name="file">dxf filePath path</param>
|
2024-09-22 11:05:41 +08:00
|
|
|
|
/// <param name="action"></param>
|
2024-10-27 00:19:48 +08:00
|
|
|
|
public static CadDocument ReadDxf(string file)
|
2024-09-22 11:05:41 +08:00
|
|
|
|
{
|
2024-10-27 00:19:48 +08:00
|
|
|
|
return new ACadSharp.IO.DxfReader(file, OnNotification).Read();
|
2024-09-22 11:05:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2024-10-27 00:19:48 +08:00
|
|
|
|
/// 读取dxg文件
|
2024-09-22 11:05:41 +08:00
|
|
|
|
/// </summary>
|
2024-10-27 00:19:48 +08:00
|
|
|
|
/// <param name="file">dwg filePath path</param>
|
2024-09-22 11:05:41 +08:00
|
|
|
|
/// <param name="action"></param>
|
2024-10-27 00:19:48 +08:00
|
|
|
|
public static CadDocument ReadDwg(string file)
|
2024-09-22 11:05:41 +08:00
|
|
|
|
{
|
2024-10-27 00:19:48 +08:00
|
|
|
|
return new ACadSharp.IO.DwgReader(file, OnNotification).Read();
|
2024-09-22 11:05:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 写一个ascii dxf文件
|
|
|
|
|
|
/// </summary>
|
2024-10-27 00:19:48 +08:00
|
|
|
|
/// <param name="filePath"></param>
|
2024-09-22 11:05:41 +08:00
|
|
|
|
/// <param name="doc"></param>
|
2025-07-11 09:20:23 +08:00
|
|
|
|
public static void WriteAsciiDxf(this CadDocument doc, string filePath)
|
2024-09-22 11:05:41 +08:00
|
|
|
|
{
|
2025-12-28 11:47:54 +08:00
|
|
|
|
ACadSharp.IO.DxfWriter.Write(filePath, doc);
|
2024-09-22 11:05:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 编写一个二进制的dxf文件
|
|
|
|
|
|
/// </summary>
|
2024-10-27 00:19:48 +08:00
|
|
|
|
/// <param name="filePath"></param>
|
2024-09-22 11:05:41 +08:00
|
|
|
|
/// <param name="doc"></param>
|
2025-07-11 09:20:23 +08:00
|
|
|
|
public static void WriteBinaryDxf(this CadDocument doc, string filePath)
|
2024-09-22 11:05:41 +08:00
|
|
|
|
{
|
2025-12-28 11:47:54 +08:00
|
|
|
|
ACadSharp.IO.DxfWriter.Write(filePath, doc);
|
2024-09-22 11:05:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2024-10-27 00:19:48 +08:00
|
|
|
|
/// 获取模型中的同名所有块
|
2024-09-22 11:05:41 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="file"></param>
|
|
|
|
|
|
/// <param name="blockName"></param>
|
|
|
|
|
|
/// <returns></returns>
|
2025-07-11 09:20:23 +08:00
|
|
|
|
public static IEnumerable<Insert> GetInsertEntities(this CadDocument doc, string blockName)
|
2024-09-22 11:05:41 +08:00
|
|
|
|
{
|
|
|
|
|
|
//获取正在使用你要找的块的插入实例
|
2025-07-11 09:20:23 +08:00
|
|
|
|
return doc.Entities.OfType<Insert>().Where(e => e.Block.Name == blockName);
|
2024-09-22 11:05:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 关于如何创建实体并将其添加到绘图中的例子
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public static void CreateEntities()
|
|
|
|
|
|
{
|
2025-07-11 09:20:23 +08:00
|
|
|
|
CadDocument doc = new();
|
2024-09-22 11:05:41 +08:00
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|