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 );
392 auto netclassEntryEqual = [](
const auto& aLhs,
const auto& aRhs )
394 if( aLhs.first != aRhs.first )
397 if( aLhs.second.get() == aRhs.second.get() )
400 if( !aLhs.second || !aRhs.second )
403 return aLhs.second->EqualsByPersistedFields( *aRhs.second );
408 netclassEntryEqual ) )
427 auto patternEqual = [](
const auto& aLhs,
const auto& aRhs )
429 if( !aLhs.first || !aRhs.first )
430 return aLhs.first.get() == aRhs.first.get() && aLhs.second == aRhs.second;
432 return aLhs.first->GetPattern() == aRhs.first->GetPattern() && aLhs.second == aRhs.second;
467 if( &aOther ==
this )
501 for(
auto& netClass :
m_internals->At(
"classes" ).items() )
503 if( netClass.value().contains(
"nets" ) && netClass.value()[
"nets"].is_array() )
505 nlohmann::json migrated = nlohmann::json::array();
507 for(
auto& net : netClass.value()[
"nets"].items() )
510 netClass.value()[
"nets"] = migrated;
529 nlohmann::json patterns = nlohmann::json::array();
531 for(
auto& netClass :
m_internals->At(
"classes" ).items() )
533 if( netClass.value().contains(
"name" )
534 && netClass.value().contains(
"nets" )
535 && netClass.value()[
"nets"].is_array() )
537 wxString netClassName = netClass.value()[
"name"].get<wxString>();
539 for(
auto& net : netClass.value()[
"nets"].items() )
541 nlohmann::json pattern_json = {
542 {
"pattern", net.value().get<wxString>() },
543 {
"netclass", netClassName }
546 patterns.push_back( pattern_json );
551 m_internals->SetFromString(
"netclass_patterns", patterns );
565 for(
auto& netClass :
m_internals->At(
"classes" ).items() )
568 netClass.value()[
"priority"] = std::numeric_limits<int>::max();
570 netClass.value()[
"priority"] = priority++;
575 if(
m_internals->contains(
"netclass_assignments" )
576 &&
m_internals->At(
"netclass_assignments" ).is_object() )
578 nlohmann::json migrated = {};
580 for(
const auto& pair :
m_internals->At(
"netclass_assignments" ).items() )
582 nlohmann::json netclassesJson = nlohmann::json::array();
584 if( pair.value().get<wxString>() != wxEmptyString )
585 netclassesJson.push_back( pair.value() );
587 migrated[pair.key()] = netclassesJson;
590 m_internals->SetFromString(
"netclass_assignments", migrated );
602 const wxString emptyStr =
"";
604 for(
auto& netClass :
m_internals->At(
"classes" ).items() )
605 netClass.value()[
"tuning_profile"] = emptyStr.ToUTF8();
682 const std::set<wxString>& netclasses )
689 const std::set<wxString>& netclasses )
707 [&](
const wxString& memberPattern )
722 if( assignment.first->GetPattern() == pattern && assignment.second == netclass )
728 { std::make_unique<EDA_COMBINED_MATCHER>( pattern,
CTX_NETCLASS ), netclass } );
733 std::vector<std::pair<std::unique_ptr<EDA_COMBINED_MATCHER>, wxString>>&& netclassPatterns )
740std::vector<std::pair<std::unique_ptr<EDA_COMBINED_MATCHER>, wxString>>&
756 [&](
const wxString& memberPattern )
766 const wxString& netclass )
770 if( !assignment.first )
773 if( assignment.first->GetPattern() == pattern && assignment.second == netclass )
778 { std::make_unique<EDA_COMBINED_MATCHER>( pattern,
CTX_NETCLASS ), netclass } );
827 if( aOldPrefix.IsEmpty() || aOldPrefix == aNewPrefix )
830 bool changed =
false;
835 const wxString pattern = matcher->GetPattern();
837 if( pattern.StartsWith( aOldPrefix ) )
839 wxString updated = aNewPrefix + pattern.Mid( aOldPrefix.length() );
840 matcher = std::make_unique<EDA_COMBINED_MATCHER>( updated,
CTX_NETCLASS );
846 std::map<wxString, KIGFX::COLOR4D> updatedColors;
850 if( netName.StartsWith( aOldPrefix ) )
852 updatedColors[aNewPrefix + netName.Mid( aOldPrefix.length() )] = color;
857 updatedColors[netName] = color;
886 auto getExplicitNetclass =
887 [
this](
const wxString& netclass ) -> std::shared_ptr<NETCLASS>
903 auto getOrAddImplicitNetcless =
904 [
this](
const wxString& netclass ) -> std::shared_ptr<NETCLASS>
910 std::shared_ptr<NETCLASS> nc = std::make_shared<NETCLASS>( netclass,
false );
911 nc->SetPriority( std::numeric_limits<int>::max() - 1 );
922 if( aNetName.IsEmpty() )
929 return cacheItr->second;
932 std::unordered_set<std::shared_ptr<NETCLASS>> resolvedNetclasses;
939 for(
const wxString& netclassName : it->second )
941 std::shared_ptr<NETCLASS> netclass = getExplicitNetclass( netclassName );
945 resolvedNetclasses.insert( std::move( netclass ) );
949 resolvedNetclasses.insert( getOrAddImplicitNetcless( netclassName ) );
955 auto applyPatternList =
956 [&](
const std::vector<std::pair<std::unique_ptr<EDA_COMBINED_MATCHER>, wxString>>&
959 for(
const auto& [matcher, netclassName] : patterns )
961 if( matcher->StartsWith( aNetName ) )
963 std::shared_ptr<NETCLASS> netclass = getExplicitNetclass( netclassName );
966 resolvedNetclasses.insert( std::move( netclass ) );
968 resolvedNetclasses.insert( getOrAddImplicitNetcless( netclassName ) );
977 if( resolvedNetclasses.size() == 0 )
981 std::shared_ptr<NETCLASS> sharedNetclass;
982 bool allSameNetclass =
true;
983 bool isBusPattern =
false;
986 [&](
const wxString& member )
990 if( member == aNetName )
995 if( !allSameNetclass )
1000 if( !sharedNetclass )
1002 sharedNetclass = memberNc;
1004 else if( memberNc->GetName() != sharedNetclass->GetName() )
1006 allSameNetclass =
false;
1010 if( isBusPattern && allSameNetclass && sharedNetclass
1014 return sharedNetclass;
1025 std::vector<NETCLASS*> netclassPtrs;
1027 for(
const std::shared_ptr<NETCLASS>& nc : resolvedNetclasses )
1028 netclassPtrs.push_back( nc.get() );
1031 name.Printf(
"Effective for net: %s", aNetName );
1032 std::shared_ptr<NETCLASS> effectiveNetclass = std::make_shared<NETCLASS>(
name,
false );
1035 if( netclassPtrs.size() == 1 )
1039 return *resolvedNetclasses.begin();
1043 effectiveNetclass->SetConstituentNetclasses( std::move( netclassPtrs ) );
1048 return effectiveNetclass;
1058 std::vector<NETCLASS*> constituents = nc->GetConstituentNetclasses();
1060 wxASSERT( constituents.size() > 0 );
1065 constituents.pop_back();
1069 nc->ResetParameters();
1071 nc->SetConstituentNetclasses( std::move( constituents ) );
1077 std::vector<NETCLASS*>& constituentNetclasses )
const
1081 std::sort( constituentNetclasses.begin(), constituentNetclasses.end(),
1084 int p1 = nc1->GetPriority();
1085 int p2 = nc2->GetPriority();
1091 return nc1->GetName().Cmp( nc2->GetName() ) < 0;
1097 for(
auto itr = constituentNetclasses.rbegin(); itr != constituentNetclasses.rend(); ++itr )
1104 effectiveNetclass->SetClearanceParent( nc );
1110 effectiveNetclass->SetTrackWidthParent( nc );
1116 effectiveNetclass->SetViaDiameterParent( nc );
1121 effectiveNetclass->SetViaDrill( nc->
GetViaDrill() );
1122 effectiveNetclass->SetViaDrillParent( nc );
1128 effectiveNetclass->SetuViaDiameterParent( nc );
1134 effectiveNetclass->SetuViaDrillParent( nc );
1140 effectiveNetclass->SetDiffPairWidthParent( nc );
1146 effectiveNetclass->SetDiffPairGapParent( nc );
1152 effectiveNetclass->SetDiffPairViaGapParent( nc );
1158 effectiveNetclass->SetWireWidthParent( nc );
1163 effectiveNetclass->SetBusWidth( nc->
GetBusWidth() );
1164 effectiveNetclass->SetBusWidthParent( nc );
1170 effectiveNetclass->SetLineStyleParent( nc );
1177 effectiveNetclass->SetPcbColor( pcbColor );
1178 effectiveNetclass->SetPcbColorParent( nc );
1185 effectiveNetclass->SetSchematicColor( schColor );
1186 effectiveNetclass->SetSchematicColorParent( nc );
1192 effectiveNetclass->SetTuningProfileParent( nc );
1204 bool addedDefault =
false;
1208 addedDefault =
true;
1215 addedDefault =
true;
1222 addedDefault =
true;
1229 addedDefault =
true;
1236 addedDefault =
true;
1243 addedDefault =
true;
1250 addedDefault =
true;
1257 addedDefault =
true;
1272 addedDefault =
true;
1279 addedDefault =
true;
1287 addedDefault =
true;
1292 return addedDefault;
1309 return c ==
'_' || c ==
'^' || c ==
'~';
1326 int backslashCount = 0;
1329 while( pos > 0 && aStr[pos - 1] ==
'\\' )
1336 return ( backslashCount % 2 ) == 1;
1341 std::vector<wxString>* aMemberList )
1346 static wxString digits( wxT(
"0123456789" ) );
1347 return digits.Contains( c );
1350 size_t busLen = aBus.length();
1357 int braceNesting = 0;
1358 bool fmtWrapsName =
false;
1359 bool inQuotes =
false;
1361 prefix.reserve( busLen );
1370 for( ; i < busLen; ++i )
1373 if( aBus[i] ==
'"' && !
isEscaped( aBus, i ) )
1375 inQuotes = !inQuotes;
1382 if( aBus[i] ==
'\\' && i + 1 < busLen )
1385 prefix += aBus[++i];
1395 if( aBus[i] ==
'{' )
1400 prefix += wxT(
'{' );
1406 else if( aBus[i] ==
'}' )
1409 prefix += wxT(
'}' );
1414 if( aBus[i] ==
'\\' && i + 1 < busLen && aBus[i + 1] ==
' ' )
1416 prefix += aBus[++i];
1421 if( aBus[i] ==
' ' || aBus[i] ==
']' )
1424 if( aBus[i] ==
'[' )
1426 if( braceNesting > 0 )
1428 size_t fmtStart = prefix.rfind( wxT(
'{' ) );
1430 if( fmtStart != wxString::npos && fmtStart > 0
1433 if( fmtStart == prefix.length() - 1 )
1438 prefix.erase( fmtStart - 1 );
1445 fmtWrapsName =
true;
1463 for( ; i < busLen; ++i )
1465 if( aBus[i] ==
'.' && i + 1 < busLen && aBus[i+1] ==
'.' )
1467 tmp.ToLong( &begin );
1480 tmp = wxEmptyString;
1485 for( ; i < busLen; ++i )
1487 if( aBus[i] ==
']' )
1502 for( ; i < busLen; ++i )
1504 if( aBus[i] ==
'}' )
1511 else if( aBus[i] ==
'+' || aBus[i] ==
'-' || aBus[i] ==
'P' || aBus[i] ==
'N' )
1521 if( braceNesting != 0 )
1526 else if( begin >
end )
1527 std::swap( begin,
end );
1534 for(
long idx = begin; idx <=
end; ++idx )
1536 wxString str = prefix;
1540 aMemberList->emplace_back( str );
1549 std::vector<wxString>* aMemberList )
1551 size_t groupLen = aGroup.length();
1555 int braceNesting = 0;
1556 bool inQuotes =
false;
1558 prefix.reserve( groupLen );
1563 auto escapeSpacesForBus =
1564 [](
const wxString& aMember ) -> wxString
1567 escaped.reserve( aMember.length() * 2 );
1569 for( wxUniChar c : aMember )
1572 escaped += wxT(
"\\ " );
1586 for( ; i < groupLen; ++i )
1589 if( aGroup[i] ==
'"' && !
isEscaped( aGroup, i ) )
1591 inQuotes = !inQuotes;
1598 if( aGroup[i] ==
'\\' && i + 1 < groupLen )
1601 prefix += aGroup[++i];
1605 prefix += aGroup[i];
1611 if( aGroup[i] ==
'{' )
1616 prefix += wxT(
'{' );
1622 else if( aGroup[i] ==
'}' )
1625 prefix += wxT(
'}' );
1630 if( aGroup[i] ==
'\\' && i + 1 < groupLen && aGroup[i + 1] ==
' ' )
1632 prefix += aGroup[++i];
1637 if( aGroup[i] ==
' ' || aGroup[i] ==
'[' || aGroup[i] ==
']' )
1640 prefix += aGroup[i];
1643 if( braceNesting != 0 )
1658 for( ; i < groupLen; ++i )
1661 if( aGroup[i] ==
'"' && !
isEscaped( aGroup, i ) )
1663 inQuotes = !inQuotes;
1670 if( aGroup[i] ==
'\\' && i + 1 < groupLen )
1683 if( aGroup[i] ==
'{' )
1699 else if( aGroup[i] ==
'}' )
1709 if( aMemberList && !tmp.IsEmpty() )
1717 if( aGroup[i] ==
'\\' && i + 1 < groupLen && aGroup[i + 1] ==
' ' )
1724 if( aGroup[i] ==
' ' || aGroup[i] ==
',' )
1726 if( aMemberList && !tmp.IsEmpty() )
1741 const std::function<
void(
const wxString& )>& aFunction )
1743 std::vector<wxString> members;
1748 for(
const wxString& member : members )
1749 aFunction( member );
1754 for(
const wxString& member : members )
1760 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.
void CloneFrom(const JSON_SETTINGS_INTERNALS &aOther)
virtual void Load()
Updates the parameters of this object based on the current JSON document contents.
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_INTERNALS * Internals()
JSON_SETTINGS(const wxString &aFilename, SETTINGS_LOC aLocation, int aSchemaVersion)
std::unique_ptr< JSON_SETTINGS_INTERNALS > m_internals
virtual bool Store()
Stores the current parameters into the JSON document represented by this object Note: this doesn't do...
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...
bool RenameNetPathPrefix(const wxString &aOldPrefix, const wxString &aNewPrefix)
Retarget netclass patterns and net colors after a path prefix changes (sheet rename).
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() const
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.
void CopyFrom(NET_SETTINGS &aOther)
Deep-copy the persisted contents of aOther into this instance.
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