From 565bb268bb09a3f3a4b519fd7fbca0718190e51c Mon Sep 17 00:00:00 2001 From: Ian McInerney Date: Thu, 8 Oct 2020 23:59:16 +0100 Subject: [PATCH] gerbview: Move more items to actions and tools * Create a new inspection tool to hold the measure tool and the other inspection items * Move some control functions from the frame to a tool and rearrange the code to be cleaner. --- gerbview/CMakeLists.txt | 3 +- .../dialog_layers_select_to_pcb.cpp} | 4 +- .../dialog_layers_select_to_pcb.h} | 8 +- .../dialogs/dialog_select_one_pcb_layer.cpp | 2 +- gerbview/events_called_functions.cpp | 70 ---- gerbview/export_to_pcbnew.cpp | 198 +---------- gerbview/export_to_pcbnew.h | 164 +++++++++ gerbview/gerbview_frame.cpp | 87 +---- gerbview/gerbview_frame.h | 18 - gerbview/gerbview_id.h | 4 - gerbview/menubar.cpp | 22 +- gerbview/tools/gerbview_actions.cpp | 23 ++ gerbview/tools/gerbview_actions.h | 5 + gerbview/tools/gerbview_control.cpp | 76 +++- gerbview/tools/gerbview_control.h | 2 + gerbview/tools/gerbview_inspection_tool.cpp | 331 ++++++++++++++++++ gerbview/tools/gerbview_inspection_tool.h | 55 +++ gerbview/tools/gerbview_selection_tool.cpp | 136 ------- gerbview/tools/gerbview_selection_tool.h | 3 - 19 files changed, 674 insertions(+), 537 deletions(-) rename gerbview/{select_layers_to_pcb.cpp => dialogs/dialog_layers_select_to_pcb.cpp} (99%) rename gerbview/{select_layers_to_pcb.h => dialogs/dialog_layers_select_to_pcb.h} (97%) create mode 100644 gerbview/export_to_pcbnew.h create mode 100644 gerbview/tools/gerbview_inspection_tool.cpp create mode 100644 gerbview/tools/gerbview_inspection_tool.h diff --git a/gerbview/CMakeLists.txt b/gerbview/CMakeLists.txt index 12fd446562..966c72f119 100644 --- a/gerbview/CMakeLists.txt +++ b/gerbview/CMakeLists.txt @@ -21,6 +21,7 @@ set( DIALOGS_SRCS dialogs/panel_gerbview_display_options_base.cpp dialogs/panel_gerbview_settings.cpp dialogs/panel_gerbview_settings_base.cpp + dialogs/dialog_layers_select_to_pcb.cpp dialogs/dialog_layers_select_to_pcb_base.cpp dialogs/dialog_print_gerbview.cpp dialogs/dialog_select_one_pcb_layer.cpp @@ -53,13 +54,13 @@ set( GERBVIEW_SRCS rs274_read_XY_and_IJ_coordinates.cpp rs274d.cpp rs274x.cpp - select_layers_to_pcb.cpp toolbars_gerber.cpp gerbview_draw_panel_gal.cpp gerbview_painter.cpp tools/gerbview_actions.cpp + tools/gerbview_inspection_tool.cpp tools/gerbview_selection.cpp tools/gerbview_selection_tool.cpp tools/gerbview_control.cpp diff --git a/gerbview/select_layers_to_pcb.cpp b/gerbview/dialogs/dialog_layers_select_to_pcb.cpp similarity index 99% rename from gerbview/select_layers_to_pcb.cpp rename to gerbview/dialogs/dialog_layers_select_to_pcb.cpp index cbbad6d8ed..269a7cc823 100644 --- a/gerbview/select_layers_to_pcb.cpp +++ b/gerbview/dialogs/dialog_layers_select_to_pcb.cpp @@ -36,7 +36,7 @@ #include #include -#include +#include // Imported function extern const wxString GetPCBDefaultLayerName( LAYER_NUM aLayerNumber ); @@ -822,4 +822,4 @@ int LAYERS_MAP_DIALOG::findNumX2GerbersLoaded( std::vector& aGerber2KicadMa } return numKicadMatches; -} \ No newline at end of file +} diff --git a/gerbview/select_layers_to_pcb.h b/gerbview/dialogs/dialog_layers_select_to_pcb.h similarity index 97% rename from gerbview/select_layers_to_pcb.h rename to gerbview/dialogs/dialog_layers_select_to_pcb.h index 17018db866..009bd7fe5b 100644 --- a/gerbview/select_layers_to_pcb.h +++ b/gerbview/dialogs/dialog_layers_select_to_pcb.h @@ -26,11 +26,13 @@ * @file select_layers_to_pcb.h */ -#ifndef _SELECT_LAYERS_TO_PCB_H_ -#define _SELECT_LAYERS_TO_PCB_H_ +#ifndef DIALOG_LAYERS_SELECT_TO_PCB_H_ +#define DIALOG_LAYERS_SELECT_TO_PCB_H_ #include +class GERBVIEW_FRAME; + /* * This dialog shows the gerber files loaded, and allows user to choose * equivalence between gerber layers and pcb layers @@ -127,4 +129,4 @@ private: DECLARE_EVENT_TABLE() }; -#endif // _SELECT_LAYERS_TO_PCB_H_ +#endif // DIALOG_LAYERS_SELECT_TO_PCB_H_ diff --git a/gerbview/dialogs/dialog_select_one_pcb_layer.cpp b/gerbview/dialogs/dialog_select_one_pcb_layer.cpp index 19802d02e4..7448d932c7 100644 --- a/gerbview/dialogs/dialog_select_one_pcb_layer.cpp +++ b/gerbview/dialogs/dialog_select_one_pcb_layer.cpp @@ -28,7 +28,7 @@ */ #include -#include +#include #define NB_PCB_LAYERS PCB_LAYER_ID_COUNT #define FIRST_COPPER_LAYER 0 diff --git a/gerbview/events_called_functions.cpp b/gerbview/events_called_functions.cpp index c544267f7d..124aa6b929 100644 --- a/gerbview/events_called_functions.cpp +++ b/gerbview/events_called_functions.cpp @@ -52,7 +52,6 @@ BEGIN_EVENT_TABLE( GERBVIEW_FRAME, EDA_DRAW_FRAME ) // Menu Files: EVT_MENU( ID_NEW_BOARD, GERBVIEW_FRAME::Files_io ) - EVT_MENU( ID_GERBVIEW_EXPORT_TO_PCBNEW, GERBVIEW_FRAME::ExportDataInPcbnewFormat ) EVT_MENU_RANGE( ID_FILE1, ID_FILEMAX, GERBVIEW_FRAME::OnGbrFileHistory ) EVT_MENU( ID_FILE_LIST_CLEAR, GERBVIEW_FRAME::OnClearGbrFileHistory ) @@ -71,13 +70,6 @@ BEGIN_EVENT_TABLE( GERBVIEW_FRAME, EDA_DRAW_FRAME ) EVT_MENU( wxID_EXIT, GERBVIEW_FRAME::OnQuit ) - // menu Postprocess - EVT_MENU( ID_GERBVIEW_SHOW_LIST_DCODES, GERBVIEW_FRAME::Process_Special_Functions ) - EVT_MENU( ID_GERBVIEW_SHOW_SOURCE, GERBVIEW_FRAME::OnShowGerberSourceFile ) - - // menu Miscellaneous - EVT_MENU( ID_GERBVIEW_ERASE_CURR_LAYER, GERBVIEW_FRAME::Process_Special_Functions ) - EVT_COMBOBOX( ID_TOOLBARH_GERBVIEW_SELECT_ACTIVE_LAYER, GERBVIEW_FRAME::OnSelectActiveLayer ) EVT_SELECT_DCODE( ID_TOOLBARH_GERBER_SELECT_ACTIVE_DCODE, GERBVIEW_FRAME::OnSelectActiveDCode ) @@ -106,30 +98,6 @@ BEGIN_EVENT_TABLE( GERBVIEW_FRAME, EDA_DRAW_FRAME ) END_EVENT_TABLE() -/* Handles the selection of tools, menu, and popup menu commands. - */ -void GERBVIEW_FRAME::Process_Special_Functions( wxCommandEvent& event ) -{ - switch( event.GetId() ) - { - case ID_GERBVIEW_ERASE_CURR_LAYER: - Erase_Current_DrawLayer( true ); - ClearMsgPanel(); - break; - - case ID_GERBVIEW_SHOW_LIST_DCODES: - Liste_D_Codes(); - break; - - default: - wxFAIL_MSG( wxT( "GERBVIEW_FRAME::Process_Special_Functions error" ) ); - break; - } - - GetCanvas()->Refresh(); -} - - void GERBVIEW_FRAME::OnSelectHighlightChoice( wxCommandEvent& event ) { auto settings = static_cast( GetCanvas()->GetView()->GetPainter() )->GetSettings(); @@ -181,44 +149,6 @@ void GERBVIEW_FRAME::OnSelectActiveLayer( wxCommandEvent& event ) } -void GERBVIEW_FRAME::OnShowGerberSourceFile( wxCommandEvent& event ) -{ - int layer = GetActiveLayer(); - GERBER_FILE_IMAGE* gerber_layer = GetGbrImage( layer ); - - if( gerber_layer ) - { - wxString editorname = Pgm().GetEditorName(); - - if( !editorname.IsEmpty() ) - { - wxFileName fn( gerber_layer->m_FileName ); - - // Call the editor only if the Gerber/drill source file is available. - // This is not always the case, because it can be a temporary file - // if it comes from a zip archive. - if( !fn.FileExists() ) - { - wxString msg; - msg.Printf( _( "Source file \"%s\" is not available" ), - GetChars( fn.GetFullPath() ) ); - wxMessageBox( msg ); - } - else - ExecuteFile( this, editorname, QuoteFullPath( fn ) ); - } - else - wxMessageBox( _( "No editor defined. Please select one" ) ); - } - else - { - wxString msg; - msg.Printf( _( "No file loaded on the active layer %d" ), layer + 1 ); - wxMessageBox( msg ); - } -} - - void GERBVIEW_FRAME::OnSelectDisplayMode( wxCommandEvent& event ) { switch( event.GetId() ) diff --git a/gerbview/export_to_pcbnew.cpp b/gerbview/export_to_pcbnew.cpp index 899c077373..9b2bcc3ab9 100644 --- a/gerbview/export_to_pcbnew.cpp +++ b/gerbview/export_to_pcbnew.cpp @@ -2,7 +2,7 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2007-2014 Jean-Pierre Charras jp.charras at wanadoo.fr - * Copyright (C) 1992-2017 KiCad Developers, see change_log.txt for contributors. + * Copyright (C) 1992-2020 KiCad Developers, see change_log.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -22,20 +22,16 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ -/** - * @file export_to_pcbnew.cpp - * @brief Export the layers to Pcbnew. - */ - #include +#include + #include #include #include #include #include #include -#include #include #include #include "excellon_image.h" @@ -44,138 +40,6 @@ extern const wxString GetPCBDefaultLayerName( LAYER_NUM aLayerNumber ); -struct EXPORT_VIA -{ - EXPORT_VIA( const wxPoint& aPos, int aSize, int aDrill ) : - m_Pos( aPos ), - m_Size( aSize ), - m_Drill( aDrill ) - { } - - wxPoint m_Pos; - int m_Size; - int m_Drill; -}; - - -/* A helper class to export a Gerber set of files to Pcbnew - */ -class GBR_TO_PCB_EXPORTER -{ -private: - GERBVIEW_FRAME* m_gerbview_frame; // the main gerber frame - wxString m_pcb_file_name; // BOARD file to write to - FILE* m_fp; // the board file - int m_pcbCopperLayersCount; - std::vector m_vias; -public: - GBR_TO_PCB_EXPORTER( GERBVIEW_FRAME* aFrame, const wxString& aFileName ); - ~GBR_TO_PCB_EXPORTER(); - - /** - * Function ExportPcb - * saves a board from a set of Gerber images. - */ - bool ExportPcb( LAYER_NUM* aLayerLookUpTable, int aCopperLayers ); - -private: - /** - * collect holes from a drill layer. - * We'll use these later when writing pads & vias. - * @param aGbrItem - */ - void collect_hole( GERBER_DRAW_ITEM* aGbrItem ); - - /** - * write a via to the board file. - * Some of these will represent actual vias while others are used to represent - * holes in pads. (We can't generate actual pads because the Gerbers don't contain - * info on how to group them into modules.) - * @param aVia - */ - void export_via( const EXPORT_VIA& aVia ); - - /** - * write a non copper line or arc to the board file. - * @param aGbrItem = the Gerber item (line, arc) to export - * @param aLayer = the technical layer to use - */ - void export_non_copper_item( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer ); - - /** - * write a non-copper polygon to the board file. - * @param aLayer = the technical layer to use - */ - void writePcbPolygon( const SHAPE_POLY_SET& aPolys, LAYER_NUM aLayer, - const wxPoint& aOffset = { 0, 0 } ); - - /** - * write a zone item to the board file. - * Currently: only experimental, for tests - * @param aGbrItem = the Gerber item (line, arc) to export - * @param aLayer = the technical layer to use - */ - void writePcbZoneItem( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer ); - - /** - * write a track (or via) to the board file. - * @param aGbrItem = the Gerber item (line, arc, flashed) to export - * @param aLayer = the copper layer to use - */ - void export_copper_item( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer ); - - /** - * Function export_flashed_copper_item - * write a synthetic pad to the board file. - * We can't create real pads because the Gerbers don't store grouping/footprint info. - * So we synthesize a pad with a via for the hole (if present) and a copper polygon for - * the pad. - * @param aGbrItem = the flashed Gerber item to export - */ - void export_flashed_copper_item( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer ); - - /** - * Function export_segline_copper_item - * write a track (not via) to the board file. - * @param aGbrItem = the Gerber item (line only) to export - * @param aLayer = the copper layer to use - */ - void export_segline_copper_item( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer ); - - /** - * Function export_segarc_copper_item - * write a set of tracks (arcs are approximated by track segments) - * to the board file. - * @param aGbrItem = the Gerber item (arc only) to export - * @param aLayer = the copper layer to use - */ - void export_segarc_copper_item( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer ); - - /** - * function writeCopperLineItem - * basic write function to write a a TRACK item - * to the board file, from a non flashed item - */ - void writeCopperLineItem( wxPoint& aStart, wxPoint& aEnd, - int aWidth, LAYER_NUM aLayer ); - - /** - * function writePcbHeader - * Write a very basic header to the board file - */ - void writePcbHeader( LAYER_NUM* aLayerLookUpTable ); - - /** In Pcbnew files units are mm for coordinates. - * So MapToPcbUnits converts internal gerbview to mm any pcbnew value - * @param aValue is a coordinate value to convert in mm - */ - double MapToPcbUnits( int aValue ) - { - return aValue / IU_PER_MM; - } -}; - - GBR_TO_PCB_EXPORTER::GBR_TO_PCB_EXPORTER( GERBVIEW_FRAME* aFrame, const wxString& aFileName ) { m_gerbview_frame = aFrame; @@ -190,62 +54,6 @@ GBR_TO_PCB_EXPORTER::~GBR_TO_PCB_EXPORTER() } -/* Export data in Pcbnew format - * remember Pcbnew uses a Y reversed axis, so we must negate all Y coordinates - */ -void GERBVIEW_FRAME::ExportDataInPcbnewFormat( wxCommandEvent& event ) -{ - int layercount = 0; - - GERBER_FILE_IMAGE_LIST* images = GetGerberLayout()->GetImagesList(); - - // Count the Gerber layers which are actually currently used - for( LAYER_NUM ii = 0; ii < (LAYER_NUM)images->ImagesMaxCount(); ++ii ) - { - if( images->GetGbrImage( ii ) ) - layercount++; - } - - if( layercount == 0 ) - { - DisplayInfoMessage( this, _( "None of the Gerber layers contain any data" ) ); - return; - } - - wxString fileDialogName( wxT( "noname." ) + KiCadPcbFileExtension ); - wxString path = m_mruPath; - - wxFileDialog filedlg( this, _( "Board File Name" ), - path, fileDialogName, PcbFileWildcard(), - wxFD_SAVE | wxFD_OVERWRITE_PROMPT ); - - if( filedlg.ShowModal() == wxID_CANCEL ) - return; - - wxFileName fileName = filedlg.GetPath(); - - /* Install a dialog frame to choose the mapping - * between gerber layers and Pcbnew layers - */ - LAYERS_MAP_DIALOG* layerdlg = new LAYERS_MAP_DIALOG( this ); - int ok = layerdlg->ShowModal(); - layerdlg->Destroy(); - - if( ok != wxID_OK ) - return; - - // If no extension was entered, then force the extension to be a KiCad PCB file - if( !fileName.HasExt() ) - fileName.SetExt( KiCadPcbFileExtension ); - - m_mruPath = fileName.GetPath(); - - GBR_TO_PCB_EXPORTER gbr_exporter( this, fileName.GetFullPath() ); - - gbr_exporter.ExportPcb( layerdlg->GetLayersLookUpTable(), layerdlg->GetCopperLayersCount() ); -} - - bool GBR_TO_PCB_EXPORTER::ExportPcb( LAYER_NUM* aLayerLookUpTable, int aCopperLayers ) { LOCALE_IO toggle; // toggles on, then off, the C locale. diff --git a/gerbview/export_to_pcbnew.h b/gerbview/export_to_pcbnew.h new file mode 100644 index 0000000000..efa25bb144 --- /dev/null +++ b/gerbview/export_to_pcbnew.h @@ -0,0 +1,164 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2007-2014 Jean-Pierre Charras jp.charras at wanadoo.fr + * Copyright (C) 1992-2020 KiCad Developers, see change_log.txt for contributors. + * + * 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 +#include +#include + + +struct EXPORT_VIA +{ + EXPORT_VIA( const wxPoint& aPos, int aSize, int aDrill ) : + m_Pos( aPos ), + m_Size( aSize ), + m_Drill( aDrill ) + { } + + wxPoint m_Pos; + int m_Size; + int m_Drill; +}; + + +class GERBER_DRAW_ITEM; +class GERBVIEW_FRAME; + + +/** + * A helper class to export a Gerber set of files to Pcbnew + */ +class GBR_TO_PCB_EXPORTER +{ +private: + GERBVIEW_FRAME* m_gerbview_frame; // the main gerber frame + wxString m_pcb_file_name; // BOARD file to write to + FILE* m_fp; // the board file + int m_pcbCopperLayersCount; + std::vector m_vias; +public: + GBR_TO_PCB_EXPORTER( GERBVIEW_FRAME* aFrame, const wxString& aFileName ); + ~GBR_TO_PCB_EXPORTER(); + + /** + * Function ExportPcb + * saves a board from a set of Gerber images. + */ + bool ExportPcb( LAYER_NUM* aLayerLookUpTable, int aCopperLayers ); + +private: + /** + * collect holes from a drill layer. + * We'll use these later when writing pads & vias. + * @param aGbrItem + */ + void collect_hole( GERBER_DRAW_ITEM* aGbrItem ); + + /** + * write a via to the board file. + * Some of these will represent actual vias while others are used to represent + * holes in pads. (We can't generate actual pads because the Gerbers don't contain + * info on how to group them into modules.) + * @param aVia + */ + void export_via( const EXPORT_VIA& aVia ); + + /** + * write a non copper line or arc to the board file. + * @param aGbrItem = the Gerber item (line, arc) to export + * @param aLayer = the technical layer to use + */ + void export_non_copper_item( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer ); + + /** + * write a non-copper polygon to the board file. + * @param aLayer = the technical layer to use + */ + void writePcbPolygon( const SHAPE_POLY_SET& aPolys, LAYER_NUM aLayer, + const wxPoint& aOffset = { 0, 0 } ); + + /** + * write a zone item to the board file. + * Currently: only experimental, for tests + * @param aGbrItem = the Gerber item (line, arc) to export + * @param aLayer = the technical layer to use + */ + void writePcbZoneItem( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer ); + + /** + * write a track (or via) to the board file. + * @param aGbrItem = the Gerber item (line, arc, flashed) to export + * @param aLayer = the copper layer to use + */ + void export_copper_item( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer ); + + /** + * Function export_flashed_copper_item + * write a synthetic pad to the board file. + * We can't create real pads because the Gerbers don't store grouping/footprint info. + * So we synthesize a pad with a via for the hole (if present) and a copper polygon for + * the pad. + * @param aGbrItem = the flashed Gerber item to export + */ + void export_flashed_copper_item( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer ); + + /** + * Function export_segline_copper_item + * write a track (not via) to the board file. + * @param aGbrItem = the Gerber item (line only) to export + * @param aLayer = the copper layer to use + */ + void export_segline_copper_item( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer ); + + /** + * Function export_segarc_copper_item + * write a set of tracks (arcs are approximated by track segments) + * to the board file. + * @param aGbrItem = the Gerber item (arc only) to export + * @param aLayer = the copper layer to use + */ + void export_segarc_copper_item( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer ); + + /** + * function writeCopperLineItem + * basic write function to write a a TRACK item + * to the board file, from a non flashed item + */ + void writeCopperLineItem( wxPoint& aStart, wxPoint& aEnd, + int aWidth, LAYER_NUM aLayer ); + + /** + * function writePcbHeader + * Write a very basic header to the board file + */ + void writePcbHeader( LAYER_NUM* aLayerLookUpTable ); + + /** In Pcbnew files units are mm for coordinates. + * So MapToPcbUnits converts internal gerbview to mm any pcbnew value + * @param aValue is a coordinate value to convert in mm + */ + double MapToPcbUnits( int aValue ) + { + return aValue / IU_PER_MM; + } +}; diff --git a/gerbview/gerbview_frame.cpp b/gerbview/gerbview_frame.cpp index 8122bf428e..2e28834a2c 100644 --- a/gerbview/gerbview_frame.cpp +++ b/gerbview/gerbview_frame.cpp @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include @@ -537,91 +538,6 @@ void GERBVIEW_FRAME::syncLayerBox( bool aRebuildLayerBox ) } -void GERBVIEW_FRAME::Liste_D_Codes() -{ - int ii, jj; - wxString Line; - wxArrayString list; - int curr_layer = GetActiveLayer(); - - double scale = 1.0; - wxString units; - - switch( GetUserUnits() ) - { - case EDA_UNITS::MILLIMETRES: - scale = IU_PER_MM; - units = "mm"; - break; - - case EDA_UNITS::INCHES: - scale = IU_PER_MILS * 1000; - units = "in"; - break; - - case EDA_UNITS::MILS: - scale = IU_PER_MILS; - units = "mil"; - break; - - default: - wxASSERT_MSG( false, "Invalid units" ); - } - - for( int layer = 0; layer < (int)ImagesMaxCount(); ++layer ) - { - GERBER_FILE_IMAGE* gerber = GetGbrImage( layer ); - - if( gerber == NULL ) - continue; - - if( gerber->GetDcodesCount() == 0 ) - continue; - - if( layer == curr_layer ) - Line.Printf( wxT( "*** Active layer (%2.2d) ***" ), layer + 1 ); - else - Line.Printf( wxT( "*** layer %2.2d ***" ), layer + 1 ); - - list.Add( Line ); - - for( ii = 0, jj = 1; ii < TOOLS_MAX_COUNT; ii++ ) - { - D_CODE* pt_D_code = gerber->GetDCODE( ii + FIRST_DCODE ); - - if( pt_D_code == NULL ) - continue; - - if( !pt_D_code->m_InUse && !pt_D_code->m_Defined ) - continue; - - Line.Printf( wxT( "tool %2.2d: D%2.2d V %.4f %s H %.4f %s %s attribute '%s'" ), - jj, - pt_D_code->m_Num_Dcode, - pt_D_code->m_Size.y / scale, units, - pt_D_code->m_Size.x / scale, units, - D_CODE::ShowApertureType( pt_D_code->m_Shape ), - pt_D_code->m_AperFunction.IsEmpty()? wxT( "none" ) : GetChars( pt_D_code->m_AperFunction ) - ); - - if( !pt_D_code->m_Defined ) - Line += wxT( " (not defined)" ); - - if( pt_D_code->m_InUse ) - Line += wxT( " (in use)" ); - - list.Add( Line ); - jj++; - } - } - - wxSingleChoiceDialog dlg( this, wxEmptyString, _( "D Codes" ), list, (void**) NULL, - wxCHOICEDLG_STYLE & ~wxCANCEL ); - - dlg.ShowModal(); -} - - void GERBVIEW_FRAME::SortLayersByX2Attributes() { auto remapping = GetImagesList()->SortImagesByZOrder(); @@ -1145,6 +1061,7 @@ void GERBVIEW_FRAME::setupTools() m_toolManager->RegisterTool( new COMMON_TOOLS ); m_toolManager->RegisterTool( new GERBVIEW_SELECTION_TOOL ); m_toolManager->RegisterTool( new GERBVIEW_CONTROL ); + m_toolManager->RegisterTool( new GERBVIEW_INSPECTION_TOOL ); m_toolManager->RegisterTool( new ZOOM_TOOL ); m_toolManager->InitTools(); diff --git a/gerbview/gerbview_frame.h b/gerbview/gerbview_frame.h index 30dcf0f512..db1c9d5455 100644 --- a/gerbview/gerbview_frame.h +++ b/gerbview/gerbview_frame.h @@ -387,8 +387,6 @@ public: void ShowChangedLanguage() override; - void Process_Special_Functions( wxCommandEvent& event ); - /// Handles the changing of the highlighted component/net/attribute void OnSelectHighlightChoice( wxCommandEvent& event ); @@ -407,13 +405,6 @@ public: */ void OnSelectActiveLayer( wxCommandEvent& event ); - /** - * Function OnShowGerberSourceFile - * Call the preferred editor to show (and edit) the gerber source file - * loaded in the active layer - */ - void OnShowGerberSourceFile( wxCommandEvent& event ); - /** * Function OnSelectDisplayMode * called on a display mode selection @@ -511,12 +502,6 @@ public: */ bool LoadGerberJobFile( const wxString& aFileName ); - - /** - * Set Size Items (Lines, Flashes) from DCodes List - */ - void Liste_D_Codes(); - // PCB handling bool Clear_DrawLayers( bool query ); void Erase_Current_DrawLayer( bool query ); @@ -529,9 +514,6 @@ public: */ void UpdateDisplayOptions( const GBR_DISPLAY_OPTIONS& aOptions ); - // Conversion function - void ExportDataInPcbnewFormat( wxCommandEvent& event ); - /* SaveCopyInUndoList() virtual * currently: do nothing in GerbView. */ diff --git a/gerbview/gerbview_id.h b/gerbview/gerbview_id.h index 53d64eda9f..5f01bdb8ee 100644 --- a/gerbview/gerbview_id.h +++ b/gerbview/gerbview_id.h @@ -38,19 +38,15 @@ enum gerbview_ids { ID_MAIN_MENUBAR = ID_END_LIST, - ID_GERBVIEW_SHOW_LIST_DCODES, ID_GERBVIEW_ERASE_ALL, ID_GERBVIEW_RELOAD_ALL, ID_TOOLBARH_GERBER_SELECT_ACTIVE_DCODE, - ID_GERBVIEW_SHOW_SOURCE, - ID_GERBVIEW_EXPORT_TO_PCBNEW, ID_GBR_AUX_TOOLBAR_PCB_CMP_CHOICE, ID_GBR_AUX_TOOLBAR_PCB_NET_CHOICE, ID_GBR_AUX_TOOLBAR_PCB_APERATTRIBUTES_CHOICE, ID_TOOLBARH_GERBVIEW_SELECT_ACTIVE_LAYER, - ID_GERBVIEW_ERASE_CURR_LAYER, ID_TB_OPTIONS_SHOW_LAYERS_MANAGER_VERTICAL_TOOLBAR, ID_TB_OPTIONS_SHOW_GBR_MODE_0, ID_TB_OPTIONS_SHOW_GBR_MODE_1, diff --git a/gerbview/menubar.cpp b/gerbview/menubar.cpp index 6416a9f44a..228f8f10aa 100644 --- a/gerbview/menubar.cpp +++ b/gerbview/menubar.cpp @@ -146,10 +146,7 @@ void GERBVIEW_FRAME::ReCreateMenuBar() reload2_xpm ); fileMenu->AppendSeparator(); - fileMenu->Add( _( "Export to Pcbnew..." ), - _( "Export data in Pcbnew format" ), - ID_GERBVIEW_EXPORT_TO_PCBNEW, - export_xpm ); + fileMenu->Add( GERBVIEW_ACTIONS::exportToPcbnew ); fileMenu->AppendSeparator(); fileMenu->Add( ACTIONS::print ); @@ -210,23 +207,14 @@ void GERBVIEW_FRAME::ReCreateMenuBar() // ACTION_MENU* toolsMenu = new ACTION_MENU( false, selTool ); - toolsMenu->Add( _( "&List DCodes..." ), - _( "List D-codes defined in Gerber files" ), - ID_GERBVIEW_SHOW_LIST_DCODES, - show_dcodenumber_xpm ); - - toolsMenu->Add( _( "&Show Source..." ), - _( "Show source file for the current layer" ), - ID_GERBVIEW_SHOW_SOURCE, - tools_xpm ); + toolsMenu->Add( GERBVIEW_ACTIONS::showDCodes ); + toolsMenu->Add( GERBVIEW_ACTIONS::showSource ); toolsMenu->Add( ACTIONS::measureTool ); toolsMenu->AppendSeparator(); - toolsMenu->Add( _( "Clear Current Layer..." ), - _( "Clear the selected graphic layer" ), - ID_GERBVIEW_ERASE_CURR_LAYER, - delete_sheet_xpm ); + toolsMenu->Add( GERBVIEW_ACTIONS::eraseLayer ); + //-- Preferences menu ----------------------------------------------- // diff --git a/gerbview/tools/gerbview_actions.cpp b/gerbview/tools/gerbview_actions.cpp index 1a57a218ce..84c2b3e615 100644 --- a/gerbview/tools/gerbview_actions.cpp +++ b/gerbview/tools/gerbview_actions.cpp @@ -58,6 +58,29 @@ TOOL_ACTION GERBVIEW_ACTIONS::openZipFile( "gerbview.Control.openZipFile", _( "Open a zipped archive (Gerber and Drill) file" ), zip_xpm ); +TOOL_ACTION GERBVIEW_ACTIONS::showDCodes( "gerbview.Inspection.showDCodes", + AS_GLOBAL, 0, "", + _( "List DCodes..." ), + _( "List D-codes defined in Gerber files" ), + show_dcodenumber_xpm ); + +TOOL_ACTION GERBVIEW_ACTIONS::showSource( "gerbview.Inspection.showSource", + AS_GLOBAL, 0, "", + _( "Show Source..." ), + _( "Show source file for the current layer" ), + tools_xpm ); + +TOOL_ACTION GERBVIEW_ACTIONS::exportToPcbnew( "gerbview.Control.exportToPcbnew", + AS_GLOBAL, 0, "", + _( "Export to Pcbnew..." ), + _( "Export data in Pcbnew format" ), + export_xpm ); + +TOOL_ACTION GERBVIEW_ACTIONS::eraseLayer( "gerbview.Control.eraseLayer", + AS_GLOBAL, 0, "", + _( "Clear Current Layer..." ), _( "Clear the selected graphic layer" ), + delete_sheet_xpm ); + TOOL_ACTION GERBVIEW_ACTIONS::layerChanged( "gerbview.Control.layerChanged", AS_GLOBAL, 0, "", "", "", nullptr, AF_NOTIFY ); diff --git a/gerbview/tools/gerbview_actions.h b/gerbview/tools/gerbview_actions.h index f1bf42c6ee..73eb5879c2 100644 --- a/gerbview/tools/gerbview_actions.h +++ b/gerbview/tools/gerbview_actions.h @@ -55,6 +55,10 @@ public: /// Activation of the edit tool static TOOL_ACTION properties; + static TOOL_ACTION showDCodes; + static TOOL_ACTION showSource; + + static TOOL_ACTION exportToPcbnew; // Display modes static TOOL_ACTION linesDisplayOutlines; @@ -68,6 +72,7 @@ public: // Layer control static TOOL_ACTION layerPrev; static TOOL_ACTION layerNext; + static TOOL_ACTION eraseLayer; static TOOL_ACTION layerChanged; // notification diff --git a/gerbview/tools/gerbview_control.cpp b/gerbview/tools/gerbview_control.cpp index e3fe5e7593..986b966b5b 100644 --- a/gerbview/tools/gerbview_control.cpp +++ b/gerbview/tools/gerbview_control.cpp @@ -18,11 +18,17 @@ * with this program. If not, see . */ -#include +#include +#include +#include +#include #include #include -#include #include +#include +#include +#include + #include "gerbview_actions.h" #include "gerbview_control.h" #include "gerbview_selection_tool.h" @@ -75,6 +81,61 @@ int GERBVIEW_CONTROL::OpenZipFile( const TOOL_EVENT& aEvent ) } +int GERBVIEW_CONTROL::ExportToPcbnew( const TOOL_EVENT& aEvent ) +{ + int layercount = 0; + + GERBER_FILE_IMAGE_LIST* images = m_frame->GetGerberLayout()->GetImagesList(); + + // Count the Gerber layers which are actually currently used + for( LAYER_NUM ii = 0; ii < (LAYER_NUM)images->ImagesMaxCount(); ++ii ) + { + if( images->GetGbrImage( ii ) ) + layercount++; + } + + if( layercount == 0 ) + { + DisplayInfoMessage( m_frame, _( "None of the Gerber layers contain any data" ) ); + return 0; + } + + wxString fileDialogName( wxT( "noname." ) + KiCadPcbFileExtension ); + wxString path = m_frame->GetMruPath(); + + wxFileDialog filedlg( m_frame, _( "Board File Name" ), + path, fileDialogName, PcbFileWildcard(), + wxFD_SAVE | wxFD_OVERWRITE_PROMPT ); + + if( filedlg.ShowModal() == wxID_CANCEL ) + return 0; + + wxFileName fileName = filedlg.GetPath(); + + /* Install a dialog frame to choose the mapping + * between gerber layers and Pcbnew layers + */ + LAYERS_MAP_DIALOG* layerdlg = new LAYERS_MAP_DIALOG( m_frame ); + int ok = layerdlg->ShowModal(); + layerdlg->Destroy(); + + if( ok != wxID_OK ) + return 0; + + // If no extension was entered, then force the extension to be a KiCad PCB file + if( !fileName.HasExt() ) + fileName.SetExt( KiCadPcbFileExtension ); + + m_frame->SetMruPath( fileName.GetPath() ); + + GBR_TO_PCB_EXPORTER gbr_exporter( m_frame, fileName.GetFullPath() ); + + gbr_exporter.ExportPcb( layerdlg->GetLayersLookUpTable(), layerdlg->GetCopperLayersCount() ); + + return 0; +} + + int GERBVIEW_CONTROL::HighlightControl( const TOOL_EVENT& aEvent ) { auto settings = static_cast( getView()->GetPainter() )->GetSettings(); @@ -205,6 +266,15 @@ int GERBVIEW_CONTROL::LayerPrev( const TOOL_EVENT& aEvent ) } +int GERBVIEW_CONTROL::EraseLayer( const TOOL_EVENT& aEvent ) +{ + m_frame->Erase_Current_DrawLayer( true ); + m_frame->ClearMsgPanel(); + + return 0; +} + + int GERBVIEW_CONTROL::UpdateMessagePanel( const TOOL_EVENT& aEvent ) { GERBVIEW_SELECTION_TOOL* selTool = m_toolMgr->GetTool(); @@ -233,6 +303,7 @@ void GERBVIEW_CONTROL::setTransitions() Go( &GERBVIEW_CONTROL::OpenDrillFile, GERBVIEW_ACTIONS::openDrillFile.MakeEvent() ); Go( &GERBVIEW_CONTROL::OpenJobFile, GERBVIEW_ACTIONS::openJobFile.MakeEvent() ); Go( &GERBVIEW_CONTROL::OpenZipFile, GERBVIEW_ACTIONS::openZipFile.MakeEvent() ); + Go( &GERBVIEW_CONTROL::ExportToPcbnew, GERBVIEW_ACTIONS::exportToPcbnew.MakeEvent() ); Go( &GERBVIEW_CONTROL::Print, ACTIONS::print.MakeEvent() ); Go( &GERBVIEW_CONTROL::HighlightControl, GERBVIEW_ACTIONS::highlightClear.MakeEvent() ); @@ -242,6 +313,7 @@ void GERBVIEW_CONTROL::setTransitions() Go( &GERBVIEW_CONTROL::LayerNext, GERBVIEW_ACTIONS::layerNext.MakeEvent() ); Go( &GERBVIEW_CONTROL::LayerPrev, GERBVIEW_ACTIONS::layerPrev.MakeEvent() ); + Go( &GERBVIEW_CONTROL::EraseLayer, GERBVIEW_ACTIONS::eraseLayer.MakeEvent() ); Go( &GERBVIEW_CONTROL::DisplayControl, GERBVIEW_ACTIONS::linesDisplayOutlines.MakeEvent() ); Go( &GERBVIEW_CONTROL::DisplayControl, GERBVIEW_ACTIONS::flashedDisplayOutlines.MakeEvent() ); diff --git a/gerbview/tools/gerbview_control.h b/gerbview/tools/gerbview_control.h index 3d5476e1d8..0c7343354d 100644 --- a/gerbview/tools/gerbview_control.h +++ b/gerbview/tools/gerbview_control.h @@ -46,6 +46,7 @@ public: // Layer control int LayerNext( const TOOL_EVENT& aEvent ); int LayerPrev( const TOOL_EVENT& aEvent ); + int EraseLayer( const TOOL_EVENT& aEvent ); // Files int OpenGerber( const TOOL_EVENT& aEvent ); @@ -57,6 +58,7 @@ public: int HighlightControl( const TOOL_EVENT& aEvent ); // Miscellaneous + int ExportToPcbnew( const TOOL_EVENT& aEvent ); int UpdateMessagePanel( const TOOL_EVENT& aEvent ); int Print( const TOOL_EVENT& aEvent ); diff --git a/gerbview/tools/gerbview_inspection_tool.cpp b/gerbview/tools/gerbview_inspection_tool.cpp new file mode 100644 index 0000000000..84331bd3ba --- /dev/null +++ b/gerbview/tools/gerbview_inspection_tool.cpp @@ -0,0 +1,331 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2017 Jon Evans + * Copyright (C) 2017-2020 KiCad Developers, see AUTHORS.txt for contributors. + * + * 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 3 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, see . + */ + + +#include +#include +#include +#include +#include +#include +#include +#include "gerbview_inspection_tool.h" +#include "gerbview_actions.h" +#include +#include +#include +#include +#include +#include +#include +#include + + + +GERBVIEW_INSPECTION_TOOL::GERBVIEW_INSPECTION_TOOL() : + TOOL_INTERACTIVE( "gerbview.Inspection" ), + m_frame( nullptr ) +{ +} + + +GERBVIEW_INSPECTION_TOOL::~GERBVIEW_INSPECTION_TOOL() +{ +} + + +bool GERBVIEW_INSPECTION_TOOL::Init() +{ + return true; +} + + +void GERBVIEW_INSPECTION_TOOL::Reset( RESET_REASON aReason ) +{ + m_frame = getEditFrame(); +} + + +int GERBVIEW_INSPECTION_TOOL::ShowDCodes( const TOOL_EVENT& aEvent ) +{ + int ii, jj; + wxString Line; + wxArrayString list; + int curr_layer = m_frame->GetActiveLayer(); + + double scale = 1.0; + wxString units; + + switch( m_frame->GetUserUnits() ) + { + case EDA_UNITS::MILLIMETRES: + scale = IU_PER_MM; + units = "mm"; + break; + + case EDA_UNITS::INCHES: + scale = IU_PER_MILS * 1000; + units = "in"; + break; + + case EDA_UNITS::MILS: + scale = IU_PER_MILS; + units = "mil"; + break; + + default: + wxASSERT_MSG( false, "Invalid units" ); + } + + for( unsigned int layer = 0; layer < m_frame->ImagesMaxCount(); ++layer ) + { + GERBER_FILE_IMAGE* gerber = m_frame->GetGbrImage( layer ); + + if( !gerber ) + continue; + + if( gerber->GetDcodesCount() == 0 ) + continue; + + if( curr_layer == static_cast( layer ) ) + Line.Printf( wxT( "*** Active layer (%2.2d) ***" ), layer + 1 ); + else + Line.Printf( wxT( "*** layer %2.2d ***" ), layer + 1 ); + + list.Add( Line ); + + for( ii = 0, jj = 1; ii < TOOLS_MAX_COUNT; ii++ ) + { + D_CODE* pt_D_code = gerber->GetDCODE( ii + FIRST_DCODE ); + + if( pt_D_code == NULL ) + continue; + + if( !pt_D_code->m_InUse && !pt_D_code->m_Defined ) + continue; + + Line.Printf( wxT( "tool %2.2d: D%2.2d V %.4f %s H %.4f %s %s attribute '%s'" ), + jj, + pt_D_code->m_Num_Dcode, + pt_D_code->m_Size.y / scale, units, + pt_D_code->m_Size.x / scale, units, + D_CODE::ShowApertureType( pt_D_code->m_Shape ), + pt_D_code->m_AperFunction.IsEmpty()? wxT( "none" ) : GetChars( pt_D_code->m_AperFunction ) + ); + + if( !pt_D_code->m_Defined ) + Line += wxT( " (not defined)" ); + + if( pt_D_code->m_InUse ) + Line += wxT( " (in use)" ); + + list.Add( Line ); + jj++; + } + } + + wxSingleChoiceDialog dlg( m_frame, wxEmptyString, _( "D Codes" ), list, (void**) NULL, + wxCHOICEDLG_STYLE & ~wxCANCEL ); + + dlg.ShowModal(); + + return 0; +} + + +int GERBVIEW_INSPECTION_TOOL::ShowSource( const TOOL_EVENT& aEvent ) +{ + int layer = m_frame->GetActiveLayer(); + GERBER_FILE_IMAGE* gerber_layer = m_frame->GetGbrImage( layer ); + + if( gerber_layer ) + { + wxString editorname = Pgm().GetEditorName(); + + if( !editorname.IsEmpty() ) + { + wxFileName fn( gerber_layer->m_FileName ); + + // Call the editor only if the Gerber/drill source file is available. + // This is not always the case, because it can be a temporary file + // if it comes from a zip archive. + if( !fn.FileExists() ) + { + wxString msg; + msg.Printf( _( "Source file \"%s\" is not available" ), + GetChars( fn.GetFullPath() ) ); + wxMessageBox( msg ); + } + else + ExecuteFile( m_frame, editorname, QuoteFullPath( fn ) ); + } + else + wxMessageBox( _( "No editor defined. Please select one" ) ); + } + else + { + wxString msg; + msg.Printf( _( "No file loaded on the active layer %d" ), layer + 1 ); + wxMessageBox( msg ); + } + + return 0; +} + + +int GERBVIEW_INSPECTION_TOOL::MeasureTool( const TOOL_EVENT& aEvent ) +{ + auto& view = *getView(); + auto& controls = *getViewControls(); + auto previous_settings = controls.GetSettings(); + + std::string tool = aEvent.GetCommandStr().get(); + m_frame->PushTool( tool ); + Activate(); + + KIGFX::PREVIEW::TWO_POINT_GEOMETRY_MANAGER twoPtMgr; + + EDA_UNITS units = m_frame->GetUserUnits(); + KIGFX::PREVIEW::RULER_ITEM ruler( twoPtMgr, units ); + + view.Add( &ruler ); + view.SetVisible( &ruler, false ); + + bool originSet = false; + + controls.ShowCursor( true ); + + auto setCursor = + [&]() + { + m_frame->GetCanvas()->SetCurrentCursor( KICURSOR::MEASURE ); + }; + + // Set initial cursor + setCursor(); + + while( TOOL_EVENT* evt = Wait() ) + { + setCursor(); + const VECTOR2I cursorPos = controls.GetCursorPosition(); + + auto clearRuler = + [&] () + { + view.SetVisible( &ruler, false ); + controls.SetAutoPan( false ); + controls.CaptureCursor( false ); + originSet = false; + }; + + if( evt->IsCancelInteractive() ) + { + if( originSet ) + { + clearRuler(); + } + else + { + m_frame->PopTool( tool ); + break; + } + } + + else if( evt->IsActivate() ) + { + if( originSet ) + clearRuler(); + + if( evt->IsMoveTool() ) + { + // leave ourselves on the stack so we come back after the move + break; + } + else + { + m_frame->PopTool( tool ); + break; + } + } + + // click or drag starts + else if( !originSet && ( evt->IsDrag( BUT_LEFT ) || evt->IsClick( BUT_LEFT ) ) ) + { + twoPtMgr.SetOrigin( cursorPos ); + twoPtMgr.SetEnd( cursorPos ); + + controls.CaptureCursor( true ); + controls.SetAutoPan( true ); + + originSet = true; + } + + // second click or mouse up after drag ends + else if( originSet && ( evt->IsClick( BUT_LEFT ) || evt->IsMouseUp( BUT_LEFT ) ) ) + { + originSet = false; + + controls.SetAutoPan( false ); + controls.CaptureCursor( false ); + } + + // move or drag when origin set updates rules + else if( originSet && ( evt->IsMotion() || evt->IsDrag( BUT_LEFT ) ) ) + { + twoPtMgr.SetAngleSnap( evt->Modifier( MD_CTRL ) ); + twoPtMgr.SetEnd( cursorPos ); + + view.SetVisible( &ruler, true ); + view.Update( &ruler, KIGFX::GEOMETRY ); + } + + else if( evt->IsAction( &ACTIONS::toggleUnits ) + || evt->IsAction( &ACTIONS::updateUnits ) ) + { + if( m_frame->GetUserUnits() != units ) + { + units = m_frame->GetUserUnits(); + ruler.SwitchUnits( units ); + view.Update( &ruler, KIGFX::GEOMETRY ); + } + } + + else if( evt->IsClick( BUT_RIGHT ) ) + { + m_menu.ShowContextMenu( m_frame->GetCurrentSelection() ); + } + + else + evt->SetPassEvent(); + } + + view.SetVisible( &ruler, false ); + view.Remove( &ruler ); + controls.ApplySettings( previous_settings ); + return 0; +} + + +void GERBVIEW_INSPECTION_TOOL::setTransitions() +{ + Go( &GERBVIEW_INSPECTION_TOOL::ShowSource, GERBVIEW_ACTIONS::showSource.MakeEvent() ); + Go( &GERBVIEW_INSPECTION_TOOL::ShowDCodes, GERBVIEW_ACTIONS::showDCodes.MakeEvent() ); + Go( &GERBVIEW_INSPECTION_TOOL::MeasureTool, ACTIONS::measureTool.MakeEvent() ); +} diff --git a/gerbview/tools/gerbview_inspection_tool.h b/gerbview/tools/gerbview_inspection_tool.h new file mode 100644 index 0000000000..7587b7aa19 --- /dev/null +++ b/gerbview/tools/gerbview_inspection_tool.h @@ -0,0 +1,55 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2017-2020 KiCad Developers, see AUTHORS.txt for contributors. + * + * 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 3 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, see . + */ + +#ifndef GERBVIEW_INSPECTION_TOOL_H +#define GERBVIEW_INSPECTION_TOOL_H + +#include +#include +#include + +class GERBVIEW_INSPECTION_TOOL : public TOOL_INTERACTIVE +{ +public: + GERBVIEW_INSPECTION_TOOL(); + ~GERBVIEW_INSPECTION_TOOL(); + + /// @copydoc TOOL_BASE::Init() + bool Init() override; + + /// @copydoc TOOL_BASE::Reset() + void Reset( RESET_REASON aReason ) override; + + ///> Launches a tool to measure between points + int MeasureTool( const TOOL_EVENT& aEvent ); + + ///> Show a list of the DCodes + int ShowDCodes( const TOOL_EVENT& aEvent ); + + ///> Show the source for the gerber file + int ShowSource( const TOOL_EVENT& aEvent ); + + ///> Sets up handlers for various events. + void setTransitions() override; + +private: + GERBVIEW_FRAME* m_frame; // Pointer to the parent frame. +}; + +#endif diff --git a/gerbview/tools/gerbview_selection_tool.cpp b/gerbview/tools/gerbview_selection_tool.cpp index dcab175960..cdcd25f1e5 100644 --- a/gerbview/tools/gerbview_selection_tool.cpp +++ b/gerbview/tools/gerbview_selection_tool.cpp @@ -312,7 +312,6 @@ void GERBVIEW_SELECTION_TOOL::setTransitions() Go( &GERBVIEW_SELECTION_TOOL::ClearSelection, GERBVIEW_ACTIONS::selectionClear.MakeEvent() ); Go( &GERBVIEW_SELECTION_TOOL::SelectItem, GERBVIEW_ACTIONS::selectItem.MakeEvent() ); Go( &GERBVIEW_SELECTION_TOOL::UnselectItem, GERBVIEW_ACTIONS::unselectItem.MakeEvent() ); - Go( &GERBVIEW_SELECTION_TOOL::MeasureTool, ACTIONS::measureTool.MakeEvent() ); } @@ -556,138 +555,3 @@ void GERBVIEW_SELECTION_TOOL::unselectVisually( EDA_ITEM* aItem ) getView()->Update( &m_selection ); } - - -int GERBVIEW_SELECTION_TOOL::MeasureTool( const TOOL_EVENT& aEvent ) -{ - auto& view = *getView(); - auto& controls = *getViewControls(); - auto previous_settings = controls.GetSettings(); - - std::string tool = aEvent.GetCommandStr().get(); - m_frame->PushTool( tool ); - Activate(); - - KIGFX::PREVIEW::TWO_POINT_GEOMETRY_MANAGER twoPtMgr; - - EDA_UNITS units = m_frame->GetUserUnits(); - KIGFX::PREVIEW::RULER_ITEM ruler( twoPtMgr, units ); - - view.Add( &ruler ); - view.SetVisible( &ruler, false ); - - bool originSet = false; - - controls.ShowCursor( true ); - - auto setCursor = - [&]() - { - m_frame->GetCanvas()->SetCurrentCursor( KICURSOR::MEASURE ); - }; - - // Set initial cursor - setCursor(); - - while( TOOL_EVENT* evt = Wait() ) - { - setCursor(); - const VECTOR2I cursorPos = controls.GetCursorPosition(); - - auto clearRuler = - [&] () - { - view.SetVisible( &ruler, false ); - controls.SetAutoPan( false ); - controls.CaptureCursor( false ); - originSet = false; - }; - - if( evt->IsCancelInteractive() ) - { - if( originSet ) - { - clearRuler(); - } - else - { - m_frame->PopTool( tool ); - break; - } - } - - else if( evt->IsActivate() ) - { - if( originSet ) - clearRuler(); - - if( evt->IsMoveTool() ) - { - // leave ourselves on the stack so we come back after the move - break; - } - else - { - m_frame->PopTool( tool ); - break; - } - } - - // click or drag starts - else if( !originSet && ( evt->IsDrag( BUT_LEFT ) || evt->IsClick( BUT_LEFT ) ) ) - { - twoPtMgr.SetOrigin( cursorPos ); - twoPtMgr.SetEnd( cursorPos ); - - controls.CaptureCursor( true ); - controls.SetAutoPan( true ); - - originSet = true; - } - - // second click or mouse up after drag ends - else if( originSet && ( evt->IsClick( BUT_LEFT ) || evt->IsMouseUp( BUT_LEFT ) ) ) - { - originSet = false; - - controls.SetAutoPan( false ); - controls.CaptureCursor( false ); - } - - // move or drag when origin set updates rules - else if( originSet && ( evt->IsMotion() || evt->IsDrag( BUT_LEFT ) ) ) - { - twoPtMgr.SetAngleSnap( evt->Modifier( MD_CTRL ) ); - twoPtMgr.SetEnd( cursorPos ); - - view.SetVisible( &ruler, true ); - view.Update( &ruler, KIGFX::GEOMETRY ); - } - - else if( evt->IsAction( &ACTIONS::toggleUnits ) - || evt->IsAction( &ACTIONS::updateUnits ) ) - { - if( m_frame->GetUserUnits() != units ) - { - units = m_frame->GetUserUnits(); - ruler.SwitchUnits( units ); - view.Update( &ruler, KIGFX::GEOMETRY ); - } - } - - else if( evt->IsClick( BUT_RIGHT ) ) - { - m_menu.ShowContextMenu( m_selection ); - } - - else - evt->SetPassEvent(); - } - - view.SetVisible( &ruler, false ); - view.Remove( &ruler ); - controls.ApplySettings( previous_settings ); - return 0; -} - - diff --git a/gerbview/tools/gerbview_selection_tool.h b/gerbview/tools/gerbview_selection_tool.h index 7153133961..94d5d7c3a3 100644 --- a/gerbview/tools/gerbview_selection_tool.h +++ b/gerbview/tools/gerbview_selection_tool.h @@ -81,9 +81,6 @@ public: int UnselectItem( const TOOL_EVENT& aEvent ); int UnselectItems( const TOOL_EVENT& aEvent ); - ///> Launches a tool to measure between points - int MeasureTool( const TOOL_EVENT& aEvent ); - ///> Sets up handlers for various events. void setTransitions() override;