GCC Code Coverage Report


Directory: ./
File: lib/geogram/basic/command_line_args.cpp
Date: 2026-09-07 02:28:19
Exec Total Coverage
Lines: 389 551 70.6%
Functions: 22 30 73.3%
Branches: 379 1340 28.3%

Line Branch Exec Source
1 /*
2 * Copyright (c) 2000-2022 Inria
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * * Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * * Neither the name of the ALICE Project-Team nor the names of its
14 * contributors may be used to endorse or promote products derived from this
15 * software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 * POSSIBILITY OF SUCH DAMAGE.
28 *
29 * Contact: Bruno Levy
30 *
31 * https://www.inria.fr/fr/bruno-levy
32 *
33 * Inria,
34 * Domaine de Voluceau,
35 * 78150 Le Chesnay - Rocquencourt
36 * FRANCE
37 *
38 */
39
40 #include <geogram/basic/command_line_args.h>
41 #include <geogram/basic/command_line.h>
42 #include <geogram/basic/process.h>
43 #include <geogram/basic/logger.h>
44
45 #include <set>
46
47 namespace {
48
49 using namespace GEO;
50 using namespace CmdLine;
51
52 /**
53 * \brief Imports the global option group
54 */
55 251 void import_arg_group_global() {
56
1/2
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
251 declare_arg(
57
2/6
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 251 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
502 "profile", "scan",
58 251 "Vorpaline mode "
59 "(scan, convert, repair, heal, cad, tet, poly, hex, quad)"
60 );
61
1/2
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
251 declare_arg(
62
2/6
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 251 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
502 "debug", false,
63 251 "Toggles debug mode", ARG_ADVANCED
64 );
65 251 }
66
67 /**
68 * \brief Imports the pre-processing option group
69 */
70 48 void import_arg_group_pre() {
71
3/8
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 48 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 48 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
96 declare_arg_group("pre", "Preprocessing phase");
72
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
73
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "pre", true,
74 48 "Toggles pre-processing phase", ARG_ADVANCED
75 );
76
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
77
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "pre:Nsmooth_iter", 1,
78 48 "Number of iterations for normals smoothing",
79 ARG_ADVANCED
80 );
81
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg_percent(
82
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "pre:margin", 0,
83 48 "Expand border (in % of bounding box diagonal)",
84 ARG_ADVANCED
85 );
86
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
87
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "pre:repair", false,
88 48 "Repair input mesh"
89 );
90
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
91
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "pre:intersect", false,
92 48 "Remove intersections in input mesh"
93 );
94
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
95
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "pre:remove_internal_shells", true,
96 48 "Remove internal shells after intersection"
97 );
98
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg_percent(
99
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "pre:epsilon", 0,
100 48 "Colocate tolerance (in % of bounding box diagonal)",
101 ARG_ADVANCED
102 );
103
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg_percent(
104
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "pre:max_hole_area", 0,
105 48 "Fill holes smaller than (in % total area)"
106 );
107
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
108
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "pre:max_hole_edges", 2000,
109 48 "Fill holes with a smaller nb. of edges"
110 );
111
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg_percent(
112
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "pre:min_comp_area", 0,
113 48 "Remove small components (in % total area)"
114 );
115
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
116
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "pre:vcluster_bins", 0,
117 48 "Number of bins for vertex clustering"
118 );
119 48 }
120
121 /**
122 * \brief Imports the remeshing option group
123 */
124 48 void import_arg_group_remesh() {
125
3/8
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 48 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 48 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
96 declare_arg_group("remesh", "Remeshing phase");
126
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
127
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "remesh", true,
128 48 "Toggles remeshing phase", ARG_ADVANCED
129 );
130
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
131
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "remesh:nb_pts", 30000,
132 48 "Number of vertices"
133 );
134
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
135
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "remesh:anisotropy", 0.0,
136 48 "Anisotropy factor"
137 );
138
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
139
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "remesh:by_parts", false,
140 48 "Part by part remeshing", ARG_ADVANCED
141 );
142
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
143
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "remesh:gradation", 0.0,
144 48 "Mesh gradation exponent"
145 );
146
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
147
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "remesh:lfs_samples", 10000,
148 48 "Number of samples for lfs (gradation)",
149 ARG_ADVANCED
150 );
151
152 #ifdef GEOGRAM_WITH_VORPALINE
153 declare_arg(
154 "remesh:sharp_edges", false,
155 "Reconstruct sharp edges", ARG_ADVANCED
156 );
157
158 declare_arg(
159 "remesh:Nfactor", 5.0,
160 "For sharp_edges", ARG_ADVANCED
161 );
162 #endif
163
164
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
165
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "remesh:multi_nerve", true,
166 48 "Insert new vertices to preserve topology",
167 ARG_ADVANCED
168 );
169
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
170
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "remesh:RVC_centroids", true,
171 48 "Use centroids of restricted Voronoi cells", ARG_ADVANCED
172 );
173
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
174
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "remesh:refine", false,
175 48 "Insert points to lower Hausdorff distance", ARG_ADVANCED
176 );
177
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
178
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "remesh:max_dist", 0.2,
179 48 "Max. distance to source mesh, relative to avg. edge len",
180 ARG_ADVANCED
181 );
182 48 }
183
184 /**
185 * \brief Declares the algorithm option group
186 */
187 238 void import_arg_group_algo() {
188
3/8
✓ Branch 2 taken 238 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 238 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 238 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
476 declare_arg_group("algo", "Algorithms", ARG_ADVANCED);
189
1/2
✓ Branch 1 taken 238 times.
✗ Branch 2 not taken.
238 declare_arg(
190
2/6
✓ Branch 1 taken 238 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 238 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
476 "algo:nn_search", "BNN",
191 238 "Nearest neighbors search (BNN, ...)"
192 );
193
1/2
✓ Branch 1 taken 238 times.
✗ Branch 2 not taken.
238 declare_arg(
194
2/6
✓ Branch 1 taken 238 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 238 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
476 "algo:random_seed", -1,
195 238 "seed for random number generator"
196 " (-1: use default, -2: non-deterministic)"
197 );
198
1/2
✓ Branch 1 taken 238 times.
✗ Branch 2 not taken.
238 declare_arg(
199
2/6
✓ Branch 1 taken 238 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 238 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
476 "algo:delaunay", "NN",
200 238 "Delaunay algorithm"
201 );
202
1/2
✓ Branch 1 taken 238 times.
✗ Branch 2 not taken.
238 declare_arg(
203
2/6
✓ Branch 1 taken 238 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 238 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
476 "algo:hole_filling", "loop_split",
204 238 "Hole filling mode (loop_split, Nloop_split, ear_cut)"
205 );
206
1/2
✓ Branch 1 taken 238 times.
✗ Branch 2 not taken.
238 declare_arg(
207
2/6
✓ Branch 1 taken 238 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 238 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
476 "algo:predicates", "fast",
208 238 "Geometric predicates (fast, exact)"
209 );
210
1/2
✓ Branch 1 taken 238 times.
✗ Branch 2 not taken.
238 declare_arg(
211
2/6
✓ Branch 1 taken 238 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 238 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
476 "algo:reconstruct", "Co3Ne",
212 238 "reconstruction algorithm (Co3Ne, Poisson)"
213 );
214 #ifdef GEO_OS_ANDROID
215 // NDK's default multithreading seems to be not SMP-compliant
216 // (missing memory barriers in synchronization primitives)
217 declare_arg(
218 "algo:parallel", false,
219 "Use parallel standard algorithms"
220 );
221 #else
222
1/2
✓ Branch 1 taken 238 times.
✗ Branch 2 not taken.
238 declare_arg(
223
2/6
✓ Branch 1 taken 238 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 238 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
476 "algo:parallel", true,
224 238 "Use parallel standard algorithms"
225 );
226 #endif
227 238 }
228
229 /**
230 * \brief Imports the post-processing option group
231 */
232 48 void import_arg_group_post() {
233
3/8
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 48 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 48 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
96 declare_arg_group("post", "Postprocessing phase");
234
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
235
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "post", true,
236 48 "Toggles post-processing phase", ARG_ADVANCED
237 );
238
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
239
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "post:repair", false,
240 48 "Repair output mesh"
241 );
242
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg_percent(
243
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "post:max_hole_area", 0.0,
244 48 "Fill holes smaller than (in % total area)"
245 );
246
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
247
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "post:max_hole_edges", 2000,
248 48 "Fill holes with a smaller nb. of edges than"
249 );
250
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg_percent(
251
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "post:min_comp_area", 0.0,
252 48 "Remove small components (in % total area)"
253 );
254
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg_percent(
255
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "post:max_deg3_dist", 0.1,
256 48 "Degree3 vertices threshold (in % bounding box diagonal)"
257 );
258
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
259
2/6
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 48 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
96 "post:isect", false, "Tentatively remove self-intersections"
260 );
261
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
262
2/6
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
96 "post:compute_normals", false, "Compute normals"
263 );
264 48 }
265
266 /**
267 * \brief Imports the optimizer option group
268 */
269 48 void import_arg_group_opt() {
270
3/8
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 48 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 48 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
96 declare_arg_group("opt", "Optimizer fine tuning", ARG_ADVANCED);
271 #ifdef GEOGRAM_WITH_HLBFGS
272
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
273
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "opt:nb_Lloyd_iter", 5,
274 48 "Number of iterations for Lloyd pre-smoothing"
275 );
276
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
277
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "opt:nb_Newton_iter", 30,
278 48 "Number of iterations for Newton-CVT"
279 );
280
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
281
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "opt:nb_LpCVT_iter", 30,
282 48 "Number of iterations for LpCVT"
283 );
284
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
285
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "opt:Newton_m", 7,
286 48 "Number of evaluations for Hessian approximation"
287 );
288 #else
289 declare_arg(
290 "opt:nb_Lloyd_iter", 40,
291 "Number of iterations for Lloyd pre-smoothing"
292 );
293 declare_arg(
294 "opt:nb_Newton_iter", 0,
295 "Number of iterations for Newton-CVT"
296 );
297 declare_arg(
298 "opt:nb_LpCVT_iter", 0,
299 "Number of iterations for LpCVT"
300 );
301 declare_arg(
302 "opt:Newton_m", 0,
303 "Number of evaluations for Hessian approximation"
304 );
305 #endif
306 48 }
307
308 /**
309 * \brief Imports the system option group
310 */
311 251 void import_arg_group_sys() {
312
3/8
✓ Branch 2 taken 251 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 251 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 251 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
502 declare_arg_group("sys", "System fine tuning", ARG_ADVANCED);
313
314 #ifdef GEO_DEBUG
315 declare_arg(
316 "sys:assert", "abort",
317 "Assertion behavior (abort, throw, breakpoint)"
318 );
319 #else
320
1/2
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
251 declare_arg(
321
2/6
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 251 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
502 "sys:assert", "throw",
322 251 "Assertion behavior (abort, throw, breakpoint)"
323 );
324 #endif
325
326
1/2
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
251 declare_arg(
327
3/8
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 251 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 251 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
502 "sys:multithread", Process::multithreading_enabled(),
328 251 "Enables multi-threaded computations"
329 );
330
1/2
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
251 declare_arg(
331
3/8
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 251 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 251 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
502 "sys:FPE", Process::FPE_enabled(),
332 251 "Enables floating-point exceptions"
333 );
334
1/2
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
251 declare_arg(
335
3/8
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 251 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 251 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
502 "sys:cancel", Process::cancel_enabled(),
336 251 "Enables interruption of cancelable tasks"
337 );
338
1/2
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
251 declare_arg(
339
3/8
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 251 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 251 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
502 "sys:max_threads", (int) Process::number_of_cores(),
340 251 "Maximum number of concurrent threads"
341 );
342
1/2
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
251 declare_arg(
343
2/6
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 251 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
502 "sys:use_doubles", false,
344 251 "Uses double precision in output .mesh files"
345 );
346
1/2
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
251 declare_arg(
347
2/6
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 251 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
502 "sys:ascii", false,
348 251 "Use ASCII files whenever supported"
349 );
350
1/2
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
251 declare_arg(
351
2/6
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 251 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
502 "sys:compression_level", 3,
352 251 "Compression level for created .geogram files, in [0..9]"
353 );
354
1/2
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
251 declare_arg(
355
2/6
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 251 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
502 "sys:lowmem", false,
356 251 "Reduces RAM consumption (but slower)"
357 );
358
1/2
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
251 declare_arg(
359
2/6
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 251 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
502 "sys:stats", false,
360 251 "Display statistics on exit"
361 );
362 #ifdef GEO_OS_WINDOWS
363 declare_arg(
364 "sys:show_win32_console", false,
365 "Display MSDOS window"
366 );
367 #endif
368 251 }
369
370 /**
371 * \brief Imports the NL (Numerical Library) option group
372 */
373 251 void import_arg_group_nl() {
374
3/8
✓ Branch 2 taken 251 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 251 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 251 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
502 declare_arg_group("nl", "OpenNL (numerical library)", ARG_ADVANCED);
375
1/2
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
251 declare_arg(
376
2/6
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 251 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
502 "nl:MKL", false,
377 251 "Use Intel Math Kernel Library (if available in the system)"
378 );
379
1/2
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
251 declare_arg(
380
2/6
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 251 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
502 "nl:CUDA", false,
381 251 "Use NVidia CUDA (if available in the system)"
382 );
383
1/2
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
251 declare_arg(
384
2/6
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 251 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
502 "nl:CUDA:matrix_format", "fp64",
385 251 "one of fp32, fp64, fp32_precond"
386 );
387 251 }
388
389 /**
390 * \brief Imports the Logger option group
391 */
392 251 void import_arg_group_log() {
393
3/8
✓ Branch 2 taken 251 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 251 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 251 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
502 declare_arg_group("log", "Logger settings", ARG_ADVANCED);
394
1/2
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
251 declare_arg(
395
2/6
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 251 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
502 "log:quiet", false,
396 251 "Turns logging on/off"
397 );
398
1/2
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
251 declare_arg(
399
2/6
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 251 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
502 "log:pretty", true,
400 251 "Turns console pretty output on/off"
401 );
402
1/2
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
251 declare_arg(
403
2/6
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 251 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
502 "log:file_name", "",
404 251 "Logs output to the specified file"
405 );
406
1/2
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
251 declare_arg(
407
2/6
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 251 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
502 "log:features", "*",
408 251 "Semicolon separated list of features selected for log"
409 );
410
1/2
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
251 declare_arg(
411
2/6
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 251 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
502 "log:features_exclude", "",
412 251 "Semicolon separated list of features excluded from log"
413 );
414 251 }
415
416 /**
417 * \brief Imports the reconstruction option group
418 */
419 48 void import_arg_group_co3ne() {
420
3/8
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 48 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 48 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
96 declare_arg_group("co3ne", "Reconstruction", ARG_ADVANCED);
421
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
422
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "co3ne", false,
423 48 "Use reconstruction", ARG_ADVANCED
424 );
425
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
426
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "co3ne:nb_neighbors", 30,
427 48 "Number of neighbors used in reconstruction"
428 );
429
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
430
2/6
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 48 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
96 "co3ne:Psmooth_iter", 0, "Number of smoothing iterations"
431 );
432
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg_percent(
433
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "co3ne:radius", 5,
434 48 "Search radius (in % bounding box diagonal)"
435 );
436
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
437
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "co3ne:repair", true,
438 48 "Repair output surface"
439 );
440
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
441
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "co3ne:max_N_angle", 60.0,
442 48 "Filter bad triangles (in degrees)"
443 );
444
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg_percent(
445
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "co3ne:max_hole_area", 5,
446 48 "Fill holes smaller than (in % total area)"
447 );
448
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
449
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "co3ne:max_hole_edges", 500,
450 48 "Fill holes with a smaller nb. of edges"
451 );
452
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg_percent(
453
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "co3ne:min_comp_area", 0.01,
454 48 "Remove small components (in % total area)"
455 );
456
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
457
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "co3ne:min_comp_facets", 10,
458 48 "Remove small components (in facet nb.)"
459 );
460
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
461
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "co3ne:T12", true,
462 48 "Use also triangles seen from 1 and 2 seeds"
463 );
464
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
465
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "co3ne:strict", false,
466 48 "enforce combinatorial tests for triangles seen from 3 seeds as well"
467 );
468
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
469
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "co3ne:use_normals", true,
470 48 "Use existing normal attached to data if available"
471 );
472
473 // For now, in co3ne import arg group -> todo: create new import func
474
3/8
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 48 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 48 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
96 declare_arg_group("poisson", "Reconstruction", ARG_ADVANCED);
475
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
476
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "poisson:octree_depth", 8,
477 48 "Octree depth for Poisson reconstruction if used"
478 );
479 48 }
480
481 /**
482 * \brief Import the statistics option group
483 */
484 22 void import_arg_group_stat() {
485
3/8
✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 22 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 22 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
44 declare_arg_group("stat", "Statistics tuning");
486
1/2
✓ Branch 1 taken 22 times.
✗ Branch 2 not taken.
22 declare_arg_percent(
487
2/6
✓ Branch 1 taken 22 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 22 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
44 "stat:sampling_step", 0.5,
488 22 "For Hausdorff distance"
489 );
490 22 }
491
492 /**
493 * \brief Imports the polyhedral meshing option group
494 */
495 48 void import_arg_group_poly() {
496
3/8
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 48 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 48 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
96 declare_arg_group("poly", "Polyhedral meshing", ARG_ADVANCED);
497
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
498
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "poly", false,
499 48 "Toggles polyhedral meshing"
500 );
501
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
502
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "poly:simplify", "tets_voronoi",
503 48 "one of none (generate all intersections), "
504 "tets (regroup Vornoi cells), "
505 "tets_voronoi (one polygon per Voronoi facet), "
506 "tets_voronoi_boundary (simplify boundary)"
507 );
508
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
509
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "poly:normal_angle_threshold", 1e-3,
510 48 "maximum normal angle deviation (in degrees) for merging boundary facets"
511 " (used if poly:simplify=tets_voronoi_boundary)"
512 );
513
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
514
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "poly:cells_shrink", 0.0,
515 48 "Voronoi cells shrink factor (for visualization purposes), between 0.0 and 1.0"
516 );
517
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
518
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "poly:points_file", "",
519 48 "optional points file name (if left blank, generates and optimizes remesh:nb_pts points)"
520 );
521
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
522
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "poly:generate_ids", false,
523 48 "generate unique ids for vertices and cells (saved in geogram, geogram_ascii and ovm file formats only)"
524 );
525
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
526
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "poly:embedding_dim", 0,
527 48 "force embedding dimension (0 = use input dim.)"
528 );
529
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
530
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "poly:tessellate_non_convex_facets", false,
531 48 "tessellate non-convex facets"
532 );
533 48 }
534
535 /**
536 * \brief Imports the hex-dominant meshing option group
537 */
538 void import_arg_group_hex() {
539 declare_arg_group("hex", "Hex-dominant meshing", ARG_ADVANCED);
540 declare_arg(
541 "hex", false,
542 "Toggles hex-dominant meshing"
543 );
544 declare_arg(
545 "hex:save_points", false,
546 "Save points to points.meshb"
547 );
548 declare_arg(
549 "hex:save_tets", false,
550 "Save tetrahedra (before primitive merging) to tets.meshb"
551 );
552 declare_arg(
553 "hex:save_surface", false,
554 "Save surface to surface.meshb"
555 );
556 declare_arg(
557 "hex:save_frames", false,
558 "Save frames and surface to frames_surface.eobj"
559 );
560 declare_arg(
561 "hex:prefer_seeds", true,
562 "In constrained mode, use seeds whenever possible"
563 );
564 declare_arg(
565 "hex:constrained", true,
566 "Use constrained Delaunay triangulation"
567 );
568 declare_arg(
569 "hex:points_file", "",
570 "Load points from a file"
571 );
572 declare_arg(
573 "hex:tets_file", "",
574 "Load tetrahedra from a file"
575 );
576 declare_arg(
577 "hex:frames_file", "",
578 "Load frames from a file"
579 );
580 declare_arg(
581 "hex:prisms", false,
582 "generate prisms"
583 );
584 declare_arg(
585 "hex:pyramids", false,
586 "generate pyramids"
587 );
588 declare_arg(
589 "hex:algo", "PGP3d",
590 "one of (PGP3d, LpCVT)"
591 );
592 declare_arg(
593 "hex:PGP_max_corr_prop", 0.35,
594 "maximum correction form (0 to deactivate)"
595 );
596 declare_arg(
597 "hex:PGP_FF_free_topo", 1,
598 "number of free topo. frame field opt. iterations"
599 );
600 declare_arg(
601 "hex:PGP_FF_fixed_topo", 1,
602 "number of fixed topo. frame field opt. iterations"
603 );
604 declare_arg(
605 "hex:PGP_direct_solver", false,
606 "(tentatively) use PGP direct solver"
607 );
608 declare_arg(
609 "hex:border_refine", false,
610 "refine border to lower Hausdorff distance"
611 );
612 declare_arg_percent(
613 "hex:border_max_distance", 20,
614 "maximum distance to reference (in % of input average edge length)"
615 );
616 declare_arg(
617 "hex:keep_border", false, "keep initial border mesh"
618 );
619 }
620
621 /**
622 * \brief Imports the quad-dominant meshing option group
623 */
624 void import_arg_group_quad() {
625 declare_arg_group("quad", "Quad-dominant meshing", ARG_ADVANCED);
626 declare_arg(
627 "quad", false,
628 "Toggles quad-dominant meshing"
629 );
630 declare_arg(
631 "quad:relative_edge_length",
632 1.0,
633 "relative edge length"
634 );
635 declare_arg(
636 "quad:optimize_parity", false,
637 "Optimize quads parity when splitting charts (experimental)"
638 );
639 declare_arg(
640 "quad:max_scaling_correction", 1.0,
641 "maximum scaling correction factor (use 1.0 to disable)"
642 );
643 }
644
645 /**
646 * \brief Imports the tetrahedral meshing option group
647 */
648 48 void import_arg_group_tet() {
649
3/8
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 48 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 48 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
96 declare_arg_group("tet", "Tetrahedral meshing", ARG_ADVANCED);
650
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
651
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "tet", false,
652 48 "Toggles tetrahedral meshing"
653 );
654
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
655
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "tet:refine", true,
656 48 "Generates additional points to improve mesh quality"
657 );
658
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
659
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "tet:preprocess", true,
660 48 "Pre-processes surface before meshing"
661 );
662
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 declare_arg(
663
2/6
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
96 "tet:quality", 2.0,
664 48 "desired element quality (the lower, the better, 2.0 means reasonable)"
665 );
666 48 }
667
668 /**
669 * \brief Imports the graphics option group
670 */
671 void import_arg_group_gfx() {
672 declare_arg_group("gfx", "OpenGL graphics options", ARG_ADVANCED);
673 declare_arg(
674 "gfx:GL_profile",
675 #if defined(GEO_OS_ANDROID)
676 "ES",
677 #else
678 "core",
679 #endif
680 "one of core,ES"
681 );
682 declare_arg(
683 "gfx:GL_version", 0.0,
684 "If non-zero, override GL version detection"
685 );
686 declare_arg(
687 "gfx:GL_debug", false,
688 "OpenGL debugging context"
689 );
690 declare_arg(
691 "gfx:GLSL_version", 0.0,
692 "If non-zero, overrides GLSL version detection"
693 );
694 declare_arg(
695 "gfx:GLUP_profile", "auto",
696 "one of auto, GLUP150, GLUP440, GLUPES2"
697 );
698 declare_arg("gfx:full_screen", false, "full screen mode");
699 declare_arg(
700 "gfx:no_decoration", false,
701 "no window decoration (full screen mode)"
702 );
703 declare_arg(
704 "gfx:transparent", false,
705 "use transparent backgroung (desktop integration)"
706 );
707 declare_arg(
708 "gfx:GLSL_tesselation", true, "use tesselation shaders if available"
709 );
710 declare_arg("gfx:geometry", "1024x1024", "resolution");
711 declare_arg("gfx:keypress", "", "initial key sequence sent to viewer");
712 declare_arg(
713 "gfx:adapter", "default",
714 "one of default, intel, nvidia (for optimus-prime systems)"
715 );
716 declare_arg(
717 "gfx:hidden", false,
718 "if set, window is hidden (useful for offscreen rendering)"
719 );
720 declare_arg(
721 "gfx:monitor", -1,
722 "monitor where to open window, or -1 for default"
723 );
724 }
725
726 /**
727 * \brief Imports the biblio option group
728 */
729 251 void import_arg_group_biblio() {
730
3/8
✓ Branch 2 taken 251 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 251 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 251 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
502 declare_arg_group("biblio", "Bibliography options", ARG_ADVANCED);
731
3/8
✓ Branch 2 taken 251 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 251 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 251 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
502 declare_arg("biblio", false, "output bibliography citations");
732
1/2
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
251 declare_arg(
733
2/6
✓ Branch 1 taken 251 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 251 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
502 "biblio:command_line", false,
734 251 "dump all command line arguments in biblio. report"
735 );
736 251 }
737
738 /**
739 * \brief Imports the gui option group.
740 */
741 void import_arg_group_gui() {
742 declare_arg_group("gui", "gui options", ARG_ADVANCED);
743 declare_arg("gui:state", "", "gui layout state");
744 declare_arg("gui:style", "Dark", "gui style, one of Dark,Light");
745 declare_arg("gui:font_size", 18, "font size");
746 declare_arg("gui:expert", false, "expert mode for developpers");
747 #ifdef GEO_OS_ANDROID
748 declare_arg(
749 "gui:phone_screen", true, "running on a phone (or testing)"
750 );
751 #else
752 declare_arg(
753 "gui:phone_screen", false, "running on a phone (or testing)"
754 );
755 #endif
756 }
757
758 /************************************************************************/
759
760 /**
761 * \brief Sets the CAD profile
762 */
763 2 void set_profile_cad() {
764
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 set_arg("pre:repair", true);
765
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 set_arg_percent("pre:margin", 0.05);
766
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 set_arg("post:repair", true);
767
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 set_arg("remesh:sharp_edges", true);
768
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 set_arg("remesh:RVC_centroids", false);
769 2 }
770
771 /**
772 * \brief Sets the scanner profile
773 */
774 229 void set_profile_scan() {
775
1/2
✓ Branch 2 taken 229 times.
✗ Branch 3 not taken.
229 set_arg("pre:Nsmooth_iter", 3);
776
1/2
✓ Branch 2 taken 229 times.
✗ Branch 3 not taken.
229 set_arg("pre:repair", true);
777
1/2
✓ Branch 2 taken 229 times.
✗ Branch 3 not taken.
229 set_arg_percent("pre:max_hole_area", 10);
778
1/2
✓ Branch 2 taken 229 times.
✗ Branch 3 not taken.
229 set_arg("remesh:anisotropy", 1.0);
779
1/2
✓ Branch 2 taken 229 times.
✗ Branch 3 not taken.
229 set_arg_percent("pre:min_comp_area", 3);
780
1/2
✓ Branch 2 taken 229 times.
✗ Branch 3 not taken.
229 set_arg_percent("post:min_comp_area", 3);
781 229 }
782
783 /**
784 * \brief Sets the conversion profile
785 */
786 8 void set_profile_convert() {
787
1/2
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
8 set_arg("pre", false);
788
1/2
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
8 set_arg("post", false);
789
1/2
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
8 set_arg("remesh", false);
790 8 }
791
792 /**
793 * \brief Sets the repair profile
794 */
795 void set_profile_repair() {
796 set_arg("pre", true);
797 set_arg("pre:repair", true);
798 set_arg("pre:intersect", true);
799 set_arg("pre:intersect_remove_internal_shells",true);
800 set_arg("post", false);
801 set_arg("remesh", false);
802 }
803
804 /**
805 * \brief Sets the heal profile
806 */
807 void set_profile_heal() {
808 set_arg("remesh", true);
809 set_arg("remesh:multi_nerve", false);
810 set_arg("post", true);
811 set_arg_percent("post:max_hole_area", 10);
812 set_arg_percent("post:min_comp_area", 3);
813 }
814
815 /**
816 * \brief Sets the reconstruction profile
817 */
818 2 void set_profile_reconstruct() {
819
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 set_arg("pre", false);
820
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 set_arg("post", false);
821
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 set_arg("remesh", false);
822
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 set_arg("co3ne", true);
823 2 }
824
825 /**
826 * \brief Sets the hex-dominant meshing profile
827 */
828 void set_profile_hex() {
829 set_arg("hex", true);
830 }
831
832 /**
833 * \brief Sets the quad-dominant meshing profile
834 */
835 void set_profile_quad() {
836 set_arg("quad", true);
837 }
838
839 /**
840 * \brief Sets the tetrahedral meshing profile
841 */
842 1 void set_profile_tet() {
843
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 set_arg("tet", true);
844 1 }
845
846 /**
847 * \brief Sets the polyhedral meshing profile
848 */
849 4 void set_profile_poly() {
850
1/2
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
4 set_arg("poly", true);
851 4 }
852 }
853
854 namespace GEO {
855
856 namespace CmdLine {
857
858 847 bool import_arg_group(
859 const std::string& name
860 ) {
861
3/4
✓ Branch 0 taken 251 times.
✓ Branch 1 taken 596 times.
✓ Branch 3 taken 251 times.
✗ Branch 4 not taken.
847 static std::set<std::string> imported;
862
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 847 times.
847 if(imported.find(name) != imported.end()) {
863 return true;
864 }
865 imported.insert(name);
866
867
2/2
✓ Branch 0 taken 251 times.
✓ Branch 1 taken 596 times.
847 if(name == "standard") {
868 251 import_arg_group_global();
869 251 import_arg_group_sys();
870 251 import_arg_group_nl();
871 251 import_arg_group_log();
872 251 import_arg_group_biblio();
873
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 596 times.
596 } else if(name == "global") {
874 import_arg_group_global();
875
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 596 times.
596 } else if(name == "nl") {
876 import_arg_group_nl();
877
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 596 times.
596 } else if(name == "sys") {
878 import_arg_group_sys();
879
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 596 times.
596 } else if(name == "log") {
880 import_arg_group_log();
881
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 548 times.
596 } else if(name == "pre") {
882 48 import_arg_group_pre();
883
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 500 times.
548 } else if(name == "remesh") {
884 48 import_arg_group_remesh();
885
2/2
✓ Branch 0 taken 238 times.
✓ Branch 1 taken 262 times.
500 } else if(name == "algo") {
886 238 import_arg_group_algo();
887
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 214 times.
262 } else if(name == "post") {
888 48 import_arg_group_post();
889
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 166 times.
214 } else if(name == "opt") {
890 48 import_arg_group_opt();
891
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 118 times.
166 } else if(name == "co3ne") {
892 48 import_arg_group_co3ne();
893
2/2
✓ Branch 0 taken 22 times.
✓ Branch 1 taken 96 times.
118 } else if(name == "stat") {
894 22 import_arg_group_stat();
895
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 96 times.
96 } else if(name == "quad") {
896 import_arg_group_quad();
897
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 96 times.
96 } else if(name == "hex") {
898 import_arg_group_hex();
899
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 48 times.
96 } else if(name == "tet") {
900 48 import_arg_group_tet();
901
1/2
✓ Branch 0 taken 48 times.
✗ Branch 1 not taken.
48 } else if(name == "poly") {
902 48 import_arg_group_poly();
903 } else if(name == "gfx") {
904 import_arg_group_gfx();
905 } else if(name == "gui") {
906 import_arg_group_gui();
907 } else {
908 Logger::instance()->set_quiet(false);
909 Logger::err("CmdLine")
910 << "No such option group: " << name
911 << std::endl;
912 return false;
913 }
914 return true;
915 }
916
917 247 bool set_profile(
918 const std::string& name
919 ) {
920
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 245 times.
247 if(name == "cad") {
921 2 set_profile_cad();
922
2/2
✓ Branch 0 taken 229 times.
✓ Branch 1 taken 16 times.
245 } else if(name == "scan") {
923 229 set_profile_scan();
924
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
16 } else if(name == "convert") {
925 8 set_profile_convert();
926
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 } else if(name == "repair") {
927 set_profile_repair();
928
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 } else if(name == "heal") {
929 set_profile_heal();
930
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
8 } else if(name == "reconstruct") {
931 2 set_profile_reconstruct();
932
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 5 times.
6 } else if(name == "tet") {
933 1 set_profile_tet();
934
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
5 } else if(name == "quad") {
935 set_profile_quad();
936
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
5 } else if(name == "hex") {
937 set_profile_hex();
938
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
5 } else if(name == "poly") {
939 4 set_profile_poly();
940 } else {
941 1 Logger::instance()->set_quiet(false);
942
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 Logger::err("CmdLine")
943 << "No such profile: " << name
944 << std::endl;
945 1 return false;
946 }
947 return true;
948 }
949 }
950 }
951