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
255 nlohmann::json ret = {};
259 nlohmann::json netclassesJson = nlohmann::json::array();
261 for(
const auto& netclass : netclassNames )
263 std::string netclassStr( netclass.ToUTF8() );
264 netclassesJson.push_back( std::move( netclassStr ) );
267 std::string key( netname.ToUTF8() );
268 ret[std::move( key )] = netclassesJson;
273 [&](
const nlohmann::json& aJson )
275 if( !aJson.is_object() )
280 for(
const auto& pair : aJson.items() )
282 wxString key( pair.key().c_str(), wxConvUTF8 );
284 for(
const auto& netclassName : pair.value() )
291 [&]() -> nlohmann::json
293 nlohmann::json ret = nlohmann::json::array();
297 nlohmann::json pattern_json = {
298 {
"pattern", matcher->GetPattern().ToUTF8() },
299 {
"netclass", netclassName.ToUTF8() }
302 ret.push_back( std::move( pattern_json ) );
307 [&](
const nlohmann::json& aJson )
309 if( !aJson.is_array() )
314 for(
const nlohmann::json& entry : aJson )
316 if( !entry.is_object() )
319 if( entry.contains(
"pattern" ) && entry[
"pattern"].is_string()
320 && entry.contains(
"netclass" ) && entry[
"netclass"].is_string() )
322 wxString pattern = entry[
"pattern"].get<wxString>();
323 wxString netclass = entry[
"netclass"].get<wxString>();
327 [&](
const wxString& memberPattern )
349 m_parent->ReleaseNestedSettings(
this );
384 for(
auto& netClass :
m_internals->At(
"classes" ).items() )
386 if( netClass.value().contains(
"nets" ) && netClass.value()[
"nets"].is_array() )
388 nlohmann::json migrated = nlohmann::json::array();
390 for(
auto& net : netClass.value()[
"nets"].items() )
393 netClass.value()[
"nets"] = migrated;
412 nlohmann::json patterns = nlohmann::json::array();
414 for(
auto& netClass :
m_internals->At(
"classes" ).items() )
416 if( netClass.value().contains(
"name" )
417 && netClass.value().contains(
"nets" )
418 && netClass.value()[
"nets"].is_array() )
420 wxString netClassName = netClass.value()[
"name"].get<wxString>();
422 for(
auto& net : netClass.value()[
"nets"].items() )
424 nlohmann::json pattern_json = {
425 {
"pattern", net.value().get<wxString>() },
426 {
"netclass", netClassName }
429 patterns.push_back( pattern_json );
434 m_internals->SetFromString(
"netclass_patterns", patterns );
448 for(
auto& netClass :
m_internals->At(
"classes" ).items() )
451 netClass.value()[
"priority"] = std::numeric_limits<int>::max();
453 netClass.value()[
"priority"] = priority++;
458 if(
m_internals->contains(
"netclass_assignments" )
459 &&
m_internals->At(
"netclass_assignments" ).is_object() )
461 nlohmann::json migrated = {};
463 for(
const auto& pair :
m_internals->At(
"netclass_assignments" ).items() )
465 nlohmann::json netclassesJson = nlohmann::json::array();
467 if( pair.value().get<wxString>() != wxEmptyString )
468 netclassesJson.push_back( pair.value() );
470 migrated[pair.key()] = netclassesJson;
473 m_internals->SetFromString(
"netclass_assignments", migrated );
485 const wxString emptyStr =
"";
487 for(
auto& netClass :
m_internals->At(
"classes" ).items() )
488 netClass.value()[
"tuning_profile"] = emptyStr.ToUTF8();
565 const std::set<wxString>& netclasses )
572 const std::set<wxString>& netclasses )
590 [&](
const wxString& memberPattern )
605 if( assignment.first->GetPattern() == pattern && assignment.second == netclass )
611 { std::make_unique<EDA_COMBINED_MATCHER>( pattern,
CTX_NETCLASS ), netclass } );
616 std::vector<std::pair<std::unique_ptr<EDA_COMBINED_MATCHER>, wxString>>&& netclassPatterns )
623std::vector<std::pair<std::unique_ptr<EDA_COMBINED_MATCHER>, wxString>>&
687 auto getExplicitNetclass =
688 [
this](
const wxString& netclass ) -> std::shared_ptr<NETCLASS>
704 auto getOrAddImplicitNetcless =
705 [
this](
const wxString& netclass ) -> std::shared_ptr<NETCLASS>
711 std::shared_ptr<NETCLASS> nc = std::make_shared<NETCLASS>( netclass,
false );
712 nc->SetPriority( std::numeric_limits<int>::max() - 1 );
723 if( aNetName.IsEmpty() )
730 return cacheItr->second;
733 std::unordered_set<std::shared_ptr<NETCLASS>> resolvedNetclasses;
740 for(
const wxString& netclassName : it->second )
742 std::shared_ptr<NETCLASS> netclass = getExplicitNetclass( netclassName );
746 resolvedNetclasses.insert( std::move( netclass ) );
750 resolvedNetclasses.insert( getOrAddImplicitNetcless( netclassName ) );
758 if( matcher->StartsWith( aNetName ) )
760 std::shared_ptr<NETCLASS> netclass = getExplicitNetclass( netclassName );
764 resolvedNetclasses.insert( std::move( netclass ) );
768 resolvedNetclasses.insert( getOrAddImplicitNetcless( netclassName ) );
774 if( resolvedNetclasses.size() == 0 )
778 std::shared_ptr<NETCLASS> sharedNetclass;
779 bool allSameNetclass =
true;
780 bool isBusPattern =
false;
783 [&](
const wxString& member )
787 if( member == aNetName )
792 if( !allSameNetclass )
797 if( !sharedNetclass )
799 sharedNetclass = memberNc;
801 else if( memberNc->GetName() != sharedNetclass->GetName() )
803 allSameNetclass =
false;
807 if( isBusPattern && allSameNetclass && sharedNetclass
811 return sharedNetclass;
822 std::vector<NETCLASS*> netclassPtrs;
824 for(
const std::shared_ptr<NETCLASS>& nc : resolvedNetclasses )
825 netclassPtrs.push_back( nc.get() );
828 name.Printf(
"Effective for net: %s", aNetName );
829 std::shared_ptr<NETCLASS> effectiveNetclass = std::make_shared<NETCLASS>(
name,
false );
832 if( netclassPtrs.size() == 1 )
836 return *resolvedNetclasses.begin();
840 effectiveNetclass->SetConstituentNetclasses( std::move( netclassPtrs ) );
845 return effectiveNetclass;
855 std::vector<NETCLASS*> constituents = nc->GetConstituentNetclasses();
857 wxASSERT( constituents.size() > 0 );
862 constituents.pop_back();
866 nc->ResetParameters();
868 nc->SetConstituentNetclasses( std::move( constituents ) );
874 std::vector<NETCLASS*>& constituentNetclasses )
const
878 std::sort( constituentNetclasses.begin(), constituentNetclasses.end(),
881 int p1 = nc1->GetPriority();
882 int p2 = nc2->GetPriority();
888 return nc1->GetName().Cmp( nc2->GetName() ) < 0;
894 for(
auto itr = constituentNetclasses.rbegin(); itr != constituentNetclasses.rend(); ++itr )
901 effectiveNetclass->SetClearanceParent( nc );
907 effectiveNetclass->SetTrackWidthParent( nc );
913 effectiveNetclass->SetViaDiameterParent( nc );
918 effectiveNetclass->SetViaDrill( nc->
GetViaDrill() );
919 effectiveNetclass->SetViaDrillParent( nc );
925 effectiveNetclass->SetuViaDiameterParent( nc );
931 effectiveNetclass->SetuViaDrillParent( nc );
937 effectiveNetclass->SetDiffPairWidthParent( nc );
943 effectiveNetclass->SetDiffPairGapParent( nc );
949 effectiveNetclass->SetDiffPairViaGapParent( nc );
955 effectiveNetclass->SetWireWidthParent( nc );
960 effectiveNetclass->SetBusWidth( nc->
GetBusWidth() );
961 effectiveNetclass->SetBusWidthParent( nc );
967 effectiveNetclass->SetLineStyleParent( nc );
974 effectiveNetclass->SetPcbColor( pcbColor );
975 effectiveNetclass->SetPcbColorParent( nc );
982 effectiveNetclass->SetSchematicColor( schColor );
983 effectiveNetclass->SetSchematicColorParent( nc );
989 effectiveNetclass->SetTuningProfileParent( nc );
1001 bool addedDefault =
false;
1005 addedDefault =
true;
1012 addedDefault =
true;
1019 addedDefault =
true;
1026 addedDefault =
true;
1033 addedDefault =
true;
1040 addedDefault =
true;
1047 addedDefault =
true;
1054 addedDefault =
true;
1069 addedDefault =
true;
1076 addedDefault =
true;
1084 addedDefault =
true;
1089 return addedDefault;
1106 return c ==
'_' || c ==
'^' || c ==
'~';
1123 int backslashCount = 0;
1126 while( pos > 0 && aStr[pos - 1] ==
'\\' )
1133 return ( backslashCount % 2 ) == 1;
1138 std::vector<wxString>* aMemberList )
1143 static wxString digits( wxT(
"0123456789" ) );
1144 return digits.Contains( c );
1147 size_t busLen = aBus.length();
1154 int braceNesting = 0;
1155 bool fmtWrapsName =
false;
1156 bool inQuotes =
false;
1158 prefix.reserve( busLen );
1167 for( ; i < busLen; ++i )
1170 if( aBus[i] ==
'"' && !
isEscaped( aBus, i ) )
1172 inQuotes = !inQuotes;
1179 if( aBus[i] ==
'\\' && i + 1 < busLen )
1182 prefix += aBus[++i];
1192 if( aBus[i] ==
'{' )
1197 prefix += wxT(
'{' );
1203 else if( aBus[i] ==
'}' )
1206 prefix += wxT(
'}' );
1211 if( aBus[i] ==
'\\' && i + 1 < busLen && aBus[i + 1] ==
' ' )
1213 prefix += aBus[++i];
1218 if( aBus[i] ==
' ' || aBus[i] ==
']' )
1221 if( aBus[i] ==
'[' )
1223 if( braceNesting > 0 )
1225 size_t fmtStart = prefix.rfind( wxT(
'{' ) );
1227 if( fmtStart != wxString::npos && fmtStart > 0
1230 if( fmtStart == prefix.length() - 1 )
1235 prefix.erase( fmtStart - 1 );
1242 fmtWrapsName =
true;
1260 for( ; i < busLen; ++i )
1262 if( aBus[i] ==
'.' && i + 1 < busLen && aBus[i+1] ==
'.' )
1264 tmp.ToLong( &begin );
1277 tmp = wxEmptyString;
1282 for( ; i < busLen; ++i )
1284 if( aBus[i] ==
']' )
1299 for( ; i < busLen; ++i )
1301 if( aBus[i] ==
'}' )
1308 else if( aBus[i] ==
'+' || aBus[i] ==
'-' || aBus[i] ==
'P' || aBus[i] ==
'N' )
1318 if( braceNesting != 0 )
1323 else if( begin >
end )
1324 std::swap( begin,
end );
1331 for(
long idx = begin; idx <=
end; ++idx )
1333 wxString str = prefix;
1337 aMemberList->emplace_back( str );
1346 std::vector<wxString>* aMemberList )
1348 size_t groupLen = aGroup.length();
1352 int braceNesting = 0;
1353 bool inQuotes =
false;
1355 prefix.reserve( groupLen );
1360 auto escapeSpacesForBus =
1361 [](
const wxString& aMember ) -> wxString
1364 escaped.reserve( aMember.length() * 2 );
1366 for( wxUniChar c : aMember )
1369 escaped += wxT(
"\\ " );
1383 for( ; i < groupLen; ++i )
1386 if( aGroup[i] ==
'"' && !
isEscaped( aGroup, i ) )
1388 inQuotes = !inQuotes;
1395 if( aGroup[i] ==
'\\' && i + 1 < groupLen )
1398 prefix += aGroup[++i];
1402 prefix += aGroup[i];
1408 if( aGroup[i] ==
'{' )
1413 prefix += wxT(
'{' );
1419 else if( aGroup[i] ==
'}' )
1422 prefix += wxT(
'}' );
1427 if( aGroup[i] ==
'\\' && i + 1 < groupLen && aGroup[i + 1] ==
' ' )
1429 prefix += aGroup[++i];
1434 if( aGroup[i] ==
' ' || aGroup[i] ==
'[' || aGroup[i] ==
']' )
1437 prefix += aGroup[i];
1440 if( braceNesting != 0 )
1455 for( ; i < groupLen; ++i )
1458 if( aGroup[i] ==
'"' && !
isEscaped( aGroup, i ) )
1460 inQuotes = !inQuotes;
1467 if( aGroup[i] ==
'\\' && i + 1 < groupLen )
1480 if( aGroup[i] ==
'{' )
1496 else if( aGroup[i] ==
'}' )
1506 if( aMemberList && !tmp.IsEmpty() )
1514 if( aGroup[i] ==
'\\' && i + 1 < groupLen && aGroup[i + 1] ==
' ' )
1521 if( aGroup[i] ==
' ' || aGroup[i] ==
',' )
1523 if( aMemberList && !tmp.IsEmpty() )
1538 const std::function<
void(
const wxString& )>& aFunction )
1540 std::vector<wxString> members;
1545 for(
const wxString& member : members )
1546 aFunction( member );
1551 for(
const wxString& member : members )
1557 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...
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.
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::shared_ptr< NETCLASS > GetDefaultNetclass()
Gets the default netclass for the project.
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.
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:...