KiCad PCB EDA Suite
Loading...
Searching...
No Matches
zone_utils.cpp File Reference
#include "zone_utils.h"
#include <board.h>
#include <footprint.h>
#include <pad.h>
#include <pcb_track.h>
#include <thread_pool.h>
#include <zone.h>
#include <geometry/shape_poly_set.h>
#include <algorithm>
#include <cmath>
#include <future>
#include <optional>
#include <unordered_map>
#include <unordered_set>

Go to the source code of this file.

Functions

static bool RuleAreasHaveSameProps (const ZONE &a, const ZONE &b)
 
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.
 
static std::vector< ZONE_OVERLAP_PAIR > findOverlappingPairs (BOARD *aBoard)
 
static std::optional< ZONE_PRIORITY_EDGE > computeConstraint (const ZONE_OVERLAP_PAIR &aPair, BOARD *aBoard)
 
static void assignPrioritiesFromGraph (const std::vector< ZONE_PRIORITY_EDGE > &aEdges, std::vector< ZONE * > &aAllZones)
 
static ZONEufFind (std::unordered_map< ZONE *, ZONE * > &aParent, ZONE *aZone)
 
static void ufUnion (std::unordered_map< ZONE *, ZONE * > &aParent, std::unordered_map< ZONE *, int > &aRank, ZONE *aA, ZONE *aB)
 
bool AutoAssignZonePriorities (BOARD *aBoard, PROGRESS_REPORTER *aReporter)
 Automatically assign zone priorities based on connectivity analysis of overlapping regions.
 

Function Documentation

◆ assignPrioritiesFromGraph()

static void assignPrioritiesFromGraph ( const std::vector< ZONE_PRIORITY_EDGE > & aEdges,
std::vector< ZONE * > & aAllZones )
static

Definition at line 363 of file zone_utils.cpp.

Referenced by AutoAssignZonePriorities().

◆ AutoAssignZonePriorities()

bool AutoAssignZonePriorities ( BOARD * aBoard,
PROGRESS_REPORTER * aReporter = nullptr )

Automatically assign zone priorities based on connectivity analysis of overlapping regions.

For each pair of overlapping zones, counts pads and vias per-net in the intersection area. The zone whose net has more items in the overlap gets higher priority. When item counts are within 20% of the larger count, the smaller zone gets higher priority. Overlap analysis for each pair runs in parallel via the KiCad thread pool.

Parameters
aBoardthe board whose zone priorities will be reassigned
aReporteroptional progress reporter
Returns
true if any priorities were changed

Definition at line 501 of file zone_utils.cpp.

References assignPrioritiesFromGraph(), findOverlappingPairs(), GetKiCadThreadPool(), result, tp, ufFind(), ufUnion(), and BOARD::Zones().

Referenced by BOOST_AUTO_TEST_CASE(), BOOST_AUTO_TEST_CASE(), BOOST_AUTO_TEST_CASE(), BOOST_AUTO_TEST_CASE(), BOOST_AUTO_TEST_CASE(), BOOST_AUTO_TEST_CASE(), BOOST_AUTO_TEST_CASE(), DIALOG_ZONE_MANAGER::OnAutoAssignClick(), and FABMASTER::orderZones().

◆ computeConstraint()

◆ findOverlappingPairs()

◆ MergeZonesWithSameOutline()

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.

Parameters
aZonesis the zones to merge. Ownership of all the zones is taken (some will be returned)
Returns
the merged zones. Ownership of all the returned zones is transferred to the caller.

Definition at line 55 of file zone_utils.cpp.

References SHAPE_LINE_CHAIN::BBox(), SHAPE_LINE_CHAIN::CompareGeometry(), SHAPE_POLY_SET::CPolygon(), ZONE::GetFill(), ZONE::GetLayerSet(), SHAPE_POLY_SET::Outline(), SHAPE_POLY_SET::OutlineCount(), SHAPE_LINE_CHAIN::PointCount(), RuleAreasHaveSameProps(), ZONE::SetFilledPolysList(), ZONE::SetIsFilled(), ZONE::SetLayerSet(), and ZONE::SetNeedRefill().

Referenced by BOOST_AUTO_TEST_CASE(), BOOST_AUTO_TEST_CASE(), BOOST_AUTO_TEST_CASE(), BOOST_AUTO_TEST_CASE(), and ALLEGRO::BOARD_BUILDER::createZones().

◆ RuleAreasHaveSameProps()

static bool RuleAreasHaveSameProps ( const ZONE & a,
const ZONE & b )
static

◆ ufFind()

static ZONE * ufFind ( std::unordered_map< ZONE *, ZONE * > & aParent,
ZONE * aZone )
static

Definition at line 470 of file zone_utils.cpp.

References ufFind().

Referenced by AutoAssignZonePriorities(), ufFind(), and ufUnion().

◆ ufUnion()

static void ufUnion ( std::unordered_map< ZONE *, ZONE * > & aParent,
std::unordered_map< ZONE *, int > & aRank,
ZONE * aA,
ZONE * aB )
static

Definition at line 481 of file zone_utils.cpp.

References ufFind().

Referenced by AutoAssignZonePriorities().