27#include <unordered_set>
77#include <wx/filedlg.h>
107 auto belowRootSheetCondition =
110 return m_frame->GetCurrentSheet().Last() != &
m_frame->Schematic().Root();
120 auto inDrawingRuleArea =
147 bool placeOneOnly = symbol !=
nullptr;
150 std::vector<PICKED_SYMBOL>* historyList =
nullptr;
151 bool ignorePrimePosition =
false;
155 bool keepSymbol =
false;
184 filter.FilterPowerSymbols(
true );
188 wxFAIL_MSG(
"PlaceSymbol(): unexpected request" );
203 m_view->AddToPreview( aSymbol,
false );
224 existingRefs.
Clear();
252 for(
size_t i = 0; i < refs.
GetCount(); i++ )
253 existingRefs.
AddItem( refs[i] );
257 m_frame->GetCurrentSheet().UpdateAllScreenReferences();
280 existingRefs.
AddItem( placedSymbolReference );
292 ignorePrimePosition =
true;
300 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
306 bool isSyntheticClick = symbol && evt->IsActivate() && evt->HasPosition() && evt->Matches( aEvent );
308 if( evt->IsCancelInteractive() || ( symbol && evt->IsAction( &
ACTIONS::undo ) ) )
310 m_frame->GetInfoBar()->Dismiss();
327 else if( evt->IsActivate() && !isSyntheticClick )
329 if( symbol && evt->IsMoveTool() )
332 evt->SetPassEvent(
false );
338 m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel symbol creation." ) );
339 evt->SetPassEvent(
false );
343 if( evt->IsMoveTool() )
346 frame()->PushTool( originalEvent );
362 std::set<UTF8> unique_libid;
363 std::vector<PICKED_SYMBOL> alreadyPlaced;
383 alreadyPlaced.push_back( pickedSymbol );
389 bool footprintPreviews =
m_frame->eeconfig()->m_Appearance.footprint_preview;
404 if( evt->IsPrime() && !ignorePrimePosition )
431 if( keywords.Contains( wxT(
"global power" ) ) )
433 keywords.Replace( wxT(
"global power" ), wxT(
"local power" ) );
439 if( desc.Contains( wxT(
"global label" ) ) )
441 desc.Replace( wxT(
"global label" ), wxT(
"local label" ) );
454 symbol =
new SCH_SYMBOL( *libSymbol, &
m_frame->GetCurrentSheet(), sel, cursorPos,
461 existingRefs.
AddItem( placedSymbolReference );
464 if(
m_frame->eeconfig()->m_AutoplaceFields.enable )
476 m_frame->AddToScreen( symbol, screen );
478 if(
m_frame->eeconfig()->m_AutoplaceFields.enable )
481 m_frame->SaveCopyForRepeatItem( symbol );
484 commit.
Added( symbol, screen );
490 commit.
Push(
_(
"Place Symbol" ) );
495 if( placeOneOnly && !placeAllUnits )
500 if( keepSymbol || placeAllUnits )
512 const wxString currentRefStr = currentReference.
GetRef();
513 const bool isUnannotated = !currentRefStr.IsEmpty() && currentRefStr.Last() ==
'?';
514 const LIB_ID symLibId = symbol->GetLibId();
517 [&](
int aUnit ) ->
bool
523 return schematic.
Contains( candidate );
529 while( currentReference.
GetUnit() <= symbol->GetUnitCount()
530 && unitOccupied( currentReference.
GetUnit() ) )
535 if( currentReference.
GetUnit() > symbol->GetUnitCount() )
542 if( keepSymbol || currentReference.
GetUnit() > 1 )
548 addSymbol( nextSymbol );
551 if( currentReference.
GetUnit() == 1 )
556 existingRefs.
AddItem( placedSymbolReference );
564 if( placeOneOnly && !symbol )
585 m_frame->SelectUnit( symbol, unit );
594 if( symbol && symbol->GetBodyStyle() != bodyStyle )
596 m_frame->SelectBodyStyle( symbol, bodyStyle );
617 symbol->SetPosition( cursorPos );
619 m_view->AddToPreview( symbol,
false );
620 m_frame->SetMsgPanel( symbol );
668 int requestedUnit = params.
m_Unit;
673 static const std::vector<KICAD_T> symbolTypes = {
SCH_SYMBOL_T };
676 if( selection.
Size() != 1 )
678 m_frame->ShowInfoBarMsg(
_(
"Select a single symbol to place the next unit." ) );
689 if( !symbol->IsMultiUnit() )
691 m_frame->ShowInfoBarMsg(
_(
"This symbol has only one unit." ) );
697 if( missingUnits.empty() )
699 m_frame->ShowInfoBarMsg(
_(
"All units of this symbol are already placed." ) );
705 if( requestedUnit > 0 )
707 if( missingUnits.count( requestedUnit ) == 0 )
709 m_frame->ShowInfoBarMsg(
_(
"Requested unit already placed." ) );
713 nextMissing = requestedUnit;
718 nextMissing = *std::min_element( missingUnits.begin(), missingUnits.end() );
721 std::unique_ptr<SCH_SYMBOL> newSymbol = std::make_unique<SCH_SYMBOL>( *symbol );
727 newSymbol->SetUnitSelection( nextMissing );
728 newSymbol->SetUnit( nextMissing );
729 newSymbol->SetRefProp( symbol->GetRef( &sheetPath,
false ) );
746 std::optional<VECTOR2I> connectionAnchor;
747 std::optional<VECTOR2I> positionAnchor;
750 []( std::optional<VECTOR2I>& aBest,
const VECTOR2I& aCandidate )
752 if( !aBest || aCandidate.y < aBest->y || ( aCandidate.y == aBest->y && aCandidate.x < aBest->x ) )
761 for(
const VECTOR2I& pt : item->GetConnectionPoints() )
762 keepTopLeft( connectionAnchor, pt );
764 keepTopLeft( positionAnchor, item->GetPosition() );
767 return connectionAnchor ? connectionAnchor : positionAnchor;
789 struct RESET_FORCED_CURSOR_GUARD
793 ~RESET_FORCED_CURSOR_GUARD()
799 RESET_FORCED_CURSOR_GUARD forcedCursorGuard{ controls };
801 if( !cfg || !common_settings )
806 std::unique_ptr<DESIGN_BLOCK> designBlock;
807 wxString sheetFileName = wxEmptyString;
809 if( placingDesignBlock )
820 sheetFileName = designBlock->GetSchematicFile();
822 if( sheetFileName.IsEmpty() || !wxFileExists( sheetFileName ) )
824 m_frame->ShowInfoBarError(
_(
"Design block has no schematic to place." ),
true );
831 wxString* importSourceFile = aEvent.
Parameter<wxString*>();
833 if( importSourceFile !=
nullptr )
834 sheetFileName = *importSourceFile;
844 auto placeSheetContents =
858 std::unordered_set<EDA_ITEM*> existingItems;
861 existingItems.insert( item );
863 if( !
m_frame->LoadSheetFromFile( sheetPath.
Last(), &sheetPath, sheetFileName,
true,
864 placingDesignBlock ) )
869 m_frame->SetSheetNumberAndCount();
885 baseName = designBlock->GetLibId().GetLibItemName().wx_str();
886 group->SetDesignBlockLibId( designBlock->GetLibId() );
890 baseName = wxFileName( sheetFileName ).GetName();
901 if( !existingItems.contains( item ) )
908 if( item->Type() ==
SCH_SYMBOL_T && !keepAnnotations && !autoAnnotate )
909 static_cast<SCH_SYMBOL*
>( item )->ClearAnnotation( &sheetPath,
false );
914 if( !item->GetParentGroup() )
917 group->AddItem( item );
919 newItems.emplace_back( item );
922 commit.
Added( item, screen );
940 std::vector<SCH_ITEM*> blockItems =
FlattenGroups( newItems );
948 if( !keepAnnotations || placingDesignBlock )
993 commit.
Push( placingDesignBlock ?
_(
"Add Design Block" )
994 :
_(
"Import Schematic Sheet Content" ) );
1003 m_frame->UpdateHierarchyNavigator();
1010 if( sheetFileName.IsEmpty() )
1015 if (!placingDesignBlock)
1017 if( sheetFileName.IsEmpty() )
1019 path = wxPathOnly(
m_frame->Prj().GetProjectFullName() );
1020 file = wxEmptyString;
1024 path = wxPathOnly( sheetFileName );
1025 file = wxFileName( sheetFileName ).GetFullName();
1030 wxFileDialog dlg(
m_frame,
_(
"Choose Schematic" ),
path, file,
1034 dlg.SetCustomizeHook( dlgHook );
1038 if( dlg.ShowModal() == wxID_CANCEL )
1041 sheetFileName = dlg.GetPath();
1043 m_frame->GetDesignBlockPane()->UpdateCheckboxes();
1046 if( sheetFileName.IsEmpty() )
1082 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1088 bool isSyntheticClick = designBlock && evt->IsActivate() && evt->HasPosition() && evt->Matches( aEvent );
1090 if( evt->IsCancelInteractive() || ( designBlock && evt->IsAction( &
ACTIONS::undo ) ) )
1092 m_frame->GetInfoBar()->Dismiss();
1095 else if( evt->IsActivate() && !isSyntheticClick )
1097 m_frame->GetInfoBar()->Dismiss();
1104 if( placingDesignBlock )
1132 evt->SetPassEvent();
1144 bool immediateMode =
image !=
nullptr;
1145 bool ignorePrimePosition =
false;
1184 m_view->RecacheAllItems();
1209 ignorePrimePosition =
true;
1217 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1223 bool isSyntheticClick =
image && evt->IsActivate() && evt->HasPosition() && evt->Matches( aEvent );
1227 m_frame->GetInfoBar()->Dismiss();
1237 else if( evt->IsActivate() && !isSyntheticClick )
1239 if(
image && evt->IsMoveTool() )
1242 evt->SetPassEvent(
false );
1248 m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel image creation." ) );
1249 evt->SetPassEvent(
false );
1253 if( evt->IsMoveTool() )
1256 m_frame->PushTool( originalEvent );
1274 bool cancelled =
false;
1279 cancelled = dlg.ShowModal() != wxID_OK;
1288 if( evt->IsPrime() && !ignorePrimePosition )
1290 cursorPos =
grid.Align( evt->Position() );
1299 wxString fullFilename = dlg.GetPath();
1302 if( wxFileExists( fullFilename ) )
1305 if( !
image || !
image->GetReferenceImage().ReadImageFile( fullFilename ) )
1307 wxMessageBox( wxString::Format(
_(
"Could not load image from '%s'." ), fullFilename ) );
1319 m_view->RecacheAllItems();
1330 commit.
Push(
_(
"Place Image" ) );
1362 evt->SetPassEvent();
1367 image->SetPosition( cursorPos );
1370 m_view->RecacheAllItems();
1383 evt->SetPassEvent();
1406 bool loggedInfoBarError =
false;
1407 wxString description;
1409 bool allowRepeat =
false;
1435 description =
_(
"Add No Connect Flag" );
1442 description =
_(
"Add Junction" );
1448 description =
_(
"Add Wire to Bus Entry" );
1453 wxASSERT_MSG(
false,
"Unknown item type in SCH_DRAWING_TOOLS::SingleClickPlace" );
1492 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1494 cursorPos = evt->IsPrime() ? evt->Position() : controls->
GetMousePosition();
1495 cursorPos =
grid.ResolveSnap( cursorPos,
grid.GetItemGrid( previewItem ),
nullptr ).position;
1498 if( evt->IsCancelInteractive() )
1502 else if( evt->IsActivate() )
1504 if( evt->IsMoveTool() )
1507 frame()->PushTool( originalEvent );
1522 commit.
Removed( existingItem, screen );
1523 m_frame->RemoveFromScreen( existingItem, screen );
1524 commit.
Push(
_(
"Remove No Connect Flag" ) );
1533 m_frame->ShowInfoBarError(
_(
"Junction location contains no joinable wires and/or pins." ) );
1534 loggedInfoBarError =
true;
1537 else if( loggedInfoBarError )
1539 m_frame->GetInfoBar()->Dismiss();
1547 lwbTool->
AddJunction( &commit, screen, cursorPos );
1549 m_frame->Schematic().CleanUp( &commit );
1551 commit.
Push( description );
1559 m_frame->AddToScreen( newItem, screen );
1562 m_frame->SaveCopyForRepeatItem( newItem );
1565 commit.
Added( newItem, screen );
1567 m_frame->Schematic().CleanUp( &commit );
1569 commit.
Push( description );
1589 m_frame->SetMsgPanel( previewItem );
1626 std::deque<SCH_ITEM*> strokeItems;
1627 strokeItems.push_back( previewItem );
1642 std::deque<SCH_JUNCTION*> junctions;
1643 junctions.push_back(
static_cast<SCH_JUNCTION*
>( previewItem ) );
1666 evt->SetPassEvent();
1671 evt->SetPassEvent();
1704 wxASSERT( aWire->
IsWire() );
1708 const auto labelDriverName = [](
const auto& aConnection ) -> wxString
1710 SCH_ITEM* driver = aConnection.Driver();
1712 if( driver && driver->
IsType( { SCH_LABEL_T, SCH_GLOBAL_LABEL_T } ) )
1713 return aConnection.LocalName();
1715 return wxEmptyString;
1720 const auto connection =
m_frame->Schematic().Connectivity().Connection( aWire->
m_Uuid, sheetPath.
PathRef() );
1721 return connection ? labelDriverName( *connection ) : wxString();
1725 return wireConnection ? labelDriverName( *wireConnection ) : wxString();
1730 std::list<std::unique_ptr<SCH_LABEL_BASE>>& aLabelList )
1753 labelItem->
GetFields().back().SetItalic(
true );
1754 labelItem->
GetFields().back().SetVisible(
true );
1768 labelItem = globalLabel;
1776 wxFAIL_MSG(
"SCH_DRAWING_TOOLS::createNewLabel() unknown label type" );
1796 if( !netName.IsEmpty() )
1799 labelItem->
SetText( netName );
1834 if( aLabelList.empty() )
1835 aLabelList.push_back( std::unique_ptr<SCH_LABEL_BASE>( labelItem ) );
1849 textItem =
new SCH_TEXT( aPosition );
1884 pin->SetText( std::to_string( aSheet->
GetPins().size() + 1 ) );
1886 pin->SetPosition( aPosition );
1887 pin->ClearSelected();
1911 bool ignorePrimePosition =
false;
1914 wxString description;
1916 std::list<std::unique_ptr<SCH_LABEL_BASE>> itemsToPlace;
1948 else if( isGlobalLabel )
1950 else if( isNetLabel || isClassLabel )
1952 else if( isHierLabel )
1958 auto updatePreview =
1962 m_view->AddToPreview( item,
false );
1965 m_view->AddToPreview( aChild,
false );
1979 while( !itemsToPlace.empty() )
1980 itemsToPlace.erase( itemsToPlace.begin() );
1983 auto prepItemForPlacement =
2015 && ( isText || isGlobalLabel || isHierLabel || isClassLabel || isNetLabel ) )
2018 ignorePrimePosition =
true;
2028 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2031 cursorPos =
grid.ResolveSnap( cursorPos, snapGrid, item ).position;
2035 bool isSyntheticClick = item && evt->IsActivate() && evt->HasPosition() && evt->
Matches( aEvent );
2037 if( evt->IsCancelInteractive() || evt->IsAction( &
ACTIONS::undo ) )
2039 m_frame->GetInfoBar()->Dismiss();
2046 else if( evt->IsActivate() && !isSyntheticClick )
2048 if( item && evt->IsMoveTool() )
2051 evt->SetPassEvent(
false );
2057 m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel item creation." ) );
2058 evt->SetPassEvent(
false );
2062 if( evt->IsPointEditor() )
2068 if( evt->IsMoveTool() )
2071 frame()->PushTool( originalEvent );
2089 description =
_(
"Add Text" );
2091 else if( isHierLabel )
2108 itemsToPlace.push_back( std::unique_ptr<SCH_LABEL_BASE>( label ) );
2115 description =
_(
"Add Hierarchical Label" );
2117 else if( isNetLabel )
2120 description =
_(
"Add Label" );
2122 else if( isGlobalLabel )
2125 description =
_(
"Add Label" );
2127 else if( isClassLabel )
2130 description =
_(
"Add Label" );
2132 else if( isSheetPin )
2137 if( !sheet &&
m_selectionTool->SelectPoint( cursorPos, { SCH_SHEET_T }, &i ) )
2164 m_statusPopup->SetText(
_(
"No new hierarchical labels found." ) );
2175 description =
_(
"Add Sheet Pin" );
2181 if( evt->IsPrime() && !ignorePrimePosition )
2183 cursorPos =
grid.Align( evt->Position() );
2190 cursorPos =
grid.ResolveSnap( cursorPos, snapGrid, item ).position;
2193 if( !itemsToPlace.empty() )
2195 item = itemsToPlace.front().release();
2196 itemsToPlace.pop_front();
2200 prepItemForPlacement( item, cursorPos );
2202 if(
m_frame->GetMoveWarpsCursor() )
2214 if( isSheetPin && sheet )
2222 m_frame->SaveCopyForRepeatItem( item );
2229 commit.
Push( description );
2250 if( isSheetPin && sheet )
2257 m_statusPopup->SetText(
_(
"No new hierarchical labels found." ) );
2265 else if( !itemsToPlace.empty() )
2267 item = itemsToPlace.front().release();
2268 itemsToPlace.pop_front();
2269 prepItemForPlacement( item, cursorPos );
2281 else if( item && evt->IsSelectionEvent() )
2286 if( selection.
GetSize() == 1 )
2298 if( evt->HasParameter() )
2314 evt->SetPassEvent();
2349 evt->SetPassEvent();
2353 evt->SetPassEvent();
2390 bool started =
false;
2410 polyGeomMgr.
Reset();
2435 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2443 if( evt->IsCancelInteractive() )
2452 evt->SetPassEvent(
false );
2456 else if( evt->IsActivate() )
2461 if( evt->IsPointEditor() )
2467 if( evt->IsMoveTool() )
2470 frame()->PushTool( originalEvent );
2488 const bool endPolygon = evt->IsDblClick(
BUT_LEFT )
2496 polyGeomMgr.
Reset();
2503 else if( polyGeomMgr.
AddPoint( cursorPos ) )
2520 cursorPos = last.value();
2530 else if( started && ( evt->IsMotion()
2547 evt->SetPassEvent();
2552 evt->SetPassEvent();
2618 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2624 bool isSyntheticClick =
table && evt->IsActivate() && evt->HasPosition() && evt->Matches( aEvent );
2633 else if( evt->IsActivate() && !isSyntheticClick )
2635 if(
table && evt->IsMoveTool() )
2638 evt->SetPassEvent(
false );
2645 if( evt->IsPointEditor() )
2651 if( evt->IsMoveTool() )
2654 frame()->PushTool( originalEvent );
2665 table->SetColCount( 1 );
2671 table->AddCell( tableCell );
2673 table->SetParent( schematic );
2675 table->SetPosition( cursorPos );
2685 table->ClearEditFlags();
2696 commit.
Push(
_(
"Draw Table" ) );
2714 VECTOR2I requestedSize( cursorPos - origin );
2716 int colCount = std::max( 1, requestedSize.
x / ( fontSize * 15 ) );
2717 int rowCount = std::max( 1, requestedSize.
y / ( fontSize * 2 ) );
2719 VECTOR2I cellSize( std::max( gridSize.
x * 5, requestedSize.
x / colCount ),
2720 std::max( gridSize.
y * 2, requestedSize.
y / rowCount ) );
2722 cellSize.
x =
KiROUND( (
double) cellSize.
x / gridSize.
x ) * gridSize.
x;
2723 cellSize.
y =
KiROUND( (
double) cellSize.
y / gridSize.
y ) * gridSize.
y;
2725 table->ClearCells();
2726 table->SetColCount( colCount );
2728 for(
int col = 0; col < colCount; ++col )
2729 table->SetColWidth( col, cellSize.
x );
2731 for(
int row = 0; row < rowCount; ++row )
2733 table->SetRowHeight( row, cellSize.
y );
2735 for(
int col = 0; col < colCount; ++col )
2743 table->AddCell( cell );
2775 evt->SetPassEvent();
2784 evt->SetPassEvent();
2804 std::unique_ptr<DESIGN_BLOCK> designBlock;
2810 if( isDrawSheetCopy )
2812 wxString* ptr = aEvent.
Parameter<wxString*>();
2819 else if( isDrawSheetFromDesignBlock )
2822 wxCHECK( designBlock, 0 );
2823 filename = designBlock->GetSchematicFile();
2826 if( ( isDrawSheetCopy || isDrawSheetFromDesignBlock ) && !wxFileExists( filename ) )
2828 wxMessageBox( wxString::Format(
_(
"File '%s' does not exist." ), filename ) );
2842 bool startedWithDrag =
false;
2872 if( aEvent.
HasPosition() && !( isDrawSheetCopy || isDrawSheetFromDesignBlock ) )
2880 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2886 bool isSyntheticClick = sheet && evt->IsActivate() && evt->HasPosition()
2889 if( evt->IsCancelInteractive() || ( sheet && evt->IsAction( &
ACTIONS::undo ) ) )
2891 m_frame->GetInfoBar()->Dismiss();
2898 else if( evt->IsActivate() && !isSyntheticClick )
2900 if( sheet && evt->IsMoveTool() )
2903 evt->SetPassEvent(
false );
2909 m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel sheet creation." ) );
2910 evt->SetPassEvent(
false );
2914 if( evt->IsPointEditor() )
2920 if( evt->IsMoveTool() )
2923 frame()->PushTool( originalEvent );
2928 else if( !sheet && ( evt->IsClick(
BUT_LEFT ) || evt->IsDblClick(
BUT_LEFT )
2934 if( selection.
Size() == 1
2958 startedWithDrag = evt->IsDrag(
BUT_LEFT );
2965 if( isDrawSheetCopy )
2967 wxFileName fn( filename );
2972 else if( isDrawSheetFromDesignBlock )
2975 wxFileName fn( filename );
2980 std::vector<SCH_FIELD>& sheetFields = sheet->
GetFields();
2983 for(
const auto& [fieldName, fieldValue] : designBlock->GetFields() )
2985 sheetFields.emplace_back( sheet,
FIELD_T::USER, fieldName );
2986 sheetFields.back().SetText( fieldValue );
2987 sheetFields.back().SetTextPos( sheet->
GetPosition() );
2988 sheetFields.back().SetVisible(
false );
3012 else if( sheet && ( evt->IsClick(
BUT_LEFT ) || evt->IsDblClick(
BUT_LEFT )
3016 || ( startedWithDrag && evt->IsMouseUp(
BUT_LEFT ) ) ) )
3021 if(
m_frame->EditSheetProperties( sheet, &
m_frame->GetCurrentSheet(),
nullptr,
nullptr,
nullptr,
3037 m_frame->AddToScreen( sheet );
3042 m_frame->Schematic().RefreshHierarchy();
3068 c.
Add( sheetGroup, screen );
3073 c.
Push( isDrawSheetCopy ?
"Import Sheet Copy" :
"Draw Sheet" );
3080 if( ( isDrawSheetCopy || isDrawSheetFromDesignBlock )
3105 evt->SetPassEvent();
3115 m_frame->SetMsgPanel( sheet );
3131 evt->SetPassEvent();
3161 grid.x += gridSize.
x;
3164 grid.y += gridSize.
y;
3172 if( !sheetPaths.size() )
3176 m_frame, std::move( sheetPaths ),
3177 std::make_shared<SHEET_SYNCHRONIZATION_AGENT>(
3187 commit.
Push(
_(
"Modify Sheet Pin" ) );
3193 commit.
Push(
_(
"Modify Schematic Item" ) );
3205 selectionTool->AddItemToSel( aItem,
true );
3210 std::set<EDA_ITEM*> aTemplates )
3283 if( labels.empty() )
3288 m_statusPopup->SetText(
_(
"No new hierarchical labels found." ) );
3303 commit.
Push(
_(
"Auto-place Sheet Pins" ) );
3310 static const std::function<void( std::list<SCH_SHEET_PATH>&,
SCH_SCREEN*, std::set<SCH_SCREEN*>&,
3312 []( std::list<SCH_SHEET_PATH>& aPaths,
SCH_SCREEN* aScene, std::set<SCH_SCREEN*>& aVisited,
3315 if( ! aScene || aVisited.find(aScene) != aVisited.end() )
3318 std::vector<SCH_ITEM*> sheetChildren;
3319 aScene->GetSheets( &sheetChildren );
3320 aVisited.insert( aScene );
3322 for(
SCH_ITEM* child : sheetChildren )
3327 aPaths.push_back( cp );
3328 getSheetChildren( aPaths, sheet->
GetScreen(), aVisited, cp );
3332 std::list<SCH_SHEET_PATH> sheetPaths;
3333 std::set<SCH_SCREEN*> visited;
3336 std::vector<SCH_SHEET*> topLevelSheets =
m_frame->Schematic().GetTopLevelSheets();
3338 for(
SCH_SHEET* topSheet : topLevelSheets )
3340 if( topSheet && topSheet->GetScreen() )
3344 getSheetChildren( sheetPaths, topSheet->GetScreen(), visited, current );
3348 if( sheetPaths.size() == 0 )
3350 m_frame->ShowInfoBarMsg(
_(
"No sub schematic found in the current project" ) );
3365 std::vector<SCH_HIERLABEL*> labels;
3370 labels.push_back( label );
3373 std::sort( labels.begin(), labels.end(),
3376 return StrNumCmp( label1->GetText(), label2->GetText(), true ) < 0;
3381 if( !aSheet->
HasPin( label->GetText() ) )
constexpr EDA_IU_SCALE schIUScale
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
static TOOL_ACTION deleteLastPoint
static TOOL_ACTION cursorDblClick
static TOOL_ACTION duplicate
static TOOL_ACTION activatePointEditor
static TOOL_ACTION doDelete
static TOOL_ACTION cursorClick
static TOOL_ACTION increment
static TOOL_ACTION selectionClear
Clear the current selection.
static TOOL_ACTION refreshPreview
static TOOL_ACTION finishInteractive
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
PANEL_DESIGN_BLOCK_CHOOSER m_DesignBlockChooserPanel
bool IsContentModified() const
void SetContentModified(bool aModified=true)
constexpr bool Contains(const Vec &aPoint) const
COMMIT & Added(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Notify observers that aItem has been added.
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
COMMIT & Add(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Add a new item to the model.
COMMIT & Removed(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Notify observers that aItem has been removed.
LIB_ID GetSelectedLibId(int *aUnit=nullptr) const
DESIGN_BLOCK * GetDesignBlock(const LIB_ID &aLibId, bool aUseCacheLib, bool aShowErrorMsg, wxString *aErrorMsg=nullptr)
Load design block from design block library table.
void SetLabelList(std::list< std::unique_ptr< SCH_LABEL_BASE > > *aLabelList)
FIELDS_GRID_TABLE * GetFieldsGridTable()
void SetDesignBlockLibId(const LIB_ID &aLibId)
void AddItem(EDA_ITEM *aItem)
Add item to group.
void SetName(const wxString &aName)
A base class for most all the KiCad significant classes used in schematics and boards.
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.
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
virtual bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const
Compare the item against the search criteria in aSearchData.
virtual EDA_ITEM * Clone() const
Create a duplicate of this item with linked list members set to NULL.
virtual void SetParent(EDA_ITEM *aParent)
virtual void SetEnd(const VECTOR2I &aEnd)
virtual void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
virtual const wxString & GetText() const
Return the string associated with the text object.
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
GR_TEXT_H_ALIGN_T GetHorizJustify() const
virtual void SetVisible(bool aVisible)
virtual EDA_ANGLE GetTextAngle() const
void SetBold(bool aBold)
Set the text to be bold - this will also update the font if needed.
GR_TEXT_V_ALIGN_T GetVertJustify() 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 SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
PANEL_ANNOTATE m_AnnotatePanel
EE_TYPE OfType(KICAD_T aType) const
const VECTOR2D & GetGridSize() const
Return the grid size.
An interface for classes handling user events controlling the view behavior such as zooming,...
virtual void CaptureCursor(bool aEnabled)
Force the cursor to stay within the drawing panel area.
virtual void ForceCursorPosition(bool aEnabled, const VECTOR2D &aPosition=VECTOR2D(0, 0))
Place the cursor immediately at a given point.
virtual void ShowCursor(bool aEnabled)
Enable or disables display of cursor.
virtual void WarpMouseCursor(const VECTOR2D &aPosition, bool aWorldCoordinates=false, bool aWarpView=false)=0
If enabled (.
virtual void SetCrossHairCursorPosition(const VECTOR2D &aPosition, bool aWarpView=true)=0
Move the graphic crosshair cursor to the requested position expressed in world coordinates.
virtual VECTOR2D GetMousePosition(bool aWorldCoordinates=true) const =0
Return the current mouse pointer position.
virtual void SetCursorPosition(const VECTOR2D &aPosition, bool aWarpView=true, bool aTriggeredByArrows=false, long aArrowCommand=0)=0
Move cursor to the requested position expressed in world coordinates.
virtual void SetAutoPan(bool aEnabled)
Turn on/off auto panning (this feature is used when there is a tool active (eg.
virtual void PinCursorInsideNonAutoscrollArea(bool aWarpMouseCursor)=0
GAL * GetGAL() const
Return the GAL this view is using to draw graphical primitives.
LEGACY_SYMBOL_LIB * GetCacheLibrary()
Object used to load, save, search, and otherwise manipulate symbol library files.
A logical library item identifier and consists of various portions much like a URI.
bool IsValid() const
Check if this LID_ID is valid.
Define a library symbol object.
wxString GetDescription() const override
Get the Description field text value */.
const LIB_ID & GetLibId() const override
wxString GetKeyWords() const override
bool IsPower() const override
void SetDescription(const wxString &aDescription)
Set the Description field text value.
void SetKeyWords(const wxString &aKeyWords)
bool IsLocalPower() const override
bool IsGlobalPower() const override
A singleton reporter that reports to nowhere.
virtual COMMON_SETTINGS * GetCommonSettings() const
Class that handles the drawing of a polygon, including management of last corner deletion and drawing...
bool AddPoint(const VECTOR2I &aPt)
Lock in a polygon point.
void SetCursorPosition(const VECTOR2I &aPos)
Set the current cursor position.
bool NewPointClosesOutline(const VECTOR2I &aPt) const
std::optional< VECTOR2I > DeleteLastCorner()
Remove the last-added point from the polygon.
void SetFinished()
Mark the polygon finished and update the client.
void SetLeaderMode(LEADER_MODE aMode)
Set the leader mode to use when calculating the leader/returner lines.
void Reset()
Clear the manager state and start again.
static SYMBOL_LIBRARY_ADAPTER * SymbolLibAdapter(PROJECT *aProject)
Accessor for project symbol library manager adapter.
static LEGACY_SYMBOL_LIBS * LegacySchLibs(PROJECT *aProject)
Returns the list of symbol libraries from a legacy (pre-5.x) design This is only used from the remapp...
An adjunct helper to the DRAWING_TOOL interactive tool, which handles incoming geometry changes from ...
These are loaded from Eeschema settings but then overwritten by the project settings.
std::shared_ptr< REFDES_TRACKER > m_refDesTracker
A list of previously used schematic reference designators.
bool m_IntersheetRefsShow
Holds all the data relating to one schematic.
SCHEMATIC_SETTINGS & Settings() const
bool Contains(const SCH_REFERENCE &aRef) const
Check if the schematic contains the specified reference.
static TOOL_ACTION rotateCCW
static TOOL_ACTION placeClassLabel
static TOOL_ACTION placeSheetPin
static TOOL_ACTION placeNextSymbolUnit
static TOOL_ACTION editValue
static TOOL_ACTION setExcludeFromBOM
static TOOL_ACTION mirrorV
static TOOL_ACTION drawSheetFromFile
static TOOL_ACTION placeGlobalLabel
static TOOL_ACTION autoplaceFields
static TOOL_ACTION changeSymbol
static TOOL_ACTION syncAllSheetsPins
static TOOL_ACTION closeOutline
static TOOL_ACTION drawSheet
static TOOL_ACTION properties
static TOOL_ACTION editReference
static TOOL_ACTION leaveSheet
static TOOL_ACTION autoplaceAllSheetPins
static TOOL_ACTION placeHierLabel
static TOOL_ACTION placeLabel
static TOOL_ACTION toText
static TOOL_ACTION placeBusWireEntry
static TOOL_ACTION toHLabel
static TOOL_ACTION rotateCW
static TOOL_ACTION importSheet
static TOOL_ACTION setExcludeFromSim
static TOOL_ACTION toLabel
static TOOL_ACTION placeJunction
static TOOL_ACTION setDNP
static TOOL_ACTION drawRuleArea
static TOOL_ACTION placeSymbol
static TOOL_ACTION placeImage
static TOOL_ACTION editWithLibEdit
static TOOL_ACTION toDLabel
static TOOL_ACTION setExcludeFromPosFiles
static TOOL_ACTION cycleBodyStyle
static TOOL_ACTION drawSheetFromDesignBlock
static TOOL_ACTION mirrorH
static TOOL_ACTION placeDesignBlock
static TOOL_ACTION drawTable
static TOOL_ACTION placeSchematicText
static TOOL_ACTION toTextBox
static TOOL_ACTION changeSheet
static TOOL_ACTION enterSheet
static TOOL_ACTION editFootprint
static TOOL_ACTION repeatDrawItem
static TOOL_ACTION placeNoConnect
static TOOL_ACTION toGLabel
static TOOL_ACTION setExcludeFromBoard
static TOOL_ACTION syncSheetPins
static TOOL_ACTION placePower
Object to handle a bitmap image that can be inserted in a schematic.
Base class for a bus or wire entry.
VECTOR2I GetPosition() const override
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
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.
Class for a wire to bus entry.
Commit for the schematic and symbol editors.
void Revert() override
Revert the commit by restoring the modified items state.
void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Execute the changes.
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
Schematic editor (Eeschema) main window.
void SetText(const wxString &aText) override
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this label.
A set of SCH_ITEMs (i.e., without duplicates).
void SetSpinStyle(SPIN_STYLE aSpinStyle) override
Base class for any item which can be embedded within the SCHEMATIC container class,...
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)
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
virtual void CalcEdit(const VECTOR2I &aPosition)
Calculate the attributes of an item at aPosition when it is being edited.
virtual void SetUnit(int aUnit)
SCH_CONNECTION * Connection(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve the connection associated with this object in the given sheet.
bool IsType(const std::vector< KICAD_T > &aScanTypes) const override
Check whether the item is one of the listed types.
bool AutoRotateOnPlacement() const
autoRotateOnPlacement
SPIN_STYLE GetSpinStyle() const
void SetShape(LABEL_FLAG_SHAPE aShape)
LABEL_FLAG_SHAPE GetShape() const
void SetAutoRotateOnPlacement(bool autoRotate=true)
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,...
bool IsWire() const
Return true if the line is a wire.
VECTOR2I GetEndPoint() const
VECTOR2I GetStartPoint() const
Container to create a flattened list of symbols because in a complex hierarchy, a symbol can be used ...
void SortByReferenceOnly()
Sort the list of references by reference.
void ReannotateByOptions(ANNOTATE_ORDER_T aSortOption, ANNOTATE_ALGO_T aAlgoOption, int aStartNumber, const SCH_REFERENCE_LIST &aAdditionalRefs, bool aStartAtCurrent, SCH_SHEET_LIST *aHierarchy)
Forces reannotation of the provided references.
void SetRefDesTracker(std::shared_ptr< REFDES_TRACKER > aTracker)
void AddItem(const SCH_REFERENCE &aItem)
void UpdateAnnotation()
Update the symbol references for the schematic project (or the current sheet).
A helper to define a symbol's reference designator in a schematic.
bool AlwaysAnnotate() const
Verify the reference should always be automatically annotated.
EE_RTREE & Items()
Get the full RTree, usually for iterating.
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.
bool IsExplicitJunctionAllowed(const VECTOR2I &aPosition) const
Indicate that a junction dot may be placed at the given location.
void SetPosition(const VECTOR2I &aPos) override
VECTOR2I GetPosition() const override
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
void SortByPageNumbers(bool aUpdateVirtualPageNums=true)
Sort the list of sheets by page number.
SCH_SHEET_LIST FindAllSheetsForScreen(const SCH_SCREEN *aScreen) const
Return a SCH_SHEET_LIST with a copy of all the SCH_SHEET_PATH using a particular screen.
wxString GetNextPageNumber() const
void GetSymbols(SCH_REFERENCE_LIST &aReferences, SYMBOL_FILTER aSymbolFilter, bool aForceIncludeOrphanSymbols=false) const
Add a SCH_REFERENCE object to aReferences for each symbol in the list of sheets.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
SCH_SCREEN * LastScreen()
void SetPageNumber(const wxString &aPageNumber)
Set the sheet instance user definable page number.
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
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.
Define a sheet pin (label) used in sheets to create hierarchical schematics.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
void SetBorderColor(KIGFX::COLOR4D aColor)
void AddPin(SCH_SHEET_PIN *aSheetPin)
Add aSheetPin to the sheet.
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const override
Compare the item against the search criteria in aSearchData.
std::vector< SCH_FIELD > & GetFields()
Return a reference to the vector holding the sheet's fields.
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this sheet.
void SetBackgroundColor(KIGFX::COLOR4D aColor)
SCH_SCREEN * GetScreen() const
VECTOR2I GetPosition() const override
bool HasPin(const wxString &aName) const
Check if the sheet already has a sheet pin named aName.
void SetScreen(SCH_SCREEN *aScreen)
Set the SCH_SCREEN associated with this sheet to aScreen.
void SetBorderWidth(int aWidth)
void AutoplaceFields(SCH_SCREEN *aScreen, AUTOPLACE_ALGO aAlgo) override
void Resize(const VECTOR2I &aSize)
Resize this sheet to aSize and adjust all of the labels accordingly.
std::vector< SCH_SHEET_PIN * > & GetPins()
const LIB_ID & GetLibId() const override
void SetUnitSelection(const SCH_SHEET_PATH *aSheet, int aUnitSelection)
Set the selected unit of this symbol on one sheet.
RAII class that sets an value at construction and resets it to the original value at destruction.
const VECTOR2I NearestPoint(const VECTOR2I &aP) const
Compute a point on the segment (this) that is closest to point aP.
virtual unsigned int GetSize() const override
Return the number of stored items.
int Size() const
Returns the number of selected parts.
void SetReferencePoint(const VECTOR2I &aP)
SHEET_SYNCHRONIZATION_PLACEMENT
std::function< void()> MODIFICATION
Spin style for labels of all kinds on schematics.
An interface to the global shared library manager that is schematic-specific and linked to one projec...
Helper object to filter a list of libraries.
This file is part of the common library.
const int minSize
Push and Shove router track width and via size dialog.
static constexpr EDA_ANGLE ANGLE_0
#define IGNORE_PARENT_GROUP
#define IS_NEW
New item, just created.
#define STRUCT_DELETED
flag indication structures to be erased
#define ENDPOINT
ends. (Used to support dragging.)
#define IS_MOVING
Item being moved.
#define STARTPOINT
When a line is selected, these flags indicate which.
@ ID_POPUP_SCH_SELECT_UNIT
@ ID_POPUP_SCH_SELECT_BODY_STYLE
@ ID_POPUP_SCH_SELECT_BODY_STYLE_END
@ ID_POPUP_SCH_SELECT_UNIT_END
@ DIRECT
Unconstrained point-to-point.
static const std::string KiCadSchematicFileExtension
static wxString ImageFileWildcard()
static wxString KiCadSchematicFileWildcard()
Definition for symbol library class.
PGM_BASE & Pgm()
The global program "get" accessor.
LIB_SYMBOL * SchGetLibSymbol(const LIB_ID &aLibId, SYMBOL_LIBRARY_ADAPTER *aLibMgr, LEGACY_SYMBOL_LIB *aCacheLib, wxWindow *aParent, bool aShowErrorMsg)
Load symbol from symbol library table.
Class to handle a set of SCH_ITEMs.
std::vector< EDA_ITEM * > EDA_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.
Increment event parameters.
COLOR4D default_sheet_border_color
bool auto_place_sheet_pins
COLOR4D default_sheet_background_color
int default_line_thickness
POWER_SYMBOLS new_power_symbols
bool m_Reannotate
If a symbol is provide, reannotate it?
bool m_PlaceAllUnits
For a preselected multi-unit symbol, keep placing remaining units instead of exiting.
SCH_SYMBOL * m_Symbol
Provide a symbol to place.
int m_Unit
Unit number to place; 0 means next available unit.
SCH_SYMBOL * m_Symbol
Symbol used as reference for unit placement.
@ USER
The field ID hasn't been set yet; field is invalid.
@ INTERSHEET_REFS
Global label cross-reference page numbers.
IbisParser parser & reporter
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
VECTOR2< int32_t > VECTOR2I
Definition of file extensions used in Kicad.