207 int originalLayer = aLayer;
228 const PAD*
pad =
dynamic_cast<const PAD*
>( aItem );
230 int holeLayer = aLayer;
237 if( !copperLayers.empty() )
238 annularRingLayer = copperLayers.
Seq().front();
242 annularRingLayer =
F_Cu;
271 const PAD*
pad =
static_cast<const PAD*
>( aItem );
274 if(
pcbconfig()->m_Display.m_UseViaColorForNormalTHPadstacks
318 if( visibleLayers.any() )
319 aLayer = visibleLayers.
Seq().back();
339 return itemLayerIter->second;
359 const BOARD_CONNECTED_ITEM* conItem =
nullptr;
362 conItem =
static_cast<const BOARD_CONNECTED_ITEM*
>( aItem );
379 netColor = ii->second;
430 switch( originalLayer )
434 const PAD*
pad =
static_cast<const PAD*
>( aItem );
436 if(
pad->IsOnLayer( primary ) && !
pad->FlashLayer( primary ) )
454 const PCB_VIA*
via =
static_cast<const PCB_VIA*
>( aItem );
457 if(
via->GetLayerSet().test( primary ) == 0 )
468 const PCB_VIA*
via =
static_cast<const PCB_VIA*
>( aItem );
470 if( !
via->FlashLayer( primary ) )
493 const PCB_VIA*
via =
static_cast<const PCB_VIA*
>( aItem );
504 if(
via->GetLayerSet().test( primary ) == 0 )
540 color = color.
Mix( it->second, dim_factor_Edge_Cuts );
553 color = color.
Mix( backgroundColor, dim_factor_Edge_Cuts );
568 const PCB_VIA*
via =
static_cast<const PCB_VIA*
>( aItem );
569 const BOARD* board =
via->GetBoard();
573 if( (
via->GetLayerSet() & visibleLayers ).none() )
584 else if( aItem->
Type() ==
PCB_ZONE_T &&
static_cast<const ZONE*
>( aItem )->IsTeardropArea() )
590 else if( aItem->
Type() ==
PCB_SHAPE_T &&
static_cast<const PCB_SHAPE*
>( aItem )->IsAnyFill() )
624 if( aActualThickness == 0 )
627 return aActualThickness;
697 switch( item->
Type() )
704 draw(
static_cast<const PCB_ARC*
>( item ), aLayer );
708 draw(
static_cast<const PCB_VIA*
>( item ), aLayer );
712 draw(
static_cast<const PAD*
>( item ), aLayer );
748 draw(
static_cast<const ZONE*
>( item ), aLayer );
790 m_gal->SetIsFill(
false );
791 m_gal->SetIsStroke(
true );
804 m_gal->SetLineWidth( 1 );
831 int track_width = aTrack->
GetWidth();
842 if( netinfo->GetNetChain() ==
m_pcbSettings.m_highlightedNetChain )
875 m_gal->SetStrokeColor( color );
876 m_gal->SetFillColor( color );
877 m_gal->SetIsStroke( outline_mode );
878 m_gal->SetIsFill( not outline_mode );
887 m_gal->DrawSegment( start,
end, track_width );
900 m_gal->SetIsFill(
false );
901 m_gal->SetIsStroke(
true );
902 m_gal->SetStrokeColor( color );
909 const wxString& aNetName )
const
920 int num_char = aNetName.size();
923 int seg_minlength = aSeg.
GetWidth() * num_char;
930 double penWidth = textSize / 12.0;
938 if(
end.y == start.
y )
943 else if(
end.x == start.
x )
954 num_names = std::max( num_names,
KiROUND( aSeg.
GetSeg().
Length() / ( M_SQRT2 * min_size ) ) );
957 m_gal->SetIsStroke(
true );
958 m_gal->SetIsFill(
false );
959 m_gal->SetStrokeColor( aColor );
960 m_gal->SetLineWidth( penWidth );
961 m_gal->SetFontBold(
false );
962 m_gal->SetFontItalic(
false );
963 m_gal->SetFontUnderlined(
false );
964 m_gal->SetTextMirrored(
false );
965 m_gal->SetGlyphSize(
VECTOR2D( textSize * 0.55, textSize * 0.55 ) );
969 int divisions = num_names + 1;
971 for(
int ii = 1; ii < divisions; ++ii )
973 VECTOR2I textPosition = start + segV * ( (double) ii / divisions );
975 if( viewport.
Contains( textPosition ) )
976 m_gal->BitmapText( aNetName, textPosition, textOrientation );
1000 if( netname.IsEmpty() )
1006 if( arcLen < (
double) width * (
double) netname.size() )
1013 textOrientation = -textOrientation;
1016 double textSize = width;
1017 double penWidth = textSize / 12.0;
1019 m_gal->SetIsStroke(
true );
1020 m_gal->SetIsFill(
false );
1021 m_gal->SetStrokeColor( color );
1022 m_gal->SetLineWidth( penWidth );
1023 m_gal->SetFontBold(
false );
1024 m_gal->SetFontItalic(
false );
1025 m_gal->SetFontUnderlined(
false );
1026 m_gal->SetTextMirrored(
false );
1027 m_gal->SetGlyphSize(
VECTOR2D( textSize * 0.55, textSize * 0.55 ) );
1031 m_gal->BitmapText( netname, midPt, textOrientation );
1040 m_gal->SetStrokeColor( color );
1041 m_gal->SetFillColor( color );
1042 m_gal->SetIsStroke( outline_mode );
1043 m_gal->SetIsFill( not outline_mode );
1073 m_gal->SetIsFill(
false );
1074 m_gal->SetIsStroke(
true );
1075 m_gal->SetStrokeColor( color );
1090 m_gal->SetIsFill(
false );
1091 m_gal->SetIsStroke(
true );
1093 m_gal->DrawPolygon( cornerBuffer );
1100 m_gal->SetIsFill(
false );
1101 m_gal->SetIsStroke(
true );
1114 m_gal->SetIsFill(
false );
1115 m_gal->SetIsStroke(
true );
1116 m_gal->SetStrokeColor(
COLOR4D( 0.3, 0.2, 0.5, 1.0 ) );
1118 for(
int idx = 1; idx < arcSpine.
PointCount(); idx++ )
1139 if( netinfo->GetNetChain() ==
m_pcbSettings.m_highlightedNetChain )
1154 aVia->
LayerPair( &layerTop, &layerBottom );
1160 && ( layerTop !=
F_Cu || layerBottom !=
B_Cu ) );
1172 if( !showNets && !showLayers )
1176 double size = aVia->
GetWidth( currentLayer );
1179 if( size > maxSize )
1183 m_gal->Translate( position );
1186 m_gal->ResetTextAttributes();
1189 m_gal->SetFontBold(
false );
1190 m_gal->SetFontItalic(
false );
1191 m_gal->SetFontUnderlined(
false );
1192 m_gal->SetTextMirrored(
false );
1194 m_gal->SetIsStroke(
true );
1195 m_gal->SetIsFill(
false );
1209 switch( topLayerId )
1211 case F_Cu: topLayer = 1;
break;
1213 default: topLayer = (topLayerId -
B_Cu)/2 + 1;
break;
1216 switch( bottomLayerId )
1218 case F_Cu: bottomLayer = 1;
break;
1220 default: bottomLayer = (bottomLayerId -
B_Cu)/2 + 1;
break;
1224#if wxUSE_UNICODE_WCHAR
1225 layerIds << std::to_wstring( topLayer ) <<
L'-' << std::to_wstring( bottomLayer );
1227 layerIds << std::to_string( topLayer ) <<
'-' << std::to_string( bottomLayer );
1233 int minCharCnt = showLayers ? 6 : 3;
1237 tsize = std::min( tsize, size );
1244 if( showLayers && showNets )
1245 textpos.
y += ( tsize * 1.3 )/ 2;
1247 m_gal->SetGlyphSize( namesize );
1248 m_gal->SetLineWidth( namesize.
x / 10.0 );
1256 textpos.
y -= tsize * 1.3;
1268 m_gal->SetStrokeColor( color );
1269 m_gal->SetFillColor( color );
1270 m_gal->SetIsStroke(
true );
1271 m_gal->SetIsFill(
false );
1281 double maxRadius = aVia->
GetWidth( layerTop ) / 2.0;
1282 double radius = drillRadius + thickness;
1288 thickness =
radius - drillRadius;
1291 if( thickness <= 0 )
1296 m_gal->SetLineWidth( thickness );
1297 radius -= thickness / 2.0;
1301 m_gal->SetIsFill(
true );
1312 if( secDrill.value_or( 0 ) > 0 )
1319 if( terDrill.value_or( 0 ) > 0 )
1331 m_gal->SetIsStroke(
false );
1332 m_gal->SetIsFill(
true );
1336 m_gal->SetIsStroke(
false );
1337 m_gal->SetIsFill(
true );
1358 m_gal->SetIsFill(
true );
1359 m_gal->SetIsStroke(
false );
1361 m_gal->SetLineWidth( margin );
1388 m_gal->SetLineWidth( annular_width );
1389 radius -= annular_width / 2.0;
1417 if( aVia->
FlashLayer( copperLayerForClearance ) )
1423 m_gal->SetIsFill(
false );
1424 m_gal->SetIsStroke(
true );
1425 m_gal->SetStrokeColor( color );
1457 netname = wxT(
"x" );
1459 netname = wxT(
"*" );
1462 if( netname.IsEmpty() && padNumber.IsEmpty() )
1497 for(
const std::shared_ptr<PCB_SHAPE>& primitive : aPad->
GetPrimitives( pcbLayer ) )
1501 position = primitive->GetCenter();
1503 position += aPad->
ShapePos( pcbLayer );
1505 padsize.
x = abs( primitive->GetBotRight().x - primitive->GetTopLeft().x );
1506 padsize.
y = abs( primitive->GetBotRight().y - primitive->GetTopLeft().y );
1520 double limit = std::min( aPad->
GetSize( pcbLayer ).
x,
1521 aPad->
GetSize( pcbLayer ).
y ) * 1.1;
1523 if( padsize.
x > limit && padsize.
y > limit )
1531 double size = padsize.
y;
1534 m_gal->Translate( position );
1537 if( padsize.
x < ( padsize.
y * 0.95 ) )
1541 std::swap( padsize.
x, padsize.
y );
1545 if( size > maxSize )
1549 m_gal->ResetTextAttributes();
1552 m_gal->SetFontBold(
false );
1553 m_gal->SetFontItalic(
false );
1554 m_gal->SetFontUnderlined(
false );
1555 m_gal->SetTextMirrored(
false );
1557 m_gal->SetIsStroke(
true );
1558 m_gal->SetIsFill(
false );
1566 int Y_offset_numpad = 0;
1567 int Y_offset_netname = 0;
1569 if( !netname.IsEmpty() && !padNumber.IsEmpty() )
1573 Y_offset_netname = size / 1.4;
1575 Y_offset_numpad = size / 1.7;
1581 const double Xscale_for_stroked_font = 0.9;
1583 if( !netname.IsEmpty() )
1589 tsize = std::min( tsize, size );
1602 VECTOR2D namesize( tsize*Xscale_for_stroked_font, tsize );
1603 textpos.
y = std::min( tsize * 1.4,
double( Y_offset_netname ) );
1605 m_gal->SetGlyphSize( namesize );
1606 m_gal->SetLineWidth( namesize.
x / 6.0 );
1607 m_gal->SetFontBold(
true );
1611 if( !padNumber.IsEmpty() )
1616 tsize = std::min( tsize, size );
1620 tsize = std::min( tsize, size );
1621 VECTOR2D numsize( tsize*Xscale_for_stroked_font, tsize );
1622 textpos.
y = -Y_offset_numpad;
1624 m_gal->SetGlyphSize( numsize );
1625 m_gal->SetLineWidth( numsize.
x / 6.0 );
1626 m_gal->SetFontBold(
true );
1636 m_gal->SetIsFill(
true );
1637 m_gal->SetIsStroke(
false );
1640 lineWidth = std::min( lineWidth, aPad->
GetSizeX() / 2.0 );
1641 lineWidth = std::min( lineWidth, aPad->
GetSizeY() / 2.0 );
1643 m_gal->SetFillColor( color );
1644 m_gal->SetMinLineWidth( lineWidth );
1648 if( slot->GetSeg().A == slot->GetSeg().B )
1650 double holeRadius = slot->GetWidth() / 2.0;
1651 m_gal->DrawHoleWall( slot->GetSeg().A, holeRadius, lineWidth );
1655 int holeSize = slot->GetWidth() + ( 2 * lineWidth );
1656 m_gal->DrawSegment( slot->GetSeg().A, slot->GetSeg().B, holeSize );
1659 m_gal->SetMinLineWidth( 1.0 );
1665 VECTOR2I holePos = slot->GetSeg().A;
1669 if( secDrill.
x > 0 )
1676 if( terDrill.
x > 0 )
1690 outline_mode =
true;
1692 bool drawShape =
false;
1706 outline_mode =
true;
1711 outline_mode =
false;
1719 m_gal->SetIsFill(
false );
1720 m_gal->SetIsStroke(
true );
1722 m_gal->SetStrokeColor( color );
1727 m_gal->SetIsFill(
true );
1728 m_gal->SetIsStroke(
false );
1729 m_gal->SetFillColor( color );
1742 else if( drawShape )
1765 expansion.
x = expansion.
y = 0;
1779 margin = std::max( margin, getExpansion( layer ) );
1786 margin = getExpansion( pcbLayer );
1789 std::unique_ptr<PAD> dummyPad;
1790 std::shared_ptr<SHAPE_COMPOUND> shapes;
1793 bool simpleShapes = !outline_mode;
1799 simpleShapes =
false;
1805 && ( margin.
x < 0 || margin.
y < 0 ) ) )
1813 if( pad_size.
x + 2 * margin.
x <= 0 || pad_size.
y + 2 * margin.
y <= 0 )
1818 int initial_radius = dummyPad->GetRoundRectCornerRadius( pcbLayer );
1820 dummyPad->SetSize( pcbLayer, pad_size + margin + margin );
1826 int radius_margin = std::max( margin.
x, margin.
y );
1827 dummyPad->SetRoundRectCornerRadius(
1828 pcbLayer, std::max( initial_radius + radius_margin, 0 ) );
1831 shapes = std::dynamic_pointer_cast<SHAPE_COMPOUND>(
1832 dummyPad->GetEffectiveShape( pcbLayer ) );
1833 margin.
x = margin.
y = 0;
1837 shapes = std::dynamic_pointer_cast<SHAPE_COMPOUND>(
1851 simpleShapes =
false;
1854 for(
const SHAPE* shape : shapes->Shapes() )
1859 switch( shape->Type() )
1870 simpleShapes =
false;
1876 const auto drawOneSimpleShape =
1877 [&](
const SHAPE& aShape )
1879 switch( aShape.Type() )
1884 int effectiveWidth = seg.
GetWidth() + 2 * margin.
x;
1886 if( effectiveWidth > 0 )
1895 int effectiveRadius =
circle.GetRadius() + margin.
x;
1897 if( effectiveRadius > 0 )
1898 m_gal->DrawCircle(
circle.GetCenter(), effectiveRadius );
1909 if( effectiveMargin.
x < 0 )
1914 if( effectiveSize.
x > 0 && effectiveSize.
y > 0 )
1915 m_gal->DrawRectangle( pos - effectiveMargin, pos + effectiveSize );
1917 else if( effectiveMargin.
x > 0 )
1923 m_gal->DrawSegment( pos,
1925 effectiveMargin.
x * 2 );
1928 effectiveMargin.
x * 2 );
1931 effectiveMargin.
x * 2 );
1934 effectiveMargin.
x * 2 );
1956 for(
int ii = 0; ii < poly.
PointCount(); ++ii )
1961 m_gal->DrawPolygon( outline );
1974 m_gal->DrawSegment( seg.
A, seg.
B, margin.
x * 2 );
1989 for(
const SHAPE* shape : shapes->Shapes() )
1990 drawOneSimpleShape( *shape );
1997 m_gal->DrawPolygon( polySet );
2018 m_gal->SetIsStroke(
true );
2019 m_gal->SetIsFill(
false );
2020 m_gal->SetStrokeColor( color );
2026 auto shape = std::dynamic_pointer_cast<SHAPE_COMPOUND>( aPad->
GetEffectiveShape( pcbLayer ) );
2028 if( shape && shape->Size() == 1 && shape->Shapes()[0]->Type() ==
SH_SEGMENT )
2034 else if( shape && shape->Size() == 1 && shape->Shapes()[0]->Type() ==
SH_CIRCLE )
2048 m_gal->DrawPolygon( polySet );
2054 m_gal->DrawSegment( slot->GetSeg().A, slot->GetSeg().B,
2066 m_gal->SetIsFill(
false );
2067 m_gal->SetIsStroke(
true );
2085 termColor = chainColor;
2097 m_gal->SetStrokeColor( termColor );
2098 m_gal->SetLineWidth( baseWidth );
2106 int inset = baseWidth * 2;
2108 inner.
Inflate( -inset, -inset );
2142 isHatchedFill =
false;
2160 if( netname.IsEmpty() )
2197 thickness = thickness + margin;
2203 m_gal->SetIsFill(
false );
2204 m_gal->SetIsStroke(
true );
2208 m_gal->SetFillColor( color );
2209 m_gal->SetStrokeColor( color );
2218 std::vector<VECTOR2I> pts;
2220 offset = offset.
Resize( thickness / 2 );
2222 pts.push_back( aShape->
GetStart() + offset );
2223 pts.push_back( aShape->
GetStart() - offset );
2224 pts.push_back( aShape->
GetEnd() - offset );
2225 pts.push_back( aShape->
GetEnd() + offset );
2228 m_gal->DrawLine( pts[0], pts[1] );
2229 m_gal->DrawLine( pts[1], pts[2] );
2230 m_gal->DrawLine( pts[2], pts[3] );
2231 m_gal->DrawLine( pts[3], pts[0] );
2232 m_gal->DrawLine( ( pts[0] + pts[1] ) / 2, ( pts[1] + pts[2] ) / 2 );
2233 m_gal->DrawLine( ( pts[1] + pts[2] ) / 2, ( pts[2] + pts[3] ) / 2 );
2234 m_gal->DrawLine( ( pts[2] + pts[3] ) / 2, ( pts[3] + pts[0] ) / 2 );
2235 m_gal->DrawLine( ( pts[3] + pts[0] ) / 2, ( pts[0] + pts[1] ) / 2 );
2237 else if( outline_mode )
2243 m_gal->SetIsFill(
true );
2244 m_gal->SetIsStroke(
false );
2267 m_gal->DrawPolygon( outline );
2269 else if( outline_mode )
2271 m_gal->DrawSegmentChain( outline, thickness );
2275 m_gal->SetIsFill(
true );
2276 m_gal->SetIsStroke(
false );
2280 m_gal->DrawSegmentChain( outline, thickness );
2289 m_gal->DrawPolygon( deflated_shape );
2293 m_gal->DrawPolygon( outline );
2305 m_gal->DrawLine( pts[0], pts[1] );
2306 m_gal->DrawLine( pts[1], pts[2] );
2307 m_gal->DrawLine( pts[2], pts[3] );
2308 m_gal->DrawLine( pts[3], pts[0] );
2309 m_gal->DrawLine( pts[0], pts[2] );
2310 m_gal->DrawLine( pts[1], pts[3] );
2312 else if( outline_mode )
2314 m_gal->DrawSegment( pts[0], pts[1], thickness );
2315 m_gal->DrawSegment( pts[1], pts[2], thickness );
2316 m_gal->DrawSegment( pts[2], pts[3], thickness );
2317 m_gal->DrawSegment( pts[3], pts[0], thickness );
2321 m_gal->SetIsFill(
true );
2322 m_gal->SetIsStroke(
false );
2326 m_gal->DrawSegment( pts[0], pts[1], thickness );
2327 m_gal->DrawSegment( pts[1], pts[2], thickness );
2328 m_gal->DrawSegment( pts[2], pts[3], thickness );
2329 m_gal->DrawSegment( pts[3], pts[0], thickness );
2344 m_gal->DrawPolygon( poly );
2361 endAngle - startAngle, thickness,
m_maxError );
2365 m_gal->SetIsFill(
true );
2366 m_gal->SetIsStroke(
false );
2369 endAngle - startAngle, thickness,
m_maxError );
2384 m_gal->SetLineWidth( thickness );
2392 else if( isSolidFill )
2415 m_gal->DrawSegmentChain( shape.
Outline( ii ), thickness );
2419 m_gal->SetIsFill(
true );
2420 m_gal->SetIsStroke(
false );
2425 m_gal->DrawSegmentChain( shape.
Outline( ii ), thickness );
2435 m_gal->DrawPolygon( deflated_shape );
2446 m_gal->DrawPolygon( shape );
2457 std::vector<VECTOR2D> output;
2458 std::vector<VECTOR2D> pointCtrl;
2460 pointCtrl.push_back( aShape->
GetStart() );
2463 pointCtrl.push_back( aShape->
GetEnd() );
2474 m_gal->SetLineWidth( thickness );
2500 m_gal->DrawEllipse(
center, majorR - thickness / 2, minorR - thickness / 2, rot );
2501 m_gal->DrawEllipse(
center, majorR + thickness / 2, minorR + thickness / 2, rot );
2507 m_gal->SetLineWidth( thickness );
2510 m_gal->DrawEllipse(
center, majorR, minorR, rot );
2511 else if( isSolidFill )
2512 m_gal->DrawEllipse(
center, majorR, minorR, rot );
2529 m_gal->DrawEllipseArc(
center, majorR - thickness / 2, minorR - thickness / 2, rot, start,
end );
2530 m_gal->DrawEllipseArc(
center, majorR + thickness / 2, minorR + thickness / 2, rot, start,
end );
2535 m_gal->SetIsFill(
false );
2536 m_gal->SetIsStroke( thickness > 0 );
2537 m_gal->SetLineWidth( thickness );
2538 m_gal->DrawEllipseArc(
center, majorR, minorR, rot, start,
end );
2553 m_gal->SetIsFill(
true );
2554 m_gal->SetIsStroke(
false );
2557 std::vector<SHAPE*> shapes;
2577 for(
SHAPE* shape : shapes )
2583 m_gal->DrawSegment( a, b, thickness );
2587 for(
SHAPE* shape : shapes )
2594 m_gal->SetIsFill(
false );
2595 m_gal->SetIsStroke(
true );
2599 m_gal->DrawLine( seg.A, seg.B );
2631 font->
Draw(
m_gal, aText, pos, aAttrs, aFontMetrics );
2646 if( img_scale != 1.0 )
2654 m_gal->SetIsStroke(
true );
2655 m_gal->SetStrokeColor( color );
2657 m_gal->SetIsFill(
false );
2664 bm_size.
x /= img_scale;
2665 bm_size.
y /= img_scale;
2666 VECTOR2D origin( -bm_size.
x / 2.0, -bm_size.
y / 2.0 );
2669 m_gal->DrawRectangle( origin,
end );
2686 draw(
static_cast<const PCB_TEXT*
>( aField ), aLayer );
2694 if( resolvedText.Length() == 0 )
2701 m_gal->SetIsFill(
true );
2702 m_gal->SetIsStroke(
true );
2703 m_gal->SetFillColor( color );
2704 m_gal->SetStrokeColor( color );
2709 m_gal->DrawPolygon( poly );
2724 m_gal->SetStrokeColor( color );
2725 m_gal->SetFillColor( color );
2732 m_gal->SetIsStroke(
false );
2733 m_gal->SetIsFill(
true );
2734 m_gal->DrawPolygon( finalPoly );
2754 textWidth.
x = -textWidth.
x;
2761 textPos -= textWidth;
2763 textPos += textWidth;
2766 strokeText( resolvedText, textPos, attrs, metrics );
2770 std::vector<std::unique_ptr<KIFONT::GLYPH>>* cache =
nullptr;
2778 m_gal->DrawGlyphs( *cache );
2811 wxString resolvedText( aTextBox->
GetShownText(
true ) );
2818 m_gal->SetIsFill(
true );
2819 m_gal->SetIsStroke(
false );
2820 m_gal->SetFillColor( sh_color );
2821 m_gal->SetStrokeColor( sh_color );
2825 std::vector<VECTOR2I> pts = aTextBox->
GetCorners();
2826 int line_thickness = std::max( thickness*3,
pcbIUScale.mmToIU( 0.2 ) );
2828 std::deque<VECTOR2D> dpts;
2833 dpts.push_back(
VECTOR2D( pts[0] ) );
2835 m_gal->SetIsStroke(
true );
2836 m_gal->SetLineWidth( line_thickness );
2837 m_gal->DrawPolygon( dpts );
2840 m_gal->SetFillColor( color );
2841 m_gal->SetStrokeColor( color );
2842 m_gal->SetIsFill(
true );
2843 m_gal->SetIsStroke(
false );
2851 std::vector<VECTOR2I> pts = aTextBox->
GetCorners();
2853 for(
size_t ii = 0; ii < pts.size(); ++ii )
2854 m_gal->DrawSegment( pts[ii], pts[( ii + 1 ) % pts.size()], thickness );
2861 for(
SHAPE* shape : shapes )
2866 m_gal->DrawSegment( a, b, thickness );
2870 for(
SHAPE* shape : shapes )
2883 m_canvas->SetFillColor( sh_color );
2884 m_canvas->SetStrokeColor( sh_color );
2897 m_gal->SetIsStroke(
false );
2898 m_gal->SetIsFill(
true );
2899 m_gal->DrawPolygon( finalPoly );
2903 if( resolvedText.Length() == 0 )
2919 std::vector<std::unique_ptr<KIFONT::GLYPH>>* cache =
nullptr;
2927 m_gal->DrawGlyphs( *cache );
2943 if( cell->GetColSpan() > 0 || cell->GetRowSpan() > 0 )
2955 m_gal->SetIsFill(
false );
2956 m_gal->SetIsStroke(
true );
2957 m_gal->SetStrokeColor( color );
2958 m_gal->SetLineWidth( lineWidth );
2962 m_gal->DrawLine( ptA, ptB );
2973 m_gal->DrawLine( a+1, b );
2975 m_gal->DrawLine( a, b );
2983 if( aTable->
IsSelected() || cell->IsSelected() )
2985 std::vector<VECTOR2I> corners = cell->GetCorners();
2986 std::deque<VECTOR2D> pts;
2988 pts.insert( pts.end(), corners.begin(), corners.end() );
2991 m_gal->SetIsFill(
true );
2992 m_gal->SetIsStroke(
false );
2993 m_gal->DrawPolygon( pts );
3007 double anchorSize = 5.0 /
m_gal->GetWorldScale();
3008 double anchorThickness = 1.0 /
m_gal->GetWorldScale();
3011 m_gal->SetIsFill(
false );
3012 m_gal->SetIsStroke(
true );
3013 m_gal->SetStrokeColor( color );
3014 m_gal->SetLineWidth( anchorThickness );
3025 m_gal->SetIsFill(
true );
3026 m_gal->SetIsStroke(
false );
3027 m_gal->SetFillColor( color );
3031 m_canvas->DrawPolygon( poly );
3037 m_gal->DrawRectangle( topLeft, botRight );
3054 m_gal->SetIsFill(
true );
3055 m_gal->SetIsStroke(
false );
3056 m_gal->SetFillColor( color );
3059 m_gal->DrawPolygon( frontpoly );
3062 m_gal->DrawPolygon( backpoly );
3088 m_gal->SetStrokeColor( color );
3096 m_gal->DrawLine( topLeft, topLeft + width );
3097 m_gal->DrawLine( topLeft + width, topLeft + width + height );
3098 m_gal->DrawLine( topLeft + width + height, topLeft + height );
3099 m_gal->DrawLine( topLeft + height, topLeft );
3103 if(
name.IsEmpty() )
3107 int scaledSize = abs(
KiROUND(
m_gal->GetScreenWorldMatrix().GetScale().x * ptSize ) );
3108 int unscaledSize =
pcbIUScale.MilsToIU( ptSize );
3111 int textSize = ( scaledSize + ( unscaledSize * 2 ) ) / 3;
3117 m_gal->DrawLine( topLeft, topLeft - titleHeight );
3118 m_gal->DrawLine( topLeft - titleHeight, topLeft + width - titleHeight );
3119 m_gal->DrawLine( topLeft + width - titleHeight, topLeft + width );
3152 m_gal->SetIsFill(
true );
3153 m_gal->SetIsStroke(
false );
3154 m_gal->SetFillColor( color );
3179 std::deque<VECTOR2D> corners;
3198 m_gal->SetStrokeColor( color.
a > 0.0 ? color.
WithAlpha( 1.0 ) : color );
3199 m_gal->SetIsFill(
false );
3200 m_gal->SetIsStroke(
true );
3217 int holes_count = outline->
HoleCount( ii );
3219 for(
int jj = 0; jj < holes_count; ++jj )
3220 m_gal->DrawPolyline( outline->
CHole( ii, jj ) );
3225 m_gal->DrawLine( hatchLine.A, hatchLine.B );
3237 if( polySet->OutlineCount() == 0 )
3240 m_gal->SetStrokeColor( color );
3241 m_gal->SetFillColor( color );
3242 m_gal->SetLineWidth( 0 );
3246 m_gal->SetIsFill(
true );
3247 m_gal->SetIsStroke(
false );
3251 m_gal->SetIsFill(
false );
3252 m_gal->SetIsStroke(
true );
3259 if(
m_gal->IsOpenGlEngine() && !polySet->IsTriangulationUpToDate() )
3260 polySet->CacheTriangulation(
true );
3271 m_gal->SetIsFill(
true );
3272 m_gal->SetIsStroke(
false );
3273 m_gal->SetFillColor( color );
3284 m_gal->DrawPolygon( shape );
3303 m_gal->SetIsFill(
true );
3304 m_gal->SetIsStroke(
true );
3305 m_gal->SetFillColor( color );
3306 m_gal->SetStrokeColor( color );
3307 m_gal->SetLineWidth( margin );
3309 for(
const std::shared_ptr<SHAPE>& shape : aDimension->
GetShapes() )
3311 switch( shape->Type() )
3316 m_gal->DrawSegment( seg.
A, seg.
B, margin );
3333 m_gal->DrawPolygon( poly );
3338 m_gal->SetStrokeColor( color );
3339 m_gal->SetFillColor( color );
3340 m_gal->SetIsFill(
false );
3341 m_gal->SetIsStroke(
true );
3352 for(
const std::shared_ptr<SHAPE>& shape : aDimension->
GetShapes() )
3354 switch( shape->Type() )
3359 m_gal->DrawLine( seg.
A, seg.
B );
3376 wxString resolvedText = aDimension->
GetShownText(
true );
3387 std::vector<std::unique_ptr<KIFONT::GLYPH>>* cache =
nullptr;
3394 for(
const std::unique_ptr<KIFONT::GLYPH>& glyph : *cache )
3395 m_gal->DrawGlyph( *glyph.get() );
3411 m_gal->SetStrokeColor( strokeColor );
3412 m_gal->SetIsFill(
false );
3413 m_gal->SetIsStroke(
true );
3416 m_gal->Translate( position );
3422 size = 2.0 * aTarget->
GetSize() / 3.0;
3428 size = aTarget->
GetSize() / 2.0;
3447 double size = (double)aPoint->
GetSize() / 2;
3467 m_gal->SetLineWidth( thickness );
3468 m_gal->SetStrokeColor( crossColor );
3469 m_gal->SetIsFill(
false );
3470 m_gal->SetIsStroke(
true );
3473 m_gal->Translate( position );
3480 m_gal->SetStrokeColor( ringColor );
3496 aMarker->
SetZoom( 1.0 / sqrt(
m_gal->GetZoomFactor() ) );
3522 m_gal->SetIsStroke(
true );
3527 m_gal->SetFillColor( color );
3528 m_gal->SetIsFill(
true );
3531 m_gal->DrawPolygon( polygon );
3542 if( shape.GetStroke().GetWidth() == 1.0 )
3544 m_gal->SetIsFill(
false );
3545 m_gal->SetIsStroke(
true );
3546 m_gal->SetStrokeColor( color );
3551 m_gal->DrawLine( shape.GetStart(), shape.GetEnd() );
3556 shape.CalcArcAngles( startAngle, endAngle );
3558 m_gal->DrawArc( shape.GetCenter(), shape.GetRadius(), startAngle, shape.GetArcAngle() );
3563 m_gal->SetIsFill(
true );
3564 m_gal->SetIsStroke(
false );
3569 m_gal->DrawSegment( shape.GetStart(), shape.GetEnd(), shape.GetWidth() );
3574 shape.CalcArcAngles( startAngle, endAngle );
3576 m_gal->DrawArcSegment( shape.GetCenter(), shape.GetRadius(), startAngle, shape.GetArcAngle(),
3603 m_gal->SetFillColor( outlineColor );
3604 m_gal->AdvanceDepth();
3605 m_gal->SetLineWidth( 0 );
3606 m_gal->SetIsFill(
true );
3607 m_gal->SetIsStroke(
false );
3618 double backdrillRadius = aDrillSize / 2.0;
3619 double lineWidth = std::max( backdrillRadius / 4.0,
m_pcbSettings.m_outlineWidth * 2.0 );
3622 m_gal->AdvanceDepth();
3623 m_gal->SetIsFill(
false );
3624 m_gal->SetIsStroke(
true );
3625 m_gal->SetLineWidth( lineWidth );
3644 if(
const PAD*
pad =
dynamic_cast<const PAD*
>( aItem ) )
3646 size =
pad->GetPostMachiningKnockout( aLayer );
3650 size =
via->GetPostMachiningKnockout( aLayer );
3657 m_gal->AdvanceDepth();
3659 double pmRadius = size / 2.0;
3661 double lineWidth = std::max( pmRadius / 8.0,
m_pcbSettings.m_outlineWidth * 2.0 );
3665 m_gal->SetIsFill(
false );
3666 m_gal->SetIsStroke(
true );
3667 m_gal->SetStrokeColor( layerColor );
3668 m_gal->SetLineWidth( lineWidth );
3671 constexpr int NUM_DASHES = 12;
3674 for(
int i = 0; i < NUM_DASHES; ++i )
3676 EDA_ANGLE startAngle = dashAngle * ( i * 2 );
3677 m_gal->DrawArc( aCenter, pmRadius, startAngle, dashAngle );
ERROR_LOC
When approximating an arc or circle, should the error be placed on the outside or inside of the curve...
constexpr int ARC_HIGH_DEF
constexpr EDA_IU_SCALE pcbIUScale
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
@ NORMAL
Inactive layers are shown normally (no high-contrast mode)
@ HIDDEN
Inactive layers are hidden.
@ RATSNEST
Net/netclass colors are shown on ratsnest lines only.
@ ALL
Net/netclass colors are shown on all net copper.
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
Bezier curves to polygon converter.
void GetPoly(std::vector< VECTOR2I > &aOutput, int aMaxError=10)
Convert a Bezier curve to a polygon.
virtual NETCLASS * GetEffectiveNetClass() const
Return the NETCLASS for this item.
wxString GetNetname() const
NETINFO_ITEM * GetNet() const
Return #NET_INFO object for a given item.
const wxString & GetDisplayNetname() const
virtual int GetOwnClearance(PCB_LAYER_ID aLayer, wxString *aSource=nullptr) const
Return an item's "own" clearance in internal units.
Container for design settings for a BOARD object.
int GetHolePlatingThickness() const
Pad & via drills are finish size.
int m_SolderMaskExpansion
int GetLineThickness(PCB_LAYER_ID aLayer) const
Return the default graphic segment thickness from the layer class for the given layer.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
virtual BOARD_ITEM * Duplicate(bool addToParentGroup, BOARD_COMMIT *aCommit=nullptr) const
Create a copy of this BOARD_ITEM.
virtual bool IsConnected() const
Returns information if the object is derived from BOARD_CONNECTED_ITEM.
virtual bool IsKnockout() const
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
FOOTPRINT * GetParentFootprint() const
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
virtual void TransformShapeToPolySet(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, KIGFX::RENDER_SETTINGS *aRenderSettings=nullptr) const
Convert the item shape to a polyset.
const KIFONT::METRICS & GetFontMetrics() const
BOARD_ITEM_CONTAINER * GetParent() const
bool IsSideSpecific() const
virtual bool IsOnCopperLayer() const
Information pertinent to a Pcbnew printed circuit board.
bool IsFootprintHolder() const
Find out if the board is being used to hold a single footprint for editing/viewing.
BOARD_USE GetBoardUse() const
Get what the board use is.
bool IsElementVisible(GAL_LAYER_ID aLayer) const
Test whether a given element category is visible.
const LSET & GetVisibleLayers() const
A proxy function that calls the correspondent function in m_BoardSettings.
int GetCopperLayerCount() const
KIGFX::COLOR4D GetNetChainColor(const wxString &aChain) const
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
const LSET & GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
constexpr const Vec & GetPosition() const
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 BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
constexpr size_type GetWidth() const
constexpr Vec Centre() const
constexpr size_type GetHeight() const
constexpr bool Contains(const Vec &aPoint) const
constexpr const Vec & GetOrigin() const
constexpr const SizeVec & GetSize() const
constexpr void SetEnd(coord_type x, coord_type y)
Color settings are a bit different than most of the settings objects in that there can be more than o...
COLOR4D GetColor(int aLayer) const
virtual const BOX2I GetBoundingBox() const
Return the orthogonal bounding box of this object for display purposes.
KICAD_T Type() const
Returns the type of object.
bool IsBrightened() const
int GetEllipseMinorRadius() const
const VECTOR2I & GetBezierC2() const
const VECTOR2I & GetEllipseCenter() const
virtual VECTOR2I GetTopLeft() const
EDA_ANGLE GetEllipseEndAngle() const
int GetEllipseMajorRadius() const
int GetRectangleWidth() const
virtual std::vector< SHAPE * > MakeEffectiveShapes(bool aEdgeOnly=false) const
Make a set of SHAPE objects representing the EDA_SHAPE.
void CalcArcAngles(EDA_ANGLE &aStartAngle, EDA_ANGLE &aEndAngle) const
Calc arc start and end angles such that aStartAngle < aEndAngle.
EDA_ANGLE GetEllipseRotation() const
virtual VECTOR2I GetBotRight() const
const std::vector< SEG > & GetHatchLines() const
bool IsHatchedFill() const
virtual int GetHatchLineWidth() const
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
std::vector< VECTOR2I > GetRectCorners() const
EDA_ANGLE GetEllipseStartAngle() const
const std::vector< VECTOR2I > & GetBezierPoints() const
const VECTOR2I & GetBezierC1() const
int GetRectangleHeight() const
int GetCornerRadius() const
virtual bool IsVisible() const
KIFONT::FONT * GetFont() const
std::vector< std::unique_ptr< KIFONT::GLYPH > > * GetRenderCache(const KIFONT::FONT *aFont, const wxString &forResolvedText, const VECTOR2I &aOffset={ 0, 0 }) const
BOX2I GetTextBox(const RENDER_SETTINGS *aSettings, int aLine=-1) const
Useful in multiline texts to calculate the full text or a line area (for zones filling,...
GR_TEXT_H_ALIGN_T GetHorizJustify() const
virtual KIFONT::FONT * GetDrawFont(const RENDER_SETTINGS *aSettings) const
const TEXT_ATTRIBUTES & GetAttributes() const
int GetEffectiveTextPenWidth(int aDefaultPenWidth=0) const
The EffectiveTextPenWidth uses the text thickness if > 1 or aDefaultPenWidth.
APP_SETTINGS_BASE * KifaceSettings() const
FONT is an abstract base class for both outline and stroke fonts.
static FONT * GetFont(const wxString &aFontName=wxEmptyString, bool aBold=false, bool aItalic=false, const std::vector< wxString > *aEmbeddedFiles=nullptr, bool aForDrawingSheet=false)
virtual bool IsStroke() const
void Draw(KIGFX::GAL *aGal, const wxString &aText, const VECTOR2I &aPosition, const VECTOR2I &aCursor, const TEXT_ATTRIBUTES &aAttributes, const METRICS &aFontMetrics, std::optional< VECTOR2I > aMousePos=std::nullopt, wxString *aActiveUrl=nullptr) const
Draw a string.
virtual bool IsOutline() const
A color representation with 4 components: red, green, blue, alpha.
COLOR4D WithAlpha(double aAlpha) const
Return a color with the same color, but the given alpha.
static const COLOR4D CLEAR
COLOR4D & Darken(double aFactor)
Makes the color darker by a given factor.
COLOR4D Darkened(double aFactor) const
Return a color that is darker by a given factor, without modifying object.
COLOR4D Inverted() const
Returns an inverted color, alpha remains the same.
COLOR4D & Brighten(double aFactor)
Makes the color brighter by a given factor.
static const COLOR4D WHITE
COLOR4D Brightened(double aFactor) const
Return a color that is brighter by a given factor, without modifying object.
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
static const COLOR4D BLACK
COLOR4D Mix(const COLOR4D &aColor, double aFactor) const
Return a color that is mixed with the input by a factor.
Attribute save/restore for GAL attributes.
Abstract interface for drawing on a 2D-surface.
GAL * m_gal
Instance of graphic abstraction layer that gives an interface to call commands used to draw (eg.
PAINTER(GAL *aGal)
Initialize this object for painting on any of the polymorphic GRAPHICS_ABSTRACTION_LAYER* derivatives...
void drawPostMachiningIndicator(const BOARD_ITEM *aItem, const VECTOR2D &aCenter, PCB_LAYER_ID aLayer)
Draw post-machining indicator (dashed circle) at the given center point.
virtual SHAPE_SEGMENT getPadHoleShape(const PAD *aPad) const
Return hole shape for a pad (internal units).
PCB_PAINTER(GAL *aGal, FRAME_T aFrameType)
int getLineThickness(int aActualThickness) const
Get the thickness to draw for a line (e.g.
void renderNetNameForSegment(const SHAPE_SEGMENT &aSeg, const COLOR4D &aColor, const wxString &aNetName) const
PCB_VIEWERS_SETTINGS_BASE * viewer_settings()
void draw(const PCB_TRACK *aTrack, int aLayer)
virtual PAD_DRILL_SHAPE getDrillShape(const PAD *aPad) const
Return drill shape of a pad.
int m_holePlatingThickness
PCB_RENDER_SETTINGS m_pcbSettings
virtual int getViaDrillSize(const PCB_VIA *aVia) const
Return drill diameter for a via (internal units).
void strokeText(const wxString &aText, const VECTOR2I &aPosition, const TEXT_ATTRIBUTES &aAttrs, const KIFONT::METRICS &aFontMetrics)
void drawBackdrillIndicator(const BOARD_ITEM *aItem, const VECTOR2D &aCenter, int aDrillSize, PCB_LAYER_ID aStartLayer, PCB_LAYER_ID aEndLayer)
Draw backdrill indicator (two semi-circles) at the given center point.
virtual bool Draw(const VIEW_ITEM *aItem, int aLayer) override
Takes an instance of VIEW_ITEM and passes it to a function that knows how to draw the item.
double m_zoneOpacity
Opacity override for filled zones.
double m_trackOpacity
Opacity override for all tracks.
double m_imageOpacity
Opacity override for user images.
double m_viaOpacity
Opacity override for all types of via.
ZONE_DISPLAY_MODE m_ZoneDisplayMode
void LoadColors(const COLOR_SETTINGS *aSettings) override
double m_padOpacity
Opacity override for SMD pads and PTHs.
void SetBackgroundColor(const COLOR4D &aColor) override
Set the background color.
COLOR4D GetColor(const VIEW_ITEM *aItem, int aLayer) const override
Returns the color that should be used to draw the specific VIEW_ITEM on the specific layer using curr...
HIGH_CONTRAST_MODE m_ContrastModeDisplay
std::map< int, KIGFX::COLOR4D > m_netColors
Set of net codes that should not have their ratsnest displayed.
NET_COLOR_MODE m_netColorMode
Overrides for specific netclass colors.
static const double MAX_FONT_SIZE
< Maximum font size for netnames (and other dynamically shown strings)
double m_filledShapeOpacity
Opacity override for graphic shapes.
bool m_ForceShowFieldsWhenFPSelected
bool GetShowPageLimits() const override
void LoadDisplayOptions(const PCB_DISPLAY_OPTIONS &aOptions)
Load settings related to display options (high-contrast mode, full or outline modes for vias/pads/tra...
bool m_ForcePadSketchModeOn
COLOR4D m_backgroundColor
PCB_LAYER_ID GetPrimaryHighContrastLayer() const
Return the board layer which is in high-contrast mode.
void SetGapLengthRatio(double aRatio)
PCB_LAYER_ID GetActiveLayer() const
std::map< int, COLOR4D > m_layerColorsHi
virtual void update()
Precalculates extra colors for layers (e.g.
void SetDashLengthRatio(double aRatio)
std::set< int > m_highlightNetcodes
std::map< int, COLOR4D > m_layerColorsDark
std::map< int, COLOR4D > m_layerColorsSel
std::set< int > m_highContrastLayers
std::map< int, COLOR4D > m_layerColors
bool m_hiContrastEnabled
Parameters for display modes.
An abstract base class for deriving all objects that can be added to a VIEW.
bool IsBOARD_ITEM() const
double GetForcedTransparency() const
LSET is a set of PCB_LAYER_IDs.
static const LSET & AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
PCB_LAYER_ID ExtractLayer() const
Find the first set PCB_LAYER_ID.
LSEQ Seq(const LSEQ &aSequence) const
Return an LSEQ from the union of this LSET and a desired sequence.
static LSET AllCuMask(int aCuLayerCount)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
static const LSET & PhysicalLayersMask()
Return a mask holding all layers which are physically realized.
int MarkerScale() const
The scaling factor to convert polygonal shape coordinates to internal units.
void ShapeToPolygon(SHAPE_LINE_CHAIN &aPolygon, int aScale=-1) const
Return the shape polygon in internal units in a SHAPE_LINE_CHAIN the coordinates are relatives to the...
COLOR4D GetPcbColor(bool aIsForSave=false) const
Handle the data for a net.
const wxString & GetNetChain() const
PAD * GetTerminalPad(int aIndex) const
static const int UNCONNECTED
Constant that holds the "unconnected net" number (typically 0) all items "connected" to this net are ...
@ NORMAL
Shape is the same on all layers.
int GetOwnClearance(PCB_LAYER_ID aLayer, wxString *aSource=nullptr) const override
Return the pad's "own" clearance in internal units.
LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
const std::vector< std::shared_ptr< PCB_SHAPE > > & GetPrimitives(PCB_LAYER_ID aLayer) const
Accessor to the basic shape list for custom-shaped pads.
bool FlashLayer(int aLayer, bool aOnlyCheckIfPermitted=false) const
Check to see whether the pad should be flashed on the specific layer.
virtual std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer, FLASHING flashPTHPads=FLASHING::DEFAULT) const override
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
const BOX2I GetBoundingBox() const override
The bounding box is cached, so this will be efficient most of the time.
PAD_ATTRIB GetAttribute() const
const wxString & GetPinFunction() const
const wxString & GetNumber() const
VECTOR2I GetPosition() const override
PCB_LAYER_ID GetTertiaryDrillEndLayer() const
VECTOR2I GetOffset(PCB_LAYER_ID aLayer) const
PCB_LAYER_ID GetTertiaryDrillStartLayer() const
bool IsNoConnectPad() const
int GetDrillSizeX() const
PAD_SHAPE GetShape(PCB_LAYER_ID aLayer) const
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aMaxError, ERROR_LOC aErrorLoc=ERROR_INSIDE, bool ignoreLineWidth=false) const override
Convert the pad shape to a closed polygon.
int GetSolderMaskExpansion(PCB_LAYER_ID aLayer) const
VECTOR2I GetSize(PCB_LAYER_ID aLayer) const
const VECTOR2I & GetSecondaryDrillSize() const
EDA_ANGLE GetOrientation() const
Return the rotation angle of the pad.
PAD_DRILL_SHAPE GetDrillShape() const
int GetPostMachiningKnockout(PCB_LAYER_ID aLayer) const
Get the knockout diameter for a layer affected by post-machining.
VECTOR2I GetSolderPasteMargin(PCB_LAYER_ID aLayer) const
Usually < 0 (mask shape smaller than pad)because the margin can be dependent on the pad size,...
PCB_LAYER_ID GetSecondaryDrillStartLayer() const
const VECTOR2I & GetTertiaryDrillSize() const
VECTOR2I ShapePos(PCB_LAYER_ID aLayer) const
std::shared_ptr< SHAPE_SEGMENT > GetEffectiveHoleShape() const override
Return a SHAPE_SEGMENT object representing the pad's hole.
PCB_LAYER_ID GetSecondaryDrillEndLayer() const
DISPLAY_OPTIONS m_Display
EDA_ANGLE GetArcAngleStart() const
const VECTOR2I GetFocusPosition() const override
Similar to GetPosition() but allows items to return their visual center rather than their anchor.
EDA_ANGLE GetAngle() const
const VECTOR2I & GetMid() const
virtual VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
void GetBoundingHull(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aMaxError, ERROR_LOC aErrorLoc=ERROR_INSIDE) const
const SHAPE_POLY_SET & GetOutline() const
int GetLineThickness() const
const std::vector< std::shared_ptr< SHAPE > > & GetShapes() const
double m_TrackOpacity
Opacity override for all tracks.
double m_FilledShapeOpacity
Opacity override for graphic shapes.
double m_ZoneOpacity
Opacity override for filled zone areas.
double m_ImageOpacity
Opacity override for user images.
double m_PadOpacity
Opacity override for SMD pads and PTHs.
double m_ViaOpacity
Opacity override for all types of via.
HIGH_CONTRAST_MODE m_ContrastModeDisplay
How inactive layers are displayed.
NET_COLOR_MODE m_NetColorMode
How to use color overrides on specific nets and netclasses.
ZONE_DISPLAY_MODE m_ZoneDisplayMode
A set of BOARD_ITEMs (i.e., without duplicates).
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
void SetZoom(double aZoomFactor) const
std::vector< PCB_SHAPE > GetShapes() const
GAL_LAYER_ID GetColorLayer() const
VECTOR2I GetPosition() const override
PCB_VIEWERS_SETTINGS_BASE * viewer_settings()
A PCB_POINT is a 0-dimensional point that is used to mark a position on a PCB, or more usually a foot...
VECTOR2I GetPosition() const override
Object to handle a bitmap image that can be inserted in a PCB.
REFERENCE_IMAGE & GetReferenceImage()
VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
int GetWidth() const override
bool HasSolderMask() const
int GetSolderMaskExpansion() const
bool IsProxyItem() const override
STROKE_PARAMS GetStroke() const override
void UpdateHatching() const override
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
std::vector< PCB_TABLECELL * > GetCells() const
void DrawBorders(const std::function< void(const VECTOR2I &aPt1, const VECTOR2I &aPt2, const STROKE_PARAMS &aStroke)> &aCallback) const
VECTOR2I GetPosition() const override
bool IsBorderEnabled() const
Disables the border, this is done by changing the stroke internally.
void TransformTextToPolySet(SHAPE_POLY_SET &aBuffer, int aClearance, int aMaxError, ERROR_LOC aErrorLoc) const
Function TransformTextToPolySet Convert the text to a polygonSet describing the actual character stro...
VECTOR2I GetTextSize() const override
VECTOR2I GetDrawPos() const override
wxString GetShownText(bool aAllowExtraText, int aDepth=0) const override
Return the string actually shown after processing of the base text.
std::vector< VECTOR2I > GetCorners() const override
Return 4 corners for a rectangle or rotated rectangle (stored as a poly).
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aMaxError, ERROR_LOC aErrorLoc, bool aIgnoreLineWidth=false) const override
Convert the item shape to a closed polygon.
const SHAPE_POLY_SET & GetKnockoutCache(const KIFONT::FONT *aFont, const wxString &forResolvedText, int aMaxError) const
wxString GetShownText(bool aAllowExtraText, int aDepth=0) const override
Return the string actually shown after processing of the base text.
VECTOR2I GetTextPos() const override
int GetTextThickness() const override
EDA_ANGLE GetDrawRotation() const override
VECTOR2I GetTextSize() const override
int GetSolderMaskExpansion() const
const VECTOR2I & GetStart() const
const VECTOR2I & GetEnd() const
virtual int GetWidth() const
PCB_LAYER_ID BottomLayer() const
PCB_LAYER_ID GetTertiaryDrillEndLayer() const
std::optional< int > GetTertiaryDrillSize() const
bool FlashLayer(int aLayer) const
Check to see whether the via should have a pad on the specific layer.
std::optional< int > GetSecondaryDrillSize() const
PCB_LAYER_ID GetSecondaryDrillEndLayer() const
int GetWidth() const override
PCB_LAYER_ID GetTertiaryDrillStartLayer() const
bool IsOnLayer(PCB_LAYER_ID aLayer) const override
Test to see if this object is on the given layer.
PCB_LAYER_ID TopLayer() const
int GetDrillValue() const
Calculate the drill value for vias (m_drill if > 0, or default drill value for the board).
VIATYPE GetViaType() const
PCB_LAYER_ID GetSecondaryDrillStartLayer() const
void LayerPair(PCB_LAYER_ID *top_layer, PCB_LAYER_ID *bottom_layer) const
Return the 2 layers used by the via (the via actually uses all layers between these 2 layers)
VIEWERS_DISPLAY_OPTIONS m_ViewersDisplay
virtual COMMON_SETTINGS * GetCommonSettings() const
virtual SETTINGS_MANAGER & GetSettingsManager() const
A REFERENCE_IMAGE is a wrapper around a BITMAP_IMAGE that is displayed in an editor as a reference fo...
VECTOR2I GetPosition() const
const BITMAP_BASE & GetImage() const
Get the underlying image.
double GetImageScale() const
A round rectangle shape, based on a rectangle and a radius.
void TransformToPolygon(SHAPE_POLY_SET &aBuffer, int aMaxError) const
Get the polygonal representation of the roundrect.
VECTOR2I::extended_type ecoord
int Length() const
Return the length (this).
ecoord SquaredLength() const
T * GetAppSettings(const char *aFilename)
Return a handle to the a given settings by type.
VECTOR2I GetEnd() const override
const SHAPE_LINE_CHAIN ConvertToPolyline(int aMaxError=DefaultAccuracyForPCB(), int *aActualError=nullptr) const
Construct a SHAPE_LINE_CHAIN of segments from a given arc.
VECTOR2I GetStart() const override
const VECTOR2I & GetCenter() const
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.
Represent a set of closed polygons.
bool IsTriangulationUpToDate() const
void Inflate(int aAmount, CORNER_STRATEGY aCornerStrategy, int aMaxError, bool aSimplify=false)
Perform outline inflation/deflation.
int HoleCount(int aOutline) const
Returns the number of holes in a given outline.
int Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Appends a vertex at the end of the given outline/hole (default: the last outline)
virtual void CacheTriangulation(bool aSimplify=false, const TASK_SUBMITTER &aSubmitter={})
Build a polygon triangulation, needed to draw a polygon on OpenGL and in some other calculations.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
int NewOutline()
Creates a new empty polygon in the set and returns its index.
void Deflate(int aAmount, CORNER_STRATEGY aCornerStrategy, int aMaxError)
const SHAPE_LINE_CHAIN & CHole(int aOutline, int aHole) const
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...
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
int GetWidth() const override
const VECTOR2I & GetPosition() const
const VECTOR2I GetSize() const
const SEG & GetSeg() const
int GetWidth() const override
Represent a simple polygon consisting of a zero-thickness closed chain of connected line segments.
const SHAPE_LINE_CHAIN & Vertices() const
Return the list of vertices defining this simple polygon.
virtual const SEG GetSegment(int aIndex) const override
const VECTOR2I & CPoint(int aIndex) const
Return a const reference to a given point in the polygon.
int PointCount() const
Return the number of points (vertices) in this polygon.
virtual size_t GetSegmentCount() const override
An abstract shape on 2D plane.
Simple container to manage line stroke parameters.
LINE_STYLE GetLineStyle() const
static void Stroke(const SHAPE *aShape, LINE_STYLE aLineStyle, int aWidth, const KIGFX::RENDER_SETTINGS *aRenderSettings, const std::function< void(const VECTOR2I &a, const VECTOR2I &b)> &aStroker)
GR_TEXT_H_ALIGN_T m_Halign
GR_TEXT_V_ALIGN_T m_Valign
VECTOR2< T > Resize(T aNewLength) const
Return a vector of the same direction, but length specified in aNewLength.
Handle a list of polygons defining a copper zone.
bool GetIsRuleArea() const
Accessors to parameters used in Rule Area zones:
std::shared_ptr< SHAPE_POLY_SET > GetFilledPolysList(PCB_LAYER_ID aLayer) const
SHAPE_POLY_SET GetBoardOutline() const
virtual bool IsOnLayer(PCB_LAYER_ID) const override
Test to see if this object is on the given layer.
bool IsTeardropArea() const
ZONE_BORDER_DISPLAY_STYLE GetHatchStyle() const
bool IsConflicting() const
For rule areas which exclude footprints (and therefore participate in courtyard conflicts during move...
std::vector< SEG > GetHatchLines() const
void TransformArcToPolygon(SHAPE_POLY_SET &aBuffer, const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd, int aWidth, int aError, ERROR_LOC aErrorLoc)
Convert arc to multiple straight segments.
@ CHAMFER_ALL_CORNERS
All angles are chamfered.
@ ROUND_ALL_CORNERS
All angles are rounded.
static constexpr EDA_ANGLE ANGLE_90
static constexpr EDA_ANGLE ANGLE_VERTICAL
static constexpr EDA_ANGLE ANGLE_HORIZONTAL
static constexpr EDA_ANGLE ANGLE_360
#define IGNORE_PARENT_GROUP
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
FRAME_T
The set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
@ FRAME_FOOTPRINT_PREVIEW
@ FRAME_FOOTPRINT_CHOOSER
a few functions useful in geometry calculations.
int GetPenSizeForNormal(int aTextSize)
double m_HoleWallPaintingMultiplier
What factor to use when painting via and PTH pad hole walls, so that the painted hole wall can be ove...
bool IsSolderMaskLayer(int aLayer)
@ LAYER_PAD_FR_NETNAMES
Additional netnames layers (not associated with a PCB layer).
@ NETNAMES_LAYER_ID_START
bool IsPcbLayer(int aLayer)
Test whether a layer is a valid layer for Pcbnew.
bool IsPadCopperLayer(int aLayer)
bool IsPointsLayer(int aLayer)
int GetNetnameLayer(int aLayer)
Return a netname layer corresponding to the given layer.
bool IsClearanceLayer(int aLayer)
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
@ LAYER_POINTS
PCB reference/manual snap points visibility.
@ LAYER_LOCKED_ITEM_SHADOW
Shadow layer for locked items.
@ LAYER_PAD_COPPER_START
Virtual layers for pad copper on a given copper layer.
@ LAYER_CONFLICTS_SHADOW
Shadow layer for items flagged conflicting.
@ LAYER_NON_PLATEDHOLES
Draw usual through hole vias.
@ LAYER_DRC_EXCLUSION
Layer for DRC markers which have been individually excluded.
@ LAYER_PCB_BACKGROUND
PCB background color.
@ LAYER_DRC_HIGHLIGHTED
Color for highlighted DRC markers.
@ LAYER_DRC_SHAPES
Custom shapes for DRC markers.
@ LAYER_PADS
Meta control for all pads opacity/visibility (color ignored).
@ LAYER_DRC_WARNING
Layer for DRC markers with #SEVERITY_WARNING.
@ LAYER_PAD_PLATEDHOLES
to draw pad holes (plated)
@ LAYER_VIA_COPPER_START
Virtual layers for via copper on a given copper layer.
@ LAYER_CONSTRAINT_SHADOW
Shadow layer for items bound to a constraint.
@ LAYER_CLEARANCE_START
Virtual layers for pad/via/track clearance outlines for a given copper layer.
@ LAYER_ZONE_START
Virtual layers for stacking zones and tracks on a given copper layer.
@ LAYER_ANCHOR
Anchor of items having an anchor point (texts, footprints).
@ LAYER_VIA_BURIED
Draw blind vias.
@ LAYER_MARKER_SHADOWS
Shadows for DRC markers.
@ LAYER_VIA_HOLES
Draw via holes (pad holes do not use this layer).
@ LAYER_VIA_BLIND
Draw micro vias.
@ LAYER_VIA_THROUGH
Draw buried vias.
@ LAYER_DRC_ERROR
Layer for DRC markers with #SEVERITY_ERROR.
bool IsViaCopperLayer(int aLayer)
bool IsNetnameLayer(int aLayer)
Test whether a layer is a netname layer.
bool IsHoleLayer(int aLayer)
bool IsExternalCopperLayer(int aLayerId)
Test whether a layer is an external (F_Cu or B_Cu) copper layer.
PCB_LAYER_ID
A quick note on layer IDs:
bool IsZoneFillLayer(int aLayer)
PCB_LAYER_ID ToLAYER_ID(int aLayer)
MATRIX3x3< double > MATRIX3x3D
The Cairo implementation of the graphics abstraction layer.
bool ZoneOutlineDrawnOnLayer(bool aOutlineOnly, int aLayer)
Decide which GAL draw pass paints a zone's outline.
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
PAD_DRILL_SHAPE
The set of pad drill shapes, used with PAD::{Set,Get}DrillShape()
@ NPTH
like PAD_PTH, but not plated mechanical use only, no connection allowed
@ PTH
Plated through hole pad.
BARCODE class definition.
Class to handle a set of BOARD_ITEMs.
PCBNEW_SETTINGS * pcbconfig()
PGM_BASE & Pgm()
The global program "get" accessor.
PGM_BASE * PgmOrNull()
Return a reference that can be nullptr when running a shared lib from a script, not from a kicad app.
@ SH_RECT
axis-aligned rectangle
@ SH_SIMPLE
simple polygon
wxString UnescapeString(const wxString &aSource)
int PrintableCharCount(const wxString &aString)
Return the number of printable (ie: non-formatting) chars.
LINE_STYLE
Dashed line types.
double hicontrast_dimming_factor
bool m_DisplayPcbTrackFill
bool m_DisplayGraphicsFill
SHAPE_CIRCLE circle(c.m_circle_center, c.m_circle_radius)
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
@ PCB_ZONE_T
class ZONE, a copper pour area
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
@ PCB_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
@ PCB_MARKER_T
class PCB_MARKER, a marker used to show something
@ PCB_BARCODE_T
class PCB_BARCODE, a barcode (graphic item)
@ PCB_TARGET_T
class PCB_TARGET, a target (graphic item)
@ PCB_TABLECELL_T
class PCB_TABLECELL, PCB_TEXTBOX for use in tables
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
@ PCB_PAD_T
class PAD, a pad in a footprint
@ PCB_BOARD_OUTLINE_T
class PCB_BOARD_OUTLINE_T, a pcb board outline item
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
@ PCB_TABLE_T
class PCB_TABLE, table of PCB_TABLECELLs
@ PCB_POINT_T
class PCB_POINT, a 0-dimensional point
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D