IceSL scripting language specification
This is the official documentation of the IceSL scripting language. Examples featured here are for the most part selfcontained unless they use an external asset (svg or stl files). Their associated illustrations are accurate depictions of their output.
We welcome IceSL users to redirect their questions about the scripting language to the IceSL forum page.
Syntax
The scripting language of IceSL (hereafter referred to as IceSL) is a superset of lua. Moreover, IceSL has been designed to facilitate conversion from/to OpenSCAD.
IceSL also extends Lua's types in order to specify shapes and transforms. The main basic types are:
 Vector (e.g.
v(1,0,0)
)  Matrix (e.g.
m(1,0,0,1, 0,1,0,1, 0,0,1,1, 0,0,0,1)
)  Shapes:
 Primitives (e.g.
sphere(1)
),  Meshes (e.g.
load('fox.stl')
),  Implicits,
 Voxels.
 Primitives (e.g.
Drawing and Scale
Creating a shape in IceSL does not automatically render it in the final scene. In order to do this, you need to emit it.
emit( shape, brush )

shape
: the shape to render 
brush
: the brush's index to render the shape with. 0 by default
Brushes are an internalized concept of IceSL, there are a total of 128 indexes starting from 0. Their use is meant to group shapes under a set of parameters (usually printing parameters like infill percentage). In case of overlapping, the group with the lower index takes priority. The next code exemplifies the use of emit
:

Finally, a unit in the scripting language corresponds to 1mm in the printing world. IceSL always renders a scene with a virtual printing bed; a grid that represents the 3d printer bed (see image below). Each square of IceSL's printing bed corresponds to 1cm^{2}.
Notice that, in order to have a visual aid on view orientation, axes are drown in the bottomleft corner. The red, green and blue lines correspond to the positive X, Y, and Z axes respectively.
Vectors, Matrices, Constants and Trigonometric Functions
Vectors
Construction

v(x,y,z)
orv{x,y,z}
: creates the vector\begin{bmatrix} x \\ y \\ z \end{bmatrix}
. 
v(x,y)
orv{x,y}
: creates the vector\begin{bmatrix} x \\ y \\ 0 \end{bmatrix}
.
Members:

v.x
:x
coordinate 
v.y
:y
coordinate 
v.z
:z
coordinate
Operations:
Let v
and u
be vectors and n
a number.

v + u
: vector addition. 
v  u
: vector subtraction. 
v * u
: vector componentwise multiplication. 
v / u
: vector componentwise division 
v * n
orn * v
: vector scalar multiplication. 
v / n
: vector scalar division. 
v
: syntactic sugar for1 * v
. 
dot(v, u)
: dot product. 
cross(v, u)
: cross product. 
normalize(v)
: returns the unit vector\hat{v}
. 
length(v)
: return the norm ofv
(i.e.v
).
Matrices
Construction:
m( m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44 )
or
m{ m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44 }
Creates the matrix \begin{bmatrix} m_{11} & m_{12} & m_{13} & m_{14} \\ m_{21} & m_{22} & m_{23} & m_{24} \\ m_{31} & m_{32} & m_{33} & m_{34}\\ m_{41} & m_{42} & m_{43} & m_{44}\end{bmatrix}
.
Members:

m:at(c,r)
: element at columnc
and rowr
Operations: Let M
and Q
be matrices, let v
be a vector and let s
be a shape,

M * Q
: matrix multiplication. Returns a matrix. 
M * v
: matrixvector multiplication. Returns a vector. 
M * s
: shape transformation. Returns the shape transformed byM
. 
inverse(M)
: matrix inversion. Returns the inverse of matrixM
.
Constants, Trigonometric Functions and Angles
The following are constants in IceSL:

Pi
: the\pi
constant. 
X
: the vectorv(1,0,0)
. 
Y
: the vectorv(0,1,0)
. 
Z
: the vectorv(0,0,1)
. 
Path
: the path of the current script.
IceSl can calculate the next trigonometric functions:
sin
, asin
, cos
, acos
, tan
, atan
, atan2
.
Angles in IceSL are expected to be written in degrees.
Shapes
Primitive Shapes
load(path)
Loads the 3d mesh at path
. The mesh must be watertight.

path
: Absolute path to a 3d mesh. It supports the following extensions: stl
 obj
 3ds
sphere(r, c)
Creates a sphere of radius r
centered on c
. sphere(r)
is syntactic sugar for sphere(r,v(0,0,0))
a centered sphere.

r
: the sphere's radius 
c
: the sphere's center
cube(dx, dy, dz)
Creates a cube with with sides dx
, dy
, dz
with its bottom face centered on the origin. cube(d)
and cube(v)
are syntactic sugars for cube(d,d,d)
and cube(v.x,v.y,v.z)
respectively.

dx
: length of the face perpendicular to the Xaxis 
dy
: length of the face perpendicular to the Yaxis 
dz
: length of the face perpendicular to the Zaxis
cone(r0, r1, c0, c1)
Creates a cone with base radius r0
, top radius r1
, base center c0
and top center c1
. Moreover, cone(r0,r1,h)
is syntactic sugar for cone(r0,r1,v(0,0,0),v(0,0,h))
.

r0
: the cone's base radius 
r1
: the cone's top radius 
c0
: the cone's base center 
c1
: the cone's top center
cylinder(r, c0, c1)
Creates a cylinder with radius r
, base center c0
and top center c1
. It is syntactic sugar for cone(r,r,c0,c1)
. Additionally, cylinder(r,h)
is also syntactic sugar for cone(r,r,h)
.
polyhedron(points,indices)
Creates a polyhedron with points
as its vertex and indices
to specify its faces.

points
: an array of vectors containing the polyhedron's vertex 
indices
: an array of vectors specifying the polyhedron's faces. Each vector specifies a face constructed from three vertex indices represented by the vector's components. Indices start from 0 and faces point outwards whenever the orientation of the vertices to which the indices refer to is counterclockwise.

Void
Creates an empty primitive
Centered Primitives
Many primitives can be automatically centered at creation to their center of symmetry with respect to their bounding boxes. The following table lists their centered versions.
Primitive  Centered Version  Alternative Centered Version 

load(path) 
load_centered(path) 
load_centered_on_plate(path) 
cube(dx,dy,dz) 
ccube(dx,dy,dz) 
box(dx,dy,dz) 
cone(r0,r1,h) 
ccone(r0,r1,h) 

cylinder(r,h) 
ccylinder(r,h) 
Additionally, the cube and box primitives have the versions ocube(dx,dy,dz)
and cornerbox(dx,dy,dz)
that position their front lowerleft corners at the origin.
Nonprimitive Shapes
linear_extrude(dir, points)
Creates a closed object from the extrusion of a polygon along a direction dir
. The polygon's orientations is specified as set of either clockwise or counterclockwise 2D vertices in points
.

dir
: extruding direction 
points
: polygon specification

linear_extrude_from_oriented(dir, points)
Creates a closed object from the extrusion of a polygon along a direction dir
. Solid geometry is specified as set of closed (i.e. the last vertex matches the first one) counterclockwise 2D vertices and hollow geometry is specified as a set of closed clockwise 2D vertices in points
.

dir
: extruding direction 
points
: polygon specification

rotate_extrude(points, nsteps)
Creates a closed object from the spinning of a polygon along the Zaxis (axis of revolution). The polygon is specified as set of counterclockwise 2D vertices in points
. nsteps
defines the number of steps in the revolution of the polygon, the more steps the smoother the resulting shape is.

sections_extrude(contours)
Crates a closed object by connecting each polygon contained in contours
. Similar to the functions above, a polygon is defined as a table of at least three points. contours
is a table of more than one polygon and all polygons must contain the same number of points.
Implicits
IceSL supports implicits by way of the GL Shading Language (GLSL). A comprehensive list of the builtin functions of GLSL can be found here
implicit_distance_field(boxMin, boxMax, fragment)
implicit_solid(boxMin, boxMax, voxSize, fragment)
Creates an object out of the implicit geometry calculated in fragment
. The bounding box constructed by boxMin
and boxMax
defines the boundaries of the implicit shape.

boxMin, boxMax
: domain of the implicit. The domain is specified by the box constructed with cornersboxMin
andboxMax

voxSize
: voxel output size. Lower values result in greater quality at the expense of higher calculation costs. 
fragment
: string containing the GLSL program. This program calculates the implicit function that defines the output geometry.
Implicits are calculated in IceSL with a sphere tracing method (detailed here). The program specified in fragment
must contain a function called either float distance(vec3 p)
, in the case of implicit_distance_field
, or float solid(vec3 p)
in the case of implicit_solid
. This function calculates the distance field or the solid/empty classification respectively for every point of the domain of the box. A resulting negative value is interpreted as solid whereas a positive value means hollow. Consider the following example.

Above, every point in the domain of the implicit is marked as solid, therefore the geometry created has the shape of the boundary box.
Choosing implicit_distance_field
over implicit_solid
can be summarized as follows: The former requires to estimate a distance to the surface, which can prove difficult and prone to artifacts (when the estimate is too far off from reality). The latter is much easier, as the function simply has to return negative for solid and positive for empty.
Progressive rendering
IceSL by default progressively renders implicits, consequently all the implicit's geometry may not render in one single frame. The order of rendering is defined by the distance to the camera (i.e. scene's point of view). To disable/enable this behavior use the following:
enable_progressive_rendering(shape, bool)

shape
: output from either theimplicit_*
orto_voxel_*
functions. 
bool
: eithertrue
orfalse
This setting must be set right after the implicit/voxels creation. This is because IceSL clones a shape whenever it is transformed and/or reassigned to another variable. Each clone drags with it the current value of this setting.
Uniform variables and file support
It is possible to set values for uniform variables specified inside the implicit's GLSL program via lua commands.
set_uniform_{booleanscalarvectormatrixtexture3d}(implicit, var_name, var_value)
sets var_name
to var_value
inside implicit
.

implicit
: a created implicit 
var_name
: string specifying the name of the uniform variable in the implicit 
var_value
: new boolean/scalar/vector/matrix/texture3d/voxel_distance_field value
Furthermore, implicits can be loaded directly from files as the next function shows.
implicit_distance_field_from_file(boxMin, boxMax, fileName)
implicit_solid_from_file(boxMin, boxMax, voxSize, fileName)
Similar to implicit_distance_field
and implicit_solid
but the fragment program is in fileName
.

boxMin, boxMax
: domain of the implicit. The domain is specified by the box constructed with cornersboxMin
andboxMax

fileName
: file containing the GLSL implicit program. 
voxSize
: voxel output size.
In the next example, we create an implicit whose points inside an origincentered sphere are considered solid. The radius of the sphere is changed using set_uniform_scalar
.

Notice how in the above example, the implicit boundary cuts off some parts of the sphere. Implicits are commonly used to construct geometry that is impossible to create with CSG or lowresolution meshes. See the following example.

3D Textures
IceSL features the ability to construct 3D textures programmatically. There is support for single channel textures as well as RGB textures in 8bit and 32bit variants.
tex3d_{rgb32fr32frgb8fr8f}(w,h,d)
Creates a 3d texture class with the following possible specifications:

rgb32f
: rgb 32bit float texture 
r32f
: luminance 32bit float texture 
rgb8f
: rgb 8bit float texture 
r8f
: luminance 8bit float texture
The 3D texture class possesses the following methods:

w()
: return the texture's width 
h()
: return the texture's height 
d()
: return the texture's depth 
set(u,v,w,val)
: sets the valueval
at texture coordinate(u,v,w)
The following example shows a 1channel 3D texture created programmatically and used as input in an implicit. Two solid cubes (one on each corner) made of the value 1.0
are drawn into the texture while the rest is left at value 10.0
. The implicit maps each point of the implicit area to a point of the texture repeated twice.
Transformations
This section deals with linear transformations. IceSL offers functions to calculate matrices of transformations. To apply a transformation, a transformation matrix is multiplied with a shape. In order to combine more than one transformation, the result of successive multiplications of transformation matrices may also be multiplied with a shape. All applications of transformations should be consistent with a [http://mathworld.wolfram.com/RightHandedCoordinateSystem.html righthanded coordinate system]. This means the rightmost transformation in a combination takes precedence.
translate(dx,dy,dz)
Returns a transformation matrix that translates a shape by dx,dy,dz
units in the Xaxis, Yaxis and Zaxis respectively.

dx
: number of units to translate in the Xaxis 
dy
: number of units to translate in the Yaxis 
dz
: number of units to translate in the Zaxis
translate(v)
Syntactic sugar for translate(v.x,v.y,v.z)
.
rotate(angle,axis)
Returns a transformation matrix that rotates a shape by angle
degrees around the vector axis
.

angle
: angle of rotation. In degrees 
axis
: a vector specifying the axis of rotation
rotate(rx,ry,rz)
rotate(v)
Syntactic sugar for rotate(rz,Z) * rotate(ry,Y) * rotate(rx,X)
and rotate(v.z,Z) * rotate(v.y,Y) * rotate(v.x,X)
respectively.
scale(sx, sy, sz)
Returns a transformation matrix that scales a shape by sx,sy,sz
factors in the Xaxis, Yaxis and Zaxis respectively.

sx
: scale factor in the Xaxis 
sy
: scale factor in the Yaxis 
sz
: scale factor in the Zaxis
scale(s)
scale(v)
Syntactic sugar for scale(s,s,s)
and scale(v.x,v.y,v.z)
respectively.
The above transformations have alternative names (mainly for compatibility purposes). The next table summarizes them:
Transformation  Alternative 

translate  translation 
rotate  rotation 
scale  scaling 
mirror(normal)
Returns a transformation matrix that mirrors a shape along the vector normal
.

normal
: vector specifying the direction to mirror

frame(v)
Returns a transformation matrix that orients (i.e. aligns) a shape's up vector to the direction v
.

v
: a vector specifying the direction to orientate in the transformation.
Magnets
Magnets are volumeless shapes that help building objects by way of assembling parts. Think of a magnet as a fastener that eventually couples with other magnets from different shapes.
magnet('name')

name
: magnet name

Magnets have orientation (the coupling orientation). To couple the magnets, the function snap
returns a transformation matrix that assembles one shape's magnet (i.e. shape1
) to another (i.e. shape0
). The example below builds upon the previous one with the last two emit
statements removed.
snap(shape0, magnet0, shape1, magnet1)

shape0
: base shape 
magnet0
: the base shape's magnet name 
shape1
: shape to be coupled 
magnet1
: coupling shape's magnet name

Snap matrices are not commutative with respect to their connecting magnets. Notice in the previous example that multiplying smatrix
with case
does not yield the same result.
Operations
IceSL supports Constructive Solid Geometry (hereafter referred to as CSG). The following is a list of CSG operations:
CSG Operations
union(s0,s1)
Returns a shape as the union of shape s0
and shape s1
. This operation is commutative.

s0
: A shape 
s1
: A shape
intersection(s0,s1)
Returns a shape as the intersection of shape s0
and shape s1
. This operation is commutative.

s0
: A shape 
s1
: A shape
difference(s0,s1)
Returns a shape as the difference of shape s0
and shape s1
. This operation is not commutative.

s0
: A shape 
s1
: A shape
IceSL supports abbreviated multiinput versions of these operations. Assume s
is a shape and S
is a table of shapes. The following table summarizes these operations.
Operation  NArgument Version  Short Version 

union(s0,s1) 
union{s0,...,sn}, union(S) 
U(s0,s1), U{s0,...,sn}, U(S) 
intersection(s0,s1) 
intersection{s0,...,sn}, intersection(S) 
I(s0,s1), I{s0,...,sn}, I(S) 
difference(s0,s1) 
difference{s0,...,sn}, difference(S) 
D(s0,s1), D{s0,...,sn}, D(S) 
Nary versions from the above table are associative to the left. For example D{s0,s1,s2,s3}
is equivalent to D(D(D(s0,s1),s2),s3)
. For this to be computationally sound 1 2, the result of nary operations over a single shape is defined as the shape itself (i.e. U{s} = s
, I{s} = s
and D{s} = s
).
Other Operations
flip(m)
Inverts the orientation of the faces from the mesh m
. This is specially useful when loading a mesh that has its faces defined clockwise.

m
: input mesh
convex_hull(shape)
Creates the convex hull of shape
. It only works with meshes or union of meshes.

shape
: input primitive

dilate(mesh, factor)
erode(mesh, factor)
Dilates and erodes a mesh respectively by factor
. The vertices in mesh
need to be merged a priori (use merge_vertices
).

mesh
: input mesh 
factor
: dilation/erosion factor

linear_offset(mesh,direction,offset)
Creates a linear offset of mesh
in the direction direction
by factor offset
. Depending on the sign of offset
, the offset either goes inwards (i.e. negative sign) or outwards (i.e. positive sign). Only works with meshes with connectivity information, call merge_vertices
when such information does not exist (e.g. stl meshes).

mesh
: input mesh 
direction
: offset direction 
offset
: offset factor

linear_offsets(mesh,directions,offsets)
Same as linear_offset
but multiple offsets can be applied at the same time. directions
and offsets
are arrays of vectors and numbers respectively and they have an ordered onetoone correspondence.
Shape Representation
IceSL offers several functions for calculating representations of shapes (i.e., meshes, voxels, etc).
to_voxel_solid(shape, voxSize)
to_voxel_solid(tex3d, voxSize)
Creates a solid voxel volume from shape
or tex3d
where each voxel measures voxSize
units.

shape
: input shape 
tex3d
: 3D texture 
voxSize
: voxel size (in mm)
to_voxel_solid(tex3d, boxMin, boxMax)
Creates a solid voxel volume from tex3d
. boxMin
and boxMax
specify the volume in space to create the solid. Values in tex3d
above 0.5
are considered solid, otherwise they are considered empty.
to_voxel_distance_field(shape, voxSize)
Creates a voxel distance field from shape
using this technique. Each voxel measures voxSize
units.

shape
: input shape 
voxSize
: voxel size (in mm)
set_distance_field_iso(voxels, threshold)
In a distance field, sets the threshold to classify voxels as empty/solid whenever it is less/greater than threshold
respectively.

voxels
: voxel shape obtained byto_voxel_distance_field

threshold
: Number between0
(empty) and1
(solid). Default is0.5
smooth_voxels(voxShape, windowSize)
Smooths the voxel shape voxShape
using a trilinear interpolation with a windows size of windowSize
. This functions does not return a shape, instead it modifies the shape specified on the first parameter.

voxShape
: input shape. Only supports voxels 
windowSize
: interpolation 3D window size
smooth_voxels_preserve_volume(voxShape, windowSize)
Same as above but tries to preserve the shape's volume.

to_mesh(shape, voxSize)
Creates a mesh from shape
using the marching cubes algorithm. Before calculating the resulting mesh, the 3D space containing the shape is discretized using voxels of size voxSize
units.

shape
: input shape 
voxSize
: voxel size of space discretization (in mm)
From assets
image_contouring(file,pixel_size)
Extracts contours out of an image file. Pixels colored black are considered hollow, while any other color is considered solid. Returns a table of IMGContour
objects.

file
: input image file (PNG and TGA supported) 
pixel_size
: size in mm, of a pixel
The IMGContour
object has the following members:

outline
: The contour (table)

svg_contouring(file,dpi)
Extracts contours out of a SVG file. Returns a table of SVGContour
objects.

file
: input svg file 
dpi
: dots per inch. Use 90 for Inkscape files
The SVGContour
object has the following members:

outline
: The contour (table) 
fill
: fill color for the contour (triplet) 
stroke
: stroke color for the contour (triplet) 
strokeWidth
: stroke width for the contour (num) 
hasFill
: contour is colorfilled (bool) 
hasStroke
: contour is colorbordered (bool)
font(ttf)
Creates a font object based on the font described in the TrueType Font file ttf
.

ttf
: TrueType Font file The interface to the font object is the following: 
str(string, tracking)
: Returns a 3D geometry of the stringstring
. If present, the font's kerning information is added totracking
tracking.

load_raw_voxels(fileName, thicken)
Creates a shape out of raw voxel data in fileName
. thicken
stands for the thickening applied to the voxels.

fileName
: input file 
thicken
: thickening of voxels The format of the file is a continuous chunk of voxels with the following information in sequence:
 Position (3 ints)
 Normal (3 floats)
 Color (3 unsigned chars)
 State (1 bool)
Distribute
Additionally to changing the representations of a shape, IceSL also provides a function to calculate an evenly distributed set of points covering a surface. For each point this function also reports its surface normal and maximum distance to the set of nearest points.
distribute(shape, density)
Returns a Lua array describing the surface of shape
using Voronoid Iteration. The array is made out of triplets wherein the first element is a position of the surface, the second its surface normal and the third its distance to the furthest neighboring position in the array. How sparse the positions are is determined by the argument density
.

shape
: input shape 
density
: position density. This argument is clamped to the unit interval where1
signifies high density and0
no density
Other Functionality
Printing settings
Scripts also have the ability to change printing settings directly from within them. This allows the user (among other reasons) to specify printing settings tailored to the geometry being described in the script.
IceSL gives priority to an assignment of a printing setting according to the following list:
 Default IceSL values  bottom priority
 Printer features (i.e.,
features.lua
in printer profiles)  Print profile (e.g., fast print, high quality, etc.)
 Material profile (e.g., abs, pla, etc.)
 Lua script
 User interface  top priority
For example, if the value of a setting is specified in a printer profile as well as in the lua script, the latter takes priority. Moreover, if the user sets it manually using the UI then this overrides all other assignments.
set_setting_value(setting, value)
Sets the printing parameter settings
to value

setting
: Internal name of the printing setting to change 
value
: Value to assign. May be a boolean, a number, a string or a table. The latter is reserved to perlayer assignments whereas the table is to be constructed as follows:{ [key_0]=value_0, ... , [key_n]=value_n }
set_setting_value(setting, tex3d, boxMin, boxMax)
Sets the printing parameter setting
as a field that extends from boxMin
to boxMax
with values from tex3d

setting
: Internal name of the printing setting to change 
tex3d
: Value of the field as a 3d texture 
boxMin,boxMax
: Field extent
Variable caching
It is possible to turn on/off variable caching in IceSL with the system variable enable_variable_cache
. Variable caching is useful when editing a script that constructs an object or preforms a calculation that is CPU intensive (i.e. consumes significant time).
In the following example it is possible to change the scaling of mesh
without incurring in the penalty of recalculating the result of to_mesh
:

Tweaks
ui_scalar(name, default, min, max)
Creates a sliding bar to interactively set a float value between min
and max
.

name
: the sliding bar's name 
default
: default value 
min
: minimum value 
max
: maximum value

ui_scalarBox(name, default, step)
Creates a quantity (+/) box stepped by step
to interactively set a float value.

name
: the box's name 
default
: default value 
step
: increment/decrement delta
ui_number(name, default, min, max)
Creates a sliding bar to interactively set an integer value between min
and max
.

name
: the sliding bar's name 
default
: default value 
min
: minimum value 
max
: maximum value
ui_numberBox(name, default)
Creates a quantity (+/) box to interactively set an integer value.

name
: the box's name 
default
: default value
ui_bool(name, default)
Creates a checkbox to interactively set a Boolean value.

name
: the checkbox's name 
default
: default value
Fields
Fields are UI objects for interactively building 3D textures. They are useful for carving, sculpting and specifying surfaces among other things.
ui_field(name, boxMin, boxMax)
Creates a labeled button to build a 3D texture in the box space specified by boxMin
and boxMax
.

name
: field name 
boxMin
: left corner of the 3D texture 
boxMax
: right corner of the 3D texture
ui_field_value_at(name, p)
Retrieves the value of the field name
(created by ui_field
) at position p
.

name
: field name 
p
: position to inquire
ui_file(fileName)
Creates a UI to load/save all the script's tweaks and field values from/into fileName
.

fileName
: file path to load/save tweaks and fields values
The following example sculpts a sphere using a field named Sculpting
and saves the field values into the file sculpt.xml
In the next example, we use a field to avoid distributing (i.e. function distribute
) parts of the shape surface.
Mesh Information
bbox(shape)
Returns the bounding box of shape
as an object AAB
.

shape
: Input shape TheAAB
object has the following members: 
min_corner
: Minimum corner of the bounding box (vector) 
max_corner
: Maximum corner of the bounding box (vector) 
center
: Center of the bounding box (vector) 
extent
: Dimensions of the bounding box (vector) 
empty
: Boolean value indicating whether the bounding box is (bool) 
enlarge(mm)
: Enlarges the box bymm
millimeters (method)
mesh_vertices(mesh)
Returns a table containing the vertices of a mesh.

mesh
: Input mesh
mesh_normals(mesh)
Returns a table containing the normals of a mesh.

mesh
: Input mesh
mesh_local_edge_size(mesh)
Returns a table containing the average connecting edge length of every vertex of a mesh.
Miscellaneous Functions
print(str)
Prints the message str
dofile(path)
Executes the scipt in path

str
: input string
load_image(filename)
Returns a 2D table where each (i,j)
index is a vector that corresponds to the rgb pixel from the image file filename
screenshot()
Saves a screenshot in the pictures
folder or current script folder for the windows build.
sleep(ms)
Suspends execution of IceSL by ms
milliseconds.

ms
: number of milliseconds 
path
: path to the script file
dump(shape, filename)
Saves the shape shape
in file filename

shape
: shape to save 
filename
: destination file to save the shape. Supports stl and obj extensions