42#define AR_KEEPOUT_MARGIN 500
43#define AR_ABORT_PLACEMENT -1
48#define CELL_IS_EMPTY 0x00
49#define CELL_IS_HOLE 0x01
50#define CELL_IS_MODULE 0x02
51#define CELL_IS_EDGE 0x20
52#define CELL_IS_FRIEND 0x40
53#define CELL_IS_ZONE 0x80
106 for(
auto drawing :
m_board->Drawings() )
108 switch( drawing->Type() )
137 std::vector<int> x_coordinates;
150 for(
int refy = rect.
GetY(), endy = rect.
GetBottom(); refy < endy; refy += step )
153 int idy = (refy - coord_orgin.
y) / step;
164 x_coordinates.clear();
166 for(
int v = 0; v < outline.
PointCount(); v++ )
168 int seg_startX = outline.
CPoint( v ).
x;
169 int seg_startY = outline.
CPoint( v ).
y;
170 int seg_endX = outline.
CPoint( v + 1 ).
x;
171 int seg_endY = outline.
CPoint( v + 1 ).
y;
174 if( ( seg_startY > refy ) && ( seg_endY > refy ) )
178 if( ( seg_startY <= refy ) && (seg_endY <= refy ) )
188 seg_endX -= seg_startX;
189 seg_endY -= seg_startY;
190 double newrefy = refy - seg_startY;
204 double inv_slope = (double) seg_endX / seg_endY;
205 intersec_x = newrefy * inv_slope;
206 x_coordinates.push_back( (
int) intersec_x + seg_startX );
213 std::sort( x_coordinates.begin(), x_coordinates.end() );
217 if( ( x_coordinates.size() & 1 ) != 0 )
224 int iimax = x_coordinates.size() - 1;
226 for(
int ii = 0; ii < iimax; ii += 2 )
228 int seg_start_x = x_coordinates[ii] - coord_orgin.
x;
229 int seg_end_x = x_coordinates[ii + 1] - coord_orgin.
x;
234 for(
int idx = seg_start_x / step; idx <
m_matrix.m_Ncols; idx++ )
236 if( idx * step > seg_end_x )
239 if( idx * step >= seg_start_x )
252 if( aLayerMask[
F_Cu ] )
261 if( aLayerMask[
B_Cu ] )
325 int margin = (
m_matrix.m_GridRouting / 2) +
pad->GetOwnClearance(
pad->GetLayer() );
336 int ox = fpBBox.
GetX();
338 int oy = fpBBox.
GetY();
341 ox = std::max(
m_matrix.m_BrdBox.GetX(), std::min( ox,
m_matrix.m_BrdBox.GetRight() ) );
342 fx = std::max(
m_matrix.m_BrdBox.GetX(), std::min( fx,
m_matrix.m_BrdBox.GetRight() ) );
343 oy = std::max(
m_matrix.m_BrdBox.GetY(), std::min( oy,
m_matrix.m_BrdBox.GetBottom() ) );
344 fy = std::max(
m_matrix.m_BrdBox.GetY(), std::min( fy,
m_matrix.m_BrdBox.GetBottom() ) );
359 int margin = (
m_matrix.m_GridRouting / 2) +
pad->GetOwnClearance(
pad->GetLayer() );
384 int row_min = start.
y /
m_matrix.m_GridRouting;
386 int col_min = start.
x /
m_matrix.m_GridRouting;
389 if( start.
y > row_min *
m_matrix.m_GridRouting )
392 if( start.
x > col_min *
m_matrix.m_GridRouting )
395 row_min = std::max( 0, row_min );
396 row_max = std::min( row_max,
m_matrix.m_Nrows - 1 );
397 col_min = std::max( 0, col_min );
398 col_max = std::min( col_max,
m_matrix.m_Ncols - 1 );
400 for(
int row = row_min; row <= row_max; row++ )
402 for(
int col = col_min; col <= col_max; col++ )
404 unsigned int data =
m_matrix.GetCell( row, col, side );
423 int row_min = start.
y /
m_matrix.m_GridRouting;
425 int col_min = start.
x /
m_matrix.m_GridRouting;
428 if( start.
y > row_min *
m_matrix.m_GridRouting )
431 if( start.
x > col_min *
m_matrix.m_GridRouting )
434 row_min = std::max( 0, row_min );
435 row_max = std::min( row_max,
m_matrix.m_Nrows - 1 );
436 col_min = std::max( 0, col_min );
437 col_max = std::min( col_max,
m_matrix.m_Ncols - 1 );
439 unsigned int keepOutCost = 0;
441 for(
int row = row_min; row <= row_max; row++ )
443 for(
int col = col_min; col <= col_max; col++ )
449 keepOutCost +=
m_matrix.GetDist( row, col, side );
469 fpBBox.
Move( -1*aOffset );
494 double min_cost, curr_cost, Score;
503 fpBBox.
Move( -fpPos );
512 initialPos.
x -= initialPos.
x %
m_matrix.m_GridRouting;
513 initialPos.
y -= initialPos.
y %
m_matrix.m_GridRouting;
519 testOtherSide =
false;
521 if(
m_matrix.m_RoutingLayersCount > 1 )
527 if( !(
pad->GetLayerSet() & other ).any() )
530 testOtherSide =
true;
552 if( keepOutCost >= 0 )
557 Score = curr_cost + keepOutCost;
559 if( (min_cost >= Score ) || (min_cost < 0 ) )
578 const PAD* nearest =
nullptr;
579 int64_t nearestDist = INT64_MAX;
583 if ( footprint == aRefFP )
586 if( !
m_matrix.m_BrdBox.Contains( footprint->GetPosition() ) )
589 for(
PAD*
pad: footprint->Pads() )
597 if ( dist < nearestDist )
611 double curr_cost = 0;
628 int dx = abs(
end.x - start.
x );
629 int dy = abs(
end.y - start.
y );
640 double conn_cost = hypot( dx, dy * 2.0 );
641 curr_cost += conn_cost;
667 std::vector<FOOTPRINT*> fpList;
670 fpList.push_back( footprint );
676 footprint->SetFlag( 0 );
678 if( !footprint->NeedsPlaced() )
688 auto edges =
m_connectivity->GetRatsnestForComponent( footprint,
true );
690 footprint->SetFlag( edges.size() ) ;
701 if( !footprint->NeedsPlaced() )
704 altFootprint = footprint;
706 if( footprint->GetFlag() == 0 )
709 bestFootprint = footprint;
714 return bestFootprint;
753 bool aPlaceOffboardModules )
757 bool cancelled =
false;
774 footprint->SetNeedsPlaced(
false );
776 std::vector<FOOTPRINT*> offboardMods;
778 if( aPlaceOffboardModules )
782 if( !
m_matrix.m_BrdBox.Contains( footprint->GetPosition() ) )
783 offboardMods.push_back( footprint );
787 for(
FOOTPRINT* footprint : aFootprints )
789 footprint->SetNeedsPlaced(
true );
790 aCommit->
Modify( footprint );
793 for(
FOOTPRINT* footprint : offboardMods )
795 footprint->SetNeedsPlaced(
true );
796 aCommit->
Modify( footprint );
801 if( footprint->NeedsPlaced() )
#define AR_KEEPOUT_MARGIN
static bool sortFootprintsByRatsnestSize(FOOTPRINT *ref, FOOTPRINT *compare)
#define AR_ABORT_PLACEMENT
static bool sortFootprintsByComplexity(FOOTPRINT *ref, FOOTPRINT *compare)
constexpr EDA_IU_SCALE pcbIUScale
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
std::function< int(FOOTPRINT *aFootprint)> m_refreshCallback
std::unique_ptr< CONNECTIVITY_DATA > m_connectivity
void drawPlacementRoutingMatrix()
int getOptimalFPPlacement(FOOTPRINT *aFootprint)
AR_RESULT AutoplaceFootprints(std::vector< FOOTPRINT * > &aFootprints, BOARD_COMMIT *aCommit, bool aPlaceOffboardModules=false)
int testRectangle(const BOX2I &aRect, int side)
SHAPE_POLY_SET m_fpAreaTop
bool fillMatrix()
Fill m_matrix cells from m_boardShape.
AR_AUTOPLACER(BOARD *aBoard)
PROGRESS_REPORTER * m_progressReporter
const PAD * nearestPad(FOOTPRINT *aRefFP, PAD *aRefPad, const VECTOR2I &aOffset)
void buildFpAreas(FOOTPRINT *aFootprint, int aFpClearance)
unsigned int calculateKeepOutArea(const BOX2I &aRect, int side)
void placeFootprint(FOOTPRINT *aFootprint, bool aDoNotRecreateRatsnest, const VECTOR2I &aPos)
FOOTPRINT * pickFootprint()
Find the "best" footprint place.
void genModuleOnRoutingMatrix(FOOTPRINT *aFootprint)
SHAPE_POLY_SET m_topFreeArea
void addPad(PAD *aPad, int aClearance)
void addFpBody(const VECTOR2I &aStart, const VECTOR2I &aEnd, const LSET &aLayerMask)
int testFootprintOnBoard(FOOTPRINT *aFootprint, bool TstOtherSide, const VECTOR2I &aOffset)
SHAPE_POLY_SET m_fpAreaBottom
double computePlacementRatsnestCost(FOOTPRINT *aFootprint, const VECTOR2I &aOffset)
std::shared_ptr< KIGFX::VIEW_OVERLAY > m_overlay
SHAPE_POLY_SET m_boardShape
int genPlacementRoutingMatrix()
SHAPE_POLY_SET m_bottomFreeArea
unsigned char MATRIX_CELL
BASE_SET & set(size_t pos)
Information pertinent to a Pcbnew printed circuit board.
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
constexpr const Vec GetEnd() const
constexpr void SetOrigin(const Vec &pos)
constexpr coord_type GetY() const
constexpr size_type GetWidth() const
constexpr coord_type GetX() const
constexpr size_type GetHeight() const
constexpr coord_type GetLeft() const
constexpr void Move(const Vec &aMoveVector)
Move the rectangle by the aMoveVector.
constexpr const Vec & GetOrigin() const
constexpr coord_type GetRight() const
constexpr coord_type GetTop() const
constexpr coord_type GetBottom() const
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
A color representation with 4 components: red, green, blue, alpha.
LSET is a set of PCB_LAYER_IDs.
const BOX2I GetBoundingBox() const override
The bounding box is cached, so this will be efficient most of the time.
bool IsOnLayer(PCB_LAYER_ID aLayer) const override
Test to see if this object is on the given layer.
VECTOR2I GetPosition() const override
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
int PointCount() const
Return the number of points (vertices) in this line chain.
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
const BOX2I BBox(int aClearance=0) const override
Compute a bounding box of the shape, with a margin of aClearance a collision.
Represent a set of closed polygons.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
int OutlineCount() const
Return the number of outlines in the set.
void Fracture(bool aSimplify=true)
Convert a set of polygons with holes to a single outline with "slits"/"fractures" connecting the oute...
This file is part of the common library.
Message panel definition file.
Class that computes missing connections on a PCB.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
VECTOR2< int32_t > VECTOR2I