Introduction
Currently there is no standard for additive manufacturing machine build files. Different manufacturers or even different machines have unique specifications for their input file(s). Build data may be delivered in one single file, as a collection of multiple files, or even as a compressed file that contains single or multiple files. The file content might be ASCII text, pictures, or other binary data which may or may not follow general standards.
In fact, the Advanced Toolpath Utility exporter has to be prepared for everything, offering basic low-level file operations to be that flexible.
Export filter concept
An Advanced Toolpath Utility buildstyle can define multiple export filters. The buildstyle user can then choose between these different export filters which produce different types of build files. In short, Advanced Toolpath Utility supports multiple build file formats per buildstyle.
The declaration of an export filter is rather simple:
exports.declareExportFilter = function(exportFilter) { // Create logger. var logger = LOGGING.getLoggerInstance(ENABLE_LOGGING, 'declareExportFilter'); exportFilter.declareFilter('SLC-Export', // Filter Id 'SLC-Export', // Filter name 'slc', // Filter file extension 0, // Major version number 0, // Minor version number EXPORT_FILTER.nExportFilterMultifile); // nExportFilterSingleFile or nExportFilterMultifile // Flush logger. logger.flush(); };
The flag nExportFilterSingleFile (or nExportFilterMultifile) defines which of the two available export functions are called. Either exportToFile or exportToDirectory:
exports.exportToFile = function( exportFile, sFilter, modelData, progress) { }; exports.exportToDirectory = function( exportDir, sFilter, modelData, progress) { if(sFilter == 'myfilter'){ } else if(sFilter == 'myfilter2'){ } };
The user chosen export filter id is passed to either of the two export functions. Depending on that filter, different export formats can be generated.
Geometry data
Any of the two export functions can access all layers and geometry on each single build platform layer. The following code demonstrates geometry access layer by layer:
exports.exportToFile = function( exportFile, sFilter, modelData, progress) { /* * Geometry export. */ for(var curLayerNo = 1; curLayerNo <= modelData.getLayerCount() && !progress.cancelled(); curLayerNo++) { // Checks for user actions. if(progress.cancelled()) { return; } // Calculates the current z position. var zPosition = Math.floor(modelData.getLayerZ(curLayerNo) * zUnit + 0.5); zPosition -= layerThickness; var polyLineIterator = modelData.getFirstLayerPolyline(curLayerNo, POLY_IT.nLayerExposureInProcessingOrder); while(polyLineIterator.isValid()) { // Write geometry data to file.... // exportFile.writeString(""); polyLineIterator.next(); } };For exporting geometry data in its predefined order, it is important to use the nLayerExposureInProcessingOrder flag for the getFirstLayerPolyline function. This ensures that the geometry is sorted by a global attribute, named_processing_order.
bsFile class
The bsFile class is used for all reading and writing operations (binary or ASCII). The file encoding, and for binary files the byte order too, is specified on bsFile instance creation. Afterwards, it is easy to write strings (writeString) or binary data (writeBytes).
The class also provides helper functions for repositioning inside file content and IEEE floating point representations.
// Write settings file var settingsFile = new FILE.bsFile(); if( !settingsFile.createFile( this.slcDirectory, this.filename, FILE.nEncodingUTF8)){ throw new Error("Output file could not be created."); } // Moves to the file's start. settingsFile.seek(0, FILE.nSeekStart); // Writes properties. for (var property in this.parameterSet) { if (this.parameterSet.hasOwnProperty(property)) { settingsFile.writeString(property); settingsFile.writeString('='); settingsFile.writeString(this.parameterSet[property.toString()].toString()); settingsFile.writeString(';\r\n'); } } settingsFile.writeString(';\r\n');
bsFileArchiveWriter
This class accepts bsFile instances and adds them to a compressed archive.
var archiveFile = new FILE_ARCHIVE_WRITER.bsFileArchiveWriter(); archiveFile.openArchive(tgzFile, FILE_ARCHIVE_WRITER.nFileArchiveTgz); . . . var file_size = temp_file.tell(); archiveFile.putNextEntry("slice_"+ (++layer_nr) +".png", file_size); archiveFile.writeFile(temp_file, 0, file_size); . . . archiveFile.closeArchive();