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 built in functions (dir)

Recurso

https://www.autodesk.com/autodesk-university/class/Untangling-Python-Crash-Course-Dynamos-Python-Node-2017#handout

@Gui Talarico

dir()
lista todos los métodos y atributos asociados a un objeto

import​​ ​clr
clr.AddReference(​’ProtoGeometry’​)
from​​ ​Autodesk.DesignScript​ ​​import​​ ​Geometry
OUT​ ​=​ ​dir(Geometry.Vector)

dir(method)


# contando elementos por nivel.

Con este sencillo script , podemos renumerar elementos por nivel. Algo muy útil a la hora de realizar presupuestos y mediciones.

lista;

//contamos lista y obtenemos nivel//

Nivel=Element.GetParameterValueByName(lista,"Level");

Cuenta=List.Count(lista);

Podemos utilizar Dynamo Player para hacer uso de la rutina por usuarios sin conocimientos de Dynamo.

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"