添加项目文件。
This commit is contained in:
158
Szmedi.RvKits/ModelManager/ResolveLevelCmd.cs
Normal file
158
Szmedi.RvKits/ModelManager/ResolveLevelCmd.cs
Normal file
@@ -0,0 +1,158 @@
|
||||
|
||||
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(), "处理结果");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user