From dae41b7460464720c78a10215a64b9303fdee00f Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Wed, 10 Apr 2019 10:19:16 +0100 Subject: [PATCH] Remove legacy segment-based zones. Give the user the option of cancelling a file open if there are segment zones; otherwise they're converted to polygon fills. Fixes: lp:1823087 * https://bugs.launchpad.net/kicad/+bug/1823087 --- include/core/typeinfo.h | 2 - pcbnew/attribut.cpp | 2 +- pcbnew/block.cpp | 20 -- pcbnew/board_commit.cpp | 1 - pcbnew/class_board.cpp | 36 +-- pcbnew/class_board.h | 9 +- pcbnew/class_track.cpp | 126 +---------- pcbnew/class_track.h | 29 --- pcbnew/class_zone.cpp | 43 ++-- pcbnew/class_zone.h | 4 +- pcbnew/collectors.cpp | 9 - pcbnew/connectivity/connectivity_algo.cpp | 5 - pcbnew/controle.cpp | 38 +--- pcbnew/dialogs/dialog_swap_layers.cpp | 6 - pcbnew/drc.cpp | 2 +- pcbnew/edit.cpp | 25 +- pcbnew/exporters/export_gencad.cpp | 5 +- pcbnew/files.cpp | 5 +- pcbnew/footprint_editor_onclick.cpp | 1 - pcbnew/highlight.cpp | 1 - pcbnew/kicad_plugin.cpp | 14 +- pcbnew/legacy_plugin.cpp | 44 +++- pcbnew/legacy_plugin.h | 6 +- pcbnew/netinfo_list.cpp | 4 - pcbnew/onrightclick.cpp | 5 - pcbnew/pcb_draw_panel_gal.cpp | 4 - pcbnew/pcb_edit_frame.h | 23 +- pcbnew/pcb_legacy_draw_utils.cpp | 10 - pcbnew/pcb_painter.cpp | 1 - pcbnew/pcb_painter.h | 1 - pcbnew/pcb_parser.cpp | 26 ++- pcbnew/pcb_parser.h | 2 + pcbnew/pcbnew_id.h | 1 - pcbnew/plot_board_layers.cpp | 22 -- pcbnew/plot_brditems_plotter.cpp | 91 ++------ pcbnew/swig/pcbnew_action_plugins.cpp | 17 -- pcbnew/tools/pcb_actions.h | 1 - pcbnew/tools/pcb_editor_control.cpp | 2 - pcbnew/tools/zone_filler_tool.cpp | 33 --- pcbnew/tools/zone_filler_tool.h | 3 - pcbnew/undo_redo.cpp | 4 - pcbnew/zone_filler.cpp | 252 ++++----------------- pcbnew/zone_filler.h | 17 +- pcbnew/zone_settings.h | 3 +- pcbnew/zones_by_polygon.cpp | 3 - pcbnew/zones_by_polygon_fill_functions.cpp | 46 +--- 46 files changed, 172 insertions(+), 832 deletions(-) diff --git a/include/core/typeinfo.h b/include/core/typeinfo.h index f83effde22..beb96d8963 100644 --- a/include/core/typeinfo.h +++ b/include/core/typeinfo.h @@ -94,8 +94,6 @@ enum KICAD_T PCB_MODULE_EDGE_T, ///< class EDGE_MODULE, a footprint edge PCB_TRACE_T, ///< class TRACK, a track segment (segment on a copper layer) PCB_VIA_T, ///< class VIA, a via (like a track segment on a copper layer) - PCB_SEGZONE_T, ///< class SEGZONE, a segment used to fill a zone area (segment on a - ///< copper layer) PCB_MARKER_T, ///< class MARKER_PCB, a marker used to show something PCB_DIMENSION_T, ///< class DIMENSION, a dimension (graphic item) PCB_TARGET_T, ///< class PCB_TARGET, a target (graphic item) diff --git a/pcbnew/attribut.cpp b/pcbnew/attribut.cpp index b731bcf415..662cdae714 100644 --- a/pcbnew/attribut.cpp +++ b/pcbnew/attribut.cpp @@ -70,7 +70,7 @@ void PCB_EDIT_FRAME::Attribut_Track( TRACK* track, wxDC* DC, bool Flag_On ) TRACK* Track; int nb_segm; - if( (track == NULL ) || (track->Type() == PCB_SEGZONE_T) ) + if( track == NULL ) return; m_canvas->CrossHairOff( DC ); // Erase cursor shape diff --git a/pcbnew/block.cpp b/pcbnew/block.cpp index 8104efcec4..c75d02f43c 100644 --- a/pcbnew/block.cpp +++ b/pcbnew/block.cpp @@ -566,7 +566,6 @@ void PCB_EDIT_FRAME::Block_Delete() // These items are deleted, but not put in undo list case PCB_MARKER_T: // a marker used to show something - case PCB_SEGZONE_T: // SEG_ZONE items are now deprecated item->UnLink(); itemsList->RemovePicker( ii ); ii--; @@ -626,12 +625,6 @@ void PCB_EDIT_FRAME::Block_Rotate() case PCB_DIMENSION_T: break; - // This item is not put in undo list - case PCB_SEGZONE_T: // SEG_ZONE items are now deprecated - itemsList->RemovePicker( ii ); - ii--; - break; - default: wxMessageBox( wxT( "PCB_EDIT_FRAME::Block_Rotate( ) error: unexpected type" ) ); break; @@ -695,13 +688,6 @@ void PCB_EDIT_FRAME::Block_Flip() case PCB_DIMENSION_T: break; - // This item is not put in undo list - case PCB_SEGZONE_T: // SEG_ZONE items are now deprecated - itemsList->RemovePicker( ii ); - ii--; - break; - - default: wxMessageBox( wxT( "PCB_EDIT_FRAME::Block_Flip( ) error: unexpected type" ) ); break; @@ -751,12 +737,6 @@ void PCB_EDIT_FRAME::Block_Move() case PCB_DIMENSION_T: break; - // This item is not put in undo list - case PCB_SEGZONE_T: // SEG_ZONE items are now deprecated - itemsList->RemovePicker( ii ); - ii--; - break; - default: wxMessageBox( wxT( "PCB_EDIT_FRAME::Block_Move( ) error: unexpected type" ) ); break; diff --git a/pcbnew/board_commit.cpp b/pcbnew/board_commit.cpp index 4f3d03e75d..536f1f6941 100644 --- a/pcbnew/board_commit.cpp +++ b/pcbnew/board_commit.cpp @@ -183,7 +183,6 @@ void BOARD_COMMIT::Push( const wxString& aMessage, bool aCreateUndoEntry, bool a case PCB_DIMENSION_T: // a dimension (graphic item) case PCB_TARGET_T: // a target (graphic item) case PCB_MARKER_T: // a marker used to show something - case PCB_SEGZONE_T: // SEG_ZONE items are now deprecated case PCB_ZONE_AREA_T: itemsToDeselect.push_back( boardItem ); diff --git a/pcbnew/class_board.cpp b/pcbnew/class_board.cpp index 8c1d1c466d..f29258e360 100644 --- a/pcbnew/class_board.cpp +++ b/pcbnew/class_board.cpp @@ -903,14 +903,6 @@ void BOARD::Add( BOARD_ITEM* aBoardItem, ADD_MODE aMode ) break; - case PCB_SEGZONE_T: - if( aMode == ADD_APPEND ) - m_SegZoneDeprecated.PushBack( (SEGZONE*) aBoardItem ); - else - m_SegZoneDeprecated.PushFront( (SEGZONE*) aBoardItem ); - - break; - case PCB_MODULE_T: if( aMode == ADD_APPEND ) m_Modules.PushBack( (MODULE*) aBoardItem ); @@ -999,10 +991,6 @@ void BOARD::Remove( BOARD_ITEM* aBoardItem ) m_Track.Remove( (TRACK*) aBoardItem ); break; - case PCB_SEGZONE_T: - m_SegZoneDeprecated.Remove( (SEGZONE*) aBoardItem ); - break; - case PCB_DIMENSION_T: case PCB_LINE_T: case PCB_TEXT_T: @@ -1090,12 +1078,6 @@ int BOARD::GetNumSegmTrack() const } -int BOARD::GetNumSegmZone() const -{ - return m_SegZoneDeprecated.GetCount(); -} - - unsigned BOARD::GetNodesCount( int aNet ) { unsigned retval = 0; @@ -1161,18 +1143,7 @@ EDA_RECT BOARD::ComputeBoundingBox( bool aBoardEdgesOnly ) const hasItems = true; } - // Check segment zones - for( TRACK* track = m_SegZoneDeprecated; track; track = track->Next() ) - { - if( !hasItems ) - area = track->GetBoundingBox(); - else - area.Merge( track->GetBoundingBox() ); - - hasItems = true; - } - - // Check polygonal zones + // Check zones for( auto aZone : m_ZoneDescriptorList ) { if( !hasItems ) @@ -1387,11 +1358,6 @@ SEARCH_RESULT BOARD::Visit( INSPECTOR inspector, void* testData, const KICAD_T s ++p; break; - case PCB_SEGZONE_T: - result = IterateForward( m_SegZoneDeprecated, inspector, testData, p ); - ++p; - break; - default: // catch EOT or ANY OTHER type here and return. done = true; break; diff --git a/pcbnew/class_board.h b/pcbnew/class_board.h index ee4eaf84a3..b063755d24 100644 --- a/pcbnew/class_board.h +++ b/pcbnew/class_board.h @@ -55,7 +55,6 @@ class PCB_EDIT_FRAME; class PICKED_ITEMS_LIST; class BOARD; class ZONE_CONTAINER; -class SEGZONE; class TRACK; class D_PAD; class MARKER_PCB; @@ -251,8 +250,6 @@ public: DLIST m_Modules; // linked list of MODULEs DLIST m_Track; // linked list of TRACKs and VIAs - DLIST m_SegZoneDeprecated; // linked list of SEGZONEs, for really very old boards - // should be removed one day DLIST_ITERATOR_WRAPPER Tracks() { return DLIST_ITERATOR_WRAPPER(m_Track); } DLIST_ITERATOR_WRAPPER Modules() { return DLIST_ITERATOR_WRAPPER(m_Modules); } @@ -275,8 +272,7 @@ public: bool IsEmpty() const { - return m_Drawings.GetCount() == 0 && m_Modules.GetCount() == 0 && - m_Track.GetCount() == 0 && m_SegZoneDeprecated.GetCount() == 0; + return m_Drawings.GetCount() == 0 && m_Modules.GetCount() == 0 && m_Track.GetCount() == 0; } void Move( const wxPoint& aMoveVector ) override; @@ -698,9 +694,6 @@ public: /** Functions to get some items count */ int GetNumSegmTrack() const; - /** Calculate the zone segment count */ - int GetNumSegmZone() const; - /** * Function GetNodesCount * @param aNet Only count nodes belonging to this net diff --git a/pcbnew/class_track.cpp b/pcbnew/class_track.cpp index faa66123dc..36ccd345ca 100644 --- a/pcbnew/class_track.cpp +++ b/pcbnew/class_track.cpp @@ -108,32 +108,6 @@ EDA_ITEM* TRACK::Clone() const } -SEGZONE::SEGZONE( BOARD_ITEM* aParent ) : - TRACK( aParent, PCB_SEGZONE_T ) -{ -} - - -EDA_ITEM* SEGZONE::Clone() const -{ - return new SEGZONE( *this ); -} - - -wxString SEGZONE::GetSelectMenuText( EDA_UNITS_T aUnits ) const -{ - return wxString::Format( _( "Zone [%s] on %s" ), - UnescapeString( GetNetnameMsg() ), - GetLayerName() ); -} - - -BITMAP_DEF SEGZONE::GetMenuImage() const -{ - return add_zone_xpm; -} - - VIA::VIA( BOARD_ITEM* aParent ) : TRACK( aParent, PCB_VIA_T ) { @@ -454,26 +428,16 @@ void VIA::SanitizeLayers() TRACK* TRACK::GetBestInsertPoint( BOARD* aPcb ) { - TRACK* track; - // When reading from a file most of the items will already be in the correct order. // Searching from the back therefore takes us from n^2 to essentially 0. - if( Type() == PCB_SEGZONE_T ) // Deprecated items, only found in very old boards - track = aPcb->m_SegZoneDeprecated.GetLast(); - else - track = aPcb->m_Track.GetLast(); - - for( ; track; track = track->Back() ) + for( TRACK* track = aPcb->m_Track.GetLast(); track; track = track->Back() ) { if( GetNetCode() >= track->GetNetCode() ) return track->Next(); } - if( Type() == PCB_SEGZONE_T ) // Deprecated - return aPcb->m_SegZoneDeprecated.GetFirst(); - else - return aPcb->m_Track.GetFirst(); + return aPcb->m_Track.GetFirst(); } @@ -694,65 +658,6 @@ void TRACK::Draw( EDA_DRAW_PANEL* panel, wxDC* aDC, GR_DRAWMODE aDrawMode, } -void SEGZONE::Draw( EDA_DRAW_PANEL* panel, wxDC* aDC, GR_DRAWMODE aDrawMode, - const wxPoint& aOffset ) -{ - auto displ_opts = (PCB_DISPLAY_OPTIONS*)( panel->GetDisplayOptions() ); - - if( displ_opts->m_DisplayZonesMode != 0 ) - return; - - BOARD* brd = GetBoard(); - - auto frame = static_cast ( panel->GetParent() ); - auto color = frame->Settings().Colors().GetLayerColor( m_Layer ); - - if( brd->IsLayerVisible( m_Layer ) == false && !( aDrawMode & GR_HIGHLIGHT ) ) - return; - -#ifdef USE_WX_OVERLAY - // If dragged not draw in OnPaint otherwise remains impressed in wxOverlay - if( (m_Flags & IS_DRAGGED) && aDC->IsKindOf(wxCLASSINFO(wxPaintDC))) - return; -#endif - - if( ( aDrawMode & GR_ALLOW_HIGHCONTRAST ) && displ_opts->m_ContrastModeDisplay ) - { - PCB_LAYER_ID curr_layer = ( (PCB_SCREEN*) panel->GetScreen() )->m_Active_Layer; - - if( !IsOnLayer( curr_layer ) ) - color = COLOR4D( DARKDARKGRAY ); - } - - if( ( aDrawMode & GR_HIGHLIGHT ) && !( aDrawMode & GR_AND ) ) - color.SetToLegacyHighlightColor(); - - color.a = 0.588; - - GRSetDrawMode( aDC, aDrawMode ); - - // Draw track as line if width <= 1pixel: - if( aDC->LogicalToDeviceXRel( m_Width ) <= 1 ) - { - GRLine( panel->GetClipBox(), aDC, m_Start + aOffset, m_End + aOffset, m_Width, color ); - return; - } - - if( !displ_opts->m_DisplayPcbTrackFill || GetState( FORCE_SKETCH ) ) - { - GRCSegm( panel->GetClipBox(), aDC, m_Start + aOffset, m_End + aOffset, m_Width, color ); - } - else - { - GRFillCSegm( panel->GetClipBox(), aDC, m_Start.x + aOffset.x, - m_Start.y + aOffset.y, - m_End.x + aOffset.x, m_End.y + aOffset.y, m_Width, color ); - } - - // No clearance or netnames for zones -} - - void TRACK::ViewGetLayers( int aLayers[], int& aCount ) const { // Show the track and its netname on different layers @@ -1194,33 +1099,6 @@ void TRACK::GetMsgPanelInfoBase( EDA_UNITS_T aUnits, std::vector< MSG_PANEL_ITEM aList.push_back( MSG_PANEL_ITEM( _( "Segment Length" ), msg, DARKCYAN ) ); } -void SEGZONE::GetMsgPanelInfoBase( EDA_UNITS_T aUnits, std::vector< MSG_PANEL_ITEM >& aList ) -{ - wxString msg; - BOARD* board = GetBoard(); - - aList.push_back( MSG_PANEL_ITEM( _( "Type" ), _( "Zone " ), DARKCYAN ) ); - - GetMsgPanelInfoBase_Common( aUnits, aList ); - - // Display layer - if( board ) - msg = board->GetLayerName( m_Layer ); - else - msg.Printf( wxT( "%d" ), m_Layer ); - - aList.push_back( MSG_PANEL_ITEM( _( "Layer" ), msg, BROWN ) ); - - // Display width - msg = MessageTextFromValue( aUnits, m_Width ); - - aList.push_back( MSG_PANEL_ITEM( _( "Width" ), msg, DARKCYAN ) ); - - // Display segment length - msg = MessageTextFromValue( aUnits, GetLength() ); - aList.push_back( MSG_PANEL_ITEM( _( "Segment Length" ), msg, DARKCYAN ) ); -} - void VIA::GetMsgPanelInfoBase( EDA_UNITS_T aUnits, std::vector< MSG_PANEL_ITEM >& aList ) { wxString msg; diff --git a/pcbnew/class_track.h b/pcbnew/class_track.h index 19323856bd..fd0afc7b1a 100644 --- a/pcbnew/class_track.h +++ b/pcbnew/class_track.h @@ -358,35 +358,6 @@ private: }; -class SEGZONE : public TRACK -{ -public: - SEGZONE( BOARD_ITEM* aParent ); - - // Do not create a copy constructor. The one generated by the compiler is adequate. - - wxString GetClass() const override - { - return wxT( "ZONE" ); - } - - - SEGZONE* Next() const { return static_cast( Pnext ); } - - wxString GetSelectMenuText( EDA_UNITS_T aUnits ) const override; - - void Draw( EDA_DRAW_PANEL* panel, wxDC* DC, - GR_DRAWMODE aDrawMode, const wxPoint& aOffset = ZeroOffset ) override; - - BITMAP_DEF GetMenuImage() const override; - - EDA_ITEM* Clone() const override; - -protected: - void GetMsgPanelInfoBase( EDA_UNITS_T aUnits, std::vector< MSG_PANEL_ITEM >& aList ) override; -}; - - class VIA : public TRACK { public: diff --git a/pcbnew/class_zone.cpp b/pcbnew/class_zone.cpp index 4c114062d7..f210db9853 100644 --- a/pcbnew/class_zone.cpp +++ b/pcbnew/class_zone.cpp @@ -459,7 +459,7 @@ void ZONE_CONTAINER::DrawFilledArea( EDA_DRAW_PANEL* panel, color.a = 0.588; - for ( int ic = 0; ic < m_FilledPolysList.OutlineCount(); ic++ ) + for( int ic = 0; ic < m_FilledPolysList.OutlineCount(); ic++ ) { const SHAPE_LINE_CHAIN& path = m_FilledPolysList.COutline( ic ); @@ -485,40 +485,29 @@ void ZONE_CONTAINER::DrawFilledArea( EDA_DRAW_PANEL* panel, if( ( m_ZoneMinThickness > 1 ) || outline_mode ) { int ilim = CornersBuffer.size() - 1; - int line_thickness = m_ZoneMinThickness; for( int is = 0, ie = ilim; is <= ilim; ie = is, is++ ) { // Draw only basic outlines, not extra segments. if( !displ_opts->m_DisplayPcbTrackFill || GetState( FORCE_SKETCH ) ) - GRCSegm( panel->GetClipBox(), DC, - CornersBuffer[is], CornersBuffer[ie], line_thickness, color ); + { + GRCSegm( panel->GetClipBox(), DC, CornersBuffer[is], CornersBuffer[ie], + line_thickness, color ); + } else - GRFilledSegment( panel->GetClipBox(), DC, - CornersBuffer[is], CornersBuffer[ie], line_thickness, color ); + { + GRFilledSegment( panel->GetClipBox(), DC, CornersBuffer[is], CornersBuffer[ie], + line_thickness, color ); + } } } - // Draw areas: - if( m_FillMode != ZFM_SEGMENTS && !outline_mode ) - GRPoly( panel->GetClipBox(), DC, CornersBuffer.size(), &CornersBuffer[0], - true, 0, color, color ); - } - - if( m_FillMode == ZFM_SEGMENTS && !outline_mode ) // filled with segments - { - for( unsigned ic = 0; ic < m_FillSegmList.size(); ic++ ) + // Draw fill: + if( !outline_mode ) { - wxPoint start = (wxPoint) ( m_FillSegmList[ic].A + VECTOR2I(offset) ); - wxPoint end = (wxPoint) ( m_FillSegmList[ic].B + VECTOR2I(offset) ); - - if( !displ_opts->m_DisplayPcbTrackFill || GetState( FORCE_SKETCH ) ) - GRCSegm( panel->GetClipBox(), DC, start.x, start.y, end.x, end.y, - m_ZoneMinThickness, color ); - else - GRFillCSegm( panel->GetClipBox(), DC, start.x, start.y, end.x, end.y, - m_ZoneMinThickness, color ); + GRPoly( panel->GetClipBox(), DC, CornersBuffer.size(), &CornersBuffer[0], true, 0, + color, color ); } } } @@ -882,11 +871,9 @@ void ZONE_CONTAINER::GetMsgPanelInfo( EDA_UNITS_T aUnits, std::vector< MSG_PANEL switch( m_FillMode ) { case ZFM_POLYGONS: - msg = _( "Polygons" ); break; + msg = _( "Solid" ); break; case ZFM_HATCH_PATTERN: - msg = _( "Hatch Fill" ); break; - case ZFM_SEGMENTS: // Deprecated: found in old boards - msg = _( "Segments" ); break; + msg = _( "Hatched" ); break; default: msg = _( "Unknown" ); break; } diff --git a/pcbnew/class_zone.h b/pcbnew/class_zone.h index 1218f13b3b..233afb6332 100644 --- a/pcbnew/class_zone.h +++ b/pcbnew/class_zone.h @@ -74,8 +74,7 @@ public: static inline bool ClassOf( const EDA_ITEM* aItem ) { - return aItem && ( ( PCB_ZONE_AREA_T == aItem->Type() ) || - ( PCB_SEGZONE_T == aItem->Type() ) ); + return aItem && aItem->Type() == PCB_ZONE_AREA_T; } /** @@ -782,7 +781,6 @@ private: /** How to fill areas: * ZFM_POLYGONS => use solid polygons - * ZFM_SEGMENTS => fill by segments (deprecated). * ZFM_HATCH_PATTERN => use a grid pattern as shape */ ZONE_FILL_MODE m_FillMode; diff --git a/pcbnew/collectors.cpp b/pcbnew/collectors.cpp index 0d4eff7ec7..2eb1f98382 100644 --- a/pcbnew/collectors.cpp +++ b/pcbnew/collectors.cpp @@ -51,7 +51,6 @@ const KICAD_T GENERAL_COLLECTOR::AllBoardItems[] = { PCB_PAD_T, // in modules PCB_MODULE_TEXT_T, // in modules PCB_MODULE_T, // in m_Modules - PCB_SEGZONE_T, // in m_Zones PCB_ZONE_AREA_T, // in m_ZoneDescriptorList EOT }; @@ -66,7 +65,6 @@ const KICAD_T GENERAL_COLLECTOR::BoardLevelItems[] = { PCB_VIA_T, PCB_TRACE_T, PCB_MODULE_T, - PCB_SEGZONE_T, PCB_ZONE_AREA_T, EOT }; @@ -182,10 +180,6 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, void* testData ) breakhere++; break; - case PCB_SEGZONE_T: - breakhere++; - break; - case PCB_TEXT_T: breakhere++; break; @@ -266,9 +260,6 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, void* testData ) goto exit; break; - case PCB_SEGZONE_T: - break; - case PCB_ZONE_AREA_T: zone = static_cast( item ); break; diff --git a/pcbnew/connectivity/connectivity_algo.cpp b/pcbnew/connectivity/connectivity_algo.cpp index 003ae835f5..cfbfe7b81a 100644 --- a/pcbnew/connectivity/connectivity_algo.cpp +++ b/pcbnew/connectivity/connectivity_algo.cpp @@ -78,7 +78,6 @@ bool CN_CONNECTIVITY_ALGO::Remove( BOARD_ITEM* aItem ) break; } - case PCB_SEGZONE_T: default: return false; } @@ -176,8 +175,6 @@ bool CN_CONNECTIVITY_ALGO::Add( BOARD_ITEM* aItem ) break; } - //N.B. SEGZONE items are deprecated and not to used for connectivity - case PCB_SEGZONE_T: default: return false; } @@ -440,8 +437,6 @@ void CN_CONNECTIVITY_ALGO::Build( const std::vector& aItems ) break; } - //N.B. SEGZONE items are deprecated and not to used for connectivity - case PCB_SEGZONE_T: default: break; } diff --git a/pcbnew/controle.cpp b/pcbnew/controle.cpp index fdda966c0e..c808fd967f 100644 --- a/pcbnew/controle.cpp +++ b/pcbnew/controle.cpp @@ -158,43 +158,17 @@ BOARD_ITEM* PCB_BASE_FRAME::PcbGeneralLocateAndDisplay( int aHotKeyCode ) (*m_Collector)[i]->Show( 0, std::cout ); #endif - /* Remove redundancies: sometime, legacy zones are found twice, - * because zones can be filled by overlapping segments (this is a fill option) - * Trigger the selection of the current edge for new-style zones - */ - timestamp_t timestampzone = 0; - + // Trigger the selection of the current edge for zones for( int ii = 0; ii < m_Collector->GetCount(); ii++ ) { item = (*m_Collector)[ii]; - switch( item->Type() ) + if( item->Type() == PCB_ZONE_AREA_T ) { - case PCB_SEGZONE_T: - // Found a TYPE ZONE - if( item->GetTimeStamp() == timestampzone ) // Remove it, redundant, zone already found - { - m_Collector->Remove( ii ); - ii--; - } - else - { - timestampzone = item->GetTimeStamp(); - } - break; - - case PCB_ZONE_AREA_T: - { - /* We need to do the selection now because the menu text - * depends on it */ - ZONE_CONTAINER *zone = static_cast( item ); - int accuracy = KiROUND( 5 * guide.OnePixelInIU() ); - zone->SetSelectedCorner( RefPos( true ), accuracy ); - } - break; - - default: - break; + // We need to do the selection now because the menu text depends on it + ZONE_CONTAINER *zone = static_cast( item ); + int accuracy = KiROUND( 5 * guide.OnePixelInIU() ); + zone->SetSelectedCorner( RefPos( true ), accuracy ); } } diff --git a/pcbnew/dialogs/dialog_swap_layers.cpp b/pcbnew/dialogs/dialog_swap_layers.cpp index 93dc808c14..36462f7b0d 100644 --- a/pcbnew/dialogs/dialog_swap_layers.cpp +++ b/pcbnew/dialogs/dialog_swap_layers.cpp @@ -240,12 +240,6 @@ void PCB_EDIT_FRAME::Swap_Layers( wxCommandEvent& event ) } } - for( TRACK* segm = GetBoard()->m_SegZoneDeprecated; segm; segm = segm->Next() ) - { - // Note: deprecated zone segment fills only found in very old boards - hasChanges |= processBoardItem( this, commit, segm, new_layer ); - } - for( BOARD_ITEM* zone : GetBoard()->Zones() ) { hasChanges |= processBoardItem( this, commit, zone, new_layer ); diff --git a/pcbnew/drc.cpp b/pcbnew/drc.cpp index 03e2a922ae..cbafcf5754 100644 --- a/pcbnew/drc.cpp +++ b/pcbnew/drc.cpp @@ -462,7 +462,7 @@ void DRC::RunTests( wxTextCtrl* aMessages ) if( aMessages ) aMessages->AppendText( _( "Refilling all zones...\n" ) ); - m_pcbEditorFrame->Fill_All_Zones( caller ); + m_pcbEditorFrame->Fill_All_Zones(); } else { diff --git a/pcbnew/edit.cpp b/pcbnew/edit.cpp index 5680c92a62..c2daa1b14d 100644 --- a/pcbnew/edit.cpp +++ b/pcbnew/edit.cpp @@ -111,7 +111,6 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) case ID_POPUP_PCB_PLACE_ZONE_CORNER: case ID_POPUP_PCB_PLACE_ZONE_OUTLINES: case ID_POPUP_PCB_EDIT_ZONE_PARAMS: - case ID_POPUP_PCB_DELETE_ZONE: case ID_POPUP_PCB_DELETE_ZONE_CORNER: case ID_POPUP_PCB_MOVE_ZONE_CORNER: case ID_POPUP_PCB_DRAG_ZONE_OUTLINE_SEGMENT: @@ -499,21 +498,6 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) case ID_POPUP_PCB_SETFLAGS_TRACK_MNU: break; - case ID_POPUP_PCB_DELETE_ZONE: - m_canvas->MoveCursorToCrossHair(); - - if( GetCurItem() ) - { - SEGZONE* zsegm = (SEGZONE*) GetCurItem(); - int netcode = zsegm->GetNetCode(); - Delete_OldZone_Fill( zsegm ); - SetCurItem( NULL ); - TestNetConnection( NULL, netcode ); - OnModify(); - SetMsgPanel( GetBoard() ); - } - break; - case ID_POPUP_PCB_EDIT_ZONE_PARAMS: Edit_Zone_Params( &dc, (ZONE_CONTAINER*) GetCurItem() ); SetCurItem( NULL ); // Outlines can have changed @@ -617,7 +601,7 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) case ID_POPUP_PCB_FILL_ALL_ZONES: m_canvas->MoveCursorToCrossHair(); - Fill_All_Zones( this ); + Fill_All_Zones(); m_canvas->Refresh(); SetMsgPanel( GetBoard() ); break; @@ -638,9 +622,6 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) break; case ID_POPUP_PCB_REMOVE_FILLED_AREAS_IN_ALL_ZONES: // Remove all zones : - GetBoard()->m_SegZoneDeprecated.DeleteAll(); // remove deprecated zone segments used - // to fill zones in very old boards. - for( int ii = 0; ii < GetBoard()->GetAreaCount(); ii++ ) { // Remove filled areas in zone @@ -1293,10 +1274,6 @@ void PCB_EDIT_FRAME::RemoveStruct( BOARD_ITEM* Item, wxDC* DC ) Delete_Segment( DC, (TRACK*) Item ); break; - case PCB_SEGZONE_T: - Delete_OldZone_Fill( (SEGZONE*) Item ); - break; - case PCB_ZONE_AREA_T: { SetCurItem( NULL ); diff --git a/pcbnew/exporters/export_gencad.cpp b/pcbnew/exporters/export_gencad.cpp index 9a211057e6..be94fb19fa 100644 --- a/pcbnew/exporters/export_gencad.cpp +++ b/pcbnew/exporters/export_gencad.cpp @@ -1103,14 +1103,13 @@ static void CreateRoutesSection( FILE* aFile, BOARD* aPcb ) fprintf( aFile, "TRACK TRACK%d\n", track->GetWidth() ); } - if( (track->Type() == PCB_TRACE_T) || (track->Type() == PCB_SEGZONE_T) ) + if( track->Type() == PCB_TRACE_T ) { if( old_layer != track->GetLayer() ) { old_layer = track->GetLayer(); fprintf( aFile, "LAYER %s\n", - GenCADLayerName( cu_count, track->GetLayer() ).c_str() - ); + GenCADLayerName( cu_count, track->GetLayer() ).c_str() ); } fprintf( aFile, "LINE %g %g %g %g\n", diff --git a/pcbnew/files.cpp b/pcbnew/files.cpp index ed4115323e..c15e5c6e4e 100644 --- a/pcbnew/files.cpp +++ b/pcbnew/files.cpp @@ -576,7 +576,10 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector& aFileSet, in if( bds.m_CopperEdgeClearance == Millimeter2iu( LEGACY_COPPEREDGECLEARANCE ) ) bds.SetCopperEdgeClearance( inferLegacyEdgeClearance( loadedBoard ) ); - GetScreen()->ClrModify(); + if( loadedBoard->IsModified() ) + OnModify(); + else + GetScreen()->ClrModify(); if( pluginType == IO_MGR::LEGACY && loadedBoard->GetFileFormatVersionAtLoad() < LEGACY_BOARD_FILE_VERSION ) diff --git a/pcbnew/footprint_editor_onclick.cpp b/pcbnew/footprint_editor_onclick.cpp index 62ccc963f8..515a90cdb7 100644 --- a/pcbnew/footprint_editor_onclick.cpp +++ b/pcbnew/footprint_editor_onclick.cpp @@ -437,7 +437,6 @@ bool FOOTPRINT_EDIT_FRAME::OnRightClick( const wxPoint& MousePos, wxMenu* PopMen case PCB_TEXT_T: case PCB_VIA_T: case PCB_TRACE_T: - case PCB_SEGZONE_T: case PCB_MARKER_T: case PCB_DIMENSION_T: case PCB_TARGET_T: diff --git a/pcbnew/highlight.cpp b/pcbnew/highlight.cpp index d6784223dc..8b4f0a27d8 100644 --- a/pcbnew/highlight.cpp +++ b/pcbnew/highlight.cpp @@ -76,7 +76,6 @@ int PCB_EDIT_FRAME::SelectHighLight( wxDC* DC ) case PCB_TRACE_T: case PCB_VIA_T: - case PCB_SEGZONE_T: // since these classes are all derived from TRACK, use a common // GetNet() function: netcode = ( (TRACK*) item )->GetNetCode(); diff --git a/pcbnew/kicad_plugin.cpp b/pcbnew/kicad_plugin.cpp index 5b6960571d..4254a7b1c4 100644 --- a/pcbnew/kicad_plugin.cpp +++ b/pcbnew/kicad_plugin.cpp @@ -600,7 +600,6 @@ void PCB_IO::formatGeneral( BOARD* aBoard, int aNestLevel ) const m_out->Print( aNestLevel+1, "(drawings %d)\n", aBoard->Drawings().Size() ); m_out->Print( aNestLevel+1, "(tracks %d)\n", aBoard->GetNumSegmTrack() ); - m_out->Print( aNestLevel+1, "(zones %d)\n", aBoard->GetNumSegmZone() ); m_out->Print( aNestLevel+1, "(modules %d)\n", aBoard->m_Modules.GetCount() ); m_out->Print( aNestLevel+1, "(nets %d)\n", m_mapping->GetSize() ); m_out->Print( aNestLevel, ")\n\n" ); @@ -675,8 +674,7 @@ void PCB_IO::formatBoardLayers( BOARD* aBoard, int aNestLevel ) const void PCB_IO::formatNetInformation( BOARD* aBoard, int aNestLevel ) const { const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings(); - for( NETINFO_MAPPING::iterator net = m_mapping->begin(), netEnd = m_mapping->end(); - net != netEnd; ++net ) + for( NETINFO_ITEM* net : *m_mapping ) { m_out->Print( aNestLevel, "(net %d %s)\n", m_mapping->Translate( net->GetNet() ), @@ -691,11 +689,9 @@ void PCB_IO::formatNetInformation( BOARD* aBoard, int aNestLevel ) const defaultNC.Format( m_out, aNestLevel, m_ctl ); // Save the rest of the net classes alphabetically. - for( NETCLASSES::const_iterator it = dsnSettings.m_NetClasses.begin(); - it != dsnSettings.m_NetClasses.end(); - ++it ) + for( const auto& it : dsnSettings.m_NetClasses ) { - NETCLASS netclass = *it->second; + NETCLASS netclass = *it.second; filterNetClass( *aBoard, netclass ); // Remove empty nets (from a copy of a netclass) netclass.Format( m_out, aNestLevel, m_ctl ); } @@ -1719,9 +1715,7 @@ void PCB_IO::format( ZONE_CONTAINER* aZone, int aNestLevel ) const m_out->Print( 0, " yes" ); // Default is polygon filled. - if( aZone->GetFillMode() == ZFM_SEGMENTS ) // Now deprecated. Should not be used - m_out->Print( 0, " (mode segment)" ); - else if( aZone->GetFillMode() == ZFM_HATCH_PATTERN ) + if( aZone->GetFillMode() == ZFM_HATCH_PATTERN ) m_out->Print( 0, " (mode hatch)" ); m_out->Print( 0, " (arc_segments %d) (thermal_gap %s) (thermal_bridge_width %s)", diff --git a/pcbnew/legacy_plugin.cpp b/pcbnew/legacy_plugin.cpp index 534caed702..d032e70096 100644 --- a/pcbnew/legacy_plugin.cpp +++ b/pcbnew/legacy_plugin.cpp @@ -86,7 +86,7 @@ #include #include #include - +#include typedef LEGACY_PLUGIN::BIU BIU; @@ -496,7 +496,8 @@ void LEGACY_PLUGIN::loadAllSections( bool doAppend ) else if( TESTLINE( "$ZONE" ) ) { - loadTrackList( PCB_SEGZONE_T ); + // No longer supported; discard segment fills + loadTrackList( NOT_USED ); } else if( TESTLINE( "$GENERAL" ) ) @@ -2306,10 +2307,12 @@ void LEGACY_PLUGIN::loadTrackList( int aStructType ) flags = static_cast( flags_int ); - if( aStructType==PCB_TRACE_T && type==1 ) - makeType = PCB_VIA_T; + if( aStructType == PCB_TRACE_T ) + makeType = ( type == 1 ) ? PCB_VIA_T : PCB_TRACE_T; + else if (aStructType == NOT_USED ) + continue; else - makeType = aStructType; + wxFAIL_MSG( "Segment type unknown" ); TRACK* newTrack; @@ -2323,10 +2326,6 @@ void LEGACY_PLUGIN::loadTrackList( int aStructType ) case PCB_VIA_T: newTrack = new VIA( m_board ); break; - - case PCB_SEGZONE_T: // this is now deprecated, but exist in old boards - newTrack = new SEGZONE( m_board ); - break; } newTrack->SetTimeStamp( (timestamp_t)timeStamp ); @@ -2623,7 +2622,31 @@ void LEGACY_PLUGIN::loadZONE_CONTAINER() BIU thermalReliefGap = biuParse( data += 2 , &data ); // +=2 for " F" BIU thermalReliefCopperBridge = biuParse( data ); - zc->SetFillMode( fillmode ? ZFM_SEGMENTS : ZFM_POLYGONS ); + if( fillmode) + { + // SEGMENT fill mode no longer supported. Make sure user is OK with converting them. + if( m_showLegacyZoneWarning ) + { + KIDIALOG dlg( nullptr, + _( "The legacy segment fill mode is no longer supported.\n" + "Convert zones to polygon fills?"), + _( "Legacy Zone Warning" ), + wxYES_NO | wxICON_WARNING ); + + dlg.DoNotShowCheckbox( __FILE__, __LINE__ ); + + if( dlg.ShowModal() == wxID_NO ) + THROW_IO_ERROR( wxT( "CANCEL" ) ); + + m_showLegacyZoneWarning = false; + } + + // User OK'd; switch to polygon mode + zc->SetFillMode( ZFM_POLYGONS ); + m_board->SetModified(); + } + else + zc->SetFillMode( ZFM_POLYGONS ); // @todo ARC_APPROX_SEGMENTS_COUNT_HIGH_DEF: don't really want pcbnew.h // in here, after all, its a PLUGIN and global data is evil. @@ -3063,6 +3086,7 @@ void LEGACY_PLUGIN::init( const PROPERTIES* aProperties ) m_loading_format_version = 0; m_cu_count = 16; m_board = NULL; + m_showLegacyZoneWarning = true; m_props = aProperties; // conversion factor for saving RAM BIUs to KICAD legacy file format. diff --git a/pcbnew/legacy_plugin.h b/pcbnew/legacy_plugin.h index 297abfcb30..3844ed47c8 100644 --- a/pcbnew/legacy_plugin.h +++ b/pcbnew/legacy_plugin.h @@ -53,7 +53,6 @@ class NETINFO_MAPPING; class TEXTE_MODULE; class EDGE_MODULE; class TRACK; -class SEGZONE; class D_PAD; struct LP_CACHE; @@ -128,6 +127,7 @@ protected: wxString m_field; ///< reused to stuff MODULE fields. int m_loading_format_version; ///< which BOARD_FORMAT_VERSION am I Load()ing? LP_CACHE* m_cache; + bool m_showLegacyZoneWarning; NETINFO_MAPPING* m_mapping; ///< mapping for net codes, so only not empty nets ///< are stored with consecutive integers as net codes @@ -209,8 +209,8 @@ protected: * Function loadTrackList * reads a list of segments (Tracks and Vias, or Segzones) * - * @param aStructType is either PCB_TRACE_T to indicate tracks and vias, or - * PCB_SEGZONE_T to indicate oldschool zone segments (before polygons came to be). + * @param aStructType is either PCB_TRACE_T to indicate tracks and vias, or NOT_USED + * to indicate oldschool zone segments (which are discarded). */ void loadTrackList( int aStructType ); diff --git a/pcbnew/netinfo_list.cpp b/pcbnew/netinfo_list.cpp index 44fa6244d9..611fd92751 100644 --- a/pcbnew/netinfo_list.cpp +++ b/pcbnew/netinfo_list.cpp @@ -228,10 +228,6 @@ void NETINFO_MAPPING::Update() } } - // Segzones (should be removed: used only in very old boards) - for( SEGZONE* zone = m_board->m_SegZoneDeprecated; zone; zone = zone->Next() ) - nets.insert( zone->GetNetCode() ); - // Prepare the new mapping m_netMapping.clear(); diff --git a/pcbnew/onrightclick.cpp b/pcbnew/onrightclick.cpp index 3326184bfb..d4c6336a20 100644 --- a/pcbnew/onrightclick.cpp +++ b/pcbnew/onrightclick.cpp @@ -196,11 +196,6 @@ bool PCB_EDIT_FRAME::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu ) break; - case PCB_SEGZONE_T: // Item used to fill a zone - AddMenuItem( aPopMenu, ID_POPUP_PCB_DELETE_ZONE, - _( "Delete Zone Filling" ), KiBitmap( delete_xpm ) ); - break; - case PCB_ZONE_AREA_T: // Item used to handle a zone area (outlines, holes ...) if( flags & IS_NEW ) { diff --git a/pcbnew/pcb_draw_panel_gal.cpp b/pcbnew/pcb_draw_panel_gal.cpp index 0ec293dfd9..5c01530bc2 100644 --- a/pcbnew/pcb_draw_panel_gal.cpp +++ b/pcbnew/pcb_draw_panel_gal.cpp @@ -177,10 +177,6 @@ void PCB_DRAW_PANEL_GAL::DisplayBoard( BOARD* aBoard ) for( MODULE* module = aBoard->m_Modules; module; module = module->Next() ) m_view->Add( module ); - // Segzones (deprecated, equivalent of ZONE_CONTAINERfilled areas for very old boards) - for( SEGZONE* zone = aBoard->m_SegZoneDeprecated; zone; zone = zone->Next() ) - m_view->Add( zone ); - // DRC markers for( int marker_idx = 0; marker_idx < aBoard->GetMARKERCount(); ++marker_idx ) { diff --git a/pcbnew/pcb_edit_frame.h b/pcbnew/pcb_edit_frame.h index 49d5cc59dd..3c3ba9db46 100644 --- a/pcbnew/pcb_edit_frame.h +++ b/pcbnew/pcb_edit_frame.h @@ -40,7 +40,6 @@ class BOARD_ITEM_CONTAINER; class TEXTE_PCB; class MODULE; class TRACK; -class SEGZONE; class VIA; class D_PAD; class TEXTE_MODULE; @@ -1389,18 +1388,6 @@ public: // zone handling - /** - * Function Delete_OldZone_Fill (obsolete) - * Used for compatibility with old boards - * Remove the zone filling which include the segment aZone, or the zone - * which have the given time stamp. - * For old boards, a zone is a group of SEGZONE segments which have the same TimeStamp - * @param aZone = zone segment within the zone to delete. Can be NULL - * @param aTimestamp = Timestamp for the zone to delete, used if aZone == - * NULL - */ - void Delete_OldZone_Fill( SEGZONE* aZone, timestamp_t aTimestamp = 0 ); - /** * Function Delete_LastCreatedCorner * Used only while creating a new zone outline @@ -1436,19 +1423,13 @@ public: * The filling starts from starting points like pads, tracks. * If exists the old filling is removed * @param aZone = zone to fill - * @return error level (0 = no error) */ - int Fill_Zone( ZONE_CONTAINER* aZone ); + void Fill_Zone( ZONE_CONTAINER* aZone ); /** * Function Fill_All_Zones - * Fill all zones on the board - * The old fillings are removed - * @param aActiveWindow = the current active window, if a progress bar is shown. - * the progress bar will be on top of aActiveWindow - * aActiveWindow = NULL to do not display a progress bar */ - int Fill_All_Zones( wxWindow * aActiveWindow ); + void Fill_All_Zones(); /** * Function Check_All_Zones diff --git a/pcbnew/pcb_legacy_draw_utils.cpp b/pcbnew/pcb_legacy_draw_utils.cpp index a4be22ee87..8389a3971e 100644 --- a/pcbnew/pcb_legacy_draw_utils.cpp +++ b/pcbnew/pcb_legacy_draw_utils.cpp @@ -157,16 +157,6 @@ void BOARD::Draw( EDA_DRAW_PANEL* aPanel, wxDC* DC, GR_DRAWMODE aDrawMode, const track->Draw( aPanel, DC, aDrawMode ); } - // SEGZONE is deprecated, only for compatibility with - // very old designs - for( SEGZONE* zone = m_SegZoneDeprecated; zone; zone = zone->Next() ) - { - if( zone->IsMoving() ) - continue; - - zone->Draw( aPanel, DC, aDrawMode ); - } - // Draw areas (i.e. zones) for( int ii = 0; ii < GetAreaCount(); ii++ ) { diff --git a/pcbnew/pcb_painter.cpp b/pcbnew/pcb_painter.cpp index 596ab476b3..3bb0b79f3d 100644 --- a/pcbnew/pcb_painter.cpp +++ b/pcbnew/pcb_painter.cpp @@ -310,7 +310,6 @@ bool PCB_PAINTER::Draw( const VIEW_ITEM* aItem, int aLayer ) // the "cast" applied in here clarifies which overloaded draw() is called switch( item->Type() ) { - case PCB_SEGZONE_T: case PCB_TRACE_T: draw( static_cast( item ), aLayer ); break; diff --git a/pcbnew/pcb_painter.h b/pcbnew/pcb_painter.h index 5073690214..5844a60b23 100644 --- a/pcbnew/pcb_painter.h +++ b/pcbnew/pcb_painter.h @@ -43,7 +43,6 @@ class TRACK; class D_PAD; class DRAWSEGMENT; class MODULE; -class SEGZONE; class ZONE_CONTAINER; class TEXTE_PCB; class TEXTE_MODULE; diff --git a/pcbnew/pcb_parser.cpp b/pcbnew/pcb_parser.cpp index ddb1fa6029..895085f7be 100644 --- a/pcbnew/pcb_parser.cpp +++ b/pcbnew/pcb_parser.cpp @@ -56,6 +56,7 @@ using namespace PCB_KEYS_T; void PCB_PARSER::init() { + m_showLegacyZoneWarning = true; m_tooRecent = false; m_requiredVersion = 0; m_layerIndices.clear(); @@ -648,9 +649,6 @@ BOARD* PCB_PARSER::parseBOARD_unchecked() visitItem( segm ); } - for( TRACK* segm = m_board->m_SegZoneDeprecated; segm; segm = segm->Next() ) - visitItem( segm ); - for( BOARD_ITEM* zone : m_board->Zones() ) visitItem( zone ); @@ -3183,7 +3181,27 @@ ZONE_CONTAINER* PCB_PARSER::parseZONE_CONTAINER() Expecting( "segment, hatch or polygon" ); if( token == T_segment ) // deprecated - zone->SetFillMode( ZFM_SEGMENTS ); + { + // SEGMENT fill mode no longer supported. Make sure user is OK with converting them. + if( m_showLegacyZoneWarning ) + { + KIDIALOG dlg( nullptr, + _( "The legacy segment fill mode is no longer supported.\n" + "Convert zones to polygon fills?"), + _( "Legacy Zone Warning" ), + wxYES_NO | wxICON_WARNING ); + + dlg.DoNotShowCheckbox( __FILE__, __LINE__ ); + + if( dlg.ShowModal() == wxID_NO ) + THROW_IO_ERROR( wxT( "CANCEL" ) ); + + m_showLegacyZoneWarning = false; + } + + zone->SetFillMode( ZFM_POLYGONS ); + m_board->SetModified(); + } else if( token == T_hatch ) zone->SetFillMode( ZFM_HATCH_PATTERN ); else diff --git a/pcbnew/pcb_parser.h b/pcbnew/pcb_parser.h index f805f7e89e..0ec787515d 100644 --- a/pcbnew/pcb_parser.h +++ b/pcbnew/pcb_parser.h @@ -75,6 +75,8 @@ class PCB_PARSER : public PCB_LEXER bool m_tooRecent; ///< true if version parses as later than supported int m_requiredVersion; ///< set to the KiCad format version this board requires + bool m_showLegacyZoneWarning; + ///> Converts net code using the mapping table if available, ///> otherwise returns unchanged net code if < 0 or if is is out of range inline int getNetCode( int aNetCode ) diff --git a/pcbnew/pcbnew_id.h b/pcbnew/pcbnew_id.h index eedca2d9cc..ec043de10f 100644 --- a/pcbnew/pcbnew_id.h +++ b/pcbnew/pcbnew_id.h @@ -113,7 +113,6 @@ enum pcbnew_ids ID_POPUP_PCB_PLACE_ZONE_CORNER, ID_POPUP_PCB_DELETE_ZONE_LAST_CREATED_CORNER, ID_POPUP_PCB_EDIT_ZONE_PARAMS, - ID_POPUP_PCB_DELETE_ZONE, ID_POPUP_PCB_STOP_CURRENT_EDGE_ZONE, ID_POPUP_PCB_FILL_ALL_ZONES, ID_POPUP_PCB_FILL_ZONE, diff --git a/pcbnew/plot_board_layers.cpp b/pcbnew/plot_board_layers.cpp index 3f74551848..df321b4d1d 100644 --- a/pcbnew/plot_board_layers.cpp +++ b/pcbnew/plot_board_layers.cpp @@ -138,17 +138,6 @@ void PlotSilkScreen( BOARD *aBoard, PLOTTER* aPlotter, LSET aLayerMask, } aPlotter->EndBlock( NULL ); - - // Plot segments used to fill zone areas (deprecated, but here for very old boards - // compatibility): - for( SEGZONE* seg = aBoard->m_SegZoneDeprecated; seg; seg = seg->Next() ) - { - if( !aLayerMask[ seg->GetLayer() ] ) - continue; - - aPlotter->ThickSegment( seg->GetStart(), seg->GetEnd(), seg->GetWidth(), - itemplotter.GetPlotMode(), NULL ); - } } void PlotOneBoardLayer( BOARD *aBoard, PLOTTER* aPlotter, PCB_LAYER_ID aLayer, @@ -573,17 +562,6 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, aPlotter->EndBlock( NULL ); - // Plot zones (deprecated, for very old boards compatibility): - for( TRACK* track = aBoard->m_SegZoneDeprecated; track; track = track->Next() ) - { - if( !aLayerMask[track->GetLayer()] ) - continue; - - int width = track->GetWidth() + itemplotter.getFineWidthAdj(); - aPlotter->SetColor( itemplotter.getColor( track->GetLayer() ) ); - aPlotter->ThickSegment( track->GetStart(), track->GetEnd(), width, plotMode, NULL ); - } - // Plot filled ares aPlotter->StartBlock( NULL ); for( int ii = 0; ii < aBoard->GetAreaCount(); ii++ ) diff --git a/pcbnew/plot_brditems_plotter.cpp b/pcbnew/plot_brditems_plotter.cpp index 52e05c0b34..03dcb871fd 100644 --- a/pcbnew/plot_brditems_plotter.cpp +++ b/pcbnew/plot_brditems_plotter.cpp @@ -1,13 +1,7 @@ -/** - * @file plot_brditems_plotter.cpp - * @brief basic plot functions to plot board items, or a group of board items. - */ - - /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 1992-2018 KiCad Developers, see AUTHORS.txt for contributors. + * Copyright (C) 1992-2019 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 @@ -284,25 +278,11 @@ void BRDITEMS_PLOTTER::PlotBoardGraphicItems() { switch( item->Type() ) { - case PCB_LINE_T: - PlotDrawSegment( (DRAWSEGMENT*) item); - break; - - case PCB_TEXT_T: - PlotTextePcb( (TEXTE_PCB*) item ); - break; - - case PCB_DIMENSION_T: - PlotDimension( (DIMENSION*) item ); - break; - - case PCB_TARGET_T: - PlotPcbTarget( (PCB_TARGET*) item ); - break; - - case PCB_MARKER_T: - default: - break; + case PCB_LINE_T: PlotDrawSegment( (DRAWSEGMENT*) item); break; + case PCB_TEXT_T: PlotTextePcb( (TEXTE_PCB*) item ); break; + case PCB_DIMENSION_T: PlotDimension( (DIMENSION*) item ); break; + case PCB_TARGET_T: PlotPcbTarget( (PCB_TARGET*) item ); break; + default: break; } } } @@ -341,9 +321,7 @@ void BRDITEMS_PLOTTER::PlotTextModule( TEXTE_MODULE* pt_texte, COLOR4D aColor ) MODULE* parent = static_cast ( pt_texte->GetParent() ); gbr_metadata.SetCmpReference( parent->GetReference() ); - m_plotter->Text( pos, aColor, - pt_texte->GetShownText(), - orient, size, + m_plotter->Text( pos, aColor, pt_texte->GetShownText(), orient, size, pt_texte->GetHorizJustify(), pt_texte->GetVertJustify(), thickness, pt_texte->IsItalic(), allow_bold, false, &gbr_metadata ); } @@ -539,10 +517,8 @@ void BRDITEMS_PLOTTER::Plot_1_EdgeModule( EDGE_MODULE* aEdge ) cornerList.reserve( polyPoints.size() ); - for( unsigned ii = 0; ii < polyPoints.size(); ii++ ) + for( wxPoint corner : polyPoints ) { - wxPoint corner = polyPoints[ii]; - if( module ) { RotatePoint( &corner, module->GetOrientation() ); @@ -556,12 +532,12 @@ void BRDITEMS_PLOTTER::Plot_1_EdgeModule( EDGE_MODULE* aEdge ) { for( size_t i = 1; i < cornerList.size(); i++ ) { - m_plotter->ThickSegment( cornerList[i-1], cornerList[i], - thickness, GetPlotMode(), &gbr_metadata ); + m_plotter->ThickSegment( cornerList[i-1], cornerList[i], thickness, + GetPlotMode(), &gbr_metadata ); } - m_plotter->ThickSegment( cornerList.back(), cornerList.front(), - thickness, GetPlotMode(), &gbr_metadata ); + m_plotter->ThickSegment( cornerList.back(), cornerList.front(), thickness, + GetPlotMode(), &gbr_metadata ); } else @@ -592,9 +568,7 @@ void BRDITEMS_PLOTTER::PlotTextePcb( TEXTE_PCB* pt_texte ) GBR_METADATA gbr_metadata; if( IsCopperLayer( pt_texte->GetLayer() ) ) - { gbr_metadata.SetApertureAttrib( GBR_APERTURE_METADATA::GBR_APERTURE_ATTRIB_NONCONDUCTOR ); - } COLOR4D color = getColor( pt_texte->GetLayer() ); m_plotter->SetColor( color ); @@ -690,43 +664,23 @@ void BRDITEMS_PLOTTER::PlotFilledAreas( ZONE_CONTAINER* aZone ) { // First, close the outline if( cornerList[0] != cornerList[cornerList.size() - 1] ) - { cornerList.push_back( cornerList[0] ); - } // Plot the current filled area and its outline if( GetPlotMode() == FILLED ) { - // Plot the filled area polygon. - // The area can be filled by segments (outdated) or uses solid polygons - if( aZone->GetFillMode() != ZONE_FILL_MODE::ZFM_SEGMENTS ) // We are using solid polygons - { - m_plotter->PlotPoly( cornerList, FILLED_SHAPE, aZone->GetMinThickness(), &gbr_metadata ); - } - else // We are using areas filled by segments: plot segments and outline - { - for( unsigned iseg = 0; iseg < aZone->FillSegments().size(); iseg++ ) - { - wxPoint start = (wxPoint) aZone->FillSegments()[iseg].A; - wxPoint end = (wxPoint) aZone->FillSegments()[iseg].B; - m_plotter->ThickSegment( start, end, - aZone->GetMinThickness(), - GetPlotMode(), &gbr_metadata ); - } - - // Plot the area outline only - if( aZone->GetMinThickness() > 0 ) - m_plotter->PlotPoly( cornerList, NO_FILL, aZone->GetMinThickness() ); - } + m_plotter->PlotPoly( cornerList, FILLED_SHAPE, aZone->GetMinThickness(), &gbr_metadata ); } else { if( aZone->GetMinThickness() > 0 ) { - for( unsigned jj = 1; jjThickSegment( cornerList[jj -1], cornerList[jj], aZone->GetMinThickness(), GetPlotMode(), &gbr_metadata ); + } } m_plotter->SetCurrentLineWidth( -1 ); @@ -759,9 +713,7 @@ void BRDITEMS_PLOTTER::PlotDrawSegment( DRAWSEGMENT* aSeg ) bool isOnCopperLayer = ( m_layerMask & LSET::AllCuMask() ).any(); if( isOnCopperLayer && aSeg->GetLayer() == Edge_Cuts ) // can happens when plotting copper layers - { gbr_metadata.SetApertureAttrib( GBR_APERTURE_METADATA::GBR_APERTURE_ATTRIB_NONCONDUCTOR ); - } switch( aSeg->GetShape() ) { @@ -788,8 +740,10 @@ void BRDITEMS_PLOTTER::PlotDrawSegment( DRAWSEGMENT* aSeg ) const std::vector& bezierPoints = aSeg->GetBezierPoints(); for( unsigned i = 1; i < bezierPoints.size(); i++ ) + { m_plotter->ThickSegment( bezierPoints[i - 1], bezierPoints[i], thickness, GetPlotMode(), &gbr_metadata ); + } } break; @@ -833,10 +787,9 @@ void BRDITEMS_PLOTTER::PlotDrawSegment( DRAWSEGMENT* aSeg ) /** Helper function to plot a single drill mark. It compensate and clamp * the drill mark size depending on the current plot options */ -void BRDITEMS_PLOTTER::plotOneDrillMark( PAD_DRILL_SHAPE_T aDrillShape, - const wxPoint &aDrillPos, wxSize aDrillSize, - const wxSize &aPadSize, - double aOrientation, int aSmallDrill ) +void BRDITEMS_PLOTTER::plotOneDrillMark( PAD_DRILL_SHAPE_T aDrillShape, const wxPoint &aDrillPos, + wxSize aDrillSize, const wxSize &aPadSize, + double aOrientation, int aSmallDrill ) { // Small drill marks have no significance when applied to slots if( aSmallDrill && aDrillShape == PAD_DRILL_SHAPE_CIRCLE ) @@ -883,9 +836,11 @@ void BRDITEMS_PLOTTER::PlotDrillMarks() const VIA* via = dyn_cast( pts ); if( via ) + { plotOneDrillMark( PAD_DRILL_SHAPE_CIRCLE, via->GetStart(), wxSize( via->GetDrillValue(), 0 ), wxSize( via->GetWidth(), 0 ), 0, small_drill ); + } } for( MODULE* Module = m_board->m_Modules; Module != NULL; Module = Module->Next() ) diff --git a/pcbnew/swig/pcbnew_action_plugins.cpp b/pcbnew/swig/pcbnew_action_plugins.cpp index f10f0fd58b..63c0744243 100644 --- a/pcbnew/swig/pcbnew_action_plugins.cpp +++ b/pcbnew/swig/pcbnew_action_plugins.cpp @@ -248,13 +248,6 @@ void PCB_EDIT_FRAME::RunActionPlugin( ACTION_PLUGIN* aActionPlugin ) itemsList.PushItem( picker ); } - // Append zones segm: - for( BOARD_ITEM* item = currentPcb->m_SegZoneDeprecated; item != NULL; item = item->Next() ) - { - ITEM_PICKER picker( item, UR_CHANGED ); - itemsList.PushItem( picker ); - } - if( itemsList.GetCount() > 0 ) SaveCopyInUndoList( itemsList, UR_CHANGED, wxPoint( 0.0, 0.0 ) ); else @@ -306,7 +299,6 @@ void PCB_EDIT_FRAME::RunActionPlugin( ACTION_PLUGIN* aActionPlugin ) case PCB_TEXT_T: case PCB_DIMENSION_T: case PCB_TARGET_T: - case PCB_SEGZONE_T: // If item has a list it's mean that the element is on the board if( item->GetList() == NULL ) @@ -375,15 +367,6 @@ void PCB_EDIT_FRAME::RunActionPlugin( ACTION_PLUGIN* aActionPlugin ) } } - for( BOARD_ITEM* item = currentPcb->m_SegZoneDeprecated; item != NULL; item = item->Next() ) - { - if( !oldBuffer->ContainsItem( item ) ) - { - ITEM_PICKER picker( item, UR_NEW ); - oldBuffer->PushItem( picker ); - } - } - for( int ii = 0; ii < currentPcb->GetAreaCount(); ii++ ) { if( !oldBuffer->ContainsItem( (EDA_ITEM*) currentPcb->GetArea( ii ) ) ) diff --git a/pcbnew/tools/pcb_actions.h b/pcbnew/tools/pcb_actions.h index 34b3cd1056..3120396220 100644 --- a/pcbnew/tools/pcb_actions.h +++ b/pcbnew/tools/pcb_actions.h @@ -305,7 +305,6 @@ public: static TOOL_ACTION zoneUnfill; static TOOL_ACTION zoneUnfillAll; static TOOL_ACTION zoneMerge; - static TOOL_ACTION zoneDeleteSegzone; /// Duplicate zone onto another layer static TOOL_ACTION zoneDuplicate; diff --git a/pcbnew/tools/pcb_editor_control.cpp b/pcbnew/tools/pcb_editor_control.cpp index 9a455d61ae..82096d884d 100644 --- a/pcbnew/tools/pcb_editor_control.cpp +++ b/pcbnew/tools/pcb_editor_control.cpp @@ -312,8 +312,6 @@ bool PCB_EDITOR_CONTROL::Init() menu.AddItem( PCB_ACTIONS::findMove, inactiveStateCondition ); menu.AddSeparator( inactiveStateCondition ); - menu.AddItem( PCB_ACTIONS::zoneDeleteSegzone, - SELECTION_CONDITIONS::OnlyType( PCB_SEGZONE_T ) ); toolMenu.AddSubMenu( zoneMenu ); toolMenu.AddSubMenu( lockMenu ); diff --git a/pcbnew/tools/zone_filler_tool.cpp b/pcbnew/tools/zone_filler_tool.cpp index ea208606ed..52378ec98a 100644 --- a/pcbnew/tools/zone_filler_tool.cpp +++ b/pcbnew/tools/zone_filler_tool.cpp @@ -58,10 +58,6 @@ TOOL_ACTION PCB_ACTIONS::zoneUnfillAll( "pcbnew.ZoneFiller.zoneUnfillAll", AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_ZONE_REMOVE_FILLED ), _( "Unfill All" ), _( "Unfill all zones" ) ); -TOOL_ACTION PCB_ACTIONS::zoneDeleteSegzone( "pcbnew.ZoneFiller.zoneDeleteSegzone", - AS_GLOBAL, 0, - _( "Delete Zone Filling" ), _( "Delete Zone Filling" ), delete_xpm ); - ZONE_FILLER_TOOL::ZONE_FILLER_TOOL() : PCB_TOOL( "pcbnew.ZoneFiller" ) { @@ -157,34 +153,6 @@ int ZONE_FILLER_TOOL::ZoneUnfill( const TOOL_EVENT& aEvent ) } -int ZONE_FILLER_TOOL::SegzoneDeleteFill( const TOOL_EVENT& aEvent ) -{ - BOARD_COMMIT commit( this ); - BOARD* board = (BOARD*) m_toolMgr->GetModel(); - - for( auto item : selection() ) - { - assert( item->Type() == PCB_SEGZONE_T ); - - timestamp_t timestamp = item->GetTimeStamp(); // Save reference time stamp (aZone will be deleted) - SEGZONE* next; - - for( SEGZONE* zone = board->m_SegZoneDeprecated; zone; zone = next ) - { - next = zone->Next(); - - if( timestamp == zone->GetTimeStamp() ) - commit.Remove( zone ); - } - } - - commit.Push( _( "Delete Zone Filling" ) ); - canvas()->Refresh(); - - return 0; -} - - int ZONE_FILLER_TOOL::ZoneUnfillAll( const TOOL_EVENT& aEvent ) { BOARD_COMMIT commit( this ); @@ -211,5 +179,4 @@ void ZONE_FILLER_TOOL::setTransitions() Go( &ZONE_FILLER_TOOL::ZoneFillAll, PCB_ACTIONS::zoneFillAll.MakeEvent() ); Go( &ZONE_FILLER_TOOL::ZoneUnfill, PCB_ACTIONS::zoneUnfill.MakeEvent() ); Go( &ZONE_FILLER_TOOL::ZoneUnfillAll, PCB_ACTIONS::zoneUnfillAll.MakeEvent() ); - Go( &ZONE_FILLER_TOOL::SegzoneDeleteFill, PCB_ACTIONS::zoneDeleteSegzone.MakeEvent() ); } diff --git a/pcbnew/tools/zone_filler_tool.h b/pcbnew/tools/zone_filler_tool.h index 98cf39b1bd..4ff7ad521f 100644 --- a/pcbnew/tools/zone_filler_tool.h +++ b/pcbnew/tools/zone_filler_tool.h @@ -50,9 +50,6 @@ public: int ZoneUnfill( const TOOL_EVENT& aEvent ); int ZoneUnfillAll( const TOOL_EVENT& aEvent ); - // Segzone action - int SegzoneDeleteFill( const TOOL_EVENT& aEvent ); - private: ///> Sets up handlers for various events. void setTransitions() override; diff --git a/pcbnew/undo_redo.cpp b/pcbnew/undo_redo.cpp index a063df1e26..10a614f212 100644 --- a/pcbnew/undo_redo.cpp +++ b/pcbnew/undo_redo.cpp @@ -152,10 +152,6 @@ static bool TestForExistingItem( BOARD* aPcb, BOARD_ITEM* aItem ) for( int ii = 0; ii < aPcb->GetAreaCount(); ii++ ) itemsList.push_back( aPcb->GetArea( ii ) ); - // Append zones segm (deprecated items): - for( item = aPcb->m_SegZoneDeprecated; item != NULL; item = item->Next() ) - itemsList.push_back( item ); - NETINFO_LIST& netInfo = aPcb->GetNetInfo(); for( NETINFO_LIST::iterator i = netInfo.begin(); i != netInfo.end(); ++i ) diff --git a/pcbnew/zone_filler.cpp b/pcbnew/zone_filler.cpp index b0a00f9921..3e2e3fec54 100644 --- a/pcbnew/zone_filler.cpp +++ b/pcbnew/zone_filler.cpp @@ -52,6 +52,28 @@ #include "zone_filler.h" +class PROGRESS_REPORTER_HIDER +{ +public: + PROGRESS_REPORTER_HIDER( WX_PROGRESS_REPORTER* aReporter ) + { + m_reporter = aReporter; + + if( aReporter ) + aReporter->Hide(); + } + + ~PROGRESS_REPORTER_HIDER() + { + if( m_reporter ) + m_reporter->Show(); + } + +private: + WX_PROGRESS_REPORTER* m_reporter; +}; + + extern void CreateThermalReliefPadPolygon( SHAPE_POLY_SET& aCornerBuffer, const D_PAD& aPad, int aThermalGap, int aCopperThickness, int aMinThicknessValue, int aCircleToSegmentsCount, @@ -60,6 +82,7 @@ extern void CreateThermalReliefPadPolygon( SHAPE_POLY_SET& aCornerBuffer, static double s_thermalRot = 450; // angle of stubs in thermal reliefs for round pads static const bool s_DumpZonesWhenFilling = false; + ZONE_FILLER::ZONE_FILLER( BOARD* aBoard, COMMIT* aCommit ) : m_board( aBoard ), m_commit( aCommit ), m_progressReporter( nullptr ) { @@ -76,7 +99,8 @@ void ZONE_FILLER::SetProgressReporter( WX_PROGRESS_REPORTER* aReporter ) m_progressReporter = aReporter; } -bool ZONE_FILLER::Fill( std::vector aZones, bool aCheck ) + +bool ZONE_FILLER::Fill( const std::vector& aZones, bool aCheck ) { std::vector toFill; auto connectivity = m_board->GetConnectivity(); @@ -86,6 +110,12 @@ bool ZONE_FILLER::Fill( std::vector aZones, bool aCheck ) if( !lock ) return false; + if( m_progressReporter ) + { + m_progressReporter->Report( _( "Checking zone fills..." ) ); + m_progressReporter->SetMaxProgress( toFill.size() ); + } + for( auto zone : aZones ) { // Keepout zones are not filled @@ -107,15 +137,6 @@ bool ZONE_FILLER::Fill( std::vector aZones, bool aCheck ) zone->UnFill(); } - if( m_progressReporter ) - { - m_progressReporter->Report( _( "Checking zone fills..." ) ); - m_progressReporter->SetMaxProgress( toFill.size() ); - } - - // Remove deprecaded segment zones (only found in very old boards) - m_board->m_SegZoneDeprecated.DeleteAll(); - std::atomic nextItem( 0 ); size_t parallelThreadCount = std::min( std::thread::hardware_concurrency(), toFill.size() ); std::vector> returns( parallelThreadCount ); @@ -132,14 +153,6 @@ bool ZONE_FILLER::Fill( std::vector aZones, bool aCheck ) zone->SetRawPolysList( rawPolys ); zone->SetFilledPolysList( finalPolys ); - - if( zone->GetFillMode() == ZFM_SEGMENTS ) - { - ZONE_SEGMENT_FILL segFill; - fillZoneWithSegments( zone, zone->GetFilledPolysList(), segFill ); - zone->SetFillSegments( segFill ); - } - zone->SetIsFilled( true ); if( m_progressReporter ) @@ -204,10 +217,9 @@ bool ZONE_FILLER::Fill( std::vector aZones, bool aCheck ) poly.DeletePolygon( idx ); } } - // zones with no net can have areas outside the board cutouts. - // Please, use only this clipping for no nets zones: this is a very time consumming - // calculation (x 5 in a test case if made for all zones), - // mainly due to poly.Fracture + // Zones with no net can have areas outside the board cutouts. + // Please, use only this clipping for no-net zones: this is a very time consumming + // calculation (x 5 in a test case if made for all zones), mainly due to poly.Fracture else if( clip_to_brd_outlines ) { poly.BooleanIntersection( boardOutline, SHAPE_POLY_SET::PM_FAST ); @@ -220,27 +232,16 @@ bool ZONE_FILLER::Fill( std::vector aZones, bool aCheck ) outOfDate = true; } - if( aCheck ) + if( aCheck && outOfDate ) { - bool refill = false; - wxCHECK( m_progressReporter, false ); + PROGRESS_REPORTER_HIDER raii( m_progressReporter ); + KIDIALOG dlg( m_progressReporter->GetParent(), + _( "Zone fills are out-of-date. Refill?" ), + _( "Confirmation" ), wxOK | wxCANCEL | wxICON_WARNING ); + dlg.SetOKCancelLabels( _( "Refill" ), _( "Continue without Refill" ) ); + dlg.DoNotShowCheckbox( __FILE__, __LINE__ ); - if( outOfDate ) - { - m_progressReporter->Hide(); - - KIDIALOG dlg( m_progressReporter->GetParent(), - _( "Zone fills are out-of-date. Refill?" ), - _( "Confirmation" ), wxOK | wxCANCEL | wxICON_WARNING ); - dlg.SetOKCancelLabels( _( "Refill" ), _( "Continue without Refill" ) ); - dlg.DoNotShowCheckbox( __FILE__, __LINE__ ); - - refill = ( dlg.ShowModal() == wxID_OK ); - - m_progressReporter->Show(); - } - - if( !refill ) + if( dlg.ShowModal() == wxID_CANCEL ) { if( m_commit ) m_commit->Revert(); @@ -312,10 +313,8 @@ bool ZONE_FILLER::Fill( std::vector aZones, bool aCheck ) } else { - for( unsigned i = 0; i < toFill.size(); i++ ) - { - connectivity->Update( toFill[i].m_zone ); - } + for( auto& i : toFill ) + connectivity->Update( i.m_zone ); connectivity->RecalculateRatsnest(); } @@ -867,169 +866,6 @@ bool ZONE_FILLER::fillSingleZone( ZONE_CONTAINER* aZone, SHAPE_POLY_SET& aRawPol return true; } -bool ZONE_FILLER::fillZoneWithSegments( ZONE_CONTAINER* aZone, - const SHAPE_POLY_SET& aFilledPolys, - ZONE_SEGMENT_FILL& aFillSegs ) const -{ - bool success = true; - // segments are on something like a grid. Give it a minimal size - // to avoid too many segments, and use the m_ZoneMinThickness when (this is usually the case) - // the size is > mingrid_size. - // This is not perfect, but the actual purpose of this code - // is to allow filling zones on a grid, with grid size > m_ZoneMinThickness, - // in order to have really a grid. - // - // Using a user selectable grid size is for future Kicad versions. - // For now the area is fully filled. - int mingrid_size = Millimeter2iu( 0.05 ); - int grid_size = std::max( mingrid_size, aZone->GetMinThickness() ); - // Make segments slightly overlapping to ensure a good full filling - grid_size -= grid_size/20; - - // Creates the horizontal segments - for ( int index = 0; index < aFilledPolys.OutlineCount(); index++ ) - { - const SHAPE_LINE_CHAIN& outline0 = aFilledPolys.COutline( index ); - success = fillPolygonWithHorizontalSegments( outline0, aFillSegs, grid_size ); - - if( !success ) - break; - - // Creates the vertical segments. Because the filling algo creates horizontal segments, - // to reuse the fillPolygonWithHorizontalSegments function, we rotate the polygons to fill - // then fill them, then inverse rotate the result - SHAPE_LINE_CHAIN outline90; - outline90.Append( outline0 ); - - // Rotate 90 degrees the outline: - for( int ii = 0; ii < outline90.PointCount(); ii++ ) - { - VECTOR2I& point = outline90.Point( ii ); - std::swap( point.x, point.y ); - point.y = -point.y; - } - - int first_point = aFillSegs.size(); - success = fillPolygonWithHorizontalSegments( outline90, aFillSegs, grid_size ); - - if( !success ) - break; - - // Rotate -90 degrees the segments: - for( unsigned ii = first_point; ii < aFillSegs.size(); ii++ ) - { - SEG& segm = aFillSegs[ii]; - std::swap( segm.A.x, segm.A.y ); - std::swap( segm.B.x, segm.B.y ); - segm.A.x = - segm.A.x; - segm.B.x = - segm.B.x; - } - } - - aZone->SetNeedRefill( false ); - return success; -} - -/** Helper function fillPolygonWithHorizontalSegments - * fills a polygon with horizontal segments. - * It can be used for any angle, if the zone outline to fill is rotated by this angle - * and the result is rotated by -angle - * @param aPolygon = a SHAPE_LINE_CHAIN polygon to fill - * @param aFillSegmList = a std::vector\ which will be populated by filling segments - * @param aStep = the horizontal grid size - */ -bool ZONE_FILLER::fillPolygonWithHorizontalSegments( const SHAPE_LINE_CHAIN& aPolygon, - ZONE_SEGMENT_FILL& aFillSegmList, int aStep ) const -{ - std::vector x_coordinates; - bool success = true; - - // Creates the horizontal segments - const SHAPE_LINE_CHAIN& outline = aPolygon; - const BOX2I& rect = outline.BBox(); - - // Calculate the y limits of the zone - for( int refy = rect.GetY(), endy = rect.GetBottom(); refy < endy; refy += aStep ) - { - // find all intersection points of an infinite line with polyline sides - x_coordinates.clear(); - - for( int v = 0; v < outline.PointCount(); v++ ) - { - - int seg_startX = outline.CPoint( v ).x; - int seg_startY = outline.CPoint( v ).y; - int seg_endX = outline.CPoint( v + 1 ).x; - int seg_endY = outline.CPoint( v + 1 ).y; - - /* Trivial cases: skip if ref above or below the segment to test */ - if( ( seg_startY > refy ) && ( seg_endY > refy ) ) - continue; - - // segment below ref point, or its Y end pos on Y coordinate ref point: skip - if( ( seg_startY <= refy ) && (seg_endY <= refy ) ) - continue; - - /* at this point refy is between seg_startY and seg_endY - * see if an horizontal line at Y = refy is intersecting this segment - */ - // calculate the x position of the intersection of this segment and the - // infinite line this is more easier if we move the X,Y axis origin to - // the segment start point: - - seg_endX -= seg_startX; - seg_endY -= seg_startY; - double newrefy = (double) ( refy - seg_startY ); - double intersec_x; - - if ( seg_endY == 0 ) // horizontal segment on the same line: skip - continue; - - // Now calculate the x intersection coordinate of the horizontal line at - // y = newrefy and the segment from (0,0) to (seg_endX,seg_endY) with the - // horizontal line at the new refy position the line slope is: - // slope = seg_endY/seg_endX; and inv_slope = seg_endX/seg_endY - // and the x pos relative to the new origin is: - // intersec_x = refy/slope = refy * inv_slope - // Note: because horizontal segments are already tested and skipped, slope - // exists (seg_end_y not O) - double inv_slope = (double) seg_endX / seg_endY; - intersec_x = newrefy * inv_slope; - x_coordinates.push_back( (int) intersec_x + seg_startX ); - } - - // A line scan is finished: build list of segments - - // Sort intersection points by increasing x value: - // So 2 consecutive points are the ends of a segment - std::sort( x_coordinates.begin(), x_coordinates.end() ); - - // An even number of coordinates is expected, because a segment has 2 ends. - // An if this algorithm always works, it must always find an even count. - if( ( x_coordinates.size() & 1 ) != 0 ) - { - success = false; - break; - } - - // Create segments having the same Y coordinate - int iimax = x_coordinates.size() - 1; - - for( int ii = 0; ii < iimax; ii += 2 ) - { - VECTOR2I seg_start, seg_end; - seg_start.x = x_coordinates[ii]; - seg_start.y = refy; - seg_end.x = x_coordinates[ii + 1]; - seg_end.y = refy; - SEG segment( seg_start, seg_end ); - aFillSegmList.push_back( segment ); - } - } // End examine segments in one area - - return success; -} - /** * Function buildUnconnectedThermalStubsPolygonList diff --git a/pcbnew/zone_filler.h b/pcbnew/zone_filler.h index 062731a023..f4301520a2 100644 --- a/pcbnew/zone_filler.h +++ b/pcbnew/zone_filler.h @@ -42,7 +42,7 @@ public: ~ZONE_FILLER(); void SetProgressReporter( WX_PROGRESS_REPORTER* aReporter ); - bool Fill( std::vector aZones, bool aCheck = false ); + bool Fill( const std::vector& aZones, bool aCheck = false ); private: @@ -66,21 +66,6 @@ private: SHAPE_POLY_SET& aRawPolys, SHAPE_POLY_SET& aFinalPolys ) const; - bool fillPolygonWithHorizontalSegments( const SHAPE_LINE_CHAIN& aPolygon, - ZONE_SEGMENT_FILL& aFillSegmList, int aStep ) const; - - /** - * Function fillZoneWithSegments - * Fill sub areas in a zone with segments with m_ZoneMinThickness width - * A scan is made line per line, on the whole filled areas, with a step of m_ZoneMinThickness. - * all intersecting points with the horizontal infinite line and polygons to fill are calculated - * a list of SEGZONE items is built, line per line - * @return true if success, false on error - */ - bool fillZoneWithSegments( ZONE_CONTAINER* aZone, - const SHAPE_POLY_SET& aFilledPolys, - ZONE_SEGMENT_FILL& aFillSegs ) const; - /** * Function buildUnconnectedThermalStubsPolygonList * Creates a set of polygons corresponding to stubs created by thermal shapes on pads diff --git a/pcbnew/zone_settings.h b/pcbnew/zone_settings.h index d23391e4d2..78732896b1 100644 --- a/pcbnew/zone_settings.h +++ b/pcbnew/zone_settings.h @@ -37,8 +37,7 @@ enum ZONE_FILL_MODE { ZFM_POLYGONS = 0, // fill zone with polygons - ZFM_SEGMENTS = 1, // fill zone with segments (legacy) - ZFM_HATCH_PATTERN = 2 // fill zone using a grid pattern + ZFM_HATCH_PATTERN = 1 // fill zone using a grid pattern }; /** diff --git a/pcbnew/zones_by_polygon.cpp b/pcbnew/zones_by_polygon.cpp index 894b7892ea..e5711252d6 100644 --- a/pcbnew/zones_by_polygon.cpp +++ b/pcbnew/zones_by_polygon.cpp @@ -996,9 +996,6 @@ void PCB_EDIT_FRAME::Delete_Zone_Contour( wxDC* DC, ZONE_CONTAINER* aZone ) EDA_RECT dirty = aZone->GetBoundingBox(); - // For compatibility with old boards: remove old SEGZONE fill segments - Delete_OldZone_Fill( NULL, aZone->GetTimeStamp() ); - // Remove current filling: aZone->UnFill(); diff --git a/pcbnew/zones_by_polygon_fill_functions.cpp b/pcbnew/zones_by_polygon_fill_functions.cpp index dfc1e0e0b8..2bd813c926 100644 --- a/pcbnew/zones_by_polygon_fill_functions.cpp +++ b/pcbnew/zones_by_polygon_fill_functions.cpp @@ -52,54 +52,10 @@ #include -/** - * Function Delete_OldZone_Fill (obsolete) - * Used for compatibility with old boards - * Remove the zone filling which include the segment aZone, or the zone which have the - * given time stamp. - * A zone is a group of segments which have the same TimeStamp - * @param aZone = zone segment within the zone to delete. Can be NULL - * @param aTimestamp = Timestamp for the zone to delete, used if aZone == NULL - */ -void PCB_EDIT_FRAME::Delete_OldZone_Fill( SEGZONE* aZone, timestamp_t aTimestamp ) -{ - bool modify = false; - timestamp_t TimeStamp; - - if( aZone == NULL ) - TimeStamp = aTimestamp; - else - TimeStamp = aZone->GetTimeStamp(); // Save reference time stamp (aZone will be deleted) - - // SEGZONE is a deprecated item, only used for compatibility with very old boards - SEGZONE* next; - - for( SEGZONE* zone = GetBoard()->m_SegZoneDeprecated; zone != NULL; zone = next ) - { - next = zone->Next(); - - if( zone->GetTimeStamp() == TimeStamp ) - { - modify = true; - // remove item from linked list and free memory - zone->DeleteStructure(); - } - } - - if( modify ) - { - OnModify(); - m_canvas->Refresh(); - } -} - - -int PCB_EDIT_FRAME::Fill_All_Zones( wxWindow* aActiveWindow ) +void PCB_EDIT_FRAME::Fill_All_Zones() { auto toolMgr = GetToolManager(); - wxCHECK( toolMgr, 1 ); toolMgr->RunAction( PCB_ACTIONS::zoneFillAll, true ); - return 0; }