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() .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 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(), "处理结果"); } } } }