Funciones Python Útiles_filter()

filter()- Función muy útil para filtrar una lista a través de una función definida.

ref: https://www.w3schools.com/python/ref_func_filter.asp

“The filter() function returns an iterator were the items are filtered through a function to test if the item is accepted or not.”

# Enable Python support and load DesignScript library
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

# The inputs to this node will be stored as a list in the IN variables.
dataEnteringNode = IN

# Place your code below this line
lista1=IN[0]
lista2=IN[1]

#funcion filtro listas anidadas
def filtrolistas(lista2):
    
    if lista2 in lista1:
        return True
    else:
        return False
		
# Assign your output to the OUT variable.
OUT =filter(filtrolistas,lista1)

En el ejemplo en concreto aplicamos la función “filtro listas” creada , comprobando si los elementos de la lista 2 están dentro de la lista 1 y filtrándolos.

IFC Open

2 Recursos complementarios e interesantes para leer ifcs mencionados en Bimrras.

<a href=”https://www.bimrras.com/episodio/078-programacion-web-de-herramientas-bim/”>https://www.bimrras.com/episodio/078-programacion-web-de-herramientas-bim/</a>

Un gran aporte a la comunidad open source made in Spain.

IFC Syntax is a Visual Studio Code extension that adds language support for Industry Foundation Classes (also known as IFC) files, using the .ifc extension, and for EXPRESS languate, using the .exp extension.

Features

Currently it supports:

  • Basic syntax highlighting for:
    • IFC (Industry Foundation Classes) files.
    • EXPRESS language files (commonly used to define the different IFC versions).
  • Basic folding capabilities
    • IFC: Only HEADER and DATA sections can be folded.
    • EXPRESS:
      • TYPEENTITYFUNCTIONRULE folding.
      • Main section folding.
  • More features will be added in the near future.

https://marketplace.visualstudio.com/items?itemName=alanrynne.ifc-syntax

IFC.JS

The concept of app is simple: it parses IFC files and converts them to 3d geometry that can be displayed in browsers

This library converts any browser into an IFC viewer. It parses IFC entities to WebGL geometry through THREE.js.

https://github.com/agviegas/IFC.js/blob/master/CONTRIBUTING.md

Gracias a agviegas y alanrynne por su trabajo opensource !!

Python_Zip Function_1

Un recurso muy útil a la hora de organizar listas en pithon es utilizar la función zip()

En este ejemplo utilizamos la función zip para ordenar los ids y las habitaciones en una lista que nos podría servir por ejemplo para exportar a un excel.

import clr

clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

doc = DocumentManager.Instance.CurrentDBDocument
uidoc=DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument

elementos = UnwrapElement(IN[0])

rooms =[]
roomsIDs=[]

for elemento in elementos:
	rooms.append(elemento.ToString())
	roomsIDs.append(elemento.Id)
	
OUT = zip(rooms,roomsIDs)

Este post está numerado a propósito, con el objetivo de ir escalando el código empleado para reutilizar y aumentar la funcionalidad del mismo.

El siguiente objetivo será conseguir los parámetros “útiles” de la habitaciones y desarrollar alguna función que podamos reutilizar más adelante…..

El camino de los circuitos

import clr

clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument

clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *

clr.AddReference('RevitNodes')
import Revit
clr.ImportExtensions(Revit.GeometryConversion)
clr.ImportExtensions(Revit.Elements)


paths = UnwrapElement(IN[0])
elecPath_list = list()

for path in paths:
	try:
		elecPath_list .append(path.GetCircuitPath())
	except:
		elecPath_list .append(list())

OUT = elecPath_list

A raiz de un proyecto en el que tenemos 472 viviendas hemos tenido la necesidad de obtener LGA de alimentación de manera automática.

Con un pequeño Python Scritp accedemos a una funcionalidad muy útil de los circuitos de revit para el cálculo de caídas de tensión.

Provides access to the Electrical System in Autodesk Revit MEP.
public IList<XYZ> GetCircuitPath()

https://www.revitapidocs.com/2019/0448a0ee-c9bf-f037-c1b7-d49ce03ffa71.htm

Interiorismo con diseño paramétrico

Muy interesante el post publicado en la web oficial de Dynamo en la que se muestra un proceso de integración de diseño parámetrico aplicado a un proyecto de alumbrado de interior con una boveda.

Ref: #LUCIE HANZLÍKOVÁ https://dynamobim.org/parametric-principles-in-the-interior/

https://www.vibia.com/en/int/hanging-lamps-algorithm-hanging

Los nodos clave que se utilizan :

“Select Faces” >> Para seleccionar las caras de las bovedas y la superfice superior.

“Surface Point At Parameter” >> Para encontrar el punto más alto de la boveda y replantear los puntos donde colocaremos el alumbrado.

“Poly Surfaces. ByJoinedSurfaces” >> Para unir las bovedas

“PointProject” >> Para proyectar los puntos de la superficie obtenidos mediante un rango sobre la bóveda.

“Geometry.DistanceTo” >> Para obtener las longitudes de las luminarias desde el techo hasta la bóveda.

“Geometry. Translate” >> para ajustar los puntos de replanteo de luminarias.

“FamilyInstance.ByPointAndLevel” >> para los colocar los elementos.

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

Python Tip_List Comprehension

Una manera muy útil de optimizar el código para iterar y filtrar en python es utilizar list comprehension.

Ejemplo 1:Filtramos las vocales del texto
Ejemplo2:Filtramos los nombres de habitaciones
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
#The inputs to this node will be stored as a list in the IN variables.
Texto = IN[0]
#sintaxis listcomprehension 
Vocales = [i for i in Texto if i in "aeio"]

#Assign your output to the OUT variable.
OUT = Vocales


import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
#The inputs to this node will be stored as a list in the IN variables.
Nombres = IN[0]

#sintaxis listcomprehension 
filtro = [i for i in Nombres if i =="Room 4" ]

#Assign your output to the OUT variable.
OUT = filtro



En una sola linea tenemos un bucle for y un if ! Verdaderamente útil.