54 "doc": "Application name must be image_simulation."
55 },
56 {
57 "pointer": "/input",
58 "type": "list",
59 "doc": "List of triangular input meshes.",
60 "min": 1
61 },
62 {
63 "pointer": "/input/*",
64 "type": "string",
65 "doc": "Triangular input mesh."
66 },
67 {
68 "pointer": "/input_names",
69 "type": "list",
70 "doc": "List of names for the input meshes. If no names are assigned, the meshes will be named tag_0, tag_1, etc.",
71 "default": []
72 },
73 {
74 "pointer": "/input_names/*",
75 "type": "string",
76 "doc": "Name for one input mesh."
77 },
78 {
79 "pointer": "/operation",
80 "type": "string",
81 "default": "remeshing",
82 "options": [
83 "remeshing",
84 "fill_holes_topo",
85 "tight_seal_topo",
86 "keep_lcc",
87 "resolve_intersections",
88 "replace_tags",
89 "tag_priority"
90 ],
91 "doc": "Image simulation contains multiple operations for modifying the image. Depending on the operation, more parameters might be required."
92 },
93 {
94 "pointer": "/output",
95 "type": "string",
96 "default": "out",
97 "doc": "Output file name (without extension)."
98 },
99 {
100 "pointer": "/input_transform",
101 "type": "list",
102 "doc": "Transformation matrices for the inputs. Transformations are optional and don't need to be described for all inputs.",
103 "default": []
104 },
105 {
106 "pointer": "/input_transform/*",
107 "type": "list",
108 "doc": "Transformation matrix (4x4 homogeneous coordinates) for one input.",
109 "max": 4
110 },
111 {
112 "pointer": "/input_transform/*/*",
113 "type": "list",
114 "min": 4,
115 "max": 4
116 },
117 {
118 "pointer": "/input_transform/*/*",
119 "type": "float"
120 },
121 {
122 "pointer": "/skip_simplify",
123 "type": "bool",
124 "default": false,
125 "doc": "If true, input simplification will be skipped."
126 },
127 {
128 "pointer": "/use_sample_envelope",
129 "type": "bool",
130 "default": false,
131 "doc": "Use sample envelope instead of exact one."
132 },
133 {
134 "pointer": "/num_threads",
135 "type": "int",
136 "default": 0,
137 "doc": "Number of threads used by the application"
138 },
139 {
140 "pointer": "/max_iterations",
141 "type": "int",
142 "default": 80,
143 "doc": "Maximum iterations before stopping."
144 },
145 {
146 "pointer": "/eps_rel",
147 "type": "float",
148 "default": 2e-3,
149 "doc": "Envelope thickness relative to the bounding box"
150 },
151 {
152 "pointer": "/eps",
153 "type": "float",
154 "default": -1,
155 "doc": "Absolute envelope thickness. If this value is negative, the relative envelope thickness is used to compute the absolute one."
156 },
157 {
158 "pointer": "/eps_simplify_rel",
159 "type": "float",
160 "default": 2e-4,
161 "doc": "Envelope thickness relative to the bounding box for the initial simplification."
162 },
163 {
164 "pointer": "/eps_simplify",
165 "type": "float",
166 "default": -1,
167 "doc": "Absolute envelope thickness for the initial simplification. If this value is negative, the relative envelope thickness is used to compute the absolute one."
168 },
169 {
170 "pointer": "/length",
171 "type": "float",
172 "default": -1,
173 "doc": "Absolute target edge length. If this value is negative, the relative length is used to compute the absolute one."
174 },
175 {
176 "pointer": "/length_rel",
177 "type": "float",
178 "default": 5e-2,
179 "doc": "Target edge length relative to the bounding box"
180 },
181 {
182 "pointer": "/length_region",
183 "type": "list",
184 "default": [],
185 "doc": "Prescribe a length for a specific region defined by tags. The length can be absolute (length) or relative (length_rel). The smallest prescibed length will be used for each region."
186 },
187 {
188 "pointer": "/length_region/*",
189 "type": "object",
190 "required": ["tags"],
191 "optional": ["length", "length_rel"],
192 "doc": "A region and its target length."
193 },
194 {
195 "pointer": "/length_region/*/tags",
196 "type": "string",
197 "doc": "A region of tags."
198 },
199 {
200 "pointer": "/length_region/*/length",
201 "type": "float",
202 "default": -1,
203 "doc": "Absolute target edge length for the region."
204 },
205 {
206 "pointer": "/length_region/*/length_rel",
207 "type": "float",
208 "default": 5e-2,
209 "doc": "Relative target edge length for the region."
210 },
211 {
212 "pointer": "/stop_energy",
213 "type": "float",
214 "default": 10,
215 "doc": "Target energy. If all tets have an energy below this, tetwild will stop."
216 },
217 {
218 "pointer": "/stop_at_float",
219 "type": "bool",
220 "default": false,
221 "doc": "Stop when all vertices are in floating point precision, i.e., no more rational numbers are needed. stop_energy will be ignored when this is true."
222 },
223 {
224 "pointer": "/preserve_topology",
225 "type": "bool",
226 "default": true,
227 "doc": "Preserve topology of input."
228 },
229 {
230 "pointer": "/w_amips",
231 "type": "float",
232 "default": 1e-4,
233 "min": 0,
234 "max": 1,
235 "doc": "AMIPS energy"
236 },
237 {
238 "pointer": "/write_vtu",
239 "type": "bool",
240 "default": false,
241 "doc": "Write not just MSH but also VTU output."
242 },
243 {
244 "pointer": "/write_envelope",
245 "type": "bool",
246 "default": true,
247 "doc": "Save the envelope in the MSH output (as a separate physical group with tag 'envelope')."
248 },
249 {
250 "pointer": "/log_file",
251 "type": "string",
252 "default": "",
253 "doc": "Logs are not just printed on the terminal but also saved in this file."
254 },
255 {
256 "pointer": "/report",
257 "type": "string",
258 "default": "",
259 "doc": "A JSON file that stores information about the result and the method execution, e.g., runtime."
260 },
261 {
262 "pointer": "/DEBUG_output",
263 "type": "bool",
264 "default": false,
265 "doc": "Write the mesh as debug_{}.vtu after every operation."
266 },
267 {
268 "pointer": "/DEBUG_sanity_checks",
269 "type": "bool",
270 "default": false,
271 "doc": "Perform sanity checks after every operation. This can be very slow and should only be used for debugging."
272 },
273 {
274 "pointer": "/fill_holes_tags",
275 "type": "list",
276 "default": [],
277 "doc": "For fill_holes_topo: list of tag values used to fill enclosed connected components (processed in order)."
278 },
279 {
280 "pointer": "/fill_holes_tags/*",
281 "type": "string",
282 "doc": "An intersection of tag values to fill holes."
283 },
284 {
285 "pointer": "/fill_holes_threshold",
286 "type": "float",
287 "default": -1,
288 "doc": "For fill_holes_topo: only fill a connected component if its area is less than this threshold. Negative value means no threshold (fill all enclosed components)."
289 },
290 {
291 "pointer": "/tight_seal_tag_sets",
292 "type": "list",
293 "default": [],
294 "doc": "For tight_seal_topo: list of tag sets. Each inner list defines a group of tags whose enclosed holes are filled, e.g. [[1,2],[3]]."
295 },
296 {
297 "pointer": "/tight_seal_tag_sets/*",
298 "type": "list",
299 "min": 2,
300 "max": 2,
301 "doc": "One tag set: a list of tag values that are treated as a group for hole filling."
302 },
303 {
304 "pointer": "/tight_seal_tag_sets/*/*",
305 "type": "string",
306 "doc": "An intersection of tags."
307 },
308 {
309 "pointer": "/tight_seal_threshold",
310 "type": "float",
311 "default": -1,
312 "doc": "For tight_seal_topo: only fill a hole cluster if its total area is less than this threshold. Negative value means no threshold."
313 },
314 {
315 "pointer": "/keep_lcc_tags",
316 "type": "list",
317 "default": [],
318 "doc": "For keep_lcc: list of tag values for which only the largest connected component is kept."
319 },
320 {
321 "pointer": "/keep_lcc_tags/*",
322 "type": "string",
323 "doc": "An intersection of tags whose smaller connected components will be removed."
324 },
325 {
326 "pointer": "/keep_lcc_num",
327 "type": "int",
328 "default": 1,
329 "doc": "Number of largest connected components that are kept. By default, only the largest one is kept."
330 },
331 {
332 "pointer": "/resolve_intersections_tags",
333 "type": "list",
334 "default": [],
335 "doc": "Resolve intersections between tags by filling the areas with intersections with the nearest of the intersecting tags."
336 },
337 {
338 "pointer": "/resolve_intersections_tags/*",
339 "type": "string",
340 "doc": "An intersection of two tags"
341 },
342 {
343 "pointer": "/replace_tags_in",
344 "type": "list",
345 "default": [],
346 "doc": "Replace the tags by the output tags."
347 },
348 {
349 "pointer": "/replace_tags_in/*",
350 "type": "string",
351 "doc": "An intersection of tags that should be replaced."
352 },
353 {
354 "pointer": "/replace_tags_out",
355 "type": "list",
356 "default": [],
357 "doc": "The output tags (written as intersection) that should replace the input tags. For each input tag, an output tag must be provided. The order of the output tags should correspond to the order of the input tags."
358 },
359 {
360 "pointer": "/replace_tags_out/*",
361 "type": "string",
362 "doc": "An intersection of tags that should replace the input tags."
363 },
364 {
365 "pointer": "/tag_priority",
366 "type": "list",
367 "default": [],
368 "doc": "List of tags for the tag_priority operation. Tags earlier in the list have higher priority."
369 },
370 {
371 "pointer": "/tag_priority/*",
372 "type": "string",
373 "doc": "A tag value."
374 },
375 {
376 "pointer": "/tags_selection",
377 "type": "string",
378 "default": "_ | !_",
379 "doc": "A boolean expression that defines the input selection for intent operations. `_` represents empty tags."