Browse Source

Sym edit: allow to drag pins with edges

Only applies when dragging an edge by the midpoint handle,
and only in the symbol editor if configured to do so.
pcb_db
John Beard 1 year ago
parent
commit
a4cbd0adb4
  1. 2
      eeschema/dialogs/panel_sym_editing_options.cpp
  2. 21
      eeschema/dialogs/panel_sym_editing_options_base.cpp
  3. 413
      eeschema/dialogs/panel_sym_editing_options_base.fbp
  4. 6
      eeschema/dialogs/panel_sym_editing_options_base.h
  5. 3
      eeschema/symbol_editor/symbol_editor_settings.cpp
  6. 8
      eeschema/symbol_editor/symbol_editor_settings.h
  7. 93
      eeschema/tools/ee_point_editor.cpp
  8. 7
      eeschema/tools/ee_point_editor.h
  9. 9
      libs/kimath/include/geometry/shape_utils.h
  10. 47
      libs/kimath/src/geometry/shape_utils.cpp

2
eeschema/dialogs/panel_sym_editing_options.cpp

@ -56,6 +56,7 @@ void PANEL_SYM_EDITING_OPTIONS::loadSymEditorSettings( SYMBOL_EDITOR_SETTINGS* a
m_pinPitch.SetValue( schIUScale.MilsToIU( aCfg->m_Repeat.pin_step ) );
m_spinRepeatLabel->SetValue( aCfg->m_Repeat.label_delta );
m_cbShowPinElectricalType->SetValue( aCfg->m_ShowPinElectricalType );
m_dragPinsWithEdges->SetValue( aCfg->m_dragPinsAlongWithEdges );
}
@ -83,6 +84,7 @@ bool PANEL_SYM_EDITING_OPTIONS::TransferDataFromWindow()
settings->m_Repeat.label_delta = m_spinRepeatLabel->GetValue();
settings->m_Repeat.pin_step = schIUScale.IUToMils( m_pinPitch.GetIntValue() );
settings->m_ShowPinElectricalType = m_cbShowPinElectricalType->GetValue();
settings->m_dragPinsAlongWithEdges = m_dragPinsWithEdges->GetValue();
// Force pin_step to a grid multiple
settings->m_Repeat.pin_step = KiROUND( double( settings->m_Repeat.pin_step ) / MIN_GRID ) * MIN_GRID;

21
eeschema/dialogs/panel_sym_editing_options_base.cpp

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version 4.0.0-0-g0efcecf)
// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
@ -140,6 +140,25 @@ PANEL_SYM_EDITING_OPTIONS_BASE::PANEL_SYM_EDITING_OPTIONS_BASE( wxWindow* parent
p1mainSizer->Add( leftColumn, 0, wxEXPAND, 5 );
wxBoxSizer* rightColumn;
rightColumn = new wxBoxSizer( wxVERTICAL );
m_generalOption = new wxStaticText( this, wxID_ANY, _("General editing"), wxDefaultPosition, wxDefaultSize, 0 );
m_generalOption->Wrap( -1 );
rightColumn->Add( m_generalOption, 0, wxLEFT|wxTOP, 13 );
m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
rightColumn->Add( m_staticline3, 0, wxEXPAND | wxALL, 5 );
m_dragPinsWithEdges = new wxCheckBox( this, wxID_ANY, _("Keep pins attached when dragging edges"), wxDefaultPosition, wxDefaultSize, 0 );
rightColumn->Add( m_dragPinsWithEdges, 0, wxBOTTOM|wxLEFT, 10 );
rightColumn->Add( 0, 15, 1, wxEXPAND, 5 );
p1mainSizer->Add( rightColumn, 1, wxEXPAND, 5 );
this->SetSizer( p1mainSizer );
this->Layout();

413
eeschema/dialogs/panel_sym_editing_options_base.fbp

@ -1,34 +1,36 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<wxFormBuilder_Project>
<FileVersion major="1" minor="17"/>
<FileVersion major="1" minor="18"/>
<object class="Project" expanded="true">
<property name="class_decoration"></property>
<property name="code_generation">C++</property>
<property name="disconnect_events">1</property>
<property name="disconnect_mode">source_name</property>
<property name="disconnect_php_events">0</property>
<property name="disconnect_python_events">0</property>
<property name="cpp_class_decoration"></property>
<property name="cpp_disconnect_events">1</property>
<property name="cpp_event_generation">connect</property>
<property name="cpp_help_provider">none</property>
<property name="cpp_namespace"></property>
<property name="cpp_precompiled_header"></property>
<property name="cpp_use_array_enum">0</property>
<property name="cpp_use_enum">0</property>
<property name="embedded_files_path">res</property>
<property name="encoding">UTF-8</property>
<property name="event_generation">connect</property>
<property name="file">panel_sym_editing_options_base</property>
<property name="first_id">1000</property>
<property name="help_provider">none</property>
<property name="image_path_wrapper_function_name"></property>
<property name="indent_with_spaces"></property>
<property name="internationalize">1</property>
<property name="lua_skip_events">1</property>
<property name="lua_ui_table">UI</property>
<property name="name">PanelSymEditingOptionsBase</property>
<property name="namespace"></property>
<property name="path">.</property>
<property name="precompiled_header"></property>
<property name="php_disconnect_events">0</property>
<property name="php_disconnect_mode">source_name</property>
<property name="php_skip_events">1</property>
<property name="python_disconnect_events">0</property>
<property name="python_disconnect_mode">source_name</property>
<property name="python_image_path_wrapper_function_name"></property>
<property name="python_indent_with_spaces"></property>
<property name="python_skip_events">1</property>
<property name="relative_path">1</property>
<property name="skip_lua_events">1</property>
<property name="skip_php_events">1</property>
<property name="skip_python_events">1</property>
<property name="ui_table">UI</property>
<property name="use_array_enum">0</property>
<property name="use_enum">0</property>
<property name="use_microsoft_bom">0</property>
<property name="use_native_eol">0</property>
<object class="Panel" expanded="true">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
@ -76,10 +78,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -148,10 +150,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -225,10 +227,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -290,10 +292,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -317,7 +319,7 @@
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="maxlength"></property>
<property name="maxlength">0</property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
@ -358,10 +360,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -423,10 +425,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -488,10 +490,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -553,10 +555,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -580,7 +582,7 @@
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="maxlength"></property>
<property name="maxlength">0</property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
@ -621,10 +623,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -686,10 +688,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -751,10 +753,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -778,7 +780,7 @@
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="maxlength"></property>
<property name="maxlength">0</property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
@ -819,10 +821,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -884,10 +886,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -949,10 +951,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -976,7 +978,7 @@
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="maxlength"></property>
<property name="maxlength">0</property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
@ -1017,10 +1019,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -1082,10 +1084,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -1147,10 +1149,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -1174,7 +1176,7 @@
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="maxlength"></property>
<property name="maxlength">0</property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
@ -1215,10 +1217,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -1279,10 +1281,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -1354,10 +1356,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -1426,10 +1428,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -1503,10 +1505,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -1568,10 +1570,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -1595,7 +1597,7 @@
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="maxlength"></property>
<property name="maxlength">0</property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
@ -1637,10 +1639,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -1702,10 +1704,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -1767,10 +1769,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></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>
@ -1825,6 +1827,213 @@
</object>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="true">
<property name="minimum_size"></property>
<property name="name">rightColumn</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="true">
<property name="border">13</property>
<property name="flag">wxLEFT|wxTOP</property>
<property name="proportion">0</property>
<object class="wxStaticText" 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="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">General editing</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_generalOption</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"></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="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxEXPAND | wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticLine" 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="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="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_staticline3</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">wxLI_HORIZONTAL</property>
<property name="subclass">; ; forward_declare</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>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">10</property>
<property name="flag">wxBOTTOM|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">Keep pins attached when dragging edges</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_dragPinsWithEdges</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"></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 class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="spacer" expanded="true">
<property name="height">15</property>
<property name="permission">protected</property>
<property name="width">0</property>
</object>
</object>
</object>
</object>
</object>
</object>
</object>

6
eeschema/dialogs/panel_sym_editing_options_base.h

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version 4.0.0-0-g0efcecf)
// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
@ -27,7 +27,6 @@
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// Class PANEL_SYM_EDITING_OPTIONS_BASE
///////////////////////////////////////////////////////////////////////////////
@ -62,6 +61,9 @@ class PANEL_SYM_EDITING_OPTIONS_BASE : public RESETTABLE_PANEL
wxStaticText* m_pinPitchUnits;
wxStaticText* m_labelIncrementLabel1;
wxSpinCtrl* m_spinRepeatLabel;
wxStaticText* m_generalOption;
wxStaticLine* m_staticline3;
wxCheckBox* m_dragPinsWithEdges;
// Virtual event handlers, override them in your derived class
virtual void onKillFocusPinPitch( wxFocusEvent& event ) { event.Skip(); }

3
eeschema/symbol_editor/symbol_editor_settings.cpp

@ -109,6 +109,9 @@ SYMBOL_EDITOR_SETTINGS::SYMBOL_EDITOR_SETTINGS() :
m_params.emplace_back( new PARAM<bool>( "show_hidden_lib_pins",
&m_ShowHiddenPins, true ) );
m_params.emplace_back( new PARAM<bool>( "drag_pins_along_with_edges",
&m_dragPinsAlongWithEdges, true ) );
m_params.emplace_back( new PARAM<int>( "lib_table_width",
&m_LibWidth, 250 ) );

8
eeschema/symbol_editor/symbol_editor_settings.h

@ -21,8 +21,7 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef SYMBOL_EDITOR_SETTINGS_H
#define SYMBOL_EDITOR_SETTINGS_H
#pragma once
#include <settings/app_settings.h>
#include <project/sch_project_settings.h>
@ -84,6 +83,9 @@ public:
bool m_ShowHiddenPins;
bool m_ShowHiddenFields;
///< When true, dragging an outline edge will drag pins rooted on it
bool m_dragPinsAlongWithEdges;
int m_LibWidth;
int m_LibrarySortMode;
@ -100,5 +102,3 @@ protected:
virtual std::string getLegacyFrameName() const override { return "LibeditFrame"; }
};
#endif

93
eeschema/tools/ee_point_editor.cpp

@ -32,6 +32,7 @@ using namespace std::placeholders;
#include <view/view_controls.h>
#include <gal/graphics_abstraction_layer.h>
#include <geometry/seg.h>
#include <geometry/shape_utils.h>
#include <tools/ee_actions.h>
#include <tools/ee_selection_tool.h>
#include <sch_edit_frame.h>
@ -40,6 +41,7 @@ using namespace std::placeholders;
#include <sch_sheet.h>
#include <sch_textbox.h>
#include <sch_table.h>
#include <symbol_editor/symbol_editor_settings.h>
static const std::vector<KICAD_T> pointEditorTypes = { SCH_SHAPE_T,
@ -489,7 +491,7 @@ int EE_POINT_EDITOR::Main( const TOOL_EVENT& aEvent )
m_editedPoint->SetPosition( controls->GetCursorPosition( snap ) );
updateParentItem( snap );
updateParentItem( snap, commit );
updatePoints();
}
else if( inDrag && evt->IsMouseUp( BUT_LEFT ) )
@ -650,7 +652,76 @@ void EE_POINT_EDITOR::pinEditedCorner( int minWidth, int minHeight, VECTOR2I& to
}
void EE_POINT_EDITOR::updateParentItem( bool aSnapToGrid ) const
void EE_POINT_EDITOR::dragPinsOnEdge( const std::vector<SEG>& aOldEdges,
const std::vector<VECTOR2I>& aMoveVecs, int aEdgeUnit,
SCH_COMMIT& aCommit ) const
{
wxCHECK( aOldEdges.size() == aMoveVecs.size(), /* void */ );
// This only make sense in the symbol editor
if( !m_frame->IsType( FRAME_SCH_SYMBOL_EDITOR ) )
return;
SYMBOL_EDIT_FRAME& editor = static_cast<SYMBOL_EDIT_FRAME&>( *m_frame );
// And only if the setting is enabled
if( !editor.GetSettings()->m_dragPinsAlongWithEdges )
return;
// Adjuting pins on a different unit to a unit-limited shape
// seems suspect.
wxCHECK( aEdgeUnit == 0 || aEdgeUnit == editor.GetUnit(), /* void */ );
/*
* Get a list of pins on a line segment
*/
const auto getPinsOnSeg = []( LIB_SYMBOL& aSymbol, int aUnit, const SEG& aSeg,
bool aIncludeEnds ) -> std::vector<SCH_PIN*>
{
// const BOX2I segBox = BOX2I::ByCorners( aSeg.A, aSeg.B ).GetInflated( 1 );
// const EE_RTREE& rtree = m_frame->GetScreen()->Items().Overlapping( SCH_PIN_T, segBox );
std::vector<SCH_PIN*> pins;
for( SCH_PIN* pin : aSymbol.GetPins( aUnit ) )
{
// Figure out if the pin "connects" to the line
const VECTOR2I pinRootPos = pin->GetPinRoot();
if( aSeg.Contains( pinRootPos ) )
{
if( aIncludeEnds || ( pinRootPos != aSeg.A && pinRootPos != aSeg.B ) )
{
pins.push_back( pin );
}
}
}
return pins;
};
LIB_SYMBOL* const symbol = editor.GetCurSymbol();
for( std::size_t i = 0; i < aOldEdges.size(); ++i )
{
if( aMoveVecs[i] == VECTOR2I( 0, 0 ) || !symbol )
continue;
const std::vector<SCH_PIN*> pins = getPinsOnSeg( *symbol, aEdgeUnit, aOldEdges[i], false );
for( SCH_PIN* pin : pins )
{
// Move the pin
aCommit.Modify( pin, m_frame->GetScreen() );
pin->Move( aMoveVecs[i] );
updateItem( pin, true );
}
}
}
void EE_POINT_EDITOR::updateParentItem( bool aSnapToGrid, SCH_COMMIT& aCommit ) const
{
EDA_ITEM* item = m_editPoints->GetParent();
@ -714,31 +785,49 @@ void EE_POINT_EDITOR::updateParentItem( bool aSnapToGrid ) const
pinEditedCorner( schIUScale.MilsToIU( 1 ), schIUScale.MilsToIU( 1 ), topLeft, topRight,
botLeft, botRight, &gridHelper );
const BOX2I oldBox = BOX2I::ByCorners( shape->GetStart(), shape->GetEnd() );
std::vector<SEG> oldSegs;
std::vector<VECTOR2I> moveVecs;
if( isModified( m_editPoints->Point( RECT_TOPLEFT ) )
|| isModified( m_editPoints->Point( RECT_TOPRIGHT ) )
|| isModified( m_editPoints->Point( RECT_BOTRIGHT ) )
|| isModified( m_editPoints->Point( RECT_BOTLEFT ) ) )
{
// Corner drags don't update pins. Not only is it an escape hatch to avoid
// moving pins, it also avoids tricky problems when the pins "fall off"
// the ends of one of the two segments and get either left behind or
// "swept up" into the corner.
shape->SetPosition( topLeft );
shape->SetEnd( botRight );
}
else if( isModified( m_editPoints->Line( RECT_TOP ) ) )
{
oldSegs = KIGEOM::GetSegsInDirection( oldBox, DIRECTION_45::Directions::N );
moveVecs.emplace_back( 0, topLeft.y - oldBox.GetTop() );
shape->SetStartY( topLeft.y );
}
else if( isModified( m_editPoints->Line( RECT_LEFT ) ) )
{
oldSegs = KIGEOM::GetSegsInDirection( oldBox, DIRECTION_45::Directions::W );
moveVecs.emplace_back( topLeft.x - oldBox.GetLeft(), 0 );
shape->SetStartX( topLeft.x );
}
else if( isModified( m_editPoints->Line( RECT_BOT ) ) )
{
oldSegs = KIGEOM::GetSegsInDirection( oldBox, DIRECTION_45::Directions::S );
moveVecs.emplace_back( 0, botRight.y - oldBox.GetBottom() );
shape->SetEndY( botRight.y );
}
else if( isModified( m_editPoints->Line( RECT_RIGHT ) ) )
{
oldSegs = KIGEOM::GetSegsInDirection( oldBox, DIRECTION_45::Directions::E );
moveVecs.emplace_back( botRight.x - oldBox.GetRight(), 0 );
shape->SetEndX( botRight.x );
}
dragPinsOnEdge( oldSegs, moveVecs, shape->GetUnit(), aCommit );
for( unsigned i = 0; i < m_editPoints->LinesSize(); ++i )
{
if( !isModified( m_editPoints->Line( i ) ) )

7
eeschema/tools/ee_point_editor.h

@ -31,6 +31,7 @@
class EE_SELECTION_TOOL;
class SCH_BASE_FRAME;
class SCH_COMMIT;
/**
* Tool that displays edit points allowing to modify items by dragging the points.
@ -59,7 +60,11 @@ public:
private:
///< Update item's points with edit points.
void updateParentItem( bool aSnapToGrid ) const;
void updateParentItem( bool aSnapToGrid, SCH_COMMIT& aCommit ) const;
///< When dragging a graphics edge, update pins too.
void dragPinsOnEdge( const std::vector<SEG>& aOldEdges, const std::vector<VECTOR2I>& aMoveVecs,
int aUnit, SCH_COMMIT& aCommit ) const;
///< Update edit points with item's points.
void updatePoints();

9
libs/kimath/include/geometry/shape_utils.h

@ -75,6 +75,15 @@ OPT_VECTOR2I GetSharedEndpoint( const SEG& aSegA, const SEG& aSegB );
*/
std::array<SEG, 4> BoxToSegs( const BOX2I& aBox );
/**
* Get the segments of a box that are in the given direction.
*
* N,E,S,W are the sides of the box.
* NE,SE,SW,NW are the corners of the box, which return the two segments that meet at the corner,
* in the order of the direction (e.g. NW = N, then W).
*/
std::vector<SEG> GetSegsInDirection( const BOX2I& aBox, DIRECTION_45::Directions aDir );
/**
* Get the segment of a half-line that is inside a box, if any.
*/

47
libs/kimath/src/geometry/shape_utils.cpp

@ -80,6 +80,53 @@ std::array<SEG, 4> KIGEOM::BoxToSegs( const BOX2I& aBox )
}
std::vector<SEG> KIGEOM::GetSegsInDirection( const BOX2I& aBox, DIRECTION_45::Directions aDir )
{
// clang-format off
switch( aDir )
{
case DIRECTION_45::Directions::N:
return { SEG{ { aBox.GetLeft(), aBox.GetTop() },
{ aBox.GetRight(), aBox.GetTop() } } };
case DIRECTION_45::Directions::E:
return { SEG{ { aBox.GetRight(), aBox.GetTop() },
{ aBox.GetRight(), aBox.GetBottom() } } };
case DIRECTION_45::Directions::S:
return { SEG{ { aBox.GetLeft(), aBox.GetBottom() },
{ aBox.GetRight(), aBox.GetBottom() } } };
case DIRECTION_45::Directions::W:
return { SEG{ { aBox.GetLeft(), aBox.GetTop() },
{ aBox.GetLeft(), aBox.GetBottom() } } };
case DIRECTION_45::Directions::NE:
return { SEG{ { aBox.GetLeft(), aBox.GetTop() },
{ aBox.GetRight(), aBox.GetTop() } },
SEG{ { aBox.GetRight(), aBox.GetTop() },
{ aBox.GetRight(), aBox.GetBottom() } } };
case DIRECTION_45::Directions::SE:
return { SEG{ { aBox.GetLeft(), aBox.GetBottom() },
{ aBox.GetRight(), aBox.GetBottom() } },
SEG{ { aBox.GetRight(), aBox.GetTop() },
{ aBox.GetRight(), aBox.GetBottom() } } };
case DIRECTION_45::Directions::SW:
return { SEG{ { aBox.GetLeft(), aBox.GetBottom() },
{ aBox.GetRight(), aBox.GetBottom() } },
SEG{ { aBox.GetLeft(), aBox.GetTop() },
{ aBox.GetLeft(), aBox.GetBottom() } } };
case DIRECTION_45::Directions::NW:
return { SEG{ { aBox.GetLeft(), aBox.GetTop() },
{ aBox.GetRight(), aBox.GetTop() } },
SEG{ { aBox.GetLeft(), aBox.GetTop() },
{ aBox.GetLeft(), aBox.GetBottom() } } };
case DIRECTION_45::Directions::LAST:
case DIRECTION_45::Directions::UNDEFINED: break;
}
// clang-format on
wxASSERT( false );
return {};
};
std::optional<SEG> KIGEOM::ClipHalfLineToBox( const HALF_LINE& aRay, const BOX2I& aBox )
{
// Do the naive implementation - if this really is done in a tight loop,

Loading…
Cancel
Save