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 );
694 switch( aField->
GetId() )
699 wxString tmp = aFieldText;
700 tmp.Replace( wxT(
"\\" ), wxT(
"/" ) );
711 wxString defaultText = aField->
GetText( aPath );
713 if( aVariantName.IsEmpty() )
715 if( aFieldText != defaultText )
722 wxCHECK( instance, );
724 bool changed =
false;
726 if( instance->
m_Variants.contains( aVariantName ) )
728 auto& fields = instance->
m_Variants[aVariantName].m_Fields;
730 if( aFieldText != defaultText )
732 auto [entry, inserted] = fields.try_emplace( aFieldName, aFieldText );
733 changed = inserted || std::exchange( entry->second, aFieldText ) != aFieldText;
737 changed = fields.erase( aFieldName ) != 0;
740 else if( aFieldText != defaultText )
745 newVariant.
m_Fields[aFieldName] = aFieldText;
746 instance->
m_Variants.insert( std::make_pair( aVariantName, newVariant ) );
761 const wxString& aVariantName )
763 wxCHECK_MSG( !aFieldName.IsEmpty(), , wxT(
"Can't set text on a field with no name!" ) );
767 wxCHECK_MSG( field, , wxT(
"Can't set text on a field not yet added to the sheet!" ) );
769 SetFieldText( field, aFieldName, aFieldText, aPath, aVariantName );
774 const wxString& aVariantName )
const
776 switch( aField->
GetId() )
784 if( aVariantName.IsEmpty() )
792 if( instance->
m_Variants.contains( aVariantName )
793 && instance->
m_Variants.at( aVariantName ).m_Fields.contains( aFieldName ) )
795 return instance->
m_Variants.at( aVariantName ).m_Fields.at( aFieldName );
807 const wxString& aVariantName )
const
809 wxCHECK_MSG( !aFieldName.IsEmpty(), wxEmptyString, wxT(
"Can't get text from a field with no name!" ) );
813 wxCHECK_MSG( field, wxEmptyString, wxT(
"Can't get text from a field not yet added to the sheet!" ) );
815 return GetFieldText( field, aFieldName, aPath, aVariantName );
821 wxASSERT( aSheetPin !=
nullptr );
825 screen->BumpConnectivityRevision();
828 m_pins.push_back( aSheetPin );
835 wxASSERT( aSheetPin !=
nullptr );
840 if( *i == aSheetPin )
843 screen->BumpConnectivityRevision();
859 if(
pin->GetText().Cmp( aName ) == 0 )
871 if( sheetPin->GetPosition() == aPosition )
886 switch(
pin->GetSide() )
896 return topBottom > 0 && leftRight == 0;
916 if( HLabel ==
nullptr )
926 constexpr int gridSize =
schIUScale.MilsToIU( 50 );
928 int base = aVal / gridSize;
929 int excess = abs( aVal % gridSize );
932 if( aVal < 0 && excess > 0 )
937 return ( base + 1 ) * gridSize;
939 else if( excess > 0 )
941 return ( base ) * gridSize;
945 return ( base - 1 ) * gridSize;
953 int pinsRight =
m_pos.x;
961 BOX2I pinRect =
pin->GetBoundingBox();
963 pinsLeft = std::min( pinsLeft, pinRect.
GetLeft() );
964 pinsRight = std::max( pinsRight, pinRect.
GetRight() );
973 if( pinsLeft >= pinsRight )
976 pinMinWidth = pinsRight -
m_pos.x;
987 int pinsBottom =
m_pos.y;
995 BOX2I pinRect =
pin->GetBoundingBox();
997 pinsTop = std::min( pinsTop, pinRect.
GetTop() );
998 pinsBottom = std::max( pinsBottom, pinRect.
GetBottom() );
1007 if( pinsTop >= pinsBottom )
1010 pinMinHeight = pinsBottom -
m_pos.y;
1021 screen->BumpConnectivityRevision();
1023 std::vector<SCH_SHEET_PIN*> pins =
m_pins;
1053 if(
pin->HitTest( aPosition ) )
1078 int margin = borderMargin +
KiROUND( std::max( textSize.
x, textSize.
y ) * 0.5 );
1098 margin = borderMargin +
KiROUND( std::max( textSize.
x, textSize.
y ) * 0.4 );
1136 end.x = std::max(
m_size.x, textLength );
1154 if( field.IsVisible() )
1155 bbox.
Merge( field.GetBoundingBox() );
1158 bbox.
Merge(
pin->GetBoundingBox() );
1214 if( screen && screen->
GetFileName().Cmp( aFilename ) == 0 )
1259 if(
m_screen->GetFileName().Cmp( aFilename ) == 0 )
1302 wxString currentVariant;
1307 path.push_back(
this );
1311 aList.emplace_back(
_(
"Hierarchical Path" ),
path.PathHumanReadable(
false,
true ) );
1321 msgs.Add(
_(
"Simulation" ) );
1324 msgs.Add(
_(
"BOM" ) );
1327 msgs.Add(
_(
"Board" ) );
1329 if(
GetDNP( currentSheet, currentVariant ) )
1330 msgs.Add(
_(
"DNP" ) );
1332 msg = wxJoin( msgs,
'|' );
1333 msg.Replace(
'|', wxS(
", " ) );
1336 aList.emplace_back(
_(
"Exclude from" ), msg );
1342 std::map<SCH_SHEET_PIN*, SCH_NO_CONNECT*> noConnects;
1351 screen = parentSheet->GetScreen();
1359 noConnects[sheetPin] =
static_cast<SCH_NO_CONNECT*
>( noConnect );
1374 field.Move(
delta );
1380 m_pos += aMoveVector;
1383 pin->Move( aMoveVector );
1386 field.Move( aMoveVector );
1412 sheetPin->Rotate( aCenter, aRotateCCW );
1426 field.SetTextPos( pos );
1441 sheetPin->MirrorVertically( aCenter );
1447 field.SetTextPos( pos );
1461 sheetPin->MirrorHorizontally( aCenter );
1467 field.SetTextPos( pos );
1493 sheetPin->ConstrainOnEdge( sheetPin->GetPosition(),
false );
1510 pin->SetNumber(
id );
1522 while( !sheetPath.
empty() && sheetPath.
Last() !=
this )
1525 if( sheetPath.
empty() )
1541 wxT(
"Invalid item in schematic sheet pin list. Bad programmer!" ) );
1543 sheetPin->GetEndPoints( aItemList );
1549 std::vector<DANGLING_END_ITEM>& aItemListByPos,
1552 bool changed =
false;
1555 changed |= sheetPin->UpdateDanglingState( aItemListByType, aItemListByPos );
1570 wxCHECK( sheet,
false );
1584 for(
size_t i = 0; i <
m_pins.size(); i++ )
1596 std::vector<VECTOR2I> retval;
1599 retval.push_back( sheetPin->GetPosition() );
1607 for(
KICAD_T scanType : aScanTypes )
1644 aFunction( &field );
1655 return wxString::Format(
_(
"Hierarchical Sheet '%s'" ),
1697 int aUnit,
int aBodyStyle,
const VECTOR2I& aOffset,
bool aDimmed )
1706 wxString variantName;
1714 bool dnp =
GetDNP( &instance, variantName );
1728 if( aDimmed || dnp )
1731 borderColor = borderColor.
Mix( backgroundColor, 0.5f );
1734 if( aBackground && backgroundColor.
a > 0.0 )
1736 aPlotter->
SetColor( backgroundColor );
1754 std::vector<wxString> properties;
1760 properties.emplace_back( wxString::Format( wxT(
"!%s = %s" ),
1762 field.GetShownText(
FOR_GUI ) ) );
1770 sheetPin->Plot( aPlotter, aBackground, aPlotOpts, aUnit, aBodyStyle, aOffset, aDimmed || dnp );
1774 field.Plot( aPlotter, aBackground, aPlotOpts, aUnit, aBodyStyle, aOffset, aDimmed || dnp );
1784 margins.
x = std::max( margins.
x * 0.6, margins.
y * 0.3 );
1785 margins.
y = std::max( margins.
y * 0.6, margins.
x * 0.3 );
1794 strokeWidth,
nullptr );
1801 wxCHECK_MSG(
Type() == aItem.
Type(), *
this,
1802 wxT(
"Cannot assign object type " ) + aItem.
GetClass() + wxT(
" to type " ) +
GetClass() );
1804 if( &aItem !=
this )
1816 field.SetParent(
this );
1826 m_pins.back()->SetParent(
this );
1860 for(
int ii = (
int)
m_instances.size() - 1; ii >= 0; --ii )
1866 " page %s, from project %s.",
1894 if( instance.m_Path == aPath )
1917 if( instance.m_Path == aSheetPath )
1919 aInstance = instance;
1923 else if( instance.m_Path.EndsWith( aSheetPath ) )
1925 aInstance = instance;
1938 if( instance.m_Path == aSheetPath )
1950 if( instance.m_Path == aSheetPath )
1962 if( instance.m_Path.size() == 0 )
1974 if( instance.m_Path.size() == 0 )
1988 wxString pageNumber;
1992 if( instance.m_Path == aParentPath )
1994 pageNumber = instance.m_PageNumber;
2007 if( instance.m_Path == aPath )
2009 instance.m_PageNumber = aPageNumber;
2034 if( &aOther ==
this )
2041 std::vector<SCH_SHEET_INSTANCE> instances =
GetInstances();
2042 std::vector<SCH_SHEET_INSTANCE> otherInstances = aOther.
GetInstances();
2048 std::sort( instances.begin(), instances.end(),
2051 if( aLhs.m_Path > aRhs.m_Path )
2056 std::sort( otherInstances.begin(), otherInstances.end(),
2059 if( aLhs.m_Path > aRhs.m_Path )
2065 auto itThis = instances.begin();
2066 auto itOther = otherInstances.begin();
2068 while( itThis != instances.end() )
2070 if( itThis->m_Path == itOther->m_Path
2071 && itThis->m_PageNumber != itOther->m_PageNumber )
2086 if( aPageNumberA == aPageNumberB )
2091 bool isIntegerPageA = aPageNumberA.ToLong( &pageA );
2092 bool isIntegerPageB = aPageNumberB.ToLong( &pageB );
2094 if( isIntegerPageA && isIntegerPageB )
2103 if( isIntegerPageA )
2105 else if( isIntegerPageB )
2112 wxCHECK(
result != 0, 0 );
2157 for(
size_t i = 0; i <
GetFields().size(); ++i )
2166 for(
size_t ii = 0; ii <
GetPins().size(); ++ii )
2198 if( instance->
m_Variants.insert( std::make_pair( aVariant.
m_Name, aVariant ) ).second )
2208 if( !instance || !instance->
m_Variants.contains( aVariantName ) )
2218 const wxString& aFieldName )
2222 if( !instance || !instance->
m_Variants.contains( aVariantName ) )
2225 if( instance->
m_Variants[aVariantName].m_Fields.erase( aFieldName ) )
2235 if( aOldName == aNewName || !instance || !instance->
m_Variants.contains( aOldName ) )
2240 variant.
m_Name = aNewName;
2242 instance->
m_Variants.insert( std::make_pair( aNewName, variant ) );
2253 if( !instance || !instance->
m_Variants.contains( aSourceVariant ) )
2258 variant.
m_Name = aNewVariant;
2260 if( instance->
m_Variants.insert( std::make_pair( aNewVariant, variant ) ).second )
2268 bool* attribute = &( this->*aBase );
2270 if( aInstance && !aVariantName.IsEmpty() )
2274 wxCHECK_MSG( instance, ,
2275 wxString::Format( wxS(
"Cannot set attribute for invalid sheet path '%s'." ),
2278 auto variant = instance->
m_Variants.find( aVariantName );
2282 if( aEnable == this->*aBase )
2287 newVariant.*aOverride = aEnable;
2292 attribute = &( variant->second.*aOverride );
2295 if( *attribute == aEnable )
2298 *attribute = aEnable;
2311 if( !aInstance || aVariantName.IsEmpty() )
2319 if( instance.
m_Variants.contains( aVariantName ) )
2320 return instance.
m_Variants[aVariantName].m_DNP;
2348 if( !aInstance || aVariantName.IsEmpty() )
2356 if( instance.
m_Variants.contains( aVariantName ) )
2357 return instance.
m_Variants[aVariantName].m_ExcludedFromSim;
2385 if( !aInstance || aVariantName.IsEmpty() )
2393 if( instance.
m_Variants.contains( aVariantName ) )
2394 return instance.
m_Variants[aVariantName].m_ExcludedFromBOM;
2415void SCH_SHEET::Show(
int nestLevel, std::ostream& os )
const
2420 NestedSpace( nestLevel, os ) <<
'<' << s.Lower().mb_str() <<
">" <<
" sheet_name=\""
2425 sheetPin->Show( nestLevel + 1, os );
2427 NestedSpace( nestLevel, os ) <<
"</" << s.Lower().mb_str() <<
">\n" << std::flush;
2446 if( !aValue.GetAs( &value ) )
2454 return std::make_unique<VALIDATION_ERROR_MSG>( msg );
2466 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)
wxString GetFieldText(const SCH_FIELD *aField, const wxString &aFieldName, const SCH_SHEET_PATH *aPath, const wxString &aVariantName) const
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.
void SetFieldText(SCH_FIELD *aField, const wxString &aFieldName, const wxString &aFieldText, const SCH_SHEET_PATH *aPath, const wxString &aVariantName)
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
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.
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