Shell scripting :funciones ,subshells y variables de entorno


Bash , c-shell  o simplemente shell scripting es  un lenguaje de script  creado a fines de la década de 1980 por un programador llamado Brian Fox, que trabajaba para la Free Software Foundation . Fue pensado como una alternativa de software libre para el shell Bourne (de hecho, su nombre es un acrónimo de Bourne Again SHell ), e incorpora todas las características de ese shell, así como nuevas características como la aritmética de enteros y el control de trabajo

Bash es un “shell de Unix”, es decir  una interfaz de línea de comandos para interactuar con el sistema operativo por lo que está ampliamente disponible, siendo el shell predeterminado en muchas distribuciones de GNU / Linux y en Mac OSX, con puertos existentes para muchos otros sistemas.

En post anteriores hemos hablado en una primera aproximación  al lenguaje c-sheall  con el primer ejemplo famoso de  Hello world y avanzando comandos ,tuberías ,variables ,parámetros y salidas posibles y en un segundo post  sobre el  uso de las Tuberías , sustitución de comandos,operadores ,asignación de variables ,Bucles , literales , variables   y aritmética no entera

En este  post  vamos  a continuar  avanzando en el conocimiento de este lenguaje con el uso de las funciones, subshells  y las  variables de entorno

close up code coding computer

 

 

 

Funciones de shell 

Una función de shell es un tipo especial de variable que es esencialmente un script dentro de otro script. Gracias a estas funciones c-shell  nos permite agrupar una secuencia de comandos en un solo comando con nombre, lo cual es particularmente útil si la secuencia de comandos necesita ejecutarse desde muchos lugares dentro del script  .

Como una función de shell puede incluso consistir en un solo comando; esto puede ser útil si el comando es particularmente complicado, o si su significado no sería inmediatamente obvio para un lector,es  decir, las funciones de shell pueden servir para dos propósitos:

  • pueden guardar la escritura
  • Pueden permitir un código más legible mediante la creación de comandos con nombres intuitivos

Como ejemplo considere la siguiente secuencia de comandos:

#! / bin / bash
# Uso: get_password VARNAME 
# Le pide al usuario una contraseña y lo guarda como $ VARNAME. 
# Devuelve un estado de salida distinto de cero si la entrada estándar no es un terminal, o si el 
comando # "leer" devuelve un estado de salida distinto de cero. 
get_password ()  { 
  si  [[ -t 0  ]]  ;  then
    read -r -p 'Contraseña:' -s "  $ 1  "  &&  echo 
  else 
    return  1
   fi
 }

get_password PASSWORD &&  echo  "  $ PASSWORD  "

El script anterior crea una función de shell llamada get_password que le pide al usuario que escriba una contraseña y almacena el resultado en una variable específica. Luego ejecuta get_password PASSWORD para almacenar la contraseña como $ PASSWORD ; y por último, si la llamada a get_password tuvo éxito (según lo determinado por su estado de salida), la contraseña recuperada se imprime en la salida estándar (que obviamente no es un uso realista pues  el objetivo aquí es simplemente demostrar el comportamiento de get_password ).

La función get_password no hace nada que no se pueda hacer sin una función de shell, pero el resultado es mucho más legible. La función invoca la lectura de comando incorporada (que lee una línea de entrada del usuario y la guarda en una o más variables) con varias opciones con las que la mayoría de los programadores de Bash no estarán familiarizados:

  • La opción -r desactiva un significado especial para el carácter de barra diagonal inversa;
  • la opción -p hace que aparezca un mensaje específico, en este caso Contraseña:, al principio de la línea;
  • la opción -s evita que se muestre la contraseña a medida que el usuario lo escribe. Desde la -s la opción también evita que se muestre la nueva línea del usuario,

El comando echo proporciona una nueva línea y además, la función usa la expresión condicional -t 0 para asegurarse de que la entrada del script proviene de un terminal (una consola) y no de una archivo o de otro programa que no sabría que se está solicitando una contraseña. (Esta última característica es discutible; dependiendo de la funcionalidad general del script,pues  puede ser mejor aceptar una contraseña de entrada estándar independientemente de su origen, suponiendo que la fuente se diseñó teniendo en cuenta el script). El punto general es que darle un nombre a la secuencia de comandos – get_password – hace que sea mucho más fácil para un programador saber qué hace.

Dentro de una función de shell, los parámetros posicionales$ 1 , $ 2 , etc., así como $ @ , $ * y $ # ) se refieren a los argumentos con los que se llamó a la función, no a los argumentos del script que contiene la función. Si se necesitan estos últimos, entonces deben pasarse explícitamente a la función, usando "$ @" . (incluso entonces, shift y set solo afectarán a los parámetros posicionales dentro de la función, no a los de la persona que llama).

Una llamada de función devuelve un estado de salida, al igual que un script (o casi cualquier comando). Para especificar explícitamente un estado de salida, use el comando return , que finaliza la llamada a la función y devuelve el estado de salida especificado. (El comando de salida no se puede usar para esto, ya que terminaría la secuencia de comandos completa, como si se llamara desde fuera de una función). Si no se especifica ningún estado de salida, ya sea porque no se da ningún argumento al comando de devolución o porque se llega al final de la función sin haber ejecutado un comando de retorno , a función devolverá el estado de salida del último comando que se ejecutó.

Incidentalmente, cualquiera de las funciones o () pueden omitirse de una declaración de función, pero al menos una debe estar presente. En lugar de , muchos programadores escriben  de manera similar, la notación {...} que no es exactamente necesaria y no es específica de las funciones; es simplemente una notación para agrupar una secuencia de comandos en un solo comando compuesto.

El cuerpo de una función debe ser un comando compuesto, como un bloque {…} o una instrucción if ; {…} Es la opción convencional, incluso cuando todo lo que contiene es un comando compuesto único y, por lo tanto, teóricamente podría prescindirse de él.function get_password ( )get_password ()

Subshells 

En Bash, uno o más comandos se pueden envolver entre paréntesis, lo que hace que esos comandos se ejecuten en una «subshell»(también hay algunas formas en que se pueden crear subshells implícitamente) Un subshell recibe una copia del «entorno de ejecución» del contexto circundante, que incluye cualquier variable, entre otras cosas; pero cualquier cambio que haga a subshell al entorno de ejecución no se vuelve a copiar cuando se completa la subshell.

Así, por ejemplo, este script: #! / bin / bash

foo  = barra
 echo  "  $ foo  "  # imprime 'barra'

# subshell:
 (
  echo  "  $ foo  "  # imprime 'barra' - la subshell hereda las variables de sus padres 
  baz  = bip
   echo  "  $ baz  "  # imprime 'bip' - la subshell puede crear sus propias variables 
  foo  = foo
   echo  "  $ foo  "  # imprime ' foo '- la subshell puede modificar variables heredadas
 )

echo  "  $ baz  "  # no imprime nada (solo una nueva línea) - se pierden las nuevas variables de la subshell 
echo  "  $ foo  "  # imprime 'barra' - los cambios de la subshell a las variables antiguas se pierden

La ejecución imprimirá esta salida:

bar

bar

bip

foo

bar

Si necesitase llamar a una función que modifica una o más variables, pero en realidad no desea que esas variables se modifiquen, puede ajustar la llamada a la función entre paréntesis, para que tenga lugar en una subshell. Esto «aislará» las modificaciones y evitará que afecten el entorno de ejecución circundante.Dicho esto: cuando sea posible, es mejor escribir funciones de tal manera que este problema no se presente para comenzar, pues la palabra clave local puede ayudar con esto.

Lo mismo ocurre con las definiciones de funciones; al igual que una variable regular, una función definida dentro de una subshell no es visible fuera de la subshell.

Una subshell también delimita los cambios a otros aspectos del entorno de ejecución; en particular, el comando cd («cambiar directorio») solo afecta a la subshell. Así, por ejemplo, este script:

  #! / bin / bash

cd /
 pwd  # imprime '/'

# subshell:
 (
  pwd  # prints '/' - la subshell hereda el directorio de trabajo 
  cd home
   pwd  # prints '/ home' - la subshell puede cambiar el directorio de trabajo 
)  # end of subshell

pwd  # prints '/': los cambios de la subshell en el directorio de trabajo se pierden

imprime esto:

/ / /casa /

Si su script necesita cambiar el directorio de trabajo antes de ejecutar un comando dado, es una buena idea usar una subshell si es posible,. de lo contrario, puede resultar difícil hacer un seguimiento del directorio de trabajo al leer un script. Alternativamente, los comandos incorporados pushd y popd se pueden usar para un efecto similar.

 

Una declaración de salida dentro de una subshell termina solo esa subshell. Por ejemplo, este script:

  #! / bin / bash
(  exit  0  )  &&  echo  'subshell successed' 
(  exit 1  )  ||  echo  'subshell failed'

imprime esto:

 subshell tuvo éxito
subshell falló

Al igual que en una secuencia de comandos en su conjunto, exit de los valores predeterminados  devuelve el estado de salida del comando de última ejecución, y una subshell que no tiene una instrucción de salida explícita devolverá el estado de salida del comando de última ejecución.

Variables de entorno

Ya hemos visto que, cuando se llama a un programa, recibe una lista de argumentos que se enumeran explícitamente en la línea de comandos. Lo que no hemos mencionado es que también recibe una lista de pares nombre-valor denominados «variables de entorno».

Diferentes lenguajes de programación ofrecen diferentes formas para que un programa acceda a una variable de entorno; Los programas C pueden usar getenv (" variable_name ") (y / o aceptarlos como un tercer argumento para main ), los programas Perl pueden usar $ ENV {' variable_name '} , los programas Java pueden usar System.getenv (). Get (" variable_name ") , y así sucesivamente.

En Bash, las variables de entorno se convierten simplemente en variables regulares de Bash. Así, por ejemplo, la siguiente secuencia de comandos imprime el valor de la variable de entorno HOME :

#! / bin / bash
echo  "  $ HOME  "

Sin embargo, lo contrario no es cierto: las variables regulares de Bash no se convierten automáticamente en variables de entorno. Así, por ejemplo, este script:

#! / bin / bash
foo  = bar
bash -c 'echo $ foo'

Esto no imprimirá la barra , porque la variable foo no se pasa al comando bash como una variable de entorno. ( De bash -c scripts argumentos ... corre el Bash script de una línea de la escritura ).

Para convertir una variable Bash normal en una variable de entorno, tenemos que «exportarla» al entorno. La siguiente secuencia de comandos hace la impresión de barras :

#! / bin / bash
export  foo  = bar
bash -c 'echo $ foo'

Tenga en cuenta que la exportación no solo crea una variable de entorno; en realidad marca la variable Bash como una variable exportada, y las asignaciones posteriores a la variable Bash también afectarán a la variable de entorno. Ese efecto es ilustrado por este script:

#! / bin / bash
foo  = bar
bash -c 'echo $ foo'  # no imprime nada 
export foo
bash -c 'echo $ foo'  # imprime 'bar' 
foo  = baz
bash -c 'echo $ foo'  # imprime 'baz'

El comando de exportación también se puede usar para eliminar una variable de un entorno, incluyendo la opción -n ; por ejemplo, export -n foodeshace el efecto de export foo. Y múltiples variables pueden ser exportadas o no exportadas en un solo comando, como export foo barexport -n foo bar.

Es importante tener en cuenta que las variables de entorno solo se pasan a un comando; nunca se reciben de vuelta de un comando. En este sentido, son similares a las variables y subshells regulares de Bash. Así, por ejemplo, este comando:

#! / bin / bash
export  foo  = bar
bash -c 'foo = baz'  # no tiene efecto 
echo  "  $ foo  "  # print 'bar'

barra de estampados ; el cambio a $ foo dentro del script de una línea no afecta el proceso que lo invocó. (Sin embargo, podría afectar a cualquier script que fueron llamados a su vez por ese guión.)

Si se desea una variable de entorno dada para un solo comando, se puede usar la sintaxis, con la sintaxis de una asignación de variable (o múltiples asignaciones de variables) que precede a un comando en la misma línea. (Tenga en cuenta que, a pesar de usar la sintaxis de una asignación de variable, esto es muy diferente de una asignación de variable Bash normal, en que la variable se exporta automáticamente al entorno y en que solo existe para el comando. Si desea evitar la confusión de sintaxis similar hacer las cosas diferentes, se puede utilizar la común utilidad Unix env para el mismo efecto que la utilidad también hace que sea posible. eliminar una variable de entorno para un comando – o incluso para eliminar todas las variables de entorno para un comando) Si. $ varvar =value commandya existe, y se desea incluir su valor real en el entorno para un solo comando, que se puede escribir como .var = " $var " command

Aparte: a veces es útil colocar definiciones de variables, o definiciones de funciones, en un script de Bash (por ejemplo, header.sh ) que puede ser llamado por otro script de Bash (por ejemplo, main.sh ). Podemos ver que simplemente invocar ese otro script Bash, como ./header.sh o como bash ./header.sh , no funcionará: las definiciones de variables en header.sh no serán vistas por main.sh , ni siquiera si «exportado» esas definiciones. (Este es un punto de confusión común: exportar las variables de exportación al entorno para que otros procesos puedan verlas, pero solo las ven los procesos secundarios , no los padres.) Sin embargo, podemos usar el comando incorporado Bash («punto») o fuente , que ejecuta un archivo externo casi como si fuera una función de shell. Si header.sh se ve así:

 foo  = función de barra
 baz ()
 {
  echo  "  $ @  "
 }

entonces este script:

#! / bin / bash
. header.sh
baz "  $ foo  "

imprimirá 'barra' .

Alcance 

Ahora hemos visto algunos de los caprichos del alcance variable en Bash.

Para resumir lo que hemos visto hasta ahora:

  • Las variables regulares de Bash están orientadas al shell que las contiene, incluidas las subshells en ese shell.
    • No son visibles para ningún proceso secundario (es decir, para programas externos).
    • Si se crean dentro de una subshell, no son visibles para el shell principal.
    • Si se modifican dentro de una subshell, esas modificaciones no son visibles para el shell principal.
    • Esto también se aplica a las funciones, que en muchos aspectos son similares a las variables regulares de Bash.
  • Las llamadas de función no se ejecutan inherentemente en subshells.
    • Una modificación de variable dentro de una función generalmente es visible para el código que llama a la función.
  • Las variables de Bash que se exportan al entorno tienen un alcance al shell que las contiene, incluidas las subshells o procesos secundarios en ese shell.
    • El comando incorporado de exportación se puede utilizar para exportar una variable al entorno. (También hay otras formas, pero esta es la forma más común).
    • Difieren de las variables no exportadas solo en que son visibles para los procesos secundarios. En particular, todavía no son visibles para shells principales o procesos primarios.
  • Los scripts de Bash externos, como otros programas externos, se ejecutan en procesos secundarios. El o el comando integrado de origen se puede utilizar para ejecutar un script de este tipo internamente, en cuyo caso no se ejecuta de forma inherente en una subshell.

Ademas a  esto añadimos ahora:

  • Las variables de Bash que están localizadas en una función-llamada están sujetas a la función que las contiene, incluyendo cualquier función llamada por esa función.
  • El comando incorporado local se puede usar para localizar una o más variables a una llamada de función, usando la sintaxis local var1 var2o . (también hay otras formas, por ejemplo, el comando declarar incorporado tiene el mismo efecto, pero esta es probablemente la forma más común).local var1 = val1 var2 = val2)
  • Se diferencian de las variables no localizadas en que desaparecen cuando finaliza su función-llamada. En particular, todavía son visibles para subshells y llamadas de función hijo. Además, al igual que las variables no localizadas, se pueden exportar al entorno para que también las vean los procesos secundarios.

En efecto, usar local para localizar una variable en una función-llamada es como poner la función-llamada en una subshell, excepto que solo afecta a una variable; otras variables pueden dejarse sin ser «locales».

 

Una variable que se establece dentro de una función (ya sea mediante asignación o mediante un comando for-loop u otro comando incorporado) debe marcarse como «local» utilizando el comando incorporado local , para evitar que se afecte accidentalmente el código fuera del función, a menos que se desee específicamente que la persona que llama vea el nuevo valor.

Es importante tener en cuenta que, aunque las variables locales en Bash son muy útiles, no son tan locales como las variables locales en la mayoría de los otros lenguajes de programación, ya que son vistos por llamadas de funciones secundarias. Por ejemplo, este script:

#! / bin / bash

foo  = bar

function f1 ()
 {
  echo  "  $ foo  "
 }

function f2 ()
 {
  local  foo  = baz
  f1 # imprime 'baz'
 }

 f2

En realidad se imprimirá baz en lugar de barra . Esto se debe a que el valor original de $ foo está oculto hasta que devuelve f2 . (En la teoría del lenguaje de programación, una variable como $ foo se dice que tiene un «ámbito dinámico» en lugar de un «ámbito léxico»).

Una diferencia entre local y subshell es que mientras que un subshell toma inicialmente sus variables de su shell principal, una declaración como local foo oculta inmediatamente el valor anterior de $ foo ; es decir, $ foo se desestabiliza localmente. Si se desea inicializar el $ foo local al valor del $ foo existente , debemos especificarlo explícitamente, mediante el uso de una declaración como local foo = "$ foo" .

Cuando una función sale, las variables recuperan los valores que tenían antes de sus declaraciones locales (o simplemente se anulan, si no se habían anulado). Curiosamente, esto significa que un script como este:

 #! / bin / bash

function f ()
 {
  foo  = baz
   local  foo  = bip
 }

foo  = bar
 F
echo  "  $ foo  "

Realmente imprimirá baz : la declaración foo = baz en la función surte efecto antes de que la variable se localice, por lo que el valor baz es lo que se restaura cuando la función regresa.Y dado que local es simplemente un comando ejecutable, una función puede decidir en tiempo de ejecución si localizar una variable dada, por lo que este script:

#! / bin / bash

function f ()
 {
  si  [[  "  $ 1  "  ==  'sí'  ]]  ;  entonces
    Foo
   local fi
  foo  = baz
 }

foo  = bar
f yes # modifica un $ foo localizado, por lo que no tiene ningún efecto 
echo  "  $ foo  "  # imprime 'barra' 
f # modifica el $ foo no localizado, configurándolo en 'baz' 
echo  "  $ foo  "  # imprime 'baz'

Este script en realidad se imprimirá

 bar
baz

 

Introdución a OpenScad


Para el modelado en 3D,  la famosa aplicación web de AutoDesk  Tinkercad debería ayudarnos ante cualquier diseño inicial  de una manera  más sencilla con el proceso de modelado 3D, tanto es así, que incluso los modeladores experimentados lo hacen  explorando las formas de Tinkercad,  pues curiosamente, una herramienta “simple” como Tinkercad puede utilizarse para crear formas complejas.

Lógicamente detrás del interfaz gráfico de  Tinkercad  ( o de cualquier otro programa de modelado 3D),   está el código que procesa las manipulaciones del diseñador , de modo que a medida que arrastra y suelta formas, los algoritmos complejos están trabajando para calcular cómo aparecerán los gráficos en la pantalla  y generando las formas 3d.

 

OpenSad   en efecto surgen ante el dilema de que  también debería ser posible crear figuras geométricas directamente mediante código, de un  modo  mucho mas eficiente   y conciso   que el  proceso de diseño que cualquier otra herramienta gráfica como por ejemplo Tinkercad.

A diferencia de Tinkercad, OpenSCAD no es una aplicación basada en la web , de  modo que si esta interesado  en la herramienta   tendrá que descargarla  gratuitamente   desde http://www.openscad.org  ( está disponible para Windows, Mac OS X y Linux)   e instalarla en su PC para usarla.

La interfaz OpenSCAD es sencilla  en comparación con Tinkercad ,constando  de sólo tres ventanas, siendo la ventana de la izquierda un editor de texto utilizado para ingresar el código.

panel

Con OpenSCAD pues está diseñando código, pero no se preocupe: escribir código con Open SCAD es muy similar a la sintaxis  HTML  siendo el código para crear objetos  autoexplicativo   ,por ejemplo, el comando del cubo crea cubos, el comando de esfera crea esferas y el comando del cilindro crea cilindros, etc.

Probablemente haya alrededor de 60 comandos en OpenSCAD , algunos de ellos que enunciaremos mas abajo, muchos de los cuales  permitirán manipular la geometría ,  como por ejemplo mover, rotar, escalar y usar operaciones booleanas para combinar objetos, pero no se preocupe porque  para modelar  la mayoría de la piezas solo necesitaran  unos pocos comandos como  son union , difference, translate, cylinder o  cube.

Es facil deducir que en base a esos , es decir mediante secuencias de comandos en el lenguaje de OpenSCAD , se utilizaran para crear modelos en 2D o 3D.

Este script es una lista de formato libre de instrucciones de acción.

 object(); variable = value;
operator() action();
operator()
{ action();
action();
}
operator()
operator()
{ action();
action();
}
operator()
{ operator()
action();
operator()
{ action();
action();
}
}

Como vemos  en el ejemplo  hay  objetos, acciones  y operadores para construir una pieza:

  • Objetos:Los objetos son los bloques de construcción de modelos, creados por primitivas 2D y 3D. Los objetos terminan en un punto y coma ‘;’.
  • Acciones: Instrucciones de acción  que incluyen la creación de objetos usando las primitivas y asignar valores a variables. Las instrucciones de acción también terminan en un punto y coma ‘;’.
  • Operadores :Los operadores o las transformaciones, modifican la ubicación, color y otras propiedades de los objetos. Los operadores usen llaves ‘{}’ cuando su ámbito de aplicación abarca más de una acción. Más de un operador puede usarse para la misma acción o grupo de acciones. Varios operadores se procesan de derecha a izquierda, es decir, el más cercano a la acción del operador se procesa primero. Los operadores no terminan en punto y coma ‘;‘, pero la persona hacen acciones que contienen.

Por ultimo y no menos importante sobre todo para llevar las piezas modeladas al mundo real por ejemplo mediante impresion en 3d, as unidades en OpenSCAD son genéricas  de modo que no hay sistemas de medición en OpenSCAD, es decir , no hay designación para las unidades, y le corresponde al diseñador definir el tamaño del objeto al configurar el archivo antes de la impresión 3D.

 

A modo de resumen  vamos a ver de forma sintetica los entresijos del lenguaje OpenScad;

 

 

RESUMEN DE LAS FUNCIONES MAS IMPORTANTES

Sintaxis de elementos principales

Los usuarios pueden ampliar el lenguaje  definiendo sus propios módulos y funciones. Esto permite agrupar partes de secuencia de comandos de fácil reutilización con diferentes valores. Nombres bien escogidos también ayudan a documentar la secuencia de comandos.

OpenSCAD proporciona: funciones que devuelven valores. módulos que realizan acciones pero no devuelven valores.

OpenSCAD calcula el valor de variables en tiempo de compilación, no tiempo de ejecución. La última asignación variable dentro de un ámbito se aplicará en todo el mundo en ese ámbito. También se aplica a los ámbitos internos, ni los niños, sus. Ver alcance de variables para obtener más detalles. Puede ser útil pensar en ellos como constantes capaz de anular en lugar de variables.

En resumen estas son las cinco construcciones mas usadas ; 

var = value;
Variables en OpenSCAD son creadas por una declaración con un nombre o identificador, asignación a través de una expresión y un punto y coma. El papel de los arreglos de discos, en muchos lenguajes imperativos, se maneja en OpenSCAD mediante vectores.
module name(…) { … } 
Módulos pueden utilizarse para definir objetos o, mediante children(), definir los operadores. Una vez definido, módulos temporalmente se agrega al lenguaje.
function name(…) = … 
Las funciones operan sobre valores para calcular y devolver valores nuevos.
include <….scad>

actúa como si el contenido del archivo incluido fueron escrito en el archivo incluido
use <….scad>

importaciones de módulos y funciones, pero no se ejecuta ningún comando que no sea de esas definiciones

2D

circle (r=radius | d=diameter)

Se crea un círculo en el origen. Todos los parámetros, excepto la r, deben ser nombrados.


Parámetros
radius: radio (debe antecederse la r)
diameter:diametro ( debe antecederse la d)

polygon ([points])

Crea un polígono en base a una  lista de x, y puntos del polígono. : Un vector de vectores elemento 2. (los puntos son indizados desde 0 hasta n-1)

 

polygon ([points], [paths])

Crea una forma echada a un lado múltiples de una lista de coordenadas x, y. Un polígono es el más poderoso objeto 2D. Nada puede crear ese círculo y plazas pueden, y mucho más. Esto incluye formas irregulares con los bordes cóncavos y convexos. Además puede colocar agujeros dentro de esa forma
square ([width, height], center)

Crea un cuadrado o un rectángulo en el primer cuadrante. Cuando el centro es cierto la plaza se centra en el origen. Nombres de argumento son opcionales si en el orden que se muestra a continuación
text (text, size, font, halign, valign, spacing, direction, language, script)

El módulo crea texto como un objeto geométrico 2D, utilizando tipos de letra instalados en el sistema local o como archivo de fuente independiente.

3D

cube (size)

Crea un cubo en el primer octante. Cuando el centro es cierto, el cubo se centra en el origen. Nombres de argumento son opcionales si en el orden que se muestra a continuación.
Al teber solo un valor,el  cubo tiene los lados de esta longitud

cube ([width, depth, height])



Crea un cubo en el primer octante. Cuando el centro es cierto, el cubo se centra en el origen. Nombres de argumento son opcionales si en el orden que se muestra a continuación.
Array de 3 valores [x, y, z] que responde  a las dimensiones x, y y z.

parámetros:
tamaño
solo valor, cubo con los lados de esta longitud
3 valor array [x, y, z], cubo con dimensiones x, y y z.
Centro
falso (predeterminado), 1 º octante (positivo), una de las esquinas en (0,0,0)
cierto, cubo está centrado en (0,0,0)
cylinder (height, BotttonRadios,TopRadius, center)

Crea un cilindro centrado sobre el eje z. Cuando el centro es cierto, también se centra verticalmente a lo largo del eje z.
Nombres de los parámetros son opcionales si en el orden que se muestra Si un parámetro se denomina, deben también llamarse todos los parámetros siguientes.

cylinder (h, r1|d1, r2|d2, center)

Crea un un cono centrado sobre el eje z. Cuando el centro es cierto, también se centra verticalmente a lo largo del eje z. 
Nombres de los parámetros son opcionales si en el orden que se muestra Si un parámetro se denomina, deben también llamarse todos los parámetros siguientes
 Si se utilizan r, d, d1 o d2 deben llamarse.

Parámetros
h : altura del cilindro o de cono
r : radio del cilindro. R1 = r2 = r.
R1 : radio, parte inferior del cono.
R2 : radio superior del cono.
d : diámetro del cilindro. R1 = r2 = 2 d.
D1 : diámetro, parte inferior del cono. R1 = d1/2
D2 : diámetro superior del cono. R2 = d2/2
(Nota: d, d1, d2 requiere 2014.03 o posterior. Debian en la actualidad se sabe que detrás de esto)
Centro
falso (por defecto), z va desde 0 a h
cierto, rangos de z de -h/2 a + h/2

polyhedron (points, triangles, convexity)

Un poliedro es el sólido primitivo 3D más general. Puede utilizarse para crear cualquier figura regular o irregular, incluyendo aquellos con características tanto cóncavos como convexos. Superficies curvas se aproximan por una serie de superficies planas.

Parámetros
puntos
Vector 3d puntos o vértices. Cada punto es a su vez un vector [x, y, z], de sus coordenadas.
Puntos pueden definirse en cualquier orden. N puntos se hace referencia en el orden definido como 0 a N-1.
triángulos (obsoleto en 2014,03, caras de uso versión)
Vector de caras que incluyen colectivamente el sólido. Cada cara es un vector que contiene los índices (basado en 0) de 3 puntos desde el vector de puntos.
caras (introducido en la versión 2014.03)
Vector de caras que incluyen colectivamente el sólido. Cada cara es un vector que contiene los índices (basado en 0) de 3 o más puntos el vector de puntos.
Caras pueden definirse en cualquier orden. Definir bastante caras para incluir completamente el sólido, sin traslapo.
Puntos que describen una sola cara deben estar en el mismo plano.
convexidad
Entero. El parámetro de convexidad especifica el número máximo de caras puede penetrar un rayo que se intersecan el objeto. Este parámetro sólo es necesario para visualizar correctamente el objeto en modo de vista previa OpenCSG. Tiene ningún efecto en la prestación del poliedro. Para problemas de la pantalla, ponerla a 10 debería funcionar bien para la mayoría de los casos.

sphere (radius | d=diameter)

Crea una esfera en el origen del sistema coordinado. El nombre de argumento de r es opcional. Para utilizar d en lugar de r, d debe ser nombrado.

 

 

Parámetros

Radio. Este es el radio de la esfera. La resolución de la esfera se basará en el tamaño de la esfera y el $fa, $fs y $fn variables. Para obtener más información sobre estas variables especiales: 
Diámetro. Esto es el diámetro de la esfera.

(Nota: d sólo está disponible en versiones de 2014.03. Debian en la actualidad se sabe que detrás de esto)

$fa 
Ángulo de fragmento en grados
$fs 
Dimensión en mm del fragmento
$fn 
Resolución

Transformaciones

translate ([x, y, z])

Se traduce (se mueve) en sus elementos secundarios a lo largo del vector especificado. El nombre de argumento es opcional.
rotate ([x, y, z])

Gira su child  ‘a’ grados sobre el eje del sistema coordinado o alrededor de un eje arbitrario. Los nombres de argumento son opcionales si los argumentos se dan en el mismo orden como se especifica.
scale ([x, y, z])

La escala de sus elementos secundarios mediante el vector especificado. El nombre de argumento es opcional.
resize ([x, y, z], auto)

Modifica el tamaño del objeto secundario para que coincida con el dado x,y y z

mirror ([x, y, z])

Refleja el elemento en un plano que pase por el origen 
multmatrix (m)

Multiplica la geometría de todos los elementos secundarios con la matriz de transformación de 4 x 4 dada.
Uso: multmatrix (m = […]) { … }
color («colorname»)

Los nombres de los colores disponibles son los de lista del color SVG la World Wide Web consortium.

color ([r, g, b, a])

Muestra los elementos secundarios mediante el color RGB especificado + valor alfa. Sólo se utiliza para la previsualización de F5 como CGAL y STL (F6) actualmente no admiten color. El valor de alfa por defecto 1.0 (opaco) si no se especifica.

offset (r|delta, chamfer)

Desplazamiento permite mover contornos 2D hacia afuera o hacia adentro por una cantidad dada.
hull()

Muestra el casco convexo de los nodos secundarios.

minkowski()


Muestra la suma de minkowski de nodos secundarios. Se suele utilizar para hace figuras redondeadas en las aristas 


Operaciones booleanas

union()

Crea una Unión de su hijo nodos. Es la suma de todos los hijos (lógica de o).
Se puede utilizar con objetos 2D o 3D, pero no mezclarlas.
difference()

Resta los nodos hijo 2 º (y todos los otros) de la primera ( y no).
Se puede utilizar con objetos 2D o 3D, pero no mezclarlas.
intersection()

Crea la intersección de todos los nodos secundarios. Esto mantiene la porción traslapada (lógica y).
Se conserva sólo la zona que es común o compartido por todos los hijos.
Se puede utilizar con objetos 2D o 3D, pero no mezclarlas.

Modificadores de carácter

*Desactivar
!Mostrar sólo
#Destacar / debug
%Transparente / antecedentes

Matemáticas

abs

Corresponde a la funcion del valor absoluto. Devuelve el valor positivo de un número decimal con signo.
acos

arcoseno, o coseno inverso, expresado en grados.
asin

arco seno, o seno inverso, expresado en grados
atan

arco tangente, o tangente inversa, matemática. Devuelve el valor principal de la arco tangente de x, expresada en grados.
atan2

atan dos argumentos , tomando y como su primer argumento. Devuelve el valor principal de la arco tangente de y / x, expresada en grados

ceil

Función matemática techo .
Devuelve el valor de entero más próximo por redondeo el valor si es necesario.
cos

Función matemática coseno de grados.

exp

Función matemática exp . Devuelve la función exponencial de base e de x, que es el número e elevado a la potencia x.
floor

Función matemática flooro . Floor(x) = el entero más grande no es mayor que x
len

Función matemática longitud . Devuelve la longitud de una matriz, un vector o un parámetro de cadena.

let

Asignación secuencial de variables dentro de una expresión. La siguiente expresión se evalúa en el contexto de las tareas que y puede utilizar las variables. Esto es principalmente útil para realizar complicadas expresiones más legible mediante la asignación de resultados provisionales a las variables.
ln

Función matemática logaritmo natural.
log

Función matemática del logaritmo en base 10.

max

Devuelve el máximo de los parámetros. Si se da un único vector como parámetro, devuelve el máximo elemento de ese vecto
min

Devuelve el mínimo de los parámetros. Si se da un único vector como parámetro, devuelve el mínimo elemento de ese vector.

pow

Función matemática potencia
rands

Generador de números aleatorios. Genera un vector constante de pseudo números aleatorios, al igual que una matriz. Los números son dobles no enteros. Cuando se genera un único número, se llama todavía con variable [0]
round


El operador devuelve la parte entera más o menos, respectivamente, si la entrada numérica es positivo o negativo
sign


Función matemática signum . Devuelve un valor de unidad que extrae la señal de un valor
sin

Función matemática seno
sqrt

Función matemática de raíz cuadrada .
tan

Función de la tangente de matemática.

Funciones

chr

Convertir a números en una cadena que contiene caracteres con el código correspondiente. OpenSCAD utiliza Unicode, por lo que el número se interpreta como punto de código Unicode. Números fuera del intervalo de punto de código válido producirá una cadena vacía.
concat

Devuelven un vector que contiene los argumentos.
Donde argumento es un vector de los elementos del vector se agregan individualmente al vector resultado. Cadenas son diferentes de vectores en este caso
cross


Calcula el producto cruzado de dos vectores en el espacio 3D. El resultado es un vector que es perpendicular a ambos vectores de entrada.
Utilizando parámetros de entrada no válidos (por ejemplo vectores con una longitud diferente de 3 o de otro tipo) producirá un resultado indefinido.
lookup

Buscar valor en tabla e interpolar linealmente si no hay ninguna coincidencia exacta. El primer argumento es el valor a buscar. La segunda es la tabla de búsqueda–un vector de pares de clave y valor.
norm

Devuelve la norma euclideana de un vector. Tenga en cuenta que esto devuelve la longitud numérica real mientras que len devuelve el número de elementos en el vector o matriz.

parent_module (idx)

$parent_modules contiene el número de módulos en la pila de ejecución. parent_module(i) devuelve el nombre del módulo niveles por encima del módulo actual en la pila de ejecución. La pila es independiente de donde se definen los módulos. Es donde ellos son instancias que cuenta. Esto puede usarse para construir por ejemplo, las listas de materiale
search

Buscar valor en tabla e interpolar linealmente si no hay ninguna coincidencia exacta. El primer argumento es el valor a buscar. La segunda es la tabla de búsqueda–un vector de pares de clave y valor.
str

Convertir todos los argumentos a las cadenas y concatenar.
version

devuelve el número de versión de OpenSCAD.

version_num

devuelve el número de versión de OpenSCAD

Otros

children ([idx])


Los objetos se indizan mediante enteros de 0 a $children-1. OpenSCAD establece $children el número total de objetos en el ámbito de aplicación. Objetos agrupados en un ámbito sub se tratan como un hijoo.
echo (…)

Esta función imprime el contenido de la ventana de compilación (también conocido como consola). Útil para depurar código.
Valores numéricos se redondean a 5 dígitos significativos.
La consola OpenSCAD soporta un subconjunto de lenguaje de marcado HTML
for (i = [start:end]) { … }

Bucle para evaluar cada valor en un rango, aplicándola a la acción siguiente.


Parámetros
start – valor inicial
end – parada cuando el siguiente valor sea final
for (i = [start:step:end]) { … }

Bucle para evaluar cada valor en un rango , aplicándola a la acción siguiente.


Parámetros
start – valor inicial
step o paso – cantidad para aumentar el valor, opcional, por defecto = 1
end – parada cuando el siguiente valor sea final
for (i = […, …, …]) { … }

Bucle evaluando cada valor en un  vector, aplicándola a la acción siguiente.
if (…) { … }

Estructura condicional realizando una prueba para determinar si las acciones en un ámbito secundario deben realizarse o no.

import («….stl»)

Importa un archivo para su uso en el modelo actual de OpenSCAD. OpenSCAD actualmente soporta importación de DXF, apagado y ficheros STL (ASCII y binario). La extensión de archivo se utiliza para determinar el tipo.
intersection_for (i = [start:end]) { … }

Iterar sobre los valores en un rango y crear la intersección de objetos creados por cada pasada.
Además de crear instancias independientes para cada paso, el estándar for() también agrupa todas estas instancias de creación de una Unión implícita.

Parámetros
start – valor inicial
end – parada cuando el siguiente valor sea final

intersection_for (i = [start:step:end]) { … }


Iterar sobre los valores en un rango y crear la intersección de objetos creados por cada pasada.
Además de crear instancias independientes para cada paso, el estándar for() también agrupa todas estas instancias de creación de una Unión implícita.

Parámetros
start – valor inicial
step o paso – cantidad para aumentar el valor, opcional, por defecto = 1
end – parada cuando el siguiente valor sea final
intersection_for (i = […, …, …]) { … }


Iterar sobre los valores en un  vector y crear la intersección de objetos creados por cada pasada.
Además de crear instancias independientes para cada paso, el estándar for() también agrupa todas estas instancias de creación de una Unión implícita.
linear_extrude (height, center, convexity, twist, slices)



Es una operación de modelado que toma un polígono 2D como entrada y extiende en la tercera dimensión de modo que se crea así una forma 3D. Tenga en cuenta que la protuberancia se realiza siempre del plano XY a la altura indican a lo largo del eje Z ; así que si se gira o aplicar otras transformaciones antes de extrusión, la extrusión se aplica a la proyección del polígono 2D en el plano XY.


Parámetros

height -altura, 
center -centro, 
convexity-convexidad, 
twits-torcedura, 
slices-rodajas
projection (cut)


Utilizando la función, puede crear dibujos en 2d de modelos en 3d y exportarlos al formato dxf. Funciona proyectando un modelo 3D (x, y) plano, con z en 0. If, sólo puntos con z = 0 se considerará (cortando efectivamente el objeto), con (el valor predeterminado), puntos por encima y por debajo del plano se considerarán así (creando una proyección adecuada).
projection()cut=truecut=false
render (convexity)

Las fuerzas de la generación de una malla incluso en modo de vista previa. Útil para ser demasiado lentos para seguir las operaciones booleanas.

rotate_extrude (convexity)

Gira alrededor del eje z para formar un sólido que tiene simetría de rotación una figura en 2D. Una forma de pensar de esta operación es imaginar un torno de alfarero colocada en el plano X-Y con su eje de rotación hacia arriba hacia + Z. Luego colocando el objeto por el hecho de ser en esta virtual de alfarero (posiblemente extendido hacia abajo por debajo del plano X-Y a -Z, tomar la sección de este objeto en el plano X-Z pero mantener solamente el derecho de la mitad (X > = 0). Es la forma 2D que necesitan ser alimentados a rotate_extrude() como el niño con el fin de generar este sólido.
Desde una forma 2D se procesa por OpenSCAD en el plano X-Y, una manera alternativa de pensar de esta operación es la siguiente: hace girar una figura en 2D alrededor del eje y para formar un sólido. El sólido resultante se coloca de modo que su eje de rotación se encuentra a lo largo del eje z.
No puede utilizarse para producir una hélice o rosca.
La forma 2D necesita mentir completamente en el derecho de cualquiera de los dos (recomendado) o el lado izquierdo del eje y. Más precisamente hablando, cada vértice de la forma debe tener ya sea x > = 0 o x < = 0. Si la forma cruza el eje X una advertencia aparecerá en la ventana de consola y se ignorará el rotate_extrude(). Para OpenSCAD versiones anteriores a 2016.xxxx, si la forma es en el eje negativo las caras será al revés, que puede causar efectos no deseados
surface (file, center, invert, convexity)


Lee mapa información de archivos de texto o imagen.

Parámetros
file : La ruta del archivo que contiene los datos del mapa.
center:Esto determina la posición del objeto generado. Si es cierto objeto se centra en x y el eje y. De lo contrario, el objeto se coloca en el cuadrante positivo. Por defecto false.
invert: Invierte como los valores de color de imágenes importadas se traducen en valores de altura. Esto no tiene ningún efecto al importar archivos de datos de texto. Por defecto false.
convexity. El parámetro de convexidad especifica el número máximo de partes delanteras (lados traseros) podría penetrar un rayo que se intersecan el objeto. Este parámetro sólo es necesario para visualizar correctamente el objeto en modo de vista previa OpenCSG y no tiene ningún efecto en la prestación final.

Compresiones de listas

Generar[ for (i = range|list) i ]
es decir

[para (i = rango | lista) i]
Condiciones[ for (i = …) if (condition(i)) i ]

es decir 
[para (i =…) si (conditcon(i)) i]
Asignaciones[ for (i = …) let (assignments) a ]

es decir

[para (i =…) que (asignaciones) un]

Variables especiales

$childrenNúmero de hijos de módulo
$faÁngulo mínimo
$fsTamaño mínimo
$fnNúmero de fragmentos
$tPaso de la animación
$vprRotación de la vista
$vptTraducción de ventanilla
$vpdDistancia de la cámara de ventanilla

Mas información en  https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/

htt