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-2024 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
153 std::optional<int> GetLocalClearance() const override;
154 void SetLocalClearance( std::optional<int> aClearance ) { m_ZoneClearance = aClearance.value(); }
155
162 std::optional<int> GetLocalClearance( wxString* aSource ) const override
163 {
164 if( m_isRuleArea )
165 return std::optional<int>();
166
167 if( aSource )
168 *aSource = _( "zone" );
169
170 return GetLocalClearance();
171 }
172
176 bool IsOnCopperLayer() const override;
177
178 virtual void SetLayer( PCB_LAYER_ID aLayer ) override;
179
180 virtual PCB_LAYER_ID GetLayer() const override;
181
182 // Return the first layer in GUI sequence.
184
185 virtual bool IsOnLayer( PCB_LAYER_ID ) const override;
186
187 virtual void ViewGetLayers( int aLayers[], int& aCount ) const override;
188
189 double ViewGetLOD( int aLayer, KIGFX::VIEW* aView ) const override;
190
191 void SetFillMode( ZONE_FILL_MODE aFillMode ) { m_fillMode = aFillMode; }
193
194 void SetThermalReliefGap( int aThermalReliefGap )
195 {
196 if( m_thermalReliefGap != aThermalReliefGap )
197 SetNeedRefill( true );
198
199 m_thermalReliefGap = aThermalReliefGap;
200 }
201
203 int GetThermalReliefGap( PAD* aPad, wxString* aSource = nullptr ) const;
204
205 void SetThermalReliefSpokeWidth( int aThermalReliefSpokeWidth )
206 {
207 if( m_thermalReliefSpokeWidth != aThermalReliefSpokeWidth )
208 SetNeedRefill( true );
209
210 m_thermalReliefSpokeWidth = aThermalReliefSpokeWidth;
211 }
212
214
220 double CalculateFilledArea();
221
226 double CalculateOutlineArea();
227
234 {
235 return m_area;
236 }
237
244 {
245 return m_outlinearea;
246 }
247
248 std::mutex& GetLock()
249 {
250 return m_lock;
251 }
252
254 {
255 return m_fillFlags.test( aLayer );
256 }
257
258 void SetFillFlag( PCB_LAYER_ID aLayer, bool aFlag ) { m_fillFlags.set( aLayer, aFlag ); }
259
260 bool IsFilled() const { return m_isFilled; }
261 void SetIsFilled( bool isFilled ) { m_isFilled = isFilled; }
262
263 bool NeedRefill() const { return m_needRefill; }
264 void SetNeedRefill( bool aNeedRefill ) { m_needRefill = aNeedRefill; }
265
267 void SetPadConnection( ZONE_CONNECTION aPadConnection ) { m_PadConnection = aPadConnection; }
268
269 int GetMinThickness() const { return m_ZoneMinThickness; }
270 void SetMinThickness( int aMinThickness )
271 {
272 if( m_ZoneMinThickness != aMinThickness
273 || ( m_fillMode == ZONE_FILL_MODE::HATCH_PATTERN
274 && ( m_hatchThickness < aMinThickness || m_hatchGap < aMinThickness ) ) )
275 {
276 SetNeedRefill( true );
277 }
278
279 m_ZoneMinThickness = aMinThickness;
280 m_hatchThickness = std::max( m_hatchThickness, aMinThickness );
281 m_hatchGap = std::max( m_hatchGap, aMinThickness );
282 }
283
284 int GetHatchThickness() const { return m_hatchThickness; }
285 void SetHatchThickness( int aThickness ) { m_hatchThickness = aThickness; }
286
287 int GetHatchGap() const { return m_hatchGap; }
288 void SetHatchGap( int aStep ) { m_hatchGap = aStep; }
289
291 void SetHatchOrientation( const EDA_ANGLE& aStep ) { m_hatchOrientation = aStep; }
292
294 void SetHatchSmoothingLevel( int aLevel ) { m_hatchSmoothingLevel = aLevel; }
295
297 void SetHatchSmoothingValue( double aValue ) { m_hatchSmoothingValue = aValue; }
298
299 double GetHatchHoleMinArea() const { return m_hatchHoleMinArea; }
300 void SetHatchHoleMinArea( double aPct ) { m_hatchHoleMinArea = aPct; }
301
303 void SetHatchBorderAlgorithm( int aAlgo ) { m_hatchBorderAlgorithm = aAlgo; }
304
306 {
307 // Transform relative indices to global index
308 int globalIndex = -1;
309
311 m_Poly->GetGlobalIndex( *m_CornerSelection, globalIndex );
312
313 return globalIndex;
314 }
315
316 void SetSelectedCorner( int aCorner )
317 {
318 SHAPE_POLY_SET::VERTEX_INDEX selectedCorner;
319
320 // If the global index of the corner is correct, assign it to m_CornerSelection
321 if( m_Poly->GetRelativeIndices( aCorner, &selectedCorner ) )
322 {
323 if( m_CornerSelection == nullptr )
325
326 *m_CornerSelection = selectedCorner;
327 }
328 else
329 throw( std::out_of_range( "aCorner-th vertex does not exist" ) );
330 }
331
333 int GetLocalFlags() const { return m_localFlgs; }
334 void SetLocalFlags( int aFlags ) { m_localFlgs = aFlags; }
335
337 const SHAPE_POLY_SET* Outline() const { return m_Poly; }
338
339 void SetOutline( SHAPE_POLY_SET* aOutline ) { m_Poly = aOutline; }
340
341 // @copydoc BOARD_ITEM::GetEffectiveShape
342 virtual std::shared_ptr<SHAPE>
344 FLASHING aFlash = FLASHING::DEFAULT ) const override;
345
352 bool HitTest( const VECTOR2I& aPosition, int aAccuracy = 0 ) const override;
353
362 bool HitTestFilledArea( PCB_LAYER_ID aLayer, const VECTOR2I& aRefPos, int aAccuracy = 0 ) const;
363
372 bool HitTestCutout( const VECTOR2I& aRefPos, int* aOutlineIdx = nullptr,
373 int* aHoleIdx = nullptr ) const;
374
380 void GetInteractingZones( PCB_LAYER_ID aLayer, std::vector<ZONE*>* aSameNetCollidingZones,
381 std::vector<ZONE*>* aOtherNetIntersectingZones ) const;
382
394
406 void TransformSmoothedOutlineToPolygon( SHAPE_POLY_SET& aBuffer, int aClearance,
407 int aError, ERROR_LOC aErrorLoc,
408 SHAPE_POLY_SET* aBoardOutline ) const;
409
423 int aClearance, int aError, ERROR_LOC aErrorLoc,
424 bool ignoreLineWidth = false ) const override;
425
436 bool HitTestForCorner( const VECTOR2I& refPos, int aAccuracy,
437 SHAPE_POLY_SET::VERTEX_INDEX* aCornerHit = nullptr ) const;
438
448 bool HitTestForEdge( const VECTOR2I& refPos, int aAccuracy,
449 SHAPE_POLY_SET::VERTEX_INDEX* aCornerHit = nullptr ) const;
450
454 bool HitTest( const BOX2I& aRect, bool aContained = true, int aAccuracy = 0 ) const override;
455
461 bool UnFill();
462
463 /* Geometric transformations: */
464
470 void Move( const VECTOR2I& offset ) override;
471
478 void MoveEdge( const VECTOR2I& offset, int aEdge );
479
485 void Rotate( const VECTOR2I& aCentre, const EDA_ANGLE& aAngle ) override;
486
493 virtual void Flip( const VECTOR2I& aCentre, bool aFlipLeftRight ) override;
494
501 void Mirror( const VECTOR2I& aMirrorRef, bool aMirrorLeftRight );
502
506 wxString GetClass() const override
507 {
508 return wxT( "ZONE" );
509 }
510
514 int GetNumCorners( void ) const
515 {
516 return m_Poly->TotalVertices();
517 }
518
525 {
526 return m_Poly->Iterate();
527 }
528
535 {
536 return m_Poly->IterateWithHoles();
537 }
538
545 {
546 return m_Poly->CIterateWithHoles();
547 }
548
549 void RemoveAllContours( void )
550 {
552 }
553
554 const VECTOR2I& GetCornerPosition( int aCornerIndex ) const
555 {
557
558 // Convert global to relative indices
559 if( !m_Poly->GetRelativeIndices( aCornerIndex, &index ) )
560 throw( std::out_of_range( "aCornerIndex-th vertex does not exist" ) );
561
562 return m_Poly->CVertex( index );
563 }
564
565 void SetCornerPosition( int aCornerIndex, const VECTOR2I& new_pos )
566 {
567 SHAPE_POLY_SET::VERTEX_INDEX relativeIndices;
568
569 // Convert global to relative indices
570 if( m_Poly->GetRelativeIndices( aCornerIndex, &relativeIndices ) )
571 {
572 if( m_Poly->CVertex( relativeIndices ).x != new_pos.x
573 || m_Poly->CVertex( relativeIndices ).y != new_pos.y )
574 {
575 SetNeedRefill( true );
576 m_Poly->SetVertex( relativeIndices, new_pos );
577 }
578 }
579 else
580 {
581 throw( std::out_of_range( "aCornerIndex-th vertex does not exist" ) );
582 }
583 }
584
588 void NewHole()
589 {
590 m_Poly->NewHole();
591 }
592
602 bool AppendCorner( VECTOR2I aPosition, int aHoleIdx, bool aAllowDuplication = false );
603
606
608 {
609 return m_FilledPolysList.count( aLayer ) > 0;
610 }
611
615 const std::shared_ptr<SHAPE_POLY_SET>& GetFilledPolysList( PCB_LAYER_ID aLayer ) const
616 {
617 wxASSERT( m_FilledPolysList.count( aLayer ) );
618 return m_FilledPolysList.at( aLayer );
619 }
620
622 {
623 wxASSERT( m_FilledPolysList.count( aLayer ) );
624 return m_FilledPolysList.at( aLayer ).get();
625 }
626
632
636 void SetFilledPolysList( PCB_LAYER_ID aLayer, const SHAPE_POLY_SET& aPolysList )
637 {
638 m_FilledPolysList[aLayer] = std::make_shared<SHAPE_POLY_SET>( aPolysList );
639 }
640
648 bool IsIsland( PCB_LAYER_ID aLayer, int aPolyIdx ) const;
649
650 void SetIsIsland( PCB_LAYER_ID aLayer, int aPolyIdx )
651 {
652 m_insulatedIslands[aLayer].insert( aPolyIdx );
653 }
654
655 bool BuildSmoothedPoly( SHAPE_POLY_SET& aSmoothedPoly, PCB_LAYER_ID aLayer,
656 SHAPE_POLY_SET* aBoardOutline,
657 SHAPE_POLY_SET* aSmoothedPolyWithApron = nullptr ) const;
658
659 void SetCornerSmoothingType( int aType ) { m_cornerSmoothingType = aType; };
660
662
663 void SetCornerRadius( unsigned int aRadius );
664
665 unsigned int GetCornerRadius() const { return m_cornerRadius; }
666
673 void RemoveCutout( int aOutlineIdx, int aHoleIdx );
674
681 void AddPolygon( std::vector<VECTOR2I>& aPolygon );
682
683 void AddPolygon( const SHAPE_LINE_CHAIN& aPolygon );
684
685 wxString GetItemDescription( UNITS_PROVIDER* aUnitsProvider ) const override;
686
687 BITMAPS GetMenuImage() const override;
688
689 EDA_ITEM* Clone() const override;
690
694 bool IsTeardropArea() const { return m_teardropType != TEARDROP_TYPE::TD_NONE; }
695
701
706
710 bool GetIsRuleArea() const { return m_isRuleArea; }
712 bool GetDoNotAllowVias() const { return m_doNotAllowVias; }
714 bool GetDoNotAllowPads() const { return m_doNotAllowPads; }
716
717 void SetIsRuleArea( bool aEnable ) { m_isRuleArea = aEnable; }
718 void SetDoNotAllowCopperPour( bool aEnable ) { m_doNotAllowCopperPour = aEnable; }
719 void SetDoNotAllowVias( bool aEnable ) { m_doNotAllowVias = aEnable; }
720 void SetDoNotAllowTracks( bool aEnable ) { m_doNotAllowTracks = aEnable; }
721 void SetDoNotAllowPads( bool aEnable ) { m_doNotAllowPads = aEnable; }
722 void SetDoNotAllowFootprints( bool aEnable ) { m_doNotAllowFootprints = aEnable; }
723
726
727 long long int GetMinIslandArea() const { return m_minIslandArea; }
728 void SetMinIslandArea( long long int aArea ) { m_minIslandArea = aArea; }
729
737 int GetBorderHatchPitch() const;
738
742 static int GetDefaultHatchPitch();
743
753 void SetBorderDisplayStyle( ZONE_BORDER_DISPLAY_STYLE aBorderHatchStyle, int aBorderHatchPitch,
754 bool aRebuilBorderdHatch );
755
761 void SetBorderHatchPitch( int aPitch );
762
766 void UnHatchBorder();
767
772 void HatchBorder();
773
774 const std::vector<SEG>& GetHatchLines() const { return m_borderHatchLines; }
775
780 void BuildHashValue( PCB_LAYER_ID aLayer );
781
786
787 double Similarity( const BOARD_ITEM& aOther ) const override;
788
789 bool operator==( const ZONE& aOther ) const;
790 bool operator==( const BOARD_ITEM& aOther ) const override;
791
792#if defined(DEBUG)
793 virtual void Show( int nestLevel, std::ostream& os ) const override { ShowDummy( os ); }
794
795 void SetFillPoly( PCB_LAYER_ID aLayer, SHAPE_POLY_SET* aPoly )
796 {
797 m_FilledPolysList[ aLayer ] = std::make_shared<SHAPE_POLY_SET>( *aPoly );
798 SetFillFlag( aLayer, true );
799 }
800
801#endif
802
803protected:
804 virtual void swapData( BOARD_ITEM* aImage ) override;
805
806protected:
809 unsigned int m_cornerRadius;
810
812 wxString m_zoneName;
813
815
816 /* Priority: when a zone outline is inside and other zone, if its priority is higher
817 * the other zone priority, it will be created inside.
818 * if priorities are equal, a DRC error is set
819 */
820 unsigned m_priority;
821
822 /* A zone outline can be a keepout zone.
823 * It will be never filled, and DRC should test for pads, tracks and vias
824 */
826
827 /* A zone outline can be a teardrop zone with different rules for priority
828 * (always bigger priority than copper zones) and never removed from a
829 * copper zone having the same netcode
830 */
832
833 /* For keepout zones only:
834 * what is not allowed inside the keepout ( pads, tracks and vias )
835 */
841
843 int m_ZoneClearance; // Clearance value in internal units.
844 int m_ZoneMinThickness; // Minimum thickness value in filled areas.
845 int m_fillVersion; // See BOARD_DESIGN_SETTINGS for version
846 // differences.
848
853 long long int m_minIslandArea;
854
857
864
865 int m_thermalReliefGap; // Width of the gap in thermal reliefs.
866 int m_thermalReliefSpokeWidth; // Width of the copper bridge in thermal reliefs.
867
868
876 int m_hatchThickness; // thickness of lines (if 0 -> solid shape)
877 int m_hatchGap; // gap between lines (0 -> solid shape
878 EDA_ANGLE m_hatchOrientation; // orientation of grid lines
879 int m_hatchSmoothingLevel; // 0 = no smoothing
880 // 1 = fillet
881 // 2 = arc low def
882 // 3 = arc high def
883 double m_hatchSmoothingValue; // hole chamfer/fillet size (ratio of hole size)
884 double m_hatchHoleMinArea; // min size before holes are dropped (ratio)
885 int m_hatchBorderAlgorithm; // 0 = use min zone thickness
886 // 1 = use hatch thickness
887
890
891 int m_localFlgs; // Variable used in polygon calculations.
892
893 /* set of filled polygons used to draw a zone as a filled area.
894 * from outlines (m_Poly) but unlike m_Poly these filled polygons have no hole
895 * (they are all in one piece) In very simple cases m_FilledPolysList is same
896 * as m_Poly. In less simple cases (when m_Poly has holes) m_FilledPolysList is
897 * a polygon equivalent to m_Poly, without holes but with extra outline segment
898 * connecting "holes" with external main outline. In complex cases an outline
899 * described by m_Poly can have many filled areas
900 */
901 std::map<PCB_LAYER_ID, std::shared_ptr<SHAPE_POLY_SET>> m_FilledPolysList;
902
905
907 std::map<PCB_LAYER_ID, MD5_HASH> m_filledPolysHash;
908
909 ZONE_BORDER_DISPLAY_STYLE m_borderStyle; // border display style, see enum above
910 int m_borderHatchPitch; // for DIAGONAL_EDGE, distance between 2 lines
911 std::vector<SEG> m_borderHatchLines; // hatch lines
912
914 std::map<PCB_LAYER_ID, std::set<int>> m_insulatedIslands;
915
916 double m_area; // The filled zone area
917 double m_outlinearea; // The outline zone area
918
920 std::mutex m_lock;
921};
922
923
924#ifndef SWIG
928#endif
929
930#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:282
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:88
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:100
virtual bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const
Compare the item against the search criteria in aSearchData.
Definition: eda_item.h:375
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:576
EDA_MSG_PANEL items for displaying messages.
Definition: msgpanel.h:54
Definition: pad.h:53
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:285
SHAPE_POLY_SET::VERTEX_INDEX * m_CornerSelection
The index of the corner being moved or nullptr if no corner is selected.
Definition: zone.h:889
void SetNeedRefill(bool aNeedRefill)
Definition: zone.h:264
double GetOutlineArea()
This area is cached from the most recent call to CalculateOutlineArea().
Definition: zone.h:243
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:425
void SetHatchBorderAlgorithm(int aAlgo)
Definition: zone.h:303
int m_borderHatchPitch
Definition: zone.h:910
const SHAPE_POLY_SET * Outline() const
Definition: zone.h:337
bool m_isRuleArea
Definition: zone.h:825
void SetDoNotAllowPads(bool aEnable)
Definition: zone.h:721
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider) const override
Return a user-visible description string of this item.
Definition: zone.cpp:821
int GetHatchBorderAlgorithm() const
Definition: zone.h:302
ZONE & operator=(const ZONE &aOther)
Definition: zone.cpp:80
int m_cornerSmoothingType
Definition: zone.h:808
void Mirror(const VECTOR2I &aMirrorRef, bool aMirrorLeftRight)
Mirror the outlines relative to a given horizontal axis the layer is not changed.
Definition: zone.cpp:744
bool GetIsRuleArea() const
Accessors to parameters used in Rule Area zones:
Definition: zone.h:710
std::optional< int > GetLocalClearance() const override
Definition: zone.cpp:490
void SetLocalClearance(std::optional< int > aClearance)
Definition: zone.h:154
bool m_doNotAllowVias
Definition: zone.h:837
bool UnFill()
Removes the zone filling.
Definition: zone.cpp:207
bool NeedRefill() const
Definition: zone.h:263
bool GetDoNotAllowVias() const
Definition: zone.h:712
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:1383
void SetCornerRadius(unsigned int aRadius)
Definition: zone.cpp:395
ZONE_FILL_MODE m_fillMode
How to fill areas:
Definition: zone.h:875
const std::vector< SEG > & GetHatchLines() const
Definition: zone.h:774
void SetPosition(const VECTOR2I &aPos) override
Definition: zone.h:109
bool m_doNotAllowFootprints
Definition: zone.h:840
int m_ZoneMinThickness
Definition: zone.h:844
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:294
void AddPolygon(std::vector< VECTOR2I > &aPolygon)
Add a polygon to the zone outline.
Definition: zone.cpp:784
double m_hatchSmoothingValue
Definition: zone.h:883
const std::shared_ptr< SHAPE_POLY_SET > & GetFilledPolysList(PCB_LAYER_ID aLayer) const
Definition: zone.h:615
void SetLocalFlags(int aFlags)
Definition: zone.h:334
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:1313
void SetCornerSmoothingType(int aType)
Definition: zone.h:659
int m_thermalReliefSpokeWidth
Definition: zone.h:866
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:510
EDA_ANGLE m_hatchOrientation
Definition: zone.h:878
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:1071
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:914
wxString m_zoneName
An optional unique name for this zone, used for identifying it in DRC checking.
Definition: zone.h:812
void HatchBorder()
Compute the hatch lines depending on the hatch parameters and stores it in the zone's attribute m_bor...
Definition: zone.cpp:910
std::map< PCB_LAYER_ID, std::shared_ptr< SHAPE_POLY_SET > > m_FilledPolysList
Definition: zone.h:901
std::optional< int > GetLocalClearance(wxString *aSource) const override
Return any local clearances set in the "classic" (ie: pre-rule) system.
Definition: zone.h:162
void SetBorderDisplayStyle(ZONE_BORDER_DISPLAY_STYLE aBorderHatchStyle, int aBorderHatchPitch, bool aRebuilBorderdHatch)
Set all hatch parameters for the zone.
Definition: zone.cpp:875
MD5_HASH GetHashValue(PCB_LAYER_ID aLayer)
Definition: zone.cpp:407
bool GetDoNotAllowPads() const
Definition: zone.h:714
const BOX2I GetBoundingBox() const override
Definition: zone.cpp:343
void SetMinThickness(int aMinThickness)
Definition: zone.h:270
double GetFilledArea()
This area is cached from the most recent call to CalculateFilledArea().
Definition: zone.h:233
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:917
wxString GetFriendlyName() const override
Definition: zone.cpp:684
bool GetDoNotAllowTracks() const
Definition: zone.h:713
int GetLocalFlags() const
Definition: zone.h:333
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
Definition: zone.cpp:178
void SetHatchOrientation(const EDA_ANGLE &aStep)
Definition: zone.h:291
wxString GetClass() const override
Definition: zone.h:506
bool m_doNotAllowCopperPour
Definition: zone.h:836
void SetHatchSmoothingValue(double aValue)
Definition: zone.h:297
bool m_needRefill
False when a zone was refilled, true after changes in zone params.
Definition: zone.h:863
SHAPE_POLY_SET::ITERATOR IterateWithHoles()
Return an iterator to visit all points of the zone's main outline with holes.
Definition: zone.h:534
virtual void Flip(const VECTOR2I &aCentre, bool aFlipLeftRight) override
Flip this object, i.e.
Definition: zone.cpp:723
bool IsFilled() const
Definition: zone.h:260
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:435
void SetHatchSmoothingLevel(int aLevel)
Definition: zone.h:294
bool m_doNotAllowTracks
Definition: zone.h:838
bool IsConnected() const override
Not all ZONEs are really BOARD_CONNECTED_ITEMs....
Definition: zone.h:89
void SetDoNotAllowCopperPour(bool aEnable)
Definition: zone.h:718
void SetThermalReliefSpokeWidth(int aThermalReliefSpokeWidth)
Definition: zone.h:205
virtual PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
Definition: zone.cpp:237
virtual void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
Definition: zone.cpp:261
ISLAND_REMOVAL_MODE GetIslandRemovalMode() const
Definition: zone.h:724
LSET m_fillFlags
Temp variables used while filling.
Definition: zone.h:904
void SetSelectedCorner(int aCorner)
Definition: zone.h:316
int GetSelectedCorner() const
Definition: zone.h:305
SHAPE_POLY_SET * Outline()
Definition: zone.h:336
void SetHatchStyle(ZONE_BORDER_DISPLAY_STYLE aStyle)
Definition: zone.h:605
bool m_doNotAllowPads
Definition: zone.h:839
void NewHole()
Create a new hole on the zone; i.e., a new contour on the zone's outline.
Definition: zone.h:588
void SetFillFlag(PCB_LAYER_ID aLayer, bool aFlag)
Definition: zone.h:258
void SetCornerPosition(int aCornerIndex, const VECTOR2I &new_pos)
Definition: zone.h:565
void Move(const VECTOR2I &offset) override
Move the outlines.
Definition: zone.cpp:657
bool IsIsland(PCB_LAYER_ID aLayer, int aPolyIdx) const
Check if a given filled polygon is an insulated island.
Definition: zone.cpp:1088
SHAPE_POLY_SET * m_Poly
Outline of the zone.
Definition: zone.h:807
TEARDROP_TYPE m_teardropType
Definition: zone.h:831
~ZONE()
Definition: zone.cpp:90
long long int GetMinIslandArea() const
Definition: zone.h:727
int m_hatchSmoothingLevel
Definition: zone.h:879
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:621
LSET m_layerSet
Definition: zone.h:814
void SetIsRuleArea(bool aEnable)
Definition: zone.h:717
int m_ZoneClearance
Definition: zone.h:843
void SetDoNotAllowTracks(bool aEnable)
Definition: zone.h:720
void SetFilledPolysList(PCB_LAYER_ID aLayer, const SHAPE_POLY_SET &aPolysList)
Set the list of filled polygons.
Definition: zone.h:636
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:372
int GetMinThickness() const
Definition: zone.h:269
virtual void swapData(BOARD_ITEM *aImage) override
Definition: zone.cpp:1063
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:442
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:755
void Rotate(const VECTOR2I &aCentre, const EDA_ANGLE &aAngle) override
Rotate the outlines.
Definition: zone.cpp:712
bool HigherPriority(const ZONE *aOther) const
Definition: zone.cpp:184
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:496
void SetIsFilled(bool isFilled)
Definition: zone.h:261
void SetFillMode(ZONE_FILL_MODE aFillMode)
Definition: zone.h:191
int GetFillFlag(PCB_LAYER_ID aLayer)
Definition: zone.h:253
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
Definition: zone.cpp:1057
int m_hatchGap
Definition: zone.h:877
ZONE_CONNECTION GetPadConnection() const
Definition: zone.h:266
void InitDataFromSrcInCopyCtor(const ZONE &aZone)
Copy aZone data to me.
Definition: zone.cpp:100
bool HasFilledPolysForLayer(PCB_LAYER_ID aLayer) const
Definition: zone.h:607
int GetHatchThickness() const
Definition: zone.h:284
double GetHatchHoleMinArea() const
Definition: zone.h:299
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:535
virtual bool IsOnLayer(PCB_LAYER_ID) const override
Test to see if this object is on the given layer.
Definition: zone.cpp:337
int m_hatchBorderAlgorithm
Definition: zone.h:885
void SetDoNotAllowVias(bool aEnable)
Definition: zone.h:719
bool IsTeardropArea() const
Definition: zone.h:694
std::vector< SEG > m_borderHatchLines
Definition: zone.h:911
VECTOR2I GetPosition() const override
Definition: zone.cpp:231
int GetThermalReliefSpokeWidth() const
Definition: zone.h:213
int GetBorderHatchPitch() const
HatchBorder related methods.
Definition: zone.cpp:869
ZONE_BORDER_DISPLAY_STYLE GetHatchStyle() const
Definition: zone.h:604
void BuildHashValue(PCB_LAYER_ID aLayer)
Build the hash value of m_FilledPolysList, and store it internally in m_filledPolysHash.
Definition: zone.cpp:416
void SetThermalReliefGap(int aThermalReliefGap)
Definition: zone.h:194
EDA_ANGLE GetHatchOrientation() const
Definition: zone.h:290
void SetLayerSet(LSET aLayerSet) override
Definition: zone.cpp:267
bool BuildSmoothedPoly(SHAPE_POLY_SET &aSmoothedPoly, PCB_LAYER_ID aLayer, SHAPE_POLY_SET *aBoardOutline, SHAPE_POLY_SET *aSmoothedPolyWithApron=nullptr) const
Definition: zone.cpp:1135
int m_fillVersion
Definition: zone.h:845
const VECTOR2I & GetCornerPosition(int aCornerIndex) const
Definition: zone.h:554
bool GetDoNotAllowFootprints() const
Definition: zone.h:715
ZONE_FILL_MODE GetFillMode() const
Definition: zone.h:192
double m_hatchHoleMinArea
Definition: zone.h:884
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:544
SHAPE_POLY_SET::ITERATOR Iterate()
Return an iterator to visit all points of the zone's main outline without holes.
Definition: zone.h:524
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:722
bool GetDoNotAllowCopperPour() const
Definition: zone.h:711
void SetBorderHatchPitch(int aPitch)
Set the hatch pitch parameter for the zone.
Definition: zone.cpp:890
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:1100
int GetHatchGap() const
Definition: zone.h:287
double CalculateOutlineArea()
Compute the area of the zone outline (not the filled area).
Definition: zone.cpp:1306
std::mutex m_lock
Lock used for multi-threaded filling on multi-layer zones.
Definition: zone.h:920
void SetHatchHoleMinArea(double aPct)
Definition: zone.h:300
unsigned m_priority
Definition: zone.h:820
TEARDROP_TYPE GetTeardropAreaType() const
Definition: zone.h:705
bool IsConflicting() const
For rule areas which exclude footprints (and therefore participate in courtyard conflicts during move...
Definition: zone.cpp:225
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:907
ISLAND_REMOVAL_MODE m_islandRemovalMode
Definition: zone.h:847
bool m_isFilled
True when a zone was filled, false after deleting the filled areas.
Definition: zone.h:856
double GetHatchSmoothingValue() const
Definition: zone.h:296
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:801
void MoveEdge(const VECTOR2I &offset, int aEdge)
Move the outline Edge.
Definition: zone.cpp:697
int GetHatchSmoothingLevel() const
Definition: zone.h:293
unsigned int GetCornerRadius() const
Definition: zone.h:665
int GetCornerSmoothingType() const
Definition: zone.h:661
int m_thermalReliefGap
Definition: zone.h:865
double ViewGetLOD(int aLayer, KIGFX::VIEW *aView) const override
Return the level of detail (LOD) of the item.
Definition: zone.cpp:310
void SetIsIsland(PCB_LAYER_ID aLayer, int aPolyIdx)
Definition: zone.h:650
int m_localFlgs
Definition: zone.h:891
bool IsOnCopperLayer() const override
Definition: zone.cpp:255
double CalculateFilledArea()
Compute the area currently occupied by the zone fill.
Definition: zone.cpp:1283
int m_hatchThickness
Definition: zone.h:876
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:1353
void SetAssignedPriority(unsigned aPriority)
Definition: zone.h:114
double m_area
Definition: zone.h:916
unsigned int m_cornerRadius
Definition: zone.h:809
void SetPadConnection(ZONE_CONNECTION aPadConnection)
Definition: zone.h:267
std::mutex & GetLock()
Definition: zone.h:248
void SetZoneName(const wxString &aName)
Definition: zone.h:132
bool operator==(const ZONE &aOther) const
Definition: zone.cpp:1400
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:700
void UnHatchBorder()
Clear the zone's hatch.
Definition: zone.cpp:896
void SetIslandRemovalMode(ISLAND_REMOVAL_MODE aRemove)
Definition: zone.h:725
void SetOutline(SHAPE_POLY_SET *aOutline)
Definition: zone.h:339
PCB_LAYER_ID GetFirstLayer() const
Definition: zone.cpp:246
void SetMinIslandArea(long long int aArea)
Definition: zone.h:728
ZONE_CONNECTION m_PadConnection
Definition: zone.h:842
int GetThermalReliefGap() const
Definition: zone.h:202
void RemoveAllContours(void)
Definition: zone.h:549
void SetHatchGap(int aStep)
Definition: zone.h:288
static int GetDefaultHatchPitch()
Definition: zone.cpp:1051
unsigned GetAssignedPriority() const
Definition: zone.h:119
int GetNumCorners(void) const
Access to m_Poly parameters.
Definition: zone.h:514
bool SameNet(const ZONE *aOther) const
Definition: zone.cpp:201
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:1344
ZONE_BORDER_DISPLAY_STYLE m_borderStyle
Definition: zone.h:909
long long int m_minIslandArea
When island removal mode is set to AREA, islands below this area will be removed.
Definition: zone.h:853
#define _(s)
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:149
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:729
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:107
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:47