46#define AR_KEEPOUT_MARGIN 500
47#define AR_ABORT_PLACEMENT -1
52#define CELL_IS_EMPTY 0x00
53#define CELL_IS_HOLE 0x01
54#define CELL_IS_MODULE 0x02
55#define CELL_IS_EDGE 0x20
56#define CELL_IS_FRIEND 0x40
57#define CELL_IS_ZONE 0x80
113 for(
auto drawing :
m_board->Drawings() )
115 switch( drawing->Type() )
144 std::vector <int> x_coordinates;
157 for(
int refy = rect.
GetY(), endy = rect.
GetBottom(); refy < endy; refy += step )
160 int idy = (refy - coord_orgin.
y) / step;
171 x_coordinates.clear();
173 for(
int v = 0; v < outline.
PointCount(); v++ )
175 int seg_startX = outline.
CPoint( v ).
x;
176 int seg_startY = outline.
CPoint( v ).
y;
177 int seg_endX = outline.
CPoint( v + 1 ).
x;
178 int seg_endY = outline.
CPoint( v + 1 ).
y;
181 if( ( seg_startY > refy ) && ( seg_endY > refy ) )
185 if( ( seg_startY <= refy ) && (seg_endY <= refy ) )
195 seg_endX -= seg_startX;
196 seg_endY -= seg_startY;
197 double newrefy = (double) ( refy - seg_startY );
211 double inv_slope = (double) seg_endX / seg_endY;
212 intersec_x = newrefy * inv_slope;
213 x_coordinates.push_back( (
int) intersec_x + seg_startX );
220 std::sort( x_coordinates.begin(), x_coordinates.end() );
224 if( ( x_coordinates.size() & 1 ) != 0 )
231 int iimax = x_coordinates.size() - 1;
233 for(
int ii = 0; ii < iimax; ii += 2 )
235 int seg_start_x = x_coordinates[ii] - coord_orgin.
x;
236 int seg_end_x = x_coordinates[ii + 1] - coord_orgin.
x;
241 for(
int idx = seg_start_x / step; idx <
m_matrix.m_Ncols; idx++ )
243 if( idx * step > seg_end_x )
246 if( idx * step >= seg_start_x )
259 if( aLayerMask[
F_Cu ] )
268 if( aLayerMask[
B_Cu ] )
332 int margin = (
m_matrix.m_GridRouting / 2) +
pad->GetOwnClearance(
pad->GetLayer() );
353 if( ox >
m_matrix.m_BrdBox.GetRight() )
359 if( fx >
m_matrix.m_BrdBox.GetRight() )
365 if( oy >
m_matrix.m_BrdBox.GetBottom() )
371 if( fy >
m_matrix.m_BrdBox.GetBottom() )
380 m_matrix.TraceFilledRectangle( ox, oy, fx, fy, layerMask,
386 int margin = (
m_matrix.m_GridRouting / 2) +
pad->GetOwnClearance(
pad->GetLayer() );
412 start -=
m_matrix.m_BrdBox.GetOrigin();
415 int row_min = start.
y /
m_matrix.m_GridRouting;
417 int col_min = start.
x /
m_matrix.m_GridRouting;
420 if( start.
y > row_min *
m_matrix.m_GridRouting )
423 if( start.
x > col_min *
m_matrix.m_GridRouting )
429 if( row_max >= (
m_matrix.m_Nrows - 1 ) )
435 if( col_max >= (
m_matrix.m_Ncols - 1 ) )
438 for(
int row = row_min; row <= row_max; row++ )
440 for(
int col = col_min; col <= col_max; col++ )
442 unsigned int data =
m_matrix.GetCell( row, col, side );
461 start -=
m_matrix.m_BrdBox.GetOrigin();
464 int row_min = start.
y /
m_matrix.m_GridRouting;
466 int col_min = start.
x /
m_matrix.m_GridRouting;
469 if( start.
y > row_min *
m_matrix.m_GridRouting )
472 if( start.
x > col_min *
m_matrix.m_GridRouting )
478 if( row_max >= (
m_matrix.m_Nrows - 1 ) )
484 if( col_max >= (
m_matrix.m_Ncols - 1 ) )
487 unsigned int keepOutCost = 0;
489 for(
int row = row_min; row <= row_max; row++ )
491 for(
int col = col_min; col <= col_max; col++ )
497 keepOutCost +=
m_matrix.GetDist( row, col, side );
517 fpBBox.
Move( -1*aOffset );
543 double min_cost, curr_cost, Score;
546 lastPosOK =
m_matrix.m_BrdBox.GetOrigin();
552 fpBBox.
Move( -fpPos );
561 initialPos.
x -= initialPos.
x %
m_matrix.m_GridRouting;
562 initialPos.
y -= initialPos.
y %
m_matrix.m_GridRouting;
568 testOtherSide =
false;
570 if(
m_matrix.m_RoutingLayersCount > 1 )
576 if( !(
pad->GetLayerSet() & other ).any() )
579 testOtherSide =
true;
601 if( keepOutCost >= 0 )
606 Score = curr_cost + keepOutCost;
608 if( (min_cost >= Score ) || (min_cost < 0 ) )
634 const PAD* nearest =
nullptr;
635 int64_t nearestDist = INT64_MAX;
639 if ( footprint == aRefFP )
642 if( !
m_matrix.m_BrdBox.Contains( footprint->GetPosition() ) )
645 for(
PAD*
pad: footprint->Pads() )
653 if ( dist < nearestDist )
689 dx =
end.x - start.
x;
690 dy =
end.y - start.
y;
704 double conn_cost = hypot( dx, dy * 2.0 );
705 curr_cost += conn_cost;
736 std::vector<FOOTPRINT*> fpList;
740 fpList.push_back( footprint );
744 for(
unsigned kk = 0; kk < fpList.size(); kk++ )
757 for(
unsigned kk = 0; kk < fpList.size(); kk++ )
761 auto edges =
m_connectivity->GetRatsnestForComponent( footprint,
true );
763 footprint->
SetFlag( edges.size() ) ;
772 for(
unsigned ii = 0; ii < fpList.size(); ii++ )
779 altFootprint = footprint;
781 if( footprint->
GetFlag() == 0 )
784 bestFootprint = footprint;
789 return bestFootprint;
828 bool aPlaceOffboardModules )
832 bool cancelled =
false;
849 footprint->SetNeedsPlaced(
false );
851 std::vector<FOOTPRINT*> offboardMods;
853 if( aPlaceOffboardModules )
857 if( !
m_matrix.m_BrdBox.Contains( footprint->GetPosition() ) )
858 offboardMods.push_back( footprint );
862 for(
FOOTPRINT* footprint : aFootprints )
864 footprint->SetNeedsPlaced(
true );
865 aCommit->
Modify( footprint );
868 for(
FOOTPRINT* footprint : offboardMods )
870 footprint->SetNeedsPlaced(
true );
871 aCommit->
Modify( footprint );
876 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