Una vez que sabemos cómo crear un proyecto Zero-Touch, podemos profundizar en los detalles de la creación de un nodo mediante el ejemplo ZeroTouchEssentials en el GitHub de Dynamo.
Muchos de los nodos estándar de Dynamo son básicamente nodos Zero-Touch, como la mayoría de los nodos Math, Color y DateTime anteriores.
Para empezar, descargue el proyecto ZeroTouchEssentials desde aquí: https://github.com/DynamoDS/ZeroTouchEssentials.
En Visual Studio, abra el archivo ZeroTouchEssentials.sln
y compile la solución.
El archivo
ZeroTouchEssentials.cs
contiene todos los métodos que se importarán en Dynamo.
Abra Dynamo e importe ZeroTouchEssentials.dll
para obtener los nodos a los que haremos referencia en los ejemplos siguientes.
Los ejemplos de código se extraen de ZeroTouchEssentials.cs y, en general, coinciden con él. Se ha eliminado la documentación XML para mantener la brevedad y cada ejemplo de código creará el nodo de la imagen superior.
Dynamo admite la definición de valores por defecto para los puertos de entrada de un nodo. Estos valores por defecto se proporcionarán al nodo si los puertos no tienen conexiones. Los valores por defecto se expresan mediante el mecanismo de C# de especificación de argumentos opcionales en el manual de programación de C#. Los valores por defecto se especifican de la siguiente forma:
Establezca los parámetros del método en un valor por defecto: inputNumber = 2.0
.
El valor por defecto se mostrará al colocar el cursor sobre el puerto de entrada del nodo.
La devolución de varios valores es algo más complejo que crear varias entradas y será necesario usar un diccionario para ello. Las entradas del diccionario se convierten en puertos en el lado de salida del nodo. Se crean varios puertos de devolución de la siguiente forma:
Añada using System.Collections.Generic;
para utilizar Dictionary<>
.
Añada using Autodesk.DesignScript.Runtime;
para utilizar el atributo MultiReturn
. Esto hace referencia a "DynamoServices.dll" desde el paquete NuGet de DynamoServices.
Añada el atributo [MultiReturn(new[] { "string1", "string2", ... more strings here })]
al método. Las cadenas hacen referencia a claves del diccionario y se convertirán en nombres de puertos de salida.
Se devuelve Dictionary<>
desde la función con claves que coinciden con los nombres de parámetro del atributo, return new Dictionary<string, object>
.
Consulte este ejemplo de código en ZeroTouchEssentials.cs.
Un nodo que devuelve varias salidas.
Observe que ahora hay dos puertos de salida a los que se les ha asignado un nombre en función de las cadenas que hemos introducido para las claves del diccionario.
Se recomienda añadir documentación a los nodos de Dynamo que describa su función, entradas, salidas, etiquetas de búsqueda, etc. Esto se realiza mediante etiquetas de documentación XML. La documentación XML se crea de la siguiente forma:
Cualquier comentario precedido de tres barras inclinadas se considera documentación.
Por ejemplo, /// Documentation text and XML goes here
.
Después de las tres barras, cree etiquetas XML por encima de los métodos que Dynamo leerá al importar el archivo .dll.
Por ejemplo, /// <summary>...</summary>
.
Active la documentación XML en Visual Studio. Para ello, seleccione Project > Project Properties > Build
y active XML documentation file
.
Visual Studio generará un archivo XML en la ubicación especificada.
Los tipos de etiquetas son los siguientes:
/// <summary>...</summary>
es la documentación principal del nodo y aparecerá como información de herramientas sobre el nodo en la barra lateral de búsqueda izquierda.
/// <param name="inputName">...</param>
creará documentación para parámetros de entrada específicos.
/// <returns>...</returns>
creará documentación para un parámetro de salida.
/// <returns name = "outputName">...</returns>
creará documentación para varios parámetros de salida.
/// <search>...</search>
asociará el nodo con los resultados de búsqueda basados en una lista separada por comas. Por ejemplo, si creamos un nodo que subdivide una malla, es posible que deseemos añadir etiquetas como, por ejemplo, "malla", "subdivisión" y "catmull-clark".
A continuación, se muestra un nodo de ejemplo con descripciones de entrada y salida, así como un resumen que aparecerá en la biblioteca.
Consulte este código de ejemplo en ZeroTouchEssentials.cs.
Tenga en cuenta que el código de este nodo de ejemplo contiene lo siguiente:
Un resumen del nodo
Una descripción de la entrada
Una descripción de la salida
Dynamo no cuenta con una palabra clave new
, por lo que los objetos deberán generarse mediante métodos de creación estáticos. Los objetos se crean de la siguiente forma:
Cree el constructor interno internal ZeroTouchEssentials()
, a menos que se requiera lo contrario.
Cree el objeto con un método estático como, por ejemplo, public static ZeroTouchEssentials ByTwoDoubles(a, b)
.
Nota: Dynamo utiliza el prefijo "By" para indicar que un método estático es un constructor y, aunque es opcional, su uso ayudará a que la biblioteca se ajuste mejor al estilo de Dynamo existente.
Consulte este código de ejemplo en ZeroTouchEssentials.cs.
Una vez que se haya importado el archivo dll ZeroTouchEssentials, habrá un nodo ZeroTouchEssentials en la biblioteca. Este objeto se puede crear mediante el nodo ByTwoDoubles
.
Las bibliotecas de Dynamo pueden utilizar tipos de geometría nativa de Dynamo como entradas y crear nueva geometría como salidas. Los tipos de geometría se crean de la siguiente forma:
Haga referencia a "ProtoGeometry.dll" en el proyecto. Para ello, incluya using Autodesk.DesignScript.Geometry;
en la parte superior del archivo de C# y añada el paquete NuGet ZeroTouchLibrary al proyecto.
Importante: Administre los recursos de geometría que no se devuelven a partir de las funciones. Consulte la sección Instrucciones "Dispose" o "using" mostrada a continuación.
Nota: Los objetos de geometría de Dynamo se utilizan como cualquier otro objeto transferido a funciones.
Consulte este código de ejemplo en ZeroTouchEssentials.cs.
Un nodo que obtiene la longitud de una curva y la duplica.
Este nodo acepta un tipo de geometría de curva como entrada.
Los recursos de geometría que no se devuelven a partir de las funciones deberán administrarse manualmente, a menos que se utilice la versión 2.5 o posterior de Dynamo. En Dynamo 2.5 y versiones posteriores, el sistema administra internamente los recursos de geometría. Sin embargo, es posible que aún deba eliminar la geometría manualmente si se trata de un caso de uso complejo o tiene que reducir la memoria en un determinado momento. El motor de Dynamo gestionará los recursos de geometría que se devuelvan a partir de las funciones. Los recursos de geometría que no se devuelven se pueden gestionar manualmente de las siguientes formas:
Con una instrucción "using", como se muestra a continuación:
Puede encontrar documentación sobre la instrucción "using" aquí.
Consulte el artículo sobre mejoras en la estabilidad de la geometría de Dynamo para obtener más información sobre las nuevas funciones de estabilidad introducidas en Dynamo 2.5.
Se muestra lo siguiente con llamadas manuales a "Dispose":
Al publicar una versión más reciente de una biblioteca, los nombres de nodo pueden cambiar. Los cambios de nombre se pueden especificar en un archivo de migraciones para que los gráficos generados en versiones anteriores de una biblioteca sigan funcionando correctamente cuando se realice una actualización. Las migraciones se implementan de la siguiente forma:
Cree un archivo .xml
en la misma carpeta que el archivo .dll
con el siguiente formato: "BaseDLLName".Migrations.xml.
En el archivo .xml
, cree un único elemento <migrations>...</migrations>
.
En el elemento de migraciones, cree elementos <priorNameHint>...</priorNameHint>
para cada cambio de nombre.
Para cada cambio de nombre, proporcione un elemento <oldName>...</oldName>
y <newName>...</newName>
.
Haga clic con el botón derecho y seleccione
Add > New Item
.Seleccione
XML File
.En este proyecto, al archivo de migraciones se le asignará el nombre
ZeroTouchEssentials.Migrations.xml
.
Este código de ejemplo indica a Dynamo que cualquier nodo con el nombre GetClosestPoint
ahora se denomina ClosestPointTo
.
Consulte este ejemplo de código en ProtoGeometry.Migrations.xml.
Zero-Touch no admite actualmente el uso de genéricos. Se pueden utilizar, pero no en el código que se importa directamente en la ubicación en la que no se ha establecido el tipo. No se pueden mostrar las clases, las propiedades o los métodos genéricos para los que no se haya establecido el tipo.
En el siguiente ejemplo, no se importará un nodo Zero-Touch de tipo T
. Si el resto de la biblioteca se importa en Dynamo, se mostrarán excepciones de tipo no encontrado.
Si se utiliza un tipo genérico con el tipo definido en este ejemplo, se importará a Dynamo.