mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-04-21 08:21:39 +00:00
Clean up fields autoplacement control architecture.
Also adds a mode for AUTOADDED fields. Also fixes a couple of bugs where a manual-level autoplaced symbol would get reset back to auto-level when autoplaced.
This commit is contained in:
parent
59f6ffc05d
commit
eee28aa06a
eeschema
autoplace_fields.cppsch_item.cppsch_item.hsch_label.cppsch_label.hsch_sheet.cppsch_sheet.hsch_sheet_path.cppsch_symbol.hschematic.cpp
dialogs
dialog_change_symbols.cppdialog_field_properties.cppdialog_label_properties.cppdialog_sheet_properties.cpppanel_eeschema_color_settings.cpp
picksymbol.cppsch_edit_frame.cppsch_io
altium
cadstar
eagle
kicad_legacy
kicad_sexpr
ltspice
tools
widgets
qa/tests/eeschema
@ -133,27 +133,28 @@ public:
|
||||
* @param aManual - if true, use extra heuristics for smarter placement when manually
|
||||
* called up.
|
||||
*/
|
||||
void DoAutoplace( bool aManual )
|
||||
void DoAutoplace( AUTOPLACE_ALGO aAlgo )
|
||||
{
|
||||
bool forceWireSpacing = false;
|
||||
SIDE_AND_NPINS sideandpins = chooseSideForFields( aManual );
|
||||
SIDE_AND_NPINS sideandpins = chooseSideForFields( aAlgo == AUTOPLACE_MANUAL );
|
||||
SIDE field_side = sideandpins.side;
|
||||
VECTOR2I fbox_pos = fieldBoxPlacement( sideandpins );
|
||||
BOX2I field_box( fbox_pos, m_fbox_size );
|
||||
|
||||
if( aManual )
|
||||
if( aAlgo == AUTOPLACE_MANUAL )
|
||||
forceWireSpacing = fitFieldsBetweenWires( &field_box, field_side );
|
||||
|
||||
// Move the fields
|
||||
int last_y_coord = field_box.GetTop();
|
||||
|
||||
for( unsigned field_idx = 0; field_idx < m_fields.size(); ++field_idx )
|
||||
for( SCH_FIELD* field : m_fields )
|
||||
{
|
||||
SCH_FIELD* field = m_fields[field_idx];
|
||||
|
||||
if( !field->IsVisible() || !field->CanAutoplace() )
|
||||
continue;
|
||||
|
||||
if( aAlgo == AUTOPLACE_AUTOADDED && !field->IsAutoAdded() )
|
||||
continue;
|
||||
|
||||
if( m_allow_rejustify )
|
||||
{
|
||||
if( sideandpins.pins > 0 )
|
||||
@ -727,12 +728,18 @@ const AUTOPLACER::SIDE AUTOPLACER::SIDE_LEFT( -1, 0 );
|
||||
const AUTOPLACER::SIDE AUTOPLACER::SIDE_RIGHT( 1, 0 );
|
||||
|
||||
|
||||
void SCH_SYMBOL::AutoplaceFields( SCH_SCREEN* aScreen, bool aManual )
|
||||
void SCH_SYMBOL::AutoplaceFields( SCH_SCREEN* aScreen, AUTOPLACE_ALGO aAlgo )
|
||||
{
|
||||
if( aManual )
|
||||
if( aAlgo == AUTOPLACE_MANUAL )
|
||||
wxASSERT_MSG( aScreen, wxS( "A SCH_SCREEN pointer must be given for manual autoplacement" ) );
|
||||
|
||||
AUTOPLACER autoplacer( this, aScreen );
|
||||
autoplacer.DoAutoplace( aManual );
|
||||
m_fieldsAutoplaced = ( aManual ? FIELDS_AUTOPLACED_MANUAL : FIELDS_AUTOPLACED_AUTO );
|
||||
autoplacer.DoAutoplace( aAlgo );
|
||||
|
||||
if( aAlgo == AUTOPLACE_AUTO )
|
||||
m_fieldsAutoplaced = AUTOPLACE_AUTO;
|
||||
else if( aAlgo == AUTOPLACE_MANUAL )
|
||||
m_fieldsAutoplaced = AUTOPLACE_MANUAL;
|
||||
else if( aAlgo == AUTOPLACE_AUTOADDED )
|
||||
/* leave m_fieldsAutoplaced as it is */;
|
||||
}
|
||||
|
@ -759,14 +759,24 @@ int DIALOG_CHANGE_SYMBOLS::processSymbols( SCH_COMMIT* aCommit,
|
||||
}
|
||||
|
||||
if( resetPositions && frame->eeconfig()->m_AutoplaceFields.enable )
|
||||
symbol->AutoAutoplaceFields( screen );
|
||||
{
|
||||
AUTOPLACE_ALGO fieldsAutoplaced = symbol->GetFieldsAutoplaced();
|
||||
|
||||
if( fieldsAutoplaced == AUTOPLACE_AUTO || fieldsAutoplaced == AUTOPLACE_MANUAL )
|
||||
symbol->AutoplaceFields( screen, fieldsAutoplaced );
|
||||
}
|
||||
}
|
||||
|
||||
symbol->SetSchSymbolLibraryName( wxEmptyString );
|
||||
screen->Append( symbol );
|
||||
|
||||
if( resetPositions )
|
||||
symbol->AutoAutoplaceFields( screen );
|
||||
{
|
||||
AUTOPLACE_ALGO fieldsAutoplaced = symbol->GetFieldsAutoplaced();
|
||||
|
||||
if( fieldsAutoplaced == AUTOPLACE_AUTO || fieldsAutoplaced == AUTOPLACE_MANUAL )
|
||||
symbol->AutoplaceFields( screen, fieldsAutoplaced );
|
||||
}
|
||||
|
||||
frame->GetCanvas()->GetView()->Update( symbol );
|
||||
|
||||
|
@ -697,7 +697,7 @@ void DIALOG_FIELD_PROPERTIES::UpdateField( SCH_COMMIT* aCommit, SCH_FIELD* aFiel
|
||||
}
|
||||
|
||||
if( positioningModified && parent )
|
||||
parent->ClearFieldsAutoplaced();
|
||||
parent->SetFieldsAutoplaced( AUTOPLACE_NONE );
|
||||
|
||||
//Update the hierarchy navigator labels if needed
|
||||
if( needUpdateHierNav )
|
||||
|
@ -462,8 +462,6 @@ bool DIALOG_LABEL_PROPERTIES::TransferDataFromWindow()
|
||||
m_currentLabel->SetText( text );
|
||||
}
|
||||
|
||||
bool doAutoplace = false;
|
||||
|
||||
// change all field positions from relative to absolute
|
||||
for( SCH_FIELD& field : *m_fields )
|
||||
{
|
||||
@ -491,9 +489,7 @@ bool DIALOG_LABEL_PROPERTIES::TransferDataFromWindow()
|
||||
}
|
||||
|
||||
if( positioningChanged( m_fields, m_currentLabel->GetFields() ) )
|
||||
m_currentLabel->ClearFieldsAutoplaced();
|
||||
else
|
||||
doAutoplace = true;
|
||||
m_currentLabel->SetFieldsAutoplaced( AUTOPLACE_NONE );
|
||||
|
||||
for( int ii = m_fields->GetNumberRows() - 1; ii >= 0; ii-- )
|
||||
{
|
||||
@ -583,8 +579,10 @@ bool DIALOG_LABEL_PROPERTIES::TransferDataFromWindow()
|
||||
m_currentLabel->SetSpinStyle( selectedSpinStyle );
|
||||
}
|
||||
|
||||
if( doAutoplace )
|
||||
m_currentLabel->AutoAutoplaceFields( m_Parent->GetScreen() );
|
||||
AUTOPLACE_ALGO fieldsAutoplaced = m_currentLabel->GetFieldsAutoplaced();
|
||||
|
||||
if( fieldsAutoplaced == AUTOPLACE_AUTO || fieldsAutoplaced == AUTOPLACE_MANUAL )
|
||||
m_currentLabel->AutoplaceFields( m_Parent->GetScreen(), fieldsAutoplaced );
|
||||
|
||||
if( !commit.Empty() )
|
||||
commit.Push( _( "Edit Label Properties" ) );
|
||||
|
@ -375,11 +375,11 @@ bool DIALOG_SHEET_PROPERTIES::TransferDataFromWindow()
|
||||
m_fields->at( SHEETNAME ).SetText( newSheetname );
|
||||
|
||||
// change all field positions from relative to absolute
|
||||
for( unsigned i = 0; i < m_fields->size(); ++i )
|
||||
m_fields->at( i ).Offset( m_sheet->GetPosition() );
|
||||
for( SCH_FIELD& m_field : *m_fields)
|
||||
m_field.Offset( m_sheet->GetPosition() );
|
||||
|
||||
if( positioningChanged( m_fields, m_sheet->GetFields() ) )
|
||||
m_sheet->ClearFieldsAutoplaced();
|
||||
m_sheet->SetFieldsAutoplaced( AUTOPLACE_NONE );
|
||||
|
||||
for( int ii = m_fields->GetNumberRows() - 1; ii >= SHEET_MANDATORY_FIELDS; ii-- )
|
||||
{
|
||||
|
@ -442,12 +442,12 @@ void PANEL_EESCHEMA_COLOR_SETTINGS::createPreviewItems()
|
||||
}
|
||||
|
||||
SCH_SHEET* s = new SCH_SHEET(
|
||||
/* aParent */ nullptr,
|
||||
/* aPosition */ MILS_POINT( 4000, 1300 ),
|
||||
/* aParent */ nullptr,
|
||||
/* aPosition */ MILS_POINT( 4000, 1300 ),
|
||||
/* aSize */ VECTOR2I( schIUScale.MilsToIU( 800 ), schIUScale.MilsToIU( 1300 ) ) );
|
||||
s->GetFields().at( SHEETNAME ).SetText( wxT( "SHEET" ) );
|
||||
s->GetFields().at( SHEETFILENAME ).SetText( _( "/path/to/sheet" ) );
|
||||
s->AutoplaceFields( nullptr, false );
|
||||
s->AutoplaceFields( nullptr, AUTOPLACE_AUTO );
|
||||
addItem( s );
|
||||
|
||||
SCH_SHEET_PIN* sp = new SCH_SHEET_PIN( s, MILS_POINT( 4500, 1500 ), wxT( "SHEET PIN" ) );
|
||||
@ -459,7 +459,7 @@ void PANEL_EESCHEMA_COLOR_SETTINGS::createPreviewItems()
|
||||
|
||||
if( sch_item && sch_item->IsConnectable() )
|
||||
{
|
||||
sch_item->AutoplaceFields( nullptr, false );
|
||||
sch_item->AutoplaceFields( nullptr, AUTOPLACE_AUTO );
|
||||
sch_item->GetEndPoints( endPointsByType );
|
||||
}
|
||||
}
|
||||
|
@ -166,7 +166,12 @@ void SCH_EDIT_FRAME::SelectUnit( SCH_SYMBOL* aSymbol, int aUnit )
|
||||
if( !commit.Empty() )
|
||||
{
|
||||
if( eeconfig()->m_AutoplaceFields.enable )
|
||||
aSymbol->AutoAutoplaceFields( GetScreen() );
|
||||
{
|
||||
AUTOPLACE_ALGO fieldsAutoplaced = aSymbol->GetFieldsAutoplaced();
|
||||
|
||||
if( fieldsAutoplaced == AUTOPLACE_AUTO || fieldsAutoplaced == AUTOPLACE_MANUAL )
|
||||
aSymbol->AutoplaceFields( GetScreen(), fieldsAutoplaced );
|
||||
}
|
||||
|
||||
commit.Push( _( "Change Unit" ) );
|
||||
}
|
||||
|
@ -1701,7 +1701,7 @@ void SCH_EDIT_FRAME::AutoRotateItem( SCH_SCREEN* aScreen, SCH_ITEM* aItem )
|
||||
SCH_LABEL_BASE* otherLabel = static_cast<SCH_LABEL_BASE*>( item );
|
||||
|
||||
if( otherLabel != label && otherLabel->GetText() == label->GetText() )
|
||||
otherLabel->AutoplaceFields( aScreen, false );
|
||||
otherLabel->AutoplaceFields( aScreen, AUTOPLACE_AUTO );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3614,7 +3614,7 @@ void SCH_IO_ALTIUM::ParsePort( const ASCH_PORT& aElem )
|
||||
break;
|
||||
}
|
||||
|
||||
label->AutoplaceFields( screen, false );
|
||||
label->AutoplaceFields( screen, AUTOPLACE_AUTO );
|
||||
|
||||
// Default "Sheet References" field should be hidden, at least for now
|
||||
if( label->GetFields().size() > 0 )
|
||||
|
@ -983,7 +983,7 @@ void CADSTAR_SCH_ARCHIVE_LOADER::loadSchematicSymbolInstances()
|
||||
SCH_SCREEN* screen = m_sheetMap.at( sym.LayerID )->GetScreen();
|
||||
|
||||
// autoplace intersheet refs
|
||||
netLabel->AutoplaceFields( screen, false );
|
||||
netLabel->AutoplaceFields( screen, AUTOPLACE_AUTO );
|
||||
|
||||
screen->Append( netLabel );
|
||||
m_globalLabelsMap.insert( { sym.ID, netLabel } );
|
||||
@ -1150,7 +1150,7 @@ void CADSTAR_SCH_ARCHIVE_LOADER::loadNets()
|
||||
SCH_SCREEN* screen = m_sheetMap.at( sheet )->GetScreen();
|
||||
|
||||
// autoplace intersheet refs again since we've changed the name
|
||||
m_globalLabelsMap.at( netTerm.SymbolID )->AutoplaceFields( screen, false );
|
||||
m_globalLabelsMap.at( netTerm.SymbolID )->AutoplaceFields( screen, AUTOPLACE_AUTO );
|
||||
}
|
||||
}
|
||||
else if( !net.Name.IsEmpty() && Schematic.Symbols.count( netTerm.SymbolID )
|
||||
@ -2513,7 +2513,7 @@ void CADSTAR_SCH_ARCHIVE_LOADER::loadSheetAndChildSheets( const LAYER_ID&
|
||||
wxString pageNumStr = wxString::Format( "%d", getSheetNumber( aCadstarSheetID ) );
|
||||
instance.SetPageNumber( pageNumStr );
|
||||
|
||||
sheet->AutoplaceFields( /* aScreen */ nullptr, /* aManual */ false );
|
||||
sheet->AutoplaceFields( nullptr, AUTOPLACE_AUTO );
|
||||
|
||||
m_sheetMap.insert( { aCadstarSheetID, sheet } );
|
||||
|
||||
|
@ -823,7 +823,7 @@ void SCH_IO_EAGLE::loadSheet( const std::unique_ptr<ESHEET>& aSheet )
|
||||
screen->SetFileName( fn.GetFullPath() );
|
||||
}
|
||||
|
||||
sheet->AutoplaceFields( screen, true );
|
||||
sheet->AutoplaceFields( screen, AUTOPLACE_AUTO );
|
||||
|
||||
if( aSheet->plain )
|
||||
{
|
||||
@ -947,7 +947,7 @@ void SCH_IO_EAGLE::loadSheet( const std::unique_ptr<ESHEET>& aSheet )
|
||||
// We don't read positions of Eagle label fields (primarily intersheet refs), so we
|
||||
// need to autoplace them after applying the translation.
|
||||
if( SCH_LABEL_BASE* label = dynamic_cast<SCH_LABEL_BASE*>( item ) )
|
||||
label->AutoplaceFields( screen, false );
|
||||
label->AutoplaceFields( screen, AUTOPLACE_AUTO );
|
||||
|
||||
item->ClearFlags();
|
||||
screen->Update( item );
|
||||
|
@ -632,7 +632,7 @@ SCH_SHEET* SCH_IO_KICAD_LEGACY::loadSheet( LINE_READER& aReader )
|
||||
}
|
||||
else if( strCompare( "$EndSheet", line ) )
|
||||
{
|
||||
sheet->AutoplaceFields( /* aScreen */ nullptr, /* aManual */ false );
|
||||
sheet->AutoplaceFields( nullptr, AUTOPLACE_AUTO );
|
||||
return sheet.release();
|
||||
}
|
||||
|
||||
|
@ -734,7 +734,9 @@ void SCH_IO_KICAD_SEXPR::saveSymbol( SCH_SYMBOL* aSymbol, const SCHEMATIC& aSche
|
||||
KICAD_FORMAT::FormatBool( m_out, "on_board", !aSymbol->GetExcludedFromBoard() );
|
||||
KICAD_FORMAT::FormatBool( m_out, "dnp", aSymbol->GetDNP() );
|
||||
|
||||
if( aSymbol->GetFieldsAutoplaced() != FIELDS_AUTOPLACED_NO )
|
||||
AUTOPLACE_ALGO fieldsAutoplaced = aSymbol->GetFieldsAutoplaced();
|
||||
|
||||
if( fieldsAutoplaced == AUTOPLACE_AUTO || fieldsAutoplaced == AUTOPLACE_MANUAL )
|
||||
KICAD_FORMAT::FormatBool( m_out, "fields_autoplaced", true );
|
||||
|
||||
KICAD_FORMAT::FormatUuid( m_out, aSymbol->m_Uuid );
|
||||
@ -996,7 +998,9 @@ void SCH_IO_KICAD_SEXPR::saveSheet( SCH_SHEET* aSheet, const SCH_SHEET_LIST& aSh
|
||||
KICAD_FORMAT::FormatBool( m_out, "on_board", !aSheet->GetExcludedFromBoard() );
|
||||
KICAD_FORMAT::FormatBool( m_out, "dnp", aSheet->GetDNP() );
|
||||
|
||||
if( aSheet->GetFieldsAutoplaced() != FIELDS_AUTOPLACED_NO )
|
||||
AUTOPLACE_ALGO fieldsAutoplaced = aSheet->GetFieldsAutoplaced();
|
||||
|
||||
if( fieldsAutoplaced == AUTOPLACE_AUTO || fieldsAutoplaced == AUTOPLACE_MANUAL )
|
||||
KICAD_FORMAT::FormatBool( m_out, "fields_autoplaced", true );
|
||||
|
||||
STROKE_PARAMS stroke( aSheet->GetBorderWidth(), LINE_STYLE::SOLID, aSheet->GetBorderColor() );
|
||||
@ -1323,8 +1327,13 @@ void SCH_IO_KICAD_SEXPR::saveText( SCH_TEXT* aText )
|
||||
EDA_UNIT_UTILS::FormatAngle( angle ).c_str() );
|
||||
}
|
||||
|
||||
if( label && !label->GetFields().empty() && label->GetFieldsAutoplaced() != FIELDS_AUTOPLACED_NO )
|
||||
KICAD_FORMAT::FormatBool( m_out, "fields_autoplaced", true );
|
||||
if( label && !label->GetFields().empty() )
|
||||
{
|
||||
AUTOPLACE_ALGO fieldsAutoplaced = label->GetFieldsAutoplaced();
|
||||
|
||||
if( fieldsAutoplaced == AUTOPLACE_AUTO || fieldsAutoplaced == AUTOPLACE_MANUAL )
|
||||
KICAD_FORMAT::FormatBool( m_out, "fields_autoplaced", true );
|
||||
}
|
||||
|
||||
aText->EDA_TEXT::Format( m_out, 0 );
|
||||
KICAD_FORMAT::FormatUuid( m_out, aText->m_Uuid );
|
||||
|
@ -2961,7 +2961,7 @@ SCH_SYMBOL* SCH_IO_KICAD_SEXPR_PARSER::parseSchematicSymbol()
|
||||
std::set<int> fieldIDsRead;
|
||||
|
||||
// We'll reset this if we find a fields_autoplaced token
|
||||
symbol->ClearFieldsAutoplaced();
|
||||
symbol->SetFieldsAutoplaced( AUTOPLACE_NONE );
|
||||
|
||||
m_fieldIDsRead.clear();
|
||||
|
||||
@ -3101,7 +3101,7 @@ SCH_SYMBOL* SCH_IO_KICAD_SEXPR_PARSER::parseSchematicSymbol()
|
||||
|
||||
case T_fields_autoplaced:
|
||||
if( parseMaybeAbsentBool( true ) )
|
||||
symbol->SetFieldsAutoplaced();
|
||||
symbol->SetFieldsAutoplaced( AUTOPLACE_AUTO );
|
||||
|
||||
break;
|
||||
|
||||
@ -3435,7 +3435,7 @@ SCH_SHEET* SCH_IO_KICAD_SEXPR_PARSER::parseSheet()
|
||||
std::set<int> fieldIDsRead;
|
||||
|
||||
// We'll reset this if we find a fields_autoplaced token
|
||||
sheet->ClearFieldsAutoplaced();
|
||||
sheet->SetFieldsAutoplaced( AUTOPLACE_NONE );
|
||||
|
||||
for( token = NextTok(); token != T_RIGHT; token = NextTok() )
|
||||
{
|
||||
@ -3483,7 +3483,7 @@ SCH_SHEET* SCH_IO_KICAD_SEXPR_PARSER::parseSheet()
|
||||
|
||||
case T_fields_autoplaced:
|
||||
if( parseMaybeAbsentBool( true ) )
|
||||
sheet->SetFieldsAutoplaced();
|
||||
sheet->SetFieldsAutoplaced( AUTOPLACE_AUTO );
|
||||
|
||||
break;
|
||||
|
||||
@ -4240,7 +4240,7 @@ SCH_TEXT* SCH_IO_KICAD_SEXPR_PARSER::parseSchText()
|
||||
}
|
||||
|
||||
// We'll reset this if we find a fields_autoplaced token
|
||||
text->ClearFieldsAutoplaced();
|
||||
text->SetFieldsAutoplaced( AUTOPLACE_NONE );
|
||||
|
||||
NeedSYMBOL();
|
||||
|
||||
@ -4322,7 +4322,7 @@ SCH_TEXT* SCH_IO_KICAD_SEXPR_PARSER::parseSchText()
|
||||
|
||||
case T_fields_autoplaced:
|
||||
if( parseMaybeAbsentBool( true ) )
|
||||
text->SetFieldsAutoplaced();
|
||||
text->SetFieldsAutoplaced( AUTOPLACE_AUTO );
|
||||
|
||||
break;
|
||||
|
||||
@ -4389,7 +4389,7 @@ SCH_TEXT* SCH_IO_KICAD_SEXPR_PARSER::parseSchText()
|
||||
SCH_LABEL_BASE* label = dynamic_cast<SCH_LABEL_BASE*>( text.get() );
|
||||
|
||||
if( label && label->GetFields().empty() )
|
||||
label->SetFieldsAutoplaced();
|
||||
label->SetFieldsAutoplaced( AUTOPLACE_AUTO );
|
||||
|
||||
return text.release();
|
||||
}
|
||||
|
@ -915,7 +915,7 @@ SCH_LABEL_BASE* SCH_IO_LTSPICE_PARSER::CreateSCH_LABEL( KICAD_T aType, const VEC
|
||||
field.SetVisible( true );
|
||||
|
||||
label->AddField( field );
|
||||
label->AutoplaceFields( nullptr, false );
|
||||
label->AutoplaceFields( nullptr, AUTOPLACE_AUTO );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -81,7 +81,7 @@ SCH_ITEM::SCH_ITEM( EDA_ITEM* aParent, KICAD_T aType, int aUnit, int aBodyStyle
|
||||
m_private( false )
|
||||
{
|
||||
m_layer = LAYER_WIRE; // It's only a default, in fact
|
||||
m_fieldsAutoplaced = FIELDS_AUTOPLACED_NO;
|
||||
m_fieldsAutoplaced = AUTOPLACE_NONE;
|
||||
m_connectivity_dirty = false; // Item is unconnected until it is placed, so it's clean
|
||||
}
|
||||
|
||||
|
@ -64,11 +64,13 @@ enum BODY_STYLE : int
|
||||
#define MINIMUM_SELECTION_DISTANCE 2 // Minimum selection distance in mils
|
||||
|
||||
|
||||
enum FIELDS_AUTOPLACED
|
||||
enum AUTOPLACE_ALGO
|
||||
{
|
||||
FIELDS_AUTOPLACED_NO = 0,
|
||||
FIELDS_AUTOPLACED_AUTO,
|
||||
FIELDS_AUTOPLACED_MANUAL
|
||||
AUTOPLACE_NONE, // No autoplacement
|
||||
AUTOPLACE_AUTO, // A minimalist placement algorithm.
|
||||
AUTOPLACE_MANUAL, // A more involved routine that can be annoying if done from the get go.
|
||||
// Initiated by a hotkey or menu item.
|
||||
AUTOPLACE_AUTOADDED // Autoplace only those fields marked as AutoAdded.
|
||||
};
|
||||
|
||||
|
||||
@ -545,25 +547,10 @@ public:
|
||||
/**
|
||||
* Return whether the fields have been automatically placed.
|
||||
*/
|
||||
FIELDS_AUTOPLACED GetFieldsAutoplaced() const { return m_fieldsAutoplaced; }
|
||||
AUTOPLACE_ALGO GetFieldsAutoplaced() const { return m_fieldsAutoplaced; }
|
||||
void SetFieldsAutoplaced( AUTOPLACE_ALGO aAlgo ) { m_fieldsAutoplaced = aAlgo; }
|
||||
|
||||
void SetFieldsAutoplaced() { m_fieldsAutoplaced = FIELDS_AUTOPLACED_AUTO; }
|
||||
void ClearFieldsAutoplaced() { m_fieldsAutoplaced = FIELDS_AUTOPLACED_NO; }
|
||||
|
||||
/**
|
||||
* Autoplace fields only if correct to do so automatically.
|
||||
*
|
||||
* Fields that have been moved by hand are not automatically placed.
|
||||
*
|
||||
* @param aScreen is the SCH_SCREEN associated with the current instance of the symbol.
|
||||
*/
|
||||
void AutoAutoplaceFields( SCH_SCREEN* aScreen )
|
||||
{
|
||||
if( GetFieldsAutoplaced() )
|
||||
AutoplaceFields( aScreen, GetFieldsAutoplaced() == FIELDS_AUTOPLACED_MANUAL );
|
||||
}
|
||||
|
||||
virtual void AutoplaceFields( SCH_SCREEN* aScreen, bool aManual ) { }
|
||||
virtual void AutoplaceFields( SCH_SCREEN* aScreen, AUTOPLACE_ALGO aAlgo ) { }
|
||||
|
||||
virtual void RunOnChildren( const std::function<void( SCH_ITEM* )>& aFunction ) { }
|
||||
|
||||
@ -724,7 +711,7 @@ protected:
|
||||
int m_unit; // set to 0 if common to all units
|
||||
int m_bodyStyle; // set to 0 if common to all body styles
|
||||
bool m_private; // only shown in Symbol Editor
|
||||
FIELDS_AUTOPLACED m_fieldsAutoplaced; // indicates status of field autoplacement
|
||||
AUTOPLACE_ALGO m_fieldsAutoplaced; // indicates status of field autoplacement
|
||||
VECTOR2I m_storedPos; // temp variable used in some move commands to store
|
||||
// an initial position of the item or mouse cursor
|
||||
|
||||
|
@ -166,7 +166,6 @@ SCH_LABEL_BASE::SCH_LABEL_BASE( const VECTOR2I& aPos, const wxString& aText, KIC
|
||||
m_lastResolvedColor( COLOR4D::UNSPECIFIED )
|
||||
{
|
||||
SetMultilineAllowed( false );
|
||||
ClearFieldsAutoplaced(); // fields are not yet autoplaced.
|
||||
|
||||
if( !HasTextVars() )
|
||||
m_cached_driver_name = EscapeString( EDA_TEXT::GetShownText( true, 0 ), CTX_NETNAME );
|
||||
@ -403,16 +402,14 @@ void SCH_LABEL_BASE::Rotate90( bool aClockwise )
|
||||
{
|
||||
SCH_TEXT::Rotate90( aClockwise );
|
||||
|
||||
if( m_fieldsAutoplaced == FIELDS_AUTOPLACED_AUTO )
|
||||
if( m_fieldsAutoplaced == AUTOPLACE_AUTO || m_fieldsAutoplaced == AUTOPLACE_MANUAL )
|
||||
{
|
||||
AutoplaceFields( /* aScreen */ nullptr, /* aManual */ false );
|
||||
AutoplaceFields( nullptr, m_fieldsAutoplaced );
|
||||
}
|
||||
else
|
||||
{
|
||||
for( SCH_FIELD& field : m_fields )
|
||||
{
|
||||
field.Rotate( GetPosition(), !aClockwise );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -560,7 +557,7 @@ double SCH_LABEL_BASE::Similarity( const SCH_ITEM& aOther ) const
|
||||
}
|
||||
|
||||
|
||||
void SCH_LABEL_BASE::AutoplaceFields( SCH_SCREEN* aScreen, bool aManual )
|
||||
void SCH_LABEL_BASE::AutoplaceFields( SCH_SCREEN* aScreen, AUTOPLACE_ALGO aAlgo )
|
||||
{
|
||||
int margin = GetTextOffset() * 2;
|
||||
int labelLen = GetBodyBoundingBox().GetSizeMax();
|
||||
@ -627,7 +624,8 @@ void SCH_LABEL_BASE::AutoplaceFields( SCH_SCREEN* aScreen, bool aManual )
|
||||
accumulated += field.GetTextHeight() + margin;
|
||||
}
|
||||
|
||||
m_fieldsAutoplaced = FIELDS_AUTOPLACED_AUTO;
|
||||
if( aAlgo == AUTOPLACE_AUTO || aAlgo == AUTOPLACE_MANUAL )
|
||||
m_fieldsAutoplaced = aAlgo;
|
||||
}
|
||||
|
||||
|
||||
@ -1691,7 +1689,7 @@ void SCH_DIRECTIVE_LABEL::CreateGraphicShape( const RENDER_SETTINGS* aRenderSett
|
||||
}
|
||||
|
||||
|
||||
void SCH_DIRECTIVE_LABEL::AutoplaceFields( SCH_SCREEN* aScreen, bool aManual )
|
||||
void SCH_DIRECTIVE_LABEL::AutoplaceFields( SCH_SCREEN* aScreen, AUTOPLACE_ALGO aAlgo )
|
||||
{
|
||||
int margin = GetTextOffset();
|
||||
int symbolWidth = m_symbolSize;
|
||||
@ -1740,7 +1738,8 @@ void SCH_DIRECTIVE_LABEL::AutoplaceFields( SCH_SCREEN* aScreen, bool aManual )
|
||||
origin -= field.GetTextHeight() + margin;
|
||||
}
|
||||
|
||||
m_fieldsAutoplaced = FIELDS_AUTOPLACED_AUTO;
|
||||
if( aAlgo == AUTOPLACE_AUTO || aAlgo == AUTOPLACE_MANUAL )
|
||||
m_fieldsAutoplaced = aAlgo;
|
||||
}
|
||||
|
||||
|
||||
|
@ -239,7 +239,7 @@ public:
|
||||
|
||||
void SetPosition( const VECTOR2I& aPosition ) override;
|
||||
|
||||
void AutoplaceFields( SCH_SCREEN* aScreen, bool aManual ) override;
|
||||
void AutoplaceFields( SCH_SCREEN* aScreen, AUTOPLACE_ALGO aAlgo ) override;
|
||||
|
||||
/**
|
||||
* Builds an array of { pageNumber, pageName } pairs.
|
||||
@ -472,7 +472,7 @@ public:
|
||||
std::vector<VECTOR2I>& aPoints,
|
||||
const VECTOR2I& aPos ) const override;
|
||||
|
||||
void AutoplaceFields( SCH_SCREEN* aScreen, bool aManual ) override;
|
||||
void AutoplaceFields( SCH_SCREEN* aScreen, AUTOPLACE_ALGO aAlgo ) override;
|
||||
|
||||
wxString GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const override;
|
||||
|
||||
|
@ -76,8 +76,7 @@ const wxString SCH_SHEET::GetDefaultFieldName( int aFieldNdx, bool aTranslated )
|
||||
}
|
||||
|
||||
|
||||
SCH_SHEET::SCH_SHEET( EDA_ITEM* aParent, const VECTOR2I& aPos, VECTOR2I aSize,
|
||||
FIELDS_AUTOPLACED aAutoplaceFields ) :
|
||||
SCH_SHEET::SCH_SHEET( EDA_ITEM* aParent, const VECTOR2I& aPos, VECTOR2I aSize ) :
|
||||
SCH_ITEM( aParent, SCH_SHEET_T ),
|
||||
m_excludedFromSim( false ),
|
||||
m_excludedFromBOM( false ),
|
||||
@ -92,7 +91,7 @@ SCH_SHEET::SCH_SHEET( EDA_ITEM* aParent, const VECTOR2I& aPos, VECTOR2I aSize,
|
||||
m_borderWidth = 0;
|
||||
m_borderColor = COLOR4D::UNSPECIFIED;
|
||||
m_backgroundColor = COLOR4D::UNSPECIFIED;
|
||||
m_fieldsAutoplaced = aAutoplaceFields;
|
||||
m_fieldsAutoplaced = AUTOPLACE_AUTO;
|
||||
|
||||
for( int i = 0; i < SHEET_MANDATORY_FIELDS; ++i )
|
||||
{
|
||||
@ -107,7 +106,7 @@ SCH_SHEET::SCH_SHEET( EDA_ITEM* aParent, const VECTOR2I& aPos, VECTOR2I aSize,
|
||||
m_fields.back().SetLayer( LAYER_SHEETFIELDS );
|
||||
}
|
||||
|
||||
AutoAutoplaceFields( nullptr );
|
||||
AutoplaceFields( nullptr, m_fieldsAutoplaced );
|
||||
}
|
||||
|
||||
|
||||
@ -663,7 +662,7 @@ int SCH_SHEET::GetPenWidth() const
|
||||
}
|
||||
|
||||
|
||||
void SCH_SHEET::AutoplaceFields( SCH_SCREEN* aScreen, bool /* aManual */ )
|
||||
void SCH_SHEET::AutoplaceFields( SCH_SCREEN* aScreen, AUTOPLACE_ALGO aAlgo )
|
||||
{
|
||||
VECTOR2I textSize = m_fields[SHEETNAME].GetTextSize();
|
||||
int borderMargin = KiROUND( GetPenWidth() / 2.0 ) + 4;
|
||||
@ -702,7 +701,8 @@ void SCH_SHEET::AutoplaceFields( SCH_SCREEN* aScreen, bool /* aManual */ )
|
||||
m_fields[ SHEETFILENAME ].SetTextAngle( ANGLE_HORIZONTAL );
|
||||
}
|
||||
|
||||
m_fieldsAutoplaced = FIELDS_AUTOPLACED_AUTO;
|
||||
if( aAlgo == AUTOPLACE_AUTO || aAlgo == AUTOPLACE_MANUAL )
|
||||
m_fieldsAutoplaced = aAlgo;
|
||||
}
|
||||
|
||||
|
||||
@ -937,9 +937,9 @@ void SCH_SHEET::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
|
||||
for( SCH_SHEET_PIN* sheetPin : m_pins )
|
||||
sheetPin->Rotate( aCenter, aRotateCCW );
|
||||
|
||||
if( m_fieldsAutoplaced == FIELDS_AUTOPLACED_AUTO )
|
||||
if( m_fieldsAutoplaced == AUTOPLACE_AUTO || m_fieldsAutoplaced == AUTOPLACE_MANUAL )
|
||||
{
|
||||
AutoplaceFields( /* aScreen */ nullptr, /* aManual */ false );
|
||||
AutoplaceFields( nullptr, m_fieldsAutoplaced );
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1011,8 +1011,8 @@ void SCH_SHEET::Resize( const VECTOR2I& aSize )
|
||||
m_size = aSize;
|
||||
|
||||
// Move the fields if we're in autoplace mode
|
||||
if( m_fieldsAutoplaced == FIELDS_AUTOPLACED_AUTO )
|
||||
AutoplaceFields( /* aScreen */ nullptr, /* aManual */ false );
|
||||
if( m_fieldsAutoplaced == AUTOPLACE_AUTO || m_fieldsAutoplaced == AUTOPLACE_MANUAL )
|
||||
AutoplaceFields( nullptr, m_fieldsAutoplaced );
|
||||
|
||||
// Move the sheet labels according to the new sheet size.
|
||||
for( SCH_SHEET_PIN* sheetPin : m_pins )
|
||||
|
@ -58,8 +58,7 @@ class SCH_SHEET : public SCH_ITEM
|
||||
public:
|
||||
SCH_SHEET( EDA_ITEM* aParent = nullptr, const VECTOR2I& aPos = VECTOR2I( 0, 0 ),
|
||||
VECTOR2I aSize = VECTOR2I( schIUScale.MilsToIU( MIN_SHEET_WIDTH ),
|
||||
schIUScale.MilsToIU( MIN_SHEET_HEIGHT ) ),
|
||||
FIELDS_AUTOPLACED aAutoplaceFields = FIELDS_AUTOPLACED_AUTO );
|
||||
schIUScale.MilsToIU( MIN_SHEET_HEIGHT ) ) );
|
||||
|
||||
/**
|
||||
* Copy \a aSheet into a new object. All sheet pins are copied as is except and
|
||||
@ -335,7 +334,7 @@ public:
|
||||
*/
|
||||
void Resize( const VECTOR2I& aSize );
|
||||
|
||||
void AutoplaceFields( SCH_SCREEN* aScreen, bool aManual ) override;
|
||||
void AutoplaceFields( SCH_SCREEN* aScreen, AUTOPLACE_ALGO aAlgo ) override;
|
||||
|
||||
void GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList ) override;
|
||||
|
||||
|
@ -406,7 +406,7 @@ void SCH_SHEET_PATH::UpdateAllScreenReferences() const
|
||||
&& intersheetRefs.GetPosition() == VECTOR2I( 0, 0 )
|
||||
&& !intersheetRefs.IsVisible() )
|
||||
{
|
||||
label->AutoplaceFields( LastScreen(), false );
|
||||
label->AutoplaceFields( LastScreen(), AUTOPLACE_AUTO );
|
||||
}
|
||||
|
||||
intersheetRefs.SetVisible( label->Schematic()->Settings().m_IntersheetRefsShow );
|
||||
|
@ -576,13 +576,10 @@ public:
|
||||
/**
|
||||
* Automatically orient all the fields in the symbol.
|
||||
*
|
||||
* @param aScreen is the SCH_SCREEN associated with the current instance of the
|
||||
* symbol. This can be NULL when aManual is false.
|
||||
* @param aManual should be true if the autoplace was manually initiated (e.g. by a hotkey
|
||||
* or a menu item). Some more 'intelligent' routines will be used that would be
|
||||
* annoying if done automatically during moves.
|
||||
* @param aScreen is the SCH_SCREEN associated with the current instance of the symbol.
|
||||
* Required when \a aAlgo is AUTOPLACE_MANUAL; optional otherwise.
|
||||
*/
|
||||
void AutoplaceFields( SCH_SCREEN* aScreen, bool aManual ) override;
|
||||
void AutoplaceFields( SCH_SCREEN* aScreen, AUTOPLACE_ALGO aAlgo ) override;
|
||||
|
||||
void RunOnChildren( const std::function<void( SCH_ITEM* )>& aFunction ) override;
|
||||
|
||||
|
@ -706,7 +706,7 @@ void SCHEMATIC::RecomputeIntersheetRefs( const std::function<void( SCH_GLOBALLAB
|
||||
if( show )
|
||||
{
|
||||
if( fields.size() == 1 && fields[0].GetTextPos() == globalLabel->GetPosition() )
|
||||
globalLabel->AutoplaceFields( CurrentSheet().LastScreen(), false );
|
||||
globalLabel->AutoplaceFields( CurrentSheet().LastScreen(), AUTOPLACE_AUTO );
|
||||
|
||||
CurrentSheet().LastScreen()->Update( globalLabel );
|
||||
aItemCallback( globalLabel );
|
||||
|
@ -403,7 +403,10 @@ int SCH_DRAWING_TOOLS::PlaceSymbol( const TOOL_EVENT& aEvent )
|
||||
existingRefs.SortByReferenceOnly();
|
||||
|
||||
if( m_frame->eeconfig()->m_AutoplaceFields.enable )
|
||||
symbol->AutoplaceFields( /* aScreen */ nullptr, /* aManual */ false );
|
||||
{
|
||||
// Not placed yet, so pass a nullptr screen reference
|
||||
symbol->AutoplaceFields( nullptr, AUTOPLACE_AUTO );
|
||||
}
|
||||
|
||||
// Update cursor now that we have a symbol
|
||||
setCursor();
|
||||
@ -414,7 +417,7 @@ int SCH_DRAWING_TOOLS::PlaceSymbol( const TOOL_EVENT& aEvent )
|
||||
m_frame->AddToScreen( symbol, screen );
|
||||
|
||||
if( m_frame->eeconfig()->m_AutoplaceFields.enable )
|
||||
symbol->AutoplaceFields( screen, false /* aManual */ );
|
||||
symbol->AutoplaceFields( screen, AUTOPLACE_AUTO );
|
||||
|
||||
m_frame->SaveCopyForRepeatItem( symbol );
|
||||
|
||||
@ -2008,7 +2011,10 @@ int SCH_DRAWING_TOOLS::TwoClickPlace( const TOOL_EVENT& aEvent )
|
||||
item->SetPosition( cursorPos );
|
||||
|
||||
item->SetFlags( IS_NEW | IS_MOVING );
|
||||
item->AutoplaceFields( nullptr, false /* aManual */ );
|
||||
|
||||
// Not placed yet, so pass a nullptr screen reference
|
||||
item->AutoplaceFields( nullptr, AUTOPLACE_AUTO );
|
||||
|
||||
updatePreview();
|
||||
m_selectionTool->AddItemToSel( item );
|
||||
m_toolMgr->PostAction( ACTIONS::refreshPreview );
|
||||
@ -2041,7 +2047,7 @@ int SCH_DRAWING_TOOLS::TwoClickPlace( const TOOL_EVENT& aEvent )
|
||||
commit.Added( item, m_frame->GetScreen() );
|
||||
}
|
||||
|
||||
item->AutoplaceFields( m_frame->GetScreen(), false /* aManual */ );
|
||||
item->AutoplaceFields( m_frame->GetScreen(), AUTOPLACE_AUTO );
|
||||
|
||||
commit.Push( description );
|
||||
|
||||
@ -2110,7 +2116,10 @@ int SCH_DRAWING_TOOLS::TwoClickPlace( const TOOL_EVENT& aEvent )
|
||||
else if( item && ( evt->IsAction( &ACTIONS::refreshPreview ) || evt->IsMotion() ) )
|
||||
{
|
||||
item->SetPosition( cursorPos );
|
||||
item->AutoplaceFields( /* aScreen */ nullptr, /* aManual */ false );
|
||||
|
||||
// Not placed yet, so pass a nullptr screen reference
|
||||
item->AutoplaceFields( nullptr, AUTOPLACE_AUTO );
|
||||
|
||||
updatePreview();
|
||||
}
|
||||
else if( item && evt->IsAction( &ACTIONS::doDelete ) )
|
||||
@ -3024,7 +3033,7 @@ int SCH_DRAWING_TOOLS::DrawSheet( const TOOL_EVENT& aEvent )
|
||||
{
|
||||
m_view->ClearPreview();
|
||||
|
||||
sheet->AutoplaceFields( /* aScreen */ nullptr, /* aManual */ false );
|
||||
sheet->AutoplaceFields( m_frame->GetScreen(), AUTOPLACE_AUTO );
|
||||
|
||||
// Use the commit we were provided or make our own
|
||||
SCH_COMMIT tempCommit = SCH_COMMIT( m_toolMgr );
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user