159 lines
7.1 KiB
C#
159 lines
7.1 KiB
C#
|
|
|
|||
|
|
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(), "处理结果");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|