ToonzScript¶
ToonzScript es el lenguaje de scripting usado en OpenToonz. Usar ToonzScript permite a los usuarios crear secuencias de comandos, evitando así la necesidad de realizar tareas repetitivas de forma manual. ToonzScript está basado en QtScript y utiliza el estándar ECMAScript. Es posible encontrar una guía de referencia del estándar ECMAScript en la siguiente URL:
Referencia de ECMAScript (en inglés)
Nota
Muchos lenguajes de scripting conocidos están basados en el estándar ECMAScript como JavaScript, JScript, y ActionScript. La sintaxis de ToonzScript es similar a la de JavaScript, por esta razón, una buena introducción a JavaScript puede resultar muy útil para una mejor comprensión de los fundamentos de ToonzScript.
La página original de ToonzScript conteniendo algunos ejemplos (bastante antiguos) se encuentra disponible en la siguiente URL:
Página de ToonzScript (en inglés)
Es posible ejecutar scripts usando el comando Archivo → Scripts → Ejecutar script...
. Alternativamente, es posible ingresar y ejecutar comandos directamente en la Consola de scripts, que puede ser abierta usando el comando Archivo → Scripts → Abrir consola de scripts...
.
Nota
Cuando un script se encuentra en ejecución, la Consola de scripts se abrirá de forma automática para mostrar los comandos contenidos en el mismo.
Administración de archivos¶
La extensión de los archivos de ToonzScript es .js, los scripts deben encontrarse en la carpeta OpenToonz stuff/library/script
, para poder ser recuperados automáticamente al abrir el explorador de la función Ejecutar script.
Uso de la Consola de comandos¶
La Consola de comandos permite al usuario ingresar directamente comandos; además de esto también es posible arrastrar y soltar archivos de texto externos en la consola, lo cual insertará automáticamente la ruta de dichos archivos en la misma.
La interfaz de programa no se verá bloqueada mientras se ejecute una serie de comandos ingresados desde la consola.
Convenciones de uso de la consola¶
Se implementan las siguientes convenciones para el uso de la Consola de scripts:
- Sólo es posible editar el texto del último párrafo.
- Las teclas de flechas hacia Arriba y Abajo permiten la navegación del historial de comandos.
- La ejecución de comandos que demoren no bloqueará la interacción con la interfaz del programa.
- El atajo Ctrl+Y interrumpirá la ejecución de comandos que estén demorando.
- Al ingresar una ruta como parte de una cadena de texto, todas las barras invertidas deben ser duplicadas. Siguiendo esa regla, la ruta:
C:\tmp\prueba.jpg
quedaría comoC:\\tmp\\prueba.jpg
. - Aún trabajando bajo un sistema operativo de la familia Windows, la barra y la barra invertida pueden ser usadas con el mismo efecto, así la ruta
C:\tmp\prueba.jpg
será equivalente a la rutaC:/tmp/prueba.jpg
. - Al arrastrar y soltar un archivo externo sobre la consola, se generará una cadena de texto conteniendo la ruta a dicho archivo, cuyas barras invertidas serán automáticamente duplicadas.
- Si bien es posible copiar varias líneas de texto desde la consola, sólo se permite pegar una línea de texto.
Especificaciones de ToonzScript¶
Construido sobre las bases de ECMAScript, ToonzScript mantiene un cierto grado de similitud con la sintaxis de JavaScript, sin embargo al mismo tiempo, implementa algunas funciones y varias clases específicamente creadas para hacer más sencilla la interacción con la arquitectura de software de OpenToonz. A continuación se ofrece una lista de las especificaciones de ToonzScript:
Comandos¶
- print(arg1, arg2, …): escribe un mensaje en la consola.El comando print no devuelve el valor
undefined
.
Ejemplo:
print(“result=”,12*3);
- run(nombredearchivo): ejecuta el script guardado en nombredearchivo.Las rutas relativas se refieren a la carpeta «<opentoonz library>/scripts/»
Ejemplos:
run(“test.js”)
run(“C:\\Users\\Username\\Tests\\another_test.js”)
- view(imagen): permite ver una imagen.Es posible usar legalmente el comando view en el siguiente contexto:
view(new Image(nombredearchivo))
- view(nivel): permite ver un nivel.
Ejemplo:
view(new Level(“C:\\OpenToonz stuff\\sandbox\\drawings\\A.pli”))
- La variable
ToonzVersion
puede ser usada para comprobar la versión actual de OpenToonz.
Clases¶
Para cada clase se listan, el constructor correspondiente, sus métodos y atributos.
File path¶
contiene la ruta a un objeto.
Constructor:
- new FilePath(ruta)
Métodos:
- ruta2 = path.withExtension(e)
- ruta2 = path.withName(nombre)
- ruta2 = path.withParentDirectory(d)
- ruta2 = path.concat(f) - donde f puede ser un FilePath o una cadena
- archivos = path.files() - si archivos es una carpeta, entonces este método devuelve los archivos dentro de esa carpeta.
Atributos:
- path.extension - atributo de lectura y escritura
- path.name - atributo de lectura y escritura
- path.parentDirectory - atributo de lectura y escritura
- path.lastModified - atributo de sólo lectura
- path.exists - atributo de sólo lectura
- path.isDirectory - atributo de sólo lectura
Ejemplos:
myRoot = new FilePath(“C:\\Users\\username\\”);
f = myRoot.concat(“tests”).concat(“name.0001.tif”);
print(f.extension); // => “tif”
print(f.name); // => “name”
print(f.parentDirectory); // => “C:\Users\username\tests”
if(f.exists) print(“the file “,f,”exists”); else print(“the file “,f,”does not exist”);
d = new Date().getTime() - f.lastModified.getTime();
d.setDate(d.getDate()-1);
if(f.lastModified>=d) print(“file modified in the last 24 hours);
files = myRoot.files();
for(k in files) print(files[k]); // print all files in myRoot
Image¶
contiene una imagen, los tipos soportados son: tlv, pli y fullcolor.
Constructor:
- new Image() o new Image(nombredearchivo)
Métodos:
- img.save(nombredearchivo) - la extensión del archivo tiene que ser compatible con el tipo de nivel usado
- img.load(nombredearchivo)
Atributos:
- img.width - tendrá valor 0 si la imagen es de tipo pli
- img.height - tendrá valor 0 si la imagen es de tipo pli
- img.dpi - tendrá valor 0 si la imagen es de tipo pli
- img.type - valores aceptados (“Empty”, “Raster”, “ToonzRaster”, “Vector”)
Ejemplos:
img = new Image(“C:/images/basename.0003.tif”);
view(img);
print(img.width,img.height,img.dpi);
img = new Image(“C:/images/name.pli”); // reads only the first frame.
view(img);
img.save(“C:/images/name.pli”);
Level¶
contiene un nivel, los tipos soportados son: tlv, pli y fullcolor.
Constructor:
- new Level() o new Level(nombredearchivo)
Métodos:
- level.load(nombredearchivo)
- level.save(nombredearchivo) - la extensión del archivo tiene que ser compatible con el tipo de nivel usado
- level.getFrameIds() - lista los nombres de todos los fotogramas
- level.getFrame(IDfotograma) - recupera la imagen del fotograma especificado
- level.getFrameByIndex(índice) - obtiene el fotograma especificado por el valor índice (el primer valor de índice es 0)
- level.setFrame(IDfotograma, imagen) - define un fotograma (si el nivel no se encuentra vacío, su contenido y el tipo de imagen deben ser compatibles)
Atributos:
- level.name - atributo de lectura y escritura
- level.path - atributo de lectura y escritura
- level.frameCount - atributo de sólo lectura
- level.type (“Empty”, ”Raster”, ”ToonzRaster”, ”Vector”) - atributo de sólo lectura
Ejemplos:
// This example produces a "renumber"
inputLevel= new Image(“C:/images/name.pli”);
outputLevel = new Level();
for(i=0;i<inputLevel.frameCount;i++)
{
outputLevel.setFrame(i+1, inputLevel.getFrameByIndex(i));
outputLevel.save(“C:/images/name.pli”);
}
// instead this keeps the sequence of frames, but reverses the order
outputLevel = new Level();
fids = inputLevel.getFrameIds();
for(i=0;i<fids.length;i++)
{
img = inputLevel.getFrame(fids[fids.length-1-i]);
outputLevel.setFrame(fids[i], img);
}
view(outputLevel);
Scene¶
contiene una escena de OpenToonz.
Constructor:
- new Scene() o new Scene(nombredearchivo)
Métodos:
- scene.load(nombredearchivo)
Nota
Si la ruta es relativa, se usarán escenas del proyecto actual.
- scene.save(nombredearchivo)
- scene.setCel(fila, columna, celda) , scene.setCell(fila, columna, nivel, IDfotograma)
Nota
celda
es la clase de objeto devuelto por getCell()
.
- La siguiente sintaxis es permitida
scene.setCell(1, 0, scene.getCell(0,0))
- Para borrar una celda:
scene.setCell(fila, columna, nodefinido)
celda
es un objeto estándar de JavaScript que incluye los atributos:nivel
yidf
, se permite el siguiente uso:scene.setCell(fila, columna, {nivel:a, idf:1})
nivel
puede ser tanto Level como el nombre de un nivel. El nivel ya tiene que existir en la escena.idf
soporta valores numéricos o cadenas como “2” o “2a”.
- celda = scene.getCell(fila, columna) - devuelve un objeto de JavaScript con los atributos nivel e idf
- scene.insertColumn(columna)
- scene.deleteColumn(columna)
- scene.getLevels() - devuelve un array que contiene todos los niveles pertenecientes a la escena
- scene.getLevel(nombre) - devuelve un nivel basándose en su nombre. Si no existiera un nivel con el nombre especificado el valor
undefined
será devuelto. - nivel = scene.newLevel(tpo, nombre) - Agrega una capa a la escena. Tipo puede ser «Raster», «ToonzRaster» o «Vector». El nombre no debe estar ya en uso en la escena.
- level = scene.loadLevel(nombre, ruta) - Carga un nivel (en modo “«enlace») a la escena. La ruta debe existir y ser absoluta. El nombre no debe estar siendo usado por ningún otro nivel de la escena.
Atributos:
- scene.frameCount - valor de sólo lectura
- scene.columnCount - valor de sólo lectura
Ejemplos:
filename = “test.tnz”; // relative to “+scenes”
scene = new Scene(filename);
print(scene.frameCount, scene.columnCount);
// Move the cells of the first column on the first frame of the other columns.
for(r=1;r<scene.frameCount;r++)
{
scene.setCell(0,r, scene.getCell(r,0));
scene.setCell(r,0,undefined); // delete the old cell.
}
scene.save(“name.tnz”);
//Create a new scene.
scene = new Scene();
level = scene.load(“A”,”C:/levels/name.pli”);
fids = level.getFrameIds();
for(i=0;i<fids.length;i++) scene.setCell(i,0,level,fids[i]);
scene.save(“name.tnz”);
// writes name, path and number of frames of each level in the scene.
scene = new Scene(“name.tnz”);
levels = scene.getLevels();
for(i=0;i<levels.length;i++)
{
level = levels[i];
print(level.name, level.path, level.frameCount);
}
Transform¶
representa una transformación geométrica (compuesta por rotación, traslación y escala). Usada por ImageBuilder.
Constructor:
- new Transform()
Métodos:
- transform.translate(dx, dy)
- transform.rotate(grados)
Nota
Valores positivos corresponden a una rotación en sentido antihorario.
- transform.scale(e)
- transform.scale(ex, ey)
Ejemplos:
transform = new Transform().rotate(45).translate(10,2);
print(transform);
ImageBuilder¶
permite modificar una imagen (rotarla, escalarla, recortarla) o componer una o más imágenes sobre otras.
Constructor:
- new ImageBuilder() o new ImageBuilder(resx, resy)
Métodos:
- builder.add(imagen)
- builder.add(imagen, transformación)
Nota
El componente de traslación de la transformación se encuentra expresado en píxeles para niveles de Imagen de Toonz o Imagen, y en unidades de cámara para niveles Vectorial de Toonz.
- builder.fill(color)
Atributos:
- builder.image - devuelve el resultado actual.
Ejemplos:
ib = new ImageBuilder(800,800);
img = new Image(“C:/levels/name.0001.tif”);
scale = 1;
phi = 0;
for(i=0;i<20;i++)
{
tr = new Transform().scale(scale).translate(0,-200).rotate(phi);
ib.add(img, tr);
phi -= scale*30;
scale *= 0.9;
}
view(ib.image);
OutlineVectorizer¶
vectoriza imágenes usando el algoritmo de contornos.
Constructor:
- new OutlineVectorizer()
Métodos:
- v.vectorize(nivel o imagen) - devuelve el nuevo nivel vectorizado, soporta como entrada: niveles de Imagen de Toonz o Imagen.
Atributos:
- v.accuracy
- v.despeckling
- v.preservePaintedAreas
- v.cornerAdherence
- v.cornerAngle
- v.cornerCurveRadius
- v.maxColors
- v.transparentColor
- v.toneThreshold
Ejemplos:
v = new OutlineVectorizer();
v.preservePaintedAreas = true;
a = new Image("C:/Users/username/name.tif");
b = v.vectorize(a);
view(b);
CenterlineVectorizer¶
vectoriza imágenes usando el algoritmo de líneas.
Constructor:
- new CenterlineVectorizer()
Métodos:
- v.vectorize(nivel o imagen) - devuelve el nuevo nivel vectorizado, soporta como entrada: niveles de Imagen de Toonz o Imagen.
Atributos:
- v.threshold
- v.accuracy
- v.despeckling
- v.maxThickness
- v.thicknessCalibration
- v.preservePaintedAreas
- v.addBorder
Ejemplos:
v = new OutlineVectorizer();
v.preservePaintedAreas = true;
a = new Image("C:/Users/username/name.tif");
b = v.vectorize(a);
view(b);
Rasterizer¶
convierte imágenes vectoriales en Imágenes de Toonz o Imágenes.
Constructor:
- new Rasterizer()
Métodos:
- out = r.rasterize(imagenvect) - convierte en imagen un nivel vectorial
Atributos:
- r.colorMapped - si su valor está definido como True la imagen generada será de tipo Imagen de Toonz
- r.xres
- r.yres
- r.dpi
Ejemplos:
a = new Level("C:\\Users\\username\\PLI\\name.pli");
r= new Rasterizer();
r.xres=768; r.yres=576; r.dpi=40;
b = r.rasterize(a);
b.save(“C:\\Users\\username\\PLI\\name.tif”);
r.colorMapped = true
c = r.rasterize(new Level("C:\\Users\\username\\PLI\\name.pli"))
c.save(“C:\\Users\\username\\PLI\\bimba.tlv”);
Renderer¶
procesa una escena completa o una parte de ella, creando niveles o imágenes.
Constructor:
- new Renderer()
Métodos:
- level = c.renderScene(escena)
- image = c.renderFrame(escena, IDfotograma)
Nota
IDfotograma comienza desde 0
Atributos:
- r.columns (lista de índices de las columnas a procesar. p.ej: r.columns = [0,3])
- r.frames (lista de índices de los fotogramas a procesar. p.ej: r.frames = [0,1,2,3])
Ejemplos:
scene = new Scene("testscene.tnz”);
r= new Rasterizer();
view(r.renderScene(scene ,0));
r.columns = [0,2];
view(r.renderScene(a,0)); // frame 1; columns 1 and 3
r.frames = [0,2,4,6];
output = r.renderScene(scene ); // frames 1,3,5,7; columns 1 and 3
output.save(“C:\\Users\\username\\output\\name..tif”);
r.columns = [];
output = r.renderScene(scene ); // frames 1,3,5,7; all columns
output.save(““C:\\Users\\username\\output\\name..tif””);
Ejemplos de código¶
A continuación se presentan algunos ejemplos de código de scripts:
Vectorización de contornos¶
Este breve script es un ejemplo de cómo usar OutlineVectorizer en una única imagen. El script se encuentra comentado, explicando lo que hace cada sección:
//Define the input and output folders
dir = "C:\\OpenToonz stuff\\SCRIPT IMAGES IN\\";
dir2 = "C:\\OpenToonz stuff\\SCRIPT IMAGES OUT\\";
//Load image toad3.0001.tif from disk
a = new Image(dir+"toad3.0001.tif");
print("loaded",a);
//Initialize a vectorizer and specify any relevant options
v = new OutlineVectorizer();
v.maxThickness = 1;
v.preservePaintedAreas = false;
v.accuracy = 10;
v.maxColors = 10;
//Run the vectorization process and save the result
v.vectorize(a).save(dir2 + "vec.pli");
print("vectorized");
Rotación de una imagen¶
Este ejemplo explica cómo cargar una imagen y luego crear una animación en un nivel, rotando dicha imagen:
\\Define the input and output folders
dir = "C:\\OpenToonz stuff\\SCRIPT IMAGES IN\\";
dir2 = "C:\\OpenToonz stuff\\SCRIPT IMAGES OUT\\";
//Load the toad3.tif image
a = new Level(dir+"toad3..tif");
print("loaded\n",a);
//Initialization of the new objects and creation of a list containing the IDs of all the frames
t = new Transform();
b=new Level();
ll=a.getFrameIds();
//For loop that builds the new level. At each step a new frame is added to the level b using the
setFrame method that adds the myimage frame rotated of a step degrees value using the ib ImageBuilder
for(i=0; i<a.frameCount;i++)
{
ib = new ImageBuilder();
step=360/a.frameCount;
myimage=a.getFrame(ll[i]);
b.setFrame(ll[i], ib.add(myimage, t.rotate(step)).image);
print("building frame " + ll[i] + "\n");
}
//Save the result prompting a status message
b.save(dir2+"rottoad3..tif")
print("saved\n",b);
//Shows the resulting level in a flipbook window
view(b);