Files
Shrlalgo.RvKits/ShrlAlgoToolkit.RevitAddins/FamMaster/ExplodeDwgCmd.cs
2026-02-22 20:03:42 +08:00

163 lines
7.4 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.Text;
using System.Windows;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI.Selection;
using ShrlAlgoToolkit.RevitAddins.RvFamily;
using ShrlAlgoToolkit;
using ShrlAlgoToolkit.RevitAddins;
namespace ShrlAlgoToolkit.RevitAddins.FamMaster;
/// <summary>
/// 炸开族中的dwg或嵌套族图元
/// </summary>
[Transaction(TransactionMode.Manual)]
public class ExplodeDwgCmd : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
StringBuilder sb = new StringBuilder();
try
{
ExternalCommandData data = commandData;
Document Document = data.Application.ActiveUIDocument.Document;
UIDocument UiDocument = data.Application.ActiveUIDocument;
if (!Document.IsFamilyDocument)
{
TaskDialog.Show("提示", "请在族文档中使用此命令");
return Result.Cancelled;
}
//bool useFreeFrom = true;
var refer = UiDocument.Selection.PickObject(ObjectType.Element, new GenericFilter<ImportInstance>(), "请选择导入图元");
var element = Document.GetElement(refer);
var geoElem = element.get_Geometry(new Options() { ComputeReferences = true, DetailLevel = ViewDetailLevel.Fine });
var f = Document.OwnerFamily;
Document.InvokeGroup(
tg =>
{
Document.Invoke(
_ =>
{
foreach (var geoObj in geoElem)
{
if (geoObj is GeometryInstance instance)
{
foreach (var obj in instance.GetInstanceGeometry())
{
try
{
if (obj is Solid solid && solid.Faces.Size > 0 && solid.Volume > 10e-6)
{
FreeFormElement.Create(Document, solid);//和分解的功能一样,仅保留几何信息
//try
//{
// // 如果是项目文档只能使用DirectShape创建适用于导入的几何体不能进行二次编辑
// // 如果是族文档使用FreeFormElement创建可以有更多的几何体支持支持编辑手柄族文档也支持DirectShape
// var shape = DirectShape.CreateElement(Document, f.FamilyCategory.Id);
// shape.SetShape([solid]);
//}
//catch (Exception)
//{
// FreeFormElement.Create(Document, solid);//和分解的功能一样,仅保留几何信息
//}
}
}
catch (Exception ex)
{
sb.AppendLine(ex.Message);
continue;
}
}
}
try
{
if (geoObj is Solid topSolid && topSolid.Faces.Size > 0 && topSolid.Volume > 10e-6)
{
FreeFormElement.Create(Document, topSolid);//和分解的功能一样,仅保留几何信息
//try
//{
// var directShape = DirectShape.CreateElement(Document, f.FamilyCategory.Id);
// directShape.SetShape([topSolid]);
//}
//catch (Exception)
//{
// FreeFormElement.Create(Document, topSolid);
//}
}
}
catch (Exception ex)
{
sb.AppendLine(ex.Message);
continue;
}
}
Document.Delete(element.Id);
});
MessageBox.Show("几何体炸开完成,请等待材质赋值完成", "提示");
Document.Invoke(
_ =>
{
var freeFormElements = Document.OfClass<FreeFormElement>().Cast<FreeFormElement>().ToList();
foreach (var form in freeFormElements)
{
var geoElement = form.get_Geometry(new Options() { ComputeReferences = true, DetailLevel = ViewDetailLevel.Fine });
foreach (var obj in geoElement)
{
if (obj is Solid solid && solid.Faces.Size > 0 && solid.Volume > 10e-6)
{
Face face = solid.Faces.get_Item(0);
Material material = Document.GetElement(face.MaterialElementId) as Material;
if (material != null)
form.get_Parameter(BuiltInParameter.MATERIAL_ID_PARAM).Set(material.Id);
}
}
}
});
},"炸开dwg");
}
catch (Autodesk.Revit.Exceptions.OperationCanceledException)
{
}
if (sb.Length > 0)
{
MessageBox.Show(sb.ToString(), "部分几何体创建失败");
}
return Result.Succeeded;
}
private void ProcessGeometry(Document doc, Category category, GeometryElement geometryElement)
{
foreach (var geoObj in geometryElement)
{
if (geoObj is GeometryInstance instance)
{
// 递归处理嵌套的GeometryInstance
ProcessGeometry(doc, category, instance.GetInstanceGeometry());
}
else if (geoObj is Solid solid && solid.Faces.Size > 0 && solid.Volume > 0)
{
try
{
var shape = DirectShape.CreateElement(doc, category.Id);
shape.SetShape([solid]);
}
catch (Exception)
{
continue;
}
}
}
}
}