Con el tiempo, puede que necesite ir más allá de los conceptos básicos y profundizar en el funcionamiento interno de Dynamo. Las páginas de esta sección le proporcionarán un esquema para descubrir las funciones avanzadas de Dynamo for Civil 3D a fin de que pueda llevar sus gráficos al siguiente nivel.
Dynamo for Civil 3D contiene un mecanismo muy eficaz para "recordar" los objetos que crea cada nodo. Este mecanismo se denomina Enlace de objetos y permite que un gráfico de Dynamo genere resultados coherentes cada vez que se ejecuta en el mismo documento. Aunque esto es muy deseable en muchas situaciones, hay otras en las que es posible que desee tener más control sobre el comportamiento de Dynamo. Esta sección le ayudará a comprender cómo funciona el enlace de objetos y cómo puede aprovecharlo.
Observe este gráfico que crea un círculo en el espacio modelo de la capa actual.
Observe lo que sucede cuando se cambia el radio.
Esto es un enlace de objetos en acción. El comportamiento por defecto de Dynamo es modificar el radio del círculo en lugar de crear un nuevo círculo cada vez que se modifica la entrada del radio. Esto se debe a que el nodo Object.ByGeometry "recuerda" que crea este círculo específico cada vez que se ejecuta el gráfico. Además, Dynamo guardará esta información para que la próxima vez que abra el documento de Civil 3D y ejecute el gráfico, este presente exactamente el mismo comportamiento.
Veamos un ejemplo en el que puede que desee cambiar el comportamiento por defecto de enlace de objetos de Dynamo. Supongamos que desea crear un gráfico que coloque texto en el centro de un círculo. Sin embargo, lo que pretende con este gráfico es que pueda ejecutarse una y otra vez, y colocar cada vez un nuevo texto para cualquier Círculo que se seleccione. Este es el aspecto que presentaría el gráfico.
Sin embargo, esto es lo que sucede realmente cuando se selecciona un círculo diferente.
Parece que el texto se suprime y se vuelve a crear con cada ejecución del gráfico. En realidad, la posición del texto se modifica en función del círculo seleccionado. Por lo tanto, es el mismo texto, solo que en un lugar diferente. Para crear un nuevo texto cada vez, debemos modificar la configuración de enlace de objetos de Dynamo para que no se conserve ningún dato de enlace (consulte #binding-settings a continuación).
Tras realizar ese cambio, obtenemos el comportamiento que buscamos.
Dynamo for Civil 3D permite modificar el comportamiento por defecto de enlace de objetos a través de los parámetros de Almacenamiento de datos de enlace en el menú de Dynamo.
Tenga en cuenta que las opciones de almacenamiento de datos de enlace están disponibles en Civil 3D 2022.1 y versiones posteriores.
Todas las opciones están activadas por defecto. A continuación, se resumen las acciones de cada opción.
Si esta opción está activada, Dynamo "olvidará" los objetos que creó la última vez que se ejecutó el gráfico. De este modo, el gráfico puede ejecutarse en cualquier dibujo y situación, y creará nuevos objetos cada vez.
Cuándo utilizar esta opción
Utilice esta opción cuando desee que Dynamo "olvide" todo lo que ha realizado en ejecuciones anteriores y cree nuevos objetos cada vez.
Esta opción permite serializar los metadatos de enlace de objetos en el gráfico (archivo .dyn) al guardarlo. Si cierra o vuelve a abrir el gráfico y lo ejecuta en el mismo dibujo, todo debería funcionar igual que lo dejó. Si ejecuta el gráfico en un dibujo diferente, los datos de enlace se eliminarán del gráfico y se crearán nuevos objetos. Esto significa que, si abre el dibujo original y vuelve a ejecutar el gráfico, se crearán nuevos objetos, además de los antiguos.
Cuándo utilizar esta opción
Utilice esta opción cuando desee que Dynamo "recuerde" los objetos que creó la última vez que se ejecutó en un dibujo específico.
Esta opción es la más adecuada para situaciones en las que es posible mantener una relación de 1:1 entre un dibujo específico y un gráfico de Dynamo. Las opciones 1 y 3 son más idóneas para gráficos diseñados para ejecutarse en varios dibujos.
Es similar a la opción 2, salvo que los datos de enlace de objetos se serializan en el dibujo en lugar de en el gráfico (archivo .dyn). Si cierra o vuelve a abrir el gráfico y lo ejecuta en el mismo dibujo, todo debería funcionar igual que lo dejó. Si ejecuta el gráfico en un dibujo diferente, los datos de enlace se conservan en el dibujo original, ya que se guardan en el dibujo y no en el gráfico.
Cuándo utilizar esta opción
Utilice esta opción cuando desee utilizar el mismo gráfico en varios dibujos y conseguir que Dynamo "recuerde" lo que realizó en cada uno de ellos.
Lo primero que hay que tener en cuenta con esta opción es que no afecta al modo en que el gráfico interactúa con el dibujo cuando se ejecuta el gráfico a través de la interfaz principal de Dynamo. Esta opción solo se aplica cuando el gráfico se ejecuta con el Reproductor de Dynamo.
Si es la primera vez que utiliza el Reproductor de Dynamo, consulte la sección Reproductor de Dynamo.
Si ejecuta el gráfico mediante la interfaz principal de Dynamo y, a continuación, cierra y ejecuta el mismo gráfico mediante el Reproductor de Dynamo, este creará nuevos objetos sobre los que creó anteriormente. Sin embargo, una vez que el Reproductor de Dynamo haya ejecutado el gráfico una vez, serializará los datos de enlace de objetos en el dibujo. Por lo tanto, si ejecuta el gráfico varias veces a través del Reproductor de Dynamo, este actualizará los objetos en lugar de crear otros nuevos. Si ejecuta el gráfico a través del Reproductor de Dynamo en un dibujo diferente, los datos de enlace seguirán conservándose en el dibujo original, ya que se guardan en el dibujo y no en el gráfico.
Cuándo utilizar esta opción
Utilice esta opción cuando desee ejecutar un gráfico con el Reproductor de Dynamo en varios dibujos y que este "recuerde" lo que realizó en cada uno de ellos.
Aunque Dynamo es extremadamente eficaz como herramienta de programación visual, también es posible ir más allá de los nodos y los cables, y escribir código en forma de texto. Existen dos formas de hacerlo:
Escribir DesignScript mediante un bloque de código
Escribir Python mediante un nodo de Python
Esta sección se centrará en cómo aprovechar Python en el entorno de Civil 3D para sacar partido de las API de .NET de AutoCAD y Civil 3D.
Consulte la sección Python para obtener información sobre cómo usar Python en Dynamo.
Tanto AutoCAD como Civil 3D disponen de varias API que permiten a desarrolladores como usted ampliar el producto principal con funciones personalizadas. En el contexto de Dynamo, lo pertinente son las API de .NET administrado. Los siguientes vínculos son esenciales para conocer la estructura de las API y su funcionamiento.
Manual para desarrolladores de las API de .NET de AutoCAD
Manual de referencia de las API de .NET de AutoCAD
Manual para desarrolladores de las API de .NET de Civil 3D
Manual de referencia de las API de .NET de Civil 3D
A medida que avance por esta sección, es posible que haya algunos conceptos con los que no esté familiarizado, como bases de datos, transacciones, métodos, propiedades, etc. Muchos de estos conceptos son fundamentales para trabajar con las API de .NET y no son específicos de Dynamo o Python. Está fuera del alcance de esta sección del manual abordar estos temas en detalle, por lo que se recomienda consultar con frecuencia los vínculos anteriores para obtener más información.
Al editar por primera vez un nuevo nodo de Python, este se rellenará previamente con el código de la plantilla para que pueda empezar. A continuación, se muestra un desglose de la plantilla con explicaciones sobre cada bloque.
Importa los módulos
sys
yclr
, que son necesarios para que el intérprete de Python funcione correctamente. En concreto, el móduloclr
permite que los espacios de nombres de .NET se traten básicamente como paquetes de Python.Carga los ensamblajes estándar (es decir, los archivos DLL) para trabajar con las API de .NET administrado para AutoCAD y Civil 3D.
Añade referencias a espacios de nombres estándar de AutoCAD y Civil 3D. Equivalen a las directivas
using
oImports
de C# o VB.NET (respectivamente).Se puede acceder a los puertos de entrada del nodo mediante una lista predefinida denominada
IN
. Puede acceder a los datos de un puerto específico mediante su número de índice como, por ejemplo,dataInFirstPort = IN[0]
.Obtiene el documento y el editor activos.
Bloquea el documento e inicia una transacción de base de datos.
Aquí debe colocar la mayor parte de la lógica de la secuencia de comandos.
Anule los comentarios de esta línea para confirmar la transacción una vez que haya terminado el trabajo principal.
Si desea generar datos del nodo, asígnelo a la variable
OUT
al final de la secuencia de comandos.
¿Desea personalizar la plantilla?
Puede modificar la plantilla de Python por defecto. Para ello, edite el archivo PythonTemplate.py
ubicado en C:\ProgramData\Autodesk\C3D <version>\Dynamo
.
Veamos un ejemplo para mostrar algunos de los conceptos básicos de la escritura de secuencias de comandos de Python en Dynamo for Civil 3D.
A continuación, encontrará archivos de ejemplo que puede consultar para este ejercicio.
A continuación, se ofrece una descripción general de la lógica de este gráfico.
Consultar la documentación de la API de Civil 3D
Seleccionar todas las cuencas vertientes del documento por nombre de capa
"Desenvolver" los objetos de Dynamo para acceder a los miembros internos de la API de Civil 3D
Crear puntos de Dynamo a partir de puntos de AutoCAD
Crear PolyCurves a partir de los puntos
¡Empecemos!
Antes de empezar a crear el gráfico y escribir el código, conviene echar un vistazo a la documentación de la API de Civil 3D y hacerse una idea de lo que esta pone a nuestra disposición. En este caso, hay una propiedad de la clase Catchment que devolverá los puntos de contorno de la cuenca vertiente. Tenga en cuenta que esta propiedad devuelve un objeto Point3dCollection
, que Dynamo desconoce cómo utilizar. En otras palabras, no podremos crear una PolyCurve a partir de un objeto Point3dCollection
, por lo que al final tendremos que convertirlo todo en puntos de Dynamo. Ya abordaremos este tema más adelante.
Ahora podemos empezar a crear la lógica del gráfico. Lo primero que hay que hacer es obtener una lista de todas las cuencas vertientes del documento. Hay nodos disponibles para ello, por lo que no necesitamos incluirla en la secuencia de comandos de Python. El uso de nodos proporciona una mejor visibilidad para otra persona que pueda leer el gráfico (en lugar de incluir mucho código en una secuencia de comandos de Python), y, además, mantiene la secuencia de comandos de Python centrada en un único objetivo, devolver los puntos límite de las cuencas vertientes.
Observe que la salida del nodo All Objects on Layer es una lista de CivilObjects. Esto se debe a que Dynamo for Civil 3D no dispone actualmente de ningún nodo que permita trabajar con cuencas vertientes, que es el motivo por el que necesitamos acceder a la API a través de Python.
Antes de continuar, debemos abordar brevemente un concepto importante. En la sección Biblioteca de nodos, se ha explicado cómo se relacionan los objetos y CivilObjects. Para añadir algo más de detalle, un objeto de Dynamo es una envoltura alrededor de una entidad de AutoCAD. De forma similar, un CivilObject de Dynamo es una envoltura alrededor de una entidad de Civil 3D. Puede "desenvolver" un objeto. Para ello, acceda a sus propiedades InternalDBObject
o InternalObjectId
.
Por regla general, es más seguro obtener el ID de objeto mediante la propiedad InternalObjectId
y, a continuación, acceder al objeto envuelto en una transacción. Esto se debe a que la propiedad InternalDBObject
devolverá un DBObject de AutoCAD que no se encuentra en estado de escritura.
A continuación, se muestra la secuencia de comandos completa de Python que realiza el trabajo de acceder a los objetos de cuenca vertiente internos para obtener sus puntos de contorno. Las líneas resaltadas representan las que se han modificado o añadido a partir del código de plantilla por defecto.
Haga clic en el texto subrayado en la secuencia de comandos para obtener una explicación de cada línea.
Como regla general, es recomendable incluir la mayor parte de la lógica de la secuencia de comandos en una transacción. De este modo, se garantiza un acceso seguro a los objetos que la secuencia de comandos está leyendo o escribiendo. En muchos casos, omitir una transacción puede provocar un error grave.
En esta fase, la secuencia de comandos de Python debería generar una lista de puntos de Dynamo que se pueden ver en la vista preliminar en segundo plano. El último paso consiste en crear simplemente PolyCurves a partir de los puntos. Tenga en cuenta que esto también podría hacerse directamente en la secuencia de comandos de Python, pero lo hemos puesto intencionadamente fuera de ella en un nodo para que resulte más visible. Este es el aspecto del gráfico final.
Y esta es la geometría final de Dynamo.
Apenas una nota rápida aquí antes de terminar. En función de la versión de Civil 3D que esté utilizando, es posible que el nodo de Python se haya configurado de forma diferente. En Civil 3D 2020 y 2021, Dynamo utilizaba una herramienta denominada IronPython para desplazar datos entre objetos .NET y secuencias de comandos de Python. Sin embargo, en Civil 3D 2022, Dynamo realizó la transición al intérprete nativo de Python estándar (también conocido como CPython) que utiliza Python 3. Las ventajas de esta transición incluyen el acceso a las bibliotecas modernas más conocidas y a las nuevas funciones de la plataforma, el mantenimiento esencial y los parches de seguridad.
Puede obtener más información sobre esta transición y sobre cómo actualizar las secuencias de comandos existentes en el blog de Dynamo. Si desea seguir utilizando IronPython, solo tendrá que instalar el paquete de DynamoIronPython2.7 mediante Dynamo Package Manager.
Esta línea obtiene la clase específica que necesitamos de la biblioteca de geometría de Dynamo. Tenga en cuenta que aquí se especifica import Point as DynPoint
en lugar de import *
, ya que este último elemento provocaría conflictos de nombres.
Aquí especificamos exactamente el puerto de entrada que contiene los datos que deseamos en lugar del elemento IN
por defecto, que hace referencia a la lista completa de todas las entradas.
Obtenga la geometría de contorno de todas las cuencas vertientes de un dibujo.
Tipo de Dynamo | Envolturas |
---|---|
¡Misión cumplida!
Objeto Autodesk.AutoCAD.DynamoNodes.Object
Entidad Autodesk.AutoCAD.DatabaseServices.Entity
CivilObject Autodesk.Civil.DynamoNodes.CivilObject
Entidad Autodesk.Civil.DatabaseServices.Entity