17. filewrite — Write geometry to file in a whole number of formats.

This module defines both the basic routines to write geometrical data to a file and the specialized exporters to write files in a number of well known standardized formats.

The basic routines are very versatile as well as optimizedand allow to easily create new exporters for other formats.

17.1. Functions defined in module filewrite

filewrite.writeOFF(fn, mesh)[source]

Write a mesh of polygons to a file in OFF format.

Parameters:
  • fn (path_like) – The output file name, commonly having a suffix ‘.off’.
  • mesh (Mesh) – The Mesh to write to the file.

Notes

See https://en.wikipedia.org/wiki/OFF_(file_format).

Examples

>>> f = Path('test_filewrite.off')
>>> M = Mesh(eltype='quad4').convert('tri3-u')
>>> writeOFF(f, M)
>>> print(f.read_text())
OFF
4 2 0
0.0 0.0 0.0
1.0 0.0 0.0
1.0 1.0 0.0
0.0 1.0 0.0
3 0 1 2
3 2 3 0
<BLANKLINE>
>>> f.remove()
filewrite.writeOBJ(fn, mesh, name=None)[source]

Write a mesh of polygons to a file in OBJ format.

Parameters:
  • fn (path_like) – The output file name, commonly having a suffix ‘.obj’.
  • mesh (Mesh) – The Mesh to write to the file.
  • name (str, optional) – Name of the Mesh to be written into the file. If not provided None and the Mesh has an .attrib.name, that name will be used.

Notes

See https://en.wikipedia.org/wiki/OBJ_(file_format).

Examples

>>> f = Path('test_filewrite.obj')
>>> M = Mesh(eltype='quad4').convert('tri3-u')
>>> writeOBJ(f, M, name='test')
>>> print(f.read_text())
# .obj file written by pyFormex ...
o test
v 0.0 0.0 0.0
v 1.0 0.0 0.0
v 1.0 1.0 0.0
v 0.0 1.0 0.0
f 1 2 3
f 3 4 1
# End
<BLANKLINE>
>>> f.remove()
filewrite.writePLY(fn, mesh, comment=None, color_table=None, binary=False)[source]

Write a mesh to a file in PLY format.

Parameters:
  • fn (path_like) – The output file name, commonly having a suffix ‘.ply’.
  • mesh (Mesh) – The Mesh to write to the file.
  • comment (str, optional) – An extra comment to add in the file header.

Notes

See https://en.wikipedia.org/wiki/PLY_(file_format)).

Examples

>>> f = Path('test_filewrite.ply')
>>> M = Mesh(eltype='quad4').convert('tri3-u')
>>> writePLY(f, M, comment='This is a test')
>>> print(f.read_text())
ply
format ascii 1.0
comment .ply file written by pyFormex ...
comment This is a test
element vertex 4
property float x
property float y
property float z
element face 2
property list uchar int vertex_indices
end_header
0.0 0.0 0.0
1.0 0.0 0.0
1.0 1.0 0.0
0.0 1.0 0.0
3 0 1 2
3 2 3 0
<BLANKLINE>
>>> f.remove()
filewrite.writeGTS(fn, surf)[source]

Write a TriSurface to a file in GTS format.

Parameters:
  • fn (path_like) – The output file name, commonly having a suffix ‘.gts’.
  • surf (TriSurface) – The TriSurface to write to the file.

Examples

>>> f = Path('test_filewrite.gts')
>>> M = Mesh(eltype='quad4').convert('tri3-u')
>>> writeGTS(f, M.toSurface())
>>> print(f.read_text())
4 5 2
0.000000 0.000000 0.000000
1.000000 0.000000 0.000000
1.000000 1.000000 0.000000
0.000000 1.000000 0.000000
1 2
2 3
3 1
3 4
4 1
1 2 3
4 5 3
#GTS file written by pyFormex ...
<BLANKLINE>
>>> f.remove()
filewrite.writeSTL(fn, x, n=None, binary=False, color=None)[source]

Write a collection of triangles to an STL file.

Parameters:
  • fn (path_like) – The output file name, commonly having a suffix ‘.stl’ or ‘.stla’ (for ascii output) or ‘.stlb’ (for binary output).
  • x (Coords | Formex) – A Coords or Formex with shape (ntriangles,3,3) holding the coordinates of the vertices of the triangles to write to the file.
  • n (Coords, optional) – A Coords with shape (ntriangles,3) holding the normal vectors to the triangles. If not specified, they will be calculated.
  • binary (bool) – If True, the output file format will be a binary STL. The default is an ascii STL.
  • color ((4,) int array) – An int array with 4 values in the range 0..255. These are the red, green, blue and alpha components of a single color for all the triangles. It will be stored in the header of a binary STL file.

Note

The color can only be used with a binary STL format, and is not recognized by all STL processing software.

Warning

The STL format stores a loose collection of triangles and does not include connectivity information between the triangles. Therefore the use of this format for intermediate storage is strongly discouraged, as many processing algorithms will need to build the connectivity information over and again, which may lead to different results depending on round-off errors. The STL format should only be used as a final export to e.g. visualisation methods or machining processes.

Examples

>>> f = Path('test_filewrite.stl')
>>> M = Mesh(eltype='quad4').convert('tri3-u')
>>> writeSTL(f, M.toFormex())
>>> print(f.read_text())
solid  Created by pyFormex ...
  facet normal 0.0 0.0 1.0
    outer loop
      vertex 0.0 0.0 0.0
      vertex 1.0 0.0 0.0
      vertex 1.0 1.0 0.0
    endloop
  endfacet
  facet normal 0.0 0.0 1.0
    outer loop
      vertex 1.0 1.0 0.0
      vertex 0.0 1.0 0.0
      vertex 0.0 0.0 0.0
    endloop
  endfacet
endsolid
<BLANKLINE>
>>> f.remove()
filewrite.write_stl_bin(fil, x, color=None)[source]

Write a binary stl.

Note

This is a low level routine for use in writeSTL. It is not intended to be used directly.

Parameters:
  • fil (file_like) – The file to write the data to. It can be any object supporting the write(bytes) method, like a file opened in binary write mode.
  • x ((ntri,4,3) float array) – Array with 1 normal and 3 vertices and 1 normal per triangle.
  • color ((4,) int array, optional) – Four color components in the range 0..255: red, green, blue and alpha. If specified, these will be stored in the header and may be recognized by some other software.

Examples

>>> f = Path('test_filewrite.stl')
>>> M = Mesh(eltype='quad4').convert('tri3-u')
>>> writeSTL(f, M.toFormex().coords, binary=True, color=[255,0,0,128])
>>> from .fileread import readSTL
>>> x, n, c = readSTL(f)
>>> print(x)
[[[ 0.  0.  0.]
  [ 1.  0.  0.]
  [ 1.  1.  0.]]
<BLANKLINE>
 [[ 1.  1.  0.]
  [ 0.  1.  0.]
  [ 0.  0.  0.]]]
>>> print(n)
[[ 0.  0.  1.]
 [ 0.  0.  1.]]
>>> print(c)
(1.0, 0.0, 0.0)
>>> f.remove()
filewrite.write_stl_asc(fil, x)[source]

Write a collection of triangles to an ascii .stl file.

Note

This is a low level routine for use in writeSTL. It is not intended to be used directly.

Parameters:
  • fil (file_like) – The file to write the data to. It can be any object supporting the write(bytes) method, like a file opened in binary write mode.
  • x ((ntri,4,3) float array) – Array with 1 normal and 3 vertices and 1 normal per triangle.
filewrite.writeData(fil, data, fmt=None, sep='', end='\n')[source]

Write an array of numerical data to an open file.

Parameters:
  • fil (file_like) – The file to write the data to. It can be any object supporting the write(bytes) method, like a file opened in binary write mode.
  • data (array_like) – A numerical array of int or float type. For output, the array will be reshaped to a 2D array, keeping the length of the last axis.
  • fmt (str, optional) – A format string compatible with the array data type. If not provided, the data are written using numpy.tofile(). If provided, the data are written in text mode using numpy.savetxt() with the specified fmt. The sep string is inserted as delimiter between individual items and the end string is inserted at the end of each row. The format string should contain a valid format converter for a a single data item. It may also contain the necessary spacing or separator. Examples are ‘%5i ‘ for int data and ‘%f,’ or ‘%10.3e’ for float data.
  • sep (str, optional) – A string to be used as separator between single items. If an empty string and no fmt is provided, the data are written in binary mode. This is the default. For any other string, the data are written in ascii mode with the specified string inserted as separator between any two items.
  • end (str, optional) – A string to be written at the end of the data block (if no fmt) or at the end of each row (with fmt). The default value is a newline character.

Examples

>>> i = np.eye(3)
>>> f = Path('test_filewrite.out')
>>> with f.open('w') as fil:
...     writeData(fil,i,sep=' ')
>>> f.size()
35
>>> print(f.read_text())
1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0
>>> with f.open('w') as fil:
...     writeData(fil,i,fmt='%.4f',sep=' ')
>>> f.size()
63
>>> print(f.read_text())
1.0000 0.0000 0.0000
0.0000 1.0000 0.0000
0.0000 0.0000 1.0000
<BLANKLINE>
>>> f.remove()
filewrite.writeIData(fil, data, fmt, ind=1, sep=' ', end='\n')[source]

Write an indexed array of numerical data to an open file.

Parameters:
  • fil (file_like) – The file to write the data to. It can be any object supporting the write(bytes) method, like a file opened in binary write mode.
  • data (array_like) – A numerical array of int or float type. For output, the array will be reshaped to a 2D array, keeping the length of the last axis.
  • fmt (str) – A format string compatible with the array data type. The data are written in text mode using numpy.savetxt() with the specified fmt. The sep string is inserted as delimiter between individual items and the end string is inserted at the end of each row. The format string should contain a valid format converter for a a single data item. It may also contain the necessary spacing or separator. Examples are ‘%5i ‘ for int data and ‘%f,’ or ‘%10.3e’ for float data.
  • ind (int or int array_like) – The row indices to write with the data. If an array, its length should be equal to the numbe of rows in the (2D-reshaped) data array. If a single int, it specifies the index for the first row, and the value will be automatically incremented for the other rows.
  • sep (str, optional) – A string to be used as separator between single items. If an empty string and no fmt is provided, the data are written in binary mode. This is the default. For any other string, the data are written in ascii mode with the specified string inserted as separator between any two items.
  • end (str, optional) – A string to be written at the end of the data block (if no fmt) or at the end of each row (with fmt). The default value is a newline character.

Examples

>>> i = np.eye(3)
>>> f = Path('test_filewrite.out')
>>> with f.open('w') as fil:
...     writeIData(fil,i,fmt='%.4f',sep=' ')
>>> f.size()
72
>>> print(f.read_text())
1  1.0000 0.0000 0.0000
2  0.0000 1.0000 0.0000
3  0.0000 0.0000 1.0000
<BLANKLINE>
>>> f.remove()