Hop-over improvements.

1) Move hop-over enablement to Schematic Setup.
2) Make hop-over size user configurable.
3) Prefer hop-overs to hop-unders.
This commit is contained in:
Jeff Young 2025-06-18 22:18:59 +01:00
parent 716e446e06
commit 2cd6654e81
23 changed files with 3465 additions and 3319 deletions

View File

@ -312,8 +312,6 @@ ADVANCED_CFG::ADVANCED_CFG()
m_MaxPastedTextLength = 100; m_MaxPastedTextLength = 100;
m_hopOverArcRadius = 2.5;
loadFromConfigFile(); loadFromConfigFile();
} }

View File

@ -71,7 +71,7 @@ JOB_EXPORT_SCH_PLOT::JOB_EXPORT_SCH_PLOT( bool aOutputIsDirectory ) :
&m_blackAndWhite, m_blackAndWhite ) ); &m_blackAndWhite, m_blackAndWhite ) );
m_params.emplace_back( new JOB_PARAM<bool>( "show_hop_over", m_params.emplace_back( new JOB_PARAM<bool>( "show_hop_over",
&m_blackAndWhite, m_show_hop_over ) ); &m_show_hop_over, m_show_hop_over ) );
m_params.emplace_back( new JOB_PARAM<JOB_PAGE_SIZE>( "page_size", m_params.emplace_back( new JOB_PARAM<JOB_PAGE_SIZE>( "page_size",
&m_pageSizeSelect, m_pageSizeSelect ) ); &m_pageSizeSelect, m_pageSizeSelect ) );

View File

@ -432,7 +432,7 @@ void DIALOG_PLOT_SCHEMATIC::plotSchematic( bool aPlotAll )
plotOpts.m_PDFMetadata = m_plotPDFMetadata->GetValue(); plotOpts.m_PDFMetadata = m_plotPDFMetadata->GetValue();
plotOpts.m_outputDirectory = getOutputPath(); plotOpts.m_outputDirectory = getOutputPath();
plotOpts.m_pageSizeSelect = m_pageSizeSelect; plotOpts.m_pageSizeSelect = m_pageSizeSelect;
plotOpts.m_plotHopOver = cfg ? cfg->m_Appearance.show_hop_over : false; plotOpts.m_plotHopOver = m_editFrame->Schematic().Settings().m_HopOverScale > 0.0;
schPlotter->Plot( GetPlotFileFormat(), plotOpts, &renderSettings, &m_MessagesBox->Reporter() ); schPlotter->Plot( GetPlotFileFormat(), plotOpts, &renderSettings, &m_MessagesBox->Reporter() );

View File

@ -62,7 +62,6 @@ void PANEL_EESCHEMA_DISPLAY_OPTIONS::loadEEschemaSettings( EESCHEMA_SETTINGS* cf
m_checkShowOPVoltages->SetValue( cfg->m_Appearance.show_op_voltages ); m_checkShowOPVoltages->SetValue( cfg->m_Appearance.show_op_voltages );
m_checkShowPinAltModeIcons->SetValue( cfg->m_Appearance.show_op_currents ); m_checkShowPinAltModeIcons->SetValue( cfg->m_Appearance.show_op_currents );
m_checkPageLimits->SetValue( cfg->m_Appearance.show_page_limits ); m_checkPageLimits->SetValue( cfg->m_Appearance.show_page_limits );
m_cbHopOver->SetValue( cfg->m_Appearance.show_hop_over );
m_checkSelDrawChildItems->SetValue( cfg->m_Selection.draw_selected_children ); m_checkSelDrawChildItems->SetValue( cfg->m_Selection.draw_selected_children );
m_checkSelFillShapes->SetValue( cfg->m_Selection.fill_shapes ); m_checkSelFillShapes->SetValue( cfg->m_Selection.fill_shapes );
@ -91,34 +90,33 @@ bool PANEL_EESCHEMA_DISPLAY_OPTIONS::TransferDataFromWindow()
{ {
if( EESCHEMA_SETTINGS* cfg = GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" ) ) if( EESCHEMA_SETTINGS* cfg = GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" ) )
{ {
cfg->m_Appearance.default_font = m_defaultFontCtrl->GetSelection() <= 0 cfg->m_Appearance.default_font = m_defaultFontCtrl->GetSelection() <= 0
// This is a keyword. Do not translate. // This is a keyword. Do not translate.
? wxString( KICAD_FONT_NAME ) ? wxString( KICAD_FONT_NAME )
: m_defaultFontCtrl->GetStringSelection(); : m_defaultFontCtrl->GetStringSelection();
cfg->m_Appearance.show_hidden_pins = m_checkShowHiddenPins->GetValue(); cfg->m_Appearance.show_hidden_pins = m_checkShowHiddenPins->GetValue();
cfg->m_Appearance.show_hidden_fields = m_checkShowHiddenFields->GetValue(); cfg->m_Appearance.show_hidden_fields = m_checkShowHiddenFields->GetValue();
cfg->m_Appearance.show_erc_warnings = m_checkShowERCWarnings->GetValue(); cfg->m_Appearance.show_erc_warnings = m_checkShowERCWarnings->GetValue();
cfg->m_Appearance.show_erc_errors = m_checkShowERCErrors->GetValue(); cfg->m_Appearance.show_erc_errors = m_checkShowERCErrors->GetValue();
cfg->m_Appearance.show_erc_exclusions = m_checkShowERCExclusions->GetValue(); cfg->m_Appearance.show_erc_exclusions = m_checkShowERCExclusions->GetValue();
cfg->m_Appearance.mark_sim_exclusions = m_cbMarkSimExclusions->GetValue(); cfg->m_Appearance.mark_sim_exclusions = m_cbMarkSimExclusions->GetValue();
cfg->m_Appearance.show_op_voltages = m_checkShowOPVoltages->GetValue(); cfg->m_Appearance.show_op_voltages = m_checkShowOPVoltages->GetValue();
cfg->m_Appearance.show_op_currents = m_checkShowOPCurrents->GetValue(); cfg->m_Appearance.show_op_currents = m_checkShowOPCurrents->GetValue();
cfg->m_Appearance.show_pin_alt_icons = m_checkShowPinAltModeIcons->GetValue(); cfg->m_Appearance.show_pin_alt_icons = m_checkShowPinAltModeIcons->GetValue();
cfg->m_Appearance.show_page_limits = m_checkPageLimits->GetValue(); cfg->m_Appearance.show_page_limits = m_checkPageLimits->GetValue();
cfg->m_Appearance.show_hop_over = m_cbHopOver->GetValue();
cfg->m_Selection.draw_selected_children = m_checkSelDrawChildItems->GetValue(); cfg->m_Selection.draw_selected_children = m_checkSelDrawChildItems->GetValue();
cfg->m_Selection.fill_shapes = m_checkSelFillShapes->GetValue(); cfg->m_Selection.fill_shapes = m_checkSelFillShapes->GetValue();
cfg->m_Selection.selection_thickness = KiROUND( m_selWidthCtrl->GetValue() ); cfg->m_Selection.selection_thickness = KiROUND( m_selWidthCtrl->GetValue() );
cfg->m_Selection.highlight_thickness = KiROUND( m_highlightWidthCtrl->GetValue() ); cfg->m_Selection.highlight_thickness = KiROUND( m_highlightWidthCtrl->GetValue() );
cfg->m_Selection.highlight_netclass_colors = m_highlightNetclassColors->GetValue(); cfg->m_Selection.highlight_netclass_colors = m_highlightNetclassColors->GetValue();
cfg->m_Selection.highlight_netclass_colors_thickness = m_colHighlightThickness->GetValue(); cfg->m_Selection.highlight_netclass_colors_thickness = m_colHighlightThickness->GetValue();
cfg->m_Selection.highlight_netclass_colors_alpha = m_colHighlightTransparency->GetValue() / 100.0; cfg->m_Selection.highlight_netclass_colors_alpha = m_colHighlightTransparency->GetValue() / 100.0;
cfg->m_CrossProbing.on_selection = m_checkCrossProbeOnSelection->GetValue(); cfg->m_CrossProbing.on_selection = m_checkCrossProbeOnSelection->GetValue();
cfg->m_CrossProbing.center_on_items = m_checkCrossProbeCenter->GetValue(); cfg->m_CrossProbing.center_on_items = m_checkCrossProbeCenter->GetValue();
cfg->m_CrossProbing.zoom_to_fit = m_checkCrossProbeZoom->GetValue(); cfg->m_CrossProbing.zoom_to_fit = m_checkCrossProbeZoom->GetValue();
cfg->m_CrossProbing.auto_highlight = m_checkCrossProbeAutoHighlight->GetValue(); cfg->m_CrossProbing.auto_highlight = m_checkCrossProbeAutoHighlight->GetValue();
} }
m_galOptsPanel->TransferDataFromWindow(); m_galOptsPanel->TransferDataFromWindow();

View File

@ -135,11 +135,6 @@ PANEL_EESCHEMA_DISPLAY_OPTIONS_BASE::PANEL_EESCHEMA_DISPLAY_OPTIONS_BASE( wxWind
m_checkPageLimits->SetValue(true); m_checkPageLimits->SetValue(true);
bAppearanceSizer->Add( m_checkPageLimits, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); bAppearanceSizer->Add( m_checkPageLimits, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
m_cbHopOver = new wxCheckBox( this, wxID_ANY, _("Hop hover on wire crossing"), wxDefaultPosition, wxDefaultSize, 0 );
m_cbHopOver->SetToolTip( _("Show a hop hover when two wires are crossing") );
bAppearanceSizer->Add( m_cbHopOver, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
bRightColumn->Add( bAppearanceSizer, 0, wxEXPAND|wxTOP|wxLEFT, 5 ); bRightColumn->Add( bAppearanceSizer, 0, wxEXPAND|wxTOP|wxLEFT, 5 );

View File

@ -1432,71 +1432,6 @@
<property name="window_style"></property> <property name="window_style"></property>
</object> </object>
</object> </object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxCheckBox" expanded="true">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="checked">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_accept_files">0</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Hop hover on wire crossing</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_cbHopOver</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip">Show a hop hover when two wires are crossing</property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
</object>
</object>
</object> </object>
</object> </object>
<object class="sizeritem" expanded="false"> <object class="sizeritem" expanded="false">

View File

@ -58,7 +58,6 @@ class PANEL_EESCHEMA_DISPLAY_OPTIONS_BASE : public RESETTABLE_PANEL
wxCheckBox* m_checkShowOPCurrents; wxCheckBox* m_checkShowOPCurrents;
wxCheckBox* m_checkShowPinAltModeIcons; wxCheckBox* m_checkShowPinAltModeIcons;
wxCheckBox* m_checkPageLimits; wxCheckBox* m_checkPageLimits;
wxCheckBox* m_cbHopOver;
wxStaticText* m_selectionLabel; wxStaticText* m_selectionLabel;
wxStaticLine* m_staticline2; wxStaticLine* m_staticline2;
wxCheckBox* m_checkSelDrawChildItems; wxCheckBox* m_checkSelDrawChildItems;

View File

@ -95,6 +95,7 @@ bool PANEL_SETUP_FORMATTING::TransferDataToWindow()
m_lineWidth.SetValue( settings.m_DefaultLineWidth ); m_lineWidth.SetValue( settings.m_DefaultLineWidth );
m_pinSymbolSize.SetValue( settings.m_PinSymbolSize ); m_pinSymbolSize.SetValue( settings.m_PinSymbolSize );
m_choiceJunctionDotSize->SetSelection( settings.m_JunctionSizeChoice ); m_choiceJunctionDotSize->SetSelection( settings.m_JunctionSizeChoice );
m_choiceHopOverSize->SetSelection( settings.m_HopOverSizeChoice );
m_connectionGridSize.SetValue( settings.m_ConnectionGridSize ); m_connectionGridSize.SetValue( settings.m_ConnectionGridSize );
m_showIntersheetsReferences->SetValue( settings.m_IntersheetRefsShow ); m_showIntersheetsReferences->SetValue( settings.m_IntersheetRefsShow );
@ -162,6 +163,9 @@ bool PANEL_SETUP_FORMATTING::TransferDataFromWindow()
if( m_choiceJunctionDotSize->GetSelection() != wxNOT_FOUND ) if( m_choiceJunctionDotSize->GetSelection() != wxNOT_FOUND )
settings.m_JunctionSizeChoice = m_choiceJunctionDotSize->GetSelection(); settings.m_JunctionSizeChoice = m_choiceJunctionDotSize->GetSelection();
if( m_choiceHopOverSize->GetSelection() != wxNOT_FOUND )
settings.m_HopOverSizeChoice = m_choiceHopOverSize->GetSelection();
settings.m_IntersheetRefsShow = m_showIntersheetsReferences->GetValue(); settings.m_IntersheetRefsShow = m_showIntersheetsReferences->GetValue();
settings.m_IntersheetRefsFormatShort = !m_radioFormatStandard->GetValue(); settings.m_IntersheetRefsFormatShort = !m_radioFormatStandard->GetValue();
settings.m_IntersheetRefsPrefix = m_prefixCtrl->GetValue(); settings.m_IntersheetRefsPrefix = m_prefixCtrl->GetValue();

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version 3.10.1-0-g8feb16b) // C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
// http://www.wxformbuilder.org/ // http://www.wxformbuilder.org/
// //
// PLEASE DO *NOT* EDIT THIS FILE! // PLEASE DO *NOT* EDIT THIS FILE!
@ -155,9 +155,9 @@ PANEL_SETUP_FORMATTING_BASE::PANEL_SETUP_FORMATTING_BASE( wxWindow* parent, wxWi
gbSizer1->SetFlexibleDirection( wxBOTH ); gbSizer1->SetFlexibleDirection( wxBOTH );
gbSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); gbSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_staticText261 = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, _("Junction dot size:"), wxDefaultPosition, wxDefaultSize, 0 ); m_junctionDotLabel = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, _("Junction dot size:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText261->Wrap( -1 ); m_junctionDotLabel->Wrap( -1 );
gbSizer1->Add( m_staticText261, wxGBPosition( 0, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); gbSizer1->Add( m_junctionDotLabel, wxGBPosition( 0, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 );
wxString m_choiceJunctionDotSizeChoices[] = { _("None"), _("Smallest"), _("Small"), _("Default"), _("Large"), _("Largest") }; wxString m_choiceJunctionDotSizeChoices[] = { _("None"), _("Smallest"), _("Small"), _("Default"), _("Large"), _("Largest") };
int m_choiceJunctionDotSizeNChoices = sizeof( m_choiceJunctionDotSizeChoices ) / sizeof( wxString ); int m_choiceJunctionDotSizeNChoices = sizeof( m_choiceJunctionDotSizeChoices ) / sizeof( wxString );
@ -165,16 +165,26 @@ PANEL_SETUP_FORMATTING_BASE::PANEL_SETUP_FORMATTING_BASE( wxWindow* parent, wxWi
m_choiceJunctionDotSize->SetSelection( 3 ); m_choiceJunctionDotSize->SetSelection( 3 );
gbSizer1->Add( m_choiceJunctionDotSize, wxGBPosition( 0, 1 ), wxGBSpan( 1, 2 ), wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); gbSizer1->Add( m_choiceJunctionDotSize, wxGBPosition( 0, 1 ), wxGBSpan( 1, 2 ), wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
m_hopOverLabel = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, _("Hop-over size:"), wxDefaultPosition, wxDefaultSize, 0 );
m_hopOverLabel->Wrap( -1 );
gbSizer1->Add( m_hopOverLabel, wxGBPosition( 1, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 );
wxString m_choiceHopOverSizeChoices[] = { _("None"), _("Smallest"), _("Small"), _("Medium"), _("Large"), _("Largest") };
int m_choiceHopOverSizeNChoices = sizeof( m_choiceHopOverSizeChoices ) / sizeof( wxString );
m_choiceHopOverSize = new wxChoice( sbSizer2->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHopOverSizeNChoices, m_choiceHopOverSizeChoices, 0 );
m_choiceHopOverSize->SetSelection( 0 );
gbSizer1->Add( m_choiceHopOverSize, wxGBPosition( 1, 1 ), wxGBSpan( 1, 2 ), wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
m_connectionGridLabel = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, _("Connection grid:"), wxDefaultPosition, wxDefaultSize, 0 ); m_connectionGridLabel = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, _("Connection grid:"), wxDefaultPosition, wxDefaultSize, 0 );
m_connectionGridLabel->Wrap( -1 ); m_connectionGridLabel->Wrap( -1 );
gbSizer1->Add( m_connectionGridLabel, wxGBPosition( 1, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); gbSizer1->Add( m_connectionGridLabel, wxGBPosition( 2, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 );
m_connectionGridCtrl = new wxTextCtrl( sbSizer2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_connectionGridCtrl = new wxTextCtrl( sbSizer2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
gbSizer1->Add( m_connectionGridCtrl, wxGBPosition( 1, 1 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); gbSizer1->Add( m_connectionGridCtrl, wxGBPosition( 2, 1 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
m_connectionGridUnits = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, _("mils"), wxDefaultPosition, wxDefaultSize, 0 ); m_connectionGridUnits = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, _("mils"), wxDefaultPosition, wxDefaultSize, 0 );
m_connectionGridUnits->Wrap( -1 ); m_connectionGridUnits->Wrap( -1 );
gbSizer1->Add( m_connectionGridUnits, wxGBPosition( 1, 2 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); gbSizer1->Add( m_connectionGridUnits, wxGBPosition( 2, 2 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 );
gbSizer1->AddGrowableCol( 1 ); gbSizer1->AddGrowableCol( 1 );

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version 3.10.1-0-g8feb16b) // C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
// http://www.wxformbuilder.org/ // http://www.wxformbuilder.org/
// //
// PLEASE DO *NOT* EDIT THIS FILE! // PLEASE DO *NOT* EDIT THIS FILE!
@ -61,8 +61,10 @@ class PANEL_SETUP_FORMATTING_BASE : public wxPanel
wxStaticText* m_pinSymbolSizeLabel; wxStaticText* m_pinSymbolSizeLabel;
wxTextCtrl* m_pinSymbolSizeCtrl; wxTextCtrl* m_pinSymbolSizeCtrl;
wxStaticText* m_pinSymbolSizeUnits; wxStaticText* m_pinSymbolSizeUnits;
wxStaticText* m_staticText261; wxStaticText* m_junctionDotLabel;
wxChoice* m_choiceJunctionDotSize; wxChoice* m_choiceJunctionDotSize;
wxStaticText* m_hopOverLabel;
wxChoice* m_choiceHopOverSize;
wxStaticText* m_connectionGridLabel; wxStaticText* m_connectionGridLabel;
wxTextCtrl* m_connectionGridCtrl; wxTextCtrl* m_connectionGridCtrl;
wxStaticText* m_connectionGridUnits; wxStaticText* m_connectionGridUnits;

View File

@ -60,6 +60,7 @@ bool SCH_EDIT_FRAME::LoadProjectSettings()
{ {
SCHEMATIC_SETTINGS& settings = Schematic().Settings(); SCHEMATIC_SETTINGS& settings = Schematic().Settings();
settings.m_JunctionSize = GetSchematicJunctionSize(); settings.m_JunctionSize = GetSchematicJunctionSize();
settings.m_HopOverScale = GetSchematicHopOverScale();
GetRenderSettings()->SetDefaultPenWidth( settings.m_DefaultLineWidth ); GetRenderSettings()->SetDefaultPenWidth( settings.m_DefaultLineWidth );
GetRenderSettings()->m_LabelSizeRatio = settings.m_LabelSizeRatio; GetRenderSettings()->m_LabelSizeRatio = settings.m_LabelSizeRatio;
@ -192,6 +193,14 @@ int SCH_EDIT_FRAME::GetSchematicJunctionSize()
} }
double SCH_EDIT_FRAME::GetSchematicHopOverScale()
{
std::vector<double>& sizeMultipliers = eeconfig()->m_Drawing.junction_size_mult_list;
return sizeMultipliers[Schematic().Settings().m_HopOverSizeChoice];
}
void SCH_EDIT_FRAME::saveProjectSettings() void SCH_EDIT_FRAME::saveProjectSettings()
{ {
wxFileName fn = Schematic().RootScreen()->GetFileName(); //ConfigFileName wxFileName fn = Schematic().RootScreen()->GetFileName(); //ConfigFileName

View File

@ -244,9 +244,6 @@ EESCHEMA_SETTINGS::EESCHEMA_SETTINGS() :
m_params.emplace_back( new PARAM<bool>( "appearance.show_page_limits", m_params.emplace_back( new PARAM<bool>( "appearance.show_page_limits",
&m_Appearance.show_page_limits, true ) ); &m_Appearance.show_page_limits, true ) );
m_params.emplace_back( new PARAM<bool>( "appearance.show_hop_over",
&m_Appearance.show_hop_over, false ) );
m_params.emplace_back( new PARAM<bool>( "appearance.show_sexpr_file_convert_warning", m_params.emplace_back( new PARAM<bool>( "appearance.show_sexpr_file_convert_warning",
&m_Appearance.show_sexpr_file_convert_warning, true ) ); &m_Appearance.show_sexpr_file_convert_warning, true ) );
@ -385,9 +382,12 @@ EESCHEMA_SETTINGS::EESCHEMA_SETTINGS() :
m_params.emplace_back( new PARAM_LIST<double>( "drawing.junction_size_mult_list", m_params.emplace_back( new PARAM_LIST<double>( "drawing.junction_size_mult_list",
&m_Drawing.junction_size_mult_list, { 0.0, 1.7, 4.0, 6.0, 9.0, 12.0 } ) ); &m_Drawing.junction_size_mult_list, { 0.0, 1.7, 4.0, 6.0, 9.0, 12.0 } ) );
m_params.emplace_back(new PARAM <int>( "drawing.junction_size_choice", m_params.emplace_back( new PARAM<int>( "drawing.junction_size_choice",
&m_Drawing.junction_size_choice, 3 ) ); &m_Drawing.junction_size_choice, 3 ) );
m_params.emplace_back( new PARAM<int>( "drawing.hop_over_size_choice",
&m_Drawing.hop_over_size_choice, 0 ) );
m_params.emplace_back( new PARAM<bool>( "find_replace.search_all_fields", m_params.emplace_back( new PARAM<bool>( "find_replace.search_all_fields",
&m_FindReplaceExtra.search_all_fields, false ) ); &m_FindReplaceExtra.search_all_fields, false ) );

View File

@ -87,7 +87,6 @@ public:
bool show_pin_alt_icons; bool show_pin_alt_icons;
bool show_illegal_symbol_lib_dialog; bool show_illegal_symbol_lib_dialog;
bool show_page_limits; bool show_page_limits;
bool show_hop_over;
bool show_sexpr_file_convert_warning; bool show_sexpr_file_convert_warning;
bool show_sheet_filename_case_sensitivity_dialog; bool show_sheet_filename_case_sensitivity_dialog;
}; };
@ -179,8 +178,9 @@ public:
bool auto_start_wires; bool auto_start_wires;
std::vector<double> junction_size_mult_list; std::vector<double> junction_size_mult_list;
// Pulldown index for user default junction dot size (e.g. smallest = 0, small = 1, etc) // Pulldown index for user default junction dot size (e.g. none = 0, smallest = 1, small = 2, etc)
int junction_size_choice; int junction_size_choice;
int hop_over_size_choice;
}; };
struct INPUT struct INPUT

View File

@ -1903,6 +1903,7 @@ void SCH_EDIT_FRAME::CommonSettingsChanged( int aFlags )
SCHEMATIC_SETTINGS& settings = Schematic().Settings(); SCHEMATIC_SETTINGS& settings = Schematic().Settings();
settings.m_JunctionSize = GetSchematicJunctionSize(); settings.m_JunctionSize = GetSchematicJunctionSize();
settings.m_HopOverScale = GetSchematicHopOverScale();
ShowAllIntersheetRefs( settings.m_IntersheetRefsShow ); ShowAllIntersheetRefs( settings.m_IntersheetRefsShow );
@ -1929,8 +1930,18 @@ void SCH_EDIT_FRAME::CommonSettingsChanged( int aFlags )
SCH_SCREEN* screen = GetCurrentSheet().LastScreen(); SCH_SCREEN* screen = GetCurrentSheet().LastScreen();
for( SCH_ITEM* item : screen->Items() ) for( SCH_ITEM* item : screen->Items() )
{
item->ClearCaches(); item->ClearCaches();
if( item->Type() == SCH_LINE_T )
{
SCH_LINE* line = static_cast<SCH_LINE*>( item );
if( line->IsWire() )
UpdateHopOveredWires( line );
}
}
for( const auto& [ libItemName, libSymbol ] : screen->GetLibSymbols() ) for( const auto& [ libItemName, libSymbol ] : screen->GetLibSymbols() )
libSymbol->ClearCaches(); libSymbol->ClearCaches();

View File

@ -767,6 +767,7 @@ public:
const BOX2I GetDocumentExtents( bool aIncludeAllVisible = true ) const override; const BOX2I GetDocumentExtents( bool aIncludeAllVisible = true ) const override;
int GetSchematicJunctionSize(); int GetSchematicJunctionSize();
double GetSchematicHopOverScale();
void FocusOnItem( EDA_ITEM* aItem ) override; void FocusOnItem( EDA_ITEM* aItem ) override;

View File

@ -1096,10 +1096,11 @@ std::vector<VECTOR3I> SCH_LINE::BuildWireWithHopShape( const SCH_SCREEN* aScreen
} }
else else
{ {
auto getDistance = []( const VECTOR2I& a, const VECTOR2I& b ) -> double auto getDistance =
{ []( const VECTOR2I& a, const VECTOR2I& b ) -> double
return std::sqrt( std::pow( a.x - b.x, 2 ) + std::pow( a.y - b.y, 2 ) ); {
}; return std::sqrt( std::pow( a.x - b.x, 2 ) + std::pow( a.y - b.y, 2 ) );
};
std::sort( intersections.begin(), intersections.end(), std::sort( intersections.begin(), intersections.end(),
[&]( const VECTOR2I& a, const VECTOR2I& b ) [&]( const VECTOR2I& a, const VECTOR2I& b )
@ -1137,14 +1138,14 @@ std::vector<VECTOR3I> SCH_LINE::BuildWireWithHopShape( const SCH_SCREEN* aScreen
VECTOR2I arcMidPoint = { VECTOR2I arcMidPoint = {
hopMid.x + static_cast<int>( arcRadius hopMid.x + static_cast<int>( arcRadius
* cos( ( startAngleRad + endAngleRad ) / 2.0f ) ), * cos( ( startAngleRad + endAngleRad ) / 2.0f ) ),
hopMid.y + static_cast<int>( arcRadius hopMid.y - static_cast<int>( arcRadius
* sin( ( startAngleRad + endAngleRad ) / 2.0f ) ) * sin( ( startAngleRad + endAngleRad ) / 2.0f ) )
}; };
VECTOR2I beforeHop = hopMid - VECTOR2I( arcRadius * std::cos( lineAngle ), VECTOR2I beforeHop = hopMid - VECTOR2I( arcRadius * std::cos( lineAngle ),
arcRadius * std::sin( lineAngle ) ); arcRadius * std::sin( lineAngle ) );
VECTOR2I afterHop = hopMid + VECTOR2I( arcRadius * std::cos( lineAngle ), VECTOR2I afterHop = hopMid + VECTOR2I( arcRadius * std::cos( lineAngle ),
arcRadius * std::sin( lineAngle ) ); arcRadius * std::sin( lineAngle ) );
// Draw the line from the current start point to the before-hop point // Draw the line from the current start point to the before-hop point
wire_shape.emplace_back( currentStart.x, currentStart.y, 0 ); wire_shape.emplace_back( currentStart.x, currentStart.y, 0 );

View File

@ -1364,11 +1364,10 @@ void SCH_PAINTER::draw( const SCH_LINE* aLine, int aLayer )
bool highlightNetclassColors = false; bool highlightNetclassColors = false;
double highlightAlpha = 0.6; double highlightAlpha = 0.6;
EESCHEMA_SETTINGS* eeschemaCfg = eeconfig(); EESCHEMA_SETTINGS* eeschemaCfg = eeconfig();
bool showHopOver = false; double hopOverScale = aLine->Schematic()->Settings().m_HopOverScale;
if( eeschemaCfg ) if( eeschemaCfg )
{ {
showHopOver = eeschemaCfg->m_Appearance.show_hop_over;
highlightNetclassColors = eeschemaCfg->m_Selection.highlight_netclass_colors; highlightNetclassColors = eeschemaCfg->m_Selection.highlight_netclass_colors;
highlightAlpha = eeschemaCfg->m_Selection.highlight_netclass_colors_alpha; highlightAlpha = eeschemaCfg->m_Selection.highlight_netclass_colors_alpha;
} }
@ -1485,10 +1484,10 @@ void SCH_PAINTER::draw( const SCH_LINE* aLine, int aLayer )
std::vector<VECTOR3I> curr_wire_shape; std::vector<VECTOR3I> curr_wire_shape;
if( aLine->IsWire() && showHopOver ) if( aLine->IsWire() && hopOverScale > 0.0 )
{ {
double lineWidth = getLineWidth( aLine, false, drawingNetColorHighlights ); double lineWidth = getLineWidth( aLine, false, drawingNetColorHighlights );
double arcRadius = lineWidth * ADVANCED_CFG::GetCfg().m_hopOverArcRadius; double arcRadius = lineWidth * hopOverScale;
curr_wire_shape = aLine->BuildWireWithHopShape( m_schematic->GetCurrentScreen(), arcRadius ); curr_wire_shape = aLine->BuildWireWithHopShape( m_schematic->GetCurrentScreen(), arcRadius );
} }
else else

View File

@ -925,10 +925,12 @@ void SCH_SCREEN::Plot( PLOTTER* aPlotter, const SCH_PLOT_OPTS& aPlotOpts ) const
SCH_LINE* aLine = static_cast<SCH_LINE*>( item ); SCH_LINE* aLine = static_cast<SCH_LINE*>( item );
if( !aLine->IsWire() || !aPlotOpts.m_plotHopOver ) if( !aLine->IsWire() || !aPlotOpts.m_plotHopOver )
{
item->Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false ); item->Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
}
else else
{ {
double arcRadius = lineWidth * ADVANCED_CFG::GetCfg().m_hopOverArcRadius; double arcRadius = lineWidth * aLine->Schematic()->Settings().m_HopOverScale;
std::vector<VECTOR3I> curr_wire_shape = aLine->BuildWireWithHopShape( this, arcRadius ); std::vector<VECTOR3I> curr_wire_shape = aLine->BuildWireWithHopShape( this, arcRadius );
for( size_t ii = 1; ii < curr_wire_shape.size(); ii++ ) for( size_t ii = 1; ii < curr_wire_shape.size(); ii++ )

View File

@ -45,6 +45,8 @@ SCHEMATIC_SETTINGS::SCHEMATIC_SETTINGS( JSON_SETTINGS* aParent, const std::strin
m_PinSymbolSize( DEFAULT_TEXT_SIZE * schIUScale.IU_PER_MILS / 2 ), m_PinSymbolSize( DEFAULT_TEXT_SIZE * schIUScale.IU_PER_MILS / 2 ),
m_JunctionSizeChoice( 3 ), m_JunctionSizeChoice( 3 ),
m_JunctionSize( DEFAULT_JUNCTION_DIAM * schIUScale.IU_PER_MILS ), m_JunctionSize( DEFAULT_JUNCTION_DIAM * schIUScale.IU_PER_MILS ),
m_HopOverSizeChoice( 0 ),
m_HopOverScale( 0.0 ),
m_ConnectionGridSize( DEFAULT_CONNECTION_GRID_MILS * schIUScale.IU_PER_MILS ), m_ConnectionGridSize( DEFAULT_CONNECTION_GRID_MILS * schIUScale.IU_PER_MILS ),
m_AnnotateStartNum( 0 ), m_AnnotateStartNum( 0 ),
m_IntersheetRefsShow( false ), m_IntersheetRefsShow( false ),
@ -73,6 +75,7 @@ SCHEMATIC_SETTINGS::SCHEMATIC_SETTINGS( JSON_SETTINGS* aParent, const std::strin
int defaultTextSize = cfg ? cfg->m_Drawing.default_text_size : DEFAULT_TEXT_SIZE; int defaultTextSize = cfg ? cfg->m_Drawing.default_text_size : DEFAULT_TEXT_SIZE;
int defaultPinSymbolSize = cfg ? cfg->m_Drawing.pin_symbol_size : DEFAULT_TEXT_SIZE / 2; int defaultPinSymbolSize = cfg ? cfg->m_Drawing.pin_symbol_size : DEFAULT_TEXT_SIZE / 2;
int defaultJunctionSizeChoice = cfg ? cfg->m_Drawing.junction_size_choice : 3; int defaultJunctionSizeChoice = cfg ? cfg->m_Drawing.junction_size_choice : 3;
int defaultHopOverSizeChoice = cfg ? cfg->m_Drawing.hop_over_size_choice : 0;
bool defaultIntersheetsRefShow = cfg ? cfg->m_Drawing.intersheets_ref_show : false; bool defaultIntersheetsRefShow = cfg ? cfg->m_Drawing.intersheets_ref_show : false;
bool defaultIntersheetsRefOwnPage = cfg ? cfg->m_Drawing.intersheets_ref_own_page : true; bool defaultIntersheetsRefOwnPage = cfg ? cfg->m_Drawing.intersheets_ref_own_page : true;
bool defaultIntersheetsRefFormatShort = cfg ? cfg->m_Drawing.intersheets_ref_short : false; bool defaultIntersheetsRefFormatShort = cfg ? cfg->m_Drawing.intersheets_ref_short : false;
@ -146,6 +149,9 @@ SCHEMATIC_SETTINGS::SCHEMATIC_SETTINGS( JSON_SETTINGS* aParent, const std::strin
m_params.emplace_back( new PARAM<int>( "drawing.junction_size_choice", m_params.emplace_back( new PARAM<int>( "drawing.junction_size_choice",
&m_JunctionSizeChoice, defaultJunctionSizeChoice ) ); &m_JunctionSizeChoice, defaultJunctionSizeChoice ) );
m_params.emplace_back( new PARAM<int>( "drawing.hop_over_size_choice",
&m_HopOverSizeChoice, defaultHopOverSizeChoice ) );
m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>( "drawing.field_names", m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>( "drawing.field_names",
[&]() -> nlohmann::json [&]() -> nlohmann::json
{ {

View File

@ -62,6 +62,9 @@ public:
int m_JunctionSizeChoice; // none = 0, smallest = 1, small = 2, etc. int m_JunctionSizeChoice; // none = 0, smallest = 1, small = 2, etc.
int m_JunctionSize; // a runtime cache of the calculated size int m_JunctionSize; // a runtime cache of the calculated size
int m_HopOverSizeChoice; // none = 0, smallest = 1, etc.
double m_HopOverScale; // a runtime cache of the calculated lineWidth multiplier
int m_ConnectionGridSize; // usually 50mils (IU internally; mils in the JSON file) int m_ConnectionGridSize; // usually 50mils (IU internally; mils in the JSON file)
int m_AnnotateStartNum; // Starting value for annotation int m_AnnotateStartNum; // Starting value for annotation

View File

@ -559,7 +559,7 @@ void SCH_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList )
SetSheetNumberAndCount(); SetSheetNumberAndCount();
// Restore hop over shapes of wires, if any // Restore hop over shapes of wires, if any
if( eeconfig()->m_Appearance.show_hop_over ) if( m_schematic->Settings().m_HopOverScale > 0.0 )
{ {
for( SCH_ITEM* item : GetScreen()->Items() ) for( SCH_ITEM* item : GetScreen()->Items() )
{ {

View File

@ -713,15 +713,6 @@ public:
*/ */
double m_MinimumMarkerSeparationDistance; double m_MinimumMarkerSeparationDistance;
/**
* Default value for the Hop-Over Arc Radius, used to calculate the arc radius by multiplying
* the line width when drawing a hop-over in scenarios where a wire crosses another.
*
* Setting name: "HopOverArcRadius"
* Default value: 2.5
*/
double m_hopOverArcRadius;
/** /**
* When updating the net inspector, it either recalculates all nets or iterates through items * When updating the net inspector, it either recalculates all nets or iterates through items
* one-by-one. This value controls the threshold at which all nets are recalculated rather than * one-by-one. This value controls the threshold at which all nets are recalculated rather than