Hello,
I've created GEOMETRY-115 and an associated PR [1] containing new modules for
IO functionality. The new modules are
* commons-geometry-core-io - Common space-independent interfaces and classes
* commons-geometry-euclidean-io - Euclidean IO classes; currently contains
support for the 3D formats TXT, CSV, and OBJ
The API is based on a core BoundaryIOManager class that delegates to
BoundaryReadHandler and BoundaryWriteHandler implementations based on the
requested data format. For Euclidean 3D space, a convenience IO3D class is
provided with static methods that delegate to a default manager instance. In
addition to reading and writing the core geometric types for the library
(ConvexPolygon3D, Triangle3D), the Euclidean module also supports reading and
writing a FacetDefinition interface, which exposes simple, unvalidated
geometric data. This is intended for accessing raw (possibly invalid) geometric
data from files and writing data contained in external data structures (for
example, a custom facet class). The example below is from the IO3D class
documentation and demonstrates a read, transform, write operation using streams.
final Path origFile = tempDir.resolve("orig.obj");
final Path scaledFile = tempDir.resolve("scaled.csv");
final DoublePrecisionContext precision = new
EpsilonDoublePrecisionContext(1e-10);
final BoundarySource3D src = Parallelepiped.unitCube(precision);
IO3D.write(src, origFile);
final AffineTransformMatrix3D transform =
AffineTransformMatrix3D.createScale(2);
try (Stream<Triangle3D> stream = IO3D.triangles(origFile, precision)) {
IO3D.write(stream.map(t -> t.transform(transform)), scaledFile);
}
Feedback is welcome.
Regards,
Matt J
[1] https://github.com/apache/commons-geometry/pull/130