KiCad PCB EDA Suite
Loading...
Searching...
No Matches
zone_filler.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2014-2017 CERN
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 * @author Tomasz Włostowski <[email protected]>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, you may find one here:
20 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21 * or you may search the http://www.gnu.org website for the version 2 license,
22 * or you may write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24 */
25
26#ifndef ZONE_FILLER_H
27#define ZONE_FILLER_H
28
29#include <map>
30#include <mutex>
31#include <vector>
32#include <zone.h>
34
36class BOARD;
37class COMMIT;
39
40
42{
43public:
44 ZONE_FILLER( BOARD* aBoard, COMMIT* aCommit );
46
47 void SetProgressReporter( PROGRESS_REPORTER* aReporter );
49
60 bool Fill( const std::vector<ZONE*>& aZones, bool aCheck = false, wxWindow* aParent = nullptr );
61
62 bool IsDebug() const { return m_debugZoneFiller; }
63
64private:
65
66 void addKnockout( BOARD_ITEM* aItem, PCB_LAYER_ID aLayer, int aGap, SHAPE_POLY_SET& aHoles );
67
68 void addKnockout( BOARD_ITEM* aItem, PCB_LAYER_ID aLayer, int aGap, bool aIgnoreLineWidth,
69 SHAPE_POLY_SET& aHoles );
70
71 void addHoleKnockout( PAD* aPad, int aGap, SHAPE_POLY_SET& aHoles );
72
73 void knockoutThermalReliefs( const ZONE* aZone, PCB_LAYER_ID aLayer, SHAPE_POLY_SET& aFill,
74 std::vector<BOARD_ITEM*>& aThermalConnectionPads,
75 std::vector<PAD*>& aNoConnectionPads );
76
77 void buildCopperItemClearances( const ZONE* aZone, PCB_LAYER_ID aLayer,
78 const std::vector<PAD*>& aNoConnectionPads,
79 SHAPE_POLY_SET& aHoles,
80 bool aIncludeZoneClearances = true );
81
86 void buildDifferentNetZoneClearances( const ZONE* aZone, PCB_LAYER_ID aLayer,
87 SHAPE_POLY_SET& aHoles );
88
89 void subtractHigherPriorityZones( const ZONE* aZone, PCB_LAYER_ID aLayer,
90 SHAPE_POLY_SET& aRawFill );
91
103 bool fillCopperZone( const ZONE* aZone, PCB_LAYER_ID aLayer, PCB_LAYER_ID aDebugLayer,
104 const SHAPE_POLY_SET& aSmoothedOutline,
105 const SHAPE_POLY_SET& aMaxExtents, SHAPE_POLY_SET& aFillPolys );
106
107 bool fillNonCopperZone( const ZONE* candidate, PCB_LAYER_ID aLayer,
108 const SHAPE_POLY_SET& aSmoothedOutline, SHAPE_POLY_SET& aFillPolys );
113 void buildThermalSpokes( const ZONE* box, PCB_LAYER_ID aLayer,
114 const std::vector<BOARD_ITEM*>& aSpokedPadsList,
115 std::deque<SHAPE_LINE_CHAIN>& aSpokes );
116
122 void buildHatchZoneThermalRings( const ZONE* aZone, PCB_LAYER_ID aLayer,
123 const SHAPE_POLY_SET& aSmoothedOutline,
124 const std::vector<BOARD_ITEM*>& aThermalConnectionPads,
125 SHAPE_POLY_SET& aFillPolys );
126
132 void connect_nearby_polys( SHAPE_POLY_SET& aPolys, double aDistance );
133
146 bool fillSingleZone( ZONE* aZone, PCB_LAYER_ID aLayer, SHAPE_POLY_SET& aFillPolys );
147
155 bool addHatchFillTypeOnZone( const ZONE* aZone, PCB_LAYER_ID aLayer, PCB_LAYER_ID aDebugLayer,
156 SHAPE_POLY_SET& aFillPolys );
157
163 bool refillZoneFromCache( ZONE* aZone, PCB_LAYER_ID aLayer, SHAPE_POLY_SET& aFillPolys );
164
166 SHAPE_POLY_SET m_boardOutline; // the board outlines, if exists
167 bool m_brdOutlinesValid; // true if m_boardOutline is well-formed
170
173
175
176 // Cache of pre-knockout fills for iterative refill optimization (issue 21746)
177 // Key: (zone pointer, layer), Value: fill polygon before higher-priority zone knockout
178 std::map<std::pair<const ZONE*, PCB_LAYER_ID>, SHAPE_POLY_SET> m_preKnockoutFillCache;
179 mutable std::mutex m_cacheMutex;
180};
181
182#endif
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition board_item.h:83
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:322
Represent a set of changes (additions, deletions or modifications) of a data model (e....
Definition commit.h:72
Definition pad.h:55
A progress reporter interface for use in multi-threaded environments.
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
Represent a set of closed polygons.
COMMIT * m_commit
bool refillZoneFromCache(ZONE *aZone, PCB_LAYER_ID aLayer, SHAPE_POLY_SET &aFillPolys)
Refill a zone from cached pre-knockout fill.
void buildCopperItemClearances(const ZONE *aZone, PCB_LAYER_ID aLayer, const std::vector< PAD * > &aNoConnectionPads, SHAPE_POLY_SET &aHoles, bool aIncludeZoneClearances=true)
Removes clearance from the shape for copper items which share the zone's layer but are not connected ...
int m_worstClearance
bool m_debugZoneFiller
void connect_nearby_polys(SHAPE_POLY_SET &aPolys, double aDistance)
Create strands of zero-width between elements of SHAPE_POLY_SET that are within aDistance of each oth...
void buildThermalSpokes(const ZONE *box, PCB_LAYER_ID aLayer, const std::vector< BOARD_ITEM * > &aSpokedPadsList, std::deque< SHAPE_LINE_CHAIN > &aSpokes)
Function buildThermalSpokes Constructs a list of all thermal spokes for the given zone.
void buildDifferentNetZoneClearances(const ZONE *aZone, PCB_LAYER_ID aLayer, SHAPE_POLY_SET &aHoles)
Build clearance knockout holes for higher-priority zones on different nets.
ZONE_FILLER(BOARD *aBoard, COMMIT *aCommit)
void subtractHigherPriorityZones(const ZONE *aZone, PCB_LAYER_ID aLayer, SHAPE_POLY_SET &aRawFill)
Removes the outlines of higher-proirity zones with the same net.
void knockoutThermalReliefs(const ZONE *aZone, PCB_LAYER_ID aLayer, SHAPE_POLY_SET &aFill, std::vector< BOARD_ITEM * > &aThermalConnectionPads, std::vector< PAD * > &aNoConnectionPads)
Removes thermal reliefs from the shape for any pads connected to the zone.
void addKnockout(BOARD_ITEM *aItem, PCB_LAYER_ID aLayer, int aGap, SHAPE_POLY_SET &aHoles)
Add a knockout for a pad or via.
SHAPE_POLY_SET m_boardOutline
void buildHatchZoneThermalRings(const ZONE *aZone, PCB_LAYER_ID aLayer, const SHAPE_POLY_SET &aSmoothedOutline, const std::vector< BOARD_ITEM * > &aThermalConnectionPads, SHAPE_POLY_SET &aFillPolys)
Build thermal rings for pads in hatch zones.
std::map< std::pair< const ZONE *, PCB_LAYER_ID >, SHAPE_POLY_SET > m_preKnockoutFillCache
bool m_brdOutlinesValid
bool addHatchFillTypeOnZone(const ZONE *aZone, PCB_LAYER_ID aLayer, PCB_LAYER_ID aDebugLayer, SHAPE_POLY_SET &aFillPolys)
for zones having the ZONE_FILL_MODE::ZONE_FILL_MODE::HATCH_PATTERN, create a grid pattern in filled a...
void SetProgressReporter(PROGRESS_REPORTER *aReporter)
std::mutex m_cacheMutex
PROGRESS_REPORTER * GetProgressReporter() const
Definition zone_filler.h:48
BOARD * m_board
PROGRESS_REPORTER * m_progressReporter
bool fillCopperZone(const ZONE *aZone, PCB_LAYER_ID aLayer, PCB_LAYER_ID aDebugLayer, const SHAPE_POLY_SET &aSmoothedOutline, const SHAPE_POLY_SET &aMaxExtents, SHAPE_POLY_SET &aFillPolys)
Function fillCopperZone Add non copper areas polygons (pads and tracks with clearance) to a filled co...
void addHoleKnockout(PAD *aPad, int aGap, SHAPE_POLY_SET &aHoles)
Add a knockout for a pad's hole.
bool fillNonCopperZone(const ZONE *candidate, PCB_LAYER_ID aLayer, const SHAPE_POLY_SET &aSmoothedOutline, SHAPE_POLY_SET &aFillPolys)
bool fillSingleZone(ZONE *aZone, PCB_LAYER_ID aLayer, SHAPE_POLY_SET &aFillPolys)
Build the filled solid areas polygons from zone outlines (stored in m_Poly) The solid areas can be mo...
bool Fill(const std::vector< ZONE * > &aZones, bool aCheck=false, wxWindow *aParent=nullptr)
Fills the given list of zones.
bool IsDebug() const
Definition zone_filler.h:62
Handle a list of polygons defining a copper zone.
Definition zone.h:74
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:60