26 ExpressionPtr offset_selection;
27 std::set<std::string> offset_output_tag;
28 std::set<std::string> protected_tags;
29 bool respect_all_topologies;
32 double target_distance;
33 double target_distance_rel;
34 double convergence_target;
35 double convergence_target_rel;
40 double convergence_normal_deviation;
45 bool throw_on_nonconvergence;
49 double envelope_size_rel;
53 bool region_envelope_from_input;
54 double relative_ball_threshold;
61 double edge_search_term_len;
63 std::string output_path;
68 int optimization_iterations;
73 double max_normal_deviation_deg;
77 double min_normal_deviation_deg;
82 double min_edge_length;
88 double smooth_quadrics_weight;
89 double smooth_laplacian_weight;
92 double quadrics_svd_threshold;
96 double min_sizing_scalar;
97 double max_sizing_scalar;
100 double sizing_mrm_threshold;
104 double sizing_gradation;
113 for (
const std::string& tag : json_params[
"offset_output_tags"]) {
114 if (tag ==
"ambient") {
116 "'ambient' tag cannot be given explicitly to offset_output_tags, ignoring. To "
117 "set offset to 'ambient', pass offset_output_tags=[].");
120 offset_output_tag.insert(tag);
122 for (
const std::string& tag : json_params[
"protected_tags"]) {
123 if (tag ==
"ambient") {
124 logger().warn(
"'ambient' tag cannot be protected, ignoring.");
127 protected_tags.insert(tag);
129 respect_all_topologies = json_params[
"respect_all_topologies"];
130 offset_in = json_params[
"offset_in"];
131 offset_out = json_params[
"offset_out"];
132 target_distance = json_params[
"target_distance"];
133 target_distance_rel = json_params[
"target_distance_rel"];
134 convergence_target = json_params[
"convergence_target"];
135 convergence_target_rel = json_params[
"convergence_target_rel"];
136 convergence_normal_deviation = json_params[
"convergence_normal_deviation"];
137 throw_on_nonconvergence = json_params[
"throw_on_nonconvergence"];
138 envelope_size = json_params[
"envelope_size"];
139 envelope_size_rel = json_params[
"envelope_size_rel"];
140 region_envelope_from_input = json_params[
"region_envelope_from_input"];
141 relative_ball_threshold = json_params[
"relative_ball_threshold"];
142 if (relative_ball_threshold < 0.0 || relative_ball_threshold > 1.0) {
144 "Invalid relative_ball_threshold [{}], must be between 0 and 1.",
145 relative_ball_threshold);
148 edge_search_term_len = json_params[
"edge_search_termination_len"];
149 sorted_marching = json_params[
"sorted_marching"];
150 output_path = json_params[
"output"];
151 optimize = json_params[
"optimize"];
152 save_vtu = json_params[
"save_vtu"];
154 num_threads = json_params[
"num_threads"];
155 optimization_iterations = json_params[
"optimization_iterations"];
157 max_normal_deviation_deg = json_params[
"max_normal_deviation_deg"];
158 min_normal_deviation_deg = json_params[
"min_normal_deviation_deg"];
159 min_edge_length = json_params[
"min_edge_length"];
161 smooth_quadrics_weight = json_params[
"smooth_quadrics_weight"];
162 smooth_laplacian_weight = json_params[
"smooth_laplacian_weight"];
163 quadrics_svd_threshold = json_params[
"quadrics_svd_threshold"];
165 min_sizing_scalar = json_params[
"min_sizing_scalar"];
166 max_sizing_scalar = json_params[
"max_sizing_scalar"];
167 sizing_mrm_threshold = json_params[
"sizing_mrm_threshold"];
168 sizing_gradation = json_params[
"sizing_gradation"];
171 debug_output = json_params[
"DEBUG_output"];
172 lr = json_params[
"length_rel"];
173 l = json_params[
"length"];
174 stop_energy = json_params[
"stop_energy"];
177 skip_good_regions = json_params[
"skip_good_regions"];
178 w_amips = json_params[
"w_amips"];
183 perform_sanity_checks = json_params[
"perform_sanity_checks"];
186 void init(
const VectorXd& min_,
const VectorXd& max_)
198 preserve_topology =
true;
205 if (target_distance > 0) {
206 target_distance_rel = target_distance / diag_l;
208 target_distance = target_distance_rel * diag_l;
214 if (convergence_target > 0) {
215 convergence_target_rel = convergence_target / target_distance;
217 convergence_target = convergence_target_rel * target_distance;
222 if (envelope_size > 0) {
223 envelope_size_rel = envelope_size / diag_l;
225 envelope_size = envelope_size_rel * diag_l;
234 if (min_edge_length < 0) {
235 const double sigma = max_normal_deviation_deg * M_PI / 180.;
236 min_edge_length = 2. * target_distance * std::sin(std::min(sigma, M_PI / 2.));