Filtros Utilizando API con C#

Algunas referencias y apuntes:

https://dynamopythonprimer.gitbook.io/dynamo-python-primer/4-revit-specific-topics/fetching-revit-elements

https://thebuildingcoder.typepad.com/blog/2010/10/filtered-element-collectors.html

https://knowledge.autodesk.com/support/revit-products/learn-explore/caas/CloudHelp/cloudhelp/2014/ENU/Revit/files/GUID-A2686090-69D5-48D3-8DF9-0AC4CC4067A5-htm.html

Practicando en la cuarenta la aplicación de filtros en el API de revit.

Filtered Element Collector Class_Constructor

https://www.revitapidocs.com/2019/0635f1e4-652a-7e42-15af-94f24c4d8e8d.htm

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI.Selection;

namespace FiltroDeCategorías
{
	// La clase que va a contener el comando externo de Revit, ha de implementar la interface 'IExternalCommand'.
	[Transaction(TransactionMode.Manual)]
	public class Class1 : IExternalCommand
	{
		// Método público el cual buscará Revit para ejecutar el comando externo.
		public Result Execute(
			ExternalCommandData DatosDelComandoExterno,
			ref string mensaje,
			ElementSet elementos)
		{
			// Declaración de una variable local con el documento actual.
			Document doc = DatosDelComandoExterno.Application.ActiveUIDocument.Document;

			//Filtered Element Collector
			FilteredElementCollector colectorPuertas = new FilteredElementCollector(doc);
			FilteredElementCollector colectorMuros = new FilteredElementCollector(doc);
			FilteredElementCollector colectorVentanas = new FilteredElementCollector(doc);

			//------------------------------
			//Filtro a colector Puertas
			ElementCategoryFilter filtroPuertas = new ElementCategoryFilter(BuiltInCategory.OST_Doors);

			//Aplicar el filtro al colector Puertas
			IList<Element> listaPuertas = colectorPuertas.WherePasses(filtroPuertas)
				.WhereElementIsNotElementType()
				.ToElements();

			//-----------------------
			//Filtro a colector Muros
			ElementCategoryFilter filtroMuros = new ElementCategoryFilter(BuiltInCategory.OST_Walls);

			//Aplicar el filtro al colector Muros
			IList<Element> listaMuros = colectorMuros.WherePasses(filtroMuros)
				.WhereElementIsNotElementType()
				.ToElements();

			//-----------------------
			//Filtro a colector Ventanas
			ElementCategoryFilter filtroVentanas = new ElementCategoryFilter(BuiltInCategory.OST_Windows);

			//Aplicar el filtro al colector Ventanas
			IList<Element> listaVentanas = colectorVentanas.WherePasses(filtroVentanas)
				.WhereElementIsNotElementType()
				.ToElements();

			//TaskDialog
			TaskDialog.Show("Puertas"
				, "El numero de puertas es " + listaPuertas.Count());
			TaskDialog.Show("Muros"
				, "El numero de muros es " + listaMuros.Count());
			TaskDialog.Show("Puertas"
				, "El numero de ventanas es " + listaVentanas.Count());


		}
	}


Se puede resumir la aplicación del filtro sobre el colector combinando métodos de la siguiente manera en una única línea:

public void ColectorNombresPuertas()
		{
			//Utilizamos uidoc y doc:
			Document doc = this.ActiveUIDocument.Document;

			//Filtered Element Collector
			FilteredElementCollector colectorPuertas= new FilteredElementCollector(doc)
				.OfCategory(BuiltInCategory.OST_Doors)
				.WhereElementIsNotElementType();
			
			
			//string  vacía para almacenar los nombres de las puertas
			string nombresPuertas = "";
			//bucle iterando sobreo el colector con el método name.
			foreach (Element elem in colectorPuertas)
			{
				nombresPuertas += elem.Name + "\n";
			}
			
			//TaskDialog
			TaskDialog.Show("Puertas","El nombre de los tipos de las puertas es "+"\n" + nombresPuertas);
		}

+++Sumando longitudes +++

Un script muy simple pero potente para realizar mediciones rápidas sobre cualquier objeto/s con el parámetro length que seleccionemos.

Original de https://boostyourbim.wordpress.com/2016/06/21/total-length-of-multiple-lines/ de Harry Mattison.

 
public void CurveTotalLenght()
{
       //obtenemos el documento en curso (*variación sobre el original)
       UIDocument uidoc = this.Application.ActiveUIDocument;
       Document doc = uidoc.Document;
        //Selección y obtención de ids
        ICollection<ElementId> ids = uidoc.Selection.GetElementIds();
        //variable vacía para almacenar el valor
        double length = 0;
        //loop sobre la selección           
        foreach (ElementId id in ids)
        {
            //obtenemos el id
            Element e = doc.GetElement(id);
            //obtenemos el parámetro curve_elem_lenght
            Parameter lengthParam = e.get_Parameter(BuiltInParameter.CURVE_ELEM_LENGTH);
            //si no ... pasamos
            if (lengthParam == null)
                continue;
            //si si ... lo cogemos
            length += lengthParam.AsDouble();
        }
        //UnitUtils sobre las unidades del document         
        string lengthWithUnits = UnitFormatUtils.Format(doc.GetUnits(), UnitType.UT_Length, length, false, false);
        //Mostramos la información por pantalla
        TaskDialog.Show("Length", ids.Count + " elements = " + lengthWithUnits);
    }