Filter Rule Rebar Number - Structural Rebar

Filter Rule Rebar Number - Structural Rebar

jamess166
Advocate Advocate
1,284 Views
5 Replies
Message 1 of 6

Filter Rule Rebar Number - Structural Rebar

jamess166
Advocate
Advocate

Good day, I try to apply a filter rule based on the Rebar Number, as I have it in my code does not work, I do not know what I can be doing wrong. Thank you.

 

try
            {
                Element e = SelectElement(uidoc, sel) as Rebar;
                Rebar rb = e as Rebar;

                var parNumber = rb.GetParameterValueAtIndex(new ElementId(BuiltInParameter.REBAR_NUMBER), 0) as StringParameterValue;
                var rebarNumber = parNumber.Value;
                int valueNumber = Convert.ToInt32(rebarNumber);

                TaskDialog.Show("ff", valueNumber.ToString());

                //crear filtro
                ParameterValueProvider provider = new ParameterValueProvider(new ElementId(builtRebarNumber));
                FilterNumericRuleEvaluator evaluator = new FilterNumericEquals();
                FilterRule rule = new FilterIntegerRule(provider, evaluator, valueNumber);
                ElementParameterFilter filter = new ElementParameterFilter(rule);

                //collector
                FilteredElementCollector collector = new FilteredElementCollector(view.Document, view.Id);

                //obtener todas las barras
                collector.OfCategory(BuiltInCategory.OST_Rebar).WherePasses(filter);
                ICollection<ElementId> rebars = collector.ToElementIds();

                uidoc.Selection.SetElementIds(rebars);

            }
            catch { }
0 Likes
Accepted solutions (1)
1,285 Views
5 Replies
Replies (5)
Message 2 of 6

so-chong
Advocate
Advocate

Hi,

Was your code supposed to select a rebar and only shows it's  "Rebar Number" ?

I had changed your code to run it as a macro in Revit.

Just focusing on run it succesfully.

I hope this will point you to the right direction.

 

Good luck!

 

     public void GetRebarNumber()    
    {
    try
        {
            UIDocument uidoc = this.ActiveUIDocument;
            Document doc = uidoc.Document;
            
            Reference r = uidoc.Selection.PickObject(ObjectType.Element, "Select Rebar");
            Element e = doc.GetElement(r) as Rebar;
            Rebar rb = e as Rebar;
            
    //      Element e = SelectElement(uidoc, sel) as Rebar;
    //      Rebar rb = e as Rebar;

            var parNumber = rb.GetParameterValueAtIndex(new ElementId(BuiltInParameter.REBAR_NUMBER), 0as StringParameterValue;
            var rebarNumber = parNumber.Value;
            int valueNumber = Convert.ToInt32(rebarNumber);

            TaskDialog.Show("ff", valueNumber.ToString());

            //crear filtro
            ParameterValueProvider provider = new ParameterValueProvider(new ElementId(BuiltInParameter.REBAR_NUMBER));
            FilterNumericRuleEvaluator evaluator = new FilterNumericEquals();
            FilterRule rule = new FilterIntegerRule(provider, evaluator, valueNumber);
            ElementParameterFilter filter = new ElementParameterFilter(rule);

            //collector
            FilteredElementCollector collector = new FilteredElementCollector(doc,doc.ActiveView.Id);

            //obtener todas las barras
            collector.OfCategory(BuiltInCategory.OST_Rebar).WherePasses(filter);
            ICollection<ElementId> rebars = collector.ToElementIds();

            uidoc.Selection.SetElementIds(rebars);

        }
        catch { }
    }

 

0 Likes
Message 3 of 6

jamess166
Advocate
Advocate

Good day, if indeed the intention is to select a bar and get the rebar number, until there I have no problems, the detail is the filter does not work, you do not get to select any element.

namespace SelectRebarNumber
{
    [Transaction(TransactionMode.Manual)]
    public class Command : IExternalCommand
    {
        public Result Execute(
          ExternalCommandData commandData,
          ref string message,
          ElementSet elements)
        {
            UIApplication uiapp = commandData.Application;
            UIDocument uidoc = uiapp.ActiveUIDocument;
            Application app = uiapp.Application;
            Document doc = uidoc.Document;

            View view = doc.ActiveView;

            if (view == null)
            {
                throw new ArgumentException(nameof(view));
            }

            // Access current selection
            Selection sel = uidoc.Selection;

            BuiltInParameter builtRebarNumber = BuiltInParameter.REBAR_NUMBER;

            //elemento seleccionado
            try
            {
                Element e = SelectElement(uidoc, sel) as Rebar;
                Rebar rb = e as Rebar;

                var parNumber = rb.GetParameterValueAtIndex(new ElementId(BuiltInParameter.REBAR_NUMBER), 0) as StringParameterValue;
                var rebarNumber = parNumber.Value;
                int valueNumber = Convert.ToInt32(rebarNumber);

                TaskDialog.Show("ff", valueNumber.ToString());

                //crear filtro
                ParameterValueProvider provider = new ParameterValueProvider(new ElementId(builtRebarNumber));
                FilterNumericRuleEvaluator evaluator = new FilterNumericEquals();
                FilterRule rule = new FilterIntegerRule(provider, evaluator, valueNumber);
                ElementParameterFilter filter = new ElementParameterFilter(rule);

                //collector
                FilteredElementCollector collector = new FilteredElementCollector(view.Document, view.Id);

                //obtener todas las barras
                collector.OfCategory(BuiltInCategory.OST_Rebar).WherePasses(filter);
                ICollection<ElementId> rebars = collector.ToElementIds();

                uidoc.Selection.SetElementIds(rebars);

            }
            catch { }

            return Result.Succeeded;
        }

        //Selecciona elementos Picked Objects
        public Element SelectElement(UIDocument Uidoc, Selection sel)
        {
            Reference pickObject = sel.PickObject(ObjectType.Element, "Seleccionar Elementos Host");

            //Convertir la referencias en elementos
            Element pickedElements = Uidoc.Document.GetElement(pickObject);

            return pickedElements;
        }
    }
}
0 Likes
Message 4 of 6

FAIR59
Advisor
Advisor
Accepted solution

the parameter REBAR_NUMBER is a TextParameter, so you need a FilterStringRule.

 

Parameter p = rb.get_Parameter(BuiltInParameter.REBAR_NUMBER);
string rebarNumber = p.AsString();
int valueNumber = 0;
int.TryParse(rebarNumber, out valueNumber);

TaskDialog.Show("ff",p.Definition.ParameterType.ToString()+"  "+  valueNumber.ToString());
 
//crear filtro
ParameterValueProvider provider = new ParameterValueProvider(new ElementId(BuiltInParameter.REBAR_NUMBER));
FilterStringRuleEvaluator evaluator = new FilterStringEquals();
FilterRule rule = new FilterStringRule(provider, evaluator, rebarNumber, false);
ElementParameterFilter filter = new ElementParameterFilter(rule);
Message 5 of 6

so-chong
Advocate
Advocate

Hi,

I didn't read your question clearly and didn't check the filter.

 

Thanks to @FAIR59 pointing out to use a FilterStringRule.

 

To test the filter is working i added a Count property; just to show how many  "Rebar Number" (the same one) were found.

 

Hope this helps.

 

    public void GetRebarNumber()    
    {
    try
        {
            UIDocument uidoc = this.ActiveUIDocument;
            Document doc = uidoc.Document;
            
            Reference r = uidoc.Selection.PickObject(ObjectType.Element, "Select Rebar");
            Element e = doc.GetElement(r) as Rebar;
            Rebar rb = e as Rebar;
            
            Parameter p = rb.get_Parameter(BuiltInParameter.REBAR_NUMBER);
            string rebarNumber = p.AsString();
            int valueNumber = 0;
            int.TryParse(rebarNumber, out valueNumber);

            TaskDialog.Show("ff","Rebar Number: "+"  "+  valueNumber.ToString());

            //crear filtro
            ParameterValueProvider provider = new ParameterValueProvider(new ElementId(BuiltInParameter.REBAR_NUMBER));
            FilterStringRuleEvaluator evaluator = new FilterStringEquals();
            FilterRule rule = new FilterStringRule(provider, evaluator, rebarNumber, false);
            ElementParameterFilter filter = new ElementParameterFilter(rule);
                
            //collector
            FilteredElementCollector collector = new FilteredElementCollector(doc,doc.ActiveView.Id);

            //obtener todas las barras
            IList<Element> equalFounds
                = collector.WherePasses(filter)
                .OfCategory(BuiltInCategory.OST_Rebar)
                .OfClass(typeof(Rebar))
                .ToElements();
                
            TaskDialog.Show("Revit""Rebars found: "+ equalFounds.Count );
        }
        catch { }
    }

 

Message 6 of 6

jamess166
Advocate
Advocate
Actually, my mistake was in thinking that the Rebar Number parameter is the Int type, it was applying the wrong filter rule. Thank you!!!
0 Likes