41 wxString number =
m_pin.GetShownNumber();
43 if( number.IsEmpty() || !
m_pin.GetParentSymbol()->GetShowPinNumbers() )
50 int length =
m_pin.GetLength();
51 int num_size =
m_pin.GetNumberTextSize();
55 info->m_Text = formatted;
56 info->m_TextSize = num_size;
63 auto estimateQABox = [&](
const wxString& txt,
int size,
bool isVertical ) ->
VECTOR2I
66 int w = (int) ( txt.Length() * size * 0.6 );
68 if( txt.Contains(
'\n' ) )
75 int lineSpacing =
KiROUND( size * 1.3 );
76 w = (int) lines.size() * lineSpacing;
78 for(
const wxString& l : lines )
79 maxLen = std::max( maxLen, l.Length() );
80 h = (int) ( maxLen * size * 0.6 );
84 int lineSpacing =
KiROUND( size * 1.3 );
85 h = (int) lines.size() * lineSpacing;
87 for(
const wxString& l : lines )
88 maxLen = std::max( maxLen, l.Length() );
89 w = (int) ( maxLen * size * 0.6 );
99 int maxHalfHeight = 0;
100 int maxHalfWidth = 0;
101 int maxFullHeight = 0;
107 wxString raw = p->GetShownNumber();
113 p->GetFontMetrics() );
115 VECTOR2I boxHoriz = estimateQABox( fmt, p->GetNumberTextSize(),
false );
116 maxHalfHeight = std::max( maxHalfHeight, boxHoriz.
y / 2 );
117 maxFullHeight = std::max( maxFullHeight, boxHoriz.
y );
121 VECTOR2I boxVert = estimateQABox( fmt, p->GetNumberTextSize(),
true );
122 maxHalfWidth = std::max( maxHalfWidth, boxVert.
x / 2 );
128 const int halfLength =
m_pin.GetLength() / 2;
132 VECTOR2I currentBox = estimateQABox( formatted,
info->m_TextSize, verticalOrient );
133 int currentHalfHeight = currentBox.
y / 2;
134 int currentHalfWidth = currentBox.
x / 2;
139 bool stackedValid =
false;
147 bool showBothNameAndNumber = !
m_pin.GetShownName().IsEmpty()
153 int perpendicularOffset;
155 if( hasStackingNotation || formatted.Contains(
'\n' ) )
171 if( showBothNameAndNumber )
174 centerX = pinPos.
x + perpendicularOffset;
179 centerX = pinPos.
x - perpendicularOffset;
182 info->m_TextPosition.x = centerX;
185 info->m_TextPosition.y = pinPos.
y + halfLength;
187 info->m_TextPosition.y = pinPos.
y - halfLength;
196 bool showBothNameAndNumber = !
m_pin.GetShownName().IsEmpty()
202 if( showBothNameAndNumber )
216 info->m_TextPosition.x = pinPos.
x - halfLength;
218 info->m_TextPosition.x = pinPos.
x + halfLength;
220 info->m_TextPosition.y = centerY;
262 bool aShowElectricalType,
bool aShowAltIcons )
288 const wxString& aText,
293 if( !aDefinitelyDirty && aCache.
m_Font == aFont && aCache.
m_FontSize == aSize )
305 if( aText.StartsWith(
"[" ) && aText.EndsWith(
"]" ) && aText.Contains(
"\n" ) )
308 wxString content = aText.Mid( 1, aText.Length() - 2 );
312 if( lines.size() > 1 )
314 int lineSpacing =
KiROUND( aSize * 1.3 );
318 for(
const wxString& line : lines )
320 wxString trimmedLine = line;
321 trimmedLine.Trim(
true ).Trim(
false );
323 maxWidth = std::max( maxWidth, lineExtents.
x );
327 int totalHeight = aSize + ( lines.size() - 1 ) * lineSpacing;
330 int braceWidth = aSize / 3;
331 maxWidth += braceWidth * 2;
332 totalHeight += aSize / 3;
362 const wxString number =
m_pin.GetShownNumber();
368 const wxString
name =
m_pin.GetShownName();
373 double fontSize = std::max(
m_pin.GetNameTextSize() * 3 / 4,
schIUScale.mmToIU( 0.7 ) );
443 rotated.
x = -rotated.
x;
444 rotated.
y = -rotated.
y;
448 rotated = { baseLocal.
y, -baseLocal.
x };
452 rotated = { -baseLocal.
y, baseLocal.
x };
466 bool aIncludeNameAndNumber,
bool aIncludeElectricalType )
471 wxCHECK( libPin,
BOX2I() );
474 aIncludeElectricalType );
476 r = symbol->GetTransform().TransformCoordinate( r );
477 r.
Offset( symbol->GetPosition() );
483 bool includeName = aIncludeNameAndNumber && !
m_pin.GetShownName().IsEmpty();
484 bool includeNumber = aIncludeNameAndNumber && !
m_pin.GetShownNumber().IsEmpty();
485 bool includeType = aIncludeElectricalType;
487 if( !aIncludeLabelsOnInvisiblePins && !
m_pin.IsVisible() )
490 includeNumber =
false;
494 if(
const SYMBOL* parentSymbol =
m_pin.GetParentSymbol() )
496 if( !parentSymbol->GetShowPinNames() )
499 if( !parentSymbol->GetShowPinNumbers() )
500 includeNumber =
false;
505 const int pinLength =
m_pin.GetLength();
515 bbox.
Merge( pinBox );
520 bbox.
Merge( *decoBox );
527 bbox.
Merge( *nameBox );
532 bbox.
Merge( *altIconBox );
540 bbox.
Merge( *numBox );
548 bbox.
Merge( *typeBox );
554 if(
m_pin.IsDangling() )
584 const float offsetRatio =
592 int pinNameOffset = 0;
593 if(
const SYMBOL* parentSymbol =
m_pin.GetParentSymbol() )
595 if( parentSymbol->GetShowPinNames() )
596 pinNameOffset = parentSymbol->GetPinNameOffset();
607 const int pinLength =
m_pin.GetLength();
609 if( pinNameOffset > 0 )
632 int pinNameOffset = 0;
634 if(
const SYMBOL* parentSymbol =
m_pin.GetParentSymbol() )
636 if( parentSymbol->GetShowPinNames() )
637 pinNameOffset = parentSymbol->GetPinNameOffset();
640 const int pinLength =
m_pin.GetLength();
646 bool showBothNameAndNumber = ( pinNameOffset == 0
648 &&
m_pin.GetParentSymbol()->GetShowPinNames() );
651 if( showBothNameAndNumber )
664 box->
Move( { 0, textPos } );
694 const int iconSize = std::min(
m_pin.GetNameTextSize(),
schIUScale.mmToIU( 1.5 ) );
696 VECTOR2I c{ 0, ( nameBox->GetTop() + nameBox->GetBottom() ) / 2 };
697 if(
m_pin.GetParentSymbol()->GetPinNameOffset() > 0 )
700 c.x = nameBox->GetRight() + iconSize * 0.75;
704 c.x = nameBox->GetLeft() - iconSize * 0.75;
717 const auto makeInvertBox =
720 return BOX2I::ByCenter( { -decoSize, 0 }, { decoSize * 2, decoSize * 2 } );
723 const auto makeLowBox =
729 const auto makeClockBox =
732 return BOX2I::ByCorners( { 0, -intDecoSize }, { intDecoSize, intDecoSize } );
740 box = makeInvertBox();
744 box = makeClockBox();
748 box = makeInvertBox();
749 box->Merge( makeClockBox() );
759 box->Merge( makeClockBox() );
775 box->Move( {
m_pin.GetLength(), 0 } );
776 box->Inflate(
m_pin.GetPenWidth() / 2 );
831 if(
name.IsEmpty() || !
m_pin.GetParentSymbol()->GetShowPinNames() )
836 info->m_TextSize =
m_pin.GetNameTextSize();
840 bool nameInside =
m_pin.GetParentSymbol()->GetPinNameOffset() > 0;
845 VECTOR2I pos = {
m_pin.GetLength() +
m_pin.GetParentSymbol()->GetPinNameOffset(), 0 };
848 info->m_TextPosition = pos +
VECTOR2I{ -shadowOffset, 0 };
858 info->m_TextPosition = pos;
868 int maxHalfHeight = 0;
871 wxString n = p->GetShownName();
876 maxHalfHeight = std::max( maxHalfHeight, p->GetNameTextSize() / 2 );
881 const int halfLength =
m_pin.GetLength() / 2;
891 int centerX = pinPos.
x - perpendicularOffset;
892 info->m_TextPosition = { centerX, pinPos.
y };
895 info->m_TextPosition.y += halfLength;
897 info->m_TextPosition.y -= halfLength;
906 info->m_TextPosition = { pinPos.
x, pinPos.
y - ( maxHalfHeight +
clearance +
info->m_Thickness ) };
909 info->m_TextPosition.x -= halfLength;
911 info->m_TextPosition.x += halfLength;
926std::optional<PIN_LAYOUT_CACHE::TEXT_INFO>
935 info->m_Text =
m_pin.GetElectricalTypeName();
938 info->m_Thickness =
info->m_TextSize / 8;
947 if(
m_pin.IsDangling() )
constexpr EDA_IU_SCALE schIUScale
std::optional< BOX2I > OPT_BOX2I
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
static constexpr BOX2< VECTOR2I > ByCorners(const VECTOR2I &aCorner1, const VECTOR2I &aCorner2)
constexpr BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
static constexpr BOX2< VECTOR2I > ByCenter(const VECTOR2I &aCenter, const SizeVec &aSize)
constexpr BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
constexpr const Vec GetCenter() const
constexpr coord_type GetLeft() const
constexpr void Move(const Vec &aMoveVector)
Move the rectangle by the aMoveVector.
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.
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 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).
OPT_BOX2I getUntransformedPinNameBox() const
Get the untransformd text box in the default orientation.
TEXT_EXTENTS_CACHE m_nameExtentsCache
void transformTextForPin(TEXT_INFO &aTextInfo) const
Transform text info to suit a pin's.
OPT_BOX2I GetAltIconBBox()
Get the box of the alt mode icon, if there is one.
void transformBoxForPin(BOX2I &aBox) const
Transform a box (in-place) to the pin's orientation.
void recomputeCaches()
Recompute all the caches that have become dirty.
const SCHEMATIC_SETTINGS * m_schSettings
OPT_BOX2I GetPinNumberBBox()
Get the bounding box of the pin number, if there is one.
PIN_LAYOUT_CACHE(const SCH_PIN &aPin)
bool m_showElectricalType
TEXT_EXTENTS_CACHE m_typeExtentsCache
BOX2I GetPinBoundingBox(bool aIncludeLabelsOnInvisiblePins, bool aIncludeNameAndNumber, bool aIncludeElectricalType)
Get the bounding box of the pin itself.
TEXT_EXTENTS_CACHE m_numExtentsCache
OPT_BOX2I getUntransformedPinTypeBox() const
std::optional< TEXT_INFO > GetPinNameInfo(int aShadowWidth)
Get the text info for the pin name.
static void recomputeExtentsCache(bool aDefinitelyDirty, KIFONT::FONT *aFont, int aSize, const wxString &aText, const KIFONT::METRICS &aFontMetrics, TEXT_EXTENTS_CACHE &aCache)
std::optional< TEXT_INFO > GetPinElectricalTypeInfo(int aShadowWidth)
bool isDirty(int aMask) const
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)
OPT_BOX2I GetPinNameBBox()
Get the bounding box of the pin name, if there is one.
void MarkDirty(int aFlags)
Recompute all the layout information.
void SetRenderParameters(int aNameThickness, int aNumberThickness, bool aShowElectricalType, bool aShowAltIcons)
OPT_BOX2I getUntransformedAltIconBox() const
int getPinTextOffset() const
Get the current pin text offset.
OPT_BOX2I getUntransformedDecorationBox() const
Pin type decoration if any.
const SCH_PIN & m_pin
The pin in question.
OPT_BOX2I getUntransformedPinNumberBox() const
float m_shadowOffsetAdjust
These are loaded from Eeschema settings but then overwritten by the project settings.
Holds all the data relating to one schematic.
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
int GetNumberTextSize() const
int GetNameTextSize() const
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
A base class for LIB_SYMBOL and SCH_SYMBOL.
int GetPinNameOffset() const
virtual std::vector< SCH_PIN * > GetPins() const =0
virtual bool GetShowPinNames() const
#define DEFAULT_TEXT_OFFSET_RATIO
Ratio of the font height to space around global labels.
static bool empty(const wxTextEntryBase *aCtrl)
static constexpr EDA_ANGLE ANGLE_90
static constexpr EDA_ANGLE ANGLE_VERTICAL
static constexpr EDA_ANGLE ANGLE_HORIZONTAL
TRANSFORM DefaultTransform
int GetPenSizeForNormal(int aTextSize)
static int externalPinDecoSize(const SCHEMATIC_SETTINGS *aSettings, const SCH_PIN &aPin)
static int internalPinDecoSize(const SCHEMATIC_SETTINGS *aSettings, const SCH_PIN &aPin)
wxString FormatStackedPinForDisplay(const wxString &aPinNumber, int aPinLength, int aTextSize, KIFONT::FONT *aFont, const KIFONT::METRICS &aFontMetrics)
PIN_ORIENTATION
The symbol library pin object orientations.
@ PIN_UP
The pin extends upwards from the connection point: Probably on the bottom side of the symbol.
@ PIN_RIGHT
The pin extends rightwards from the connection point.
@ PIN_LEFT
The pin extends leftwards from the connection point: Probably on the right side of the symbol.
@ PIN_DOWN
The pin extends downwards from the connection: Probably on the top side of the symbol.
#define TARGET_PIN_RADIUS
T * GetAppSettings(const char *aFilename)
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 CountStackedPinNotation(const wxString &aPinName, bool *aValid)
Count the number of pins represented by stacked pin notation.
Cached extent of a text item.
GR_TEXT_H_ALIGN_T m_HAlign
constexpr GR_TEXT_H_ALIGN_T GetFlippedAlignment(GR_TEXT_H_ALIGN_T aAlign)
Get the reverse alignment: left-right are swapped, others are unchanged.
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.
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D