Home My Page Projects IceSL
Summary Activity Tracker SCM Files Mediawiki


Scripting - IceSL-Next

From IceSL Wiki
(Redirected from Scripting)
Jump to: navigation, search

This is the official IceSL scripting language documentation wiki. Examples featured here are for the most part self-contained 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.




The scripting language of IceSL (hereafter refered 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:

  1. Vector (e.g. v(1,0,0) )
  2. Matrix (e.g. m(1,0,0,1, 0,1,0,1, 0,0,1,1, 0,0,0,1) )
  3. Shapes:
    1. Primitives (e.g. sphere(1) ),
    2. Meshes (e.g. load('fox.stl')),
    3. Implicits,
    4. Voxels.

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 ) IceSL | IceSL-online

  • 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 (usally 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:

b = box(10)
emit( b, 0 )
c = sphere(5)
emit( translate(0,0,5) * c, 1 )
Example emit.png

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 1cm2.

Notice that, in order to have a visual aid on view orientation, axes are drown in the bottom-left corner. The red, green and blue lines correspond to the positive X, Y, and Z axes respectively.

Printing bed.png

Vectors, Matrices, Constants and Trigonometric Functions


  • v(x,y,z)
  • or v{x,y,z} : creates the vector \begin{bmatrix} x \\ y \\ z
  • v(x,y)
  • or v{x,y} : creates the vector\begin{bmatrix} x \\ y \\ 0 \end{bmatrix}.
  • v.x : x coordinate
  • v.y : y coordinate
  • v.z : z coordinate


Let v and u be vectors and n a number.

  • v + u : vector addition.
  • v - u : vector subtraction.
  • v * u : vector component-wise multiplication.
  • v / u : vector component-wise division
  • v * n or n * v : vector scalar multiplication.
  • v / n : vector scalar division.
  • -v : syntatic sugar for -1 * v.
  • dot(v, u) : dot product.
  • cross(v, u) : cross product.
  • normalize(v) : returns the unit vector \hat{v}.
  • length(v) : return the norm of v (i.e. | | v | | ).


 m( m11, m12, m13, m14,
    m21, m22, m23, m24,
    m31, m32, m33, m34,
    m41, m42, m43, m44 )
 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} .

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 : matrix-vector multiplication. Returns a vector
  • M * s : shape transformation. Returns the shape transformed by M .
  • inverse(M) : matrix inversion. Returns the inverse of matrix M.

Constants, Trigonometric Functions and Angles

The following are constants in IceSL

  • Pi : the π constant.
  • X : the vector v(1,0,0).
  • Y : the vector v(0,1,0).
  • Z : the vector v(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.


Primitive Shapes

load(path) IceSL

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) IceSL | IceSL-online

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) IceSL | IceSL-online

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 perdendicular to the X-axis
  • dy : length of the face perpendicular to the Y-axis
  • dz : length of the face perpendicular to the Z-axis

cone(r0, r1, c0, c1) IceSL | IceSL-online

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) IceSL | IceSL-online

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) IceSL | IceSL-online

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 compotnents. Indices start from 0 and faces point outwards whenever the orientation of the vertices to which the indices refer to is counterclockwise.
p = polyhedron(
  { v(0,0,0), v(1,0,0), v(0,1,0), v(1,1,0), v(0.5,0.5,1) },
  { v(0,3,1), v(0,2,3), v(0,1,4), v(1,3,4), v(3,2,4), v(2,0,4) } )
emit( p )
Example polyhedron.png

Void IceSL | IceSL-online

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 lower-left corners at the origin.

Non-primitive Shapes

linear_extrude(dir, points) IceSL | IceSL-online

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 counter-clockwise 2D vertices in points.
  • dir : extruding direction
  • points : polygon specification
triangle = { v(-10,0), v(0,10), v(10,0) }
-- 50 units along the Z-axis
dir    = v(0,0,50)
emit( linear_extrude(dir, triangle) )
Example linear extrude.png

linear_extrude_from_oriented(dir, points) IceSL | IceSL-online

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) counter-clockwise 2D vertices and hollow geometry is specified as a set of closed clockwise 2D vertices in points.
  • dir : extruding direction
  • points : polygon specification
polygon = { 
v(10,10), v(-10,10), v(-10,-10), v(10,-10), v(10,10), -- Solid
v(0,6), v(6,-6), v(-6,-6), v(0,6) } -- Hollow
dir    = v(0,0,10)	
emit( linear_extrude_from_oriented(dir, polygon))
Example linear extrude from oriented.png

rotate_extrude(points, nsteps) IceSL | IceSL-online

Creates a closed object from the spinning of a polygon along the Z-axis (axis of revolution). The polygon is specified as set of counter-clockwise 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.
radius = v(10,0,0)
triangle = { radius + v(1,0,0), radius + v(0,1,0), radius + v(-1,0,0) }
emit( rotate_extrude( triangle, 100 ) )
Example rotate extrude.png

sections_extrude(contours) IceSL

Crates a closed object by conecting 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.
se = sections_extrude({
 {rotate(  0,Z) * v( 0, 0, 0),
  rotate(  0,Z) * v(10, 0, 0),
  rotate(  0,Z) * v(10,10, 0),
  rotate(  0,Z) * v( 0,10, 0)},
 {rotate( 60,Z) * v( 0, 0,10), 
  rotate( 60,Z) * v(10, 0,10),
  rotate( 60,Z) * v(10,10,10),
  rotate( 60,Z) * v( 0,10,10)},
 {rotate(120,Z) * v( 0, 0,20),
  rotate(120,Z) * v(10, 0,20),
  rotate(120,Z) * v(10,10,20),
  rotate(120,Z) * v( 0,10,20)}
Example sections extrude.jpg


IceSL supports implicits by way of the GL Shading Language (GLSL). A comprehensive list of the built-in functions of GLSL can be found here

implicit_distance_field(boxMin, boxMax, fragment) IceSL

implicit_solid(boxMin, boxMax, voxSize, fragment) IceSL

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 corners boxMin and boxMax
  • voxSize : voxel output size. Lower values result in greater quality at the expense of higher calculation costs.
  • fragment : string containing the GLSL progam. 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.

cube = implicit_distance_field( v(-10,-10,-10), v(10,10,10),
float distance(vec3 p) {
	return -1;
emit (cube)
Example implicit 1.png

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.

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(implicit, bool) IceSL

  • implicit: output from either implicit_distance_field or implicit_solid
  • bool: either true or false

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_{boolean|scalar|vector|matrix|texture3d}(implicit, var_name, var_value) IceSL

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) IceSL

implicit_solid_from_file(boxMin, boxMax, voxSize, fileName) IceSL

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 corners boxMin and boxMax
  • fileName: file containing the GLSL implicit program.
  • voxSize: voxel output size.

In the next example, we create an implicit whose points inside an origin-centered sphere are considered solid. The radius of the sphere is changed using set_uniform_scalar.

sphere = implicit_solid(v(-10,-10,-10), v(10,10,10), 0.25,
uniform float r = 5;
float solid(vec3 p) {
	return length(p) - r;
set_uniform_scalar(sphere, 'r', 10.5)
Example implicit 2.png

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 low-resolution meshes. See the following example.

spahe = implicit_distance_field(v(-2,-2,0), v(2,2,8),
float distance(vec3 p) {
	return 0.01 * ((pow(sqrt(p.x*p.x + p.y*p.y) - 3, 3) + p.z*p.z - 1) + noise(p));
emit(scale(5) * shape)
Example implicit 3.png

3D Textures

IceSL features the ability to construct 3D textures programatically. There is support for single channel textures as well as RGB textures in 8bit and 32bit variants.


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 value val at texture coordinate (u,v,w)

The following example shows a 1-channel 3D texture created programatically 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 repated twice.

tex_dim = v(10,10,10)
tex = tex3d_r32f(tex_dim.x,tex_dim.y,tex_dim.z)
for ucoord = 0, tex_dim.x-1 do
  for vcoord = 0, tex_dim.y-1 do
    for wcoord = 0, tex_dim.z-1 do
      if (ucoord < tex_dim.x/2 and vcoord < tex_dim.y/2 and wcoord < tex_dim.z/2) or
         (ucoord >= tex_dim.x/2 and vcoord >= tex_dim.y/2 and wcoord >= tex_dim.z/2) then
imp_dim = v(20,20,20)
imp = implicit_distance_field(v(0,0,0), imp_dim,
uniform sampler3D tex_data;
uniform vec3 imp_ext;
float distance(vec3 p)
	return 0.01 * texture(tex_data,(p/imp_ext)*2.0).x;
set_uniform_vector(imp, 'imp_ext', imp_dim)
set_uniform_texture3d(imp, 'tex_data', tex)
Example 3dtex.png


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 right-handed coordinate system. This means the rightmost transformation in a combination takes precedence.

translate(dx,dy,dz) IceSL | IceSL-online

Returns a transformation matrix that translates a shape by dx,dy,dz units in the X-axis, Y-axis and Z-axis respectively.
  • dx : number of units to translate in the X-axis
  • dy : number of units to translate in the X-axis
  • dy : number of units to translate in the X-axis

translate(v) IceSL | IceSL-online

Syntactic sugar for translate(v.x,v.y,v.z).

rotate(angle,axis) IceSL | IceSL-online

Returns a transformation matrix that rotates a shape by angle degrees around the vector axis.
  • angle : angle of roation. In degrees
  • axis : a vector specifying the axis of rotation

rotate(rx,ry,rz) IceSL | IceSL-online

rotate(v) IceSL | IceSL-online

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) IceSL | IceSL-online

Returns a transformation matrix that scales a shape by sx,sy,sz factors in the X-axis, Y-axis and Z-axis respectively.
  • sx : scale factor in the X-axis
  • sy : scale factor in the X-axis
  • sy : scale factor in the X-axis

scale(s) IceSL | IceSL-online

scale(v) IceSL | IceSL-online

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) IceSL | IceSL-online

Returns a transformation matrix that mirrors a shape along the vector normal.
  • normal : vector specifying the direction to mirror
mesh = load_centered('fox.stl')
emit( mesh )
emit( translate(0,-100,0) * mirror(v(0,1,0)) * mesh )
Example mirror.png

frame(v) IceSL | IceSL-online

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 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') IceSL | IceSL-online

name : magnet name
case = union( cylinder(5,10), translate(0,0,10) * magnet('m1') )
head = union( cone(5,1,10), translate(0,0,0) * rotate(180,X) * magnet('m2') )
emit(translate(-20,0,0) * head)
Example magnet.png

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) IceSL | IceSL-online

  • shape0 : base shape
  • magnet0 : the base shape's magnet name
  • shape1 : shape to be coupled
  • magnet1 : coupling shape's magnet name
smatrix = snap(case, 'm1', head, 'm2')
emit(union(smatrix * head, case))
Example snap.png

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.


IceSL suports Constructive Solid Geometry (hereafter refered to as CSG). The following is a list of CSG operations:

CSG Operations

union(s0,s1) IceSL | IceSL-online

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) IceSL | IceSL-online

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) IceSL | IceSL-online

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 multi-input versions of these operations. Assume s is a shape and S is a table of shapes. The following table summarizes these operations.

Operation N-Argument 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)

N-ary 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 sound12, the result of n-ary 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

merge{ s0,...,sn } IceSL | IceSL-online

Same as union, however this operation internally discards the CSG tree. merge therefore creates a shape that produces less computational overhead, specially when the union consists of a large number of shapes. When merging shapes created with linear_extrude_from_oriented, make sure the outermost geometry is solid (i.e., specified counter-clockwise). If the outermost geometry is hollow (i.e., specified clockwise) then all geometry inside will not be visible. This is especially important when loading svg contours that may be specified as hollow geometry.

flip(m) IceSL

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) IceSL

Creates the convex hull of shape. It only works with meshes or union of meshes.
  • shape : input primitive
mesh = load('crystal.stl')
emit( translate(100,0,0) * mesh )
emit( convex_hull(mesh) )
Example convex hull.png

dilate(mesh, factor) IceSL

erode(mesh, factor) IceSL

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
mesh = scale(0.1) * merge_vertices(load_centered('fox.stl'))
emit(translate(0,0,-6) * erode(mesh,0.3))
emit(translate(15,0,0) * dilate(mesh,0.5))
Example dilate erode.png

linear_offset(mesh,direction,offset) IceSL

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
mesh = merge_vertices(load('fox.stl'))
emit( mesh )
emit( translate(100,0,0) * linear_offset(mesh,v(0,1,0),10) )
Example linear offset.png

linear_offsets(mesh,directions,offsets) IceSL

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 one-to-one correspondance.

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) IceSL

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) IceSL

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) IceSL

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 by to_voxel_distance_field
  • threshold : Number between 0 (empty) and 1(solid). Default is 0.5

smooth_voxels(voxShape, windowSize) IceSL

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) IceSL

Same as above but tries to preserve the shape's volume.
s = sphere(5)
vs1 = to_voxel_solid(s, 0.1)
vs2 = to_voxel_solid(s, 0.1)
emit(translate(0,0,0)  * s)
emit(translate(15,0,0) * vs1)
emit(translate(30,0,0) * vs2)
Example voxels.png

to_mesh(shape, voxSize) IceSL

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 Asset

svg_ex(file,dpi) IceSL

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 color-filled (bool)
  • hasStroke : contour is color-bordered (bool)
svg_shapes = svg_ex('restroom.svg',90)
for i,contour in pairs(svg_shapes) do
  if contour:hasFill() then
    set_brush_color(i, contour:fill()[1], contour:fill()[2], contour:fill()[3])
  emit(linear_extrude(v(0,0,5),contour:outline()), i)
Example svg ex.png

font(ttf) IceSL

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 string string. If present, the font's kerning information is added to tracking tracking
f = font(Path .. 'LiberationMono-Regular.ttf')
text = f:str('IceSL', 10)
emit(scale(0.5,0.5,10) * text)
Example font.jpg

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:

  1. Position (3 ints)
  2. Normal (3 floats)
  3. Color (3 unsigned chars)
  4. State (1 bool)


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) IceSL

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 inverval where 1 signifies high density and 0 no density
shape = cube(10)
s = distribute(shape, 0.2)
centroids = {} 
for i = 1,#s,1 do
	centroids[i] = translate(s[i][1]) * frame(s[i][2]) * 
		merge{ cone(s[i][3],0,1), mirror(Z) * cone(s[i][3],0,1) }
Example distribute.png

Other Functionality

Printing setttings

It is possible for custom printing settings to be shown and modified in IceSL's UI. Currenyly there is support for two types of settings; booleans and numbers. The following two definitions can be used in file features.lua of a printer profile:

add_checkbox_setting(internal_name, description)

add_setting(internal_name, description, minVal, maxVal)

Adds setting internal_name with description, minimum value minValue and maximum value maxValue. Default value is false for add_checkbox_setting and minValue for add_setting:
  • internal_name : internal name for setting
  • description : description of setting (shown in UI)
  • minValue : minimal value in case of a number setting (i.e., add_setting)
  • maxValue : maximum value in case of a number setting (i.e., add_setting)

The setting's value can then be queried in file printer.lua of the printer profile by using the setting's internal_name.

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:

  1. Default IceSL values -- bottom priority
  2. Printer features (i.e., features.lua in printer profiles)
  3. Print profile (e.g., fast print, high quiality, etc.)
  4. Material profile (e.g., abs, pla, etc.)
  5. Lua script
  6. 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 assignements.

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 per-layer 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 usefull when editing a script that constructs an object or perfoms a calculation that is cpu intensive (i.e. consumes signficant time).

In the following example it is possible to change the scaling of mesh without incurring in the penalty of re-calculating the result of to_mesh:

enable_variable_cache = true
s = sphere(10)
if not mesh then
    mesh = to_mesh(s,1)
emit(scale(1) * mesh)


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
r = ui_scalar("Radius",10,1,20)
Example tweaks.png


Fields are UI objects for interactively building 3D textures. They are usefull 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


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 scuplts a sphere usind a field named Sculpting and saves the field values into the file sculpt.xml

s = sphere(10)
bx = bbox(s)
f = ui_field('Sculpting',bx:min_corner(),bx:max_corner())
result = intersection(s,to_voxel_solid(f,bx:min_corner(),bx:max_corner()))
Example fields.png

In the next example, we use a field to avoid distributing (i.e. function distribute) parts of the shape surface.

enable_variable_cache = true
shape = sphere(10)
if not s then
  s = distribute(shape, 0.5)
bx = bbox(shape)
f = ui_field('surface', bx:min_corner(),bx:max_corner())
cubes = {}
for i = 1,#s do
  if ui_field_value_at('surface', s[i][1]) > 0.5 then
    cubes[#cubes+1] = translate(s[i][1]) * frame(s[i][2]) * ccube(s[i][3]) 
Example fields2.png

Mesh Information

bbox(shape) IceSL

Returns the bounding box of shape as an object AAB.
  • shape : Input shape

The AAB 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 wether the bounding box is (bool)
  • enlarge(mm): Enlarges the box by mm millimeters (method)

mesh_vertices(mesh) IceSL

Returns a table containing the vertices of a mesh.
  • mesh : Input mesh

mesh_normals(mesh) IceSL

Returns a table containing the normals of a mesh.
  • mesh : Input mesh

mesh_local_edge_size(mesh) IceSL

Returns a table containing the average connecting edge length of every vertex of a mesh.

Miscellaneous Functions

print(str) IceSL

Prints the message str

dofile(path) IceSL

Executes the scipt in path
  • str : input string

load_image(filename) IceSL

Returns a 2D table where each (i,j) index is a vector that corresponds to the rgb pixel from the image file filename

screenshot() IceSL

Saves a screenshot in the pictures folder or current script folder for the windows and linux builds respectively.

sleep(ms) IceSL

Suspends execution of IceSL by ms milliseconds.
  • ms : numer of milliseconds
  • path : path to the script file

dump(shape, filename) IceSL

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