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:
Seth Hillbrand
2025-10-11 15:43:58 -07:00
parent 42de520ff1
commit 1a7c6d0bdc
11 changed files with 423 additions and 36 deletions
+2 -1
View File
@@ -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" );
+2
View File
@@ -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 ) },
+1
View File
@@ -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;
+3
View File
@@ -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 ) );
+1
View File
@@ -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
+124 -25
View File
@@ -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() );
+1
View File
@@ -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,