33#include <unordered_set>
44static std::optional<int>
getInPcbUnits(
const nlohmann::json& aObj,
const std::string& aKey,
45 std::optional<int> aDefault = std::optional<int>() )
47 if( aObj.contains( aKey ) && aObj[aKey].is_number() )
48 return pcbIUScale.mmToIU( aObj[aKey].get<double>() );
54static std::optional<int>
getInSchUnits(
const nlohmann::json& aObj,
const std::string& aKey,
55 std::optional<int> aDefault = std::optional<int>() )
57 if( aObj.contains( aKey ) && aObj[aKey].is_number() )
58 return schIUScale.MilsToIU( aObj[aKey].get<double>() );
72 []( nlohmann::json& json_array,
const std::shared_ptr<NETCLASS>& nc )
76 nlohmann::json nc_json = { {
"name", nc->GetName().ToUTF8() },
77 {
"priority", nc->GetPriority() },
78 {
"schematic_color", nc->GetSchematicColor(
true ) },
79 {
"pcb_color", nc->GetPcbColor(
true ) },
80 {
"tuning_profile", nc->GetTuningProfile() } };
83 []( nlohmann::json&
json,
const std::string& aKey,
int aValue )
88 if( nc->HasWireWidth() )
90 {
"wire_width",
schIUScale.IUToMils( nc->GetWireWidth() ) } );
92 if( nc->HasBusWidth() )
93 nc_json.push_back( {
"bus_width",
schIUScale.IUToMils( nc->GetBusWidth() ) } );
95 if( nc->HasLineStyle() )
96 nc_json.push_back( {
"line_style", nc->GetLineStyle() } );
98 if( nc->HasClearance() )
99 saveInPcbUnits( nc_json,
"clearance", nc->GetClearance() );
101 if( nc->HasTrackWidth() )
102 saveInPcbUnits( nc_json,
"track_width", nc->GetTrackWidth() );
104 if( nc->HasViaDiameter() )
105 saveInPcbUnits( nc_json,
"via_diameter", nc->GetViaDiameter() );
107 if( nc->HasViaDrill() )
108 saveInPcbUnits( nc_json,
"via_drill", nc->GetViaDrill() );
110 if( nc->HasuViaDiameter() )
111 saveInPcbUnits( nc_json,
"microvia_diameter", nc->GetuViaDiameter() );
113 if( nc->HasuViaDrill() )
114 saveInPcbUnits( nc_json,
"microvia_drill", nc->GetuViaDrill() );
116 if( nc->HasDiffPairWidth() )
117 saveInPcbUnits( nc_json,
"diff_pair_width", nc->GetDiffPairWidth() );
119 if( nc->HasDiffPairGap() )
120 saveInPcbUnits( nc_json,
"diff_pair_gap", nc->GetDiffPairGap() );
122 if( nc->HasDiffPairViaGap() )
123 saveInPcbUnits( nc_json,
"diff_pair_via_gap", nc->GetDiffPairViaGap() );
125 json_array.push_back( nc_json );
129 [](
const nlohmann::json& entry )
131 wxString
name = entry[
"name"];
133 std::shared_ptr<NETCLASS> nc = std::make_shared<NETCLASS>(
name,
false );
135 if( entry.contains(
"priority" ) && entry[
"priority"].is_number() )
136 nc->SetPriority( entry[
"priority"].get<int>() );
138 if( entry.contains(
"tuning_profile" ) && entry[
"tuning_profile"].is_string() )
139 nc->SetTuningProfile( entry[
"tuning_profile"].get<wxString>() );
142 nc->SetClearance( *value );
145 nc->SetTrackWidth( *value );
148 nc->SetViaDiameter( *value );
151 nc->SetViaDrill( *value );
153 if(
auto value =
getInPcbUnits( entry,
"microvia_diameter" ) )
154 nc->SetuViaDiameter( *value );
157 nc->SetuViaDrill( *value );
160 nc->SetDiffPairWidth( *value );
163 nc->SetDiffPairGap( *value );
165 if(
auto value =
getInPcbUnits( entry,
"diff_pair_via_gap" ) )
166 nc->SetDiffPairViaGap( *value );
169 nc->SetWireWidth( *value );
172 nc->SetBusWidth( *value );
174 if( entry.contains(
"line_style" ) && entry[
"line_style"].is_number() )
175 nc->SetLineStyle( entry[
"line_style"].get<int>() );
177 if( entry.contains(
"pcb_color" ) && entry[
"pcb_color"].is_string() )
178 nc->SetPcbColor( entry[
"pcb_color"].get<KIGFX::COLOR4D>() );
180 if( entry.contains(
"schematic_color" )
181 && entry[
"schematic_color"].is_string() )
183 nc->SetSchematicColor( entry[
"schematic_color"].get<KIGFX::COLOR4D>() );
190 [&]() -> nlohmann::json
192 nlohmann::json ret = nlohmann::json::array();
198 saveNetclass( ret, netclass );
202 [&](
const nlohmann::json& aJson )
204 if( !aJson.is_array() )
209 for(
const nlohmann::json& entry : aJson )
211 if( !entry.is_object() || !entry.contains(
"name" ) )
214 std::shared_ptr<NETCLASS> nc = readNetClass( entry );
216 if( nc->IsDefault() )
225 [&]() -> nlohmann::json
227 nlohmann::json ret = {};
231 std::string key( netname.ToUTF8() );
232 ret[ std::move( key ) ] = color;
237 [&](
const nlohmann::json& aJson )
239 if( !aJson.is_object() )
244 for(
const auto& pair : aJson.items() )
246 wxString key( pair.key().c_str(), wxConvUTF8 );
253 [&]() -> nlohmann::json
258 nlohmann::json ret = nlohmann::json::object();
261 ret[ std::string(
chain.ToUTF8() ) ] = std::string( className.ToUTF8() );
265 [&](
const nlohmann::json& aJson )
267 if( !aJson.is_object() )
272 for(
const auto& pair : aJson.items() )
274 wxString
chain( pair.key().c_str(), wxConvUTF8 );
275 wxString className = pair.value().get<wxString>();
277 if( !className.IsEmpty() )
284 [&]() -> nlohmann::json
286 nlohmann::json ret = {};
290 nlohmann::json netclassesJson = nlohmann::json::array();
292 for(
const auto& netclass : netclassNames )
294 std::string netclassStr( netclass.ToUTF8() );
295 netclassesJson.push_back( std::move( netclassStr ) );
298 std::string key( netname.ToUTF8() );
299 ret[std::move( key )] = netclassesJson;
304 [&](
const nlohmann::json& aJson )
306 if( !aJson.is_object() )
311 for(
const auto& pair : aJson.items() )
313 wxString key( pair.key().c_str(), wxConvUTF8 );
315 for(
const auto& netclassName : pair.value() )
322 [&]() -> nlohmann::json
324 nlohmann::json ret = nlohmann::json::array();
328 nlohmann::json pattern_json = {
329 {
"pattern", matcher->GetPattern().ToUTF8() },
330 {
"netclass", netclassName.ToUTF8() }
333 ret.push_back( std::move( pattern_json ) );
338 [&](
const nlohmann::json& aJson )
340 if( !aJson.is_array() )
345 for(
const nlohmann::json& entry : aJson )
347 if( !entry.is_object() )
350 if( entry.contains(
"pattern" ) && entry[
"pattern"].is_string()
351 && entry.contains(
"netclass" ) && entry[
"netclass"].is_string() )
353 wxString pattern = entry[
"pattern"].get<wxString>();
354 wxString netclass = entry[
"netclass"].get<wxString>();
358 [&](
const wxString& memberPattern )
380 m_parent->ReleaseNestedSettings(
this );
395 auto patternEqual = [](
const auto& aLhs,
const auto& aRhs )
397 if( !aLhs.first || !aRhs.first )
398 return aLhs.first.get() == aRhs.first.get() && aLhs.second == aRhs.second;
400 return aLhs.first->GetPattern() == aRhs.first->GetPattern() && aLhs.second == aRhs.second;
437 for(
auto& netClass :
m_internals->At(
"classes" ).items() )
439 if( netClass.value().contains(
"nets" ) && netClass.value()[
"nets"].is_array() )
441 nlohmann::json migrated = nlohmann::json::array();
443 for(
auto& net : netClass.value()[
"nets"].items() )
446 netClass.value()[
"nets"] = migrated;
465 nlohmann::json patterns = nlohmann::json::array();
467 for(
auto& netClass :
m_internals->At(
"classes" ).items() )
469 if( netClass.value().contains(
"name" )
470 && netClass.value().contains(
"nets" )
471 && netClass.value()[
"nets"].is_array() )
473 wxString netClassName = netClass.value()[
"name"].get<wxString>();
475 for(
auto& net : netClass.value()[
"nets"].items() )
477 nlohmann::json pattern_json = {
478 {
"pattern", net.value().get<wxString>() },
479 {
"netclass", netClassName }
482 patterns.push_back( pattern_json );
487 m_internals->SetFromString(
"netclass_patterns", patterns );
501 for(
auto& netClass :
m_internals->At(
"classes" ).items() )
504 netClass.value()[
"priority"] = std::numeric_limits<int>::max();
506 netClass.value()[
"priority"] = priority++;
511 if(
m_internals->contains(
"netclass_assignments" )
512 &&
m_internals->At(
"netclass_assignments" ).is_object() )
514 nlohmann::json migrated = {};
516 for(
const auto& pair :
m_internals->At(
"netclass_assignments" ).items() )
518 nlohmann::json netclassesJson = nlohmann::json::array();
520 if( pair.value().get<wxString>() != wxEmptyString )
521 netclassesJson.push_back( pair.value() );
523 migrated[pair.key()] = netclassesJson;
526 m_internals->SetFromString(
"netclass_assignments", migrated );
538 const wxString emptyStr =
"";
540 for(
auto& netClass :
m_internals->At(
"classes" ).items() )
541 netClass.value()[
"tuning_profile"] = emptyStr.ToUTF8();
618 const std::set<wxString>& netclasses )
625 const std::set<wxString>& netclasses )
643 [&](
const wxString& memberPattern )
658 if( assignment.first->GetPattern() == pattern && assignment.second == netclass )
664 { std::make_unique<EDA_COMBINED_MATCHER>( pattern,
CTX_NETCLASS ), netclass } );
669 std::vector<std::pair<std::unique_ptr<EDA_COMBINED_MATCHER>, wxString>>&& netclassPatterns )
676std::vector<std::pair<std::unique_ptr<EDA_COMBINED_MATCHER>, wxString>>&
692 [&](
const wxString& memberPattern )
702 const wxString& netclass )
706 if( !assignment.first )
709 if( assignment.first->GetPattern() == pattern && assignment.second == netclass )
714 { std::make_unique<EDA_COMBINED_MATCHER>( pattern,
CTX_NETCLASS ), netclass } );
776 auto getExplicitNetclass =
777 [
this](
const wxString& netclass ) -> std::shared_ptr<NETCLASS>
793 auto getOrAddImplicitNetcless =
794 [
this](
const wxString& netclass ) -> std::shared_ptr<NETCLASS>
800 std::shared_ptr<NETCLASS> nc = std::make_shared<NETCLASS>( netclass,
false );
801 nc->SetPriority( std::numeric_limits<int>::max() - 1 );
812 if( aNetName.IsEmpty() )
819 return cacheItr->second;
822 std::unordered_set<std::shared_ptr<NETCLASS>> resolvedNetclasses;
829 for(
const wxString& netclassName : it->second )
831 std::shared_ptr<NETCLASS> netclass = getExplicitNetclass( netclassName );
835 resolvedNetclasses.insert( std::move( netclass ) );
839 resolvedNetclasses.insert( getOrAddImplicitNetcless( netclassName ) );
845 auto applyPatternList =
846 [&](
const std::vector<std::pair<std::unique_ptr<EDA_COMBINED_MATCHER>, wxString>>&
849 for(
const auto& [matcher, netclassName] : patterns )
851 if( matcher->StartsWith( aNetName ) )
853 std::shared_ptr<NETCLASS> netclass = getExplicitNetclass( netclassName );
856 resolvedNetclasses.insert( std::move( netclass ) );
858 resolvedNetclasses.insert( getOrAddImplicitNetcless( netclassName ) );
867 if( resolvedNetclasses.size() == 0 )
871 std::shared_ptr<NETCLASS> sharedNetclass;
872 bool allSameNetclass =
true;
873 bool isBusPattern =
false;
876 [&](
const wxString& member )
880 if( member == aNetName )
885 if( !allSameNetclass )
890 if( !sharedNetclass )
892 sharedNetclass = memberNc;
894 else if( memberNc->GetName() != sharedNetclass->GetName() )
896 allSameNetclass =
false;
900 if( isBusPattern && allSameNetclass && sharedNetclass
904 return sharedNetclass;
915 std::vector<NETCLASS*> netclassPtrs;
917 for(
const std::shared_ptr<NETCLASS>& nc : resolvedNetclasses )
918 netclassPtrs.push_back( nc.get() );
921 name.Printf(
"Effective for net: %s", aNetName );
922 std::shared_ptr<NETCLASS> effectiveNetclass = std::make_shared<NETCLASS>(
name,
false );
925 if( netclassPtrs.size() == 1 )
929 return *resolvedNetclasses.begin();
933 effectiveNetclass->SetConstituentNetclasses( std::move( netclassPtrs ) );
938 return effectiveNetclass;
948 std::vector<NETCLASS*> constituents = nc->GetConstituentNetclasses();
950 wxASSERT( constituents.size() > 0 );
955 constituents.pop_back();
959 nc->ResetParameters();
961 nc->SetConstituentNetclasses( std::move( constituents ) );
967 std::vector<NETCLASS*>& constituentNetclasses )
const
971 std::sort( constituentNetclasses.begin(), constituentNetclasses.end(),
974 int p1 = nc1->GetPriority();
975 int p2 = nc2->GetPriority();
981 return nc1->GetName().Cmp( nc2->GetName() ) < 0;
987 for(
auto itr = constituentNetclasses.rbegin(); itr != constituentNetclasses.rend(); ++itr )
994 effectiveNetclass->SetClearanceParent( nc );
1000 effectiveNetclass->SetTrackWidthParent( nc );
1006 effectiveNetclass->SetViaDiameterParent( nc );
1011 effectiveNetclass->SetViaDrill( nc->
GetViaDrill() );
1012 effectiveNetclass->SetViaDrillParent( nc );
1018 effectiveNetclass->SetuViaDiameterParent( nc );
1024 effectiveNetclass->SetuViaDrillParent( nc );
1030 effectiveNetclass->SetDiffPairWidthParent( nc );
1036 effectiveNetclass->SetDiffPairGapParent( nc );
1042 effectiveNetclass->SetDiffPairViaGapParent( nc );
1048 effectiveNetclass->SetWireWidthParent( nc );
1053 effectiveNetclass->SetBusWidth( nc->
GetBusWidth() );
1054 effectiveNetclass->SetBusWidthParent( nc );
1060 effectiveNetclass->SetLineStyleParent( nc );
1067 effectiveNetclass->SetPcbColor( pcbColor );
1068 effectiveNetclass->SetPcbColorParent( nc );
1075 effectiveNetclass->SetSchematicColor( schColor );
1076 effectiveNetclass->SetSchematicColorParent( nc );
1082 effectiveNetclass->SetTuningProfileParent( nc );
1094 bool addedDefault =
false;
1098 addedDefault =
true;
1105 addedDefault =
true;
1112 addedDefault =
true;
1119 addedDefault =
true;
1126 addedDefault =
true;
1133 addedDefault =
true;
1140 addedDefault =
true;
1147 addedDefault =
true;
1162 addedDefault =
true;
1169 addedDefault =
true;
1177 addedDefault =
true;
1182 return addedDefault;
1199 return c ==
'_' || c ==
'^' || c ==
'~';
1216 int backslashCount = 0;
1219 while( pos > 0 && aStr[pos - 1] ==
'\\' )
1226 return ( backslashCount % 2 ) == 1;
1231 std::vector<wxString>* aMemberList )
1236 static wxString digits( wxT(
"0123456789" ) );
1237 return digits.Contains( c );
1240 size_t busLen = aBus.length();
1247 int braceNesting = 0;
1248 bool fmtWrapsName =
false;
1249 bool inQuotes =
false;
1251 prefix.reserve( busLen );
1260 for( ; i < busLen; ++i )
1263 if( aBus[i] ==
'"' && !
isEscaped( aBus, i ) )
1265 inQuotes = !inQuotes;
1272 if( aBus[i] ==
'\\' && i + 1 < busLen )
1275 prefix += aBus[++i];
1285 if( aBus[i] ==
'{' )
1290 prefix += wxT(
'{' );
1296 else if( aBus[i] ==
'}' )
1299 prefix += wxT(
'}' );
1304 if( aBus[i] ==
'\\' && i + 1 < busLen && aBus[i + 1] ==
' ' )
1306 prefix += aBus[++i];
1311 if( aBus[i] ==
' ' || aBus[i] ==
']' )
1314 if( aBus[i] ==
'[' )
1316 if( braceNesting > 0 )
1318 size_t fmtStart = prefix.rfind( wxT(
'{' ) );
1320 if( fmtStart != wxString::npos && fmtStart > 0
1323 if( fmtStart == prefix.length() - 1 )
1328 prefix.erase( fmtStart - 1 );
1335 fmtWrapsName =
true;
1353 for( ; i < busLen; ++i )
1355 if( aBus[i] ==
'.' && i + 1 < busLen && aBus[i+1] ==
'.' )
1357 tmp.ToLong( &begin );
1370 tmp = wxEmptyString;
1375 for( ; i < busLen; ++i )
1377 if( aBus[i] ==
']' )
1392 for( ; i < busLen; ++i )
1394 if( aBus[i] ==
'}' )
1401 else if( aBus[i] ==
'+' || aBus[i] ==
'-' || aBus[i] ==
'P' || aBus[i] ==
'N' )
1411 if( braceNesting != 0 )
1416 else if( begin >
end )
1417 std::swap( begin,
end );
1424 for(
long idx = begin; idx <=
end; ++idx )
1426 wxString str = prefix;
1430 aMemberList->emplace_back( str );
1439 std::vector<wxString>* aMemberList )
1441 size_t groupLen = aGroup.length();
1445 int braceNesting = 0;
1446 bool inQuotes =
false;
1448 prefix.reserve( groupLen );
1453 auto escapeSpacesForBus =
1454 [](
const wxString& aMember ) -> wxString
1457 escaped.reserve( aMember.length() * 2 );
1459 for( wxUniChar c : aMember )
1462 escaped += wxT(
"\\ " );
1476 for( ; i < groupLen; ++i )
1479 if( aGroup[i] ==
'"' && !
isEscaped( aGroup, i ) )
1481 inQuotes = !inQuotes;
1488 if( aGroup[i] ==
'\\' && i + 1 < groupLen )
1491 prefix += aGroup[++i];
1495 prefix += aGroup[i];
1501 if( aGroup[i] ==
'{' )
1506 prefix += wxT(
'{' );
1512 else if( aGroup[i] ==
'}' )
1515 prefix += wxT(
'}' );
1520 if( aGroup[i] ==
'\\' && i + 1 < groupLen && aGroup[i + 1] ==
' ' )
1522 prefix += aGroup[++i];
1527 if( aGroup[i] ==
' ' || aGroup[i] ==
'[' || aGroup[i] ==
']' )
1530 prefix += aGroup[i];
1533 if( braceNesting != 0 )
1548 for( ; i < groupLen; ++i )
1551 if( aGroup[i] ==
'"' && !
isEscaped( aGroup, i ) )
1553 inQuotes = !inQuotes;
1560 if( aGroup[i] ==
'\\' && i + 1 < groupLen )
1573 if( aGroup[i] ==
'{' )
1589 else if( aGroup[i] ==
'}' )
1599 if( aMemberList && !tmp.IsEmpty() )
1607 if( aGroup[i] ==
'\\' && i + 1 < groupLen && aGroup[i + 1] ==
' ' )
1614 if( aGroup[i] ==
' ' || aGroup[i] ==
',' )
1616 if( aMemberList && !tmp.IsEmpty() )
1631 const std::function<
void(
const wxString& )>& aFunction )
1633 std::vector<wxString> members;
1638 for(
const wxString& member : members )
1639 aFunction( member );
1644 for(
const wxString& member : members )
1650 aFunction( aBusPattern );
constexpr EDA_IU_SCALE schIUScale
constexpr EDA_IU_SCALE pcbIUScale
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
std::vector< PARAM_BASE * > m_params
The list of parameters (owned by this object)
void registerMigration(int aOldSchemaVersion, int aNewSchemaVersion, std::function< bool(void)> aMigrator)
Registers a migration from one schema version to another.
JSON_SETTINGS(const wxString &aFilename, SETTINGS_LOC aLocation, int aSchemaVersion)
std::unique_ptr< JSON_SETTINGS_INTERNALS > m_internals
A color representation with 4 components: red, green, blue, alpha.
JSON_SETTINGS * m_parent
A pointer to the parent object to load and store from.
NESTED_SETTINGS(const std::string &aName, int aSchemaVersion, JSON_SETTINGS *aParent, const std::string &aPath, bool aLoadFromFile=true)
A collection of nets and the parameters used to route or test these nets.
void SetViaDiameter(int aDia)
void SetViaDrill(int aSize)
bool HasLineStyle() const
int GetViaDiameter() const
void SetWireWidthParent(NETCLASS *parent)
static const char Default[]
the name of the default NETCLASS
void SetuViaDrillParent(NETCLASS *parent)
bool HasuViaDrill() const
void SetDiffPairWidthParent(NETCLASS *parent)
void SetuViaDiameter(int aSize)
void SetDiffPairWidth(int aSize)
int GetDiffPairViaGap() const
void SetViaDrillParent(NETCLASS *parent)
wxString GetTuningProfile() const
void SetDiffPairGapParent(NETCLASS *parent)
void SetTuningProfileParent(NETCLASS *aParent)
int GetDiffPairGap() const
bool HasViaDiameter() const
bool HasDiffPairWidth() const
bool HasuViaDiameter() const
void SetTrackWidthParent(NETCLASS *parent)
int GetuViaDiameter() const
bool HasTrackWidth() const
void SetViaDiameterParent(NETCLASS *parent)
int GetDiffPairWidth() const
void SetuViaDrill(int aSize)
void SetDiffPairGap(int aSize)
void SetBusWidthParent(NETCLASS *parent)
void SetClearance(int aClearance)
COLOR4D GetPcbColor(bool aIsForSave=false) const
bool HasDiffPairGap() const
COLOR4D GetSchematicColor(bool aIsForSave=false) const
void SetBusWidth(int aWidth)
void SetClearanceParent(NETCLASS *parent)
int GetTrackWidth() const
void SetWireWidth(int aWidth)
void SetTuningProfile(const wxString &aTuningProfile)
bool HasTuningProfile() const
bool HasWireWidth() const
void SetuViaDiameterParent(NETCLASS *parent)
void SetTrackWidth(int aWidth)
bool HasDiffPairViaGap() const
bool HasClearance() const
void ClearAllCaches()
Clears the effective netclass cache for all nets.
std::map< wxString, std::shared_ptr< NETCLASS > > m_compositeNetClasses
Map of netclass names to netclass definitions for.
bool addMissingDefaults(NETCLASS *nc) const
Adds any missing fields to the given netclass from the default netclass.
void ClearNetColorAssignments()
Clears all net name to color assignments Calling user is responsible for resetting the effective netc...
void ClearChainPatternAssignments()
Clears all chain-derived pattern assignments.
bool operator==(const NET_SETTINGS &aOther) const
void ClearCacheForNet(const wxString &netName)
Clears effective netclass cache for the given net.
std::shared_ptr< NETCLASS > GetEffectiveNetClass(const wxString &aNetName)
Fetches the effective (may be aggregate) netclass for the given net name.
bool HasEffectiveNetClass(const wxString &aNetName) const
Determines if an effective netclass for the given net name has been cached.
void addSinglePatternAssignment(const wxString &pattern, const wxString &netclass)
Adds a single pattern assignment without bus expansion (internal helper)
void ClearNetclassLabelAssignments()
Clears all net name to netclasses assignments Calling user is responsible for resetting the effective...
void ClearNetclassLabelAssignment(const wxString &netName)
Clears a specific net name to netclass assignment Calling user is responsible for resetting the effec...
void ClearNetclassPatternAssignments()
Clears all netclass pattern assignments.
std::map< wxString, KIGFX::COLOR4D > m_netColorAssignments
A map of fully-qualified net names to colors used in the board context.
void SetNetclasses(const std::map< wxString, std::shared_ptr< NETCLASS > > &netclasses)
Sets all netclass Calling this method will reset the effective netclass calculation caches.
bool HasNetclassLabelAssignment(const wxString &netName) const
Determines if a given net name has netclasses assigned.
void SetNetclassLabelAssignment(const wxString &netName, const std::set< wxString > &netclasses)
Sets a net name to netclasses assignment Calling user is responsible for resetting the effective netc...
std::shared_ptr< NETCLASS > m_defaultNetClass
The default netclass.
static bool ParseBusGroup(const wxString &aGroup, wxString *name, std::vector< wxString > *aMemberList)
Parse a bus group label into the name and a list of components.
void ClearNetclasses()
Clears all netclasses Calling this method will reset the effective netclass calculation caches.
std::map< wxString, std::shared_ptr< NETCLASS > > m_impicitNetClasses
Map of netclass names to netclass definitions for implicit netclasses.
const std::map< wxString, std::shared_ptr< NETCLASS > > & GetCompositeNetclasses() const
Gets all composite (multiple assignment / missing defaults) netclasses.
std::vector< std::pair< std::unique_ptr< EDA_COMBINED_MATCHER >, wxString > > m_netClassPatternAssignments
List of net class pattern assignments.
std::map< wxString, std::shared_ptr< NETCLASS > > m_effectiveNetclassCache
Cache of nets to pattern-matched netclasses.
void SetNetclassPatternAssignments(std::vector< std::pair< std::unique_ptr< EDA_COMBINED_MATCHER >, wxString > > &&netclassPatterns)
Sets all netclass pattern assignments Calling user is responsible for resetting the effective netclas...
void SetNetclassPatternAssignment(const wxString &pattern, const wxString &netclass)
Sets a netclass pattern assignment Calling this method will reset the effective netclass calculation ...
std::map< wxString, std::shared_ptr< NETCLASS > > m_netClasses
Map of netclass names to netclass definitions.
void addSingleChainPatternAssignment(const wxString &pattern, const wxString &netclass)
Adds a single chain-derived pattern assignment without bus expansion (internal helper)
const std::map< wxString, std::set< wxString > > & GetNetclassLabelAssignments() const
Gets all current net name to netclasses assignments.
const std::map< wxString, std::shared_ptr< NETCLASS > > & GetNetclasses() const
Gets all netclasses.
std::vector< std::pair< std::unique_ptr< EDA_COMBINED_MATCHER >, wxString > > m_netClassChainPatternAssignments
List of chain-derived netclass pattern assignments.
std::shared_ptr< NETCLASS > GetDefaultNetclass()
Gets the default netclass for the project.
void SetChainPatternAssignment(const wxString &pattern, const wxString &netclass)
Sets a chain-derived netclass pattern assignment.
static bool ParseBusVector(const wxString &aBus, wxString *aName, std::vector< wxString > *aMemberList)
Parse a bus vector (e.g.
const std::map< wxString, KIGFX::COLOR4D > & GetNetColorAssignments() const
Gets all net name to color assignments.
std::vector< std::pair< std::unique_ptr< EDA_COMBINED_MATCHER >, wxString > > & GetNetclassPatternAssignments()
Gets the netclass pattern assignments.
void RecomputeEffectiveNetclasses()
Recomputes the internal values of all aggregate effective netclasses Called when a value of a user-de...
std::shared_ptr< NETCLASS > GetCachedEffectiveNetClass(const wxString &aNetName) const
Returns an already cached effective netclass for the given net name.
std::map< wxString, std::set< wxString > > m_netClassLabelAssignments
Map of net names to resolved netclasses.
void SetNetclass(const wxString &netclassName, std::shared_ptr< NETCLASS > &netclass)
Sets the given netclass Calling user is responsible for resetting the effective netclass calculation ...
void makeEffectiveNetclass(std::shared_ptr< NETCLASS > &effectiveNetclass, std::vector< NETCLASS * > &netclasses) const
Creates an effective aggregate netclass from the given constituent netclasses.
void AppendNetclassLabelAssignment(const wxString &netName, const std::set< wxString > &netclasses)
Apppends to a net name to netclasses assignment Calling user is responsible for resetting the effecti...
void SetDefaultNetclass(std::shared_ptr< NETCLASS > netclass)
Sets the default netclass for the project Calling user is responsible for resetting the effective net...
static void ForEachBusMember(const wxString &aBusPattern, const std::function< void(const wxString &)> &aFunction)
Call a function for each member of an expanded bus pattern.
std::shared_ptr< NETCLASS > GetNetClassByName(const wxString &aNetName) const
Get a NETCLASS object from a given Netclass name string.
void SetNetColorAssignment(const wxString &netName, const KIGFX::COLOR4D &color)
Sets a net to color assignment Calling user is responsible for resetting the effective netclass calcu...
NET_SETTINGS(JSON_SETTINGS *aParent, const std::string &aPath)
bool HasNetclass(const wxString &netclassName) const
Determines if the given netclass exists.
std::map< wxString, wxString > m_netChainClasses
Map of net-chain name -> chain-class name.
Like a normal param, but with custom getter and setter functions.
static bool isSuperSubOverbar(wxChar c)
const int netSettingsSchemaVersion
static bool isEscaped(const wxString &aStr, size_t aPos)
Check if a character at the given position is escaped by a backslash.
static std::optional< int > getInSchUnits(const nlohmann::json &aObj, const std::string &aKey, std::optional< int > aDefault=std::optional< int >())
static std::optional< int > getInPcbUnits(const nlohmann::json &aObj, const std::string &aKey, std::optional< int > aDefault=std::optional< int >())
wxString ConvertToNewOverbarNotation(const wxString &aOldStr)
Convert the old ~...~ overbar notation to the new ~{...} one.
wxString EscapeString(const wxString &aSource, ESCAPE_CONTEXT aContext)
The Escape/Unescape routines use HTML-entity-reference-style encoding to handle characters which are:...
const SHAPE_LINE_CHAIN chain