protected override void TrySolveInstance(IGH_DataAccess DA) { var types = new List <DB.ElementType>(); if (!DA.GetDataList("Types", types)) { return; } var inverted = false; if (!DA.GetData("Inverted", ref inverted)) { return; } if (types.Any()) { var provider = new DB.ParameterValueProvider(new DB.ElementId(DB.BuiltInParameter.ELEM_TYPE_PARAM)); var typeIds = types.Select(x => x?.Id ?? DB.ElementId.InvalidElementId).ToArray(); if (typeIds.Length == 1) { var rule = new DB.FilterElementIdRule(provider, new DB.FilterNumericEquals(), typeIds[0]); var filter = new DB.ElementParameterFilter(rule, inverted) as DB.ElementFilter; if (typeIds[0] == DB.ElementId.InvalidElementId) { filter = new DB.LogicalAndFilter ( new DB.ElementClassFilter(typeof(DB.PropertySetElement), inverted), filter ); } DA.SetData("Filter", filter); } else { if (inverted) { var rules = typeIds.Select(x => new DB.FilterInverseRule(new DB.FilterElementIdRule(provider, new DB.FilterNumericEquals(), x))).ToArray(); DA.SetData("Filter", new DB.ElementParameterFilter(rules)); } else { var filters = typeIds.Select(x => new DB.FilterElementIdRule(provider, new DB.FilterNumericEquals(), x)).Select(x => new DB.ElementParameterFilter(x)).ToArray(); DA.SetData("Filter", new DB.LogicalOrFilter(filters)); } } } }
/// <summary> /// Given the name of the design option set, returns a list of set's design options. /// </summary> /// <param name="DesignOptionSetName">The name of the Design Option Set</param> /// <param name="document">A Autodesk.Revit.DB.Document object. This does not work with Dynamo document objects.</param> /// <returns name="DesignOptions">A list of design options that belong to the DesignOptionSet</returns> public static IList <dynElem> GetDesignOptionsBySet(string DesignOptionSetName, [DefaultArgument("Synthetic.Revit.Document.Current()")] revitDoc document) { revitDB.ElementCategoryFilter catFilter = new revitDB.ElementCategoryFilter(revitDB.BuiltInCategory.OST_DesignOptionSets); revitDB.FilteredElementCollector collectSets = new revitDB.FilteredElementCollector(document); IList <revitElem> sets = collectSets .WherePasses(catFilter) .Cast <revitDB.Element>() .Where(elem => elem.Name == DesignOptionSetName) .ToList(); IList <revitDB.ElementFilter> paramFilters = new List <revitDB.ElementFilter>(); foreach (revitElem set in sets) { revitDB.ElementId id = set.Id; revitDB.FilterNumericRuleEvaluator eval = new revitDB.FilterNumericEquals(); revitDB.ParameterValueProvider provider = new revitDB.ParameterValueProvider(new revitDB.ElementId(revitDB.BuiltInParameter.OPTION_SET_ID)); revitDB.FilterRule filterRule = new revitDB.FilterElementIdRule(provider, eval, id); paramFilters.Add(new revitDB.ElementParameterFilter(filterRule)); } revitDB.ElementFilter orFilter = new revitDB.LogicalOrFilter(paramFilters); catFilter = new revitDB.ElementCategoryFilter(revitDB.BuiltInCategory.OST_DesignOptions); revitDB.LogicalAndFilter filter = new revitDB.LogicalAndFilter(new List <revitDB.ElementFilter> { orFilter, catFilter }); revitDB.FilteredElementCollector collectOptions = new revitDB.FilteredElementCollector(document); IList <revitDB.Element> elements = collectOptions.WherePasses(filter).ToElements(); IList <dynElem> dynamoElements = new List <dynElem>(); foreach (revitDB.Element elem in elements) { try { dynamoElements.Add(elem.ToDSType(true)); } catch { } } return(dynamoElements); }
//----------------Miscellaneous -------------------------- //return list of all generic family instances in the current model public static List <FamilyInstance> getAllGenericFamilies(Document curDoc) { //create filters Autodesk.Revit.DB.ElementClassFilter familyfilter = new Autodesk.Revit.DB.ElementClassFilter(typeof(Autodesk.Revit.DB.FamilyInstance)); Autodesk.Revit.DB.ElementCategoryFilter typeFilter = new Autodesk.Revit.DB.ElementCategoryFilter(BuiltInCategory.OST_GenericModel); Autodesk.Revit.DB.LogicalAndFilter andFilter = new Autodesk.Revit.DB.LogicalAndFilter(familyfilter, typeFilter); //create collector and filter Autodesk.Revit.DB.FilteredElementCollector collector = new Autodesk.Revit.DB.FilteredElementCollector(curDoc); collector.WherePasses(andFilter); //create list for family instances List <FamilyInstance> famList = new List <FamilyInstance>(); //loop through collector and add to list foreach (FamilyInstance curFam in collector) { famList.Add(curFam); } return(famList); }