Add snapping to eeschema
This generalizes both the SetPosition() function and ORIGIN_VIEWITEM class away from the pcbnew-centric.
This commit is contained in:
parent
467aa47bbb
commit
173b4ff588
|
@ -398,6 +398,8 @@ list( APPEND COMMON_SRCS
|
||||||
set( COMMON_SRCS
|
set( COMMON_SRCS
|
||||||
${COMMON_SRCS}
|
${COMMON_SRCS}
|
||||||
|
|
||||||
|
origin_viewitem.cpp
|
||||||
|
|
||||||
view/view.cpp
|
view/view.cpp
|
||||||
view/view_item.cpp
|
view/view_item.cpp
|
||||||
view/view_group.cpp
|
view/view_group.cpp
|
||||||
|
@ -477,7 +479,6 @@ set( PCB_COMMON_SRCS
|
||||||
eda_text.cpp
|
eda_text.cpp
|
||||||
fp_lib_table.cpp
|
fp_lib_table.cpp
|
||||||
hash_eda.cpp
|
hash_eda.cpp
|
||||||
origin_viewitem.cpp
|
|
||||||
page_info.cpp
|
page_info.cpp
|
||||||
${CMAKE_SOURCE_DIR}/pcbnew/pcb_base_frame.cpp
|
${CMAKE_SOURCE_DIR}/pcbnew/pcb_base_frame.cpp
|
||||||
${CMAKE_SOURCE_DIR}/pcbnew/pcb_expr_evaluator.cpp
|
${CMAKE_SOURCE_DIR}/pcbnew/pcb_expr_evaluator.cpp
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
using namespace KIGFX;
|
using namespace KIGFX;
|
||||||
|
|
||||||
ORIGIN_VIEWITEM::ORIGIN_VIEWITEM( const COLOR4D& aColor, MARKER_STYLE aStyle, int aSize, const VECTOR2D& aPosition ) :
|
ORIGIN_VIEWITEM::ORIGIN_VIEWITEM( const COLOR4D& aColor, MARKER_STYLE aStyle, int aSize, const VECTOR2D& aPosition ) :
|
||||||
BOARD_ITEM( nullptr, NOT_USED ), // this item is never added to a BOARD so it needs no type
|
EDA_ITEM( nullptr, NOT_USED ), // this item is never added to a BOARD/SCHEMATIC so it needs no type
|
||||||
m_position( aPosition ),
|
m_position( aPosition ),
|
||||||
m_size( aSize ),
|
m_size( aSize ),
|
||||||
m_color( aColor ),
|
m_color( aColor ),
|
||||||
|
@ -43,7 +43,7 @@ ORIGIN_VIEWITEM::ORIGIN_VIEWITEM( const COLOR4D& aColor, MARKER_STYLE aStyle, in
|
||||||
|
|
||||||
|
|
||||||
ORIGIN_VIEWITEM::ORIGIN_VIEWITEM( const VECTOR2D& aPosition, STATUS_FLAGS flags ) :
|
ORIGIN_VIEWITEM::ORIGIN_VIEWITEM( const VECTOR2D& aPosition, STATUS_FLAGS flags ) :
|
||||||
BOARD_ITEM( nullptr, NOT_USED ), // this item is never added to a BOARD so it needs no type
|
EDA_ITEM( nullptr, NOT_USED ), // this item is never added to a BOARD/SCHEMATIC so it needs no type
|
||||||
m_position( aPosition ),
|
m_position( aPosition ),
|
||||||
m_size( NOT_USED ),
|
m_size( NOT_USED ),
|
||||||
m_color( UNSPECIFIED_COLOR ),
|
m_color( UNSPECIFIED_COLOR ),
|
||||||
|
@ -108,7 +108,7 @@ void ORIGIN_VIEWITEM::ViewDraw( int, VIEW* aView ) const
|
||||||
clip.Normalize();
|
clip.Normalize();
|
||||||
|
|
||||||
double theta = atan2( end.y - start.y, end.x - start.x );
|
double theta = atan2( end.y - start.y, end.x - start.x );
|
||||||
std::array<double,2> strokes = { DASH_MARK_LEN( 1 ), DASH_GAP_LEN( 1 ) };
|
std::array<double,2> strokes = { scaledSize.x, scaledSize.x / 2 };
|
||||||
|
|
||||||
for( size_t i = 0; i < 10000; ++i )
|
for( size_t i = 0; i < 10000; ++i )
|
||||||
{
|
{
|
||||||
|
|
|
@ -216,7 +216,7 @@ void WS_DRAW_ITEM_POLYPOLYGONS::PrintWsItem( RENDER_SETTINGS* aSettings, const w
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void WS_DRAW_ITEM_POLYPOLYGONS::SetPosition( wxPoint aPos )
|
void WS_DRAW_ITEM_POLYPOLYGONS::SetPosition( const wxPoint& aPos )
|
||||||
{
|
{
|
||||||
// Note: m_pos is the anchor point of the shape.
|
// Note: m_pos is the anchor point of the shape.
|
||||||
wxPoint move_vect = aPos - m_pos;
|
wxPoint move_vect = aPos - m_pos;
|
||||||
|
|
|
@ -87,7 +87,7 @@ void VIEW_CONTROLS::ApplySettings( const VC_SETTINGS& aSettings )
|
||||||
{
|
{
|
||||||
ShowCursor( aSettings.m_showCursor );
|
ShowCursor( aSettings.m_showCursor );
|
||||||
CaptureCursor( aSettings.m_cursorCaptured );
|
CaptureCursor( aSettings.m_cursorCaptured );
|
||||||
SetSnapping( aSettings.m_snappingEnabled );
|
SetGridSnapping( aSettings.m_snappingEnabled );
|
||||||
SetGrabMouse( aSettings.m_grabMouse );
|
SetGrabMouse( aSettings.m_grabMouse );
|
||||||
SetAutoPan( aSettings.m_autoPanEnabled );
|
SetAutoPan( aSettings.m_autoPanEnabled );
|
||||||
SetAutoPanMargin( aSettings.m_autoPanMargin );
|
SetAutoPanMargin( aSettings.m_autoPanMargin );
|
||||||
|
|
|
@ -93,7 +93,7 @@ public:
|
||||||
* currently: do nothing in CvPcb.
|
* currently: do nothing in CvPcb.
|
||||||
* but but be defined because it is a pure virtual in PCB_BASE_FRAME
|
* but but be defined because it is a pure virtual in PCB_BASE_FRAME
|
||||||
*/
|
*/
|
||||||
void SaveCopyInUndoList( BOARD_ITEM* aItemToCopy, UNDO_REDO aTypeCommand = UNDO_REDO::UNSPECIFIED,
|
void SaveCopyInUndoList( EDA_ITEM* aItemToCopy, UNDO_REDO aTypeCommand = UNDO_REDO::UNSPECIFIED,
|
||||||
const wxPoint& aTransformPoint = wxPoint( 0, 0 ) ) override
|
const wxPoint& aTransformPoint = wxPoint( 0, 0 ) ) override
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -243,6 +243,7 @@ set( EESCHEMA_SRCS
|
||||||
tools/backannotate.cpp
|
tools/backannotate.cpp
|
||||||
tools/backanno.cpp
|
tools/backanno.cpp
|
||||||
tools/ee_actions.cpp
|
tools/ee_actions.cpp
|
||||||
|
tools/ee_grid_helper.cpp
|
||||||
tools/ee_inspection_tool.cpp
|
tools/ee_inspection_tool.cpp
|
||||||
tools/ee_point_editor.cpp
|
tools/ee_point_editor.cpp
|
||||||
tools/ee_selection.cpp
|
tools/ee_selection.cpp
|
||||||
|
|
|
@ -245,7 +245,7 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual void MoveTo( const wxPoint& aPosition ) = 0;
|
virtual void MoveTo( const wxPoint& aPosition ) = 0;
|
||||||
|
|
||||||
void SetPosition( const wxPoint& aPosition ) { MoveTo( aPosition ); }
|
void SetPosition( const wxPoint& aPosition ) override { MoveTo( aPosition ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mirror the draw object along the horizontal (X) axis about \a aCenter point.
|
* Mirror the draw object along the horizontal (X) axis about \a aCenter point.
|
||||||
|
|
|
@ -252,7 +252,7 @@ public:
|
||||||
void MoveTo( const wxPoint& aPosition ) override;
|
void MoveTo( const wxPoint& aPosition ) override;
|
||||||
|
|
||||||
wxPoint GetPosition() const override { return m_position; }
|
wxPoint GetPosition() const override { return m_position; }
|
||||||
void SetPosition( const wxPoint& aPos ) { m_position = aPos; }
|
void SetPosition( const wxPoint& aPos ) override { m_position = aPos; }
|
||||||
|
|
||||||
void MirrorHorizontal( const wxPoint& aCenter ) override;
|
void MirrorHorizontal( const wxPoint& aCenter ) override;
|
||||||
void MirrorVertical( const wxPoint& aCenter ) override;
|
void MirrorVertical( const wxPoint& aCenter ) override;
|
||||||
|
|
|
@ -194,7 +194,7 @@ LIB_VIEW_FRAME::LIB_VIEW_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrame
|
||||||
}
|
}
|
||||||
|
|
||||||
SyncView();
|
SyncView();
|
||||||
GetCanvas()->GetViewControls()->SetSnapping( true );
|
GetCanvas()->GetViewControls()->SetGridSnapping( true );
|
||||||
GetCanvas()->SetCanFocus( false );
|
GetCanvas()->SetCanFocus( false );
|
||||||
|
|
||||||
// Set the working/draw area size to display a symbol to a reasonable value:
|
// Set the working/draw area size to display a symbol to a reasonable value:
|
||||||
|
|
|
@ -175,7 +175,7 @@ LIB_EDIT_FRAME::LIB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
|
||||||
Show( true );
|
Show( true );
|
||||||
|
|
||||||
SyncView();
|
SyncView();
|
||||||
GetCanvas()->GetViewControls()->SetSnapping( true );
|
GetCanvas()->GetViewControls()->SetGridSnapping( true );
|
||||||
GetCanvas()->GetView()->UseDrawPriority( true );
|
GetCanvas()->GetView()->UseDrawPriority( true );
|
||||||
GetCanvas()->GetGAL()->SetAxesEnabled( true );
|
GetCanvas()->GetGAL()->SetAxesEnabled( true );
|
||||||
|
|
||||||
|
|
|
@ -91,7 +91,7 @@ SCH_DRAW_PANEL::SCH_DRAW_PANEL( wxWindow* aParentWindow, wxWindowID aWindowId,
|
||||||
// on updated viewport data.
|
// on updated viewport data.
|
||||||
m_viewControls = new KIGFX::WX_VIEW_CONTROLS( m_view, this );
|
m_viewControls = new KIGFX::WX_VIEW_CONTROLS( m_view, this );
|
||||||
|
|
||||||
m_viewControls->SetSnapping( true );
|
m_viewControls->SetGridSnapping( true );
|
||||||
|
|
||||||
SetEvtHandlerEnabled( true );
|
SetEvtHandlerEnabled( true );
|
||||||
SetFocus();
|
SetFocus();
|
||||||
|
|
|
@ -482,13 +482,6 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual void Plot( PLOTTER* aPlotter );
|
virtual void Plot( PLOTTER* aPlotter );
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the schematic item position to \a aPosition.
|
|
||||||
*
|
|
||||||
* @param aPosition A reference to a wxPoint object containing the new position.
|
|
||||||
*/
|
|
||||||
virtual void SetPosition( const wxPoint& aPosition ) = 0;
|
|
||||||
|
|
||||||
virtual bool operator <( const SCH_ITEM& aItem ) const;
|
virtual bool operator <( const SCH_ITEM& aItem ) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -70,7 +70,7 @@ SCH_PREVIEW_PANEL::SCH_PREVIEW_PANEL( wxWindow* aParentWindow, wxWindowID aWindo
|
||||||
m_gal->SetCursorEnabled( false );
|
m_gal->SetCursorEnabled( false );
|
||||||
m_gal->SetGridSize( VECTOR2D( Mils2iu( 100.0 ), Mils2iu( 100.0 ) ) );
|
m_gal->SetGridSize( VECTOR2D( Mils2iu( 100.0 ), Mils2iu( 100.0 ) ) );
|
||||||
|
|
||||||
m_viewControls->SetSnapping( true );
|
m_viewControls->SetGridSnapping( true );
|
||||||
|
|
||||||
SetEvtHandlerEnabled( true );
|
SetEvtHandlerEnabled( true );
|
||||||
SetFocus();
|
SetFocus();
|
||||||
|
|
|
@ -0,0 +1,385 @@
|
||||||
|
/*
|
||||||
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014 CERN
|
||||||
|
* Copyright (C) 2018-2020 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
|
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
|
||||||
|
*
|
||||||
|
* 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 <functional>
|
||||||
|
using namespace std::placeholders;
|
||||||
|
|
||||||
|
#include <geometry/shape_line_chain.h>
|
||||||
|
#include <macros.h>
|
||||||
|
#include <math/util.h> // for KiROUND
|
||||||
|
#include <math/vector2d.h>
|
||||||
|
#include <sch_item.h>
|
||||||
|
#include <sch_painter.h>
|
||||||
|
#include <tool/tool_manager.h>
|
||||||
|
#include <view/view.h>
|
||||||
|
#include <view/view_controls.h>
|
||||||
|
|
||||||
|
#include "ee_grid_helper.h"
|
||||||
|
|
||||||
|
|
||||||
|
EE_GRID_HELPER::EE_GRID_HELPER( TOOL_MANAGER* aToolMgr ) :
|
||||||
|
m_toolMgr( aToolMgr )
|
||||||
|
{
|
||||||
|
m_enableSnap = true;
|
||||||
|
m_enableSnapLine = true;
|
||||||
|
m_snapSize = 100;
|
||||||
|
m_snapItem = nullptr;
|
||||||
|
KIGFX::VIEW* view = m_toolMgr->GetView();
|
||||||
|
|
||||||
|
m_viewAxis.SetSize( 20000 );
|
||||||
|
m_viewAxis.SetStyle( KIGFX::ORIGIN_VIEWITEM::CROSS );
|
||||||
|
m_viewAxis.SetColor( COLOR4D( 0.0, 0.1, 0.4, 0.8 ) );
|
||||||
|
m_viewAxis.SetDrawAtZero( true );
|
||||||
|
view->Add( &m_viewAxis );
|
||||||
|
view->SetVisible( &m_viewAxis, false );
|
||||||
|
|
||||||
|
m_viewSnapPoint.SetStyle( KIGFX::ORIGIN_VIEWITEM::CIRCLE_CROSS );
|
||||||
|
m_viewSnapPoint.SetColor( COLOR4D( 0.0, 0.1, 0.4, 1.0 ) );
|
||||||
|
m_viewSnapPoint.SetDrawAtZero( true );
|
||||||
|
view->Add( &m_viewSnapPoint );
|
||||||
|
view->SetVisible( &m_viewSnapPoint, false );
|
||||||
|
|
||||||
|
m_viewSnapLine.SetStyle( KIGFX::ORIGIN_VIEWITEM::DASH_LINE );
|
||||||
|
m_viewSnapLine.SetColor( COLOR4D( 0.33, 0.55, 0.95, 1.0 ) );
|
||||||
|
m_viewSnapLine.SetDrawAtZero( true );
|
||||||
|
view->Add( &m_viewSnapLine );
|
||||||
|
view->SetVisible( &m_viewSnapLine, false );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
EE_GRID_HELPER::~EE_GRID_HELPER()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
VECTOR2I EE_GRID_HELPER::GetGrid() const
|
||||||
|
{
|
||||||
|
VECTOR2D size = m_toolMgr->GetView()->GetGAL()->GetGridSize();
|
||||||
|
|
||||||
|
return VECTOR2I( KiROUND( size.x ), KiROUND( size.y ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
VECTOR2I EE_GRID_HELPER::GetOrigin() const
|
||||||
|
{
|
||||||
|
VECTOR2D origin = m_toolMgr->GetView()->GetGAL()->GetGridOrigin();
|
||||||
|
|
||||||
|
return VECTOR2I( origin );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void EE_GRID_HELPER::SetAuxAxes( bool aEnable, const VECTOR2I& aOrigin )
|
||||||
|
{
|
||||||
|
if( aEnable )
|
||||||
|
{
|
||||||
|
m_auxAxis = aOrigin;
|
||||||
|
m_viewAxis.SetPosition( wxPoint( aOrigin ) );
|
||||||
|
m_toolMgr->GetView()->SetVisible( &m_viewAxis, true );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_auxAxis = OPT<VECTOR2I>();
|
||||||
|
m_toolMgr->GetView()->SetVisible( &m_viewAxis, false );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
VECTOR2I EE_GRID_HELPER::Align( const VECTOR2I& aPoint ) const
|
||||||
|
{
|
||||||
|
if( !m_toolMgr->GetView()->GetGAL()->GetGridVisibility() )
|
||||||
|
return aPoint;
|
||||||
|
|
||||||
|
const VECTOR2D gridOffset( GetOrigin() );
|
||||||
|
const VECTOR2D grid( GetGrid() );
|
||||||
|
|
||||||
|
VECTOR2I nearest( KiROUND( ( aPoint.x - gridOffset.x ) / grid.x ) * grid.x + gridOffset.x,
|
||||||
|
KiROUND( ( aPoint.y - gridOffset.y ) / grid.y ) * grid.y + gridOffset.y );
|
||||||
|
|
||||||
|
if( !m_auxAxis )
|
||||||
|
return nearest;
|
||||||
|
|
||||||
|
if( std::abs( m_auxAxis->x - aPoint.x ) < std::abs( nearest.x - aPoint.x ) )
|
||||||
|
nearest.x = m_auxAxis->x;
|
||||||
|
|
||||||
|
if( std::abs( m_auxAxis->y - aPoint.y ) < std::abs( nearest.y - aPoint.y ) )
|
||||||
|
nearest.y = m_auxAxis->y;
|
||||||
|
|
||||||
|
return nearest;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
VECTOR2I EE_GRID_HELPER::AlignToWire( const VECTOR2I& aPoint, const SEG& aSeg )
|
||||||
|
{
|
||||||
|
OPT_VECTOR2I pts[6];
|
||||||
|
|
||||||
|
if( !m_enableSnap )
|
||||||
|
return aPoint;
|
||||||
|
|
||||||
|
const VECTOR2D gridOffset( GetOrigin() );
|
||||||
|
const VECTOR2D gridSize( GetGrid() );
|
||||||
|
|
||||||
|
VECTOR2I nearest( KiROUND( ( aPoint.x - gridOffset.x ) / gridSize.x ) * gridSize.x + gridOffset.x,
|
||||||
|
KiROUND( ( aPoint.y - gridOffset.y ) / gridSize.y ) * gridSize.y + gridOffset.y );
|
||||||
|
|
||||||
|
pts[0] = aSeg.A;
|
||||||
|
pts[1] = aSeg.B;
|
||||||
|
pts[2] = aSeg.IntersectLines( SEG( nearest + VECTOR2I( -1, 0 ), nearest + VECTOR2I( 1, 0 ) ) );
|
||||||
|
pts[3] = aSeg.IntersectLines( SEG( nearest + VECTOR2I( 0, -1 ), nearest + VECTOR2I( 0, 1 ) ) );
|
||||||
|
|
||||||
|
int min_d = std::numeric_limits<int>::max();
|
||||||
|
|
||||||
|
for( int i = 0; i < 4; i++ )
|
||||||
|
{
|
||||||
|
if( pts[i] && aSeg.Contains( *pts[i] ) )
|
||||||
|
{
|
||||||
|
int d = (*pts[i] - aPoint).EuclideanNorm();
|
||||||
|
|
||||||
|
if( d < min_d )
|
||||||
|
{
|
||||||
|
min_d = d;
|
||||||
|
nearest = *pts[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nearest;
|
||||||
|
}
|
||||||
|
|
||||||
|
VECTOR2I EE_GRID_HELPER::BestDragOrigin( const VECTOR2I &aMousePos, std::vector<SCH_ITEM*>& aItems )
|
||||||
|
{
|
||||||
|
clearAnchors();
|
||||||
|
|
||||||
|
for( SCH_ITEM* item : aItems )
|
||||||
|
computeAnchors( item, aMousePos, true );
|
||||||
|
|
||||||
|
double worldScale = m_toolMgr->GetView()->GetGAL()->GetWorldScale();
|
||||||
|
double lineSnapMinCornerDistance = 50.0 / worldScale;
|
||||||
|
|
||||||
|
ANCHOR* nearestOutline = nearestAnchor( aMousePos, OUTLINE, LSET::AllLayersMask() );
|
||||||
|
ANCHOR* nearestCorner = nearestAnchor( aMousePos, CORNER, LSET::AllLayersMask() );
|
||||||
|
ANCHOR* nearestOrigin = nearestAnchor( aMousePos, ORIGIN, LSET::AllLayersMask() );
|
||||||
|
ANCHOR* best = NULL;
|
||||||
|
double minDist = std::numeric_limits<double>::max();
|
||||||
|
|
||||||
|
if( nearestOrigin )
|
||||||
|
{
|
||||||
|
minDist = nearestOrigin->Distance( aMousePos );
|
||||||
|
best = nearestOrigin;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( nearestCorner )
|
||||||
|
{
|
||||||
|
double dist = nearestCorner->Distance( aMousePos );
|
||||||
|
|
||||||
|
if( dist < minDist )
|
||||||
|
{
|
||||||
|
minDist = dist;
|
||||||
|
best = nearestCorner;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( nearestOutline )
|
||||||
|
{
|
||||||
|
double dist = nearestOutline->Distance( aMousePos );
|
||||||
|
|
||||||
|
if( minDist > lineSnapMinCornerDistance && dist < minDist )
|
||||||
|
best = nearestOutline;
|
||||||
|
}
|
||||||
|
|
||||||
|
return best ? best->pos : aMousePos;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::set<SCH_ITEM*> EE_GRID_HELPER::queryVisible( const BOX2I& aArea,
|
||||||
|
const std::vector<SCH_ITEM*>& aSkip ) const
|
||||||
|
{
|
||||||
|
std::set<SCH_ITEM*> items;
|
||||||
|
std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> selectedItems;
|
||||||
|
|
||||||
|
KIGFX::VIEW* view = m_toolMgr->GetView();
|
||||||
|
|
||||||
|
view->Query( aArea, selectedItems );
|
||||||
|
|
||||||
|
for( const KIGFX::VIEW::LAYER_ITEM_PAIR& it : selectedItems )
|
||||||
|
{
|
||||||
|
SCH_ITEM* item = static_cast<SCH_ITEM*>( it.first );
|
||||||
|
|
||||||
|
// The item must be visible and on an active layer
|
||||||
|
if( view->IsVisible( item )
|
||||||
|
&& item->ViewGetLOD( it.second, view ) < view->GetScale() )
|
||||||
|
{
|
||||||
|
items.insert ( item );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for( SCH_ITEM* skipItem : aSkip )
|
||||||
|
items.erase( skipItem );
|
||||||
|
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
VECTOR2I EE_GRID_HELPER::BestSnapAnchor( const VECTOR2I& aOrigin, SCH_ITEM* aDraggedItem )
|
||||||
|
{
|
||||||
|
return BestSnapAnchor( aOrigin, LSET::AllLayersMask(), { aDraggedItem } );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
VECTOR2I EE_GRID_HELPER::BestSnapAnchor( const VECTOR2I& aOrigin, const LSET& aLayers,
|
||||||
|
const std::vector<SCH_ITEM*>& aSkip )
|
||||||
|
{
|
||||||
|
double worldScale = m_toolMgr->GetView()->GetGAL()->GetWorldScale();
|
||||||
|
int snapRange = (int) ( m_snapSize / worldScale );
|
||||||
|
|
||||||
|
BOX2I bb( VECTOR2I( aOrigin.x - snapRange / 2, aOrigin.y - snapRange / 2 ),
|
||||||
|
VECTOR2I( snapRange, snapRange ) );
|
||||||
|
|
||||||
|
clearAnchors();
|
||||||
|
|
||||||
|
for( SCH_ITEM* item : queryVisible( bb, aSkip ) )
|
||||||
|
computeAnchors( item, aOrigin );
|
||||||
|
|
||||||
|
ANCHOR* nearest = nearestAnchor( aOrigin, SNAPPABLE, aLayers );
|
||||||
|
VECTOR2I nearestGrid = Align( aOrigin );
|
||||||
|
|
||||||
|
if( nearest && m_enableSnap )
|
||||||
|
{
|
||||||
|
double snapDist = nearest->Distance( aOrigin );
|
||||||
|
|
||||||
|
if( snapDist <= snapRange )
|
||||||
|
{
|
||||||
|
m_viewSnapPoint.SetPosition( wxPoint( nearest->pos ) );
|
||||||
|
m_viewSnapLine.SetPosition( wxPoint( nearest->pos ) );
|
||||||
|
m_toolMgr->GetView()->SetVisible( &m_viewSnapLine, false );
|
||||||
|
|
||||||
|
if( m_toolMgr->GetView()->IsVisible( &m_viewSnapPoint ) )
|
||||||
|
m_toolMgr->GetView()->Update( &m_viewSnapPoint, KIGFX::GEOMETRY);
|
||||||
|
else
|
||||||
|
m_toolMgr->GetView()->SetVisible( &m_viewSnapPoint, true );
|
||||||
|
|
||||||
|
m_snapItem = nearest;
|
||||||
|
return nearest->pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( m_snapItem && m_enableSnapLine && m_enableSnap )
|
||||||
|
{
|
||||||
|
bool snapLine = false;
|
||||||
|
|
||||||
|
if( std::abs( m_viewSnapLine.GetPosition().x - aOrigin.x ) < snapRange )
|
||||||
|
{
|
||||||
|
nearestGrid.x = m_viewSnapLine.GetPosition().x;
|
||||||
|
snapLine = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( std::abs( m_viewSnapLine.GetPosition().y - aOrigin.y ) < snapRange )
|
||||||
|
{
|
||||||
|
nearestGrid.y = m_viewSnapLine.GetPosition().y;
|
||||||
|
snapLine = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( snapLine && m_skipPoint != VECTOR2I( m_viewSnapLine.GetPosition() ) )
|
||||||
|
{
|
||||||
|
m_viewSnapLine.SetEndPosition( nearestGrid );
|
||||||
|
m_toolMgr->GetView()->SetVisible( &m_viewSnapPoint, false );
|
||||||
|
|
||||||
|
if( m_toolMgr->GetView()->IsVisible( &m_viewSnapLine ) )
|
||||||
|
m_toolMgr->GetView()->Update( &m_viewSnapLine, KIGFX::GEOMETRY );
|
||||||
|
else
|
||||||
|
m_toolMgr->GetView()->SetVisible( &m_viewSnapLine, true );
|
||||||
|
|
||||||
|
return nearestGrid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_snapItem = nullptr;
|
||||||
|
m_toolMgr->GetView()->SetVisible( &m_viewSnapPoint, false );
|
||||||
|
m_toolMgr->GetView()->SetVisible( &m_viewSnapLine, false );
|
||||||
|
return nearestGrid;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SCH_ITEM* EE_GRID_HELPER::GetSnapped() const
|
||||||
|
{
|
||||||
|
if( !m_snapItem )
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
return m_snapItem->item;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void EE_GRID_HELPER::computeAnchors( SCH_ITEM* aItem, const VECTOR2I& aRefPos, bool aFrom )
|
||||||
|
{
|
||||||
|
switch( aItem->Type() )
|
||||||
|
{
|
||||||
|
case SCH_COMPONENT_T:
|
||||||
|
case SCH_SHEET_T:
|
||||||
|
addAnchor( aItem->GetPosition(), ORIGIN, aItem );
|
||||||
|
KI_FALLTHROUGH;
|
||||||
|
case SCH_JUNCTION_T:
|
||||||
|
case SCH_NO_CONNECT_T:
|
||||||
|
case SCH_LINE_T:
|
||||||
|
case SCH_GLOBAL_LABEL_T:
|
||||||
|
case SCH_HIER_LABEL_T:
|
||||||
|
case SCH_LABEL_T:
|
||||||
|
case SCH_BUS_WIRE_ENTRY_T:
|
||||||
|
{
|
||||||
|
std::vector<wxPoint> pts = aItem->GetConnectionPoints();
|
||||||
|
|
||||||
|
for( auto pt : pts )
|
||||||
|
addAnchor( VECTOR2I( pt ), SNAPPABLE | CORNER, aItem );
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
EE_GRID_HELPER::ANCHOR* EE_GRID_HELPER::nearestAnchor( const VECTOR2I& aPos, int aFlags,
|
||||||
|
LSET aMatchLayers )
|
||||||
|
{
|
||||||
|
double minDist = std::numeric_limits<double>::max();
|
||||||
|
ANCHOR* best = NULL;
|
||||||
|
|
||||||
|
for( ANCHOR& a : m_anchors )
|
||||||
|
{
|
||||||
|
if( ( aFlags & a.flags ) != aFlags )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
double dist = a.Distance( aPos );
|
||||||
|
|
||||||
|
if( dist < minDist )
|
||||||
|
{
|
||||||
|
minDist = dist;
|
||||||
|
best = &a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return best;
|
||||||
|
}
|
|
@ -0,0 +1,160 @@
|
||||||
|
/*
|
||||||
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014 CERN
|
||||||
|
* Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
|
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __GRID_HELPER_H
|
||||||
|
#define __GRID_HELPER_H
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <math/vector2d.h>
|
||||||
|
#include <origin_viewitem.h>
|
||||||
|
|
||||||
|
class LSET;
|
||||||
|
class SCH_ITEM;
|
||||||
|
class SEG;
|
||||||
|
|
||||||
|
class EE_GRID_HELPER {
|
||||||
|
public:
|
||||||
|
|
||||||
|
EE_GRID_HELPER( TOOL_MANAGER* aToolMgr );
|
||||||
|
~EE_GRID_HELPER();
|
||||||
|
|
||||||
|
VECTOR2I GetGrid() const;
|
||||||
|
VECTOR2I GetOrigin() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function GetSnapped
|
||||||
|
* If the EE_GRID_HELPER has highlighted a snap point (target shown), this function
|
||||||
|
* will return a pointer to the item to which it snapped.
|
||||||
|
*
|
||||||
|
* @return NULL if not snapped. Pointer to snapped item otherwise
|
||||||
|
*/
|
||||||
|
SCH_ITEM* GetSnapped() const;
|
||||||
|
|
||||||
|
void SetAuxAxes( bool aEnable, const VECTOR2I& aOrigin = VECTOR2I( 0, 0 ) );
|
||||||
|
|
||||||
|
VECTOR2I Align( const VECTOR2I& aPoint ) const;
|
||||||
|
|
||||||
|
VECTOR2I AlignToWire( const VECTOR2I& aPoint, const SEG& aSeg );
|
||||||
|
|
||||||
|
VECTOR2I BestDragOrigin( const VECTOR2I& aMousePos, std::vector<SCH_ITEM*>& aItem );
|
||||||
|
|
||||||
|
VECTOR2I BestSnapAnchor( const VECTOR2I& aOrigin, SCH_ITEM* aDraggedItem );
|
||||||
|
VECTOR2I BestSnapAnchor( const VECTOR2I& aOrigin, const LSET& aLayers,
|
||||||
|
const std::vector<SCH_ITEM*>& aSkip = {} );
|
||||||
|
|
||||||
|
void SetSkipPoint( const VECTOR2I& aPoint )
|
||||||
|
{
|
||||||
|
m_skipPoint = aPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We clear the skip point by setting it to an unreachable position, thereby preventing matching
|
||||||
|
*/
|
||||||
|
void ClearSkipPoint()
|
||||||
|
{
|
||||||
|
m_skipPoint = VECTOR2I( std::numeric_limits<int>::min(), std::numeric_limits<int>::min() );
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetSnap( bool aSnap )
|
||||||
|
{
|
||||||
|
m_enableSnap = aSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetSnapLine( bool aSnap )
|
||||||
|
{
|
||||||
|
m_enableSnapLine = aSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
enum ANCHOR_FLAGS {
|
||||||
|
CORNER = 1,
|
||||||
|
OUTLINE = 2,
|
||||||
|
SNAPPABLE = 4,
|
||||||
|
ORIGIN = 8,
|
||||||
|
VERTICAL = 16,
|
||||||
|
HORIZONTAL = 32
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ANCHOR
|
||||||
|
{
|
||||||
|
ANCHOR( VECTOR2I aPos, int aFlags = CORNER | SNAPPABLE, SCH_ITEM* aItem = NULL ) :
|
||||||
|
pos( aPos ),
|
||||||
|
flags( aFlags ),
|
||||||
|
item( aItem )
|
||||||
|
{ };
|
||||||
|
|
||||||
|
VECTOR2I pos;
|
||||||
|
int flags;
|
||||||
|
SCH_ITEM* item;
|
||||||
|
|
||||||
|
double Distance( const VECTOR2I& aP ) const
|
||||||
|
{
|
||||||
|
return ( aP - pos ).EuclideanNorm();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<ANCHOR> m_anchors;
|
||||||
|
|
||||||
|
std::set<SCH_ITEM*> queryVisible( const BOX2I& aArea,
|
||||||
|
const std::vector<SCH_ITEM*>& aSkip ) const;
|
||||||
|
|
||||||
|
void addAnchor( const VECTOR2I& aPos, int aFlags, SCH_ITEM* aItem )
|
||||||
|
{
|
||||||
|
m_anchors.emplace_back( ANCHOR( aPos, aFlags, aItem ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
ANCHOR* nearestAnchor( const VECTOR2I& aPos, int aFlags, LSET aMatchLayers );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* computeAnchors inserts the local anchor points in to the grid helper for the specified
|
||||||
|
* schematic item, given the reference point and the direction of use for the point.
|
||||||
|
*
|
||||||
|
* @param aItem The schematic item for which to compute the anchors
|
||||||
|
* @param aRefPos The point for which to compute the anchors (if used by the component)
|
||||||
|
* @param aFrom Is this for an anchor that is designating a source point (aFrom=true) or not
|
||||||
|
*/
|
||||||
|
void computeAnchors( SCH_ITEM* aItem, const VECTOR2I& aRefPos, bool aFrom = false );
|
||||||
|
|
||||||
|
void clearAnchors()
|
||||||
|
{
|
||||||
|
m_anchors.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
TOOL_MANAGER* m_toolMgr;
|
||||||
|
OPT<VECTOR2I> m_auxAxis;
|
||||||
|
|
||||||
|
bool m_enableSnap; // If true, allow snapping to other items on the layers
|
||||||
|
bool m_enableSnapLine; // If true, allow drawing lines from snap points
|
||||||
|
int m_snapSize; // Sets the radius in screen units for snapping to items
|
||||||
|
ANCHOR* m_snapItem; // Pointer to the currently snapped item in m_anchors
|
||||||
|
// (NULL if not snapped)
|
||||||
|
VECTOR2I m_skipPoint; // When drawing a line, we avoid snapping to the source point
|
||||||
|
|
||||||
|
KIGFX::ORIGIN_VIEWITEM m_viewSnapPoint;
|
||||||
|
KIGFX::ORIGIN_VIEWITEM m_viewSnapLine;
|
||||||
|
KIGFX::ORIGIN_VIEWITEM m_viewAxis;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -397,7 +397,7 @@ int LIB_DRAWING_TOOLS::DrawShape( const TOOL_EVENT& aEvent )
|
||||||
int LIB_DRAWING_TOOLS::PlaceAnchor( const TOOL_EVENT& aEvent )
|
int LIB_DRAWING_TOOLS::PlaceAnchor( const TOOL_EVENT& aEvent )
|
||||||
{
|
{
|
||||||
getViewControls()->ShowCursor( true );
|
getViewControls()->ShowCursor( true );
|
||||||
getViewControls()->SetSnapping( true );
|
getViewControls()->SetGridSnapping( true );
|
||||||
|
|
||||||
std::string tool = aEvent.GetCommandStr().get();
|
std::string tool = aEvent.GetCommandStr().get();
|
||||||
m_frame->PushTool( tool );
|
m_frame->PushTool( tool );
|
||||||
|
|
|
@ -70,7 +70,7 @@ void LIB_MOVE_TOOL::Reset( RESET_REASON aReason )
|
||||||
int LIB_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
|
int LIB_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
{
|
{
|
||||||
KIGFX::VIEW_CONTROLS* controls = getViewControls();
|
KIGFX::VIEW_CONTROLS* controls = getViewControls();
|
||||||
controls->SetSnapping( true );
|
controls->SetGridSnapping( true );
|
||||||
|
|
||||||
m_anchorPos = { 0, 0 };
|
m_anchorPos = { 0, 0 };
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@ int LIB_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
m_frame->GetCanvas()->SetCurrentCursor( wxCURSOR_ARROW );
|
m_frame->GetCanvas()->SetCurrentCursor( wxCURSOR_ARROW );
|
||||||
controls->SetSnapping( !evt->Modifier( MD_ALT ) );
|
controls->SetGridSnapping( !evt->Modifier( MD_ALT ) );
|
||||||
|
|
||||||
if( evt->IsAction( &EE_ACTIONS::move ) || evt->IsMotion() || evt->IsDrag( BUT_LEFT )
|
if( evt->IsAction( &EE_ACTIONS::move ) || evt->IsMotion() || evt->IsDrag( BUT_LEFT )
|
||||||
|| evt->IsAction( &ACTIONS::refreshPreview )
|
|| evt->IsAction( &ACTIONS::refreshPreview )
|
||||||
|
@ -271,7 +271,7 @@ int LIB_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
controls->ForceCursorPosition( false );
|
controls->ForceCursorPosition( false );
|
||||||
controls->ShowCursor( false );
|
controls->ShowCursor( false );
|
||||||
controls->SetSnapping( false );
|
controls->SetGridSnapping( false );
|
||||||
controls->SetAutoPan( false );
|
controls->SetAutoPan( false );
|
||||||
|
|
||||||
if( !chain_commands )
|
if( !chain_commands )
|
||||||
|
|
|
@ -449,7 +449,7 @@ int SCH_DRAWING_TOOLS::SingleClickPlace( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true );
|
m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true );
|
||||||
getViewControls()->ShowCursor( true );
|
getViewControls()->ShowCursor( true );
|
||||||
getViewControls()->SetSnapping( true );
|
getViewControls()->SetGridSnapping( true );
|
||||||
|
|
||||||
SCH_ITEM* previewItem;
|
SCH_ITEM* previewItem;
|
||||||
switch( type )
|
switch( type )
|
||||||
|
|
|
@ -63,6 +63,7 @@
|
||||||
#include <schematic.h>
|
#include <schematic.h>
|
||||||
|
|
||||||
#include <ee_actions.h>
|
#include <ee_actions.h>
|
||||||
|
#include <ee_grid_helper.h>
|
||||||
#include <ee_point_editor.h>
|
#include <ee_point_editor.h>
|
||||||
#include <ee_selection.h>
|
#include <ee_selection.h>
|
||||||
#include <ee_selection_tool.h>
|
#include <ee_selection_tool.h>
|
||||||
|
@ -462,9 +463,14 @@ int SCH_LINE_WIRE_BUS_TOOL::doDrawSegments( const std::string& aTool, int aType
|
||||||
SCH_SCREEN* screen = m_frame->GetScreen();
|
SCH_SCREEN* screen = m_frame->GetScreen();
|
||||||
EE_POINT_EDITOR* pointEditor = m_toolMgr->GetTool<EE_POINT_EDITOR>();
|
EE_POINT_EDITOR* pointEditor = m_toolMgr->GetTool<EE_POINT_EDITOR>();
|
||||||
SCH_LINE* segment = nullptr;
|
SCH_LINE* segment = nullptr;
|
||||||
|
EE_GRID_HELPER grid( m_toolMgr );
|
||||||
|
|
||||||
|
KIGFX::VIEW_CONTROLS* controls = getViewControls();
|
||||||
|
|
||||||
m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true );
|
m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true );
|
||||||
getViewControls()->ShowCursor( true );
|
controls->ShowCursor( true );
|
||||||
|
controls->SetGridSnapping( m_frame->IsGridVisible() );
|
||||||
|
|
||||||
|
|
||||||
Activate();
|
Activate();
|
||||||
|
|
||||||
|
@ -482,7 +488,12 @@ int SCH_LINE_WIRE_BUS_TOOL::doDrawSegments( const std::string& aTool, int aType
|
||||||
if( !pointEditor->HasPoint() ) // Set wxCursor shape when starting the tool
|
if( !pointEditor->HasPoint() ) // Set wxCursor shape when starting the tool
|
||||||
m_frame->GetCanvas()->SetCurrentCursor( wxCURSOR_PENCIL );
|
m_frame->GetCanvas()->SetCurrentCursor( wxCURSOR_PENCIL );
|
||||||
|
|
||||||
wxPoint cursorPos = (wxPoint) getViewControls()->GetCursorPosition( !evt->Modifier( MD_ALT ) );
|
grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
|
||||||
|
controls->SetGridSnapping( m_frame->IsGridVisible() );
|
||||||
|
wxPoint cursorPos = wxPoint( grid.BestSnapAnchor(
|
||||||
|
evt->IsPrime() ? evt->Position() : controls->GetMousePosition(), nullptr ) );
|
||||||
|
controls->ForceCursorPosition( true, cursorPos );
|
||||||
|
|
||||||
bool forceHV = m_frame->eeconfig()->m_Drawing.hv_lines_only;
|
bool forceHV = m_frame->eeconfig()->m_Drawing.hv_lines_only;
|
||||||
|
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
|
@ -692,8 +703,8 @@ int SCH_LINE_WIRE_BUS_TOOL::doDrawSegments( const std::string& aTool, int aType
|
||||||
evt->SetPassEvent();
|
evt->SetPassEvent();
|
||||||
|
|
||||||
// Enable autopanning and cursor capture only when there is a segment to be placed
|
// Enable autopanning and cursor capture only when there is a segment to be placed
|
||||||
getViewControls()->SetAutoPan( segment != nullptr );
|
controls->SetAutoPan( segment != nullptr );
|
||||||
getViewControls()->CaptureCursor( segment != nullptr );
|
controls->CaptureCursor( segment != nullptr );
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -109,7 +109,7 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
EESCHEMA_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
|
EESCHEMA_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
|
||||||
KIGFX::VIEW_CONTROLS* controls = getViewControls();
|
KIGFX::VIEW_CONTROLS* controls = getViewControls();
|
||||||
controls->SetSnapping( true );
|
controls->SetGridSnapping( true );
|
||||||
|
|
||||||
m_anchorPos.reset();
|
m_anchorPos.reset();
|
||||||
|
|
||||||
|
@ -171,7 +171,7 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
m_frame->GetCanvas()->SetCurrentCursor( wxCURSOR_ARROW );
|
m_frame->GetCanvas()->SetCurrentCursor( wxCURSOR_ARROW );
|
||||||
controls->SetSnapping( !evt->Modifier( MD_ALT ) );
|
controls->SetGridSnapping( !evt->Modifier( MD_ALT ) );
|
||||||
|
|
||||||
if( evt->IsAction( &EE_ACTIONS::moveActivate ) || evt->IsAction( &EE_ACTIONS::restartMove )
|
if( evt->IsAction( &EE_ACTIONS::moveActivate ) || evt->IsAction( &EE_ACTIONS::restartMove )
|
||||||
|| evt->IsAction( &EE_ACTIONS::move ) || evt->IsAction( &EE_ACTIONS::drag )
|
|| evt->IsAction( &EE_ACTIONS::move ) || evt->IsAction( &EE_ACTIONS::drag )
|
||||||
|
@ -428,7 +428,7 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
controls->ForceCursorPosition( false );
|
controls->ForceCursorPosition( false );
|
||||||
controls->ShowCursor( false );
|
controls->ShowCursor( false );
|
||||||
controls->SetSnapping( false );
|
controls->SetGridSnapping( false );
|
||||||
controls->SetAutoPan( false );
|
controls->SetAutoPan( false );
|
||||||
|
|
||||||
if( !chain_commands )
|
if( !chain_commands )
|
||||||
|
|
|
@ -194,8 +194,8 @@ public:
|
||||||
* @return const wxPoint& - The position of this object.
|
* @return const wxPoint& - The position of this object.
|
||||||
* This function exists mainly to satisfy the virtual GetPosition() in parent class
|
* This function exists mainly to satisfy the virtual GetPosition() in parent class
|
||||||
*/
|
*/
|
||||||
wxPoint GetPosition() const override { return m_Start; }
|
wxPoint GetPosition() const override { return m_Start; }
|
||||||
void SetPosition( const wxPoint& aPos ) { m_Start = aPos; }
|
void SetPosition( const wxPoint& aPos ) override { m_Start = aPos; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function GetABPosition
|
* Function GetABPosition
|
||||||
|
|
|
@ -571,7 +571,7 @@ int GERBVIEW_SELECTION_TOOL::MeasureTool( const TOOL_EVENT& aEvent )
|
||||||
bool originSet = false;
|
bool originSet = false;
|
||||||
|
|
||||||
controls.ShowCursor( true );
|
controls.ShowCursor( true );
|
||||||
controls.SetSnapping( true );
|
controls.SetGridSnapping( true );
|
||||||
|
|
||||||
while( TOOL_EVENT* evt = Wait() )
|
while( TOOL_EVENT* evt = Wait() )
|
||||||
{
|
{
|
||||||
|
|
|
@ -335,6 +335,7 @@ public:
|
||||||
virtual const EDA_RECT GetBoundingBox() const;
|
virtual const EDA_RECT GetBoundingBox() const;
|
||||||
|
|
||||||
virtual wxPoint GetPosition() const { return wxPoint(); }
|
virtual wxPoint GetPosition() const { return wxPoint(); }
|
||||||
|
virtual void SetPosition( const wxPoint& aPos ) {};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function GetFocusPosition
|
* Function GetFocusPosition
|
||||||
|
|
|
@ -144,8 +144,6 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual wxPoint GetCenter() const { return GetPosition(); }
|
virtual wxPoint GetCenter() const { return GetPosition(); }
|
||||||
|
|
||||||
virtual void SetPosition( const wxPoint& aPos ) = 0;
|
|
||||||
|
|
||||||
void SetX( int aX )
|
void SetX( int aX )
|
||||||
{
|
{
|
||||||
wxPoint p( aX, GetY() );
|
wxPoint p( aX, GetY() );
|
||||||
|
|
|
@ -28,12 +28,9 @@
|
||||||
|
|
||||||
#include <math/box2.h>
|
#include <math/box2.h>
|
||||||
#include <view/view.h>
|
#include <view/view.h>
|
||||||
#include <class_board_item.h>
|
|
||||||
#include <layers_id_colors_and_visibility.h>
|
#include <layers_id_colors_and_visibility.h>
|
||||||
#include <gal/color4d.h>
|
#include <gal/color4d.h>
|
||||||
|
|
||||||
class PCB_BASE_FRAME;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ORIGIN_VIEWITEM
|
* ORIGIN_VIEWITEM
|
||||||
*
|
*
|
||||||
|
@ -41,7 +38,7 @@ class PCB_BASE_FRAME;
|
||||||
*/
|
*/
|
||||||
namespace KIGFX {
|
namespace KIGFX {
|
||||||
|
|
||||||
class ORIGIN_VIEWITEM : public BOARD_ITEM
|
class ORIGIN_VIEWITEM : public EDA_ITEM
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
///> Marker symbol styles
|
///> Marker symbol styles
|
||||||
|
@ -93,17 +90,12 @@ public:
|
||||||
m_drawAtZero = aDrawFlag;
|
m_drawAtZero = aDrawFlag;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void SetPosition( const VECTOR2D& aPosition )
|
void SetPosition( const wxPoint& aPosition ) override
|
||||||
{
|
|
||||||
m_position = aPosition;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void SetPosition( const wxPoint& aPosition ) override
|
|
||||||
{
|
{
|
||||||
m_position = VECTOR2D( aPosition );
|
m_position = VECTOR2D( aPosition );
|
||||||
}
|
}
|
||||||
|
|
||||||
inline wxPoint GetPosition() const override
|
wxPoint GetPosition() const override
|
||||||
{
|
{
|
||||||
return wxPoint( m_position.x, m_position.y );
|
return wxPoint( m_position.x, m_position.y );
|
||||||
}
|
}
|
||||||
|
|
|
@ -340,7 +340,7 @@ public:
|
||||||
* @param aTransformPoint = the reference point of the transformation, for
|
* @param aTransformPoint = the reference point of the transformation, for
|
||||||
* commands like move
|
* commands like move
|
||||||
*/
|
*/
|
||||||
virtual void SaveCopyInUndoList( BOARD_ITEM* aItemToCopy, UNDO_REDO aTypeCommand,
|
virtual void SaveCopyInUndoList( EDA_ITEM* aItemToCopy, UNDO_REDO aTypeCommand,
|
||||||
const wxPoint& aTransformPoint = wxPoint( 0, 0 ) ) = 0;
|
const wxPoint& aTransformPoint = wxPoint( 0, 0 ) ) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -154,12 +154,12 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function SetSnapping()
|
* Function SetGridSnapping()
|
||||||
* Enables/disables snapping cursor to grid.
|
* Enables/disables snapping cursor to grid.
|
||||||
*
|
*
|
||||||
* @param aEnabled says whether the opion should be enabled or disabled.
|
* @param aEnabled says whether the opion should be enabled or disabled.
|
||||||
*/
|
*/
|
||||||
virtual void SetSnapping( bool aEnabled )
|
virtual void SetGridSnapping( bool aEnabled )
|
||||||
{
|
{
|
||||||
m_settings.m_snappingEnabled = aEnabled;
|
m_settings.m_snappingEnabled = aEnabled;
|
||||||
}
|
}
|
||||||
|
@ -167,7 +167,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* @return the current state of the snapping cursor to grid.
|
* @return the current state of the snapping cursor to grid.
|
||||||
*/
|
*/
|
||||||
virtual bool GetSnappingState()
|
virtual bool GetGridSnapping()
|
||||||
{
|
{
|
||||||
return m_settings.m_snappingEnabled;
|
return m_settings.m_snappingEnabled;
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,7 +72,6 @@ public:
|
||||||
|
|
||||||
void ViewGetLayers( int aLayers[], int& aCount ) const override;
|
void ViewGetLayers( int aLayers[], int& aCount ) const override;
|
||||||
|
|
||||||
virtual void SetPosition( wxPoint aPos ) = 0;
|
|
||||||
virtual void SetEnd( wxPoint aPos ) { /* not all types will need this */ }
|
virtual void SetEnd( wxPoint aPos ) { /* not all types will need this */ }
|
||||||
|
|
||||||
virtual int GetPenWidth() const
|
virtual int GetPenWidth() const
|
||||||
|
@ -134,7 +133,7 @@ public:
|
||||||
void SetEnd( wxPoint aPos ) override { m_end = aPos; }
|
void SetEnd( wxPoint aPos ) override { m_end = aPos; }
|
||||||
|
|
||||||
wxPoint GetPosition() const override { return GetStart(); }
|
wxPoint GetPosition() const override { return GetStart(); }
|
||||||
void SetPosition( wxPoint aPos ) override { SetStart( aPos ); }
|
void SetPosition( const wxPoint& aPos ) override { SetStart( aPos ); }
|
||||||
|
|
||||||
const EDA_RECT GetBoundingBox() const override;
|
const EDA_RECT GetBoundingBox() const override;
|
||||||
bool HitTest( const wxPoint& aPosition, int aAccuracy = 0 ) const override;
|
bool HitTest( const wxPoint& aPosition, int aAccuracy = 0 ) const override;
|
||||||
|
@ -174,7 +173,7 @@ public:
|
||||||
// Accessors:
|
// Accessors:
|
||||||
SHAPE_POLY_SET& GetPolygons() { return m_Polygons; }
|
SHAPE_POLY_SET& GetPolygons() { return m_Polygons; }
|
||||||
wxPoint GetPosition() const override { return m_pos; }
|
wxPoint GetPosition() const override { return m_pos; }
|
||||||
void SetPosition( wxPoint aPos ) override;
|
void SetPosition( const wxPoint& aPos ) override;
|
||||||
|
|
||||||
const EDA_RECT GetBoundingBox() const override;
|
const EDA_RECT GetBoundingBox() const override;
|
||||||
bool HitTest( const wxPoint& aPosition, int aAccuracy = 0 ) const override;
|
bool HitTest( const wxPoint& aPosition, int aAccuracy = 0 ) const override;
|
||||||
|
@ -214,7 +213,7 @@ public:
|
||||||
void SetEnd( wxPoint aPos ) override { m_end = aPos; }
|
void SetEnd( wxPoint aPos ) override { m_end = aPos; }
|
||||||
|
|
||||||
wxPoint GetPosition() const override { return GetStart(); }
|
wxPoint GetPosition() const override { return GetStart(); }
|
||||||
void SetPosition( wxPoint aPos ) override { SetStart( aPos ); }
|
void SetPosition( const wxPoint& aPos ) override { SetStart( aPos ); }
|
||||||
|
|
||||||
void PrintWsItem( RENDER_SETTINGS* aSettings, const wxPoint& aOffset ) override;
|
void PrintWsItem( RENDER_SETTINGS* aSettings, const wxPoint& aOffset ) override;
|
||||||
|
|
||||||
|
@ -256,7 +255,7 @@ public:
|
||||||
double GetMarkerSize() const { return m_markerSize; }
|
double GetMarkerSize() const { return m_markerSize; }
|
||||||
|
|
||||||
wxPoint GetPosition() const override { return wxPoint( 0, 0 ); }
|
wxPoint GetPosition() const override { return wxPoint( 0, 0 ); }
|
||||||
void SetPosition( wxPoint aPos ) override { /* do nothing */ }
|
void SetPosition( const wxPoint& aPos ) override { /* do nothing */ }
|
||||||
|
|
||||||
void PrintWsItem( RENDER_SETTINGS* , const wxPoint& ) override { /* do nothing */ }
|
void PrintWsItem( RENDER_SETTINGS* , const wxPoint& ) override { /* do nothing */ }
|
||||||
|
|
||||||
|
@ -299,7 +298,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
wxPoint GetPosition() const override { return GetTextPos(); }
|
wxPoint GetPosition() const override { return GetTextPos(); }
|
||||||
void SetPosition( wxPoint aPos ) override { SetTextPos( aPos ); }
|
void SetPosition( const wxPoint& aPos ) override { SetTextPos( aPos ); }
|
||||||
|
|
||||||
const EDA_RECT GetBoundingBox() const override;
|
const EDA_RECT GetBoundingBox() const override;
|
||||||
bool HitTest( const wxPoint& aPosition, int aAccuracy = 0 ) const override;
|
bool HitTest( const wxPoint& aPosition, int aAccuracy = 0 ) const override;
|
||||||
|
@ -329,7 +328,7 @@ public:
|
||||||
virtual wxString GetClass() const override { return wxT( "WS_DRAW_ITEM_BITMAP" ); }
|
virtual wxString GetClass() const override { return wxT( "WS_DRAW_ITEM_BITMAP" ); }
|
||||||
|
|
||||||
wxPoint GetPosition() const override { return m_pos; }
|
wxPoint GetPosition() const override { return m_pos; }
|
||||||
void SetPosition( wxPoint aPos ) override { m_pos = aPos; }
|
void SetPosition( const wxPoint& aPos ) override { m_pos = aPos; }
|
||||||
|
|
||||||
void PrintWsItem( RENDER_SETTINGS* aSettings, const wxPoint& aOffset ) override;
|
void PrintWsItem( RENDER_SETTINGS* aSettings, const wxPoint& aOffset ) override;
|
||||||
|
|
||||||
|
|
|
@ -93,7 +93,7 @@ int PL_EDIT_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
{
|
{
|
||||||
KIGFX::VIEW_CONTROLS* controls = getViewControls();
|
KIGFX::VIEW_CONTROLS* controls = getViewControls();
|
||||||
|
|
||||||
controls->SetSnapping( true );
|
controls->SetGridSnapping( true );
|
||||||
VECTOR2I originalCursorPos = controls->GetCursorPosition();
|
VECTOR2I originalCursorPos = controls->GetCursorPosition();
|
||||||
|
|
||||||
// Be sure that there is at least one item that we can move. If there's no selection try
|
// Be sure that there is at least one item that we can move. If there's no selection try
|
||||||
|
@ -123,7 +123,7 @@ int PL_EDIT_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
m_frame->GetCanvas()->SetCurrentCursor( wxCURSOR_ARROW );
|
m_frame->GetCanvas()->SetCurrentCursor( wxCURSOR_ARROW );
|
||||||
controls->SetSnapping( !evt->Modifier( MD_ALT ) );
|
controls->SetGridSnapping( !evt->Modifier( MD_ALT ) );
|
||||||
|
|
||||||
if( evt->IsAction( &PL_ACTIONS::move ) || evt->IsMotion() || evt->IsDrag( BUT_LEFT )
|
if( evt->IsAction( &PL_ACTIONS::move ) || evt->IsMotion() || evt->IsDrag( BUT_LEFT )
|
||||||
|| evt->IsAction( &ACTIONS::refreshPreview ) )
|
|| evt->IsAction( &ACTIONS::refreshPreview ) )
|
||||||
|
@ -236,7 +236,7 @@ int PL_EDIT_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
controls->ForceCursorPosition( false );
|
controls->ForceCursorPosition( false );
|
||||||
controls->ShowCursor( false );
|
controls->ShowCursor( false );
|
||||||
controls->SetSnapping( false );
|
controls->SetGridSnapping( false );
|
||||||
controls->SetAutoPan( false );
|
controls->SetAutoPan( false );
|
||||||
|
|
||||||
if( !chain_commands )
|
if( !chain_commands )
|
||||||
|
|
|
@ -181,7 +181,7 @@ private:
|
||||||
* Virtual functions, not used here, but needed by PCB_BASE_FRAME
|
* Virtual functions, not used here, but needed by PCB_BASE_FRAME
|
||||||
* (virtual pure functions )
|
* (virtual pure functions )
|
||||||
*/
|
*/
|
||||||
void SaveCopyInUndoList( BOARD_ITEM*, UNDO_REDO, const wxPoint& ) override {}
|
void SaveCopyInUndoList( EDA_ITEM*, UNDO_REDO, const wxPoint& ) override {}
|
||||||
void SaveCopyInUndoList( const PICKED_ITEMS_LIST&, UNDO_REDO, const wxPoint &) override {}
|
void SaveCopyInUndoList( const PICKED_ITEMS_LIST&, UNDO_REDO, const wxPoint &) override {}
|
||||||
|
|
||||||
void updateView();
|
void updateView();
|
||||||
|
|
|
@ -220,7 +220,7 @@ private:
|
||||||
* Virtual functions, not used here, but needed by PCB_BASE_FRAME
|
* Virtual functions, not used here, but needed by PCB_BASE_FRAME
|
||||||
* (virtual pure functions )
|
* (virtual pure functions )
|
||||||
*/
|
*/
|
||||||
void SaveCopyInUndoList( BOARD_ITEM*, UNDO_REDO, const wxPoint& ) override {}
|
void SaveCopyInUndoList( EDA_ITEM*, UNDO_REDO, const wxPoint& ) override {}
|
||||||
void SaveCopyInUndoList( const PICKED_ITEMS_LIST&, UNDO_REDO, const wxPoint& ) override {}
|
void SaveCopyInUndoList( const PICKED_ITEMS_LIST&, UNDO_REDO, const wxPoint& ) override {}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -130,7 +130,7 @@ int MICROWAVE_TOOL::drawMicrowaveInductor( const TOOL_EVENT& aEvent )
|
||||||
bool originSet = false;
|
bool originSet = false;
|
||||||
|
|
||||||
controls.ShowCursor( true );
|
controls.ShowCursor( true );
|
||||||
controls.SetSnapping( true );
|
controls.SetGridSnapping( true );
|
||||||
controls.CaptureCursor( false );
|
controls.CaptureCursor( false );
|
||||||
controls.SetAutoPan( false );
|
controls.SetAutoPan( false );
|
||||||
|
|
||||||
|
|
|
@ -90,7 +90,7 @@ public:
|
||||||
* @param aTransformPoint = the reference point of the transformation, for
|
* @param aTransformPoint = the reference point of the transformation, for
|
||||||
* commands like move
|
* commands like move
|
||||||
*/
|
*/
|
||||||
void SaveCopyInUndoList( BOARD_ITEM* aItemToCopy, UNDO_REDO aTypeCommand,
|
void SaveCopyInUndoList( EDA_ITEM* aItemToCopy, UNDO_REDO aTypeCommand,
|
||||||
const wxPoint& aTransformPoint = wxPoint( 0, 0 ) ) override;
|
const wxPoint& aTransformPoint = wxPoint( 0, 0 ) ) override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -270,7 +270,7 @@ int LENGTH_TUNER_TOOL::MainLoop( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
m_router->SetMode( aEvent.Parameter<PNS::ROUTER_MODE>() );
|
m_router->SetMode( aEvent.Parameter<PNS::ROUTER_MODE>() );
|
||||||
|
|
||||||
controls()->SetSnapping( true );
|
controls()->SetGridSnapping( true );
|
||||||
controls()->ShowCursor( true );
|
controls()->ShowCursor( true );
|
||||||
frame()->UndoRedoBlock( true );
|
frame()->UndoRedoBlock( true );
|
||||||
|
|
||||||
|
|
|
@ -408,7 +408,7 @@ int DRAWING_TOOL::PlaceText( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
m_toolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
|
m_toolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
|
||||||
m_controls->ShowCursor( true );
|
m_controls->ShowCursor( true );
|
||||||
m_controls->SetSnapping( true );
|
m_controls->SetGridSnapping( true );
|
||||||
// do not capture or auto-pan until we start placing some text
|
// do not capture or auto-pan until we start placing some text
|
||||||
|
|
||||||
SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::TEXT );
|
SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::TEXT );
|
||||||
|
@ -620,7 +620,7 @@ int DRAWING_TOOL::DrawDimension( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
m_toolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
|
m_toolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
|
||||||
m_controls->ShowCursor( true );
|
m_controls->ShowCursor( true );
|
||||||
m_controls->SetSnapping( true );
|
m_controls->SetGridSnapping( true );
|
||||||
|
|
||||||
SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::DIMENSION );
|
SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::DIMENSION );
|
||||||
|
|
||||||
|
@ -651,7 +651,7 @@ int DRAWING_TOOL::DrawDimension( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
|
grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
|
||||||
grid.SetUseGrid( !evt->Modifier( MD_ALT ) );
|
grid.SetUseGrid( !evt->Modifier( MD_ALT ) );
|
||||||
m_controls->SetSnapping( !evt->Modifier( MD_ALT ) );
|
m_controls->SetGridSnapping( !evt->Modifier( MD_ALT ) );
|
||||||
VECTOR2I cursorPos = grid.BestSnapAnchor(
|
VECTOR2I cursorPos = grid.BestSnapAnchor(
|
||||||
evt->IsPrime() ? evt->Position() : m_controls->GetMousePosition(), nullptr );
|
evt->IsPrime() ? evt->Position() : m_controls->GetMousePosition(), nullptr );
|
||||||
m_controls->ForceCursorPosition( true, cursorPos );
|
m_controls->ForceCursorPosition( true, cursorPos );
|
||||||
|
@ -916,7 +916,7 @@ int DRAWING_TOOL::PlaceImportedGraphics( const TOOL_EVENT& aEvent )
|
||||||
m_toolMgr->RunAction( PCB_ACTIONS::selectItems, true, &newItems );
|
m_toolMgr->RunAction( PCB_ACTIONS::selectItems, true, &newItems );
|
||||||
|
|
||||||
m_controls->ShowCursor( true );
|
m_controls->ShowCursor( true );
|
||||||
m_controls->SetSnapping( true );
|
m_controls->SetGridSnapping( true );
|
||||||
m_controls->ForceCursorPosition( false );
|
m_controls->ForceCursorPosition( false );
|
||||||
|
|
||||||
SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::DXF );
|
SCOPED_DRAW_MODE scopedDrawMode( m_mode, MODE::DXF );
|
||||||
|
@ -1011,7 +1011,7 @@ int DRAWING_TOOL::SetAnchor( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
m_toolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
|
m_toolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
|
||||||
m_controls->ShowCursor( true );
|
m_controls->ShowCursor( true );
|
||||||
m_controls->SetSnapping( true );
|
m_controls->SetGridSnapping( true );
|
||||||
m_controls->SetAutoPan( true );
|
m_controls->SetAutoPan( true );
|
||||||
m_controls->CaptureCursor( false );
|
m_controls->CaptureCursor( false );
|
||||||
|
|
||||||
|
@ -1021,7 +1021,7 @@ int DRAWING_TOOL::SetAnchor( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
|
grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
|
||||||
grid.SetUseGrid( !evt->Modifier( MD_ALT ) );
|
grid.SetUseGrid( !evt->Modifier( MD_ALT ) );
|
||||||
m_controls->SetSnapping( !evt->Modifier( MD_ALT ) );
|
m_controls->SetGridSnapping( !evt->Modifier( MD_ALT ) );
|
||||||
VECTOR2I cursorPos = grid.BestSnapAnchor( m_controls->GetMousePosition(), LSET::AllLayersMask() );
|
VECTOR2I cursorPos = grid.BestSnapAnchor( m_controls->GetMousePosition(), LSET::AllLayersMask() );
|
||||||
m_controls->ForceCursorPosition( true, cursorPos );
|
m_controls->ForceCursorPosition( true, cursorPos );
|
||||||
|
|
||||||
|
@ -1125,7 +1125,7 @@ bool DRAWING_TOOL::drawSegment( const std::string& aTool, int aShape, DRAWSEGMEN
|
||||||
|
|
||||||
grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
|
grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
|
||||||
grid.SetUseGrid( !evt->Modifier( MD_ALT ) );
|
grid.SetUseGrid( !evt->Modifier( MD_ALT ) );
|
||||||
m_controls->SetSnapping( !evt->Modifier( MD_ALT ) );
|
m_controls->SetGridSnapping( !evt->Modifier( MD_ALT ) );
|
||||||
cursorPos = grid.BestSnapAnchor( m_controls->GetMousePosition(), m_frame->GetActiveLayer() );
|
cursorPos = grid.BestSnapAnchor( m_controls->GetMousePosition(), m_frame->GetActiveLayer() );
|
||||||
m_controls->ForceCursorPosition( true, cursorPos );
|
m_controls->ForceCursorPosition( true, cursorPos );
|
||||||
|
|
||||||
|
@ -1383,7 +1383,7 @@ bool DRAWING_TOOL::drawArc( const std::string& aTool, DRAWSEGMENT** aGraphic, bo
|
||||||
GRID_HELPER grid( m_toolMgr, m_frame->GetMagneticItemsSettings() );
|
GRID_HELPER grid( m_toolMgr, m_frame->GetMagneticItemsSettings() );
|
||||||
|
|
||||||
m_controls->ShowCursor( true );
|
m_controls->ShowCursor( true );
|
||||||
m_controls->SetSnapping( true );
|
m_controls->SetGridSnapping( true );
|
||||||
|
|
||||||
bool firstPoint = false;
|
bool firstPoint = false;
|
||||||
bool cancelled = false;
|
bool cancelled = false;
|
||||||
|
@ -1403,7 +1403,7 @@ bool DRAWING_TOOL::drawArc( const std::string& aTool, DRAWSEGMENT** aGraphic, bo
|
||||||
m_frame->GetCanvas()->SetCurrentCursor( wxCURSOR_PENCIL );
|
m_frame->GetCanvas()->SetCurrentCursor( wxCURSOR_PENCIL );
|
||||||
grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
|
grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
|
||||||
grid.SetUseGrid( !evt->Modifier( MD_ALT ) );
|
grid.SetUseGrid( !evt->Modifier( MD_ALT ) );
|
||||||
m_controls->SetSnapping( !evt->Modifier( MD_ALT ) );
|
m_controls->SetGridSnapping( !evt->Modifier( MD_ALT ) );
|
||||||
VECTOR2I cursorPos = grid.BestSnapAnchor( m_controls->GetMousePosition(), graphic );
|
VECTOR2I cursorPos = grid.BestSnapAnchor( m_controls->GetMousePosition(), graphic );
|
||||||
m_controls->ForceCursorPosition( true, cursorPos );
|
m_controls->ForceCursorPosition( true, cursorPos );
|
||||||
|
|
||||||
|
@ -1623,7 +1623,7 @@ int DRAWING_TOOL::DrawZone( const TOOL_EVENT& aEvent )
|
||||||
Activate(); // register for events
|
Activate(); // register for events
|
||||||
|
|
||||||
m_controls->ShowCursor( true );
|
m_controls->ShowCursor( true );
|
||||||
m_controls->SetSnapping( true );
|
m_controls->SetGridSnapping( true );
|
||||||
|
|
||||||
bool started = false;
|
bool started = false;
|
||||||
GRID_HELPER grid( m_toolMgr, m_frame->GetMagneticItemsSettings() );
|
GRID_HELPER grid( m_toolMgr, m_frame->GetMagneticItemsSettings() );
|
||||||
|
@ -1642,7 +1642,7 @@ int DRAWING_TOOL::DrawZone( const TOOL_EVENT& aEvent )
|
||||||
LSET layers( m_frame->GetActiveLayer() );
|
LSET layers( m_frame->GetActiveLayer() );
|
||||||
grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
|
grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
|
||||||
grid.SetUseGrid( !evt->Modifier( MD_ALT ) );
|
grid.SetUseGrid( !evt->Modifier( MD_ALT ) );
|
||||||
m_controls->SetSnapping( !evt->Modifier( MD_ALT ) );
|
m_controls->SetGridSnapping( !evt->Modifier( MD_ALT ) );
|
||||||
VECTOR2I cursorPos = grid.BestSnapAnchor( evt->IsPrime() ? evt->Position()
|
VECTOR2I cursorPos = grid.BestSnapAnchor( evt->IsPrime() ? evt->Position()
|
||||||
: m_controls->GetMousePosition(),
|
: m_controls->GetMousePosition(),
|
||||||
layers );
|
layers );
|
||||||
|
|
|
@ -409,7 +409,7 @@ int EDIT_TOOL::doMoveSelection( TOOL_EVENT aEvent, bool aPickReference )
|
||||||
editFrame->GetCanvas()->SetCurrentCursor( wxCURSOR_ARROW );
|
editFrame->GetCanvas()->SetCurrentCursor( wxCURSOR_ARROW );
|
||||||
grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
|
grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
|
||||||
grid.SetUseGrid( !evt->Modifier( MD_ALT ) );
|
grid.SetUseGrid( !evt->Modifier( MD_ALT ) );
|
||||||
controls->SetSnapping( !evt->Modifier( MD_ALT ) );
|
controls->SetGridSnapping( !evt->Modifier( MD_ALT ) );
|
||||||
|
|
||||||
if( evt->IsAction( &PCB_ACTIONS::move ) || evt->IsMotion() || evt->IsDrag( BUT_LEFT )
|
if( evt->IsAction( &PCB_ACTIONS::move ) || evt->IsMotion() || evt->IsDrag( BUT_LEFT )
|
||||||
|| evt->IsAction( &ACTIONS::refreshPreview )
|
|| evt->IsAction( &ACTIONS::refreshPreview )
|
||||||
|
@ -616,7 +616,7 @@ int EDIT_TOOL::doMoveSelection( TOOL_EVENT aEvent, bool aPickReference )
|
||||||
m_lockedSelected = false;
|
m_lockedSelected = false;
|
||||||
controls->ForceCursorPosition( false );
|
controls->ForceCursorPosition( false );
|
||||||
controls->ShowCursor( false );
|
controls->ShowCursor( false );
|
||||||
controls->SetSnapping( false );
|
controls->SetGridSnapping( false );
|
||||||
controls->SetAutoPan( false );
|
controls->SetAutoPan( false );
|
||||||
|
|
||||||
m_dragging = false;
|
m_dragging = false;
|
||||||
|
|
|
@ -103,7 +103,7 @@ void GRID_HELPER::SetAuxAxes( bool aEnable, const VECTOR2I& aOrigin )
|
||||||
if( aEnable )
|
if( aEnable )
|
||||||
{
|
{
|
||||||
m_auxAxis = aOrigin;
|
m_auxAxis = aOrigin;
|
||||||
m_viewAxis.SetPosition( aOrigin );
|
m_viewAxis.SetPosition( wxPoint( aOrigin ) );
|
||||||
m_toolMgr->GetView()->SetVisible( &m_viewAxis, true );
|
m_toolMgr->GetView()->SetVisible( &m_viewAxis, true );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -326,8 +326,8 @@ VECTOR2I GRID_HELPER::BestSnapAnchor( const VECTOR2I& aOrigin, const LSET& aLaye
|
||||||
|
|
||||||
if( !m_enableGrid || snapDist <= gridDist )
|
if( !m_enableGrid || snapDist <= gridDist )
|
||||||
{
|
{
|
||||||
m_viewSnapPoint.SetPosition( nearest->pos );
|
m_viewSnapPoint.SetPosition( wxPoint( nearest->pos ) );
|
||||||
m_viewSnapLine.SetPosition( nearest->pos );
|
m_viewSnapLine.SetPosition( wxPoint( nearest->pos ) );
|
||||||
m_toolMgr->GetView()->SetVisible( &m_viewSnapLine, false );
|
m_toolMgr->GetView()->SetVisible( &m_viewSnapLine, false );
|
||||||
|
|
||||||
if( m_toolMgr->GetView()->IsVisible( &m_viewSnapPoint ) )
|
if( m_toolMgr->GetView()->IsVisible( &m_viewSnapPoint ) )
|
||||||
|
|
|
@ -797,7 +797,7 @@ int PCB_EDITOR_CONTROL::PlaceModule( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
m_toolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
|
m_toolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
|
||||||
controls->ShowCursor( true );
|
controls->ShowCursor( true );
|
||||||
controls->SetSnapping( true );
|
controls->SetGridSnapping( true );
|
||||||
|
|
||||||
std::string tool = aEvent.GetCommandStr().get();
|
std::string tool = aEvent.GetCommandStr().get();
|
||||||
m_frame->PushTool( tool );
|
m_frame->PushTool( tool );
|
||||||
|
@ -1280,7 +1280,7 @@ int PCB_EDITOR_CONTROL::PlaceTarget( const TOOL_EVENT& aEvent )
|
||||||
view->Add( &preview );
|
view->Add( &preview );
|
||||||
|
|
||||||
m_toolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
|
m_toolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
|
||||||
controls->SetSnapping( true );
|
controls->SetGridSnapping( true );
|
||||||
|
|
||||||
std::string tool = aEvent.GetCommandStr().get();
|
std::string tool = aEvent.GetCommandStr().get();
|
||||||
m_frame->PushTool( tool );
|
m_frame->PushTool( tool );
|
||||||
|
@ -1363,7 +1363,7 @@ int PCB_EDITOR_CONTROL::PlaceTarget( const TOOL_EVENT& aEvent )
|
||||||
preview.Clear();
|
preview.Clear();
|
||||||
delete target;
|
delete target;
|
||||||
view->Remove( &preview );
|
view->Remove( &preview );
|
||||||
controls->SetSnapping( false );
|
controls->SetGridSnapping( false );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1544,7 +1544,7 @@ int PCB_EDITOR_CONTROL::EditFpInFpEditor( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDITOR_CONTROL::DoSetDrillOrigin( KIGFX::VIEW* aView, PCB_BASE_FRAME* aFrame,
|
void PCB_EDITOR_CONTROL::DoSetDrillOrigin( KIGFX::VIEW* aView, PCB_BASE_FRAME* aFrame,
|
||||||
BOARD_ITEM* originViewItem, const VECTOR2D& aPosition )
|
EDA_ITEM* originViewItem, const VECTOR2D& aPosition )
|
||||||
{
|
{
|
||||||
aFrame->GetDesignSettings().m_AuxOrigin = (wxPoint) aPosition;
|
aFrame->GetDesignSettings().m_AuxOrigin = (wxPoint) aPosition;
|
||||||
originViewItem->SetPosition( (wxPoint) aPosition );
|
originViewItem->SetPosition( (wxPoint) aPosition );
|
||||||
|
|
|
@ -136,7 +136,7 @@ public:
|
||||||
|
|
||||||
///> Low-level access (below undo) to setting the drill origin
|
///> Low-level access (below undo) to setting the drill origin
|
||||||
static void DoSetDrillOrigin( KIGFX::VIEW* aView, PCB_BASE_FRAME* aFrame,
|
static void DoSetDrillOrigin( KIGFX::VIEW* aView, PCB_BASE_FRAME* aFrame,
|
||||||
BOARD_ITEM* aItem, const VECTOR2D& aPoint );
|
EDA_ITEM* aItem, const VECTOR2D& aPoint );
|
||||||
|
|
||||||
int FlipPcbView( const TOOL_EVENT& aEvent );
|
int FlipPcbView( const TOOL_EVENT& aEvent );
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@ void PCB_TOOL_BASE::doInteractiveItemPlacement( const std::string& aTool,
|
||||||
|
|
||||||
// do not capture or auto-pan until we start placing an item
|
// do not capture or auto-pan until we start placing an item
|
||||||
controls()->ShowCursor( true );
|
controls()->ShowCursor( true );
|
||||||
controls()->SetSnapping( true );
|
controls()->SetGridSnapping( true );
|
||||||
|
|
||||||
// Add a VIEW_GROUP that serves as a preview for the new item
|
// Add a VIEW_GROUP that serves as a preview for the new item
|
||||||
PCBNEW_SELECTION preview;
|
PCBNEW_SELECTION preview;
|
||||||
|
|
|
@ -225,7 +225,7 @@ int PCB_VIEWER_TOOLS::MeasureTool( const TOOL_EVENT& aEvent )
|
||||||
frame()->GetCanvas()->SetCurrentCursor( wxCURSOR_ARROW );
|
frame()->GetCanvas()->SetCurrentCursor( wxCURSOR_ARROW );
|
||||||
grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
|
grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
|
||||||
grid.SetUseGrid( !evt->Modifier( MD_ALT ) );
|
grid.SetUseGrid( !evt->Modifier( MD_ALT ) );
|
||||||
controls.SetSnapping( !evt->Modifier( MD_ALT ) );
|
controls.SetGridSnapping( !evt->Modifier( MD_ALT ) );
|
||||||
const VECTOR2I cursorPos = grid.BestSnapAnchor( controls.GetMousePosition(), nullptr );
|
const VECTOR2I cursorPos = grid.BestSnapAnchor( controls.GetMousePosition(), nullptr );
|
||||||
controls.ForceCursorPosition(true, cursorPos );
|
controls.ForceCursorPosition(true, cursorPos );
|
||||||
|
|
||||||
|
|
|
@ -385,7 +385,7 @@ int PCBNEW_CONTROL::LayerAlphaDec( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
// Grid control
|
// Grid control
|
||||||
void PCBNEW_CONTROL::DoSetGridOrigin( KIGFX::VIEW* aView, PCB_BASE_FRAME* aFrame,
|
void PCBNEW_CONTROL::DoSetGridOrigin( KIGFX::VIEW* aView, PCB_BASE_FRAME* aFrame,
|
||||||
BOARD_ITEM* originViewItem, const VECTOR2D& aPoint )
|
EDA_ITEM* originViewItem, const VECTOR2D& aPoint )
|
||||||
{
|
{
|
||||||
aFrame->GetDesignSettings().m_GridOrigin = (wxPoint) aPoint;
|
aFrame->GetDesignSettings().m_GridOrigin = (wxPoint) aPoint;
|
||||||
aView->GetGAL()->SetGridOrigin( aPoint );
|
aView->GetGAL()->SetGridOrigin( aPoint );
|
||||||
|
|
|
@ -80,7 +80,7 @@ public:
|
||||||
|
|
||||||
// Low-level access (below undo) to setting the grid origin
|
// Low-level access (below undo) to setting the grid origin
|
||||||
static void DoSetGridOrigin( KIGFX::VIEW* aView, PCB_BASE_FRAME* aFrame,
|
static void DoSetGridOrigin( KIGFX::VIEW* aView, PCB_BASE_FRAME* aFrame,
|
||||||
BOARD_ITEM* originViewItem, const VECTOR2D& aPoint );
|
EDA_ITEM* originViewItem, const VECTOR2D& aPoint );
|
||||||
|
|
||||||
int Undo( const TOOL_EVENT& aEvent );
|
int Undo( const TOOL_EVENT& aEvent );
|
||||||
int Redo( const TOOL_EVENT& aEvent );
|
int Redo( const TOOL_EVENT& aEvent );
|
||||||
|
|
|
@ -59,7 +59,7 @@ int PCBNEW_PICKER_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
|
grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
|
||||||
grid.SetUseGrid( !evt->Modifier( MD_ALT ) );
|
grid.SetUseGrid( !evt->Modifier( MD_ALT ) );
|
||||||
controls->SetSnapping( !evt->Modifier( MD_ALT ) );
|
controls->SetGridSnapping( !evt->Modifier( MD_ALT ) );
|
||||||
VECTOR2I cursorPos = grid.BestSnapAnchor( controls->GetMousePosition(), nullptr );
|
VECTOR2I cursorPos = grid.BestSnapAnchor( controls->GetMousePosition(), nullptr );
|
||||||
controls->ForceCursorPosition(true, cursorPos );
|
controls->ForceCursorPosition(true, cursorPos );
|
||||||
|
|
||||||
|
@ -187,7 +187,7 @@ void PCBNEW_PICKER_TOOL::setControls()
|
||||||
KIGFX::VIEW_CONTROLS* controls = getViewControls();
|
KIGFX::VIEW_CONTROLS* controls = getViewControls();
|
||||||
|
|
||||||
// Ensure that the view controls do not handle our snapping as we use the GRID_HELPER
|
// Ensure that the view controls do not handle our snapping as we use the GRID_HELPER
|
||||||
controls->SetSnapping( false );
|
controls->SetGridSnapping( false );
|
||||||
|
|
||||||
controls->CaptureCursor( false );
|
controls->CaptureCursor( false );
|
||||||
controls->SetAutoPan( false );
|
controls->SetAutoPan( false );
|
||||||
|
|
|
@ -383,7 +383,7 @@ int POINT_EDITOR::OnSelectionChange( const TOOL_EVENT& aEvent )
|
||||||
{
|
{
|
||||||
grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
|
grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
|
||||||
grid.SetUseGrid( !evt->Modifier( MD_ALT ) );
|
grid.SetUseGrid( !evt->Modifier( MD_ALT ) );
|
||||||
controls->SetSnapping( !evt->Modifier( MD_ALT ) );
|
controls->SetGridSnapping( !evt->Modifier( MD_ALT ) );
|
||||||
|
|
||||||
if( !m_editPoints || evt->IsSelectionEvent() )
|
if( !m_editPoints || evt->IsSelectionEvent() )
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -181,7 +181,7 @@ static void SwapItemData( BOARD_ITEM* aItem, BOARD_ITEM* aImage )
|
||||||
aItem->SetParent( parent );
|
aItem->SetParent( parent );
|
||||||
}
|
}
|
||||||
|
|
||||||
void PCB_BASE_EDIT_FRAME::SaveCopyInUndoList( BOARD_ITEM* aItem, UNDO_REDO aCommandType,
|
void PCB_BASE_EDIT_FRAME::SaveCopyInUndoList( EDA_ITEM* aItem, UNDO_REDO aCommandType,
|
||||||
const wxPoint& aTransformPoint )
|
const wxPoint& aTransformPoint )
|
||||||
{
|
{
|
||||||
PICKED_ITEMS_LIST commandToUndo;
|
PICKED_ITEMS_LIST commandToUndo;
|
||||||
|
|
Loading…
Reference in New Issue