mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-04-20 21:31:42 +00:00
Reduce reliance on MANDATORY_FIELDS and their implied order.
This commit is contained in:
parent
be38fa5cac
commit
e19bce2f93
common
eeschema
dialogs
eeschema_jobs_handler.cppfields_data_model.cpplib_symbol.cppnetlist_exporters
sch_field.cppsch_io
altium
cadstar
eagle
easyedapro
kicad_legacy
kicad_sexpr
sim
symbol_editor
tools
include
pcbnew
dialogs
footprint.cppkicad_clipboard.cppnetlist_reader
pcb_field.cpppcb_field.hpcb_fields_grid_table.cpppcb_io
tools
qa/tests/eeschema
@ -236,9 +236,9 @@ void TEMPLATES::resolveTemplates()
|
||||
void TEMPLATES::AddTemplateFieldName( const TEMPLATE_FIELDNAME& aFieldName, bool aGlobal )
|
||||
{
|
||||
// Ensure that the template fieldname does not match a fixed fieldname.
|
||||
for( int i = 0; i < MANDATORY_FIELDS; ++i )
|
||||
for( int fieldId : MANDATORY_FIELDS )
|
||||
{
|
||||
if( GetCanonicalFieldName( i ) == aFieldName.m_Name )
|
||||
if( GetCanonicalFieldName( fieldId ) == aFieldName.m_Name )
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -101,7 +101,7 @@ DIALOG_CHANGE_SYMBOLS::DIALOG_CHANGE_SYMBOLS( SCH_EDIT_FRAME* aParent, SCH_SYMBO
|
||||
m_matchSizer->SetEmptyCellSize( wxSize( 0, 0 ) );
|
||||
m_matchSizer->Layout();
|
||||
|
||||
for( int i = 0; i < MANDATORY_FIELDS; ++i )
|
||||
for( int i = 0; i < MANDATORY_FIELD_COUNT; ++i )
|
||||
{
|
||||
m_fieldsBox->Append( GetDefaultFieldName( i, DO_TRANSLATE ) );
|
||||
|
||||
@ -308,10 +308,10 @@ void DIALOG_CHANGE_SYMBOLS::updateFieldsList()
|
||||
fields.clear();
|
||||
symbol->GetFields( fields, false );
|
||||
|
||||
for( unsigned i = MANDATORY_FIELDS; i < fields.size(); ++i )
|
||||
for( SCH_FIELD* field : fields )
|
||||
{
|
||||
if( !fields[i]->IsPrivate() )
|
||||
fieldNames.insert( fields[i]->GetName() );
|
||||
if( !field->IsMandatory() && !field->IsPrivate() )
|
||||
fieldNames.insert( field->GetName() );
|
||||
}
|
||||
|
||||
if( m_mode == MODE::UPDATE && symbol->GetLibId().IsValid() )
|
||||
@ -324,10 +324,10 @@ void DIALOG_CHANGE_SYMBOLS::updateFieldsList()
|
||||
|
||||
flattenedSymbol->GetFields( libFields );
|
||||
|
||||
for( unsigned i = MANDATORY_FIELDS; i < libFields.size(); ++i )
|
||||
for( SCH_FIELD* libField : libFields )
|
||||
{
|
||||
if( !libFields[i]->IsPrivate() )
|
||||
fieldNames.insert( libFields[i]->GetName() );
|
||||
if( !libField->IsMandatory() && !libField->IsPrivate() )
|
||||
fieldNames.insert( libField->GetName() );
|
||||
}
|
||||
|
||||
libFields.clear(); // flattenedSymbol is about to go out of scope...
|
||||
@ -353,10 +353,10 @@ void DIALOG_CHANGE_SYMBOLS::updateFieldsList()
|
||||
|
||||
flattenedSymbol->GetFields( libFields );
|
||||
|
||||
for( unsigned i = MANDATORY_FIELDS; i < libFields.size(); ++i )
|
||||
for( SCH_FIELD* libField : libFields )
|
||||
{
|
||||
if( !libFields[i]->IsPrivate() )
|
||||
fieldNames.insert( libFields[i]->GetName() );
|
||||
if( !libField->IsMandatory() && !libField->IsPrivate() )
|
||||
fieldNames.insert( libField->GetName() );
|
||||
}
|
||||
|
||||
libFields.clear(); // flattenedSymbol is about to go out of scope...
|
||||
@ -384,7 +384,7 @@ void DIALOG_CHANGE_SYMBOLS::updateFieldsList()
|
||||
allChecked = false;
|
||||
}
|
||||
|
||||
for( unsigned ii = m_fieldsBox->GetCount() - 1; ii >= MANDATORY_FIELDS; --ii )
|
||||
for( unsigned ii = m_fieldsBox->GetCount() - 1; ii >= MANDATORY_FIELD_COUNT; --ii )
|
||||
m_fieldsBox->Delete( ii );
|
||||
|
||||
for( const wxString& fieldName : fieldNames )
|
||||
@ -424,7 +424,7 @@ void DIALOG_CHANGE_SYMBOLS::onOkButtonClicked( wxCommandEvent& aEvent )
|
||||
{
|
||||
if( m_fieldsBox->IsChecked( i ) )
|
||||
{
|
||||
if( i < MANDATORY_FIELDS )
|
||||
if( i < MANDATORY_FIELD_COUNT )
|
||||
m_updateFields.insert( GetCanonicalFieldName( i ) );
|
||||
else
|
||||
m_updateFields.insert( m_fieldsBox->GetString( i ) );
|
||||
@ -668,7 +668,7 @@ int DIALOG_CHANGE_SYMBOLS::processSymbols( SCH_COMMIT* aCommit,
|
||||
if( !doUpdate )
|
||||
continue;
|
||||
|
||||
if( i < MANDATORY_FIELDS )
|
||||
if( i < MANDATORY_FIELD_COUNT )
|
||||
libField = symbol->GetLibSymbolRef()->GetFieldById( (int) i );
|
||||
else
|
||||
libField = symbol->GetLibSymbolRef()->FindField( field.GetName() );
|
||||
@ -735,7 +735,7 @@ int DIALOG_CHANGE_SYMBOLS::processSymbols( SCH_COMMIT* aCommit,
|
||||
if( resetPositions )
|
||||
field.SetTextPos( symbol->GetPosition() + libField->GetTextPos() );
|
||||
}
|
||||
else if( i >= MANDATORY_FIELDS && removeExtras )
|
||||
else if( i >= MANDATORY_FIELD_COUNT && removeExtras )
|
||||
{
|
||||
symbol->RemoveField( field.GetName() );
|
||||
i--;
|
||||
@ -745,25 +745,25 @@ int DIALOG_CHANGE_SYMBOLS::processSymbols( SCH_COMMIT* aCommit,
|
||||
std::vector<SCH_FIELD*> libFields;
|
||||
symbol->GetLibSymbolRef()->GetFields( libFields );
|
||||
|
||||
for( unsigned i = MANDATORY_FIELDS; i < libFields.size(); ++i )
|
||||
for( SCH_FIELD* libField : libFields )
|
||||
{
|
||||
const SCH_FIELD& libField = *libFields[i];
|
||||
|
||||
if( !alg::contains( m_updateFields, libField.GetCanonicalName() ) )
|
||||
if( libField->IsMandatory() )
|
||||
continue;
|
||||
|
||||
if( !symbol->FindField( libField.GetName(), false ) )
|
||||
if( !alg::contains( m_updateFields, libField->GetCanonicalName() ) )
|
||||
continue;
|
||||
|
||||
if( !symbol->FindField( libField->GetName(), false ) )
|
||||
{
|
||||
wxString fieldName = libField.GetCanonicalName();
|
||||
SCH_FIELD newField( VECTOR2I( 0, 0 ), symbol->GetFieldCount(), symbol,
|
||||
fieldName );
|
||||
SCH_FIELD newField( VECTOR2I( 0, 0 ), symbol->GetNextFieldId(), symbol,
|
||||
libField->GetCanonicalName() );
|
||||
SCH_FIELD* schField = symbol->AddField( newField );
|
||||
|
||||
// Careful: the visible bit and position are also set by SetAttributes()
|
||||
schField->SetAttributes( libField );
|
||||
schField->SetText( libField.GetText() );
|
||||
schField->SetTextPos( symbol->GetPosition() + libField.GetTextPos() );
|
||||
schField->SetPrivate( libField.IsPrivate() );
|
||||
schField->SetAttributes( *libField );
|
||||
schField->SetText( libField->GetText() );
|
||||
schField->SetTextPos( symbol->GetPosition() + libField->GetTextPos() );
|
||||
schField->SetPrivate( libField->IsPrivate() );
|
||||
}
|
||||
|
||||
if( resetPositions && frame->eeconfig()->m_AutoplaceFields.enable )
|
||||
|
@ -680,29 +680,19 @@ void DIALOG_SYMBOL_FIELDS_TABLE::AddField( const wxString& aFieldName, const wxS
|
||||
|
||||
void DIALOG_SYMBOL_FIELDS_TABLE::LoadFieldNames()
|
||||
{
|
||||
// Add mandatory fields first
|
||||
for( int i = 0; i < MANDATORY_FIELDS; ++i )
|
||||
{
|
||||
bool show = false;
|
||||
bool groupBy = false;
|
||||
auto addMandatoryField =
|
||||
[&]( int fieldId, bool show, bool groupBy )
|
||||
{
|
||||
AddField( GetCanonicalFieldName( fieldId ),
|
||||
GetDefaultFieldName( fieldId, DO_TRANSLATE ), show, groupBy );
|
||||
};
|
||||
|
||||
switch( i )
|
||||
{
|
||||
case REFERENCE_FIELD:
|
||||
case VALUE_FIELD:
|
||||
case FOOTPRINT_FIELD:
|
||||
show = true;
|
||||
groupBy = true;
|
||||
break;
|
||||
case DATASHEET_FIELD:
|
||||
show = true;
|
||||
groupBy = false;
|
||||
break;
|
||||
}
|
||||
|
||||
AddField( GetCanonicalFieldName( i ), GetDefaultFieldName( i, DO_TRANSLATE ), show,
|
||||
groupBy );
|
||||
}
|
||||
// Add mandatory fields first show groupBy
|
||||
addMandatoryField( REFERENCE_FIELD, true, true );
|
||||
addMandatoryField( VALUE_FIELD, true, true );
|
||||
addMandatoryField( FOOTPRINT_FIELD, true, true );
|
||||
addMandatoryField( DATASHEET_FIELD, true, false );
|
||||
addMandatoryField( DESCRIPTION_FIELD, false, false );
|
||||
|
||||
// Generated fields present only in the fields table
|
||||
AddField( FIELDS_EDITOR_GRID_DATA_MODEL::QUANTITY_VARIABLE, _( "Qty" ), true, false );
|
||||
@ -715,10 +705,10 @@ void DIALOG_SYMBOL_FIELDS_TABLE::LoadFieldNames()
|
||||
{
|
||||
SCH_SYMBOL* symbol = m_symbolsList[ i ].GetSymbol();
|
||||
|
||||
for( int j = MANDATORY_FIELDS; j < symbol->GetFieldCount(); ++j )
|
||||
for( const SCH_FIELD& field : symbol->GetFields() )
|
||||
{
|
||||
if( !symbol->GetFields()[j].IsPrivate() )
|
||||
userFieldNames.insert( symbol->GetFields()[j].GetName() );
|
||||
if( !field.IsMandatory() && !field.IsPrivate() )
|
||||
userFieldNames.insert( field.GetName() );
|
||||
}
|
||||
}
|
||||
|
||||
@ -780,7 +770,7 @@ void DIALOG_SYMBOL_FIELDS_TABLE::OnRemoveField( wxCommandEvent& event )
|
||||
// Should never occur: "Remove Field..." button should be disabled if invalid selection
|
||||
// via OnFieldsCtrlSelectionChanged()
|
||||
wxCHECK_RET( row != -1, wxS( "Some user defined field must be selected first" ) );
|
||||
wxCHECK_RET( row >= MANDATORY_FIELDS, wxS( "Mandatory fields cannot be removed" ) );
|
||||
wxCHECK_RET( row >= MANDATORY_FIELD_COUNT, wxS( "Mandatory fields cannot be removed" ) );
|
||||
|
||||
wxString fieldName = m_fieldsCtrl->GetTextValue( row, FIELD_NAME_COLUMN );
|
||||
wxString displayName = m_fieldsCtrl->GetTextValue( row, DISPLAY_NAME_COLUMN );
|
||||
@ -805,7 +795,7 @@ void DIALOG_SYMBOL_FIELDS_TABLE::OnRemoveField( wxCommandEvent& event )
|
||||
// Safe to decrement row index because we always have mandatory fields.
|
||||
m_fieldsCtrl->SelectRow( --row );
|
||||
|
||||
if( row < MANDATORY_FIELDS )
|
||||
if( row < MANDATORY_FIELD_COUNT )
|
||||
{
|
||||
m_removeFieldButton->Enable( false );
|
||||
m_renameFieldButton->Enable( false );
|
||||
@ -828,7 +818,7 @@ void DIALOG_SYMBOL_FIELDS_TABLE::OnRenameField( wxCommandEvent& event )
|
||||
// Should never occur: "Rename Field..." button should be disabled if invalid selection
|
||||
// via OnFieldsCtrlSelectionChanged()
|
||||
wxCHECK_RET( row != -1, wxS( "Some user defined field must be selected first" ) );
|
||||
wxCHECK_RET( row >= MANDATORY_FIELDS, wxS( "Mandatory fields cannot be renamed" ) );
|
||||
wxCHECK_RET( row >= MANDATORY_FIELD_COUNT, wxS( "Mandatory fields cannot be renamed" ) );
|
||||
wxCHECK_RET( !fieldName.IsEmpty(), wxS( "Field must have a name" ) );
|
||||
|
||||
int col = m_dataModel->GetFieldNameCol( fieldName );
|
||||
@ -894,7 +884,7 @@ void DIALOG_SYMBOL_FIELDS_TABLE::OnFieldsCtrlSelectionChanged( wxDataViewEvent&
|
||||
{
|
||||
int row = m_fieldsCtrl->GetSelectedRow();
|
||||
|
||||
if( row >= MANDATORY_FIELDS )
|
||||
if( row >= MANDATORY_FIELD_COUNT )
|
||||
{
|
||||
m_removeFieldButton->Enable( true );
|
||||
m_renameFieldButton->Enable( true );
|
||||
|
@ -46,7 +46,7 @@ DIALOG_UPDATE_SYMBOL_FIELDS::DIALOG_UPDATE_SYMBOL_FIELDS( SYMBOL_EDIT_FRAME* aPa
|
||||
|
||||
m_parentSymbolReadOnly->SetValue( UnescapeString( m_symbol->GetParent().lock()->GetName() ) );
|
||||
|
||||
for( int i = 0; i < MANDATORY_FIELDS; ++i )
|
||||
for( int i = 0; i < MANDATORY_FIELD_COUNT; ++i )
|
||||
{
|
||||
m_fieldsBox->Append( GetDefaultFieldName( i, DO_TRANSLATE ) );
|
||||
m_fieldsBox->Check( i, true );
|
||||
@ -88,27 +88,33 @@ void DIALOG_UPDATE_SYMBOL_FIELDS::updateFieldsList()
|
||||
|
||||
flattenedParent->GetFields( libFields );
|
||||
|
||||
for( unsigned i = MANDATORY_FIELDS; i < libFields.size(); ++i )
|
||||
fieldNames.insert( libFields[i]->GetName() );
|
||||
for( SCH_FIELD* libField : libFields )
|
||||
{
|
||||
if( !libField->IsMandatory() )
|
||||
fieldNames.insert( libField->GetName() );
|
||||
}
|
||||
|
||||
libFields.clear(); // flattenedPart is about to go out of scope...
|
||||
|
||||
// Load non-mandatory fields from the editor symbol
|
||||
m_symbol->GetFields( libFields );
|
||||
|
||||
for( unsigned i = MANDATORY_FIELDS; i < libFields.size(); ++i )
|
||||
fieldNames.insert( libFields[i]->GetName() );
|
||||
for( SCH_FIELD* libField : libFields )
|
||||
{
|
||||
if( !libField->IsMandatory() )
|
||||
fieldNames.insert( libField->GetName() );
|
||||
}
|
||||
|
||||
libFields.clear();
|
||||
|
||||
// Update the listbox widget
|
||||
for( unsigned i = m_fieldsBox->GetCount() - 1; i >= MANDATORY_FIELDS; --i )
|
||||
for( unsigned i = m_fieldsBox->GetCount() - 1; i >= MANDATORY_FIELD_COUNT; --i )
|
||||
m_fieldsBox->Delete( i );
|
||||
|
||||
for( const wxString& fieldName : fieldNames )
|
||||
m_fieldsBox->Append( fieldName );
|
||||
|
||||
for( unsigned i = MANDATORY_FIELDS; i < m_fieldsBox->GetCount(); ++i )
|
||||
for( unsigned i = MANDATORY_FIELD_COUNT; i < m_fieldsBox->GetCount(); ++i )
|
||||
m_fieldsBox->Check( i, true );
|
||||
}
|
||||
|
||||
|
@ -526,10 +526,10 @@ int EESCHEMA_JOBS_HANDLER::JobExportBom( JOB* aJob )
|
||||
FIELDS_EDITOR_GRID_DATA_MODEL dataModel( referenceList );
|
||||
|
||||
// Mandatory fields + quantity virtual field first
|
||||
for( int i = 0; i < MANDATORY_FIELDS; ++i )
|
||||
for( int fieldId : MANDATORY_FIELDS )
|
||||
{
|
||||
dataModel.AddColumn( GetCanonicalFieldName( i ), GetDefaultFieldName( i, DO_TRANSLATE ),
|
||||
false );
|
||||
dataModel.AddColumn( GetCanonicalFieldName( fieldId ),
|
||||
GetDefaultFieldName( fieldId, DO_TRANSLATE ), false );
|
||||
}
|
||||
|
||||
// User field names in symbols second
|
||||
@ -539,8 +539,11 @@ int EESCHEMA_JOBS_HANDLER::JobExportBom( JOB* aJob )
|
||||
{
|
||||
SCH_SYMBOL* symbol = referenceList[i].GetSymbol();
|
||||
|
||||
for( int j = MANDATORY_FIELDS; j < symbol->GetFieldCount(); ++j )
|
||||
userFieldNames.insert( symbol->GetFields()[j].GetName() );
|
||||
for( SCH_FIELD& field : symbol->GetFields() )
|
||||
{
|
||||
if( !field.IsMandatory() && !field.IsPrivate() )
|
||||
userFieldNames.insert( field.GetName() );
|
||||
}
|
||||
}
|
||||
|
||||
for( const wxString& fieldName : userFieldNames )
|
||||
|
@ -830,13 +830,13 @@ void FIELDS_EDITOR_GRID_DATA_MODEL::ApplyData(
|
||||
}
|
||||
}
|
||||
|
||||
for( int ii = symbol.GetFields().size() - 1; ii >= MANDATORY_FIELDS; ii-- )
|
||||
for( int ii = symbol.GetFields().size() - 1; ii >= 0; ii-- )
|
||||
{
|
||||
if( symbol.GetFields()[ii].IsMandatory() || symbol.GetFields()[ii].IsPrivate() )
|
||||
continue;
|
||||
|
||||
if( fieldStore.count( symbol.GetFields()[ii].GetName() ) == 0 )
|
||||
{
|
||||
if( !symbol.GetFields()[ii].IsPrivate() )
|
||||
symbol.GetFields().erase( symbol.GetFields().begin() + ii );
|
||||
}
|
||||
symbol.GetFields().erase( symbol.GetFields().begin() + ii );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -107,10 +107,10 @@ LIB_SYMBOL::LIB_SYMBOL( const wxString& aName, LIB_SYMBOL* aParent, SYMBOL_LIB*
|
||||
|
||||
// Add the MANDATORY_FIELDS in RAM only. These are assumed to be present
|
||||
// when the field editors are invoked.
|
||||
m_drawings[SCH_FIELD_T].reserve( MANDATORY_FIELDS );
|
||||
m_drawings[SCH_FIELD_T].reserve( MANDATORY_FIELD_COUNT );
|
||||
|
||||
for( int i = 0; i < MANDATORY_FIELDS; i++ )
|
||||
m_drawings[SCH_FIELD_T].push_back( new SCH_FIELD( this, i ) );
|
||||
for( int fieldId : MANDATORY_FIELDS )
|
||||
m_drawings[SCH_FIELD_T].push_back( new SCH_FIELD( this, fieldId ) );
|
||||
|
||||
// Ensure reference and value fields are visible when creating a lib symbol
|
||||
// whatever the SCH_FIELD Ctor default value is.
|
||||
@ -351,15 +351,15 @@ std::unique_ptr< LIB_SYMBOL > LIB_SYMBOL::Flatten() const
|
||||
retv->SetLibId( m_libId );
|
||||
|
||||
// Now add the inherited part mandatory field (this) information.
|
||||
for( int i = 0; i < MANDATORY_FIELDS; i++ )
|
||||
for( int fieldId : MANDATORY_FIELDS )
|
||||
{
|
||||
wxString tmp = GetFieldById( i )->GetText();
|
||||
wxString tmp = GetFieldById( fieldId )->GetText();
|
||||
|
||||
// If the field isn't defined then inherit the parent field value.
|
||||
if( tmp.IsEmpty() )
|
||||
retv->GetFieldById( i )->SetText( retv->GetFieldById( i )->GetText() );
|
||||
retv->GetFieldById( fieldId )->SetText( retv->GetFieldById( fieldId )->GetText() );
|
||||
else
|
||||
*retv->GetFieldById( i ) = *GetFieldById( i );
|
||||
*retv->GetFieldById( fieldId ) = *GetFieldById( fieldId );
|
||||
}
|
||||
|
||||
// Grab all the rest of derived symbol fields.
|
||||
@ -1068,9 +1068,9 @@ void LIB_SYMBOL::SetFields( const std::vector<SCH_FIELD>& aFieldsList )
|
||||
void LIB_SYMBOL::GetFields( std::vector<SCH_FIELD*>& aList, bool aVisibleOnly )
|
||||
{
|
||||
// Grab the MANDATORY_FIELDS first, in expected order given by enum MANDATORY_FIELD_T
|
||||
for( int id = 0; id < MANDATORY_FIELDS; ++id )
|
||||
for( int fieldId : MANDATORY_FIELDS )
|
||||
{
|
||||
SCH_FIELD* field = GetFieldById( id );
|
||||
SCH_FIELD* field = GetFieldById( fieldId );
|
||||
|
||||
if( aVisibleOnly )
|
||||
{
|
||||
@ -1101,8 +1101,8 @@ void LIB_SYMBOL::GetFields( std::vector<SCH_FIELD*>& aList, bool aVisibleOnly )
|
||||
void LIB_SYMBOL::CopyFields( std::vector<SCH_FIELD>& aList )
|
||||
{
|
||||
// Grab the MANDATORY_FIELDS first, in expected order given by enum MANDATORY_FIELD_T
|
||||
for( int id = 0; id < MANDATORY_FIELDS; ++id )
|
||||
aList.push_back( *GetFieldById( id ) );
|
||||
for( int fieldId : MANDATORY_FIELDS )
|
||||
aList.push_back( *GetFieldById( fieldId ) );
|
||||
|
||||
// Now grab all the rest of fields.
|
||||
for( SCH_ITEM& item : m_drawings[ SCH_FIELD_T ] )
|
||||
@ -1248,7 +1248,7 @@ void LIB_SYMBOL::RunOnChildren( const std::function<void( SCH_ITEM* )>& aFunctio
|
||||
int LIB_SYMBOL::UpdateFieldOrdinals()
|
||||
{
|
||||
int retv = 0;
|
||||
int lastOrdinal = MANDATORY_FIELDS;
|
||||
int lastOrdinal = MANDATORY_FIELD_COUNT;
|
||||
|
||||
for( SCH_ITEM& item : m_drawings[ SCH_FIELD_T ] )
|
||||
{
|
||||
@ -1273,7 +1273,7 @@ int LIB_SYMBOL::UpdateFieldOrdinals()
|
||||
|
||||
int LIB_SYMBOL::GetNextAvailableFieldId() const
|
||||
{
|
||||
int retv = MANDATORY_FIELDS;
|
||||
int retv = MANDATORY_FIELD_COUNT;
|
||||
|
||||
while( GetFieldById( retv ) )
|
||||
retv += 1;
|
||||
|
@ -162,7 +162,7 @@ void NETLIST_EXPORTER_XML::addSymbolFields( XNODE* aNode, SCH_SYMBOL* aSymbol,
|
||||
// All non-mandatory fields
|
||||
for( SCH_FIELD& field : symbol2->GetFields() )
|
||||
{
|
||||
if( field.IsMandatory() )
|
||||
if( field.IsMandatory() || field.IsPrivate() )
|
||||
continue;
|
||||
|
||||
if( unit < minUnit || fields.count( field.GetName() ) == 0 )
|
||||
@ -200,7 +200,7 @@ void NETLIST_EXPORTER_XML::addSymbolFields( XNODE* aNode, SCH_SYMBOL* aSymbol,
|
||||
|
||||
for( SCH_FIELD& field : aSymbol->GetFields() )
|
||||
{
|
||||
if( field.IsMandatory() )
|
||||
if( field.IsMandatory() || field.IsPrivate() )
|
||||
continue;
|
||||
|
||||
if( m_resolveTextVars )
|
||||
@ -346,15 +346,18 @@ XNODE* NETLIST_EXPORTER_XML::makeSymbols( unsigned aCtl )
|
||||
|
||||
std::vector<SCH_FIELD>& fields = symbol->GetFields();
|
||||
|
||||
for( size_t jj = MANDATORY_FIELDS; jj < fields.size(); ++jj )
|
||||
for( SCH_FIELD& field : fields )
|
||||
{
|
||||
if( field.IsMandatory() || field.IsPrivate() )
|
||||
continue;
|
||||
|
||||
xcomp->AddChild( xproperty = node( wxT( "property" ) ) );
|
||||
xproperty->AddAttribute( wxT( "name" ), fields[jj].GetCanonicalName() );
|
||||
xproperty->AddAttribute( wxT( "name" ), field.GetCanonicalName() );
|
||||
|
||||
if( m_resolveTextVars )
|
||||
xproperty->AddAttribute( wxT( "value" ), fields[jj].GetShownText( &sheet, false ) );
|
||||
xproperty->AddAttribute( wxT( "value" ), field.GetShownText( &sheet, false ) );
|
||||
else
|
||||
xproperty->AddAttribute( wxT( "value" ), fields[jj].GetText() );
|
||||
xproperty->AddAttribute( wxT( "value" ), field.GetText() );
|
||||
}
|
||||
|
||||
for( const SCH_FIELD& sheetField : sheet.Last()->GetFields() )
|
||||
|
@ -1508,9 +1508,18 @@ VECTOR2I SCH_FIELD::GetParentPosition() const
|
||||
bool SCH_FIELD::IsMandatory() const
|
||||
{
|
||||
if( m_parent && m_parent->Type() == SCH_SHEET_T )
|
||||
return m_id >= 0 && m_id < SHEET_MANDATORY_FIELDS;
|
||||
{
|
||||
return m_id == SHEETNAME
|
||||
|| m_id == SHEETFILENAME;
|
||||
}
|
||||
else
|
||||
return m_id >= 0 && m_id < MANDATORY_FIELDS;
|
||||
{
|
||||
return m_id == REFERENCE_FIELD
|
||||
|| m_id == VALUE_FIELD
|
||||
|| m_id == FOOTPRINT_FIELD
|
||||
|| m_id == DATASHEET_FIELD
|
||||
|| m_id == DESCRIPTION_FIELD;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1591,7 +1600,7 @@ double SCH_FIELD::Similarity( const SCH_ITEM& aOther ) const
|
||||
if( GetId() != field.GetId() )
|
||||
{
|
||||
// We don't allow swapping of mandatory fields, so these cannot be the same item
|
||||
if( GetId() < MANDATORY_FIELDS || field.GetId() < MANDATORY_FIELDS )
|
||||
if( IsMandatory() || field.IsMandatory() )
|
||||
return 0.0;
|
||||
else
|
||||
similarity *= 0.5;
|
||||
|
@ -4055,11 +4055,9 @@ void SCH_IO_ALTIUM::ParseParameter( const std::map<wxString, wxString>& aPropert
|
||||
}
|
||||
else
|
||||
{
|
||||
int fieldIdx = 0;
|
||||
int fieldIdx = symbol->GetNextFieldId();
|
||||
wxString fieldName = elem.name.Upper();
|
||||
|
||||
fieldIdx = symbol->GetFieldCount();
|
||||
|
||||
if( fieldName.IsEmpty() )
|
||||
{
|
||||
int disambiguate = 1;
|
||||
@ -4128,7 +4126,7 @@ void SCH_IO_ALTIUM::ParseLibParameter( const std::map<wxString, wxString>& aProp
|
||||
}
|
||||
else
|
||||
{
|
||||
int fieldIdx = libSymbol->GetFieldCount();
|
||||
int fieldIdx = libSymbol->GetNextAvailableFieldId();
|
||||
wxString fieldNameStem = elem.name;
|
||||
wxString fieldName = fieldNameStem;
|
||||
int disambiguate = 1;
|
||||
|
@ -789,9 +789,8 @@ void CADSTAR_SCH_ARCHIVE_LOADER::loadSchematicSymbolInstances()
|
||||
|
||||
if( !partField )
|
||||
{
|
||||
int fieldID = symbol->GetFieldCount();
|
||||
partField = symbol->AddField( SCH_FIELD( VECTOR2I(), fieldID, symbol,
|
||||
PartNameFieldName ) );
|
||||
partField = symbol->AddField( SCH_FIELD( VECTOR2I(), symbol->GetNextFieldId(),
|
||||
symbol, PartNameFieldName ) );
|
||||
}
|
||||
|
||||
wxASSERT( partField->GetName() == PartNameFieldName );
|
||||
@ -818,9 +817,9 @@ void CADSTAR_SCH_ARCHIVE_LOADER::loadSchematicSymbolInstances()
|
||||
|
||||
if( !attrField )
|
||||
{
|
||||
int fieldID = symbol->GetFieldCount();
|
||||
attrField = symbol->AddField( SCH_FIELD( VECTOR2I(), fieldID, symbol,
|
||||
attrName ) );
|
||||
attrField = symbol->AddField( SCH_FIELD( VECTOR2I(),
|
||||
symbol->GetNextFieldId(),
|
||||
symbol, attrName ) );
|
||||
}
|
||||
|
||||
wxASSERT( attrField->GetName() == attrName );
|
||||
@ -1600,9 +1599,8 @@ CADSTAR_SCH_ARCHIVE_LOADER::addNewFieldToSymbol( const wxString& aF
|
||||
if( existingField != nullptr )
|
||||
return existingField;
|
||||
|
||||
int newfieldID = aKiCadSymbol->GetFieldCount();
|
||||
SCH_FIELD* newfield = new SCH_FIELD( aKiCadSymbol.get(), newfieldID );
|
||||
newfield->SetName( aFieldName );
|
||||
SCH_FIELD* newfield = new SCH_FIELD( aKiCadSymbol.get(),
|
||||
aKiCadSymbol->GetNextAvailableFieldId(), aFieldName );
|
||||
newfield->SetVisible( false );
|
||||
aKiCadSymbol->AddField( newfield );
|
||||
/*
|
||||
|
@ -1879,7 +1879,7 @@ void SCH_IO_EAGLE::loadInstance( const std::unique_ptr<EINSTANCE>& aInstance,
|
||||
if( lastField )
|
||||
newFieldPosition = lastField->GetPosition();
|
||||
|
||||
SCH_FIELD newField( newFieldPosition, symbol->GetFieldCount(), symbol.get() );
|
||||
SCH_FIELD newField( newFieldPosition, symbol->GetNextFieldId(), symbol.get() );
|
||||
|
||||
newField.SetName( attrName );
|
||||
|
||||
|
@ -1295,8 +1295,9 @@ void SCH_EASYEDAPRO_PARSER::ParseSchematic( SCHEMATIC* aSchematic, SCH_SHEET* aR
|
||||
|
||||
if( !text )
|
||||
{
|
||||
text = schSym->AddField(
|
||||
SCH_FIELD( schSym.get(), schSym->GetFieldCount(), attrKey ) );
|
||||
text = schSym->AddField( SCH_FIELD( schSym.get(),
|
||||
schSym->GetNextFieldId(),
|
||||
attrKey ) );
|
||||
}
|
||||
|
||||
wxString value = *valOpt;
|
||||
@ -1366,8 +1367,8 @@ void SCH_EASYEDAPRO_PARSER::ParseSchematic( SCHEMATIC* aSchematic, SCH_SHEET* aR
|
||||
|
||||
if( !text )
|
||||
{
|
||||
text = schSym->AddField(
|
||||
SCH_FIELD( schSym.get(), schSym->GetFieldCount(), attrKey ) );
|
||||
text = schSym->AddField( SCH_FIELD( schSym.get(), schSym->GetNextFieldId(),
|
||||
attrKey ) );
|
||||
}
|
||||
|
||||
text->SetPosition( schSym->GetPosition() );
|
||||
|
@ -1302,7 +1302,7 @@ SCH_SYMBOL* SCH_IO_KICAD_LEGACY::loadSymbol( LINE_READER& aReader )
|
||||
// The first MANDATOR_FIELDS _must_ be constructed within the SCH_SYMBOL
|
||||
// constructor. This assert is simply here to guard against a change in that
|
||||
// constructor.
|
||||
wxASSERT( symbol->GetFieldCount() >= MANDATORY_FIELDS );
|
||||
wxASSERT( symbol->GetFieldCount() >= MANDATORY_FIELD_COUNT );
|
||||
|
||||
// We need to check for an existing field by name that happens to have the same
|
||||
// name and index as any field that was made mandatory after this point, e.g. Description
|
||||
@ -1313,9 +1313,9 @@ SCH_SYMBOL* SCH_IO_KICAD_LEGACY::loadSymbol( LINE_READER& aReader )
|
||||
if( !existingField )
|
||||
{
|
||||
// Ignore the _supplied_ fieldNdx. It is not important anymore if within the
|
||||
// user defined fields region (i.e. >= MANDATORY_FIELDS).
|
||||
// user defined fields region (i.e. >= MANDATORY_FIELD_COUNT).
|
||||
// We freely renumber the index to fit the next available field slot.
|
||||
index = symbol->GetFieldCount(); // new has this index after insertion
|
||||
index = symbol->GetNextFieldId(); // new has this index after insertion
|
||||
|
||||
SCH_FIELD field( VECTOR2I( 0, 0 ), index, symbol.get(), name );
|
||||
symbol->AddField( field );
|
||||
@ -1755,16 +1755,22 @@ void SCH_IO_KICAD_LEGACY::saveSymbol( SCH_SYMBOL* aSymbol )
|
||||
// Fixed fields:
|
||||
// Save mandatory fields even if they are blank,
|
||||
// because the visibility, size and orientation are set from library editor.
|
||||
for( unsigned i = 0; i < MANDATORY_FIELDS; ++i )
|
||||
saveField( &aSymbol->GetFields()[i] );
|
||||
for( SCH_FIELD& field : aSymbol->GetFields() )
|
||||
{
|
||||
if( field.IsMandatory() )
|
||||
saveField( &field );
|
||||
}
|
||||
|
||||
// User defined fields:
|
||||
// The *policy* about which user defined fields are symbol of a symbol is now
|
||||
// only in the dialog editors. No policy should be enforced here, simply
|
||||
// save all the user defined fields, they are present because a dialog editor
|
||||
// thought they should be. If you disagree, go fix the dialog editors.
|
||||
for( int i = MANDATORY_FIELDS; i < aSymbol->GetFieldCount(); ++i )
|
||||
saveField( &aSymbol->GetFields()[i] );
|
||||
for( SCH_FIELD& field : aSymbol->GetFields() )
|
||||
{
|
||||
if( !field.IsMandatory() )
|
||||
saveField( &field );
|
||||
}
|
||||
|
||||
// Unit number, position, box ( old standard )
|
||||
m_out->Print( 0, "\t%-4d %-4d %-4d\n", aSymbol->GetUnit(),
|
||||
@ -1808,7 +1814,7 @@ void SCH_IO_KICAD_LEGACY::saveField( SCH_FIELD* aField )
|
||||
aField->IsBold() ? 'B' : 'N' );
|
||||
|
||||
// Save field name, if the name is user definable
|
||||
if( aField->GetId() >= MANDATORY_FIELDS )
|
||||
if( !aField->IsMandatory() )
|
||||
m_out->Print( 0, " %s", EscapedUTF8( aField->GetName() ).c_str() );
|
||||
|
||||
m_out->Print( 0, "\n" );
|
||||
|
@ -215,11 +215,18 @@ void SCH_IO_KICAD_LEGACY_LIB_CACHE::loadDocs()
|
||||
LIB_SYMBOL_MAP::iterator it = m_symbols.find( aliasName );
|
||||
|
||||
if( it == m_symbols.end() )
|
||||
{
|
||||
wxLogWarning( "Symbol '%s' not found in library:\n\n"
|
||||
"'%s'\n\nat line %d offset %d", aliasName, fn.GetFullPath(),
|
||||
reader.LineNumber(), (int) (line - reader.Line() ) );
|
||||
"'%s'\n\nat line %d offset %d",
|
||||
aliasName,
|
||||
fn.GetFullPath(),
|
||||
reader.LineNumber(),
|
||||
(int) (line - reader.Line() ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
symbol = it->second;
|
||||
}
|
||||
|
||||
// Read the current alias associated doc.
|
||||
// if the alias does not exist, just skip the description
|
||||
@ -499,20 +506,20 @@ void SCH_IO_KICAD_LEGACY_LIB_CACHE::loadAliases( std::unique_ptr<LIB_SYMBOL>& aS
|
||||
LIB_SYMBOL* newSymbol = new LIB_SYMBOL( newAliasName );
|
||||
|
||||
// Inherit the parent mandatory field attributes.
|
||||
for( int id = 0; id < MANDATORY_FIELDS; ++id )
|
||||
for( int fieldId : MANDATORY_FIELDS )
|
||||
{
|
||||
SCH_FIELD* field = newSymbol->GetFieldById( id );
|
||||
SCH_FIELD* field = newSymbol->GetFieldById( fieldId );
|
||||
|
||||
// the MANDATORY_FIELDS are exactly that in RAM.
|
||||
// the MANDATORY_FIELD_COUNT are exactly that in RAM.
|
||||
wxASSERT( field );
|
||||
|
||||
SCH_FIELD* parentField = aSymbol->GetFieldById( id );
|
||||
SCH_FIELD* parentField = aSymbol->GetFieldById( fieldId );
|
||||
|
||||
wxASSERT( parentField );
|
||||
|
||||
*field = *parentField;
|
||||
|
||||
if( id == VALUE_FIELD )
|
||||
if( fieldId == VALUE_FIELD )
|
||||
field->SetText( newAliasName );
|
||||
|
||||
field->SetParent( newSymbol );
|
||||
@ -662,7 +669,7 @@ void SCH_IO_KICAD_LEGACY_LIB_CACHE::loadField( std::unique_ptr<LIB_SYMBOL>& aSym
|
||||
}
|
||||
|
||||
// Fields in RAM must always have names.
|
||||
if( id >= 0 && id < MANDATORY_FIELDS )
|
||||
if( field->IsMandatory() )
|
||||
{
|
||||
// Fields in RAM must always have names, because we are trying to get
|
||||
// less dependent on field ids and more dependent on names.
|
||||
@ -1525,22 +1532,28 @@ void SCH_IO_KICAD_LEGACY_LIB_CACHE::SaveSymbol( LIB_SYMBOL* aSymbol, OUTPUTFORMA
|
||||
// may have their own save policy so there is a separate loop for them.
|
||||
// Empty fields are saved, because the user may have set visibility,
|
||||
// size and orientation
|
||||
for( int i = 0; i < MANDATORY_FIELDS; ++i )
|
||||
saveField( fields[i], aFormatter );
|
||||
for( SCH_FIELD* field : fields )
|
||||
{
|
||||
if( field->IsMandatory() )
|
||||
saveField( field, aFormatter );
|
||||
}
|
||||
|
||||
// User defined fields:
|
||||
// may have their own save policy so there is a separate loop for them.
|
||||
int fieldId = MANDATORY_FIELDS; // really wish this would go away.
|
||||
int fieldId = MANDATORY_FIELD_COUNT; // really wish this would go away.
|
||||
|
||||
for( unsigned i = MANDATORY_FIELDS; i < fields.size(); ++i )
|
||||
for( SCH_FIELD* field : fields )
|
||||
{
|
||||
if( field->IsMandatory() )
|
||||
continue;
|
||||
|
||||
// There is no need to save empty fields, i.e. no reason to preserve field
|
||||
// names now that fields names come in dynamically through the template
|
||||
// fieldnames.
|
||||
if( !fields[i]->GetText().IsEmpty() )
|
||||
if( !field->GetText().IsEmpty() )
|
||||
{
|
||||
fields[i]->SetId( fieldId++ );
|
||||
saveField( fields[i], aFormatter );
|
||||
field->SetId( fieldId++ );
|
||||
saveField( field, aFormatter );
|
||||
}
|
||||
}
|
||||
|
||||
@ -1719,7 +1732,7 @@ void SCH_IO_KICAD_LEGACY_LIB_CACHE::saveField( const SCH_FIELD* aField,
|
||||
|
||||
// Translated names were stored in legacy files, so it's important not to save the
|
||||
// default names as they weren't yet canonical.
|
||||
if( id >= MANDATORY_FIELDS
|
||||
if( !aField->IsMandatory()
|
||||
&& !aField->GetName().IsEmpty()
|
||||
&& aField->GetName() != GetUserFieldName( id, !DO_TRANSLATE ) )
|
||||
{
|
||||
|
@ -92,7 +92,7 @@ void SCH_IO_KICAD_SEXPR::init( SCHEMATIC* aSchematic, const std::map<std::string
|
||||
m_schematic = aSchematic;
|
||||
m_cache = nullptr;
|
||||
m_out = nullptr;
|
||||
m_nextFreeFieldId = 100; // number arbitrarily > MANDATORY_FIELDS or SHEET_MANDATORY_FIELDS
|
||||
m_nextFreeFieldId = 100; // number arbitrarily > MANDATORY_FIELD_COUNT or SHEET_MANDATORY_FIELD_COUNT
|
||||
}
|
||||
|
||||
|
||||
@ -741,7 +741,7 @@ void SCH_IO_KICAD_SEXPR::saveSymbol( SCH_SYMBOL* aSymbol, const SCHEMATIC& aSche
|
||||
|
||||
KICAD_FORMAT::FormatUuid( m_out, aSymbol->m_Uuid );
|
||||
|
||||
m_nextFreeFieldId = MANDATORY_FIELDS;
|
||||
m_nextFreeFieldId = MANDATORY_FIELD_COUNT;
|
||||
|
||||
for( SCH_FIELD& field : aSymbol->GetFields() )
|
||||
{
|
||||
@ -1016,7 +1016,7 @@ void SCH_IO_KICAD_SEXPR::saveSheet( SCH_SHEET* aSheet, const SCH_SHEET_LIST& aSh
|
||||
|
||||
KICAD_FORMAT::FormatUuid( m_out, aSheet->m_Uuid );
|
||||
|
||||
m_nextFreeFieldId = SHEET_MANDATORY_FIELDS;
|
||||
m_nextFreeFieldId = SHEET_MANDATORY_FIELD_COUNT;
|
||||
|
||||
for( SCH_FIELD& field : aSheet->GetFields() )
|
||||
saveField( &field );
|
||||
|
@ -149,7 +149,7 @@ void SCH_IO_KICAD_SEXPR_LIB_CACHE::SaveSymbol( LIB_SYMBOL* aSymbol, OUTPUTFORMAT
|
||||
else
|
||||
aSymbol->GetEmbeddedFiles()->ClearEmbeddedFonts();
|
||||
|
||||
int nextFreeFieldId = MANDATORY_FIELDS;
|
||||
int nextFreeFieldId = MANDATORY_FIELD_COUNT;
|
||||
std::vector<SCH_FIELD*> fields;
|
||||
std::string name = aFormatter.Quotew( aSymbol->GetLibId().GetLibItemName().wx_str() );
|
||||
std::string unitName = aSymbol->GetLibId().GetLibItemName();
|
||||
|
@ -314,8 +314,8 @@ LIB_SYMBOL* SCH_IO_KICAD_SEXPR_PARSER::parseLibSymbol( LIB_SYMBOL_MAP& aSymbolLi
|
||||
// Make sure the mandatory field IDs are reserved as already read,
|
||||
// the field parser will set the field IDs to the correct value if
|
||||
// the field name matches a mandatory field name
|
||||
for( int i = 0; i < MANDATORY_FIELDS; i++ )
|
||||
m_fieldIDsRead.insert( i );
|
||||
for( int fieldId : MANDATORY_FIELDS )
|
||||
m_fieldIDsRead.insert( fieldId );
|
||||
|
||||
token = NextTok();
|
||||
|
||||
@ -957,7 +957,7 @@ SCH_FIELD* SCH_IO_KICAD_SEXPR_PARSER::parseProperty( std::unique_ptr<LIB_SYMBOL>
|
||||
|
||||
wxString name;
|
||||
wxString value;
|
||||
auto field = std::make_unique<SCH_FIELD>( aSymbol.get(), MANDATORY_FIELDS );
|
||||
auto field = std::make_unique<SCH_FIELD>( aSymbol.get(), aSymbol->GetNextAvailableFieldId() );
|
||||
|
||||
// By default, fieds are visible.
|
||||
// Invisible fields have the hide style or keyword specified in file
|
||||
@ -989,11 +989,11 @@ SCH_FIELD* SCH_IO_KICAD_SEXPR_PARSER::parseProperty( std::unique_ptr<LIB_SYMBOL>
|
||||
|
||||
// Correctly set the ID based on canonical (untranslated) field name
|
||||
// If ID is stored in the file (old versions), it will overwrite this
|
||||
for( int ii = 0; ii < MANDATORY_FIELDS; ++ii )
|
||||
for( int fieldId : MANDATORY_FIELDS )
|
||||
{
|
||||
if( !name.CmpNoCase( GetCanonicalFieldName( ii ) ) )
|
||||
if( name.CmpNoCase( GetCanonicalFieldName( fieldId ) ) == 0 )
|
||||
{
|
||||
field->SetId( ii );
|
||||
field->SetId( fieldId );
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1025,8 +1025,8 @@ SCH_FIELD* SCH_IO_KICAD_SEXPR_PARSER::parseProperty( std::unique_ptr<LIB_SYMBOL>
|
||||
{
|
||||
int id = parseInt( "field ID" );
|
||||
|
||||
// Only set an ID that isn't a MANDATORY_FIELDS ID
|
||||
if( id >= MANDATORY_FIELDS )
|
||||
// Only set an ID that isn't a MANDATORY_FIELD ID
|
||||
if( id >= MANDATORY_FIELD_COUNT )
|
||||
field->SetId( id );
|
||||
|
||||
NeedRIGHT();
|
||||
@ -1064,7 +1064,7 @@ SCH_FIELD* SCH_IO_KICAD_SEXPR_PARSER::parseProperty( std::unique_ptr<LIB_SYMBOL>
|
||||
|
||||
// Due to an bug when in #LIB_SYMBOL::Flatten, duplicate ids slipped through when writing
|
||||
// files. This section replaces duplicate #SCH_FIELD indices on load.
|
||||
if( ( field->GetId() >= MANDATORY_FIELDS ) && m_fieldIDsRead.count( field->GetId() ) )
|
||||
if( ( field->GetId() >= MANDATORY_FIELD_COUNT ) && m_fieldIDsRead.count( field->GetId() ) )
|
||||
{
|
||||
int nextAvailableId = field->GetId() + 1;
|
||||
|
||||
@ -2214,15 +2214,14 @@ SCH_FIELD* SCH_IO_KICAD_SEXPR_PARSER::parseSchField( SCH_ITEM* aParent )
|
||||
// Empty property values are valid.
|
||||
wxString value = FromUTF8();
|
||||
|
||||
int mandatoryFieldCount = 0;
|
||||
int nextFieldId = 0;
|
||||
|
||||
if( aParent->Type() == SCH_SYMBOL_T )
|
||||
mandatoryFieldCount = MANDATORY_FIELDS;
|
||||
nextFieldId = MANDATORY_FIELD_COUNT;
|
||||
else if( aParent->Type() == SCH_SHEET_T )
|
||||
mandatoryFieldCount = SHEET_MANDATORY_FIELDS;
|
||||
nextFieldId = SHEET_MANDATORY_FIELD_COUNT;
|
||||
|
||||
std::unique_ptr<SCH_FIELD> field = std::make_unique<SCH_FIELD>( VECTOR2I( -1, -1 ),
|
||||
mandatoryFieldCount,
|
||||
std::unique_ptr<SCH_FIELD> field = std::make_unique<SCH_FIELD>( VECTOR2I( -1, -1 ), nextFieldId,
|
||||
aParent, name );
|
||||
field->SetText( value );
|
||||
field->SetVisible( true );
|
||||
@ -2232,11 +2231,11 @@ SCH_FIELD* SCH_IO_KICAD_SEXPR_PARSER::parseSchField( SCH_ITEM* aParent )
|
||||
// If ID is stored in the file (old versions), it will overwrite this
|
||||
if( aParent->Type() == SCH_SYMBOL_T )
|
||||
{
|
||||
for( int ii = 0; ii < MANDATORY_FIELDS; ++ii )
|
||||
for( int fieldId : MANDATORY_FIELDS )
|
||||
{
|
||||
if( name == GetCanonicalFieldName( ii ) )
|
||||
if( name == GetCanonicalFieldName( fieldId ) )
|
||||
{
|
||||
field->SetId( ii );
|
||||
field->SetId( fieldId );
|
||||
field->SetPrivate( false );
|
||||
break;
|
||||
}
|
||||
@ -2244,26 +2243,21 @@ SCH_FIELD* SCH_IO_KICAD_SEXPR_PARSER::parseSchField( SCH_ITEM* aParent )
|
||||
}
|
||||
else if( aParent->Type() == SCH_SHEET_T )
|
||||
{
|
||||
for( int ii = 0; ii < SHEET_MANDATORY_FIELDS; ++ii )
|
||||
for( int fieldId : SHEET_MANDATORY_FIELDS )
|
||||
{
|
||||
if( name == SCH_SHEET::GetDefaultFieldName( ii, !DO_TRANSLATE ) )
|
||||
if( name == SCH_SHEET::GetDefaultFieldName( fieldId, !DO_TRANSLATE ) )
|
||||
{
|
||||
field->SetId( ii );
|
||||
field->SetId( fieldId );
|
||||
field->SetPrivate( false );
|
||||
break;
|
||||
}
|
||||
// Legacy support for old field names
|
||||
else if( !name.CmpNoCase( wxT( "Sheet name" ) ) )
|
||||
{
|
||||
field->SetId( SHEETNAME );
|
||||
break;
|
||||
}
|
||||
else if( !name.CmpNoCase( wxT( "Sheet file" ) ) )
|
||||
{
|
||||
field->SetId( SHEETFILENAME );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Legacy support for old field names
|
||||
if( name.CmpNoCase( wxT( "Sheet name" ) ) == 0 )
|
||||
field->SetId( SHEETNAME );
|
||||
else if( name.CmpNoCase( wxT( "Sheet file" ) ) == 0 )
|
||||
field->SetId( SHEETFILENAME );
|
||||
}
|
||||
|
||||
for( token = NextTok(); token != T_RIGHT; token = NextTok() )
|
||||
@ -2281,7 +2275,7 @@ SCH_FIELD* SCH_IO_KICAD_SEXPR_PARSER::parseSchField( SCH_ITEM* aParent )
|
||||
int id = parseInt( "field ID" );
|
||||
|
||||
// Only set an ID that isn't a mandatory field ID
|
||||
if( id >= mandatoryFieldCount )
|
||||
if( id >= nextFieldId )
|
||||
field->SetId( id );
|
||||
|
||||
NeedRIGHT();
|
||||
@ -2974,8 +2968,8 @@ SCH_SYMBOL* SCH_IO_KICAD_SEXPR_PARSER::parseSchematicSymbol()
|
||||
// Make sure the mandatory field IDs are reserved as already read,
|
||||
// the field parser will set the field IDs to the correct value if
|
||||
// the field name matches a mandatory field name
|
||||
for( int i = 0; i < MANDATORY_FIELDS; i++ )
|
||||
m_fieldIDsRead.insert( i );
|
||||
for( int fieldId : MANDATORY_FIELDS )
|
||||
m_fieldIDsRead.insert( fieldId );
|
||||
|
||||
for( token = NextTok(); token != T_RIGHT; token = NextTok() )
|
||||
{
|
||||
@ -3258,7 +3252,7 @@ SCH_SYMBOL* SCH_IO_KICAD_SEXPR_PARSER::parseSchematicSymbol()
|
||||
break;
|
||||
}
|
||||
|
||||
if( ( field->GetId() >= MANDATORY_FIELDS ) && m_fieldIDsRead.count( field->GetId() ) )
|
||||
if( ( field->GetId() >= MANDATORY_FIELD_COUNT ) && m_fieldIDsRead.count( field->GetId() ) )
|
||||
{
|
||||
int nextAvailableId = field->GetId() + 1;
|
||||
|
||||
@ -3531,7 +3525,7 @@ SCH_SHEET* SCH_IO_KICAD_SEXPR_PARSER::parseSheet()
|
||||
// the first available ID after the mandatory fields
|
||||
|
||||
if( field->GetId() < 0 )
|
||||
field->SetId( SHEET_MANDATORY_FIELDS );
|
||||
field->SetId( SHEET_MANDATORY_FIELD_COUNT );
|
||||
|
||||
while( !fieldIDsRead.insert( field->GetId() ).second )
|
||||
field->SetId( field->GetId() + 1 );
|
||||
|
@ -669,7 +669,12 @@ void SCH_LABEL_BASE::GetIntersheetRefs( const SCH_SHEET_PATH* aPath,
|
||||
void SCH_LABEL_BASE::GetContextualTextVars( wxArrayString* aVars ) const
|
||||
{
|
||||
for( const SCH_FIELD& field : m_fields )
|
||||
aVars->push_back( field.GetCanonicalName().Upper() );
|
||||
{
|
||||
if( field.IsMandatory() )
|
||||
aVars->push_back( field.GetCanonicalName().Upper() );
|
||||
else
|
||||
aVars->push_back( field.GetName() );
|
||||
}
|
||||
|
||||
aVars->push_back( wxT( "OP" ) );
|
||||
aVars->push_back( wxT( "CONNECTION_TYPE" ) );
|
||||
|
@ -265,20 +265,14 @@ bool SCH_SHEET::ResolveTextVar( const SCH_SHEET_PATH* aPath, wxString* token, in
|
||||
return true;
|
||||
}
|
||||
|
||||
for( int i = 0; i < SHEET_MANDATORY_FIELDS; ++i )
|
||||
for( const SCH_FIELD& field : m_fields )
|
||||
{
|
||||
if( token->IsSameAs( m_fields[i].GetCanonicalName().Upper() ) )
|
||||
{
|
||||
*token = m_fields[i].GetShownText( aPath, false, aDepth + 1 );
|
||||
return true;
|
||||
}
|
||||
}
|
||||
wxString fieldName = field.IsMandatory() ? field.GetCanonicalName().Upper()
|
||||
: field.GetName();
|
||||
|
||||
for( size_t i = SHEET_MANDATORY_FIELDS; i < m_fields.size(); ++i )
|
||||
{
|
||||
if( token->IsSameAs( m_fields[i].GetName() ) )
|
||||
if( token->IsSameAs( fieldName ) )
|
||||
{
|
||||
*token = m_fields[i].GetShownText( aPath, false, aDepth + 1 );
|
||||
*token = field.GetShownText( aPath, false, aDepth + 1 );
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -417,8 +411,11 @@ void SCH_SHEET::SetFields( const std::vector<SCH_FIELD>& aFields )
|
||||
} );
|
||||
|
||||
// After mandatory fields, the rest should be sequential user fields
|
||||
for( int ii = SHEET_MANDATORY_FIELDS; ii < static_cast<int>( m_fields.size() ); ++ii )
|
||||
m_fields[ii].SetId( ii );
|
||||
for( int ii = 0; ii < static_cast<int>( m_fields.size() ); ++ii )
|
||||
{
|
||||
if( !m_fields[ii].IsMandatory() )
|
||||
m_fields[ii].SetId( ii );
|
||||
}
|
||||
|
||||
// Make sure that we get the UNIX variant of the file path
|
||||
SetFileName( m_fields[SHEETFILENAME].GetText() );
|
||||
|
@ -46,9 +46,11 @@ enum SHEET_FIELD_TYPE
|
||||
SHEETFILENAME,
|
||||
|
||||
/// The first 2 are mandatory, and must be instantiated in SCH_SHEET
|
||||
SHEET_MANDATORY_FIELDS
|
||||
SHEET_MANDATORY_FIELD_COUNT
|
||||
};
|
||||
|
||||
#define SHEET_MANDATORY_FIELDS { SHEETNAME, SHEETFILENAME }
|
||||
|
||||
|
||||
/**
|
||||
* Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
|
||||
|
@ -975,11 +975,14 @@ SCH_FIELD* SCH_SYMBOL::AddField( const SCH_FIELD& aField )
|
||||
|
||||
void SCH_SYMBOL::RemoveField( const wxString& aFieldName )
|
||||
{
|
||||
for( unsigned i = MANDATORY_FIELDS; i < m_fields.size(); ++i )
|
||||
for( unsigned ii = 0; ii < m_fields.size(); ++ii )
|
||||
{
|
||||
if( aFieldName == m_fields[i].GetName( false ) )
|
||||
if( m_fields[ii].IsMandatory() )
|
||||
continue;
|
||||
|
||||
if( aFieldName == m_fields[ii].GetName( false ) )
|
||||
{
|
||||
m_fields.erase( m_fields.begin() + i );
|
||||
m_fields.erase( m_fields.begin() + ii );
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -989,19 +992,20 @@ void SCH_SYMBOL::RemoveField( const wxString& aFieldName )
|
||||
SCH_FIELD* SCH_SYMBOL::FindField( const wxString& aFieldName, bool aIncludeDefaultFields,
|
||||
bool aCaseInsensitive )
|
||||
{
|
||||
unsigned start = aIncludeDefaultFields ? 0 : MANDATORY_FIELDS;
|
||||
|
||||
for( unsigned i = start; i < m_fields.size(); ++i )
|
||||
for( SCH_FIELD& field : m_fields )
|
||||
{
|
||||
if( field.IsMandatory() && !aIncludeDefaultFields )
|
||||
continue;
|
||||
|
||||
if( aCaseInsensitive )
|
||||
{
|
||||
if( aFieldName.Upper() == m_fields[i].GetName( false ).Upper() )
|
||||
return &m_fields[i];
|
||||
if( aFieldName.Upper() == field.GetName( false ).Upper() )
|
||||
return &field;
|
||||
}
|
||||
else
|
||||
{
|
||||
if( aFieldName == m_fields[i].GetName( false ) )
|
||||
return &m_fields[i];
|
||||
if( aFieldName == field.GetName( false ) )
|
||||
return &field;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1032,8 +1036,8 @@ void SCH_SYMBOL::UpdateFields( const SCH_SHEET_PATH* aPath, bool aUpdateStyle, b
|
||||
|
||||
if( !schField )
|
||||
{
|
||||
wxString fieldName = libField->GetCanonicalName();
|
||||
SCH_FIELD newField( VECTOR2I( 0, 0 ), GetFieldCount(), this, fieldName );
|
||||
SCH_FIELD newField( VECTOR2I( 0, 0 ), GetNextFieldId(), this,
|
||||
libField->GetCanonicalName() );
|
||||
schField = AddField( newField );
|
||||
}
|
||||
}
|
||||
@ -1357,11 +1361,16 @@ void SCH_SYMBOL::SwapData( SCH_ITEM* aItem )
|
||||
|
||||
void SCH_SYMBOL::GetContextualTextVars( wxArrayString* aVars ) const
|
||||
{
|
||||
for( int i = 0; i < MANDATORY_FIELDS; ++i )
|
||||
aVars->push_back( m_fields[i].GetCanonicalName().Upper() );
|
||||
for( const SCH_FIELD& field : m_fields )
|
||||
{
|
||||
if( field.IsPrivate() )
|
||||
continue;
|
||||
|
||||
for( size_t i = MANDATORY_FIELDS; i < m_fields.size(); ++i )
|
||||
aVars->push_back( m_fields[i].GetName() );
|
||||
if( field.IsMandatory() )
|
||||
aVars->push_back( field.GetCanonicalName().Upper() );
|
||||
else
|
||||
aVars->push_back( field.GetName() );
|
||||
}
|
||||
|
||||
aVars->push_back( wxT( "OP" ) );
|
||||
aVars->push_back( wxT( "FOOTPRINT_LIBRARY" ) );
|
||||
@ -1471,47 +1480,30 @@ bool SCH_SYMBOL::ResolveTextVar( const SCH_SHEET_PATH* aPath, wxString* token, i
|
||||
|
||||
wxString upperToken = token->Upper();
|
||||
|
||||
for( int i = 0; i < MANDATORY_FIELDS; ++i )
|
||||
for( const SCH_FIELD& field : m_fields )
|
||||
{
|
||||
wxString field = m_fields[i].GetCanonicalName();
|
||||
wxString fieldName = field.IsMandatory() ? field.GetCanonicalName()
|
||||
: field.GetName();
|
||||
|
||||
wxString textToken = m_fields[i].GetText();
|
||||
wxString textToken = field.GetText();
|
||||
textToken.Replace( " ", wxEmptyString );
|
||||
wxString tokenString = "${" + field + "}";
|
||||
wxString tokenString = "${" + fieldName + "}";
|
||||
|
||||
// If the field data is just a reference to the field, don't resolve
|
||||
if( textToken.IsSameAs( tokenString, false ) )
|
||||
return true;
|
||||
|
||||
if( token->IsSameAs( field, false ) )
|
||||
if( token->IsSameAs( fieldName, false ) )
|
||||
{
|
||||
if( i == REFERENCE_FIELD )
|
||||
if( field.GetId() == REFERENCE_FIELD )
|
||||
*token = GetRef( aPath, true );
|
||||
else
|
||||
*token = m_fields[ i ].GetShownText( aPath, false, aDepth + 1 );
|
||||
*token = field.GetShownText( aPath, false, aDepth + 1 );
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
for( size_t i = MANDATORY_FIELDS; i < m_fields.size(); ++i )
|
||||
{
|
||||
wxString field = m_fields[ i ].GetName();
|
||||
|
||||
wxString textToken = m_fields[i].GetText();
|
||||
textToken.Replace( " ", wxEmptyString );
|
||||
wxString tokenString = "${" + field + "}";
|
||||
|
||||
if( textToken.IsSameAs( tokenString, false ) )
|
||||
return true;
|
||||
|
||||
if( token->IsSameAs( field, false ) )
|
||||
{
|
||||
*token = m_fields[ i ].GetShownText( aPath, false, aDepth + 1 );
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Consider missing simulation fields as empty, not un-resolved
|
||||
if( token->IsSameAs( wxT( "SIM.DEVICE" ) )
|
||||
|| token->IsSameAs( wxT( "SIM.TYPE" ) )
|
||||
@ -2481,9 +2473,12 @@ bool SCH_SYMBOL::operator==( const SCH_SYMBOL& aSymbol ) const
|
||||
if( GetFieldCount() != aSymbol.GetFieldCount() )
|
||||
return false;
|
||||
|
||||
for( int i = VALUE_FIELD; i < GetFieldCount(); i++ )
|
||||
for( int ii = 0; ii < GetFieldCount(); ii++ )
|
||||
{
|
||||
if( GetFields()[i].GetText().Cmp( aSymbol.GetFields()[i].GetText() ) != 0 )
|
||||
if( ii == REFERENCE_FIELD )
|
||||
continue;
|
||||
|
||||
if( GetFields()[ii].GetText().Cmp( aSymbol.GetFields()[ii].GetText() ) != 0 )
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -571,7 +571,9 @@ public:
|
||||
/**
|
||||
* Return the number of fields in this symbol.
|
||||
*/
|
||||
int GetFieldCount() const { return (int)m_fields.size(); }
|
||||
int GetFieldCount() const { return (int )m_fields.size(); }
|
||||
|
||||
int GetNextFieldId() const { return (int) m_fields.size(); }
|
||||
|
||||
/**
|
||||
* Automatically orient all the fields in the symbol.
|
||||
|
@ -474,7 +474,7 @@ void SIM_MODEL::WriteFields( std::vector<SCH_FIELD>& aFields ) const
|
||||
if( IsStoredInValue() )
|
||||
SetFieldValue( aFields, SIM_VALUE_FIELD, m_serializer->GenerateValue(), false );
|
||||
|
||||
int lastFreeId = MANDATORY_FIELDS;
|
||||
int lastFreeId = MANDATORY_FIELD_COUNT;
|
||||
|
||||
// Search for the first available value:
|
||||
for( auto& fld : aFields )
|
||||
|
@ -433,20 +433,20 @@ void SYMBOL_EDIT_FRAME::CreateNewSymbol( const wxString& aInheritFrom )
|
||||
new_symbol.SetParent( parent );
|
||||
|
||||
// Inherit the parent mandatory field attributes.
|
||||
for( int id = 0; id < MANDATORY_FIELDS; ++id )
|
||||
for( int fieldId : MANDATORY_FIELDS )
|
||||
{
|
||||
SCH_FIELD* field = new_symbol.GetFieldById( id );
|
||||
SCH_FIELD* field = new_symbol.GetFieldById( fieldId );
|
||||
|
||||
// the MANDATORY_FIELDS are exactly that in RAM.
|
||||
// the MANDATORY_FIELD_COUNT are exactly that in RAM.
|
||||
wxCHECK( field, /* void */ );
|
||||
|
||||
SCH_FIELD* parentField = parent->GetFieldById( id );
|
||||
SCH_FIELD* parentField = parent->GetFieldById( fieldId );
|
||||
|
||||
wxCHECK( parentField, /* void */ );
|
||||
|
||||
*field = *parentField;
|
||||
|
||||
switch( id )
|
||||
switch( fieldId )
|
||||
{
|
||||
case REFERENCE_FIELD:
|
||||
// parent's reference already copied
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user