mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-09-14 02:03:12 +02:00
Pcbnew: add interative relative offset tool
This commit is contained in:
parent
3f36d7f1dd
commit
c956e6761b
@ -343,9 +343,12 @@ void RULER_ITEM::ViewDraw( int aLayer, KIGFX::VIEW* aView ) const
|
||||
|
||||
gal->SetIsStroke( true );
|
||||
gal->SetIsFill( false );
|
||||
|
||||
gal->SetTextMirrored( false );
|
||||
gal->SetStrokeColor( rs->GetLayerColor( LAYER_AUX_ITEMS ) );
|
||||
|
||||
if( m_color )
|
||||
gal->SetStrokeColor( *m_color );
|
||||
else
|
||||
gal->SetStrokeColor( rs->GetLayerColor( LAYER_AUX_ITEMS ) );
|
||||
|
||||
if( drawingDropShadows )
|
||||
gal->SetStrokeColor( GetShadowColor( gal->GetStrokeColor() ) );
|
||||
@ -366,11 +369,33 @@ void RULER_ITEM::ViewDraw( int aLayer, KIGFX::VIEW* aView ) const
|
||||
const double minorTickLen = 5.0 / gal->GetWorldScale();
|
||||
const double majorTickLen = minorTickLen * majorTickLengthFactor;
|
||||
|
||||
drawTicksAlongLine( aView, origin, rulerVec, minorTickLen, m_iuScale, m_userUnits, drawingDropShadows );
|
||||
if( m_showTicks )
|
||||
{
|
||||
drawTicksAlongLine( aView, origin, rulerVec, minorTickLen, m_iuScale, m_userUnits,
|
||||
drawingDropShadows );
|
||||
|
||||
drawBacksideTicks( aView, origin, rulerVec, majorTickLen, 2, drawingDropShadows );
|
||||
drawBacksideTicks( aView, origin, rulerVec, majorTickLen, 2, drawingDropShadows );
|
||||
}
|
||||
|
||||
// draw the back of the origin "crosshair"
|
||||
gal->DrawLine( origin, origin + rulerVec.Resize( -minorTickLen * midTickLengthFactor ) );
|
||||
if( m_showOriginArrowHead )
|
||||
{
|
||||
const EDA_ANGLE arrowAngle{ 30.0 };
|
||||
VECTOR2D arrowHead = rulerVec;
|
||||
RotatePoint( arrowHead, arrowAngle );
|
||||
arrowHead = arrowHead.Resize( -majorTickLen );
|
||||
|
||||
gal->DrawLine( origin, origin - arrowHead );
|
||||
|
||||
arrowHead = rulerVec;
|
||||
RotatePoint( arrowHead, -arrowAngle );
|
||||
arrowHead = arrowHead.Resize( -majorTickLen );
|
||||
|
||||
gal->DrawLine( origin, origin - arrowHead );
|
||||
}
|
||||
else
|
||||
{
|
||||
// draw the back of the origin "crosshair"
|
||||
gal->DrawLine( origin, origin + rulerVec.Resize( -minorTickLen * midTickLengthFactor ) );
|
||||
}
|
||||
gal->PopDepth();
|
||||
}
|
||||
|
@ -24,7 +24,10 @@
|
||||
#ifndef PREVIEW_ITEMS_RULER_ITEM_H
|
||||
#define PREVIEW_ITEMS_RULER_ITEM_H
|
||||
|
||||
#include <optional>
|
||||
|
||||
#include <eda_item.h>
|
||||
#include <gal/color4d.h>
|
||||
#include <preview_items/two_point_geom_manager.h>
|
||||
|
||||
namespace KIGFX
|
||||
@ -53,6 +56,11 @@ public:
|
||||
///< @copydoc EDA_ITEM::ViewDraw();
|
||||
void ViewDraw( int aLayer, KIGFX::VIEW* aView ) const override final;
|
||||
|
||||
void SetColor( const COLOR4D& aColor ) { m_color = aColor; }
|
||||
|
||||
void SetShowTicks( bool aShow ) { m_showTicks = aShow; }
|
||||
|
||||
void SetShowOriginArrowHead( bool aShow ) { m_showOriginArrowHead = aShow; }
|
||||
|
||||
#if defined(DEBUG)
|
||||
void Show( int x, std::ostream& st ) const override
|
||||
@ -88,6 +96,9 @@ private:
|
||||
const EDA_IU_SCALE& m_iuScale;
|
||||
bool m_flipX;
|
||||
bool m_flipY;
|
||||
std::optional<COLOR4D> m_color;
|
||||
bool m_showTicks = true;
|
||||
bool m_showOriginArrowHead = false;
|
||||
};
|
||||
|
||||
} // PREVIEW
|
||||
|
@ -132,6 +132,8 @@ set( PCBNEW_DIALOGS
|
||||
dialogs/dialog_position_relative.cpp
|
||||
dialogs/dialog_position_relative_base.cpp
|
||||
dialogs/dialog_print_pcbnew.cpp
|
||||
dialogs/dialog_set_offset_base.cpp
|
||||
dialogs/dialog_set_offset.cpp
|
||||
dialogs/dialog_swap_layers.cpp
|
||||
dialogs/dialog_swap_layers_base.cpp
|
||||
dialogs/dialog_table_properties.cpp
|
||||
|
@ -64,8 +64,6 @@ DIALOG_POSITION_RELATIVE::DIALOG_POSITION_RELATIVE( PCB_BASE_FRAME* aParent ) :
|
||||
m_polarCoords->SetValue( m_options.polarCoords );
|
||||
updateDialogControls( m_polarCoords->IsChecked() );
|
||||
|
||||
updateAnchorInfo( nullptr );
|
||||
|
||||
m_xOffset.SetDoubleValue( m_options.entry1 );
|
||||
m_yOffset.SetDoubleValue( m_options.entry2 );
|
||||
|
||||
|
229
pcbnew/dialogs/dialog_set_offset.cpp
Normal file
229
pcbnew/dialogs/dialog_set_offset.cpp
Normal file
@ -0,0 +1,229 @@
|
||||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2024 KiCad Developers, see AUTHORS.txt for contributors.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include "dialog_set_offset.h"
|
||||
|
||||
|
||||
struct SET_OFFSET_OPTIONS
|
||||
{
|
||||
bool polarCoords = false;
|
||||
double entry1 = 0.0;
|
||||
double entry2 = 0.0;
|
||||
};
|
||||
|
||||
static SET_OFFSET_OPTIONS s_savedOptions;
|
||||
|
||||
|
||||
DIALOG_SET_OFFSET::DIALOG_SET_OFFSET( PCB_BASE_FRAME& aParent, VECTOR2I& aOffset,
|
||||
bool aClearToZero ) :
|
||||
DIALOG_SET_OFFSET_BASE( &aParent ), m_frame( aParent ), m_clearToZero( aClearToZero ),
|
||||
m_originalOffset( aOffset ), m_updatedOffset( aOffset ),
|
||||
m_xOffset( &aParent, m_xLabel, m_xEntry, m_xUnit ),
|
||||
m_yOffset( &aParent, m_yLabel, m_yEntry, m_yUnit )
|
||||
{
|
||||
m_xOffset.SetCoordType( ORIGIN_TRANSFORMS::REL_X_COORD );
|
||||
m_yOffset.SetCoordType( ORIGIN_TRANSFORMS::REL_Y_COORD );
|
||||
|
||||
SetInitialFocus( m_xEntry );
|
||||
|
||||
// and set up the entries according to the saved options
|
||||
m_polarCoords->SetValue( s_savedOptions.polarCoords );
|
||||
updateDialogControls( m_polarCoords->IsChecked() );
|
||||
|
||||
m_xOffset.SetDoubleValue( s_savedOptions.entry1 );
|
||||
m_yOffset.SetDoubleValue( s_savedOptions.entry2 );
|
||||
|
||||
if( m_clearToZero )
|
||||
{
|
||||
wxString text = _( "Clear" );
|
||||
m_clearX->SetLabel( text );
|
||||
m_clearY->SetLabel( text );
|
||||
|
||||
text = _( "Reset this value to zero." );
|
||||
m_clearX->SetToolTip( text );
|
||||
m_clearY->SetToolTip( text );
|
||||
}
|
||||
else
|
||||
{
|
||||
wxString text = _( "Reset" );
|
||||
m_clearX->SetLabel( text );
|
||||
m_clearY->SetLabel( text );
|
||||
|
||||
text = _( "Reset this value to the original value." );
|
||||
m_clearX->SetToolTip( text );
|
||||
m_clearY->SetToolTip( text );
|
||||
}
|
||||
|
||||
SetupStandardButtons();
|
||||
|
||||
finishDialogSettings();
|
||||
}
|
||||
|
||||
|
||||
void DIALOG_SET_OFFSET::OnTextFocusLost( wxFocusEvent& event )
|
||||
{
|
||||
wxTextCtrl* obj = static_cast<wxTextCtrl*>( event.GetEventObject() );
|
||||
|
||||
if( obj->GetValue().IsEmpty() )
|
||||
obj->SetValue( "0" );
|
||||
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
|
||||
static void ToPolarDeg( double x, double y, double& r, EDA_ANGLE& q )
|
||||
{
|
||||
// convert to polar coordinates
|
||||
r = hypot( x, y );
|
||||
|
||||
q = ( r != 0 ) ? EDA_ANGLE( VECTOR2D( x, y ) ) : ANGLE_0;
|
||||
}
|
||||
|
||||
|
||||
void DIALOG_SET_OFFSET::OnClear( wxCommandEvent& event )
|
||||
{
|
||||
if( m_clearToZero )
|
||||
{
|
||||
m_xOffset.SetDoubleValue( 0.0 );
|
||||
m_yOffset.SetDoubleValue( 0.0 );
|
||||
|
||||
m_stateX = 0.0;
|
||||
m_stateY = 0.0;
|
||||
m_stateRadius = 0.0;
|
||||
m_stateTheta = ANGLE_0;
|
||||
return;
|
||||
}
|
||||
|
||||
const wxObject* const obj = event.GetEventObject();
|
||||
VECTOR2I offset = m_originalOffset;
|
||||
double r;
|
||||
EDA_ANGLE q;
|
||||
ToPolarDeg( offset.x, offset.y, r, q );
|
||||
|
||||
if( obj == m_clearX )
|
||||
{
|
||||
m_stateX = offset.x;
|
||||
m_xOffset.SetDoubleValue( r );
|
||||
m_stateRadius = m_xOffset.GetDoubleValue();
|
||||
|
||||
if( m_polarCoords->IsChecked() )
|
||||
m_xOffset.SetDoubleValue( m_stateRadius );
|
||||
else
|
||||
m_xOffset.SetValue( m_stateX );
|
||||
}
|
||||
else if( obj == m_clearY )
|
||||
{
|
||||
m_stateY = offset.y;
|
||||
m_yOffset.SetAngleValue( q );
|
||||
m_stateTheta = m_yOffset.GetAngleValue();
|
||||
|
||||
if( m_polarCoords->IsChecked() )
|
||||
m_yOffset.SetAngleValue( m_stateTheta );
|
||||
else
|
||||
m_yOffset.SetValue( m_stateY );
|
||||
}
|
||||
}
|
||||
|
||||
void DIALOG_SET_OFFSET::OnPolarChanged( wxCommandEvent& event )
|
||||
{
|
||||
bool newPolar = m_polarCoords->IsChecked();
|
||||
double xOffset = m_xOffset.GetDoubleValue();
|
||||
double yOffset = m_yOffset.GetDoubleValue();
|
||||
updateDialogControls( newPolar );
|
||||
|
||||
if( newPolar )
|
||||
{
|
||||
if( xOffset != m_stateX || yOffset != m_stateY )
|
||||
{
|
||||
m_stateX = xOffset;
|
||||
m_stateY = yOffset;
|
||||
ToPolarDeg( m_stateX, m_stateY, m_stateRadius, m_stateTheta );
|
||||
|
||||
m_xOffset.SetDoubleValue( m_stateRadius );
|
||||
m_stateRadius = m_xOffset.GetDoubleValue();
|
||||
m_yOffset.SetAngleValue( m_stateTheta );
|
||||
m_stateTheta = m_yOffset.GetAngleValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_xOffset.SetDoubleValue( m_stateRadius );
|
||||
m_yOffset.SetAngleValue( m_stateTheta );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if( xOffset != m_stateRadius || yOffset != m_stateTheta.AsDegrees() )
|
||||
{
|
||||
m_stateRadius = xOffset;
|
||||
m_stateTheta = EDA_ANGLE( yOffset, DEGREES_T );
|
||||
m_stateX = m_stateRadius * m_stateTheta.Cos();
|
||||
m_stateY = m_stateRadius * m_stateTheta.Sin();
|
||||
|
||||
m_xOffset.SetDoubleValue( m_stateX );
|
||||
m_stateX = m_xOffset.GetDoubleValue();
|
||||
m_yOffset.SetDoubleValue( m_stateY );
|
||||
m_stateY = m_yOffset.GetDoubleValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_xOffset.SetDoubleValue( m_stateX );
|
||||
m_yOffset.SetDoubleValue( m_stateY );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DIALOG_SET_OFFSET::updateDialogControls( bool aPolar )
|
||||
{
|
||||
if( aPolar )
|
||||
{
|
||||
m_xOffset.SetLabel( _( "Distance:" ) ); // Polar radius
|
||||
m_yOffset.SetLabel( _( "Angle:" ) ); // Polar theta or angle
|
||||
m_yOffset.SetUnits( EDA_UNITS::DEGREES );
|
||||
m_clearX->SetToolTip( _( "Reset to the current distance from the reference position." ) );
|
||||
m_clearY->SetToolTip( _( "Reset to the current angle from the reference position." ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
m_xOffset.SetLabel( _( "Offset X:" ) );
|
||||
m_yOffset.SetLabel( _( "Offset Y:" ) );
|
||||
m_yOffset.SetUnits( GetUserUnits() );
|
||||
m_clearX->SetToolTip( _( "Reset to the current X offset from the reference position." ) );
|
||||
m_clearY->SetToolTip( _( "Reset to the current Y offset from the reference position." ) );
|
||||
}
|
||||
}
|
||||
|
||||
bool DIALOG_SET_OFFSET::TransferDataToWindow()
|
||||
{
|
||||
m_xOffset.SetValue( m_originalOffset.x );
|
||||
m_yOffset.SetValue( m_originalOffset.y );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DIALOG_SET_OFFSET::TransferDataFromWindow()
|
||||
{
|
||||
m_updatedOffset.x = m_xOffset.GetValue();
|
||||
m_updatedOffset.y = m_yOffset.GetValue();
|
||||
|
||||
return true;
|
||||
}
|
64
pcbnew/dialogs/dialog_set_offset.h
Normal file
64
pcbnew/dialogs/dialog_set_offset.h
Normal file
@ -0,0 +1,64 @@
|
||||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2024 KiCad Developers, see AUTHORS.txt for contributors.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include <dialogs/dialog_set_offset_base.h>
|
||||
|
||||
#include <widgets/unit_binder.h>
|
||||
#include <pcb_base_frame.h>
|
||||
|
||||
/**
|
||||
* Dialog that invites the user to enter some kind of offset.
|
||||
*/
|
||||
class DIALOG_SET_OFFSET : public DIALOG_SET_OFFSET_BASE
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* @param aFrame The parent frame.
|
||||
* @param aOffset The offset to be edited.
|
||||
*/
|
||||
DIALOG_SET_OFFSET( PCB_BASE_FRAME& aFrame, VECTOR2I& aOffset, bool aClearToZero );
|
||||
|
||||
virtual void OnTextFocusLost( wxFocusEvent& event ) override;
|
||||
virtual void OnClear( wxCommandEvent& event ) override;
|
||||
virtual void OnPolarChanged( wxCommandEvent& event ) override;
|
||||
|
||||
virtual bool TransferDataToWindow() override;
|
||||
virtual bool TransferDataFromWindow() override;
|
||||
|
||||
private:
|
||||
void updateDialogControls( bool aPolar );
|
||||
|
||||
PCB_BASE_FRAME& m_frame;
|
||||
|
||||
bool m_clearToZero;
|
||||
|
||||
const VECTOR2I m_originalOffset;
|
||||
VECTOR2I& m_updatedOffset;
|
||||
|
||||
UNIT_BINDER m_xOffset, m_yOffset;
|
||||
|
||||
double m_stateX;
|
||||
double m_stateY;
|
||||
double m_stateRadius;
|
||||
EDA_ANGLE m_stateTheta;
|
||||
};
|
114
pcbnew/dialogs/dialog_set_offset_base.cpp
Normal file
114
pcbnew/dialogs/dialog_set_offset_base.cpp
Normal file
@ -0,0 +1,114 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO *NOT* EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "dialog_set_offset_base.h"
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
DIALOG_SET_OFFSET_BASE::DIALOG_SET_OFFSET_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
|
||||
{
|
||||
this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
|
||||
|
||||
wxBoxSizer* bMainSizer;
|
||||
bMainSizer = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_description = new wxStaticText( this, wxID_ANY, _("Set a new value for this offset:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_description->Wrap( -1 );
|
||||
bMainSizer->Add( m_description, 0, wxALL, 5 );
|
||||
|
||||
wxFlexGridSizer* fgSizer2;
|
||||
fgSizer2 = new wxFlexGridSizer( 0, 5, 5, 0 );
|
||||
fgSizer2->AddGrowableCol( 1 );
|
||||
fgSizer2->SetFlexibleDirection( wxBOTH );
|
||||
fgSizer2->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||
|
||||
m_xLabel = new wxStaticText( this, wxID_ANY, _("Offset X:"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
|
||||
m_xLabel->Wrap( -1 );
|
||||
fgSizer2->Add( m_xLabel, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_xEntry = new wxTextCtrl( this, wxID_ANY, _("0"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer2->Add( m_xEntry, 0, wxEXPAND|wxLEFT|wxRIGHT, 5 );
|
||||
|
||||
m_xUnit = new wxStaticText( this, wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_xUnit->Wrap( -1 );
|
||||
fgSizer2->Add( m_xUnit, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_LEFT|wxRIGHT, 5 );
|
||||
|
||||
|
||||
fgSizer2->Add( 10, 0, 1, wxEXPAND|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_clearX = new wxButton( this, wxID_ANY, _("Reset"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT );
|
||||
fgSizer2->Add( m_clearX, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 );
|
||||
|
||||
m_yLabel = new wxStaticText( this, wxID_ANY, _("Offset Y:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_yLabel->Wrap( -1 );
|
||||
fgSizer2->Add( m_yLabel, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_yEntry = new wxTextCtrl( this, wxID_ANY, _("0"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer2->Add( m_yEntry, 0, wxEXPAND|wxLEFT|wxRIGHT, 5 );
|
||||
|
||||
m_yUnit = new wxStaticText( this, wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_yUnit->Wrap( -1 );
|
||||
fgSizer2->Add( m_yUnit, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
|
||||
|
||||
|
||||
fgSizer2->Add( 10, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
m_clearY = new wxButton( this, wxID_ANY, _("Reset"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT );
|
||||
fgSizer2->Add( m_clearY, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 );
|
||||
|
||||
|
||||
bMainSizer->Add( fgSizer2, 1, wxEXPAND|wxALL, 5 );
|
||||
|
||||
wxBoxSizer* bSizerBottom;
|
||||
bSizerBottom = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
m_polarCoords = new wxCheckBox( this, wxID_ANY, _("Use polar coordinates"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_polarCoords->SetValue(true);
|
||||
bSizerBottom->Add( m_polarCoords, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 10 );
|
||||
|
||||
|
||||
bSizerBottom->Add( 40, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
m_stdButtons = new wxStdDialogButtonSizer();
|
||||
m_stdButtonsOK = new wxButton( this, wxID_OK );
|
||||
m_stdButtons->AddButton( m_stdButtonsOK );
|
||||
m_stdButtonsCancel = new wxButton( this, wxID_CANCEL );
|
||||
m_stdButtons->AddButton( m_stdButtonsCancel );
|
||||
m_stdButtons->Realize();
|
||||
|
||||
bSizerBottom->Add( m_stdButtons, 0, wxBOTTOM|wxTOP, 5 );
|
||||
|
||||
|
||||
bMainSizer->Add( bSizerBottom, 0, wxEXPAND|wxTOP, 5 );
|
||||
|
||||
|
||||
this->SetSizer( bMainSizer );
|
||||
this->Layout();
|
||||
bMainSizer->Fit( this );
|
||||
|
||||
// Connect Events
|
||||
this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_SET_OFFSET_BASE::OnClose ) );
|
||||
m_xEntry->Connect( wxEVT_KILL_FOCUS, wxFocusEventHandler( DIALOG_SET_OFFSET_BASE::OnTextFocusLost ), NULL, this );
|
||||
m_clearX->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SET_OFFSET_BASE::OnClear ), NULL, this );
|
||||
m_yEntry->Connect( wxEVT_KILL_FOCUS, wxFocusEventHandler( DIALOG_SET_OFFSET_BASE::OnTextFocusLost ), NULL, this );
|
||||
m_clearY->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SET_OFFSET_BASE::OnClear ), NULL, this );
|
||||
m_polarCoords->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_SET_OFFSET_BASE::OnPolarChanged ), NULL, this );
|
||||
m_stdButtonsOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SET_OFFSET_BASE::OnOkClick ), NULL, this );
|
||||
}
|
||||
|
||||
DIALOG_SET_OFFSET_BASE::~DIALOG_SET_OFFSET_BASE()
|
||||
{
|
||||
// Disconnect Events
|
||||
this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_SET_OFFSET_BASE::OnClose ) );
|
||||
m_xEntry->Disconnect( wxEVT_KILL_FOCUS, wxFocusEventHandler( DIALOG_SET_OFFSET_BASE::OnTextFocusLost ), NULL, this );
|
||||
m_clearX->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SET_OFFSET_BASE::OnClear ), NULL, this );
|
||||
m_yEntry->Disconnect( wxEVT_KILL_FOCUS, wxFocusEventHandler( DIALOG_SET_OFFSET_BASE::OnTextFocusLost ), NULL, this );
|
||||
m_clearY->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SET_OFFSET_BASE::OnClear ), NULL, this );
|
||||
m_polarCoords->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_SET_OFFSET_BASE::OnPolarChanged ), NULL, this );
|
||||
m_stdButtonsOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SET_OFFSET_BASE::OnOkClick ), NULL, this );
|
||||
|
||||
}
|
807
pcbnew/dialogs/dialog_set_offset_base.fbp
Normal file
807
pcbnew/dialogs/dialog_set_offset_base.fbp
Normal file
@ -0,0 +1,807 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<wxFormBuilder_Project>
|
||||
<FileVersion major="1" minor="18"/>
|
||||
<object class="Project" expanded="true">
|
||||
<property name="code_generation">C++</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="file">dialog_set_offset_base</property>
|
||||
<property name="first_id">10000</property>
|
||||
<property name="internationalize">1</property>
|
||||
<property name="lua_skip_events">1</property>
|
||||
<property name="lua_ui_table">UI</property>
|
||||
<property name="name">DIALOG_SET_OFFSET_BASE</property>
|
||||
<property name="path">.</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="use_microsoft_bom">0</property>
|
||||
<property name="use_native_eol">0</property>
|
||||
<object class="Dialog" expanded="true">
|
||||
<property name="aui_managed">0</property>
|
||||
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
|
||||
<property name="bg"></property>
|
||||
<property name="center"></property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="drag_accept_files">0</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="event_handler">impl_virtual</property>
|
||||
<property name="extra_style"></property>
|
||||
<property name="fg"></property>
|
||||
<property name="font"></property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="minimum_size">-1,-1</property>
|
||||
<property name="name">DIALOG_SET_OFFSET_BASE</property>
|
||||
<property name="pos"></property>
|
||||
<property name="size">-1,-1</property>
|
||||
<property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
|
||||
<property name="subclass">DIALOG_SHIM; dialog_shim.h</property>
|
||||
<property name="title">Set Offset</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="two_step_creation">0</property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnClose">OnClose</event>
|
||||
<object class="wxBoxSizer" expanded="true">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">bMainSizer</property>
|
||||
<property name="orient">wxVERTICAL</property>
|
||||
<property name="permission">none</property>
|
||||
<object class="sizeritem" expanded="true">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL</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">Set a new value for this offset:</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_description</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">1</property>
|
||||
<object class="wxFlexGridSizer" expanded="true">
|
||||
<property name="cols">5</property>
|
||||
<property name="flexible_direction">wxBOTH</property>
|
||||
<property name="growablecols">1</property>
|
||||
<property name="growablerows"></property>
|
||||
<property name="hgap">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">fgSizer2</property>
|
||||
<property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
|
||||
<property name="permission">none</property>
|
||||
<property name="rows">0</property>
|
||||
<property name="vgap">5</property>
|
||||
<object class="sizeritem" expanded="true">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
|
||||
<property name="proportion">0</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">Offset X:</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_xLabel</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">-1,-1</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="sizeritem" expanded="true">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND|wxLEFT|wxRIGHT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxTextCtrl" 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="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="maxlength">0</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_xEntry</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="value">0</property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnKillFocus">OnTextFocusLost</event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="true">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL|wxALIGN_LEFT|wxRIGHT</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">mm</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_xUnit</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="sizeritem" expanded="true">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="spacer" expanded="true">
|
||||
<property name="height">0</property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="width">10</property>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="true">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxButton" 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="auth_needed">0</property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="bitmap"></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="current"></property>
|
||||
<property name="default">0</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="disabled"></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="focus"></property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Reset</property>
|
||||
<property name="margins"></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_clearX</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="position"></property>
|
||||
<property name="pressed"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style">wxBU_EXACTFIT</property>
|
||||
<property name="subclass"></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>
|
||||
<event name="OnButtonClick">OnClear</event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="true">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT</property>
|
||||
<property name="proportion">0</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">Offset Y:</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_yLabel</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="sizeritem" expanded="true">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND|wxLEFT|wxRIGHT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxTextCtrl" 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="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="maxlength">0</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_yEntry</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="value">0</property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnKillFocus">OnTextFocusLost</event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="true">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT</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">mm</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_yUnit</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="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">0</property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="width">10</property>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="true">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxButton" 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="auth_needed">0</property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="bitmap"></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="current"></property>
|
||||
<property name="default">0</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="disabled"></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="focus"></property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Reset</property>
|
||||
<property name="margins"></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_clearY</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="position"></property>
|
||||
<property name="pressed"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style">wxBU_EXACTFIT</property>
|
||||
<property name="subclass"></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>
|
||||
<event name="OnButtonClick">OnClear</event>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="true">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND|wxTOP</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxBoxSizer" expanded="true">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">bSizerBottom</property>
|
||||
<property name="orient">wxHORIZONTAL</property>
|
||||
<property name="permission">none</property>
|
||||
<object class="sizeritem" expanded="false">
|
||||
<property name="border">10</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxCheckBox" 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="checked">1</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">Use polar coordinates</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_polarCoords</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="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>
|
||||
<event name="OnCheckBox">OnPolarChanged</event>
|
||||
</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">0</property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="width">40</property>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="false">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxBOTTOM|wxTOP</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStdDialogButtonSizer" expanded="false">
|
||||
<property name="Apply">0</property>
|
||||
<property name="Cancel">1</property>
|
||||
<property name="ContextHelp">0</property>
|
||||
<property name="Help">0</property>
|
||||
<property name="No">0</property>
|
||||
<property name="OK">1</property>
|
||||
<property name="Save">0</property>
|
||||
<property name="Yes">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">m_stdButtons</property>
|
||||
<property name="permission">protected</property>
|
||||
<event name="OnOKButtonClick">OnOkClick</event>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</wxFormBuilder_Project>
|
68
pcbnew/dialogs/dialog_set_offset_base.h
Normal file
68
pcbnew/dialogs/dialog_set_offset_base.h
Normal file
@ -0,0 +1,68 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO *NOT* EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <wx/artprov.h>
|
||||
#include <wx/xrc/xmlres.h>
|
||||
#include <wx/intl.h>
|
||||
#include "dialog_shim.h"
|
||||
#include <wx/string.h>
|
||||
#include <wx/stattext.h>
|
||||
#include <wx/gdicmn.h>
|
||||
#include <wx/font.h>
|
||||
#include <wx/colour.h>
|
||||
#include <wx/settings.h>
|
||||
#include <wx/textctrl.h>
|
||||
#include <wx/button.h>
|
||||
#include <wx/bitmap.h>
|
||||
#include <wx/image.h>
|
||||
#include <wx/icon.h>
|
||||
#include <wx/sizer.h>
|
||||
#include <wx/checkbox.h>
|
||||
#include <wx/dialog.h>
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/// Class DIALOG_SET_OFFSET_BASE
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
class DIALOG_SET_OFFSET_BASE : public DIALOG_SHIM
|
||||
{
|
||||
private:
|
||||
|
||||
protected:
|
||||
wxStaticText* m_description;
|
||||
wxStaticText* m_xLabel;
|
||||
wxTextCtrl* m_xEntry;
|
||||
wxStaticText* m_xUnit;
|
||||
wxButton* m_clearX;
|
||||
wxStaticText* m_yLabel;
|
||||
wxTextCtrl* m_yEntry;
|
||||
wxStaticText* m_yUnit;
|
||||
wxButton* m_clearY;
|
||||
wxCheckBox* m_polarCoords;
|
||||
wxStdDialogButtonSizer* m_stdButtons;
|
||||
wxButton* m_stdButtonsOK;
|
||||
wxButton* m_stdButtonsCancel;
|
||||
|
||||
// Virtual event handlers, override them in your derived class
|
||||
virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
|
||||
virtual void OnTextFocusLost( wxFocusEvent& event ) { event.Skip(); }
|
||||
virtual void OnClear( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnPolarChanged( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnOkClick( wxCommandEvent& event ) { event.Skip(); }
|
||||
|
||||
|
||||
public:
|
||||
|
||||
DIALOG_SET_OFFSET_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Set Offset"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
|
||||
|
||||
~DIALOG_SET_OFFSET_BASE();
|
||||
|
||||
};
|
||||
|
@ -132,10 +132,11 @@ static std::shared_ptr<CONDITIONAL_MENU> makePositioningToolsMenu( TOOL_INTERACT
|
||||
};
|
||||
|
||||
// clang-format off
|
||||
menu->AddItem( PCB_ACTIONS::moveExact, SELECTION_CONDITIONS::NotEmpty && notMovingCondition );
|
||||
menu->AddItem( PCB_ACTIONS::moveWithReference, SELECTION_CONDITIONS::NotEmpty && notMovingCondition );
|
||||
menu->AddItem( PCB_ACTIONS::copyWithReference, SELECTION_CONDITIONS::NotEmpty && notMovingCondition );
|
||||
menu->AddItem( PCB_ACTIONS::positionRelative, SELECTION_CONDITIONS::NotEmpty && notMovingCondition );
|
||||
menu->AddItem( PCB_ACTIONS::moveExact, SELECTION_CONDITIONS::NotEmpty && notMovingCondition );
|
||||
menu->AddItem( PCB_ACTIONS::moveWithReference, SELECTION_CONDITIONS::NotEmpty && notMovingCondition );
|
||||
menu->AddItem( PCB_ACTIONS::copyWithReference, SELECTION_CONDITIONS::NotEmpty && notMovingCondition );
|
||||
menu->AddItem( PCB_ACTIONS::positionRelative, SELECTION_CONDITIONS::NotEmpty && notMovingCondition );
|
||||
menu->AddItem( PCB_ACTIONS::positionRelativeInteractively, SELECTION_CONDITIONS::NotEmpty && notMovingCondition );
|
||||
// clang-format on
|
||||
return menu;
|
||||
};
|
||||
|
@ -767,6 +767,7 @@ bool EDIT_TOOL::doMoveSelection( const TOOL_EVENT& aEvent, BOARD_COMMIT* aCommit
|
||||
|| evt->IsAction( &PCB_ACTIONS::moveWithReference )
|
||||
|| evt->IsAction( &PCB_ACTIONS::copyWithReference )
|
||||
|| evt->IsAction( &PCB_ACTIONS::positionRelative )
|
||||
|| evt->IsAction( &PCB_ACTIONS::positionRelativeInteractively )
|
||||
|| evt->IsAction( &ACTIONS::redo ) )
|
||||
{
|
||||
wxBell();
|
||||
|
@ -2020,6 +2020,12 @@ TOOL_ACTION PCB_ACTIONS::positionRelative( TOOL_ACTION_ARGS()
|
||||
.Tooltip( _( "Positions the selected item(s) by an exact amount relative to another" ) )
|
||||
.Icon( BITMAPS::move_relative ) );
|
||||
|
||||
TOOL_ACTION PCB_ACTIONS::positionRelativeInteractively( TOOL_ACTION_ARGS()
|
||||
.Name( "pcbnew.PositionRelative.positionRelativeInteractively" )
|
||||
.Scope( AS_GLOBAL )
|
||||
.FriendlyName( _( "Position Interactively..." ) )
|
||||
.Tooltip( _( "Positions the selected item(s) by an exact amount relative to another, interactively" ) )
|
||||
.Icon( BITMAPS::move_relative ) );
|
||||
|
||||
// PCIKER_TOOL
|
||||
//
|
||||
|
@ -321,8 +321,8 @@ public:
|
||||
static TOOL_ACTION distributeVerticallyGaps;
|
||||
|
||||
// Position Relative Tool
|
||||
/// Activation of the position relative tool
|
||||
static TOOL_ACTION positionRelative;
|
||||
static TOOL_ACTION positionRelativeInteractively;
|
||||
|
||||
/// Selection of reference points/items
|
||||
static TOOL_ACTION selectItemInteractively;
|
||||
|
@ -21,22 +21,31 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
using namespace std::placeholders;
|
||||
#include "tools/position_relative_tool.h"
|
||||
|
||||
#include <tools/position_relative_tool.h>
|
||||
#include <board_commit.h>
|
||||
#include <collectors.h>
|
||||
#include <dialogs/dialog_position_relative.h>
|
||||
#include <dialogs/dialog_set_offset.h>
|
||||
#include <footprint.h>
|
||||
#include <footprint_editor_settings.h>
|
||||
#include <gal/graphics_abstraction_layer.h>
|
||||
#include <kiplatform/ui.h>
|
||||
#include <pad.h>
|
||||
#include <pcb_group.h>
|
||||
#include <preview_items/two_point_assistant.h>
|
||||
#include <preview_items/two_point_geom_manager.h>
|
||||
#include <pcb_painter.h>
|
||||
#include <pgm_base.h>
|
||||
#include <preview_items/ruler_item.h>
|
||||
#include <render_settings.h>
|
||||
#include <settings/settings_manager.h>
|
||||
#include <status_popup.h>
|
||||
#include <tools/pcb_actions.h>
|
||||
#include <tools/pcb_grid_helper.h>
|
||||
#include <tools/pcb_selection_tool.h>
|
||||
#include <tools/pcb_picker_tool.h>
|
||||
#include <dialogs/dialog_position_relative.h>
|
||||
#include <board_commit.h>
|
||||
#include <confirm.h>
|
||||
#include <collectors.h>
|
||||
#include <pad.h>
|
||||
#include <footprint.h>
|
||||
#include <pcb_group.h>
|
||||
#include <view/view_controls.h>
|
||||
|
||||
|
||||
POSITION_RELATIVE_TOOL::POSITION_RELATIVE_TOOL() :
|
||||
@ -119,6 +128,270 @@ int POSITION_RELATIVE_TOOL::PositionRelative( const TOOL_EVENT& aEvent )
|
||||
}
|
||||
|
||||
|
||||
int POSITION_RELATIVE_TOOL::PositionRelativeInteractively( const TOOL_EVENT& aEvent )
|
||||
{
|
||||
// First, acquire the selection that we will be moving after
|
||||
// we have the new offset vector.
|
||||
const auto& selection = m_selectionTool->RequestSelection(
|
||||
[]( const VECTOR2I& aPt, GENERAL_COLLECTOR& aCollector, PCB_SELECTION_TOOL* sTool )
|
||||
{
|
||||
sTool->FilterCollectorForHierarchy( aCollector, true );
|
||||
sTool->FilterCollectorForMarkers( aCollector );
|
||||
},
|
||||
!m_isFootprintEditor /* prompt user regarding locked items */ );
|
||||
|
||||
if( m_isFootprintEditor && !frame()->GetModel() )
|
||||
return 0;
|
||||
|
||||
if( frame()->IsCurrentTool( ACTIONS::measureTool ) )
|
||||
return 0;
|
||||
|
||||
auto& view = *getView();
|
||||
auto& controls = *getViewControls();
|
||||
|
||||
frame()->PushTool( aEvent );
|
||||
|
||||
bool invertXAxis = displayOptions().m_DisplayInvertXAxis;
|
||||
bool invertYAxis = displayOptions().m_DisplayInvertYAxis;
|
||||
|
||||
if( m_isFootprintEditor )
|
||||
{
|
||||
invertXAxis = frame()->GetFootprintEditorSettings()->m_DisplayInvertXAxis;
|
||||
invertYAxis = frame()->GetFootprintEditorSettings()->m_DisplayInvertYAxis;
|
||||
}
|
||||
|
||||
KIGFX::PREVIEW::TWO_POINT_GEOMETRY_MANAGER twoPtMgr;
|
||||
PCB_GRID_HELPER grid( m_toolMgr, frame()->GetMagneticItemsSettings() );
|
||||
bool originSet = false;
|
||||
EDA_UNITS units = frame()->GetUserUnits();
|
||||
KIGFX::PREVIEW::RULER_ITEM ruler( twoPtMgr, pcbIUScale, units, invertXAxis, invertYAxis );
|
||||
STATUS_TEXT_POPUP statusPopup( frame() );
|
||||
|
||||
// Some colour to make it obviously not just a ruler
|
||||
ruler.SetColor( view.GetPainter()->GetSettings()->GetLayerColor( LAYER_ANCHOR ) );
|
||||
ruler.SetShowTicks( false );
|
||||
ruler.SetShowOriginArrowHead( true );
|
||||
|
||||
view.Add( &ruler );
|
||||
view.SetVisible( &ruler, false );
|
||||
|
||||
auto setCursor =
|
||||
[&]()
|
||||
{
|
||||
frame()->GetCanvas()->SetCurrentCursor( KICURSOR::MEASURE );
|
||||
};
|
||||
|
||||
auto cleanup =
|
||||
[&] ()
|
||||
{
|
||||
view.SetVisible( &ruler, false );
|
||||
controls.SetAutoPan( false );
|
||||
controls.CaptureCursor( false );
|
||||
controls.ForceCursorPosition( false );
|
||||
originSet = false;
|
||||
};
|
||||
|
||||
const auto applyVector = [&]( const VECTOR2I& aMoveVec )
|
||||
{
|
||||
BOARD_COMMIT commit( frame() );
|
||||
|
||||
for( EDA_ITEM* item : selection )
|
||||
{
|
||||
if( !item->IsBOARD_ITEM() )
|
||||
continue;
|
||||
|
||||
BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( item );
|
||||
|
||||
// Don't move a pad by itself unless editing the footprint
|
||||
if( boardItem->Type() == PCB_PAD_T
|
||||
&& !frame()->GetPcbNewSettings()->m_AllowFreePads
|
||||
&& frame()->IsType( FRAME_PCB_EDITOR ) )
|
||||
continue;
|
||||
|
||||
commit.Modify( boardItem );
|
||||
boardItem->Move( aMoveVec );
|
||||
}
|
||||
|
||||
commit.Push( _( "Set Relative Position Interactively" ) );
|
||||
};
|
||||
|
||||
Activate();
|
||||
// Must be done after Activate() so that it gets set into the correct context
|
||||
controls.ShowCursor( true );
|
||||
controls.SetAutoPan( false );
|
||||
controls.CaptureCursor( false );
|
||||
controls.ForceCursorPosition( false );
|
||||
|
||||
// Set initial cursor
|
||||
setCursor();
|
||||
|
||||
const auto setInitialMsg = [&]()
|
||||
{
|
||||
statusPopup.SetText( _( "Select the reference point on the item to move." ) );
|
||||
};
|
||||
|
||||
const auto setDragMsg = [&]()
|
||||
{
|
||||
statusPopup.SetText( _( "Select the point to define the new offset from." ) );
|
||||
};
|
||||
|
||||
const auto setPopupPosition = [&]()
|
||||
{
|
||||
statusPopup.Move( KIPLATFORM::UI::GetMousePosition() + wxPoint( 20, -50 ) );
|
||||
};
|
||||
|
||||
setInitialMsg();
|
||||
|
||||
setPopupPosition();
|
||||
statusPopup.Popup();
|
||||
canvas()->SetStatusPopup( statusPopup.GetPanel() );
|
||||
|
||||
while( TOOL_EVENT* evt = Wait() )
|
||||
{
|
||||
setCursor();
|
||||
grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
|
||||
grid.SetUseGrid( view.GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
|
||||
VECTOR2I cursorPos = evt->HasPosition() ? evt->Position() : controls.GetMousePosition();
|
||||
cursorPos = grid.BestSnapAnchor( cursorPos, nullptr );
|
||||
controls.ForceCursorPosition( true, cursorPos );
|
||||
setPopupPosition();
|
||||
|
||||
if( evt->IsCancelInteractive() )
|
||||
{
|
||||
if( originSet )
|
||||
{
|
||||
cleanup();
|
||||
}
|
||||
else
|
||||
{
|
||||
frame()->PopTool( aEvent );
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if( evt->IsActivate() )
|
||||
{
|
||||
if( originSet )
|
||||
cleanup();
|
||||
|
||||
frame()->PopTool( aEvent );
|
||||
break;
|
||||
}
|
||||
// click or drag starts
|
||||
else if( !originSet && ( evt->IsDrag( BUT_LEFT ) || evt->IsClick( BUT_LEFT ) ) )
|
||||
{
|
||||
twoPtMgr.SetOrigin( cursorPos );
|
||||
twoPtMgr.SetEnd( cursorPos );
|
||||
|
||||
setDragMsg();
|
||||
|
||||
controls.CaptureCursor( true );
|
||||
controls.SetAutoPan( true );
|
||||
|
||||
originSet = true;
|
||||
}
|
||||
// second click or mouse up after drag ends
|
||||
else if( originSet && ( evt->IsClick( BUT_LEFT ) || evt->IsMouseUp( BUT_LEFT ) ) )
|
||||
{
|
||||
// The reverse vector, as (I think) it's clearer if the arrow points to
|
||||
// the thing that's going to move, and it's more natural to start drawing
|
||||
// at the item you just selected (which is the one that will move)
|
||||
const VECTOR2I origVector = twoPtMgr.GetOrigin() - twoPtMgr.GetEnd();
|
||||
VECTOR2I offsetVector = origVector;
|
||||
DIALOG_SET_OFFSET dlg( *frame(), offsetVector, false );
|
||||
|
||||
int ret = dlg.ShowModal();
|
||||
|
||||
if( ret == wxID_OK )
|
||||
{
|
||||
const VECTOR2I move = offsetVector - origVector;
|
||||
|
||||
applyVector( move );
|
||||
|
||||
// Leave the arrow in place but update it
|
||||
twoPtMgr.SetOrigin( twoPtMgr.GetOrigin() + move );
|
||||
view.Update( &ruler, KIGFX::GEOMETRY );
|
||||
canvas()->Refresh();
|
||||
}
|
||||
|
||||
originSet = false;
|
||||
|
||||
setInitialMsg();
|
||||
|
||||
controls.SetAutoPan( false );
|
||||
controls.CaptureCursor( false );
|
||||
}
|
||||
// move or drag when origin set updates rules
|
||||
else if( originSet && ( evt->IsMotion() || evt->IsDrag( BUT_LEFT ) ) )
|
||||
{
|
||||
SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
|
||||
bool force45Deg;
|
||||
|
||||
if( frame()->IsType( FRAME_PCB_EDITOR ) )
|
||||
force45Deg = mgr.GetAppSettings<PCBNEW_SETTINGS>()->m_Use45DegreeLimit;
|
||||
else
|
||||
force45Deg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>()->m_Use45Limit;
|
||||
|
||||
twoPtMgr.SetAngleSnap( force45Deg );
|
||||
twoPtMgr.SetEnd( cursorPos );
|
||||
|
||||
view.SetVisible( &ruler, true );
|
||||
view.Update( &ruler, KIGFX::GEOMETRY );
|
||||
}
|
||||
else if( evt->IsAction( &ACTIONS::updateUnits ) )
|
||||
{
|
||||
if( frame()->GetUserUnits() != units )
|
||||
{
|
||||
units = frame()->GetUserUnits();
|
||||
ruler.SwitchUnits( units );
|
||||
view.Update( &ruler, KIGFX::GEOMETRY );
|
||||
canvas()->ForceRefresh();
|
||||
}
|
||||
|
||||
evt->SetPassEvent();
|
||||
}
|
||||
else if( evt->IsAction( &ACTIONS::updatePreferences ) )
|
||||
{
|
||||
invertXAxis = displayOptions().m_DisplayInvertXAxis;
|
||||
invertYAxis = displayOptions().m_DisplayInvertYAxis;
|
||||
|
||||
if( m_isFootprintEditor )
|
||||
{
|
||||
invertXAxis = frame()->GetFootprintEditorSettings()->m_DisplayInvertXAxis;
|
||||
invertYAxis = frame()->GetFootprintEditorSettings()->m_DisplayInvertYAxis;
|
||||
}
|
||||
|
||||
ruler.UpdateDir( invertXAxis, invertYAxis );
|
||||
|
||||
view.Update( &ruler, KIGFX::GEOMETRY );
|
||||
canvas()->Refresh();
|
||||
evt->SetPassEvent();
|
||||
}
|
||||
else if( evt->IsClick( BUT_RIGHT ) )
|
||||
{
|
||||
// TODO: This does not work
|
||||
PCB_SELECTION dummy;
|
||||
PCB_PICKER_TOOL* picker = m_toolMgr->GetTool<PCB_PICKER_TOOL>();
|
||||
picker->GetToolMenu().ShowContextMenu( dummy );
|
||||
}
|
||||
else
|
||||
{
|
||||
evt->SetPassEvent();
|
||||
}
|
||||
}
|
||||
|
||||
view.SetVisible( &ruler, false );
|
||||
view.Remove( &ruler );
|
||||
|
||||
frame()->GetCanvas()->SetCurrentCursor( KICURSOR::ARROW );
|
||||
controls.SetAutoPan( false );
|
||||
controls.CaptureCursor( false );
|
||||
controls.ForceCursorPosition( false );
|
||||
|
||||
canvas()->SetStatusPopup( nullptr );
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int POSITION_RELATIVE_TOOL::RelativeItemSelectionMove( const VECTOR2I& aPosAnchor,
|
||||
const VECTOR2I& aTranslation )
|
||||
{
|
||||
@ -157,5 +430,8 @@ int POSITION_RELATIVE_TOOL::RelativeItemSelectionMove( const VECTOR2I& aPosAncho
|
||||
|
||||
void POSITION_RELATIVE_TOOL::setTransitions()
|
||||
{
|
||||
Go( &POSITION_RELATIVE_TOOL::PositionRelative, PCB_ACTIONS::positionRelative.MakeEvent() );
|
||||
// clang-format off
|
||||
Go( &POSITION_RELATIVE_TOOL::PositionRelative, PCB_ACTIONS::positionRelative.MakeEvent() );
|
||||
Go( &POSITION_RELATIVE_TOOL::PositionRelativeInteractively, PCB_ACTIONS::positionRelativeInteractively.MakeEvent() );
|
||||
// clang-format on
|
||||
}
|
||||
|
@ -56,6 +56,12 @@ public:
|
||||
*/
|
||||
int PositionRelative( const TOOL_EVENT& aEvent );
|
||||
|
||||
/**
|
||||
* Draw a line connecting two points and allow the user to enter what it should be.
|
||||
* The move the items to match that.
|
||||
*/
|
||||
int PositionRelativeInteractively( const TOOL_EVENT& aEvent );
|
||||
|
||||
/**
|
||||
* Return the position of the selected item(s)
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user