Make moving pads independent of footprint much harder with new setting
It is still possible to move a pad independent of footprint through the pad properties dialog. This is a much more conscious decision than using the move tools. ADDED: "Allow free pads" preference setting in pcbnew, default to off. When enabled, allows moving unlocked pads independent of the footprint (i.e. previous behaviour). When disabled (default), any attempt to move a pad will move the parent footprint instead. REMOVED: "Lock pads of newly added footprints" preference setting in pcbnew. (Pad lock state is now loaded from the footprint definition) CHANGED: There are now only two possible lock states for a footprint: locked and unlocked. The lock state of the pads in the footprint is now independent of the footprint lock state. Also fixed a latent bug that would allow a pad to be moved when the parent footprint was locked (see m_selectionTool->RequestSelection lambdas in edit_tool.cpp) Fixes https://gitlab.com/kicad/code/kicad/-/issues/7739
This commit is contained in:
parent
ff371af810
commit
7077e59395
|
@ -227,8 +227,7 @@ bool DIALOG_FOOTPRINT_FP_EDITOR::TransferDataToWindow()
|
|||
wxGridTableMessage tmsg( m_texts, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, m_texts->GetNumberRows() );
|
||||
m_itemsGrid->ProcessTableMessage( tmsg );
|
||||
|
||||
// Module Properties
|
||||
|
||||
// Footprint Properties
|
||||
m_AutoPlaceCtrl->SetSelection( m_footprint->IsLocked() ? 1 : 0 );
|
||||
m_AutoPlaceCtrl->SetItemToolTip( 0, _( "Enable hotkey move commands and Auto Placement" ) );
|
||||
m_AutoPlaceCtrl->SetItemToolTip( 1, _( "Disable hotkey move commands and Auto Placement" ) );
|
||||
|
|
|
@ -132,10 +132,10 @@ DIALOG_FOOTPRINT_FP_EDITOR_BASE::DIALOG_FOOTPRINT_FP_EDITOR_BASE( wxWindow* pare
|
|||
wxBoxSizer* bSizerProperties;
|
||||
bSizerProperties = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
wxString m_AutoPlaceCtrlChoices[] = { _("Free"), _("Lock footprint") };
|
||||
wxString m_AutoPlaceCtrlChoices[] = { _("Unlock footprint"), _("Lock footprint") };
|
||||
int m_AutoPlaceCtrlNChoices = sizeof( m_AutoPlaceCtrlChoices ) / sizeof( wxString );
|
||||
m_AutoPlaceCtrl = new wxRadioBox( m_PanelGeneral, wxID_ANY, _("Move and Place"), wxDefaultPosition, wxDefaultSize, m_AutoPlaceCtrlNChoices, m_AutoPlaceCtrlChoices, 1, wxRA_SPECIFY_COLS );
|
||||
m_AutoPlaceCtrl->SetSelection( 0 );
|
||||
m_AutoPlaceCtrl->SetSelection( 1 );
|
||||
bSizerProperties->Add( m_AutoPlaceCtrl, 1, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_sizerAP = new wxStaticBoxSizer( new wxStaticBox( m_PanelGeneral, wxID_ANY, _("Auto-placement Rules") ), wxVERTICAL );
|
||||
|
|
|
@ -868,7 +868,7 @@
|
|||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="choices">"Free" "Lock footprint"</property>
|
||||
<property name="choices">"Unlock footprint" "Lock footprint"</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
|
@ -900,7 +900,7 @@
|
|||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="selection">0</property>
|
||||
<property name="selection">1</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style">wxRA_SPECIFY_COLS</property>
|
||||
|
|
|
@ -326,21 +326,11 @@ bool DIALOG_FOOTPRINT_PROPERTIES::TransferDataToWindow()
|
|||
|
||||
updateOrientationControl();
|
||||
|
||||
if( m_footprint->IsLocked() )
|
||||
m_AutoPlaceCtrl->SetSelection( 2 );
|
||||
else if( allPadsLocked( m_footprint ) )
|
||||
m_AutoPlaceCtrl->SetSelection( 1 );
|
||||
else
|
||||
m_AutoPlaceCtrl->SetSelection( 0 );
|
||||
m_AutoPlaceCtrl->SetSelection( m_footprint->IsLocked() ? 1 : 0 );
|
||||
|
||||
m_AutoPlaceCtrl->SetItemToolTip( 0, _( "Footprint can be freely moved and oriented on the "
|
||||
"canvas. At least some of the footprint's pads are "
|
||||
"unlocked and can be moved with respect to the "
|
||||
"footprint." ) );
|
||||
m_AutoPlaceCtrl->SetItemToolTip( 1, _( "Footprint can be freely moved and oriented on the "
|
||||
"canvas, but all of its pads are locked with respect "
|
||||
"to their position within in the footprint." ) );
|
||||
m_AutoPlaceCtrl->SetItemToolTip( 2, _( "Footprint is locked: it cannot be freely moved and "
|
||||
"canvas." ) );
|
||||
m_AutoPlaceCtrl->SetItemToolTip( 1, _( "Footprint is locked: it cannot be freely moved and "
|
||||
"oriented on the canvas and can only be selected when "
|
||||
"the 'Locked items' checkbox is enabled in the "
|
||||
"selection filter." ) );
|
||||
|
@ -735,13 +725,7 @@ bool DIALOG_FOOTPRINT_PROPERTIES::TransferDataFromWindow()
|
|||
// Set Footprint Position
|
||||
wxPoint pos( m_posX.GetValue(), m_posY.GetValue() );
|
||||
m_footprint->SetPosition( pos );
|
||||
m_footprint->SetLocked( m_AutoPlaceCtrl->GetSelection() == 2 );
|
||||
|
||||
if( m_AutoPlaceCtrl->GetSelection() == 1 )
|
||||
{
|
||||
for( PAD* pad : m_footprint->Pads() )
|
||||
pad->SetLocked( true );
|
||||
}
|
||||
m_footprint->SetLocked( m_AutoPlaceCtrl->GetSelection() == 1 );
|
||||
|
||||
int attributes = 0;
|
||||
|
||||
|
|
|
@ -192,7 +192,7 @@ DIALOG_FOOTPRINT_PROPERTIES_BASE::DIALOG_FOOTPRINT_PROPERTIES_BASE( wxWindow* pa
|
|||
wxBoxSizer* bSizerMiddle;
|
||||
bSizerMiddle = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
wxString m_AutoPlaceCtrlChoices[] = { _("Free"), _("Lock pads"), _("Lock footprint") };
|
||||
wxString m_AutoPlaceCtrlChoices[] = { _("Unlock footprint"), _("Lock footprint") };
|
||||
int m_AutoPlaceCtrlNChoices = sizeof( m_AutoPlaceCtrlChoices ) / sizeof( wxString );
|
||||
m_AutoPlaceCtrl = new wxRadioBox( m_PanelGeneral, wxID_ANY, _("Move and Place"), wxDefaultPosition, wxDefaultSize, m_AutoPlaceCtrlNChoices, m_AutoPlaceCtrlChoices, 1, wxRA_SPECIFY_COLS );
|
||||
m_AutoPlaceCtrl->SetSelection( 0 );
|
||||
|
|
|
@ -1446,11 +1446,11 @@
|
|||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="0">
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND|wxTOP</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="wxBoxSizer" expanded="0">
|
||||
<object class="wxBoxSizer" expanded="1">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">bSizerMiddle</property>
|
||||
<property name="orient">wxVERTICAL</property>
|
||||
|
@ -1473,7 +1473,7 @@
|
|||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="choices">"Free" "Lock pads" "Lock footprint"</property>
|
||||
<property name="choices">"Unlock footprint" "Lock footprint"</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
|
|
|
@ -38,7 +38,6 @@ PANEL_EDIT_OPTIONS::PANEL_EDIT_OPTIONS( PCB_BASE_EDIT_FRAME* aFrame, PAGED_DIALO
|
|||
m_magneticPads->Show( dynamic_cast<FOOTPRINT_EDIT_FRAME*>( m_frame ) != nullptr );
|
||||
m_magneticGraphics->Show( dynamic_cast<FOOTPRINT_EDIT_FRAME*>( m_frame ) != nullptr );
|
||||
m_flipLeftRight->Show( dynamic_cast<PCB_EDIT_FRAME*>( m_frame ) != nullptr );
|
||||
m_autoLockPads->Show( dynamic_cast<PCB_EDIT_FRAME*>( m_frame ) != nullptr );
|
||||
|
||||
#ifdef __WXOSX_MAC__
|
||||
m_mouseCmdsOSX->Show( true );
|
||||
|
@ -73,7 +72,6 @@ bool PANEL_EDIT_OPTIONS::TransferDataToWindow()
|
|||
m_magneticTrackChoice->SetSelection( static_cast<int>( general_opts.m_MagneticItems.tracks ) );
|
||||
m_magneticGraphicsChoice->SetSelection( !general_opts.m_MagneticItems.graphics );
|
||||
m_flipLeftRight->SetValue( general_opts.m_FlipLeftRight );
|
||||
m_autoLockPads->SetValue( !general_opts.m_AddUnlockedPads );
|
||||
|
||||
switch( general_opts.m_TrackDragAction )
|
||||
{
|
||||
|
@ -84,6 +82,7 @@ bool PANEL_EDIT_OPTIONS::TransferDataToWindow()
|
|||
|
||||
m_Show_Page_Limits->SetValue( m_frame->ShowPageLimits() );
|
||||
m_Auto_Refill_Zones->SetValue( general_opts.m_AutoRefillZones );
|
||||
m_Allow_Free_Pads->SetValue( general_opts.m_AllowFreePads );
|
||||
}
|
||||
else if( dynamic_cast<FOOTPRINT_EDIT_FRAME*>( m_frame ) )
|
||||
{
|
||||
|
@ -119,8 +118,8 @@ bool PANEL_EDIT_OPTIONS::TransferDataFromWindow()
|
|||
|
||||
m_frame->Settings().m_FlipLeftRight = m_flipLeftRight->GetValue();
|
||||
m_frame->SetShowPageLimits( m_Show_Page_Limits->GetValue() );
|
||||
m_frame->Settings().m_AddUnlockedPads = !m_autoLockPads->GetValue();
|
||||
m_frame->Settings().m_AutoRefillZones = m_Auto_Refill_Zones->GetValue();
|
||||
m_frame->Settings().m_AllowFreePads = m_Allow_Free_Pads->GetValue();
|
||||
|
||||
if( m_rbTrackDragMove->GetValue() )
|
||||
pcbnewSettings.m_TrackDragAction = TRACK_DRAG_ACTION::MOVE;
|
||||
|
|
|
@ -38,11 +38,6 @@ PANEL_EDIT_OPTIONS_BASE::PANEL_EDIT_OPTIONS_BASE( wxWindow* parent, wxWindowID i
|
|||
wxBoxSizer* bSizerBoardEdit;
|
||||
bSizerBoardEdit = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_autoLockPads = new wxCheckBox( bOptionsSizer->GetStaticBox(), wxID_ANY, _("Lock pads of newly added footprints"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_autoLockPads->SetToolTip( _("If checked, when a footprint is added to the board, its pads will be locked and not movable with respect to the footprint.") );
|
||||
|
||||
bSizerBoardEdit->Add( m_autoLockPads, 0, wxBOTTOM, 15 );
|
||||
|
||||
m_flipLeftRight = new wxCheckBox( bOptionsSizer->GetStaticBox(), wxID_ANY, _("Flip board items L/R (default is T/B)"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bSizerBoardEdit->Add( m_flipLeftRight, 0, wxBOTTOM, 15 );
|
||||
|
||||
|
@ -371,6 +366,11 @@ PANEL_EDIT_OPTIONS_BASE::PANEL_EDIT_OPTIONS_BASE( wxWindow* parent, wxWindowID i
|
|||
|
||||
sbSizer4->Add( m_Auto_Refill_Zones, 0, wxALL, 5 );
|
||||
|
||||
m_Allow_Free_Pads = new wxCheckBox( sbSizer4->GetStaticBox(), wxID_ANY, _("Allow free pads"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_Allow_Free_Pads->SetToolTip( _("If unchecked (default), any attempt to move unlocked pads will instead move the footprint as a whole.\nIf checked, unlocked pads can be moved freely with respect to the rest of the footprint. \nNote: Locked pads cannot be moved with respect to the parent footprint regardless of this setting.") );
|
||||
|
||||
sbSizer4->Add( m_Allow_Free_Pads, 0, wxALL, 5 );
|
||||
|
||||
|
||||
pcbOptionsSizer->Add( sbSizer4, 1, wxEXPAND|wxTOP, 5 );
|
||||
|
||||
|
|
|
@ -232,70 +232,6 @@
|
|||
<property name="name">bSizerBoardEdit</property>
|
||||
<property name="orient">wxVERTICAL</property>
|
||||
<property name="permission">none</property>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">15</property>
|
||||
<property name="flag">wxBOTTOM</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxCheckBox" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></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="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">Lock pads of newly added footprints</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_autoLockPads</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">If checked, when a footprint is added to the board, its pads will be locked and not movable with respect to the footprint.</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="1">
|
||||
<property name="border">15</property>
|
||||
<property name="flag">wxBOTTOM</property>
|
||||
|
@ -3487,6 +3423,70 @@
|
|||
<property name="window_style"></property>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxCheckBox" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></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="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">Allow free pads</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_Allow_Free_Pads</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">If unchecked (default), any attempt to move unlocked pads will instead move the footprint as a whole.
If checked, unlocked pads can be moved freely with respect to the rest of the footprint. 
Note: Locked pads cannot be moved with respect to the parent footprint regardless of this setting.</property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
|
|
|
@ -43,7 +43,6 @@ class PANEL_EDIT_OPTIONS_BASE : public wxPanel
|
|||
|
||||
wxCheckBox* m_magneticPads;
|
||||
wxCheckBox* m_magneticGraphics;
|
||||
wxCheckBox* m_autoLockPads;
|
||||
wxCheckBox* m_flipLeftRight;
|
||||
wxCheckBox* m_segments45OnlyCtrl;
|
||||
wxStaticText* m_staticTextRotationAngle;
|
||||
|
@ -67,6 +66,7 @@ class PANEL_EDIT_OPTIONS_BASE : public wxPanel
|
|||
wxRadioButton* m_rbTrackDragFree;
|
||||
wxCheckBox* m_Show_Page_Limits;
|
||||
wxCheckBox* m_Auto_Refill_Zones;
|
||||
wxCheckBox* m_Allow_Free_Pads;
|
||||
|
||||
public:
|
||||
|
||||
|
|
|
@ -753,7 +753,6 @@ void FOOTPRINT_VIEWER_FRAME::AddFootprintToPCB( wxCommandEvent& aEvent )
|
|||
{
|
||||
// Set the pads ratsnest settings to the global settings
|
||||
pad->SetLocalRatsnestVisible( pcbframe->GetDisplayOptions().m_ShowGlobalRatsnest );
|
||||
pad->SetLocked( !pcbframe->Settings().m_AddUnlockedPads );
|
||||
|
||||
// Pads in the library all have orphaned nets. Replace with Default.
|
||||
pad->SetNetCode( 0 );
|
||||
|
|
|
@ -172,7 +172,6 @@ FOOTPRINT* BOARD_NETLIST_UPDATER::addNewComponent( COMPONENT* aComponent )
|
|||
{
|
||||
// Set the pads ratsnest settings to the global settings
|
||||
pad->SetLocalRatsnestVisible( m_frame->GetDisplayOptions().m_ShowGlobalRatsnest );
|
||||
pad->SetLocked( !m_frame->Settings().m_AddUnlockedPads );
|
||||
|
||||
// Pads in the library all have orphaned nets. Replace with Default.
|
||||
pad->SetNetCode( 0 );
|
||||
|
|
|
@ -67,11 +67,11 @@ PCBNEW_SETTINGS::PCBNEW_SETTINGS()
|
|||
m_TrackDragAction( TRACK_DRAG_ACTION::DRAG ),
|
||||
m_Use45DegreeGraphicSegments( false ),
|
||||
m_FlipLeftRight( false ),
|
||||
m_AddUnlockedPads( false ),
|
||||
m_PolarCoords( false ),
|
||||
m_RotationAngle( 900 ),
|
||||
m_ShowPageLimits( true ),
|
||||
m_AutoRefillZones( true ),
|
||||
m_AllowFreePads( false ),
|
||||
m_PnsSettings( nullptr ),
|
||||
m_FootprintViewerAutoZoom( false ),
|
||||
m_FootprintViewerZoom( 1.0 )
|
||||
|
@ -104,9 +104,6 @@ PCBNEW_SETTINGS::PCBNEW_SETTINGS()
|
|||
m_params.emplace_back( new PARAM<bool>( "editing.flip_left_right",
|
||||
&m_FlipLeftRight, true ) );
|
||||
|
||||
m_params.emplace_back( new PARAM<bool>( "editing.add_unlocked_pads",
|
||||
&m_AddUnlockedPads, false ) );
|
||||
|
||||
m_params.emplace_back( new PARAM<bool>( "editing.magnetic_graphics",
|
||||
&m_MagneticItems.graphics, true ) );
|
||||
|
||||
|
@ -131,6 +128,9 @@ PCBNEW_SETTINGS::PCBNEW_SETTINGS()
|
|||
m_params.emplace_back( new PARAM<bool>( "editing.auto_fill_zones",
|
||||
&m_AutoRefillZones, true ) );
|
||||
|
||||
m_params.emplace_back( new PARAM<bool>( "editing.allow_free_pads",
|
||||
&m_AllowFreePads, false ) );
|
||||
|
||||
m_params.emplace_back( new PARAM<bool>( "pcb_display.graphic_items_fill",
|
||||
&m_Display.m_DisplayGraphicsFill, true ) );
|
||||
|
||||
|
|
|
@ -281,9 +281,6 @@ public:
|
|||
bool m_FlipLeftRight; // True: Flip footprints across Y axis
|
||||
// False: Flip footprints across X axis
|
||||
|
||||
bool m_AddUnlockedPads; // True: Pads are unlocked when new footprints are added to the board
|
||||
// False: Pads are locked in new footprints
|
||||
|
||||
bool m_PolarCoords;
|
||||
|
||||
int m_RotationAngle;
|
||||
|
@ -293,6 +290,10 @@ public:
|
|||
///<@todo Implement real auto zone filling (not just after zone properties are edited)
|
||||
bool m_AutoRefillZones; // Fill zones after editing the zone using the Zone Properties dialog
|
||||
|
||||
bool m_AllowFreePads; // True: unlocked pads can be moved freely with respect to the footprint.
|
||||
// False (default): all pads are treated as locked for the purposes of
|
||||
// movement and any attempt to move them will move the footprint instead.
|
||||
|
||||
wxString m_FootprintTextShownColumns;
|
||||
|
||||
std::unique_ptr<PNS::ROUTING_SETTINGS> m_PnsSettings;
|
||||
|
|
|
@ -1022,7 +1022,6 @@ int BOARD_EDITOR_CONTROL::PlaceFootprint( const TOOL_EVENT& aEvent )
|
|||
for( PAD* pad : fp->Pads() )
|
||||
{
|
||||
pad->SetLocalRatsnestVisible( m_frame->GetDisplayOptions().m_ShowGlobalRatsnest );
|
||||
pad->SetLocked( !m_frame->Settings().m_AddUnlockedPads );
|
||||
|
||||
// Pads in the library all have orphaned nets. Replace with Default.
|
||||
pad->SetNetCode( 0 );
|
||||
|
|
|
@ -634,6 +634,8 @@ int EDIT_TOOL::doMoveSelection( TOOL_EVENT aEvent, bool aPickReference )
|
|||
|
||||
// Now filter out locked and grouped items. We cannot do this in the first RequestSelection()
|
||||
// as we need the item_layers when a pad is the selection front.
|
||||
if( frame()->Settings().m_AllowFreePads )
|
||||
{
|
||||
selection = m_selectionTool->RequestSelection(
|
||||
[]( const VECTOR2I& aPt, GENERAL_COLLECTOR& aCollector, PCB_SELECTION_TOOL* sTool )
|
||||
{
|
||||
|
@ -647,9 +649,9 @@ int EDIT_TOOL::doMoveSelection( TOOL_EVENT aEvent, bool aPickReference )
|
|||
if( item->Type() == PCB_MARKER_T )
|
||||
aCollector.Remove( item );
|
||||
|
||||
/// Locked pads do not get moved independently of the footprint
|
||||
if( !sTool->IsFootprintEditor() && item->Type() == PCB_PAD_T && item->IsLocked()
|
||||
&& !item->GetParent()->IsLocked() )
|
||||
// Locked pads do not get moved independently of the footprint
|
||||
if( !sTool->IsFootprintEditor() && item->Type() == PCB_PAD_T
|
||||
&& item->IsLocked() )
|
||||
{
|
||||
if( !aCollector.HasItem( item->GetParent() ) )
|
||||
to_add.insert( item->GetParent() );
|
||||
|
@ -662,6 +664,39 @@ int EDIT_TOOL::doMoveSelection( TOOL_EVENT aEvent, bool aPickReference )
|
|||
aCollector.Append( item );
|
||||
},
|
||||
!m_isFootprintEditor /* prompt user regarding locked items only in pcb editor*/ );
|
||||
}
|
||||
else
|
||||
{
|
||||
// Unlocked pads are treated as locked if the setting m_AllowFreePads is false
|
||||
selection = m_selectionTool->RequestSelection(
|
||||
[]( const VECTOR2I& aPt, GENERAL_COLLECTOR& aCollector,
|
||||
PCB_SELECTION_TOOL* sTool )
|
||||
{
|
||||
std::set<BOARD_ITEM*> to_add;
|
||||
|
||||
// Iterate from the back so we don't have to worry about removals.
|
||||
for( int i = aCollector.GetCount() - 1; i >= 0; --i )
|
||||
{
|
||||
BOARD_ITEM* item = aCollector[i];
|
||||
|
||||
if( item->Type() == PCB_MARKER_T )
|
||||
aCollector.Remove( item );
|
||||
|
||||
// Treat all pads as locked (i.e. cannot be moved indepenendtly of footprint)
|
||||
if( !sTool->IsFootprintEditor() && item->Type() == PCB_PAD_T )
|
||||
{
|
||||
if( !aCollector.HasItem( item->GetParent() ) )
|
||||
to_add.insert( item->GetParent() );
|
||||
|
||||
aCollector.Remove( item );
|
||||
}
|
||||
}
|
||||
|
||||
for( BOARD_ITEM* item : to_add )
|
||||
aCollector.Append( item );
|
||||
},
|
||||
!m_isFootprintEditor /* prompt user regarding locked items only in pcb editor*/ );
|
||||
}
|
||||
|
||||
if( selection.Empty() )
|
||||
return 0;
|
||||
|
@ -1835,8 +1870,7 @@ int EDIT_TOOL::MoveExact( const TOOL_EVENT& aEvent )
|
|||
aCollector.Remove( item );
|
||||
|
||||
// We don't operate on pads; convert them to footprint selections
|
||||
if( !sTool->IsFootprintEditor() && item->Type() == PCB_PAD_T
|
||||
&& !item->GetParent()->IsLocked() )
|
||||
if( !sTool->IsFootprintEditor() && item->Type() == PCB_PAD_T )
|
||||
{
|
||||
aCollector.Remove( item );
|
||||
|
||||
|
|
Loading…
Reference in New Issue