Esempio n. 1
0
        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());
        }
Esempio n. 2
0
        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);
        }