47 std::unique_ptr<ZONE> zone = std::make_unique<ZONE>( &aParent );
48 zone->SetLayer( aLayer );
50 std::unique_ptr<SHAPE_POLY_SET> outline = std::make_unique<SHAPE_POLY_SET>();
53 zone->SetOutline( outline.release() );
64 auto zone = std::make_unique<ZONE>( &aParent );
65 zone->SetLayer( aLayer );
67 std::unique_ptr<SHAPE_POLY_SET> outline = std::make_unique<SHAPE_POLY_SET>( *aOther.
Outline() );
68 zone->SetOutline( outline.release() );
85 for(
const BOX2I& cutout : aCutouts )
97 ZONE zone( &m_board );
109 ZONE zone( &m_board );
129 ZONE zone( &m_board );
159 sourceOutline.
Append( fullCircle );
161 BOOST_TEST_REQUIRE( sourceOutline.
ArcCount() > 0 );
162 double sourceArea = sourceOutline.
Area();
163 BOOST_TEST_REQUIRE( sourceArea > 0.0 );
186 BOOST_TEST_REQUIRE( working.
HoleCount( 0 ) == 1 );
188 double expectedArea = sourceArea - cutoutOutline.
Area();
189 BOOST_CHECK_CLOSE( working.
Area(), expectedArea, 0.1 );
210 ZONE zone( &m_board );
221 std::vector<std::unique_ptr<ZONE>> zones;
223 zones.emplace_back( std::make_unique<ZONE>( &m_board ) );
224 zones.back()->SetLayer(
F_Cu );
226 zones.emplace_back( std::make_unique<ZONE>( &m_board ) );
227 zones.back()->SetLayer(
F_Cu );
238 std::vector<std::unique_ptr<ZONE>> zones;
252 std::vector<std::unique_ptr<ZONE>> zones;
263 BOOST_TEST( merged[0]->GetNumCorners() == 4 );
269 std::vector<std::unique_ptr<ZONE>> zones;
277 auto newPolyB = std::make_unique<SHAPE_POLY_SET>( *zones.back()->Outline() );
278 newPolyB->Outline( 0 ).Reverse();
279 zones.back()->SetOutline( newPolyB.release() );
287 BOOST_TEST( merged[0]->GetNumCorners() == 4 );
295 via->SetPosition( aPos );
296 via->SetLayerPair( aTopLayer, aBotLayer );
299 via->SetNetCode( aNetCode );
313 pad->SetPosition( aPos );
316 pad->SetLayerSet(
LSET( { aLayer } ) );
317 pad->SetNetCode( aNetCode );
334 zoneA->SetAssignedPriority( 5 );
340 zoneB->SetAssignedPriority( 10 );
342 ZONE* ptrA = zoneA.get();
343 ZONE* ptrB = zoneB.get();
344 m_board.Add( zoneA.release() );
345 m_board.Add( zoneB.release() );
370 ZONE* ptrA = zoneA.get();
371 ZONE* ptrB = zoneB.get();
372 m_board.Add( zoneA.release() );
373 m_board.Add( zoneB.release() );
375 for(
int i = 0; i < 5; i++ )
403 ZONE* ptrA = zoneA.get();
404 ZONE* ptrB = zoneB.get();
405 m_board.Add( zoneA.release() );
406 m_board.Add( zoneB.release() );
421 m_board.SetCopperLayerCount( 2 );
440 ZONE* ptrA = zoneA.get();
441 ZONE* ptrB = zoneB.get();
442 m_board.Add( zoneA.release() );
443 m_board.Add( zoneB.release() );
473 ZONE* ptrA = zoneA.get();
474 ZONE* ptrB = zoneB.get();
475 m_board.Add( zoneA.release() );
476 m_board.Add( zoneB.release() );
500 zoneA->SetAssignedPriority( 50 );
506 zoneB->SetAssignedPriority( 50 );
508 ZONE* ptrA = zoneA.get();
509 ZONE* ptrB = zoneB.get();
510 m_board.Add( zoneA.release() );
511 m_board.Add( zoneB.release() );
525 m_board.Add( netGND );
527 m_board.Add( netVCC );
547 ZONE* ptrA = zoneA.get();
548 ZONE* ptrB = zoneB.get();
549 ZONE* ptrC = zoneC.get();
550 m_board.Add( zoneA.release() );
551 m_board.Add( zoneB.release() );
552 m_board.Add( zoneC.release() );
555 for(
int i = 0; i < 4; i++ )
581 ruleArea->SetIsRuleArea(
true );
583 double zoneArea = ruleArea->GetCoverageArea( 0 );
595 double padArea =
pad->GetCoverageArea( 0 );
616 zone->SetFilledPolysList(
F_Cu, fill );
620 boost::test_tools::tolerance( 0.001 ) );
631 const int copperPass =
F_Cu;
656 "Identical rule areas must not report a mismatch" );
659 "A moved cutout with the same corner count must report a mismatch" );
676 ZONE* zone = oneCutout->Zones()[0];
685 BOOST_REQUIRE_EQUAL( twoCutouts->
Zones()[0]->Outline()->TotalVertices(),
686 oneCutout->Zones()[0]->Outline()->TotalVertices() );
689 "A changed cutout count with equal total vertices must report a mismatch" );
constexpr EDA_IU_SCALE pcbIUScale
Abstract interface for BOARD_ITEMs capable of storing other items inside.
Information pertinent to a Pcbnew printed circuit board.
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT, bool aSkipConnectivity=false) override
Removes an item from the container.
LSET is a set of PCB_LAYER_IDs.
Handle the data for a net.
@ NORMAL
Shape is the same on all layers.
static constexpr PCB_LAYER_ID ALL_LAYERS
! The layer identifier to use for the single defintion on normal padstacks
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
const std::optional< INTERSECTION > SelfIntersecting() const
Check if the line chain is self-intersecting.
bool IsClosed() const override
int PointCount() const
Return the number of points (vertices) in this line chain.
void Insert(size_t aVertex, const VECTOR2I &aP)
Represent a set of closed polygons.
void ClearArcs()
Removes all arc references from all the outlines and holes in the polyset.
int AddOutline(const SHAPE_LINE_CHAIN &aOutline)
Adds a new outline to the set and returns its index.
double Area()
Return the area of this poly set.
int HoleCount(int aOutline) const
Returns the number of holes in a given outline.
int Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Appends a vertex at the end of the given outline/hole (default: the last outline)
int AddHole(const SHAPE_LINE_CHAIN &aHole, int aOutline=-1)
Adds a new hole to the given outline (default: last) and returns its index.
int ArcCount() const
Count the number of arc shapes present.
int NewOutline()
Creates a new empty polygon in the set and returns its index.
const SHAPE_LINE_CHAIN & CHole(int aOutline, int aHole) const
int OutlineCount() const
Return the number of outlines in the set.
void BooleanSubtract(const SHAPE_POLY_SET &b)
Perform boolean polyset difference.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
Handle a list of polygons defining a copper zone.
virtual PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
virtual void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
SHAPE_POLY_SET * Outline()
void SetIsRuleArea(bool aEnable)
void SetLayerSet(const LSET &aLayerSet) override
VECTOR2I GetPosition() const override
bool IsOnCopperLayer() const override
PCB_LAYER_ID GetFirstLayer() const
unsigned GetAssignedPriority() const
int GetNumCorners(void) const
Access to m_Poly parameters.
PCB_LAYER_ID
A quick note on layer IDs:
#define ZONE_LAYER_FOR(boardLayer)
SHAPE_LINE_CHAIN BoxToLineChain(const BOX2I &aBox)
Get a SHAPE_LINE_CHAIN representing the outline of a box.
bool ZoneOutlineDrawnOnLayer(bool aOutlineOnly, int aLayer)
Decide which GAL draw pass paints a zone's outline.
Utility functions for working with shapes.
BOOST_AUTO_TEST_CASE(HorizontalAlignment)
BOOST_REQUIRE(intersection.has_value()==c.ExpectedIntersection.has_value())
BOOST_AUTO_TEST_SUITE_END()
BOOST_TEST(netlist.find("R_G1 ARM_OUT1 DIE_B R='0.001 / ((SW_STATE)") !=std::string::npos)
VECTOR3I expected(15, 30, 45)
static PCB_VIA * AddVia(BOARD &aBoard, const VECTOR2I &aPos, int aNetCode, PCB_LAYER_ID aTopLayer=F_Cu, PCB_LAYER_ID aBotLayer=B_Cu)
static std::unique_ptr< ZONE > CreateSquareZone(BOARD_ITEM_CONTAINER &aParent, PCB_LAYER_ID aLayer, const VECTOR2I &aOrigin, const VECTOR2I &aSize)
static std::unique_ptr< ZONE > CreateSimilarZone(BOARD_ITEM_CONTAINER &aParent, PCB_LAYER_ID aLayer, const ZONE &aOther)
Create a similar zone (same outline) on a different layer.
static FOOTPRINT * MakeFootprintWithRuleArea(BOARD &aBoard, const std::vector< BOX2I > &aCutouts)
BOOST_AUTO_TEST_CASE(SingleLayer)
static PAD * AddPadToBoard(BOARD &aBoard, const VECTOR2I &aPos, int aNetCode, PCB_LAYER_ID aLayer=F_Cu)
VECTOR2< int32_t > VECTOR2I
std::vector< std::unique_ptr< ZONE > > MergeZonesWithSameOutline(std::vector< std::unique_ptr< ZONE > > &&aZones)
Merges zones with identical outlines and nets on different layers into single multi-layer zones.
bool AutoAssignZonePriorities(BOARD *aBoard, PROGRESS_REPORTER *aReporter)
Automatically assign zone priorities based on connectivity analysis of overlapping regions.