Skip to content

Commit

Permalink
misc: streamline file reader interface and naming
Browse files Browse the repository at this point in the history
  • Loading branch information
dennis.madsen committed Jan 26, 2024
1 parent 9e1b574 commit 6ef44da
Show file tree
Hide file tree
Showing 6 changed files with 25 additions and 21 deletions.
4 changes: 2 additions & 2 deletions src/main/scala/scalismo/io/MeshIO.scala
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ object MeshIO {
def readMesh(file: File): Try[TriangleMesh[_3D]] = {
val filename = file.getAbsolutePath
filename match {
case f if f.endsWith(".stl") => STL.read(file.toString)
case f if f.endsWith(".stl") => STL.read(file)
case f if f.endsWith(".ply") => {
PLY.read(file).map {
case Right(vertexColor) => vertexColor.shape
Expand Down Expand Up @@ -66,7 +66,7 @@ object MeshIO {
filename match {
case f if f.endsWith(".h5") => writeHDF5(mesh, file)
case f if f.endsWith(".ply") => PLY.write(mesh, file)
case f if f.endsWith(".stl") => STL.write(mesh, file.toString)
case f if f.endsWith(".stl") => STL.write(mesh, file)
case _ =>
Failure(new IOException("Unknown file type received" + filename))
}
Expand Down
15 changes: 9 additions & 6 deletions src/main/scala/scalismo/io/ply/PLY.scala
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,21 @@ import scala.util.{Failure, Try}

object PLY {

def write(mesh: TriangleMesh[_3D], filename: File): Try[Unit] = {
PLYMeshWriter.write(mesh, None, filename)
def write(mesh: TriangleMesh[_3D], file: File): Try[Unit] = {
PLYMeshWriter.write(mesh, None, file)
}

def write(mesh: VertexColorMesh3D, filename: File): Try[Unit] = {
PLYMeshWriter.write(mesh.shape, Option(mesh.color.pointData.iterator), filename)
def write(mesh: VertexColorMesh3D, file: File): Try[Unit] = {
PLYMeshWriter.write(mesh.shape, Option(mesh.color.pointData.iterator), file)
}

def read(file: File): Try[Either[TriangleMesh[_3D], VertexColorMesh3D]] = {
if (!file.exists()) {
val filename = file.getCanonicalFile
Failure(new IOException(s"Could not read ply file with name $filename. Reason: The file does not exist"))
Failure(
new IOException(
s"Could not read ply file with name ${file.getCanonicalFile}. Reason: The file does not exist"
)
)
} else {
PLYMeshReader.readFileAndParseHeader(file)
}
Expand Down
14 changes: 7 additions & 7 deletions src/main/scala/scalismo/io/stl/STL.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ package scalismo.io.stl
import scalismo.geometry.{EuclideanVector3D, Point3D}
import scalismo.mesh.TriangleMesh3D

import java.io.{BufferedReader, FileReader}
import java.io.{BufferedReader, File, FileReader}
import java.nio.ByteOrder
import scala.util.Try

Expand All @@ -27,17 +27,17 @@ object STL {
private[stl] val STL_BYTE_ORDER = ByteOrder.LITTLE_ENDIAN
private[stl] val STL_HEADER_LENGTH = 80

def write(mesh: TriangleMesh3D, filename: String): Try[Unit] = {
STLMeshWriter.write(mesh, filename, "Scalismo generated STL File")
def write(mesh: TriangleMesh3D, file: File): Try[Unit] = {
STLMeshWriter.write(mesh, file, "Scalismo generated STL File")
}

def read(filename: String): Try[TriangleMesh3D] = {
val breader = new BufferedReader(new FileReader(filename))
def read(file: File): Try[TriangleMesh3D] = {
val breader = new BufferedReader(new FileReader(file))
val fileType = breader.readLine().take(5)
if (fileType == "solid") {
STLMeshReaderAscii.read(filename)
STLMeshReaderAscii.read(file)
} else {
STLMeshReaderBinary.read(filename)
STLMeshReaderBinary.read(file)
}
}
}
4 changes: 2 additions & 2 deletions src/main/scala/scalismo/io/stl/STLMeshReaderAscii.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ package scalismo.io.stl
import scalismo.geometry.{EuclideanVector, EuclideanVector3D, Point3D}
import scalismo.mesh.TriangleMesh3D

import java.io.{BufferedReader, FileReader, IOException}
import java.io.{BufferedReader, File, FileReader, IOException}
import scala.collection.mutable.ArrayBuffer
import scala.util.Try

object STLMeshReaderAscii {
def read(file: String): Try[TriangleMesh3D] = Try {
def read(file: File): Try[TriangleMesh3D] = Try {
val breader = new BufferedReader(new FileReader(file))
val header = breader.readLine()

Expand Down
5 changes: 3 additions & 2 deletions src/main/scala/scalismo/io/stl/STLMeshReaderBinary.scala
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,13 @@ import scalismo.io.stl.STL.{STL_BYTE_ORDER, STL_HEADER_LENGTH}
import scalismo.io.stl.STLTriangle
import scalismo.mesh.TriangleMesh3D

import java.io.File
import java.nio.ByteBuffer
import scala.util.Try

object STLMeshReaderBinary {
def read(file: String): Try[TriangleMesh3D] = Try {
val dataBuffer = FileReader.readFileToByteBuffer(file)
def read(file: File): Try[TriangleMesh3D] = Try {
val dataBuffer = FileReader.readFileToByteBuffer(file.toString)
dataBuffer.position(STL_HEADER_LENGTH).order(STL_BYTE_ORDER)

val numTriangles = readInt(dataBuffer)
Expand Down
4 changes: 2 additions & 2 deletions src/main/scala/scalismo/io/stl/STLMeshWriter.scala
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@ import scalismo.geometry.EuclideanVector3D
import scalismo.mesh.TriangleMesh3D
import scalismo.io.stl.STL.{STL_BYTE_ORDER, STL_HEADER_LENGTH}

import java.io.{BufferedOutputStream, DataOutputStream, FileOutputStream}
import java.io.{BufferedOutputStream, DataOutputStream, File, FileOutputStream}
import java.nio.{ByteBuffer, ByteOrder}
import scala.util.Try

object STLMeshWriter {
def write(mesh: TriangleMesh3D, file: String, header: String): Try[Unit] = Try {
def write(mesh: TriangleMesh3D, file: File, header: String): Try[Unit] = Try {
val dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file)))
val headerCapped = header.take(STL_HEADER_LENGTH).padTo(STL_HEADER_LENGTH, ' ')
writeString(dos, headerCapped)
Expand Down

0 comments on commit 6ef44da

Please sign in to comment.