package com.revolsys.elevation.tin.tin; import java.io.BufferedReader; import java.io.IOException; import com.revolsys.elevation.tin.CompactTriangulatedIrregularNetwork; import com.revolsys.elevation.tin.TriangulatedIrregularNetwork; import com.revolsys.geometry.model.GeometryFactory; import com.revolsys.io.BaseCloseable; import com.revolsys.io.FileUtil; import com.revolsys.spring.resource.Resource; import com.revolsys.util.MathUtil; public class AsciiTinReader implements BaseCloseable { private final GeometryFactory geometryFactory; private final BufferedReader in; public AsciiTinReader(final GeometryFactory geometryFactory, final Resource resource) { this.geometryFactory = geometryFactory; this.in = resource.newBufferedReader(); final String line = readLine(); if (!"TIN".equals(line)) { throw new IllegalArgumentException("File does not contain a tin"); } } @Override public void close() { FileUtil.closeSilent(this.in); } public TriangulatedIrregularNetwork read() { String line = readLine(); if (!"BEGT".equals(line)) { throw new IllegalArgumentException("Expecting BEGT not " + line); } line = readLine(); if (line.startsWith("TNAM")) { line = readLine(); } if (line.startsWith("TCOL")) { line = readLine(); } if (!line.startsWith("VERT ")) { throw new IllegalArgumentException("Expecting VERT not " + line); } final int vertexCount = Integer.parseInt(line.substring(5)); final double[] vertexXCoordinates = new double[vertexCount]; final double[] vertexYCoordinates = new double[vertexCount]; final double[] vertexZCoordinates = new double[vertexCount]; for (int vertexIndex = 0; vertexIndex < vertexCount; vertexIndex++) { line = readLine(); final double[] coordinates = MathUtil.toDoubleArraySplit(line, " "); vertexXCoordinates[vertexIndex] = coordinates[0]; vertexYCoordinates[vertexIndex] = coordinates[1]; vertexZCoordinates[vertexIndex] = coordinates[2]; } line = readLine(); int triangleCount = 0; int[] triangleVertex0Indices = null; int[] triangleVertex1Indices = null; int[] triangleVertex2Indices = null; if (line.startsWith("ENDT")) { } else { if (!line.startsWith("TRI ")) { throw new IllegalArgumentException("Expecting TRI not " + line); } triangleCount = Integer.parseInt(line.substring(4)); triangleVertex0Indices = new int[triangleCount]; triangleVertex1Indices = new int[triangleCount]; triangleVertex2Indices = new int[triangleCount]; for (int triangleIndex = 0; triangleIndex < triangleCount; triangleIndex++) { line = readLine(); final int[] indexes = MathUtil.toIntArraySplit(line, " "); triangleVertex0Indices[triangleIndex] = indexes[0] - 1; triangleVertex1Indices[triangleIndex] = indexes[1] - 1; triangleVertex2Indices[triangleIndex] = indexes[2] - 1; } } if (triangleVertex0Indices == null) { throw new IllegalArgumentException("Not implemented"); } else { return new CompactTriangulatedIrregularNetwork(this.geometryFactory, vertexCount, vertexXCoordinates, vertexYCoordinates, vertexZCoordinates, triangleCount, triangleVertex0Indices, triangleVertex1Indices, triangleVertex2Indices); } } private String readLine() { try { return this.in.readLine(); } catch (final IOException e) { throw new RuntimeException("Unable to read line", e); } } }