Files
SzmediTools/Szmedi.RvKits/ModelManager/ResolveLevelCmd.cs

159 lines
7.1 KiB
C#
Raw Normal View History

2025-09-16 16:06:41 +08:00

using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Nice3point.Revit.Toolkit.External;
using Szmedi.RvKits.Assists.ProgressWrapper;
namespace Szmedi.RvKits.ModelManager
{
[Transaction(TransactionMode.Manual)]
public class ResolveLevelCmd : ExternalCommand
{
//TODO
public override void Execute()
{
var result= MessageBox.Show("将对所有参照标高与当前位置不匹配的构件的参照标高重新设置,并保持位置不变?", "提示", MessageBoxButton.YesNo, MessageBoxImage.Question);
if (result != MessageBoxResult.Yes)
{
return;
}
//按照构件归属楼层,分层定义
var levels = new FilteredElementCollector(Document)
.OfClass(typeof(Level))
.OfCategory(BuiltInCategory.OST_Levels)
.Cast<Level>()
.OrderBy(l => l.Elevation)
.ToList();
var levelOutlines = Document.GetLevelRanges();
var sb = new StringBuilder();
FilteredElementCollector allModels = Document.OfParentModelCollector();
if (allModels == null)
{
MessageBox.Show("没有找到模型元素", "错误");
return;
}
Debug.WriteLine("所有元素:" + allModels.Count());
using (var tg = new TransactionGroup(Document, "标高重设"))
{
tg.Start();
for (var i = 0; i < levelOutlines.Count; i++)
{
var item = levelOutlines.ElementAt(i);
//处理每个元素
BoundingBoxIsInsideFilter insideFilter = new(item.Value);
var insideCollector = Document.OfParentModelCollector().WherePasses(insideFilter);
Debug.WriteLine($"{item.Key.Name}包含的元素:" + insideCollector.Count());
var level = item.Key;
if (insideCollector.Any())
{
allModels.Excluding(insideCollector.ToElementIds());
}
ProgressBarManager<Element> manager = new(
UiDocument,
insideCollector.ToElements(),
(uidoc, elem, obj) =>
{
try
{
if (elem.LevelId == item.Key.Id)
{
return;
}
//过滤掉不需要设置标高的元素
var boundingBox = elem.get_BoundingBox(ActiveView);
if (boundingBox == null)
{
return;
}
//获取构件定位方式,基于标高,基于主体(基于面,基于线,基于主体构件:墙板等),基于点
if (elem is FamilyInstance familyInstance)
{
if (familyInstance.Category.Id.IntegerValue is -2001320)//梁
{
return;
}
var placementType = familyInstance.Symbol.Family.FamilyPlacementType;
switch (placementType)
{
case FamilyPlacementType.OneLevelBased:
BaseLevelHelpers.ModifyOneLevelBasedFamily(level, familyInstance);
break;
case FamilyPlacementType.OneLevelBasedHosted:
break;
case FamilyPlacementType.TwoLevelsBased:
BaseLevelHelpers.ModifyTwoLevelBasedFamily(levels, level, familyInstance);
break;
case FamilyPlacementType.ViewBased:
break;
case FamilyPlacementType.WorkPlaneBased:
BaseLevelHelpers.ModifyWorkPlaneBasedFamily(level, familyInstance);
break;
case FamilyPlacementType.CurveBased:
BaseLevelHelpers.ModifyCurveBasedFamily(level, familyInstance);
break;
case FamilyPlacementType.CurveBasedDetail:
break;
case FamilyPlacementType.CurveDrivenStructural:
break;
case FamilyPlacementType.Adaptive:
break;
case FamilyPlacementType.Invalid:
break;
}
Document.Regenerate();
}
else if (elem is Wall wall)
{
BaseLevelHelpers.ModifyWall(ActiveView, levels, level, wall);
Document.Regenerate();
}
else if (elem is MEPCurve)
{
elem.get_Parameter(BuiltInParameter.RBS_START_LEVEL_PARAM).Set(level.Id);
Document.Regenerate();
}
}
catch (Exception ex)
{
sb.AppendLine($"{elem.Name}-{elem.Id}-{ex.Message}");
}
}, $"重设标高<{level.Name}>");
manager.ProgressModal();
}
tg.Assimilate();
}
//await doc.ProcessComplicateTasks(
// levelOutlines,
// keyPair =>
// {
// //得到在标高范围内的元素
// }, "标高重设");
//LogAssists.WriteTxtFile("错误元素", sb.ToString());
//foreach (var item in allModels)
//{
// await Task.Delay(50);
// Debug.WriteLine($"元素{item.Name}");
//}
if (sb.Length > 0)
{
MessageBox.Show(sb.ToString(), "处理结果");
}
}
}
}