Saltar al contenido
Especialista3D

Editor de parametros de texto con Dynamo

Editor_parametros_de_texto_Dynamo

Saludos especialistas, hoy vamos a ver cómo hacer un editor de parametros de texto con Dynamo y su API en lenguaje Python. Es un módulo Dynamo muy sencillo y que nos puede ahorrar horas de teclear uno a uno los parámetros de decenas de objetos BIM.

Aprender a programar escribiendo código es dificil y lleva mucho tiempo, normalmente años, dependiendo de qué queramos hacer con nuestras habilidades. Pero no por ello debería nadie resignarse a que es imposible, ya que nos sorprendería la cantidad de pequeñas tareas que nos puede facilitar saber programar con código.»

*Fragmento extraído del libro Salto al BIM (Cap. 8 – Automatización de procesos) ->Saltoalbim.com

A continuación os enseñaré un ejemplo clásico de cómo con unas lineas muy sencillas de código se pueden ahorrar decenas de horas de re-escribir parámetros uno a uno.

 

Editor_parametros_de_texto_Dynamo

 

Pongamos un ejemplo práctico para entender la problemática:

Lo primero que tenemos que tener claro es si podemos “agrupar” los parámetros de texto que queremos cambiar según un criterio que Revit y Dynamo puedan comprender.

Tenemos unos 200 planos cuyos nombres de plano han de ser cambiados añadiéndole un prefijo numérico y un sufijo textual. Se nos hace un mundo cambiar uno a uno todos los parámetros, plano a plano, y la opción de agrupación de parámetros por tablas no nos sirve para este caso.

La técnica agrupación de parámetros en tablas de Revit no funciona para nombres de planos diferentes y ediciones punuales. Si lo hiciéramos así añadiríamos de un plumazo el prefijo y el sufijo a todos los nombres, lo malo es que también nos cargaríamos los nombres singulares predefinidos, ya que llamaríamos a los 200 planos con el mismo nombre… por lo que tenemos que usar nuestra creatividad y nuestros conocimientos del Dynamo para que nuestra empresa tenga éxito con el menor número de horas posible.

Hemos visto que mediante una combinación de nodos que creemos que existen en Dynamo se puede hacer este tipo de edición, pero nos sale un Dynamo demasiado complejo para una función tan sencilla como añadir y quitar texto. Sería matar moscas a cañonazos.

Como sabemos algo de lenguaje Python nos parece más óptimo programar un par de líneas de código que intentar encontrar y luego entender cómo funcionan los nodos Dynamo que ni siquiera tenemos la certeza que existan. Así que haremos nuestro editor de parámetros de texto con Dynamo y Python.

 

Hay cosas que las tablas de Revit no solucionan agrupando parámetros.

Como ya hemos dicho, no siempre podremos editar en masa parámetros agrupándolos mediante tablas de Revit. Por eso tenemos que utilizar un agrupador de parámetros de Dynamo, que será diferente según los parámetros de texto que queramos seleccionar. (Si alguien quiere que explique cómo se agrupan parámetros en Dynamo que pongan un comentario y publicaremos un artículo para desarrollarlo mejor)

Parameters_everywhere

Una vez hemos agrupado los parámetros de textuales en listas de Dynamo empieza lo divertido.

Así que ya tenemos un par de certezas :

  1. El parámetro a editar es agrupable por Dynamo (en este caso mediante parámetro de texto de Title Block.
  2. No queremos perder tiempo buscando y combinando módulos que no sabemos si existen ni cómo funcionan. Así que decidimos programarlo en un módulo de Python dentro del Dynamo.

Pero como siempre, cuando surgen certezas se multiplican las dudas:

  1. ¿Cuántos “inputs” tendrá nuestro módulo recién creado?
  2. Es posible que sepa programar la edición de un simple parámetro de texto aislado pero ¿seré capaz de cambiar no sólo un parámetro de texto, sino un paquete de parámetros de textos cuyo número es indeterminado?
  3. Ya que estoy haciendo esto ¿me compensa meterle más funcionalidades a mi pieza de edición de texto? ¿hasta cuántas funcionalidades podría introducir en el módulo para que no dejara de ser práctico?

Una vez hemos agrupado los parámetros de textuales en listas de Dynamo empieza lo divertido. Programamos con Python.

La primera pregunta es relativamente fácil de responder. Estos son los INPUTS que hemos usado para la creación del módulo:

 

# IN[0] = (STRING) entrada de string;

# IN[1] = (STRING) introduce el string que quieras al principio del string.

# IN[2] = (STRING) introduce el string que quieras al fin del string.

 

La segunda pregunta antes planteada es un poco más compleja y depende de si tenemos al menos un nivel básico de programación en Python. Para realizar funciones que actúen sobre todos los elementos (parámetros) de las listas, hay que usar rutinas tipo map() y list(). Este sería el código para editar listas de strings (o paquetes de parámetros de texto en lenguaje común).

#Made by JH Guadalupe from BIMEC.

def borra(x):
  return x[IN[4]:]

def creaprinc(x):
  return IN[1] + x

def creaalfin(x):
  return x + IN[2] 

string = IN[0]

borrastring = list(map(borra,string))

masstring = list(map(creaprinc,borrastring))

masstringmas = list(map(creaalfin,masstring))

OUT = masstringmas

A ver si pillamos las diferencias. Este sería el código si sólo quisiéramos cambiar un simple parámetro de texto. Sería absurdo usar este código en nuestro Dynamo, porque se hace mucho más fácil clicando y editando las propiedades de objeto directamente en el Revit. Pero lo muestro para que se vea la diferencia y aprendamos a usar funciones dentro de las listas:

 



#Made by JH Guadalupe from BIMEC.

string = IN[0]

creaprinc = string + IN[1]

creaalfin= IN[2] + creaprinc

OUT = creaalfin

 

La diferencia es que hemos hecho las operaciones de suma de strings dentro de funciones creadas por nosotros para luego aplicarlas mediante la función map(), que nos permite aplicar funciones a todos los elementos de las listas.

La función list() es necesaria si queremos que se vuelva a conformar una lista con los elementos modificados al final de la función.

Así que ya está resuelta la duda sobre cómo transformar listas enteras en lugar de elementos aislados.

Si quieres ver claves sobre aprender a programar con la API de Revit échale un ojo a nuestro artículo:

PROGRAMAR CON LA API DE REVIT: CÓMO APRENDER

 

Editor de parametros de texto con Dynamo avanzado.

Como nos hemos emocionado y queremos automatizar más cosas se nos ocurre que:

  • Además queremos conseguir borrar caracteres del principio de los textos en los los parámetros.
  • Nos vendría bien una herramienta que modificara las mayúsculas de los textos masivamente.

 

Introducimos dos nuevos inputs numéricos. Se hace cómodo enlazar estos inputs a “integer sliders” de Dynamo para editarlos con facilidad.

 

# IN[4] = (INTEGER) borra el número de caracteres que introduzcas del principio del string.

# IN[3] = (INTEGER) Editor de mayúsculas mediante integrers.Abajo explica los números que aplican cada función (0,1,2).

# 0 = no hace cambios

# 1 = Mayúsculas a la primera letra de palabras separadas por espacios.

# 2 = mayúsculas a todo el string.

 

Para el borrado hemos utilizado una herramienta sencilla de eliminación de caracteres que se relaciona con el INPUT numérico que determina cuántos caracteres borramos del principio del texto.

Para programar la herramienta de edición de mayúsculas necesitaremos la estructura de código If/else, que determina lo que ocurre según el número que introduzcamos en el INPUT.

Éste sería el código resultante:

 



#Made by JH Guadalupe from BIMEC.

string = IN[0]

def borra(x):
  return x[IN[4]:]

def creaprinc(x):
  return IN[1] + x

def creaalfin(x):
  return x + IN[2]


borrastring = list(map(borra,string))

masstring = list(map(creaprinc,borrastring))

masmasstring = list(map(creaalfin,masstring))



def primemayus(x):
  return x.title()

def todomayus(x):
  return x.upper()



if IN[3] == 1:
  OUT = list(map(primemayus,masmasstring))



elif IN[3] == 2:
  OUT = list(map(todomayus,masmasstring))



else:
  OUT = masmasstring

Así que con esto ya tenemos nuestro editor de código de texto con Dynamo usando unas pocas líneas de Python. Podemos añadir otras funcionalidades como textos en medio del parámetro, identificador de patrones para su sustitución, y demás. Pero conviene que no metamos demasiadas funcionalidades a un mismo nodo de Dynamo, porque recordad una máxima para todo arquitecto e ingeniero que se precie: LO QUE SIRVE PARA TODO NO SIRVE PARA NADA.

 

NOTA:

#Si quisiéramos eliminar caracteres del final del texto 
#sólo habría que cambiar el código de esta parte :

#(...)
def borra(x):
return x[IN[4]:]
#(...)

#Por este otro.
#(...)
def borra(x):
return x[:IN[4]]
#(...)

 

Y ya sabéis, si os gusta lo que habéis visto ¡compartir es vivir!

*Este código estará subido en breve dentro de un módulo a la biblioteca de módulos Dynamo en la nube, con la categoría BIMEC.

————————————————————-

Javier Hernández Guadalupe (jhguadalupe.info) imparte clases de dynamo en BIM en Casa, además de ejercer la profesión de Arquitecto Superior como autónomo y como consultor BIM en BIMEC.
[wpdevart_like_box profile_id=»1374899126133914″ connections=»show» width=»300″ height=»200″ header=»small» cover_photo=»show» locale=»en_US»]

CC BY-NC 4.0 Editor de parametros de texto con Dynamo por Especialista3D está licenciado bajo una Licencia Creative Commons Atribución-NoComercial 4.0 Internacional.