8.99. Read STL File

Group (Subgroup)

IO (Input)

Description

This Filter will read a binary STL File and create a Triangle Geometry object in memory. The STL reader is very strict to the STL specification. An explanation of the STL file format can be found on Wikipedia. The structure of the file is as follows:

UINT8[80]     Header
UINT32     Number of triangles

foreach triangle
  REAL32[3]     Normal vector
  REAL32[3]     Vertex 1
  REAL32[3]     Vertex 2
  REAL32[3]     Vertex 3
  UINT16     Attribute byte count
end

The filter will look for specific header information to try and determine the vendor of the STL file. Certain vendors do not write STL files that adhere to the file spec.

IMPORANT NOTES:

It is very important that the “Attribute byte Count” is correct as DREAM3D-NX follows the specification strictly. If you are writing an STL file be sure that the value for the “Attribute byte count” is zero (0). If you chose to encode additional data into a section after each triangle then be sure that the “Attribute byte count” is set correctly. DREAM3D-NX will obey the value located in the “Attribute byte count”.

Known Vendors who Write out of spec STL Files

Code to convert

If you find yourself in a situation where the STL File is non-conforming and is not made by one of the vendors above, this bit of Python code can clean up the file. This makes the absolute assumption that the ONLY thing wrong with the STL file is that the trailing UINT16 value for each triangle needs to be set to ZERO.

    import struct

    def modify_stl(input_file_path, output_file_path):
        with open(input_file_path, 'rb') as input_file, open(output_file_path, 'wb') as output_file:
            # Read and copy header
            header = input_file.read(80)
            output_file.write(header)
            
            # Read number of triangles
            num_triangles = struct.unpack('<I', input_file.read(4))[0]
            output_file.write(struct.pack('<I', num_triangles))
            
            # Define the format for one triangle (50 bytes total)
            triangle_format = '<12fH'
            triangle_size = struct.calcsize(triangle_format)
            
            # Process each triangle
            for _ in range(num_triangles):
                # Read triangle data
                triangle_data = input_file.read(triangle_size)
                
                # Unpack and modify the last 2 bytes (attribute byte count)
                data = list(struct.unpack(triangle_format, triangle_data))
                data[-1] = 0  # Set the attribute byte count to zero
                
                # Repack and write the modified triangle data
                modified_triangle_data = struct.pack(triangle_format, *data)
                output_file.write(modified_triangle_data)

    # Example usage
    input_stl_path = '/path/to/input.stl'  # Specify the input file path
    output_stl_path = '/path/to/input_FIXED.stl'  # Specify the output file path

    modify_stl(input_stl_path, output_stl_path)

Input Parameter(s)

Parameter Name

Parameter Type

Parameter Notes

Description

STL File

FileSystemPath

Input STL File

Scale Output Geometry

Bool

Scale the output Triangle Geometry by the Scaling Factor

Scale Factor

Scalar Value

Float32

The factor by which to scale the geometry

Generate Triangle Face Labels

Bool

When true, the ‘Face Labels’ array will be created.

Output Triangle Geometry

Parameter Name

Parameter Type

Parameter Notes

Description

Created Triangle Geometry

DataGroupCreation

The name of the created Triangle Geometry

Output Vertex Data

Parameter Name

Parameter Type

Parameter Notes

Description

Vertex Data [AttributeMatrix]

DataObjectName

The name of the AttributeMatrix where the Vertex Data of the Triangle Geometry will be created

Output Face Data

Parameter Name

Parameter Type

Parameter Notes

Description

Face Data [AttributeMatrix]

DataObjectName

The name of the AttributeMatrix where the Face Data of the Triangle Geometry will be created

Face Normals

DataObjectName

The name of the triangle normals data array

Created Face Labels Array

DataObjectName

The name of the ‘Face Labels’ data array

Example Pipelines

DREAM3D-NX Help

If you need help, need to file a bug report or want to request a new feature, please head over to the DREAM3DNX-Issues GitHub site where the community of DREAM3D-NX users can help answer your questions.