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() )
142 std::vector <int> x_coordinates;
155 for(
int refy = rect.
GetY(), endy = rect.
GetBottom(); refy < endy; refy += step )
158 int idy = (refy - coord_orgin.
y) / step;
169 x_coordinates.clear();
171 for(
int v = 0; v < outline.
PointCount(); v++ )
173 int seg_startX = outline.
CPoint( v ).
x;
174 int seg_startY = outline.
CPoint( v ).
y;
175 int seg_endX = outline.
CPoint( v + 1 ).
x;
176 int seg_endY = outline.
CPoint( v + 1 ).
y;
179 if( ( seg_startY > refy ) && ( seg_endY > refy ) )
183 if( ( seg_startY <= refy ) && (seg_endY <= refy ) )
193 seg_endX -= seg_startX;
194 seg_endY -= seg_startY;
195 double newrefy = (double) ( refy - seg_startY );
209 double inv_slope = (double) seg_endX / seg_endY;
210 intersec_x = newrefy * inv_slope;
211 x_coordinates.push_back( (
int) intersec_x + seg_startX );
218 std::sort( x_coordinates.begin(), x_coordinates.end() );
222 if( ( x_coordinates.size() & 1 ) != 0 )
229 int iimax = x_coordinates.size() - 1;
231 for(
int ii = 0; ii < iimax; ii += 2 )
233 int seg_start_x = x_coordinates[ii] - coord_orgin.
x;
234 int seg_end_x = x_coordinates[ii + 1] - coord_orgin.
x;
239 for(
int idx = seg_start_x / step; idx <
m_matrix.m_Ncols; idx++ )
241 if( idx * step > seg_end_x )
244 if( idx * step >= seg_start_x )
257 if( aLayerMask[
F_Cu ] )
266 if( aLayerMask[
B_Cu ] )
330 int margin = (
m_matrix.m_GridRouting / 2) +
pad->GetOwnClearance(
pad->GetLayer() );
351 if( ox >
m_matrix.m_BrdBox.GetRight() )
357 if( fx >
m_matrix.m_BrdBox.GetRight() )
363 if( oy >
m_matrix.m_BrdBox.GetBottom() )
369 if( fy >
m_matrix.m_BrdBox.GetBottom() )
378 m_matrix.TraceFilledRectangle( ox, oy, fx, fy, layerMask,
384 int margin = (
m_matrix.m_GridRouting / 2) +
pad->GetOwnClearance(
pad->GetLayer() );
410 start -=
m_matrix.m_BrdBox.GetOrigin();
413 int row_min = start.
y /
m_matrix.m_GridRouting;
415 int col_min = start.
x /
m_matrix.m_GridRouting;
418 if( start.
y > row_min *
m_matrix.m_GridRouting )
421 if( start.
x > col_min *
m_matrix.m_GridRouting )
427 if( row_max >= (
m_matrix.m_Nrows - 1 ) )
433 if( col_max >= (
m_matrix.m_Ncols - 1 ) )
436 for(
int row = row_min; row <= row_max; row++ )
438 for(
int col = col_min; col <= col_max; col++ )
440 unsigned int data =
m_matrix.GetCell( row, col, side );
459 start -=
m_matrix.m_BrdBox.GetOrigin();
462 int row_min = start.
y /
m_matrix.m_GridRouting;
464 int col_min = start.
x /
m_matrix.m_GridRouting;
467 if( start.
y > row_min *
m_matrix.m_GridRouting )
470 if( start.
x > col_min *
m_matrix.m_GridRouting )
476 if( row_max >= (
m_matrix.m_Nrows - 1 ) )
482 if( col_max >= (
m_matrix.m_Ncols - 1 ) )
485 unsigned int keepOutCost = 0;
487 for(
int row = row_min; row <= row_max; row++ )
489 for(
int col = col_min; col <= col_max; col++ )
495 keepOutCost +=
m_matrix.GetDist( row, col, side );
515 fpBBox.
Move( -1*aOffset );
541 double min_cost, curr_cost, Score;
544 lastPosOK =
m_matrix.m_BrdBox.GetOrigin();
550 fpBBox.
Move( -fpPos );
559 initialPos.
x -= initialPos.
x %
m_matrix.m_GridRouting;
560 initialPos.
y -= initialPos.
y %
m_matrix.m_GridRouting;
566 testOtherSide =
false;
568 if(
m_matrix.m_RoutingLayersCount > 1 )
574 if( !(
pad->GetLayerSet() & other ).any() )
577 testOtherSide =
true;
599 if( keepOutCost >= 0 )
604 Score = curr_cost + keepOutCost;
606 if( (min_cost >= Score ) || (min_cost < 0 ) )
632 const PAD* nearest =
nullptr;
633 int64_t nearestDist = INT64_MAX;
637 if ( footprint == aRefFP )
640 if( !
m_matrix.m_BrdBox.Contains( footprint->GetPosition() ) )
643 for(
PAD*
pad: footprint->Pads() )
651 if ( dist < nearestDist )
687 dx =
end.x - start.
x;
688 dy =
end.y - start.
y;
702 double conn_cost = hypot( dx, dy * 2.0 );
703 curr_cost += conn_cost;
734 std::vector<FOOTPRINT*> fpList;
738 fpList.push_back( footprint );
742 for(
unsigned kk = 0; kk < fpList.size(); kk++ )
755 for(
unsigned kk = 0; kk < fpList.size(); kk++ )
759 auto edges =
m_connectivity->GetRatsnestForComponent( footprint,
true );
761 footprint->
SetFlag( edges.size() ) ;
770 for(
unsigned ii = 0; ii < fpList.size(); ii++ )
777 altFootprint = footprint;
779 if( footprint->
GetFlag() == 0 )
782 bestFootprint = footprint;
787 return bestFootprint;
826 bool aPlaceOffboardModules )
830 bool cancelled =
false;
847 footprint->SetNeedsPlaced(
false );
849 std::vector<FOOTPRINT*> offboardMods;
851 if( aPlaceOffboardModules )
855 if( !
m_matrix.m_BrdBox.Contains( footprint->GetPosition() ) )
856 offboardMods.push_back( footprint );
860 for(
FOOTPRINT* footprint : aFootprints )
862 footprint->SetNeedsPlaced(
true );
863 aCommit->
Modify( footprint );
866 for(
FOOTPRINT* footprint : offboardMods )
868 footprint->SetNeedsPlaced(
true );
869 aCommit->
Modify( footprint );
874 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.
void Fracture()
Convert a set of polygons with holes to a single outline with "slits"/"fractures" connecting the oute...
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.
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