122 draw( item, aLayer,
false );
131#ifdef CONNECTIVITY_DEBUG
133 auto sch_item =
dynamic_cast<const SCH_ITEM*
>( aItem );
134 auto conn = sch_item ? sch_item->
Connection( *g_CurrentSheet ) :
nullptr;
139 auto label = conn->Name(
true );
144 m_canvas->SetLineWidth( Mils2ui( 2 ) );
145 m_canvas->SetGlyphSize(
VECTOR2D( Mils2ui( 20 ), Mils2ui( 20 ) ) );
146 m_canvas->StrokeText( *m_canvas, conn->Name(
true ), pos, 0.0, 0 );
154 switch( aItem->
Type() )
160 drawBoundingBox =
false;
161 draw(
static_cast<const SCH_PIN*
>( aItem ), aLayer, aDimmed );
173 draw(
static_cast<const SCH_SHAPE*
>( aItem ), aLayer, aDimmed );
176 draw(
static_cast<const SCH_SHAPE*
>( aItem ), aLayer, aDimmed );
179 draw(
static_cast<const SCH_TEXT*
>( aItem ), aLayer, aDimmed );
185 draw(
static_cast<const SCH_TABLE*
>( aItem ), aLayer, aDimmed );
188 draw(
static_cast<const SCH_LABEL*
>( aItem ), aLayer, aDimmed );
194 draw(
static_cast<const SCH_FIELD*
>( aItem ), aLayer, aDimmed );
230 if( drawBoundingBox )
246 box =
static_cast<const SCH_SYMBOL*
>( aItem )->GetBodyBoundingBox();
248 m_gal->SetIsFill(
false );
249 m_gal->SetIsStroke(
true );
251 :
COLOR4D( 0.2, 0.2, 0.2, 1 ) );
303 return (
float) std::fabs( matrix.
GetScale().
x * milsWidth ) +
schIUScale.MilsToIU( milsWidth );
308 bool aDimmed,
bool aIgnoreNets )
const
310 auto isBackgroundLayer =
327 color =
static_cast<const SCH_LINE*
>( aItem )->GetLineColor();
335 color =
static_cast<const SCH_JUNCTION*
>( aItem )->GetJunctionColor();
341 if( isBackgroundLayer( aLayer ) )
350 if( isBackgroundLayer( aLayer ) )
373 wxFAIL_MSG( wxT(
"Unsupported fill type" ) );
382 else if( isSymbolChild )
393 else if( aItem->
IsType( { SCH_LABEL_LOCATE_ANY_T } ) )
399 else if( aIgnoreNets )
406 color =
static_cast<const SCH_FIELD*
>( aItem )->GetFieldColor();
412 if( isBackgroundLayer( aLayer ) )
417 else if(
const EDA_TEXT* otherTextItem =
dynamic_cast<const EDA_TEXT*
>( aItem ) )
420 color = otherTextItem->GetTextColor();
431 if( isBackgroundLayer( aLayer) )
456 if( aDrawingShadows )
463 else if( isBackgroundLayer( aLayer ) )
468 else if( aItem->
IsSelected() && aDrawingShadows )
472 else if( aItem->
IsSelected() && isBackgroundLayer( aLayer ) )
482 color = color.
Darken( 0.5f );
485 if( aDimmed && !( aItem->
IsSelected() && aDrawingShadows ) )
489 color = color.
Mix( sheetColour, 0.5f );
500 bool aDrawingWireColorHighlights )
const
513 if( aDrawingWireColorHighlights )
515 float colorHighlightWidth =
schIUScale.MilsToIU( 15.0 );
521 width += colorHighlightWidth;
532 switch( aItem->
Type() )
535 pen =
static_cast<const SCH_FIELD*
>( aItem )->GetEffectiveTextPenWidth( pen );
539 pen =
static_cast<const SCH_TEXT*
>( aItem )->GetEffectiveTextPenWidth( pen );
547 pen =
static_cast<const SCH_LABEL_BASE*
>( aItem )->GetEffectiveTextPenWidth( pen );
552 pen =
static_cast<const SCH_TEXTBOX*
>( aItem )->GetEffectiveTextPenWidth( pen );
566 int screenTextSize =
std::abs( (
int)
m_gal->GetScreenWorldMatrix().GetScale().y * 7 );
569 return KiROUND( ( docTextSize + screenTextSize * 2 ) / 3.0 );
618 std::optional<VECTOR2I> aMousePos = std::nullopt, wxString* aActiveUrl =
nullptr )
628 font->
Draw( &aGal, aText, aPosition, aAttrs, aFontMetrics, aMousePos, aActiveUrl );
670 callback_gal.SetIsStroke(
true );
672 font->
Draw( &callback_gal, aText, aPosition, attrs, aFontMetrics );
714 m_gal->DrawLine( a, b );
715 m_gal->DrawLine( b, c );
720 int aBodyStyle,
bool aDimmed )
728 std::unique_ptr< LIB_SYMBOL > tmpSymbol;
733 tmpSymbol = aSymbol->
Flatten();
734 drawnSymbol = tmpSymbol.get();
740 [](
const SCH_ITEM& item,
int layer )
750 if( !childOnLayer( item, aLayer ) )
759 draw( &item, aLayer, aDimmed );
786 bool aDrawingShadows,
bool aBrightened )
798 m_gal->SetIsFill(
false );
799 m_gal->SetIsStroke(
true );
800 m_gal->SetLineWidth( lineWidth );
809 const COLOR4D& aColor,
bool aDrawingShadows,
812 double lineWidth = aSize / 10.0;
814 if( aDrawingShadows )
817 std::vector<SCH_SHAPE> shapeList;
820 m_gal->SetLineWidth( lineWidth );
821 m_gal->SetIsStroke(
true );
822 m_gal->SetStrokeColor( aColor );
823 m_gal->SetFillColor( aColor );
825 for(
const SCH_SHAPE& shape : shapeList )
831 m_gal->DrawCurve( shape.GetStart(), shape.GetBezierC1(), shape.GetBezierC2(), shape.GetEnd() );
833 m_gal->DrawCircle( shape.getCenter(), shape.GetRadius() );
842 bool aRotate,
int aExtraLineWidth,
const COLOR4D& aColor )
870 const double lineYOffset = aSize / 4;
871 const double arrowHead = aSize / 8;
887 topLineREnd -
VECTOR2D{ aSize * 0.7, 0 } );
890 aGal.
DrawLine( topLineREnd, topLineREnd -
VECTOR2D{ arrowHead * 1.2, arrowHead } );
891 aGal.
DrawLine( topLineREnd, topLineREnd -
VECTOR2D{ arrowHead * 1.2, -arrowHead } );
895 aGal.
DrawLine( btmLineREnd, btmLineREnd -
VECTOR2D{ arrowHead * 1.2, arrowHead } );
896 aGal.
DrawLine( btmLineREnd, btmLineREnd -
VECTOR2D{ arrowHead * 1.2, -arrowHead } );
905 aGal.
DrawArc( topLineREnd -
VECTOR2D{ aSize - lineYOffset * 2, -lineYOffset },
926 if(
m_schSettings.IsPrinting() && ( drawingShadows || drawingDangling ) )
958 if( drawingDangling )
977 int textOffset =
KiROUND( textSize * 0.22 );
984 mid.
x +=
KiROUND( textOffset * 1.2 );
989 mid.
y -=
KiROUND( textOffset * 1.2 );
1010 m_gal->SetIsStroke(
true );
1011 m_gal->SetIsFill(
false );
1013 m_gal->SetStrokeColor( color );
1014 m_gal->SetFontBold(
false );
1015 m_gal->SetFontUnderlined(
false );
1016 m_gal->SetFontItalic(
false );
1019 const int diam =
radius*2;
1024 m_gal->DrawLine( p0, pos );
1037 m_gal->DrawLine( p0, pos );
1042 m_gal->DrawLine( p0 + dir * ( diam ), pos );
1046 pc = p0 - dir * clock_size ;
1050 p0 +
VECTOR2D( -dir.
y, dir.
x) * clock_size );
1053 m_gal->DrawLine( p0 + dir * ( diam ), pos );
1058 pc = p0 - dir * clock_size ;
1062 p0 +
VECTOR2D( -dir.
y, dir.
x) * clock_size );
1077 m_gal->DrawLine( p0, pos );
1081 m_gal->DrawLine( p0, pos );
1086 p0 +
VECTOR2D( -dir.
x * clock_size, 0 ),
1092 p0 +
VECTOR2D( 0, -dir.
y * clock_size ),
1098 m_gal->DrawLine( p0, pos );
1115 m_gal->DrawLine( p0, pos );
1124 m_gal->DrawLine( p0, pos );
1134 if( drawingShadows && !
eeconfig()->m_Selection.draw_selected_children )
1144 float shadowWidth = 0.0f;
1146 if( drawingShadows )
1155 const auto textRendersAsBitmap =
1169 const auto drawBrace =
1174 VECTOR2D mid = ( aTop + aBottom ) / 2.0;
1192 double braceOffset = aLeftBrace ? -aBraceWidth : aBraceWidth;
1193 p2.
y += braceOffset / 2;
1194 p3.
y += braceOffset;
1195 p4.
y += braceOffset / 2;
1200 double braceOffset = aLeftBrace ? -aBraceWidth : aBraceWidth;
1201 p2.
x += braceOffset / 2;
1202 p3.
x += braceOffset;
1203 p4.
x += braceOffset / 2;
1213 const auto drawBracesAroundText =
1217 if( aLines.size() <= 1 )
1221 int braceWidth = aAttrs.m_Size.x / 3;
1224 int maxLineWidth = 0;
1230 for(
const wxString& line : aLines )
1232 wxString trimmedLine = line;
1233 trimmedLine.Trim(
true ).Trim(
false );
1235 aAttrs.m_StrokeWidth,
false,
false,
1237 maxLineWidth = std::max( maxLineWidth, lineExtents.
x );
1245 int textHeight = aAttrs.m_Size.y;
1246 int extraHeight = textHeight / 3;
1251 braceEnd.
x += ( (int) aLines.size() - 1 ) * aLineSpacing;
1254 braceStart.
x -= 2 * extraHeight;
1257 int braceSpacing = maxLineWidth / 2 + braceWidth;
1259 VECTOR2D topBraceStart = braceStart;
1260 topBraceStart.
y -= braceSpacing;
1263 topBraceEnd.
y -= braceSpacing;
1265 drawBrace( aGal, topBraceStart, topBraceEnd, braceWidth,
true, aAttrs );
1267 VECTOR2D bottomBraceStart = braceStart;
1268 bottomBraceStart.
y += braceSpacing;
1270 VECTOR2D bottomBraceEnd = braceEnd;
1271 bottomBraceEnd.
y += braceSpacing;
1273 drawBrace( aGal, bottomBraceStart, bottomBraceEnd, braceWidth,
false, aAttrs );
1278 braceEnd.
y += ( (int) aLines.size() - 1 ) * aLineSpacing;
1281 braceStart.
y -= 2 * extraHeight;
1284 int braceSpacing = maxLineWidth / 2 + braceWidth;
1288 leftTop.
x -= braceSpacing;
1291 leftBottom.
x -= braceSpacing;
1293 drawBrace( aGal, leftTop, leftBottom, braceWidth,
true, aAttrs );
1297 rightTop.
x += braceSpacing;
1300 rightBottom.
x += braceSpacing;
1302 drawBrace( aGal, rightTop, rightBottom, braceWidth,
false, aAttrs );
1306 const auto drawBracesAroundTextBitmap =
1311 if( aLines.size() <= 1 )
1314 int braceWidth = aAttrs.m_Size.x / 4;
1317 int maxLineWidth = aAttrs.m_Size.x * 4;
1323 int textHalfHeight = aAttrs.m_Size.y / 2;
1328 braceEnd.
x += ( (int) aLines.size() - 1 ) * aLineSpacing;
1331 leftStart.
y -= maxLineWidth / 2.0 + braceWidth / 2.0;
1334 leftEnd.
y -= maxLineWidth / 2.0 + braceWidth / 2.0;
1336 drawBrace( aGal, leftStart, leftEnd, braceWidth,
true, aAttrs );
1339 rightStart.
y += maxLineWidth / 2.0 + braceWidth / 2.0;
1342 rightEnd.
y += maxLineWidth / 2.0 + braceWidth / 2.0;
1344 drawBrace( aGal, rightStart, rightEnd, braceWidth,
false, aAttrs );
1349 braceEnd.
y += ( (int) aLines.size() - 1 ) * aLineSpacing;
1352 braceTop.
y -= textHalfHeight;
1355 braceBottom.
y += textHalfHeight;
1358 leftTop.
x -= maxLineWidth / 2.0 + braceWidth / 2.0;
1361 leftBottom.
x -= maxLineWidth / 2.0 + braceWidth / 2.0;
1363 drawBrace( aGal, leftTop, leftBottom, braceWidth,
true, aAttrs );
1366 rightTop.
x += maxLineWidth / 2.0 + braceWidth / 2.0;
1368 VECTOR2D rightBottom = braceBottom;
1369 rightBottom.
x += maxLineWidth / 2.0 + braceWidth / 2.0;
1371 drawBrace( aGal, rightTop, rightBottom, braceWidth,
false, aAttrs );
1376 const auto drawMultiLineText =
1381 if( aText.StartsWith(
"[" ) && aText.EndsWith(
"]" ) && aText.Contains(
"\n" ) )
1384 wxString content = aText.Mid( 1, aText.Length() - 2 );
1385 wxArrayString lines;
1388 if( lines.size() > 1 )
1391 int lineSpacing =
KiROUND( aAttrs.m_Size.y * 1.3 );
1402 int totalWidth = ( (int) lines.size() - 1 ) * lineSpacing;
1403 startPos.
x -= totalWidth;
1407 int totalWidth = ( (int) lines.size() - 1 ) * lineSpacing;
1408 startPos.
x -= totalWidth / 2.0;
1412 for(
size_t i = 0; i < lines.size(); i++ )
1415 linePos.
x += i * lineSpacing;
1417 wxString line = lines[i];
1418 line.Trim(
true ).Trim(
false );
1420 strokeText( aGal, line, linePos, aAttrs, aFontMetrics );
1429 int totalHeight = ( (int) lines.size() - 1 ) * lineSpacing;
1430 startPos.
y -= totalHeight;
1434 int totalHeight = ( (int) lines.size() - 1 ) * lineSpacing;
1435 startPos.
y -= totalHeight / 2.0;
1439 for(
size_t i = 0; i < lines.size(); i++ )
1442 linePos.
y += (int) i * lineSpacing;
1444 wxString line = lines[i];
1445 line.Trim(
true ).Trim(
false );
1447 strokeText( aGal, line, linePos, aAttrs, aFontMetrics );
1452 drawBracesAroundText( aGal, lines, startPos, lineSpacing, aAttrs );
1458 strokeText( aGal, aText, aPosition, aAttrs, aFontMetrics );
1461 const auto boxMultiLineText =
1466 if( aText.StartsWith(
"[" ) && aText.EndsWith(
"]" ) && aText.Contains(
"\n" ) )
1468 wxString content = aText.Mid( 1, aText.Length() - 2 );
1469 wxArrayString lines;
1472 if( lines.size() > 1 )
1474 int lineSpacing =
KiROUND( aAttrs.m_Size.y * 1.3 );
1482 int totalWidth = ( (int) lines.size() - 1 ) * lineSpacing;
1483 startPos.
x -= totalWidth;
1487 int totalWidth = ( (int) lines.size() - 1 ) * lineSpacing;
1488 startPos.
x -= totalWidth / 2.0;
1491 for(
size_t i = 0; i < lines.size(); i++ )
1494 linePos.
x += (int) i * lineSpacing;
1496 wxString line = lines[i];
1497 line.Trim(
true ).Trim(
false );
1499 boxText( aGal, line, linePos, aAttrs, aFontMetrics );
1507 int totalHeight = ( (int) lines.size() - 1 ) * lineSpacing;
1508 startPos.
y -= totalHeight;
1512 int totalHeight = ( (int) lines.size() - 1 ) * lineSpacing;
1513 startPos.
y -= totalHeight / 2.0;
1516 for(
size_t i = 0; i < lines.size(); i++ )
1519 linePos.
y += (int) i * lineSpacing;
1521 wxString line = lines[i];
1522 line.Trim(
true ).Trim(
false );
1524 boxText( aGal, line, linePos, aAttrs, aFontMetrics );
1528 drawBracesAroundText( aGal, lines, startPos, lineSpacing, aAttrs );
1533 boxText( aGal, aText, aPosition, aAttrs, aFontMetrics );
1536 const auto drawMultiLineBitmapText =
1541 if( aText.StartsWith(
"[" ) && aText.EndsWith(
"]" ) && aText.Contains(
"\n" ) )
1543 wxString content = aText.Mid( 1, aText.Length() - 2 );
1544 wxArrayString lines;
1547 if( lines.size() > 1 )
1549 int lineSpacing =
KiROUND( aAttrs.m_Size.y * 1.3 );
1557 int totalWidth = ( (int) lines.size() - 1 ) * lineSpacing;
1558 startPos.
x -= totalWidth;
1562 int totalWidth = ( (int) lines.size() - 1 ) * lineSpacing;
1563 startPos.
x -= totalWidth / 2.0;
1566 for(
size_t i = 0; i < lines.size(); i++ )
1569 linePos.
x += (int) i * lineSpacing;
1571 wxString line = lines[i];
1572 line.Trim(
true ).Trim(
false );
1582 int totalHeight = ( (int) lines.size() - 1 ) * lineSpacing;
1583 startPos.
y -= totalHeight;
1587 int totalHeight = ( (int) lines.size() - 1 ) * lineSpacing;
1588 startPos.
y -= totalHeight / 2.0;
1591 for(
size_t i = 0; i < lines.size(); i++ )
1594 linePos.
y += (int) i * lineSpacing;
1596 wxString line = lines[i];
1597 line.Trim(
true ).Trim(
false );
1604 drawBracesAroundTextBitmap( aGal, lines, startPos, lineSpacing, aAttrs );
1609 bitmapText( aGal, aText, aPosition, aAttrs );
1612 const auto drawTextInfo =
1616 const bool renderTextAsBitmap = textRendersAsBitmap( *
m_gal, aTextInfo.
m_TextSize );
1619 m_gal->SetStrokeColor( aColor );
1620 m_gal->SetFillColor( aColor );
1630 if( drawingShadows )
1645 else if(
nonCached( aPin ) && renderTextAsBitmap )
1658 const auto getColorForLayer =
1659 [&](
int aDrawnLayer )
1664 return getRenderColor( aPin, aDrawnLayer, drawingShadows, aDimmed );
1669 if( std::optional<PIN_LAYOUT_CACHE::TEXT_INFO> numInfo = cache.
GetPinNumberInfo( shadowWidth ) )
1670 drawTextInfo( *numInfo, getColorForLayer(
LAYER_PINNUM ) );
1672 if( std::optional<PIN_LAYOUT_CACHE::TEXT_INFO> nameInfo = cache.
GetPinNameInfo( shadowWidth ) )
1674 drawTextInfo( *nameInfo, getColorForLayer(
LAYER_PINNAM ) );
1693 if( sig->GetTerminalPinA() == aPin->
m_Uuid || sig->GetTerminalPinB() == aPin->
m_Uuid )
1699 m_gal->SetStrokeColor( emphasis );
1700 m_gal->SetIsFill(
false );
1701 m_gal->SetIsStroke(
true );
1724 m_gal->SetStrokeColor( color );
1725 m_gal->SetIsStroke(
true );
1735 bool aDangling,
bool aDrawingShadows,
bool aBrightened )
1751 m_gal->SetIsStroke(
true );
1752 m_gal->SetIsFill(
false );
1762 bool highlightNetclassColors =
false;
1780 if( highlightNetclassColors && aLayer == aJct->
GetLayer() )
1787 if( junctionSize > 1 )
1789 m_gal->SetIsStroke( drawingShadows );
1791 m_gal->SetStrokeColor( color );
1792 m_gal->SetIsFill( !drawingShadows );
1793 m_gal->SetFillColor( color );
1804 bool drawingBusses = aLayer ==
LAYER_BUS;
1808 bool highlightNetclassColors =
false;
1809 double highlightAlpha = 0.6;
1811 double hopOverScale = 0.0;
1826 if( !highlightNetclassColors && drawingNetColorHighlights )
1829 if( drawingNetColorHighlights && !( aLine->
IsWire() || aLine->
IsBus() ) )
1832 if(
m_schSettings.m_OverrideItemColors && drawingNetColorHighlights )
1843 if( aLine->
IsNew() && drawingDangling )
1847 float width =
getLineWidth( aLine, drawingShadows, drawingNetColorHighlights );
1850 if( highlightNetclassColors )
1855 else if( drawingBusses )
1862 if( drawingWires && !drawingShadows &&
m_schematic
1863 && !
m_schematic->GetHighlightedNetChain().IsEmpty() )
1867 if( conn && !conn->
Name().IsEmpty() )
1875 color =
chain->GetColor().WithAlpha( color.
a );
1881 if( drawingNetColorHighlights )
1890 color = color.
WithAlpha( color.
a * highlightAlpha );
1893 if( ( drawingDangling || drawingShadows ) && !aLine->
IsNew() )
1898 COLOR4D indicatorColor( color );
1911 COLOR4D indicatorColor( color );
1922 if( drawingDangling )
1929 int textOffset =
KiROUND( textSize * 0.22 );
1934 pos.
y -= textOffset;
1940 pos.
x +=
KiROUND( textOffset * 1.2 );
1956 m_gal->SetIsStroke(
true );
1957 m_gal->SetIsFill(
false );
1958 m_gal->SetStrokeColor( color );
1959 m_gal->SetLineWidth( width );
1961 std::vector<VECTOR3I> curr_wire_shape;
1963 if( ( aLine->
IsWire() || aLine->
IsBus() ) && hopOverScale > 0.0 )
1965 double arcRadius = defaultLineWidth * hopOverScale;
1974 for(
size_t ii = 1; ii < curr_wire_shape.size(); ii++ )
1976 VECTOR2I start( curr_wire_shape[ii-1].x, curr_wire_shape[ii-1].y );
1978 if( curr_wire_shape[ii-1].z == 0 )
1981 VECTOR2I end( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
1987 VECTOR2I arc_middle( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
1989 VECTOR2I arc_end( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
2001 EDA_ANGLE angle1 = midAngle - startAngle;
2006 m_gal->DrawArc(
center, ( dstart -
center ).EuclideanNorm(), startAngle, angle );
2034 switch( shape->GetShape() )
2038 VECTOR2D start = shape->GetStart();
2047 EDA_ANGLE angle1 = midAngle - startAngle;
2052 m_gal->DrawArc(
center, ( start -
center ).EuclideanNorm(), startAngle, angle );
2057 m_gal->DrawCircle( shape->GetPosition(), shape->GetRadius() );
2061 if( shape->GetCornerRadius() > 0 )
2066 shape->GetRectangleWidth(),
2067 shape->GetRectangleHeight() ),
2068 shape->GetCornerRadius(),
true );
2071 m_gal->DrawPolygon( poly );
2075 m_gal->DrawRectangle( shape->GetPosition(), shape->GetEnd() );
2081 const std::vector<SHAPE*> polySegments = shape->MakeEffectiveShapes(
true );
2083 if( !polySegments.empty() )
2085 std::deque<VECTOR2D> pts;
2087 for(
SHAPE* polySegment : polySegments )
2088 pts.push_back(
static_cast<SHAPE_SEGMENT*
>( polySegment )->GetSeg().
A );
2092 for(
SHAPE* polySegment : polySegments )
2095 m_gal->DrawPolygon( pts );
2102 m_gal->DrawCurve( shape->GetStart(), shape->GetBezierC1(),
2103 shape->GetBezierC2(), shape->GetEnd() );
2108 m_gal->DrawEllipse( shape->GetEllipseCenter(), shape->GetEllipseMajorRadius(),
2109 shape->GetEllipseMinorRadius(), shape->GetEllipseRotation() );
2113 m_gal->DrawEllipseArc( shape->GetEllipseCenter(), shape->GetEllipseMajorRadius(),
2114 shape->GetEllipseMinorRadius(), shape->GetEllipseRotation(),
2115 shape->GetEllipseStartAngle(), shape->GetEllipseEndAngle() );
2125 if(
eeconfig()->m_Selection.fill_shapes )
2132 m_gal->SetIsFill(
true );
2134 m_gal->SetFillColor( color );
2138 m_gal->SetIsFill(
false );
2143 m_gal->SetIsStroke(
true );
2145 m_gal->SetStrokeColor( color );
2147 drawShape( aShape );
2165 m_gal->SetIsFill(
false );
2166 m_gal->SetIsStroke(
true );
2167 m_gal->SetStrokeColor( color );
2171 m_gal->DrawLine( seg.A, seg.B );
2180 m_gal->SetIsFill(
true );
2181 m_gal->SetIsStroke(
false );
2182 m_gal->SetFillColor( color );
2184 drawShape( aShape );
2189 wxFAIL_MSG( wxT(
"Unsupported fill type" ) );
2198 m_gal->SetIsFill(
true );
2199 m_gal->SetIsStroke(
false );
2200 m_gal->SetFillColor( color );
2202 drawShape( aShape );
2205 float lineWidth =
getLineWidth( aShape, drawingShadows );
2209 m_gal->SetIsFill(
false );
2210 m_gal->SetIsStroke(
true );
2211 m_gal->SetLineWidth( lineWidth );
2212 m_gal->SetStrokeColor( color );
2216 drawShape( aShape );
2220 std::vector<SHAPE*> shapes;
2243 for(
SHAPE* shape : shapes )
2249 m_gal->DrawLine( a + 1, b );
2251 m_gal->DrawLine( a, b );
2255 for(
SHAPE* shape : shapes )
2279 switch( aText->
Type() )
2300 if( conn && conn->
IsBus() )
2312 m_gal->SetStrokeColor( color );
2313 m_gal->SetFillColor( color );
2314 m_gal->SetHoverColor( color );
2324 if( drawingShadows && font->
IsOutline() )
2332 m_gal->SetIsFill(
true );
2333 m_gal->SetIsStroke(
false );
2343 double shadowOffset = 0.0;
2345 if( drawingShadows )
2350 const double adjust = 1.2f;
2351 shadowOffset = shadowWidth/2.0f * adjust;
2365 pos.
y = bBox.
GetTop() - shadowOffset;
2368 wxFAIL_MSG( wxT(
"Indeterminate state legal only in dialogs." ) );
2377 pos.
x = bBox.
GetLeft() - shadowOffset;
2386 wxFAIL_MSG( wxT(
"Indeterminate state legal only in dialogs." ) );
2397 else if( drawingShadows )
2399 m_gal->SetIsFill(
false );
2400 m_gal->SetIsStroke(
true );
2410 text_offset.
x -= fudge;
2412 text_offset.
y -= fudge;
2414 text_offset.
x += fudge;
2416 text_offset.
y += fudge;
2442 && !shownText.Contains( wxT(
"\n" ) ) )
2449 std::vector<std::unique_ptr<KIFONT::GLYPH>>* cache =
nullptr;
2457 m_gal->DrawGlyphs( *cache );
2476 switch( aText->
Type() )
2484 showAnchor = !
static_cast<const SCH_LABEL*
>( aText )->IsDangling();
2529 float borderWidth =
getLineWidth( aTextBox, drawingShadows );
2556 std::vector<std::unique_ptr<KIFONT::GLYPH>>* cache =
nullptr;
2564 m_gal->DrawGlyphs( *cache );
2578 m_gal->SetFillColor( color );
2579 m_gal->SetStrokeColor( color );
2580 m_gal->SetHoverColor( color );
2584 m_gal->SetIsFill(
true );
2585 m_gal->SetIsStroke(
false );
2586 m_gal->SetLineWidth( borderWidth );
2597 m_gal->SetIsFill(
true );
2598 m_gal->SetIsStroke(
false );
2599 m_gal->SetLineWidth( borderWidth );
2620 if( transparency > 0.0 )
2621 borderColor = borderColor.
WithAlpha( borderColor.
a * ( 1.0 - transparency ) );
2625 borderColor = borderColor.
Mix( bg, 0.5f );
2629 m_gal->SetIsFill(
false );
2630 m_gal->SetIsStroke(
true );
2631 m_gal->SetStrokeColor( borderColor );
2632 m_gal->SetLineWidth( borderWidth );
2642 for(
SHAPE* shape : shapes )
2650 m_gal->DrawLine( a+1, b );
2652 m_gal->DrawLine( a, b );
2656 for(
SHAPE* shape : shapes )
2670 draw( cell, aLayer, aDimmed );
2682 if( lineWidth == 0 )
2691 m_gal->SetIsFill(
false );
2692 m_gal->SetIsStroke(
true );
2693 m_gal->SetStrokeColor( color );
2694 m_gal->SetLineWidth( (
float) lineWidth );
2698 m_gal->DrawLine( ptA, ptB );
2708 m_gal->DrawLine( a+1, b );
2710 m_gal->DrawLine( a, b );
2720 std::function<bool( wxString* )> symbolResolver =
2721 [&]( wxString* token ) ->
bool
2735 auto t1 = std::chrono::high_resolution_clock::now();
2738 std::optional<SCH_SHEET_PATH> optSheetPath;
2740 wxString variantName;
2747 "SCH_PAINTER::draw symbol %s: Current sheet path='%s', variant='%s', size=%zu, empty=%d",
2750 optSheetPath->Path().AsString(),
2751 optSheetPath->size(),
2752 optSheetPath->empty() ? 1 : 0 );
2755 SCH_SHEET_PATH* sheetPath = optSheetPath ? &optSheetPath.value() :
nullptr;
2756 bool DNP = aSymbol->
GetDNP( sheetPath, variantName );
2763 if( !drawingShadows ||
eeconfig()->m_Selection.draw_selected_children )
2766 draw( &field, aLayer, DNP );
2784 std::vector<SCH_PIN*> originalPins = originalSymbol->
GetGraphicalPins( unit, bodyStyle );
2787 auto tCopy1 = std::chrono::high_resolution_clock::now();
2788 LIB_SYMBOL tempSymbol( *originalSymbol,
nullptr,
false );
2789 auto tCopy2 = std::chrono::high_resolution_clock::now();
2791 if( std::chrono::duration_cast<std::chrono::microseconds>( tCopy2 - tCopy1 ).count() > 100 )
2794 std::chrono::duration_cast<std::chrono::microseconds>( tCopy2 - tCopy1 ).count() );
2797 std::vector<SCH_PIN*> tempPins = tempSymbol.
GetGraphicalPins( unit, bodyStyle );
2805 tempItem.SetFlags( aSymbol->
GetFlags() );
2825 for(
unsigned i = 0; i < tempPins.size(); ++ i )
2828 SCH_PIN* tempPin = tempPins[ i ];
2851 for(
unsigned i = 0; i < tempPins.size(); ++i )
2854 SCH_PIN* tempPin = tempPins[ i ];
2877 margins.
x = std::max( margins.
x * 0.6, margins.
y * 0.3 );
2878 margins.
y = std::max( margins.
y * 0.6, margins.
x * 0.3 );
2885 m_gal->AdvanceDepth();
2886 m_gal->SetIsStroke(
true );
2887 m_gal->SetIsFill(
true );
2888 m_gal->SetStrokeColor( marker_color );
2889 m_gal->SetFillColor( marker_color );
2891 m_gal->DrawSegment( pt1, pt2, strokeWidth );
2892 std::swap( pt1.
x, pt2.
x );
2893 m_gal->DrawSegment( pt1, pt2, strokeWidth );
2905 m_gal->AdvanceDepth();
2906 m_gal->SetIsStroke(
true );
2907 m_gal->SetIsFill(
true );
2908 m_gal->SetStrokeColor( marker_color );
2909 m_gal->SetFillColor( marker_color );
2916 int offset = 2 * strokeWidth;
2925 m_gal->AdvanceDepth();
2926 m_gal->SetFillColor( marker_color );
2930 auto t2 = std::chrono::high_resolution_clock::now();
2932 if( std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count() > 100 )
2935 std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count() );
2960 if( std::find( layers.begin(), layers.end(), aLayer ) == layers.end() )
2987 wxString shownText = aField->
GetShownText( sheetPath,
true, 0, variant );
2989 if( shownText.IsEmpty() )
3031 m_gal->SetStrokeColor( color );
3032 m_gal->SetFillColor( color );
3033 m_gal->SetHoverColor( color );
3035 if( drawingShadows &&
getFont( aField )->IsOutline() )
3053 if( drawingShadows )
3076 std::vector<std::unique_ptr<KIFONT::GLYPH>>* cache =
nullptr;
3079 cache = aField->
GetRenderCache( shownText, textpos, attributes );
3084 m_gal->DrawGlyphs( *cache );
3124 bool parentMoving = fieldParent && fieldParent->
IsMoving();
3134 else if( aField->
IsSelected() && !parentMoving )
3150 if( !drawingShadows ||
eeconfig()->m_Selection.draw_selected_children )
3153 draw( &field, aLayer,
false );
3164 if( drawingDangling )
3176 std::vector<VECTOR2I> pts;
3177 std::deque<VECTOR2D> pts2;
3182 pts2.emplace_back(
VECTOR2D( p.x, p.y ) );
3184 m_gal->SetIsStroke(
true );
3186 m_gal->SetStrokeColor( color );
3188 if( drawingShadows )
3191 m_gal->SetFillColor( color );
3192 m_gal->DrawPolygon( pts2 );
3196 m_gal->SetIsFill(
false );
3197 m_gal->DrawPolyline( pts2 );
3200 draw(
static_cast<const SCH_TEXT*
>( aLabel ), aLayer,
false );
3213 if( !drawingShadows ||
eeconfig()->m_Selection.draw_selected_children )
3216 draw( &field, aLayer,
false );
3227 if( drawingDangling )
3239 draw(
static_cast<const SCH_TEXT*
>( aLabel ), aLayer,
false );
3252 if( !( drawingShadows || drawingDangling ) ||
eeconfig()->m_Selection.draw_selected_children )
3255 draw( &field, aLayer,
false );
3266 if( drawingDangling )
3278 std::vector<VECTOR2I> i_pts;
3279 std::deque<VECTOR2D> d_pts;
3283 for(
const VECTOR2I& i_pt : i_pts )
3284 d_pts.emplace_back(
VECTOR2D( i_pt.x, i_pt.y ) );
3286 m_gal->SetIsFill(
true );
3288 m_gal->SetIsStroke(
true );
3290 m_gal->SetStrokeColor( color );
3291 m_gal->DrawPolyline( d_pts );
3293 draw(
static_cast<const SCH_TEXT*
>( aLabel ), aLayer, aDimmed );
3307 if( !drawingShadows ||
eeconfig()->m_Selection.draw_selected_children )
3310 draw( &field, aLayer,
false );
3333 std::vector<VECTOR2I> pts;
3334 std::deque<VECTOR2D> pts2;
3339 pts2.emplace_back(
VECTOR2D( p.x, p.y ) );
3341 m_gal->SetIsFill(
false );
3342 m_gal->SetFillColor( color );
3343 m_gal->SetIsStroke(
true );
3345 m_gal->SetStrokeColor( color );
3349 m_gal->DrawLine( pts2[0], pts2[1] );
3350 m_gal->SetIsFill(
true );
3351 m_gal->DrawCircle( pts2[2], ( pts2[2] - pts2[1] ).EuclideanNorm() );
3355 m_gal->DrawLine( pts2[0], pts2[1] );
3356 m_gal->DrawCircle( pts2[2], ( pts2[2] - pts2[1] ).EuclideanNorm() );
3360 m_gal->DrawPolyline( pts2 );
3375 DNP = aSheet->
GetDNP( sheetPath, variant );
3385 if( !drawingShadows ||
eeconfig()->m_Selection.draw_selected_children )
3388 draw( &field, aLayer, DNP );
3412 if( backgroundColor.
a > 0.0 )
3415 m_gal->SetIsFill(
true );
3416 m_gal->SetIsStroke(
false );
3418 m_gal->DrawRectangle( pos, pos + size );
3426 m_gal->SetIsStroke(
true );
3428 m_gal->SetIsFill(
false );
3430 m_gal->DrawRectangle( pos, pos + size );
3442 margins.
x = std::max( margins.
x * 0.6, margins.
y * 0.3 );
3443 margins.
y = std::max( margins.
y * 0.6, margins.
x * 0.3 );
3450 m_gal->AdvanceDepth();
3451 m_gal->SetIsStroke(
true );
3452 m_gal->SetIsFill(
true );
3456 m_gal->DrawSegment( pt1, pt2, strokeWidth );
3457 std::swap( pt1.
x, pt2.
x );
3458 m_gal->DrawSegment( pt1, pt2, strokeWidth );
3470 m_gal->AdvanceDepth();
3471 m_gal->SetIsStroke(
true );
3472 m_gal->SetIsFill(
true );
3481 int offset = 2 * strokeWidth;
3490 m_gal->AdvanceDepth();
3507 m_gal->SetIsStroke(
true );
3510 m_gal->SetIsFill(
false );
3528 bool drawingBusses = aLayer ==
LAYER_BUS;
3533 bool highlightNetclassColors =
false;
3541 if( !highlightNetclassColors && drawingNetColorHighlights )
3544 if(
m_schSettings.m_OverrideItemColors && drawingNetColorHighlights )
3572 if( highlightNetclassColors )
3577 else if( drawingBusses )
3581 if( drawingNetColorHighlights )
3593 if( drawingDangling )
3595 m_gal->SetIsFill(
false );
3596 m_gal->SetIsStroke(
true );
3617 draw( &line, aLayer );
3624 auto t1 = std::chrono::high_resolution_clock::now();
3634 if( img_scale != 1.0 )
3647 m_gal->SetIsStroke(
true );
3648 m_gal->SetStrokeColor( color );
3650 m_gal->SetIsFill(
false );
3658 bm_size.
x /= img_scale;
3659 bm_size.
y /= img_scale;
3660 const VECTOR2D origin( -bm_size.
x / 2.0, -bm_size.
y / 2.0 );
3663 m_gal->DrawRectangle( origin,
end );
3668 auto t2 = std::chrono::high_resolution_clock::now();
3670 if( std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count() > 100 )
3673 std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count() );
3692 m_gal->SetIsFill( !drawingShadows );
3693 m_gal->SetFillColor( color );
3694 m_gal->SetIsStroke( drawingShadows );
3696 m_gal->SetStrokeColor( color );
3701 m_gal->DrawPolygon( polygon );
3708 const bool drawingShadows =
false;
3729 m_gal->SetStrokeColor( color );
3737 m_gal->DrawLine( topLeft, topLeft + width );
3738 m_gal->DrawLine( topLeft + width, topLeft + width + height );
3739 m_gal->DrawLine( topLeft + width + height, topLeft + height );
3740 m_gal->DrawLine( topLeft + height, topLeft );
3744 if(
name.IsEmpty() )
3748 int scaledSize = abs(
KiROUND(
m_gal->GetScreenWorldMatrix().GetScale().x * ptSize ) );
3749 int unscaledSize =
schIUScale.MilsToIU( ptSize );
3752 int textSize = ( scaledSize + ( unscaledSize * 2 ) ) / 3;
3758 m_gal->DrawLine( topLeft, topLeft - titleHeight );
3759 m_gal->DrawLine( topLeft - titleHeight, topLeft + width - titleHeight );
3760 m_gal->DrawLine( topLeft + width - titleHeight, topLeft + width );
3777 LINE_STYLE aLineStyle,
bool aDrawDirectLine,
int aWidth )
3779 if( aDrawDirectLine )
3781 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 BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
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 void SetX(coord_type val)
constexpr const Vec & GetOrigin() const
constexpr void SetY(coord_type val)
const BOX2< Vec > GetBoundingBoxRotated(const VECTOR2I &aRotCenter, const EDA_ANGLE &aAngle) const
Useful to calculate bounding box of rotated items, when rotation is not cardinal.
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)
EDA_ITEM * GetParent() const
bool HasFlag(EDA_ITEM_FLAGS aFlag) const
bool IsBrightened() const
bool IsForceVisible() const
EDA_ITEM_FLAGS GetFlags() const
int GetEllipseMinorRadius() const
const VECTOR2I & GetEllipseCenter() const
EDA_ANGLE GetEllipseEndAngle() const
FILL_T GetFillMode() const
int GetEllipseMajorRadius() const
EDA_ANGLE GetEllipseRotation() const
const std::vector< SEG > & GetHatchLines() const
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
COLOR4D GetFillColor() const
EDA_ANGLE GetEllipseStartAngle() const
virtual void UpdateHatching() const
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
const VECTOR2I & GetTextPos() const
COLOR4D GetTextColor() const
void SetActiveUrl(const wxString &aUrl) const
const EDA_ANGLE & GetTextAngle() 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.
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.
virtual void DrawRectangle(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint)
Draw a rectangle.
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 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)
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 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.
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.
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
wxString Name(bool aIgnoreSheet=false) const
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, bool aAllowExtraText, int aDepth=0, const wxString &aVariantName=wxEmptyString) 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
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
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
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
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.
VECTOR2I GetPosition() const override
int GetNumberTextSize() const
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
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.
void SetOperatingPoint(const wxString &aText)
void SetType(ELECTRICAL_PINTYPE aType)
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.
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.
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.
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.
SCH_PIN * GetPin(const wxString &number) const
Find a symbol pin by number.
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, bool aAllowExtraText, 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, bool aAllowExtraText, 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...
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)
int NewOutline()
Creates a new empty polygon in the set and returns its index.
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.
const SEG & GetSeg() const
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, int aFlags)
#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
#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.
@ FILLED_WITH_BG_BODYCOLOR
@ FILLED_SHAPE
Fill with object color.
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 boxText(KIGFX::GAL &aGal, const wxString &aText, const VECTOR2D &aPosition, const TEXT_ATTRIBUTES &aAttrs, const KIFONT::METRICS &aFontMetrics)
static void bitmapText(KIGFX::GAL &aGal, const wxString &aText, const VECTOR2D &aPosition, const TEXT_ATTRIBUTES &aAttrs)
EESCHEMA_SETTINGS * eeconfig()
static void strokeText(KIGFX::GAL &aGal, const wxString &aText, const VECTOR2D &aPosition, const TEXT_ATTRIBUTES &aAttrs, 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)
static BOX2I GetTextExtents(const wxString &aText, const VECTOR2D &aPosition, KIFONT::FONT &aFont, const TEXT_ATTRIBUTES &aAttrs, const KIFONT::METRICS &aFontMetrics)
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.
int highlight_netclass_colors_thickness
bool highlight_netclass_colors
double highlight_netclass_colors_alpha
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
@ GR_TEXT_V_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