- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
I'm trying to add filters to a list of views, much like the filter on the project browser. Filters are added to a WPF DataGrid with the appropriate parameters stored. The filtering works but only on the last item on the list, fir example, in the image below, the views should be filtered by view family = Floor Plan, then by scale = 1:50 but only the scale filter is being applied.
I've tried numerous methods, some of which are commented out in the code below. It seems that the ElementParameterFilter stored in the list of element filters is being redefined on each loop so each ElementFilter stored in the list<ElementFilter> is identical so the LogicalAndFilter isn't functioning?
Here's the code:
// public FilteredElementCollector viewCollector { get; set; }
public void MakeViewList(UIApplication app, DataGrid data, DataGrid filtergrid, String GroupString)
{
Document doc = app.ActiveUIDocument.Document;
ItemCollection filters = filtergrid.Items;
FilteredElementCollector vwCollector = new FilteredElementCollector(doc);
vwCollector.OfClass(typeof(View)).Cast<View>();
List<ElementFilter> epf = new List<ElementFilter>();
// if ((viewCollector == null))
// {
// }
// else
// {
// vwCollector = viewCollector;
// }
// IList<View> views = vwCollector.ToList<View>();
// views.Clear();
// foreach (View view in vwCollector)
// {
// views.Add(view);
// }
// IList<Element> views = vwCollector.ToElements() as IList<Element>;
if (filters.Count > 0)
{
int i = 0;
foreach (FilterGrid fg in filters)
{
if (fg.FilterBy != null)
{
Parameter bp = fg.parameter as Parameter;
string pName = bp.Definition.Name;
switch (bp.StorageType)
{
case StorageType.String:
{
ParameterValueProvider bpvp = new ParameterValueProvider(bp.Id);
FilterStringRuleEvaluator fnrv = new FilterStringEquals();
FilterRule fRule = new FilterStringRule(bpvp, fnrv, bp.AsString(), false);
ElementParameterFilter efilter = new ElementParameterFilter(fRule);
FilteredElementCollector excl = vwCollector.WherePasses(efilter);
if (fg.Operation == "Equals")
{
vwCollector.WherePasses(efilter);
}
else if (fg.Operation == "Not Equal to")
{
vwCollector.Excluding(excl.ToElementIds());
}
epf.Add(efilter);
break;
}
case StorageType.Integer:
{
ParameterValueProvider bpvp = new ParameterValueProvider(bp.Id);
FilterNumericRuleEvaluator fnrv = new FilterNumericEquals();
FilterRule fRule = new FilterIntegerRule(bpvp, fnrv, bp.AsInteger());
ElementParameterFilter efilter = new ElementParameterFilter(fRule);
FilteredElementCollector excl = vwCollector.WherePasses(efilter);
epf.Add(efilter);
if (fg.Operation == "Equals")
{
vwCollector.WherePasses(efilter).ToElements();
}
else if (fg.Operation == "Not Equal to")
{
vwCollector.Excluding(excl.ToElementIds());
}
break;
}
case StorageType.Double:
{
ParameterValueProvider bpvp = new ParameterValueProvider(bp.Id);
FilterNumericRuleEvaluator fnrv = new FilterNumericEquals();
FilterRule fRule = new FilterDoubleRule(bpvp, fnrv, bp.AsDouble(), 1E-6);
ElementParameterFilter efilter = new ElementParameterFilter(fRule);
FilteredElementCollector excl = vwCollector.WherePasses(efilter);
epf.Add(efilter);
if (fg.Operation == "Equals")
{
vwCollector.WherePasses(efilter).ToElements();
}
else if (fg.Operation == "Not Equal to")
{
vwCollector.Excluding(excl.ToElementIds());
}
break;
}
case StorageType.ElementId:
{
ParameterValueProvider bpvp = new ParameterValueProvider(bp.Id);
FilterNumericRuleEvaluator fnrv = new FilterNumericEquals();
FilterRule fRule = new FilterElementIdRule(bpvp, fnrv, bp.AsElementId());
ElementParameterFilter efilter = new ElementParameterFilter(fRule);
FilteredElementCollector excl = vwCollector.WherePasses(efilter);
MessageBox.Show("efilter = " + efilter.GetRules().ToString());
epf.Add(efilter);
if (fg.Operation == "Equals")
{
vwCollector.WherePasses(efilter);
}
else if (fg.Operation == "Not Equal to")
{
vwCollector.Excluding(excl.ToElementIds());
}
// IEditableCollectionView editableCollection = vwCollector as IEditableCollectionView;
// editableCollection.EditItem
// vwCollector.
// vwCollector = vwCollector.WherePasses(elementfilter);
break;
}
// if (fg.Operation == "Equals")
// {
//views = views.Where(v => v.LookupParameter(pName).AsString() == bp.AsString()) as IList<View>;
// vwCollector.WherePasses(efilter);
// views = views.Where(e => e.GetParameters(bp.Definition.Name.ToString()).First<Parameter>().AsString() == bp.AsString()) as IList<Element>;
// }
// else if (fg.Operation == "Not Equal to")
// {
//views = views.Where(v => v.LookupParameter(pName).AsString() != bp.AsString()) as IList<View>;
// vwCollector.Excluding(excl.ToElementIds());
//views = views.Where(e => e.GetParameters(bp.Definition.Name.ToString()).First<Parameter>().AsString() != bp.AsString()) as IList<Element>;
// }
// lf.GetFilters().Add(stringfilter);
// epf.Add(efilter);
//viewCollector = vwCollector;
}
// }
// else
// {
// FilterStringRuleEvaluator fnrv = new FilterStringLess();
// }
// vwCollector.Excluding(filter);
}
}
/* if (epf.Count > 0)
{
// ElementFilter dummyFilter = new ElementFilter();
LogicalAndFilter lf = new LogicalAndFilter(epf);
lf.GetFilters().Clear();
foreach (ElementParameterFilter ef in epf)
{
lf.GetFilters().Add(ef);
}
vwCollector.WherePasses(lf);
} */
}
if (epf.Count > 0)
{
LogicalAndFilter lf = new LogicalAndFilter(epf);
vwCollector.WherePasses(lf);
}
ObservableCollection<ViewListStructure> ViewCollection = new ObservableCollection<ViewListStructure>();
List<Autodesk.Revit.DB.ElementId> vos = ViewsOnSheets(app) as List<Autodesk.Revit.DB.ElementId>;
foreach (View v in vwCollector)
{
//View v = e as View;
...make view list
)
The data structure for the filters is:
public struct FilterGrid
{
public string FilterBy { get; set; }
public string Operation { get; set; }
public string FilterValue { get; set; }
public object parameter { get; set; }
}
public void AddViewFilter(string param, string op, string valueparam, DataGrid data, object paramobj)
{
foreach (FilterGrid fg in data.Items)
{
FilterGrids.Add(new FilterGrid() { FilterBy = fg.FilterBy, Operation = fg.Operation, FilterValue = fg.FilterValue, parameter = paramobj });
}
FilterGrids.Add(new FilterGrid() { FilterBy = param, Operation = op, FilterValue = valueparam, parameter = paramobj });
data.ItemsSource = FilterGrids;
}
Also, what is the best practice for filtering Parameter != Value?
Solved! Go to Solution.