======Creación de macros====== >Tutorial básico sobre cómo crear macros (scrips de comandos de Rhino) Puede crear **macros** en Rhino para automatizar muchas tareas, personalizar los comandos y mejorar su flujo de trabajo. Puede haber cierta confusión sobre el uso del término "scripting”. Se ha utilizado para describir tanto el proceso de escribir macros -de lo que trata esta sección- como para escribir scripts más sofisticados en [[https://developer.rhino3d.com/guides/rhinoscript/|RhinoScript]], [[https://developer.rhino3d.com/guides/rhinopython/|Python]] u otros lenguajes de programación. //En realidad, las dos cosas son muy diferentes.// Escribir funciones en RhinoScript, Python u otros lenguajes de programación es mucho más complejo que crear macros, y requiere ciertos conocimientos y habilidades de programación. //No trataremos esta parte aquí.// Utilizaremos el término "Macro" aquí exclusivamente para describir la unión de cadenas de comandos de Rhino y sus opciones para crear una función automatizada. Se trata de scripting en su nivel más simple, y es fácilmente accesible para el usuario medio de Rhino, incluso si no tiene conocimientos de programación. Lo que necesita es comprender los comandos de Rhino y su estructura, así como una mente lógica y tener ganas de experimentar y depurar. =====Herramientas necesarias===== * Su cerebro :-P * El archivo **Ayuda de Rhino**: lista todos los comandos de Rhino y sus subopciones. Esta es la referencia más importante. Si pulsa F1 (Windows) o la tecla :?: botón de la barra de herramientas (Mac), se abrirá la Ayuda en línea. * El **EditorDeMacros** de Rhino, una interfaz integrada para crear y probar macros. * Saber cómo añadir macros a su flujo de trabajo en forma de alias o botones de la barra de herramientas (se explica [[https://developer.rhino3d.com/guides/general/creating-command-macros/|aquí]]) =====Ya ha utilizado una o dos macros...===== En primer lugar, si es usuario de Rhino, ya es usuario de macros aunque no lo sepa. Muchos de los comandos de Rhino ya están "macroprogramados" para usted. Cuando hace clic en un botón de la barra de herramientas o llama a un comando del menú, suele tratarse de una macro predefinida. Por ejemplo, el botón **Extruir curva plana cerrada** de la barra de herramientas "Sólido" tiene la siguiente macro: //(se muestra V6 para Windows)// {{:rhino:extrudestraightv6solid.png?400|}} Simplemente llama al comando **ExtruirCrv** y lo configura para hacer un sólido cerrado. Veremos lo que hace la parte "Pausa" más adelante. Este es un ejemplo del tipo más simple de macro, que establece una serie de opciones dentro de un único comando para que no tenga que especificarlas cada vez que lo utilice. **ExtruirCrv** tiene varios botones con opciones preestablecidas, **Ahusada, PorCurva, HaciaUnPunto, Sólido=Sí** (o No), etc. Eche un vistazo a las macros de todos los botones de **ExtruirCrv** para ver cómo están dispuestas. En cierto sentido, está haciendo lo mismo que si pulsara o tecleara las opciones de una en una en la línea de comandos. De hecho, las macros son esto: un conjunto de instrucciones para repetir una secuencia de comandos que, de otro modo, introduciría manualmente de uno en uno. Esta programación de opciones para un único comando también puede combinarse con la introducción de datos (es decir, coordenadas u otros datos numéricos). También es posible encadenar varios comandos seguidos, para una secuencia automatizada de eventos de manipulación o creación de objetos. > **Nota:** //¿Por qué el uso del guión bajo _? El guión bajo Indica a Rhino que el comando que sigue está en inglés (independientemente del idioma en el que esté ejecutando Rhino) para que su macro sea universal. Si está utilizando Rhino en inglés y no le importa, puede eliminar los guiones bajos de sus macros si lo desea. No afectará a nada. ¿Por qué también el signo de exclamación (!)? El sigo de exclamación cancela cualquier comando anterior que pudiera estar ejecutándose, por seguridad.// ======Para empezar====== Digamos que tiene que colocar una serie de cajas de 10x10x10 con el centro de la cara inferior sobre un punto deseado, y con ese punto que tiene que especificarse ya sea mediante un clic del ratón en la ubicación deseada o introduciendo las coordenadas con el teclado. Podría utilizar el comando estándar Caja (**Esquina a Esquina + Altura**), pero por defecto se colocará el punto de inserción en la primera esquina de la caja. Para tener el punto de inserción donde queremos, es más fácil utilizar el comando Caja, Centro. Se trata del comando Caja con la opción Centro, por lo que tendrá que activarlo en su macro. Abra el **EditorDeMacros** y escriba esto: ! _Box _Center //(Esto es la macro del comando Caja, botón Centro, si lo comprueba.)//\\ Todas las entradas (palabras de comandos y entradas numéricas) deben ir separadas por un espacio. Ahora tenemos que indicar el punto central. Para hacerlo, debe indicar a Rhino que deje de procesar el comando temporalmente y espere una entrada en forma de clic o entrada de teclado. Para ello, introduzca el comando Pausa. ! _Box _Center _Pause Una vez introducidos los datos, puede especificar el tamaño de la caja directamente en el comando. Como la opción Centro del comando Caja quiere una esquina de caja como segunda entrada, puede especificar sus coordenadas X,Y: ! _Box _Center _Pause r5,5 (Por qué la "r"? Queremos que esta coordenada sea relativa al último punto elegido, es decir, el centro inferior de la caja. De lo contrario, la esquina siempre caerá en X5, Y5.) En este punto puede introducir la altura, que en este caso es relativa al punto de inicio original. ! _Box _Center _Pause r5,5 10 Como no es necesaria ninguna otra entrada ni hay opciones posibles, la macro se completa y nuestra caja ya se ha creado. Tenga en cuenta que como queríamos una altura igual a la anchura, otra posibilidad habría sido utilizar Intro en lugar de 10 para la última entrada. ! _Box _Center _Pause r5,5 _Enter Ahora que la macro se está ejecutando, [[rhino:macroscriptsetup|cree un nuevo botón en la barra de herramientas]] y pegue la macro. Asígnele un nombre reconocible, como "Caja centrada inferior 10x10x10”. Tenga en cuenta que, una vez ejecutada la macro, al hacer clic con el botón derecho se repite toda la secuencia de esta macro, por lo que puede utilizarla muchas veces seguidas sin tener que hacer clic en el botón cada vez. > //Nota sobre el comando Pausa:// En versiones anteriores de Rhino, para algunas macros de comandos era necesario utilizar una Pausa por cada selección en pantalla que se necesitaba. Esto dificultaba la creación de macros para comandos que tenían un número indeterminado de selecciones en pantalla. Esto se ha solucionado en las últimas versiones en la mayoría de casos, aunque sigue habiendo algunas excepciones. Para estos casos, ahora existe el comando Multipausa (V6 y posteriores), que básicamente permite al usuario hacer tantas selecciones como necesite sin tener que escribir varios comandos de Pausa en la macro. Por ejemplo, la siguiente macro ! _Polyline _Pause _SelLast funcionará bien para hacer la polilínea, pero no se seleccionará al final. ¿Por qué? Porque la única Pausa es 'absorbida' por la primera selección en la polilínea, por lo que el comando SelLast se ejecuta justo después de la primera selección mientras aún estamos creando la polilínea, y, por lo tanto, no hace nada. La pausa única //permite// terminar la polilínea con tantos puntos como desee, pero ya no tiene que ejecutar SelLast al final de la misma - porque ya se ejecutó y falló. Sin embargo, la siguiente macro ! _Polyline _Multipause _SelLast funciona incluyendo la selección de la polilínea al final porque Multipause incluye //todas// las selecciones de la polilínea, permitiendo que SelLast se ejecute y funcione al final. =====Vamos a complicarnos un poco más…===== Algunos comandos invocan cuadros de diálogo con muchas opciones. Normalmente, esto detiene la macro y espera a que seleccione las opciones deseadas para luego continuar. Dado que desea automatizar, puede omitir el cuadro de diálogo anteponiendo un -guión (también conocido como raya) al comando. A continuación, puede escribir todas sus opciones y la macro se ejecutará hasta el final sin que tenga que intervenir. Algunos comandos tienen varios niveles de subopciones. Si quiere ver lo que hay disponible, escriba el comando en la línea de comandos con el guión y mire las opciones que aparecen. Haga clic en las opciones y compruebe si tienen subopciones. =====Transición de dos curvas abiertas===== Pongamos que quiere realizar repetidamente una **Transición** de dos curvas //ABIERTAS// juntas para formar una superficie. Si utiliza el comando estándar **Transición**, siempre tendrá que pasar por el cuadro de diálogo. Si utiliza la versión **//-Transición//**, podrá evitarlo y todo irá mucho más rápido. Vea lo siguiente: _-Loft _Pause _Type=_Normal _Simplify=_None _Closed=_No _Enter Tenga en cuenta que cuando ejecuta el comando, una pausa le permite elegir sus curvas inmediatamente. Si elimina la pausa, la macro no funcionará si no ha seleccionado sus curvas antes de ejecutarlo. Si ya ha preseleccionado sus curvas, la pausa se ignora de forma inteligente. A continuación, el comando establece todas las opciones especificadas. Una vez hecho esto, crea la superficie y finaliza. Pruébelo con dos curvas abiertas, antes o después de seleccionarlas. Intente modificar una o varias de las opciones, como sustituir Cerrada=Sí o Simplificar=Reconstruir. (Para esto también hay que añadir una línea con Reconstruir=20 o algún otro valor.) =====Modificación usar con curvas cerradas===== Ahora, inténtelo con dos curvas cerradas. Hay un problema. ¿Por qué? Para las curvas cerradas, el comando Transición necesita otra información: la ubicación de la costura. Esto es algo que tiene que estar en la macro en la secuencia correcta. De este modo, puede elegir entre varias opciones de costura automática (que están en un nivel de subopción) o puede ajustarla en pantalla. En cualquier caso, tiene que modificar la macro. Añadir una pausa en el lugar adecuado permite comprobar y ajustar la costura en pantalla: _-Loft _Pause _Pause <-- _Type=_Normal _Simplify=_None _Closed=_No _Enter Añadir un Intro en lugar de la Pausa indica a Rhino que no le importa. Deja la costura como está de manera predeterminada. _-Loft _Pause _Enter <-- _Type=_Normal _Simplify=_None _Closed=_No _Enter También puede especificar otra opción de costura de la Transición bajando al nivel de subopción de costura: _-Loft _Pause _Natural <-- _Enter <-- _Type=_Normal _Simplify=_None _Closed=_No _Enter (El Enter después de Natural es necesario para salir del nivel de opciones de "costura" y volver al nivel de opciones de Transición.) //Desafortunadamente, la misma macro no funcionará bien para curvas abiertas y para curvas cerradas debido a la opción extra de costura. Esta es una de las limitaciones del sistema de macros y de la forma en que se han escrito algunos comandos de Rhino.// ======Uso de macros para configurar rápidamente las opciones de la interfaz====== Las macros también pueden utilizarse para establecer automáticamente varias opciones de la interfaz de usuario y de las propiedades del documento sin tener que entrar en el cuadro de diálogo Opciones. Yo uso lo siguiente para configurar la malla de renderizado de la manera que quiero. (Fíjese en el guión delante de -_DocumentProperties.) -_DocumentProperties _Mesh _Custom _MaxAngle=0 _AspectRatio=0 _MinEdgeLength=0 _MaxEdgeLength=0 _MaxEdgeSrf=0.01 _GridQuads=16 _Refine=Yes _JaggedSeams=No _SimplePlanes=No _Enter _Enter ¿Por qué hay dos Enter al final? Se bajaron dos niveles en -_DocumentProperties, primero al nivel _Mesh, luego al subnivel _Custom dentro de _Mesh. Se necesita un Enter para salir del subnivel y volver al nivel principal, y otro más para salir del comando. Algunos guiones pueden necesitar incluso tres Enter. Lo siguiente es de Jeff LaSor, para activar o desactivar el cursor en cruz: Para activar o desactivar el cursor en cruz, ponga lo siguiente en un botón: -_Options _Appearance _Visibility _Crosshairs _Enter _Enter _Enter Fíjese en la referencia a cada nombre de opción de comando individual. Especificarlos dentro del script es como hacer clic sobre ellos con el ratón. Fíjese también en las tres entradas de Enter. Dado que cada opción de comando lleva a un nuevo conjunto de opciones de comando de subnivel, es necesario un Enter para volver a subir. Como este script bajó tres niveles, necesita especificar tres Enter para salir del todo del comando. **EnterEnd** es una buena manera de "retroceder" de un comando sin la necesidad de realizar un seguimiento de a cuántos niveles de profundidad se ha ido - -_Options _Appearance _Visibility _Crosshairs _EnterEnd O, si usa un signo de exclamación **!** al final (que en un script significa "finaliza ahora"), le lleva hasta el final sin importar en cuántos subniveles esté. Tenga en cuenta que si quiere continuar la macro con algo más, no use !, use los Enter en su lugar, de lo contrario la macro siempre se detendrá en el ! y terminará. El script simplemente activa y desactiva los cursores en cruz. Pero si quisiera un script que siempre los activara y otro que siempre los desactivara, serían así: Versión activar siempre: -_Options _Appearance _Visibility _Crosshairs=_Show ! Versión desactivar siempre: -_Options _Appearance _Visibility _Crosshairs=_Hide ! Fíjese en el uso del **!** aquí. Además, tenga en cuenta que puede asignar directamente los valores que pueden tener las opciones en esa opción utilizando el operador '='. La opción _Crosshairs tiene dos valores posibles, "Show" y "Hide", y por lo tanto, eso es lo que se utiliza en la asignación. (Gracias, Jeff) ======Otras herramientas y comandos útiles para crear macros====== Hay algunos trucos útiles para crear macros más complejas. Uno de ellos es el uso discriminado de varios filtros de selección, en particular **SelLast**, que selecciona el último objeto creado/transformado, **SelPrev**, que selecciona el objeto de entrada anterior, y **SelNone**, que anula la selección de todo. También existe la posibilidad de nombrar objetos, agruparlos (y nombrar el grupo) y recuperarlos más tarde por ese nombre de objeto o de grupo. Seleccionar SelÚltimo SelAnterior SelNinguno DefinirNombreDeObjeto DefinirNombreDeGrupo SelGrupo SelNombre Agrupar Desagrupar Para definir un único nombre de objeto (esto en sí mismo es una macro): _Properties _Pause _Object _Name [ponga aquí el nombre del ] _Enter _Enter Para cancelar el nombre de un objeto (sin borrar el objeto) _Properties _Pause _Object _Name “ “ _Enter _Enter (espacio entre las comillas para el nombre) =====Ejemplos en los que se utilizan las herramientas mencionadas===== Mire la siguiente macro: _Select _Pause _Setredrawoff _BoundingBox _World _Enter _Selnone _Sellast _OffsetSrf _Solid _Pause _Delete _Sellast _BoundingBox _World _Enter _Delete _Setredrawon Crea un cuadro delimitador desfasado alrededor de un objeto. El usuario introduce el desfase. Trate de seguir la secuencia lógica. El Setredrawoff/on detiene/reinicia la actualización de la pantalla, elimina el parpadeo de la pantalla mientras se ejecuta todo y acelera el proceso. Cuidado, si termina el comando antes de Setredrawon, pensará que Rhino se ha bloqueado, ya que la pantalla ya no se actualiza. Si eso ocurre, no se asuste, escriba el comando **Setredrawon** para restablecer la actualización de la pantalla. **//Como ejemplo final,//** la siguiente macro crea un punto centrado en un objeto 2D plano o de texto y agrupado con él. Presupone que está en la misma vista en la que se creó el texto, y que el objeto es realmente 2D y plano. (De lo contrario, es probable que no funcione.) Fíjese en el uso de un grupo con nombre y varios comandos de selección. El comando **NoEcho** detiene temporalmente la información en la línea de comandos, lo cual, combinado con Setredrawoff/on hace que la macro se ejecute sin parpadeos y sin demasiada información en el historial de comandos. Sin embargo, también funcionará sin ellos. _Select _Pause _Noecho _Setredrawoff _Group _Enter _SetGroupName TexTemp _BoundingBox _CPlane _Enter _SelNone _SelLast _PlanarSrf _SelPrev _Delete _SelLast _AreaCentroid _Delete _Sellast _SelGroup TexTemp _Ungroup _Group _Setredrawon //última edición: 28.08.19/msh// **Puede añadir información o editar este tutorial** Se trata de una versión en progreso...