38#include <api/schematic/schematic_types.pb.h>
70 void setter(
void* obj, wxAny& v )
override
74 if( !v.GetAs( &value ) )
92 newField.
SetText( value, sheetPath, variantName );
97 field->
SetText( value, sheetPath, variantName );
101 wxAny
getter(
const void* obj )
const override
109 wxString variantName;
120 if( !variantName.IsEmpty() && sheetPath )
125 return wxAny(
text );
168 sheet.mutable_id()->set_value(
m_Uuid.AsStdString() );
171 sheet.set_locked(
IsLocked() ? LockedState::LS_LOCKED : LockedState::LS_UNLOCKED );
176 sheet.set_dnp(
GetDNP() );
178 StrokeAttributes* borderStroke = sheet.mutable_border_stroke();
185 GraphicFillAttributes* fill = sheet.mutable_fill();
187 : GraphicFillType::GFT_FILLED_WITH_COLOR );
197 if( field.IsMandatory() )
200 field.Serialize( *sheet.add_user_fields(),
schIUScale );
207 aContainer.PackFrom( sheet );
219 if( !aContainer.UnpackTo( &sheet ) )
225 SetLocked( sheet.locked() == LockedState::LS_LOCKED );
237 if( sheet.fill().fill_type() == GraphicFillType::GFT_UNFILLED || !sheet.fill().has_color() )
256 for(
const auto& field : sheet.user_fields() )
262 for(
const auto& pinProto : sheet.pins() )
264 auto pin = std::make_unique<SCH_SHEET_PIN>(
this );
301 m_pins.emplace_back( new SCH_SHEET_PIN( *pin ) );
302 m_pins.back()->SetParent( this );
306 field.SetParent(
this );
333 std::vector<PROPERTY_BASE*> props;
335 auto getOrCreate = [&](
const wxString& aName )
341 auto prop = std::make_unique<SCH_SHEET_FIELD_PROPERTY>( aName );
345 return it->second.get();
351 if( field.IsMandatory() )
353 if( field.IsPrivate() )
356 const wxString&
name = field.GetUntranslatedName();
361 props.push_back( getOrCreate(
name ) );
365 std::vector<const SCH_FIELD*> userFields;
369 if( field.IsMandatory() )
372 if( field.IsPrivate() )
375 userFields.push_back( &field );
378 std::ranges::sort( userFields,
384 for(
const SCH_FIELD* field : userFields )
386 const wxString&
name = field->GetUntranslatedName();
387 props.push_back( getOrCreate(
name ) );
391 props.push_back( prop );
428 wxCHECK_RET(
m_screen, wxS(
"Cannot sync a sheet UUID without a screen" ) );
445 wxCHECK_MSG(
Schematic(),
false,
"Can't call IsVirtualRootSheet without setting a schematic" );
453 wxCHECK_MSG(
Schematic(),
false,
"Can't call IsTopLevelSheet without setting a schematic" );
462 [&](
const wxString& aVar )
465 aVars->push_back( aVar );
470 if( field.IsMandatory() )
471 add( field.GetUntranslatedName().Upper() );
473 add( field.GetName() );
478 if( sheetPath.
size() >= 2 )
490 add( wxT(
"SHEETPATH" ) );
491 add( wxT(
"EXCLUDE_FROM_BOM" ) );
492 add( wxT(
"EXCLUDE_FROM_BOARD" ) );
493 add( wxT(
"EXCLUDE_FROM_SIM" ) );
495 add( wxT(
"ERC_ERROR <message_text>" ) );
496 add( wxT(
"ERC_WARNING <message_text>" ) );
498 m_screen->GetTitleBlock().GetContextualTextVars( aVars );
504 wxCHECK( aPath,
false );
511 if( token->Contains(
':' ) )
513 if(
schematic->ResolveCrossReference( token, aDepth + 1 ) )
519 wxString fieldName = field.IsMandatory() ? field.GetUntranslatedName().Upper()
522 if( token->IsSameAs( fieldName ) )
524 *token = field.GetShownText( aPath,
INTERNAL, wxEmptyString, aDepth + 1 );
530 wxString variant =
schematic->GetCurrentVariant();
537 if( token->IsSameAs( wxT(
"#" ) ) )
542 else if( token->IsSameAs( wxT(
"##" ) ) )
544 *token = wxString::Format( wxT(
"%d" ), (
int)
schematic->Hierarchy().size() );
547 else if( token->IsSameAs( wxT(
"SHEETPATH" ) ) )
552 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_BOM" ) ) )
554 *token = wxEmptyString;
556 if( aPath->
GetExcludedFromBOM( variant ) || this->ResolveExcludedFromBOM( aPath, variant ) )
557 *token = wxS(
"Excluded from BOM" );
561 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_BOARD" ) ) )
563 *token = wxEmptyString;
565 if( aPath->
GetExcludedFromBoard( variant ) || this->ResolveExcludedFromBoard( aPath, variant ) )
566 *token = wxS(
"Excluded from board" );
570 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_SIM" ) ) )
572 *token = wxEmptyString;
574 if( aPath->
GetExcludedFromSim( variant ) || this->ResolveExcludedFromSim( aPath, variant ) )
575 *token = wxS(
"Excluded from simulation" );
579 else if( token->IsSameAs( wxT(
"DNP" ) ) )
581 *token = wxEmptyString;
583 if( aPath->
GetDNP( variant ) || this->ResolveDNP( aPath, variant ) )
584 *token = wxS(
"DNP" );
591 if( aPath->
size() >= 2 )
596 if(
path.Last()->ResolveTextVar( &
path, token, aDepth + 1 ) )
601 if(
schematic->ResolveTextVar( aPath, token, aDepth + 1 ) )
612 wxString::Format( wxT(
"SCH_SHEET object cannot swap data with %s object." ),
624 sheetPin->SetParent(
this );
630 field.SetParent(
this );
652 m_fields.emplace_back(
this, aFieldType );
698 const wxString& aVariantName )
700 wxCHECK( !aFieldName.IsEmpty(), );
706 switch( field->
GetId() )
711 wxString tmp = aFieldText;
712 tmp.Replace( wxT(
"\\" ), wxT(
"/" ) );
723 wxString defaultText = field->
GetText( aPath );
725 if( aVariantName.IsEmpty() )
727 if( aFieldText != defaultText )
734 wxCHECK( instance, );
736 if( instance->
m_Variants.contains( aVariantName ) )
738 if( aFieldText != defaultText )
739 instance->
m_Variants[aVariantName].m_Fields[aFieldName] = aFieldText;
741 instance->
m_Variants[aVariantName].m_Fields.erase( aFieldName );
743 else if( aFieldText != defaultText )
748 newVariant.
m_Fields[aFieldName] = aFieldText;
749 instance->
m_Variants.insert( std::make_pair( aVariantName, newVariant ) );
760 const wxString& aVariantName )
const
762 wxCHECK( !aFieldName.IsEmpty(), wxEmptyString );
766 wxCHECK( field, wxEmptyString );
768 switch( field->
GetId() )
776 if( aVariantName.IsEmpty() )
784 if( instance->
m_Variants.contains( aVariantName )
785 && instance->
m_Variants.at( aVariantName ).m_Fields.contains( aFieldName ) )
786 return instance->
m_Variants.at( aVariantName ).m_Fields.at( aFieldName );
798 wxASSERT( aSheetPin !=
nullptr );
802 m_pins.push_back( aSheetPin );
809 wxASSERT( aSheetPin !=
nullptr );
814 if( *i == aSheetPin )
828 if(
pin->GetText().Cmp( aName ) == 0 )
840 if( sheetPin->GetPosition() == aPosition )
855 switch(
pin->GetSide() )
865 return topBottom > 0 && leftRight == 0;
885 if( HLabel ==
nullptr )
895 constexpr int gridSize =
schIUScale.MilsToIU( 50 );
897 int base = aVal / gridSize;
898 int excess = abs( aVal % gridSize );
902 return ( base + 1 ) * gridSize;
904 else if( excess > 0 )
906 return ( base ) * gridSize;
910 return ( base - 1 ) * gridSize;
918 int pinsRight =
m_pos.x;
920 for(
size_t i = 0; i <
m_pins.size(); i++ )
928 pinsLeft = std::min( pinsLeft, pinRect.
GetLeft() );
929 pinsRight = std::max( pinsRight, pinRect.
GetRight() );
938 if( pinsLeft >= pinsRight )
941 pinMinWidth = pinsRight -
m_pos.x;
952 int pinsBottom =
m_pos.y;
954 for(
size_t i = 0; i <
m_pins.size(); i++ )
962 pinsTop = std::min( pinsTop, pinRect.
GetTop() );
963 pinsBottom = std::max( pinsBottom, pinRect.
GetBottom() );
972 if( pinsTop >= pinsBottom )
975 pinMinHeight = pinsBottom -
m_pos.y;
985 std::vector<SCH_SHEET_PIN*> pins =
m_pins;
1013 if(
pin->HitTest( aPosition ) )
1038 int margin = borderMargin +
KiROUND( std::max( textSize.
x, textSize.
y ) * 0.5 );
1058 margin = borderMargin +
KiROUND( std::max( textSize.
x, textSize.
y ) * 0.4 );
1096 end.x = std::max(
m_size.x, textLength );
1114 bbox.
Merge( field.GetBoundingBox() );
1170 if( screen && screen->
GetFileName().Cmp( aFilename ) == 0 )
1215 if(
m_screen->GetFileName().Cmp( aFilename ) == 0 )
1258 wxString currentVariant;
1263 path.push_back(
this );
1267 aList.emplace_back(
_(
"Hierarchical Path" ),
path.PathHumanReadable(
false,
true ) );
1277 msgs.Add(
_(
"Simulation" ) );
1280 msgs.Add(
_(
"BOM" ) );
1283 msgs.Add(
_(
"Board" ) );
1285 if(
GetDNP( currentSheet, currentVariant ) )
1286 msgs.Add(
_(
"DNP" ) );
1288 msg = wxJoin( msgs,
'|' );
1289 msg.Replace(
'|', wxS(
", " ) );
1292 aList.emplace_back(
_(
"Exclude from" ), msg );
1298 std::map<SCH_SHEET_PIN*, SCH_NO_CONNECT*> noConnects;
1307 screen = parentSheet->GetScreen();
1315 noConnects[sheetPin] =
static_cast<SCH_NO_CONNECT*
>( noConnect );
1330 field.Move(
delta );
1336 m_pos += aMoveVector;
1339 pin->Move( aMoveVector );
1342 field.Move( aMoveVector );
1368 sheetPin->Rotate( aCenter, aRotateCCW );
1382 field.SetTextPos( pos );
1397 sheetPin->MirrorVertically( aCenter );
1403 field.SetTextPos( pos );
1417 sheetPin->MirrorHorizontally( aCenter );
1423 field.SetTextPos( pos );
1449 sheetPin->ConstrainOnEdge( sheetPin->GetPosition(),
false );
1466 pin->SetNumber(
id );
1478 while( !sheetPath.
empty() && sheetPath.
Last() !=
this )
1481 if( sheetPath.
empty() )
1497 wxT(
"Invalid item in schematic sheet pin list. Bad programmer!" ) );
1499 sheetPin->GetEndPoints( aItemList );
1505 std::vector<DANGLING_END_ITEM>& aItemListByPos,
1508 bool changed =
false;
1511 changed |= sheetPin->UpdateDanglingState( aItemListByType, aItemListByPos );
1527 wxCHECK( sheet,
false );
1541 for(
size_t i = 0; i <
m_pins.size(); i++ )
1553 std::vector<VECTOR2I> retval;
1556 retval.push_back( sheetPin->GetPosition() );
1563 const std::vector<KICAD_T>& aScanTypes )
1565 for(
KICAD_T scanType : aScanTypes )
1602 aFunction( &field );
1613 return wxString::Format(
_(
"Hierarchical Sheet '%s'" ),
1655 int aUnit,
int aBodyStyle,
const VECTOR2I& aOffset,
bool aDimmed )
1664 wxString variantName;
1672 bool dnp =
GetDNP( &instance, variantName );
1686 if( aDimmed || dnp )
1689 borderColor = borderColor.
Mix( backgroundColor, 0.5f );
1692 if( aBackground && backgroundColor.
a > 0.0 )
1694 aPlotter->
SetColor( backgroundColor );
1713 std::vector<wxString> properties;
1719 properties.emplace_back( wxString::Format( wxT(
"!%s = %s" ),
1721 field.GetShownText(
FOR_GUI ) ) );
1729 sheetPin->Plot( aPlotter, aBackground, aPlotOpts, aUnit, aBodyStyle, aOffset, aDimmed || dnp );
1733 field.Plot( aPlotter, aBackground, aPlotOpts, aUnit, aBodyStyle, aOffset, aDimmed || dnp );
1743 margins.
x = std::max( margins.
x * 0.6, margins.
y * 0.3 );
1744 margins.
y = std::max( margins.
y * 0.6, margins.
x * 0.3 );
1753 strokeWidth,
nullptr );
1760 wxCHECK_MSG(
Type() == aItem.
Type(), *
this,
1761 wxT(
"Cannot assign object type " ) + aItem.
GetClass() + wxT(
" to type " ) +
1764 if( &aItem !=
this )
1777 m_pins.back()->SetParent(
this );
1809 for(
int ii =
m_instances.size() - 1; ii >= 0; --ii )
1815 " page %s, from project %s.",
1843 if( instance.m_Path == aPath )
1849 (
GetName().IsEmpty() ) ? wxString( wxT(
"root" ) ) :
GetName() );
1862 bool aTestFromEnd )
const
1868 if( instance.m_Path == aSheetPath )
1870 aInstance = instance;
1874 else if( instance.m_Path.EndsWith( aSheetPath ) )
1876 aInstance = instance;
1889 if( instance.m_Path == aSheetPath )
1901 if( instance.m_Path == aSheetPath )
1913 if( instance.m_Path.size() == 0 )
1925 if( instance.m_Path.size() == 0 )
1939 wxString pageNumber;
1943 if( instance.m_Path == aParentPath )
1945 pageNumber = instance.m_PageNumber;
1958 if( instance.m_Path == aPath )
1960 instance.m_PageNumber = aPageNumber;
1976 if( &aOther ==
this )
1983 std::vector<SCH_SHEET_INSTANCE> instances =
GetInstances();
1984 std::vector<SCH_SHEET_INSTANCE> otherInstances = aOther.
GetInstances();
1990 std::sort( instances.begin(), instances.end(),
1993 if( aLhs.m_Path > aRhs.m_Path )
1998 std::sort( otherInstances.begin(), otherInstances.end(),
2001 if( aLhs.m_Path > aRhs.m_Path )
2007 auto itThis = instances.begin();
2008 auto itOther = otherInstances.begin();
2010 while( itThis != instances.end() )
2012 if( ( itThis->m_Path == itOther->m_Path )
2013 && ( itThis->m_PageNumber != itOther->m_PageNumber ) )
2028 if( aPageNumberA == aPageNumberB )
2033 bool isIntegerPageA = aPageNumberA.ToLong( &pageA );
2034 bool isIntegerPageB = aPageNumberB.ToLong( &pageB );
2036 if( isIntegerPageA && isIntegerPageB )
2045 if( isIntegerPageA )
2047 else if( isIntegerPageB )
2054 wxCHECK(
result != 0, 0 );
2099 for(
size_t i = 0; i <
GetFields().size(); ++i )
2131 instance->
m_Variants.insert( std::make_pair( aVariant.
m_Name, aVariant ) );
2140 if( !instance || !instance->
m_Variants.contains( aVariantName ) )
2148 const wxString& aFieldName )
2152 if( !instance || !instance->
m_Variants.contains( aVariantName ) )
2155 instance->
m_Variants[aVariantName].m_Fields.erase( aFieldName );
2160 const wxString& aNewName )
2165 if( !instance || !instance->
m_Variants.contains( aOldName ) )
2170 variant.
m_Name = aNewName;
2172 instance->
m_Variants.insert( std::make_pair( aNewName, variant ) );
2177 const wxString& aNewVariant )
2182 if( !instance || !instance->
m_Variants.contains( aSourceVariant ) )
2187 variant.
m_Name = aNewVariant;
2188 instance->
m_Variants.insert( std::make_pair( aNewVariant, variant ) );
2194 if( !aInstance || aVariantName.IsEmpty() )
2202 wxCHECK_MSG( instance, ,
2203 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s'." ),
2206 if( aVariantName.IsEmpty() )
2212 if( instance->
m_Variants.contains( aVariantName ) )
2214 instance->
m_Variants[aVariantName].m_DNP = aEnable;
2216 else if( aEnable !=
m_DNP )
2221 variant.
m_DNP = aEnable;
2230 if( !aInstance || aVariantName.IsEmpty() )
2238 if( instance.
m_Variants.contains( aVariantName ) )
2239 return instance.
m_Variants[aVariantName].m_DNP;
2260 if( !aInstance || aVariantName.IsEmpty() )
2268 wxCHECK_MSG( instance, ,
2269 wxString::Format( wxS(
"Cannot get m_excludedFromSim attribute for invalid sheet path '%s'." ),
2272 if( aVariantName.IsEmpty() )
2278 if( instance->
m_Variants.contains( aVariantName ) )
2280 instance->
m_Variants[aVariantName].m_ExcludedFromSim = aEnable;
2296 if( !aInstance || aVariantName.IsEmpty() )
2304 if( instance.
m_Variants.contains( aVariantName ) )
2305 return instance.
m_Variants[aVariantName].m_ExcludedFromSim;
2326 if( !aInstance || aVariantName.IsEmpty() )
2334 wxCHECK_MSG( instance, ,
2335 wxString::Format( wxS(
"Cannot get m_excludedFromBOM attribute for invalid sheet path '%s'." ),
2338 if( aVariantName.IsEmpty() )
2344 if( instance->
m_Variants.contains( aVariantName ) )
2346 instance->
m_Variants[aVariantName].m_ExcludedFromBOM = aEnable;
2362 if( !aInstance || aVariantName.IsEmpty() )
2370 if( instance.
m_Variants.contains( aVariantName ) )
2371 return instance.
m_Variants[aVariantName].m_ExcludedFromBOM;
2392void SCH_SHEET::Show(
int nestLevel, std::ostream& os )
const
2397 NestedSpace( nestLevel, os ) <<
'<' << s.Lower().mb_str() <<
">" <<
" sheet_name=\""
2402 sheetPin->Show( nestLevel + 1, os );
2404 NestedSpace( nestLevel, os ) <<
"</" << s.Lower().mb_str() <<
">\n" << std::flush;
2423 if( !aValue.GetAs( &value ) )
2431 return std::make_unique<VALIDATION_ERROR_MSG>( msg );
2443 const wxString groupAttributes =
_HKI(
"Attributes" );
KICOMMON_API types::KiCadObjectType ToProtoEnum(KICAD_T aValue)
constexpr EDA_IU_SCALE schIUScale
BITMAPS
A list of all bitmap identifiers.
@ add_hierarchical_subsheet
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.
constexpr const Vec GetEnd() const
constexpr coord_type GetY() const
constexpr size_type GetWidth() const
constexpr coord_type GetX() const
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 size_type GetHeight() const
constexpr coord_type GetLeft() const
constexpr bool Contains(const Vec &aPoint) const
constexpr const Vec & GetOrigin() const
constexpr coord_type GetRight() const
constexpr void SetEnd(coord_type x, coord_type y)
constexpr coord_type GetTop() const
constexpr bool Intersects(const BOX2< Vec > &aRect) const
constexpr coord_type GetBottom() const
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
The base class for create windows for drawing purpose.
A base class for most all the KiCad significant classes used in schematics and boards.
std::vector< PROPERTY_BASE * > GetCustomPropertiesAsInspectables() const
KICAD_T Type() const
Returns the type of object.
EDA_ITEM * GetParent() const
virtual void SetParent(EDA_ITEM *aParent)
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
virtual VECTOR2I GetTextSize() const
virtual const wxString & GetText() const
Return the string associated with the text object.
virtual void SetTextPos(const VECTOR2I &aPoint)
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
static wxString GotoPageHref(const wxString &aDestination)
Generate a href to a page in the current schematic.
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
EE_TYPE Overlapping(const BOX2I &aRect) const
A color representation with 4 components: red, green, blue, alpha.
std::shared_ptr< wxString > m_text
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.
const COLOR4D & GetLayerColor(int aLayer) const
Return the color used to draw a layer.
wxString AsString() const
Base plotter engine class.
RENDER_SETTINGS * RenderSettings()
virtual void Rect(const VECTOR2I &p1, const VECTOR2I &p2, FILL_T fill, int width, int aCornerRadius=0)=0
virtual void HyperlinkBox(const BOX2I &aBox, const wxString &aDestinationURL)
Create a clickable hyperlink with a rectangular click area.
bool GetColorMode() const
virtual void ThickSegment(const VECTOR2I &start, const VECTOR2I &end, int width, void *aData)
virtual void HyperlinkMenu(const BOX2I &aBox, const std::vector< wxString > &aDestURLs)
Create a clickable hyperlink menu with a rectangular click area.
virtual void SetColor(const COLOR4D &color)=0
Container for project specific data.
PROPERTY_BASE(const wxString &aName, PROPERTY_DISPLAY aDisplay=PT_DEFAULT, ORIGIN_TRANSFORMS::COORD_TYPES_T aCoordType=ORIGIN_TRANSFORMS::NOT_A_COORD)
< Used to generate unique IDs. Must come up front so it's initialized before ctor.
PROPERTY_BASE & SetGroup(const wxString &aGroup)
PROPERTY_BASE & SetValidator(PROPERTY_VALIDATOR_FN &&aValidator)
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.
bool IsTopLevelSheet(const SCH_SHEET *aSheet) const
Check if a sheet is a top-level sheet (direct child of virtual root).
SCHEMATIC_SETTINGS & Settings() const
wxString GetCurrentVariant() const
Return the current variant being edited.
void GetContextualTextVars(wxArrayString *aVars) const
SCH_SHEET_PATH & CurrentSheet() const
Schematic editor (Eeschema) main window.
SCH_SHEET_PATH & GetCurrentSheet() const
virtual const wxString & GetText() const override
Return the string associated with the text object.
wxString GetUntranslatedName() const
Get the untranslated field name for storage, variable look-up, etc.
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
wxString GetShownText(const SCH_SHEET_PATH *aPath, RESOLUTION_CONTEXT aContext, const wxString &aVariantName=wxEmptyString, int aDepth=0) const
void SetText(const wxString &aText) override
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
Base class for any item which can be embedded within the SCHEMATIC container class,...
void SetLocked(bool aLocked) override
SCH_ITEM & operator=(const SCH_ITEM &aPin)
SCH_RENDER_SETTINGS * getRenderSettings(PLOTTER *aPlotter) const
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
bool IsLocked() const override
void SetFieldsAutoplaced(AUTOPLACE_ALGO aAlgo)
AUTOPLACE_ALGO m_fieldsAutoplaced
SCH_ITEM(EDA_ITEM *aParent, KICAD_T aType, int aUnit=0, int aBodyStyle=0)
AUTOPLACE_ALGO GetFieldsAutoplaced() const
Return whether the fields have been automatically placed.
wxString ResolveText(const wxString &aText, const SCH_SHEET_PATH *aPath, int aDepth=0) const
wxString GetClass() const override
Return the class name.
int GetEffectivePenWidth(const SCH_RENDER_SETTINGS *aSettings) const
bool m_OverrideItemColors
EE_RTREE & Items()
Get the full RTree, usually for iterating.
const wxString & GetFileName() const
size_t BaseHash() const override
Return type-id of the Base class.
SCH_SHEET_FIELD_PROPERTY(const wxString &aName)
wxAny getter(const void *obj) const override
void setter(void *obj, wxAny &v) override
size_t OwnerHash() const override
Return type-id of the Owner class.
size_t TypeHash() const override
Return type-id of the property type.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
bool GetExcludedFromBOM() const
bool empty() const
Forwarded method from std::vector.
KIID_PATH Path() const
Get the sheet path as an KIID_PATH.
wxString GetPageNumber() const
wxString PathHumanReadable(bool aUseShortRootName=true, bool aStripTrailingSeparator=false, bool aEscapeSheetNames=false) const
Return the sheet path in a human readable form made from the sheet names.
bool GetExcludedFromSim() const
bool GetExcludedFromBoard() const
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
void push_back(SCH_SHEET *aSheet)
Forwarded method from std::vector.
size_t size() const
Forwarded method from std::vector.
void pop_back()
Forwarded method from std::vector.
Define a sheet pin (label) used in sheets to create hierarchical schematics.
Variant information for a schematic sheet.
void InitializeAttributes(const SCH_SHEET &aSheet)
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
void GetEndPoints(std::vector< DANGLING_END_ITEM > &aItemList) override
Add the schematic item end points to aItemList if the item has end points.
void GetContextualTextVars(wxArrayString *aVars) const
Return the list of system text vars & fields for this sheet.
void SetBorderColor(KIGFX::COLOR4D aColor)
friend class SCH_SHEET_PIN
void ClearVariantField(const KIID_PATH &aPath, const wxString &aVariantName, const wxString &aFieldName)
void SetFileName(const wxString &aFilename)
bool HasConnectivityChanges(const SCH_ITEM *aItem, const SCH_SHEET_PATH *aInstance=nullptr) const override
Check if aItem has connectivity changes against this object.
wxString GetFileName() const
Return the filename corresponding to this sheet.
bool getInstance(SCH_SHEET_INSTANCE &aInstance, const KIID_PATH &aSheetPath, bool aTestFromEnd=false) const
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
void SetExcludedFromSim(bool aExcludeFromSim, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
Set or clear the exclude from simulation flag.
void CopyVariant(const KIID_PATH &aPath, const wxString &aSourceVariant, const wxString &aNewVariant)
void SetSize(const VECTOR2I &aSize)
void RemoveInstance(const KIID_PATH &aInstancePath)
void SetDNP(bool aDNP, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
bool addInstance(const KIID_PATH &aInstance)
Add a new instance aSheetPath to the instance list.
void AddPin(SCH_SHEET_PIN *aSheetPin)
Add aSheetPin to the sheet.
bool HasRootInstance() const
Check to see if this sheet has a root sheet instance.
void SyncUuidToScreen()
Take the identity of the screen this sheet owns.
wxString GetClass() const override
Return the class name.
wxString getPageNumber(const KIID_PATH &aParentPath) const
Return the sheet page number for aParentPath.
void SetExcludedFromBOM(bool aExcludeFromBOM, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
Set or clear the exclude from schematic bill of materials flag.
int GetPenWidth() const override
std::map< SCH_SHEET_PIN *, SCH_NO_CONNECT * > GetNoConnects() const
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
bool IsTopLevelSheet() const
Check if this sheet is a top-level sheet.
SCH_SHEET_PATH findSelf() const
Get the sheetpath of this sheet.
bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const override
Compare the item against the search criteria in aSearchData.
bool GetExcludedFromBoardProp() const
double Similarity(const SCH_ITEM &aOther) const override
Return a measure of how likely the other object is to represent the same object.
bool GetExcludedFromBOMProp() const
std::vector< SCH_FIELD > & GetFields()
Return a reference to the vector holding the sheet's fields.
KIGFX::COLOR4D m_borderColor
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this sheet.
void renumberPins()
Renumber the sheet pins in the sheet.
VECTOR2I GetRotationCenter() const
Rotating around the boundingBox's center can cause walking when the sheetname or filename is longer t...
bool HasHierarchyChanges(const SCH_SHEET &aOther) const
SCH_SHEET_PIN * GetPin(const VECTOR2I &aPosition)
Return the sheet pin item found at aPosition in the sheet.
bool GetExcludedFromBOM(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
bool operator<(const SCH_ITEM &aItem) const override
void CleanupSheet()
Delete sheet label which do not have a corresponding hierarchical label.
void RemovePin(const SCH_SHEET_PIN *aSheetPin)
Remove aSheetPin from the sheet.
void SetPositionIgnoringPins(const VECTOR2I &aPosition)
bool SearchHierarchy(const wxString &aFilename, SCH_SCREEN **aScreen)
Search the existing hierarchy for an instance of screen loaded from aFileName.
bool GetExcludedFromSim(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
bool LocatePathOfScreen(SCH_SCREEN *aScreen, SCH_SHEET_PATH *aList)
Search the existing hierarchy for an instance of screen loaded from aFileName.
std::vector< SCH_SHEET_INSTANCE > m_instances
bool HasUndefinedPins() const
Check all sheet labels against schematic for undefined hierarchical labels.
void SetPosition(const VECTOR2I &aPosition) override
wxString GetFieldText(const wxString &aFieldName, const SCH_SHEET_PATH *aPath=nullptr, const wxString &aVariantName=wxEmptyString) const
void SetBackgroundColor(KIGFX::COLOR4D aColor)
int SymbolCount() const
Count our own symbols, without the power symbols.
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 SetDNPProp(bool aEnable)
void AddInstance(const SCH_SHEET_INSTANCE &aInstance)
int GetMinWidth(bool aFromLeft) const
Return the minimum width of the sheet based on the widths of the sheet pin text.
bool operator==(const SCH_ITEM &aOther) const override
std::vector< int > ViewGetLayers() const override
Return the layers the item is drawn on (which may be more than its "home" layer)
std::vector< SCH_FIELD > m_fields
void RenameVariant(const KIID_PATH &aPath, const wxString &aOldName, const wxString &aNewName)
KIGFX::COLOR4D m_backgroundColor
void SetExcludedFromBoard(bool aExclude, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
Set or clear exclude from board netlist flag.
void DeleteVariant(const KIID_PATH &aPath, const wxString &aVariantName)
SCH_SHEET(EDA_ITEM *aParent=nullptr, const VECTOR2I &aPos=VECTOR2I(0, 0), VECTOR2I aSize=VECTOR2I(schIUScale.MilsToIU(MIN_SHEET_WIDTH), schIUScale.MilsToIU(MIN_SHEET_HEIGHT)))
void SetName(const wxString &aName)
int CountSheets() const
Count the number of sheets found in "this" sheet including all of the subsheets.
int GetNextFieldOrdinal() const
Return the next ordinal for a user field for this sheet.
SCH_SCREEN * GetScreen() const
void SetExcludedFromSimProp(bool aEnable)
VECTOR2I GetPosition() const override
const BOX2I GetBodyBoundingBox() const
Return a bounding box for the sheet body but not the fields.
bool HasPin(const wxString &aName) const
Check if the sheet already has a sheet pin named aName.
static int ComparePageNum(const wxString &aPageNumberA, const wxString &aPageNumberB)
Compare page numbers of schematic sheets.
std::vector< PROPERTY_BASE * > GetDynamicProperties() const override
Return dynamically-computed properties specific to this object instance (e.g.
void SetFieldText(const wxString &aFieldName, const wxString &aFieldText, const SCH_SHEET_PATH *aPath=nullptr, const wxString &aVariantName=wxEmptyString)
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
void SetFields(const std::vector< SCH_FIELD > &aFields)
Set multiple schematic fields.
int CountActiveSheets() const
Count the number of sheets found in "this" sheet including all of the subsheets.
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
int GetScreenCount() const
Return the number of times the associated screen for the sheet is being used.
void SetScreen(SCH_SCREEN *aScreen)
Set the SCH_SCREEN associated with this sheet to aScreen.
SCH_SHEET & operator=(const SCH_ITEM &aSheet)
bool HasPageNumberChanges(const SCH_SHEET &aOther) const
Check if the instance data of this sheet has any changes compared to aOther.
const SCH_SHEET_INSTANCE & GetRootInstance() const
Return the root sheet instance data.
bool doIsConnected(const VECTOR2I &aPosition) const override
Provide the object specific test to see if it is connected to aPosition.
void swapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
std::vector< VECTOR2I > GetConnectionPoints() const override
Add all the connection points for this item to aPoints.
KIGFX::COLOR4D GetBorderColor() const
std::vector< SCH_SHEET_PIN * > m_pins
INSPECT_RESULT Visit(INSPECTOR inspector, void *testData, const std::vector< KICAD_T > &aScanTypes) override
May be re-implemented for each derived class in order to handle all the types given by its member dat...
void SetBorderWidth(int aWidth)
std::map< wxString, std::unique_ptr< SCH_SHEET_FIELD_PROPERTY > > m_dynamicPropertyCache
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
SCH_FIELD * AddField(const SCH_FIELD &aField)
Add a @aField to the list of fields.
void setPageNumber(const KIID_PATH &aInstance, const wxString &aPageNumber)
Set the page number for the sheet instance aInstance.
bool IsVirtualRootSheet() const
void AutoplaceFields(SCH_SCREEN *aScreen, AUTOPLACE_ALGO aAlgo) override
int GetMinHeight(bool aFromTop) const
Return the minimum height that the sheet can be resized based on the sheet pin positions.
bool GetDNP(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
Set or clear the 'Do Not Populate' flags.
bool GetExcludedFromSimProp() const
void SetExcludedFromBoardProp(bool aExclude)
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
bool UpdateDanglingState(std::vector< DANGLING_END_ITEM > &aItemListByType, std::vector< DANGLING_END_ITEM > &aItemListByPos, const SCH_SHEET_PATH *aPath=nullptr) override
Test the schematic item to aItemList to check if it's dangling state has changed.
bool GetExcludedFromBoard(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
void Resize(const VECTOR2I &aSize)
Resize this sheet to aSize and adjust all of the labels accordingly.
void Move(const VECTOR2I &aMoveVector) override
Move the item by aMoveVector to a new position.
int GetBorderWidth() const
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.
std::vector< SCH_SHEET_PIN * > & GetPins()
void RunOnChildren(const std::function< void(SCH_ITEM *)> &aFunction, RECURSE_MODE aMode) override
void SetExcludedFromBOMProp(bool aEnable)
void Rotate(const VECTOR2I &aCenter, bool aRotateCCW) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
void AddVariant(const SCH_SHEET_PATH &aInstance, const SCH_SHEET_VARIANT &aVariant)
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the sheet.
const std::vector< SCH_SHEET_INSTANCE > & GetInstances() const
bool IsVerticalOrientation() const
bool HitTest(const VECTOR2I &aPosition, int aAccuracy) const override
Test if aPosition is inside or on the boundary of this item.
KIGFX::COLOR4D GetBackgroundColor() const
bool IsPower() const override
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
std::map< wxString, wxString > m_Fields
#define DEFAULT_LINE_WIDTH_MILS
The default wire width in mils. (can be changed in preference menu)
static constexpr EDA_ANGLE ANGLE_90
static constexpr EDA_ANGLE ANGLE_VERTICAL
static constexpr EDA_ANGLE ANGLE_HORIZONTAL
static constexpr EDA_ANGLE ANGLE_270
@ FILLED_SHAPE
Fill with object color.
const INSPECTOR_FUNC & INSPECTOR
std::function passed to nested users by ref, avoids copying std::function.
a few functions useful in geometry calculations.
const wxChar *const traceSchSheetPaths
Flag to enable debug output of schematic symbol sheet path manipulation code.
@ LAYER_SELECTION_SHADOWS
constexpr void MIRROR(T &aPoint, const T &aMirrorRef)
Updates aPoint with the mirror of aPoint relative to the aMirrorRef.
Message panel definition file.
bool BoxHitTest(const VECTOR2I &aHitPoint, const BOX2I &aHittee, int aAccuracy)
Perform a point-to-box hit test.
KICOMMON_API wxString EllipsizeMenuText(const wxString &aString)
Ellipsize text (at the end) to be no more than 36 characters.
KICOMMON_API wxString EllipsizeStatusText(wxWindow *aWindow, const wxString &aString)
Ellipsize text (at the end) to be no more than 1/3 of the window width.
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
KICOMMON_API void PackColor(types::Color &aOutput, const KIGFX::COLOR4D &aInput)
KICOMMON_API int UnpackDistance(const types::Distance &aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API KIGFX::COLOR4D UnpackColor(const types::Color &aInput)
KICOMMON_API void PackCustomProperties(google::protobuf::RepeatedPtrField< types::CustomProperty > *aOutput, const EDA_ITEM &aItem)
KICOMMON_API VECTOR2I UnpackVector2(const types::Vector2 &aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API void PackDistance(types::Distance &aOutput, int aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API void PackVector2(types::Vector2 &aOutput, const VECTOR2I &aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API void UnpackCustomProperties(const google::protobuf::RepeatedPtrField< types::CustomProperty > &aInput, EDA_ITEM &aItem)
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
@ PT_SIZE
Size expressed in distance units (mm/inch)
std::optional< std::unique_ptr< VALIDATION_ERROR > > VALIDATOR_RESULT
Null optional means validation succeeded.
const SCH_FIELD * FindField(const std::vector< SCH_FIELD > &aFields, FIELD_T aFieldId)
int NextFieldOrdinal(const std::vector< SCH_FIELD > &aFields)
int bumpToNextGrid(const int aVal, const int aDirection)
static struct SCH_SHEET_DESC _SCH_SHEET_DESC
Definition of the SCH_SHEET_PATH and SCH_SHEET_LIST classes for Eeschema.
SHEET_SIDE
Define the edge of the sheet that the sheet pin is positioned.
std::vector< FAB_LAYER_COLOR > dummy
int StrNumCmp(const wxString &aString1, const wxString &aString2, bool aIgnoreCase)
Compare two strings with alphanumerical content.
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
bool m_PDFHierarchicalLinks
A simple container for sheet instance information.
std::map< wxString, SCH_SHEET_VARIANT > m_Variants
A list of sheet variants.
wxString GetDefaultFieldName(FIELD_T aFieldId, TRANSLATION aTranslation)
Return a default symbol field name for a mandatory field type.
FIELD_T
The set of all field indices assuming an array like sequence that a SCH_COMPONENT or LIB_PART can hol...
@ USER
The field ID hasn't been set yet; field is invalid.
@ FOOTPRINT
Field Name Module PCB, i.e. "16DIP300".
@ REFERENCE
Field Reference of part, i.e. "IC21".
wxString result
Test unit parsing edge cases and error handling.
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.
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
wxString GetFieldValidationErrorMessage(FIELD_T aFieldId, const wxString &aValue)
Return the error message if aValue is invalid for aFieldId.
Custom text control validator definitions.
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D