42#define PIN_TEXT_MARGIN 4
50 static const wxChar* msgPinElectricType[] =
54 wxT(
"bidirectional" ),
61 wxT(
"open_collector" ),
62 wxT(
"open_emitter" ),
66 return msgPinElectricType[
static_cast<int>( aType )];
101 m_position( { 0, 0 } ),
132 int aNameTextSize,
int aNumTextSize,
int aBodyStyle,
const VECTOR2I& aPos,
138 m_orientation( aOrientation ),
142 m_numTextSize( aNumTextSize ),
143 m_nameTextSize( aNameTextSize ),
161 wxASSERT( aParentSymbol );
176 const KIID& aUuid ) :
186 wxASSERT( aParentSymbol );
195 m_libPin( aPin.m_libPin ),
196 m_alternates( aPin.m_alternates ),
197 m_position( aPin.m_position ),
198 m_length( aPin.m_length ),
199 m_orientation( aPin.m_orientation ),
200 m_shape( aPin.m_shape ),
201 m_type( aPin.m_type ),
202 m_hidden( aPin.m_hidden ),
203 m_numTextSize( aPin.m_numTextSize ),
204 m_nameTextSize( aPin.m_nameTextSize ),
205 m_isDangling( aPin.m_isDangling )
240 return symbol->GetTransform().TransformCoordinate(
m_position ) + symbol->GetPosition();
249 wxCHECK_MSG(
m_libPin, PIN_ORIENTATION::PIN_RIGHT, wxS(
"Can't inherit without a libPin!" ) );
260 if( !
m_alt.IsEmpty() )
262 wxCHECK_MSG(
m_libPin, GRAPHIC_PINSHAPE::LINE, wxS(
"Can't specify alternate without a "
267 else if(
m_shape == GRAPHIC_PINSHAPE::INHERIT )
269 wxCHECK_MSG(
m_libPin, GRAPHIC_PINSHAPE::LINE, wxS(
"Can't inherit without a libPin!" ) );
282 wxCHECK_MSG(
m_libPin, 0, wxS(
"Can't inherit without a libPin!" ) );
293 if( !
m_alt.IsEmpty() )
295 wxCHECK_MSG(
m_libPin, ELECTRICAL_PINTYPE::PT_UNSPECIFIED, wxS(
"Can't specify alternate "
296 "without a libPin!" ) );
300 else if(
m_type == ELECTRICAL_PINTYPE::PT_INHERIT )
302 wxCHECK_MSG(
m_libPin, ELECTRICAL_PINTYPE::PT_UNSPECIFIED, wxS(
"Can't inherit without a "
314 if(
m_type == ELECTRICAL_PINTYPE::PT_INHERIT )
317 wxS(
"Can't inherit without a m_libPin!" ) );
328 if(
m_type == ELECTRICAL_PINTYPE::PT_INHERIT )
331 wxS(
"Can't inherit without a m_libPin!" ) );
344 wxCHECK_MSG(
m_libPin,
true, wxS(
"Can't inherit without a libPin!" ) );
355 if( !
m_alt.IsEmpty() )
369 m_name.Replace( wxT(
" " ), wxT(
"_" ) );
376 bool isConnectableType_a =
GetType() == ELECTRICAL_PINTYPE::PT_PASSIVE
377 ||
GetType() == ELECTRICAL_PINTYPE::PT_NIC;
378 bool isConnectableType_b = aPin->
GetType() == ELECTRICAL_PINTYPE::PT_PASSIVE
379 || aPin->
GetType() == ELECTRICAL_PINTYPE::PT_NIC;
384 && (
GetType() == aPin->
GetType() || isConnectableType_a || isConnectableType_b );
403 bool isReplaced =
false;
419 aAccuracy = std::max( aAccuracy,
Schematic()->Settings().m_PinSymbolSize / 4 );
446 if( !
m_alt.IsEmpty() )
451 if(
m_name == wxS(
"~" ) )
452 return wxEmptyString;
461 return wxEmptyString;
472 m_number.Replace( wxT(
" " ), wxT(
"_" ) );
482 wxS(
"Can't inherit without a libPin!" ) );
504 wxS(
"Can't inherit without a libPin!" ) );
525 const TRANSFORM& t = symbol->GetTransform();
542 const VECTOR2I& aOffset,
bool aForceNoFill,
bool aDimmed )
546 wxCHECK( part && aSettings, );
567 &&
m_type != ELECTRICAL_PINTYPE::PT_NC
568 &&
m_type != ELECTRICAL_PINTYPE::PT_NIC )
594 int MapX1, MapY1, x1, y1;
618 switch( aOrientation )
620 case PIN_ORIENTATION::PIN_UP: y1 = posY - len; MapY1 = 1;
break;
621 case PIN_ORIENTATION::PIN_DOWN: y1 = posY + len; MapY1 = -1;
break;
622 case PIN_ORIENTATION::PIN_LEFT: x1 = posX - len; MapX1 = 1;
break;
623 case PIN_ORIENTATION::PIN_RIGHT: x1 = posX + len; MapX1 = -1;
break;
624 case PIN_ORIENTATION::INHERIT: wxFAIL_MSG( wxS(
"aOrientation must be resolved!" ) );
break;
627 if(
m_shape == GRAPHIC_PINSHAPE::INVERTED ||
m_shape == GRAPHIC_PINSHAPE::INVERTED_CLOCK )
632 GRMoveTo( MapX1 * radius * 2 + x1, MapY1 * radius * 2 + y1 );
642 if(
m_shape == GRAPHIC_PINSHAPE::CLOCK
643 ||
m_shape == GRAPHIC_PINSHAPE::INVERTED_CLOCK
644 ||
m_shape == GRAPHIC_PINSHAPE::FALLING_EDGE_CLOCK
645 ||
m_shape == GRAPHIC_PINSHAPE::CLOCK_LOW )
651 GRLineTo( DC, x1 - MapX1 * clock_size * 2, y1, width,
color );
657 GRLineTo( DC, x1, y1 - MapY1 * clock_size * 2, width,
color );
663 if(
m_shape == GRAPHIC_PINSHAPE::INPUT_LOW
664 ||
m_shape == GRAPHIC_PINSHAPE::FALLING_EDGE_CLOCK
665 ||
m_shape == GRAPHIC_PINSHAPE::CLOCK_LOW )
670 GRMoveTo( x1 + MapX1 * deco_size * 2, y1 );
671 GRLineTo( DC, x1 + MapX1 * deco_size * 2, y1 - deco_size * 2, width,
color );
676 GRMoveTo( x1, y1 + MapY1 * deco_size * 2 );
677 GRLineTo( DC, x1 - deco_size * 2, y1 + MapY1 * deco_size * 2, width,
color );
682 if(
m_shape == GRAPHIC_PINSHAPE::OUTPUT_LOW )
688 GRLineTo( DC, x1 + MapX1 * deco_size * 2, y1, width,
color );
693 GRLineTo( DC, x1, y1 + MapY1 * deco_size * 2, width,
color );
696 else if(
m_shape == GRAPHIC_PINSHAPE::NONLOGIC )
699 GRMoveTo( x1 - (MapX1 + MapY1) * deco_size, y1 - (MapY1 - MapX1) * deco_size );
700 GRLineTo( DC, x1 + (MapX1 + MapY1) * deco_size, y1 + ( MapY1 - MapX1 ) * deco_size, width,
702 GRMoveTo( x1 - (MapX1 - MapY1) * deco_size, y1 - (MapY1 + MapX1) * deco_size );
703 GRLineTo( DC, x1 + (MapX1 - MapY1) * deco_size, y1 + ( MapY1 + MapX1 ) * deco_size, width,
707 if(
m_type == ELECTRICAL_PINTYPE::PT_NC )
710 GRLine( DC, posX - deco_size, posY - deco_size, posX + deco_size, posY + deco_size, width,
712 GRLine( DC, posX + deco_size, posY - deco_size, posX - deco_size, posY + deco_size, width,
720 bool aDrawPinName,
bool aDimmed )
722 if( !aDrawPinName && !aDrawPinNum )
748 nameColor = nameColor.
Mix( bg, 0.5f );
749 numColor = numColor.
Mix( bg, 0.5f );
757 case PIN_ORIENTATION::PIN_UP: y1 -=
GetLength();
break;
758 case PIN_ORIENTATION::PIN_DOWN: y1 +=
GetLength();
break;
759 case PIN_ORIENTATION::PIN_LEFT: x1 -=
GetLength();
break;
760 case PIN_ORIENTATION::PIN_RIGHT: x1 +=
GetLength();
break;
761 case PIN_ORIENTATION::INHERIT: wxFAIL_MSG( wxT(
"aPinOrient must be resolved!" ) );
break;
765 aDrawPinName =
false;
775 nameSize, hAlign, vAlign, 0,
false,
false, font,
GetFontMetrics() );
783 numSize, hAlign, vAlign, 0,
false,
false, font,
GetFontMetrics() );
788 if( ( aPinOrient == PIN_ORIENTATION::PIN_LEFT )
789 || ( aPinOrient == PIN_ORIENTATION::PIN_RIGHT ) )
794 if( aPinOrient == PIN_ORIENTATION::PIN_RIGHT )
815 if( aPinOrient == PIN_ORIENTATION::PIN_DOWN )
847 if( ( aPinOrient == PIN_ORIENTATION::PIN_LEFT )
848 || ( aPinOrient == PIN_ORIENTATION::PIN_RIGHT ) )
851 if( aDrawPinName && aDrawPinNum )
859 else if( aDrawPinName )
864 else if( aDrawPinNum )
872 if( aDrawPinName && aDrawPinNum )
880 else if( aDrawPinName )
885 else if( aDrawPinNum )
905 #define ETXT_MAX_SIZE schIUScale.mmToIU( 0.7 )
911 int pensize = textSize/6;
935 switch( aOrientation )
937 case PIN_ORIENTATION::PIN_UP:
943 case PIN_ORIENTATION::PIN_DOWN:
948 case PIN_ORIENTATION::PIN_LEFT:
952 case PIN_ORIENTATION::PIN_RIGHT:
957 case PIN_ORIENTATION::INHERIT:
958 wxFAIL_MSG( wxS(
"aOrientation must be resolved!" ) );
970 int MapX1, MapY1, x1, y1;
977 if( bg == COLOR4D::UNSPECIFIED || !aPlotter->
GetColorMode() )
990 x1 = aPosition.
x; y1 = aPosition.
y;
992 switch( aOrientation )
994 case PIN_ORIENTATION::PIN_UP: y1 = aPosition.
y - pinLength; MapY1 = 1;
break;
995 case PIN_ORIENTATION::PIN_DOWN: y1 = aPosition.
y + pinLength; MapY1 = -1;
break;
996 case PIN_ORIENTATION::PIN_LEFT: x1 = aPosition.
x - pinLength; MapX1 = 1;
break;
997 case PIN_ORIENTATION::PIN_RIGHT: x1 = aPosition.
x + pinLength; MapX1 = -1;
break;
998 case PIN_ORIENTATION::INHERIT: wxFAIL_MSG( wxS(
"aOrientation must be resolved!" ) );
break;
1001 if(
m_shape == GRAPHIC_PINSHAPE::INVERTED ||
m_shape == GRAPHIC_PINSHAPE::INVERTED_CLOCK )
1004 aPlotter->
Circle(
VECTOR2I( MapX1 * radius + x1, MapY1 * radius + y1 ), radius * 2,
1005 FILL_T::NO_FILL, penWidth );
1007 aPlotter->
MoveTo(
VECTOR2I( MapX1 * radius * 2 + x1, MapY1 * radius * 2 + y1 ) );
1010 else if(
m_shape == GRAPHIC_PINSHAPE::FALLING_EDGE_CLOCK )
1026 aPlotter->
MoveTo(
VECTOR2I( MapX1 * deco_size * 2 + x1, MapY1 * deco_size * 2 + y1 ) );
1035 if(
m_shape == GRAPHIC_PINSHAPE::CLOCK
1036 ||
m_shape == GRAPHIC_PINSHAPE::INVERTED_CLOCK
1037 ||
m_shape == GRAPHIC_PINSHAPE::CLOCK_LOW )
1054 if(
m_shape == GRAPHIC_PINSHAPE::INPUT_LOW
1055 ||
m_shape == GRAPHIC_PINSHAPE::CLOCK_LOW )
1062 aPlotter->
LineTo(
VECTOR2I( x1 + MapX1 * deco_size * 2, y1 - deco_size * 2 ) );
1068 aPlotter->
LineTo(
VECTOR2I( x1 - deco_size * 2, y1 + MapY1 * deco_size * 2 ) );
1073 if(
m_shape == GRAPHIC_PINSHAPE::OUTPUT_LOW )
1088 else if(
m_shape == GRAPHIC_PINSHAPE::NONLOGIC )
1092 y1 - ( MapY1 - MapX1 ) * deco_size ) );
1094 y1 + ( MapY1 - MapX1 ) * deco_size ) );
1096 y1 - ( MapY1 + MapX1 ) * deco_size ) );
1098 y1 + ( MapY1 + MapX1 ) * deco_size ) );
1101 if(
m_type == ELECTRICAL_PINTYPE::PT_NC )
1104 const int ex1 = aPosition.
x;
1105 const int ey1 = aPosition.
y;
1106 aPlotter->
MoveTo(
VECTOR2I( ex1 - deco_size, ey1 - deco_size ) );
1108 aPlotter->
MoveTo(
VECTOR2I( ex1 + deco_size, ey1 - deco_size ) );
1115 int aTextInside,
bool aDrawPinNum,
bool aDrawPinName,
1116 bool aDimmed )
const
1124 aDrawPinName =
false;
1127 aDrawPinNum =
false;
1129 if( !aDrawPinNum && !aDrawPinName )
1142 if( bg == COLOR4D::UNSPECIFIED || !aPlotter->
GetColorMode() )
1143 bg = COLOR4D::WHITE;
1149 nameColor = nameColor.
Mix( bg, 0.5f );
1150 numColor = numColor.
Mix( bg, 0.5f );
1156 switch( aPinOrient )
1158 case PIN_ORIENTATION::PIN_UP: y1 -=
GetLength();
break;
1159 case PIN_ORIENTATION::PIN_DOWN: y1 +=
GetLength();
break;
1160 case PIN_ORIENTATION::PIN_LEFT: x1 -=
GetLength();
break;
1161 case PIN_ORIENTATION::PIN_RIGHT: x1 +=
GetLength();
break;
1162 case PIN_ORIENTATION::INHERIT: wxFAIL_MSG( wxS(
"aPinOrient must be resolved!" ) );
break;
1198 if( ( aPinOrient == PIN_ORIENTATION::PIN_LEFT )
1199 || ( aPinOrient == PIN_ORIENTATION::PIN_RIGHT ) )
1203 if( aPinOrient == PIN_ORIENTATION::PIN_RIGHT )
1223 if( aPinOrient == PIN_ORIENTATION::PIN_DOWN )
1255 if( ( aPinOrient == PIN_ORIENTATION::PIN_LEFT )
1256 || ( aPinOrient == PIN_ORIENTATION::PIN_RIGHT ) )
1259 if( aDrawPinName && aDrawPinNum )
1267 else if( aDrawPinName )
1272 else if( aDrawPinNum )
1281 if( aDrawPinName && aDrawPinNum )
1289 else if( aDrawPinName )
1294 else if( aDrawPinNum )
1312 case PIN_ORIENTATION::PIN_RIGHT: end.
x = 1;
break;
1313 case PIN_ORIENTATION::PIN_UP: end.
y = -1;
break;
1314 case PIN_ORIENTATION::PIN_DOWN: end.
y = 1;
break;
1315 case PIN_ORIENTATION::PIN_LEFT: end.
x = -1;
break;
1320 orient = PIN_ORIENTATION::PIN_UP;
1325 orient = PIN_ORIENTATION::PIN_DOWN;
1329 orient = PIN_ORIENTATION::PIN_RIGHT;
1332 orient = PIN_ORIENTATION::PIN_LEFT;
1350 int lengthChange =
GetLength() - aLength;
1357 case PIN_ORIENTATION::PIN_RIGHT:
1358 offsetX = lengthChange;
1360 case PIN_ORIENTATION::PIN_LEFT:
1361 offsetX = -1 * lengthChange;
1363 case PIN_ORIENTATION::PIN_UP:
1364 offsetY = lengthChange;
1366 case PIN_ORIENTATION::PIN_DOWN:
1367 offsetY = -1 * lengthChange;
1431 case PIN_ORIENTATION::PIN_RIGHT:
m_orientation = PIN_ORIENTATION::PIN_UP;
break;
1432 case PIN_ORIENTATION::PIN_UP:
m_orientation = PIN_ORIENTATION::PIN_LEFT;
break;
1433 case PIN_ORIENTATION::PIN_LEFT:
m_orientation = PIN_ORIENTATION::PIN_DOWN;
break;
1434 case PIN_ORIENTATION::PIN_DOWN:
m_orientation = PIN_ORIENTATION::PIN_RIGHT;
break;
1444 case PIN_ORIENTATION::PIN_RIGHT:
m_orientation = PIN_ORIENTATION::PIN_DOWN;
break;
1445 case PIN_ORIENTATION::PIN_UP:
m_orientation = PIN_ORIENTATION::PIN_RIGHT;
break;
1446 case PIN_ORIENTATION::PIN_LEFT:
m_orientation = PIN_ORIENTATION::PIN_UP;
break;
1447 case PIN_ORIENTATION::PIN_DOWN:
m_orientation = PIN_ORIENTATION::PIN_LEFT;
break;
1461 int aUnit,
int aBodyStyle,
const VECTOR2I& aOffset,
bool aDimmed )
1492 aList.emplace_back(
_(
"Type" ),
_(
"Pin" ) );
1497 wxString(
"Undefined library pin." );
1498 aList.emplace_back(
_(
"Unit" ), msg );
1504 wxString(
"Undefined library pin." );
1505 aList.emplace_back(
_(
"Body Style" ), msg );
1514 aList.emplace_back(
_(
"Visible" ),
IsVisible() ?
_(
"Yes" ) :
_(
"No" ) );
1533 aList.emplace_back( symbol->
GetRef( currentSheet ),
1586 if( it->second.second == aForceNoConnect )
1587 return it->second.first;
1590 wxString
name =
"Net-(";
1591 bool unconnected =
false;
1593 if( aForceNoConnect ||
GetType() == ELECTRICAL_PINTYPE::PT_NC )
1596 name = (
"unconnected-(" );
1599 bool annotated =
true;
1601 std::vector<SCH_PIN*> pins = symbol->
GetPins( &aPath );
1602 bool has_multiple =
false;
1608 && unconnected == (
pin->GetType() == ELECTRICAL_PINTYPE::PT_NC ) )
1610 has_multiple =
true;
1619 if( symbol->
GetRef( &aPath,
false ).Last() ==
'?' )
1624 name <<
"-Pad" << libPinNumber <<
")";
1627 else if( !libPinShownName.IsEmpty() && ( libPinShownName != libPinShownNumber ) )
1634 if( unconnected || has_multiple )
1674 if( aCache->
m_Font == aFont
1693 bool aIncludeElectricalType )
const
1700 aIncludeElectricalType );
1702 r = symbol->GetTransform().TransformCoordinate( r );
1703 r.
Offset( symbol->GetPosition() );
1715 int pinNameOffset = 0;
1716 int nameTextLength = 0;
1717 int nameTextHeight = 0;
1718 int numberTextLength = 0;
1719 int numberTextHeight = 0;
1720 int typeTextLength = 0;
1721 bool includeName = aIncludeNameAndNumber && !
GetShownName().IsEmpty();
1722 bool includeNumber = aIncludeNameAndNumber && !
GetShownNumber().IsEmpty();
1723 bool includeType = aIncludeElectricalType;
1726 if( !aIncludeLabelsOnInvisiblePins && !
IsVisible() )
1728 includeName =
false;
1729 includeNumber =
false;
1730 includeType =
false;
1735 if( parentSymbol->GetShowPinNames() )
1736 pinNameOffset = parentSymbol->GetPinNameOffset();
1738 includeName =
false;
1740 if( !parentSymbol->GetShowPinNumbers() )
1741 includeNumber =
false;
1761 double stroke = fontSize / 8.0;
1764 KiROUND( stroke ),
false,
false,
1768 minsizeV = std::max( minsizeV, typeTextSize.
y / 2 );
1772 if(
m_shape == GRAPHIC_PINSHAPE::INVERTED ||
m_shape == GRAPHIC_PINSHAPE::INVERTED_CLOCK )
1776 if( pinNameOffset || !includeName )
1780 begin.
y = std::min( -minsizeV, -numberTextHeight );
1781 begin.
x = std::min( -typeTextLength,
GetLength() - ( numberTextLength / 2 ) );
1784 end.
y = std::max( minsizeV, nameTextHeight / 2 );
1790 begin.
y = std::min( -minsizeV, -nameTextHeight );
1791 begin.
x = -typeTextLength;
1792 begin.
x = std::min( begin.
x, (
GetLength() - numberTextLength ) / 2 );
1793 begin.
x = std::min( begin.
x, (
GetLength() - nameTextLength ) / 2 );
1796 end.
x = std::max( end.
x, (
GetLength() + nameTextLength ) / 2 );
1797 end.
x = std::max( end.
x, (
GetLength() + numberTextLength ) / 2 );
1798 end.
y = std::max( minsizeV, numberTextHeight );
1804 case PIN_ORIENTATION::PIN_UP:
1810 case PIN_ORIENTATION::PIN_DOWN:
1817 case PIN_ORIENTATION::PIN_LEFT:
1823 case PIN_ORIENTATION::PIN_RIGHT:
1849 wxCHECK(
pin,
false );
1889 if( !
m_alt.IsEmpty() )
1892 alt = &localStorage;
1896 : wxString( wxS(
"Undefined library pin." ) );
1900 return wxString::Format(
"Symbol %s %s",
1922 if ( !
name.IsEmpty() )
1924 return wxString::Format(
_(
"Pin %s [%s, %s, %s]" ),
1932 return wxString::Format(
_(
"Pin %s [%s, %s]" ),
1940 if( !
name.IsEmpty() )
1942 return wxString::Format(
_(
"Hidden pin %s [%s, %s, %s]" ),
1950 return wxString::Format(
_(
"Hidden pin %s [%s, %s]" ),
2069 return static_cast<int>(
m_shape ) -
static_cast<int>( tmp->
m_shape );
2072 return static_cast<int>(
m_type ) -
static_cast<int>( tmp->
m_type );
2091 const ALT& lhsAlt = lhsItem->second;
2092 const ALT& rhsAlt = rhsItem->second;
2100 return static_cast<int>( lhsAlt.
m_Type ) -
static_cast<int>( rhsAlt.
m_Type );
2103 return static_cast<int>( lhsAlt.
m_Shape ) -
static_cast<int>( rhsAlt.
m_Shape );
2176 aStream <<
"SCH_PIN:" << std::endl
2177 <<
" Name: \"" <<
m_name <<
"\"" << std::endl
2178 <<
" Number: \"" <<
m_number <<
"\"" << std::endl
2180 <<
" Length: " <<
GetLength() << std::endl
2193void SCH_PIN::Show(
int nestLevel, std::ostream& os )
const
2195 NestedSpace( nestLevel, os ) <<
'<' <<
GetClass().Lower().mb_str()
2217 if( pinTypeEnum.Choices().GetCount() == 0 )
2219 pinTypeEnum.Map( ELECTRICAL_PINTYPE::PT_INPUT,
_HKI(
"Input" ) )
2220 .Map( ELECTRICAL_PINTYPE::PT_OUTPUT,
_HKI(
"Output" ) )
2221 .Map( ELECTRICAL_PINTYPE::PT_BIDI,
_HKI(
"Bidirectional" ) )
2222 .Map( ELECTRICAL_PINTYPE::PT_TRISTATE,
_HKI(
"Tri-state" ) )
2223 .Map( ELECTRICAL_PINTYPE::PT_PASSIVE,
_HKI(
"Passive" ) )
2224 .Map( ELECTRICAL_PINTYPE::PT_NIC,
_HKI(
"Free" ) )
2225 .Map( ELECTRICAL_PINTYPE::PT_UNSPECIFIED,
_HKI(
"Unspecified" ) )
2226 .Map( ELECTRICAL_PINTYPE::PT_POWER_IN,
_HKI(
"Power input" ) )
2227 .Map( ELECTRICAL_PINTYPE::PT_POWER_OUT,
_HKI(
"Power output" ) )
2228 .Map( ELECTRICAL_PINTYPE::PT_OPENCOLLECTOR,
_HKI(
"Open collector" ) )
2229 .Map( ELECTRICAL_PINTYPE::PT_OPENEMITTER,
_HKI(
"Open emitter" ) )
2230 .Map( ELECTRICAL_PINTYPE::PT_NC,
_HKI(
"Unconnected" ) );
2235 if( pinShapeEnum.Choices().GetCount() == 0 )
2237 pinShapeEnum.Map( GRAPHIC_PINSHAPE::LINE,
_HKI(
"Line" ) )
2238 .Map( GRAPHIC_PINSHAPE::INVERTED,
_HKI(
"Inverted" ) )
2239 .Map( GRAPHIC_PINSHAPE::CLOCK,
_HKI(
"Clock" ) )
2240 .Map( GRAPHIC_PINSHAPE::INVERTED_CLOCK,
_HKI(
"Inverted clock" ) )
2241 .Map( GRAPHIC_PINSHAPE::INPUT_LOW,
_HKI(
"Input low" ) )
2242 .Map( GRAPHIC_PINSHAPE::CLOCK_LOW,
_HKI(
"Clock low" ) )
2243 .Map( GRAPHIC_PINSHAPE::OUTPUT_LOW,
_HKI(
"Output low" ) )
2244 .Map( GRAPHIC_PINSHAPE::FALLING_EDGE_CLOCK,
_HKI(
"Falling edge clock" ) )
2245 .Map( GRAPHIC_PINSHAPE::NONLOGIC,
_HKI(
"NonLogic" ) );
2250 if( orientationEnum.Choices().GetCount() == 0 )
2252 orientationEnum.Map( PIN_ORIENTATION::PIN_RIGHT,
_(
"Right" ) )
2253 .Map( PIN_ORIENTATION::PIN_LEFT,
_(
"Left" ) )
2254 .Map( PIN_ORIENTATION::PIN_UP,
_(
"Up" ) )
2255 .Map( PIN_ORIENTATION::PIN_DOWN,
_(
"Down" ) );
2258 auto isSymbolEditor =
2262 return dynamic_cast<LIB_SYMBOL*
>(
pin->GetParentSymbol() ) !=
nullptr;
2281 _HKI(
"Electrical Type" ),
2286 _HKI(
"Graphic Style" ),
2304 PROPERTY_DISPLAY::PT_SIZE ) )
2309 PROPERTY_DISPLAY::PT_SIZE ) )
2314 PROPERTY_DISPLAY::PT_SIZE ) )
constexpr EDA_IU_SCALE schIUScale
BITMAPS
A list of all bitmap identifiers.
void SetOrigin(const Vec &pos)
BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
void Offset(coord_type dx, coord_type dy)
bool Intersects(const BOX2< Vec > &aRect) const
bool Contains(const Vec &aPoint) const
BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
void SetEnd(coord_type x, coord_type y)
The base class for create windows for drawing purpose.
A base class for most all the KiCad significant classes used in schematics and boards.
KICAD_T Type() const
Returns the type of object.
virtual bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const
Compare the item against the search criteria in aSearchData.
EDA_ITEM * GetParent() const
EDA_ITEM * m_parent
Linked list: Link (parent struct)
virtual const wxString & GetText() const
Return the string associated with the text object.
static ENUM_MAP< T > & Instance()
Class that other classes need to inherit from, in order to be inspectable.
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)
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 & 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.
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
int GetDefaultPenWidth() const
const wxString & GetDefaultFont() const
const COLOR4D & GetLayerColor(int aLayer) const
Return the color used to draw a layer.
virtual const COLOR4D & GetBackgroundColor() const =0
Return current background color settings.
wxDC * GetPrintDC() const
wxString AsString() const
Define a library symbol object.
Container for data for KiCad programs.
virtual SETTINGS_MANAGER & GetSettingsManager() const
Base plotter engine class.
virtual void Circle(const VECTOR2I &pos, int diametre, FILL_T fill, int width=USE_DEFAULT_LINE_WIDTH)=0
void MoveTo(const VECTOR2I &pos)
void FinishTo(const VECTOR2I &pos)
RENDER_SETTINGS * RenderSettings()
bool GetColorMode() const
virtual void SetCurrentLineWidth(int width, void *aData=nullptr)=0
Set the line width for the next drawing.
void LineTo(const VECTOR2I &pos)
virtual void PlotText(const VECTOR2I &aPos, const COLOR4D &aColor, const wxString &aText, const TEXT_ATTRIBUTES &aAttributes, KIFONT::FONT *aFont=nullptr, const KIFONT::METRICS &aFontMetrics=KIFONT::METRICS::Default(), void *aData=nullptr)
virtual void SetColor(const COLOR4D &color)=0
PROPERTY_BASE & SetAvailableFunc(std::function< bool(INSPECTABLE *)> aFunc)
Set a callback function to determine whether an object provides this property.
PROPERTY_BASE & SetWriteableFunc(std::function< bool(INSPECTABLE *)> aFunc)
Provide class metadata.Helper macro to map type hashes to names.
void InheritsAfter(TYPE_ID aDerived, TYPE_ID aBase)
Declare an inheritance relationship between types.
static PROPERTY_MANAGER & Instance()
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
void AddTypeCast(TYPE_CAST_BASE *aCast)
Register a type converter.
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
void AppendInfoToMsgPanel(std::vector< MSG_PANEL_ITEM > &aList) const
Adds information about the connection object to aList.
Schematic editor (Eeschema) main window.
SCH_SHEET_PATH & GetCurrentSheet() const
Base class for any item which can be embedded within the SCHEMATIC container class,...
SCH_ITEM & operator=(const SCH_ITEM &aPin)
SCH_RENDER_SETTINGS * getRenderSettings(PLOTTER *aPlotter) const
const SYMBOL * GetParentSymbol() const
SCHEMATIC * Schematic() const
Searches the item hierarchy to find a SCHEMATIC.
static wxString GetUnitDescription(int aUnit)
virtual int compare(const SCH_ITEM &aOther, int aCompareFlags=0) const
Provide the draw object specific comparison called by the == and < operators.
bool IsConnectivityDirty() const
static wxString GetBodyStyleDescription(int aBodyStyle)
SCH_CONNECTION * Connection(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve the connection associated with this object in the given sheet.
const KIFONT::METRICS & GetFontMetrics() const
int GetEffectivePenWidth(const SCH_RENDER_SETTINGS *aSettings) const
double SimilarityBase(const SCH_ITEM &aItem) const
Calculate the boilerplate similarity for all LIB_ITEMs without preventing the use above of a pure vir...
void getSymbolEditorMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList)
void Rotate(const VECTOR2I &aCenter, bool aRotateCCW=true) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
std::ostream & operator<<(std::ostream &aStream)
void PlotPinTexts(PLOTTER *aPlotter, const VECTOR2I &aPinPos, PIN_ORIENTATION aPinOrient, int aTextInside, bool aDrawPinNum, bool aDrawPinName, bool aDimmed) const
Plot the pin name and number.
int GetNumberTextSize() const
std::optional< bool > m_hidden
bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const override
Compare the item against the search criteria in aSearchData.
void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
void MirrorVerticallyPin(int aCenter)
void validateExtentsCache(KIFONT::FONT *aFont, int aSize, const wxString &aText, EXTENTS_CACHE *aCache) const
const BOX2I ViewBBox() const override
Return the bounding box of the item covering all its layers.
void CalcEdit(const VECTOR2I &aPosition) override
Calculate the attributes of an item at aPosition when it is being edited.
void SetNumber(const wxString &aNumber)
std::optional< int > m_nameTextSize
PIN_ORIENTATION PinDrawOrient(const TRANSFORM &aTransform) const
Return the pin real orientation (PIN_UP, PIN_DOWN, PIN_RIGHT, PIN_LEFT), according to its orientation...
void SetVisible(bool aVisible)
void ChangeLength(int aLength)
Change the length of a pin and adjust its position based on orientation.
ALT GetAlt(const wxString &aAlt)
bool HasConnectivityChanges(const SCH_ITEM *aItem, const SCH_SHEET_PATH *aInstance=nullptr) const override
Check if aItem has connectivity changes against this object.
SCH_PIN & operator=(const SCH_PIN &aPin)
wxString GetShownNumber() const
void Move(const VECTOR2I &aOffset) override
Move the item by aMoveVector to a new position.
std::map< const SCH_SHEET_PATH, std::pair< wxString, bool > > m_net_name_map
PIN_ORIENTATION m_orientation
void SetOrientation(PIN_ORIENTATION aOrientation)
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 ...
wxString getItemDescription(ALT *aAlt) const
bool ConnectionPropagatesTo(const EDA_ITEM *aItem) const override
Return true if this item should propagate connection info to aItem.
std::optional< int > m_numTextSize
VECTOR2I GetPinRoot() const
ELECTRICAL_PINTYPE m_type
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
SCH_PIN * GetLibPin() const
void SetPosition(const VECTOR2I &aPos) override
double Similarity(const SCH_ITEM &aOther) const override
Return a measure of how likely the other object is to represent the same object.
wxString GetElectricalTypeName() const
int GetPenWidth() const override
std::map< wxString, ALT > m_alternates
void ViewGetLayers(int aLayers[], int &aCount) const override
Return the layers the item is drawn on (which may be more than its "home" layer)
const wxString & GetName() const
void SetLength(int aLength)
void Plot(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed) override
Plot the item to aPlotter.
void MirrorHorizontally(int aCenter) override
these transforms have effect only if the pin has a LIB_SYMBOL as parent
std::recursive_mutex m_netmap_mutex
The name that this pin connection will drive onto a net.
PIN_ORIENTATION GetOrientation() const
wxString GetClass() const override
Return the class name.
void SetNumberTextSize(int aSize)
void printPinTexts(const RENDER_SETTINGS *aSettings, const VECTOR2I &aPinPos, PIN_ORIENTATION aPinOrient, int aTextInside, bool aDrawPinNum, bool aDrawPinName, bool aDimmed)
Put the pin number and pin text info, given the pin line coordinates.
void SetShape(GRAPHIC_PINSHAPE aShape)
void RotatePin(const VECTOR2I &aCenter, bool aRotateCCW=true)
VECTOR2I GetPosition() const override
EXTENTS_CACHE m_numExtentsCache
wxString GetCanonicalElectricalTypeName() const
bool Replace(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) override
Perform a text replace using the find and replace criteria in aSearchData on items that support text ...
int GetNameTextSize() const
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
void printPinSymbol(const SCH_RENDER_SETTINGS *aSettings, const VECTOR2I &aPos, PIN_ORIENTATION aOrientation, bool aDimmed)
Print the pin symbol without text.
int compare(const SCH_ITEM &aOther, int aCompareFlags=0) const override
The pin specific sort order is as follows:
wxString GetShownName() const
void MirrorHorizontallyPin(int aCenter)
these transforms have always effects
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
void SetType(ELECTRICAL_PINTYPE aType)
void ClearDefaultNetName(const SCH_SHEET_PATH *aPath)
void printPinElectricalTypeName(const RENDER_SETTINGS *aSettings, const VECTOR2I &aPosition, PIN_ORIENTATION aOrientation, bool aDimmed)
Draw the electrical type text of the pin (only for the footprint editor)
EXTENTS_CACHE m_nameExtentsCache
SCH_PIN(LIB_SYMBOL *aParentSymbol)
bool IsStacked(const SCH_PIN *aPin) const
const wxString & GetNumber() const
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
void Print(const SCH_RENDER_SETTINGS *aSettings, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aForceNoFill, bool aDimmed) override
Print an item.
wxString GetDefaultNetName(const SCH_SHEET_PATH &aPath, bool aForceNoConnect=false)
std::optional< int > m_length
GRAPHIC_PINSHAPE GetShape() const
void PlotPinType(PLOTTER *aPlotter, const VECTOR2I &aPosition, PIN_ORIENTATION aOrientation, bool aDimmed) const
ELECTRICAL_PINTYPE GetType() const
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
void SetNameTextSize(int aSize)
VECTOR2I TransformCoordinate(const VECTOR2I &aPoint) const
const KIGFX::COLOR4D & GetBackgroundColor() const override
Return current background color settings.
bool m_ShowConnectionPoints
bool m_ShowPinElectricalTypes
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
SCH_FIELD * GetField(MANDATORY_FIELD_T aFieldType)
Return a mandatory field in this symbol.
const wxString GetValue(bool aResolve, const SCH_SHEET_PATH *aPath, bool aAllowExtraText) const override
std::vector< SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve a list of the SCH_PINs for the given sheet path.
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const override
T * GetAppSettings()
Returns a handle to the a given settings by type If the settings have already been loaded,...
A base class for LIB_SYMBOL and SCH_SYMBOL.
virtual int GetUnitCount() const =0
virtual const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const =0
virtual bool IsPower() const =0
int GetPinNameOffset() const
virtual bool GetShowPinNames() const
virtual bool GetShowPinNumbers() const
virtual bool HasAlternateBodyStyle() const =0
Test if symbol has more than one body conversion type (DeMorgan).
GR_TEXT_H_ALIGN_T m_Halign
GR_TEXT_V_ALIGN_T m_Valign
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
#define DEFAULT_PINNUM_SIZE
The default pin name size when creating pins(can be changed in preference menu)
#define DEFAULT_PINNAME_SIZE
The default selection highlight thickness (can be changed in preference menu)
#define DEFAULT_PIN_LENGTH
The default pin number size when creating pins(can be changed in preference menu)
static constexpr EDA_ANGLE ANGLE_90
static constexpr EDA_ANGLE ANGLE_VERTICAL
static constexpr EDA_ANGLE ANGLE_HORIZONTAL
#define STRUCT_DELETED
flag indication structures to be erased
#define SKIP_STRUCT
flag indicating that the structure should be ignored
#define SHOW_ELEC_TYPE
Show pin electrical type. Shared with IS_ROLLOVER.
TRANSFORM DefaultTransform
void GRLineTo(wxDC *DC, int x, int y, int width, const COLOR4D &Color)
void GRCircle(wxDC *aDC, const VECTOR2I &aPos, int aRadius, int aWidth, const COLOR4D &aColor)
void GRMoveTo(int x, int y)
void GRLine(wxDC *DC, int x1, int y1, int x2, int y2, int width, const COLOR4D &Color, wxPenStyle aStyle)
bool GetGRForceBlackPenState(void)
int GetPenSizeForNormal(int aTextSize)
void GRPrintText(wxDC *aDC, const VECTOR2I &aPos, const COLOR4D &aColor, const wxString &aText, const EDA_ANGLE &aOrient, const VECTOR2I &aSize, enum GR_TEXT_H_ALIGN_T aH_justify, enum GR_TEXT_V_ALIGN_T aV_justify, int aWidth, bool aItalic, bool aBold, KIFONT::FONT *aFont, const KIFONT::METRICS &aFontMetrics)
Print a graphic text through wxDC.
@ LAYER_SELECTION_SHADOWS
PGM_BASE & Pgm()
The global Program "get" accessor.
PGM_BASE * PgmOrNull()
similar to PGM_BASE& Pgm(), but return a reference that can be nullptr when running a shared lib from...
wxString ElectricalPinTypeGetText(ELECTRICAL_PINTYPE aType)
BITMAPS ElectricalPinTypeGetBitmap(ELECTRICAL_PINTYPE aType)
wxString PinShapeGetText(GRAPHIC_PINSHAPE aShape)
wxString PinOrientationName(PIN_ORIENTATION aOrientation)
ELECTRICAL_PINTYPE
The symbol library pin object electrical types used in ERC tests.
@ PT_UNSPECIFIED
unknown electrical properties: creates always a warning when connected
PIN_ORIENTATION
The symbol library pin object orientations.
#define ENUM_TO_WXANY(type)
Macro to define read-only fields (no setter method available)
static int externalPinDecoSize(const RENDER_SETTINGS *aSettings, const SCH_PIN &aPin)
Utility for getting the size of the 'external' pin decorators (as a radius)
static int internalPinDecoSize(const RENDER_SETTINGS *aSettings, const SCH_PIN &aPin)
Utility for getting the size of the 'internal' pin decorators (as a radius)
static struct SCH_PIN_DESC _SCH_PIN_DESC
#define TARGET_PIN_RADIUS
wxString UnescapeString(const wxString &aSource)
wxString EscapeString(const wxString &aSource, ESCAPE_CONTEXT aContext)
The Escape/Unescape routines use HTML-entity-reference-style encoding to handle characters which are:...
constexpr int MilsToIU(int mils) const
constexpr int mmToIU(double mm) const
ELECTRICAL_PINTYPE m_Type
@ VALUE_FIELD
Field Value of part, i.e. "3.3K".
@ REFERENCE_FIELD
Field Reference of part, i.e. "IC21".
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.
constexpr ret_type KiROUND(fp_type v, bool aQuiet=false)
Round a floating point number to an integer using "round halfway cases away from zero".
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D