6.1.7  Cadenas

En el lenguaje de POV-Ray, necesitas especificar cadenas de caracteres para usar como nombres de fichero, textos de los mensajes, o textos para un objeto de texto. Las cadenas se pueden especificar usando literales, identificadores o funciones que devuelvan valores de cadena. Mira la sección "Funciones de Cadenas" para más detalles. No puedes construir expresiones de cadenas con operadores simbólicos como los que se usan con valores de coma flotante, vectores o colores, pero puedes utilizar funciones de cadenas para realizar varias operaciones con ellas. Algunas aplicaciones de las cadenas en POV-Ray permiten incluir caracteres no imprimibles para dar formato, como fin de línea o retorno de carro

CADENA:
    FUNCION_DE_CADENAS   |
    IDENTIFICADOR_DE_CADENA |
LITERAL DE CADENA:
    "hasta 256 caracteres ASCII"
FUNCION_DE_CADENA:
    str( COMA_FLOTANTE , ENTERO , ENTERO ) |
    concat( CADENA , CADENA, [CADENA ,...]) | chr( ENTERO ) |
    substr( CADENA , ENTERO , ENTERO ) | strupr( CADENA ) | 
    strlwr( CADENA ) | vstr( ENTERO, VECTOR, CADENA, ENTERO, ENTERO )

6.1.7.1  Literales de cadena

Los literales de texto comienzan con dobles comillas, seguidas de hasta 256 caracteres ASCII imprimibles, y terminan con otra comilla doble. Puedes cambiar el juego de caracteres para cadenas usando la opción charset en la sentencia global_settings. Los siguientes son literales de texto válidos:

"Aquí" "Allí" "imagen.gif" "textures.inc"

Observa que si necesitas especificar comillas en un literal de texto, debes precederlas con la contrabarra "\".

Por ejemplo:

"José dijo \"Hola\" al entrar."

se convierte en

José dijo "Hola" al entrar.

Si necesitas especificar la contrabarra "\", debes de especificar dos contrabarras. Por ejemplo:

"Esto es una contrabarra \\ y esto son dos \\\"

Se convierte en:

Esto es una contrabarra \ y esto son dos \\

Los usuarios de Windows deben estar especialmente atentos, ya que la contrabarra se usa también como separador de trayectoria. Por ejemplo, el siguiente código no produce el resultado esperado:

  #declare DisplayFont = "c:\windows\fonts\lucon.ttf"
  text { ttf DisplayFont "Hello", 2,0 translate y*1.50 }

Los usuarios noveles pueden esperar que esto genere un objeto de texto usando la fuente "c:\windows\fonts\lucon.ttf". Sin embargo, generará un mensaje de error alegando que no puede encontrar el archivo de fuentes llamado "c:windowsfontslucon.ttf".

La forma correcta de conseguir lo deseado sería la siguiente:

  #declare DisplayFont = "c:\\windows\\fonts\\lucon.ttf"
  text { ttf DisplayFont "Hello", 2,0 translate y*1.50 }

La sustitución de \" por " sucede en todos los literales de texto en POV-Ray. Existen otros códigos de formato como \n para una nueva línea. Véase la sección "Formato de Textos" para más detalles.

6.1.7.2  Identificadores de Cadenas

Los identificadores de cadenas de texto pueden usarse para hacer más legibles los archivos de escena, y para parametrizarlas con el fin de cambiar múltiples valores con un simple cambio en la declaración. Un identificador se declara de la siguiente forma:

DECLARACION_DE_CADENA:
    #declare IDENTIFICADOR = CADENA |
    #local IDENTIFICADOR = CADENA

Donde IDENTIFICADOR es el nombre del identificador de hasta 40 caracteres de longitud, y CADENA es cualquier especificación válida de cadena.

Nota: a diferencia de los valores de coma flotante, vectores o colores, aquí no necesitamos el punto y coma al final de la declaración. Véase "#declare frente a #local" para más información acerca del alcance de los identificadores.

He aquí algunos ejemplos:

 #declare Nombre_de_la_fuente = "ariel.ttf"
 #declare Archivo_de_inclusion = "miarchivo.inc"
 #declare Nombre = "Juan"
 #declare Nombre = concat(Name," Pérez")

Como puedes ver en el último ejemplo, es lícito redeclarar un identificador de texto y usar el valor anteriormente declarado en la redeclaración.

6.1.7.3  Funciones de Cadenas

POV-Ray posee una variedad de funciones incorporadas para manipular valores de coma flotante, vectores y cadenas. La llamada a la función consiste en un identificador que especifica el nombre de la función, seguido de una lista de parámetros entre paréntesis y separados por comas. Por ejemplo:

 keyword(param1,param2)

Las siguientes son las funciones que devuelven valores de cadena. Toman uno o más parámetros de coma flotante, enteros, vectores o cadenas como entrada. Asumimos que A es cualquier expresión válida de coma flotante; B, L, y P son valores de coma flotante truncados a entero internamente; y S,S1,S2 etc. son cadenas.

chr(B) Carácter cuyo valor es B. Devuelve una cadena de un solo carácter. El valor del carácter se especifica como un entero B que debe de estar comprendido en el rango de 0 a 65535 si has especificado el charset utf8 en global_settings, y de 0 a 127 si has especificado un charset ascii. Mira la documentación específica de tu plataforma si has especificado el charset sys. Por ejemplo, chr(70) es la cadena "F". Cuando trazamos objetos de texto, hay que tener en cuenta que los caracteres trazados para valores mayores que 127 dependen de la fuente (TTF) usada.

concat(S1,S2,...) Concatena las cadenas S1 y S2. Devuelve una cadena que es el resultado de concatenar todas las cadenas pasadas como parámetros. Deben existir al menos dos parámetros, pero pueden ser más. Por ejemplo:

 concat("El valor es ", str(A,3,1), " centímetros")

Si el valor de coma flotante A fuera 12.34321, el resultado sería la cadena "El valor es 12.3 centímetros".

str(A,L,P): Convierte el valor de coma flotante A en una cadena con formato que representa dicho valor. El parámetro entero L especifica la longitud mínima del la cadena y el tipo de justificación a usar si la cadena resultante es menor que la longitud mínima. Si L es positivo, se rellenará con ceros a la izquierda. Si L es negativo, se rellenará con ceros. El valor de la longitud mínima es abs(L). Si la cadena necesitara mayor longitud, puede hacerse tan larga como sea necesario para representar el valor.

El parámetro entero P especifica el número de dígitos después del punto decimal. Si P es negativo, se usa la precisión por defecto específica del compilador. Veamos algunos ejemplos:

 str(123.456, 0, 3) "123.456"
 str(123.456, 4, 3) "123.456"
 str(123.456, 9, 3) "  123.456"
 str(123.456,-9, 3) "00123.456"

 str(123.456, 0, 2) "123.46"
 str(123.456, 0, 0) "123"
 str(123.456, 5, 0) "  123"
 str(123.000, 7, 2) " 123.00"

 str(123.456, 0,-1) "123.456000" (específico de la plataforma)

strlwr(S) Minúsculas de la cadena S. Devuelve una nueva cadena en la que todas la mayúsculas de la cadena S se han convertido a minúsculas. La cadena original no se ve afectada. Por ejemplo: strlwr("Hola a Todos") da como resultado "hola a todos".

substr(S,P,L) Subcadena de S. Devuelve una cadena que es un subconjunto de los caracteres en el parámetro de cadena S, empezando en la posición especificada por el valor entero P y con la longitud indicada por el valor entero L. Por ejemplo substr("ABCDEFGHI",4,2) devuelve la cadena "EF". Si P+L>strlen(S) se produce un error.

strupr(S) Mayúsculas de la cadena S. Devuelve una cadena nueva en la que todas las minúsculas en la cadena S se han convertido a mayúsculas. La cadena original permanece intacta. Por ejemplo: strupr("Hola a Todos") se convierte en "HOLA A TODOS".

vstr(N,A,S,L,P) Convierte el vector A en una cadena con formato. Devuelve una cadena formateada para representar el vector A, donde los elementos del vector se separan con la cadena pasada en el parámetro S. El parámetro entero N especifica el número de dimensiones del vector A, que se forzará automáticamente dentro del rango 2-5 sin ningún aviso. Si se especifica un vector A con más dimensiones de las indicadas por el parámetro N, se producirá un error.

El parámetro entero L especifica la longitud mínima de la cadena y el tipo de relleno por la izquierda, cuando la cadena es menor que el mínimo especificado. El parámetro entero P especifica el número de dígitos tras el punto decimal. Si P es negativo se usará la precisión por defecto del compilador. La función de L y P es la misma que en str(). Éstos son algunos ejemplos:

 vstr(2, <1,2>, ", ", 0,1)         "1.0, 2.0"
 vstr(5, <1,2,3,4,5>, ", ", 0,1)   "1.0, 2.0, 3.0, 4.0, 5.0"
 vstr(1, 1, ", ", 0,1)             "1.0, 1.0"
 vstr(2, 1, ", ", 0,1)             "1.0, 1.0"
 vstr(5, 1, ", ", 0,1)             "1.0, 1.0, 1.0, 1.0, 1.0"
 vstr(7, 1, ", ", 0,1)             "1.0, 1.0, 1.0, 1.0, 1.0"
 vstr(3, <1,2>, ", ", 0,1)         "1.0, 2.0, 0.0"
 vstr(5, <1,2,3>, ", ", 0,1)       "1.0, 2.0, 3.0, 0.0, 0.0"
 vstr(3, <1,2,3,4>, ", ", 0,1)     error

Mira la sección "Funciones de Coma Flotante", donde encontrarás otras funciones relacionadas con las cadenas pero que devuelven valores de coma flotante. Además de las funciones incorporadas que hemos visto, puedes definir tus propias operaciones de cadenas usando la nueva directiva #macro. Mira la sección "Macros Definidas por el Usuario" para más detalles.