Add axis origin to the Footprint Editor to align with the Legacy canvas

This commit is contained in:
Brian Sidebotham 2015-09-05 20:47:35 +01:00
parent 8f14e9e0b7
commit 34aab6f687
5 changed files with 60 additions and 10 deletions

View File

@ -30,7 +30,7 @@ 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 ) :
EDA_ITEM( NOT_USED ), // this item is never added to a BOARD so it needs no type EDA_ITEM( NOT_USED ), // this item is never added to a BOARD so it needs no type
m_position( aPosition ), m_size( aSize ), m_color( aColor ), m_style( aStyle ) m_position( aPosition ), m_size( aSize ), m_color( aColor ), m_style( aStyle ), m_drawAtZero( false )
{ {
} }
@ -45,8 +45,9 @@ const BOX2I ORIGIN_VIEWITEM::ViewBBox() const
void ORIGIN_VIEWITEM::ViewDraw( int, GAL* aGal ) const void ORIGIN_VIEWITEM::ViewDraw( int, GAL* aGal ) const
{ {
// Legacy canvas does not draw markers if they are located in the (0, 0) point // Nothing to do if the target shouldn't be drawn at 0,0 and that's where the target is. This
if( m_position.x == 0 && m_position.y == 0 ) // mimics the Legacy canvas that doesn't display most targets at 0,0
if( !m_drawAtZero && ( m_position.x == 0 ) && ( m_position.y == 0 ) )
return; return;
aGal->SetIsStroke( true ); aGal->SetIsStroke( true );
@ -54,7 +55,10 @@ void ORIGIN_VIEWITEM::ViewDraw( int, GAL* aGal ) const
aGal->SetLineWidth( 1 ); aGal->SetLineWidth( 1 );
aGal->SetStrokeColor( m_color ); aGal->SetStrokeColor( m_color );
VECTOR2D scaledSize = m_view->ToWorld( VECTOR2D( m_size, m_size ), false ); VECTOR2D scaledSize = m_view->ToWorld( VECTOR2D( m_size, m_size ), false );
aGal->DrawCircle( m_position, scaledSize.x );
// Draw a circle around the marker's centre point if the style demands it
if( ( m_style == CIRCLE_CROSS ) || ( m_style == CIRCLE_DOT ) || ( m_style == CIRCLE_X ) )
aGal->DrawCircle( m_position, scaledSize.x );
switch( m_style ) switch( m_style )
{ {
@ -62,17 +66,22 @@ void ORIGIN_VIEWITEM::ViewDraw( int, GAL* aGal ) const
break; break;
case CROSS: case CROSS:
aGal->DrawLine( m_position - VECTOR2D( scaledSize.x, 0 ), m_position + VECTOR2D( scaledSize.x, 0 ) ); case CIRCLE_CROSS:
aGal->DrawLine( m_position - VECTOR2D( 0, scaledSize.y ), m_position + VECTOR2D( 0, scaledSize.y ) ); aGal->DrawLine( m_position - VECTOR2D( scaledSize.x, 0 ),
m_position + VECTOR2D( scaledSize.x, 0 ) );
aGal->DrawLine( m_position - VECTOR2D( 0, scaledSize.y ),
m_position + VECTOR2D( 0, scaledSize.y ) );
break; break;
case X: case X:
case CIRCLE_X:
aGal->DrawLine( m_position - scaledSize, m_position + scaledSize ); aGal->DrawLine( m_position - scaledSize, m_position + scaledSize );
scaledSize.y = -scaledSize.y; scaledSize.y = -scaledSize.y;
aGal->DrawLine( m_position - scaledSize, m_position + scaledSize ); aGal->DrawLine( m_position - scaledSize, m_position + scaledSize );
break; break;
case DOT: case DOT:
case CIRCLE_DOT:
aGal->DrawCircle( m_position, scaledSize.x / 4 ); aGal->DrawCircle( m_position, scaledSize.x / 4 );
break; break;
} }

View File

@ -42,10 +42,11 @@ class ORIGIN_VIEWITEM : public EDA_ITEM
{ {
public: public:
///> Marker symbol styles ///> Marker symbol styles
enum MARKER_STYLE { NONE, CROSS, X, DOT }; enum MARKER_STYLE { NONE, CROSS, X, DOT, CIRCLE_CROSS, CIRCLE_X, CIRCLE_DOT };
ORIGIN_VIEWITEM( const COLOR4D& aColor = COLOR4D( 1.0, 1.0, 1.0, 1.0 ), MARKER_STYLE aStyle = X, ORIGIN_VIEWITEM( const COLOR4D& aColor = COLOR4D( 1.0, 1.0, 1.0, 1.0 ),
int aSize = 16, const VECTOR2D& aPosition = VECTOR2D( 0, 0 ) ); MARKER_STYLE aStyle = CIRCLE_X, int aSize = 16,
const VECTOR2D& aPosition = VECTOR2D( 0, 0 ) );
const BOX2I ViewBBox() const; const BOX2I ViewBBox() const;
@ -71,6 +72,17 @@ public:
return wxT( "ORIGIN_VIEWITEM" ); return wxT( "ORIGIN_VIEWITEM" );
} }
/**
* Function SetDrawAtZero()
* Set the draw at zero flag. When set the marker will be drawn when it's position is 0,0.
* Otherwise it will not be drawn when its position is 0,0
* @param aDrawFlag The value to set the draw at zero flag
*/
inline void SetDrawAtZero( bool aDrawFlag )
{
m_drawAtZero = aDrawFlag;
}
inline void SetPosition( const VECTOR2D& aPosition ) inline void SetPosition( const VECTOR2D& aPosition )
{ {
m_position = aPosition; m_position = aPosition;
@ -123,6 +135,9 @@ protected:
///> Marker symbol. ///> Marker symbol.
MARKER_STYLE m_style; MARKER_STYLE m_style;
///> If set, the marker will be drawn even if its position is 0,0
bool m_drawAtZero;
}; };
} // namespace KIGFX } // namespace KIGFX

View File

@ -31,6 +31,7 @@
#include <view/view_controls.h> #include <view/view_controls.h>
#include <view/view_group.h> #include <view/view_group.h>
#include <pcb_painter.h> #include <pcb_painter.h>
#include <origin_viewitem.h>
#include <kicad_plugin.h> #include <kicad_plugin.h>
#include <pcbnew_id.h> #include <pcbnew_id.h>
@ -51,6 +52,18 @@ MODULE_TOOLS::MODULE_TOOLS() :
TOOL_INTERACTIVE( "pcbnew.ModuleEditor" ), m_view( NULL ), m_controls( NULL ), TOOL_INTERACTIVE( "pcbnew.ModuleEditor" ), m_view( NULL ), m_controls( NULL ),
m_board( NULL ), m_frame( NULL ) m_board( NULL ), m_frame( NULL )
{ {
// Generate an origin marker at 0,0 which is used as an axis origin marker (0,0)
m_axisOrigin = new KIGFX::ORIGIN_VIEWITEM( KIGFX::COLOR4D(0.0, 0.0, 0.8, 1.0),
KIGFX::ORIGIN_VIEWITEM::CROSS,
20000,
VECTOR2D(0,0) );
m_axisOrigin->SetDrawAtZero( true );
}
MODULE_TOOLS::~MODULE_TOOLS()
{
delete m_axisOrigin;
} }
@ -61,6 +74,13 @@ void MODULE_TOOLS::Reset( RESET_REASON aReason )
m_controls = getViewControls(); m_controls = getViewControls();
m_board = getModel<BOARD>(); m_board = getModel<BOARD>();
m_frame = getEditFrame<PCB_EDIT_FRAME>(); m_frame = getEditFrame<PCB_EDIT_FRAME>();
if( aReason == MODEL_RELOAD || aReason == GAL_SWITCH )
{
// Draw the axis origin if we're editing modules (essentially in the footprint editor)
m_view->Remove( m_axisOrigin );
m_view->Add( m_axisOrigin );
}
} }

View File

@ -26,6 +26,7 @@
#define MODULE_TOOLS_H #define MODULE_TOOLS_H
#include <tool/tool_interactive.h> #include <tool/tool_interactive.h>
#include <origin_viewitem.h>
namespace KIGFX namespace KIGFX
{ {
@ -44,6 +45,7 @@ class MODULE_TOOLS : public TOOL_INTERACTIVE
{ {
public: public:
MODULE_TOOLS(); MODULE_TOOLS();
~MODULE_TOOLS();
/// @copydoc TOOL_INTERACTIVE::Reset() /// @copydoc TOOL_INTERACTIVE::Reset()
void Reset( RESET_REASON aReason ); void Reset( RESET_REASON aReason );
@ -106,6 +108,10 @@ private:
KIGFX::VIEW_CONTROLS* m_controls; KIGFX::VIEW_CONTROLS* m_controls;
BOARD* m_board; BOARD* m_board;
PCB_EDIT_FRAME* m_frame; PCB_EDIT_FRAME* m_frame;
///> Axis 0 marker
KIGFX::ORIGIN_VIEWITEM* m_axisOrigin;
}; };
#endif #endif

View File

@ -85,7 +85,7 @@ PCB_EDITOR_CONTROL::PCB_EDITOR_CONTROL() :
TOOL_INTERACTIVE( "pcbnew.EditorControl" ), m_frame( NULL ), m_zoneMenu( NULL ) TOOL_INTERACTIVE( "pcbnew.EditorControl" ), m_frame( NULL ), m_zoneMenu( NULL )
{ {
m_placeOrigin = new KIGFX::ORIGIN_VIEWITEM( KIGFX::COLOR4D( 0.8, 0.0, 0.0, 1.0 ), m_placeOrigin = new KIGFX::ORIGIN_VIEWITEM( KIGFX::COLOR4D( 0.8, 0.0, 0.0, 1.0 ),
KIGFX::ORIGIN_VIEWITEM::CROSS ); KIGFX::ORIGIN_VIEWITEM::CIRCLE_CROSS );
m_probingSchToPcb = false; m_probingSchToPcb = false;
} }