1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.commons.geometry.io.euclidean.threed;
18
19 import java.util.Collections;
20 import java.util.List;
21
22 import org.apache.commons.geometry.io.core.GeometryFormat;
23
24 /** Enum containing 3D geometry formats supported internally by Apache Commons Geometry.
25 */
26 public enum GeometryFormat3D implements GeometryFormat {
27
28 /** Value representing the OBJ file format.
29 * @see <a href="https://en.wikipedia.org/wiki/Wavefront_.obj_file">Wavefront .obj file</a>
30 */
31 OBJ("obj"),
32
33 /** Value representing the STL file format in both the text (i.e. "ASCII") and binary forms.
34 * @see <a href="https://en.wikipedia.org/wiki/STL_(file_format)">STL</a>
35 */
36 STL("stl"),
37
38 /** Value representing a simple, <em>non-standard</em> text geometry format that defines facets one per line
39 * by listing the coordinates of the facet vertices in order, separated by non-numeric characters (e.g. whitespace,
40 * commas, semicolons, etc). Each line follows the pattern
41 * <p>
42 * <code>
43 * p1<sub>x</sub> p1<sub>y</sub> p1<sub>z</sub> p2<sub>x</sub> p2<sub>y</sub> p2<sub>z</sub> p3<sub>x</sub> p3<sub>y</sub> p3<sub>z</sub> ...
44 * </code>
45 * </p>
46 * <p>where the <em>p1</em> elements contain the coordinates of the first facet vertex,
47 * <em>p2</em> those of the second, and so on. Facets may have 3 or more vertices and do not need to all have
48 * the same number of vertices.
49 *
50 * <p>This format is non-standard and no guarantees are made regarding its compatibility with other systems.
51 * It is intended primarily to provide a convenient, human-readable format for data input and analysis.</p>
52 * @see org.apache.commons.geometry.io.euclidean.threed.txt.TextFacetDefinitionReader
53 * @see org.apache.commons.geometry.io.euclidean.threed.txt.TextFacetDefinitionWriter
54 */
55 TXT("txt"),
56
57 /** Value representing a simple, <em>non-standard</em> CSV geometry format that defines triangular facets
58 * one per line by listing the facet vertex coordinates in order, separated by commas. This format is a subset
59 * of the {@link #TXT} format with commas as separators and facets written as triangles (to ensure that
60 * all rows have the same number of columns).
61 *
62 * <p>This format is non-standard and no guarantees are made regarding its compatibility with other systems.
63 * It is intended primarily to provide a convenient, human-readable format for data input and analysis.</p>
64 * @see org.apache.commons.geometry.io.euclidean.threed.txt.TextFacetDefinitionWriter#csvFormat(java.io.Writer)
65 */
66 CSV("csv");
67
68 /** List of file extensions associated with the format. The first file extension
69 * listed is taken as the default.
70 */
71 private final List<String> fileExtensions;
72
73 /** Construct a new instance with the given file extension.
74 * @param fileExt file extension
75 */
76 GeometryFormat3D(final String fileExt) {
77 this.fileExtensions = Collections.singletonList(fileExt);
78 }
79
80 /** {@inheritDoc} */
81 @Override
82 public String getFormatName() {
83 return name();
84 }
85
86 /** {@inheritDoc} */
87 @Override
88 public String getDefaultFileExtension() {
89 return fileExtensions.get(0);
90 }
91
92 /** {@inheritDoc} */
93 @Override
94 public List<String> getFileExtensions() {
95 return fileExtensions;
96 }
97 }