KiCad PCB EDA Suite
Loading...
Searching...
No Matches
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-2023 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
59{
60 std::vector<int> m_IsolatedOutlines;
62};
63
64
72{
73public:
74 ZONE( BOARD_ITEM_CONTAINER* parent );
75
76 ZONE( const ZONE& aZone );
77 ZONE& operator=( const ZONE &aOther );
78
79 ~ZONE();
80
81 static inline bool ClassOf( const EDA_ITEM* aItem )
82 {
83 return aItem && aItem->Type() == PCB_ZONE_T;
84 }
85
89 bool IsConnected() const override
90 {
91 return !GetIsRuleArea();
92 }
93
97 void InitDataFromSrcInCopyCtor( const ZONE& aZone );
98
103 bool IsConflicting() const;
104
108 VECTOR2I GetPosition() const override;
109 void SetPosition( const VECTOR2I& aPos ) override {}
110
114 void SetAssignedPriority( unsigned aPriority ) { m_priority = aPriority; }
115
119 unsigned GetAssignedPriority() const { return m_priority; }
120
121 bool HigherPriority( const ZONE* aOther ) const;
122
123 bool SameNet( const ZONE* aOther ) const;
124
125 void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList ) override;
126 wxString GetFriendlyName() const override;
127
128 void SetLayerSet( LSET aLayerSet ) override;
129 virtual LSET GetLayerSet() const override { return m_layerSet; }
130
131 const wxString& GetZoneName() const { return m_zoneName; }
132 void SetZoneName( const wxString& aName ) { m_zoneName = aName; }
133
134 bool Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const override
135 {
136 return BOARD_ITEM::Matches( GetZoneName(), aSearchData );
137 }
138
142 const BOX2I GetBoundingBox() const override;
143
148 void CacheBoundingBox();
149
157 int GetLocalClearance( wxString* aSource ) const override;
158
159 int GetLocalClearance() const { return GetLocalClearance( nullptr ); }
160 void SetLocalClearance( int aClearance ) { m_ZoneClearance = aClearance; }
161
165 bool IsOnCopperLayer() const override;
166
167 virtual void SetLayer( PCB_LAYER_ID aLayer ) override;
168
169 virtual PCB_LAYER_ID GetLayer() const override;
170
171 // Return the first layer in GUI sequence.
173
174 virtual bool IsOnLayer( PCB_LAYER_ID ) const override;
175
176 virtual void ViewGetLayers( int aLayers[], int& aCount ) const override;
177
178 double ViewGetLOD( int aLayer, KIGFX::VIEW* aView ) const override;
179
180 void SetFillMode( ZONE_FILL_MODE aFillMode ) { m_fillMode = aFillMode; }
182
183 void SetThermalReliefGap( int aThermalReliefGap )
184 {
185 if( m_thermalReliefGap != aThermalReliefGap )
186 SetNeedRefill( true );
187
188 m_thermalReliefGap = aThermalReliefGap;
189 }
190
192 int GetThermalReliefGap( PAD* aPad, wxString* aSource = nullptr ) const;
193
194 void SetThermalReliefSpokeWidth( int aThermalReliefSpokeWidth )
195 {
196 if( m_thermalReliefSpokeWidth != aThermalReliefSpokeWidth )
197 SetNeedRefill( true );
198
199 m_thermalReliefSpokeWidth = aThermalReliefSpokeWidth;
200 }
201
203
209 double CalculateFilledArea();
210
215 double CalculateOutlineArea();
216
223 {
224 return m_area;
225 }
226
233 {
234 return m_outlinearea;
235 }
236
237 std::mutex& GetLock()
238 {
239 return m_lock;
240 }
241
243 {
244 return m_fillFlags.test( aLayer );
245 }
246
247 void SetFillFlag( PCB_LAYER_ID aLayer, bool aFlag ) { m_fillFlags.set( aLayer, aFlag ); }
248
249 bool IsFilled() const { return m_isFilled; }
250 void SetIsFilled( bool isFilled ) { m_isFilled = isFilled; }
251
252 bool NeedRefill() const { return m_needRefill; }
253 void SetNeedRefill( bool aNeedRefill ) { m_needRefill = aNeedRefill; }
254
256 void SetPadConnection( ZONE_CONNECTION aPadConnection ) { m_PadConnection = aPadConnection; }
257
258 int GetMinThickness() const { return m_ZoneMinThickness; }
259 void SetMinThickness( int aMinThickness )
260 {
261 if( m_ZoneMinThickness != aMinThickness
262 || ( m_fillMode == ZONE_FILL_MODE::HATCH_PATTERN
263 && ( m_hatchThickness < aMinThickness || m_hatchGap < aMinThickness ) ) )
264 {
265 SetNeedRefill( true );
266 }
267
268 m_ZoneMinThickness = aMinThickness;
269 m_hatchThickness = std::max( m_hatchThickness, aMinThickness );
270 m_hatchGap = std::max( m_hatchGap, aMinThickness );
271 }
272
273 int GetHatchThickness() const { return m_hatchThickness; }
274 void SetHatchThickness( int aThickness ) { m_hatchThickness = aThickness; }
275
276 int GetHatchGap() const { return m_hatchGap; }
277 void SetHatchGap( int aStep ) { m_hatchGap = aStep; }
278
280 void SetHatchOrientation( const EDA_ANGLE& aStep ) { m_hatchOrientation = aStep; }
281
283 void SetHatchSmoothingLevel( int aLevel ) { m_hatchSmoothingLevel = aLevel; }
284
286 void SetHatchSmoothingValue( double aValue ) { m_hatchSmoothingValue = aValue; }
287
288 double GetHatchHoleMinArea() const { return m_hatchHoleMinArea; }
289 void SetHatchHoleMinArea( double aPct ) { m_hatchHoleMinArea = aPct; }
290
292 void SetHatchBorderAlgorithm( int aAlgo ) { m_hatchBorderAlgorithm = aAlgo; }
293
295 {
296 // Transform relative indices to global index
297 int globalIndex = -1;
298
300 m_Poly->GetGlobalIndex( *m_CornerSelection, globalIndex );
301
302 return globalIndex;
303 }
304
305 void SetSelectedCorner( int aCorner )
306 {
307 SHAPE_POLY_SET::VERTEX_INDEX selectedCorner;
308
309 // If the global index of the corner is correct, assign it to m_CornerSelection
310 if( m_Poly->GetRelativeIndices( aCorner, &selectedCorner ) )
311 {
312 if( m_CornerSelection == nullptr )
314
315 *m_CornerSelection = selectedCorner;
316 }
317 else
318 throw( std::out_of_range( "aCorner-th vertex does not exist" ) );
319 }
320
322 int GetLocalFlags() const { return m_localFlgs; }
323 void SetLocalFlags( int aFlags ) { m_localFlgs = aFlags; }
324
326 const SHAPE_POLY_SET* Outline() const { return m_Poly; }
327
328 void SetOutline( SHAPE_POLY_SET* aOutline ) { m_Poly = aOutline; }
329
330 // @copydoc BOARD_ITEM::GetEffectiveShape
331 virtual std::shared_ptr<SHAPE>
333 FLASHING aFlash = FLASHING::DEFAULT ) const override;
334
341 bool HitTest( const VECTOR2I& aPosition, int aAccuracy = 0 ) const override;
342
351 bool HitTestFilledArea( PCB_LAYER_ID aLayer, const VECTOR2I& aRefPos, int aAccuracy = 0 ) const;
352
361 bool HitTestCutout( const VECTOR2I& aRefPos, int* aOutlineIdx = nullptr,
362 int* aHoleIdx = nullptr ) const;
363
369 void GetInteractingZones( PCB_LAYER_ID aLayer, std::vector<ZONE*>* aSameNetCollidingZones,
370 std::vector<ZONE*>* aOtherNetIntersectingZones ) const;
371
383
395 void TransformSmoothedOutlineToPolygon( SHAPE_POLY_SET& aBuffer, int aClearance,
396 int aError, ERROR_LOC aErrorLoc,
397 SHAPE_POLY_SET* aBoardOutline ) const;
398
412 int aClearance, int aError, ERROR_LOC aErrorLoc,
413 bool ignoreLineWidth = false ) const override;
414
425 bool HitTestForCorner( const VECTOR2I& refPos, int aAccuracy,
426 SHAPE_POLY_SET::VERTEX_INDEX* aCornerHit = nullptr ) const;
427
437 bool HitTestForEdge( const VECTOR2I& refPos, int aAccuracy,
438 SHAPE_POLY_SET::VERTEX_INDEX* aCornerHit = nullptr ) const;
439
443 bool HitTest( const BOX2I& aRect, bool aContained = true, int aAccuracy = 0 ) const override;
444
450 bool UnFill();
451
452 /* Geometric transformations: */
453
459 void Move( const VECTOR2I& offset ) override;
460
467 void MoveEdge( const VECTOR2I& offset, int aEdge );
468
474 void Rotate( const VECTOR2I& aCentre, const EDA_ANGLE& aAngle ) override;
475
482 virtual void Flip( const VECTOR2I& aCentre, bool aFlipLeftRight ) override;
483
490 void Mirror( const VECTOR2I& aMirrorRef, bool aMirrorLeftRight );
491
495 wxString GetClass() const override
496 {
497 return wxT( "ZONE" );
498 }
499
503 int GetNumCorners( void ) const
504 {
505 return m_Poly->TotalVertices();
506 }
507
514 {
515 return m_Poly->Iterate();
516 }
517
524 {
525 return m_Poly->IterateWithHoles();
526 }
527
534 {
535 return m_Poly->CIterateWithHoles();
536 }
537
538 void RemoveAllContours( void )
539 {
541 }
542
543 const VECTOR2I& GetCornerPosition( int aCornerIndex ) const
544 {
546
547 // Convert global to relative indices
548 if( !m_Poly->GetRelativeIndices( aCornerIndex, &index ) )
549 throw( std::out_of_range( "aCornerIndex-th vertex does not exist" ) );
550
551 return m_Poly->CVertex( index );
552 }
553
554 void SetCornerPosition( int aCornerIndex, const VECTOR2I& new_pos )
555 {
556 SHAPE_POLY_SET::VERTEX_INDEX relativeIndices;
557
558 // Convert global to relative indices
559 if( m_Poly->GetRelativeIndices( aCornerIndex, &relativeIndices ) )
560 {
561 if( m_Poly->CVertex( relativeIndices ).x != new_pos.x
562 || m_Poly->CVertex( relativeIndices ).y != new_pos.y )
563 {
564 SetNeedRefill( true );
565 m_Poly->SetVertex( relativeIndices, new_pos );
566 }
567 }
568 else
569 {
570 throw( std::out_of_range( "aCornerIndex-th vertex does not exist" ) );
571 }
572 }
573
577 void NewHole()
578 {
579 m_Poly->NewHole();
580 }
581
591 bool AppendCorner( VECTOR2I aPosition, int aHoleIdx, bool aAllowDuplication = false );
592
595
597 {
598 return m_FilledPolysList.count( aLayer ) > 0;
599 }
600
604 const std::shared_ptr<SHAPE_POLY_SET>& GetFilledPolysList( PCB_LAYER_ID aLayer ) const
605 {
606 wxASSERT( m_FilledPolysList.count( aLayer ) );
607 return m_FilledPolysList.at( aLayer );
608 }
609
611 {
612 wxASSERT( m_FilledPolysList.count( aLayer ) );
613 return m_FilledPolysList.at( aLayer ).get();
614 }
615
621
625 void SetFilledPolysList( PCB_LAYER_ID aLayer, const SHAPE_POLY_SET& aPolysList )
626 {
627 m_FilledPolysList[aLayer] = std::make_shared<SHAPE_POLY_SET>( aPolysList );
628 }
629
637 bool IsIsland( PCB_LAYER_ID aLayer, int aPolyIdx ) const;
638
639 void SetIsIsland( PCB_LAYER_ID aLayer, int aPolyIdx )
640 {
641 m_insulatedIslands[aLayer].insert( aPolyIdx );
642 }
643
644 bool BuildSmoothedPoly( SHAPE_POLY_SET& aSmoothedPoly, PCB_LAYER_ID aLayer,
645 SHAPE_POLY_SET* aBoardOutline,
646 SHAPE_POLY_SET* aSmoothedPolyWithApron = nullptr ) const;
647
648 void SetCornerSmoothingType( int aType ) { m_cornerSmoothingType = aType; };
649
651
652 void SetCornerRadius( unsigned int aRadius );
653
654 unsigned int GetCornerRadius() const { return m_cornerRadius; }
655
662 void RemoveCutout( int aOutlineIdx, int aHoleIdx );
663
670 void AddPolygon( std::vector<VECTOR2I>& aPolygon );
671
672 void AddPolygon( const SHAPE_LINE_CHAIN& aPolygon );
673
674 wxString GetItemDescription( UNITS_PROVIDER* aUnitsProvider ) const override;
675
676 BITMAPS GetMenuImage() const override;
677
678 EDA_ITEM* Clone() const override;
679
683 bool IsTeardropArea() const { return m_teardropType != TEARDROP_TYPE::TD_NONE; }
684
690
695
699 bool GetIsRuleArea() const { return m_isRuleArea; }
701 bool GetDoNotAllowVias() const { return m_doNotAllowVias; }
703 bool GetDoNotAllowPads() const { return m_doNotAllowPads; }
705
706 void SetIsRuleArea( bool aEnable ) { m_isRuleArea = aEnable; }
707 void SetDoNotAllowCopperPour( bool aEnable ) { m_doNotAllowCopperPour = aEnable; }
708 void SetDoNotAllowVias( bool aEnable ) { m_doNotAllowVias = aEnable; }
709 void SetDoNotAllowTracks( bool aEnable ) { m_doNotAllowTracks = aEnable; }
710 void SetDoNotAllowPads( bool aEnable ) { m_doNotAllowPads = aEnable; }
711 void SetDoNotAllowFootprints( bool aEnable ) { m_doNotAllowFootprints = aEnable; }
712
715
716 long long int GetMinIslandArea() const { return m_minIslandArea; }
717 void SetMinIslandArea( long long int aArea ) { m_minIslandArea = aArea; }
718
726 int GetBorderHatchPitch() const;
727
731 static int GetDefaultHatchPitch();
732
742 void SetBorderDisplayStyle( ZONE_BORDER_DISPLAY_STYLE aBorderHatchStyle, int aBorderHatchPitch,
743 bool aRebuilBorderdHatch );
744
750 void SetBorderHatchPitch( int aPitch );
751
755 void UnHatchBorder();
756
761 void HatchBorder();
762
763 const std::vector<SEG>& GetHatchLines() const { return m_borderHatchLines; }
764
769 void BuildHashValue( PCB_LAYER_ID aLayer );
770
775
776 double Similarity( const BOARD_ITEM& aOther ) const override;
777
778 bool operator==( const BOARD_ITEM& aOther ) const override;
779
780#if defined(DEBUG)
781 virtual void Show( int nestLevel, std::ostream& os ) const override { ShowDummy( os ); }
782
783 void SetFillPoly( PCB_LAYER_ID aLayer, SHAPE_POLY_SET* aPoly )
784 {
785 m_FilledPolysList[ aLayer ] = std::make_shared<SHAPE_POLY_SET>( *aPoly );
786 SetFillFlag( aLayer, true );
787 }
788
789#endif
790
791protected:
792 virtual void swapData( BOARD_ITEM* aImage ) override;
793
794protected:
797 unsigned int m_cornerRadius;
798
800 wxString m_zoneName;
801
803
804 /* Priority: when a zone outline is inside and other zone, if its priority is higher
805 * the other zone priority, it will be created inside.
806 * if priorities are equal, a DRC error is set
807 */
808 unsigned m_priority;
809
810 /* A zone outline can be a keepout zone.
811 * It will be never filled, and DRC should test for pads, tracks and vias
812 */
814
815 /* A zone outline can be a teardrop zone with different rules for priority
816 * (always bigger priority than copper zones) and never removed from a
817 * copper zone having the same netcode
818 */
820
821 /* For keepout zones only:
822 * what is not allowed inside the keepout ( pads, tracks and vias )
823 */
829
831 int m_ZoneClearance; // Clearance value in internal units.
832 int m_ZoneMinThickness; // Minimum thickness value in filled areas.
833 int m_fillVersion; // See BOARD_DESIGN_SETTINGS for version
834 // differences.
836
841 long long int m_minIslandArea;
842
845
852
853 int m_thermalReliefGap; // Width of the gap in thermal reliefs.
854 int m_thermalReliefSpokeWidth; // Width of the copper bridge in thermal reliefs.
855
856
864 int m_hatchThickness; // thickness of lines (if 0 -> solid shape)
865 int m_hatchGap; // gap between lines (0 -> solid shape
866 EDA_ANGLE m_hatchOrientation; // orientation of grid lines
867 int m_hatchSmoothingLevel; // 0 = no smoothing
868 // 1 = fillet
869 // 2 = arc low def
870 // 3 = arc high def
871 double m_hatchSmoothingValue; // hole chamfer/fillet size (ratio of hole size)
872 double m_hatchHoleMinArea; // min size before holes are dropped (ratio)
873 int m_hatchBorderAlgorithm; // 0 = use min zone thickness
874 // 1 = use hatch thickness
875
878
879 int m_localFlgs; // Variable used in polygon calculations.
880
881 /* set of filled polygons used to draw a zone as a filled area.
882 * from outlines (m_Poly) but unlike m_Poly these filled polygons have no hole
883 * (they are all in one piece) In very simple cases m_FilledPolysList is same
884 * as m_Poly. In less simple cases (when m_Poly has holes) m_FilledPolysList is
885 * a polygon equivalent to m_Poly, without holes but with extra outline segment
886 * connecting "holes" with external main outline. In complex cases an outline
887 * described by m_Poly can have many filled areas
888 */
889 std::map<PCB_LAYER_ID, std::shared_ptr<SHAPE_POLY_SET>> m_FilledPolysList;
890
893
895 std::map<PCB_LAYER_ID, MD5_HASH> m_filledPolysHash;
896
897 ZONE_BORDER_DISPLAY_STYLE m_borderStyle; // border display style, see enum above
898 int m_borderHatchPitch; // for DIAGONAL_EDGE, distance between 2 lines
899 std::vector<SEG> m_borderHatchLines; // hatch lines
900
902 std::map<PCB_LAYER_ID, std::set<int>> m_insulatedIslands;
903
904 double m_area; // The filled zone area
905 double m_outlinearea; // The outline zone area
906
908 std::mutex m_lock;
909};
910
911
912#ifndef SWIG
916#endif
917
918#endif // ZONE_H
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:77
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:276
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:85
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:97
virtual bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const
Compare the item against the search criteria in aSearchData.
Definition: eda_item.h:372
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:68
An abstract class from which implementation specific LINE_READERs may be derived to read single lines...
Definition: richio.h:93
LSET is a set of PCB_LAYER_IDs.
Definition: layer_ids.h:573
EDA_MSG_PANEL items for displaying messages.
Definition: msgpanel.h:54
Definition: pad.h:59
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.
void RemoveAllContours()
Remove all outlines & holes (clears) the polygon set.
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
Return total number of vertices stored in 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)
Creates a new hole in a given outline.
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 index-th vertex in a given hole outline within a given outline.
CONST_ITERATOR CIterateWithHoles(int aOutline) const
Handle a list of polygons defining a copper zone.
Definition: zone.h:72
void SetHatchThickness(int aThickness)
Definition: zone.h:274
SHAPE_POLY_SET::VERTEX_INDEX * m_CornerSelection
The index of the corner being moved or nullptr if no corner is selected.
Definition: zone.h:877
void SetNeedRefill(bool aNeedRefill)
Definition: zone.h:253
double GetOutlineArea()
This area is cached from the most recent call to CalculateOutlineArea().
Definition: zone.h:232
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:424
void SetHatchBorderAlgorithm(int aAlgo)
Definition: zone.h:292
int m_borderHatchPitch
Definition: zone.h:898
const SHAPE_POLY_SET * Outline() const
Definition: zone.h:326
bool m_isRuleArea
Definition: zone.h:813
void SetDoNotAllowPads(bool aEnable)
Definition: zone.h:710
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider) const override
Return a user-visible description string of this item.
Definition: zone.cpp:826
int GetHatchBorderAlgorithm() const
Definition: zone.h:291
ZONE & operator=(const ZONE &aOther)
Definition: zone.cpp:79
int m_cornerSmoothingType
Definition: zone.h:796
void Mirror(const VECTOR2I &aMirrorRef, bool aMirrorLeftRight)
Mirror the outlines relative to a given horizontal axis the layer is not changed.
Definition: zone.cpp:749
bool GetIsRuleArea() const
Accessors to parameters used in Rule Area zones:
Definition: zone.h:699
bool m_doNotAllowVias
Definition: zone.h:825
bool UnFill()
Removes the zone filling.
Definition: zone.cpp:206
bool NeedRefill() const
Definition: zone.h:252
bool GetDoNotAllowVias() const
Definition: zone.h:701
void TransformSolidAreasShapesToPolygon(PCB_LAYER_ID aLayer, SHAPE_POLY_SET &aBuffer) const
Convert solid areas full shapes to polygon set (the full shape is the polygon area with a thick outli...
Definition: zone.cpp:1388
void SetCornerRadius(unsigned int aRadius)
Definition: zone.cpp:394
ZONE_FILL_MODE m_fillMode
How to fill areas:
Definition: zone.h:863
const std::vector< SEG > & GetHatchLines() const
Definition: zone.h:763
void SetPosition(const VECTOR2I &aPos) override
Definition: zone.h:109
bool m_doNotAllowFootprints
Definition: zone.h:828
int m_ZoneMinThickness
Definition: zone.h:832
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:293
void AddPolygon(std::vector< VECTOR2I > &aPolygon)
Add a polygon to the zone outline.
Definition: zone.cpp:789
double m_hatchSmoothingValue
Definition: zone.h:871
const std::shared_ptr< SHAPE_POLY_SET > & GetFilledPolysList(PCB_LAYER_ID aLayer) const
Definition: zone.h:604
void SetLocalFlags(int aFlags)
Definition: zone.h:323
void TransformSmoothedOutlineToPolygon(SHAPE_POLY_SET &aBuffer, 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:1318
void SetCornerSmoothingType(int aType)
Definition: zone.h:648
int m_thermalReliefSpokeWidth
Definition: zone.h:854
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:515
EDA_ANGLE m_hatchOrientation
Definition: zone.h:866
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:1076
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:902
wxString m_zoneName
An optional unique name for this zone, used for identifying it in DRC checking.
Definition: zone.h:800
void HatchBorder()
Compute the hatch lines depending on the hatch parameters and stores it in the zone's attribute m_bor...
Definition: zone.cpp:915
std::map< PCB_LAYER_ID, std::shared_ptr< SHAPE_POLY_SET > > m_FilledPolysList
Definition: zone.h:889
void SetBorderDisplayStyle(ZONE_BORDER_DISPLAY_STYLE aBorderHatchStyle, int aBorderHatchPitch, bool aRebuilBorderdHatch)
Set all hatch parameters for the zone.
Definition: zone.cpp:880
MD5_HASH GetHashValue(PCB_LAYER_ID aLayer)
Definition: zone.cpp:406
bool GetDoNotAllowPads() const
Definition: zone.h:703
const BOX2I GetBoundingBox() const override
Definition: zone.cpp:342
void SetMinThickness(int aMinThickness)
Definition: zone.h:259
double GetFilledArea()
This area is cached from the most recent call to CalculateFilledArea().
Definition: zone.h:222
bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const override
Compare the item against the search criteria in aSearchData.
Definition: zone.h:134
double m_outlinearea
Definition: zone.h:905
wxString GetFriendlyName() const override
Definition: zone.cpp:689
bool GetDoNotAllowTracks() const
Definition: zone.h:702
int GetLocalFlags() const
Definition: zone.h:322
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:280
wxString GetClass() const override
Definition: zone.h:495
bool m_doNotAllowCopperPour
Definition: zone.h:824
void SetHatchSmoothingValue(double aValue)
Definition: zone.h:286
bool m_needRefill
False when a zone was refilled, true after changes in zone params.
Definition: zone.h:851
SHAPE_POLY_SET::ITERATOR IterateWithHoles()
Return an iterator to visit all points of the zone's main outline with holes.
Definition: zone.h:523
virtual void Flip(const VECTOR2I &aCentre, bool aFlipLeftRight) override
Flip this object, i.e.
Definition: zone.cpp:728
bool IsFilled() const
Definition: zone.h:249
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:434
void SetHatchSmoothingLevel(int aLevel)
Definition: zone.h:283
bool m_doNotAllowTracks
Definition: zone.h:826
bool IsConnected() const override
Not all ZONEs are really BOARD_CONNECTED_ITEMs....
Definition: zone.h:89
void SetDoNotAllowCopperPour(bool aEnable)
Definition: zone.h:707
void SetThermalReliefSpokeWidth(int aThermalReliefSpokeWidth)
Definition: zone.h:194
virtual PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
Definition: zone.cpp:236
virtual void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
Definition: zone.cpp:260
ISLAND_REMOVAL_MODE GetIslandRemovalMode() const
Definition: zone.h:713
LSET m_fillFlags
Temp variables used while filling.
Definition: zone.h:892
void SetSelectedCorner(int aCorner)
Definition: zone.h:305
int GetSelectedCorner() const
Definition: zone.h:294
SHAPE_POLY_SET * Outline()
Definition: zone.h:325
void SetHatchStyle(ZONE_BORDER_DISPLAY_STYLE aStyle)
Definition: zone.h:594
bool m_doNotAllowPads
Definition: zone.h:827
void NewHole()
Create a new hole on the zone; i.e., a new contour on the zone's outline.
Definition: zone.h:577
void SetFillFlag(PCB_LAYER_ID aLayer, bool aFlag)
Definition: zone.h:247
void SetCornerPosition(int aCornerIndex, const VECTOR2I &new_pos)
Definition: zone.h:554
void Move(const VECTOR2I &offset) override
Move the outlines.
Definition: zone.cpp:662
bool IsIsland(PCB_LAYER_ID aLayer, int aPolyIdx) const
Check if a given filled polygon is an insulated island.
Definition: zone.cpp:1093
SHAPE_POLY_SET * m_Poly
Outline of the zone.
Definition: zone.h:795
TEARDROP_TYPE m_teardropType
Definition: zone.h:819
~ZONE()
Definition: zone.cpp:89
long long int GetMinIslandArea() const
Definition: zone.h:716
int m_hatchSmoothingLevel
Definition: zone.h:867
int GetLocalClearance() const
Definition: zone.h:159
double Similarity(const BOARD_ITEM &aOther) const override
Return a measure of how likely the other object is to represent the same object.
Definition: zone.cpp:1455
SHAPE_POLY_SET * GetFill(PCB_LAYER_ID aLayer)
Definition: zone.h:610
LSET m_layerSet
Definition: zone.h:802
void SetIsRuleArea(bool aEnable)
Definition: zone.h:706
int m_ZoneClearance
Definition: zone.h:831
void SetDoNotAllowTracks(bool aEnable)
Definition: zone.h:709
void SetFilledPolysList(PCB_LAYER_ID aLayer, const SHAPE_POLY_SET &aPolysList)
Set the list of filled polygons.
Definition: zone.h:625
const wxString & GetZoneName() const
Definition: zone.h:131
void CacheBoundingBox()
Used to preload the zone bounding box cache so we don't have to worry about mutex-locking it each tim...
Definition: zone.cpp:364
int GetMinThickness() const
Definition: zone.h:258
virtual void swapData(BOARD_ITEM *aImage) override
Definition: zone.cpp:1068
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:441
static bool ClassOf(const EDA_ITEM *aItem)
Definition: zone.h:81
void RemoveCutout(int aOutlineIdx, int aHoleIdx)
Remove a cutout from the zone.
Definition: zone.cpp:760
void Rotate(const VECTOR2I &aCentre, const EDA_ANGLE &aAngle) override
Rotate the outlines.
Definition: zone.cpp:717
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:501
void SetIsFilled(bool isFilled)
Definition: zone.h:250
void SetFillMode(ZONE_FILL_MODE aFillMode)
Definition: zone.h:180
int GetFillFlag(PCB_LAYER_ID aLayer)
Definition: zone.h:242
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
Definition: zone.cpp:1062
int m_hatchGap
Definition: zone.h:865
ZONE_CONNECTION GetPadConnection() const
Definition: zone.h:255
void InitDataFromSrcInCopyCtor(const ZONE &aZone)
Copy aZone data to me.
Definition: zone.cpp:99
bool HasFilledPolysForLayer(PCB_LAYER_ID aLayer) const
Definition: zone.h:596
int GetHatchThickness() const
Definition: zone.h:273
double GetHatchHoleMinArea() const
Definition: zone.h:288
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:540
virtual bool IsOnLayer(PCB_LAYER_ID) const override
Test to see if this object is on the given layer.
Definition: zone.cpp:336
int m_hatchBorderAlgorithm
Definition: zone.h:873
void SetDoNotAllowVias(bool aEnable)
Definition: zone.h:708
bool IsTeardropArea() const
Definition: zone.h:683
std::vector< SEG > m_borderHatchLines
Definition: zone.h:899
VECTOR2I GetPosition() const override
Definition: zone.cpp:230
int GetThermalReliefSpokeWidth() const
Definition: zone.h:202
int GetBorderHatchPitch() const
HatchBorder related methods.
Definition: zone.cpp:874
void SetLocalClearance(int aClearance)
Definition: zone.h:160
ZONE_BORDER_DISPLAY_STYLE GetHatchStyle() const
Definition: zone.h:593
void BuildHashValue(PCB_LAYER_ID aLayer)
Build the hash value of m_FilledPolysList, and store it internally in m_filledPolysHash.
Definition: zone.cpp:415
void SetThermalReliefGap(int aThermalReliefGap)
Definition: zone.h:183
EDA_ANGLE GetHatchOrientation() const
Definition: zone.h:279
void SetLayerSet(LSET aLayerSet) override
Definition: zone.cpp:266
bool BuildSmoothedPoly(SHAPE_POLY_SET &aSmoothedPoly, PCB_LAYER_ID aLayer, SHAPE_POLY_SET *aBoardOutline, SHAPE_POLY_SET *aSmoothedPolyWithApron=nullptr) const
Definition: zone.cpp:1140
int m_fillVersion
Definition: zone.h:833
const VECTOR2I & GetCornerPosition(int aCornerIndex) const
Definition: zone.h:543
bool GetDoNotAllowFootprints() const
Definition: zone.h:704
ZONE_FILL_MODE GetFillMode() const
Definition: zone.h:181
double m_hatchHoleMinArea
Definition: zone.h:872
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:533
SHAPE_POLY_SET::ITERATOR Iterate()
Return an iterator to visit all points of the zone's main outline without holes.
Definition: zone.h:513
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
Definition: zone.h:129
void SetDoNotAllowFootprints(bool aEnable)
Definition: zone.h:711
bool GetDoNotAllowCopperPour() const
Definition: zone.h:700
void SetBorderHatchPitch(int aPitch)
Set the hatch pitch parameter for the zone.
Definition: zone.cpp:895
void GetInteractingZones(PCB_LAYER_ID aLayer, std::vector< ZONE * > *aSameNetCollidingZones, std::vector< ZONE * > *aOtherNetIntersectingZones) const
Some intersecting zones, despite being on the same layer with the same net, cannot be merged due to o...
Definition: zone.cpp:1105
int GetHatchGap() const
Definition: zone.h:276
double CalculateOutlineArea()
Compute the area of the zone outline (not the filled area).
Definition: zone.cpp:1311
std::mutex m_lock
Lock used for multi-threaded filling on multi-layer zones.
Definition: zone.h:908
void SetHatchHoleMinArea(double aPct)
Definition: zone.h:289
unsigned m_priority
Definition: zone.h:808
TEARDROP_TYPE GetTeardropAreaType() const
Definition: zone.h:694
bool IsConflicting() const
For rule areas which exclude footprints (and therefore participate in courtyard conflicts during move...
Definition: zone.cpp:224
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:895
ISLAND_REMOVAL_MODE m_islandRemovalMode
Definition: zone.h:835
bool m_isFilled
True when a zone was filled, false after deleting the filled areas.
Definition: zone.h:844
double GetHatchSmoothingValue() const
Definition: zone.h:285
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:806
void MoveEdge(const VECTOR2I &offset, int aEdge)
Move the outline Edge.
Definition: zone.cpp:702
int GetHatchSmoothingLevel() const
Definition: zone.h:282
unsigned int GetCornerRadius() const
Definition: zone.h:654
int GetCornerSmoothingType() const
Definition: zone.h:650
int m_thermalReliefGap
Definition: zone.h:853
double ViewGetLOD(int aLayer, KIGFX::VIEW *aView) const override
Return the level of detail (LOD) of the item.
Definition: zone.cpp:309
void SetIsIsland(PCB_LAYER_ID aLayer, int aPolyIdx)
Definition: zone.h:639
int m_localFlgs
Definition: zone.h:879
bool IsOnCopperLayer() const override
Definition: zone.cpp:254
double CalculateFilledArea()
Compute the area currently occupied by the zone fill.
Definition: zone.cpp:1288
int m_hatchThickness
Definition: zone.h:864
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, 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:1358
void SetAssignedPriority(unsigned aPriority)
Definition: zone.h:114
double m_area
Definition: zone.h:904
unsigned int m_cornerRadius
Definition: zone.h:797
void SetPadConnection(ZONE_CONNECTION aPadConnection)
Definition: zone.h:256
std::mutex & GetLock()
Definition: zone.h:237
void SetZoneName(const wxString &aName)
Definition: zone.h:132
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:689
void UnHatchBorder()
Clear the zone's hatch.
Definition: zone.cpp:901
void SetIslandRemovalMode(ISLAND_REMOVAL_MODE aRemove)
Definition: zone.h:714
void SetOutline(SHAPE_POLY_SET *aOutline)
Definition: zone.h:328
PCB_LAYER_ID GetFirstLayer() const
Definition: zone.cpp:245
void SetMinIslandArea(long long int aArea)
Definition: zone.h:717
ZONE_CONNECTION m_PadConnection
Definition: zone.h:830
bool operator==(const BOARD_ITEM &aOther) const override
Definition: zone.cpp:1395
int GetThermalReliefGap() const
Definition: zone.h:191
void RemoveAllContours(void)
Definition: zone.h:538
void SetHatchGap(int aStep)
Definition: zone.h:277
static int GetDefaultHatchPitch()
Definition: zone.cpp:1056
unsigned GetAssignedPriority() const
Definition: zone.h:119
int GetNumCorners(void) const
Access to m_Poly parameters.
Definition: zone.h:503
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:1349
ZONE_BORDER_DISPLAY_STYLE m_borderStyle
Definition: zone.h:897
long long int m_minIslandArea
When island removal mode is set to AREA, islands below this area will be removed.
Definition: zone.h:841
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:148
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
@ UNDEFINED_LAYER
Definition: layer_ids.h:61
#define DECLARE_ENUM_TO_WXANY(type)
Definition: property.h:719
A struct recording the isolated and single-pad islands within a zone.
Definition: zone.h:59
std::vector< int > m_SingleConnectionOutlines
Definition: zone.h:61
std::vector< int > m_IsolatedOutlines
Definition: zone.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:105
Class ZONE_SETTINGS used to handle zones parameters in dialogs.
ISLAND_REMOVAL_MODE
Whether or not to remove isolated islands from a zone.
Definition: zone_settings.h:58
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:46