38#include <api/schematic/schematic_types.pb.h>
71 void setter(
void* obj, wxAny& v )
override
75 if( !v.GetAs( &value ) )
93 field->
SetText( value, sheetPath, variantName );
96 wxAny
getter(
const void* obj )
const override
104 wxString variantName;
115 if( !variantName.IsEmpty() && sheetPath )
120 return wxAny(
text );
160 sheet.mutable_id()->set_value(
m_Uuid.AsStdString() );
163 sheet.set_locked(
IsLocked() ? LockedState::LS_LOCKED : LockedState::LS_UNLOCKED );
168 sheet.set_dnp(
GetDNP() );
170 StrokeAttributes* borderStroke = sheet.mutable_border_stroke();
177 GraphicFillAttributes* fill = sheet.mutable_fill();
179 : GraphicFillType::GFT_FILLED_WITH_COLOR );
189 if( field.IsMandatory() )
192 field.Serialize( *sheet.add_user_fields(),
schIUScale );
196 pin->Serialize( *sheet.add_pins() );
199 aContainer.PackFrom( sheet );
211 if( !aContainer.UnpackTo( &sheet ) )
215 screen->BumpConnectivityRevision();
220 SetLocked( sheet.locked() == LockedState::LS_LOCKED );
232 if( sheet.fill().fill_type() == GraphicFillType::GFT_UNFILLED || !sheet.fill().has_color() )
249 for(
const auto& field : sheet.user_fields() )
255 for(
const auto& pinProto : sheet.pins() )
257 std::unique_ptr<SCH_SHEET_PIN>
pin = std::make_unique<SCH_SHEET_PIN>(
this );
259 if( !
pin->Deserialize( pinProto ) )
292 m_pins.emplace_back( new SCH_SHEET_PIN( *pin ) );
293 m_pins.back()->SetParent( this );
297 field.SetParent(
this );
324 std::vector<PROPERTY_BASE*> props;
326 auto getOrCreate = [&](
const wxString& aName )
332 auto prop = std::make_unique<SCH_SHEET_FIELD_PROPERTY>( aName );
336 return it->second.get();
342 if( field.IsMandatory() )
344 if( field.IsPrivate() )
347 const wxString&
name = field.GetUntranslatedName();
352 props.push_back( getOrCreate(
name ) );
356 std::vector<const SCH_FIELD*> userFields;
360 if( field.IsMandatory() )
363 if( field.IsPrivate() )
366 userFields.push_back( &field );
369 std::ranges::sort( userFields,
375 for(
const SCH_FIELD* field : userFields )
377 const wxString&
name = field->GetUntranslatedName();
378 props.push_back( getOrCreate(
name ) );
382 props.push_back( prop );
419 wxCHECK_RET(
m_screen, wxS(
"Cannot sync a sheet UUID without a screen" ) );
436 wxCHECK_MSG(
Schematic(),
false,
"Can't call IsVirtualRootSheet without setting a schematic" );
444 wxCHECK_MSG(
Schematic(),
false,
"Can't call IsTopLevelSheet without setting a schematic" );
453 [&](
const wxString& aVar )
456 aVars->push_back( aVar );
461 if( field.IsMandatory() )
462 add( field.GetUntranslatedName().Upper() );
464 add( field.GetName() );
469 if( sheetPath.
size() >= 2 )
481 add( wxT(
"SHEETPATH" ) );
482 add( wxT(
"EXCLUDE_FROM_BOM" ) );
483 add( wxT(
"EXCLUDE_FROM_BOARD" ) );
484 add( wxT(
"EXCLUDE_FROM_SIM" ) );
486 add( wxT(
"ERC_ERROR <message_text>" ) );
487 add( wxT(
"ERC_WARNING <message_text>" ) );
489 m_screen->GetTitleBlock().GetContextualTextVars( aVars );
495 wxCHECK( aPath,
false );
502 if( token->Contains(
':' ) )
504 if(
schematic->ResolveCrossReference( token, aDepth + 1 ) )
510 wxString fieldName = field.IsMandatory() ? field.GetUntranslatedName().Upper()
513 if( token->IsSameAs( fieldName ) )
515 *token = field.GetShownText( aPath,
INTERNAL, wxEmptyString, aDepth + 1 );
521 wxString variant =
schematic->GetCurrentVariant();
528 if( token->IsSameAs( wxT(
"#" ) ) )
533 else if( token->IsSameAs( wxT(
"##" ) ) )
535 *token = wxString::Format( wxT(
"%d" ), (
int)
schematic->Hierarchy().size() );
538 else if( token->IsSameAs( wxT(
"SHEETPATH" ) ) )
543 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_BOM" ) ) )
545 *token = wxEmptyString;
547 if( aPath->
GetExcludedFromBOM( variant ) || this->ResolveExcludedFromBOM( aPath, variant ) )
548 *token = wxS(
"Excluded from BOM" );
552 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_BOARD" ) ) )
554 *token = wxEmptyString;
556 if( aPath->
GetExcludedFromBoard( variant ) || this->ResolveExcludedFromBoard( aPath, variant ) )
557 *token = wxS(
"Excluded from board" );
561 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_SIM" ) ) )
563 *token = wxEmptyString;
565 if( aPath->
GetExcludedFromSim( variant ) || this->ResolveExcludedFromSim( aPath, variant ) )
566 *token = wxS(
"Excluded from simulation" );
570 else if( token->IsSameAs( wxT(
"DNP" ) ) )
572 *token = wxEmptyString;
574 if( aPath->
GetDNP( variant ) || this->ResolveDNP( aPath, variant ) )
575 *token = wxS(
"DNP" );
582 if( aPath->
size() >= 2 )
587 if(
path.Last()->ResolveTextVar( &
path, token, aDepth + 1 ) )
592 if(
schematic->ResolveTextVar( aPath, token, aDepth + 1 ) )
603 wxString::Format( wxT(
"SCH_SHEET object cannot swap data with %s object." ),
615 sheetPin->SetParent(
this );
621 field.SetParent(
this );
643 m_fields.emplace_back(
this, aFieldType );
692 const wxString& aVariantName )
694 wxCHECK_MSG( !aFieldName.IsEmpty(), , wxT(
"Can't set text on a field with no name!" ) );
698 wxCHECK_MSG( field, , wxT(
"Can't set text on a field not yet added to the sheet!" ) );
700 switch( field->
GetId() )
705 wxString tmp = aFieldText;
706 tmp.Replace( wxT(
"\\" ), wxT(
"/" ) );
717 wxString defaultText = field->
GetText( aPath );
719 if( aVariantName.IsEmpty() )
721 if( aFieldText != defaultText )
728 wxCHECK( instance, );
730 bool changed =
false;
732 if( instance->
m_Variants.contains( aVariantName ) )
734 auto& fields = instance->
m_Variants[aVariantName].m_Fields;
736 if( aFieldText != defaultText )
738 auto [entry, inserted] = fields.try_emplace( aFieldName, aFieldText );
739 changed = inserted || std::exchange( entry->second, aFieldText ) != aFieldText;
743 changed = fields.erase( aFieldName ) != 0;
746 else if( aFieldText != defaultText )
751 newVariant.
m_Fields[aFieldName] = aFieldText;
752 instance->
m_Variants.insert( std::make_pair( aVariantName, newVariant ) );
767 const wxString& aVariantName )
const
769 wxCHECK( !aFieldName.IsEmpty(), wxEmptyString );
773 wxCHECK( field, wxEmptyString );
775 switch( field->
GetId() )
783 if( aVariantName.IsEmpty() )
791 if( instance->
m_Variants.contains( aVariantName )
792 && instance->
m_Variants.at( aVariantName ).m_Fields.contains( aFieldName ) )
794 return instance->
m_Variants.at( aVariantName ).m_Fields.at( aFieldName );
807 wxASSERT( aSheetPin !=
nullptr );
811 screen->BumpConnectivityRevision();
814 m_pins.push_back( aSheetPin );
821 wxASSERT( aSheetPin !=
nullptr );
826 if( *i == aSheetPin )
829 screen->BumpConnectivityRevision();
845 if(
pin->GetText().Cmp( aName ) == 0 )
857 if( sheetPin->GetPosition() == aPosition )
872 switch(
pin->GetSide() )
882 return topBottom > 0 && leftRight == 0;
902 if( HLabel ==
nullptr )
912 constexpr int gridSize =
schIUScale.MilsToIU( 50 );
914 int base = aVal / gridSize;
915 int excess = abs( aVal % gridSize );
918 if( aVal < 0 && excess > 0 )
923 return ( base + 1 ) * gridSize;
925 else if( excess > 0 )
927 return ( base ) * gridSize;
931 return ( base - 1 ) * gridSize;
939 int pinsRight =
m_pos.x;
947 BOX2I pinRect =
pin->GetBoundingBox();
949 pinsLeft = std::min( pinsLeft, pinRect.
GetLeft() );
950 pinsRight = std::max( pinsRight, pinRect.
GetRight() );
959 if( pinsLeft >= pinsRight )
962 pinMinWidth = pinsRight -
m_pos.x;
973 int pinsBottom =
m_pos.y;
981 BOX2I pinRect =
pin->GetBoundingBox();
983 pinsTop = std::min( pinsTop, pinRect.
GetTop() );
984 pinsBottom = std::max( pinsBottom, pinRect.
GetBottom() );
993 if( pinsTop >= pinsBottom )
996 pinMinHeight = pinsBottom -
m_pos.y;
1007 screen->BumpConnectivityRevision();
1009 std::vector<SCH_SHEET_PIN*> pins =
m_pins;
1039 if(
pin->HitTest( aPosition ) )
1064 int margin = borderMargin +
KiROUND( std::max( textSize.
x, textSize.
y ) * 0.5 );
1084 margin = borderMargin +
KiROUND( std::max( textSize.
x, textSize.
y ) * 0.4 );
1122 end.x = std::max(
m_size.x, textLength );
1140 if( field.IsVisible() )
1141 bbox.
Merge( field.GetBoundingBox() );
1144 bbox.
Merge(
pin->GetBoundingBox() );
1200 if( screen && screen->
GetFileName().Cmp( aFilename ) == 0 )
1245 if(
m_screen->GetFileName().Cmp( aFilename ) == 0 )
1288 wxString currentVariant;
1293 path.push_back(
this );
1297 aList.emplace_back(
_(
"Hierarchical Path" ),
path.PathHumanReadable(
false,
true ) );
1307 msgs.Add(
_(
"Simulation" ) );
1310 msgs.Add(
_(
"BOM" ) );
1313 msgs.Add(
_(
"Board" ) );
1315 if(
GetDNP( currentSheet, currentVariant ) )
1316 msgs.Add(
_(
"DNP" ) );
1318 msg = wxJoin( msgs,
'|' );
1319 msg.Replace(
'|', wxS(
", " ) );
1322 aList.emplace_back(
_(
"Exclude from" ), msg );
1328 std::map<SCH_SHEET_PIN*, SCH_NO_CONNECT*> noConnects;
1337 screen = parentSheet->GetScreen();
1345 noConnects[sheetPin] =
static_cast<SCH_NO_CONNECT*
>( noConnect );
1360 field.Move(
delta );
1366 m_pos += aMoveVector;
1369 pin->Move( aMoveVector );
1372 field.Move( aMoveVector );
1398 sheetPin->Rotate( aCenter, aRotateCCW );
1412 field.SetTextPos( pos );
1427 sheetPin->MirrorVertically( aCenter );
1433 field.SetTextPos( pos );
1447 sheetPin->MirrorHorizontally( aCenter );
1453 field.SetTextPos( pos );
1479 sheetPin->ConstrainOnEdge( sheetPin->GetPosition(),
false );
1496 pin->SetNumber(
id );
1508 while( !sheetPath.
empty() && sheetPath.
Last() !=
this )
1511 if( sheetPath.
empty() )
1527 wxT(
"Invalid item in schematic sheet pin list. Bad programmer!" ) );
1529 sheetPin->GetEndPoints( aItemList );
1535 std::vector<DANGLING_END_ITEM>& aItemListByPos,
1538 bool changed =
false;
1541 changed |= sheetPin->UpdateDanglingState( aItemListByType, aItemListByPos );
1556 wxCHECK( sheet,
false );
1570 for(
size_t i = 0; i <
m_pins.size(); i++ )
1582 std::vector<VECTOR2I> retval;
1585 retval.push_back( sheetPin->GetPosition() );
1593 for(
KICAD_T scanType : aScanTypes )
1630 aFunction( &field );
1641 return wxString::Format(
_(
"Hierarchical Sheet '%s'" ),
1683 int aUnit,
int aBodyStyle,
const VECTOR2I& aOffset,
bool aDimmed )
1692 wxString variantName;
1700 bool dnp =
GetDNP( &instance, variantName );
1714 if( aDimmed || dnp )
1717 borderColor = borderColor.
Mix( backgroundColor, 0.5f );
1720 if( aBackground && backgroundColor.
a > 0.0 )
1722 aPlotter->
SetColor( backgroundColor );
1740 std::vector<wxString> properties;
1746 properties.emplace_back( wxString::Format( wxT(
"!%s = %s" ),
1748 field.GetShownText(
FOR_GUI ) ) );
1756 sheetPin->Plot( aPlotter, aBackground, aPlotOpts, aUnit, aBodyStyle, aOffset, aDimmed || dnp );
1760 field.Plot( aPlotter, aBackground, aPlotOpts, aUnit, aBodyStyle, aOffset, aDimmed || dnp );
1770 margins.
x = std::max( margins.
x * 0.6, margins.
y * 0.3 );
1771 margins.
y = std::max( margins.
y * 0.6, margins.
x * 0.3 );
1780 strokeWidth,
nullptr );
1787 wxCHECK_MSG(
Type() == aItem.
Type(), *
this,
1788 wxT(
"Cannot assign object type " ) + aItem.
GetClass() + wxT(
" to type " ) +
GetClass() );
1790 if( &aItem !=
this )
1802 field.SetParent(
this );
1812 m_pins.back()->SetParent(
this );
1846 for(
int ii = (
int)
m_instances.size() - 1; ii >= 0; --ii )
1852 " page %s, from project %s.",
1880 if( instance.m_Path == aPath )
1903 if( instance.m_Path == aSheetPath )
1905 aInstance = instance;
1909 else if( instance.m_Path.EndsWith( aSheetPath ) )
1911 aInstance = instance;
1924 if( instance.m_Path == aSheetPath )
1936 if( instance.m_Path == aSheetPath )
1948 if( instance.m_Path.size() == 0 )
1960 if( instance.m_Path.size() == 0 )
1974 wxString pageNumber;
1978 if( instance.m_Path == aParentPath )
1980 pageNumber = instance.m_PageNumber;
1993 if( instance.m_Path == aPath )
1995 instance.m_PageNumber = aPageNumber;
2020 if( &aOther ==
this )
2027 std::vector<SCH_SHEET_INSTANCE> instances =
GetInstances();
2028 std::vector<SCH_SHEET_INSTANCE> otherInstances = aOther.
GetInstances();
2034 std::sort( instances.begin(), instances.end(),
2037 if( aLhs.m_Path > aRhs.m_Path )
2042 std::sort( otherInstances.begin(), otherInstances.end(),
2045 if( aLhs.m_Path > aRhs.m_Path )
2051 auto itThis = instances.begin();
2052 auto itOther = otherInstances.begin();
2054 while( itThis != instances.end() )
2056 if( itThis->m_Path == itOther->m_Path
2057 && itThis->m_PageNumber != itOther->m_PageNumber )
2072 if( aPageNumberA == aPageNumberB )
2077 bool isIntegerPageA = aPageNumberA.ToLong( &pageA );
2078 bool isIntegerPageB = aPageNumberB.ToLong( &pageB );
2080 if( isIntegerPageA && isIntegerPageB )
2089 if( isIntegerPageA )
2091 else if( isIntegerPageB )
2098 wxCHECK(
result != 0, 0 );
2143 for(
size_t i = 0; i <
GetFields().size(); ++i )
2152 for(
size_t ii = 0; ii <
GetPins().size(); ++ii )
2184 if( instance->
m_Variants.insert( std::make_pair( aVariant.
m_Name, aVariant ) ).second )
2194 if( !instance || !instance->
m_Variants.contains( aVariantName ) )
2204 const wxString& aFieldName )
2208 if( !instance || !instance->
m_Variants.contains( aVariantName ) )
2211 if( instance->
m_Variants[aVariantName].m_Fields.erase( aFieldName ) )
2221 if( aOldName == aNewName || !instance || !instance->
m_Variants.contains( aOldName ) )
2226 variant.
m_Name = aNewName;
2228 instance->
m_Variants.insert( std::make_pair( aNewName, variant ) );
2239 if( !instance || !instance->
m_Variants.contains( aSourceVariant ) )
2244 variant.
m_Name = aNewVariant;
2246 if( instance->
m_Variants.insert( std::make_pair( aNewVariant, variant ) ).second )
2254 bool* attribute = &( this->*aBase );
2256 if( aInstance && !aVariantName.IsEmpty() )
2260 wxCHECK_MSG( instance, ,
2261 wxString::Format( wxS(
"Cannot set attribute for invalid sheet path '%s'." ),
2264 auto variant = instance->
m_Variants.find( aVariantName );
2268 if( aEnable == this->*aBase )
2273 newVariant.*aOverride = aEnable;
2278 attribute = &( variant->second.*aOverride );
2281 if( *attribute == aEnable )
2284 *attribute = aEnable;
2297 if( !aInstance || aVariantName.IsEmpty() )
2305 if( instance.
m_Variants.contains( aVariantName ) )
2306 return instance.
m_Variants[aVariantName].m_DNP;
2334 if( !aInstance || aVariantName.IsEmpty() )
2342 if( instance.
m_Variants.contains( aVariantName ) )
2343 return instance.
m_Variants[aVariantName].m_ExcludedFromSim;
2371 if( !aInstance || aVariantName.IsEmpty() )
2379 if( instance.
m_Variants.contains( aVariantName ) )
2380 return instance.
m_Variants[aVariantName].m_ExcludedFromBOM;
2401void SCH_SHEET::Show(
int nestLevel, std::ostream& os )
const
2406 NestedSpace( nestLevel, os ) <<
'<' << s.Lower().mb_str() <<
">" <<
" sheet_name=\""
2411 sheetPin->Show( nestLevel + 1, os );
2413 NestedSpace( nestLevel, os ) <<
"</" << s.Lower().mb_str() <<
">\n" << std::flush;
2432 if( !aValue.GetAs( &value ) )
2440 return std::make_unique<VALIDATION_ERROR_MSG>( msg );
2452 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)
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_SCREEN * GetParentScreen() const
void invalidateConnectivity(KICAD_T aChangedType=TYPE_NOT_INIT)
Bump the parent screen's connectivity revision when this item, or the item owning it as a child,...
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.
bool HasPinIdentityChanges(const SCH_SHEET &aOther) const
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.
void setVariantAttribute(bool aEnable, const SCH_SHEET_PATH *aInstance, const wxString &aVariantName, bool SCH_SHEET::*aBase, bool SCH_SHEET_VARIANT::*aOverride)
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 aFieldName 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 line 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.
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
@ 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)
#define TYPE_HASH(x)
Macro to generate unique identifier for a type.
@ PT_SIZE
Size expressed in distance units (mm/inch)
#define REGISTER_TYPE(x)
Helper macro to map type hashes to names.
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.
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...
@ 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