PLY Tools

Below are a set of tools for manipulating PLY files.

Here are some quick links to the descriptions of these tools:

ply2asc

usage: ply2asc [flags] [infile] > outfile
   or: ply2asc [flags] < infile > outfile
          -p (print element labels)

ply2bboxcube

Usage: ply2bboxcube in1.ply [in2.ply] ...

And it will generate files called in1.bboxcube.ply,
in2.bboxcube.ply, etc.....
Which contain all 12 faces of the bounding box.

ply2bin

usage: ply2bin [infile] > outfile
   or: ply2bin < infile > outfile

plycrunchset

Usage:  ply2crunchset [options] in.ply...

Options:
         -l levels    number of levels for final
                      .set file (default 4)

ply2verts

Usage: ply2verts [flags] [in.ply] > out
   or: ply2verts [flags] < in.ply > out
Flags:
       -s scale

plyaddinfo

Usage: plyaddinfo file.ply 'info_1' ... 'info_n'
   or: plyaddinfo - 'info_1' ... 'info_n' < in.ply > out.ply

plyarea

usage: plyarea [in.ply]
   or: plyarea < in.ply

plybbox

usage: plybbox [in.ply]
   or: plybbox < in.ply

plybound

usage: plybound [flags] [in.ply] > out.ply
   or: plybound [flags] < in.ply > out.ply
       -b box_size (default = 2)
       -c xcenter ycenter zcenter (default is origin)
       -m (use mass center instead of geometric center)
       -p (only print information)

plycomps

usage: plycomps [flags] [in.ply]
   or: plycomps [flags] < in.ply
       -s (silent mode)
       -m num filename
          (writes out all components with >= num verts)
       -l num filename
          (writes out all components with <= num verts)
       -t num (max num of components printed to screen and written to file)

plyconfcrop

usage: plyconfcrop [flags] [in.ply] > out.ply
   or: plyconfcrop [flags] < in.ply > out.ply
       -c confidence_threshold (default = 0)

   This program will remove all vertices (and their
   corresponding faces) that have a confidence at or 
   below the cutoff threshold.  By default, it removes
   vertices with confidence 0.

plycrunch

usage: plycrunch [flags] [in.ply] > out.ply
   or: plycrunch [flags] < in.ply > out.ply
       -d distance (default = 1e-04)

plydice

usage: plydice [options] subvol_size epsilon [in.ply]
   or: plydice [options] subvol_size epsilon < in.ply

Options:
       -writebbox bboxname (writes mesh bbox to file)
       -printbbox    (prints bbox to stdout)
       -outdir dir   (directory for storing output files..)
       -dice subvolsize epsilon basename
              Will write out subvols of the form:
              basename_-2_3_0.ply
              (and write the names of the files to stdout.)
       -odice subvolsize epsilon basename
              Other dice option.  Will not actually generate
              any ply files, but will write their names to
              stdout (useful to find which subvols have tris.
       -crop minx miny minz maxx maxy maxz (crops output)

As well as plyxform options:
       -f m.xf (a transform matrix file)
       -t xtrans ytrans ztrans (translation)
       -s xscale yscale zscale (scale)
       -r xangle yangle zangle (rotation, all in degrees)
       -q qi qj qk ql  (rotation, quaternion)
  (point = m.xf * (ftrans_factor + rotz * roty * rotx * scale_factor * point))

plyflip

usage: plyflip [flags] [in.ply] > out.ply
   or: plyflip [flags] < in.ply > out.ply
       -n (flip normals)
       -b (flip both normals and vertex order in faces)

plyhead

Usage: plyhead [ply-file]
   or: plyhead < ply-file

  plyhead prints the header information from a Ply file.

Note:  When reading on stdin, it makes the assumption
that it is a valid ply file.  If you're not sure,
pass the filename as an argument.

plymirror

usage: plymirror in.mir in.xf [-o out.ply] [-r rest.ply] [in.ply]
   or: plymirror in.mir in.xf [-o out.ply] [-r rest.ply] < in.ply
   or: plymirror all    none  [-o out.ply] [-r rest.ply] < in.ply
where:
     in.mir is mirror file, four lines of 3 coords, for each
              corner of the mirror glass.  (the keyword
              'all' mirrors the entire scan in x.)
     in.xf is the .xf file moving the mirror file to match
              the position of the mirror in the input file.
              ('none' loads the identity matrix.)
     out.ply is the output file for all points seen through
              the mirror.
     rest.ply is the output file for all points NOT seen
              through the mirror.
     in.ply   is the input ply file.

plynormals

usage: plynormals [flags] [in.ply] > out.ply
   or: plynormals [flags] < in.ply > out.ply
       -f (flip sign of normals)
       -a (use area weighted average)
usage: plyremove [in.ply] [element1] ... [elementN] > out.ply
   or: plyremove - [element1] ... [elementN] < in.ply > out.ply

This program removes elements from a ply file.
Or you can remove a property from an element.
For example: plyremove - face vertex.z < x.ply > y.ply
will remove faces and z components of vertices.

plys2set

Usage:  plys2set [-q] [-no_dir_strip] [-no_xform] out.set x1.ply x2.ply...

It checks to make sure out.set has the .set extension.
Then it creates/overwrites the .set file, using the
specified ply files.  If a corresponding .xf file
does not exist, it creates one (with the identity
matrix).  If the .xf file already exists, it does not
touch it.  It sets the lowest resolution .ply file to
be the default, and all others are not preloaded.

plysetlevel

Usage: plysetlevel n 1.set 2.set 3.set ...

       where n is an integer, usually from 1 to 4,
       and is the desired level.  So it will set the
       nth mesh in each .set file to be the default,
       and all higher-res meshes will not be preloaded.
       e.g:
             plysetlevel 2 *.set
       will tell every set to load in meshes 2..4,
       and make mesh 2 the default.

plysets2conf

Usage: plysets2conf [-l n] <1.set> <2.set> ... > all.conf

The program will add the first-listed ply file for
Each set to the conf file, as well as the xf.

  -l    Use the nth level mesh.  E.g. if n is 1,
        use the first mesh listed in each set file.

Ex:  plysets2conf -l 4 a.set b.set
     Will generate a .conf file with level 4 of each set.

plyshared

usage: plyshared [flags] < in.ply > out.ply
usage: plyshared [flags] [in1.ply [in2.ply] ...] > out.ply
flags:
       -t tolerance (default = 1e-04)

This program takes one or more ply files, and merges 
vertices that are within tolerance of each other.
This is useful to combine multiple meshes into a single
mesh, with smoothly continuous normals.

If handling more than one file, the vertex and face elements
must have exactly the same properties (in the same order)
in all files or else it will print an error and exit.  If
the files have extra elements, they will be ignored (except 
for the first file, which has all extra elements written out,
to maintain backward-compatibility with old plyshared.  It will
print a warning message if elements are ignored.

plystrip

Usage: plystrip infile outfile

plystrip will strip things that aren't, and unstrip things that are,
stripped.

-s will force strip; -u will force unstrip
-q runs in quiet mode.

plysubdiv

usage: plysubdiv [flags] [in.ply] > out.ply
   or: plysubdiv [flags] < in.ply > out.ply

   This program will subdivide triangles in the mesh
   to create a new file with even more triangles. 
   As a general operator, it will create a new vertex
   at the midpoint of each triangle edge, and then
   re-tesselate it with 4 triangles instead of 1.
   E.g.:
                                                     
        o                      o                     
       / `                    / `                    
      /   `     ------>      o---o                   
     /     `                / ` / `                  
    o-------o              o---o---o                 

   It does nothing intelligent with other properties
   (such as confidence or normals).  Faces copy the
   original face's properties, and new vertices copy
   the attributes of original vertices.

Known bugs:
   - It allocates a little more memory than it needs,
     and doesn't check array limits well.
   - It only works for triangles, not 4+ sided faces.

plysubtract

usage: plysubtract [flags] [A.ply] [B.ply] > out.ply
flags:
       -i           (does intersection instead of subtraction)
       -t tolerance (default = 1e-04)

This program computes (A-B), namely, those faces in A
that do not occur in B.  "Face equivalence" is defined
as two faces, a' and b', such that every vertex in a' has
a 1-1 mapping to vertices in b'.  The distance between
corresponding pairs must be less than tolerance, and for each
vertex of b', the corresponding a' vertex must be the closest
vertex in A.

With the -i flag, it outputs (A^B), with the same definition
for face equivalence.

plyunshared

usage: plyunshared [in.ply] > out.ply
   or: plyunshared < in.ply > out.ply

plyvolume

Usage:
  plyvolume -h | [-p nx ny nz d] (- | file1.ply [file2.ply [...]])
where:
  -h         Displays this help
  -p         Specifies a plane to use as the base; 
             the plane has normal (nx, ny, nz) and is distance 
             d from the origin in the normal's direction
  -          Reads one ply file from standard input
  file.ply   Is a ply file whose volume is added to the total.

plyxform

usage: plyxform [flags] [in.ply] > out.ply
   or: plyxform [flags] < in.ply > out.ply
       -f m.xf (a transform matrix file)
       -t xtrans ytrans ztrans
       -s xscale yscale zscale
       -r xangle yangle zangle (all in degrees)
       -q qi qj qk ql
  (point = m.xf * (ftrans_factor + rotz * roty * rotx * scale_factor * point))
Convert NRC xyz laser range scan to a ply file.

xyz2ply

Usage:
  xyz2ply -h | [-r] [headersize [rows [colunms]]] < file.xyz > file.ply
where:
  -h          Shows this help
  -r          Reverses the order of points in a row
  headersize  Override the size of the header to be headersize
  rows        Override the number of rows
  columns     Override the number of columns