You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by Matt Juntunen <ma...@hotmail.com> on 2021/03/28 17:39:15 UTC

[geometry] IO Modules - Part 2

Hello,

I've created a new PR with IO modules for commons-geometry [1]. This is a refactoring of an earlier PR I had and incorporates changes suggested by reviewers. Here are some of the main differences with the previous version:

  1.  Inputs and outputs are abstracted behind GeometryInput and GeometryOutput interfaces. The interface provides access to the input/output stream, the file name (if available), and a charset (if applicable and available).
  2.  Formats are represented with the GeometryFormat interface. This interface defines the format name and standard file extensions associated with the format.
  3.  There is now a GeometryFormat3D enum that implements GeometryFormat and provides easy access to the formats supported by the library.
  4.  The IO3D class provides static convenience methods for simple operations. If a path or url is passed with no specified format, the file extension is examined to determine the format.
  5.  I've added support for STL files (GEOMETRY-101).

Below is an example using the BoundaryManager3D class, which is the class users would use if they wanted to customize the default IO functionality.

        DoublePrecisionContext precision = new EpsilonDoublePrecisionContext(1e-10);

        // create some geometry to write
        BoundarySource3D cube = Parallelepiped.unitCube(precision);

        // create the manager and add handlers
        BoundaryIOManager3D manager = new BoundaryIOManager3D();
        manager.registerReadHandler(new StlBoundaryReadHandler3D());
        manager.registerWriteHandler(new StlBoundaryWriteHandler3D());

        Path file = Paths.get("target/cube.stl");

        // write
        manager.write(cube, new FileGeometryOutput(file), GeometryFormat3D.STL);

        // read back
        BoundarySource3D result = manager.read(new FileGeometryInput(file), GeometryFormat3D.STL, precision);


Here is the same example using the convenience methods in IO3D. The file format is inferred from the file name.

        DoublePrecisionContext precision = new EpsilonDoublePrecisionContext(1e-10);

        // create some geometry to write
        BoundarySource3D cube = Parallelepiped.unitCube(precision);

        Path file = Paths.get("target/cube.stl");

        // write
        IO3D.write(cube, file);

        // read back
        BoundarySource3D result = IO3D.read(file, precision);


If anyone has time to review the PR that would be most welcome.

Regards,
Matt J

[1] https://github.com/apache/commons-geometry/pull/141


Re: [geometry] IO Modules - Part 2

Posted by Matt Juntunen <ma...@hotmail.com>.
I have not received any responses on this so I am going to go ahead and merge the PR.
-Matt
________________________________
From: Matt Juntunen <ma...@hotmail.com>
Sent: Sunday, April 4, 2021 7:32 AM
To: Commons Developers List <de...@commons.apache.org>
Subject: Re: [geometry] IO Modules - Part 2

Hello,

Would anyone like more time to look over this? If not, and assuming there are no objections, I plan on merging it in the next few days.

Regards,
Matt J
________________________________
From: Matt Juntunen <ma...@hotmail.com>
Sent: Sunday, March 28, 2021 1:39 PM
To: Commons Developers List <de...@commons.apache.org>
Subject: [geometry] IO Modules - Part 2

Hello,

I've created a new PR with IO modules for commons-geometry [1]. This is a refactoring of an earlier PR I had and incorporates changes suggested by reviewers. Here are some of the main differences with the previous version:

  1.  Inputs and outputs are abstracted behind GeometryInput and GeometryOutput interfaces. The interface provides access to the input/output stream, the file name (if available), and a charset (if applicable and available).
  2.  Formats are represented with the GeometryFormat interface. This interface defines the format name and standard file extensions associated with the format.
  3.  There is now a GeometryFormat3D enum that implements GeometryFormat and provides easy access to the formats supported by the library.
  4.  The IO3D class provides static convenience methods for simple operations. If a path or url is passed with no specified format, the file extension is examined to determine the format.
  5.  I've added support for STL files (GEOMETRY-101).

Below is an example using the BoundaryManager3D class, which is the class users would use if they wanted to customize the default IO functionality.

        DoublePrecisionContext precision = new EpsilonDoublePrecisionContext(1e-10);

        // create some geometry to write
        BoundarySource3D cube = Parallelepiped.unitCube(precision);

        // create the manager and add handlers
        BoundaryIOManager3D manager = new BoundaryIOManager3D();
        manager.registerReadHandler(new StlBoundaryReadHandler3D());
        manager.registerWriteHandler(new StlBoundaryWriteHandler3D());

        Path file = Paths.get("target/cube.stl");

        // write
        manager.write(cube, new FileGeometryOutput(file), GeometryFormat3D.STL);

        // read back
        BoundarySource3D result = manager.read(new FileGeometryInput(file), GeometryFormat3D.STL, precision);


Here is the same example using the convenience methods in IO3D. The file format is inferred from the file name.

        DoublePrecisionContext precision = new EpsilonDoublePrecisionContext(1e-10);

        // create some geometry to write
        BoundarySource3D cube = Parallelepiped.unitCube(precision);

        Path file = Paths.get("target/cube.stl");

        // write
        IO3D.write(cube, file);

        // read back
        BoundarySource3D result = IO3D.read(file, precision);


If anyone has time to review the PR that would be most welcome.

Regards,
Matt J

[1] https://github.com/apache/commons-geometry/pull/141


Re: [geometry] IO Modules - Part 2

Posted by Matt Juntunen <ma...@hotmail.com>.
Hello,

Would anyone like more time to look over this? If not, and assuming there are no objections, I plan on merging it in the next few days.

Regards,
Matt J
________________________________
From: Matt Juntunen <ma...@hotmail.com>
Sent: Sunday, March 28, 2021 1:39 PM
To: Commons Developers List <de...@commons.apache.org>
Subject: [geometry] IO Modules - Part 2

Hello,

I've created a new PR with IO modules for commons-geometry [1]. This is a refactoring of an earlier PR I had and incorporates changes suggested by reviewers. Here are some of the main differences with the previous version:

  1.  Inputs and outputs are abstracted behind GeometryInput and GeometryOutput interfaces. The interface provides access to the input/output stream, the file name (if available), and a charset (if applicable and available).
  2.  Formats are represented with the GeometryFormat interface. This interface defines the format name and standard file extensions associated with the format.
  3.  There is now a GeometryFormat3D enum that implements GeometryFormat and provides easy access to the formats supported by the library.
  4.  The IO3D class provides static convenience methods for simple operations. If a path or url is passed with no specified format, the file extension is examined to determine the format.
  5.  I've added support for STL files (GEOMETRY-101).

Below is an example using the BoundaryManager3D class, which is the class users would use if they wanted to customize the default IO functionality.

        DoublePrecisionContext precision = new EpsilonDoublePrecisionContext(1e-10);

        // create some geometry to write
        BoundarySource3D cube = Parallelepiped.unitCube(precision);

        // create the manager and add handlers
        BoundaryIOManager3D manager = new BoundaryIOManager3D();
        manager.registerReadHandler(new StlBoundaryReadHandler3D());
        manager.registerWriteHandler(new StlBoundaryWriteHandler3D());

        Path file = Paths.get("target/cube.stl");

        // write
        manager.write(cube, new FileGeometryOutput(file), GeometryFormat3D.STL);

        // read back
        BoundarySource3D result = manager.read(new FileGeometryInput(file), GeometryFormat3D.STL, precision);


Here is the same example using the convenience methods in IO3D. The file format is inferred from the file name.

        DoublePrecisionContext precision = new EpsilonDoublePrecisionContext(1e-10);

        // create some geometry to write
        BoundarySource3D cube = Parallelepiped.unitCube(precision);

        Path file = Paths.get("target/cube.stl");

        // write
        IO3D.write(cube, file);

        // read back
        BoundarySource3D result = IO3D.read(file, precision);


If anyone has time to review the PR that would be most welcome.

Regards,
Matt J

[1] https://github.com/apache/commons-geometry/pull/141