123 draw( item, aLayer,
false );
132#ifdef CONNECTIVITY_DEBUG
134 auto sch_item =
dynamic_cast<const SCH_ITEM*
>( aItem );
135 auto conn = sch_item ? sch_item->
Connection( *g_CurrentSheet ) :
nullptr;
140 auto label = conn->Name(
true );
145 m_canvas->SetLineWidth( Mils2ui( 2 ) );
146 m_canvas->SetGlyphSize(
VECTOR2D( Mils2ui( 20 ), Mils2ui( 20 ) ) );
147 m_canvas->StrokeText( *m_canvas, conn->Name(
true ), pos, 0.0, 0 );
155 switch( aItem->
Type() )
161 drawBoundingBox =
false;
162 draw(
static_cast<const SCH_PIN*
>( aItem ), aLayer, aDimmed );
174 draw(
static_cast<const SCH_SHAPE*
>( aItem ), aLayer, aDimmed );
177 draw(
static_cast<const SCH_SHAPE*
>( aItem ), aLayer, aDimmed );
180 draw(
static_cast<const SCH_TEXT*
>( aItem ), aLayer, aDimmed );
186 draw(
static_cast<const SCH_TABLE*
>( aItem ), aLayer, aDimmed );
189 draw(
static_cast<const SCH_LABEL*
>( aItem ), aLayer, aDimmed );
195 draw(
static_cast<const SCH_FIELD*
>( aItem ), aLayer, aDimmed );
231 if( drawBoundingBox )
247 box =
static_cast<const SCH_SYMBOL*
>( aItem )->GetBodyBoundingBox();
249 m_gal->SetIsFill(
false );
250 m_gal->SetIsStroke(
true );
252 :
COLOR4D( 0.2, 0.2, 0.2, 1 ) );
304 return (
float) std::fabs( matrix.
GetScale().
x * milsWidth ) +
schIUScale.MilsToIU( milsWidth );
309 bool aDimmed,
bool aIgnoreNets )
const
311 auto isBackgroundLayer =
328 color =
static_cast<const SCH_LINE*
>( aItem )->GetLineColor();
336 color =
static_cast<const SCH_JUNCTION*
>( aItem )->GetJunctionColor();
342 if( isBackgroundLayer( aLayer ) )
351 if( isBackgroundLayer( aLayer ) )
374 wxFAIL_MSG( wxT(
"Unsupported fill type" ) );
383 else if( isSymbolChild )
394 else if( aItem->
IsType( { SCH_LABEL_LOCATE_ANY_T } ) )
400 else if( aIgnoreNets )
407 color =
static_cast<const SCH_FIELD*
>( aItem )->GetFieldColor();
413 if( isBackgroundLayer( aLayer ) )
418 else if(
const EDA_TEXT* otherTextItem =
dynamic_cast<const EDA_TEXT*
>( aItem ) )
421 color = otherTextItem->GetTextColor();
432 if( isBackgroundLayer( aLayer) )
457 if( aDrawingShadows )
464 else if( isBackgroundLayer( aLayer ) )
469 else if( aItem->
IsSelected() && aDrawingShadows )
473 else if( aItem->
IsSelected() && isBackgroundLayer( aLayer ) )
483 color = color.
Darken( 0.5f );
486 if( aDimmed && !( aItem->
IsSelected() && aDrawingShadows ) )
490 color = color.
Mix( sheetColour, 0.5f );
501 bool aDrawingWireColorHighlights )
const
514 if( aDrawingWireColorHighlights )
516 float colorHighlightWidth =
schIUScale.MilsToIU( 15.0 );
522 width += colorHighlightWidth;
533 switch( aItem->
Type() )
536 pen =
static_cast<const SCH_FIELD*
>( aItem )->GetEffectiveTextPenWidth( pen );
540 pen =
static_cast<const SCH_TEXT*
>( aItem )->GetEffectiveTextPenWidth( pen );
548 pen =
static_cast<const SCH_LABEL_BASE*
>( aItem )->GetEffectiveTextPenWidth( pen );
553 pen =
static_cast<const SCH_TEXTBOX*
>( aItem )->GetEffectiveTextPenWidth( pen );
567 int screenTextSize =
std::abs( (
int)
m_gal->GetScreenWorldMatrix().GetScale().y * 7 );
570 return KiROUND( ( docTextSize + screenTextSize * 2 ) / 3.0 );
589 std::optional<VECTOR2I> aMousePos = std::nullopt, wxString* aActiveUrl =
nullptr )
596 if( aShadowWidth > 0.0f )
615 font->
Draw( &callback_gal, aText, aPosition, aAttrs, aFontMetrics );
622 font->
Draw( &aGal, aText, aPosition, aAttrs, aFontMetrics, aMousePos, aActiveUrl );
642static void drawCache(
KIGFX::GAL& aGal, std::vector<std::unique_ptr<KIFONT::GLYPH>>* aCache,
float aStrokeWidth,
648 if( aShadowWidth > 0.0f )
650 for(
const std::unique_ptr<KIFONT::GLYPH>& glyph : *aCache )
652 if( glyph->IsOutline() )
659 for(
int ii = 0; ii < outlineGlyph->
OutlineCount(); ++ii )
690 callback_gal.SetIsStroke(
true );
692 font->
Draw( &callback_gal, aText, aPosition, attrs, aFontMetrics );
715 m_gal->DrawLine( a, b );
716 m_gal->DrawLine( b, c );
721 int aBodyStyle,
bool aDimmed )
729 std::unique_ptr< LIB_SYMBOL > tmpSymbol;
734 tmpSymbol = aSymbol->
Flatten();
735 drawnSymbol = tmpSymbol.get();
741 [](
const SCH_ITEM& item,
int layer )
751 if( !childOnLayer( item, aLayer ) )
768 draw( &item, aLayer, aDimmed );
795 bool aDrawingShadows,
bool aBrightened )
807 m_gal->SetIsFill(
false );
808 m_gal->SetIsStroke(
true );
809 m_gal->SetLineWidth( lineWidth );
818 const COLOR4D& aColor,
bool aDrawingShadows,
821 double lineWidth = aSize / 10.0;
823 if( aDrawingShadows )
826 std::vector<SCH_SHAPE> shapeList;
829 m_gal->SetLineWidth( lineWidth );
830 m_gal->SetIsStroke(
true );
831 m_gal->SetStrokeColor( aColor );
832 m_gal->SetFillColor( aColor );
834 for(
const SCH_SHAPE& shape : shapeList )
840 m_gal->DrawCurve( shape.GetStart(), shape.GetBezierC1(), shape.GetBezierC2(), shape.GetEnd() );
842 m_gal->DrawCircle( shape.getCenter(), shape.GetRadius() );
851 bool aRotate,
int aExtraLineWidth,
const COLOR4D& aColor )
879 const double lineYOffset = aSize / 4;
880 const double arrowHead = aSize / 8;
896 topLineREnd -
VECTOR2D{ aSize * 0.7, 0 } );
899 aGal.
DrawLine( topLineREnd, topLineREnd -
VECTOR2D{ arrowHead * 1.2, arrowHead } );
900 aGal.
DrawLine( topLineREnd, topLineREnd -
VECTOR2D{ arrowHead * 1.2, -arrowHead } );
904 aGal.
DrawLine( btmLineREnd, btmLineREnd -
VECTOR2D{ arrowHead * 1.2, arrowHead } );
905 aGal.
DrawLine( btmLineREnd, btmLineREnd -
VECTOR2D{ arrowHead * 1.2, -arrowHead } );
914 aGal.
DrawArc( topLineREnd -
VECTOR2D{ aSize - lineYOffset * 2, -lineYOffset },
935 if(
m_schSettings.IsPrinting() && ( drawingShadows || drawingDangling ) )
967 if( drawingDangling )
986 int textOffset =
KiROUND( textSize * 0.22 );
993 mid.
x +=
KiROUND( textOffset * 1.2 );
998 mid.
y -=
KiROUND( textOffset * 1.2 );
1019 m_gal->SetIsStroke(
true );
1020 m_gal->SetIsFill(
false );
1022 m_gal->SetStrokeColor( color );
1023 m_gal->SetFontBold(
false );
1024 m_gal->SetFontUnderlined(
false );
1025 m_gal->SetFontItalic(
false );
1028 const int diam =
radius*2;
1033 m_gal->DrawLine( p0, pos );
1046 m_gal->DrawLine( p0, pos );
1051 m_gal->DrawLine( p0 + dir * ( diam ), pos );
1055 pc = p0 - dir * clock_size ;
1059 p0 +
VECTOR2D( -dir.
y, dir.
x) * clock_size );
1062 m_gal->DrawLine( p0 + dir * ( diam ), pos );
1067 pc = p0 - dir * clock_size ;
1071 p0 +
VECTOR2D( -dir.
y, dir.
x) * clock_size );
1086 m_gal->DrawLine( p0, pos );
1090 m_gal->DrawLine( p0, pos );
1095 p0 +
VECTOR2D( -dir.
x * clock_size, 0 ),
1101 p0 +
VECTOR2D( 0, -dir.
y * clock_size ),
1107 m_gal->DrawLine( p0, pos );
1124 m_gal->DrawLine( p0, pos );
1133 m_gal->DrawLine( p0, pos );
1143 if( drawingShadows && !
eeconfig()->m_Selection.draw_selected_children )
1153 float shadowWidth = 0.0f;
1155 if( drawingShadows )
1162 const auto textRendersAsBitmap =
1176 const auto drawBrace =
1181 VECTOR2D mid = ( aTop + aBottom ) / 2.0;
1183 aGal.
SetLineWidth( (
float) aAttrs.m_StrokeWidth + aShadowWidth );
1199 double braceOffset = aLeftBrace ? -aBraceWidth : aBraceWidth;
1200 p2.
y += braceOffset / 2;
1201 p3.
y += braceOffset;
1202 p4.
y += braceOffset / 2;
1207 double braceOffset = aLeftBrace ? -aBraceWidth : aBraceWidth;
1208 p2.
x += braceOffset / 2;
1209 p3.
x += braceOffset;
1210 p4.
x += braceOffset / 2;
1220 const auto drawBracesAroundText =
1221 [&](
KIGFX::GAL& aGal,
const wxArrayString& aLines,
const VECTOR2D& aStartPos,
int aLineSpacing,
1224 if( aLines.size() <= 1 )
1228 int braceWidth = aAttrs.m_Size.x / 3;
1231 int maxLineWidth = 0;
1237 for(
const wxString& line : aLines )
1239 wxString trimmedLine = line;
1240 trimmedLine.Trim(
true ).Trim(
false );
1242 aAttrs.m_StrokeWidth,
false,
false,
1244 maxLineWidth = std::max( maxLineWidth, lineExtents.
x );
1252 int textHeight = aAttrs.m_Size.y;
1253 int extraHeight = textHeight / 3;
1258 braceEnd.
x += ( (int) aLines.size() - 1 ) * aLineSpacing;
1261 braceStart.
x -= 2 * extraHeight;
1264 int braceSpacing = maxLineWidth / 2 + braceWidth;
1266 VECTOR2D topBraceStart = braceStart;
1267 topBraceStart.
y -= braceSpacing;
1270 topBraceEnd.
y -= braceSpacing;
1272 drawBrace( aGal, topBraceStart, topBraceEnd, braceWidth,
true, aAttrs, aShadowWidth );
1274 VECTOR2D bottomBraceStart = braceStart;
1275 bottomBraceStart.
y += braceSpacing;
1277 VECTOR2D bottomBraceEnd = braceEnd;
1278 bottomBraceEnd.
y += braceSpacing;
1280 drawBrace( aGal, bottomBraceStart, bottomBraceEnd, braceWidth,
false, aAttrs, aShadowWidth );
1285 braceEnd.
y += ( (int) aLines.size() - 1 ) * aLineSpacing;
1288 braceStart.
y -= 2 * extraHeight;
1291 int braceSpacing = maxLineWidth / 2 + braceWidth;
1295 leftTop.
x -= braceSpacing;
1298 leftBottom.
x -= braceSpacing;
1300 drawBrace( aGal, leftTop, leftBottom, braceWidth,
true, aAttrs, aShadowWidth );
1304 rightTop.
x += braceSpacing;
1307 rightBottom.
x += braceSpacing;
1309 drawBrace( aGal, rightTop, rightBottom, braceWidth,
false, aAttrs, aShadowWidth );
1313 const auto drawBracesAroundTextBitmap =
1318 if( aLines.size() <= 1 )
1321 int braceWidth = aAttrs.m_Size.x / 4;
1324 int maxLineWidth = aAttrs.m_Size.x * 4;
1330 int textHalfHeight = aAttrs.m_Size.y / 2;
1335 braceEnd.
x += ( (int) aLines.size() - 1 ) * aLineSpacing;
1338 leftStart.
y -= maxLineWidth / 2.0 + braceWidth / 2.0;
1341 leftEnd.
y -= maxLineWidth / 2.0 + braceWidth / 2.0;
1343 drawBrace( aGal, leftStart, leftEnd, braceWidth,
true, aAttrs, 0.0f );
1346 rightStart.
y += maxLineWidth / 2.0 + braceWidth / 2.0;
1349 rightEnd.
y += maxLineWidth / 2.0 + braceWidth / 2.0;
1351 drawBrace( aGal, rightStart, rightEnd, braceWidth,
false, aAttrs, 0.0f );
1356 braceEnd.
y += ( (int) aLines.size() - 1 ) * aLineSpacing;
1359 braceTop.
y -= textHalfHeight;
1362 braceBottom.
y += textHalfHeight;
1365 leftTop.
x -= maxLineWidth / 2.0 + braceWidth / 2.0;
1368 leftBottom.
x -= maxLineWidth / 2.0 + braceWidth / 2.0;
1370 drawBrace( aGal, leftTop, leftBottom, braceWidth,
true, aAttrs, 0.0f );
1373 rightTop.
x += maxLineWidth / 2.0 + braceWidth / 2.0;
1375 VECTOR2D rightBottom = braceBottom;
1376 rightBottom.
x += maxLineWidth / 2.0 + braceWidth / 2.0;
1378 drawBrace( aGal, rightTop, rightBottom, braceWidth,
false, aAttrs, 0.0f );
1383 const auto drawMultiLineText =
1385 bool aRenderTextAsBitmap,
float aShadowWidth,
const KIFONT::METRICS& aFontMetrics )
1388 if( aText.StartsWith(
"[" ) && aText.EndsWith(
"]" ) && aText.Contains(
"\n" ) )
1391 wxString content = aText.Mid( 1, aText.Length() - 2 );
1392 wxArrayString lines;
1395 if( lines.size() > 1 )
1398 int lineSpacing =
KiROUND( aAttrs.m_Size.y * 1.3 );
1409 int totalWidth = ( (int) lines.size() - 1 ) * lineSpacing;
1410 startPos.
x -= totalWidth;
1414 int totalWidth = ( (int) lines.size() - 1 ) * lineSpacing;
1415 startPos.
x -= totalWidth / 2.0;
1419 for(
size_t i = 0; i < lines.size(); i++ )
1422 linePos.
x += (int) i * lineSpacing;
1424 wxString line = lines[i];
1425 line.Trim(
true ).Trim(
false );
1427 if( aRenderTextAsBitmap )
1430 drawText( aGal, line, linePos, aAttrs, aShadowWidth, aFontMetrics );
1439 int totalHeight = ( (int) lines.size() - 1 ) * lineSpacing;
1440 startPos.
y -= totalHeight;
1444 int totalHeight = ( (int) lines.size() - 1 ) * lineSpacing;
1445 startPos.
y -= totalHeight / 2.0;
1449 for(
size_t i = 0; i < lines.size(); i++ )
1452 linePos.
y += (int) i * lineSpacing;
1454 wxString line = lines[i];
1455 line.Trim(
true ).Trim(
false );
1457 if( aRenderTextAsBitmap )
1460 drawText( aGal, line, linePos, aAttrs, aShadowWidth, aFontMetrics );
1465 if( aRenderTextAsBitmap )
1466 drawBracesAroundTextBitmap( aGal, lines, startPos, lineSpacing, aAttrs );
1468 drawBracesAroundText( aGal, lines, startPos, lineSpacing, aAttrs, aShadowWidth );
1475 if( aRenderTextAsBitmap )
1476 bitmapText( aGal, aText, aPosition, aAttrs );
1478 drawText( aGal, aText, aPosition, aAttrs, aShadowWidth, aFontMetrics );
1481 const auto drawTextInfo =
1485 const bool renderTextAsBitmap = textRendersAsBitmap( *
m_gal, aTextInfo.
m_TextSize );
1488 m_gal->SetStrokeColor( aColor );
1489 m_gal->SetFillColor( aColor );
1499 if(
nonCached( aPin ) && renderTextAsBitmap )
1514 const auto getColorForLayer =
1515 [&](
int aDrawnLayer )
1520 return getRenderColor( aPin, aDrawnLayer, drawingShadows, aDimmed );
1525 if( std::optional<PIN_LAYOUT_CACHE::TEXT_INFO> numInfo = cache.
GetPinNumberInfo( shadowWidth ) )
1527 std::optional<PIN_LAYOUT_CACHE::TEXT_INFO> origInfo;
1535 origInfo = *numInfo;
1537 origInfo->m_TextSize = std::max( 1, ( numInfo->m_TextSize * 4 ) / 5 );
1541 VECTOR2I fontSize( origInfo->m_TextSize, origInfo->m_TextSize );
1543 origInfo->m_Thickness,
false,
false,
1548 int shift = dir.
y > 0 ? labelExtents.
x : 0;
1549 numInfo->m_TextPosition.y += shift;
1550 origInfo->m_TextPosition.y = numBox->GetTop() + shift;
1554 int shift = dir.
x < 0 ? labelExtents.
x : 0;
1555 numInfo->m_TextPosition.x -= shift;
1556 origInfo->m_TextPosition.x = numBox->GetRight() - shift;
1561 drawTextInfo( *numInfo, getColorForLayer(
LAYER_PINNUM ) );
1568 if( !drawingShadows )
1571 drawTextInfo( *origInfo, dimmed );
1575 if( std::optional<PIN_LAYOUT_CACHE::TEXT_INFO> nameInfo = cache.
GetPinNameInfo( shadowWidth ) )
1577 drawTextInfo( *nameInfo, getColorForLayer(
LAYER_PINNAM ) );
1598 m_gal->SetStrokeColor( emphasis );
1599 m_gal->SetIsFill(
false );
1600 m_gal->SetIsStroke(
true );
1622 m_gal->SetStrokeColor( color );
1623 m_gal->SetIsStroke(
true );
1633 bool aDangling,
bool aDrawingShadows,
bool aBrightened )
1649 m_gal->SetIsStroke(
true );
1650 m_gal->SetIsFill(
false );
1660 bool highlightNetclassColors =
false;
1663 highlightNetclassColors = eeschemaCfg->m_Selection.highlight_netclass_colors;
1675 if( highlightNetclassColors && aLayer == aJct->
GetLayer() )
1682 if( junctionSize > 1 )
1684 m_gal->SetIsStroke( drawingShadows );
1686 m_gal->SetStrokeColor( color );
1687 m_gal->SetIsFill( !drawingShadows );
1688 m_gal->SetFillColor( color );
1699 bool drawingBusses = aLayer ==
LAYER_BUS;
1702 bool highlightNetclassColors =
false;
1703 double highlightAlpha = 0.6;
1704 double hopOverScale = 0.0;
1715 highlightNetclassColors = eeschemaCfg->m_Selection.highlight_netclass_colors;
1716 highlightAlpha = eeschemaCfg->m_Selection.highlight_netclass_colors_alpha;
1719 if( !highlightNetclassColors && drawingNetColorHighlights )
1722 if( drawingNetColorHighlights && !( aLine->
IsWire() || aLine->
IsBus() ) )
1725 if(
m_schSettings.m_OverrideItemColors && drawingNetColorHighlights )
1736 if( aLine->
IsNew() && drawingDangling )
1740 float width =
getLineWidth( aLine, drawingShadows, drawingNetColorHighlights );
1743 if( highlightNetclassColors )
1748 else if( drawingBusses )
1761 if( net && !net->IsEmpty() )
1768 color =
chain->GetColor().WithAlpha( color.
a );
1774 if( drawingNetColorHighlights )
1783 color = color.
WithAlpha( color.
a * highlightAlpha );
1786 if( ( drawingDangling || drawingShadows ) && !aLine->
IsNew() )
1791 COLOR4D indicatorColor( color );
1804 COLOR4D indicatorColor( color );
1815 if( drawingDangling )
1822 int textOffset =
KiROUND( textSize * 0.22 );
1827 pos.
y -= textOffset;
1833 pos.
x +=
KiROUND( textOffset * 1.2 );
1849 m_gal->SetIsStroke(
true );
1850 m_gal->SetIsFill(
false );
1851 m_gal->SetStrokeColor( color );
1852 m_gal->SetLineWidth( width );
1854 std::vector<VECTOR3I> curr_wire_shape;
1856 if( ( aLine->
IsWire() || aLine->
IsBus() ) && hopOverScale > 0.0 )
1858 double arcRadius = defaultLineWidth * hopOverScale;
1865 bool drawLineBody =
true;
1875 curr_wire_shape.emplace_back( lineStart.
x, lineStart.
y, 0 );
1876 curr_wire_shape.emplace_back( lineEnd.
x, lineEnd.
y, 0 );
1880 for(
size_t ii = 1; ii < curr_wire_shape.size(); ii++ )
1882 VECTOR2I start( curr_wire_shape[ii-1].x, curr_wire_shape[ii-1].y );
1884 if( curr_wire_shape[ii-1].z == 0 )
1887 VECTOR2I end( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
1893 VECTOR2I arc_middle( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
1895 VECTOR2I arc_end( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
1907 EDA_ANGLE angle1 = midAngle - startAngle;
1912 m_gal->DrawArc(
center, ( dstart -
center ).EuclideanNorm(), startAngle, angle );
1943 if(
static_cast<const SCH_RULE_AREA*
>( aShape )->IsDirectiveLabelOnlyArea() )
1965 switch( shape->GetShape() )
1969 SHAPE_ARC arc( shape->GetStart(), shape->GetArcMid(), shape->GetEnd(), 0 );
1973 if( shape->ShortenArcForEndings( startAngle, arcAngle, arc.
GetRadius(), lineWidth ) )
1980 m_gal->DrawCircle( shape->GetPosition(), shape->GetRadius() );
1984 if( shape->GetCornerRadius() > 0 )
1989 shape->GetRectangleWidth(),
1990 shape->GetRectangleHeight() ),
1991 shape->GetCornerRadius(),
true );
1994 m_gal->DrawPolygon( poly );
1998 m_gal->DrawRectangle( shape->GetPosition(), shape->GetEnd() );
2004 if( shape->GetPolyShape().OutlineCount() == 0 )
2008 std::deque<VECTOR2D> drawPts;
2010 if( hasEndings && !shape->IsClosed() )
2012 std::vector<VECTOR2I> pts;
2014 if( shape->GetShortenedBodyPolyPoints( outline, 0, pts, lineWidth ) )
2017 drawPts.emplace_back( pt );
2023 drawPts.emplace_back( pt );
2025 if( shape->IsClosed() )
2026 drawPts.emplace_back( outline.
CPoint( 0 ) );
2029 if( drawPts.size() >= 2 )
2030 m_gal->DrawPolygon( drawPts );
2039 if( std::optional<
BEZIER<double>> curve = shape->ShortenedBezierCurve( lineWidth ) )
2040 m_gal->DrawCurve( curve->Start, curve->C1, curve->C2, curve->End, shape->GetMaxError() );
2044 m_gal->DrawCurve( shape->GetStart(), shape->GetBezierC1(), shape->GetBezierC2(),
2052 m_gal->DrawEllipse( shape->GetEllipseCenter(), shape->GetEllipseMajorRadius(),
2053 shape->GetEllipseMinorRadius(), shape->GetEllipseRotation() );
2057 m_gal->DrawEllipseArc( shape->GetEllipseCenter(), shape->GetEllipseMajorRadius(),
2058 shape->GetEllipseMinorRadius(), shape->GetEllipseRotation(),
2059 shape->GetEllipseStartAngle(), shape->GetEllipseEndAngle() );
2069 if(
eeconfig()->m_Selection.fill_shapes )
2076 m_gal->SetIsFill(
true );
2078 m_gal->SetFillColor( color );
2082 m_gal->SetIsFill(
false );
2087 m_gal->SetIsStroke(
true );
2089 m_gal->SetStrokeColor( color );
2091 drawShape( aShape );
2109 m_gal->SetIsFill(
false );
2110 m_gal->SetIsStroke(
true );
2111 m_gal->SetStrokeColor( color );
2115 m_gal->DrawLine( seg.A, seg.B );
2124 m_gal->SetIsFill(
true );
2125 m_gal->SetIsStroke(
false );
2126 m_gal->SetFillColor( color );
2128 drawShape( aShape );
2133 wxFAIL_MSG( wxT(
"Unsupported fill type" ) );
2142 m_gal->SetIsFill(
true );
2143 m_gal->SetIsStroke(
false );
2144 m_gal->SetFillColor( color );
2146 drawShape( aShape );
2149 float lineWidth =
getLineWidth( aShape, drawingShadows );
2153 int lineWidthIU =
KiROUND( lineWidth );
2155 m_gal->SetIsFill(
false );
2156 m_gal->SetIsStroke(
true );
2157 m_gal->SetLineWidth( lineWidth );
2158 m_gal->SetStrokeColor( color );
2162 drawShape( aShape );
2168 for(
SHAPE* shape : shapes )
2174 m_gal->DrawLine( a + 1, b );
2176 m_gal->DrawLine( a, b );
2180 for(
SHAPE* shape : shapes )
2221 switch( aText->
Type() )
2251 bool transparentColor = !drawingShadows && color.
a <= 0.0;
2253 m_gal->SetStrokeColor( color );
2254 m_gal->SetFillColor( color );
2255 m_gal->SetHoverColor( color );
2265 float shadowWidth = 0.0f;
2267 if( drawingShadows )
2273 if( transparentColor )
2285 double shadowOffset = 0.0;
2298 pos.
y = bBox.
GetTop() - shadowOffset;
2301 wxFAIL_MSG( wxT(
"Indeterminate state legal only in dialogs." ) );
2310 pos.
x = bBox.
GetLeft() - shadowOffset;
2319 wxFAIL_MSG( wxT(
"Indeterminate state legal only in dialogs." ) );
2352 && !shownText.Contains( wxT(
"\n" ) ) )
2360 std::vector<std::unique_ptr<KIFONT::GLYPH>>* cache =
nullptr;
2386 switch( aText->
Type() )
2394 showAnchor = !
static_cast<const SCH_LABEL*
>( aText )->IsDangling();
2439 float borderWidth =
getLineWidth( aTextBox, drawingShadows );
2445 bool transparentColor = !drawingShadows && color.
a <= 0.0;
2447 m_gal->SetFillColor( color );
2448 m_gal->SetStrokeColor( color );
2449 m_gal->SetHoverColor( color );
2453 m_gal->SetIsFill(
true );
2454 m_gal->SetIsStroke(
false );
2455 m_gal->SetLineWidth( borderWidth );
2466 m_gal->SetIsFill(
true );
2467 m_gal->SetIsStroke(
false );
2468 m_gal->SetLineWidth( borderWidth );
2475 if( transparentColor )
2502 std::vector<std::unique_ptr<KIFONT::GLYPH>>* cache =
nullptr;
2532 if( transparency > 0.0 )
2533 borderColor = borderColor.
WithAlpha( borderColor.
a * ( 1.0 - transparency ) );
2537 borderColor = borderColor.
Mix( bg, 0.5f );
2541 m_gal->SetIsFill(
false );
2542 m_gal->SetIsStroke(
true );
2543 m_gal->SetStrokeColor( borderColor );
2544 m_gal->SetLineWidth( borderWidth );
2554 for(
SHAPE* shape : shapes )
2562 m_gal->DrawLine( a+1, b );
2564 m_gal->DrawLine( a, b );
2568 for(
SHAPE* shape : shapes )
2582 draw( cell, aLayer, aDimmed );
2596 if( lineWidth == 0 )
2605 m_gal->SetIsFill(
false );
2606 m_gal->SetIsStroke(
true );
2607 m_gal->SetStrokeColor( color );
2608 m_gal->SetLineWidth( (
float) lineWidth );
2612 m_gal->DrawLine( ptA, ptB );
2622 m_gal->DrawLine( a+1, b );
2624 m_gal->DrawLine( a, b );
2634 std::function<bool( wxString* )> symbolResolver =
2635 [&]( wxString* token ) ->
bool
2649 auto t1 = std::chrono::high_resolution_clock::now();
2652 std::optional<SCH_SHEET_PATH> optSheetPath;
2654 wxString variantName;
2661 "SCH_PAINTER::draw symbol %s: Current sheet path='%s', variant='%s', size=%zu, empty=%d",
2664 optSheetPath->Path().AsString(),
2665 optSheetPath->size(),
2666 optSheetPath->empty() ? 1 : 0 );
2669 SCH_SHEET_PATH* sheetPath = optSheetPath ? &optSheetPath.value() :
nullptr;
2670 bool DNP = aSymbol->
GetDNP( sheetPath, variantName );
2677 if( !drawingShadows ||
eeconfig()->m_Selection.draw_selected_children )
2680 draw( &field, aLayer, DNP );
2698 if( !originalSymbol )
2701 bool usingAlternateSymbol = ( originalSymbol != aSymbol->
GetLibSymbolRef().get()
2704 std::vector<SCH_PIN*> originalPins = originalSymbol->
GetGraphicalPins( unit, bodyStyle );
2706 if( usingAlternateSymbol && originalPins.empty() && bodyStyle > 1 )
2710 auto tCopy1 = std::chrono::high_resolution_clock::now();
2711 LIB_SYMBOL tempSymbol( *originalSymbol,
nullptr,
false );
2712 auto tCopy2 = std::chrono::high_resolution_clock::now();
2714 if( std::chrono::duration_cast<std::chrono::microseconds>( tCopy2 - tCopy1 ).count() > 100 )
2717 std::chrono::duration_cast<std::chrono::microseconds>( tCopy2 - tCopy1 ).count() );
2720 std::vector<SCH_PIN*> tempPins = tempSymbol.
GetGraphicalPins( unit, bodyStyle );
2722 if( usingAlternateSymbol && tempPins.empty() && bodyStyle > 1 )
2731 tempItem.SetFlags( aSymbol->
GetFlags() );
2752 std::vector<SCH_PIN*> symbolPins = aSymbol->
MapLibPins( originalPins, usingAlternateSymbol );
2758 for(
unsigned i = 0; i < tempPins.size(); ++ i )
2760 SCH_PIN* symbolPin = symbolPins[ i ];
2762 SCH_PIN* tempPin = tempPins[ i ];
2775 if( highlightedChain
2791 const wxString effective =
2794 if( effective != original )
2820 for(
unsigned i = 0; i < tempPins.size(); ++i )
2822 SCH_PIN* symbolPin = symbolPins[ i ];
2824 SCH_PIN* tempPin = tempPins[ i ];
2848 margins.
x = std::max( margins.
x * 0.6, margins.
y * 0.3 );
2849 margins.
y = std::max( margins.
y * 0.6, margins.
x * 0.3 );
2856 m_gal->AdvanceDepth();
2857 m_gal->SetIsStroke(
true );
2858 m_gal->SetIsFill(
true );
2859 m_gal->SetStrokeColor( marker_color );
2860 m_gal->SetFillColor( marker_color );
2862 m_gal->DrawSegment( pt1, pt2, strokeWidth );
2863 std::swap( pt1.
x, pt2.
x );
2864 m_gal->DrawSegment( pt1, pt2, strokeWidth );
2876 m_gal->AdvanceDepth();
2877 m_gal->SetIsStroke(
true );
2878 m_gal->SetIsFill(
true );
2879 m_gal->SetStrokeColor( marker_color );
2880 m_gal->SetFillColor( marker_color );
2887 int offset = 2 * strokeWidth;
2896 m_gal->AdvanceDepth();
2897 m_gal->SetFillColor( marker_color );
2901 auto t2 = std::chrono::high_resolution_clock::now();
2903 if( std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count() > 100 )
2906 std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count() );
2931 if( std::find( layers.begin(), layers.end(), aLayer ) == layers.end() )
2951 bool transparentColor = !drawingShadows && color.
a <= 0.0;
2964 if( shownText.IsEmpty() )
3006 float shadowWidth = 0.0f;
3008 if( drawingShadows )
3014 m_gal->SetStrokeColor( color );
3015 m_gal->SetFillColor( color );
3016 m_gal->SetHoverColor( color );
3018 if( transparentColor )
3051 std::vector<std::unique_ptr<KIFONT::GLYPH>>* cache =
nullptr;
3098 bool parentMoving = fieldParent && fieldParent->
IsMoving();
3108 else if( aField->
IsSelected() && !parentMoving )
3124 if( !drawingShadows ||
eeconfig()->m_Selection.draw_selected_children )
3127 draw( &field, aLayer,
false );
3138 if( drawingDangling )
3152 bool transparentColor = !drawingShadows && color.
a <= 0.0;
3154 if( !transparentColor )
3156 std::vector<VECTOR2I> pts;
3157 std::deque<VECTOR2D> pts2;
3162 pts2.emplace_back(
VECTOR2D( p.x, p.y ) );
3164 m_gal->SetIsStroke(
true );
3166 m_gal->SetStrokeColor( color );
3168 if( drawingShadows )
3171 m_gal->SetFillColor( color );
3172 m_gal->DrawPolygon( pts2 );
3176 m_gal->SetIsFill(
false );
3177 m_gal->DrawPolyline( pts2 );
3181 draw(
static_cast<const SCH_TEXT*
>( aLabel ), aLayer,
false );
3194 if( !drawingShadows ||
eeconfig()->m_Selection.draw_selected_children )
3197 draw( &field, aLayer,
false );
3208 if( drawingDangling )
3221 draw(
static_cast<const SCH_TEXT*
>( aLabel ), aLayer,
false );
3234 if( !( drawingShadows || drawingDangling ) ||
eeconfig()->m_Selection.draw_selected_children )
3237 draw( &field, aLayer,
false );
3248 if( drawingDangling )
3261 bool transparentColor = !drawingShadows && color.
a <= 0.0;
3263 if( !transparentColor )
3265 std::vector<VECTOR2I> i_pts;
3266 std::deque<VECTOR2D> d_pts;
3270 for(
const VECTOR2I& i_pt : i_pts )
3271 d_pts.emplace_back(
VECTOR2D( i_pt.x, i_pt.y ) );
3273 m_gal->SetIsFill(
true );
3275 m_gal->SetIsStroke(
true );
3277 m_gal->SetStrokeColor( color );
3278 m_gal->DrawPolyline( d_pts );
3281 draw(
static_cast<const SCH_TEXT*
>( aLabel ), aLayer, aDimmed );
3295 if( !drawingShadows ||
eeconfig()->m_Selection.draw_selected_children )
3298 draw( &field, aLayer,
false );
3321 if( !drawingShadows && color.
a <= 0.0 )
3324 std::vector<VECTOR2I> pts;
3325 std::deque<VECTOR2D> pts2;
3330 pts2.emplace_back(
VECTOR2D( p.x, p.y ) );
3332 m_gal->SetIsFill(
false );
3333 m_gal->SetFillColor( color );
3334 m_gal->SetIsStroke(
true );
3336 m_gal->SetStrokeColor( color );
3340 m_gal->DrawLine( pts2[0], pts2[1] );
3341 m_gal->SetIsFill(
true );
3342 m_gal->DrawCircle( pts2[2], ( pts2[2] - pts2[1] ).EuclideanNorm() );
3346 m_gal->DrawLine( pts2[0], pts2[1] );
3347 m_gal->DrawCircle( pts2[2], ( pts2[2] - pts2[1] ).EuclideanNorm() );
3351 m_gal->DrawPolyline( pts2 );
3366 DNP = aSheet->
GetDNP( sheetPath, variant );
3377 if( !drawingShadows ||
eeconfig()->m_Selection.draw_selected_children )
3380 draw( &field, aLayer, DNP );
3383 draw( sheetPin, aLayer, DNP );
3404 if( backgroundColor.
a > 0.0 )
3407 m_gal->SetIsFill(
true );
3408 m_gal->SetIsStroke(
false );
3410 m_gal->DrawRectangle( pos, pos + size );
3418 m_gal->SetIsStroke(
true );
3420 m_gal->SetIsFill(
false );
3422 m_gal->DrawRectangle( pos, pos + size );
3434 margins.
x = std::max( margins.
x * 0.6, margins.
y * 0.3 );
3435 margins.
y = std::max( margins.
y * 0.6, margins.
x * 0.3 );
3442 m_gal->AdvanceDepth();
3443 m_gal->SetIsStroke(
true );
3444 m_gal->SetIsFill(
true );
3448 m_gal->DrawSegment( pt1, pt2, strokeWidth );
3449 std::swap( pt1.
x, pt2.
x );
3450 m_gal->DrawSegment( pt1, pt2, strokeWidth );
3462 m_gal->AdvanceDepth();
3463 m_gal->SetIsStroke(
true );
3464 m_gal->SetIsFill(
true );
3473 int offset = 2 * strokeWidth;
3482 m_gal->AdvanceDepth();
3499 m_gal->SetIsStroke(
true );
3502 m_gal->SetIsFill(
false );
3520 bool drawingBusses = aLayer ==
LAYER_BUS;
3525 bool highlightNetclassColors =
false;
3528 highlightNetclassColors = eeschemaCfg->m_Selection.highlight_netclass_colors;
3530 if( !highlightNetclassColors && drawingNetColorHighlights )
3533 if(
m_schSettings.m_OverrideItemColors && drawingNetColorHighlights )
3561 if( highlightNetclassColors )
3566 else if( drawingBusses )
3570 if( drawingNetColorHighlights )
3580 if( drawingDangling )
3582 m_gal->SetIsFill(
false );
3583 m_gal->SetIsStroke(
true );
3598 draw( &line, aLayer );
3611 auto t1 = std::chrono::high_resolution_clock::now();
3619 if( img_scale != 1.0 )
3630 m_gal->SetIsStroke(
true );
3631 m_gal->SetStrokeColor( color );
3633 m_gal->SetIsFill(
false );
3641 bm_size.
x /= img_scale;
3642 bm_size.
y /= img_scale;
3643 const VECTOR2D origin( -bm_size.
x / 2.0, -bm_size.
y / 2.0 );
3646 m_gal->DrawRectangle( origin,
end );
3651 auto t2 = std::chrono::high_resolution_clock::now();
3653 if( std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count() > 100 )
3656 std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count() );
3675 m_gal->SetIsFill( !drawingShadows );
3676 m_gal->SetFillColor( color );
3677 m_gal->SetIsStroke( drawingShadows );
3679 m_gal->SetStrokeColor( color );
3684 m_gal->DrawPolygon( polygon );
3694 const bool drawingShadows =
false;
3715 m_gal->SetStrokeColor( color );
3723 m_gal->DrawLine( topLeft, topLeft + width );
3724 m_gal->DrawLine( topLeft + width, topLeft + width + height );
3725 m_gal->DrawLine( topLeft + width + height, topLeft + height );
3726 m_gal->DrawLine( topLeft + height, topLeft );
3730 if(
name.IsEmpty() )
3734 int scaledSize = abs(
KiROUND(
m_gal->GetScreenWorldMatrix().GetScale().x * ptSize ) );
3735 int unscaledSize =
schIUScale.MilsToIU( ptSize );
3738 int textSize = ( scaledSize + ( unscaledSize * 2 ) ) / 3;
3744 m_gal->DrawLine( topLeft, topLeft - titleHeight );
3745 m_gal->DrawLine( topLeft - titleHeight, topLeft + width - titleHeight );
3746 m_gal->DrawLine( topLeft + width - titleHeight, topLeft + width );
3763 LINE_STYLE aLineStyle,
bool aDrawDirectLine,
int aWidth )
3765 if( aDrawDirectLine )
3767 m_gal->DrawLine( aStartPoint, aEndPoint );
constexpr EDA_IU_SCALE schIUScale
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
std::optional< BOX2I > OPT_BOX2I
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
Generic cubic Bezier representation.
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 coord_type GetY() const
constexpr size_type GetWidth() const
constexpr Vec Centre() const
constexpr coord_type GetX() const
constexpr size_type GetHeight() const
constexpr coord_type GetLeft() const
constexpr const Vec & GetOrigin() const
constexpr coord_type GetRight() const
constexpr coord_type GetTop() const
constexpr void Offset(coord_type dx, coord_type dy)
constexpr coord_type GetBottom() const
Represent basic circle geometry with utility geometry functions.
VECTOR2I Center
Public to make access simpler.
int Radius
Public to make access simpler.
bool IsHorizontal() const
A base class for most all the KiCad significant classes used in schematics and boards.
VECTOR2I GetRolloverPos() const
virtual const BOX2I GetBoundingBox() const
Return the orthogonal bounding box of this object for display purposes.
void SetFlags(EDA_ITEM_FLAGS aMask)
KICAD_T Type() const
Returns the type of object.
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
void SetNetHighlighted(bool aHighlighted)
EDA_ITEM * GetParent() const
bool HasFlag(EDA_ITEM_FLAGS aFlag) const
bool IsBrightened() const
bool IsNetHighlighted() const
Net highlighting must not clear brightening owned by find or picker tools.
bool IsForceVisible() const
EDA_ITEM_FLAGS GetFlags() const
EDA_ANGLE GetAngle() const
static bool ShortenSegmentForEndings(VECTOR2I &aStart, VECTOR2I &aEnd, const LINE_ENDING &aStartEnding, const LINE_ENDING &aEndEnding, int aLineWidth)
Shorten a segment body for line endings.
FILL_T GetFillMode() const
void GetEndingTangents(EDA_ANGLE &aStartTangent, EDA_ANGLE &aEndTangent, int aLineWidth=0) const
Compute outward-facing tangent angles at the start and end of the shape.
std::vector< SHAPE * > MakeEffectiveShapesForStroking(int aLineWidth=-1) const
Make a set of SHAPE objects to hand to STROKE_PARAMS::Stroke().
const std::vector< SEG > & GetHatchLines() const
bool GetLineEndingEndpoints(VECTOR2I &aStartPoint, VECTOR2I &aEndPoint) const
Return the source endpoints used to place line endings.
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
COLOR4D GetFillColor() const
const LINE_ENDING & GetStartEnding() const
const LINE_ENDING & GetEndEnding() const
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
COLOR4D GetTextColor() const
virtual VECTOR2I GetTextPos() const
void SetActiveUrl(const wxString &aUrl) const
virtual const wxString & GetText() const
Return the string associated with the text object.
virtual bool IsVisible() const
std::vector< std::unique_ptr< KIFONT::GLYPH > > * GetRenderCache(const KIFONT::FONT *aFont, const wxString &forResolvedText, const VECTOR2I &aOffset={ 0, 0 }) const
virtual EDA_ANGLE GetDrawRotation() const
virtual VECTOR2I GetDrawPos() const
virtual bool HasHyperlink() const
wxString GetHyperlink() const
virtual KIFONT::FONT * GetDrawFont(const RENDER_SETTINGS *aSettings) const
bool HasTextVars() const
Indicates the ShownText has text var references which need to be processed.
virtual EDA_ANGLE GetTextAngle() const
const TEXT_ATTRIBUTES & GetAttributes() const
virtual void SetText(const wxString &aText)
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
VECTOR2I StringBoundaryLimits(const wxString &aText, const VECTOR2I &aSize, int aThickness, bool aBold, bool aItalic, const METRICS &aFontMetrics) const
Compute the boundary limits of aText (the bounding box of all shapes).
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.
COLOR4D & Invert()
Makes the color inverted, alpha remains the same.
COLOR4D & Darken(double aFactor)
Makes the color darker by a given factor.
std::shared_ptr< wxString > m_text
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.
COLOR4D & Desaturate()
Removes color (in HSL model)
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.
virtual void DrawPolygon(const std::deque< VECTOR2D > &aPointList)
Draw a polygon.
virtual void SetIsFill(bool aIsFillEnabled)
Enable/disable fill.
virtual void Rotate(double aAngle)
Rotate the context.
void SetVerticalJustify(const GR_TEXT_V_ALIGN_T aVerticalJustify)
void SetHorizontalJustify(const GR_TEXT_H_ALIGN_T aHorizontalJustify)
virtual void SetFillColor(const COLOR4D &aColor)
Set the fill color.
virtual void Translate(const VECTOR2D &aTranslation)
Translate the context.
virtual void Restore()
Restore the context.
virtual void SetLineWidth(float aLineWidth)
Set the line width.
virtual void SetStrokeColor(const COLOR4D &aColor)
Set the stroke color.
virtual void SetIsStroke(bool aIsStrokeEnabled)
Enable/disable stroked outlines.
virtual void DrawLine(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint)
Draw a line.
void SetGlyphSize(const VECTOR2I aSize)
virtual void DrawGlyphs(const std::vector< std::unique_ptr< KIFONT::GLYPH > > &aGlyphs)
Draw polygons representing font glyphs.
virtual void DrawArc(const VECTOR2D &aCenterPoint, double aRadius, const EDA_ANGLE &aStartAngle, const EDA_ANGLE &aAngle)
Draw an arc.
virtual void BitmapText(const wxString &aText, const VECTOR2I &aPosition, const EDA_ANGLE &aAngle)
Draw a text using a bitmap font.
virtual void Save()
Save the context.
double GetWorldScale() const
Get the world scale.
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...
virtual bool Draw(const VIEW_ITEM *, int) override
Takes an instance of VIEW_ITEM and passes it to a function that knows how to draw the item.
void drawPinDanglingIndicator(const SCH_PIN &aPin, const COLOR4D &aColor, bool aDrawingShadows, bool aBrightened)
float getTextThickness(const SCH_ITEM *aItem) const
void drawLocalPowerIcon(const VECTOR2D &aPos, double aSize, bool aRotate, const COLOR4D &aColor, bool aDrawingShadows, bool aBrightened)
Draw an local power pin indicator icon.
float getShadowWidth(bool aForHighlight) const
COLOR4D getRenderColor(const SCH_ITEM *aItem, int aLayer, bool aDrawingShadows, bool aDimmed=false, bool aIgnoreNets=false) const
int externalPinDecoSize(const SCH_PIN &aPin)
KIFONT::FONT * getFont(const EDA_TEXT *aText) const
void draw(const EDA_ITEM *, int, bool aDimmed)
wxString expandLibItemTextVars(const wxString &aSourceText, const SCH_SYMBOL *aSymbolContext)
static std::vector< KICAD_T > g_ScaledSelectionTypes
void drawLine(const VECTOR2I &aStartPoint, const VECTOR2I &aEndPoint, LINE_STYLE aLineStyle, bool aDrawDirectLine=false, int aWidth=0)
int getOperatingPointTextSize() const
float getLineWidth(const SCH_ITEM *aItem, bool aDrawingShadows, bool aDrawingWireColorHighlights=false) const
void triLine(const VECTOR2D &a, const VECTOR2D &b, const VECTOR2D &c)
std::set< const SCH_PIN * > m_netChainTerminalPins
Temporary pins standing in for the highlighted chain's terminals during a symbol draw.
SCH_RENDER_SETTINGS m_schSettings
void drawAnchor(const VECTOR2I &aPos, bool aDrawingShadows)
Draw anchor indicating the anchor position of text objects, local labels, or fields.
bool nonCached(const EDA_ITEM *aItem)
Indicates the item is drawn on a non-cached layer in OpenGL.
void drawDanglingIndicator(const VECTOR2I &aPos, const COLOR4D &aColor, int aWidth, bool aDangling, bool aDrawingShadows, bool aBrightened)
Draw the target (an open square) for a wire or label which has no connection or is being moved.
void drawItemBoundingBox(const EDA_ITEM *aItem)
int internalPinDecoSize(const SCH_PIN &aPin)
bool isUnitAndConversionShown(const SCH_ITEM *aItem) const
An abstract base class for deriving all objects that can be added to a VIEW.
double GetForcedTransparency() const
wxString AsString() const
Define a library symbol object.
static LIB_SYMBOL * GetDummy()
Return a dummy LIB_SYMBOL, used when one is missing in the schematic.
LIB_ITEMS_CONTAINER & GetDrawItems()
Return a reference to the draw item list.
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
std::vector< SCH_PIN * > GetGraphicalPins(int aUnit=0, int aBodyStyle=0) const override
Graphical pins: Return schematic pin objects as drawn (unexpanded), filtered by unit/body.
void Draw(KIGFX::GAL &aGal, const VECTOR2I &aPoint, const EDA_ANGLE &aTangent, double aLineWidth, const KIGFX::COLOR4D &aColor) const
LINE_ENDING_STYLE GetStyle() const
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...
VECTOR2< T > GetScale() const
Get the scale components of the matrix.
A pin layout helper is a class that manages the layout of the parts of a pin on a schematic symbol:
OPT_BOX2I GetAltIconBBox()
Get the box of the alt mode icon, if there is one.
OPT_BOX2I GetPinNumberBBox()
Get the bounding box of the pin number, if there is one.
std::optional< TEXT_INFO > GetPinNameInfo(int aShadowWidth)
Get the text info for the pin name.
std::optional< TEXT_INFO > GetPinElectricalTypeInfo(int aShadowWidth)
CIRCLE GetDanglingIndicator() const
Gets the dangling indicator geometry for this pin, if the pin were to be dangling.
std::optional< TEXT_INFO > GetPinNumberInfo(int aShadowWidth)
void SetRenderParameters(int aNameThickness, int aNumberThickness, bool aShowElectricalType, bool aShowAltIcons)
A REFERENCE_IMAGE is a wrapper around a BITMAP_IMAGE that is displayed in an editor as a reference fo...
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.
double GetHopOverScale()
Accessor that computes the current hop-over size.
SCHEMATIC_SETTINGS & Settings() const
SCH_SCREEN * GetCurrentScreen() const
Object to handle a bitmap image that can be inserted in a schematic.
VECTOR2I GetPosition() const override
REFERENCE_IMAGE & GetReferenceImage()
Base class for a bus or wire entry.
bool IsStartDangling() const
VECTOR2I GetPosition() const override
bool IsEndDangling() const
virtual STROKE_PARAMS GetStroke() const override
int GetPenWidth() const override
LINE_STYLE GetEffectiveLineStyle() const
Class for a wire to bus entry.
Marks the canvas reads of this thread, which are item drawing and view bounds.
void CreateGraphicShape(const RENDER_SETTINGS *aSettings, std::vector< VECTOR2I > &aPoints, const VECTOR2I &aPos) const override
Calculate the graphic shape (a polygon) associated to the text.
virtual bool IsDangling() const override
Determines dangling state from connectivity and cached connected rule areas.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
VECTOR2I GetPosition() const override
wxString GetShownText(const SCH_SHEET_PATH *aPath, RESOLUTION_CONTEXT aContext, const wxString &aVariantName=wxEmptyString, int aDepth=0) const
std::vector< int > ViewGetLayers() const override
Return the all the layers within the VIEW the object is painted on.
std::vector< std::unique_ptr< KIFONT::GLYPH > > * GetRenderCache(const wxString &forResolvedText, const VECTOR2I &forPosition, TEXT_ATTRIBUTES &aAttrs) const
VECTOR2I GetParentPosition() const
void CreateGraphicShape(const RENDER_SETTINGS *aRenderSettings, std::vector< VECTOR2I > &aPoints, const VECTOR2I &aPos) const override
Calculate the graphic shape (a polygon) associated to the text.
VECTOR2I GetSchematicTextOffset(const RENDER_SETTINGS *aSettings) const override
This offset depends on the orientation, the type of text, and the area required to draw the associate...
A set of SCH_ITEMs (i.e., without duplicates).
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
void CreateGraphicShape(const RENDER_SETTINGS *aSettings, std::vector< VECTOR2I > &aPoints, const VECTOR2I &aPos) const override
Calculate the graphic shape (a polygon) associated to the text.
Base class for any item which can be embedded within the SCHEMATIC container class,...
const SYMBOL * GetParentSymbol() const
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
std::vector< int > ViewGetLayers() const override
Return the layers the item is drawn on (which may be more than its "home" layer)
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
bool RenderAsBitmap(double aWorldScale) const override
bool IsConnectivityDirty() const
std::optional< wxString > GetConnectionName(const SCH_SHEET_PATH *aSheet=nullptr, bool aLocal=false, bool aIgnoreSheet=false) const
Return the active connection name; absent for missing or stale published rows.
SCH_CONNECTION * Connection(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve the connection associated with this object in the given sheet.
wxString ResolveText(const wxString &aText, const SCH_SHEET_PATH *aPath, int aDepth=0) const
wxString GetClass() const override
Return the class name.
const KIFONT::METRICS & GetFontMetrics() const
bool HasBusConnection(const SCH_SHEET_PATH *aSheet=nullptr) const
int GetEffectivePenWidth(const SCH_RENDER_SETTINGS *aSettings) const
bool IsType(const std::vector< KICAD_T > &aScanTypes) const override
Check whether the item is one of the listed types.
int GetEffectiveDiameter() const
VECTOR2I GetPosition() const override
bool IsDangling() const override
COLOR4D GetLabelColor() const
LABEL_FLAG_SHAPE GetShape() const
std::vector< SCH_FIELD > & GetFields()
Segment description base class to describe items which have 2 end points (track, wire,...
void SetStartPoint(const VECTOR2I &aPosition)
std::vector< VECTOR3I > BuildWireWithHopShape(const SCH_SCREEN *aScreen, double aArcRadius) const
For wires only: build the list of points to draw the shape using segments and 180 deg arcs Points are...
bool IsWire() const
Return true if the line is a wire.
bool IsStartDangling() const
void SetLineWidth(const int aSize)
LINE_STYLE GetEffectiveLineStyle() const
const LINE_ENDING & GetEndEnding() const
VECTOR2I GetMidPoint() const
VECTOR2I GetEndPoint() const
VECTOR2I GetStartPoint() const
bool IsEndDangling() const
bool IsBus() const
Return true if the line is a bus.
void SetLineStyle(const LINE_STYLE aStyle)
virtual void SetStroke(const STROKE_PARAMS &aStroke) override
bool IsGraphicLine() const
Return if the line is a graphic (non electrical line)
void SetLineColor(const KIGFX::COLOR4D &aColor)
const LINE_ENDING & GetStartEnding() const
void SetEndPoint(const VECTOR2I &aPosition)
const wxString & GetOperatingPoint() const
SCH_LAYER_ID GetColorLayer() const
VECTOR2I GetPosition() const override
A net chain is a collection of nets that are connected together through passive components.
bool IsTerminal(const KIID &aPin, const KIID_PATH &aSheet) const
VECTOR2I GetPosition() const override
int GetNumberTextSize() const
void SetNumber(const wxString &aNumber)
const wxString & GetOperatingPoint() const
void SetName(const wxString &aName)
bool IsGlobalPower() const
Return whether this pin forms a global power connection: i.e., is part of a power symbol and of type ...
VECTOR2I GetPinRoot() const
void SetFlipStackedTextSide(bool aFlip)
bool IsDangling() const override
void SetShape(GRAPHIC_PINSHAPE aShape)
VECTOR2I GetPosition() const override
int GetNameTextSize() const
const wxString & GetShownName() const
PIN_LAYOUT_CACHE & GetLayoutCache() const
Get the layout cache associated with this pin.
const wxString & GetRemappedFromNumber() const
Transient, render-only original pin number for a pad-remapped pin (issue #2282).
void SetOperatingPoint(const wxString &aText)
void SetType(ELECTRICAL_PINTYPE aType)
void SetRemappedFromNumber(const wxString &aNumber)
wxString GetEffectivePadNumber(const SCH_SHEET_PATH &aSheet, const wxString &aVariantName, const LIB_ID &aFootprintLibId, const std::set< wxString > *aFootprintPadNumbers, PAD_RESOLUTION *aState=nullptr) const
Resolve the footprint pad number this symbol pin lands on (issue #2282).
const wxString & GetShownNumber() const
GRAPHIC_PINSHAPE GetShape() const
ELECTRICAL_PINTYPE GetType() const
std::vector< SHAPE * > MakeEffectiveShapes(bool aEdgeOnly=false) const override
Make a set of SHAPE objects representing the SCH_SHAPE.
void UpdateHatching() const override
LINE_STYLE GetEffectiveLineStyle() const
int GetHatchLineWidth() const override
STROKE_PARAMS GetStroke() const override
VECTOR2I GetPosition() const override
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
Define a sheet pin (label) used in sheets to create hierarchical schematics.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
std::vector< SCH_FIELD > & GetFields()
Return a reference to the vector holding the sheet's fields.
bool GetExcludedFromSim(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
VECTOR2I GetPosition() const override
const BOX2I GetBodyBoundingBox() const
Return a bounding box for the sheet body but not the fields.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
KIGFX::COLOR4D GetBorderColor() const
bool GetDNP(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
Set or clear the 'Do Not Populate' flags.
std::vector< SCH_SHEET_PIN * > & GetPins()
KIGFX::COLOR4D GetBackgroundColor() const
bool GetExcludedFromSim(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
BOX2I GetBodyAndPinsBoundingBox() const override
Return a bounding box for the symbol body and pins but not the fields.
std::vector< SCH_PIN * > MapLibPins(const std::vector< SCH_PIN * > &aLibPins, bool aByNumber) const
Map pins of an effective library symbol to this symbol's instance pins.
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
VECTOR2I GetPosition() const override
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the symbol.
const LIB_SYMBOL * GetEffectiveLibSymbol(const SCH_SHEET_PATH *aPath=nullptr) const
Return the library symbol to use for rendering and bounding box calculations.
static void BuildLocalPowerIconShape(std::vector< SCH_SHAPE > &aShapeList, const VECTOR2D &aPos, double aSize, double aLineWidth, bool aHorizontal)
Build the local power pin indicator icon shape, at coordinate aPos.
int GetUnitSelection(const SCH_SHEET_PATH *aSheet) const
Return the instance-specific unit selection for the given sheet path.
int GetOrientation() const override
Get the display symbol orientation.
bool IsSymbolLikePowerLocalLabel() const
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
BOX2I GetBodyBoundingBox() const override
Return a bounding box for the symbol body but not the pins or fields.
virtual bool GetDNP(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
Set or clear the 'Do Not Populate' flag.
std::vector< SCH_TABLECELL * > GetCells() const
void DrawBorders(const std::function< void(const VECTOR2I &aPt1, const VECTOR2I &aPt2, const STROKE_PARAMS &aStroke)> &aCallback) const
virtual wxString GetShownText(const RENDER_SETTINGS *aSettings, const SCH_SHEET_PATH *aPath, RESOLUTION_CONTEXT aContext, int aDepth=0) const
VECTOR2I GetDrawPos() const override
VECTOR2I GetPosition() const override
VECTOR2I GetOffsetToMatchSCH_FIELD(SCH_RENDER_SETTINGS *aRenderSettings) const
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
virtual wxString GetShownText(const SCH_SHEET_PATH *aPath, RESOLUTION_CONTEXT aContext, int aDepth=0) const
virtual VECTOR2I GetSchematicTextOffset(const RENDER_SETTINGS *aSettings) const
This offset depends on the orientation, the type of text, and the area required to draw the associate...
EDA_ANGLE GetCentralAngle() const
Get the "central angle" of the arc - this is the angle at the point of the "pie slice".
EDA_ANGLE GetStartAngle() const
const VECTOR2I & GetCenter() const
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
const std::vector< VECTOR2I > & CPoints() const
Represent a set of closed polygons.
int AddOutline(const SHAPE_LINE_CHAIN &aOutline)
Adds a new outline to the set and returns its index.
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)
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.
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...
void BooleanSubtract(const SHAPE_POLY_SET &b)
Perform boolean polyset difference.
const BOX2I BBox(int aClearance=0) const override
Compute a bounding box of the shape, with a margin of aClearance a collision.
An abstract shape on 2D plane.
Simple container to manage line stroke parameters.
LINE_STYLE GetLineStyle() const
KIGFX::COLOR4D GetColor() 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)
const TRANSFORM & GetTransform() const
GR_TEXT_H_ALIGN_T m_Halign
GR_TEXT_V_ALIGN_T m_Valign
wxString ExpandTextVars(const wxString &aSource, const PROJECT *aProject, RESOLUTION_CONTEXT aContext)
#define DANGLING_SYMBOL_SIZE
The size of the rectangle indicating an unconnected wire or label.
#define DEFAULT_LINE_WIDTH_MILS
The default line width in mils. (can be changed in preference menu)
#define UNSELECTED_END_SIZE
The size of the rectangle indicating a connected, unselected wire end.
#define TEXT_ANCHOR_SIZE
The size of the rectangle indicating the anchor of a text object (including fields)
static constexpr EDA_ANGLE ANGLE_0
static constexpr EDA_ANGLE ANGLE_90
static constexpr EDA_ANGLE ANGLE_VERTICAL
static constexpr EDA_ANGLE ANGLE_HORIZONTAL
static constexpr EDA_ANGLE ANGLE_270
static constexpr EDA_ANGLE ANGLE_180
@ FILLED_WITH_BG_BODYCOLOR
@ FILLED_SHAPE
Fill with object color.
#define IS_SHOWN_AS_BITMAP
#define ENDPOINT
ends. (Used to support dragging.)
#define IS_DANGLING
indicates a pin is dangling
#define STARTPOINT
When a line is selected, these flags indicate which.
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
int GetPenSizeForDemiBold(int aTextSize)
int GetPenSizeForNormal(int aTextSize)
int ClampTextPenSize(int aPenSize, int aSize, bool aStrict)
Pen width should not allow characters to become cluttered up in their own fatness.
const wxChar *const traceSchPainter
Flag to enable debug output of schematic painter operations.
@ LAYER_DRAW_BITMAPS
Draw images.
SCH_LAYER_ID
Eeschema drawing layers.
@ LAYER_SHAPES_BACKGROUND
@ LAYER_EXCLUDED_FROM_SIM
@ LAYER_NET_COLOR_HIGHLIGHT
@ LAYER_DEVICE_BACKGROUND
@ LAYER_SELECTION_SHADOWS
@ LAYER_SCHEMATIC_BACKGROUND
#define UNIMPLEMENTED_FOR(type)
MATRIX3x3< double > MATRIX3x3D
The Cairo implementation of the graphics abstraction layer.
static void drawCache(KIGFX::GAL &aGal, std::vector< std::unique_ptr< KIFONT::GLYPH > > *aCache, float aStrokeWidth, float aShadowWidth)
static void bitmapText(KIGFX::GAL &aGal, const wxString &aText, const VECTOR2D &aPosition, const TEXT_ATTRIBUTES &aAttrs)
EESCHEMA_SETTINGS * eeconfig()
static void drawText(KIGFX::GAL &aGal, const wxString &aText, const VECTOR2D &aPosition, const TEXT_ATTRIBUTES &aAttrs, float aShadowWidth, const KIFONT::METRICS &aFontMetrics, std::optional< VECTOR2I > aMousePos=std::nullopt, wxString *aActiveUrl=nullptr)
static void knockoutText(KIGFX::GAL &aGal, const wxString &aText, const VECTOR2D &aPosition, const TEXT_ATTRIBUTES &aAttrs, const KIFONT::METRICS &aFontMetrics)
static void drawAltPinModesIcon(GAL &aGal, const VECTOR2D &aPos, double aSize, bool aBaseSelected, bool aRotate, int aExtraLineWidth, const COLOR4D &aColor)
Draw an alternate pin mode indicator icon.
static bool isFieldsLayer(int aLayer)
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
@ PT_NC
not connected (must be left open)
#define TARGET_BUSENTRY_RADIUS
Class to handle a set of SCH_ITEMs.
#define BITMAP_FONT_SIZE_THRESHOLD
#define TARGET_PIN_RADIUS
Utility functions for working with shapes.
wxString GetDefaultVariantName()
void wxStringSplit(const wxString &aText, wxArrayString &aStrings, wxChar aSplitter)
Split aString to a string list separated at aSplitter.
int PrintableCharCount(const wxString &aString)
Return the number of printable (ie: non-formatting) chars.
LINE_STYLE
Dashed line types.
bool show_remapped_pin_numbers
int highlight_netclass_colors_thickness
GR_TEXT_H_ALIGN_T m_HAlign
GR_TEXT_V_ALIGN_T m_VAlign
@ VALUE
Field Value of part, i.e. "3.3K".
KIBIS top(path, &reporter)
const SHAPE_LINE_CHAIN chain
@ GR_TEXT_H_ALIGN_INDETERMINATE
wxLogTrace helper definitions.
const VECTOR2I CalcArcCenter(const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd)
Determine the center of an arc or circle given three points on its circumference.
constexpr int sign(T val)
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D