32#include <unordered_set>
43static std::optional<int>
getInPcbUnits(
const nlohmann::json& aObj,
const std::string& aKey,
44 std::optional<int> aDefault = std::optional<int>() )
46 if( aObj.contains( aKey ) && aObj[aKey].is_number() )
47 return pcbIUScale.mmToIU( aObj[aKey].get<double>() );
53static std::optional<int>
getInSchUnits(
const nlohmann::json& aObj,
const std::string& aKey,
54 std::optional<int> aDefault = std::optional<int>() )
56 if( aObj.contains( aKey ) && aObj[aKey].is_number() )
57 return schIUScale.MilsToIU( aObj[aKey].get<double>() );
71 []( nlohmann::json& json_array,
const std::shared_ptr<NETCLASS>& nc )
75 nlohmann::json nc_json = { {
"name", nc->GetName().ToUTF8() },
76 {
"priority", nc->GetPriority() },
77 {
"schematic_color", nc->GetSchematicColor(
true ) },
78 {
"pcb_color", nc->GetPcbColor(
true ) },
79 {
"tuning_profile", nc->GetTuningProfile() } };
82 []( nlohmann::json&
json,
const std::string& aKey,
int aValue )
87 if( nc->HasWireWidth() )
89 {
"wire_width",
schIUScale.IUToMils( nc->GetWireWidth() ) } );
91 if( nc->HasBusWidth() )
92 nc_json.push_back( {
"bus_width",
schIUScale.IUToMils( nc->GetBusWidth() ) } );
94 if( nc->HasLineStyle() )
95 nc_json.push_back( {
"line_style", nc->GetLineStyle() } );
97 if( nc->HasClearance() )
98 saveInPcbUnits( nc_json,
"clearance", nc->GetClearance() );
100 if( nc->HasTrackWidth() )
101 saveInPcbUnits( nc_json,
"track_width", nc->GetTrackWidth() );
103 if( nc->HasViaDiameter() )
104 saveInPcbUnits( nc_json,
"via_diameter", nc->GetViaDiameter() );
106 if( nc->HasViaDrill() )
107 saveInPcbUnits( nc_json,
"via_drill", nc->GetViaDrill() );
109 if( nc->HasuViaDiameter() )
110 saveInPcbUnits( nc_json,
"microvia_diameter", nc->GetuViaDiameter() );
112 if( nc->HasuViaDrill() )
113 saveInPcbUnits( nc_json,
"microvia_drill", nc->GetuViaDrill() );
115 if( nc->HasDiffPairWidth() )
116 saveInPcbUnits( nc_json,
"diff_pair_width", nc->GetDiffPairWidth() );
118 if( nc->HasDiffPairGap() )
119 saveInPcbUnits( nc_json,
"diff_pair_gap", nc->GetDiffPairGap() );
121 if( nc->HasDiffPairViaGap() )
122 saveInPcbUnits( nc_json,
"diff_pair_via_gap", nc->GetDiffPairViaGap() );
124 json_array.push_back( nc_json );
128 [](
const nlohmann::json& entry )
130 wxString
name = entry[
"name"];
132 std::shared_ptr<NETCLASS> nc = std::make_shared<NETCLASS>(
name,
false );
134 int priority = entry[
"priority"];
135 nc->SetPriority( priority );
137 nc->SetTuningProfile( entry[
"tuning_profile"] );
140 nc->SetClearance( *value );
143 nc->SetTrackWidth( *value );
146 nc->SetViaDiameter( *value );
149 nc->SetViaDrill( *value );
151 if(
auto value =
getInPcbUnits( entry,
"microvia_diameter" ) )
152 nc->SetuViaDiameter( *value );
155 nc->SetuViaDrill( *value );
158 nc->SetDiffPairWidth( *value );
161 nc->SetDiffPairGap( *value );
163 if(
auto value =
getInPcbUnits( entry,
"diff_pair_via_gap" ) )
164 nc->SetDiffPairViaGap( *value );
167 nc->SetWireWidth( *value );
170 nc->SetBusWidth( *value );
172 if( entry.contains(
"line_style" ) && entry[
"line_style"].is_number() )
173 nc->SetLineStyle( entry[
"line_style"].get<int>() );
175 if( entry.contains(
"pcb_color" ) && entry[
"pcb_color"].is_string() )
176 nc->SetPcbColor( entry[
"pcb_color"].get<KIGFX::COLOR4D>() );
178 if( entry.contains(
"schematic_color" )
179 && entry[
"schematic_color"].is_string() )
181 nc->SetSchematicColor( entry[
"schematic_color"].get<KIGFX::COLOR4D>() );
188 [&]() -> nlohmann::json
190 nlohmann::json ret = nlohmann::json::array();
196 saveNetclass( ret, netclass );
200 [&](
const nlohmann::json& aJson )
202 if( !aJson.is_array() )
207 for(
const nlohmann::json& entry : aJson )
209 if( !entry.is_object() || !entry.contains(
"name" ) )
212 std::shared_ptr<NETCLASS> nc = readNetClass( entry );
214 if( nc->IsDefault() )
223 [&]() -> nlohmann::json
225 nlohmann::json ret = {};
229 std::string key( netname.ToUTF8() );
230 ret[ std::move( key ) ] = color;
235 [&](
const nlohmann::json& aJson )
237 if( !aJson.is_object() )
242 for(
const auto& pair : aJson.items() )
244 wxString key( pair.key().c_str(), wxConvUTF8 );
251 [&]() -> nlohmann::json
253 nlohmann::json ret = {};
257 nlohmann::json netclassesJson = nlohmann::json::array();
259 for(
const auto& netclass : netclassNames )
261 std::string netclassStr( netclass.ToUTF8() );
262 netclassesJson.push_back( std::move( netclassStr ) );
265 std::string key( netname.ToUTF8() );
266 ret[std::move( key )] = netclassesJson;
271 [&](
const nlohmann::json& aJson )
273 if( !aJson.is_object() )
278 for(
const auto& pair : aJson.items() )
280 wxString key( pair.key().c_str(), wxConvUTF8 );
282 for(
const auto& netclassName : pair.value() )
289 [&]() -> nlohmann::json
291 nlohmann::json ret = nlohmann::json::array();
295 nlohmann::json pattern_json = {
296 {
"pattern", matcher->GetPattern().ToUTF8() },
297 {
"netclass", netclassName.ToUTF8() }
300 ret.push_back( std::move( pattern_json ) );
305 [&](
const nlohmann::json& aJson )
307 if( !aJson.is_array() )
312 for(
const nlohmann::json& entry : aJson )
314 if( !entry.is_object() )
317 if( entry.contains(
"pattern" ) && entry[
"pattern"].is_string()
318 && entry.contains(
"netclass" ) && entry[
"netclass"].is_string() )
320 wxString pattern = entry[
"pattern"].get<wxString>();
321 wxString netclass = entry[
"netclass"].get<wxString>();
325 [&](
const wxString& memberPattern )
347 m_parent->ReleaseNestedSettings(
this );
382 for(
auto& netClass :
m_internals->At(
"classes" ).items() )
384 if( netClass.value().contains(
"nets" ) && netClass.value()[
"nets"].is_array() )
386 nlohmann::json migrated = nlohmann::json::array();
388 for(
auto& net : netClass.value()[
"nets"].items() )
391 netClass.value()[
"nets"] = migrated;
410 nlohmann::json patterns = nlohmann::json::array();
412 for(
auto& netClass :
m_internals->At(
"classes" ).items() )
414 if( netClass.value().contains(
"name" )
415 && netClass.value().contains(
"nets" )
416 && netClass.value()[
"nets"].is_array() )
418 wxString netClassName = netClass.value()[
"name"].get<wxString>();
420 for(
auto& net : netClass.value()[
"nets"].items() )
422 nlohmann::json pattern_json = {
423 {
"pattern", net.value().get<wxString>() },
424 {
"netclass", netClassName }
427 patterns.push_back( pattern_json );
432 m_internals->SetFromString(
"netclass_patterns", patterns );
446 for(
auto& netClass :
m_internals->At(
"classes" ).items() )
449 netClass.value()[
"priority"] = std::numeric_limits<int>::max();
451 netClass.value()[
"priority"] = priority++;
456 if(
m_internals->contains(
"netclass_assignments" )
457 &&
m_internals->At(
"netclass_assignments" ).is_object() )
459 nlohmann::json migrated = {};
461 for(
const auto& pair :
m_internals->At(
"netclass_assignments" ).items() )
463 nlohmann::json netclassesJson = nlohmann::json::array();
465 if( pair.value().get<wxString>() != wxEmptyString )
466 netclassesJson.push_back( pair.value() );
468 migrated[pair.key()] = netclassesJson;
471 m_internals->SetFromString(
"netclass_assignments", migrated );
483 const wxString emptyStr =
"";
485 for(
auto& netClass :
m_internals->At(
"classes" ).items() )
486 netClass.value()[
"tuning_profile"] = emptyStr.ToUTF8();
563 const std::set<wxString>& netclasses )
570 const std::set<wxString>& netclasses )
588 [&](
const wxString& memberPattern )
603 if( assignment.first->GetPattern() == pattern && assignment.second == netclass )
609 { std::make_unique<EDA_COMBINED_MATCHER>( pattern,
CTX_NETCLASS ), netclass } );
614 std::vector<std::pair<std::unique_ptr<EDA_COMBINED_MATCHER>, wxString>>&& netclassPatterns )
621std::vector<std::pair<std::unique_ptr<EDA_COMBINED_MATCHER>, wxString>>&
685 auto getExplicitNetclass =
686 [
this](
const wxString& netclass ) -> std::shared_ptr<NETCLASS>
702 auto getOrAddImplicitNetcless =
703 [
this](
const wxString& netclass ) -> std::shared_ptr<NETCLASS>
709 std::shared_ptr<NETCLASS> nc = std::make_shared<NETCLASS>( netclass,
false );
710 nc->SetPriority( std::numeric_limits<int>::max() - 1 );
721 if( aNetName.IsEmpty() )
728 return cacheItr->second;
731 std::unordered_set<std::shared_ptr<NETCLASS>> resolvedNetclasses;
738 for(
const wxString& netclassName : it->second )
740 std::shared_ptr<NETCLASS> netclass = getExplicitNetclass( netclassName );
744 resolvedNetclasses.insert( std::move( netclass ) );
748 resolvedNetclasses.insert( getOrAddImplicitNetcless( netclassName ) );
756 if( matcher->StartsWith( aNetName ) )
758 std::shared_ptr<NETCLASS> netclass = getExplicitNetclass( netclassName );
762 resolvedNetclasses.insert( std::move( netclass ) );
766 resolvedNetclasses.insert( getOrAddImplicitNetcless( netclassName ) );
772 if( resolvedNetclasses.size() == 0 )
776 std::shared_ptr<NETCLASS> sharedNetclass;
777 bool allSameNetclass =
true;
778 bool isBusPattern =
false;
781 [&](
const wxString& member )
785 if( member == aNetName )
790 if( !allSameNetclass )
795 if( !sharedNetclass )
797 sharedNetclass = memberNc;
799 else if( memberNc->GetName() != sharedNetclass->GetName() )
801 allSameNetclass =
false;
805 if( isBusPattern && allSameNetclass && sharedNetclass
809 return sharedNetclass;
820 std::vector<NETCLASS*> netclassPtrs;
822 for(
const std::shared_ptr<NETCLASS>& nc : resolvedNetclasses )
823 netclassPtrs.push_back( nc.get() );
826 name.Printf(
"Effective for net: %s", aNetName );
827 std::shared_ptr<NETCLASS> effectiveNetclass = std::make_shared<NETCLASS>(
name,
false );
830 if( netclassPtrs.size() == 1 )
834 return *resolvedNetclasses.begin();
838 effectiveNetclass->SetConstituentNetclasses( std::move( netclassPtrs ) );
843 return effectiveNetclass;
853 std::vector<NETCLASS*> constituents = nc->GetConstituentNetclasses();
855 wxASSERT( constituents.size() > 0 );
860 constituents.pop_back();
864 nc->ResetParameters();
866 nc->SetConstituentNetclasses( std::move( constituents ) );
872 std::vector<NETCLASS*>& constituentNetclasses )
const
876 std::sort( constituentNetclasses.begin(), constituentNetclasses.end(),
879 int p1 = nc1->GetPriority();
880 int p2 = nc2->GetPriority();
886 return nc1->GetName().Cmp( nc2->GetName() ) < 0;
892 for(
auto itr = constituentNetclasses.rbegin(); itr != constituentNetclasses.rend(); ++itr )
899 effectiveNetclass->SetClearanceParent( nc );
905 effectiveNetclass->SetTrackWidthParent( nc );
911 effectiveNetclass->SetViaDiameterParent( nc );
916 effectiveNetclass->SetViaDrill( nc->
GetViaDrill() );
917 effectiveNetclass->SetViaDrillParent( nc );
923 effectiveNetclass->SetuViaDiameterParent( nc );
929 effectiveNetclass->SetuViaDrillParent( nc );
935 effectiveNetclass->SetDiffPairWidthParent( nc );
941 effectiveNetclass->SetDiffPairGapParent( nc );
947 effectiveNetclass->SetDiffPairViaGapParent( nc );
953 effectiveNetclass->SetWireWidthParent( nc );
958 effectiveNetclass->SetBusWidth( nc->
GetBusWidth() );
959 effectiveNetclass->SetBusWidthParent( nc );
965 effectiveNetclass->SetLineStyleParent( nc );
972 effectiveNetclass->SetPcbColor( pcbColor );
973 effectiveNetclass->SetPcbColorParent( nc );
980 effectiveNetclass->SetSchematicColor( schColor );
981 effectiveNetclass->SetSchematicColorParent( nc );
987 effectiveNetclass->SetTuningProfileParent( nc );
999 bool addedDefault =
false;
1003 addedDefault =
true;
1010 addedDefault =
true;
1017 addedDefault =
true;
1024 addedDefault =
true;
1031 addedDefault =
true;
1038 addedDefault =
true;
1045 addedDefault =
true;
1052 addedDefault =
true;
1067 addedDefault =
true;
1074 addedDefault =
true;
1082 addedDefault =
true;
1087 return addedDefault;
1104 return c ==
'_' || c ==
'^' || c ==
'~';
1121 int backslashCount = 0;
1124 while( pos > 0 && aStr[pos - 1] ==
'\\' )
1131 return ( backslashCount % 2 ) == 1;
1136 std::vector<wxString>* aMemberList )
1141 static wxString digits( wxT(
"0123456789" ) );
1142 return digits.Contains( c );
1145 size_t busLen = aBus.length();
1152 int braceNesting = 0;
1153 bool inQuotes =
false;
1155 prefix.reserve( busLen );
1159 for( ; i < busLen; ++i )
1162 if( aBus[i] ==
'"' && !
isEscaped( aBus, i ) )
1164 inQuotes = !inQuotes;
1171 if( aBus[i] ==
'\\' && i + 1 < busLen )
1174 prefix += aBus[++i];
1184 if( aBus[i] ==
'{' )
1190 if( !prefix.IsEmpty() )
1191 prefix.RemoveLast();
1198 else if( aBus[i] ==
'}' )
1205 if( aBus[i] ==
'\\' && i + 1 < busLen && aBus[i + 1] ==
' ' )
1207 prefix += aBus[++i];
1212 if( aBus[i] ==
' ' || aBus[i] ==
']' )
1215 if( aBus[i] ==
'[' )
1228 for( ; i < busLen; ++i )
1230 if( aBus[i] ==
'.' && i + 1 < busLen && aBus[i+1] ==
'.' )
1232 tmp.ToLong( &begin );
1245 tmp = wxEmptyString;
1250 for( ; i < busLen; ++i )
1252 if( aBus[i] ==
']' )
1267 for( ; i < busLen; ++i )
1269 if( aBus[i] ==
'}' )
1273 else if( aBus[i] ==
'+' || aBus[i] ==
'-' || aBus[i] ==
'P' || aBus[i] ==
'N' )
1283 if( braceNesting != 0 )
1288 else if( begin >
end )
1289 std::swap( begin,
end );
1296 for(
long idx = begin; idx <=
end; ++idx )
1298 wxString str = prefix;
1302 aMemberList->emplace_back( str );
1311 std::vector<wxString>* aMemberList )
1313 size_t groupLen = aGroup.length();
1317 int braceNesting = 0;
1318 bool inQuotes =
false;
1320 prefix.reserve( groupLen );
1325 auto escapeSpacesForBus =
1326 [](
const wxString& aMember ) -> wxString
1329 escaped.reserve( aMember.length() * 2 );
1331 for( wxUniChar c : aMember )
1334 escaped += wxT(
"\\ " );
1344 for( ; i < groupLen; ++i )
1347 if( aGroup[i] ==
'"' && !
isEscaped( aGroup, i ) )
1349 inQuotes = !inQuotes;
1356 if( aGroup[i] ==
'\\' && i + 1 < groupLen )
1359 prefix += aGroup[++i];
1363 prefix += aGroup[i];
1369 if( aGroup[i] ==
'{' )
1375 if( !prefix.IsEmpty() )
1376 prefix.RemoveLast();
1383 else if( aGroup[i] ==
'}' )
1390 if( aGroup[i] ==
'\\' && i + 1 < groupLen && aGroup[i + 1] ==
' ' )
1392 prefix += aGroup[++i];
1397 if( aGroup[i] ==
' ' || aGroup[i] ==
'[' || aGroup[i] ==
']' )
1400 prefix += aGroup[i];
1403 if( braceNesting != 0 )
1418 for( ; i < groupLen; ++i )
1421 if( aGroup[i] ==
'"' && !
isEscaped( aGroup, i ) )
1423 inQuotes = !inQuotes;
1430 if( aGroup[i] ==
'\\' && i + 1 < groupLen )
1443 if( aGroup[i] ==
'{' )
1449 if( !tmp.IsEmpty() )
1457 else if( aGroup[i] ==
'}' )
1466 if( aMemberList && !tmp.IsEmpty() )
1474 if( aGroup[i] ==
'\\' && i + 1 < groupLen && aGroup[i + 1] ==
' ' )
1481 if( aGroup[i] ==
' ' || aGroup[i] ==
',' )
1483 if( aMemberList && !tmp.IsEmpty() )
1498 const std::function<
void(
const wxString& )>& aFunction )
1500 std::vector<wxString> members;
1505 for(
const wxString& member : members )
1506 aFunction( member );
1511 for(
const wxString& member : members )
1517 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:...