120 draw( item, aLayer,
false );
129#ifdef CONNECTIVITY_DEBUG
131 auto sch_item =
dynamic_cast<const SCH_ITEM*
>( aItem );
132 auto conn = sch_item ? sch_item->
Connection( *g_CurrentSheet ) :
nullptr;
137 auto label = conn->Name(
true );
142 m_canvas->SetLineWidth( Mils2ui( 2 ) );
143 m_canvas->SetGlyphSize(
VECTOR2D( Mils2ui( 20 ), Mils2ui( 20 ) ) );
144 m_canvas->StrokeText( *m_canvas, conn->Name(
true ), pos, 0.0, 0 );
152 switch( aItem->
Type() )
158 drawBoundingBox =
false;
159 draw(
static_cast<const SCH_PIN*
>( aItem ), aLayer, aDimmed );
171 draw(
static_cast<const SCH_SHAPE*
>( aItem ), aLayer, aDimmed );
174 draw(
static_cast<const SCH_SHAPE*
>( aItem ), aLayer, aDimmed );
177 draw(
static_cast<const SCH_TEXT*
>( aItem ), aLayer, aDimmed );
183 draw(
static_cast<const SCH_TABLE*
>( aItem ), aLayer, aDimmed );
186 draw(
static_cast<const SCH_LABEL*
>( aItem ), aLayer, aDimmed );
192 draw(
static_cast<const SCH_FIELD*
>( aItem ), aLayer, aDimmed );
228 if( drawBoundingBox )
244 box =
static_cast<const SCH_SYMBOL*
>( aItem )->GetBodyBoundingBox();
246 m_gal->SetIsFill(
false );
247 m_gal->SetIsStroke(
true );
249 :
COLOR4D( 0.2, 0.2, 0.2, 1 ) );
301 return (
float) std::fabs( matrix.
GetScale().
x * milsWidth ) +
schIUScale.MilsToIU( milsWidth );
306 bool aDimmed,
bool aIgnoreNets )
const
308 auto isBackgroundLayer =
325 color =
static_cast<const SCH_LINE*
>( aItem )->GetLineColor();
333 color =
static_cast<const SCH_JUNCTION*
>( aItem )->GetJunctionColor();
339 if( isBackgroundLayer( aLayer ) )
348 if( isBackgroundLayer( aLayer ) )
371 wxFAIL_MSG( wxT(
"Unsupported fill type" ) );
380 else if( isSymbolChild )
391 else if( aItem->
IsType( { SCH_LABEL_LOCATE_ANY_T } ) )
397 else if( aIgnoreNets )
404 color =
static_cast<const SCH_FIELD*
>( aItem )->GetFieldColor();
410 if( isBackgroundLayer( aLayer ) )
415 else if(
const EDA_TEXT* otherTextItem =
dynamic_cast<const EDA_TEXT*
>( aItem ) )
418 color = otherTextItem->GetTextColor();
429 if( isBackgroundLayer( aLayer) )
454 if( aDrawingShadows )
461 else if( isBackgroundLayer( aLayer ) )
466 else if( aItem->
IsSelected() && aDrawingShadows )
470 else if( aItem->
IsSelected() && isBackgroundLayer( aLayer ) )
480 color = color.
Darken( 0.5f );
483 if( aDimmed && !( aItem->
IsSelected() && aDrawingShadows ) )
487 color = color.
Mix( sheetColour, 0.5f );
498 bool aDrawingWireColorHighlights )
const
511 if( aDrawingWireColorHighlights )
513 float colorHighlightWidth =
schIUScale.MilsToIU( 15.0 );
519 width += colorHighlightWidth;
530 switch( aItem->
Type() )
533 pen =
static_cast<const SCH_FIELD*
>( aItem )->GetEffectiveTextPenWidth( pen );
537 pen =
static_cast<const SCH_TEXT*
>( aItem )->GetEffectiveTextPenWidth( pen );
545 pen =
static_cast<const SCH_LABEL_BASE*
>( aItem )->GetEffectiveTextPenWidth( pen );
550 pen =
static_cast<const SCH_TEXTBOX*
>( aItem )->GetEffectiveTextPenWidth( pen );
564 int screenTextSize =
std::abs( (
int)
m_gal->GetScreenWorldMatrix().GetScale().y * 7 );
567 return KiROUND( ( docTextSize + screenTextSize * 2 ) / 3.0 );
586 std::optional<VECTOR2I> aMousePos = std::nullopt, wxString* aActiveUrl =
nullptr )
593 if( aShadowWidth > 0.0f )
612 font->
Draw( &callback_gal, aText, aPosition, aAttrs, aFontMetrics );
619 font->
Draw( &aGal, aText, aPosition, aAttrs, aFontMetrics, aMousePos, aActiveUrl );
639static void drawCache(
KIGFX::GAL& aGal, std::vector<std::unique_ptr<KIFONT::GLYPH>>* aCache,
float aStrokeWidth,
645 if( aShadowWidth > 0.0f )
647 for(
const std::unique_ptr<KIFONT::GLYPH>& glyph : *aCache )
649 if( glyph->IsOutline() )
656 for(
int ii = 0; ii < outlineGlyph->
OutlineCount(); ++ii )
687 callback_gal.SetIsStroke(
true );
689 font->
Draw( &callback_gal, aText, aPosition, attrs, aFontMetrics );
712 m_gal->DrawLine( a, b );
713 m_gal->DrawLine( b, c );
718 int aBodyStyle,
bool aDimmed )
726 std::unique_ptr< LIB_SYMBOL > tmpSymbol;
731 tmpSymbol = aSymbol->
Flatten();
732 drawnSymbol = tmpSymbol.get();
738 [](
const SCH_ITEM& item,
int layer )
748 if( !childOnLayer( item, aLayer ) )
757 draw( &item, aLayer, aDimmed );
784 bool aDrawingShadows,
bool aBrightened )
796 m_gal->SetIsFill(
false );
797 m_gal->SetIsStroke(
true );
798 m_gal->SetLineWidth( lineWidth );
807 const COLOR4D& aColor,
bool aDrawingShadows,
810 double lineWidth = aSize / 10.0;
812 if( aDrawingShadows )
815 std::vector<SCH_SHAPE> shapeList;
818 m_gal->SetLineWidth( lineWidth );
819 m_gal->SetIsStroke(
true );
820 m_gal->SetStrokeColor( aColor );
821 m_gal->SetFillColor( aColor );
823 for(
const SCH_SHAPE& shape : shapeList )
829 m_gal->DrawCurve( shape.GetStart(), shape.GetBezierC1(), shape.GetBezierC2(), shape.GetEnd() );
831 m_gal->DrawCircle( shape.getCenter(), shape.GetRadius() );
840 bool aRotate,
int aExtraLineWidth,
const COLOR4D& aColor )
868 const double lineYOffset = aSize / 4;
869 const double arrowHead = aSize / 8;
885 topLineREnd -
VECTOR2D{ aSize * 0.7, 0 } );
888 aGal.
DrawLine( topLineREnd, topLineREnd -
VECTOR2D{ arrowHead * 1.2, arrowHead } );
889 aGal.
DrawLine( topLineREnd, topLineREnd -
VECTOR2D{ arrowHead * 1.2, -arrowHead } );
893 aGal.
DrawLine( btmLineREnd, btmLineREnd -
VECTOR2D{ arrowHead * 1.2, arrowHead } );
894 aGal.
DrawLine( btmLineREnd, btmLineREnd -
VECTOR2D{ arrowHead * 1.2, -arrowHead } );
903 aGal.
DrawArc( topLineREnd -
VECTOR2D{ aSize - lineYOffset * 2, -lineYOffset },
924 if(
m_schSettings.IsPrinting() && ( drawingShadows || drawingDangling ) )
956 if( drawingDangling )
975 int textOffset =
KiROUND( textSize * 0.22 );
982 mid.
x +=
KiROUND( textOffset * 1.2 );
987 mid.
y -=
KiROUND( textOffset * 1.2 );
1008 m_gal->SetIsStroke(
true );
1009 m_gal->SetIsFill(
false );
1011 m_gal->SetStrokeColor( color );
1012 m_gal->SetFontBold(
false );
1013 m_gal->SetFontUnderlined(
false );
1014 m_gal->SetFontItalic(
false );
1017 const int diam =
radius*2;
1022 m_gal->DrawLine( p0, pos );
1035 m_gal->DrawLine( p0, pos );
1040 m_gal->DrawLine( p0 + dir * ( diam ), pos );
1044 pc = p0 - dir * clock_size ;
1048 p0 +
VECTOR2D( -dir.
y, dir.
x) * clock_size );
1051 m_gal->DrawLine( p0 + dir * ( diam ), pos );
1056 pc = p0 - dir * clock_size ;
1060 p0 +
VECTOR2D( -dir.
y, dir.
x) * clock_size );
1075 m_gal->DrawLine( p0, pos );
1079 m_gal->DrawLine( p0, pos );
1084 p0 +
VECTOR2D( -dir.
x * clock_size, 0 ),
1090 p0 +
VECTOR2D( 0, -dir.
y * clock_size ),
1096 m_gal->DrawLine( p0, pos );
1113 m_gal->DrawLine( p0, pos );
1122 m_gal->DrawLine( p0, pos );
1132 if( drawingShadows && !
eeconfig()->m_Selection.draw_selected_children )
1142 float shadowWidth = 0.0f;
1144 if( drawingShadows )
1151 const auto textRendersAsBitmap =
1169 VECTOR2D mid = ( aTop + aBottom ) / 2.0;
1171 aGal.
SetLineWidth( (
float) aAttrs.m_StrokeWidth + aShadowWidth );
1187 double braceOffset = aLeftBrace ? -aBraceWidth : aBraceWidth;
1188 p2.
y += braceOffset / 2;
1189 p3.
y += braceOffset;
1190 p4.
y += braceOffset / 2;
1195 double braceOffset = aLeftBrace ? -aBraceWidth : aBraceWidth;
1196 p2.
x += braceOffset / 2;
1197 p3.
x += braceOffset;
1198 p4.
x += braceOffset / 2;
1208 const auto drawBracesAroundText = [&](
KIGFX::GAL& aGal,
const wxArrayString& aLines,
const VECTOR2D& aStartPos,
1211 if( aLines.size() <= 1 )
1215 int braceWidth = aAttrs.m_Size.x / 3;
1218 int maxLineWidth = 0;
1224 for(
const wxString& line : aLines )
1226 wxString trimmedLine = line;
1227 trimmedLine.Trim(
true ).Trim(
false );
1230 maxLineWidth = std::max( maxLineWidth, lineExtents.
x );
1238 int textHeight = aAttrs.m_Size.y;
1239 int extraHeight = textHeight / 3;
1244 braceEnd.
x += ( (int) aLines.size() - 1 ) * aLineSpacing;
1247 braceStart.
x -= 2 * extraHeight;
1250 int braceSpacing = maxLineWidth / 2 + braceWidth;
1252 VECTOR2D topBraceStart = braceStart;
1253 topBraceStart.
y -= braceSpacing;
1256 topBraceEnd.
y -= braceSpacing;
1258 drawBrace( aGal, topBraceStart, topBraceEnd, braceWidth,
true, aAttrs, aShadowWidth );
1260 VECTOR2D bottomBraceStart = braceStart;
1261 bottomBraceStart.
y += braceSpacing;
1263 VECTOR2D bottomBraceEnd = braceEnd;
1264 bottomBraceEnd.
y += braceSpacing;
1266 drawBrace( aGal, bottomBraceStart, bottomBraceEnd, braceWidth,
false, aAttrs, aShadowWidth );
1271 braceEnd.
y += ( (int) aLines.size() - 1 ) * aLineSpacing;
1274 braceStart.
y -= 2 * extraHeight;
1277 int braceSpacing = maxLineWidth / 2 + braceWidth;
1281 leftTop.
x -= braceSpacing;
1284 leftBottom.
x -= braceSpacing;
1286 drawBrace( aGal, leftTop, leftBottom, braceWidth,
true, aAttrs, aShadowWidth );
1290 rightTop.
x += braceSpacing;
1293 rightBottom.
x += braceSpacing;
1295 drawBrace( aGal, rightTop, rightBottom, braceWidth,
false, aAttrs, aShadowWidth );
1299 const auto drawBracesAroundTextBitmap =
1304 if( aLines.size() <= 1 )
1307 int braceWidth = aAttrs.m_Size.x / 4;
1310 int maxLineWidth = aAttrs.m_Size.x * 4;
1316 int textHalfHeight = aAttrs.m_Size.y / 2;
1321 braceEnd.
x += ( (int) aLines.size() - 1 ) * aLineSpacing;
1324 leftStart.
y -= maxLineWidth / 2.0 + braceWidth / 2.0;
1327 leftEnd.
y -= maxLineWidth / 2.0 + braceWidth / 2.0;
1329 drawBrace( aGal, leftStart, leftEnd, braceWidth,
true, aAttrs, 0.0f );
1332 rightStart.
y += maxLineWidth / 2.0 + braceWidth / 2.0;
1335 rightEnd.
y += maxLineWidth / 2.0 + braceWidth / 2.0;
1337 drawBrace( aGal, rightStart, rightEnd, braceWidth,
false, aAttrs, 0.0f );
1342 braceEnd.
y += ( (int) aLines.size() - 1 ) * aLineSpacing;
1345 braceTop.
y -= textHalfHeight;
1348 braceBottom.
y += textHalfHeight;
1351 leftTop.
x -= maxLineWidth / 2.0 + braceWidth / 2.0;
1354 leftBottom.
x -= maxLineWidth / 2.0 + braceWidth / 2.0;
1356 drawBrace( aGal, leftTop, leftBottom, braceWidth,
true, aAttrs, 0.0f );
1359 rightTop.
x += maxLineWidth / 2.0 + braceWidth / 2.0;
1361 VECTOR2D rightBottom = braceBottom;
1362 rightBottom.
x += maxLineWidth / 2.0 + braceWidth / 2.0;
1364 drawBrace( aGal, rightTop, rightBottom, braceWidth,
false, aAttrs, 0.0f );
1369 const auto drawMultiLineText =
1371 bool aRenderTextAsBitmap,
float aShadowWidth,
const KIFONT::METRICS& aFontMetrics )
1374 if( aText.StartsWith(
"[" ) && aText.EndsWith(
"]" ) && aText.Contains(
"\n" ) )
1377 wxString content = aText.Mid( 1, aText.Length() - 2 );
1378 wxArrayString lines;
1381 if( lines.size() > 1 )
1384 int lineSpacing =
KiROUND( aAttrs.m_Size.y * 1.3 );
1395 int totalWidth = ( (int) lines.size() - 1 ) * lineSpacing;
1396 startPos.
x -= totalWidth;
1400 int totalWidth = ( (int) lines.size() - 1 ) * lineSpacing;
1401 startPos.
x -= totalWidth / 2.0;
1405 for(
size_t i = 0; i < lines.size(); i++ )
1408 linePos.
x += (int) i * lineSpacing;
1410 wxString line = lines[i];
1411 line.Trim(
true ).Trim(
false );
1413 if( aRenderTextAsBitmap )
1416 drawText( aGal, line, linePos, aAttrs, aShadowWidth, aFontMetrics );
1425 int totalHeight = ( (int) lines.size() - 1 ) * lineSpacing;
1426 startPos.
y -= totalHeight;
1430 int totalHeight = ( (int) lines.size() - 1 ) * lineSpacing;
1431 startPos.
y -= totalHeight / 2.0;
1435 for(
size_t i = 0; i < lines.size(); i++ )
1438 linePos.
y += (int) i * lineSpacing;
1440 wxString line = lines[i];
1441 line.Trim(
true ).Trim(
false );
1443 if( aRenderTextAsBitmap )
1446 drawText( aGal, line, linePos, aAttrs, aShadowWidth, aFontMetrics );
1451 if( aRenderTextAsBitmap )
1452 drawBracesAroundTextBitmap( aGal, lines, startPos, lineSpacing, aAttrs );
1454 drawBracesAroundText( aGal, lines, startPos, lineSpacing, aAttrs, aShadowWidth );
1461 drawText( aGal, aText, aPosition, aAttrs, aShadowWidth, aFontMetrics );
1464 const auto drawTextInfo =
1468 const bool renderTextAsBitmap = textRendersAsBitmap( *
m_gal, aTextInfo.
m_TextSize );
1471 m_gal->SetStrokeColor( aColor );
1472 m_gal->SetFillColor( aColor );
1482 if(
nonCached( aPin ) && renderTextAsBitmap )
1497 const auto getColorForLayer =
1498 [&](
int aDrawnLayer )
1503 return getRenderColor( aPin, aDrawnLayer, drawingShadows, aDimmed );
1508 if( std::optional<PIN_LAYOUT_CACHE::TEXT_INFO> numInfo = cache.
GetPinNumberInfo( shadowWidth ) )
1510 std::optional<PIN_LAYOUT_CACHE::TEXT_INFO> origInfo;
1518 origInfo = *numInfo;
1520 origInfo->m_TextSize = std::max( 1, ( numInfo->m_TextSize * 4 ) / 5 );
1525 VECTOR2I( origInfo->m_TextSize, origInfo->m_TextSize ),
1531 int shift = dir.
y > 0 ? labelLen : 0;
1532 numInfo->m_TextPosition.y += shift;
1533 origInfo->m_TextPosition.y = numBox->GetTop() + shift;
1537 int shift = dir.
x < 0 ? labelLen : 0;
1538 numInfo->m_TextPosition.x -= shift;
1539 origInfo->m_TextPosition.x = numBox->GetRight() - shift;
1544 drawTextInfo( *numInfo, getColorForLayer(
LAYER_PINNUM ) );
1551 if( !drawingShadows )
1554 drawTextInfo( *origInfo, dimmed );
1558 if( std::optional<PIN_LAYOUT_CACHE::TEXT_INFO> nameInfo = cache.
GetPinNameInfo( shadowWidth ) )
1560 drawTextInfo( *nameInfo, getColorForLayer(
LAYER_PINNAM ) );
1583 m_gal->SetStrokeColor( emphasis );
1584 m_gal->SetIsFill(
false );
1585 m_gal->SetIsStroke(
true );
1607 m_gal->SetStrokeColor( color );
1608 m_gal->SetIsStroke(
true );
1618 bool aDangling,
bool aDrawingShadows,
bool aBrightened )
1634 m_gal->SetIsStroke(
true );
1635 m_gal->SetIsFill(
false );
1645 bool highlightNetclassColors =
false;
1648 highlightNetclassColors = eeschemaCfg->m_Selection.highlight_netclass_colors;
1660 if( highlightNetclassColors && aLayer == aJct->
GetLayer() )
1667 if( junctionSize > 1 )
1669 m_gal->SetIsStroke( drawingShadows );
1671 m_gal->SetStrokeColor( color );
1672 m_gal->SetIsFill( !drawingShadows );
1673 m_gal->SetFillColor( color );
1684 bool drawingBusses = aLayer ==
LAYER_BUS;
1687 bool highlightNetclassColors =
false;
1688 double highlightAlpha = 0.6;
1689 double hopOverScale = 0.0;
1700 highlightNetclassColors = eeschemaCfg->m_Selection.highlight_netclass_colors;
1701 highlightAlpha = eeschemaCfg->m_Selection.highlight_netclass_colors_alpha;
1704 if( !highlightNetclassColors && drawingNetColorHighlights )
1707 if( drawingNetColorHighlights && !( aLine->
IsWire() || aLine->
IsBus() ) )
1710 if(
m_schSettings.m_OverrideItemColors && drawingNetColorHighlights )
1721 if( aLine->
IsNew() && drawingDangling )
1725 float width =
getLineWidth( aLine, drawingShadows, drawingNetColorHighlights );
1728 if( highlightNetclassColors )
1733 else if( drawingBusses )
1746 if( net && !net->IsEmpty() )
1753 color =
chain->GetColor().WithAlpha( color.
a );
1759 if( drawingNetColorHighlights )
1768 color = color.
WithAlpha( color.
a * highlightAlpha );
1771 if( ( drawingDangling || drawingShadows ) && !aLine->
IsNew() )
1776 COLOR4D indicatorColor( color );
1789 COLOR4D indicatorColor( color );
1800 if( drawingDangling )
1807 int textOffset =
KiROUND( textSize * 0.22 );
1812 pos.
y -= textOffset;
1818 pos.
x +=
KiROUND( textOffset * 1.2 );
1834 m_gal->SetIsStroke(
true );
1835 m_gal->SetIsFill(
false );
1836 m_gal->SetStrokeColor( color );
1837 m_gal->SetLineWidth( width );
1839 std::vector<VECTOR3I> curr_wire_shape;
1841 if( ( aLine->
IsWire() || aLine->
IsBus() ) && hopOverScale > 0.0 )
1843 double arcRadius = defaultLineWidth * hopOverScale;
1850 bool drawLineBody =
true;
1860 curr_wire_shape.emplace_back( lineStart.
x, lineStart.
y, 0 );
1861 curr_wire_shape.emplace_back( lineEnd.
x, lineEnd.
y, 0 );
1865 for(
size_t ii = 1; ii < curr_wire_shape.size(); ii++ )
1867 VECTOR2I start( curr_wire_shape[ii-1].x, curr_wire_shape[ii-1].y );
1869 if( curr_wire_shape[ii-1].z == 0 )
1872 VECTOR2I end( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
1878 VECTOR2I arc_middle( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
1880 VECTOR2I arc_end( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
1892 EDA_ANGLE angle1 = midAngle - startAngle;
1897 m_gal->DrawArc(
center, ( dstart -
center ).EuclideanNorm(), startAngle, angle );
1928 if(
static_cast<const SCH_RULE_AREA*
>( aShape )->IsDirectiveLabelOnlyArea() )
1946 switch( shape->GetShape() )
1950 SHAPE_ARC arc( shape->GetStart(), shape->GetArcMid(), shape->GetEnd(), 0 );
1954 if( shape->ShortenArcForEndings( startAngle, arcAngle, arc.
GetRadius(),
1964 m_gal->DrawCircle( shape->GetPosition(), shape->GetRadius() );
1968 if( shape->GetCornerRadius() > 0 )
1973 shape->GetRectangleWidth(),
1974 shape->GetRectangleHeight() ),
1975 shape->GetCornerRadius(),
true );
1978 m_gal->DrawPolygon( poly );
1982 m_gal->DrawRectangle( shape->GetPosition(), shape->GetEnd() );
1988 if( shape->GetPolyShape().OutlineCount() == 0 )
1992 std::vector<VECTOR2I> pts;
1994 if( !shape->GetShortenedBodyPolyPoints( outline, 0, pts,
KiROUND(
getLineWidth( shape,
false ) ) ) )
1999 std::deque<VECTOR2D> drawPts;
2002 drawPts.emplace_back( pt );
2004 m_gal->DrawPolygon( drawPts );
2010 std::optional<BEZIER<double>> curve =
2014 m_gal->DrawCurve( curve->Start, curve->C1, curve->C2, curve->End, shape->GetMaxError() );
2020 m_gal->DrawEllipse( shape->GetEllipseCenter(), shape->GetEllipseMajorRadius(),
2021 shape->GetEllipseMinorRadius(), shape->GetEllipseRotation() );
2025 m_gal->DrawEllipseArc( shape->GetEllipseCenter(), shape->GetEllipseMajorRadius(),
2026 shape->GetEllipseMinorRadius(), shape->GetEllipseRotation(),
2027 shape->GetEllipseStartAngle(), shape->GetEllipseEndAngle() );
2037 if(
eeconfig()->m_Selection.fill_shapes )
2044 m_gal->SetIsFill(
true );
2046 m_gal->SetFillColor( color );
2050 m_gal->SetIsFill(
false );
2055 m_gal->SetIsStroke(
true );
2057 m_gal->SetStrokeColor( color );
2059 drawShape( aShape );
2077 m_gal->SetIsFill(
false );
2078 m_gal->SetIsStroke(
true );
2079 m_gal->SetStrokeColor( color );
2083 m_gal->DrawLine( seg.A, seg.B );
2092 m_gal->SetIsFill(
true );
2093 m_gal->SetIsStroke(
false );
2094 m_gal->SetFillColor( color );
2096 drawShape( aShape );
2101 wxFAIL_MSG( wxT(
"Unsupported fill type" ) );
2110 m_gal->SetIsFill(
true );
2111 m_gal->SetIsStroke(
false );
2112 m_gal->SetFillColor( color );
2114 drawShape( aShape );
2117 float lineWidth =
getLineWidth( aShape, drawingShadows );
2121 int lineWidthIU =
KiROUND( lineWidth );
2123 m_gal->SetIsFill(
false );
2124 m_gal->SetIsStroke(
true );
2125 m_gal->SetLineWidth( lineWidth );
2126 m_gal->SetStrokeColor( color );
2130 drawShape( aShape );
2136 for(
SHAPE* shape : shapes )
2142 m_gal->DrawLine( a + 1, b );
2144 m_gal->DrawLine( a, b );
2148 for(
SHAPE* shape : shapes )
2189 switch( aText->
Type() )
2219 bool transparentColor = !drawingShadows && color.
a <= 0.0;
2221 m_gal->SetStrokeColor( color );
2222 m_gal->SetFillColor( color );
2223 m_gal->SetHoverColor( color );
2233 float shadowWidth = 0.0f;
2235 if( drawingShadows )
2241 if( transparentColor )
2253 double shadowOffset = 0.0;
2266 pos.
y = bBox.
GetTop() - shadowOffset;
2269 wxFAIL_MSG( wxT(
"Indeterminate state legal only in dialogs." ) );
2278 pos.
x = bBox.
GetLeft() - shadowOffset;
2287 wxFAIL_MSG( wxT(
"Indeterminate state legal only in dialogs." ) );
2320 && !shownText.Contains( wxT(
"\n" ) ) )
2328 std::vector<std::unique_ptr<KIFONT::GLYPH>>* cache =
nullptr;
2354 switch( aText->
Type() )
2362 showAnchor = !
static_cast<const SCH_LABEL*
>( aText )->IsDangling();
2407 float borderWidth =
getLineWidth( aTextBox, drawingShadows );
2413 bool transparentColor = !drawingShadows && color.
a <= 0.0;
2415 m_gal->SetFillColor( color );
2416 m_gal->SetStrokeColor( color );
2417 m_gal->SetHoverColor( color );
2421 m_gal->SetIsFill(
true );
2422 m_gal->SetIsStroke(
false );
2423 m_gal->SetLineWidth( borderWidth );
2434 m_gal->SetIsFill(
true );
2435 m_gal->SetIsStroke(
false );
2436 m_gal->SetLineWidth( borderWidth );
2443 if( transparentColor )
2470 std::vector<std::unique_ptr<KIFONT::GLYPH>>* cache =
nullptr;
2500 if( transparency > 0.0 )
2501 borderColor = borderColor.
WithAlpha( borderColor.
a * ( 1.0 - transparency ) );
2505 borderColor = borderColor.
Mix( bg, 0.5f );
2509 m_gal->SetIsFill(
false );
2510 m_gal->SetIsStroke(
true );
2511 m_gal->SetStrokeColor( borderColor );
2512 m_gal->SetLineWidth( borderWidth );
2522 for(
SHAPE* shape : shapes )
2530 m_gal->DrawLine( a+1, b );
2532 m_gal->DrawLine( a, b );
2536 for(
SHAPE* shape : shapes )
2550 draw( cell, aLayer, aDimmed );
2562 if( lineWidth == 0 )
2571 m_gal->SetIsFill(
false );
2572 m_gal->SetIsStroke(
true );
2573 m_gal->SetStrokeColor( color );
2574 m_gal->SetLineWidth( (
float) lineWidth );
2578 m_gal->DrawLine( ptA, ptB );
2588 m_gal->DrawLine( a+1, b );
2590 m_gal->DrawLine( a, b );
2599 std::function<bool( wxString* )> symbolResolver =
2600 [&]( wxString* token ) ->
bool
2614 auto t1 = std::chrono::high_resolution_clock::now();
2617 std::optional<SCH_SHEET_PATH> optSheetPath;
2619 wxString variantName;
2626 "SCH_PAINTER::draw symbol %s: Current sheet path='%s', variant='%s', size=%zu, empty=%d",
2629 optSheetPath->Path().AsString(),
2630 optSheetPath->size(),
2631 optSheetPath->empty() ? 1 : 0 );
2634 SCH_SHEET_PATH* sheetPath = optSheetPath ? &optSheetPath.value() :
nullptr;
2635 bool DNP = aSymbol->
GetDNP( sheetPath, variantName );
2642 if( !drawingShadows ||
eeconfig()->m_Selection.draw_selected_children )
2645 draw( &field, aLayer, DNP );
2663 if( !originalSymbol )
2666 bool usingAlternateSymbol = ( originalSymbol != aSymbol->
GetLibSymbolRef().get()
2669 std::vector<const SCH_PIN*> originalPins = originalSymbol->
GetGraphicalPins( unit, bodyStyle );
2671 if( usingAlternateSymbol && originalPins.empty() && bodyStyle > 1 )
2675 auto tCopy1 = std::chrono::high_resolution_clock::now();
2676 LIB_SYMBOL tempSymbol( *originalSymbol,
nullptr,
false );
2677 auto tCopy2 = std::chrono::high_resolution_clock::now();
2679 if( std::chrono::duration_cast<std::chrono::microseconds>( tCopy2 - tCopy1 ).count() > 100 )
2682 std::chrono::duration_cast<std::chrono::microseconds>( tCopy2 - tCopy1 ).count() );
2685 std::vector<SCH_PIN*> tempPins = tempSymbol.
GetGraphicalPins( unit, bodyStyle );
2687 if( usingAlternateSymbol && tempPins.empty() && bodyStyle > 1 )
2696 tempItem.SetFlags( aSymbol->
GetFlags() );
2717 std::vector<SCH_PIN*> symbolPins = aSymbol->
MapLibPins( originalPins, usingAlternateSymbol );
2723 for(
unsigned i = 0; i < tempPins.size(); ++ i )
2725 SCH_PIN* symbolPin = symbolPins[ i ];
2727 SCH_PIN* tempPin = tempPins[ i ];
2740 if( highlightedChain
2756 const wxString effective =
2759 if( effective != original )
2785 for(
unsigned i = 0; i < tempPins.size(); ++i )
2787 SCH_PIN* symbolPin = symbolPins[ i ];
2789 SCH_PIN* tempPin = tempPins[ i ];
2813 margins.
x = std::max( margins.
x * 0.6, margins.
y * 0.3 );
2814 margins.
y = std::max( margins.
y * 0.6, margins.
x * 0.3 );
2821 m_gal->AdvanceDepth();
2822 m_gal->SetIsStroke(
true );
2823 m_gal->SetIsFill(
true );
2824 m_gal->SetStrokeColor( marker_color );
2825 m_gal->SetFillColor( marker_color );
2827 m_gal->DrawSegment( pt1, pt2, strokeWidth );
2828 std::swap( pt1.
x, pt2.
x );
2829 m_gal->DrawSegment( pt1, pt2, strokeWidth );
2841 m_gal->AdvanceDepth();
2842 m_gal->SetIsStroke(
true );
2843 m_gal->SetIsFill(
true );
2844 m_gal->SetStrokeColor( marker_color );
2845 m_gal->SetFillColor( marker_color );
2852 int offset = 2 * strokeWidth;
2861 m_gal->AdvanceDepth();
2862 m_gal->SetFillColor( marker_color );
2866 auto t2 = std::chrono::high_resolution_clock::now();
2868 if( std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count() > 100 )
2871 std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count() );
2896 if( std::find( layers.begin(), layers.end(), aLayer ) == layers.end() )
2916 bool transparentColor = !drawingShadows && color.
a <= 0.0;
2929 if( shownText.IsEmpty() )
2971 float shadowWidth = 0.0f;
2973 if( drawingShadows )
2979 m_gal->SetStrokeColor( color );
2980 m_gal->SetFillColor( color );
2981 m_gal->SetHoverColor( color );
2983 if( transparentColor )
3016 std::vector<std::unique_ptr<KIFONT::GLYPH>>* cache =
nullptr;
3063 bool parentMoving = fieldParent && fieldParent->
IsMoving();
3073 else if( aField->
IsSelected() && !parentMoving )
3089 if( !drawingShadows ||
eeconfig()->m_Selection.draw_selected_children )
3092 draw( &field, aLayer,
false );
3103 if( drawingDangling )
3117 bool transparentColor = !drawingShadows && color.
a <= 0.0;
3119 if( !transparentColor )
3121 std::vector<VECTOR2I> pts;
3122 std::deque<VECTOR2D> pts2;
3127 pts2.emplace_back(
VECTOR2D( p.x, p.y ) );
3129 m_gal->SetIsStroke(
true );
3131 m_gal->SetStrokeColor( color );
3133 if( drawingShadows )
3136 m_gal->SetFillColor( color );
3137 m_gal->DrawPolygon( pts2 );
3141 m_gal->SetIsFill(
false );
3142 m_gal->DrawPolyline( pts2 );
3146 draw(
static_cast<const SCH_TEXT*
>( aLabel ), aLayer,
false );
3159 if( !drawingShadows ||
eeconfig()->m_Selection.draw_selected_children )
3162 draw( &field, aLayer,
false );
3173 if( drawingDangling )
3187 draw(
static_cast<const SCH_TEXT*
>( aLabel ), aLayer,
false );
3200 if( !( drawingShadows || drawingDangling ) ||
eeconfig()->m_Selection.draw_selected_children )
3203 draw( &field, aLayer,
false );
3214 if( drawingDangling )
3228 bool transparentColor = !drawingShadows && color.
a <= 0.0;
3230 if( !transparentColor )
3232 std::vector<VECTOR2I> i_pts;
3233 std::deque<VECTOR2D> d_pts;
3237 for(
const VECTOR2I& i_pt : i_pts )
3238 d_pts.emplace_back(
VECTOR2D( i_pt.x, i_pt.y ) );
3240 m_gal->SetIsFill(
true );
3242 m_gal->SetIsStroke(
true );
3244 m_gal->SetStrokeColor( color );
3245 m_gal->DrawPolyline( d_pts );
3248 draw(
static_cast<const SCH_TEXT*
>( aLabel ), aLayer, aDimmed );
3262 if( !drawingShadows ||
eeconfig()->m_Selection.draw_selected_children )
3265 draw( &field, aLayer,
false );
3288 if( !drawingShadows && color.
a <= 0.0 )
3291 std::vector<VECTOR2I> pts;
3292 std::deque<VECTOR2D> pts2;
3297 pts2.emplace_back(
VECTOR2D( p.x, p.y ) );
3299 m_gal->SetIsFill(
false );
3300 m_gal->SetFillColor( color );
3301 m_gal->SetIsStroke(
true );
3303 m_gal->SetStrokeColor( color );
3307 m_gal->DrawLine( pts2[0], pts2[1] );
3308 m_gal->SetIsFill(
true );
3309 m_gal->DrawCircle( pts2[2], ( pts2[2] - pts2[1] ).EuclideanNorm() );
3313 m_gal->DrawLine( pts2[0], pts2[1] );
3314 m_gal->DrawCircle( pts2[2], ( pts2[2] - pts2[1] ).EuclideanNorm() );
3318 m_gal->DrawPolyline( pts2 );
3333 DNP = aSheet->
GetDNP( sheetPath, variant );
3343 if( !drawingShadows ||
eeconfig()->m_Selection.draw_selected_children )
3346 draw( &field, aLayer, DNP );
3349 draw( sheetPin, aLayer, DNP );
3370 if( backgroundColor.
a > 0.0 )
3373 m_gal->SetIsFill(
true );
3374 m_gal->SetIsStroke(
false );
3376 m_gal->DrawRectangle( pos, pos + size );
3384 m_gal->SetIsStroke(
true );
3386 m_gal->SetIsFill(
false );
3388 m_gal->DrawRectangle( pos, pos + size );
3400 margins.
x = std::max( margins.
x * 0.6, margins.
y * 0.3 );
3401 margins.
y = std::max( margins.
y * 0.6, margins.
x * 0.3 );
3408 m_gal->AdvanceDepth();
3409 m_gal->SetIsStroke(
true );
3410 m_gal->SetIsFill(
true );
3414 m_gal->DrawSegment( pt1, pt2, strokeWidth );
3415 std::swap( pt1.
x, pt2.
x );
3416 m_gal->DrawSegment( pt1, pt2, strokeWidth );
3428 m_gal->AdvanceDepth();
3429 m_gal->SetIsStroke(
true );
3430 m_gal->SetIsFill(
true );
3439 int offset = 2 * strokeWidth;
3448 m_gal->AdvanceDepth();
3465 m_gal->SetIsStroke(
true );
3468 m_gal->SetIsFill(
false );
3486 bool drawingBusses = aLayer ==
LAYER_BUS;
3491 bool highlightNetclassColors =
false;
3494 highlightNetclassColors = eeschemaCfg->m_Selection.highlight_netclass_colors;
3496 if( !highlightNetclassColors && drawingNetColorHighlights )
3499 if(
m_schSettings.m_OverrideItemColors && drawingNetColorHighlights )
3527 if( highlightNetclassColors )
3532 else if( drawingBusses )
3536 if( drawingNetColorHighlights )
3546 if( drawingDangling )
3548 m_gal->SetIsFill(
false );
3549 m_gal->SetIsStroke(
true );
3564 draw( &line, aLayer );
3571 auto t1 = std::chrono::high_resolution_clock::now();
3581 if( img_scale != 1.0 )
3594 m_gal->SetIsStroke(
true );
3595 m_gal->SetStrokeColor( color );
3597 m_gal->SetIsFill(
false );
3605 bm_size.
x /= img_scale;
3606 bm_size.
y /= img_scale;
3607 const VECTOR2D origin( -bm_size.
x / 2.0, -bm_size.
y / 2.0 );
3610 m_gal->DrawRectangle( origin,
end );
3615 auto t2 = std::chrono::high_resolution_clock::now();
3617 if( std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count() > 100 )
3620 std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count() );
3639 m_gal->SetIsFill( !drawingShadows );
3640 m_gal->SetFillColor( color );
3641 m_gal->SetIsStroke( drawingShadows );
3643 m_gal->SetStrokeColor( color );
3648 m_gal->DrawPolygon( polygon );
3655 const bool drawingShadows =
false;
3676 m_gal->SetStrokeColor( color );
3684 m_gal->DrawLine( topLeft, topLeft + width );
3685 m_gal->DrawLine( topLeft + width, topLeft + width + height );
3686 m_gal->DrawLine( topLeft + width + height, topLeft + height );
3687 m_gal->DrawLine( topLeft + height, topLeft );
3691 if(
name.IsEmpty() )
3695 int scaledSize = abs(
KiROUND(
m_gal->GetScreenWorldMatrix().GetScale().x * ptSize ) );
3696 int unscaledSize =
schIUScale.MilsToIU( ptSize );
3699 int textSize = ( scaledSize + ( unscaledSize * 2 ) ) / 3;
3705 m_gal->DrawLine( topLeft, topLeft - titleHeight );
3706 m_gal->DrawLine( topLeft - titleHeight, topLeft + width - titleHeight );
3707 m_gal->DrawLine( topLeft + width - titleHeight, topLeft + width );
3724 LINE_STYLE aLineStyle,
bool aDrawDirectLine,
int aWidth )
3726 if( aDrawDirectLine )
3728 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.
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
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.
std::vector< const SCH_PIN * > GetGraphicalPins(int aUnit=0, int aBodyStyle=0) const
Graphical pins: Return schematic pin objects as drawn (unexpanded), filtered by unit/body.
static LIB_SYMBOL * GetDummy()
Returns 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.
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.
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 connection name for this sheet instance, if connected.
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 SetLineColor(const COLOR4D &aColor)
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)
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.
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
std::vector< SCH_PIN * > MapLibPins(const std::vector< const SCH_PIN * > &aLibPins, bool aByNumber) const
Map pins of an effective library symbol to this symbol's instance pins.
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...
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 wire width in mils. (can be changed in preference menu)
#define UNSELECTED_END_SIZE
The size of the rectangle indicating the anchor of a text object (including fields)
#define TEXT_ANCHOR_SIZE
The default pin len value when creating pins(can be changed in preference menu)
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