78#include <wx/textdlg.h>
112 const int unit = symbol->
GetUnit();
116 for(
int ii = 0; ii < nUnits; ii++ )
120 if( missingUnits.count( ii + 1 ) == 0 )
121 unit_text +=
_(
" (already placed)" );
134 if( !missingUnits.empty() )
138 for(
int unitNumber : missingUnits )
187 wxEmptyString, wxITEM_CHECK );
222 if(
pin->GetAlt().IsEmpty() || (
pin->GetAlt() == libPin->
GetName() ) )
270 if( !
pin && !sheetPin )
319 wxASSERT_MSG( drawingTools,
"eeshema.InteractiveDrawing tool is not available" );
326 auto sheetHasUndefinedPins =
329 if( aSel.Size() == 1 && aSel.Front()->Type() ==
SCH_SHEET_T )
339 wxString variant =
m_frame->Schematic().GetCurrentVariant();
345 switch( item->Type() )
348 if(
static_cast<const SCH_SYMBOL*
>( item )->GetDNP( sheet, variant ) )
356 if(
static_cast<const SCH_SHEET*
>( item )->GetDNP( sheet, variant ) )
376 return checked > 0 && unchecked == 0;
379 auto attribExcludeFromSimCond =
383 wxString variant =
m_frame->Schematic().GetCurrentVariant();
389 switch( item->Type() )
392 if(
static_cast<const SCH_SYMBOL*
>( item )->GetExcludedFromSim( sheet, variant ) )
400 if(
static_cast<const SCH_SHEET*
>( item )->GetExcludedFromSim( sheet, variant ) )
408 if(
static_cast<const SCH_RULE_AREA*
>( item )->GetExcludedFromSim() )
420 return checked > 0 && unchecked == 0;
423 auto attribExcludeFromBOMCond =
427 wxString variant =
m_frame->Schematic().GetCurrentVariant();
433 switch( item->Type() )
436 if(
static_cast<const SCH_SYMBOL*
>( item )->GetExcludedFromBOM( sheet, variant ) )
444 if(
static_cast<const SCH_SHEET*
>( item )->GetExcludedFromBOM( sheet, variant ) )
452 if(
static_cast<const SCH_RULE_AREA*
>( item )->GetExcludedFromBOM() )
464 return checked > 0 && unchecked == 0;
468 auto attribExcludeFromBoardCond =
472 wxString variant =
m_frame->Schematic().GetCurrentVariant();
478 switch( item->Type() )
481 if(
static_cast<const SCH_SYMBOL*
>( item )->GetExcludedFromBoard( sheet, variant ) )
489 if(
static_cast<const SCH_SHEET*
>( item )->GetExcludedFromBoard( sheet, variant ) )
497 if(
static_cast<const SCH_RULE_AREA*
>( item )->GetExcludedFromBoard() )
509 return checked > 0 && unchecked == 0;
512 auto attribExcludeFromPosFilesCond = [
this](
const SELECTION& aSel )
515 wxString variant =
m_frame->Schematic().GetCurrentVariant();
523 if(
static_cast<const SCH_SYMBOL*
>( item )->GetExcludedFromPosFiles( sheet, variant ) )
530 return checked > 0 && unchecked == 0;
551 auto duplicateCondition =
560 auto orientCondition =
571 auto propertiesCondition =
574 if( aSel.GetSize() == 0 )
591 if( !firstItem || !eeSelection )
594 switch( firstItem->
Type() )
612 return aSel.GetSize() == 1;
617 if( std::all_of( aSel.Items().begin(), aSel.Items().end(),
620 return item->Type() == SCH_LINE_T
621 && static_cast<const SCH_LINE*>( item )->IsGraphicLine();
626 else if( std::all_of( aSel.Items().begin(), aSel.Items().end(),
629 return item->Type() == SCH_JUNCTION_T;
634 else if( std::all_of( aSel.Items().begin(), aSel.Items().end(),
637 const SCH_ITEM* schItem = dynamic_cast<const SCH_ITEM*>( item );
639 wxCHECK( schItem, false );
641 return ( schItem->HasLineStroke() && schItem->IsConnectable() )
642 || item->Type() == SCH_JUNCTION_T;
655 auto autoplaceCondition =
669 static const std::vector<KICAD_T> allTextTypes = {
SCH_LABEL_T,
687 static const std::vector<KICAD_T> toCLabelTypes = {
SCH_LABEL_T,
696 static const std::vector<KICAD_T> toHLabelTypes = {
SCH_LABEL_T,
705 static const std::vector<KICAD_T> toGLabelTypes = {
SCH_LABEL_T,
714 static const std::vector<KICAD_T> toTextTypes = {
SCH_LABEL_T,
723 static const std::vector<KICAD_T> toTextBoxTypes = {
SCH_LABEL_T,
738 auto variantActiveCondition =
741 return !
m_frame->Schematic().GetCurrentVariant().IsEmpty();
744 auto noVariantActiveCondition =
747 return m_frame->Schematic().GetCurrentVariant().IsEmpty();
750 auto symbolHasVariantSymbol =
753 if(
m_frame->Schematic().GetCurrentVariant().IsEmpty() || aSel.GetSize() != 1 )
763 std::optional<SCH_SYMBOL_VARIANT> variant =
766 return variant.has_value() && variant->m_SymbolOverride.has_value();
769 auto makeSymbolUnitMenu =
772 std::shared_ptr<SYMBOL_UNIT_MENU> menu = std::make_shared<SYMBOL_UNIT_MENU>();
773 menu->SetTool( tool );
774 tool->GetToolMenu().RegisterSubMenu( menu );
778 auto makeBodyStyleMenu =
781 std::shared_ptr<BODY_STYLE_MENU> menu = std::make_shared<BODY_STYLE_MENU>();
782 menu->SetTool( tool );
783 tool->GetToolMenu().RegisterSubMenu( menu );
787 auto makePinFunctionMenu =
790 std::shared_ptr<ALT_PIN_FUNCTION_MENU> menu = std::make_shared<ALT_PIN_FUNCTION_MENU>();
791 menu->SetTool( tool );
792 tool->GetToolMenu().RegisterSubMenu( menu );
796 auto makePinTricksMenu =
799 std::shared_ptr<PIN_TRICKS_MENU> menu = std::make_shared<PIN_TRICKS_MENU>();
800 menu->SetTool( tool );
801 tool->GetToolMenu().RegisterSubMenu( menu );
805 auto makeTransformMenu =
819 auto makeAttributesMenu =
834 auto makeEditFieldsMenu =
847 auto makeConvertToMenu =
866 std::shared_ptr<LOCK_CONTEXT_MENU> menu = std::make_shared<LOCK_CONTEXT_MENU>( tool );
867 tool->GetToolMenu().RegisterSubMenu( menu );
894 moveMenu.AddMenu( makeTransformMenu(), orientCondition, 200 );
895 moveMenu.AddMenu( makeAttributesMenu(),
S_C::HasTypes( attribTypes ), 200 );
900 moveMenu.AddSeparator();
921 drawMenu.
AddMenu( makeTransformMenu(), orientCondition, 200 );
945 selToolMenu.
AddMenu( makeTransformMenu(), orientCondition, 200 );
963 symbolHasVariantSymbol, 200 );
964 selToolMenu.
AddMenu( makeConvertToMenu(), toChangeCondition, 200 );
1046 wxLogTrace(
"KICAD_SCH_MOVE",
"SCH_EDIT_TOOL::Rotate: start, clockwise=%d, selection size=%u", clockwise,
1049 if( selection.
GetSize() == 0 )
1053 int principalItemCount = 0;
1055 bool moving =
false;
1060 std::map<SCH_SHEET_PIN*, SCH_NO_CONNECT*> noConnects;
1063 commit = &localCommit;
1065 for(
unsigned ii = 0; ii < selection.
GetSize(); ii++ )
1072 principalItemCount++;
1081 if( principalItemCount == 1 )
1093 switch( head->
Type() )
1099 symbol->
Rotate( rotPoint, !clockwise );
1101 if(
m_frame->eeconfig()->m_AutoplaceFields.enable )
1165 head->
Rotate( rotPoint, !clockwise );
1187 head->
Rotate( rotPoint, !clockwise );
1195 rotPoint =
m_frame->GetNearestHalfGridPosition(
group->GetPosition() );
1197 group->Rotate( rotPoint, !clockwise );
1199 group->Move( rotPoint -
m_frame->GetNearestHalfGridPosition(
group->GetPosition() ) );
1208 rotPoint =
m_frame->GetNearestHalfGridPosition(
table->GetCenter() );
1210 table->Rotate( rotPoint, !clockwise );
1212 table->Move( rotPoint -
m_frame->GetNearestHalfGridPosition(
table->GetCenter() ) );
1218 head->
Rotate( rotPoint, clockwise );
1232 sheet->
Rotate( rotPoint, !clockwise );
1241 m_frame->UpdateItem( head,
false,
true );
1251 for(
EDA_ITEM* edaItem : selection )
1267 line->
Rotate( rotPoint, !clockwise );
1297 field->
Rotate( rotPoint, !clockwise );
1308 table->Rotate( rotPoint, !clockwise );
1311 table->Move( beforeCenter -
table->GetCenter() );
1319 sheet->
Rotate( rotPoint, !clockwise );
1324 item->
Rotate( rotPoint, !clockwise );
1326 wxLogTrace(
"KICAD_SCH_MOVE",
" SCH_EDIT_TOOL::Rotate: item type=%d rotated, pos (%d,%d) -> (%d,%d)",
1327 item->
Type(), posBefore.
x, posBefore.
y, posAfter.
x, posAfter.
y );
1330 m_frame->UpdateItem( item,
false,
true );
1334 wxLogTrace(
"KICAD_SCH_MOVE",
"SCH_EDIT_TOOL::Rotate: complete, moving=%d", moving );
1338 wxLogTrace(
"KICAD_SCH_MOVE",
"SCH_EDIT_TOOL::Rotate: posting refreshPreview" );
1343 for(
auto& [sheetPin, noConnect] : noConnects )
1345 if( noConnect->GetPosition() != sheetPin->GetTextPos() )
1347 commit->
Modify( noConnect, screen );
1348 noConnect->SetPosition( sheetPin->GetTextPos() );
1362 m_frame->Schematic().CleanUp( commit );
1364 if( !localCommit.
Empty() )
1365 localCommit.
Push(
_(
"Rotate" ) );
1378 if( selection.
GetSize() == 0 )
1383 bool connections =
false;
1389 std::map<SCH_SHEET_PIN*, SCH_NO_CONNECT*> noConnects;
1392 commit = &localCommit;
1394 if( selection.
GetSize() == 1 )
1399 switch( item->
Type() )
1496 m_frame->UpdateItem( item,
false,
true );
1498 else if( selection.
GetSize() > 1 )
1502 for(
EDA_ITEM* edaItem : selection )
1504 item =
static_cast<SCH_ITEM*
>( edaItem );
1568 m_frame->UpdateItem( item,
false,
true );
1573 for(
EDA_ITEM* selected : selection )
1582 for(
auto& [sheetPin, noConnect] : noConnects )
1584 if( noConnect->GetPosition() != sheetPin->GetTextPos() )
1586 commit->
Modify( noConnect, screen );
1587 noConnect->SetPosition( sheetPin->GetTextPos() );
1603 m_frame->Schematic().CleanUp( commit );
1606 if( !localCommit.
Empty() )
1607 localCommit.
Push(
_(
"Mirror" ) );
1623 unsigned aFallbackRotationsCCW )
1625 std::set<wxString> handledKeys;
1634 const VECTOR2I bRelPos = bField.GetPosition() - bField.GetParentPosition();
1637 const EDA_ANGLE bTextAngle = bField.GetTextAngle();
1644 bField.SetPosition( bField.GetParentPosition() + aRelPos );
1645 bField.SetHorizJustify( aTextJustifyH );
1646 bField.SetVertJustify( aTextJustifyV );
1647 bField.SetTextAngle( aTextAngle );
1654 auto it = std::find_if( aBFields.begin(), aBFields.end(),
1657 return bField.GetUntranslatedName() == name;
1660 if( it != aBFields.end() )
1664 swapFieldTextProps( aField, bField );
1669 for(
unsigned ii = 0; ii < aFallbackRotationsCCW; ii++ )
1676 handledKeys.insert(
name );
1683 const wxString bName = bField.GetUntranslatedName();
1684 if( handledKeys.find( bName ) == handledKeys.end() )
1686 for(
unsigned ii = 0; ii < aFallbackRotationsCCW; ii++ )
1688 bField.Rotate( bField.GetParentPosition(),
false );
1703 if( selection.
Size() < 2 )
1717 if( item->GetParent() != parent )
1723 bool connections =
false;
1729 commit = &localCommit;
1732 std::map<SCH_SHEET_PIN*, SCH_NO_CONNECT*> noConnects;
1740 std::map<SCH_SHEET_PIN*, SCH_NO_CONNECT*> sheetNoConnects =
1741 static_cast<SCH_SHEET*
>( item )->GetNoConnects();
1743 noConnects.insert( sheetNoConnects.begin(), sheetNoConnects.end() );
1755 for(
size_t i = 0; i < sorted.size() - 1; i++ )
1767 std::swap( aPos, bPos );
1776 std::swap( aSide, bSide );
1808 std::vector<SCH_FIELD>& aFields = aLabelBase.
GetFields();
1809 std::vector<SCH_FIELD>& bFields = bLabelBase.
GetFields();
1811 const unsigned rotationsAtoB = aSpinStyle.
CCWRotationsTo( bSpinStyle );
1822 if( !aText || !bText )
1848 std::swap( aOrient, bOrient );
1861 m_frame->UpdateItem( a,
false,
true );
1862 m_frame->UpdateItem( b,
false,
true );
1871 for(
auto& [sheetPin, noConnect] : noConnects )
1873 if( noConnect->GetPosition() != sheetPin->GetTextPos() )
1875 commit->
Modify( noConnect, screen );
1876 noConnect->SetPosition( sheetPin->GetTextPos() );
1888 if( !localCommit.
Empty() )
1889 localCommit.
Push(
_(
"Swap" ) );
1909 if( !
m_frame->eeconfig()->m_Input.allow_unconstrained_pin_swaps )
1916 if( selection.
Size() < 2 )
1929 if( item->GetParent() != parent )
1933 std::set<wxString> sharedSheetPaths;
1934 std::set<wxString> sharedProjectNames;
1937 &sharedProjectNames ) )
1941 std::set<wxString> friendlySheets;
1943 if( !sharedSheetPaths.empty() )
1946 if( !sharedProjectNames.empty() )
1950 if( projects.IsEmpty() )
1952 m_frame->ShowInfoBarError(
_(
"Pin swaps are disabled for symbols shared across other projects. "
1953 "Duplicate the sheet to edit pins independently." ) );
1958 wxString::Format(
_(
"Pin swaps are disabled for symbols shared across other projects (%s). "
1959 "Duplicate the sheet to edit pins independently." ),
1963 else if( !friendlySheets.empty() )
1968 wxString::Format(
_(
"Pin swaps are disabled for symbols used by multiple sheet instances (%s). "
1969 "Duplicate the sheet to edit pins independently." ),
1975 _(
"Pin swaps are disabled for shared symbols. Duplicate the sheet to edit pins independently." ) );
1981 bool connections =
false;
1987 commit = &localCommit;
1993 bool swappedLibPins =
false;
1995 for(
size_t i = 0; i < sorted.size() - 1; i++ )
1998 SCH_PIN* bPin =
static_cast<SCH_PIN*
>( sorted[( i + 1 ) % sorted.size()] );
2011 m_frame->UpdateItem( aPin,
false,
true );
2012 m_frame->UpdateItem( bPin,
false,
true );
2015 if( swappedLibPins )
2019 m_frame->UpdateItem( parentSymbol,
false,
true );
2032 m_frame->Schematic().CleanUp( commit );
2039 if( !localCommit.
Empty() )
2040 localCommit.
Push(
_(
"Swap Pins" ) );
2054 std::vector<SCH_ITEM*> items;
2059 std::set<SCH_ITEM*> seen{ aPin };
2060 std::vector<SCH_ITEM*> pending{ aPin };
2062 while( !pending.empty() )
2066 items.push_back( item );
2072 if( seen.insert( neighbor ).second )
2073 pending.push_back( neighbor );
2081 items.assign( sg->GetItems().begin(), sg->GetItems().end() );
2084 const auto isNet = [&](
SCH_ITEM* aItem )
2089 return connection && connection->IsNet();
2092 const SCH_CONNECTION* connection = aItem->Connection( &aSheetPath );
2093 return connection && connection->
IsNet();
2096 size_t pinCount = 0;
2104 if( !item->IsType( { SCH_LABEL_T, SCH_GLOBAL_LABEL_T, SCH_HIER_LABEL_T } ) || !isNet( item ) )
2125 if( orderedPins.size() < 2 )
2130 std::vector<SCH_LABEL_BASE*> labels;
2132 for(
EDA_ITEM* item : orderedPins )
2140 _(
"Each selected pin must have exactly one attached net label and no other pin connections." ) );
2144 labels.push_back( label );
2147 if( labels.size() >= 2 )
2154 for(
size_t i = 0; i < labels.size() - 1; ++i )
2158 wxString aText = a->
GetText();
2159 wxString bText = b->
GetText();
2164 commit.
Push(
_(
"Swap Pin Labels" ) );
2176 if( selectedUnits.size() < 2 )
2182 std::vector<std::vector<SCH_LABEL_BASE*>> symbolLabelVectors;
2186 std::vector<std::pair<VECTOR2I, SCH_LABEL_BASE*>> byPos;
2188 for(
SCH_PIN*
pin : symbol->GetPins( &sheetPath ) )
2194 m_frame->ShowInfoBarError(
_(
"Each pin of selected units must have exactly one attached net label and "
2195 "no other pin connections." ) );
2199 byPos.emplace_back(
pin->GetPosition(), label );
2203 std::sort( byPos.begin(), byPos.end(),
2204 [](
const auto& a,
const auto& b )
2206 if( a.first.x != b.first.x )
2207 return a.first.x < b.first.x;
2209 return a.first.y < b.first.y;
2213 std::vector<SCH_LABEL_BASE*> labels;
2215 for(
const auto& pr : byPos )
2216 labels.push_back( pr.second );
2218 symbolLabelVectors.push_back( labels );
2222 const size_t pinCount = symbolLabelVectors.front().size();
2227 for(
size_t pin = 0;
pin < pinCount;
pin++ )
2229 for(
auto& vec : symbolLabelVectors )
2232 wxString carry = symbolLabelVectors.back()[
pin]->GetText();
2234 for(
size_t i = 0; i < symbolLabelVectors.size(); i++ )
2243 if( !commit.
Empty() )
2244 commit.
Push(
_(
"Swap Unit Labels" ) );
2254 std::vector<std::unique_ptr<SCH_ITEM>> sourceItems(
m_frame->GetRepeatItems().size() );
2256 for(
int ii = 0; ii < (int) sourceItems.size(); ++ii )
2259 if( sourceItems.empty() )
2268 for(
const std::unique_ptr<SCH_ITEM>& item : sourceItems )
2271 int commitCheckpoint = commit.Checkpoint();
2272 bool restore_state =
false;
2283 enteredGroup->AddItem( newItem );
2292 if( !label->IncrementLabel( cfg->m_Drawing.repeat_label_increment ) )
2293 m_frame->ShowInfoBarWarning(
_(
"Label value cannot go below zero" ),
true );
2306 schIUScale.MilsToIU( cfg->m_Drawing.default_repeat_offset_y ) ) );
2315 if(
m_frame->CheckSheetForRecursion( sheet, currentSheet ) )
2318 const wxString originalFileName = sheet->
GetFileName();
2323 restore_state = !
m_frame->EditSheetProperties( sheet, currentSheet );
2336 commit.Added( newItem,
m_frame->GetScreen() );
2345 if(
m_frame->eeconfig()->m_AnnotatePanel.automatic )
2347 static_cast<SCH_SYMBOL*
>( newItem )->ClearAnnotation(
nullptr,
false );
2350 true , annotateStartNum,
false,
false,
false,
reporter );
2360 commit.RevertToCheckpoint( commitCheckpoint );
2362 newItems.
Add( newItem );
2365 if( !newItems.
Empty() )
2371 m_frame->Schematic().CleanUp( &commit );
2372 commit.Push(
_(
"Repeat Item" ) );
2374 m_frame->SaveCopyForRepeatItem(
static_cast<SCH_ITEM*
>( newItems[0] ) );
2376 for(
size_t ii = 1; ii < newItems.
GetSize(); ++ii )
2377 m_frame->AddCopyForRepeatItem(
static_cast<SCH_ITEM*
>( newItems[ii] ) );
2391 std::deque<EDA_ITEM*> items =
m_selectionTool->GetSelection().GetItems();
2393 std::vector<VECTOR2I> pts;
2394 bool updateHierarchy =
false;
2415 pts.insert( pts.end(), tmp_pts.begin(), tmp_pts.end() );
2438 static_cast<SCH_FIELD*
>( sch_item )->SetVisible(
false );
2444 static_cast<SCH_TABLECELL*
>( sch_item )->SetText( wxEmptyString );
2481 m_frame->DeleteJunction( &commit, junction );
2484 commit.
Push(
_(
"Delete" ) );
2486 if( updateHierarchy )
2487 m_frame->UpdateHierarchyNavigator();
2503 caption.Printf(
_(
"Edit %s Field" ),
TitleCaps( fieldName ) );
2507 caption.Printf(
_(
"Edit '%s' Field" ), aField->
GetName() );
2534 if( !commit.
Empty() )
2535 commit.
Push( caption );
2543 if( sel.
Size() != 1 )
2546 bool clearSelection = sel.
IsHover();
2562 if( item ==
nullptr )
2594 clearSelection =
true;
2618 if( clearSelection )
2630 bool moving = head && head->
IsMoving();
2632 if( selection.
Empty() )
2635 std::vector<SCH_ITEM*> autoplaceItems;
2637 for(
unsigned ii = 0; ii < selection.
GetSize(); ii++ )
2642 autoplaceItems.push_back( item );
2647 for(
SCH_ITEM* sch_item : autoplaceItems )
2649 if( sch_item->IsLocked() )
2652 if( !moving && !sch_item->IsNew() )
2666 if( !commit.
Empty() )
2667 commit.
Push(
_(
"Autoplace Fields" ) );
2682 if( !selection.
Empty() )
2691 if( !
m_frame->Schematic().GetCurrentVariant().IsEmpty() )
2694 _(
"Change Symbol is not available when a design variant is active. "
2695 "Use Set Variant Symbol or switch to the default variant first." ) );
2718 if( selection.
Empty() )
2726 wxString variantName =
m_frame->Schematic().GetCurrentVariant();
2728 if( variantName.IsEmpty() )
2737 std::shared_ptr<LIB_SYMBOL> baseFlat;
2744 baseFlat = baseSymbol->
Flatten();
2747 [baseFlat, adapter](
const LIB_ID& aCandidate )
2748 -> std::vector<VARIANT_COMPAT_RESULT>
2754 std::unique_ptr<LIB_SYMBOL> flat = raw->Flatten();
2767 std::vector<PICKED_SYMBOL> historyList;
2768 std::vector<PICKED_SYMBOL> alreadyPlaced;
2771 &symbol->
GetLibId(),
false, compatFunc );
2788 _(
"Could not load symbol '%s' from library." ), symLabel ) );
2795 std::unique_ptr<LIB_SYMBOL> candidateFlat = candidateRaw->
Flatten();
2799 std::vector<VARIANT_COMPAT_RESULT> issues =
2802 if( !issues.empty() )
2804 wxString msg = wxString::Format(
2805 _(
"The selected symbol '%s' is not pin-compatible with the base symbol "
2811 msg += wxS(
"\u2022 " ) + issue.detail + wxS(
"\n" );
2813 msg += wxS(
"\n" ) +
_(
"Choose a symbol with equivalent pins and pin positions." );
2814 wxMessageBox( msg,
_(
"Variant Symbol Compatibility" ), wxOK | wxICON_ERROR,
m_frame );
2827 commit.
Push(
_(
"Set Variant Symbol" ) );
2828 m_frame->GetCanvas()->Refresh();
2841 if( selection.
Empty() )
2849 wxString variantName =
m_frame->Schematic().GetCurrentVariant();
2851 if( variantName.IsEmpty() )
2856 std::optional<SCH_SYMBOL_VARIANT> existingVariant =
2857 symbol->
GetVariant( currentSheet, variantName );
2859 if( !existingVariant || !existingVariant->m_SymbolOverride.has_value() )
2868 commit.
Push(
_(
"Clear Variant Symbol" ) );
2869 m_frame->GetCanvas()->Refresh();
2882 if( selection.
Empty() )
2891 m_frame->SelectBodyStyle( symbol, nextBodyStyle );
2893 if( symbol->
IsNew() )
2906 bool clearSelection = selection.
IsHover();
2908 if( selection.
Empty() )
2933 switch( curr_item->
Type() )
2940 std::deque<SCH_LINE*> lines;
2943 lines.push_back(
static_cast<SCH_LINE*
>( selItem ) );
2951 std::deque<SCH_JUNCTION*> junctions;
2954 junctions.push_back(
static_cast<SCH_JUNCTION*
>( selItem ) );
2965 std::deque<SCH_ITEM*> items;
2968 items.push_back(
static_cast<SCH_ITEM*
>( selItem ) );
2976 frame()->ShowInfoBarMsg(
_(
"Use Properties panel to edit properties common to selected items." ) );
2987 if( inspectionTool )
2995 std::vector<SCH_TABLECELL*> cells;
3017 if( selection.
Size() > 1 )
3023 if( !
frame()->GetPropertiesPanel()->IsShownOnScreen() )
3025 infobar->
AddLink(
_(
"Show Properties panel" ),
3026 [
this]( wxHyperlinkEvent& )
3028 frame()->ToggleProperties();
3033 infobar->
ShowMessageFor(
_(
"Use Properties panel to edit properties common to selected items." ),
3034 8000, wxICON_INFORMATION );
3042 if( clearSelection )
3051 switch( aItem->
Type() )
3072 if(
m_frame->eeconfig()->m_AutoplaceFields.enable )
3088 if( wxWindow* blocking_win =
editor->Kiway().GetBlockingDialog() )
3089 blocking_win->Close(
true );
3095 editor->LoadSymbolFromSchematic( symbol );
3106 if( wxWindow* blocking_win =
editor->Kiway().GetBlockingDialog() )
3107 blocking_win->Close(
true );
3139 bool isUndoable =
false;
3140 bool doClearAnnotation =
false;
3141 bool okPressed =
false;
3142 bool updateHierarchyNavigator =
false;
3152 okPressed =
m_frame->EditSheetProperties( sheet, &
m_frame->GetCurrentSheet(), &isUndoable, &doClearAnnotation,
3153 &updateHierarchyNavigator );
3159 commit.
Push(
_(
"Edit Sheet Properties" ) );
3166 std::vector<SCH_ITEM*> items;
3168 items.emplace_back( sheet );
3169 m_frame->Schematic().OnItemsRemoved( items );
3170 m_frame->Schematic().OnItemsAdded( items );
3172 m_frame->Schematic().RefreshHierarchy();
3173 m_frame->UpdateHierarchyNavigator();
3180 if( doClearAnnotation )
3195 if( !okPressed || !isUndoable || doClearAnnotation )
3199 m_frame->GetCanvas()->Refresh();
3201 if( updateHierarchyNavigator )
3202 m_frame->UpdateHierarchyNavigator();
3285 dlg.SetTitle(
_(
"Rule Area Properties" ) );
3301 wxFAIL_MSG( wxString(
"Cannot edit schematic item type " ) + aItem->
GetClass() );
3309 m_frame->GetScreen()->UpdateDisplayBounds( schItem );
3323 commit = &localCommit;
3325 for(
unsigned int i = 0; i < selection.GetSize(); ++i )
3329 if( item && item->
Type() != convertTo )
3340 wxCHECK2( sourceText,
continue );
3342 switch( item->
Type() )
3362 txt =
_(
"<empty>" );
3373 txt =
text->GetText();
3374 href =
text->GetHyperlink();
3391 int textSize =
text->GetTextSize().y;
3424 position =
m_frame->GetNearestGridPosition( position );
3434 auto getValidNetname =
3435 [](
const wxString& aText )
3437 wxString local_txt = aText;
3438 local_txt.Replace(
"\n",
"_" );
3439 local_txt.Replace(
"\r",
"_" );
3440 local_txt.Replace(
"\t",
"_" );
3444 local_txt.Replace(
" ",
"_" );
3449 if( local_txt.IsEmpty() )
3450 return _(
"<empty>" );
3478 newtext = new_label;
3503 newtext = new_label;
3528 newtext = new_label;
3545 new_label->
GetFields().push_back( netclass );
3552 newtext = new_label;
3572 bbox.
Inflate( -label->GetLabelBoxExpansion() );
3603 new_textbox->
SetEnd( botRight );
3606 newtext = new_textbox;
3615 wxCHECK2( newtext,
continue );
3626 wxCHECK2( eda_text && new_eda_text,
continue );
3641 if( label && new_label )
3650 return field.GetId() == FIELD_T::INTERSHEET_REFS
3651 && new_label->Type() != SCH_GLOBAL_LABEL_T;
3673 if( !localCommit.
Empty() )
3674 localCommit.
Push(
_(
"Change To" ) );
3676 if( selection.IsHover() )
3689 if( selection.
GetSize() == 0 )
3698 commit = &localCommit;
3711 for(
EDA_ITEM* edaItem : selection )
3713 item =
static_cast<SCH_ITEM*
>( edaItem );
3720 setJustify(
static_cast<SCH_FIELD*
>( item ) );
3727 setJustify(
static_cast<SCH_TEXT*
>( item ) );
3738 setJustify( label );
3741 m_frame->UpdateItem( item,
false,
true );
3745 for(
EDA_ITEM* selected : selection )
3759 if( !localCommit.
Empty() )
3762 localCommit.
Push(
_(
"Left Justify" ) );
3764 localCommit.
Push(
_(
"Center Justify" ) );
3766 localCommit.
Push(
_(
"Right Justify" ) );
3783 if( !
IsOK(
m_frame,
_(
"Do you wish to delete the unreferenced pins from this sheet?" ) ) )
3792 commit.
Push(
_(
"Cleanup Sheet Pins" ) );
3817 screen =
m_frame->GetScreen();
3826 if( prevInstance.
size() )
3834 screen =
m_frame->GetScreen();
3837 sheet =
m_frame->GetCurrentSheet().Last();
3844 msg.Printf(
_(
"Enter page number for sheet path%s" ),
3845 ( sheetPath.Length() > 20 ) ?
"\n" + sheetPath :
" " + sheetPath );
3847 wxTextEntryDialog dlg(
m_frame, msg,
_(
"Edit Sheet Page Number" ), pageNumber );
3849 dlg.SetTextValidator( wxFILTER_ALPHANUMERIC );
3851 if( dlg.ShowModal() == wxID_CANCEL || dlg.GetValue() == instance.
GetPageNumber() )
3856 commit.
Modify( sheet, screen );
3860 if( instance ==
m_frame->GetCurrentSheet() )
3862 m_frame->GetScreen()->SetPageNumber( dlg.GetValue() );
3863 m_frame->OnPageSettingsChange();
3866 commit.
Push( wxS(
"Change Sheet Page Number" ) );
3883 wxString* filename = aEvent.
Parameter<wxString*>();
3890 if( !
image->GetReferenceImage().ReadImageFile( *filename ) )
3892 wxMessageBox( wxString::Format(
_(
"Could not load image from '%s'." ), *filename ) );
3907 std::set<std::pair<SCH_ITEM*, SCH_SCREEN*>> collectedItems;
3913 collectedItems.insert( { symbol,
m_frame->GetScreen() } );
3917 if( symbol->IsAnnotated( &
m_frame->GetCurrentSheet() ) )
3919 wxString ref = symbol->GetRef( &
m_frame->GetCurrentSheet() );
3920 int unit = symbol->GetUnit();
3921 LIB_ID libId = symbol->GetLibId();
3926 std::vector<SCH_SYMBOL*> otherUnits;
3931 collectedItems.insert( { otherUnit, screen } );
3937 collectedItems.insert( { sheet,
m_frame->GetScreen() } );
3941 collectedItems.insert( { ruleArea,
m_frame->GetScreen() } );
3947 wxString variant =
m_frame->Schematic().GetCurrentVariant();
3948 bool new_state =
false;
3950 for(
const auto& [item,
_] : collectedItems )
3957 && !item->GetExcludedFromPosFiles( sheet, variant ) ) )
3964 for(
const auto& [item, screen] : collectedItems )
3966 commit.
Modify( item, screen );
3969 item->SetDNP( new_state, sheet, variant );
3972 item->SetExcludedFromSim( new_state, sheet, variant );
3975 item->SetExcludedFromBOM( new_state, sheet, variant );
3978 item->SetExcludedFromBoard( new_state, sheet, variant );
3981 item->SetExcludedFromPosFiles( new_state, sheet, variant );
3984 if( !commit.
Empty() )
3985 commit.
Push(
_(
"Toggle Attribute" ) );
4000 return _(
"Edit Symbol Properties..." );
4017 return _(
"Edit Netclasses..." );
4021 return _(
"Remove Empty Label" );
4024 return wxEmptyString;
4038 if(
EDA_ITEM* item =
frame->ResolveItem( aERCItem->GetMainItemID() ) )
4047 EDA_ITEM* item =
frame->ResolveItem( aERCItem->GetMainItemID() );
4062 frame->ShowSchematicSetupDialog(
_(
"Net Classes" ) );
4067 SCH_ITEM* item =
frame->Schematic().ResolveItem( aERCItem->GetMainItemID(), &sheetPath,
true );
4075 commit.
Push(
_(
"Remove Empty Label" ) );
4103 if( selection.
Empty() )
4106 if( selection.
Empty() )
4117 if( schItem->IsLocked() )
4126 wxString commitMsg = ( aMode ==
ON ) ?
_(
"Lock" ) :
_(
"Unlock" );
4139 schItem->SetLocked( aMode ==
ON );
4143 if( !commit.
Empty() )
4145 commit.
Push( commitMsg );
constexpr EDA_IU_SCALE schIUScale
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
static TOOL_ACTION decrementPrimary
static TOOL_ACTION unselectAll
static TOOL_ACTION decrementSecondary
static TOOL_ACTION selectItem
Select an item (specified as the event parameter).
static TOOL_ACTION unselectItem
static TOOL_ACTION showSymbolLibTable
static TOOL_ACTION pasteSpecial
static TOOL_ACTION groupProperties
static TOOL_ACTION rightJustify
static TOOL_ACTION pageSettings
static TOOL_ACTION incrementSecondary
static TOOL_ACTION duplicate
static TOOL_ACTION incrementPrimary
static TOOL_ACTION doDelete
static TOOL_ACTION cursorClick
static TOOL_ACTION deleteTool
static TOOL_ACTION increment
static TOOL_ACTION selectionClear
Clear the current selection.
static TOOL_ACTION leftJustify
static TOOL_ACTION copyAsText
static TOOL_ACTION refreshPreview
static TOOL_ACTION selectAll
static TOOL_ACTION centerJustify
Manage TOOL_ACTION objects.
void SetConditions(const TOOL_ACTION &aAction, const ACTION_CONDITIONS &aConditions)
Set the conditions the UI elements for activating a specific tool action should use for determining t...
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
void update() override
Update menu state stub.
ACTION_MENU * create() const override
Return an instance of this class. It has to be overridden in inheriting classes.
constexpr const Vec & GetPosition() const
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 void SetOrigin(const Vec &pos)
constexpr Vec Centre() const
constexpr const Vec GetCenter() const
constexpr coord_type GetLeft() 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 coord_type GetBottom() const
COMMIT & Remove(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Remove a new item from the model.
COMMIT & Added(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Notify observers that aItem has been added.
void Unstage(EDA_ITEM *aItem, BASE_SCREEN *aScreen)
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
COMMIT & Removed(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Notify observers that aItem has been removed.
int GetStatus(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Returns status of an item.
Calculate the connectivity of a schematic and generate netlists.
A subgraph is a set of items that are electrically connected on a single sheet.
Dialog to update or change schematic library symbols.
This class is setup in expectation of its children possibly using Kiway player so DIALOG_SHIM::ShowQu...
void UpdateField(SCH_FIELD *aField)
Dialog used to edit SCH_SYMBOL objects in a schematic.
@ TABLECELL_PROPS_EDIT_TABLE
enum TABLECELL_PROPS_RETVALUE GetReturnValue()
bool HitTestDrawingSheetItems(KIGFX::VIEW *aView, const VECTOR2I &aPosition)
bool IsHorizontal() const
A set of EDA_ITEMs (i.e., without duplicates).
A base class for most all the KiCad significant classes used in schematics and boards.
virtual VECTOR2I GetPosition() const
virtual void SetPosition(const VECTOR2I &aPos)
virtual const BOX2I GetBoundingBox() const
Return the orthogonal bounding box of this object for display purposes.
EDA_ITEM_FLAGS GetEditFlags() const
void SetFlags(EDA_ITEM_FLAGS aMask)
KICAD_T Type() const
Returns the type of object.
virtual bool IsType(const std::vector< KICAD_T > &aScanTypes) const
Check whether the item is one of the listed types.
EDA_ITEM * GetParent() const
bool HasFlag(EDA_ITEM_FLAGS aFlag) const
virtual void SetParent(EDA_ITEM *aParent)
virtual void SetEnd(const VECTOR2I &aEnd)
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
virtual VECTOR2I GetTextSize() const
virtual void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
virtual const wxString & GetText() const
Return the string associated with the text object.
virtual bool IsVisible() const
virtual void SetTextPos(const VECTOR2I &aPoint)
KIFONT::FONT * GetFont() const
void SetAttributes(const EDA_TEXT &aSrc, bool aSetPosition=true)
Set the text attributes from another instance.
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
wxString GetHyperlink() const
GR_TEXT_H_ALIGN_T GetHorizJustify() const
virtual void SetTextThickness(int aWidth)
The TextThickness is that set by the user.
virtual EDA_ANGLE GetTextAngle() const
void SetBold(bool aBold)
Set the text to be bold - this will also update the font if needed.
void SetHyperlink(wxString aLink)
GR_TEXT_V_ALIGN_T GetVertJustify() const
virtual int GetTextThickness() const
virtual void SetText(const wxString &aText)
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
void SetItalic(bool aItalic)
Set the text to be italic - this will also update the font if needed.
void SetFont(KIFONT::FONT *aFont)
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
EE_TYPE Overlapping(const BOX2I &aRect) const
static const TOOL_EVENT SelectedEvent
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
VECTOR2D GetCursorPosition() const
Return the current cursor position in world coordinates.
virtual wxString GetClass() const =0
Return the class name.
void RecacheAllItems()
Rebuild GAL display lists.
A wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of a KiCad project.
A logical library item identifier and consists of various portions much like a URI.
bool IsValid() const
Check if this LID_ID is valid.
const UTF8 & GetLibItemName() const
Define a library symbol object.
int GetUnitCount() const override
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
static bool ParseBusGroup(const wxString &aGroup, wxString *name, std::vector< wxString > *aMemberList, size_t *aPrefixEnd=nullptr)
Parse a bus group label into the name and a list of components.
A singleton reporter that reports to nowhere.
static SYMBOL_LIBRARY_ADAPTER * SymbolLibAdapter(PROJECT *aProject)
Accessor for project symbol library manager adapter.
These are loaded from Eeschema settings but then overwritten by the project settings.
Holds all the data relating to one schematic.
SCHEMATIC_SETTINGS & Settings() const
SCH_CONNECTIVITY::FACADE & Connectivity() const
CONNECTION_GRAPH * ConnectionGraph() const
static TOOL_ACTION rotateCCW
static TOOL_ACTION placeClassLabel
static TOOL_ACTION swapPins
static TOOL_ACTION editValue
static TOOL_ACTION setExcludeFromBOM
static TOOL_ACTION mirrorV
static TOOL_ACTION clearHighlight
static TOOL_ACTION placeGlobalLabel
static TOOL_ACTION changeSymbols
static TOOL_ACTION updateSymbol
static TOOL_ACTION autoplaceFields
static TOOL_ACTION changeSymbol
static TOOL_ACTION ddAddImage
static TOOL_ACTION properties
static TOOL_ACTION editReference
static TOOL_ACTION placeHierLabel
static TOOL_ACTION placeLabel
static TOOL_ACTION toText
static TOOL_ACTION toHLabel
static TOOL_ACTION rotateCW
static TOOL_ACTION importSheet
static TOOL_ACTION setExcludeFromSim
static TOOL_ACTION toLabel
static TOOL_ACTION setDNP
static TOOL_ACTION swapUnitLabels
static TOOL_ACTION placeImage
static TOOL_ACTION editWithLibEdit
static TOOL_ACTION cleanupSheetPins
static TOOL_ACTION toDLabel
static TOOL_ACTION clearVariantSymbol
static TOOL_ACTION setExcludeFromPosFiles
static TOOL_ACTION cycleBodyStyle
static TOOL_ACTION mirrorH
static TOOL_ACTION setVariantSymbol
static TOOL_ACTION ddAppendFile
static TOOL_ACTION placeSchematicText
static TOOL_ACTION toTextBox
static TOOL_ACTION unlock
static TOOL_ACTION annotate
static TOOL_ACTION updateSymbols
static TOOL_ACTION swapPinLabels
static TOOL_ACTION enterSheet
static TOOL_ACTION editFootprint
static TOOL_ACTION repeatDrawItem
static TOOL_ACTION editTextAndGraphics
static TOOL_ACTION editPageNumber
static TOOL_ACTION toGLabel
static TOOL_ACTION setExcludeFromBoard
static TOOL_ACTION toggleLock
Object to handle a bitmap image that can be inserted in a schematic.
static const std::vector< KICAD_T > FieldOwners
static const std::vector< KICAD_T > DeletableItems
Commit for the schematic and symbol editors.
void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Execute the changes.
static SELECTION_CONDITION SingleMultiFunctionPin
static SELECTION_CONDITION SingleSymbol
static SELECTION_CONDITION MultipleSymbolsOrPower
static SELECTION_CONDITION HasLockedItems
static SELECTION_CONDITION AllPinsOrSheetPins
static SELECTION_CONDITION SingleSymbolOrPower
static SELECTION_CONDITION HasUnlockedItems
static SELECTION_CONDITION SingleMultiUnitSymbol
static SELECTION_CONDITION SingleMultiBodyStyleSymbol
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
std::optional< ITEM_VIEW > Connection(const KIID &aItem, const KIID_PATH &aPath) const
Schematic editor (Eeschema) main window.
const wxString & GetHighlightedConnection() const
void Rotate(const VECTOR2I &aCenter, bool aRotateCCW) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
VECTOR2I GetPosition() const override
wxString GetUntranslatedName() const
Get the untranslated field name for storage, variable look-up, etc.
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
void SetPosition(const VECTOR2I &aPosition) override
void SetText(const wxString &aText) override
VECTOR2I GetParentPosition() const
A set of SCH_ITEMs (i.e., without duplicates).
Base class for any item which can be embedded within the SCHEMATIC container class,...
SCH_ITEM * Duplicate(bool addToParentGroup, SCH_COMMIT *aCommit=nullptr, bool aDoClone=false) const
Routine to create a new copy of given item.
virtual bool IsConnectable() const
virtual void AutoplaceFields(SCH_SCREEN *aScreen, AUTOPLACE_ALGO aAlgo)
virtual void RunOnChildren(const std::function< void(SCH_ITEM *)> &aFunction, RECURSE_MODE aMode)
const SYMBOL * GetParentSymbol() const
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
virtual void MirrorHorizontally(int aCenter)
Mirror item horizontally about aCenter.
const std::vector< SCH_ITEM * > & ConnectedItems(const SCH_SHEET_PATH &aPath) const
Retrieve the set of items connected to this item on the given sheet.
virtual void Move(const VECTOR2I &aMoveVector)
Move the item by aMoveVector to a new position.
void SetConnectivityDirty(bool aDirty=true)
Set the dirty flag.
void SetFieldsAutoplaced(AUTOPLACE_ALGO aAlgo)
virtual void Rotate(const VECTOR2I &aCenter, bool aRotateCCW)
Rotate the item around aCenter 90 degrees in the clockwise direction.
AUTOPLACE_ALGO GetFieldsAutoplaced() const
Return whether the fields have been automatically placed.
wxString GetClass() const override
Return the class name.
bool IsGroupableType() const
virtual std::vector< VECTOR2I > GetConnectionPoints() const
Add all the connection points for this item to aPoints.
bool IsType(const std::vector< KICAD_T > &aScanTypes) const override
Check whether the item is one of the listed types.
virtual void MirrorVertically(int aCenter)
Mirror item vertically about aCenter.
void AddFields(const std::vector< SCH_FIELD > &aFields)
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
SPIN_STYLE GetSpinStyle() const
void SetShape(LABEL_FLAG_SHAPE aShape)
LABEL_FLAG_SHAPE GetShape() const
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
std::vector< SCH_FIELD > & GetFields()
virtual void SetSpinStyle(SPIN_STYLE aSpinStyle)
Segment description base class to describe items which have 2 end points (track, wire,...
void Rotate(const VECTOR2I &aCenter, bool aRotateCCW) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
VECTOR2I GetEndPoint() const
VECTOR2I GetStartPoint() const
const std::map< wxString, ALT > & GetAlternates() const
bool IsConnectable() const override
const wxString & GetName() const
Container class that holds multiple SCH_SCREEN objects in a hierarchy.
void ClearAnnotationOfNewSheetPaths(SCH_SHEET_LIST &aInitialSheetPathList)
Clear the annotation for the symbols inside new sheetpaths when a complex hierarchy is modified and n...
bool IsExplicitJunction(const VECTOR2I &aPosition) const
Indicate that a junction dot is necessary at the given location.
EE_RTREE & Items()
Get the full RTree, usually for iterating.
const wxString & GetFileName() const
SCH_ITEM * GetItem(const VECTOR2I &aPosition, int aAccuracy=0, KICAD_T aType=SCH_LOCATE_ANY_T) const
Check aPosition within a distance of aAccuracy for items of type aFilter.
void SetFileName(const wxString &aFileName)
Set the file name for this screen to aFileName.
void ClearAnnotation(SCH_SHEET_PATH *aSheetPath, bool aResetPrefix)
Clear the annotation for the symbols in aSheetPath on the screen.
void SetPosition(const VECTOR2I &aPos) override
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
void BuildSheetList(SCH_SHEET *aSheet, bool aCheckIntegrity)
Build the list of sheets and their sheet path from aSheet.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
SCH_SCREEN * LastScreen()
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.
void SetPageNumber(const wxString &aPageNumber)
Set the sheet instance user definable page number.
const KIID_PATH & PathRef() const
Borrow the cached path until this sheet path is modified or destroyed.
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.
SHEET_SIDE GetSide() const
void SetSide(SHEET_SIDE aEdge)
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
void SetFileName(const wxString &aFilename)
wxString GetFileName() const
Return the filename corresponding to this sheet.
std::map< SCH_SHEET_PIN *, SCH_NO_CONNECT * > GetNoConnects() const
VECTOR2I GetRotationCenter() const
Rotating around the boundingBox's center can cause walking when the sheetname or filename is longer t...
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.
bool HasUndefinedPins() const
Check all sheet labels against schematic for undefined hierarchical labels.
SCH_SCREEN * GetScreen() const
const BOX2I GetBodyBoundingBox() const
Return a bounding box for the sheet body but not the fields.
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
void Rotate(const VECTOR2I &aCenter, bool aRotateCCW) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
wxString GetUnitDisplayName(int aUnit, bool aLabel) const override
Return the display name for a given unit aUnit.
bool ClearVariantSymbolOverride(const SCH_SHEET_PATH &aPath, const wxString &aVariantName)
Remove the alternate-symbol override for a given variant and sheet instance.
void SetVariantSymbolOverride(const SCH_SHEET_PATH &aPath, const wxString &aVariantName, const LIB_ID &aLibId)
Set the alternate-symbol override for a given variant and sheet instance.
bool IsMultiBodyStyle() const override
void AutoplaceFields(SCH_SCREEN *aScreen, AUTOPLACE_ALGO aAlgo) override
Automatically orient all the fields in the symbol.
void ClearCaches() override
std::optional< SCH_SYMBOL_VARIANT > GetVariant(const SCH_SHEET_PATH &aInstance, const wxString &aVariantName) const
wxString GetBodyStyleDescription(int aBodyStyle, bool aLabel) const override
void UpdatePins()
Updates the cache of SCH_PIN objects for each pin.
bool HasDeMorganBodyStyles() const override
int GetBodyStyleCount() const override
Return the number of body styles of the symbol.
void SetOrientation(int aOrientation)
Compute the new transform matrix based on aOrientation for the symbol which is applied to the current...
bool IsMissingLibSymbol() const
Check to see if the library symbol is set to the dummy library symbol.
const LIB_ID & GetLibId() const override
int GetOrientation() const override
Get the display symbol orientation.
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
void Rotate(const VECTOR2I &aCenter, bool aRotateCCW) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
bool IsPower() const override
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this symbol.
int GetMarginBottom() const
int GetLegacyTextMargin() const
int GetMarginLeft() const
int GetMarginRight() const
virtual void Rotate90(bool aClockwise)
virtual void MirrorSpinStyle(bool aLeftRight)
static SELECTION_CONDITION HasTypes(std::vector< KICAD_T > aTypes)
Create a functor that tests if among the selected items there is at least one of a given types.
static SELECTION_CONDITION HasType(KICAD_T aType)
Create a functor that tests if among the selected items there is at least one of a given type.
static bool NotEmpty(const SELECTION &aSelection)
Test if there are any items selected.
static SELECTION_CONDITION MoreThan(int aNumber)
Create a functor that tests if the number of selected items is greater than the value given as parame...
static bool Idle(const SELECTION &aSelection)
Test if there no items selected or being edited.
static bool IdleSelection(const SELECTION &aSelection)
Test if all selected items are not being edited.
static SELECTION_CONDITION Count(int aNumber)
Create a functor that tests if the number of selected items is equal to the value given as parameter.
static bool ShowAlways(const SELECTION &aSelection)
The default condition function (always returns true).
static SELECTION_CONDITION OnlyTypes(std::vector< KICAD_T > aTypes)
Create a functor that tests if the selected items are only of given types.
virtual void Add(EDA_ITEM *aItem)
A null aItem is ignored; the selection never holds null members.
virtual KIGFX::VIEW_ITEM * GetItem(unsigned int aIdx) const override
VECTOR2I GetReferencePoint() const
virtual VECTOR2I GetCenter() const
Returns the center point of the selection area bounding box.
virtual unsigned int GetSize() const override
Return the number of stored items.
int Size() const
Returns the number of selected parts.
std::deque< EDA_ITEM * > & Items()
std::vector< EDA_ITEM * > GetItemsSortedBySelectionOrder() const
bool OnlyContains(std::vector< KICAD_T > aList) const
Checks if all items in the selection have a type in aList.
bool Empty() const
Checks if there is anything selected.
bool HasReferencePoint() const
size_t CountType(KICAD_T aType) const
Spin style for labels of all kinds on schematics.
unsigned CCWRotationsTo(const SPIN_STYLE &aOther) const
Get CCW rotation needed to get to the given spin style.
The symbol library editor main window.
An interface to the global shared library manager that is schematic-specific and linked to one projec...
LIB_SYMBOL * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_SYMBOL having aName from the library given by aNickname.
Helper object to filter a list of libraries.
A modified version of the wxInfoBar class that allows us to:
void RemoveAllButtons()
Remove all the buttons that have been added by the user.
void ShowMessageFor(const wxString &aMessage, int aTime, int aFlags=wxICON_INFORMATION, MESSAGE_TYPE aType=WX_INFOBAR::MESSAGE_TYPE::GENERIC)
Show the infobar with the provided message and icon for a specific period of time.
void AddLink(const wxString &aLinkText, const std::function< void(wxHyperlinkEvent &)> &aFn)
Add a hypertext link to the infobar.
void AddCloseButton(const wxString &aTooltip=_("Hide this message."))
Add the default close button to the infobar on the right side.
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
This file is part of the common library.
@ SYMBOL_PROPS_EDIT_SCHEMATIC_SYMBOL
@ SYMBOL_PROPS_WANT_EXCHANGE_SYMBOL
@ SYMBOL_PROPS_WANT_UPDATE_SYMBOL
@ SYMBOL_PROPS_WANT_SET_VARIANT_SYMBOL
@ SYMBOL_PROPS_EDIT_LIBRARY_SYMBOL
@ SYMBOL_PROPS_WANT_CLEAR_VARIANT_SYMBOL
static constexpr EDA_ANGLE ANGLE_90
static constexpr EDA_ANGLE ANGLE_VERTICAL
static constexpr EDA_ANGLE ANGLE_HORIZONTAL
#define IGNORE_PARENT_GROUP
#define IS_NEW
New item, just created.
#define SELECTED_BY_DRAG
Item was algorithmically selected as a dragged item.
#define STRUCT_DELETED
flag indication structures to be erased
#define ENDPOINT
ends. (Used to support dragging.)
#define STARTPOINT
When a line is selected, these flags indicate which.
@ ID_POPUP_SCH_PIN_TRICKS_HIER_LABEL
@ ID_POPUP_SCH_PIN_TRICKS_WIRE
@ ID_POPUP_SCH_ALT_PIN_FUNCTION
@ ID_POPUP_SCH_SELECT_UNIT1
@ ID_POPUP_SCH_SELECT_UNIT
@ ID_POPUP_SCH_SELECT_BODY_STYLE
@ ID_POPUP_SCH_PLACE_UNIT1
@ ID_POPUP_SCH_SELECT_BODY_STYLE1
@ ID_POPUP_SCH_PIN_TRICKS_NET_LABEL
@ ID_POPUP_SCH_PIN_TRICKS_NO_CONNECT
@ ID_POPUP_SCH_SELECT_UNIT_END
@ ID_POPUP_SCH_ALT_PIN_FUNCTION_END
@ ID_POPUP_SCH_PIN_TRICKS_GLOBAL_LABEL
@ ERCE_UNANNOTATED
Symbol has not been annotated.
@ ERCE_DUPLICATE_REFERENCE
More than one symbol with the same reference.
@ ERCE_EMPTY_LABEL_NAME
Label has an empty or whitespace-only name.
@ ERCE_FOOTPRINT_LINK_ISSUES
The footprint link is invalid, or points to a missing (or inactive) footprint or library.
@ ERCE_UNDEFINED_NETCLASS
A netclass was referenced but not defined.
@ ERCE_SIMULATION_MODEL
An error was found in the simulation model.
@ ERCE_LIB_SYMBOL_MISMATCH
Symbol doesn't match copy in library.
@ ERCE_LIB_SYMBOL_ISSUES
Symbol not found in active libraries.
@ ERCE_FOOTPRINT_FILTERS
The assigned footprint doesn't match the footprint filters.
@ FRAME_SCH_SYMBOL_EDITOR
bool m_ConnectivityEngine
Use the schematic connectivity engine instead of CONNECTION_GRAPH.
@ LAYER_SCHEMATIC_DRAWINGSHEET
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
#define UNIMPLEMENTED_FOR(type)
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
void CollectOtherUnits(const wxString &aRef, int aUnit, const LIB_ID &aLibId, SCH_SHEET_PATH &aSheet, std::vector< SCH_SYMBOL * > *otherUnits)
Class to handle a set of SCH_ITEMs.
LABEL_FLAG_SHAPE
Label and flag shapes used with text objects.
ANNOTATE_ORDER_T
Schematic annotation order options.
@ ANNOTATE_SELECTION
Annotate the selection.
ANNOTATE_ALGO_T
Schematic annotation type options.
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.
T * GetAppSettings(const char *aFilename)
wxString UnescapeString(const wxString &aSource)
wxString TitleCaps(const wxString &aString)
Capitalize the first letter in each word.
wxString EscapeString(const wxString &aSource, ESCAPE_CONTEXT aContext)
The Escape/Unescape routines use HTML-entity-reference-style encoding to handle characters which are:...
void AccumulateDescriptions(wxString &aDesc, const T &aItemCollection)
Build a comma-separated list from a collection of wxStrings.
Functors that can be used to figure out how the action controls should be displayed in the UI and if ...
wxString GetDefaultFieldName(FIELD_T aFieldId, TRANSLATION aTranslation)
Return a default symbol field name for a mandatory field type.
@ 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".
@ VALUE
Field Value of part, i.e. "3.3K".
IbisParser parser & reporter
GR_TEXT_H_ALIGN_T
This is API surface mapped to common.types.HorizontalAlignment.
GR_TEXT_V_ALIGN_T
This is API surface mapped to common.types.VertialAlignment.
constexpr GR_TEXT_H_ALIGN_T GetFlippedAlignment(GR_TEXT_H_ALIGN_T aAlign)
Get the reverse alignment: left-right are swapped, others are unchanged.
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
@ SCH_ITEM_LOCATE_GRAPHIC_LINE_T
std::vector< VARIANT_COMPAT_RESULT > ValidateVariantSymbolCompatibility(const LIB_SYMBOL &aBase, const LIB_SYMBOL &aCandidate)
Check whether aCandidate can be used as a variant symbol override for aBase.
std::function< std::vector< VARIANT_COMPAT_RESULT >(const LIB_ID &)> SYMBOL_COMPAT_FUNC
Callback that evaluates variant symbol compatibility for a given candidate LIB_ID.
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D