pcbnew: added flip view mode

This commit is contained in:
Tomasz Włostowski 2016-12-02 18:59:48 +01:00 committed by Maciej Suminski
parent 1c1f4e9a50
commit c661c30f68
8 changed files with 42 additions and 27 deletions

View File

@ -110,8 +110,9 @@ void GAL::ComputeWorldScreenMatrix()
scale.SetScale( VECTOR2D( worldScale, worldScale ) ); scale.SetScale( VECTOR2D( worldScale, worldScale ) );
MATRIX3x3D flip; MATRIX3x3D flip;
flip.SetIdentity(); flip.SetIdentity();
flip.SetScale( VECTOR2D( flipX, flipY ) ); flip.SetScale( VECTOR2D( globalFlipX ? -1.0 : 1.0, globalFlipY ? -1.0 : 1.0 ) );
MATRIX3x3D lookat; MATRIX3x3D lookat;
lookat.SetIdentity(); lookat.SetIdentity();
@ -150,9 +151,8 @@ void GAL::DrawGrid()
int gridEndX = KiROUND( worldEndPoint.x / gridSize.x ); int gridEndX = KiROUND( worldEndPoint.x / gridSize.x );
int gridStartY = KiROUND( worldStartPoint.y / gridSize.y ); int gridStartY = KiROUND( worldStartPoint.y / gridSize.y );
int gridEndY = KiROUND( worldEndPoint.y / gridSize.y ); int gridEndY = KiROUND( worldEndPoint.y / gridSize.y );
int dirX = gridEndX >= gridStartX ? 1 : -1;
assert( gridEndX >= gridStartX ); int dirY = gridEndY >= gridStartY ? 1 : -1;
assert( gridEndY >= gridStartY );
// Correct the index, else some lines are not correctly painted // Correct the index, else some lines are not correctly painted
gridStartX -= std::abs( gridOrigin.x / gridSize.x ) + 1; gridStartX -= std::abs( gridOrigin.x / gridSize.x ) + 1;
@ -172,7 +172,7 @@ void GAL::DrawGrid()
// Now draw the grid, every coarse grid line gets the double width // Now draw the grid, every coarse grid line gets the double width
// Vertical lines // Vertical lines
for( int j = gridStartY; j < gridEndY; j += 1 ) for( int j = gridStartY; j != gridEndY; j += dirY )
{ {
if( j % gridTick == 0 && gridScreenSizeDense > gridDrawThreshold ) if( j % gridTick == 0 && gridScreenSizeDense > gridDrawThreshold )
SetLineWidth( doubleMarker ); SetLineWidth( doubleMarker );
@ -188,7 +188,7 @@ void GAL::DrawGrid()
} }
// Horizontal lines // Horizontal lines
for( int i = gridStartX; i < gridEndX; i += 1 ) for( int i = gridStartX; i != gridEndX; i += dirX )
{ {
if( i % gridTick == 0 && gridScreenSizeDense > gridDrawThreshold ) if( i % gridTick == 0 && gridScreenSizeDense > gridDrawThreshold )
SetLineWidth( doubleMarker ); SetLineWidth( doubleMarker );
@ -210,14 +210,14 @@ void GAL::DrawGrid()
SetIsStroke( false ); SetIsStroke( false );
SetFillColor( gridColor ); SetFillColor( gridColor );
for( int j = gridStartY; j < gridEndY; j += 1 ) for( int j = gridStartY; j != gridEndY; j += dirY )
{ {
if( j % gridTick == 0 && gridScreenSizeDense > gridDrawThreshold ) if( j % gridTick == 0 && gridScreenSizeDense > gridDrawThreshold )
tickY = true; tickY = true;
else else
tickY = false; tickY = false;
for( int i = gridStartX; i < gridEndX; i += 1 ) for( int i = gridStartX; i != gridEndX; i += dirX )
{ {
if( i % gridTick == 0 && gridScreenSizeDense > gridDrawThreshold ) if( i % gridTick == 0 && gridScreenSizeDense > gridDrawThreshold )
tickX = true; tickX = true;

View File

@ -766,7 +766,11 @@ void OPENGL_GAL::BitmapText( const wxString& aText, const VECTOR2D& aPosition,
currentManager->Color( strokeColor.r, strokeColor.g, strokeColor.b, strokeColor.a ); currentManager->Color( strokeColor.r, strokeColor.g, strokeColor.b, strokeColor.a );
currentManager->Translate( aPosition.x, aPosition.y, layerDepth ); currentManager->Translate( aPosition.x, aPosition.y, layerDepth );
currentManager->Rotate( aRotationAngle, 0.0f, 0.0f, -1.0f ); currentManager->Rotate( aRotationAngle, 0.0f, 0.0f, -1.0f );
currentManager->Scale( SCALE, SCALE, 0 );
double sx = SCALE * (globalFlipX ? -1.0 : 1.0);
double sy = SCALE * (globalFlipY ? -1.0 : 1.0);
currentManager->Scale( sx, sy, 0 );
currentManager->Translate( 0, -commonOffset, 0 ); currentManager->Translate( 0, -commonOffset, 0 );
switch( GetHorizontalJustify() ) switch( GetHorizontalJustify() )
@ -874,9 +878,8 @@ void OPENGL_GAL::DrawGrid()
int gridEndX = KiROUND( worldEndPoint.x / gridSize.x ); int gridEndX = KiROUND( worldEndPoint.x / gridSize.x );
int gridStartY = KiROUND( worldStartPoint.y / gridSize.y ); int gridStartY = KiROUND( worldStartPoint.y / gridSize.y );
int gridEndY = KiROUND( worldEndPoint.y / gridSize.y ); int gridEndY = KiROUND( worldEndPoint.y / gridSize.y );
int dirX = gridStartX >= gridEndX ? -1 : 1;
assert( gridEndX >= gridStartX ); int dirY = gridStartY >= gridEndY ? -1 : 1;
assert( gridEndY >= gridStartY );
// Correct the index, else some lines are not correctly painted // Correct the index, else some lines are not correctly painted
gridStartX -= std::abs( gridOrigin.x / gridSize.x ) + 1; gridStartX -= std::abs( gridOrigin.x / gridSize.x ) + 1;
@ -900,7 +903,7 @@ void OPENGL_GAL::DrawGrid()
} }
// Vertical lines // Vertical lines
for( int j = gridStartY; j < gridEndY; j += 1 ) for( int j = gridStartY; j != gridEndY; j += dirY )
{ {
if( j % gridTick == 0 && gridScreenSizeDense > gridDrawThreshold ) if( j % gridTick == 0 && gridScreenSizeDense > gridDrawThreshold )
glLineWidth( 2.0 ); glLineWidth( 2.0 );
@ -924,7 +927,7 @@ void OPENGL_GAL::DrawGrid()
} }
// Horizontal lines // Horizontal lines
for( int i = gridStartX; i < gridEndX; i += 1 ) for( int i = gridStartX; i != gridEndX; i += dirX )
{ {
if( i % gridTick == 0 && gridScreenSizeDense > gridDrawThreshold ) if( i % gridTick == 0 && gridScreenSizeDense > gridDrawThreshold )
glLineWidth( 2.0 ); glLineWidth( 2.0 );

View File

@ -47,7 +47,7 @@ void main()
if( shaderParams[0] == SHADER_LINE ) if( shaderParams[0] == SHADER_LINE )
{ {
float lineWidth = shaderParams[3]; float lineWidth = shaderParams[3];
float worldScale = gl_ModelViewMatrix[0][0]; float worldScale = abs ( gl_ModelViewMatrix[0][0] );
// Make lines appear to be at least 1 pixel wide // Make lines appear to be at least 1 pixel wide
if( worldScale * lineWidth < MIN_WIDTH ) if( worldScale * lineWidth < MIN_WIDTH )
@ -79,7 +79,7 @@ void main()
// Make the line appear to be at least 1 pixel wide // Make the line appear to be at least 1 pixel wide
float lineWidth = shaderParams[3]; float lineWidth = shaderParams[3];
float worldScale = gl_ModelViewMatrix[0][0]; float worldScale = abs( gl_ModelViewMatrix[0][0] );
if( worldScale * lineWidth < MIN_WIDTH ) if( worldScale * lineWidth < MIN_WIDTH )
shaderParams[3] = shaderParams[3] / ( worldScale * lineWidth ); shaderParams[3] = shaderParams[3] / ( worldScale * lineWidth );

View File

@ -49,6 +49,7 @@ enum GRID_STYLE
GRID_STYLE_DOTS ///< Use dots for the grid GRID_STYLE_DOTS ///< Use dots for the grid
}; };
/** /**
* @brief Class GAL is the abstract interface for drawing on a 2D-surface. * @brief Class GAL is the abstract interface for drawing on a 2D-surface.
* *
@ -690,17 +691,11 @@ public:
*/ */
inline void SetFlip( bool xAxis, bool yAxis ) inline void SetFlip( bool xAxis, bool yAxis )
{ {
if( xAxis ) globalFlipX = xAxis;
flipX = -1.0; // flipped globalFlipY = yAxis;
else
flipX = 1.0; // regular
if( yAxis )
flipY = -1.0; // flipped
else
flipY = 1.0; // regular
} }
// --------------------------- // ---------------------------
// Buffer manipulation methods // Buffer manipulation methods
// --------------------------- // ---------------------------
@ -978,8 +973,9 @@ protected:
MATRIX3x3D worldScreenMatrix; ///< World transformation MATRIX3x3D worldScreenMatrix; ///< World transformation
MATRIX3x3D screenWorldMatrix; ///< Screen transformation MATRIX3x3D screenWorldMatrix; ///< Screen transformation
double worldScale; ///< The scale factor world->screen double worldScale; ///< The scale factor world->screen
double flipX; ///< Flag for X axis flipping
double flipY; ///< Flag for Y axis flipping bool globalFlipX;
bool globalFlipY;
double lineWidth; ///< The line width double lineWidth; ///< The line width

View File

@ -637,6 +637,7 @@ public:
bool OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu ) override; bool OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu ) override;
void OnSelectOptionToolbar( wxCommandEvent& event ); void OnSelectOptionToolbar( wxCommandEvent& event );
void OnFlipPcbView( wxCommandEvent& event );
void ToolOnRightClick( wxCommandEvent& event ) override; void ToolOnRightClick( wxCommandEvent& event ) override;
/* Block operations: */ /* Block operations: */

View File

@ -389,6 +389,11 @@ void PCB_EDIT_FRAME::ReCreateMenuBar()
text, _( "Switch the canvas implementation to Cairo" ), text, _( "Switch the canvas implementation to Cairo" ),
KiBitmap( tools_xpm ) ); KiBitmap( tools_xpm ) );
viewMenu->AppendSeparator();
AddMenuItem( viewMenu, ID_MENU_PCB_FLIP_VIEW, _("&Flip View"), _( "Flips (mirrors) the board view." ),
KiBitmap( three_d_xpm ), wxITEM_CHECK );
//----- Place Menu ---------------------------------------------------------- //----- Place Menu ----------------------------------------------------------
wxMenu* placeMenu = new wxMenu; wxMenu* placeMenu = new wxMenu;

View File

@ -115,6 +115,7 @@ BEGIN_EVENT_TABLE( PCB_EDIT_FRAME, PCB_BASE_FRAME )
// Menu Files: // Menu Files:
EVT_MENU( ID_MAIN_MENUBAR, PCB_EDIT_FRAME::Process_Special_Functions ) EVT_MENU( ID_MAIN_MENUBAR, PCB_EDIT_FRAME::Process_Special_Functions )
EVT_MENU( ID_MENU_PCB_FLIP_VIEW, PCB_EDIT_FRAME::OnFlipPcbView )
EVT_MENU( ID_APPEND_FILE, PCB_EDIT_FRAME::Files_io ) EVT_MENU( ID_APPEND_FILE, PCB_EDIT_FRAME::Files_io )
EVT_MENU( ID_SAVE_BOARD_AS, PCB_EDIT_FRAME::Files_io ) EVT_MENU( ID_SAVE_BOARD_AS, PCB_EDIT_FRAME::Files_io )
@ -1131,3 +1132,11 @@ void PCB_EDIT_FRAME::OnUpdatePCBFromSch( wxCommandEvent& event )
Kiway().ExpressMail( FRAME_SCH, MAIL_SCH_PCB_UPDATE_REQUEST, "", this ); Kiway().ExpressMail( FRAME_SCH, MAIL_SCH_PCB_UPDATE_REQUEST, "", this );
} }
} }
void PCB_EDIT_FRAME::OnFlipPcbView(wxCommandEvent& evt)
{
auto view = GetGalCanvas()->GetView();
view->SetMirror( evt.IsChecked(), false );
view->RecacheAllItems();
GetGalCanvas()->ForceRefresh();
}

View File

@ -52,6 +52,7 @@ enum pcbnew_ids
ID_PCB_MASK_CLEARANCE, ID_PCB_MASK_CLEARANCE,
ID_PCB_LAYERS_SETUP, ID_PCB_LAYERS_SETUP,
ID_MENU_PCB_FLIP_VIEW,
ID_POPUP_PCB_START_RANGE, ID_POPUP_PCB_START_RANGE,
ID_POPUP_PCB_MOVE_MODULE_REQUEST, ID_POPUP_PCB_MOVE_MODULE_REQUEST,