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…..

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.

Etiquetar planos automáticamente con #Dynamo#Python

Una de las actividades más tediosas en la oficina, sin duda es etiquetar planos. No obstante, es una de las que más “valor” productivo aporta a la hora de un enfoque práctico de dynamo.

Basado en el tutorial http://learndynamo.com/mod3/   [Tag Plans By Sheet] en la web http://learndynamo.com/ de Jeremy Graham podemos etiquetar por categoría todos las vistas en planos de nuestro proyecto.

Usando dos nodos de python aumentamos enormemente el potencial de un scritp con nodos standard de dynamo.

  • En la primera parte del script hacemos un filtro de los planos y vistas que necesitamos.
  • En la segunda parte en base a la categoría que seleccionamos podemos etiquetar según una familia y tipo de etiqueta que deseemos todas las vistas anteriormente filtradas.

En el primer nodo python mediante una lista y un bucle obtenemos 3 listas ( sheet , sheet.name, sheet.numbers) . Es un nodo sencillo y práctico para ordenar los datos que necesitaremos más adelante.

# Enable Python support and load DesignScript library
import clr
clr.AddReference("RevitAPI")
clr.AddReference("RevitServices")
clr.AddReference("RevitNodes")
import RevitServices
import Revit
import Autodesk
from Autodesk.Revit.DB import *

from RevitServices.Persistence import DocumentManager

#variables y obtención de documento

doc = DocumentManager.Instance.CurrentDBDocument

toggle =IN[0]
out = []
sheets= []
snames= []
snumbers= []

# Place your code below this line

if toggle == True:
	
	collector = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Sheets).OfClass(ViewSheet)
	
	for i in collector:
	
		sheets.append(i)
		
		snames.append(i.get_Parameter(BuiltInParameter.SHEET_NAME).AsString())
		
		snumbers.append(i.get_Parameter(BuiltInParameter.SHEET_NUMBER).AsString())
		
out.append(sheets)
out.append(snames)
out.append(snumbers)

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

En el segundo nodo python ,este si más complejo, obtenemos lo siguiente:

  1. Obtenemos los ids de los elementos de la categoría seleccionada en las vistas filtradas previamente y obtenemos todos los datos de bounding box y posicion de los elementos para etiquetarlos.
  2. Creamos los tag y los ubicamos ( sólo necesitaremos tres inputs ( familia y tipo + posición y longitud del leader de nuestras etiquetas).

Gracias a Jeremy Graham por su labor divulgativa en su página http://learndynamo.com/ 

Set project information Python Script

Una manera muy rápida de gestionar la información general del proyecto es creando un plano / title block de control donde podemos de un vistazo revisar toda la información relevante del proyecto siempre que abrimos el modelo. 

Basado en el Mystery Mep Dynamo Package podemos configurar rápidamente todos los datos a incluir en nuestro proyecto de manera automática.

**Fuente: http://www.revit.com.au/consistency-is-key-setting-project-info-with-dynamo

La utilidad de este pequeño script se multiplica cuando tenemos que rellenar estos parámetros en varios modelos.

Set project information

Este nodo personalizado tiene un código en Python muy simple :

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

#The inputs to this node will be stored as a list in the IN variables.
OrgName = IN[0]
OrgDesc = IN[1]
BuildNumber = IN[2]
ProjAuthor = IN[3]
ProjDate = IN[4]
ProjStat = IN[5]
ProjClient = IN[6]
ProjAddress = IN[7]
ProjName = IN[8]
ProjNumber = IN[9]
 
TransactionManager.Instance.EnsureInTransaction(doc)
  
projinfo.OrganizationName = OrgName
projinfo.OrganizationDescription = OrgDesc
projinfo.BuildingName = BuildNumber
projinfo.Author = ProjAuthor
projinfo.IssueDate = ProjDate
projinfo.Status = ProjStat
projinfo.ClientName = ProjClient
projinfo.Address = ProjAddress
projinfo.Name = ProjName
projinfo.Number = ProjNumber
 
TransactionManager.Instance.TransactionTaskDone()
 
elementlist = list()
elementlist.append("DONE!")
elementlist.append(projinfo.OrganizationName)
elementlist.append(projinfo.OrganizationDescription)
elementlist.append(projinfo.BuildingName)

try:
elementlist.append(projinfo.Author)
except:
elementlist.append(list())
elementlist.append(projinfo.IssueDate)
elementlist.append(projinfo.Status)
elementlist.append(projinfo.ClientName)
elementlist.append(projinfo.Address)
elementlist.append(projinfo.Name)
elementlist.append(projinfo.Number)

OUT = elementlist
#OUT = "done"