Handle nested unescaping (for buses in particular).

Also adds a few missing unescape() calls when showing netnames to the
user.

Fixes https://gitlab.com/kicad/code/kicad/issues/6400
This commit is contained in:
Jeff Young 2020-12-20 15:08:43 +00:00
parent e6a8ae7dfc
commit 3d852372ca
3 changed files with 23 additions and 13 deletions

View File

@ -170,10 +170,16 @@ wxString UnescapeString( const wxString& aSource )
else if( aSource[i] == '{' ) else if( aSource[i] == '{' )
{ {
wxString token; wxString token;
int depth = 1;
for( i = i + 1; i < sourceLen; ++i ) for( i = i + 1; i < sourceLen; ++i )
{ {
if( aSource[i] == '}' ) if( aSource[i] == '{' )
depth++;
else if( aSource[i] == '}' )
depth--;
if( depth <= 0 )
break; break;
else else
token.append( aSource[i] ); token.append( aSource[i] );
@ -194,7 +200,7 @@ wxString UnescapeString( const wxString& aSource )
else if( token == wxS( "brace" ) ) newbuf.append( wxS( "{" ) ); else if( token == wxS( "brace" ) ) newbuf.append( wxS( "{" ) );
else else
{ {
newbuf.append( "{" + token + "}" ); newbuf.append( "{" + UnescapeString( token ) + "}" );
} }
} }
else else

View File

@ -2320,13 +2320,15 @@ bool CONNECTION_GRAPH::ercCheckBusToBusEntryConflicts( const CONNECTION_SUBGRAPH
// In some cases, the connection list (SCH_CONNECTION*) can be null. // In some cases, the connection list (SCH_CONNECTION*) can be null.
// Skip null connections. // Skip null connections.
if( bus_entry->Connection( &sheet ) && bus_wire->Type() == SCH_LINE_T if( bus_entry->Connection( &sheet )
&& bus_wire->Connection( &sheet ) ) && bus_wire->Type() == SCH_LINE_T
&& bus_wire->Connection( &sheet ) )
{ {
conflict = true; conflict = true; // Assume a conflict; we'll reset if we find it's OK
bus_name = bus_wire->Connection( &sheet )->Name( true ); bus_name = bus_wire->Connection( &sheet )->Name( true );
auto test_name = bus_entry->Connection( &sheet )->Name( true ); wxString test_name = bus_entry->Connection( &sheet )->Name( true );
for( const auto& member : bus_wire->Connection( &sheet )->Members() ) for( const auto& member : bus_wire->Connection( &sheet )->Members() )
{ {
@ -2354,10 +2356,11 @@ bool CONNECTION_GRAPH::ercCheckBusToBusEntryConflicts( const CONNECTION_SUBGRAPH
if( conflict ) if( conflict )
{ {
wxString netName = aSubgraph->m_driver_connection->Name( true );
wxString msg = wxString::Format( _( "Net %s is graphically connected to bus %s but is not a" wxString msg = wxString::Format( _( "Net %s is graphically connected to bus %s but is not a"
" member of that bus" ), " member of that bus" ),
aSubgraph->m_driver_connection->Name( true ), UnescapeString( netName ),
bus_name ); UnescapeString( bus_name ) );
std::shared_ptr<ERC_ITEM> ercItem = ERC_ITEM::Create( ERCE_BUS_ENTRY_CONFLICT ); std::shared_ptr<ERC_ITEM> ercItem = ERC_ITEM::Create( ERCE_BUS_ENTRY_CONFLICT );
ercItem->SetItems( bus_entry, bus_wire ); ercItem->SetItems( bus_entry, bus_wire );
ercItem->SetErrorMessage( msg ); ercItem->SetErrorMessage( msg );
@ -2726,11 +2729,13 @@ int CONNECTION_GRAPH::ercCheckHierSheets()
for( const std::pair<const wxString, SCH_SHEET_PIN*>& unmatched : pins ) for( const std::pair<const wxString, SCH_SHEET_PIN*>& unmatched : pins )
{ {
wxString msg = wxString::Format( _( "Sheet pin %s has no matching hierarchical "
"label inside the sheet" ),
UnescapeString( unmatched.first ) );
std::shared_ptr<ERC_ITEM> ercItem = ERC_ITEM::Create( ERCE_HIERACHICAL_LABEL ); std::shared_ptr<ERC_ITEM> ercItem = ERC_ITEM::Create( ERCE_HIERACHICAL_LABEL );
ercItem->SetItems( unmatched.second ); ercItem->SetItems( unmatched.second );
ercItem->SetErrorMessage( wxString::Format( ercItem->SetErrorMessage( msg );
_( "Sheet port %s has no matching hierarchical label inside the sheet" ),
unmatched.first ) );
SCH_MARKER* marker = new SCH_MARKER( ercItem, unmatched.second->GetPosition() ); SCH_MARKER* marker = new SCH_MARKER( ercItem, unmatched.second->GetPosition() );
sheet.LastScreen()->Append( marker ); sheet.LastScreen()->Append( marker );

View File

@ -552,8 +552,7 @@ wxString SCH_TEXT::GetShownText( int aDepth ) const
if( processTextVars ) if( processTextVars )
{ {
wxCHECK_MSG( Schematic(), wxEmptyString, wxCHECK_MSG( Schematic(), wxEmptyString, "No parent SCHEMATIC set for SCH_TEXT!" );
"No parent SCHEMATIC set for SCH_TEXT!" );
PROJECT* project = nullptr; PROJECT* project = nullptr;