Symbol Fields Table: handle missing fields better
Treat missing ones as empty, unless they are a named variable field and then resolve the field.
This commit is contained in:
parent
e26dcbece4
commit
cfa0d4bfb7
|
@ -1,6 +1,7 @@
|
||||||
#include <wx/string.h>
|
#include <wx/string.h>
|
||||||
#include <wx/debug.h>
|
#include <wx/debug.h>
|
||||||
#include <wx/grid.h>
|
#include <wx/grid.h>
|
||||||
|
#include <common.h>
|
||||||
#include <widgets/wx_grid.h>
|
#include <widgets/wx_grid.h>
|
||||||
#include <sch_reference_list.h>
|
#include <sch_reference_list.h>
|
||||||
#include <schematic_settings.h>
|
#include <schematic_settings.h>
|
||||||
|
@ -21,7 +22,16 @@ void FIELDS_EDITOR_GRID_DATA_MODEL::AddColumn( const wxString& aFieldName, const
|
||||||
for( unsigned i = 0; i < m_symbolsList.GetCount(); ++i )
|
for( unsigned i = 0; i < m_symbolsList.GetCount(); ++i )
|
||||||
{
|
{
|
||||||
if( SCH_SYMBOL* symbol = m_symbolsList[i].GetSymbol() )
|
if( SCH_SYMBOL* symbol = m_symbolsList[i].GetSymbol() )
|
||||||
m_dataStore[symbol->m_Uuid][aFieldName] = symbol->GetFieldText( aFieldName );
|
{
|
||||||
|
if( SCH_FIELD* field = symbol->GetFieldByName( aFieldName ) )
|
||||||
|
m_dataStore[symbol->m_Uuid][aFieldName] = field->GetText();
|
||||||
|
// Handle fields with variables as names that are not present in the symbol
|
||||||
|
// by giving them the correct value
|
||||||
|
else if( aFieldName.StartsWith( wxT( "${" ) ) )
|
||||||
|
m_dataStore[symbol->m_Uuid][aFieldName] = aFieldName;
|
||||||
|
else
|
||||||
|
m_dataStore[symbol->m_Uuid][aFieldName] = wxEmptyString;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,12 +152,7 @@ wxString FIELDS_EDITOR_GRID_DATA_MODEL::GetValue( const DATA_MODEL_ROW& group, i
|
||||||
wxString refFieldValue;
|
wxString refFieldValue;
|
||||||
|
|
||||||
if( resolveVars )
|
if( resolveVars )
|
||||||
{
|
refFieldValue = getFieldShownText( ref, m_cols[aCol].m_fieldName );
|
||||||
SCH_FIELD* field = ref.GetSymbol()->GetFieldByName( m_cols[aCol].m_fieldName );
|
|
||||||
|
|
||||||
if( field != nullptr )
|
|
||||||
refFieldValue = field->GetShownText( &ref.GetSheetPath(), false );
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
refFieldValue = m_dataStore[symbolID][m_cols[aCol].m_fieldName];
|
refFieldValue = m_dataStore[symbolID][m_cols[aCol].m_fieldName];
|
||||||
|
|
||||||
|
@ -345,15 +350,8 @@ bool FIELDS_EDITOR_GRID_DATA_MODEL::groupMatch( const SCH_REFERENCE& lhRef,
|
||||||
if( !m_cols[i].m_group )
|
if( !m_cols[i].m_group )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
wxString fieldName = m_cols[i].m_fieldName;
|
if( getFieldShownText( lhRef, m_cols[i].m_fieldName )
|
||||||
SCH_FIELD* lhField = lhRef.GetSymbol()->GetFieldByName( m_cols[i].m_fieldName );
|
!= getFieldShownText( rhRef, m_cols[i].m_fieldName ) )
|
||||||
SCH_FIELD* rhField = rhRef.GetSymbol()->GetFieldByName( m_cols[i].m_fieldName );
|
|
||||||
|
|
||||||
if( lhField == nullptr || rhField == nullptr )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if( lhField->GetShownText( &lhRef.GetSheetPath(), false )
|
|
||||||
!= rhField->GetShownText( &rhRef.GetSheetPath(), false ) )
|
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -365,6 +363,34 @@ bool FIELDS_EDITOR_GRID_DATA_MODEL::groupMatch( const SCH_REFERENCE& lhRef,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
wxString FIELDS_EDITOR_GRID_DATA_MODEL::getFieldShownText( const SCH_REFERENCE& aRef,
|
||||||
|
const wxString& aFieldName )
|
||||||
|
{
|
||||||
|
SCH_FIELD* field = aRef.GetSymbol()->GetFieldByName( aFieldName );
|
||||||
|
|
||||||
|
if( field )
|
||||||
|
return field->GetShownText( &aRef.GetSheetPath(), false );
|
||||||
|
|
||||||
|
// Handle fields with variables as names that are not present in the symbol
|
||||||
|
// by giving them the correct value by resolving against the symbol
|
||||||
|
if( aFieldName.StartsWith( wxT( "${" ) ) )
|
||||||
|
{
|
||||||
|
int depth = 0;
|
||||||
|
const SCH_SHEET_PATH& path = aRef.GetSheetPath();
|
||||||
|
|
||||||
|
std::function<bool( wxString* )> symbolResolver =
|
||||||
|
[&]( wxString* token ) -> bool
|
||||||
|
{
|
||||||
|
return aRef.GetSymbol()->ResolveTextVar( &path, token, depth + 1 );
|
||||||
|
};
|
||||||
|
|
||||||
|
return ExpandTextVars( aFieldName, &symbolResolver );
|
||||||
|
}
|
||||||
|
|
||||||
|
return wxEmptyString;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void FIELDS_EDITOR_GRID_DATA_MODEL::EnableRebuilds()
|
void FIELDS_EDITOR_GRID_DATA_MODEL::EnableRebuilds()
|
||||||
{
|
{
|
||||||
m_rebuildsEnabled = true;
|
m_rebuildsEnabled = true;
|
||||||
|
|
|
@ -199,6 +199,12 @@ private:
|
||||||
bool unitMatch( const SCH_REFERENCE& lhRef, const SCH_REFERENCE& rhRef );
|
bool unitMatch( const SCH_REFERENCE& lhRef, const SCH_REFERENCE& rhRef );
|
||||||
bool groupMatch( const SCH_REFERENCE& lhRef, const SCH_REFERENCE& rhRef );
|
bool groupMatch( const SCH_REFERENCE& lhRef, const SCH_REFERENCE& rhRef );
|
||||||
|
|
||||||
|
/* Helper function to get the resolved field value.
|
||||||
|
* Handles symbols that are missing fields that would have a variable
|
||||||
|
* in their value because their name is the same as a variable.
|
||||||
|
* Example: BOM template provides ${DNP} as a field, but they symbol doesn't have the field. */
|
||||||
|
wxString getFieldShownText( const SCH_REFERENCE& aRef, const wxString& aFieldName );
|
||||||
|
|
||||||
void Sort();
|
void Sort();
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue