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;
67 const int halfLength =
m_pin.GetLength() / 2;
74 if( formatted.Contains(
'\n' ) )
78 perpHeight = (int) lines.size() *
KiROUND( num_size * 1.3 );
81 const int perpendicularHalf = perpHeight / 2;
84 const bool flipStacked = formatted.Contains(
'\n' )
92 bool showBothNameAndNumber = !
m_pin.GetShownName().IsEmpty()
101 if( showBothNameAndNumber )
104 centerX = pinPos.
x + perpendicularOffset;
109 centerX = flipStacked ? pinPos.
x + perpendicularOffset : pinPos.
x - perpendicularOffset;
112 info->m_TextPosition.x = centerX;
115 info->m_TextPosition.y = pinPos.
y + halfLength;
117 info->m_TextPosition.y = pinPos.
y - halfLength;
126 bool showBothNameAndNumber = !
m_pin.GetShownName().IsEmpty()
132 if( showBothNameAndNumber )
145 info->m_TextPosition.x = pinPos.
x - halfLength;
147 info->m_TextPosition.x = pinPos.
x + halfLength;
149 info->m_TextPosition.y = centerY;
191 bool aShowElectricalType,
bool aShowAltIcons )
217 const wxString& aText,
222 if( !aDefinitelyDirty && aCache.
m_Font == aFont && aCache.
m_FontSize == aSize )
234 if( aText.StartsWith(
"[" ) && aText.EndsWith(
"]" ) && aText.Contains(
"\n" ) )
237 wxString content = aText.Mid( 1, aText.Length() - 2 );
241 if( lines.size() > 1 )
243 int lineSpacing =
KiROUND( aSize * 1.3 );
247 for(
const wxString& line : lines )
249 wxString trimmedLine = line;
250 trimmedLine.Trim(
true ).Trim(
false );
252 maxWidth = std::max( maxWidth, lineExtents.
x );
256 int totalHeight = aSize + ( lines.size() - 1 ) * lineSpacing;
259 int braceWidth = aSize / 3;
260 maxWidth += braceWidth * 2;
261 totalHeight += aSize / 3;
291 const wxString number =
m_pin.GetShownNumber();
297 const wxString
name =
m_pin.GetShownName();
302 double fontSize = std::max(
m_pin.GetNameTextSize() * 3 / 4,
schIUScale.mmToIU( 0.7 ) );
372 rotated.
x = -rotated.
x;
373 rotated.
y = -rotated.
y;
377 rotated = { baseLocal.
y, -baseLocal.
x };
381 rotated = { -baseLocal.
y, baseLocal.
x };
395 bool aIncludeNameAndNumber,
bool aIncludeElectricalType )
400 wxCHECK( libPin,
BOX2I() );
403 aIncludeElectricalType );
405 r = symbol->GetTransform().TransformCoordinate( r );
406 r.
Offset( symbol->GetPosition() );
412 bool includeName = aIncludeNameAndNumber && !
m_pin.GetShownName().IsEmpty();
413 bool includeNumber = aIncludeNameAndNumber && !
m_pin.GetShownNumber().IsEmpty();
414 bool includeType = aIncludeElectricalType;
416 if( !aIncludeLabelsOnInvisiblePins && !
m_pin.IsVisible() )
419 includeNumber =
false;
423 if(
const SYMBOL* parentSymbol =
m_pin.GetParentSymbol() )
425 if( !parentSymbol->GetShowPinNames() )
428 if( !parentSymbol->GetShowPinNumbers() )
429 includeNumber =
false;
434 const int pinLength =
m_pin.GetLength();
444 bbox.
Merge( pinBox );
449 bbox.
Merge( *decoBox );
456 bbox.
Merge( *nameBox );
461 bbox.
Merge( *altIconBox );
469 bbox.
Merge( *numBox );
477 bbox.
Merge( *typeBox );
483 if(
m_pin.IsDangling() )
513 const float offsetRatio =
521 int pinNameOffset = 0;
522 if(
const SYMBOL* parentSymbol =
m_pin.GetParentSymbol() )
524 if( parentSymbol->GetShowPinNames() )
525 pinNameOffset = parentSymbol->GetPinNameOffset();
536 const int pinLength =
m_pin.GetLength();
538 if( pinNameOffset > 0 )
561 int pinNameOffset = 0;
563 if(
const SYMBOL* parentSymbol =
m_pin.GetParentSymbol() )
565 if( parentSymbol->GetShowPinNames() )
566 pinNameOffset = parentSymbol->GetPinNameOffset();
569 const int pinLength =
m_pin.GetLength();
575 bool showBothNameAndNumber = ( pinNameOffset == 0
577 &&
m_pin.GetParentSymbol()->GetShowPinNames() );
580 if( showBothNameAndNumber )
593 box->
Move( { 0, textPos } );
623 const int iconSize = std::min(
m_pin.GetNameTextSize(),
schIUScale.mmToIU( 1.5 ) );
625 VECTOR2I c{ 0, ( nameBox->GetTop() + nameBox->GetBottom() ) / 2 };
626 if(
m_pin.GetParentSymbol()->GetPinNameOffset() > 0 )
629 c.x = nameBox->GetRight() + iconSize * 0.75;
633 c.x = nameBox->GetLeft() - iconSize * 0.75;
646 const auto makeInvertBox =
649 return BOX2I::ByCenter( { -decoSize, 0 }, { decoSize * 2, decoSize * 2 } );
652 const auto makeLowBox =
658 const auto makeClockBox =
661 return BOX2I::ByCorners( { 0, -intDecoSize }, { intDecoSize, intDecoSize } );
669 box = makeInvertBox();
673 box = makeClockBox();
677 box = makeInvertBox();
678 box->Merge( makeClockBox() );
688 box->Merge( makeClockBox() );
704 box->Move( {
m_pin.GetLength(), 0 } );
705 box->Inflate(
m_pin.GetPenWidth() / 2 );
760 if(
name.IsEmpty() || !
m_pin.GetParentSymbol()->GetShowPinNames() )
765 info->m_TextSize =
m_pin.GetNameTextSize();
769 bool nameInside =
m_pin.GetParentSymbol()->GetPinNameOffset() > 0;
774 VECTOR2I pos = {
m_pin.GetLength() +
m_pin.GetParentSymbol()->GetPinNameOffset(), 0 };
777 info->m_TextPosition = pos +
VECTOR2I{ -shadowOffset, 0 };
787 info->m_TextPosition = pos;
797 int maxHalfHeight = 0;
800 wxString n = p->GetShownName();
805 maxHalfHeight = std::max( maxHalfHeight, p->GetNameTextSize() / 2 );
810 const int halfLength =
m_pin.GetLength() / 2;
820 int centerX = pinPos.
x - perpendicularOffset;
821 info->m_TextPosition = { centerX, pinPos.
y };
824 info->m_TextPosition.y += halfLength;
826 info->m_TextPosition.y -= halfLength;
835 info->m_TextPosition = { pinPos.
x, pinPos.
y - ( maxHalfHeight +
clearance +
info->m_Thickness ) };
838 info->m_TextPosition.x -= halfLength;
840 info->m_TextPosition.x += halfLength;
855std::optional<PIN_LAYOUT_CACHE::TEXT_INFO>
864 info->m_Text =
m_pin.GetElectricalTypeName();
867 info->m_Thickness =
info->m_TextSize / 8;
876 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.
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