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
109 for(
auto drawing :
m_board->Drawings() )
111 switch( drawing->Type() )
140 std::vector <int> x_coordinates;
153 for(
int refy = rect.
GetY(), endy = rect.
GetBottom(); refy < endy; refy += step )
156 int idy = (refy - coord_orgin.
y) / step;
167 x_coordinates.clear();
169 for(
int v = 0; v < outline.
PointCount(); v++ )
171 int seg_startX = outline.
CPoint( v ).
x;
172 int seg_startY = outline.
CPoint( v ).
y;
173 int seg_endX = outline.
CPoint( v + 1 ).
x;
174 int seg_endY = outline.
CPoint( v + 1 ).
y;
177 if( ( seg_startY > refy ) && ( seg_endY > refy ) )
181 if( ( seg_startY <= refy ) && (seg_endY <= refy ) )
191 seg_endX -= seg_startX;
192 seg_endY -= seg_startY;
193 double newrefy = (double) ( refy - seg_startY );
207 double inv_slope = (double) seg_endX / seg_endY;
208 intersec_x = newrefy * inv_slope;
209 x_coordinates.push_back( (
int) intersec_x + seg_startX );
216 std::sort( x_coordinates.begin(), x_coordinates.end() );
220 if( ( x_coordinates.size() & 1 ) != 0 )
227 int iimax = x_coordinates.size() - 1;
229 for(
int ii = 0; ii < iimax; ii += 2 )
231 int seg_start_x = x_coordinates[ii] - coord_orgin.
x;
232 int seg_end_x = x_coordinates[ii + 1] - coord_orgin.
x;
237 for(
int idx = seg_start_x / step; idx <
m_matrix.m_Ncols; idx++ )
239 if( idx * step > seg_end_x )
242 if( idx * step >= seg_start_x )
255 if( aLayerMask[
F_Cu ] )
264 if( aLayerMask[
B_Cu ] )
328 int margin = (
m_matrix.m_GridRouting / 2) +
pad->GetOwnClearance(
pad->GetLayer() );
349 if( ox >
m_matrix.m_BrdBox.GetRight() )
355 if( fx >
m_matrix.m_BrdBox.GetRight() )
361 if( oy >
m_matrix.m_BrdBox.GetBottom() )
367 if( fy >
m_matrix.m_BrdBox.GetBottom() )
376 m_matrix.TraceFilledRectangle( ox, oy, fx, fy, layerMask,
382 int margin = (
m_matrix.m_GridRouting / 2) +
pad->GetOwnClearance(
pad->GetLayer() );
408 start -=
m_matrix.m_BrdBox.GetOrigin();
411 int row_min = start.
y /
m_matrix.m_GridRouting;
413 int col_min = start.
x /
m_matrix.m_GridRouting;
416 if( start.
y > row_min *
m_matrix.m_GridRouting )
419 if( start.
x > col_min *
m_matrix.m_GridRouting )
425 if( row_max >= (
m_matrix.m_Nrows - 1 ) )
431 if( col_max >= (
m_matrix.m_Ncols - 1 ) )
434 for(
int row = row_min; row <= row_max; row++ )
436 for(
int col = col_min; col <= col_max; col++ )
438 unsigned int data =
m_matrix.GetCell( row, col, side );
457 start -=
m_matrix.m_BrdBox.GetOrigin();
460 int row_min = start.
y /
m_matrix.m_GridRouting;
462 int col_min = start.
x /
m_matrix.m_GridRouting;
465 if( start.
y > row_min *
m_matrix.m_GridRouting )
468 if( start.
x > col_min *
m_matrix.m_GridRouting )
474 if( row_max >= (
m_matrix.m_Nrows - 1 ) )
480 if( col_max >= (
m_matrix.m_Ncols - 1 ) )
483 unsigned int keepOutCost = 0;
485 for(
int row = row_min; row <= row_max; row++ )
487 for(
int col = col_min; col <= col_max; col++ )
493 keepOutCost +=
m_matrix.GetDist( row, col, side );
513 fpBBox.
Move( -1*aOffset );
539 double min_cost, curr_cost, Score;
542 lastPosOK =
m_matrix.m_BrdBox.GetOrigin();
548 fpBBox.
Move( -fpPos );
557 initialPos.
x -= initialPos.
x %
m_matrix.m_GridRouting;
558 initialPos.
y -= initialPos.
y %
m_matrix.m_GridRouting;
564 testOtherSide =
false;
566 if(
m_matrix.m_RoutingLayersCount > 1 )
572 if( !(
pad->GetLayerSet() & other ).any() )
575 testOtherSide =
true;
597 if( keepOutCost >= 0 )
602 Score = curr_cost + keepOutCost;
604 if( (min_cost >= Score ) || (min_cost < 0 ) )
630 const PAD* nearest =
nullptr;
631 int64_t nearestDist = INT64_MAX;
635 if ( footprint == aRefFP )
638 if( !
m_matrix.m_BrdBox.Contains( footprint->GetPosition() ) )
641 for(
PAD*
pad: footprint->Pads() )
649 if ( dist < nearestDist )
685 dx =
end.x - start.
x;
686 dy =
end.y - start.
y;
700 double conn_cost = hypot( dx, dy * 2.0 );
701 curr_cost += conn_cost;
732 std::vector<FOOTPRINT*> fpList;
736 fpList.push_back( footprint );
740 for(
unsigned kk = 0; kk < fpList.size(); kk++ )
753 for(
unsigned kk = 0; kk < fpList.size(); kk++ )
757 auto edges =
m_connectivity->GetRatsnestForComponent( footprint,
true );
759 footprint->
SetFlag( edges.size() ) ;
768 for(
unsigned ii = 0; ii < fpList.size(); ii++ )
775 altFootprint = footprint;
777 if( footprint->
GetFlag() == 0 )
780 bestFootprint = footprint;
785 return bestFootprint;
824 bool aPlaceOffboardModules )
828 bool cancelled =
false;
845 footprint->SetNeedsPlaced(
false );
847 std::vector<FOOTPRINT*> offboardMods;
849 if( aPlaceOffboardModules )
853 if( !
m_matrix.m_BrdBox.Contains( footprint->GetPosition() ) )
854 offboardMods.push_back( footprint );
858 for(
FOOTPRINT* footprint : aFootprints )
860 footprint->SetNeedsPlaced(
true );
861 aCommit->
Modify( footprint );
864 for(
FOOTPRINT* footprint : offboardMods )
866 footprint->SetNeedsPlaced(
true );
867 aCommit->
Modify( footprint );
872 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
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