KiCad PCB EDA Suite
zone.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) 2019 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 1992-2022 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#ifndef ZONE_H
26#define ZONE_H
27
28
29#include <mutex>
30#include <vector>
31#include <gr_basic.h>
32#include <board_item.h>
34#include <layer_ids.h>
36#include <zone_settings.h>
38
39
40class LINE_READER;
41class PCB_EDIT_FRAME;
42class BOARD;
43class ZONE;
44class MSG_PANEL_ITEM;
45
46
57{
58public:
59
67 ZONE( BOARD_ITEM_CONTAINER* parent, bool aInFP = false );
68
69 ZONE( const ZONE& aZone );
70 ZONE& operator=( const ZONE &aOther );
71
72 ~ZONE();
73
74 static inline bool ClassOf( const EDA_ITEM* aItem )
75 {
76 return aItem && aItem->Type() == PCB_ZONE_T;
77 }
78
82 bool IsConnected() const override
83 {
84 return !GetIsRuleArea();
85 }
86
90 void InitDataFromSrcInCopyCtor( const ZONE& aZone );
91
95 VECTOR2I GetPosition() const override;
96 void SetPosition( const VECTOR2I& aPos ) override {}
97
101 void SetAssignedPriority( unsigned aPriority ) { m_priority = aPriority; }
102
106 unsigned GetAssignedPriority() const { return m_priority; }
107
108 bool HigherPriority( const ZONE* aOther ) const;
109
110 bool SameNet( const ZONE* aOther ) const;
111
112 void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList ) override;
113
114 void SetLayerSet( LSET aLayerSet ) override;
115 virtual LSET GetLayerSet() const override { return m_layerSet; }
116
117 wxString GetZoneName() const { return m_zoneName; }
118 void SetZoneName( const wxString& aName ) { m_zoneName = aName; }
119
120 bool Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const override
121 {
122 return BOARD_ITEM::Matches( GetZoneName(), aSearchData );
123 }
124
128 const BOX2I GetBoundingBox() const override;
129
133 const BOX2I GetCachedBoundingBox() const { return m_bboxCache; }
135
143 int GetLocalClearance( wxString* aSource ) const override;
144
145 int GetLocalClearance() const { return GetLocalClearance( nullptr ); }
146 void SetLocalClearance( int aClearance ) { m_ZoneClearance = aClearance; }
147
151 bool IsOnCopperLayer() const override;
152
153 virtual void SetLayer( PCB_LAYER_ID aLayer ) override;
154
155 virtual PCB_LAYER_ID GetLayer() const override;
156
157 // Return the first layer in GUI sequence.
159
160 virtual bool IsOnLayer( PCB_LAYER_ID ) const override;
161
162 virtual void ViewGetLayers( int aLayers[], int& aCount ) const override;
163
164 double ViewGetLOD( int aLayer, KIGFX::VIEW* aView ) const override;
165
166 void SetFillMode( ZONE_FILL_MODE aFillMode ) { m_fillMode = aFillMode; }
168
169 void SetThermalReliefGap( int aThermalReliefGap )
170 {
171 if( m_thermalReliefGap != aThermalReliefGap )
172 SetNeedRefill( true );
173
174 m_thermalReliefGap = aThermalReliefGap;
175 }
176
178 int GetThermalReliefGap( PAD* aPad, wxString* aSource = nullptr ) const;
179
180 void SetThermalReliefSpokeWidth( int aThermalReliefSpokeWidth )
181 {
182 if( m_thermalReliefSpokeWidth != aThermalReliefSpokeWidth )
183 SetNeedRefill( true );
184
185 m_thermalReliefSpokeWidth = aThermalReliefSpokeWidth;
186 }
187
189
195 double CalculateFilledArea();
196
201 double CalculateOutlineArea();
202
209 {
210 return m_area;
211 }
212
219 {
220 return m_outlinearea;
221 }
222
223 std::mutex& GetLock()
224 {
225 return m_lock;
226 }
227
229 {
230 return m_fillFlags.test( aLayer );
231 }
232
233 void SetFillFlag( PCB_LAYER_ID aLayer, bool aFlag ) { m_fillFlags.set( aLayer, aFlag); }
234
235 bool IsFilled() const { return m_isFilled; }
236 void SetIsFilled( bool isFilled ) { m_isFilled = isFilled; }
237
238 bool NeedRefill() const { return m_needRefill; }
239 void SetNeedRefill( bool aNeedRefill ) { m_needRefill = aNeedRefill; }
240
242 void SetPadConnection( ZONE_CONNECTION aPadConnection ) { m_PadConnection = aPadConnection; }
243
244 int GetMinThickness() const { return m_ZoneMinThickness; }
245 void SetMinThickness( int aMinThickness )
246 {
247 if( m_ZoneMinThickness != aMinThickness )
248 SetNeedRefill( true );
249
250 m_ZoneMinThickness = aMinThickness;
251 }
252
253 int GetHatchThickness() const { return m_hatchThickness; }
254 void SetHatchThickness( int aThickness ) { m_hatchThickness = aThickness; }
255
256 int GetHatchGap() const { return m_hatchGap; }
257 void SetHatchGap( int aStep ) { m_hatchGap = aStep; }
258
260 void SetHatchOrientation( const EDA_ANGLE& aStep ) { m_hatchOrientation = aStep; }
261
263 void SetHatchSmoothingLevel( int aLevel ) { m_hatchSmoothingLevel = aLevel; }
264
266 void SetHatchSmoothingValue( double aValue ) { m_hatchSmoothingValue = aValue; }
267
268 double GetHatchHoleMinArea() const { return m_hatchHoleMinArea; }
269 void SetHatchHoleMinArea( double aPct ) { m_hatchHoleMinArea = aPct; }
270
272 void SetHatchBorderAlgorithm( int aAlgo ) { m_hatchBorderAlgorithm = aAlgo; }
273
275 {
276 // Transform relative indices to global index
277 int globalIndex = -1;
278
280 m_Poly->GetGlobalIndex( *m_CornerSelection, globalIndex );
281
282 return globalIndex;
283 }
284
285 void SetSelectedCorner( int aCorner )
286 {
287 SHAPE_POLY_SET::VERTEX_INDEX selectedCorner;
288
289 // If the global index of the corner is correct, assign it to m_CornerSelection
290 if( m_Poly->GetRelativeIndices( aCorner, &selectedCorner ) )
291 {
292 if( m_CornerSelection == nullptr )
294
295 *m_CornerSelection = selectedCorner;
296 }
297 else
298 throw( std::out_of_range( "aCorner-th vertex does not exist" ) );
299 }
300
302 int GetLocalFlags() const { return m_localFlgs; }
303 void SetLocalFlags( int aFlags ) { m_localFlgs = aFlags; }
304
306 const SHAPE_POLY_SET* Outline() const { return m_Poly; }
307
308 void SetOutline( SHAPE_POLY_SET* aOutline ) { m_Poly = aOutline; }
309
310 // @copydoc BOARD_ITEM::GetEffectiveShape
311 virtual std::shared_ptr<SHAPE>
313 FLASHING aFlash = FLASHING::DEFAULT ) const override;
314
321 bool HitTest( const VECTOR2I& aPosition, int aAccuracy = 0 ) const override;
322
331 bool HitTestFilledArea( PCB_LAYER_ID aLayer, const VECTOR2I& aRefPos, int aAccuracy = 0 ) const;
332
341 bool HitTestCutout( const VECTOR2I& aRefPos, int* aOutlineIdx = nullptr,
342 int* aHoleIdx = nullptr ) const;
343
349 void GetInteractingZones( PCB_LAYER_ID aLayer, std::vector<ZONE*>* aZones ) const;
350
362 int aError = ARC_HIGH_DEF ) const;
363
375 void TransformSmoothedOutlineToPolygon( SHAPE_POLY_SET& aCornerBuffer, int aClearance,
376 int aError, ERROR_LOC aErrorLoc,
377 SHAPE_POLY_SET* aBoardOutline ) const;
378
392 PCB_LAYER_ID aLayer, int aClearanceValue,
393 int aError, ERROR_LOC aErrorLoc,
394 bool ignoreLineWidth = false ) const override;
395
406 bool HitTestForCorner( const VECTOR2I& refPos, int aAccuracy,
407 SHAPE_POLY_SET::VERTEX_INDEX* aCornerHit = nullptr ) const;
408
418 bool HitTestForEdge( const VECTOR2I& refPos, int aAccuracy,
419 SHAPE_POLY_SET::VERTEX_INDEX* aCornerHit = nullptr ) const;
420
424 bool HitTest( const BOX2I& aRect, bool aContained = true, int aAccuracy = 0 ) const override;
425
431 bool UnFill();
432
433 /* Geometric transformations: */
434
440 void Move( const VECTOR2I& offset ) override;
441
448 void MoveEdge( const VECTOR2I& offset, int aEdge );
449
455 void Rotate( const VECTOR2I& aCentre, const EDA_ANGLE& aAngle ) override;
456
463 virtual void Flip( const VECTOR2I& aCentre, bool aFlipLeftRight ) override;
464
471 void Mirror( const VECTOR2I& aMirrorRef, bool aMirrorLeftRight );
472
476 wxString GetClass() const override
477 {
478 return wxT( "ZONE" );
479 }
480
484 int GetNumCorners( void ) const
485 {
486 return m_Poly->TotalVertices();
487 }
488
495 {
496 return m_Poly->Iterate();
497 }
498
505 {
506 return m_Poly->IterateWithHoles();
507 }
508
515 {
516 return m_Poly->CIterateWithHoles();
517 }
518
519 void RemoveAllContours( void )
520 {
522 }
523
524 const VECTOR2I& GetCornerPosition( int aCornerIndex ) const
525 {
527
528 // Convert global to relative indices
529 if( !m_Poly->GetRelativeIndices( aCornerIndex, &index ) )
530 throw( std::out_of_range( "aCornerIndex-th vertex does not exist" ) );
531
532 return m_Poly->CVertex( index );
533 }
534
535 void SetCornerPosition( int aCornerIndex, const VECTOR2I& new_pos )
536 {
537 SHAPE_POLY_SET::VERTEX_INDEX relativeIndices;
538
539 // Convert global to relative indices
540 if( m_Poly->GetRelativeIndices( aCornerIndex, &relativeIndices ) )
541 {
542 if( m_Poly->CVertex( relativeIndices ).x != new_pos.x
543 || m_Poly->CVertex( relativeIndices ).y != new_pos.y )
544 {
545 SetNeedRefill( true );
546 m_Poly->SetVertex( relativeIndices, new_pos );
547 }
548 }
549 else
550 {
551 throw( std::out_of_range( "aCornerIndex-th vertex does not exist" ) );
552 }
553 }
554
558 void NewHole()
559 {
560 m_Poly->NewHole();
561 }
562
572 bool AppendCorner( VECTOR2I aPosition, int aHoleIdx, bool aAllowDuplication = false );
573
576
586 bool IsSame( const ZONE &aZoneToCompare );
587
589 {
590 return m_FilledPolysList.count( aLayer ) > 0;
591 }
592
596 const std::shared_ptr<SHAPE_POLY_SET>& GetFilledPolysList( PCB_LAYER_ID aLayer ) const
597 {
598 wxASSERT( m_FilledPolysList.count( aLayer ) );
599 return m_FilledPolysList.at( aLayer );
600 }
601
603 {
604 wxASSERT( m_FilledPolysList.count( aLayer ) );
605 return m_FilledPolysList.at( aLayer ).get();
606 }
607
613
617 void SetFilledPolysList( PCB_LAYER_ID aLayer, const SHAPE_POLY_SET& aPolysList )
618 {
619 m_FilledPolysList[aLayer] = std::make_shared<SHAPE_POLY_SET>( aPolysList );
620 }
621
629 bool IsIsland( PCB_LAYER_ID aLayer, int aPolyIdx ) const;
630
631 void SetIsIsland( PCB_LAYER_ID aLayer, int aPolyIdx )
632 {
633 m_insulatedIslands[aLayer].insert( aPolyIdx );
634 }
635
636 bool BuildSmoothedPoly( SHAPE_POLY_SET& aSmoothedPoly, PCB_LAYER_ID aLayer,
637 SHAPE_POLY_SET* aBoardOutline,
638 SHAPE_POLY_SET* aSmoothedPolyWithApron = nullptr ) const;
639
640 void SetCornerSmoothingType( int aType ) { m_cornerSmoothingType = aType; };
641
643
644 void SetCornerRadius( unsigned int aRadius );
645
646 unsigned int GetCornerRadius() const { return m_cornerRadius; }
647
654 void RemoveCutout( int aOutlineIdx, int aHoleIdx );
655
662 void AddPolygon( std::vector<VECTOR2I>& aPolygon );
663
664 void AddPolygon( const SHAPE_LINE_CHAIN& aPolygon );
665
666 wxString GetSelectMenuText( UNITS_PROVIDER* aUnitsProvider ) const override;
667
668 BITMAPS GetMenuImage() const override;
669
670 EDA_ITEM* Clone() const override;
671
676
682
687
691 bool GetIsRuleArea() const { return m_isRuleArea; }
693 bool GetDoNotAllowVias() const { return m_doNotAllowVias; }
695 bool GetDoNotAllowPads() const { return m_doNotAllowPads; }
697
698 void SetIsRuleArea( bool aEnable ) { m_isRuleArea = aEnable; }
699 void SetDoNotAllowCopperPour( bool aEnable ) { m_doNotAllowCopperPour = aEnable; }
700 void SetDoNotAllowVias( bool aEnable ) { m_doNotAllowVias = aEnable; }
701 void SetDoNotAllowTracks( bool aEnable ) { m_doNotAllowTracks = aEnable; }
702 void SetDoNotAllowPads( bool aEnable ) { m_doNotAllowPads = aEnable; }
703 void SetDoNotAllowFootprints( bool aEnable ) { m_doNotAllowFootprints = aEnable; }
704
707
708 long long int GetMinIslandArea() const { return m_minIslandArea; }
709 void SetMinIslandArea( long long int aArea ) { m_minIslandArea = aArea; }
710
718 int GetBorderHatchPitch() const;
719
723 static int GetDefaultHatchPitch();
724
734 void SetBorderDisplayStyle( ZONE_BORDER_DISPLAY_STYLE aBorderHatchStyle, int aBorderHatchPitch,
735 bool aRebuilBorderdHatch );
736
742 void SetBorderHatchPitch( int aPitch );
743
747 void UnHatchBorder();
748
753 void HatchBorder();
754
755 const std::vector<SEG>& GetHatchLines() const { return m_borderHatchLines; }
756
761 void BuildHashValue( PCB_LAYER_ID aLayer );
762
767
768#if defined(DEBUG)
769 virtual void Show( int nestLevel, std::ostream& os ) const override { ShowDummy( os ); }
770#endif
771
772 virtual void SwapData( BOARD_ITEM* aImage ) override;
773
774protected:
777 unsigned int m_cornerRadius;
778
780 wxString m_zoneName;
781
783
784 /* Priority: when a zone outline is inside and other zone, if its priority is higher
785 * the other zone priority, it will be created inside.
786 * if priorities are equal, a DRC error is set
787 */
788 unsigned m_priority;
789
790 /* A zone outline can be a keepout zone.
791 * It will be never filled, and DRC should test for pads, tracks and vias
792 */
794
795 /* A zone outline can be a teardrop zone with different rules for priority
796 * (always bigger priority than copper zones) and never removed from a
797 * copper zone having the same netcode
798 */
800
801 /* For keepout zones only:
802 * what is not allowed inside the keepout ( pads, tracks and vias )
803 */
809
811 int m_ZoneClearance; // Clearance value in internal units.
812 int m_ZoneMinThickness; // Minimum thickness value in filled areas.
813 int m_fillVersion; // See BOARD_DESIGN_SETTINGS for version
814 // differences.
816
821 long long int m_minIslandArea;
822
825
832
833 int m_thermalReliefGap; // Width of the gap in thermal reliefs.
834 int m_thermalReliefSpokeWidth; // Width of the copper bridge in thermal reliefs.
835
836
844 int m_hatchThickness; // thickness of lines (if 0 -> solid shape)
845 int m_hatchGap; // gap between lines (0 -> solid shape
846 EDA_ANGLE m_hatchOrientation; // orientation of grid lines
847 int m_hatchSmoothingLevel; // 0 = no smoothing
848 // 1 = fillet
849 // 2 = arc low def
850 // 3 = arc high def
851 double m_hatchSmoothingValue; // hole chamfer/fillet size (ratio of hole size)
852 double m_hatchHoleMinArea; // min size before holes are dropped (ratio)
853 int m_hatchBorderAlgorithm; // 0 = use min zone thickness
854 // 1 = use hatch thickness
855
858
859 int m_localFlgs; // Variable used in polygon calculations.
860
861 /* set of filled polygons used to draw a zone as a filled area.
862 * from outlines (m_Poly) but unlike m_Poly these filled polygons have no hole
863 * (they are all in one piece) In very simple cases m_FilledPolysList is same
864 * as m_Poly. In less simple cases (when m_Poly has holes) m_FilledPolysList is
865 * a polygon equivalent to m_Poly, without holes but with extra outline segment
866 * connecting "holes" with external main outline. In complex cases an outline
867 * described by m_Poly can have many filled areas
868 */
869 std::map<PCB_LAYER_ID, std::shared_ptr<SHAPE_POLY_SET>> m_FilledPolysList;
870
874
876 std::map<PCB_LAYER_ID, MD5_HASH> m_filledPolysHash;
877
878 ZONE_BORDER_DISPLAY_STYLE m_borderStyle; // border display style, see enum above
879 int m_borderHatchPitch; // for DIAGONAL_EDGE, distance between 2 lines
880 std::vector<SEG> m_borderHatchLines; // hatch lines
881
883 std::map<PCB_LAYER_ID, std::set<int>> m_insulatedIslands;
884
885 double m_area; // The filled zone area
886 double m_outlinearea; // The outline zone area
887
889 std::mutex m_lock;
890};
891
892
896class FP_ZONE : public ZONE
897{
898public:
899 FP_ZONE( BOARD_ITEM_CONTAINER* aParent );
900 FP_ZONE( const FP_ZONE& aZone );
901 FP_ZONE& operator=( const FP_ZONE &aOther );
902
903 EDA_ITEM* Clone() const override;
904
905 double ViewGetLOD( int aLayer, KIGFX::VIEW* aView ) const override;
906};
907
908#endif // ZONE_H
constexpr int ARC_HIGH_DEF
Definition: base_units.h:121
BITMAPS
A list of all bitmap identifiers.
Definition: bitmaps_list.h:33
A base class derived from BOARD_ITEM for items that can be connected and have a net,...
Abstract interface for BOARD_ITEMs capable of storing other items inside.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:52
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:265
The base class for create windows for drawing purpose.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:99
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:111
virtual bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const
Compare the item against the search criteria in aSearchData.
Definition: eda_item.h:396
A specialization of ZONE for use in footprints.
Definition: zone.h:897
FP_ZONE(BOARD_ITEM_CONTAINER *aParent)
Definition: zone.cpp:1176
FP_ZONE & operator=(const FP_ZONE &aOther)
Definition: zone.cpp:1192
double ViewGetLOD(int aLayer, KIGFX::VIEW *aView) const override
Return the level of detail (LOD) of the item.
Definition: zone.cpp:1205
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
Definition: zone.cpp:1199
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:69
An abstract class from which implementation specific LINE_READERs may be derived to read single lines...
Definition: richio.h:81
LSET is a set of PCB_LAYER_IDs.
Definition: layer_ids.h:530
EDA_MSG_PANEL items for displaying messages.
Definition: msgpanel.h:54
Definition: pad.h:58
The main frame for Pcbnew.
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
Base class for iterating over all vertices in a given SHAPE_POLY_SET.
Represent a set of closed polygons.
ITERATOR IterateWithHoles(int aOutline)
void SetVertex(const VERTEX_INDEX &aIndex, const VECTOR2I &aPos)
Accessor function to set the position of a specific point.
int TotalVertices() const
Delete aIdx-th polygon from the set.
bool GetRelativeIndices(int aGlobalIdx, VERTEX_INDEX *aRelativeIndices) const
Convert a global vertex index —i.e., a number that globally identifies a vertex in a concatenated lis...
bool GetGlobalIndex(VERTEX_INDEX aRelativeIndices, int &aGlobalIdx) const
Compute the global index of a vertex from the relative indices of polygon, contour and vertex.
int NewHole(int aOutline=-1)
Adds a new outline to the set and returns its index.
ITERATOR Iterate(int aFirst, int aLast, bool aIterateHoles=false)
Return an object to iterate through the points of the polygons between aFirst and aLast.
const VECTOR2I & CVertex(int aIndex, int aOutline, int aHole) const
Return the aGlobalIndex-th vertex in the poly set.
CONST_ITERATOR CIterateWithHoles(int aOutline) const
Handle a list of polygons defining a copper zone.
Definition: zone.h:57
void SetHatchThickness(int aThickness)
Definition: zone.h:254
SHAPE_POLY_SET::VERTEX_INDEX * m_CornerSelection
The index of the corner being moved or nullptr if no corner is selected.
Definition: zone.h:857
void SetNeedRefill(bool aNeedRefill)
Definition: zone.h:239
double GetOutlineArea()
This area is cached from the most recent call to CalculateOutlineArea().
Definition: zone.h:218
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if a point is near an outline edge or a corner of this zone.
Definition: zone.cpp:360
void SetHatchBorderAlgorithm(int aAlgo)
Definition: zone.h:272
int m_borderHatchPitch
Definition: zone.h:879
const SHAPE_POLY_SET * Outline() const
Definition: zone.h:306
bool m_isRuleArea
Definition: zone.h:793
void SetDoNotAllowPads(bool aEnable)
Definition: zone.h:702
int GetHatchBorderAlgorithm() const
Definition: zone.h:271
ZONE & operator=(const ZONE &aOther)
Definition: zone.cpp:82
int m_cornerSmoothingType
Definition: zone.h:776
void Mirror(const VECTOR2I &aMirrorRef, bool aMirrorLeftRight)
Mirror the outlines relative to a given horizontal axis the layer is not changed.
Definition: zone.cpp:639
void TransformSmoothedOutlineToPolygon(SHAPE_POLY_SET &aCornerBuffer, int aClearance, int aError, ERROR_LOC aErrorLoc, SHAPE_POLY_SET *aBoardOutline) const
Convert the outlines shape to a polygon with no holes inflated (optional) by max( aClearanceValue,...
Definition: zone.cpp:1143
bool GetIsRuleArea() const
Accessors to parameters used in Rule Area zones:
Definition: zone.h:691
bool m_doNotAllowVias
Definition: zone.h:805
bool UnFill()
Removes the zone filling.
Definition: zone.cpp:206
bool NeedRefill() const
Definition: zone.h:238
bool GetDoNotAllowVias() const
Definition: zone.h:693
void TransformSolidAreasShapesToPolygon(PCB_LAYER_ID aLayer, SHAPE_POLY_SET &aCornerBuffer, int aError=ARC_HIGH_DEF) const
Convert solid areas full shapes to polygon set (the full shape is the polygon area with a thick outli...
Definition: zone.cpp:1267
void TransformShapeWithClearanceToPolygon(SHAPE_POLY_SET &aCornerBuffer, PCB_LAYER_ID aLayer, int aClearanceValue, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) const override
Convert the zone shape to a closed polygon Used in filling zones calculations Circles and arcs are ap...
Definition: zone.cpp:1238
void SetCornerRadius(unsigned int aRadius)
Definition: zone.cpp:330
ZONE_FILL_MODE m_fillMode
How to fill areas:
Definition: zone.h:843
const std::vector< SEG > & GetHatchLines() const
Definition: zone.h:755
void SetPosition(const VECTOR2I &aPos) override
Definition: zone.h:96
bool m_doNotAllowFootprints
Definition: zone.h:808
int m_ZoneMinThickness
Definition: zone.h:812
virtual void ViewGetLayers(int aLayers[], int &aCount) const override
Return the all the layers within the VIEW the object is painted on.
Definition: zone.cpp:284
void AddPolygon(std::vector< VECTOR2I > &aPolygon)
Add a polygon to the zone outline.
Definition: zone.cpp:679
double m_hatchSmoothingValue
Definition: zone.h:851
const std::shared_ptr< SHAPE_POLY_SET > & GetFilledPolysList(PCB_LAYER_ID aLayer) const
Definition: zone.h:596
void SetLocalFlags(int aFlags)
Definition: zone.h:303
void SetCornerSmoothingType(int aType)
Definition: zone.h:640
int m_thermalReliefSpokeWidth
Definition: zone.h:834
bool HitTestCutout(const VECTOR2I &aRefPos, int *aOutlineIdx=nullptr, int *aHoleIdx=nullptr) const
Test if the given point is contained within a cutout of the zone.
Definition: zone.cpp:451
EDA_ANGLE m_hatchOrientation
Definition: zone.h:846
void CacheTriangulation(PCB_LAYER_ID aLayer=UNDEFINED_LAYER)
Create a list of triangles that "fill" the solid areas used for instance to draw these solid areas on...
Definition: zone.cpp:943
std::map< PCB_LAYER_ID, std::set< int > > m_insulatedIslands
For each layer, a set of insulated islands that were not removed.
Definition: zone.h:883
wxString m_zoneName
An optional unique name for this zone, used for identifying it in DRC checking.
Definition: zone.h:780
void HatchBorder()
Compute the hatch lines depending on the hatch parameters and stores it in the zone's attribute m_bor...
Definition: zone.cpp:791
std::map< PCB_LAYER_ID, std::shared_ptr< SHAPE_POLY_SET > > m_FilledPolysList
Definition: zone.h:869
const ISLAND_REMOVAL_MODE GetIslandRemovalMode() const
Definition: zone.h:705
void SetBorderDisplayStyle(ZONE_BORDER_DISPLAY_STYLE aBorderHatchStyle, int aBorderHatchPitch, bool aRebuilBorderdHatch)
Set all hatch parameters for the zone.
Definition: zone.cpp:756
MD5_HASH GetHashValue(PCB_LAYER_ID aLayer)
Definition: zone.cpp:342
bool GetDoNotAllowPads() const
Definition: zone.h:695
const BOX2I GetBoundingBox() const override
Definition: zone.cpp:309
void SetMinThickness(int aMinThickness)
Definition: zone.h:245
double GetFilledArea()
This area is cached from the most recent call to CalculateFilledArea().
Definition: zone.h:208
void GetInteractingZones(PCB_LAYER_ID aLayer, std::vector< ZONE * > *aZones) const
Some intersecting zones, despite being on the same layer with the same net, cannot be merged due to o...
Definition: zone.cpp:972
bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const override
Compare the item against the search criteria in aSearchData.
Definition: zone.h:120
double m_outlinearea
Definition: zone.h:886
bool GetDoNotAllowTracks() const
Definition: zone.h:694
int GetLocalFlags() const
Definition: zone.h:302
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
Definition: zone.cpp:177
void SetHatchOrientation(const EDA_ANGLE &aStep)
Definition: zone.h:260
wxString GetClass() const override
Definition: zone.h:476
bool m_doNotAllowCopperPour
Definition: zone.h:804
void SetHatchSmoothingValue(double aValue)
Definition: zone.h:266
bool m_needRefill
False when a zone was refilled, true after changes in zone params.
Definition: zone.h:831
SHAPE_POLY_SET::ITERATOR IterateWithHoles()
Return an iterator to visit all points of the zone's main outline with holes.
Definition: zone.h:504
virtual void Flip(const VECTOR2I &aCentre, bool aFlipLeftRight) override
Flip this object, i.e.
Definition: zone.cpp:631
bool IsSame(const ZONE &aZoneToCompare)
Test if 2 zones are equivalent.
bool IsFilled() const
Definition: zone.h:235
bool HitTestForCorner(const VECTOR2I &refPos, int aAccuracy, SHAPE_POLY_SET::VERTEX_INDEX *aCornerHit=nullptr) const
Test if the given VECTOR2I is near a corner.
Definition: zone.cpp:370
void SetHatchSmoothingLevel(int aLevel)
Definition: zone.h:263
bool m_doNotAllowTracks
Definition: zone.h:806
bool IsConnected() const override
Not all ZONEs are really BOARD_CONNECTED_ITEMs....
Definition: zone.h:82
void SetDoNotAllowCopperPour(bool aEnable)
Definition: zone.h:699
void SetThermalReliefSpokeWidth(int aThermalReliefSpokeWidth)
Definition: zone.h:180
virtual PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
Definition: zone.cpp:230
virtual void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
Definition: zone.cpp:251
LSET m_fillFlags
Definition: zone.h:873
void SetSelectedCorner(int aCorner)
Definition: zone.h:285
int GetSelectedCorner() const
Definition: zone.h:274
SHAPE_POLY_SET * Outline()
Definition: zone.h:305
void SetHatchStyle(ZONE_BORDER_DISPLAY_STYLE aStyle)
Definition: zone.h:575
bool m_doNotAllowPads
Definition: zone.h:807
void NewHole()
Create a new hole on the zone; i.e., a new contour on the zone's outline.
Definition: zone.h:558
void SetFillFlag(PCB_LAYER_ID aLayer, bool aFlag)
Definition: zone.h:233
void SetCornerPosition(int aCornerIndex, const VECTOR2I &new_pos)
Definition: zone.h:535
void Move(const VECTOR2I &offset) override
Move the outlines.
Definition: zone.cpp:593
bool IsIsland(PCB_LAYER_ID aLayer, int aPolyIdx) const
Check if a given filled polygon is an insulated island.
Definition: zone.cpp:960
BOX2I m_bboxCache
Temp variables used while filling.
Definition: zone.h:872
SHAPE_POLY_SET * m_Poly
Outline of the zone.
Definition: zone.h:775
TEARDROP_TYPE m_teardropType
Definition: zone.h:799
~ZONE()
Definition: zone.cpp:92
long long int GetMinIslandArea() const
Definition: zone.h:708
int m_hatchSmoothingLevel
Definition: zone.h:847
int GetLocalClearance() const
Definition: zone.h:145
SHAPE_POLY_SET * GetFill(PCB_LAYER_ID aLayer)
Definition: zone.h:602
LSET m_layerSet
Definition: zone.h:782
void SetIsRuleArea(bool aEnable)
Definition: zone.h:698
int m_ZoneClearance
Definition: zone.h:811
wxString GetZoneName() const
Definition: zone.h:117
void SetDoNotAllowTracks(bool aEnable)
Definition: zone.h:701
void SetFilledPolysList(PCB_LAYER_ID aLayer, const SHAPE_POLY_SET &aPolysList)
Set the list of filled polygons.
Definition: zone.h:617
void CacheBoundingBox()
Definition: zone.h:134
int GetMinThickness() const
Definition: zone.h:244
bool HitTestForEdge(const VECTOR2I &refPos, int aAccuracy, SHAPE_POLY_SET::VERTEX_INDEX *aCornerHit=nullptr) const
Test if the given VECTOR2I is near a segment defined by 2 corners.
Definition: zone.cpp:377
static bool ClassOf(const EDA_ITEM *aItem)
Definition: zone.h:74
void RemoveCutout(int aOutlineIdx, int aHoleIdx)
Remove a cutout from the zone.
Definition: zone.cpp:650
void Rotate(const VECTOR2I &aCentre, const EDA_ANGLE &aAngle) override
Rotate the outlines.
Definition: zone.cpp:620
bool HigherPriority(const ZONE *aOther) const
Definition: zone.cpp:183
bool HitTestFilledArea(PCB_LAYER_ID aLayer, const VECTOR2I &aRefPos, int aAccuracy=0) const
Test if the given VECTOR2I is within the bounds of a filled area of this zone.
Definition: zone.cpp:437
void SetIsFilled(bool isFilled)
Definition: zone.h:236
void SetFillMode(ZONE_FILL_MODE aFillMode)
Definition: zone.h:166
int GetFillFlag(PCB_LAYER_ID aLayer)
Definition: zone.h:228
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
Definition: zone.cpp:929
int m_hatchGap
Definition: zone.h:845
ZONE_CONNECTION GetPadConnection() const
Definition: zone.h:241
void InitDataFromSrcInCopyCtor(const ZONE &aZone)
Copy aZone data to me.
Definition: zone.cpp:99
bool HasFilledPolysForLayer(PCB_LAYER_ID aLayer) const
Definition: zone.h:588
int GetHatchThickness() const
Definition: zone.h:253
double GetHatchHoleMinArea() const
Definition: zone.h:268
void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
Definition: zone.cpp:476
virtual bool IsOnLayer(PCB_LAYER_ID) const override
Test to see if this object is on the given layer.
Definition: zone.cpp:303
int m_hatchBorderAlgorithm
Definition: zone.h:853
const BOX2I GetCachedBoundingBox() const
ONLY TO BE USED BY CLIENTS WHICH SET UP THE CACHE!
Definition: zone.h:133
void SetDoNotAllowVias(bool aEnable)
Definition: zone.h:700
bool IsTeardropArea() const
Definition: zone.h:675
std::vector< SEG > m_borderHatchLines
Definition: zone.h:880
VECTOR2I GetPosition() const override
Definition: zone.cpp:224
int GetThermalReliefSpokeWidth() const
Definition: zone.h:188
int GetBorderHatchPitch() const
HatchBorder related methods.
Definition: zone.cpp:750
void SetLocalClearance(int aClearance)
Definition: zone.h:146
ZONE_BORDER_DISPLAY_STYLE GetHatchStyle() const
Definition: zone.h:574
void BuildHashValue(PCB_LAYER_ID aLayer)
Build the hash value of m_FilledPolysList, and store it internally in m_filledPolysHash.
Definition: zone.cpp:351
void SetThermalReliefGap(int aThermalReliefGap)
Definition: zone.h:169
EDA_ANGLE GetHatchOrientation() const
Definition: zone.h:259
void SetLayerSet(LSET aLayerSet) override
Definition: zone.cpp:257
bool BuildSmoothedPoly(SHAPE_POLY_SET &aSmoothedPoly, PCB_LAYER_ID aLayer, SHAPE_POLY_SET *aBoardOutline, SHAPE_POLY_SET *aSmoothedPolyWithApron=nullptr) const
Definition: zone.cpp:1008
int m_fillVersion
Definition: zone.h:813
const VECTOR2I & GetCornerPosition(int aCornerIndex) const
Definition: zone.h:524
bool GetDoNotAllowFootprints() const
Definition: zone.h:696
ZONE_FILL_MODE GetFillMode() const
Definition: zone.h:167
double m_hatchHoleMinArea
Definition: zone.h:852
SHAPE_POLY_SET::CONST_ITERATOR CIterateWithHoles() const
Return an iterator to visit all points of the zone's main outline with holes.
Definition: zone.h:514
SHAPE_POLY_SET::ITERATOR Iterate()
Return an iterator to visit all points of the zone's main outline without holes.
Definition: zone.h:494
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
Definition: zone.h:115
void SetDoNotAllowFootprints(bool aEnable)
Definition: zone.h:703
bool GetDoNotAllowCopperPour() const
Definition: zone.h:692
void SetBorderHatchPitch(int aPitch)
Set the hatch pitch parameter for the zone.
Definition: zone.cpp:771
int GetHatchGap() const
Definition: zone.h:256
double CalculateOutlineArea()
Compute the area of the zone outline (not the filled area).
Definition: zone.cpp:1136
std::mutex m_lock
Lock used for multi-threaded filling on multi-layer zones.
Definition: zone.h:889
void SetHatchHoleMinArea(double aPct)
Definition: zone.h:269
unsigned m_priority
Definition: zone.h:788
TEARDROP_TYPE GetTeardropAreaType() const
Definition: zone.h:686
std::map< PCB_LAYER_ID, MD5_HASH > m_filledPolysHash
A hash value used in zone filling calculations to see if the filled areas are up to date.
Definition: zone.h:876
ISLAND_REMOVAL_MODE m_islandRemovalMode
Definition: zone.h:815
bool m_isFilled
True when a zone was filled, false after deleting the filled areas.
Definition: zone.h:824
double GetHatchSmoothingValue() const
Definition: zone.h:265
virtual void SwapData(BOARD_ITEM *aImage) override
Swap data between aItem and aImage.
Definition: zone.cpp:935
ZONE(BOARD_ITEM_CONTAINER *parent, bool aInFP=false)
The ctor to build ZONE, but compatible with FP_ZONE requirement.
Definition: zone.cpp:43
bool AppendCorner(VECTOR2I aPosition, int aHoleIdx, bool aAllowDuplication=false)
Add a new corner to the zone outline (to the main outline or a hole)
Definition: zone.cpp:696
void MoveEdge(const VECTOR2I &offset, int aEdge)
Move the outline Edge.
Definition: zone.cpp:605
int GetHatchSmoothingLevel() const
Definition: zone.h:262
unsigned int GetCornerRadius() const
Definition: zone.h:646
int GetCornerSmoothingType() const
Definition: zone.h:642
int m_thermalReliefGap
Definition: zone.h:833
double ViewGetLOD(int aLayer, KIGFX::VIEW *aView) const override
Return the level of detail (LOD) of the item.
Definition: zone.cpp:295
void SetIsIsland(PCB_LAYER_ID aLayer, int aPolyIdx)
Definition: zone.h:631
int m_localFlgs
Definition: zone.h:859
bool IsOnCopperLayer() const override
Definition: zone.cpp:245
double CalculateFilledArea()
Compute the area currently occupied by the zone fill.
Definition: zone.cpp:1113
int m_hatchThickness
Definition: zone.h:844
void SetAssignedPriority(unsigned aPriority)
Definition: zone.h:101
double m_area
Definition: zone.h:885
unsigned int m_cornerRadius
Definition: zone.h:777
void SetPadConnection(ZONE_CONNECTION aPadConnection)
Definition: zone.h:242
std::mutex & GetLock()
Definition: zone.h:223
void SetZoneName(const wxString &aName)
Definition: zone.h:118
void SetTeardropAreaType(TEARDROP_TYPE aType)
Set the type of teardrop if the zone is a teardrop area for non teardrop area, the type must be TEARD...
Definition: zone.h:681
void UnHatchBorder()
Clear the zone's hatch.
Definition: zone.cpp:777
void SetIslandRemovalMode(ISLAND_REMOVAL_MODE aRemove)
Definition: zone.h:706
void SetOutline(SHAPE_POLY_SET *aOutline)
Definition: zone.h:308
PCB_LAYER_ID GetFirstLayer() const
Definition: zone.cpp:236
void SetMinIslandArea(long long int aArea)
Definition: zone.h:709
ZONE_CONNECTION m_PadConnection
Definition: zone.h:810
int GetThermalReliefGap() const
Definition: zone.h:177
void RemoveAllContours(void)
Definition: zone.h:519
void SetHatchGap(int aStep)
Definition: zone.h:257
static int GetDefaultHatchPitch()
Definition: zone.cpp:923
unsigned GetAssignedPriority() const
Definition: zone.h:106
int GetNumCorners(void) const
Access to m_Poly parameters.
Definition: zone.h:484
bool SameNet(const ZONE *aOther) const
Definition: zone.cpp:200
virtual std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT) const override
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
Definition: zone.cpp:1229
ZONE_BORDER_DISPLAY_STYLE m_borderStyle
Definition: zone.h:878
long long int m_minIslandArea
When island removal mode is set to AREA, islands below this area will be removed.
Definition: zone.h:821
wxString GetSelectMenuText(UNITS_PROVIDER *aUnitsProvider) const override
Return the text to display to be used in the selection clarification context menu when multiple items...
Definition: zone.cpp:716
ERROR_LOC
When approximating an arc or circle, should the error be placed on the outside or inside of the curve...
FLASHING
Enum used during connectivity building to ensure we do not query connectivity while building the data...
Definition: layer_ids.h:147
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:59
@ UNDEFINED_LAYER
Definition: layer_ids.h:60
Structure to hold the necessary information in order to index a vertex on a SHAPE_POLY_SET object: th...
TEARDROP_TYPE
define the type of a teardrop: on a via or pad, or a track end
@ PCB_ZONE_T
class ZONE, a copper pour area
Definition: typeinfo.h:112
ISLAND_REMOVAL_MODE
Whether or not to remove isolated islands from a zone.
Definition: zone_settings.h:57
ZONE_FILL_MODE
Definition: zone_settings.h:41
ZONE_BORDER_DISPLAY_STYLE
Zone border styles.
Definition: zone_settings.h:49
ZONE_CONNECTION
How pads are covered by copper in zone.
Definition: zones.h:50