Files
ShrlAlgoToolkit/ShrlAlgoToolkit.RevitAddins/RvFamily/ExplodeDwgCmd.cs
2025-08-12 23:08:54 +08:00

119 lines
4.7 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 Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using Nice3point.Revit.Toolkit.External;
namespace ShrlAlgoToolkit.RevitAddins.RvFamily;
/// <summary>
/// 炸开族中的dwg或嵌套族图元
/// </summary>
[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
public class ExplodeDwgCmd : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
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.Invoke(
ts =>
{
foreach (var geoObj in geoElem)
{
if (geoObj is GeometryInstance instance)
{
foreach (var obj in instance.GetInstanceGeometry())
{
if (obj is Solid solid && solid.Faces.Size > 0 && solid.Volume > 0)
{
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);//和分解的功能一样,仅保留几何信息
//}
}
}
}
else if (geoObj is Solid topSolid && topSolid.Faces.Size > 0 && topSolid.Volume > 0)
{
FreeFormElement.Create(Document, topSolid);//和分解的功能一样,仅保留几何信息
//try
//{
// var directShape = DirectShape.CreateElement(Document, f.FamilyCategory.Id);
// directShape.SetShape([topSolid]);
//}
//catch (Exception)
//{
// FreeFormElement.Create(Document, topSolid);
//}
}
}
Document.Delete(element.Id);
});
}
catch (Autodesk.Revit.Exceptions.OperationCanceledException)
{
}
catch (Exception ex)
{
TaskDialog.Show("Error", ex.Message);
}
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;
}
}
}
}
}