118 draw( item, aLayer,
false );
127#ifdef CONNECTIVITY_DEBUG
129 auto sch_item =
dynamic_cast<const SCH_ITEM*
>( aItem );
130 auto conn = sch_item ? sch_item->
Connection( *g_CurrentSheet ) :
nullptr;
135 auto label = conn->Name(
true );
140 m_canvas->SetLineWidth( Mils2ui( 2 ) );
141 m_canvas->SetGlyphSize(
VECTOR2D( Mils2ui( 20 ), Mils2ui( 20 ) ) );
142 m_canvas->StrokeText( *m_canvas, conn->Name(
true ), pos, 0.0, 0 );
150 switch( aItem->
Type() )
156 drawBoundingBox =
false;
157 draw(
static_cast<const SCH_PIN*
>( aItem ), aLayer, aDimmed );
169 draw(
static_cast<const SCH_SHAPE*
>( aItem ), aLayer, aDimmed );
172 draw(
static_cast<const SCH_SHAPE*
>( aItem ), aLayer, aDimmed );
175 draw(
static_cast<const SCH_TEXT*
>( aItem ), aLayer, aDimmed );
181 draw(
static_cast<const SCH_TABLE*
>( aItem ), aLayer, aDimmed );
184 draw(
static_cast<const SCH_LABEL*
>( aItem ), aLayer, aDimmed );
190 draw(
static_cast<const SCH_FIELD*
>( aItem ), aLayer, aDimmed );
226 if( drawBoundingBox )
242 box =
static_cast<const SCH_SYMBOL*
>( aItem )->GetBodyBoundingBox();
244 m_gal->SetIsFill(
false );
245 m_gal->SetIsStroke(
true );
247 :
COLOR4D( 0.2, 0.2, 0.2, 1 ) );
299 return (
float) std::fabs( matrix.
GetScale().
x * milsWidth ) +
schIUScale.MilsToIU( milsWidth );
304 bool aDimmed,
bool aIgnoreNets )
const
306 auto isBackgroundLayer =
323 color =
static_cast<const SCH_LINE*
>( aItem )->GetLineColor();
331 color =
static_cast<const SCH_JUNCTION*
>( aItem )->GetJunctionColor();
337 if( isBackgroundLayer( aLayer ) )
346 if( isBackgroundLayer( aLayer ) )
369 wxFAIL_MSG( wxT(
"Unsupported fill type" ) );
378 else if( isSymbolChild )
389 else if( aItem->
IsType( { SCH_LABEL_LOCATE_ANY_T } ) )
395 else if( aIgnoreNets )
402 color =
static_cast<const SCH_FIELD*
>( aItem )->GetFieldColor();
408 if( isBackgroundLayer( aLayer ) )
413 else if(
const EDA_TEXT* otherTextItem =
dynamic_cast<const EDA_TEXT*
>( aItem ) )
416 color = otherTextItem->GetTextColor();
424 if( isBackgroundLayer( aLayer) )
449 if( aDrawingShadows )
456 else if( isBackgroundLayer( aLayer ) )
461 else if( aItem->
IsSelected() && aDrawingShadows )
465 else if( aItem->
IsSelected() && isBackgroundLayer( aLayer ) )
475 color = color.
Darken( 0.5f );
478 if( aDimmed && !( aItem->
IsSelected() && aDrawingShadows ) )
482 color = color.
Mix( sheetColour, 0.5f );
493 bool aDrawingWireColorHighlights )
const
506 if( aDrawingWireColorHighlights )
508 float colorHighlightWidth =
schIUScale.MilsToIU( 15.0 );
514 width += colorHighlightWidth;
525 switch( aItem->
Type() )
528 pen =
static_cast<const SCH_FIELD*
>( aItem )->GetEffectiveTextPenWidth( pen );
532 pen =
static_cast<const SCH_TEXT*
>( aItem )->GetEffectiveTextPenWidth( pen );
540 pen =
static_cast<const SCH_LABEL_BASE*
>( aItem )->GetEffectiveTextPenWidth( pen );
545 pen =
static_cast<const SCH_TEXTBOX*
>( aItem )->GetEffectiveTextPenWidth( pen );
559 int screenTextSize =
std::abs( (
int)
m_gal->GetScreenWorldMatrix().GetScale().y * 7 );
562 return KiROUND( ( docTextSize + screenTextSize * 2 ) / 3.0 );
620 font->
Draw( &aGal, aText, aPosition, aAttrs, aFontMetrics );
662 callback_gal.SetIsStroke(
true );
664 font->
Draw( &callback_gal, aText, aPosition, attrs, aFontMetrics );
706 m_gal->DrawLine( a, b );
707 m_gal->DrawLine( b, c );
712 int aBodyStyle,
bool aDimmed )
720 std::unique_ptr< LIB_SYMBOL > tmpSymbol;
725 tmpSymbol = aSymbol->
Flatten();
726 drawnSymbol = tmpSymbol.get();
732 [](
const SCH_ITEM& item,
int layer )
742 if( !childOnLayer( item, aLayer ) )
751 draw( &item, aLayer, aDimmed );
778 bool aDrawingShadows,
bool aBrightened )
790 m_gal->SetIsFill(
false );
791 m_gal->SetIsStroke(
true );
792 m_gal->SetLineWidth( lineWidth );
801 const COLOR4D& aColor,
bool aDrawingShadows,
804 double lineWidth = aSize / 10.0;
806 if( aDrawingShadows )
809 std::vector<SCH_SHAPE> shapeList;
812 m_gal->SetLineWidth( lineWidth );
813 m_gal->SetIsStroke(
true );
814 m_gal->SetStrokeColor( aColor );
815 m_gal->SetFillColor( aColor );
817 for(
const SCH_SHAPE& shape : shapeList )
823 m_gal->DrawCurve( shape.GetStart(), shape.GetBezierC1(), shape.GetBezierC2(), shape.GetEnd() );
825 m_gal->DrawCircle( shape.getCenter(), shape.GetRadius() );
834 bool aRotate,
int aExtraLineWidth,
const COLOR4D& aColor )
862 const double lineYOffset = aSize / 4;
863 const double arrowHead = aSize / 8;
879 topLineREnd -
VECTOR2D{ aSize * 0.7, 0 } );
882 aGal.
DrawLine( topLineREnd, topLineREnd -
VECTOR2D{ arrowHead * 1.2, arrowHead } );
883 aGal.
DrawLine( topLineREnd, topLineREnd -
VECTOR2D{ arrowHead * 1.2, -arrowHead } );
887 aGal.
DrawLine( btmLineREnd, btmLineREnd -
VECTOR2D{ arrowHead * 1.2, arrowHead } );
888 aGal.
DrawLine( btmLineREnd, btmLineREnd -
VECTOR2D{ arrowHead * 1.2, -arrowHead } );
897 aGal.
DrawArc( topLineREnd -
VECTOR2D{ aSize - lineYOffset * 2, -lineYOffset },
918 if(
m_schSettings.IsPrinting() && ( drawingShadows || drawingDangling ) )
950 if( drawingDangling )
969 int textOffset =
KiROUND( textSize * 0.22 );
976 mid.
x +=
KiROUND( textOffset * 1.2 );
981 mid.
y -=
KiROUND( textOffset * 1.2 );
1002 m_gal->SetIsStroke(
true );
1003 m_gal->SetIsFill(
false );
1005 m_gal->SetStrokeColor( color );
1006 m_gal->SetFontBold(
false );
1007 m_gal->SetFontUnderlined(
false );
1008 m_gal->SetFontItalic(
false );
1011 const int diam =
radius*2;
1016 m_gal->DrawLine( p0, pos );
1029 m_gal->DrawLine( p0, pos );
1034 m_gal->DrawLine( p0 + dir * ( diam ), pos );
1038 pc = p0 - dir * clock_size ;
1042 p0 +
VECTOR2D( -dir.
y, dir.
x) * clock_size );
1045 m_gal->DrawLine( p0 + dir * ( diam ), pos );
1050 pc = p0 - dir * clock_size ;
1054 p0 +
VECTOR2D( -dir.
y, dir.
x) * clock_size );
1069 m_gal->DrawLine( p0, pos );
1073 m_gal->DrawLine( p0, pos );
1078 p0 +
VECTOR2D( -dir.
x * clock_size, 0 ),
1084 p0 +
VECTOR2D( 0, -dir.
y * clock_size ),
1090 m_gal->DrawLine( p0, pos );
1107 m_gal->DrawLine( p0, pos );
1116 m_gal->DrawLine( p0, pos );
1126 if( drawingShadows && !
eeconfig()->m_Selection.draw_selected_children )
1136 float shadowWidth = 0.0f;
1138 if( drawingShadows )
1147 const auto textRendersAsBitmap =
1161 const auto drawBrace =
1166 VECTOR2D mid = ( aTop + aBottom ) / 2.0;
1184 double braceOffset = aLeftBrace ? -aBraceWidth : aBraceWidth;
1185 p2.
y += braceOffset / 2;
1186 p3.
y += braceOffset;
1187 p4.
y += braceOffset / 2;
1192 double braceOffset = aLeftBrace ? -aBraceWidth : aBraceWidth;
1193 p2.
x += braceOffset / 2;
1194 p3.
x += braceOffset;
1195 p4.
x += braceOffset / 2;
1205 const auto drawBracesAroundText =
1209 if( aLines.size() <= 1 )
1213 int braceWidth = aAttrs.m_Size.x / 3;
1216 int maxLineWidth = 0;
1222 for(
const wxString& line : aLines )
1224 wxString trimmedLine = line;
1225 trimmedLine.Trim(
true ).Trim(
false );
1227 aAttrs.m_StrokeWidth,
false,
false,
1229 maxLineWidth = std::max( maxLineWidth, lineExtents.
x );
1237 int textHeight = aAttrs.m_Size.y;
1238 int extraHeight = textHeight / 3;
1243 braceEnd.
x += ( (int) aLines.size() - 1 ) * aLineSpacing;
1246 braceStart.
x -= 2 * extraHeight;
1249 int braceSpacing = maxLineWidth / 2 + braceWidth;
1251 VECTOR2D topBraceStart = braceStart;
1252 topBraceStart.
y -= braceSpacing;
1255 topBraceEnd.
y -= braceSpacing;
1257 drawBrace( aGal, topBraceStart, topBraceEnd, braceWidth,
true, aAttrs );
1259 VECTOR2D bottomBraceStart = braceStart;
1260 bottomBraceStart.
y += braceSpacing;
1262 VECTOR2D bottomBraceEnd = braceEnd;
1263 bottomBraceEnd.
y += braceSpacing;
1265 drawBrace( aGal, bottomBraceStart, bottomBraceEnd, braceWidth,
false, aAttrs );
1270 braceEnd.
y += ( (int) aLines.size() - 1 ) * aLineSpacing;
1273 braceStart.
y -= 2 * extraHeight;
1276 int braceSpacing = maxLineWidth / 2 + braceWidth;
1280 leftTop.
x -= braceSpacing;
1283 leftBottom.
x -= braceSpacing;
1285 drawBrace( aGal, leftTop, leftBottom, braceWidth,
true, aAttrs );
1289 rightTop.
x += braceSpacing;
1292 rightBottom.
x += braceSpacing;
1294 drawBrace( aGal, rightTop, rightBottom, braceWidth,
false, aAttrs );
1298 const auto drawBracesAroundTextBitmap =
1303 if( aLines.size() <= 1 )
1306 int braceWidth = aAttrs.m_Size.x / 4;
1309 int maxLineWidth = aAttrs.m_Size.x * 4;
1315 int textHalfHeight = aAttrs.m_Size.y / 2;
1320 braceEnd.
x += ( (int) aLines.size() - 1 ) * aLineSpacing;
1323 leftStart.
y -= maxLineWidth / 2.0 + braceWidth / 2.0;
1326 leftEnd.
y -= maxLineWidth / 2.0 + braceWidth / 2.0;
1328 drawBrace( aGal, leftStart, leftEnd, braceWidth,
true, aAttrs );
1331 rightStart.
y += maxLineWidth / 2.0 + braceWidth / 2.0;
1334 rightEnd.
y += maxLineWidth / 2.0 + braceWidth / 2.0;
1336 drawBrace( aGal, rightStart, rightEnd, braceWidth,
false, aAttrs );
1341 braceEnd.
y += ( (int) aLines.size() - 1 ) * aLineSpacing;
1344 braceTop.
y -= textHalfHeight;
1347 braceBottom.
y += textHalfHeight;
1350 leftTop.
x -= maxLineWidth / 2.0 + braceWidth / 2.0;
1353 leftBottom.
x -= maxLineWidth / 2.0 + braceWidth / 2.0;
1355 drawBrace( aGal, leftTop, leftBottom, braceWidth,
true, aAttrs );
1358 rightTop.
x += maxLineWidth / 2.0 + braceWidth / 2.0;
1360 VECTOR2D rightBottom = braceBottom;
1361 rightBottom.
x += maxLineWidth / 2.0 + braceWidth / 2.0;
1363 drawBrace( aGal, rightTop, rightBottom, braceWidth,
false, aAttrs );
1368 const auto drawMultiLineText =
1373 if( aText.StartsWith(
"[" ) && aText.EndsWith(
"]" ) && aText.Contains(
"\n" ) )
1376 wxString content = aText.Mid( 1, aText.Length() - 2 );
1377 wxArrayString lines;
1380 if( lines.size() > 1 )
1383 int lineSpacing =
KiROUND( aAttrs.m_Size.y * 1.3 );
1394 int totalWidth = ( (int) lines.size() - 1 ) * lineSpacing;
1395 startPos.
x -= totalWidth;
1399 int totalWidth = ( (int) lines.size() - 1 ) * lineSpacing;
1400 startPos.
x -= totalWidth / 2.0;
1404 for(
size_t i = 0; i < lines.size(); i++ )
1407 linePos.
x += i * lineSpacing;
1409 wxString line = lines[i];
1410 line.Trim(
true ).Trim(
false );
1412 strokeText( aGal, line, linePos, aAttrs, aFontMetrics );
1421 int totalHeight = ( (int) lines.size() - 1 ) * lineSpacing;
1422 startPos.
y -= totalHeight;
1426 int totalHeight = ( (int) lines.size() - 1 ) * lineSpacing;
1427 startPos.
y -= totalHeight / 2.0;
1431 for(
size_t i = 0; i < lines.size(); i++ )
1434 linePos.
y += (int) i * lineSpacing;
1436 wxString line = lines[i];
1437 line.Trim(
true ).Trim(
false );
1439 strokeText( aGal, line, linePos, aAttrs, aFontMetrics );
1444 drawBracesAroundText( aGal, lines, startPos, lineSpacing, aAttrs );
1450 strokeText( aGal, aText, aPosition, aAttrs, aFontMetrics );
1453 const auto drawMultiLineTextBox =
1458 if( aText.StartsWith(
"[" ) && aText.EndsWith(
"]" ) && aText.Contains(
"\n" ) )
1460 wxString content = aText.Mid( 1, aText.Length() - 2 );
1461 wxArrayString lines;
1464 if( lines.size() > 1 )
1466 int lineSpacing =
KiROUND( aAttrs.m_Size.y * 1.3 );
1474 int totalWidth = ( (int) lines.size() - 1 ) * lineSpacing;
1475 startPos.
x -= totalWidth;
1479 int totalWidth = ( (int) lines.size() - 1 ) * lineSpacing;
1480 startPos.
x -= totalWidth / 2.0;
1483 for(
size_t i = 0; i < lines.size(); i++ )
1486 linePos.
x += (int) i * lineSpacing;
1488 wxString line = lines[i];
1489 line.Trim(
true ).Trim(
false );
1491 boxText( aGal, line, linePos, aAttrs, aFontMetrics );
1499 int totalHeight = ( (int) lines.size() - 1 ) * lineSpacing;
1500 startPos.
y -= totalHeight;
1504 int totalHeight = ( (int) lines.size() - 1 ) * lineSpacing;
1505 startPos.
y -= totalHeight / 2.0;
1508 for(
size_t i = 0; i < lines.size(); i++ )
1511 linePos.
y += (int) i * lineSpacing;
1513 wxString line = lines[i];
1514 line.Trim(
true ).Trim(
false );
1516 boxText( aGal, line, linePos, aAttrs, aFontMetrics );
1520 drawBracesAroundText( aGal, lines, startPos, lineSpacing, aAttrs );
1525 boxText( aGal, aText, aPosition, aAttrs, aFontMetrics );
1528 const auto drawMultiLineBitmapText =
1533 if( aText.StartsWith(
"[" ) && aText.EndsWith(
"]" ) && aText.Contains(
"\n" ) )
1535 wxString content = aText.Mid( 1, aText.Length() - 2 );
1536 wxArrayString lines;
1539 if( lines.size() > 1 )
1541 int lineSpacing =
KiROUND( aAttrs.m_Size.y * 1.3 );
1549 int totalWidth = ( (int) lines.size() - 1 ) * lineSpacing;
1550 startPos.
x -= totalWidth;
1554 int totalWidth = ( (int) lines.size() - 1 ) * lineSpacing;
1555 startPos.
x -= totalWidth / 2.0;
1558 for(
size_t i = 0; i < lines.size(); i++ )
1561 linePos.
x += (int) i * lineSpacing;
1563 wxString line = lines[i];
1564 line.Trim(
true ).Trim(
false );
1574 int totalHeight = ( (int) lines.size() - 1 ) * lineSpacing;
1575 startPos.
y -= totalHeight;
1579 int totalHeight = ( (int) lines.size() - 1 ) * lineSpacing;
1580 startPos.
y -= totalHeight / 2.0;
1583 for(
size_t i = 0; i < lines.size(); i++ )
1586 linePos.
y += (int) i * lineSpacing;
1588 wxString line = lines[i];
1589 line.Trim(
true ).Trim(
false );
1596 drawBracesAroundTextBitmap( aGal, lines, startPos, lineSpacing, aAttrs );
1601 bitmapText( aGal, aText, aPosition, aAttrs );
1604 const auto drawTextInfo =
1608 const bool renderTextAsBitmap = textRendersAsBitmap( *
m_gal, aTextInfo.
m_TextSize );
1611 m_gal->SetStrokeColor( aColor );
1612 m_gal->SetFillColor( aColor );
1622 if( drawingShadows )
1637 else if(
nonCached( aPin ) && renderTextAsBitmap )
1650 const auto getColorForLayer =
1651 [&](
int aDrawnLayer )
1656 return getRenderColor( aPin, aDrawnLayer, drawingShadows, aDimmed );
1661 if( std::optional<PIN_LAYOUT_CACHE::TEXT_INFO> numInfo = cache.
GetPinNumberInfo( shadowWidth ) )
1662 drawTextInfo( *numInfo, getColorForLayer(
LAYER_PINNUM ) );
1664 if( std::optional<PIN_LAYOUT_CACHE::TEXT_INFO> nameInfo = cache.
GetPinNameInfo( shadowWidth ) )
1666 drawTextInfo( *nameInfo, getColorForLayer(
LAYER_PINNAM ) );
1697 m_gal->SetStrokeColor( color );
1698 m_gal->SetIsStroke(
true );
1708 bool aDangling,
bool aDrawingShadows,
bool aBrightened )
1724 m_gal->SetIsStroke(
true );
1725 m_gal->SetIsFill(
false );
1735 bool highlightNetclassColors =
false;
1753 if( highlightNetclassColors && aLayer == aJct->
GetLayer() )
1760 if( junctionSize > 1 )
1762 m_gal->SetIsStroke( drawingShadows );
1764 m_gal->SetStrokeColor( color );
1765 m_gal->SetIsFill( !drawingShadows );
1766 m_gal->SetFillColor( color );
1777 bool drawingBusses = aLayer ==
LAYER_BUS;
1781 bool highlightNetclassColors =
false;
1782 double highlightAlpha = 0.6;
1784 double hopOverScale = 0.0;
1795 if( !highlightNetclassColors && drawingNetColorHighlights )
1798 if( drawingNetColorHighlights && !( aLine->
IsWire() || aLine->
IsBus() ) )
1801 if(
m_schSettings.m_OverrideItemColors && drawingNetColorHighlights )
1812 if( aLine->
IsNew() && drawingDangling )
1816 float width =
getLineWidth( aLine, drawingShadows, drawingNetColorHighlights );
1819 if( highlightNetclassColors )
1824 else if( drawingBusses )
1828 if( drawingNetColorHighlights )
1837 color = color.
WithAlpha( color.
a * highlightAlpha );
1840 if( ( drawingDangling || drawingShadows ) && !aLine->
IsNew() )
1845 COLOR4D indicatorColor( color );
1858 COLOR4D indicatorColor( color );
1869 if( drawingDangling )
1876 int textOffset =
KiROUND( textSize * 0.22 );
1881 pos.
y -= textOffset;
1887 pos.
x +=
KiROUND( textOffset * 1.2 );
1903 m_gal->SetIsStroke(
true );
1904 m_gal->SetIsFill(
false );
1905 m_gal->SetStrokeColor( color );
1906 m_gal->SetLineWidth( width );
1908 std::vector<VECTOR3I> curr_wire_shape;
1910 if( aLine->
IsWire() && hopOverScale > 0.0 )
1912 double lineWidth =
getLineWidth( aLine,
false, drawingNetColorHighlights );
1913 double arcRadius = lineWidth * hopOverScale;
1922 for(
size_t ii = 1; ii < curr_wire_shape.size(); ii++ )
1924 VECTOR2I start( curr_wire_shape[ii-1].x, curr_wire_shape[ii-1].y );
1926 if( curr_wire_shape[ii-1].z == 0 )
1929 VECTOR2I end( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
1936 VECTOR2I arc_middle( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
1938 VECTOR2I arc_end( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
1950 EDA_ANGLE angle1 = midAngle - startAngle;
1955 m_gal->DrawArc(
center, ( dstart -
center ).EuclideanNorm(), startAngle, angle );
1983 switch( shape->GetShape() )
1987 VECTOR2D start = shape->GetStart();
1996 EDA_ANGLE angle1 = midAngle - startAngle;
2001 m_gal->DrawArc(
center, ( start -
center ).EuclideanNorm(), startAngle, angle );
2006 m_gal->DrawCircle( shape->GetPosition(), shape->GetRadius() );
2010 if( shape->GetCornerRadius() > 0 )
2015 shape->GetRectangleWidth(),
2016 shape->GetRectangleHeight() ),
2017 shape->GetCornerRadius(),
true );
2020 m_gal->DrawPolygon( poly );
2024 m_gal->DrawRectangle( shape->GetPosition(), shape->GetEnd() );
2030 const std::vector<SHAPE*> polySegments = shape->MakeEffectiveShapes(
true );
2032 if( !polySegments.empty() )
2034 std::deque<VECTOR2D> pts;
2036 for(
SHAPE* polySegment : polySegments )
2037 pts.push_back(
static_cast<SHAPE_SEGMENT*
>( polySegment )->GetSeg().
A );
2041 for(
SHAPE* polySegment : polySegments )
2044 m_gal->DrawPolygon( pts );
2051 m_gal->DrawCurve( shape->GetStart(), shape->GetBezierC1(),
2052 shape->GetBezierC2(), shape->GetEnd() );
2063 if(
eeconfig()->m_Selection.fill_shapes )
2070 m_gal->SetIsFill(
true );
2072 m_gal->SetFillColor( color );
2076 m_gal->SetIsFill(
false );
2081 m_gal->SetIsStroke(
true );
2083 m_gal->SetStrokeColor( color );
2085 drawShape( aShape );
2102 m_gal->SetIsFill(
true );
2103 m_gal->SetIsStroke(
false );
2104 m_gal->SetFillColor( color );
2113 m_gal->SetIsFill(
true );
2114 m_gal->SetIsStroke(
false );
2115 m_gal->SetFillColor( color );
2117 drawShape( aShape );
2122 wxFAIL_MSG( wxT(
"Unsupported fill type" ) );
2131 m_gal->SetIsFill(
true );
2132 m_gal->SetIsStroke(
false );
2133 m_gal->SetFillColor( color );
2135 drawShape( aShape );
2138 float lineWidth =
getLineWidth( aShape, drawingShadows );
2142 m_gal->SetIsFill(
false );
2143 m_gal->SetIsStroke(
true );
2144 m_gal->SetLineWidth( lineWidth );
2145 m_gal->SetStrokeColor( color );
2149 drawShape( aShape );
2155 for(
SHAPE* shape : shapes )
2162 m_gal->DrawLine( a+1, b );
2164 m_gal->DrawLine( a, b );
2168 for(
SHAPE* shape : shapes )
2192 switch( aText->
Type() )
2213 if( conn && conn->
IsBus() )
2225 m_gal->SetStrokeColor( color );
2226 m_gal->SetFillColor( color );
2242 int adjust =
KiROUND( sizeDiff * 0.35 );
2243 VECTOR2I adjust_offset( 0, adjust );
2246 text_offset += adjust_offset;
2249 if( drawingShadows && font->
IsOutline() )
2254 m_gal->SetIsStroke(
false );
2255 m_gal->SetIsFill(
true );
2267 double shadowOffset = 0.0;
2269 if( drawingShadows )
2274 const double adjust = 1.2f;
2275 shadowOffset = shadowWidth/2.0f * adjust;
2289 pos.
y = bBox.
GetTop() - shadowOffset;
2292 wxFAIL_MSG( wxT(
"Indeterminate state legal only in dialogs." ) );
2301 pos.
x = bBox.
GetLeft() - shadowOffset;
2310 wxFAIL_MSG( wxT(
"Indeterminate state legal only in dialogs." ) );
2321 else if( drawingShadows )
2323 m_gal->SetIsFill(
false );
2324 m_gal->SetIsStroke(
true );
2334 text_offset.
x -= fudge;
2336 text_offset.
y -= fudge;
2338 text_offset.
x += fudge;
2340 text_offset.
y += fudge;
2355 && !shownText.Contains( wxT(
"\n" ) ) )
2362 std::vector<std::unique_ptr<KIFONT::GLYPH>>* cache =
nullptr;
2370 m_gal->DrawGlyphs( *cache );
2387 switch( aText->
Type() )
2395 showAnchor = !
static_cast<const SCH_LABEL*
>( aText )->IsDangling();
2440 float borderWidth =
getLineWidth( aTextBox, drawingShadows );
2459 std::vector<std::unique_ptr<KIFONT::GLYPH>>* cache =
nullptr;
2467 m_gal->DrawGlyphs( *cache );
2479 m_gal->SetFillColor( color );
2480 m_gal->SetStrokeColor( color );
2484 m_gal->SetIsFill(
true );
2485 m_gal->SetIsStroke(
false );
2486 m_gal->SetLineWidth( borderWidth );
2497 m_gal->SetIsFill(
true );
2498 m_gal->SetIsStroke(
false );
2499 m_gal->SetLineWidth( borderWidth );
2520 if( transparency > 0.0 )
2521 borderColor = borderColor.
WithAlpha( borderColor.
a * ( 1.0 - transparency ) );
2525 borderColor = borderColor.
Mix( bg, 0.5f );
2529 m_gal->SetIsFill(
false );
2530 m_gal->SetIsStroke(
true );
2531 m_gal->SetStrokeColor( borderColor );
2532 m_gal->SetLineWidth( borderWidth );
2542 for(
SHAPE* shape : shapes )
2550 m_gal->DrawLine( a+1, b );
2552 m_gal->DrawLine( a, b );
2556 for(
SHAPE* shape : shapes )
2570 draw( cell, aLayer, aDimmed );
2582 if( lineWidth == 0 )
2591 m_gal->SetIsFill(
false );
2592 m_gal->SetIsStroke(
true );
2593 m_gal->SetStrokeColor( color );
2594 m_gal->SetLineWidth( (
float) lineWidth );
2598 m_gal->DrawLine( ptA, ptB );
2608 m_gal->DrawLine( a+1, b );
2610 m_gal->DrawLine( a, b );
2620 std::function<bool( wxString* )> symbolResolver =
2621 [&]( wxString* token ) ->
bool
2637 std::optional<SCH_SHEET_PATH> optSheetPath;
2643 "SCH_PAINTER::draw symbol %s: Current sheet path='%s', size=%zu, empty=%d",
2645 optSheetPath->Path().AsString(),
2646 optSheetPath->size(),
2647 optSheetPath->empty() ? 1 : 0 );
2650 bool DNP = aSymbol->
GetDNP(
nullptr );
2656 if( !drawingShadows ||
eeconfig()->m_Selection.draw_selected_children )
2659 draw( &field, aLayer, DNP );
2677 std::vector<SCH_PIN*> originalPins = originalSymbol->
GetGraphicalPins( unit, bodyStyle );
2681 std::vector<SCH_PIN*> tempPins = tempSymbol.
GetGraphicalPins( unit, bodyStyle );
2689 tempItem.SetFlags( aSymbol->
GetFlags() );
2709 for(
unsigned i = 0; i < tempPins.size(); ++ i )
2712 SCH_PIN* tempPin = tempPins[ i ];
2732 for(
unsigned i = 0; i < tempPins.size(); ++i )
2735 SCH_PIN* tempPin = tempPins[ i ];
2752 std::max( bbox.
GetY() - pins.
GetY(),
2756 margins.
x = std::max( margins.
x * 0.6, margins.
y * 0.3 );
2757 margins.
y = std::max( margins.
y * 0.6, margins.
x * 0.3 );
2764 m_gal->AdvanceDepth();
2765 m_gal->SetIsStroke(
true );
2766 m_gal->SetIsFill(
true );
2767 m_gal->SetStrokeColor( marker_color );
2768 m_gal->SetFillColor( marker_color );
2770 m_gal->DrawSegment( pt1, pt2, strokeWidth );
2771 std::swap( pt1.
x, pt2.
x );
2772 m_gal->DrawSegment( pt1, pt2, strokeWidth );
2784 m_gal->AdvanceDepth();
2785 m_gal->SetIsStroke(
true );
2786 m_gal->SetIsFill(
true );
2787 m_gal->SetStrokeColor( marker_color );
2788 m_gal->SetFillColor( marker_color );
2795 int offset = 2 * strokeWidth;
2804 m_gal->AdvanceDepth();
2805 m_gal->SetFillColor( marker_color );
2831 if( std::find( layers.begin(), layers.end(), aLayer ) == layers.end() )
2851 if( shownText.IsEmpty() )
2890 m_gal->SetStrokeColor( color );
2891 m_gal->SetFillColor( color );
2893 if( drawingShadows &&
getFont( aField )->IsOutline() )
2895 BOX2I shadow_box = bbox;
2898 m_gal->SetIsStroke(
false );
2899 m_gal->SetIsFill(
true );
2912 if( drawingShadows )
2929 std::vector<std::unique_ptr<KIFONT::GLYPH>>* cache =
nullptr;
2932 cache = aField->
GetRenderCache( shownText, textpos, attributes );
2937 m_gal->DrawGlyphs( *cache );
2997 if( !drawingShadows ||
eeconfig()->m_Selection.draw_selected_children )
3000 draw( &field, aLayer,
false );
3011 if( drawingDangling )
3023 std::vector<VECTOR2I> pts;
3024 std::deque<VECTOR2D> pts2;
3029 pts2.emplace_back(
VECTOR2D( p.x, p.y ) );
3031 m_gal->SetIsStroke(
true );
3033 m_gal->SetStrokeColor( color );
3035 if( drawingShadows )
3038 m_gal->SetFillColor( color );
3039 m_gal->DrawPolygon( pts2 );
3043 m_gal->SetIsFill(
false );
3044 m_gal->DrawPolyline( pts2 );
3047 draw(
static_cast<const SCH_TEXT*
>( aLabel ), aLayer,
false );
3060 if( !drawingShadows ||
eeconfig()->m_Selection.draw_selected_children )
3063 draw( &field, aLayer,
false );
3074 if( drawingDangling )
3086 draw(
static_cast<const SCH_TEXT*
>( aLabel ), aLayer,
false );
3099 if( !( drawingShadows || drawingDangling ) ||
eeconfig()->m_Selection.draw_selected_children )
3102 draw( &field, aLayer,
false );
3113 if( drawingDangling )
3125 std::vector<VECTOR2I> i_pts;
3126 std::deque<VECTOR2D> d_pts;
3130 for(
const VECTOR2I& i_pt : i_pts )
3131 d_pts.emplace_back(
VECTOR2D( i_pt.x, i_pt.y ) );
3133 m_gal->SetIsFill(
true );
3135 m_gal->SetIsStroke(
true );
3137 m_gal->SetStrokeColor( color );
3138 m_gal->DrawPolyline( d_pts );
3140 draw(
static_cast<const SCH_TEXT*
>( aLabel ), aLayer,
false );
3154 if( !drawingShadows ||
eeconfig()->m_Selection.draw_selected_children )
3157 draw( &field, aLayer,
false );
3180 std::vector<VECTOR2I> pts;
3181 std::deque<VECTOR2D> pts2;
3186 pts2.emplace_back(
VECTOR2D( p.x, p.y ) );
3188 m_gal->SetIsFill(
false );
3189 m_gal->SetFillColor( color );
3190 m_gal->SetIsStroke(
true );
3192 m_gal->SetStrokeColor( color );
3196 m_gal->DrawLine( pts2[0], pts2[1] );
3197 m_gal->SetIsFill(
true );
3198 m_gal->DrawCircle( pts2[2], ( pts2[2] - pts2[1] ).EuclideanNorm() );
3202 m_gal->DrawLine( pts2[0], pts2[1] );
3203 m_gal->DrawCircle( pts2[2], ( pts2[2] - pts2[1] ).EuclideanNorm() );
3207 m_gal->DrawPolyline( pts2 );
3215 bool DNP = aSheet->
GetDNP();
3222 if( !drawingShadows ||
eeconfig()->m_Selection.draw_selected_children )
3225 draw( &field, aLayer, DNP );
3244 m_gal->SetIsFill(
true );
3245 m_gal->SetIsStroke(
false );
3247 m_gal->DrawRectangle( pos, pos + size );
3254 m_gal->SetIsStroke(
true );
3256 m_gal->SetIsFill(
false );
3258 m_gal->DrawRectangle( pos, pos + size );
3267 std::max( bbox.
GetY() - pins.
GetY(),
3271 margins.
x = std::max( margins.
x * 0.6, margins.
y * 0.3 );
3272 margins.
y = std::max( margins.
y * 0.6, margins.
x * 0.3 );
3279 m_gal->SetIsStroke(
true );
3280 m_gal->SetIsFill(
true );
3284 m_gal->DrawSegment( pt1, pt2, strokeWidth );
3285 std::swap( pt1.
x, pt2.
x );
3286 m_gal->DrawSegment( pt1, pt2, strokeWidth );
3298 m_gal->AdvanceDepth();
3299 m_gal->SetIsStroke(
true );
3300 m_gal->SetIsFill(
true );
3309 int offset = 2 * strokeWidth;
3318 m_gal->AdvanceDepth();
3335 m_gal->SetIsStroke(
true );
3338 m_gal->SetIsFill(
false );
3356 bool drawingBusses = aLayer ==
LAYER_BUS;
3361 bool highlightNetclassColors =
false;
3369 if( !highlightNetclassColors && drawingNetColorHighlights )
3372 if(
m_schSettings.m_OverrideItemColors && drawingNetColorHighlights )
3400 if( highlightNetclassColors )
3405 else if( drawingBusses )
3409 if( drawingNetColorHighlights )
3421 if( drawingDangling )
3423 m_gal->SetIsFill(
false );
3424 m_gal->SetIsStroke(
true );
3445 draw( &line, aLayer );
3461 if( img_scale != 1.0 )
3474 m_gal->SetIsStroke(
true );
3475 m_gal->SetStrokeColor( color );
3477 m_gal->SetIsFill(
false );
3485 bm_size.
x /= img_scale;
3486 bm_size.
y /= img_scale;
3487 const VECTOR2D origin( -bm_size.
x / 2.0, -bm_size.
y / 2.0 );
3490 m_gal->DrawRectangle( origin,
end );
3512 m_gal->SetIsFill( !drawingShadows );
3513 m_gal->SetFillColor( color );
3514 m_gal->SetIsStroke( drawingShadows );
3516 m_gal->SetStrokeColor( color );
3521 m_gal->DrawPolygon( polygon );
3528 const bool drawingShadows =
false;
3549 m_gal->SetStrokeColor( color );
3557 m_gal->DrawLine( topLeft, topLeft + width );
3558 m_gal->DrawLine( topLeft + width, topLeft + width + height );
3559 m_gal->DrawLine( topLeft + width + height, topLeft + height );
3560 m_gal->DrawLine( topLeft + height, topLeft );
3564 if(
name.IsEmpty() )
3568 int scaledSize = abs(
KiROUND(
m_gal->GetScreenWorldMatrix().GetScale().x * ptSize ) );
3569 int unscaledSize =
schIUScale.MilsToIU( ptSize );
3572 int textSize = ( scaledSize + ( unscaledSize * 2 ) ) / 3;
3578 m_gal->DrawLine( topLeft, topLeft - titleHeight );
3579 m_gal->DrawLine( topLeft - titleHeight, topLeft + width - titleHeight );
3580 m_gal->DrawLine( topLeft + width - titleHeight, topLeft + width );
3597 LINE_STYLE aLineStyle,
bool aDrawDirectLine,
int aWidth )
3599 if( aDrawDirectLine )
3601 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.
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
const SHAPE_POLY_SET & GetHatching() const
FILL_T GetFillMode() const
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
COLOR4D GetFillColor() const
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
const VECTOR2I & GetTextPos() const
COLOR4D GetTextColor() 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
BOX2I GetTextBox(const RENDER_SETTINGS *aSettings, int aLine=-1) const
Useful in multiline texts to calculate the full text or a line area (for zones filling,...
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)
VECTOR2I GetTextSize() const
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) 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.
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.
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::vector< SCH_PIN * > GetGraphicalPins(int aUnit=0, int aBodyStyle=0) const
Graphical pins: Return schematic pin objects as drawn (unexpanded), filtered by unit/body.
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.
SCHEMATIC_SETTINGS & Settings() 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).
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
bool IsHypertext() const override
Allow items to support hypertext actions when hovered/clicked.
std::vector< int > ViewGetLayers() const override
Return the all the layers within the VIEW the object is painted on.
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const
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 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
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
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
STROKE_PARAMS GetStroke() const override
VECTOR2I GetPosition() const override
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
bool IsHypertext() const override
Allow items to support hypertext actions when hovered/clicked.
bool IsHypertext() const override
Allow items to support hypertext actions when hovered/clicked.
VECTOR2I GetPosition() const override
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.
void Fracture()
Convert a set of polygons with holes to a single outline with "slits"/"fractures" connecting the oute...
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 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)
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.
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)
@ GR_TEXT_H_ALIGN_INDETERMINATE
@ GR_TEXT_V_ALIGN_INDETERMINATE
wxLogTrace helper definitions.
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
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