From 3b379787bc19067acc205ebab2e3bd9171525537 Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Thu, 26 May 2016 09:50:49 +0200 Subject: [PATCH 1/3] Gerbview: move gerber_file_image_list to a separate file --- gerbview/CMakeLists.txt | 1 + gerbview/class_aperture_macro.cpp | 6 +- gerbview/class_aperture_macro.h | 2 +- gerbview/class_gbr_layer_box_selector.cpp | 2 +- gerbview/class_gbr_layout.cpp | 1 + gerbview/class_gerber_draw_item.cpp | 48 ++-- gerbview/class_gerber_draw_item.h | 6 +- gerbview/class_gerber_file_image.cpp | 199 --------------- gerbview/class_gerber_file_image.h | 74 +----- gerbview/class_gerber_file_image_list.cpp | 236 ++++++++++++++++++ gerbview/class_gerber_file_image_list.h | 126 ++++++++++ gerbview/class_gerbview_layer_widget.cpp | 2 +- .../dialogs/dialog_print_using_printer.cpp | 2 +- gerbview/events_called_functions.cpp | 1 + gerbview/excellon_read_drill_file.cpp | 1 + gerbview/export_to_pcbnew.cpp | 1 + gerbview/gerbview_frame.cpp | 1 + gerbview/init_gbr_drawlayers.cpp | 2 +- gerbview/onleftclick.cpp | 1 + gerbview/readgerb.cpp | 1 + gerbview/select_layers_to_pcb.cpp | 1 + gerbview/toolbars_gerber.cpp | 1 + 22 files changed, 408 insertions(+), 307 deletions(-) create mode 100644 gerbview/class_gerber_file_image_list.cpp create mode 100644 gerbview/class_gerber_file_image_list.h diff --git a/gerbview/CMakeLists.txt b/gerbview/CMakeLists.txt index 2b8f717977..9f7e144b1b 100644 --- a/gerbview/CMakeLists.txt +++ b/gerbview/CMakeLists.txt @@ -29,6 +29,7 @@ set( GERBVIEW_SRCS class_gbr_screen.cpp class_gbr_layout.cpp class_gerber_file_image.cpp + class_gerber_file_image_list.cpp class_gerber_draw_item.cpp class_gerbview_layer_widget.cpp class_gbr_layer_box_selector.cpp diff --git a/gerbview/class_aperture_macro.cpp b/gerbview/class_aperture_macro.cpp index dbfa39dcdd..7ff3e2550b 100644 --- a/gerbview/class_aperture_macro.cpp +++ b/gerbview/class_aperture_macro.cpp @@ -5,9 +5,9 @@ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 1992-2010 Jean-Pierre Charras + * Copyright (C) 1992-2016 Jean-Pierre Charras * Copyright (C) 2010 SoftPLC Corporation, Dick Hollenbeck - * Copyright (C) 1992-2010 KiCad Developers, see change_log.txt for contributors. + * Copyright (C) 1992-2016 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 @@ -108,7 +108,7 @@ bool AM_PRIMITIVE::mapExposure( GERBER_DRAW_ITEM* aParent ) break; } - return exposure ^ aParent->m_imageParams->m_ImageNegative; + return exposure ^ aParent->m_GerberImageFile->m_ImageNegative; } diff --git a/gerbview/class_aperture_macro.h b/gerbview/class_aperture_macro.h index 959a2546aa..4ce306d98a 100644 --- a/gerbview/class_aperture_macro.h +++ b/gerbview/class_aperture_macro.h @@ -10,7 +10,7 @@ * * Copyright (C) 1992-2010 Jean-Pierre Charras * Copyright (C) 2010 SoftPLC Corporation, Dick Hollenbeck - * Copyright (C) 1992-2010 KiCad Developers, see change_log.txt for contributors. + * Copyright (C) 1992-2010 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 diff --git a/gerbview/class_gbr_layer_box_selector.cpp b/gerbview/class_gbr_layer_box_selector.cpp index 2aabf715a0..99bbe630b0 100644 --- a/gerbview/class_gbr_layer_box_selector.cpp +++ b/gerbview/class_gbr_layer_box_selector.cpp @@ -32,7 +32,7 @@ #include #include #include -#include +#include #include diff --git a/gerbview/class_gbr_layout.cpp b/gerbview/class_gbr_layout.cpp index 9ba36b2be3..02dc710a61 100644 --- a/gerbview/class_gbr_layout.cpp +++ b/gerbview/class_gbr_layout.cpp @@ -34,6 +34,7 @@ #include #include #include +#include GBR_LAYOUT::GBR_LAYOUT() { diff --git a/gerbview/class_gerber_draw_item.cpp b/gerbview/class_gerber_draw_item.cpp index 1534498d61..77bf0fe116 100644 --- a/gerbview/class_gerber_draw_item.cpp +++ b/gerbview/class_gerber_draw_item.cpp @@ -38,10 +38,10 @@ #include -GERBER_DRAW_ITEM::GERBER_DRAW_ITEM( GBR_LAYOUT* aParent, GERBER_FILE_IMAGE* aGerberparams ) : +GERBER_DRAW_ITEM::GERBER_DRAW_ITEM( GBR_LAYOUT* aParent, GERBER_FILE_IMAGE* aGerberImageFile ) : EDA_ITEM( (EDA_ITEM*)aParent, TYPE_GERBER_DRAW_ITEM ) { - m_imageParams = aGerberparams; + m_GerberImageFile = aGerberImageFile; m_Layer = 0; m_Shape = GBR_SEGMENT; m_Flashed = false; @@ -53,7 +53,7 @@ GERBER_DRAW_ITEM::GERBER_DRAW_ITEM( GBR_LAYOUT* aParent, GERBER_FILE_IMAGE* aGer m_mirrorB = false; m_drawScale.x = m_drawScale.y = 1.0; m_lyrRotation = 0; - if( m_imageParams ) + if( m_GerberImageFile ) SetLayerParameters(); } @@ -62,7 +62,7 @@ GERBER_DRAW_ITEM::GERBER_DRAW_ITEM( GBR_LAYOUT* aParent, GERBER_FILE_IMAGE* aGer GERBER_DRAW_ITEM::GERBER_DRAW_ITEM( const GERBER_DRAW_ITEM& aSource ) : EDA_ITEM( aSource ) { - m_imageParams = aSource.m_imageParams; + m_GerberImageFile = aSource.m_GerberImageFile; m_Shape = aSource.m_Shape; m_Flags = aSource.m_Flags; @@ -105,15 +105,15 @@ wxPoint GERBER_DRAW_ITEM::GetABPosition( const wxPoint& aXYPosition ) const * For instance: Rotation must be made after or before mirroring ? * Note: if something is changed here, GetYXPosition must reflect changes */ - wxPoint abPos = aXYPosition + m_imageParams->m_ImageJustifyOffset; + wxPoint abPos = aXYPosition + m_GerberImageFile->m_ImageJustifyOffset; if( m_swapAxis ) std::swap( abPos.x, abPos.y ); - abPos += m_layerOffset + m_imageParams->m_ImageOffset; + abPos += m_layerOffset + m_GerberImageFile->m_ImageOffset; abPos.x = KiROUND( abPos.x * m_drawScale.x ); abPos.y = KiROUND( abPos.y * m_drawScale.y ); - double rotation = m_lyrRotation * 10 + m_imageParams->m_ImageRotation * 10; + double rotation = m_lyrRotation * 10 + m_GerberImageFile->m_ImageRotation * 10; if( rotation ) RotatePoint( &abPos, -rotation ); @@ -140,36 +140,36 @@ wxPoint GERBER_DRAW_ITEM::GetXYPosition( const wxPoint& aABPosition ) const if( !m_mirrorB ) xyPos.y = -xyPos.y; - double rotation = m_lyrRotation * 10 + m_imageParams->m_ImageRotation * 10; + double rotation = m_lyrRotation * 10 + m_GerberImageFile->m_ImageRotation * 10; if( rotation ) RotatePoint( &xyPos, rotation ); xyPos.x = KiROUND( xyPos.x / m_drawScale.x ); xyPos.y = KiROUND( xyPos.y / m_drawScale.y ); - xyPos -= m_layerOffset + m_imageParams->m_ImageOffset; + xyPos -= m_layerOffset + m_GerberImageFile->m_ImageOffset; if( m_swapAxis ) std::swap( xyPos.x, xyPos.y ); - return xyPos - m_imageParams->m_ImageJustifyOffset; + return xyPos - m_GerberImageFile->m_ImageJustifyOffset; } void GERBER_DRAW_ITEM::SetLayerParameters() { - m_UnitsMetric = m_imageParams->m_GerbMetric; - m_swapAxis = m_imageParams->m_SwapAxis; // false if A = X, B = Y; + m_UnitsMetric = m_GerberImageFile->m_GerbMetric; + m_swapAxis = m_GerberImageFile->m_SwapAxis; // false if A = X, B = Y; // true if A =Y, B = Y - m_mirrorA = m_imageParams->m_MirrorA; // true: mirror / axe A - m_mirrorB = m_imageParams->m_MirrorB; // true: mirror / axe B - m_drawScale = m_imageParams->m_Scale; // A and B scaling factor - m_layerOffset = m_imageParams->m_Offset; // Offset from OF command + m_mirrorA = m_GerberImageFile->m_MirrorA; // true: mirror / axe A + m_mirrorB = m_GerberImageFile->m_MirrorB; // true: mirror / axe B + m_drawScale = m_GerberImageFile->m_Scale; // A and B scaling factor + m_layerOffset = m_GerberImageFile->m_Offset; // Offset from OF command // Rotation from RO command: - m_lyrRotation = m_imageParams->m_LocalRotation; - m_LayerNegative = m_imageParams->GetLayerParams().m_LayerNegative; + m_lyrRotation = m_GerberImageFile->m_LocalRotation; + m_LayerNegative = m_GerberImageFile->GetLayerParams().m_LayerNegative; } @@ -223,14 +223,10 @@ D_CODE* GERBER_DRAW_ITEM::GetDcodeDescr() if( (m_DCode < FIRST_DCODE) || (m_DCode > LAST_DCODE) ) return NULL; - GERBER_FILE_IMAGE* gerber = g_GERBER_List.GetGbrImage( m_Layer ); - - if( gerber == NULL ) + if( m_GerberImageFile == NULL ) return NULL; - D_CODE* d_code = gerber->GetDCODE( m_DCode, false ); - - return d_code; + return m_GerberImageFile->GetDCODE( m_DCode, false ); } @@ -278,7 +274,7 @@ bool GERBER_DRAW_ITEM::Save( FILE* aFile ) const bool GERBER_DRAW_ITEM::HasNegativeItems() { - bool isClear = m_LayerNegative ^ m_imageParams->m_ImageNegative; + bool isClear = m_LayerNegative ^ m_GerberImageFile->m_ImageNegative; // if isClear is true, this item has negative shape // but if isClear is true, and if this item use an aperture macro definition, @@ -336,7 +332,7 @@ void GERBER_DRAW_ITEM::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, GR_DRAWMODE aDra * color other than the background color, else use the background color * when drawing so that an erasure happens. */ - bool isDark = !(m_LayerNegative ^ m_imageParams->m_ImageNegative); + bool isDark = !(m_LayerNegative ^ m_GerberImageFile->m_ImageNegative); if( !isDark ) { diff --git a/gerbview/class_gerber_draw_item.h b/gerbview/class_gerber_draw_item.h index d2058a718d..aff2b0c1aa 100644 --- a/gerbview/class_gerber_draw_item.h +++ b/gerbview/class_gerber_draw_item.h @@ -82,11 +82,11 @@ public: // 0 for items that do not use DCodes (polygons) // or when unknown and normal values are 10 to 999 // values 0 to 9 can be used for special purposes - GERBER_FILE_IMAGE* m_imageParams; /* main GERBER info for this item + GERBER_FILE_IMAGE* m_GerberImageFile; /* Gerber file image source of this item * Note: some params stored in this class are common * to the whole gerber file (i.e) the whole graphic - * layer and some can change when reaging the file, - * so they are stored inside this item there is no + * layer and some can change when reading the file, + * so they are stored inside this item if there is no * redundancy for these parameters */ private: diff --git a/gerbview/class_gerber_file_image.cpp b/gerbview/class_gerber_file_image.cpp index 3f513c7d96..d992c1e8e7 100644 --- a/gerbview/class_gerber_file_image.cpp +++ b/gerbview/class_gerber_file_image.cpp @@ -374,202 +374,3 @@ void GERBER_FILE_IMAGE::DisplayImageInfo( void ) (double) m_ImageJustifyOffset.y*2.54/1000 ); m_parent->AppendMsgPanel( _( "Image Justify Offset" ), msg, DARKRED ); } - -// GERBER_FILE_IMAGE_LIST is a helper class to handle a list of GERBER_FILE_IMAGE files -GERBER_FILE_IMAGE_LIST::GERBER_FILE_IMAGE_LIST() -{ - m_GERBER_List.reserve( GERBER_DRAWLAYERS_COUNT ); - - for( unsigned layer = 0; layer < GERBER_DRAWLAYERS_COUNT; ++layer ) - m_GERBER_List.push_back( NULL ); -} - -GERBER_FILE_IMAGE_LIST::~GERBER_FILE_IMAGE_LIST() -{ - ClearList(); - - for( unsigned layer = 0; layer < m_GERBER_List.size(); ++layer ) - { - delete m_GERBER_List[layer]; - m_GERBER_List[layer] = NULL; - } -} - -GERBER_FILE_IMAGE* GERBER_FILE_IMAGE_LIST::GetGbrImage( int aIdx ) -{ - if( (unsigned)aIdx < m_GERBER_List.size() ) - return m_GERBER_List[aIdx]; - - return NULL; -} - -/** - * creates a new, empty GERBER_FILE_IMAGE* at index aIdx - * or at the first free location if aIdx < 0 - * @param aIdx = the location to use ( 0 ... GERBER_DRAWLAYERS_COUNT-1 ) - * @return true if the index used, or -1 if no room to add image - */ -int GERBER_FILE_IMAGE_LIST::AddGbrImage( GERBER_FILE_IMAGE* aGbrImage, int aIdx ) -{ - int idx = aIdx; - - if( idx < 0 ) - { - for( idx = 0; idx < (int)m_GERBER_List.size(); idx++ ) - { - if( !IsUsed( idx ) ) - break; - } - } - - if( idx >= (int)m_GERBER_List.size() ) - return -1; // No room - - m_GERBER_List[idx] = aGbrImage; - - return idx; -} - - -// remove all loaded data in list, but do not delete empty images -// (can be reused) -void GERBER_FILE_IMAGE_LIST::ClearList() -{ - for( unsigned layer = 0; layer < m_GERBER_List.size(); ++layer ) - ClearImage( layer ); -} - -// remove the loaded data of image aIdx, but do not delete it -void GERBER_FILE_IMAGE_LIST::ClearImage( int aIdx ) -{ - if( aIdx >= 0 && aIdx < (int)m_GERBER_List.size() && m_GERBER_List[aIdx] ) - { - m_GERBER_List[aIdx]->InitToolTable(); - m_GERBER_List[aIdx]->ResetDefaultValues(); - m_GERBER_List[aIdx]->m_InUse = false; - } -} - -// Build a name for image aIdx which can be used in layers manager -const wxString GERBER_FILE_IMAGE_LIST::GetDisplayName( int aIdx ) -{ - wxString name; - - GERBER_FILE_IMAGE* gerber = NULL; - - if( aIdx >= 0 && aIdx < (int)m_GERBER_List.size() ) - gerber = m_GERBER_List[aIdx]; - - // if a file is loaded, build the name: - // if a X2 FileFunction info is found - // or (if no FileFunction info) - // * - if( gerber && IsUsed(aIdx ) ) - { - wxFileName fn( gerber->m_FileName ); - wxString filename = fn.GetFullName(); - - // if the filename is too long, display a shortened name: - const int maxlen = 30; - - if( filename.Length() > maxlen ) - { - wxString shortenedfn = filename.Left(2) + "..." + filename.Right(maxlen-5); - filename = shortenedfn; - } - - if( gerber->m_FileFunction ) - { - if( gerber->m_FileFunction->IsCopper() ) - { - name.Printf( "%d %s (%s, %s, %s)", aIdx + 1, - filename.GetData(), - GetChars( gerber->m_FileFunction->GetFileType() ), - GetChars( gerber->m_FileFunction->GetBrdLayerId() ), - GetChars( gerber->m_FileFunction->GetBrdLayerSide() ) ); - } - else - { - name.Printf( "%d %s (%s, %s)", aIdx + 1, - filename.GetData(), - GetChars( gerber->m_FileFunction->GetFileType() ), - GetChars( gerber->m_FileFunction->GetBrdLayerId() ) ); - } - } - else - name.Printf( _( "%d %s" ), aIdx + 1, filename.GetData() ); - } - else - name.Printf( _( "Graphic layer %d" ), aIdx + 1 ); - - return name; -} - -// return true if image is used (loaded and not cleared) -bool GERBER_FILE_IMAGE_LIST::IsUsed( int aIdx ) -{ - if( aIdx >= 0 && aIdx < (int)m_GERBER_List.size() ) - return m_GERBER_List[aIdx] != NULL && m_GERBER_List[aIdx]->m_InUse; - - return false; -} - -// Helper function, for std::sort. -// Sort loaded images by Z order priority, if they have the X2 FileFormat info -// returns true if the first argument (ref) is ordered before the second (test). -static bool sortZorder( const GERBER_FILE_IMAGE* const& ref, const GERBER_FILE_IMAGE* const& test ) -{ - if( !ref && !test ) - return false; // do not change order: no criteria to sort items - - if( !ref || !ref->m_InUse ) - return false; // Not used: ref ordered after - - if( !test || !test->m_InUse ) - return true; // Not used: ref ordered before - - if( !ref->m_FileFunction && !test->m_FileFunction ) - return false; // do not change order: no criteria to sort items - - if( !ref->m_FileFunction ) - return false; - - if( !test->m_FileFunction ) - return true; - - if( ref->m_FileFunction->GetZOrder() != test->m_FileFunction->GetZOrder() ) - return ref->m_FileFunction->GetZOrder() > test->m_FileFunction->GetZOrder(); - - return ref->m_FileFunction->GetZSubOrder() > test->m_FileFunction->GetZSubOrder(); -} - -void GERBER_FILE_IMAGE_LIST::SortImagesByZOrder( GERBER_DRAW_ITEM* aDrawList ) -{ - std::sort( m_GERBER_List.begin(), m_GERBER_List.end(), sortZorder ); - - // The image order has changed. - // Graphic layer numbering must be updated to match the widgets layer order - - // Store the old/new graphic layer info: - std::map tab_lyr; - - for( unsigned layer = 0; layer < m_GERBER_List.size(); ++layer ) - { - if( m_GERBER_List[layer] ) - { - tab_lyr[m_GERBER_List[layer]->m_GraphicLayer] = layer; - m_GERBER_List[layer]->m_GraphicLayer = layer ; - } - } - - // update the graphic layer in items to draw - for( GERBER_DRAW_ITEM* item = aDrawList; item; item = item->Next() ) - { - int layer = item->GetLayer(); - item->SetLayer( tab_lyr[layer] ); - } -} - - -// The global image list: -GERBER_FILE_IMAGE_LIST g_GERBER_List; diff --git a/gerbview/class_gerber_file_image.h b/gerbview/class_gerber_file_image.h index fbecaedaf7..fa1815f6df 100644 --- a/gerbview/class_gerber_file_image.h +++ b/gerbview/class_gerber_file_image.h @@ -22,8 +22,8 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ -#ifndef _CLASS_GERBER_H_ -#define _CLASS_GERBER_H_ +#ifndef CLASS_GERBER_FILE_IMAGE_H +#define CLASS_GERBER_FILE_IMAGE_H #include #include @@ -312,72 +312,4 @@ public: void DisplayImageInfo( void ); }; -/** - * @brief GERBER_FILE_IMAGE_LIST is a helper class to handle a list of GERBER_FILE_IMAGE files - * which are loaded and can be displayed - * there are 32 images max which can be loaded - */ -class GERBER_FILE_IMAGE_LIST -{ - // the list of loaded images (1 image = 1 gerber file) - std::vector m_GERBER_List; - -public: - GERBER_FILE_IMAGE_LIST(); - ~GERBER_FILE_IMAGE_LIST(); - - //Accessor - GERBER_FILE_IMAGE* GetGbrImage( int aIdx ); - - /** - * Add a GERBER_FILE_IMAGE* at index aIdx - * or at the first free location if aIdx < 0 - * @param aGbrImage = the image to add - * @param aIdx = the location to use ( 0 ... GERBER_DRAWLAYERS_COUNT-1 ) - * @return true if the index used, or -1 if no room to add image - */ - int AddGbrImage( GERBER_FILE_IMAGE* aGbrImage, int aIdx ); - - - /** - * remove all loaded data in list - */ - void ClearList(); - - /** - * remove the loaded data of image aIdx - * @param aIdx = the index ( 0 ... GERBER_DRAWLAYERS_COUNT-1 ) - */ - void ClearImage( int aIdx ); - - /** - * @return a name for image aIdx which can be used in layers manager - * and layer selector - * if a file is loaded, the name is: - * " if a X2 FileFunction info is found" - * or (if no FileFunction info) - * " *" - * if no file loaded, the name is: - * "Layer n" with n = aIdx+1 - * @param aIdx = the index ( 0 ... GERBER_DRAWLAYERS_COUNT-1 ) - */ - const wxString GetDisplayName( int aIdx ); - - /** - * @return true if image is used (loaded and with items) - * @param aIdx = the index ( 0 ... GERBER_DRAWLAYERS_COUNT-1 ) - */ - bool IsUsed( int aIdx ); - - /** - * Sort loaded images by Z order priority, if they have the X2 FileFormat info - * @param aDrawList: the draw list associated to the gerber images - * (SortImagesByZOrder updates the graphic layer of these items) - */ - void SortImagesByZOrder( GERBER_DRAW_ITEM* aDrawList ); -}; - - -extern GERBER_FILE_IMAGE_LIST g_GERBER_List; - -#endif // ifndef _CLASS_GERBER_H_ +#endif // ifndef CLASS_GERBER_FILE_IMAGE_H diff --git a/gerbview/class_gerber_file_image_list.cpp b/gerbview/class_gerber_file_image_list.cpp new file mode 100644 index 0000000000..b9dca26732 --- /dev/null +++ b/gerbview/class_gerber_file_image_list.cpp @@ -0,0 +1,236 @@ +/** + * @file class_gerber_file_image.cpp + * a GERBER class handle for a given layer info about used D_CODES and how the layer is drawn + */ + +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 1992-2016 Jean-Pierre Charras jp.charras at wanadoo.fr + * Copyright (C) 1992-2016 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 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 +#include +#include +#include + + +// GERBER_FILE_IMAGE_LIST is a helper class to handle a list of GERBER_FILE_IMAGE files +GERBER_FILE_IMAGE_LIST::GERBER_FILE_IMAGE_LIST() +{ + m_GERBER_List.reserve( GERBER_DRAWLAYERS_COUNT ); + + for( unsigned layer = 0; layer < GERBER_DRAWLAYERS_COUNT; ++layer ) + m_GERBER_List.push_back( NULL ); +} + +GERBER_FILE_IMAGE_LIST::~GERBER_FILE_IMAGE_LIST() +{ + ClearList(); + + for( unsigned layer = 0; layer < m_GERBER_List.size(); ++layer ) + { + delete m_GERBER_List[layer]; + m_GERBER_List[layer] = NULL; + } +} + +GERBER_FILE_IMAGE* GERBER_FILE_IMAGE_LIST::GetGbrImage( int aIdx ) +{ + if( (unsigned)aIdx < m_GERBER_List.size() ) + return m_GERBER_List[aIdx]; + + return NULL; +} + +/** + * creates a new, empty GERBER_FILE_IMAGE* at index aIdx + * or at the first free location if aIdx < 0 + * @param aIdx = the location to use ( 0 ... GERBER_DRAWLAYERS_COUNT-1 ) + * @return true if the index used, or -1 if no room to add image + */ +int GERBER_FILE_IMAGE_LIST::AddGbrImage( GERBER_FILE_IMAGE* aGbrImage, int aIdx ) +{ + int idx = aIdx; + + if( idx < 0 ) + { + for( idx = 0; idx < (int)m_GERBER_List.size(); idx++ ) + { + if( !IsUsed( idx ) ) + break; + } + } + + if( idx >= (int)m_GERBER_List.size() ) + return -1; // No room + + m_GERBER_List[idx] = aGbrImage; + + return idx; +} + + +// remove all loaded data in list, but do not delete empty images +// (can be reused) +void GERBER_FILE_IMAGE_LIST::ClearList() +{ + for( unsigned layer = 0; layer < m_GERBER_List.size(); ++layer ) + ClearImage( layer ); +} + +// remove the loaded data of image aIdx, but do not delete it +void GERBER_FILE_IMAGE_LIST::ClearImage( int aIdx ) +{ + if( aIdx >= 0 && aIdx < (int)m_GERBER_List.size() && m_GERBER_List[aIdx] ) + { + m_GERBER_List[aIdx]->InitToolTable(); + m_GERBER_List[aIdx]->ResetDefaultValues(); + m_GERBER_List[aIdx]->m_InUse = false; + } +} + +// Build a name for image aIdx which can be used in layers manager +const wxString GERBER_FILE_IMAGE_LIST::GetDisplayName( int aIdx ) +{ + wxString name; + + GERBER_FILE_IMAGE* gerber = NULL; + + if( aIdx >= 0 && aIdx < (int)m_GERBER_List.size() ) + gerber = m_GERBER_List[aIdx]; + + // if a file is loaded, build the name: + // if a X2 FileFunction info is found + // or (if no FileFunction info) + // * + if( gerber && IsUsed(aIdx ) ) + { + wxFileName fn( gerber->m_FileName ); + wxString filename = fn.GetFullName(); + + // if the filename is too long, display a shortened name: + const int maxlen = 30; + + if( filename.Length() > maxlen ) + { + wxString shortenedfn = filename.Left(2) + "..." + filename.Right(maxlen-5); + filename = shortenedfn; + } + + if( gerber->m_FileFunction ) + { + if( gerber->m_FileFunction->IsCopper() ) + { + name.Printf( "%d %s (%s, %s, %s)", aIdx + 1, + filename.GetData(), + GetChars( gerber->m_FileFunction->GetFileType() ), + GetChars( gerber->m_FileFunction->GetBrdLayerId() ), + GetChars( gerber->m_FileFunction->GetBrdLayerSide() ) ); + } + else + { + name.Printf( "%d %s (%s, %s)", aIdx + 1, + filename.GetData(), + GetChars( gerber->m_FileFunction->GetFileType() ), + GetChars( gerber->m_FileFunction->GetBrdLayerId() ) ); + } + } + else + name.Printf( _( "%d %s" ), aIdx + 1, filename.GetData() ); + } + else + name.Printf( _( "Graphic layer %d" ), aIdx + 1 ); + + return name; +} + +// return true if image is used (loaded and not cleared) +bool GERBER_FILE_IMAGE_LIST::IsUsed( int aIdx ) +{ + if( aIdx >= 0 && aIdx < (int)m_GERBER_List.size() ) + return m_GERBER_List[aIdx] != NULL && m_GERBER_List[aIdx]->m_InUse; + + return false; +} + +// Helper function, for std::sort. +// Sort loaded images by Z order priority, if they have the X2 FileFormat info +// returns true if the first argument (ref) is ordered before the second (test). +static bool sortZorder( const GERBER_FILE_IMAGE* const& ref, const GERBER_FILE_IMAGE* const& test ) +{ + if( !ref && !test ) + return false; // do not change order: no criteria to sort items + + if( !ref || !ref->m_InUse ) + return false; // Not used: ref ordered after + + if( !test || !test->m_InUse ) + return true; // Not used: ref ordered before + + if( !ref->m_FileFunction && !test->m_FileFunction ) + return false; // do not change order: no criteria to sort items + + if( !ref->m_FileFunction ) + return false; + + if( !test->m_FileFunction ) + return true; + + if( ref->m_FileFunction->GetZOrder() != test->m_FileFunction->GetZOrder() ) + return ref->m_FileFunction->GetZOrder() > test->m_FileFunction->GetZOrder(); + + return ref->m_FileFunction->GetZSubOrder() > test->m_FileFunction->GetZSubOrder(); +} + +void GERBER_FILE_IMAGE_LIST::SortImagesByZOrder( GERBER_DRAW_ITEM* aDrawList ) +{ + std::sort( m_GERBER_List.begin(), m_GERBER_List.end(), sortZorder ); + + // The image order has changed. + // Graphic layer numbering must be updated to match the widgets layer order + + // Store the old/new graphic layer info: + std::map tab_lyr; + + for( unsigned layer = 0; layer < m_GERBER_List.size(); ++layer ) + { + if( m_GERBER_List[layer] ) + { + tab_lyr[m_GERBER_List[layer]->m_GraphicLayer] = layer; + m_GERBER_List[layer]->m_GraphicLayer = layer ; + } + } + + // update the graphic layer in items to draw + for( GERBER_DRAW_ITEM* item = aDrawList; item; item = item->Next() ) + { + int layer = item->GetLayer(); + item->SetLayer( tab_lyr[layer] ); + } +} + + +// The global image list: +GERBER_FILE_IMAGE_LIST g_GERBER_List; diff --git a/gerbview/class_gerber_file_image_list.h b/gerbview/class_gerber_file_image_list.h new file mode 100644 index 0000000000..609a7af874 --- /dev/null +++ b/gerbview/class_gerber_file_image_list.h @@ -0,0 +1,126 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2010-2016 Jean-Pierre Charras jp.charras at wanadoo.fr + * Copyright (C) 1992-2016 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 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 + */ + +#ifndef CLASS_GERBER_FILE_IMAGE_LIST_H +#define CLASS_GERBER_FILE_IMAGE_LIST_H + +#include +#include + +//#include +#include +#include + +/* gerber files have different parameters to define units and how items must be plotted. + * some are for the entire file, and other can change along a file. + * In Gerber world: + * an image is the entire gerber file and its "global" parameters + * a layer (that is very different from a board layer) is just a sub set of a file that + * have specific parameters + * if a Image parameter is set more than once, only the last value is used + * Some parameters can change along a file and are not layer specific: they are stored + * in GERBER_ITEM items, when instancied. + * + * In GerbView, to handle these parameters, there are 2 classes: + * GERBER_FILE_IMAGE : the main class containing most of parameters and data to plot a graphic layer + * Some of them can change along the file + * There is one GERBER_FILE_IMAGE per file and one graphic layer per file or GERBER_FILE_IMAGE + * GerbView does not read and merge 2 gerber file in one graphic layer: + * I believe this is not possible due to the constraints in Image parameters. + * GERBER_LAYER : containing the subset of parameters that is layer speficic + * A GERBER_FILE_IMAGE must include one GERBER_LAYER to define all parameters to plot a file. + * But a GERBER_FILE_IMAGE can use more than one GERBER_LAYER. + */ + +class GERBER_FILE_IMAGE; + +/** + * @brief GERBER_FILE_IMAGE_LIST is a helper class to handle a list of GERBER_FILE_IMAGE files + * which are loaded and can be displayed + * there are 32 images max which can be loaded + */ +class GERBER_FILE_IMAGE_LIST +{ + // the list of loaded images (1 image = 1 gerber file) + std::vector m_GERBER_List; + +public: + GERBER_FILE_IMAGE_LIST(); + ~GERBER_FILE_IMAGE_LIST(); + + //Accessor + GERBER_FILE_IMAGE* GetGbrImage( int aIdx ); + + /** + * Add a GERBER_FILE_IMAGE* at index aIdx + * or at the first free location if aIdx < 0 + * @param aGbrImage = the image to add + * @param aIdx = the location to use ( 0 ... GERBER_DRAWLAYERS_COUNT-1 ) + * @return true if the index used, or -1 if no room to add image + */ + int AddGbrImage( GERBER_FILE_IMAGE* aGbrImage, int aIdx ); + + + /** + * remove all loaded data in list + */ + void ClearList(); + + /** + * remove the loaded data of image aIdx + * @param aIdx = the index ( 0 ... GERBER_DRAWLAYERS_COUNT-1 ) + */ + void ClearImage( int aIdx ); + + /** + * @return a name for image aIdx which can be used in layers manager + * and layer selector + * if a file is loaded, the name is: + * " if a X2 FileFunction info is found" + * or (if no FileFunction info) + * " *" + * if no file loaded, the name is: + * "Layer n" with n = aIdx+1 + * @param aIdx = the index ( 0 ... GERBER_DRAWLAYERS_COUNT-1 ) + */ + const wxString GetDisplayName( int aIdx ); + + /** + * @return true if image is used (loaded and with items) + * @param aIdx = the index ( 0 ... GERBER_DRAWLAYERS_COUNT-1 ) + */ + bool IsUsed( int aIdx ); + + /** + * Sort loaded images by Z order priority, if they have the X2 FileFormat info + * @param aDrawList: the draw list associated to the gerber images + * (SortImagesByZOrder updates the graphic layer of these items) + */ + void SortImagesByZOrder( GERBER_DRAW_ITEM* aDrawList ); +}; + + +extern GERBER_FILE_IMAGE_LIST g_GERBER_List; + +#endif // ifndef CLASS_GERBER_FILE_IMAGE_LIST_H diff --git a/gerbview/class_gerbview_layer_widget.cpp b/gerbview/class_gerbview_layer_widget.cpp index 28bdab5508..d2432fdc71 100644 --- a/gerbview/class_gerbview_layer_widget.cpp +++ b/gerbview/class_gerbview_layer_widget.cpp @@ -37,7 +37,7 @@ #include #include -#include +#include #include #include diff --git a/gerbview/dialogs/dialog_print_using_printer.cpp b/gerbview/dialogs/dialog_print_using_printer.cpp index 341832d861..8eb36b117f 100644 --- a/gerbview/dialogs/dialog_print_using_printer.cpp +++ b/gerbview/dialogs/dialog_print_using_printer.cpp @@ -34,7 +34,7 @@ #include #include -#include +#include #include static double s_ScaleList[] = diff --git a/gerbview/events_called_functions.cpp b/gerbview/events_called_functions.cpp index c7c80c8336..6c26366e6c 100644 --- a/gerbview/events_called_functions.cpp +++ b/gerbview/events_called_functions.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include diff --git a/gerbview/excellon_read_drill_file.cpp b/gerbview/excellon_read_drill_file.cpp index b368ff3c17..b6225e887b 100644 --- a/gerbview/excellon_read_drill_file.cpp +++ b/gerbview/excellon_read_drill_file.cpp @@ -69,6 +69,7 @@ #include #include #include +#include #include #include #include diff --git a/gerbview/export_to_pcbnew.cpp b/gerbview/export_to_pcbnew.cpp index 30e93a957c..ca29c523f3 100644 --- a/gerbview/export_to_pcbnew.cpp +++ b/gerbview/export_to_pcbnew.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include diff --git a/gerbview/gerbview_frame.cpp b/gerbview/gerbview_frame.cpp index d7c390105c..598499ec8d 100644 --- a/gerbview/gerbview_frame.cpp +++ b/gerbview/gerbview_frame.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include diff --git a/gerbview/init_gbr_drawlayers.cpp b/gerbview/init_gbr_drawlayers.cpp index 26c2acccba..1ef4b40d54 100644 --- a/gerbview/init_gbr_drawlayers.cpp +++ b/gerbview/init_gbr_drawlayers.cpp @@ -31,7 +31,7 @@ #include #include -#include +#include #include bool GERBVIEW_FRAME::Clear_DrawLayers( bool query ) diff --git a/gerbview/onleftclick.cpp b/gerbview/onleftclick.cpp index 2aa42dadea..9f8704aed7 100644 --- a/gerbview/onleftclick.cpp +++ b/gerbview/onleftclick.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include /* Process the command triggered by the left button of the mouse diff --git a/gerbview/readgerb.cpp b/gerbview/readgerb.cpp index 1fbb2e9cf7..789bffbcb9 100644 --- a/gerbview/readgerb.cpp +++ b/gerbview/readgerb.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include diff --git a/gerbview/select_layers_to_pcb.cpp b/gerbview/select_layers_to_pcb.cpp index a6faec0d1b..423bd53d1f 100644 --- a/gerbview/select_layers_to_pcb.cpp +++ b/gerbview/select_layers_to_pcb.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include diff --git a/gerbview/toolbars_gerber.cpp b/gerbview/toolbars_gerber.cpp index 833d1e8409..2cf936bbf6 100644 --- a/gerbview/toolbars_gerber.cpp +++ b/gerbview/toolbars_gerber.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include From 130c6e3639ca73ce56d77bae029ca4b31f705368 Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Thu, 26 May 2016 13:57:43 +0200 Subject: [PATCH 2/3] Gerbview: more code refactoring. --- gerbview/block.cpp | 20 +++-- gerbview/class_excellon.h | 1 + gerbview/class_gbr_layout.cpp | 14 ++- gerbview/class_gbr_layout.h | 2 - gerbview/class_gerber_draw_item.cpp | 19 ++-- gerbview/class_gerber_draw_item.h | 28 ++---- gerbview/class_gerber_file_image.cpp | 6 +- gerbview/class_gerber_file_image.h | 2 + gerbview/class_gerber_file_image_list.cpp | 19 ++-- gerbview/class_gerber_file_image_list.h | 3 +- gerbview/class_gerbview_layer_widget.cpp | 2 +- gerbview/draw_gerber_screen.cpp | 100 ++++++++++++---------- gerbview/excellon_read_drill_file.cpp | 17 ++-- gerbview/export_to_pcbnew.cpp | 32 ++++--- gerbview/gerbview_frame.cpp | 9 +- gerbview/gerbview_frame.h | 10 --- gerbview/init_gbr_drawlayers.cpp | 25 +++--- gerbview/locate.cpp | 43 ++++++---- gerbview/rs274d.cpp | 67 ++++++--------- gerbview/rs274x.cpp | 5 +- 20 files changed, 216 insertions(+), 208 deletions(-) diff --git a/gerbview/block.cpp b/gerbview/block.cpp index 6e123dba11..0464792f60 100644 --- a/gerbview/block.cpp +++ b/gerbview/block.cpp @@ -33,6 +33,8 @@ #include #include #include +#include +#include static void DrawMovingBlockOutlines( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition, @@ -200,13 +202,21 @@ void GERBVIEW_FRAME::Block_Move( wxDC* DC ) /* Calculate displacement vectors. */ delta = GetScreen()->m_BlockLocate.GetMoveVector(); - /* Move items in block */ - for( GERBER_DRAW_ITEM* item = GetItemsList(); item; item = item->Next() ) + for( int layer = 0; layer < GERBER_DRAWLAYERS_COUNT; ++layer ) { - GERBER_DRAW_ITEM* gerb_item = item; + GERBER_FILE_IMAGE* gerber = g_GERBER_List.GetGbrImage( layer ); - if( gerb_item->HitTest( GetScreen()->m_BlockLocate ) ) - gerb_item->MoveAB( delta ); + if( gerber == NULL ) // Graphic layer not yet used + continue; + + /* Move items in block */ + for( GERBER_DRAW_ITEM* item = gerber->GetItemsList(); item; item = item->Next() ) + { + GERBER_DRAW_ITEM* gerb_item = item; + + if( gerb_item->HitTest( GetScreen()->m_BlockLocate ) ) + gerb_item->MoveAB( delta ); + } } m_canvas->Refresh( true ); diff --git a/gerbview/class_excellon.h b/gerbview/class_excellon.h index bdaa7e70db..b92a55e4d5 100644 --- a/gerbview/class_excellon.h +++ b/gerbview/class_excellon.h @@ -93,6 +93,7 @@ private: READ_HEADER_STATE, // When we are in this state, we are reading header READ_PROGRAM_STATE // When we are in this state, we are reading drill data }; + excellon_state m_State; // state of excellon file analysis bool m_SlotOn; // true during an oblong drill definition diff --git a/gerbview/class_gbr_layout.cpp b/gerbview/class_gbr_layout.cpp index 02dc710a61..ec37457376 100644 --- a/gerbview/class_gbr_layout.cpp +++ b/gerbview/class_gbr_layout.cpp @@ -51,8 +51,16 @@ EDA_RECT GBR_LAYOUT::ComputeBoundingBox() { EDA_RECT bbox; - for( GERBER_DRAW_ITEM* gerb_item = m_Drawings; gerb_item; gerb_item = gerb_item->Next() ) - bbox.Merge( gerb_item->GetBoundingBox() ); + for( int layer = 0; layer < GERBER_DRAWLAYERS_COUNT; ++layer ) + { + GERBER_FILE_IMAGE* gerber = g_GERBER_List.GetGbrImage( layer ); + + if( gerber == NULL ) // Graphic layer not yet used + continue; + + for( GERBER_DRAW_ITEM* item = gerber->GetItemsList(); item; item = item->Next() ) + bbox.Merge( item->GetBoundingBox() ); + } SetBoundingBox( bbox ); return bbox; @@ -232,7 +240,7 @@ void GBR_LAYOUT::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, GR_DRAWMODE aDrawMode, // Now we can draw the current layer to the bitmap buffer // When needed, the previous bitmap is already copied to the screen buffer. - for( GERBER_DRAW_ITEM* item = gerbFrame->GetItemsList(); item; item = item->Next() ) + for( GERBER_DRAW_ITEM* item = gerber->GetItemsList(); item; item = item->Next() ) { if( item->GetLayer() != layer ) continue; diff --git a/gerbview/class_gbr_layout.h b/gerbview/class_gbr_layout.h index e5610ecd41..120e2f8538 100644 --- a/gerbview/class_gbr_layout.h +++ b/gerbview/class_gbr_layout.h @@ -55,8 +55,6 @@ private: std::bitset m_printLayersMask; // When printing: the list of layers to print public: - DLIST m_Drawings; // linked list of Gerber Items to draw - GBR_LAYOUT(); ~GBR_LAYOUT(); diff --git a/gerbview/class_gerber_draw_item.cpp b/gerbview/class_gerber_draw_item.cpp index 77bf0fe116..f6aafba0a7 100644 --- a/gerbview/class_gerber_draw_item.cpp +++ b/gerbview/class_gerber_draw_item.cpp @@ -1,8 +1,8 @@ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 1992-2010 - * Copyright (C) 1992-2010 KiCad Developers, see change_log.txt for contributors. + * Copyright (C) 1992-2016 + * Copyright (C) 1992-2016 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 @@ -38,11 +38,10 @@ #include -GERBER_DRAW_ITEM::GERBER_DRAW_ITEM( GBR_LAYOUT* aParent, GERBER_FILE_IMAGE* aGerberImageFile ) : - EDA_ITEM( (EDA_ITEM*)aParent, TYPE_GERBER_DRAW_ITEM ) +GERBER_DRAW_ITEM::GERBER_DRAW_ITEM( GERBER_FILE_IMAGE* aGerberImageFile ) : + EDA_ITEM( (EDA_ITEM*)NULL, TYPE_GERBER_DRAW_ITEM ) { m_GerberImageFile = aGerberImageFile; - m_Layer = 0; m_Shape = GBR_SEGMENT; m_Flashed = false; m_DCode = 0; @@ -72,7 +71,6 @@ GERBER_DRAW_ITEM::GERBER_DRAW_ITEM( const GERBER_DRAW_ITEM& aSource ) : m_Start = aSource.m_Start; m_End = aSource.m_End; m_Size = aSource.m_Size; - m_Layer = aSource.m_Layer; m_Shape = aSource.m_Shape; m_Flashed = aSource.m_Flashed; m_DCode = aSource.m_DCode; @@ -99,6 +97,13 @@ GERBER_DRAW_ITEM* GERBER_DRAW_ITEM::Copy() const } +int GERBER_DRAW_ITEM::GetLayer() const +{ + // returns the layer this item is on, or 0 if the m_GerberImageFile is NULL. + return m_GerberImageFile ? m_GerberImageFile->m_GraphicLayer : 0; +} + + wxPoint GERBER_DRAW_ITEM::GetABPosition( const wxPoint& aXYPosition ) const { /* Note: RS274Xrevd_e is obscure about the order of transforms: @@ -612,7 +617,7 @@ void GERBER_DRAW_ITEM::Show( int nestLevel, std::ostream& os ) const " shape=\"" << m_Shape << '"' << " addr=\"" << std::hex << this << std::dec << '"' << - " layer=\"" << m_Layer << '"' << + " layer=\"" << GetLayer() << '"' << " size=\"" << m_Size << '"' << " flags=\"" << m_Flags << '"' << " status=\"" << GetStatus() << '"' << diff --git a/gerbview/class_gerber_draw_item.h b/gerbview/class_gerber_draw_item.h index aff2b0c1aa..7618c14de9 100644 --- a/gerbview/class_gerber_draw_item.h +++ b/gerbview/class_gerber_draw_item.h @@ -1,8 +1,8 @@ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 1992-2010 - * Copyright (C) 1992-2010 KiCad Developers, see change_log.txt for contributors. + * Copyright (C) 1992-2016 + * Copyright (C) 1992-2016 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 @@ -90,8 +90,6 @@ public: * redundancy for these parameters */ private: - int m_Layer; - // These values are used to draw this item, according to gerber layers parameters // Because they can change inside a gerber image, they are stored here // for each item @@ -104,7 +102,7 @@ private: double m_lyrRotation; // Fine rotation, from OR parameter, in degrees public: - GERBER_DRAW_ITEM( GBR_LAYOUT* aParent, GERBER_FILE_IMAGE* aGerberparams ); + GERBER_DRAW_ITEM( GERBER_FILE_IMAGE* aGerberparams ); GERBER_DRAW_ITEM( const GERBER_DRAW_ITEM& aSource ); ~GERBER_DRAW_ITEM(); @@ -123,16 +121,7 @@ public: * Function GetLayer * returns the layer this item is on. */ - int GetLayer() const { return m_Layer; } - - /** - * Function SetLayer - * sets the layer this item is on. - * @param aLayer The layer number. - * is virtual because some items (in fact: class DIMENSION) - * have a slightly different initialization - */ - void SetLayer( int aLayer ) { m_Layer = aLayer; } + int GetLayer() const; bool GetLayerPolarity() { @@ -216,10 +205,8 @@ public: const EDA_RECT GetBoundingBox() const; // Virtual /* Display on screen: */ - void Draw( EDA_DRAW_PANEL* aPanel, - wxDC* aDC, - GR_DRAWMODE aDrawMode, - const wxPoint&aOffset ); + void Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, + GR_DRAWMODE aDrawMode, const wxPoint&aOffset ); /** * Function ConvertSegmentToPolygon @@ -233,8 +220,7 @@ public: * Function DrawGbrPoly * a helper function used to draw the polygon stored in m_PolyCorners */ - void DrawGbrPoly( EDA_RECT* aClipBox, - wxDC* aDC, EDA_COLOR_T aColor, + void DrawGbrPoly( EDA_RECT* aClipBox, wxDC* aDC, EDA_COLOR_T aColor, const wxPoint& aOffset, bool aFilledShape ); /* divers */ diff --git a/gerbview/class_gerber_file_image.cpp b/gerbview/class_gerber_file_image.cpp index d992c1e8e7..48b795037b 100644 --- a/gerbview/class_gerber_file_image.cpp +++ b/gerbview/class_gerber_file_image.cpp @@ -89,7 +89,7 @@ void GERBER_LAYER::ResetDefaultValues() GERBER_FILE_IMAGE::GERBER_FILE_IMAGE( GERBVIEW_FRAME* aParent, int aLayer ) { - //m_parent = aParent; + m_parent = aParent; m_GraphicLayer = aLayer; // Graphic layer Number m_Selected_Tool = FIRST_DCODE; @@ -118,7 +118,7 @@ GERBER_FILE_IMAGE::~GERBER_FILE_IMAGE() */ GERBER_DRAW_ITEM * GERBER_FILE_IMAGE::GetItemsList() { - return m_parent->GetItemsList(); + return m_Drawings; } D_CODE* GERBER_FILE_IMAGE::GetDCODE( int aDCODE, bool aCreateIfNoExist ) @@ -323,7 +323,7 @@ void GERBER_FILE_IMAGE::StepAndRepeatItem( const GERBER_DRAW_ITEM& aItem ) move_vector.y = scaletoIU( jj * GetLayerParams().m_StepForRepeat.y, GetLayerParams().m_StepForRepeatMetric ); dupItem->MoveXY( move_vector ); - m_parent->GetGerberLayout()->m_Drawings.Append( dupItem ); + m_Drawings.Append( dupItem ); } } } diff --git a/gerbview/class_gerber_file_image.h b/gerbview/class_gerber_file_image.h index fa1815f6df..7adf09a09a 100644 --- a/gerbview/class_gerber_file_image.h +++ b/gerbview/class_gerber_file_image.h @@ -101,6 +101,8 @@ class GERBER_FILE_IMAGE GERBER_LAYER m_GBRLayerParams; // hold params for the current gerber layer public: + DLIST m_Drawings; // linked list of Gerber Items to draw + bool m_InUse; // true if this image is currently in use // (a file is loaded in it) wxString m_FileName; // Full File Name for this layer diff --git a/gerbview/class_gerber_file_image_list.cpp b/gerbview/class_gerber_file_image_list.cpp index b9dca26732..df129b99b0 100644 --- a/gerbview/class_gerber_file_image_list.cpp +++ b/gerbview/class_gerber_file_image_list.cpp @@ -204,7 +204,7 @@ static bool sortZorder( const GERBER_FILE_IMAGE* const& ref, const GERBER_FILE_I return ref->m_FileFunction->GetZSubOrder() > test->m_FileFunction->GetZSubOrder(); } -void GERBER_FILE_IMAGE_LIST::SortImagesByZOrder( GERBER_DRAW_ITEM* aDrawList ) +void GERBER_FILE_IMAGE_LIST::SortImagesByZOrder() { std::sort( m_GERBER_List.begin(), m_GERBER_List.end(), sortZorder ); @@ -216,18 +216,13 @@ void GERBER_FILE_IMAGE_LIST::SortImagesByZOrder( GERBER_DRAW_ITEM* aDrawList ) for( unsigned layer = 0; layer < m_GERBER_List.size(); ++layer ) { - if( m_GERBER_List[layer] ) - { - tab_lyr[m_GERBER_List[layer]->m_GraphicLayer] = layer; - m_GERBER_List[layer]->m_GraphicLayer = layer ; - } - } + GERBER_FILE_IMAGE* gerber = m_GERBER_List[layer]; - // update the graphic layer in items to draw - for( GERBER_DRAW_ITEM* item = aDrawList; item; item = item->Next() ) - { - int layer = item->GetLayer(); - item->SetLayer( tab_lyr[layer] ); + if( !gerber ) + continue; + + tab_lyr[gerber->m_GraphicLayer] = layer; + gerber->m_GraphicLayer = layer ; } } diff --git a/gerbview/class_gerber_file_image_list.h b/gerbview/class_gerber_file_image_list.h index 609a7af874..f6c5e5b6fb 100644 --- a/gerbview/class_gerber_file_image_list.h +++ b/gerbview/class_gerber_file_image_list.h @@ -114,10 +114,9 @@ public: /** * Sort loaded images by Z order priority, if they have the X2 FileFormat info - * @param aDrawList: the draw list associated to the gerber images * (SortImagesByZOrder updates the graphic layer of these items) */ - void SortImagesByZOrder( GERBER_DRAW_ITEM* aDrawList ); + void SortImagesByZOrder(); }; diff --git a/gerbview/class_gerbview_layer_widget.cpp b/gerbview/class_gerbview_layer_widget.cpp index d2432fdc71..4fbd972887 100644 --- a/gerbview/class_gerbview_layer_widget.cpp +++ b/gerbview/class_gerbview_layer_widget.cpp @@ -208,7 +208,7 @@ void GERBER_LAYER_WIDGET::onPopupSelection( wxCommandEvent& event ) break; case ID_SORT_GBR_LAYERS: - g_GERBER_List.SortImagesByZOrder( myframe->GetItemsList() ); + g_GERBER_List.SortImagesByZOrder(); myframe->ReFillLayerWidget(); myframe->syncLayerBox( true ); myframe->GetCanvas()->Refresh(); diff --git a/gerbview/draw_gerber_screen.cpp b/gerbview/draw_gerber_screen.cpp index 2e3f817006..67ca40ea13 100644 --- a/gerbview/draw_gerber_screen.cpp +++ b/gerbview/draw_gerber_screen.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include @@ -157,57 +158,66 @@ void GERBVIEW_FRAME::DrawItemsDCodeID( wxDC* aDC, GR_DRAWMODE aDrawMode ) GRSetDrawMode( aDC, aDrawMode ); - for( GERBER_DRAW_ITEM* item = GetItemsList(); item != NULL; item = item->Next() ) + for( int layer = 0; layer < GERBER_DRAWLAYERS_COUNT; ++layer ) { - if( IsLayerVisible( item->GetLayer() ) == false ) + GERBER_FILE_IMAGE* gerber = g_GERBER_List.GetGbrImage( layer ); + + if( gerber == NULL ) // Graphic layer not yet used continue; - if( item->m_DCode <= 0 ) + if( IsLayerVisible( layer ) == false ) continue; - if( item->m_Flashed || item->m_Shape == GBR_ARC ) + for( GERBER_DRAW_ITEM* item = gerber->GetItemsList(); item != NULL; item = item->Next() ) { - pos = item->m_Start; + + if( item->m_DCode <= 0 ) + continue; + + if( item->m_Flashed || item->m_Shape == GBR_ARC ) + { + pos = item->m_Start; + } + else + { + pos.x = (item->m_Start.x + item->m_End.x) / 2; + pos.y = (item->m_Start.y + item->m_End.y) / 2; + } + + pos = item->GetABPosition( pos ); + + Line.Printf( wxT( "D%d" ), item->m_DCode ); + + if( item->GetDcodeDescr() ) + width = item->GetDcodeDescr()->GetShapeDim( item ); + else + width = std::min( item->m_Size.x, item->m_Size.y ); + + orient = TEXT_ORIENT_HORIZ; + + if( item->m_Flashed ) + { + // A reasonable size for text is width/3 because most of time this text has 3 chars. + width /= 3; + } + else // this item is a line + { + wxPoint delta = item->m_Start - item->m_End; + + if( abs( delta.x ) < abs( delta.y ) ) + orient = TEXT_ORIENT_VERT; + + // A reasonable size for text is width/2 because text needs margin below and above it. + // a margin = width/4 seems good + width /= 2; + } + + int color = GetVisibleElementColor( DCODES_VISIBLE ); + + DrawGraphicText( m_canvas->GetClipBox(), aDC, pos, (EDA_COLOR_T) color, Line, + orient, wxSize( width, width ), + GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER, + 0, false, false ); } - else - { - pos.x = (item->m_Start.x + item->m_End.x) / 2; - pos.y = (item->m_Start.y + item->m_End.y) / 2; - } - - pos = item->GetABPosition( pos ); - - Line.Printf( wxT( "D%d" ), item->m_DCode ); - - if( item->GetDcodeDescr() ) - width = item->GetDcodeDescr()->GetShapeDim( item ); - else - width = std::min( item->m_Size.x, item->m_Size.y ); - - orient = TEXT_ORIENT_HORIZ; - - if( item->m_Flashed ) - { - // A reasonable size for text is width/3 because most of time this text has 3 chars. - width /= 3; - } - else // this item is a line - { - wxPoint delta = item->m_Start - item->m_End; - - if( abs( delta.x ) < abs( delta.y ) ) - orient = TEXT_ORIENT_VERT; - - // A reasonable size for text is width/2 because text needs margin below and above it. - // a margin = width/4 seems good - width /= 2; - } - - int color = GetVisibleElementColor( DCODES_VISIBLE ); - - DrawGraphicText( m_canvas->GetClipBox(), aDC, pos, (EDA_COLOR_T) color, Line, - orient, wxSize( width, width ), - GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER, - 0, false, false ); } } diff --git a/gerbview/excellon_read_drill_file.cpp b/gerbview/excellon_read_drill_file.cpp index b6225e887b..c92ccaf35d 100644 --- a/gerbview/excellon_read_drill_file.cpp +++ b/gerbview/excellon_read_drill_file.cpp @@ -88,16 +88,16 @@ static const int fmtIntegerInch = 2; extern int ReadInt( char*& text, bool aSkipSeparator = true ); extern double ReadDouble( char*& text, bool aSkipSeparator = true ); + +// See ds274d.cpp: extern void fillFlashedGBRITEM( GERBER_DRAW_ITEM* aGbrItem, APERTURE_T aAperture, int Dcode_index, - int aLayer, const wxPoint& aPos, wxSize aSize, bool aLayerNegative ); void fillLineGBRITEM( GERBER_DRAW_ITEM* aGbrItem, int Dcode_index, - int aLayer, const wxPoint& aStart, const wxPoint& aEnd, wxSize aPenSize, @@ -548,22 +548,19 @@ bool EXCELLON_IMAGE::Execute_Drill_Command( char*& text ) return false; } - gbritem = new GERBER_DRAW_ITEM( GetParent()->GetGerberLayout(), this ); - GetParent()->GetGerberLayout()->m_Drawings.Append( gbritem ); + gbritem = new GERBER_DRAW_ITEM( this ); + m_Drawings.Append( gbritem ); if( m_SlotOn ) // Oval hole { - fillLineGBRITEM( gbritem, - tool->m_Num_Dcode, GetParent()->getActiveLayer(), + fillLineGBRITEM( gbritem, tool->m_Num_Dcode, m_PreviousPos, m_CurrentPos, tool->m_Size, false ); } else { - fillFlashedGBRITEM( gbritem, tool->m_Shape, - tool->m_Num_Dcode, GetParent()->getActiveLayer(), - m_CurrentPos, - tool->m_Size, false ); + fillFlashedGBRITEM( gbritem, tool->m_Shape, tool->m_Num_Dcode, + m_CurrentPos, tool->m_Size, false ); } StepAndRepeatItem( *gbritem ); diff --git a/gerbview/export_to_pcbnew.cpp b/gerbview/export_to_pcbnew.cpp index ca29c523f3..d9611fb541 100644 --- a/gerbview/export_to_pcbnew.cpp +++ b/gerbview/export_to_pcbnew.cpp @@ -220,33 +220,45 @@ bool GBR_TO_PCB_EXPORTER::ExportPcb( LAYER_NUM* aLayerLookUpTable, int aCopperLa // create an image of gerber data // First: non copper layers: - GERBER_DRAW_ITEM* gerb_item = m_gerbview_frame->GetItemsList(); - int pcbCopperLayerMax = 31; + const int pcbCopperLayerMax = 31; - for( ; gerb_item; gerb_item = gerb_item->Next() ) + for( int layer = 0; layer < GERBER_DRAWLAYERS_COUNT; ++layer ) { - int layer = gerb_item->GetLayer(); + GERBER_FILE_IMAGE* gerber = g_GERBER_List.GetGbrImage( layer ); + + if( gerber == NULL ) // Graphic layer not yet used + continue; + LAYER_NUM pcb_layer_number = aLayerLookUpTable[layer]; if( !IsPcbLayer( pcb_layer_number ) ) continue; - if( pcb_layer_number > pcbCopperLayerMax ) + if( pcb_layer_number <= pcbCopperLayerMax ) // copper layer + continue; + + GERBER_DRAW_ITEM* gerb_item = gerber->GetItemsList(); + + for( ; gerb_item; gerb_item = gerb_item->Next() ) export_non_copper_item( gerb_item, pcb_layer_number ); } // Copper layers - gerb_item = m_gerbview_frame->GetItemsList(); - - for( ; gerb_item; gerb_item = gerb_item->Next() ) + for( int layer = 0; layer < GERBER_DRAWLAYERS_COUNT; ++layer ) { - int layer = gerb_item->GetLayer(); + GERBER_FILE_IMAGE* gerber = g_GERBER_List.GetGbrImage( layer ); + + if( gerber == NULL ) // Graphic layer not yet used + continue; + LAYER_NUM pcb_layer_number = aLayerLookUpTable[layer]; if( pcb_layer_number < 0 || pcb_layer_number > pcbCopperLayerMax ) continue; - else + GERBER_DRAW_ITEM* gerb_item = gerber->GetItemsList(); + + for( ; gerb_item; gerb_item = gerb_item->Next() ) export_copper_item( gerb_item, pcb_layer_number ); } diff --git a/gerbview/gerbview_frame.cpp b/gerbview/gerbview_frame.cpp index 598499ec8d..2886318920 100644 --- a/gerbview/gerbview_frame.cpp +++ b/gerbview/gerbview_frame.cpp @@ -228,14 +228,13 @@ bool GERBVIEW_FRAME::OpenProjectFiles( const std::vector& aFileSet, in double GERBVIEW_FRAME::BestZoom() { - GERBER_DRAW_ITEM* item = GetGerberLayout()->m_Drawings; - - // gives a minimal value to zoom, if no item in list - if( item == NULL ) - return ZOOM_FACTOR( 350.0 ); EDA_RECT bbox = GetGerberLayout()->ComputeBoundingBox(); + // gives a minimal value to zoom, if no item in list + if( bbox.GetWidth() == 0 || bbox.GetHeight() == 0 ) + return ZOOM_FACTOR( 200.0 ); + wxSize size = m_canvas->GetClientSize(); double x = (double) bbox.GetWidth() / (double) size.x; diff --git a/gerbview/gerbview_frame.h b/gerbview/gerbview_frame.h index 186498ea83..3234341d62 100644 --- a/gerbview/gerbview_frame.h +++ b/gerbview/gerbview_frame.h @@ -110,16 +110,6 @@ public: return m_gerberLayout; } - /** - * Function GetItemsList - * @return the first GERBER_DRAW_ITEM * item of the items list - */ - GERBER_DRAW_ITEM* GetItemsList() - { - GERBER_DRAW_ITEM* item = GetGerberLayout()->m_Drawings; - - return item; - } /** * Function GetGerberLayoutBoundingBox diff --git a/gerbview/init_gbr_drawlayers.cpp b/gerbview/init_gbr_drawlayers.cpp index 1ef4b40d54..be33329f7e 100644 --- a/gerbview/init_gbr_drawlayers.cpp +++ b/gerbview/init_gbr_drawlayers.cpp @@ -31,6 +31,7 @@ #include #include +#include #include #include @@ -45,7 +46,15 @@ bool GERBVIEW_FRAME::Clear_DrawLayers( bool query ) return false; } - GetGerberLayout()->m_Drawings.DeleteAll(); + for( int layer = 0; layer < GERBER_DRAWLAYERS_COUNT; ++layer ) + { + GERBER_FILE_IMAGE* gerber = g_GERBER_List.GetGbrImage( layer ); + + if( gerber == NULL ) // Graphic layer not yet used + continue; + + gerber->m_Drawings.DeleteAll(); + } g_GERBER_List.ClearList(); @@ -72,18 +81,10 @@ void GERBVIEW_FRAME::Erase_Current_DrawLayer( bool query ) SetCurItem( NULL ); - GERBER_DRAW_ITEM* item = GetGerberLayout()->m_Drawings; - GERBER_DRAW_ITEM * next; + GERBER_FILE_IMAGE* gerber = g_GERBER_List.GetGbrImage( layer ); - for( ; item; item = next ) - { - next = item->Next(); - - if( item->GetLayer() != layer ) - continue; - - item->DeleteStructure(); - } + if( gerber ) // gerber == NULL should not occur + gerber->m_Drawings.DeleteAll(); g_GERBER_List.ClearImage( layer ); diff --git a/gerbview/locate.cpp b/gerbview/locate.cpp index 1d1e2d9d4c..e357b1e055 100644 --- a/gerbview/locate.cpp +++ b/gerbview/locate.cpp @@ -32,9 +32,11 @@ #include #include +#include +#include -/* localize a gerber item and return a pointer to it. +/* locate a gerber item and return a pointer to it. * Display info about this item */ GERBER_DRAW_ITEM* GERBVIEW_FRAME::Locate( const wxPoint& aPosition, int aTypeloc ) @@ -47,25 +49,14 @@ GERBER_DRAW_ITEM* GERBVIEW_FRAME::Locate( const wxPoint& aPosition, int aTypeloc ref = GetNearestGridPosition( ref ); int layer = getActiveLayer(); + GERBER_FILE_IMAGE* gerber = g_GERBER_List.GetGbrImage( layer ); // Search first on active layer - GERBER_DRAW_ITEM* gerb_item = GetItemsList(); + GERBER_DRAW_ITEM* gerb_item; - for( ; gerb_item; gerb_item = gerb_item->Next() ) + if( gerber ) // A not used graphic layer can be selected. So gerber can be NULL { - if( gerb_item->GetLayer()!= layer ) - continue; - - if( gerb_item->HitTest( ref ) ) - { - found = true; - break; - } - } - - if( !found ) // Search on all layers - { - for( gerb_item = GetItemsList(); gerb_item; gerb_item = gerb_item->Next() ) + for( gerb_item = gerber->GetItemsList(); gerb_item; gerb_item = gerb_item->Next() ) { if( gerb_item->HitTest( ref ) ) { @@ -75,6 +66,26 @@ GERBER_DRAW_ITEM* GERBVIEW_FRAME::Locate( const wxPoint& aPosition, int aTypeloc } } + if( !found ) // Search on all layers + { + for( layer = 0; layer < GERBER_DRAWLAYERS_COUNT; ++layer ) + { + gerber = g_GERBER_List.GetGbrImage( layer ); + + if( gerber == NULL ) // Graphic layer not yet used + continue; + + for( gerb_item = gerber->GetItemsList(); gerb_item; gerb_item = gerb_item->Next() ) + { + if( gerb_item->HitTest( ref ) ) + { + found = true; + break; + } + } + } + } + if( found ) { MSG_PANEL_ITEMS items; diff --git a/gerbview/rs274d.cpp b/gerbview/rs274d.cpp index 92f392f098..e62f282880 100644 --- a/gerbview/rs274d.cpp +++ b/gerbview/rs274d.cpp @@ -106,14 +106,12 @@ * @param aLayerNegative = true if the current layer is negative */ void fillFlashedGBRITEM( GERBER_DRAW_ITEM* aGbrItem, - APERTURE_T aAperture, - int Dcode_index, - int aLayer, - const wxPoint& aPos, - wxSize aSize, - bool aLayerNegative ) + APERTURE_T aAperture, + int Dcode_index, + const wxPoint& aPos, + wxSize aSize, + bool aLayerNegative ) { - aGbrItem->SetLayer( aLayer ); aGbrItem->m_Size = aSize; aGbrItem->m_Start = aPos; aGbrItem->m_End = aGbrItem->m_Start; @@ -160,13 +158,11 @@ void fillFlashedGBRITEM( GERBER_DRAW_ITEM* aGbrItem, */ void fillLineGBRITEM( GERBER_DRAW_ITEM* aGbrItem, int Dcode_index, - int aLayer, const wxPoint& aStart, const wxPoint& aEnd, wxSize aPenSize, bool aLayerNegative ) { - aGbrItem->SetLayer( aLayer ); aGbrItem->m_Flashed = false; aGbrItem->m_Size = aPenSize; @@ -209,7 +205,7 @@ void fillLineGBRITEM( GERBER_DRAW_ITEM* aGbrItem, * false when arc is inside one quadrant * @param aLayerNegative = true if the current layer is negative */ -static void fillArcGBRITEM( GERBER_DRAW_ITEM* aGbrItem, int Dcode_index, int aLayer, +static void fillArcGBRITEM( GERBER_DRAW_ITEM* aGbrItem, int Dcode_index, const wxPoint& aStart, const wxPoint& aEnd, const wxPoint& aRelCenter, wxSize aPenSize, bool aClockwise, bool aMultiquadrant, @@ -218,7 +214,6 @@ static void fillArcGBRITEM( GERBER_DRAW_ITEM* aGbrItem, int Dcode_index, int aL wxPoint center, delta; aGbrItem->m_Shape = GBR_ARC; - aGbrItem->SetLayer( aLayer ); aGbrItem->m_Size = aPenSize; aGbrItem->m_Flashed = false; @@ -343,12 +338,11 @@ static void fillArcPOLY( GERBER_DRAW_ITEM* aGbrItem, /* in order to calculate arc parameters, we use fillArcGBRITEM * so we muse create a dummy track and use its geometric parameters */ - static GERBER_DRAW_ITEM dummyGbrItem( NULL, NULL ); - static const int drawlayer = 0; + static GERBER_DRAW_ITEM dummyGbrItem( NULL ); aGbrItem->SetLayerPolarity( aLayerNegative ); - fillArcGBRITEM( &dummyGbrItem, 0, drawlayer, + fillArcGBRITEM( &dummyGbrItem, 0, aStart, aEnd, rel_center, wxSize(0, 0), aClockwise, aMultiquadrant, aLayerNegative ); @@ -550,9 +544,9 @@ bool GERBER_FILE_IMAGE::Execute_G_Command( char*& text, int G_command ) break; case GC_TURN_OFF_POLY_FILL: - if( m_Exposure && m_parent->GetGerberLayout()->m_Drawings ) // End of polygon + if( m_Exposure && GetItemsList() ) // End of polygon { - GERBER_DRAW_ITEM * gbritem = m_parent->GetGerberLayout()->m_Drawings.GetLast(); + GERBER_DRAW_ITEM * gbritem = m_Drawings.GetLast(); StepAndRepeatItem( *gbritem ); } m_Exposure = false; @@ -581,16 +575,11 @@ bool GERBER_FILE_IMAGE::Execute_DCODE_Command( char*& text, int D_commande ) APERTURE_T aperture = APT_CIRCLE; GERBER_DRAW_ITEM* gbritem; - GBR_LAYOUT* layout = m_parent->GetGerberLayout(); - - int activeLayer = m_parent->getActiveLayer(); int dcode = 0; D_CODE* tool = NULL; wxString msg; -// D( printf( "%22s: D_CODE<%d>\n", __func__, D_commande ); ) - if( D_commande >= FIRST_DCODE ) // This is a "Set tool" command { if( D_commande > (TOOLS_MAX_COUNT - 1) ) @@ -619,10 +608,9 @@ bool GERBER_FILE_IMAGE::Execute_DCODE_Command( char*& text, int D_commande ) if( !m_Exposure ) // Start a new polygon outline: { m_Exposure = true; - gbritem = new GERBER_DRAW_ITEM( layout, this ); - layout->m_Drawings.Append( gbritem ); + gbritem = new GERBER_DRAW_ITEM( this ); + m_Drawings.Append( gbritem ); gbritem->m_Shape = GBR_POLYGON; - gbritem->SetLayer( activeLayer ); gbritem->m_Flashed = false; } @@ -630,7 +618,7 @@ bool GERBER_FILE_IMAGE::Execute_DCODE_Command( char*& text, int D_commande ) { case GERB_INTERPOL_ARC_NEG: case GERB_INTERPOL_ARC_POS: - gbritem = layout->m_Drawings.GetLast(); + gbritem = m_Drawings.GetLast(); // D( printf( "Add arc poly %d,%d to %d,%d fill %d interpol %d 360_enb %d\n", // m_PreviousPos.x, m_PreviousPos.y, m_CurrentPos.x, @@ -643,7 +631,7 @@ bool GERBER_FILE_IMAGE::Execute_DCODE_Command( char*& text, int D_commande ) break; default: - gbritem = layout->m_Drawings.GetLast(); + gbritem = m_Drawings.GetLast(); // D( printf( "Add poly edge %d,%d to %d,%d fill %d\n", // m_PreviousPos.x, m_PreviousPos.y, @@ -663,9 +651,9 @@ bool GERBER_FILE_IMAGE::Execute_DCODE_Command( char*& text, int D_commande ) break; case 2: // code D2: exposure OFF (i.e. "move to") - if( m_Exposure && layout->m_Drawings ) // End of polygon + if( m_Exposure && GetItemsList() ) // End of polygon { - gbritem = layout->m_Drawings.GetLast(); + gbritem = m_Drawings.GetLast(); StepAndRepeatItem( *gbritem ); } m_Exposure = false; @@ -695,13 +683,13 @@ bool GERBER_FILE_IMAGE::Execute_DCODE_Command( char*& text, int D_commande ) switch( m_Iterpolation ) { case GERB_INTERPOL_LINEAR_1X: - gbritem = new GERBER_DRAW_ITEM( layout, this ); - layout->m_Drawings.Append( gbritem ); + gbritem = new GERBER_DRAW_ITEM( this ); + m_Drawings.Append( gbritem ); // D( printf( "Add line %d,%d to %d,%d\n", // m_PreviousPos.x, m_PreviousPos.y, // m_CurrentPos.x, m_CurrentPos.y ); ) - fillLineGBRITEM( gbritem, dcode, activeLayer, m_PreviousPos, + fillLineGBRITEM( gbritem, dcode, m_PreviousPos, m_CurrentPos, size, GetLayerParams().m_LayerNegative ); StepAndRepeatItem( *gbritem ); break; @@ -714,14 +702,10 @@ bool GERBER_FILE_IMAGE::Execute_DCODE_Command( char*& text, int D_commande ) case GERB_INTERPOL_ARC_NEG: case GERB_INTERPOL_ARC_POS: - gbritem = new GERBER_DRAW_ITEM( layout, this ); - layout->m_Drawings.Append( gbritem ); + gbritem = new GERBER_DRAW_ITEM( this ); + m_Drawings.Append( gbritem ); -// D( printf( "Add arc %d,%d to %d,%d center %d, %d interpol %d 360_enb %d\n", -// m_PreviousPos.x, m_PreviousPos.y, m_CurrentPos.x, -// m_CurrentPos.y, m_IJPos.x, -// m_IJPos.y, m_Iterpolation, m_360Arc_enbl ); ) - fillArcGBRITEM( gbritem, dcode, activeLayer, m_PreviousPos, + fillArcGBRITEM( gbritem, dcode, m_PreviousPos, m_CurrentPos, m_IJPos, size, ( m_Iterpolation == GERB_INTERPOL_ARC_NEG ) ? false : true, m_360Arc_enbl, GetLayerParams().m_LayerNegative ); @@ -752,10 +736,9 @@ bool GERBER_FILE_IMAGE::Execute_DCODE_Command( char*& text, int D_commande ) aperture = tool->m_Shape; } - gbritem = new GERBER_DRAW_ITEM( layout, this ); - layout->m_Drawings.Append( gbritem ); - fillFlashedGBRITEM( gbritem, aperture, - dcode, activeLayer, m_CurrentPos, + gbritem = new GERBER_DRAW_ITEM( this ); + m_Drawings.Append( gbritem ); + fillFlashedGBRITEM( gbritem, aperture, dcode, m_CurrentPos, size, GetLayerParams().m_LayerNegative ); StepAndRepeatItem( *gbritem ); m_PreviousPos = m_CurrentPos; diff --git a/gerbview/rs274x.cpp b/gerbview/rs274x.cpp index 358f0b2505..d343946aa6 100644 --- a/gerbview/rs274x.cpp +++ b/gerbview/rs274x.cpp @@ -584,8 +584,9 @@ bool GERBER_FILE_IMAGE::ExecuteRS274XCommand( int command, char* buff, char*& te else GetLayerParams().m_LayerNegative = false; - DBG( printf( "%22s: LAYER_POLARITY m_LayerNegative=%s\n", __func__, - GetLayerParams().m_LayerNegative ? "true" : "false" ); ) + +// DBG( printf( "%22s: LAYER_POLARITY m_LayerNegative=%s\n", __func__, +// GetLayerParams().m_LayerNegative ? "true" : "false" ); ) break; case INCLUDE_FILE: From 54b6f875a6deb7cf1cbbbe4bc691fbfc40b4e9cb Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Thu, 26 May 2016 14:42:27 +0200 Subject: [PATCH 3/3] Gerbview: better BestZoom calculation --- gerbview/gerbview_frame.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/gerbview/gerbview_frame.cpp b/gerbview/gerbview_frame.cpp index 2886318920..b0455b6f79 100644 --- a/gerbview/gerbview_frame.cpp +++ b/gerbview/gerbview_frame.cpp @@ -231,17 +231,21 @@ double GERBVIEW_FRAME::BestZoom() EDA_RECT bbox = GetGerberLayout()->ComputeBoundingBox(); - // gives a minimal value to zoom, if no item in list + // gives a size to bbox (current page size), if no item in list if( bbox.GetWidth() == 0 || bbox.GetHeight() == 0 ) - return ZOOM_FACTOR( 200.0 ); + { + wxSize pagesize = m_paper.GetSizeMils(); + bbox.SetSize( wxSize( Mils2iu( pagesize.x ), Mils2iu( pagesize.y ) ) ); + } wxSize size = m_canvas->GetClientSize(); - double x = (double) bbox.GetWidth() / (double) size.x; - double y = (double) bbox.GetHeight() / (double) size.y; + double x = (double) bbox.GetWidth() * 1.1 / (double) size.x; + double y = (double) bbox.GetHeight() * 1.1 / (double) size.y; + double best_zoom = std::max( x, y ); + SetScrollCenterPosition( bbox.Centre() ); - double best_zoom = std::max( x, y ); return best_zoom; } @@ -260,9 +264,7 @@ void GERBVIEW_FRAME::LoadSettings( wxConfigBase* aCfg ) if( m_showBorderAndTitleBlock ) { wxString pageType; - aCfg->Read( cfgShowPageSizeOption, &pageType, wxT( "GERBER" ) ); - pageInfo.SetType( pageType ); }