Element Logical Filter with Filter String Rule Evaluators

Element Logical Filter with Filter String Rule Evaluators

Arciviz
Advocate Advocate
552 Views
3 Replies
Message 1 of 4

Element Logical Filter with Filter String Rule Evaluators

Arciviz
Advocate
Advocate

Filterable objects

1. Electrical Equipment with "Electical gangbox" --> BuiltInParameter.ELEM_FAMILY_PARAM --> String ElectricalEquipment = "Modular Gang Box"

2. Schedule level --> like "FFL(0)" -->  BuiltInParameter.INSTANCE_SCHEDULE_ONLY_LEVEL_PARAM --> String elected_Floor_Element = "FFL(0)"

 

Please find below. How to fix it?

ParameterValueProvider pvp1 = new ParameterValueProvider(
new ElementId(BuiltInParameter.ELEM_FAMILY_PARAM));
ParameterValueProvider pvp2 = new ParameterValueProvider(
new ElementId(BuiltInParameter.INSTANCE_SCHEDULE_ONLY_LEVEL_PARAM));

FilterStringRuleEvaluator FsE = new FilterStringEquals();

FilterValueRule fvr1 = new FilterStringRule(pvp1, FsE, ElectricalEquipment);
FilterValueRule fvr2 = new FilterStringRule(pvp2, FsE, Selected_Floor_Element);

ElementParameterFilter filter1 = new ElementParameterFilter(fvr1);
ElementParameterFilter filter2 = new ElementParameterFilter(fvr2);
LogicalAndFilter filters = new LogicalAndFilter(filter1, filter2);

IEnumerable<Element> elems = new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)) 
                    .WherePasses(filters);

 

 

0 Likes
553 Views
3 Replies
Replies (3)
Message 2 of 4

mhannonQ65N2
Collaborator
Collaborator

BuiltInParameter.ELEM_FAMILY_PARAM is an ElementId parameter, not a string parameter so you can't use FilterStringRule with it. I think BuiltInParameter.INSTANCE_SCHEDULE_ONLY_LEVEL_PARAM is also an ElementId parameter.

0 Likes
Message 3 of 4

Arciviz
Advocate
Advocate
Help me How?
Message 4 of 4

Arciviz
Advocate
Advocate

 Issue to filter the Electrical Equipment's schedule Level.

 

 

 

IEnumerable<Element> elems = Factory_BuiltInCategory_familyTypeName(
                    doc, BuiltInCategory.OST_ElectricalEquipment, ElectricalEquipment);

                TaskDialog.Show("No. of Electrical Equipment =  ", elems.Count().ToString());
                string ele_Lvl = "";

                foreach (Element ele in elems)
                {
                    ele_Lvl = ele.get_Parameter(BuiltInParameter.INSTANCE_SCHEDULE_ONLY_LEVEL_PARAM).AsValueString();
                    if (ele_Lvl == Selected_Floor_Element)
                    {
                        Draw_Section.Draw(doc, ele, Section_Name, LeftOffset, RightOffset, TopOffset,
                            BottomOffset, NearClipOffset, FarClipOffset, panelnameoption);
                    }
                    ele_Lvl = "";
                }

 

static IEnumerable<Element> Factory_BuiltInCategory_familyTypeName(Document doc, BuiltInCategory BultCat, string familyTypeName)
        {
            return new FilteredElementCollector(doc)
            .OfCategory(BultCat)
            .OfClass(typeof(FamilyInstance))
            .WherePasses(
              new ElementParameterFilter(
                ParameterFilterRuleFactory.CreateEqualsRule(new ElementId(BuiltInParameter.ELEM_FAMILY_PARAM), familyTypeName)));
        }

 

 

 

Working fine the above code with foreach. I want to logical add the both ParameterFilterRuleFactory (1. symbol, 2. schedule level).

The issue is unable to filter the schedule level of electrical Equipment using ParameterFilterRuleFactory.

How to filter the above.

Refer 

https://prnt.sc/m8W-BO05hKrD

https://prnt.sc/7lEuZqQYxRjN