Loading gerbview/files.cpp +29 −15 Original line number Original line Diff line number Diff line Loading @@ -39,19 +39,19 @@ void WinEDA_GerberFrame::Files_io( wxCommandEvent& event ) switch( id ) switch( id ) { { case wxID_FILE: case wxID_FILE: { Erase_Current_Layer( false ); Erase_Current_Layer( false ); LoadGerberFiles( wxEmptyString ); LoadGerberFiles( wxEmptyString ); break; break; } case ID_MENU_INC_LAYER_AND_APPEND_FILE: case ID_MENU_INC_LAYER_AND_APPEND_FILE: case ID_INC_LAYER_AND_APPEND_FILE: case ID_INC_LAYER_AND_APPEND_FILE: { { int origLayer = getActiveLayer(); int origLayer = getNextAvailableLayer(); if( origLayer < NB_LAYERS ) if( origLayer != NO_AVAILABLE_LAYERS ) { { setActiveLayer(origLayer+1); setActiveLayer( origLayer ); Erase_Current_Layer( false ); Erase_Current_Layer( false ); if( !LoadGerberFiles( wxEmptyString ) ) if( !LoadGerberFiles( wxEmptyString ) ) Loading @@ -61,7 +61,7 @@ void WinEDA_GerberFrame::Files_io( wxCommandEvent& event ) { { wxString msg; wxString msg; msg.Printf( _( "GerbView only supports a maximum of %d layers. You must first \ msg.Printf( _( "GerbView only supports a maximum of %d layers. You must first \ delete an existing layer to load any new layers." ), NB_LAYERS ); clear an existing layer to load any new layers." ), NB_LAYERS ); wxMessageBox( msg ); wxMessageBox( msg ); } } } } Loading Loading @@ -144,7 +144,7 @@ bool WinEDA_GerberFrame::LoadGerberFiles( const wxString& aFullFileName ) if( dlg.ShowModal() == wxID_CANCEL ) if( dlg.ShowModal() == wxID_CANCEL ) return false; return false; dlg.GetFilenames( filenamesList ); dlg.GetPaths( filenamesList ); currentPath = wxGetCwd(); currentPath = wxGetCwd(); } } else else Loading @@ -160,18 +160,32 @@ bool WinEDA_GerberFrame::LoadGerberFiles( const wxString& aFullFileName ) for( unsigned ii = 0; ii < filenamesList.GetCount(); ii++ ) for( unsigned ii = 0; ii < filenamesList.GetCount(); ii++ ) { { wxFileName filename = filenamesList[ii]; wxFileName filename = filenamesList[ii]; if( !filename.IsAbsolute() ) filename.SetPath( currentPath ); filename.SetPath( currentPath ); GetScreen()->SetFileName( filename.GetFullPath() ); if( !filename.HasExt() ) filename.SetExt( g_PenFilenameExt ); filename.SetExt( g_PenFilenameExt ); GetScreen()->SetFileName( filename.GetFullPath() ); setActiveLayer( layer, false ); setActiveLayer( layer, false ); if( Read_GERBER_File( GetScreen()->GetFileName(), filename.GetFullPath() ) ) if( Read_GERBER_File( filename.GetFullPath(), filename.GetFullPath() ) ) { { SetLastProject( GetScreen()->GetFileName() ); SetLastProject( GetScreen()->GetFileName() ); layer++; if( layer >= NB_LAYERS ) layer = getNextAvailableLayer( layer ); layer = 0; if( layer == NO_AVAILABLE_LAYERS ) { wxString msg = wxT( "No more empty layers are available. The remaining gerber " ); msg += wxT( "files will not be loaded." ); wxMessageBox( msg ); break; } setActiveLayer( layer, false ); } } } } Loading gerbview/gerberframe.cpp +21 −0 Original line number Original line Diff line number Diff line Loading @@ -404,6 +404,27 @@ void WinEDA_GerberFrame::SetElementVisibility( int aGERBER_VISIBLE, bool aNewSta } } int WinEDA_GerberFrame::getNextAvailableLayer( int aLayer ) const { int layer = aLayer; for( int i = 0; i < NB_LAYERS; i++ ) { GERBER_IMAGE* gerber = g_GERBER_List[ layer ]; if( gerber == NULL || gerber->m_FileName.IsEmpty() ) return layer; layer++; if( layer >= NB_LAYERS ) layer = 0; } return NO_AVAILABLE_LAYERS; } void WinEDA_GerberFrame::syncLayerWidget() void WinEDA_GerberFrame::syncLayerWidget() { { m_LayersManager->SelectLayer( getActiveLayer() ); m_LayersManager->SelectLayer( getActiveLayer() ); Loading gerbview/wxGerberFrame.h +101 −91 Original line number Original line Diff line number Diff line Loading @@ -10,6 +10,10 @@ #include "class_gerbview_layer_widget.h" #include "class_gerbview_layer_widget.h" #include "class_layerchoicebox.h" #include "class_layerchoicebox.h" #define NO_AVAILABLE_LAYERS -1 /** /** * Command IDs for the gerber file viewer. * Command IDs for the gerber file viewer. * * Loading @@ -33,6 +37,7 @@ enum id_gerbview_frm { class DCODE_SELECTION_BOX; class DCODE_SELECTION_BOX; /****************************************************************** /****************************************************************** * class WinEDA_GerberFrame: this is the main window used in gerbview * class WinEDA_GerberFrame: this is the main window used in gerbview ******************************************************************/ ******************************************************************/ Loading @@ -53,16 +58,17 @@ public: private: private: int m_displayMode; // Gerber images ("layers" in Gerbview) can be drawn: int m_displayMode; // Gerber images ("layers" in Gerbview) can be drawn: // - in fast mode (write mode) but if there are negative items // - in fast mode (write mode) but if there are negative // only the last image is correctly drawn // items only the last image is correctly drawn (no // (no problem to see only one image or when no negative items) // problem to see only one image or when no negative items) // - in "exact" mode (but slower) in write mode: // - in "exact" mode (but slower) in write mode: // last image covers previous images // last image covers previous images // - in "exact" mode (also slower) in OR mode // - in "exact" mode (also slower) in OR mode // (transparency mode) // (transparency mode) // m_displayMode = 0, 1 or 2 // m_displayMode = 0, 1 or 2 bool m_show_layer_manager_tools; bool m_show_layer_manager_tools; wxArrayString m_Messages; // An array sting to store warning messages when reaging a gerber file wxArrayString m_Messages; // An array sting to store warning messages when reaging // a gerber file public: WinEDA_GerberFrame( wxWindow* father, const wxString& title, public: WinEDA_GerberFrame( wxWindow* father, const wxString& title, const wxPoint& pos, const wxSize& size, const wxPoint& pos, const wxSize& size, Loading Loading @@ -198,6 +204,17 @@ public: WinEDA_GerberFrame( wxWindow* father, const wxString& title, } } /** * Function getNextAvailableLayer * finds the next empty layer starting at \a aLayer and returns it to the caller. If no * empty layers are found, NO_AVAILABLE_LAYERS is return. * @param aLayer The first layer to search. * @return The first empty layer found or NO_AVAILABLE_LAYERS. */ int getNextAvailableLayer( int aLayer = 0 ) const; bool hasAvailableLayers() const { return getNextAvailableLayer() != NO_AVAILABLE_LAYERS; } /** /** * Function syncLayerWidget * Function syncLayerWidget * updates the currently "selected" layer within the PCB_LAYER_WIDGET. * updates the currently "selected" layer within the PCB_LAYER_WIDGET. Loading Loading @@ -350,15 +367,12 @@ public: WinEDA_GerberFrame( wxWindow* father, const wxString& title, void Genere_HPGL( const wxString& FullFileName, int Layers ); void Genere_HPGL( const wxString& FullFileName, int Layers ); void Genere_GERBER( const wxString& FullFileName, int Layers ); void Genere_GERBER( const wxString& FullFileName, int Layers ); void Genere_PS( const wxString& FullFileName, int Layers ); void Genere_PS( const wxString& FullFileName, int Layers ); void Plot_Layer_HPGL( FILE* File, int masque_layer, void Plot_Layer_HPGL( FILE* File, int masque_layer,int garde, bool trace_via, int garde, bool trace_via, GRTraceMode trace_mode ); GRTraceMode trace_mode ); void Plot_Layer_GERBER( FILE* File, int masque_layer, void Plot_Layer_GERBER( FILE* File, int masque_layer, int garde, bool trace_via, int garde, bool trace_via, GRTraceMode trace_mode ); GRTraceMode trace_mode ); int Gen_D_CODE_File( const wxString& Name_File ); int Gen_D_CODE_File( const wxString& Name_File ); void Plot_Layer_PS( FILE* File, int masque_layer, void Plot_Layer_PS( FILE* File, int masque_layer, int garde, bool trace_via, int garde, bool trace_via, GRTraceMode trace_mode ); GRTraceMode trace_mode ); void Files_io( wxCommandEvent& event ); void Files_io( wxCommandEvent& event ); Loading @@ -367,8 +381,8 @@ public: WinEDA_GerberFrame( wxWindow* father, const wxString& title, /** /** * function LoadGerberFiles * function LoadGerberFiles * Load a photoplot (Gerber) file or many files. * Load a photoplot (Gerber) file or many files. * @param aFileName - void string or file name with full path to open or empty string to open a new * @param aFileName - void string or file name with full path to open or empty string to * file. In this case one one file is loaded * open a new file. In this case one one file is loaded * if void string: user will be prompted for filename(s) * if void string: user will be prompted for filename(s) * @return true if file was opened successfully. * @return true if file was opened successfully. */ */ Loading Loading @@ -418,8 +432,7 @@ public: WinEDA_GerberFrame( wxWindow* father, const wxString& title, * currently: do nothing in gerbview. * currently: do nothing in gerbview. * but must be defined because it is a pure virtual in PCB_BASE_FRAME * but must be defined because it is a pure virtual in PCB_BASE_FRAME */ */ virtual void SaveCopyInUndoList( virtual void SaveCopyInUndoList( BOARD_ITEM* aItemToCopy, BOARD_ITEM* aItemToCopy, UndoRedoOpType aTypeCommand = UR_UNSPECIFIED, UndoRedoOpType aTypeCommand = UR_UNSPECIFIED, const wxPoint& aTransformPoint = wxPoint( 0, 0 ) ) { } const wxPoint& aTransformPoint = wxPoint( 0, 0 ) ) { } Loading @@ -432,15 +445,13 @@ public: WinEDA_GerberFrame( wxWindow* father, const wxString& title, * @param aTransformPoint = the reference point of the transformation, * @param aTransformPoint = the reference point of the transformation, * for commands like move * for commands like move */ */ virtual void SaveCopyInUndoList( virtual void SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList, PICKED_ITEMS_LIST& aItemsList, UndoRedoOpType aTypeCommand, UndoRedoOpType aTypeCommand, const wxPoint& aTransformPoint = wxPoint( 0, 0 ) ) const wxPoint& aTransformPoint = wxPoint( 0, 0 ) ) { { // currently: do nothing in gerbview. // currently: do nothing in gerbview. } } /** Virtual function PrintPage /** Virtual function PrintPage * used to print a page * used to print a page * @param aDC = wxDC given by the calling print function * @param aDC = wxDC given by the calling print function Loading @@ -448,8 +459,7 @@ public: WinEDA_GerberFrame( wxWindow* father, const wxString& title, * @param aPrintMirrorMode = not used here (Set when printing in mirror mode) * @param aPrintMirrorMode = not used here (Set when printing in mirror mode) * @param aData = a pointer on an auxiliary data (not always used, NULL if not used) * @param aData = a pointer on an auxiliary data (not always used, NULL if not used) */ */ virtual void PrintPage( wxDC* aDC, virtual void PrintPage( wxDC* aDC, int aPrintMasklayer, bool aPrintMirrorMode, int aPrintMasklayer, bool aPrintMirrorMode, void* aData = NULL ); void* aData = NULL ); /** /** Loading Loading
gerbview/files.cpp +29 −15 Original line number Original line Diff line number Diff line Loading @@ -39,19 +39,19 @@ void WinEDA_GerberFrame::Files_io( wxCommandEvent& event ) switch( id ) switch( id ) { { case wxID_FILE: case wxID_FILE: { Erase_Current_Layer( false ); Erase_Current_Layer( false ); LoadGerberFiles( wxEmptyString ); LoadGerberFiles( wxEmptyString ); break; break; } case ID_MENU_INC_LAYER_AND_APPEND_FILE: case ID_MENU_INC_LAYER_AND_APPEND_FILE: case ID_INC_LAYER_AND_APPEND_FILE: case ID_INC_LAYER_AND_APPEND_FILE: { { int origLayer = getActiveLayer(); int origLayer = getNextAvailableLayer(); if( origLayer < NB_LAYERS ) if( origLayer != NO_AVAILABLE_LAYERS ) { { setActiveLayer(origLayer+1); setActiveLayer( origLayer ); Erase_Current_Layer( false ); Erase_Current_Layer( false ); if( !LoadGerberFiles( wxEmptyString ) ) if( !LoadGerberFiles( wxEmptyString ) ) Loading @@ -61,7 +61,7 @@ void WinEDA_GerberFrame::Files_io( wxCommandEvent& event ) { { wxString msg; wxString msg; msg.Printf( _( "GerbView only supports a maximum of %d layers. You must first \ msg.Printf( _( "GerbView only supports a maximum of %d layers. You must first \ delete an existing layer to load any new layers." ), NB_LAYERS ); clear an existing layer to load any new layers." ), NB_LAYERS ); wxMessageBox( msg ); wxMessageBox( msg ); } } } } Loading Loading @@ -144,7 +144,7 @@ bool WinEDA_GerberFrame::LoadGerberFiles( const wxString& aFullFileName ) if( dlg.ShowModal() == wxID_CANCEL ) if( dlg.ShowModal() == wxID_CANCEL ) return false; return false; dlg.GetFilenames( filenamesList ); dlg.GetPaths( filenamesList ); currentPath = wxGetCwd(); currentPath = wxGetCwd(); } } else else Loading @@ -160,18 +160,32 @@ bool WinEDA_GerberFrame::LoadGerberFiles( const wxString& aFullFileName ) for( unsigned ii = 0; ii < filenamesList.GetCount(); ii++ ) for( unsigned ii = 0; ii < filenamesList.GetCount(); ii++ ) { { wxFileName filename = filenamesList[ii]; wxFileName filename = filenamesList[ii]; if( !filename.IsAbsolute() ) filename.SetPath( currentPath ); filename.SetPath( currentPath ); GetScreen()->SetFileName( filename.GetFullPath() ); if( !filename.HasExt() ) filename.SetExt( g_PenFilenameExt ); filename.SetExt( g_PenFilenameExt ); GetScreen()->SetFileName( filename.GetFullPath() ); setActiveLayer( layer, false ); setActiveLayer( layer, false ); if( Read_GERBER_File( GetScreen()->GetFileName(), filename.GetFullPath() ) ) if( Read_GERBER_File( filename.GetFullPath(), filename.GetFullPath() ) ) { { SetLastProject( GetScreen()->GetFileName() ); SetLastProject( GetScreen()->GetFileName() ); layer++; if( layer >= NB_LAYERS ) layer = getNextAvailableLayer( layer ); layer = 0; if( layer == NO_AVAILABLE_LAYERS ) { wxString msg = wxT( "No more empty layers are available. The remaining gerber " ); msg += wxT( "files will not be loaded." ); wxMessageBox( msg ); break; } setActiveLayer( layer, false ); } } } } Loading
gerbview/gerberframe.cpp +21 −0 Original line number Original line Diff line number Diff line Loading @@ -404,6 +404,27 @@ void WinEDA_GerberFrame::SetElementVisibility( int aGERBER_VISIBLE, bool aNewSta } } int WinEDA_GerberFrame::getNextAvailableLayer( int aLayer ) const { int layer = aLayer; for( int i = 0; i < NB_LAYERS; i++ ) { GERBER_IMAGE* gerber = g_GERBER_List[ layer ]; if( gerber == NULL || gerber->m_FileName.IsEmpty() ) return layer; layer++; if( layer >= NB_LAYERS ) layer = 0; } return NO_AVAILABLE_LAYERS; } void WinEDA_GerberFrame::syncLayerWidget() void WinEDA_GerberFrame::syncLayerWidget() { { m_LayersManager->SelectLayer( getActiveLayer() ); m_LayersManager->SelectLayer( getActiveLayer() ); Loading
gerbview/wxGerberFrame.h +101 −91 Original line number Original line Diff line number Diff line Loading @@ -10,6 +10,10 @@ #include "class_gerbview_layer_widget.h" #include "class_gerbview_layer_widget.h" #include "class_layerchoicebox.h" #include "class_layerchoicebox.h" #define NO_AVAILABLE_LAYERS -1 /** /** * Command IDs for the gerber file viewer. * Command IDs for the gerber file viewer. * * Loading @@ -33,6 +37,7 @@ enum id_gerbview_frm { class DCODE_SELECTION_BOX; class DCODE_SELECTION_BOX; /****************************************************************** /****************************************************************** * class WinEDA_GerberFrame: this is the main window used in gerbview * class WinEDA_GerberFrame: this is the main window used in gerbview ******************************************************************/ ******************************************************************/ Loading @@ -53,16 +58,17 @@ public: private: private: int m_displayMode; // Gerber images ("layers" in Gerbview) can be drawn: int m_displayMode; // Gerber images ("layers" in Gerbview) can be drawn: // - in fast mode (write mode) but if there are negative items // - in fast mode (write mode) but if there are negative // only the last image is correctly drawn // items only the last image is correctly drawn (no // (no problem to see only one image or when no negative items) // problem to see only one image or when no negative items) // - in "exact" mode (but slower) in write mode: // - in "exact" mode (but slower) in write mode: // last image covers previous images // last image covers previous images // - in "exact" mode (also slower) in OR mode // - in "exact" mode (also slower) in OR mode // (transparency mode) // (transparency mode) // m_displayMode = 0, 1 or 2 // m_displayMode = 0, 1 or 2 bool m_show_layer_manager_tools; bool m_show_layer_manager_tools; wxArrayString m_Messages; // An array sting to store warning messages when reaging a gerber file wxArrayString m_Messages; // An array sting to store warning messages when reaging // a gerber file public: WinEDA_GerberFrame( wxWindow* father, const wxString& title, public: WinEDA_GerberFrame( wxWindow* father, const wxString& title, const wxPoint& pos, const wxSize& size, const wxPoint& pos, const wxSize& size, Loading Loading @@ -198,6 +204,17 @@ public: WinEDA_GerberFrame( wxWindow* father, const wxString& title, } } /** * Function getNextAvailableLayer * finds the next empty layer starting at \a aLayer and returns it to the caller. If no * empty layers are found, NO_AVAILABLE_LAYERS is return. * @param aLayer The first layer to search. * @return The first empty layer found or NO_AVAILABLE_LAYERS. */ int getNextAvailableLayer( int aLayer = 0 ) const; bool hasAvailableLayers() const { return getNextAvailableLayer() != NO_AVAILABLE_LAYERS; } /** /** * Function syncLayerWidget * Function syncLayerWidget * updates the currently "selected" layer within the PCB_LAYER_WIDGET. * updates the currently "selected" layer within the PCB_LAYER_WIDGET. Loading Loading @@ -350,15 +367,12 @@ public: WinEDA_GerberFrame( wxWindow* father, const wxString& title, void Genere_HPGL( const wxString& FullFileName, int Layers ); void Genere_HPGL( const wxString& FullFileName, int Layers ); void Genere_GERBER( const wxString& FullFileName, int Layers ); void Genere_GERBER( const wxString& FullFileName, int Layers ); void Genere_PS( const wxString& FullFileName, int Layers ); void Genere_PS( const wxString& FullFileName, int Layers ); void Plot_Layer_HPGL( FILE* File, int masque_layer, void Plot_Layer_HPGL( FILE* File, int masque_layer,int garde, bool trace_via, int garde, bool trace_via, GRTraceMode trace_mode ); GRTraceMode trace_mode ); void Plot_Layer_GERBER( FILE* File, int masque_layer, void Plot_Layer_GERBER( FILE* File, int masque_layer, int garde, bool trace_via, int garde, bool trace_via, GRTraceMode trace_mode ); GRTraceMode trace_mode ); int Gen_D_CODE_File( const wxString& Name_File ); int Gen_D_CODE_File( const wxString& Name_File ); void Plot_Layer_PS( FILE* File, int masque_layer, void Plot_Layer_PS( FILE* File, int masque_layer, int garde, bool trace_via, int garde, bool trace_via, GRTraceMode trace_mode ); GRTraceMode trace_mode ); void Files_io( wxCommandEvent& event ); void Files_io( wxCommandEvent& event ); Loading @@ -367,8 +381,8 @@ public: WinEDA_GerberFrame( wxWindow* father, const wxString& title, /** /** * function LoadGerberFiles * function LoadGerberFiles * Load a photoplot (Gerber) file or many files. * Load a photoplot (Gerber) file or many files. * @param aFileName - void string or file name with full path to open or empty string to open a new * @param aFileName - void string or file name with full path to open or empty string to * file. In this case one one file is loaded * open a new file. In this case one one file is loaded * if void string: user will be prompted for filename(s) * if void string: user will be prompted for filename(s) * @return true if file was opened successfully. * @return true if file was opened successfully. */ */ Loading Loading @@ -418,8 +432,7 @@ public: WinEDA_GerberFrame( wxWindow* father, const wxString& title, * currently: do nothing in gerbview. * currently: do nothing in gerbview. * but must be defined because it is a pure virtual in PCB_BASE_FRAME * but must be defined because it is a pure virtual in PCB_BASE_FRAME */ */ virtual void SaveCopyInUndoList( virtual void SaveCopyInUndoList( BOARD_ITEM* aItemToCopy, BOARD_ITEM* aItemToCopy, UndoRedoOpType aTypeCommand = UR_UNSPECIFIED, UndoRedoOpType aTypeCommand = UR_UNSPECIFIED, const wxPoint& aTransformPoint = wxPoint( 0, 0 ) ) { } const wxPoint& aTransformPoint = wxPoint( 0, 0 ) ) { } Loading @@ -432,15 +445,13 @@ public: WinEDA_GerberFrame( wxWindow* father, const wxString& title, * @param aTransformPoint = the reference point of the transformation, * @param aTransformPoint = the reference point of the transformation, * for commands like move * for commands like move */ */ virtual void SaveCopyInUndoList( virtual void SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList, PICKED_ITEMS_LIST& aItemsList, UndoRedoOpType aTypeCommand, UndoRedoOpType aTypeCommand, const wxPoint& aTransformPoint = wxPoint( 0, 0 ) ) const wxPoint& aTransformPoint = wxPoint( 0, 0 ) ) { { // currently: do nothing in gerbview. // currently: do nothing in gerbview. } } /** Virtual function PrintPage /** Virtual function PrintPage * used to print a page * used to print a page * @param aDC = wxDC given by the calling print function * @param aDC = wxDC given by the calling print function Loading @@ -448,8 +459,7 @@ public: WinEDA_GerberFrame( wxWindow* father, const wxString& title, * @param aPrintMirrorMode = not used here (Set when printing in mirror mode) * @param aPrintMirrorMode = not used here (Set when printing in mirror mode) * @param aData = a pointer on an auxiliary data (not always used, NULL if not used) * @param aData = a pointer on an auxiliary data (not always used, NULL if not used) */ */ virtual void PrintPage( wxDC* aDC, virtual void PrintPage( wxDC* aDC, int aPrintMasklayer, bool aPrintMirrorMode, int aPrintMasklayer, bool aPrintMirrorMode, void* aData = NULL ); void* aData = NULL ); /** /** Loading