private List <Autodesk.Revit.DB.ElementId> PurgeMaterialAssets(List <Autodesk.Revit.DB.ElementId> elementIds) { List <ElementId> appearanceAssetIds = new FilteredElementCollector(this.InternalDocument) .OfClass(typeof(AppearanceAssetElement)) .ToElementIds() .ToList(); // The PropertySetElement contains either the Thermal or Structural Asset // https://forums.autodesk.com/t5/revit-api-forum/material-assets-collector-appearance-structural-physical-amp/td-p/7256944 List <ElementId> propertySet = new FilteredElementCollector(this.InternalDocument) .OfClass(typeof(PropertySetElement)) .ToElementIds() .ToList(); int elementIdsCount = elementIds.Count(); for (int i = 0; i < elementIdsCount; i++) { try { var material = this.InternalDocument.GetElement(elementIds[i]) as Autodesk.Revit.DB.Material; propertySet.Remove(material.ThermalAssetId); propertySet.Remove(material.StructuralAssetId); appearanceAssetIds.Remove(material.AppearanceAssetId); } catch (Exception) { continue; } } if (appearanceAssetIds.Count > 0) { this.InternalDocument.Delete(appearanceAssetIds); } if (propertySet.Count > 0) { this.InternalDocument.Delete(propertySet); } return(appearanceAssetIds.Concat(propertySet).ToList()); }
public static void IntegrateEnergyResults(UIDocument uidoc, Document doc, IDFFile.Building Bui, string massName, Dictionary <string, double[]> resultsDF, Dictionary <string, Element> masses) { Bui.AssociateProbabilisticEnergyPlusResults(resultsDF); View3D v1 = (new FilteredElementCollector(doc).OfClass(typeof(View3D)).Cast <View3D>()).First(v => v.Name.Contains("Op - " + massName)); using (Transaction tx = new Transaction(doc, "Simplified EP")) { uidoc.ActiveView = v1; tx.Start(); View3D v2 = View3D.CreateIsometric(doc, v1.GetTypeId()); v2.Name = "SimplifiedEP-" + massName; IEnumerable <Element> allElements = new FilteredElementCollector(doc).WhereElementIsNotElementType().OfCategory(BuiltInCategory.OST_Mass); allElements = allElements.Concat(new FilteredElementCollector(doc).WherePasses(new ElementClassFilter(typeof(CurveElement)))); v2.HideElements(allElements.Select(e => e.Id).ToList()); v2.UnhideElements(new List <ElementId>() { masses[massName].Id }); tx.Commit(); uidoc.ActiveView = v2; } }
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { Debug.Listeners.Clear(); Debug.Listeners.Add(new RbsLogger.Logger("AreeRebarMark")); Debug.WriteLine("Start area rebar mark"); double offset = 0; //мм //собираю все элементы армирования по площади и траектории Document doc = commandData.Application.ActiveUIDocument.Document; FilteredElementCollector areas = new FilteredElementCollector(doc) .OfClass(typeof(Autodesk.Revit.DB.Structure.AreaReinforcement)) .WhereElementIsNotElementType(); FilteredElementCollector paths = new FilteredElementCollector(doc) .OfClass(typeof(Autodesk.Revit.DB.Structure.PathReinforcement)) .WhereElementIsNotElementType(); List <Element> col = areas.Concat(paths).ToList(); int count = 0; using (Transaction t = new Transaction(doc)) { t.Start("Area rebar mark"); //и Path, и Area попытаюсь обрабатываю в одном цикле, чтобы компактнее было foreach (Element rebarAreaPath in col) { //благодаря hashset можно собрать только уникальный марки стержней HashSet <string> marks = new HashSet <string>(); string rebarSystemMark = ""; List <ElementId> rebarIds = null; List <ElementId> curveIds = null; double maxZ = 0; double minZ = 0; if (rebarAreaPath is AreaReinforcement) { AreaReinforcement ar = rebarAreaPath as AreaReinforcement; rebarIds = ar.GetRebarInSystemIds().ToList(); curveIds = ar.GetBoundaryCurveIds().ToList(); //определяю нижнюю и верзнюю точку зоны List <double> zs = new List <double>(); foreach (ElementId curveId in curveIds) { AreaReinforcementCurve curve = doc.GetElement(curveId) as AreaReinforcementCurve; XYZ start = curve.Curve.GetEndPoint(0); double z1 = start.Z; zs.Add(z1); XYZ end = curve.Curve.GetEndPoint(1); double z2 = end.Z; zs.Add(z2); } maxZ = zs.Max(); maxZ += offset / 304.8; minZ = zs.Min(); minZ += offset / 304.8; } if (rebarAreaPath is PathReinforcement) { PathReinforcement pr = rebarAreaPath as PathReinforcement; rebarIds = pr.GetRebarInSystemIds().ToList(); maxZ = pr.get_BoundingBox(doc.ActiveView).Max.Z; minZ = pr.get_BoundingBox(doc.ActiveView).Min.Z; } //получаю общие параметры, в которые буду записывать отметку верха и низа, они должны быть заранее добавлены Parameter topelev = rebarAreaPath.LookupParameter("АрмПлощ.ОтмВерха"); Parameter botelev = rebarAreaPath.LookupParameter("АрмПлощ.ОтмНиза"); if (topelev == null) { topelev = rebarAreaPath.LookupParameter("Рзм.ОтмВерха"); } if (botelev == null) { botelev = rebarAreaPath.LookupParameter("Рзм.ОтмНиза"); } if (topelev != null && botelev != null) { topelev.Set(maxZ); botelev.Set(minZ); } //еще хочу записать в зону длину самого длинного арматурного стержня в ней double length = 0; //обрабатываю арматурные стержни в составе зоны foreach (ElementId rebarId in rebarIds) { Element rebar = doc.GetElement(rebarId); string rebarMark = rebar.get_Parameter(BuiltInParameter.ALL_MODEL_MARK).AsString(); marks.Add(rebarMark); double tempLength = rebar.get_Parameter(BuiltInParameter.REBAR_ELEM_LENGTH).AsDouble(); if (tempLength > length) { length = tempLength; } } //сортирую марки и записываю через запятую List <string> marksList = marks.ToList(); marksList.Sort(); for (int i = 0; i < marks.Count; i++) { rebarSystemMark += marksList[i]; if (i < marks.Count - 1) { rebarSystemMark += ", "; } } rebarAreaPath.get_Parameter(BuiltInParameter.ALL_MODEL_MARK).Set(rebarSystemMark); //записываю длину арматуры а зону Parameter lengthParam = rebarAreaPath.LookupParameter("Рзм.Длина"); if (lengthParam != null) { lengthParam.Set(length); } count++; } t.Commit(); } BalloonTip.Show("Успешно!", "Обработано зон: " + count.ToString()); Debug.WriteLine("Success, elements: " + count.ToString()); return(Result.Succeeded); }