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>
35#include <lset.h>
37#include <zone_settings.h>
39
40
41class LINE_READER;
42class PCB_EDIT_FRAME;
43class BOARD;
44class ZONE;
45class MSG_PANEL_ITEM;
46
47
60{
61 std::vector<int> m_IsolatedOutlines;
63};
64
65
73{
74public:
75 ZONE( BOARD_ITEM_CONTAINER* parent );
76
77 ZONE( const ZONE& aZone );
78 ZONE& operator=( const ZONE &aOther );
79
80 ~ZONE();
81
82 static inline bool ClassOf( const EDA_ITEM* aItem )
83 {
84 return aItem && aItem->Type() == PCB_ZONE_T;
85 }
86
90 bool IsConnected() const override
91 {
92 return !GetIsRuleArea();
93 }
94
98 void InitDataFromSrcInCopyCtor( const ZONE& aZone );
99
104 bool IsConflicting() const;
105
109 VECTOR2I GetPosition() const override;
110 void SetPosition( const VECTOR2I& aPos ) override {}
111
115 void SetAssignedPriority( unsigned aPriority ) { m_priority = aPriority; }
116
120 unsigned GetAssignedPriority() const { return m_priority; }
121
122 bool HigherPriority( const ZONE* aOther ) const;
123
124 bool SameNet( const ZONE* aOther ) const;
125
126 void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList ) override;
127 wxString GetFriendlyName() const override;
128
129 void SetLayerSet( LSET aLayerSet ) override;
130 virtual LSET GetLayerSet() const override { return m_layerSet; }
131
132 const wxString& GetZoneName() const { return m_zoneName; }
133 void SetZoneName( const wxString& aName ) { m_zoneName = aName; }
134
135 bool Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const override
136 {
137 return BOARD_ITEM::Matches( GetZoneName(), aSearchData );
138 }
139
143 const BOX2I GetBoundingBox() const override;
144
149 void CacheBoundingBox();
150
154 std::optional<int> GetLocalClearance() const override;
155 void SetLocalClearance( std::optional<int> aClearance ) { m_ZoneClearance = aClearance.value(); }
156
163 std::optional<int> GetLocalClearance( wxString* aSource ) const override
164 {
165 if( m_isRuleArea )
166 return std::optional<int>();
167
168 if( aSource )
169 *aSource = _( "zone" );
170
171 return GetLocalClearance();
172 }
173
177 bool IsOnCopperLayer() const override;
178
179 virtual void SetLayer( PCB_LAYER_ID aLayer ) override;
180
181 virtual PCB_LAYER_ID GetLayer() const override;
182
183 // Return the first layer in GUI sequence.
185
186 virtual bool IsOnLayer( PCB_LAYER_ID ) const override;
187
188 virtual void ViewGetLayers( int aLayers[], int& aCount ) const override;
189
190 double ViewGetLOD( int aLayer, KIGFX::VIEW* aView ) const override;
191
192 void SetFillMode( ZONE_FILL_MODE aFillMode ) { m_fillMode = aFillMode; }
194
195 void SetThermalReliefGap( int aThermalReliefGap )
196 {
197 if( m_thermalReliefGap != aThermalReliefGap )
198 SetNeedRefill( true );
199
200 m_thermalReliefGap = aThermalReliefGap;
201 }
202
204 int GetThermalReliefGap( PAD* aPad, wxString* aSource = nullptr ) const;
205
206 void SetThermalReliefSpokeWidth( int aThermalReliefSpokeWidth )
207 {
208 if( m_thermalReliefSpokeWidth != aThermalReliefSpokeWidth )
209 SetNeedRefill( true );
210
211 m_thermalReliefSpokeWidth = aThermalReliefSpokeWidth;
212 }
213
215
221 double CalculateFilledArea();
222
227 double CalculateOutlineArea();
228
235 {
236 return m_area;
237 }
238
245 {
246 return m_outlinearea;
247 }
248
249 std::mutex& GetLock()
250 {
251 return m_lock;
252 }
253
255 {
256 return m_fillFlags.test( aLayer );
257 }
258
259 void SetFillFlag( PCB_LAYER_ID aLayer, bool aFlag ) { m_fillFlags.set( aLayer, aFlag ); }
260
261 bool IsFilled() const { return m_isFilled; }
262 void SetIsFilled( bool isFilled ) { m_isFilled = isFilled; }
263
264 bool NeedRefill() const { return m_needRefill; }
265 void SetNeedRefill( bool aNeedRefill ) { m_needRefill = aNeedRefill; }
266
268 void SetPadConnection( ZONE_CONNECTION aPadConnection ) { m_PadConnection = aPadConnection; }
269
270 int GetMinThickness() const { return m_ZoneMinThickness; }
271 void SetMinThickness( int aMinThickness )
272 {
273 if( m_ZoneMinThickness != aMinThickness
274 || ( m_fillMode == ZONE_FILL_MODE::HATCH_PATTERN
275 && ( m_hatchThickness < aMinThickness || m_hatchGap < aMinThickness ) ) )
276 {
277 SetNeedRefill( true );
278 }
279
280 m_ZoneMinThickness = aMinThickness;
281 m_hatchThickness = std::max( m_hatchThickness, aMinThickness );
282 m_hatchGap = std::max( m_hatchGap, aMinThickness );
283 }
284
285 int GetHatchThickness() const { return m_hatchThickness; }
286 void SetHatchThickness( int aThickness ) { m_hatchThickness = aThickness; }
287
288 int GetHatchGap() const { return m_hatchGap; }
289 void SetHatchGap( int aStep ) { m_hatchGap = aStep; }
290
292 void SetHatchOrientation( const EDA_ANGLE& aStep ) { m_hatchOrientation = aStep; }
293
295 void SetHatchSmoothingLevel( int aLevel ) { m_hatchSmoothingLevel = aLevel; }
296
298 void SetHatchSmoothingValue( double aValue ) { m_hatchSmoothingValue = aValue; }
299
300 double GetHatchHoleMinArea() const { return m_hatchHoleMinArea; }
301 void SetHatchHoleMinArea( double aPct ) { m_hatchHoleMinArea = aPct; }
302
304 void SetHatchBorderAlgorithm( int aAlgo ) { m_hatchBorderAlgorithm = aAlgo; }
305
307 {
308 // Transform relative indices to global index
309 int globalIndex = -1;
310
312 m_Poly->GetGlobalIndex( *m_CornerSelection, globalIndex );
313
314 return globalIndex;
315 }
316
317 void SetSelectedCorner( int aCorner )
318 {
319 SHAPE_POLY_SET::VERTEX_INDEX selectedCorner;
320
321 // If the global index of the corner is correct, assign it to m_CornerSelection
322 if( m_Poly->GetRelativeIndices( aCorner, &selectedCorner ) )
323 {
324 if( m_CornerSelection == nullptr )
326
327 *m_CornerSelection = selectedCorner;
328 }
329 else
330 throw( std::out_of_range( "aCorner-th vertex does not exist" ) );
331 }
332
334 int GetLocalFlags() const { return m_localFlgs; }
335 void SetLocalFlags( int aFlags ) { m_localFlgs = aFlags; }
336
338 const SHAPE_POLY_SET* Outline() const { return m_Poly; }
339
340 void SetOutline( SHAPE_POLY_SET* aOutline ) { m_Poly = aOutline; }
341
342 // @copydoc BOARD_ITEM::GetEffectiveShape
343 virtual std::shared_ptr<SHAPE>
345 FLASHING aFlash = FLASHING::DEFAULT ) const override;
346
353 bool HitTest( const VECTOR2I& aPosition, int aAccuracy = 0 ) const override;
354
363 bool HitTestFilledArea( PCB_LAYER_ID aLayer, const VECTOR2I& aRefPos, int aAccuracy = 0 ) const;
364
373 bool HitTestCutout( const VECTOR2I& aRefPos, int* aOutlineIdx = nullptr,
374 int* aHoleIdx = nullptr ) const;
375
381 void GetInteractingZones( PCB_LAYER_ID aLayer, std::vector<ZONE*>* aSameNetCollidingZones,
382 std::vector<ZONE*>* aOtherNetIntersectingZones ) const;
383
395
407 void TransformSmoothedOutlineToPolygon( SHAPE_POLY_SET& aBuffer, int aClearance,
408 int aError, ERROR_LOC aErrorLoc,
409 SHAPE_POLY_SET* aBoardOutline ) const;
410
424 int aClearance, int aError, ERROR_LOC aErrorLoc,
425 bool ignoreLineWidth = false ) const override;
426
437 bool HitTestForCorner( const VECTOR2I& refPos, int aAccuracy,
438 SHAPE_POLY_SET::VERTEX_INDEX* aCornerHit = nullptr ) const;
439
449 bool HitTestForEdge( const VECTOR2I& refPos, int aAccuracy,
450 SHAPE_POLY_SET::VERTEX_INDEX* aCornerHit = nullptr ) const;
451
455 bool HitTest( const BOX2I& aRect, bool aContained = true, int aAccuracy = 0 ) const override;
456
462 bool UnFill();
463
464 /* Geometric transformations: */
465
471 void Move( const VECTOR2I& offset ) override;
472
479 void MoveEdge( const VECTOR2I& offset, int aEdge );
480
486 void Rotate( const VECTOR2I& aCentre, const EDA_ANGLE& aAngle ) override;
487
494 virtual void Flip( const VECTOR2I& aCentre, bool aFlipLeftRight ) override;
495
502 void Mirror( const VECTOR2I& aMirrorRef, bool aMirrorLeftRight );
503
507 wxString GetClass() const override
508 {
509 return wxT( "ZONE" );
510 }
511
515 int GetNumCorners( void ) const
516 {
517 return m_Poly->TotalVertices();
518 }
519
526 {
527 return m_Poly->Iterate();
528 }
529
536 {
537 return m_Poly->IterateWithHoles();
538 }
539
546 {
547 return m_Poly->CIterateWithHoles();
548 }
549
550 void RemoveAllContours( void )
551 {
553 }
554
555 const VECTOR2I& GetCornerPosition( int aCornerIndex ) const
556 {
558
559 // Convert global to relative indices
560 if( !m_Poly->GetRelativeIndices( aCornerIndex, &index ) )
561 throw( std::out_of_range( "aCornerIndex-th vertex does not exist" ) );
562
563 return m_Poly->CVertex( index );
564 }
565
566 void SetCornerPosition( int aCornerIndex, const VECTOR2I& new_pos )
567 {
568 SHAPE_POLY_SET::VERTEX_INDEX relativeIndices;
569
570 // Convert global to relative indices
571 if( m_Poly->GetRelativeIndices( aCornerIndex, &relativeIndices ) )
572 {
573 if( m_Poly->CVertex( relativeIndices ).x != new_pos.x
574 || m_Poly->CVertex( relativeIndices ).y != new_pos.y )
575 {
576 SetNeedRefill( true );
577 m_Poly->SetVertex( relativeIndices, new_pos );
578 }
579 }
580 else
581 {
582 throw( std::out_of_range( "aCornerIndex-th vertex does not exist" ) );
583 }
584 }
585
589 void NewHole()
590 {
591 m_Poly->NewHole();
592 }
593
603 bool AppendCorner( VECTOR2I aPosition, int aHoleIdx, bool aAllowDuplication = false );
604
607
609 {
610 return m_FilledPolysList.count( aLayer ) > 0;
611 }
612
616 const std::shared_ptr<SHAPE_POLY_SET>& GetFilledPolysList( PCB_LAYER_ID aLayer ) const
617 {
618 wxASSERT( m_FilledPolysList.count( aLayer ) );
619 return m_FilledPolysList.at( aLayer );
620 }
621
623 {
624 wxASSERT( m_FilledPolysList.count( aLayer ) );
625 return m_FilledPolysList.at( aLayer ).get();
626 }
627
633
637 void SetFilledPolysList( PCB_LAYER_ID aLayer, const SHAPE_POLY_SET& aPolysList )
638 {
639 m_FilledPolysList[aLayer] = std::make_shared<SHAPE_POLY_SET>( aPolysList );
640 }
641
649 bool IsIsland( PCB_LAYER_ID aLayer, int aPolyIdx ) const;
650
651 void SetIsIsland( PCB_LAYER_ID aLayer, int aPolyIdx )
652 {
653 m_insulatedIslands[aLayer].insert( aPolyIdx );
654 }
655
656 bool BuildSmoothedPoly( SHAPE_POLY_SET& aSmoothedPoly, PCB_LAYER_ID aLayer,
657 SHAPE_POLY_SET* aBoardOutline,
658 SHAPE_POLY_SET* aSmoothedPolyWithApron = nullptr ) const;
659
660 void SetCornerSmoothingType( int aType ) { m_cornerSmoothingType = aType; };
661
663
664 void SetCornerRadius( unsigned int aRadius );
665
666 unsigned int GetCornerRadius() const { return m_cornerRadius; }
667
674 void RemoveCutout( int aOutlineIdx, int aHoleIdx );
675
682 void AddPolygon( std::vector<VECTOR2I>& aPolygon );
683
684 void AddPolygon( const SHAPE_LINE_CHAIN& aPolygon );
685
686 wxString GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const override;
687
688 BITMAPS GetMenuImage() const override;
689
690 EDA_ITEM* Clone() const override;
691
695 bool IsTeardropArea() const { return m_teardropType != TEARDROP_TYPE::TD_NONE; }
696
702
707
711 bool GetIsRuleArea() const { return m_isRuleArea; }
713 bool GetDoNotAllowVias() const { return m_doNotAllowVias; }
715 bool GetDoNotAllowPads() const { return m_doNotAllowPads; }
717
718 void SetIsRuleArea( bool aEnable ) { m_isRuleArea = aEnable; }
719 void SetDoNotAllowCopperPour( bool aEnable ) { m_doNotAllowCopperPour = aEnable; }
720 void SetDoNotAllowVias( bool aEnable ) { m_doNotAllowVias = aEnable; }
721 void SetDoNotAllowTracks( bool aEnable ) { m_doNotAllowTracks = aEnable; }
722 void SetDoNotAllowPads( bool aEnable ) { m_doNotAllowPads = aEnable; }
723 void SetDoNotAllowFootprints( bool aEnable ) { m_doNotAllowFootprints = aEnable; }
724
727
728 long long int GetMinIslandArea() const { return m_minIslandArea; }
729 void SetMinIslandArea( long long int aArea ) { m_minIslandArea = aArea; }
730
738 int GetBorderHatchPitch() const;
739
743 static int GetDefaultHatchPitch();
744
754 void SetBorderDisplayStyle( ZONE_BORDER_DISPLAY_STYLE aBorderHatchStyle, int aBorderHatchPitch,
755 bool aRebuilBorderdHatch );
756
762 void SetBorderHatchPitch( int aPitch );
763
767 void UnHatchBorder();
768
773 void HatchBorder();
774
775 const std::vector<SEG>& GetHatchLines() const { return m_borderHatchLines; }
776
781 void BuildHashValue( PCB_LAYER_ID aLayer );
782
787
788 double Similarity( const BOARD_ITEM& aOther ) const override;
789
790 bool operator==( const ZONE& aOther ) const;
791 bool operator==( const BOARD_ITEM& aOther ) const override;
792
793#if defined(DEBUG)
794 virtual void Show( int nestLevel, std::ostream& os ) const override { ShowDummy( os ); }
795
796 void SetFillPoly( PCB_LAYER_ID aLayer, SHAPE_POLY_SET* aPoly )
797 {
798 m_FilledPolysList[ aLayer ] = std::make_shared<SHAPE_POLY_SET>( *aPoly );
799 SetFillFlag( aLayer, true );
800 }
801
802#endif
803
804protected:
805 virtual void swapData( BOARD_ITEM* aImage ) override;
806
807protected:
810 unsigned int m_cornerRadius;
811
813 wxString m_zoneName;
814
816
817 /* Priority: when a zone outline is inside and other zone, if its priority is higher
818 * the other zone priority, it will be created inside.
819 * if priorities are equal, a DRC error is set
820 */
821 unsigned m_priority;
822
823 /* A zone outline can be a keepout zone.
824 * It will be never filled, and DRC should test for pads, tracks and vias
825 */
827
828 /* A zone outline can be a teardrop zone with different rules for priority
829 * (always bigger priority than copper zones) and never removed from a
830 * copper zone having the same netcode
831 */
833
834 /* For keepout zones only:
835 * what is not allowed inside the keepout ( pads, tracks and vias )
836 */
842
844 int m_ZoneClearance; // Clearance value in internal units.
845 int m_ZoneMinThickness; // Minimum thickness value in filled areas.
846 int m_fillVersion; // See BOARD_DESIGN_SETTINGS for version
847 // differences.
849
854 long long int m_minIslandArea;
855
858
865
866 int m_thermalReliefGap; // Width of the gap in thermal reliefs.
867 int m_thermalReliefSpokeWidth; // Width of the copper bridge in thermal reliefs.
868
869
877 int m_hatchThickness; // thickness of lines (if 0 -> solid shape)
878 int m_hatchGap; // gap between lines (0 -> solid shape
879 EDA_ANGLE m_hatchOrientation; // orientation of grid lines
880 int m_hatchSmoothingLevel; // 0 = no smoothing
881 // 1 = fillet
882 // 2 = arc low def
883 // 3 = arc high def
884 double m_hatchSmoothingValue; // hole chamfer/fillet size (ratio of hole size)
885 double m_hatchHoleMinArea; // min size before holes are dropped (ratio)
886 int m_hatchBorderAlgorithm; // 0 = use min zone thickness
887 // 1 = use hatch thickness
888
891
892 int m_localFlgs; // Variable used in polygon calculations.
893
894 /* set of filled polygons used to draw a zone as a filled area.
895 * from outlines (m_Poly) but unlike m_Poly these filled polygons have no hole
896 * (they are all in one piece) In very simple cases m_FilledPolysList is same
897 * as m_Poly. In less simple cases (when m_Poly has holes) m_FilledPolysList is
898 * a polygon equivalent to m_Poly, without holes but with extra outline segment
899 * connecting "holes" with external main outline. In complex cases an outline
900 * described by m_Poly can have many filled areas
901 */
902 std::map<PCB_LAYER_ID, std::shared_ptr<SHAPE_POLY_SET>> m_FilledPolysList;
903
906
908 std::map<PCB_LAYER_ID, HASH_128> m_filledPolysHash;
909
910 ZONE_BORDER_DISPLAY_STYLE m_borderStyle; // border display style, see enum above
911 int m_borderHatchPitch; // for DIAGONAL_EDGE, distance between 2 lines
912 std::vector<SEG> m_borderHatchLines; // hatch lines
913
915 std::map<PCB_LAYER_ID, std::set<int>> m_insulatedIslands;
916
917 double m_area; // The filled zone area
918 double m_outlinearea; // The outline zone area
919
921 std::mutex m_lock;
922};
923
924
925#ifndef SWIG
929#endif
930
931#endif // ZONE_H
BITMAPS
A list of all bitmap identifiers.
Definition: bitmaps_list.h:33
BASE_SET & set(size_t pos=std::numeric_limits< size_t >::max(), bool value=true)
Definition: base_set.h:61
bool test(size_t pos) const
Definition: base_set.h:47
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:79
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:289
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:89
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:101
virtual bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const
Compare the item against the search criteria in aSearchData.
Definition: eda_item.h:377
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: lset.h:35
EDA_MSG_PANEL items for displaying messages.
Definition: msgpanel.h:54
Definition: pad.h:54
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:73
void SetHatchThickness(int aThickness)
Definition: zone.h:286
SHAPE_POLY_SET::VERTEX_INDEX * m_CornerSelection
The index of the corner being moved or nullptr if no corner is selected.
Definition: zone.h:890
void SetNeedRefill(bool aNeedRefill)
Definition: zone.h:265
double GetOutlineArea()
This area is cached from the most recent call to CalculateOutlineArea().
Definition: zone.h:244
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:428
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
Definition: zone.cpp:824
void SetHatchBorderAlgorithm(int aAlgo)
Definition: zone.h:304
int m_borderHatchPitch
Definition: zone.h:911
const SHAPE_POLY_SET * Outline() const
Definition: zone.h:338
bool m_isRuleArea
Definition: zone.h:826
void SetDoNotAllowPads(bool aEnable)
Definition: zone.h:722
int GetHatchBorderAlgorithm() const
Definition: zone.h:303
ZONE & operator=(const ZONE &aOther)
Definition: zone.cpp:81
int m_cornerSmoothingType
Definition: zone.h:809
void Mirror(const VECTOR2I &aMirrorRef, bool aMirrorLeftRight)
Mirror the outlines relative to a given horizontal axis the layer is not changed.
Definition: zone.cpp:747
bool GetIsRuleArea() const
Accessors to parameters used in Rule Area zones:
Definition: zone.h:711
std::optional< int > GetLocalClearance() const override
Definition: zone.cpp:493
void SetLocalClearance(std::optional< int > aClearance)
Definition: zone.h:155
bool m_doNotAllowVias
Definition: zone.h:838
bool UnFill()
Removes the zone filling.
Definition: zone.cpp:209
bool NeedRefill() const
Definition: zone.h:264
bool GetDoNotAllowVias() const
Definition: zone.h:713
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:1386
void SetCornerRadius(unsigned int aRadius)
Definition: zone.cpp:398
ZONE_FILL_MODE m_fillMode
How to fill areas:
Definition: zone.h:876
const std::vector< SEG > & GetHatchLines() const
Definition: zone.h:775
void SetPosition(const VECTOR2I &aPos) override
Definition: zone.h:110
bool m_doNotAllowFootprints
Definition: zone.h:841
int m_ZoneMinThickness
Definition: zone.h:845
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:297
void AddPolygon(std::vector< VECTOR2I > &aPolygon)
Add a polygon to the zone outline.
Definition: zone.cpp:787
double m_hatchSmoothingValue
Definition: zone.h:884
const std::shared_ptr< SHAPE_POLY_SET > & GetFilledPolysList(PCB_LAYER_ID aLayer) const
Definition: zone.h:616
void SetLocalFlags(int aFlags)
Definition: zone.h:335
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:1316
void SetCornerSmoothingType(int aType)
Definition: zone.h:660
int m_thermalReliefSpokeWidth
Definition: zone.h:867
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:513
EDA_ANGLE m_hatchOrientation
Definition: zone.h:879
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:1074
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:915
wxString m_zoneName
An optional unique name for this zone, used for identifying it in DRC checking.
Definition: zone.h:813
void HatchBorder()
Compute the hatch lines depending on the hatch parameters and stores it in the zone's attribute m_bor...
Definition: zone.cpp:913
std::map< PCB_LAYER_ID, std::shared_ptr< SHAPE_POLY_SET > > m_FilledPolysList
Definition: zone.h:902
std::optional< int > GetLocalClearance(wxString *aSource) const override
Return any local clearances set in the "classic" (ie: pre-rule) system.
Definition: zone.h:163
void SetBorderDisplayStyle(ZONE_BORDER_DISPLAY_STYLE aBorderHatchStyle, int aBorderHatchPitch, bool aRebuilBorderdHatch)
Set all hatch parameters for the zone.
Definition: zone.cpp:878
bool GetDoNotAllowPads() const
Definition: zone.h:715
const BOX2I GetBoundingBox() const override
Definition: zone.cpp:346
void SetMinThickness(int aMinThickness)
Definition: zone.h:271
double GetFilledArea()
This area is cached from the most recent call to CalculateFilledArea().
Definition: zone.h:234
bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const override
Compare the item against the search criteria in aSearchData.
Definition: zone.h:135
double m_outlinearea
Definition: zone.h:918
wxString GetFriendlyName() const override
Definition: zone.cpp:687
bool GetDoNotAllowTracks() const
Definition: zone.h:714
int GetLocalFlags() const
Definition: zone.h:334
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
Definition: zone.cpp:180
void SetHatchOrientation(const EDA_ANGLE &aStep)
Definition: zone.h:292
wxString GetClass() const override
Definition: zone.h:507
bool m_doNotAllowCopperPour
Definition: zone.h:837
void SetHatchSmoothingValue(double aValue)
Definition: zone.h:298
bool m_needRefill
False when a zone was refilled, true after changes in zone params.
Definition: zone.h:864
SHAPE_POLY_SET::ITERATOR IterateWithHoles()
Return an iterator to visit all points of the zone's main outline with holes.
Definition: zone.h:535
virtual void Flip(const VECTOR2I &aCentre, bool aFlipLeftRight) override
Flip this object, i.e.
Definition: zone.cpp:726
bool IsFilled() const
Definition: zone.h:261
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:438
void SetHatchSmoothingLevel(int aLevel)
Definition: zone.h:295
bool m_doNotAllowTracks
Definition: zone.h:839
bool IsConnected() const override
Not all ZONEs are really BOARD_CONNECTED_ITEMs....
Definition: zone.h:90
void SetDoNotAllowCopperPour(bool aEnable)
Definition: zone.h:719
void SetThermalReliefSpokeWidth(int aThermalReliefSpokeWidth)
Definition: zone.h:206
virtual PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
Definition: zone.cpp:239
virtual void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
Definition: zone.cpp:263
ISLAND_REMOVAL_MODE GetIslandRemovalMode() const
Definition: zone.h:725
LSET m_fillFlags
Temp variables used while filling.
Definition: zone.h:905
void SetSelectedCorner(int aCorner)
Definition: zone.h:317
int GetSelectedCorner() const
Definition: zone.h:306
SHAPE_POLY_SET * Outline()
Definition: zone.h:337
void SetHatchStyle(ZONE_BORDER_DISPLAY_STYLE aStyle)
Definition: zone.h:606
bool m_doNotAllowPads
Definition: zone.h:840
void NewHole()
Create a new hole on the zone; i.e., a new contour on the zone's outline.
Definition: zone.h:589
void SetFillFlag(PCB_LAYER_ID aLayer, bool aFlag)
Definition: zone.h:259
void SetCornerPosition(int aCornerIndex, const VECTOR2I &new_pos)
Definition: zone.h:566
void Move(const VECTOR2I &offset) override
Move the outlines.
Definition: zone.cpp:660
bool IsIsland(PCB_LAYER_ID aLayer, int aPolyIdx) const
Check if a given filled polygon is an insulated island.
Definition: zone.cpp:1091
SHAPE_POLY_SET * m_Poly
Outline of the zone.
Definition: zone.h:808
TEARDROP_TYPE m_teardropType
Definition: zone.h:832
std::map< PCB_LAYER_ID, HASH_128 > m_filledPolysHash
A hash value used in zone filling calculations to see if the filled areas are up to date.
Definition: zone.h:908
~ZONE()
Definition: zone.cpp:91
long long int GetMinIslandArea() const
Definition: zone.h:728
int m_hatchSmoothingLevel
Definition: zone.h:880
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:1458
SHAPE_POLY_SET * GetFill(PCB_LAYER_ID aLayer)
Definition: zone.h:622
LSET m_layerSet
Definition: zone.h:815
void SetIsRuleArea(bool aEnable)
Definition: zone.h:718
int m_ZoneClearance
Definition: zone.h:844
void SetDoNotAllowTracks(bool aEnable)
Definition: zone.h:721
void SetFilledPolysList(PCB_LAYER_ID aLayer, const SHAPE_POLY_SET &aPolysList)
Set the list of filled polygons.
Definition: zone.h:637
const wxString & GetZoneName() const
Definition: zone.h:132
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:375
int GetMinThickness() const
Definition: zone.h:270
virtual void swapData(BOARD_ITEM *aImage) override
Definition: zone.cpp:1066
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:445
static bool ClassOf(const EDA_ITEM *aItem)
Definition: zone.h:82
void RemoveCutout(int aOutlineIdx, int aHoleIdx)
Remove a cutout from the zone.
Definition: zone.cpp:758
void Rotate(const VECTOR2I &aCentre, const EDA_ANGLE &aAngle) override
Rotate the outlines.
Definition: zone.cpp:715
bool HigherPriority(const ZONE *aOther) const
Definition: zone.cpp:186
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:499
void SetIsFilled(bool isFilled)
Definition: zone.h:262
void SetFillMode(ZONE_FILL_MODE aFillMode)
Definition: zone.h:192
int GetFillFlag(PCB_LAYER_ID aLayer)
Definition: zone.h:254
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
Definition: zone.cpp:1060
int m_hatchGap
Definition: zone.h:878
ZONE_CONNECTION GetPadConnection() const
Definition: zone.h:267
void InitDataFromSrcInCopyCtor(const ZONE &aZone)
Copy aZone data to me.
Definition: zone.cpp:101
bool HasFilledPolysForLayer(PCB_LAYER_ID aLayer) const
Definition: zone.h:608
int GetHatchThickness() const
Definition: zone.h:285
double GetHatchHoleMinArea() const
Definition: zone.h:300
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:538
virtual bool IsOnLayer(PCB_LAYER_ID) const override
Test to see if this object is on the given layer.
Definition: zone.cpp:340
int m_hatchBorderAlgorithm
Definition: zone.h:886
void SetDoNotAllowVias(bool aEnable)
Definition: zone.h:720
bool IsTeardropArea() const
Definition: zone.h:695
std::vector< SEG > m_borderHatchLines
Definition: zone.h:912
VECTOR2I GetPosition() const override
Definition: zone.cpp:233
int GetThermalReliefSpokeWidth() const
Definition: zone.h:214
int GetBorderHatchPitch() const
HatchBorder related methods.
Definition: zone.cpp:872
ZONE_BORDER_DISPLAY_STYLE GetHatchStyle() const
Definition: zone.h:605
void BuildHashValue(PCB_LAYER_ID aLayer)
Build the hash value of m_FilledPolysList, and store it internally in m_filledPolysHash.
Definition: zone.cpp:419
void SetThermalReliefGap(int aThermalReliefGap)
Definition: zone.h:195
EDA_ANGLE GetHatchOrientation() const
Definition: zone.h:291
void SetLayerSet(LSET aLayerSet) override
Definition: zone.cpp:269
bool BuildSmoothedPoly(SHAPE_POLY_SET &aSmoothedPoly, PCB_LAYER_ID aLayer, SHAPE_POLY_SET *aBoardOutline, SHAPE_POLY_SET *aSmoothedPolyWithApron=nullptr) const
Definition: zone.cpp:1138
int m_fillVersion
Definition: zone.h:846
const VECTOR2I & GetCornerPosition(int aCornerIndex) const
Definition: zone.h:555
bool GetDoNotAllowFootprints() const
Definition: zone.h:716
ZONE_FILL_MODE GetFillMode() const
Definition: zone.h:193
double m_hatchHoleMinArea
Definition: zone.h:885
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:545
SHAPE_POLY_SET::ITERATOR Iterate()
Return an iterator to visit all points of the zone's main outline without holes.
Definition: zone.h:525
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
Definition: zone.h:130
void SetDoNotAllowFootprints(bool aEnable)
Definition: zone.h:723
bool GetDoNotAllowCopperPour() const
Definition: zone.h:712
void SetBorderHatchPitch(int aPitch)
Set the hatch pitch parameter for the zone.
Definition: zone.cpp:893
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:1103
int GetHatchGap() const
Definition: zone.h:288
double CalculateOutlineArea()
Compute the area of the zone outline (not the filled area).
Definition: zone.cpp:1309
std::mutex m_lock
Lock used for multi-threaded filling on multi-layer zones.
Definition: zone.h:921
void SetHatchHoleMinArea(double aPct)
Definition: zone.h:301
unsigned m_priority
Definition: zone.h:821
TEARDROP_TYPE GetTeardropAreaType() const
Definition: zone.h:706
bool IsConflicting() const
For rule areas which exclude footprints (and therefore participate in courtyard conflicts during move...
Definition: zone.cpp:227
ISLAND_REMOVAL_MODE m_islandRemovalMode
Definition: zone.h:848
bool m_isFilled
True when a zone was filled, false after deleting the filled areas.
Definition: zone.h:857
double GetHatchSmoothingValue() const
Definition: zone.h:297
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:804
void MoveEdge(const VECTOR2I &offset, int aEdge)
Move the outline Edge.
Definition: zone.cpp:700
int GetHatchSmoothingLevel() const
Definition: zone.h:294
unsigned int GetCornerRadius() const
Definition: zone.h:666
int GetCornerSmoothingType() const
Definition: zone.h:662
int m_thermalReliefGap
Definition: zone.h:866
double ViewGetLOD(int aLayer, KIGFX::VIEW *aView) const override
Return the level of detail (LOD) of the item.
Definition: zone.cpp:313
void SetIsIsland(PCB_LAYER_ID aLayer, int aPolyIdx)
Definition: zone.h:651
int m_localFlgs
Definition: zone.h:892
bool IsOnCopperLayer() const override
Definition: zone.cpp:257
double CalculateFilledArea()
Compute the area currently occupied by the zone fill.
Definition: zone.cpp:1286
int m_hatchThickness
Definition: zone.h:877
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:1356
void SetAssignedPriority(unsigned aPriority)
Definition: zone.h:115
double m_area
Definition: zone.h:917
unsigned int m_cornerRadius
Definition: zone.h:810
void SetPadConnection(ZONE_CONNECTION aPadConnection)
Definition: zone.h:268
std::mutex & GetLock()
Definition: zone.h:249
void SetZoneName(const wxString &aName)
Definition: zone.h:133
bool operator==(const ZONE &aOther) const
Definition: zone.cpp:1403
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:701
void UnHatchBorder()
Clear the zone's hatch.
Definition: zone.cpp:899
void SetIslandRemovalMode(ISLAND_REMOVAL_MODE aRemove)
Definition: zone.h:726
void SetOutline(SHAPE_POLY_SET *aOutline)
Definition: zone.h:340
PCB_LAYER_ID GetFirstLayer() const
Definition: zone.cpp:248
void SetMinIslandArea(long long int aArea)
Definition: zone.h:729
HASH_128 GetHashValue(PCB_LAYER_ID aLayer)
Definition: zone.cpp:410
ZONE_CONNECTION m_PadConnection
Definition: zone.h:843
int GetThermalReliefGap() const
Definition: zone.h:203
void RemoveAllContours(void)
Definition: zone.h:550
void SetHatchGap(int aStep)
Definition: zone.h:289
static int GetDefaultHatchPitch()
Definition: zone.cpp:1054
unsigned GetAssignedPriority() const
Definition: zone.h:120
int GetNumCorners(void) const
Access to m_Poly parameters.
Definition: zone.h:515
bool SameNet(const ZONE *aOther) const
Definition: zone.cpp:203
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:1347
ZONE_BORDER_DISPLAY_STYLE m_borderStyle
Definition: zone.h:910
long long int m_minIslandArea
When island removal mode is set to AREA, islands below this area will be removed.
Definition: zone.h:854
#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 storage class for 128-bit hash value.
Definition: hash_128.h:36
A struct recording the isolated and single-pad islands within a zone.
Definition: zone.h:60
std::vector< int > m_SingleConnectionOutlines
Definition: zone.h:62
std::vector< int > m_IsolatedOutlines
Definition: zone.h:61
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:59
ZONE_FILL_MODE
Definition: zone_settings.h:42
ZONE_BORDER_DISPLAY_STYLE
Zone border styles.
Definition: zone_settings.h:50
ZONE_CONNECTION
How pads are covered by copper in zone.
Definition: zones.h:47