Make collision markers themeable
Adds configuration for line thickness and color. Also ensures overwritten lines don't obscure net values and prevent marker listing
This commit is contained in:
+2
-1
@@ -111,8 +111,9 @@ wxString LayerName( int aLayer )
|
||||
case LAYER_HOVERED: return _( "Hovered items" );
|
||||
case LAYER_BRIGHTENED: return _( "Highlighted items" );
|
||||
case LAYER_HIDDEN: return _( "Hidden items" );
|
||||
case LAYER_SELECTION_SHADOWS: return _( "Selection highlight" );
|
||||
case LAYER_NET_COLOR_HIGHLIGHT: return _( "Net color highlight" );
|
||||
case LAYER_DRAG_NET_COLLISION: return _( "Drag net collisions" );
|
||||
case LAYER_SELECTION_SHADOWS: return _( "Selection highlight" );
|
||||
case LAYER_SCHEMATIC_DRAWINGSHEET: return _( "Drawing sheet" );
|
||||
case LAYER_SCHEMATIC_PAGE_LIMITS: return _( "Page limits" );
|
||||
case LAYER_OP_VOLTAGES: return _( "Operating point voltages" );
|
||||
|
||||
@@ -51,6 +51,7 @@ static const std::map<int, COLOR4D> s_defaultTheme =
|
||||
{ LAYER_HIERLABEL, CSS_COLOR( 114, 86, 0, 1 ) },
|
||||
{ LAYER_LOCLABEL, CSS_COLOR( 15, 15, 15, 1 ) },
|
||||
{ LAYER_NETCLASS_REFS, CSS_COLOR( 72, 72, 72, 1 ) },
|
||||
{ LAYER_DRAG_NET_COLLISION, CSS_COLOR( 230, 9, 13, 0.8 ) },
|
||||
{ LAYER_RULE_AREAS, CSS_COLOR( 255, 0, 0, 1 ) },
|
||||
{ LAYER_NOCONNECT, CSS_COLOR( 0, 0, 132, 1 ) },
|
||||
{ LAYER_NOTES, CSS_COLOR( 0, 0, 194, 1 ) },
|
||||
@@ -332,6 +333,7 @@ static const std::map<int, COLOR4D> s_classicTheme =
|
||||
{ LAYER_HIERLABEL, COLOR4D( BROWN ) },
|
||||
{ LAYER_LOCLABEL, COLOR4D( BLACK ) },
|
||||
{ LAYER_NETCLASS_REFS, COLOR4D( BLACK ) },
|
||||
{ LAYER_DRAG_NET_COLLISION, COLOR4D( PURERED ).WithAlpha( 0.8 ) },
|
||||
{ LAYER_RULE_AREAS, COLOR4D( RED ) },
|
||||
{ LAYER_NOCONNECT, COLOR4D( BLUE ) },
|
||||
{ LAYER_NOTES, COLOR4D( LIGHTBLUE ) },
|
||||
|
||||
@@ -76,6 +76,7 @@ COLOR_SETTINGS::COLOR_SETTINGS( const wxString& aFilename, bool aAbsolutePath )
|
||||
CLR( "schematic.label_hier", LAYER_HIERLABEL );
|
||||
CLR( "schematic.label_local", LAYER_LOCLABEL );
|
||||
CLR( "schematic.netclass_flag", LAYER_NETCLASS_REFS );
|
||||
CLR( "schematic.drag_net_collision", LAYER_DRAG_NET_COLLISION );
|
||||
CLR( "schematic.rule_area", LAYER_RULE_AREAS );
|
||||
CLR( "schematic.no_connect", LAYER_NOCONNECT );
|
||||
CLR( "schematic.note", LAYER_NOTES );
|
||||
|
||||
@@ -66,6 +66,7 @@ void PANEL_EESCHEMA_DISPLAY_OPTIONS::loadEEschemaSettings( EESCHEMA_SETTINGS* cf
|
||||
m_checkSelDrawChildItems->SetValue( cfg->m_Selection.draw_selected_children );
|
||||
m_checkSelFillShapes->SetValue( cfg->m_Selection.fill_shapes );
|
||||
m_selWidthCtrl->SetValue( cfg->m_Selection.selection_thickness );
|
||||
m_collisionMarkerWidthCtrl->SetValue( cfg->m_Selection.drag_net_collision_width );
|
||||
m_highlightWidthCtrl->SetValue( cfg->m_Selection.highlight_thickness );
|
||||
m_highlightNetclassColors->SetValue( cfg->m_Selection.highlight_netclass_colors );
|
||||
m_colHighlightThickness->SetValue( cfg->m_Selection.highlight_netclass_colors_thickness );
|
||||
@@ -109,6 +110,7 @@ bool PANEL_EESCHEMA_DISPLAY_OPTIONS::TransferDataFromWindow()
|
||||
cfg->m_Selection.draw_selected_children = m_checkSelDrawChildItems->GetValue();
|
||||
cfg->m_Selection.fill_shapes = m_checkSelFillShapes->GetValue();
|
||||
cfg->m_Selection.selection_thickness = KiROUND( m_selWidthCtrl->GetValue() );
|
||||
cfg->m_Selection.drag_net_collision_width = KiROUND( m_collisionMarkerWidthCtrl->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_thickness = m_colHighlightThickness->GetValue();
|
||||
|
||||
@@ -185,12 +185,20 @@ PANEL_EESCHEMA_DISPLAY_OPTIONS_BASE::PANEL_EESCHEMA_DISPLAY_OPTIONS_BASE( wxWind
|
||||
m_selWidthCtrl->SetDigits( 0 );
|
||||
gbSizer1->Add( m_selWidthCtrl, wxGBPosition( 0, 1 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxTOP, 5 );
|
||||
|
||||
m_highlightColorNote = new wxStaticText( this, wxID_ANY, _("(selection color can be edited in the \"Colors\" page)"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_highlightColorNote->Wrap( -1 );
|
||||
gbSizer1->Add( m_highlightColorNote, wxGBPosition( 1, 0 ), wxGBSpan( 1, 2 ), wxRIGHT|wxLEFT, 5 );
|
||||
m_highlightColorNote = new wxStaticText( this, wxID_ANY, _("(selection color can be edited in the \"Colors\" page)"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_highlightColorNote->Wrap( -1 );
|
||||
gbSizer1->Add( m_highlightColorNote, wxGBPosition( 1, 0 ), wxGBSpan( 1, 2 ), wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_highlightWidthLabel = new wxStaticText( this, wxID_ANY, _("Highlight thickness:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_highlightWidthLabel->Wrap( -1 );
|
||||
m_collisionMarkerWidthLabel = new wxStaticText( this, wxID_ANY, _("Net collision marker width:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_collisionMarkerWidthLabel->Wrap( -1 );
|
||||
gbSizer1->Add( m_collisionMarkerWidthLabel, wxGBPosition( 2, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
|
||||
|
||||
m_collisionMarkerWidthCtrl = new wxSpinCtrlDouble( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT|wxSP_ARROW_KEYS, 1, 50, 4.000000, 1 );
|
||||
m_collisionMarkerWidthCtrl->SetDigits( 0 );
|
||||
gbSizer1->Add( m_collisionMarkerWidthCtrl, wxGBPosition( 2, 1 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
m_highlightWidthLabel = new wxStaticText( this, wxID_ANY, _("Highlight thickness:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_highlightWidthLabel->Wrap( -1 );
|
||||
gbSizer1->Add( m_highlightWidthLabel, wxGBPosition( 3, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT, 5 );
|
||||
|
||||
m_highlightWidthCtrl = new wxSpinCtrlDouble( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT|wxSP_ARROW_KEYS, 0, 50, 2.000000, 1 );
|
||||
|
||||
@@ -2047,6 +2047,273 @@
|
||||
<property name="wrap">-1</property>
|
||||
</object>
|
||||
</object>
|
||||
<object class="gbsizeritem" expanded="false">
|
||||
<property name="border">5</property>
|
||||
<property name="colspan">1</property>
|
||||
<property name="column">0</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT</property>
|
||||
<property name="row">2</property>
|
||||
<property name="rowspan">1</property>
|
||||
<object class="wxStaticText" expanded="false">
|
||||
<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="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">Net collision marker width:</property>
|
||||
<property name="markup">0</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_collisionMarkerWidthLabel</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"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
</object>
|
||||
</object>
|
||||
<object class="gbsizeritem" expanded="false">
|
||||
<property name="border">5</property>
|
||||
<property name="colspan">1</property>
|
||||
<property name="column">1</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL</property>
|
||||
<property name="row">2</property>
|
||||
<property name="rowspan">1</property>
|
||||
<object class="wxSpinCtrlDouble" expanded="false">
|
||||
<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="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="digits">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="inc">1</property>
|
||||
<property name="initial">4.000000</property>
|
||||
<property name="max">50</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min">1</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_collisionMarkerWidthCtrl</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">wxALIGN_RIGHT|wxSP_ARROW_KEYS</property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="value"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
</object>
|
||||
</object>
|
||||
|
||||
<object class="gbsizeritem" expanded="false">
|
||||
<property name="border">5</property>
|
||||
<property name="colspan">1</property>
|
||||
<property name="column">0</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT</property>
|
||||
<property name="row">2</property>
|
||||
<property name="rowspan">1</property>
|
||||
<object class="wxStaticText" expanded="false">
|
||||
<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="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">Net collision marker width:</property>
|
||||
<property name="markup">0</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_collisionMarkerWidthLabel</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"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
</object>
|
||||
</object>
|
||||
<object class="gbsizeritem" expanded="false">
|
||||
<property name="border">5</property>
|
||||
<property name="colspan">1</property>
|
||||
<property name="column">1</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL</property>
|
||||
<property name="row">2</property>
|
||||
<property name="rowspan">1</property>
|
||||
<object class="wxSpinCtrlDouble" expanded="false">
|
||||
<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="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="digits">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="inc">1</property>
|
||||
<property name="initial">4.000000</property>
|
||||
<property name="max">50</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min">1</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_collisionMarkerWidthCtrl</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">wxALIGN_RIGHT|wxSP_ARROW_KEYS</property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="value"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
</object>
|
||||
</object>
|
||||
<object class="gbsizeritem" expanded="false">
|
||||
<property name="border">5</property>
|
||||
<property name="colspan">1</property>
|
||||
|
||||
@@ -63,11 +63,13 @@ class PANEL_EESCHEMA_DISPLAY_OPTIONS_BASE : public RESETTABLE_PANEL
|
||||
wxStaticText* m_selectionLabel;
|
||||
wxStaticLine* m_staticline2;
|
||||
wxCheckBox* m_checkSelDrawChildItems;
|
||||
wxCheckBox* m_checkSelFillShapes;
|
||||
wxStaticText* m_selWidthLabel;
|
||||
wxSpinCtrlDouble* m_selWidthCtrl;
|
||||
wxStaticText* m_highlightColorNote;
|
||||
wxStaticText* m_highlightWidthLabel;
|
||||
wxCheckBox* m_checkSelFillShapes;
|
||||
wxStaticText* m_selWidthLabel;
|
||||
wxSpinCtrlDouble* m_selWidthCtrl;
|
||||
wxStaticText* m_collisionMarkerWidthLabel;
|
||||
wxSpinCtrlDouble* m_collisionMarkerWidthCtrl;
|
||||
wxStaticText* m_highlightColorNote;
|
||||
wxStaticText* m_highlightWidthLabel;
|
||||
wxSpinCtrlDouble* m_highlightWidthCtrl;
|
||||
wxCheckBox* m_highlightNetclassColors;
|
||||
wxStaticText* m_colorHighlightLabel;
|
||||
|
||||
@@ -419,6 +419,9 @@ EESCHEMA_SETTINGS::EESCHEMA_SETTINGS() :
|
||||
m_params.emplace_back( new PARAM<double>( "selection.highlight_netclass_colors_alpha",
|
||||
&m_Selection.highlight_netclass_colors_alpha, 0.6, 0, 1 ) );
|
||||
|
||||
m_params.emplace_back( new PARAM<int>( "selection.drag_net_collision_width",
|
||||
&m_Selection.drag_net_collision_width, 4, 1, 50 ) );
|
||||
|
||||
m_params.emplace_back( new PARAM<bool>( "annotation.automatic",
|
||||
&m_AnnotatePanel.automatic, true ) );
|
||||
|
||||
|
||||
@@ -195,6 +195,7 @@ public:
|
||||
bool highlight_netclass_colors;
|
||||
int highlight_netclass_colors_thickness;
|
||||
double highlight_netclass_colors_alpha;
|
||||
int drag_net_collision_width;
|
||||
};
|
||||
|
||||
struct PAGE_SETTINGS
|
||||
|
||||
@@ -38,6 +38,9 @@
|
||||
#include <view/view.h>
|
||||
#include <view/view_overlay.h>
|
||||
#include <gal/color4d.h>
|
||||
#include <layer_ids.h>
|
||||
#include <settings/color_settings.h>
|
||||
#include <eeschema_settings.h>
|
||||
|
||||
SCH_DRAG_NET_COLLISION_MONITOR::SCH_DRAG_NET_COLLISION_MONITOR( SCH_EDIT_FRAME* aFrame,
|
||||
KIGFX::VIEW* aView ) :
|
||||
@@ -142,17 +145,43 @@ bool SCH_DRAG_NET_COLLISION_MONITOR::Update( const std::vector<SCH_JUNCTION*>& a
|
||||
|
||||
wxLogTrace( "KICAD_SCH_DRAG_NET_COLLISION", "Update: Drawing %zu collision markers", markers.size() );
|
||||
|
||||
COLOR4D baseColor( 1.0, 0.0, 0.0, 0.8 );
|
||||
|
||||
if( COLOR_SETTINGS* colorSettings = m_frame->GetColorSettings() )
|
||||
{
|
||||
COLOR4D themeColor = colorSettings->GetColor( LAYER_DRAG_NET_COLLISION );
|
||||
|
||||
if( themeColor != COLOR4D::UNSPECIFIED )
|
||||
baseColor = themeColor;
|
||||
}
|
||||
|
||||
double baseAlpha = baseColor.a;
|
||||
|
||||
if( baseAlpha <= 0.0 )
|
||||
baseAlpha = 1.0;
|
||||
|
||||
double fillAlpha = std::clamp( baseAlpha * 0.35, 0.05, 1.0 );
|
||||
double strokeAlpha = std::clamp( baseAlpha, 0.05, 1.0 );
|
||||
|
||||
m_overlay->SetIsFill( true );
|
||||
m_overlay->SetFillColor( COLOR4D( 1.0, 0.0, 0.0, 0.25 ) );
|
||||
m_overlay->SetFillColor( baseColor.WithAlpha( fillAlpha ) );
|
||||
m_overlay->SetIsStroke( true );
|
||||
m_overlay->SetStrokeColor( COLOR4D( 1.0, 0.0, 0.0, 0.7 ) );
|
||||
m_overlay->SetStrokeColor( baseColor.WithAlpha( strokeAlpha ) );
|
||||
|
||||
int lineWidthPixels = 4;
|
||||
|
||||
if( EESCHEMA_SETTINGS* cfg = m_frame->eeconfig() )
|
||||
lineWidthPixels = std::max( cfg->m_Selection.drag_net_collision_width, 1 );
|
||||
|
||||
double lineWidth = m_view->ToWorld( lineWidthPixels );
|
||||
|
||||
if( lineWidth <= 0.0 )
|
||||
lineWidth = 1.0;
|
||||
|
||||
m_overlay->SetLineWidth( lineWidth );
|
||||
|
||||
for( const COLLISION_MARKER& marker : markers )
|
||||
{
|
||||
double lineWidth = std::max( marker.radius * 0.3, 1.0 );
|
||||
m_overlay->SetLineWidth( lineWidth );
|
||||
m_overlay->Circle( marker.position, marker.radius );
|
||||
}
|
||||
|
||||
m_view->Update( m_overlay.get() );
|
||||
m_hasCollision = true;
|
||||
@@ -217,6 +246,9 @@ std::optional<SCH_DRAG_NET_COLLISION_MONITOR::COLLISION_MARKER> SCH_DRAG_NET_COL
|
||||
|
||||
std::unordered_set<int> allNetCodes;
|
||||
std::unordered_set<int> movedNetCodes;
|
||||
std::unordered_set<int> originalNetCodes;
|
||||
std::unordered_set<int> movedOriginalNetCodes;
|
||||
std::unordered_set<int> stationaryOriginalNetCodes;
|
||||
|
||||
auto accumulateNet = [&]( SCH_ITEM* item )
|
||||
{
|
||||
@@ -241,7 +273,12 @@ std::optional<SCH_DRAG_NET_COLLISION_MONITOR::COLLISION_MARKER> SCH_DRAG_NET_COL
|
||||
}
|
||||
|
||||
auto previewIt = aPreviewNetCodes.find( item );
|
||||
auto originalIt = m_itemNetCodes.find( item );
|
||||
std::optional<int> netCodeOpt;
|
||||
std::optional<int> originalNetOpt;
|
||||
|
||||
if( originalIt != m_itemNetCodes.end() )
|
||||
originalNetOpt = originalIt->second;
|
||||
|
||||
if( previewIt != aPreviewNetCodes.end() )
|
||||
{
|
||||
@@ -250,26 +287,34 @@ std::optional<SCH_DRAG_NET_COLLISION_MONITOR::COLLISION_MARKER> SCH_DRAG_NET_COL
|
||||
item, item->GetClass().c_str(),
|
||||
netCodeOpt.has_value() ? std::to_string( *netCodeOpt ).c_str() : "none" );
|
||||
}
|
||||
else if( originalIt != m_itemNetCodes.end() )
|
||||
{
|
||||
netCodeOpt = originalIt->second;
|
||||
wxLogTrace( "KICAD_SCH_DRAG_NET_COLLISION", " accumulateNet: item %p (%s) using cached net %s",
|
||||
item, item->GetClass().c_str(),
|
||||
netCodeOpt.has_value() ? std::to_string( *netCodeOpt ).c_str() : "none" );
|
||||
}
|
||||
else
|
||||
{
|
||||
auto it = m_itemNetCodes.find( item );
|
||||
|
||||
if( it != m_itemNetCodes.end() )
|
||||
{
|
||||
netCodeOpt = it->second;
|
||||
wxLogTrace( "KICAD_SCH_DRAG_NET_COLLISION", " accumulateNet: item %p (%s) using cached net %s",
|
||||
item, item->GetClass().c_str(),
|
||||
netCodeOpt.has_value() ? std::to_string( *netCodeOpt ).c_str() : "none" );
|
||||
}
|
||||
else
|
||||
{
|
||||
wxLogTrace( "KICAD_SCH_DRAG_NET_COLLISION", " accumulateNet: item %p (%s) has no net code",
|
||||
item, item->GetClass().c_str() );
|
||||
}
|
||||
wxLogTrace( "KICAD_SCH_DRAG_NET_COLLISION", " accumulateNet: item %p (%s) has no net code",
|
||||
item, item->GetClass().c_str() );
|
||||
}
|
||||
|
||||
bool isSelectionItem = item->IsSelected() || aSelection.Contains( item );
|
||||
bool isMoved = ( previewIt != aPreviewNetCodes.end() ) || isSelectionItem;
|
||||
|
||||
if( !netCodeOpt )
|
||||
{
|
||||
if( originalNetOpt )
|
||||
{
|
||||
originalNetCodes.insert( *originalNetOpt );
|
||||
|
||||
if( isSelectionItem )
|
||||
movedOriginalNetCodes.insert( *originalNetOpt );
|
||||
else
|
||||
stationaryOriginalNetCodes.insert( *originalNetOpt );
|
||||
}
|
||||
|
||||
wxLogTrace( "KICAD_SCH_DRAG_NET_COLLISION", " accumulateNet: item %p (%s) netCode is nullopt",
|
||||
item, item->GetClass().c_str() );
|
||||
return;
|
||||
@@ -278,15 +323,21 @@ std::optional<SCH_DRAG_NET_COLLISION_MONITOR::COLLISION_MARKER> SCH_DRAG_NET_COL
|
||||
int netCode = *netCodeOpt;
|
||||
allNetCodes.insert( netCode );
|
||||
|
||||
bool isMoved = ( previewIt != aPreviewNetCodes.end()
|
||||
|| item->IsSelected()
|
||||
|| aSelection.Contains( item ) );
|
||||
|
||||
wxLogTrace( "KICAD_SCH_DRAG_NET_COLLISION", " accumulateNet: item %p (%s) net %d, moved=%s",
|
||||
item, item->GetClass().c_str(), netCode, isMoved ? "yes" : "no" );
|
||||
|
||||
if( isMoved )
|
||||
movedNetCodes.insert( netCode );
|
||||
|
||||
if( originalNetOpt )
|
||||
{
|
||||
originalNetCodes.insert( *originalNetOpt );
|
||||
|
||||
if( isSelectionItem )
|
||||
movedOriginalNetCodes.insert( *originalNetOpt );
|
||||
else
|
||||
stationaryOriginalNetCodes.insert( *originalNetOpt );
|
||||
}
|
||||
};
|
||||
|
||||
wxLogTrace( "KICAD_SCH_DRAG_NET_COLLISION", "analyzeJunction: Checking items overlapping position" );
|
||||
@@ -316,6 +367,26 @@ std::optional<SCH_DRAG_NET_COLLISION_MONITOR::COLLISION_MARKER> SCH_DRAG_NET_COL
|
||||
wxLogTrace( "KICAD_SCH_DRAG_NET_COLLISION", " - Net %d", netCode );
|
||||
}
|
||||
|
||||
wxLogTrace( "KICAD_SCH_DRAG_NET_COLLISION",
|
||||
"analyzeJunction: Original nets=%zu, moved originals=%zu, stationary originals=%zu",
|
||||
originalNetCodes.size(), movedOriginalNetCodes.size(), stationaryOriginalNetCodes.size() );
|
||||
|
||||
if( !movedOriginalNetCodes.empty() )
|
||||
{
|
||||
wxLogTrace( "KICAD_SCH_DRAG_NET_COLLISION", "analyzeJunction: Moved original nets:" );
|
||||
|
||||
for( int netCode : movedOriginalNetCodes )
|
||||
wxLogTrace( "KICAD_SCH_DRAG_NET_COLLISION", " - Net %d", netCode );
|
||||
}
|
||||
|
||||
if( !stationaryOriginalNetCodes.empty() )
|
||||
{
|
||||
wxLogTrace( "KICAD_SCH_DRAG_NET_COLLISION", "analyzeJunction: Stationary original nets:" );
|
||||
|
||||
for( int netCode : stationaryOriginalNetCodes )
|
||||
wxLogTrace( "KICAD_SCH_DRAG_NET_COLLISION", " - Net %d", netCode );
|
||||
}
|
||||
|
||||
if( allNetCodes.size() >= 2 )
|
||||
{
|
||||
wxLogTrace( "KICAD_SCH_DRAG_NET_COLLISION", "analyzeJunction: All nets at junction:" );
|
||||
@@ -324,13 +395,41 @@ std::optional<SCH_DRAG_NET_COLLISION_MONITOR::COLLISION_MARKER> SCH_DRAG_NET_COL
|
||||
wxLogTrace( "KICAD_SCH_DRAG_NET_COLLISION", " - Net %d", netCode );
|
||||
}
|
||||
|
||||
if( movedNetCodes.empty() || allNetCodes.size() < 2 )
|
||||
bool previewCollision = !movedNetCodes.empty() && allNetCodes.size() >= 2;
|
||||
|
||||
bool originalCollision = false;
|
||||
|
||||
if( !movedOriginalNetCodes.empty() && !stationaryOriginalNetCodes.empty() )
|
||||
{
|
||||
for( int movedNet : movedOriginalNetCodes )
|
||||
{
|
||||
for( int stationaryNet : stationaryOriginalNetCodes )
|
||||
{
|
||||
if( movedNet != stationaryNet )
|
||||
{
|
||||
originalCollision = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if( originalCollision )
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if( !previewCollision && !originalCollision )
|
||||
{
|
||||
wxLogTrace( "KICAD_SCH_DRAG_NET_COLLISION", "analyzeJunction: No collision (movedNets=%zu, allNets=%zu)",
|
||||
movedNetCodes.size(), allNetCodes.size() );
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
if( originalCollision && !previewCollision )
|
||||
{
|
||||
wxLogTrace( "KICAD_SCH_DRAG_NET_COLLISION",
|
||||
"analyzeJunction: Original net mismatch detected under moved endpoints" );
|
||||
}
|
||||
|
||||
COLLISION_MARKER marker;
|
||||
marker.position = position;
|
||||
double base = static_cast<double>( aJunction->GetEffectiveDiameter() );
|
||||
|
||||
@@ -491,6 +491,7 @@ enum SCH_LAYER_ID : int
|
||||
LAYER_BRIGHTENED,
|
||||
LAYER_HIDDEN,
|
||||
LAYER_NET_COLOR_HIGHLIGHT,
|
||||
LAYER_DRAG_NET_COLLISION,
|
||||
LAYER_SELECTION_SHADOWS,
|
||||
LAYER_SCHEMATIC_DRAWINGSHEET,
|
||||
LAYER_SCHEMATIC_PAGE_LIMITS,
|
||||
|
||||
Reference in New Issue
Block a user