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

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/ 

Rhythm_Creación de Worksets en Dynamo

Uno de los paquetes más populares en Dynamo es Rhythm de JohnPierson.

https://github.com/johnpierson/RhythmForDynamo

Uno de los nodos de Rhythm es 
Workset.Create.dyf 

https://github.com/johnpierson/RhythmForDynamo/blob/master/nodes/Workset.Create.dyf

Es un ejemplo de bucle if  en python perfecto para principiantes:

for name in worksetnames:
Workset.Create(mDoc,name)
newWorksets.append(name)

#sixtysecondrevit.blogspot.com
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
# Import ToDSType(bool) extension method
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)
# Import geometry conversion extension methods
clr.ImportExtensions(Revit.GeometryConversion)
# Import DocumentManager and TransactionManager
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
from System.Collections.Generic import *
# Import RevitAPI
clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *

doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
app = uiapp.Application
uidoc=DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument

worksetnames = IN[0]
mDoc = DocumentManager.Instance.CurrentDBDocument
newWorksets = list()

# Start Transaction
TransactionManager.Instance.EnsureInTransaction(doc)

for name in worksetnames:
	Workset.Create(mDoc,name)
	newWorksets.append(name)

# End Transaction
TransactionManager.Instance.TransactionTaskDone()

OUT = newWorsets

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"