package org.reprap.utilities;
import java.io.StreamTokenizer;
import java.io.Reader;
import java.io.IOException;
/**
* Title: STL Loader
* Description: STL files loader (Supports ASCII and binary files) for Java3D
* Needs JDK 1.4 due to endian problems
* Copyright: Copyright (c) 2001
* Company: Universidad del Pais Vasco (UPV/EHU)
* @author: Carlos Pedrinaci Godoy
* @version 1.0
*
* Contact : xenicp@yahoo.es
*
* STL FILE PARSER:
* Extends StreamTokenizer
* For Ascii files
* Each token returned is checked in StlFile.java
* Format of an ASCII STL file:
*
* solid /users/vis/dru/wedge.stl
* facet normal -1 0 0
* outer loop
* vertex 0.005 1 0
* vertex 0 0.543 0
* vertex 0.453 1 1
* endloop
* endfacet
* .
* .
* .
* endsolid /users/vis/dru/wedge.stl
*
* That Class is necessary because scientific numbers are not correctly readed by Tokenizer
* we must then extend that class and define another getNumber
*/
public class StlFileParser extends StreamTokenizer
{
/**
* Constructor: object creation and setup
*
* @param r The Reader instance
*/
public StlFileParser(Reader r)
{
super(r);
setup();
}
/**
* Method that sets some params of the Tokenizer for reading the file correctly
*/
public void setup()
{
resetSyntax();
eolIsSignificant(true); // The End Of Line is important
lowerCaseMode(true);
// All printable ascii characters
wordChars('!', '~');
whitespaceChars(' ', ' ');
whitespaceChars('\n', '\n');
whitespaceChars('\r', '\r');
whitespaceChars('\t', '\t');
}// End setup
/**
* Gets a number from the stream. Note that we don't recognize
* numbers in the tokenizer automatically because numbers might be in
* scientific notation, which isn't processed correctly by
* StreamTokenizer. The number is returned in nval.
*
* @return boolean.
*/
boolean getNumber()
{
int t;
try {
nextToken();
if (ttype != TT_WORD)
throw new IOException("Expected number on line " + lineno());
nval = (Double.valueOf(sval)).doubleValue();
}
catch (IOException e) {
System.err.println(e.getMessage());
return false;
}
catch (NumberFormatException e) {
System.err.println(e.getMessage());
return false;
}
return true;
} // end of getNumber
}// End of StlFileParser