Hi
I suggestyou downloadtheSDKREVIT2016,findtheaddinthat packageElementFilter\ViewFilters, isan excellent exampleforfilterscontains the following classesrevit: Autodesk.Revit.DB.FilteredElementCollector, Autodesk.Revit.DB.ParameterFilterElement, Autodesk.Revit.DB.ParameterFilterUtilities,
Autodesk.Revit.DB.ParameterFilterRuleFactory
inthe source codethissegment:
private void okButton_Click(object sender, EventArgs e)
{
// Reserve how many Revit filters need to be updated/removed
ICollection<String> updatedFilters = new List<String>();
ICollection<ElementId> deleteElemIds = new List<ElementId>();
FilteredElementCollector collector = new FilteredElementCollector(m_doc);
ICollection<Element> oldFilters = collector.OfClass(typeof(ParameterFilterElement)).ToElements();
//
// Start transaction to update filters now
Transaction tran = new Transaction(m_doc, "Update View Filter");
tran.Start();
try
{
// 1. Update existing filters
foreach (ParameterFilterElement filter in oldFilters)
{
FilterData filterData;
bool bExist = m_dictFilters.TryGetValue(filter.Name, out filterData);
if (!bExist)
{
deleteElemIds.Add(filter.Id);
continue;
}
//
// Update Filter categories and filter rules for this filter
ICollection<ElementId> newCatIds = filterData.GetCategoryIds();
if (!ListCompareUtility<ElementId>.Equals(filter.GetCategories(), newCatIds))
{
filter.SetCategories(newCatIds);
}
IList<FilterRule> newRules = new List<FilterRule>();
foreach (FilterRuleBuilder ruleData in filterData.RuleData)
{
newRules.Add(ruleData.AsFilterRule());
}
filter.SetRules(newRules);
updatedFilters.Add(filter.Name);
}
//
// 2. Delete some filters
if (deleteElemIds.Count > 0)
m_doc.Delete(deleteElemIds);
//
// 3. Create new filters(if have)
foreach (KeyValuePair<String, FilterData> myFilter in m_dictFilters)
{
// If this filter is updated, do nothing
if (updatedFilters.Contains(myFilter.Key))
continue;
//
// Create new filter now if filter not exist yet
IList<FilterRule> rules = new List<FilterRule>();
foreach (FilterRuleBuilder ruleData in myFilter.Value.RuleData)
{
rules.Add(ruleData.AsFilterRule());
}
ParameterFilterElement.Create(
m_doc, myFilter.Key, myFilter.Value.GetCategoryIds(), rules);
}
//
// Commit change now
tran.Commit();
}
catch (Exception ex)
{
String failMsg = String.Format("Revit filters update failed and was aborted: " + ex.ToString());
MyMessageBox(failMsg);
tran.RollBack();
}
}
Good Luck!