Leyendas de Colores Por Filtros

Basado en una consulta de una amiga y utilizando el foro de Dynamo https://forum.dynamobim.com/t/creating-a-color-legend-from-view-filters/24433 he reutilizado un script muy útil para crear leyendas según filtros en vista.

A continuación el código Python para crear las FilledRegion por @Kullkull

https://forum.dynamobim.com/t/find-python-code-filledregion-bycurves-in-activeview/28580/2

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);
		}