View License

Download apps, toolboxes, and other File Exchange content using Add-On Explorer in MATLAB.

» Watch video

Highlights from
stlwrite - Write binary or ascii STL file

3.4 | 5 ratings Rate this file 43 Downloads (last 30 days) File Size: 4.06 KB File ID: #36770 Version: 1.0

stlwrite - Write binary or ascii STL file



This is an update to the excellent work done by Sven Holcombe to add color support

| Watch this File

File Information

  STLWRITE(FILE,fv) writes a stereolithography (STL) file to FILE for a triangulated
  patch defined by FV (a structure with fields 'vertices' and 'faces').

  STLWRITE(FILE,FACES,VERTICES) takes faces and vertices separately, rather than in an FV struct

  STLWRITE(FILE,X,Y,Z) creates an STL file from surface data in X, Y, and Z. STLWRITE triangulates
  this gridded data into a triangulated surface using triangulations options specified below. X, Y
  and Z can be two-dimensional arrays with the same size. If X and Y are vectors with length equal
  to SIZE(Z,2) and SIZE(Z,1), respectively, they are passed through MESHGRID to create gridded
  data. If X or Y are scalar values, they are used to specify the X and Y spacing between grid

  STLWRITE(...,'PropertyName',VALUE,'PropertyName',VALUE,...) writes an STL file using the
  following property values:

  MODE - File is written using 'binary' (default) or 'ascii'.

  TITLE - Header text (max 80 characters) written to the STL file.

  TRIANGULATION - When used with gridded data, TRIANGULATION is either:
                    'delaunay' - (default) Delaunay triangulation of X, Y
                    'f' - Forward slash division of grid quadrilaterals
                    'b' - Back slash division of quadrilaterals
                    'x' - Cross division of quadrilaterals
                  Note that 'f', 'b', or 't' triangulations require FEX entry 28327, "mesh2tri".

   FACECOLOR - [nx3]- [red_1, green_1, blue_1; red_2, green_2, blue_2; ...; red_n, green_n, blue_n]
    - N is the number of faces.
    - range for colors is 5 bits (0:31).
    - Only works in binary files.

  Example 1:
      % Write binary STL from face/vertex data
      tmpvol = zeros(20,20,20); % Empty voxel volume
      tmpvol(8:12,8:12,5:15) = 1; % Turn some voxels on
      fv = isosurface(tmpvol, 0.99); % Create the patch object
      stlwrite('test.stl',fv) % Save to binary .stl

  Example 2:
      % Write ascii STL from gridded data
      [X,Y] = deal(1:40); % Create grid reference
      Z = peaks(40); % Create grid height

  Original idea adapted from surf2stl by Bill McDonald. Huge speed
  improvements implemented by Oliver Woodford. Non-Delaunay triangulation
  of quadrilateral surface input requires mesh2tri by Kevin Moerman.

Note: This entry was originally titled "patch2stl", however has been renamed to "stlwrite" after more general input was added.


Stlwrite(Filename, Varargin) inspired this file.

This file inspired Visual Hull Matlab and Convert To A Solid Of Stl File From Periodic Surface Equations And Save.

MATLAB release MATLAB 7.12 (R2011a)
Tags for This File   Please login to tag files.
Please login to add a comment or rating.
Comments and Ratings (7)
18 Feb 2017 Alexander Heinz

17 Feb 2017 sandeep kundala

what should be the value of varargin?

Comment only
07 Sep 2016 Zhuowei Miao

09 Sep 2015 Paul Kassebaum

17 Mar 2014 Thomas Clark

Immediate bug using the STLWRITE(FILE,FACES,VERTICES) syntax:

'Attempted to access facecolor(:,1); index out of bounds because size(facecolor)=[0,0]'

Unfortunately, the options parsing code is pretty dense (much denser than it need be, I think) so rather than debug it myself, I'm shifting back to Sven's code.

Grant, you may find this submission useful; its a very convenient and robust way of options parsing:

04 Jul 2013 Sven

Sven (view profile)

Hi Chris, just a note that the stlwrite on which this file is based has facecolor implemented properly.

Comment only
03 Jul 2013 Chris Rorden

This is a useful tool. Unfortunately, Grant's new version has a small bug, which you can elicit by running "Example 1" from the help. To fix this bug, change the line
if isfield(options, 'facecolor')
to read
if isfield(options, 'facecolor') && (length(options.facecolor) > 0)

Contact us