141 return wxEmptyString;
143 enum class VALUE_KIND
150 enum class VALUE_UNIT
158 static const std::map<wxString, std::pair<VALUE_KIND, VALUE_UNIT>> sDescriptor = {
159 { wxS(
"annular_width" ), { VALUE_KIND::MIN, VALUE_UNIT::DISTANCE } },
160 { wxS(
"clearance" ), { VALUE_KIND::MIN, VALUE_UNIT::DISTANCE } },
161 { wxS(
"connection_width" ), { VALUE_KIND::MIN, VALUE_UNIT::DISTANCE } },
162 { wxS(
"courtyard_clearance" ), { VALUE_KIND::MIN, VALUE_UNIT::DISTANCE } },
163 { wxS(
"creepage" ), { VALUE_KIND::MIN, VALUE_UNIT::DISTANCE } },
164 { wxS(
"daisy_chain_stub" ), { VALUE_KIND::MAX, VALUE_UNIT::DISTANCE } },
165 { wxS(
"daisy_chain_stub_2" ), { VALUE_KIND::MAX, VALUE_UNIT::DISTANCE } },
166 { wxS(
"edge_clearance" ), { VALUE_KIND::MIN, VALUE_UNIT::DISTANCE } },
167 { wxS(
"hole" ), { VALUE_KIND::MIN, VALUE_UNIT::DISTANCE } },
168 { wxS(
"hole_clearance" ), { VALUE_KIND::MIN, VALUE_UNIT::DISTANCE } },
169 { wxS(
"hole_to_hole" ), { VALUE_KIND::MIN, VALUE_UNIT::DISTANCE } },
170 { wxS(
"length" ), { VALUE_KIND::MAX, VALUE_UNIT::DISTANCE } },
171 { wxS(
"maximum_allowed_deviation" ), { VALUE_KIND::MAX, VALUE_UNIT::DISTANCE } },
172 { wxS(
"min_resolved_spokes" ), { VALUE_KIND::MIN, VALUE_UNIT::COUNT } },
173 { wxS(
"net_antenna" ), { VALUE_KIND::MAX, VALUE_UNIT::DISTANCE } },
174 { wxS(
"physical_clearance" ), { VALUE_KIND::MIN, VALUE_UNIT::DISTANCE } },
175 { wxS(
"smd_corner" ), { VALUE_KIND::MIN, VALUE_UNIT::DISTANCE } },
176 { wxS(
"smd_to_plane_plus" ), { VALUE_KIND::MAX, VALUE_UNIT::DISTANCE } },
177 { wxS(
"silk_clearance" ), { VALUE_KIND::MIN, VALUE_UNIT::DISTANCE } },
178 { wxS(
"solder_mask_expansion" ), { VALUE_KIND::OPT, VALUE_UNIT::DISTANCE } },
179 { wxS(
"solder_mask_sliver" ), { VALUE_KIND::MIN, VALUE_UNIT::DISTANCE } },
180 { wxS(
"solder_paste_abs_margin" ), { VALUE_KIND::OPT, VALUE_UNIT::DISTANCE } },
181 { wxS(
"thermal_spoke_width" ), { VALUE_KIND::OPT, VALUE_UNIT::DISTANCE } },
182 { wxS(
"track_angle" ), { VALUE_KIND::MIN, VALUE_UNIT::ANGLE } },
183 { wxS(
"track_width" ), { VALUE_KIND::MIN, VALUE_UNIT::DISTANCE } },
184 { wxS(
"via_count" ), { VALUE_KIND::MAX, VALUE_UNIT::COUNT } },
185 { wxS(
"via_diameter" ), { VALUE_KIND::MIN, VALUE_UNIT::DISTANCE } }
191 code = wxS(
"numeric_value" );
195 code = wxS(
"min_resolved_spokes" );
197 auto descriptorIt = sDescriptor.find( code );
199 VALUE_KIND valueKind = VALUE_KIND::MIN;
200 VALUE_UNIT valueUnit = VALUE_UNIT::DISTANCE;
202 if( descriptorIt != sDescriptor.end() )
204 valueKind = descriptorIt->second.first;
205 valueUnit = descriptorIt->second.second;
209 wxLogTrace( wxS(
"KI_TRACE_DRC_RULE_EDITOR" ),
210 wxS(
"No numeric descriptor for constraint '%s', defaulting to minimum distance." ),
214 auto formatValue = [&](
double aValue )
218 case VALUE_UNIT::ANGLE:
return formatDouble( aValue ) + wxS(
"deg" );
219 case VALUE_UNIT::COUNT:
221 long long count =
static_cast<long long>( std::llround( aValue ) );
222 return wxString::Format( wxS(
"%lld" ), count );
224 case VALUE_UNIT::UNITLESS:
return formatDouble( aValue );
225 case VALUE_UNIT::DISTANCE:
231 wxString formattedValue = formatValue( rawValue );
237 case VALUE_KIND::MAX:
238 clause = wxString::Format( wxS(
"(constraint %s (max %s))" ), code, formattedValue );
240 case VALUE_KIND::OPT:
241 clause = wxString::Format( wxS(
"(constraint %s (opt %s))" ), code, formattedValue );
243 case VALUE_KIND::MIN:
245 clause = wxString::Format( wxS(
"(constraint %s (min %s))" ), code, formattedValue );
249 wxLogTrace( wxS(
"KI_TRACE_DRC_RULE_EDITOR" ), wxS(
"Numeric constraint clause: %s" ), clause );
251 return buildRule( aContext, { clause } );
wxString buildRule(const RULE_GENERATION_CONTEXT &aContext, const std::vector< wxString > &aConstraintClauses) const
wxString result
Test unit parsing edge cases and error handling.