446 lines
11 KiB
C++
446 lines
11 KiB
C++
/************/
|
|
/* zoom.cpp */
|
|
/************/
|
|
|
|
/*
|
|
Fonctions de gestion du zoom, du pas de grille et du
|
|
recadrage automatique
|
|
*/
|
|
|
|
#include "fctsys.h"
|
|
#include "gr_basic.h"
|
|
|
|
#include "common.h"
|
|
#include "macros.h"
|
|
|
|
#ifdef EESCHEMA
|
|
#include "program.h"
|
|
#include "libcmp.h"
|
|
#include "general.h"
|
|
#endif
|
|
|
|
#ifdef PCBNEW
|
|
#include "pcbnew.h"
|
|
#endif
|
|
|
|
#ifdef CVPCB
|
|
#include "cvpcb.h"
|
|
#endif
|
|
|
|
#include "bitmaps.h"
|
|
|
|
#include "protos.h"
|
|
|
|
#include "id.h"
|
|
|
|
|
|
/* Fonctions locales: */
|
|
|
|
|
|
/**************************************************/
|
|
void WinEDA_DrawFrame::Recadre_Trace(bool ToMouse)
|
|
/**************************************************/
|
|
/* Calcule les offsets de trace.
|
|
Les offsets sont ajustés a un multiple du pas de grille
|
|
si ToMouse == TRUE, le curseur souris (curseur "systeme") est replace
|
|
en position curseur graphique (curseur kicad)
|
|
|
|
Note: Mac OS ** does not ** allow moving mouse cursor by program.
|
|
*/
|
|
{
|
|
|
|
/* decalages a apporter au trace en coordonnees ecran */
|
|
PutOnGrid(& m_CurrentScreen->m_Curseur) ;
|
|
AdjustScrollBars();
|
|
|
|
ReDrawPanel();
|
|
|
|
/* Place le curseur souris sur le curseur SCHEMA*/
|
|
if ( ToMouse == TRUE )
|
|
DrawPanel->MouseToCursorSchema();
|
|
}
|
|
|
|
/************************************************/
|
|
void WinEDA_DrawFrame::PutOnGrid(wxPoint * coord)
|
|
/************************************************/
|
|
/* retourne la valeur de la coordonnee coord sur le point de grille le plus proche */
|
|
{
|
|
double ftmp;
|
|
if ( ! m_CurrentScreen->m_UserGridIsON )
|
|
{
|
|
wxSize grid_size = m_CurrentScreen->GetGrid();
|
|
ftmp = (double)coord->x / grid_size.x;
|
|
coord->x = ((int)round(ftmp)) * grid_size.x;
|
|
|
|
ftmp = (double)coord->y / grid_size.y;
|
|
coord->y = ((int)round(ftmp)) * grid_size.y;
|
|
}
|
|
else
|
|
{
|
|
double pasx = m_CurrentScreen->m_UserGrid.x * m_InternalUnits;
|
|
double pasy = m_CurrentScreen->m_UserGrid.y * m_InternalUnits;
|
|
if ( m_CurrentScreen->m_UserGridUnit != INCHES )
|
|
{
|
|
pasx /= 25.4; pasy /= 25.4;
|
|
}
|
|
int nn = (int) round( coord->x /pasx);
|
|
coord->x = (int) round( pasx * nn);
|
|
nn = (int) round( coord->y /pasy);
|
|
coord->y = (int) round( pasy * nn);
|
|
}
|
|
}
|
|
|
|
/**************************************************************/
|
|
void WinEDA_DrawFrame::Zoom_Automatique(bool move_mouse_cursor)
|
|
/**************************************************************/
|
|
/* Affiche le Schema au meilleur zoom au meilleur centrage pour le dessin
|
|
de facon a avoir toute la feuille affichee a l'ecran
|
|
*/
|
|
{
|
|
int bestzoom;
|
|
|
|
bestzoom = BestZoom();
|
|
m_CurrentScreen->SetZoom(bestzoom);
|
|
Recadre_Trace(move_mouse_cursor);
|
|
}
|
|
|
|
/*************************************************/
|
|
void WinEDA_DrawFrame::Window_Zoom(EDA_Rect &Rect)
|
|
/*************************************************/
|
|
/* Compute the zoom factor and the new draw offset to draw the
|
|
selected area (Rect) in full window screen
|
|
*/
|
|
{
|
|
int ii, jj;
|
|
int bestzoom;
|
|
wxSize size;
|
|
|
|
/* Compute the best zoom */
|
|
Rect.Normalize();
|
|
size = DrawPanel->GetClientSize();
|
|
ii = Rect.GetSize().x / size.x;
|
|
jj = Rect.GetSize().y / size.y;
|
|
bestzoom = MAX(ii, jj);
|
|
if ( bestzoom <= 0 ) bestzoom = 1;
|
|
|
|
m_CurrentScreen->SetZoom(bestzoom);
|
|
|
|
m_CurrentScreen->m_Curseur = Rect.Centre();
|
|
Recadre_Trace(TRUE);
|
|
}
|
|
|
|
/*****************************************************************/
|
|
void WinEDA_DrawPanel::Process_Popup_Zoom( wxCommandEvent &event )
|
|
/*****************************************************************/
|
|
/* Gere les commandes de zoom appelées par le menu Popup
|
|
Toute autre commande est transmise a Parent->Process_Special_Functions(event)
|
|
*/
|
|
{
|
|
int id = event.GetId();
|
|
wxClientDC dc(this);
|
|
|
|
switch (id)
|
|
{
|
|
case ID_POPUP_ZOOM_PLUS :
|
|
case ID_POPUP_ZOOM_MOINS :
|
|
case ID_POPUP_ZOOM_CENTER :
|
|
case ID_POPUP_ZOOM_AUTO :
|
|
case ID_POPUP_ZOOM_REDRAW :
|
|
m_Parent->OnZoom(id);
|
|
break;
|
|
|
|
case ID_POPUP_ZOOM_SELECT :
|
|
break;
|
|
|
|
case ID_POPUP_CANCEL :
|
|
MouseToCursorSchema();
|
|
break;
|
|
|
|
case ID_POPUP_ZOOM_LEVEL_1 :
|
|
m_Parent->m_CurrentScreen->SetZoom(1);
|
|
m_Parent->Recadre_Trace(TRUE);
|
|
break;
|
|
|
|
case ID_POPUP_ZOOM_LEVEL_2 :
|
|
m_Parent->m_CurrentScreen->SetZoom(2);
|
|
m_Parent->Recadre_Trace(TRUE);
|
|
break;
|
|
|
|
case ID_POPUP_ZOOM_LEVEL_4 :
|
|
m_Parent->m_CurrentScreen->SetZoom(4);
|
|
m_Parent->Recadre_Trace(TRUE);
|
|
break;
|
|
|
|
case ID_POPUP_ZOOM_LEVEL_8 :
|
|
m_Parent->m_CurrentScreen->SetZoom(8);
|
|
m_Parent->Recadre_Trace(TRUE);
|
|
break;
|
|
|
|
case ID_POPUP_ZOOM_LEVEL_16 :
|
|
m_Parent->m_CurrentScreen->SetZoom(16);
|
|
m_Parent->Recadre_Trace(TRUE);
|
|
break;
|
|
|
|
case ID_POPUP_ZOOM_LEVEL_32 :
|
|
m_Parent->m_CurrentScreen->SetZoom(32);
|
|
m_Parent->Recadre_Trace(TRUE);
|
|
break;
|
|
|
|
case ID_POPUP_ZOOM_LEVEL_64 :
|
|
m_Parent->m_CurrentScreen->SetZoom(64);
|
|
m_Parent->Recadre_Trace(TRUE);
|
|
break;
|
|
|
|
case ID_POPUP_ZOOM_LEVEL_128 :
|
|
m_Parent->m_CurrentScreen->SetZoom(128);
|
|
m_Parent->Recadre_Trace(TRUE);
|
|
break;
|
|
|
|
case ID_POPUP_ZOOM_LEVEL_256 :
|
|
m_Parent->m_CurrentScreen->SetZoom(256);
|
|
m_Parent->Recadre_Trace(TRUE);
|
|
break;
|
|
|
|
case ID_POPUP_ZOOM_LEVEL_512 :
|
|
m_Parent->m_CurrentScreen->SetZoom(512);
|
|
m_Parent->Recadre_Trace(TRUE);
|
|
break;
|
|
|
|
case ID_POPUP_ZOOM_LEVEL_1024 :
|
|
m_Parent->m_CurrentScreen->SetZoom(1024);
|
|
m_Parent->Recadre_Trace(TRUE);
|
|
break;
|
|
|
|
case ID_POPUP_ZOOM_LEVEL_2048 :
|
|
m_Parent->m_CurrentScreen->SetZoom(2048);
|
|
m_Parent->Recadre_Trace(TRUE);
|
|
break;
|
|
|
|
case ID_POPUP_GRID_LEVEL_1 :
|
|
m_Parent->m_CurrentScreen->SetGrid(wxSize(1,1));
|
|
m_Parent->ReDrawPanel();
|
|
break;
|
|
|
|
case ID_POPUP_GRID_LEVEL_2 :
|
|
m_Parent->m_CurrentScreen->SetGrid(wxSize(2,2));
|
|
m_Parent->ReDrawPanel();
|
|
break;
|
|
|
|
case ID_POPUP_GRID_LEVEL_5 :
|
|
m_Parent->m_CurrentScreen->SetGrid(wxSize(5,5));
|
|
m_Parent->ReDrawPanel();
|
|
break;
|
|
|
|
case ID_POPUP_GRID_LEVEL_10 :
|
|
m_Parent->m_CurrentScreen->SetGrid(wxSize(10,10));
|
|
m_Parent->ReDrawPanel();
|
|
break;
|
|
|
|
case ID_POPUP_GRID_LEVEL_20 :
|
|
m_Parent->m_CurrentScreen->SetGrid(wxSize(20,20));
|
|
m_Parent->ReDrawPanel();
|
|
break;
|
|
|
|
case ID_POPUP_GRID_LEVEL_25 :
|
|
m_Parent->m_CurrentScreen->SetGrid(wxSize(25,25));
|
|
m_Parent->ReDrawPanel();
|
|
break;
|
|
|
|
case ID_POPUP_GRID_LEVEL_50 :
|
|
m_Parent->m_CurrentScreen->SetGrid(wxSize(50,50));
|
|
m_Parent->ReDrawPanel();
|
|
break;
|
|
|
|
case ID_POPUP_GRID_LEVEL_100 :
|
|
m_Parent->m_CurrentScreen->SetGrid(wxSize(100,100));
|
|
m_Parent->ReDrawPanel();
|
|
break;
|
|
|
|
case ID_POPUP_GRID_LEVEL_200 :
|
|
m_Parent->m_CurrentScreen->SetGrid(wxSize(200,200));
|
|
m_Parent->ReDrawPanel();
|
|
break;
|
|
|
|
case ID_POPUP_GRID_LEVEL_250 :
|
|
m_Parent->m_CurrentScreen->SetGrid(wxSize(250,250));
|
|
m_Parent->ReDrawPanel();
|
|
break;
|
|
|
|
case ID_POPUP_GRID_LEVEL_500 :
|
|
m_Parent->m_CurrentScreen->SetGrid(wxSize(500,500));
|
|
m_Parent->ReDrawPanel();
|
|
break;
|
|
|
|
case ID_POPUP_GRID_LEVEL_1000 :
|
|
m_Parent->m_CurrentScreen->SetGrid(wxSize(1000,1000));
|
|
m_Parent->ReDrawPanel();
|
|
break;
|
|
|
|
case ID_POPUP_GRID_USER :
|
|
m_Parent->m_CurrentScreen->SetGrid(wxSize(-1,-1));
|
|
m_Parent->ReDrawPanel();
|
|
break;
|
|
|
|
default:
|
|
DisplayError(this, wxT("WinEDA_DrawPanel::Process_Popup_Zoom() ID error") );
|
|
break;
|
|
}
|
|
|
|
m_Parent->Affiche_Status_Box();
|
|
}
|
|
|
|
class grid_list_struct
|
|
{
|
|
public:
|
|
int m_value;
|
|
int m_id;
|
|
const wxChar * m_msg;
|
|
};
|
|
|
|
|
|
/*************************************************************/
|
|
void WinEDA_DrawPanel::AddMenuZoom( wxMenu * MasterMenu )
|
|
/*************************************************************/
|
|
/* add the zoom list menu the the MasterMenu.
|
|
used in OnRightClick(wxMouseEvent& event)
|
|
*/
|
|
{
|
|
int zoom;
|
|
wxSize grid;
|
|
int zoom_value;
|
|
wxString zoom_msg = _("Zoom: ");
|
|
wxString grid_msg = _("Grid:"), msg;
|
|
int ii;
|
|
wxString line;
|
|
|
|
grid_list_struct grid_list_pcb[] =
|
|
{
|
|
{ 1000, ID_POPUP_GRID_LEVEL_1000, wxT(" 100") },
|
|
{ 500, ID_POPUP_GRID_LEVEL_500, wxT(" 50") },
|
|
{ 250, ID_POPUP_GRID_LEVEL_250, wxT(" 25") },
|
|
{ 200, ID_POPUP_GRID_LEVEL_200, wxT(" 20") },
|
|
{ 100, ID_POPUP_GRID_LEVEL_100, wxT(" 10") },
|
|
{ 50, ID_POPUP_GRID_LEVEL_50, wxT(" 5") },
|
|
{ 25, ID_POPUP_GRID_LEVEL_25, wxT(" 2.5") },
|
|
{ 20, ID_POPUP_GRID_LEVEL_20, wxT(" 2") },
|
|
{ 10, ID_POPUP_GRID_LEVEL_10, wxT(" 1") },
|
|
{ 5, ID_POPUP_GRID_LEVEL_5, wxT(" 0.5") },
|
|
{ 2, ID_POPUP_GRID_LEVEL_2, wxT(" 0.2") },
|
|
{ 1, ID_POPUP_GRID_LEVEL_1, wxT(" 0.1") },
|
|
{ 0, ID_POPUP_GRID_USER, _("grid user") }
|
|
};
|
|
|
|
grid_list_struct grid_list_schematic[] =
|
|
{
|
|
{ 50, ID_POPUP_GRID_LEVEL_50, wxT(" 50") },
|
|
{ 25, ID_POPUP_GRID_LEVEL_25, wxT(" 25") },
|
|
{ 10, ID_POPUP_GRID_LEVEL_10, wxT(" 10") },
|
|
{ 5, ID_POPUP_GRID_LEVEL_5, wxT(" 5") },
|
|
{ 2, ID_POPUP_GRID_LEVEL_2, wxT(" 2") },
|
|
{ 1, ID_POPUP_GRID_LEVEL_1, wxT(" 1") },
|
|
{ 0, ID_POPUP_GRID_USER, _("grid user") }
|
|
};
|
|
|
|
|
|
ADD_MENUITEM(MasterMenu, ID_POPUP_ZOOM_CENTER, _("Center"), zoom_center_xpm);
|
|
ADD_MENUITEM(MasterMenu, ID_POPUP_ZOOM_PLUS, _("Zoom +"), zoom_out_xpm);
|
|
ADD_MENUITEM(MasterMenu, ID_POPUP_ZOOM_MOINS, _("Zoom -"), zoom_in_xpm);
|
|
|
|
wxMenu * zoom_choice = new wxMenu;
|
|
ADD_MENUITEM_WITH_SUBMENU(MasterMenu, zoom_choice,
|
|
ID_POPUP_ZOOM_SELECT, _("Zoom Select"), zoom_select_xpm);
|
|
|
|
ADD_MENUITEM(MasterMenu, ID_POPUP_ZOOM_AUTO, _("Auto"), zoom_optimal_xpm);
|
|
ADD_MENUITEM(MasterMenu, ID_POPUP_ZOOM_REDRAW, _("Redraw"), repaint_xpm);
|
|
|
|
/* Create the basic zoom list: */
|
|
zoom = m_Parent->m_CurrentScreen->GetZoom();
|
|
zoom_value = 1;
|
|
for ( ii = 0; zoom_value <= m_Parent->m_ZoomMaxValue; zoom_value <<= 1, ii ++ ) // Create zoom choice 1 .. zoom max
|
|
{
|
|
line.Printf( wxT("%u"), zoom_value);
|
|
zoom_choice->Append(ID_POPUP_ZOOM_LEVEL_1 + ii,
|
|
zoom_msg + line, wxEmptyString,TRUE);
|
|
if( zoom == zoom_value )
|
|
zoom_choice->Check(ID_POPUP_ZOOM_LEVEL_1 + ii, TRUE);
|
|
}
|
|
|
|
wxMenu * grid_choice = new wxMenu;
|
|
ADD_MENUITEM_WITH_SUBMENU(MasterMenu, grid_choice,
|
|
ID_POPUP_GRID_SELECT, _("Grid Select"), grid_select_xpm);
|
|
|
|
grid = m_Parent->m_CurrentScreen->GetGrid();
|
|
switch(m_Parent->m_Ident )
|
|
{
|
|
case MODULE_EDITOR_FRAME:
|
|
case GERBER_FRAME:
|
|
case PCB_FRAME:
|
|
case CVPCB_DISPLAY_FRAME:
|
|
for ( ii = 0; ; ii ++ ) // Create grid list
|
|
{
|
|
msg = grid_msg + grid_list_pcb[ii].m_msg;
|
|
grid_choice->Append(grid_list_pcb[ii].m_id, msg, wxEmptyString, TRUE);
|
|
if( grid_list_pcb[ii].m_value <= 0 )
|
|
{
|
|
if ( m_Parent->m_CurrentScreen->m_UserGridIsON )
|
|
grid_choice->Check(grid_list_pcb[ii].m_id, TRUE);
|
|
break;
|
|
}
|
|
if( grid.x == grid_list_pcb[ii].m_value )
|
|
grid_choice->Check(grid_list_pcb[ii].m_id, TRUE);
|
|
}
|
|
break;
|
|
|
|
case SCHEMATIC_FRAME:
|
|
case LIBEDITOR_FRAME:
|
|
for ( ii = 0; ; ii ++ ) // Create zoom choice 256 .. 1024
|
|
{
|
|
if ( grid_list_schematic[ii].m_value <= 0)
|
|
break;
|
|
msg = grid_msg + grid_list_schematic[ii].m_msg;
|
|
grid_choice->Append(grid_list_schematic[ii].m_id,
|
|
msg, wxEmptyString, TRUE);
|
|
if( grid.x == grid_list_schematic[ii].m_value )
|
|
grid_choice->Check(grid_list_schematic[ii].m_id, TRUE);
|
|
}
|
|
break;
|
|
|
|
case VIEWER_FRAME:
|
|
break;
|
|
}
|
|
|
|
MasterMenu->AppendSeparator();
|
|
ADD_MENUITEM(MasterMenu, ID_POPUP_CANCEL, _("Close"), cancel_xpm);
|
|
}
|
|
|
|
|
|
|
|
/**********************************************************/
|
|
void WinEDA_DrawFrame::Process_Zoom(wxCommandEvent& event)
|
|
/**********************************************************/
|
|
/* fonction de traitement des boutons de Zoom.
|
|
Appelle simplement la fonction de traitement du Zoom de la
|
|
fenetre active.
|
|
*/
|
|
{
|
|
int id = event.GetId();
|
|
|
|
switch (id)
|
|
{
|
|
case ID_ZOOM_PLUS_BUTT:
|
|
case ID_ZOOM_MOINS_BUTT:
|
|
case ID_ZOOM_REDRAW_BUTT:
|
|
case ID_ZOOM_PAGE_BUTT:
|
|
OnZoom(id);
|
|
break;
|
|
|
|
default:
|
|
DisplayError(this, wxT("WinEDA_DrawFrame::Process_Zoom id Error") );
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|