Don't show redundant ERC markers from subsheets
Fixes https://gitlab.com/kicad/code/kicad/-/issues/7016
This commit is contained in:
parent
ac3e677fae
commit
5ceadbda3b
|
@ -2743,6 +2743,7 @@ int CONNECTION_GRAPH::ercCheckHierSheets()
|
||||||
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( msg );
|
ercItem->SetErrorMessage( msg );
|
||||||
|
ercItem->SetIsSheetSpecific();
|
||||||
|
|
||||||
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 );
|
||||||
|
|
|
@ -530,6 +530,7 @@ int ERC_TESTER::TestPinToPin()
|
||||||
ERC_ITEM::Create( erc == PIN_ERROR::WARNING ? ERCE_PIN_TO_PIN_WARNING :
|
ERC_ITEM::Create( erc == PIN_ERROR::WARNING ? ERCE_PIN_TO_PIN_WARNING :
|
||||||
ERCE_PIN_TO_PIN_ERROR );
|
ERCE_PIN_TO_PIN_ERROR );
|
||||||
ercItem->SetItems( refPin, testPin );
|
ercItem->SetItems( refPin, testPin );
|
||||||
|
ercItem->SetIsSheetSpecific();
|
||||||
|
|
||||||
ercItem->SetErrorMessage(
|
ercItem->SetErrorMessage(
|
||||||
wxString::Format( _( "Pins of type %s and %s are connected" ),
|
wxString::Format( _( "Pins of type %s and %s are connected" ),
|
||||||
|
@ -602,6 +603,7 @@ int ERC_TESTER::TestMultUnitPinConflicts()
|
||||||
pin->GetNumber(), netName, pinToNetMap[name].first ) );
|
pin->GetNumber(), netName, pinToNetMap[name].first ) );
|
||||||
|
|
||||||
ercItem->SetItems( pin, pinToNetMap[name].second );
|
ercItem->SetItems( pin, pinToNetMap[name].second );
|
||||||
|
ercItem->SetIsSheetSpecific();
|
||||||
|
|
||||||
SCH_MARKER* marker = new SCH_MARKER( ercItem,
|
SCH_MARKER* marker = new SCH_MARKER( ercItem,
|
||||||
pin->GetTransformedPosition() );
|
pin->GetTransformedPosition() );
|
||||||
|
|
|
@ -52,12 +52,16 @@ public:
|
||||||
return allItemTypes;
|
return allItemTypes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsSheetSpecific() const { return m_sheetSpecific; }
|
||||||
|
void SetIsSheetSpecific( bool aSpecific = true ) { m_sheetSpecific = aSpecific; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ERC_ITEM( int aErrorCode = 0, const wxString& aTitle = "", const wxString& aSettingsKey = "" )
|
ERC_ITEM( int aErrorCode = 0, const wxString& aTitle = "", const wxString& aSettingsKey = "" )
|
||||||
{
|
{
|
||||||
m_errorCode = aErrorCode;
|
m_errorCode = aErrorCode;
|
||||||
m_errorTitle = aTitle;
|
m_errorTitle = aTitle;
|
||||||
m_settingsKey = aSettingsKey;
|
m_settingsKey = aSettingsKey;
|
||||||
|
m_sheetSpecific = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A list of all ERC_ITEM types which are valid error codes
|
/// A list of all ERC_ITEM types which are valid error codes
|
||||||
|
@ -90,6 +94,9 @@ private:
|
||||||
static ERC_ITEM unresolvedVariable;
|
static ERC_ITEM unresolvedVariable;
|
||||||
static ERC_ITEM wireDangling;
|
static ERC_ITEM wireDangling;
|
||||||
static ERC_ITEM libSymbolIssues;
|
static ERC_ITEM libSymbolIssues;
|
||||||
|
|
||||||
|
/// True if this item is specific to a sheet instance (as opposed to applying to all instances)
|
||||||
|
bool m_sheetSpecific;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -264,34 +264,60 @@ void ERC_SETTINGS::ResetPinMap()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SHEETLIST_ERC_ITEMS_PROVIDER::visitMarkers( std::function<void( SCH_MARKER* )> aVisitor )
|
||||||
|
{
|
||||||
|
SCH_SHEET_LIST sheetList = m_schematic->GetSheets();
|
||||||
|
|
||||||
|
std::set<SCH_SCREEN*> seenScreens;
|
||||||
|
|
||||||
|
for( unsigned i = 0; i < sheetList.size(); i++ )
|
||||||
|
{
|
||||||
|
bool firstTime = seenScreens.count( sheetList[i].LastScreen() ) == 0;
|
||||||
|
|
||||||
|
if( firstTime )
|
||||||
|
seenScreens.insert( sheetList[i].LastScreen() );
|
||||||
|
|
||||||
|
for( SCH_ITEM* aItem : sheetList[i].LastScreen()->Items().OfType( SCH_MARKER_T ) )
|
||||||
|
{
|
||||||
|
SCH_MARKER* marker = static_cast<SCH_MARKER*>( aItem );
|
||||||
|
|
||||||
|
if( marker->GetMarkerType() != MARKER_BASE::MARKER_ERC )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Don't show non-specific markers more than once
|
||||||
|
if( !firstTime &&
|
||||||
|
!static_cast<ERC_ITEM*>( marker->GetRCItem().get() )->IsSheetSpecific() )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
aVisitor( marker );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void SHEETLIST_ERC_ITEMS_PROVIDER::SetSeverities( int aSeverities )
|
void SHEETLIST_ERC_ITEMS_PROVIDER::SetSeverities( int aSeverities )
|
||||||
{
|
{
|
||||||
m_severities = aSeverities;
|
m_severities = aSeverities;
|
||||||
|
|
||||||
m_filteredMarkers.clear();
|
m_filteredMarkers.clear();
|
||||||
|
|
||||||
SCH_SHEET_LIST sheetList = m_schematic->GetSheets();
|
ERC_SETTINGS& settings = m_schematic->ErcSettings();
|
||||||
ERC_SETTINGS& settings = m_schematic->ErcSettings();
|
|
||||||
|
|
||||||
for( unsigned i = 0; i < sheetList.size(); i++ )
|
visitMarkers(
|
||||||
{
|
[&]( SCH_MARKER* aMarker )
|
||||||
for( SCH_ITEM* aItem : sheetList[i].LastScreen()->Items().OfType( SCH_MARKER_T ) )
|
{
|
||||||
{
|
SEVERITY markerSeverity;
|
||||||
SCH_MARKER* marker = static_cast<SCH_MARKER*>( aItem );
|
|
||||||
SEVERITY markerSeverity;
|
|
||||||
|
|
||||||
if( marker->GetMarkerType() != MARKER_BASE::MARKER_ERC )
|
if( aMarker->IsExcluded() )
|
||||||
continue;
|
markerSeverity = RPT_SEVERITY_EXCLUSION;
|
||||||
|
else
|
||||||
|
markerSeverity = settings.GetSeverity( aMarker->GetRCItem()->GetErrorCode() );
|
||||||
|
|
||||||
if( marker->IsExcluded() )
|
if( markerSeverity & m_severities )
|
||||||
markerSeverity = RPT_SEVERITY_EXCLUSION;
|
m_filteredMarkers.push_back( aMarker );
|
||||||
else
|
} );
|
||||||
markerSeverity = settings.GetSeverity( marker->GetRCItem()->GetErrorCode() );
|
|
||||||
|
|
||||||
if( markerSeverity & m_severities )
|
|
||||||
m_filteredMarkers.push_back( marker );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -302,28 +328,21 @@ int SHEETLIST_ERC_ITEMS_PROVIDER::GetCount( int aSeverity )
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
SCH_SHEET_LIST sheetList = m_schematic->GetSheets();
|
ERC_SETTINGS& settings = m_schematic->ErcSettings();
|
||||||
ERC_SETTINGS& settings = m_schematic->ErcSettings();
|
|
||||||
|
|
||||||
for( unsigned i = 0; i < sheetList.size(); i++ )
|
visitMarkers(
|
||||||
{
|
[&]( SCH_MARKER* aMarker )
|
||||||
for( SCH_ITEM* aItem : sheetList[i].LastScreen()->Items().OfType( SCH_MARKER_T ) )
|
{
|
||||||
{
|
SEVERITY markerSeverity;
|
||||||
SCH_MARKER* marker = static_cast<SCH_MARKER*>( aItem );
|
|
||||||
SEVERITY markerSeverity;
|
|
||||||
|
|
||||||
if( marker->GetMarkerType() != MARKER_BASE::MARKER_ERC )
|
if( aMarker->IsExcluded() )
|
||||||
continue;
|
markerSeverity = RPT_SEVERITY_EXCLUSION;
|
||||||
|
else
|
||||||
|
markerSeverity = settings.GetSeverity( aMarker->GetRCItem()->GetErrorCode() );
|
||||||
|
|
||||||
if( marker->IsExcluded() )
|
if( markerSeverity == aSeverity )
|
||||||
markerSeverity = RPT_SEVERITY_EXCLUSION;
|
count++;
|
||||||
else
|
} );
|
||||||
markerSeverity = settings.GetSeverity( marker->GetRCItem()->GetErrorCode() );
|
|
||||||
|
|
||||||
if( markerSeverity == aSeverity )
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
|
@ -194,6 +194,10 @@ public:
|
||||||
void DeleteItem( int aIndex, bool aDeep ) override;
|
void DeleteItem( int aIndex, bool aDeep ) override;
|
||||||
|
|
||||||
void DeleteAllItems( bool aIncludeExclusions, bool aDeep ) override;
|
void DeleteAllItems( bool aIncludeExclusions, bool aDeep ) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void visitMarkers( std::function<void( SCH_MARKER* )> aVisitor );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue