25#include <unordered_set>
74#include <wx/filedlg.h>
104 auto belowRootSheetCondition =
107 return m_frame->GetCurrentSheet().Last() != &
m_frame->Schematic().Root();
117 auto inDrawingRuleArea =
144 bool placeOneOnly = symbol !=
nullptr;
147 std::vector<PICKED_SYMBOL>* historyList =
nullptr;
148 bool ignorePrimePosition =
false;
152 bool keepSymbol =
false;
181 filter.FilterPowerSymbols(
true );
185 wxFAIL_MSG(
"PlaceSymbol(): unexpected request" );
199 m_view->AddToPreview( aSymbol,
false );
220 existingRefs.
Clear();
248 for(
size_t i = 0; i < refs.
GetCount(); i++ )
249 existingRefs.
AddItem( refs[i] );
253 m_frame->GetCurrentSheet().UpdateAllScreenReferences();
276 existingRefs.
AddItem( placedSymbolReference );
288 ignorePrimePosition =
true;
296 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
302 bool isSyntheticClick = symbol && evt->IsActivate() && evt->HasPosition() && evt->Matches( aEvent );
304 if( evt->IsCancelInteractive() || ( symbol && evt->IsAction( &
ACTIONS::undo ) ) )
306 m_frame->GetInfoBar()->Dismiss();
324 else if( evt->IsActivate() && !isSyntheticClick )
326 if( symbol && evt->IsMoveTool() )
329 evt->SetPassEvent(
false );
335 m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel symbol creation." ) );
336 evt->SetPassEvent(
false );
340 if( evt->IsMoveTool() )
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 )
503 if( keepSymbol || placeAllUnits )
515 const wxString currentRefStr = currentReference.
GetRef();
516 const bool isUnannotated = !currentRefStr.IsEmpty()
517 && currentRefStr.Last() ==
'?';
518 const LIB_ID symLibId = symbol->GetLibId();
521 [&](
int aUnit ) ->
bool
527 return schematic.Contains( candidate );
534 while( currentReference.
GetUnit() <= symbol->GetUnitCount()
535 && unitOccupied( currentReference.
GetUnit() ) )
540 if( currentReference.
GetUnit() > symbol->GetUnitCount() )
547 if( keepSymbol || currentReference.
GetUnit() > 1 )
553 addSymbol( nextSymbol );
556 if( currentReference.
GetUnit() == 1 )
561 existingRefs.
AddItem( placedSymbolReference );
569 if( placeOneOnly && !symbol )
593 m_frame->SelectUnit( symbol, unit );
602 if( symbol && symbol->GetBodyStyle() != bodyStyle )
604 m_frame->SelectBodyStyle( symbol, bodyStyle );
626 symbol->SetPosition( cursorPos );
628 m_view->AddToPreview( symbol,
false );
629 m_frame->SetMsgPanel( symbol );
678 int requestedUnit = params.
m_Unit;
683 static const std::vector<KICAD_T> symbolTypes = {
SCH_SYMBOL_T };
686 if( selection.
Size() != 1 )
688 m_frame->ShowInfoBarMsg(
_(
"Select a single symbol to place the next unit." ) );
699 if( !symbol->IsMultiUnit() )
701 m_frame->ShowInfoBarMsg(
_(
"This symbol has only one unit." ) );
707 if( missingUnits.empty() )
709 m_frame->ShowInfoBarMsg(
_(
"All units of this symbol are already placed." ) );
715 if( requestedUnit > 0 )
717 if( missingUnits.count( requestedUnit ) == 0 )
719 m_frame->ShowInfoBarMsg(
_(
"Requested unit already placed." ) );
723 nextMissing = requestedUnit;
728 nextMissing = *std::min_element( missingUnits.begin(), missingUnits.end() );
731 std::unique_ptr<SCH_SYMBOL> newSymbol = std::make_unique<SCH_SYMBOL>( *symbol );
737 newSymbol->SetUnitSelection( nextMissing );
738 newSymbol->SetUnit( nextMissing );
739 newSymbol->SetRefProp( symbol->GetRef( &sheetPath,
false ) );
761 struct RESET_FORCED_CURSOR_GUARD
768 RESET_FORCED_CURSOR_GUARD forcedCursorGuard{ controls };
770 if( !cfg || !common_settings )
778 std::unique_ptr<DESIGN_BLOCK> designBlock;
779 wxString sheetFileName = wxEmptyString;
781 if( placingDesignBlock )
793 msg.Printf(
_(
"Could not find design block %s." ),
795 m_frame->ShowInfoBarError( msg,
true );
799 sheetFileName = designBlock->GetSchematicFile();
801 if( sheetFileName.IsEmpty() || !wxFileExists( sheetFileName ) )
803 m_frame->ShowInfoBarError(
_(
"Design block has no schematic to place." ),
true );
810 wxString* importSourceFile = aEvent.
Parameter<wxString*>();
812 if( importSourceFile !=
nullptr )
813 sheetFileName = *importSourceFile;
823 auto placeSheetContents =
839 if( !
m_frame->LoadSheetFromFile( sheetPath.
Last(), &sheetPath, sheetFileName,
true,
840 placingDesignBlock ) )
845 m_frame->SetSheetNumberAndCount();
861 baseName = designBlock->GetLibId().GetLibItemName().wx_str();
862 group->SetDesignBlockLibId( designBlock->GetLibId() );
866 baseName = wxFileName( sheetFileName ).GetName();
884 if( item->Type() ==
SCH_SYMBOL_T && !keepAnnotations && !autoAnnotate )
885 static_cast<SCH_SYMBOL*
>( item )->ClearAnnotation( &sheetPath,
false );
890 if( !item->GetParentGroup() )
893 group->AddItem( item );
895 newItems.emplace_back( item );
898 commit.
Added( item, screen );
929 if( !keepAnnotations || placingDesignBlock )
943 if( placingDesignBlock )
980 commit.
Push( placingDesignBlock ?
_(
"Add Design Block" )
981 :
_(
"Import Schematic Sheet Content" ) );
989 m_frame->UpdateHierarchyNavigator();
996 if( sheetFileName.IsEmpty() )
1001 if (!placingDesignBlock)
1003 if( sheetFileName.IsEmpty() )
1005 path = wxPathOnly(
m_frame->Prj().GetProjectFullName() );
1006 file = wxEmptyString;
1010 path = wxPathOnly( sheetFileName );
1011 file = wxFileName( sheetFileName ).GetFullName();
1016 wxFileDialog dlg(
m_frame,
_(
"Choose Schematic" ),
path, file,
1020 dlg.SetCustomizeHook( dlgHook );
1024 if( dlg.ShowModal() == wxID_CANCEL )
1027 sheetFileName = dlg.GetPath();
1029 m_frame->GetDesignBlockPane()->UpdateCheckboxes();
1032 if( sheetFileName.IsEmpty() )
1068 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1074 bool isSyntheticClick = designBlock && evt->IsActivate() && evt->HasPosition() && evt->Matches( aEvent );
1076 if( evt->IsCancelInteractive() || ( designBlock && evt->IsAction( &
ACTIONS::undo ) ) )
1078 m_frame->GetInfoBar()->Dismiss();
1081 else if( evt->IsActivate() && !isSyntheticClick )
1083 m_frame->GetInfoBar()->Dismiss();
1090 if( placingDesignBlock )
1118 evt->SetPassEvent();
1132 bool immediateMode =
image !=
nullptr;
1133 bool ignorePrimePosition =
false;
1171 m_view->RecacheAllItems();
1196 ignorePrimePosition =
true;
1204 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1210 bool isSyntheticClick =
image && evt->IsActivate() && evt->HasPosition() && evt->Matches( aEvent );
1214 m_frame->GetInfoBar()->Dismiss();
1232 else if( evt->IsActivate() && !isSyntheticClick )
1234 if(
image && evt->IsMoveTool() )
1237 evt->SetPassEvent(
false );
1243 m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel image creation." ) );
1244 evt->SetPassEvent(
false );
1248 if( evt->IsMoveTool() )
1272 bool cancelled =
false;
1277 cancelled = dlg.ShowModal() != wxID_OK;
1286 if( evt->IsPrime() && !ignorePrimePosition )
1288 cursorPos =
grid.Align( evt->Position() );
1297 wxString fullFilename = dlg.GetPath();
1300 if( wxFileExists( fullFilename ) )
1303 if( !
image || !
image->GetReferenceImage().ReadImageFile( fullFilename ) )
1305 wxMessageBox( wxString::Format(
_(
"Could not load image from '%s'." ), fullFilename ) );
1317 m_view->RecacheAllItems();
1328 commit.
Push(
_(
"Place Image" ) );
1364 evt->SetPassEvent();
1369 image->SetPosition( cursorPos );
1372 m_view->RecacheAllItems();
1385 evt->SetPassEvent();
1408 bool loggedInfoBarError =
false;
1409 wxString description;
1411 bool allowRepeat =
false;
1437 description =
_(
"Add No Connect Flag" );
1444 description =
_(
"Add Junction" );
1450 description =
_(
"Add Wire to Bus Entry" );
1455 wxASSERT_MSG(
false,
"Unknown item type in SCH_DRAWING_TOOLS::SingleClickPlace" );
1493 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1495 cursorPos = evt->IsPrime() ? evt->Position() : controls->
GetMousePosition();
1497 grid.ResolveSnap( cursorPos,
grid.GetItemGrid( previewItem ),
nullptr ).position;
1500 if( evt->IsCancelInteractive() )
1505 else if( evt->IsActivate() )
1507 if( evt->IsMoveTool() )
1528 commit.
Removed( existingItem, screen );
1529 m_frame->RemoveFromScreen( existingItem, screen );
1530 commit.
Push(
_(
"Remove No Connect Flag" ) );
1539 m_frame->ShowInfoBarError(
_(
"Junction location contains no joinable wires and/or pins." ) );
1540 loggedInfoBarError =
true;
1543 else if( loggedInfoBarError )
1545 m_frame->GetInfoBar()->Dismiss();
1554 lwbTool->
AddJunction( &commit, screen, cursorPos );
1556 m_frame->Schematic().CleanUp( &commit );
1558 commit.
Push( description );
1566 m_frame->AddToScreen( newItem, screen );
1569 m_frame->SaveCopyForRepeatItem( newItem );
1572 commit.
Added( newItem, screen );
1574 m_frame->Schematic().CleanUp( &commit );
1576 commit.
Push( description );
1595 m_frame->SetMsgPanel( previewItem );
1632 std::deque<SCH_ITEM*> strokeItems;
1633 strokeItems.push_back( previewItem );
1648 std::deque<SCH_JUNCTION*> junctions;
1649 junctions.push_back(
static_cast<SCH_JUNCTION*
>( previewItem ) );
1672 evt->SetPassEvent();
1677 evt->SetPassEvent();
1710 wxASSERT( aWire->
IsWire() );
1716 SCH_ITEM* wireDriver = wireConnection->Driver();
1718 if( wireDriver && wireDriver->
IsType( { SCH_LABEL_T, SCH_GLOBAL_LABEL_T } ) )
1719 return wireConnection->LocalName();
1722 return wxEmptyString;
1727 std::list<std::unique_ptr<SCH_LABEL_BASE>>& aLabelList )
1750 labelItem->
GetFields().back().SetItalic(
true );
1751 labelItem->
GetFields().back().SetVisible(
true );
1765 labelItem = globalLabel;
1773 wxFAIL_MSG(
"SCH_DRAWING_TOOLS::createNewLabel() unknown label type" );
1793 if( !netName.IsEmpty() )
1796 labelItem->
SetText( netName );
1831 if( aLabelList.empty() )
1832 aLabelList.push_back( std::unique_ptr<SCH_LABEL_BASE>( labelItem ) );
1846 textItem =
new SCH_TEXT( aPosition );
1881 pin->SetText( std::to_string( aSheet->
GetPins().size() + 1 ) );
1883 pin->SetPosition( aPosition );
1884 pin->ClearSelected();
1908 bool ignorePrimePosition =
false;
1911 wxString description;
1913 std::list<std::unique_ptr<SCH_LABEL_BASE>> itemsToPlace;
1944 else if( isGlobalLabel )
1946 else if( isNetLabel || isClassLabel )
1948 else if( isHierLabel )
1954 auto updatePreview =
1958 m_view->AddToPreview( item,
false );
1961 m_view->AddToPreview( aChild,
false );
1975 while( !itemsToPlace.empty() )
1976 itemsToPlace.erase( itemsToPlace.begin() );
1979 auto prepItemForPlacement =
2011 && ( isText || isGlobalLabel || isHierLabel || isClassLabel || isNetLabel ) )
2014 ignorePrimePosition =
true;
2024 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2027 cursorPos =
grid.ResolveSnap( cursorPos, snapGrid, item ).position;
2031 bool isSyntheticClick = item && evt->IsActivate() && evt->HasPosition() && evt->
Matches( aEvent );
2033 if( evt->IsCancelInteractive() || evt->IsAction( &
ACTIONS::undo ) )
2035 m_frame->GetInfoBar()->Dismiss();
2047 else if( evt->IsActivate() && !isSyntheticClick )
2049 if( item && evt->IsMoveTool() )
2052 evt->SetPassEvent(
false );
2058 m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel item creation." ) );
2059 evt->SetPassEvent(
false );
2063 if( evt->IsPointEditor() )
2067 else if( evt->IsMoveTool() )
2091 description =
_(
"Add Text" );
2093 else if( isHierLabel )
2108 schematic->Settings().m_DefaultTextSize ) );
2110 itemsToPlace.push_back( std::unique_ptr<SCH_LABEL_BASE>( label ) );
2117 description =
_(
"Add Hierarchical Label" );
2119 else if( isNetLabel )
2122 description =
_(
"Add Label" );
2124 else if( isGlobalLabel )
2127 description =
_(
"Add Label" );
2129 else if( isClassLabel )
2132 description =
_(
"Add Label" );
2134 else if( isSheetPin )
2139 if( !sheet &&
m_selectionTool->SelectPoint( cursorPos, { SCH_SHEET_T }, &i ) )
2147 + wxPoint( 20, 20 ) );
2168 m_statusPopup->SetText(
_(
"No new hierarchical labels found." ) );
2181 description =
_(
"Add Sheet Pin" );
2187 if( evt->IsPrime() && !ignorePrimePosition )
2189 cursorPos =
grid.Align( evt->Position() );
2196 cursorPos =
grid.ResolveSnap( cursorPos, snapGrid, item ).position;
2199 if( !itemsToPlace.empty() )
2201 item = itemsToPlace.front().release();
2202 itemsToPlace.pop_front();
2206 prepItemForPlacement( item, cursorPos );
2208 if(
m_frame->GetMoveWarpsCursor() )
2220 if( isSheetPin && sheet )
2228 m_frame->SaveCopyForRepeatItem( item );
2235 commit.
Push( description );
2257 if( isSheetPin && sheet )
2264 m_statusPopup->SetText(
_(
"No new hierarchical labels found." ) );
2274 else if( !itemsToPlace.empty() )
2276 item = itemsToPlace.front().release();
2277 itemsToPlace.pop_front();
2278 prepItemForPlacement( item, cursorPos );
2290 else if( item && evt->IsSelectionEvent() )
2295 if( selection.
GetSize() == 1 )
2307 if( evt->HasParameter() )
2324 evt->SetPassEvent();
2359 evt->SetPassEvent();
2363 evt->SetPassEvent();
2400 bool started =
false;
2419 polyGeomMgr.
Reset();
2444 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2452 if( evt->IsCancelInteractive() )
2463 evt->SetPassEvent(
false );
2467 else if( evt->IsActivate() )
2472 if( evt->IsPointEditor() )
2476 else if( evt->IsMoveTool() )
2500 const bool endPolygon = evt->IsDblClick(
BUT_LEFT )
2508 polyGeomMgr.
Reset();
2515 else if( polyGeomMgr.
AddPoint( cursorPos ) )
2532 cursorPos = last.value();
2542 else if( started && ( evt->IsMotion() || evt->IsDrag(
BUT_LEFT ) ) )
2558 evt->SetPassEvent();
2563 evt->SetPassEvent();
2628 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2634 bool isSyntheticClick =
table && evt->IsActivate() && evt->HasPosition() && evt->Matches( aEvent );
2648 else if( evt->IsActivate() && !isSyntheticClick )
2650 if(
table && evt->IsMoveTool() )
2653 evt->SetPassEvent(
false );
2660 if( evt->IsPointEditor() )
2664 else if( evt->IsMoveTool() )
2681 table->SetColCount( 1 );
2684 int defaultTextSize = schematic->Settings().m_DefaultTextSize;
2687 table->AddCell( tableCell );
2689 table->SetParent( schematic );
2691 table->SetPosition( cursorPos );
2701 table->ClearEditFlags();
2712 commit.
Push(
_(
"Draw Table" ) );
2728 int fontSize = schematic->Settings().m_DefaultTextSize;
2730 VECTOR2I requestedSize( cursorPos - origin );
2732 int colCount = std::max( 1, requestedSize.
x / ( fontSize * 15 ) );
2733 int rowCount = std::max( 1, requestedSize.
y / ( fontSize * 2 ) );
2735 VECTOR2I cellSize( std::max( gridSize.
x * 5, requestedSize.
x / colCount ),
2736 std::max( gridSize.
y * 2, requestedSize.
y / rowCount ) );
2738 cellSize.
x =
KiROUND( (
double) cellSize.
x / gridSize.
x ) * gridSize.
x;
2739 cellSize.
y =
KiROUND( (
double) cellSize.
y / gridSize.
y ) * gridSize.
y;
2741 table->ClearCells();
2742 table->SetColCount( colCount );
2744 for(
int col = 0; col < colCount; ++col )
2745 table->SetColWidth( col, cellSize.
x );
2747 for(
int row = 0; row < rowCount; ++row )
2749 table->SetRowHeight( row, cellSize.
y );
2751 for(
int col = 0; col < colCount; ++col )
2754 int defaultTextSize = schematic->Settings().m_DefaultTextSize;
2759 table->AddCell( cell );
2791 evt->SetPassEvent();
2800 evt->SetPassEvent();
2820 std::unique_ptr<DESIGN_BLOCK> designBlock;
2826 if( isDrawSheetCopy )
2828 wxString* ptr = aEvent.
Parameter<wxString*>();
2835 else if( isDrawSheetFromDesignBlock )
2838 wxCHECK( designBlock, 0 );
2839 filename = designBlock->GetSchematicFile();
2842 if( ( isDrawSheetCopy || isDrawSheetFromDesignBlock ) && !wxFileExists( filename ) )
2844 wxMessageBox( wxString::Format(
_(
"File '%s' does not exist." ), filename ) );
2858 bool startedWithDrag =
false;
2887 if( aEvent.
HasPosition() && !( isDrawSheetCopy || isDrawSheetFromDesignBlock ) )
2895 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2901 bool isSyntheticClick = sheet && evt->IsActivate() && evt->HasPosition()
2904 if( evt->IsCancelInteractive() || ( sheet && evt->IsAction( &
ACTIONS::undo ) ) )
2906 m_frame->GetInfoBar()->Dismiss();
2918 else if( evt->IsActivate() && !isSyntheticClick )
2920 if( sheet && evt->IsMoveTool() )
2923 evt->SetPassEvent(
false );
2929 m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel sheet creation." ) );
2930 evt->SetPassEvent(
false );
2934 if( evt->IsPointEditor() )
2938 else if( evt->IsMoveTool() )
2949 else if( !sheet && ( evt->IsClick(
BUT_LEFT ) || evt->IsDblClick(
BUT_LEFT )
2955 if( selection.
Size() == 1
2980 startedWithDrag = evt->IsDrag(
BUT_LEFT );
2987 if( isDrawSheetCopy )
2989 wxFileName fn( filename );
2994 else if( isDrawSheetFromDesignBlock )
2996 wxFileName fn( filename );
3002 std::vector<SCH_FIELD>& sheetFields = sheet->
GetFields();
3005 for(
const auto& [fieldName, fieldValue] : designBlock->GetFields() )
3007 sheetFields.emplace_back( sheet,
FIELD_T::USER, fieldName );
3008 sheetFields.back().SetText( fieldValue );
3009 sheetFields.back().SetVisible(
false );
3033 else if( sheet && ( evt->IsClick(
BUT_LEFT ) || evt->IsDblClick(
BUT_LEFT )
3037 || ( startedWithDrag && evt->IsMouseUp(
BUT_LEFT ) ) ) )
3043 nullptr,
nullptr,
nullptr, &filename ) )
3055 m_frame->AddToScreen( sheet );
3060 m_frame->Schematic().RefreshHierarchy();
3063 && !( ( isDrawSheetCopy || isDrawSheetFromDesignBlock )
3065 bool annotatePowerSymbols = isDrawSheetFromDesignBlock;
3067 if( annotateNonPowerSymbols || annotatePowerSymbols )
3074 if( annotateNonPowerSymbols )
3085 if( annotatePowerSymbols )
3106 c.
Add( sheetGroup, screen );
3111 c.
Push( isDrawSheetCopy ?
"Import Sheet Copy" :
"Draw Sheet" );
3118 if( ( isDrawSheetCopy || isDrawSheetFromDesignBlock )
3145 evt->SetPassEvent();
3154 m_frame->SetMsgPanel( sheet );
3170 evt->SetPassEvent();
3202 if( !sheetPaths.size() )
3206 m_frame, std::move( sheetPaths ),
3207 std::make_shared<SHEET_SYNCHRONIZATION_AGENT>(
3217 commit.
Push(
_(
"Modify sheet pin" ) );
3223 commit.
Push(
_(
"Modify schematic item" ) );
3234 selectionTool->AddItemToSel( aItem,
true );
3239 std::set<EDA_ITEM*> aTemplates )
3312 if( labels.empty() )
3316 m_statusPopup->SetText(
_(
"No new hierarchical labels found." ) );
3336 const int margin = pitch;
3342 int leftY = topY + margin - pitch;
3343 int rightY = topY + margin - pitch;
3348 rightY = std::max( rightY,
pin->GetPosition().y );
3350 leftY = std::max( leftY,
pin->GetPosition().y );
3354 std::vector<SCH_HIERLABEL*> leftLabels;
3355 std::vector<SCH_HIERLABEL*> rightLabels;
3360 rightLabels.push_back( label );
3362 leftLabels.push_back( label );
3367 return a->
GetText() < b->GetText();
3370 std::sort( leftLabels.begin(), leftLabels.end(), byText );
3371 std::sort( rightLabels.begin(), rightLabels.end(), byText );
3374 int botLeft = leftY + (int) leftLabels.size() * pitch;
3375 int botRight = rightY + (int) rightLabels.size() * pitch;
3376 int needBot = std::max( botLeft, botRight ) + margin;
3378 if( needBot > topY + sheet->
GetSize().
y )
3381 auto placeColumn = [&]( std::vector<SCH_HIERLABEL*>& aLabels,
int aX,
int aStartY )
3396 placeColumn( leftLabels, leftX, leftY );
3397 placeColumn( rightLabels, rightX, rightY );
3399 commit.
Push(
_(
"Auto-place Sheet Pins" ) );
3406 static const std::function<void( std::list<SCH_SHEET_PATH>&,
SCH_SCREEN*, std::set<SCH_SCREEN*>&,
3408 []( std::list<SCH_SHEET_PATH>& aPaths,
SCH_SCREEN* aScene, std::set<SCH_SCREEN*>& aVisited,
3411 if( ! aScene || aVisited.find(aScene) != aVisited.end() )
3414 std::vector<SCH_ITEM*> sheetChildren;
3415 aScene->GetSheets( &sheetChildren );
3416 aVisited.insert( aScene );
3418 for(
SCH_ITEM* child : sheetChildren )
3423 aPaths.push_back( cp );
3424 getSheetChildren( aPaths, sheet->
GetScreen(), aVisited, cp );
3428 std::list<SCH_SHEET_PATH> sheetPaths;
3429 std::set<SCH_SCREEN*> visited;
3432 std::vector<SCH_SHEET*> topLevelSheets =
m_frame->Schematic().GetTopLevelSheets();
3434 for(
SCH_SHEET* topSheet : topLevelSheets )
3436 if( topSheet && topSheet->GetScreen() )
3440 getSheetChildren( sheetPaths, topSheet->GetScreen(), visited, current );
3444 if( sheetPaths.size() == 0 )
3446 m_frame->ShowInfoBarMsg(
_(
"No sub schematic found in the current project" ) );
3461 std::vector<SCH_HIERLABEL*> labels;
3466 labels.push_back( label );
3469 std::sort( labels.begin(), labels.end(),
3472 return StrNumCmp( label1->GetText(), label2->GetText(), true ) < 0;
3477 if( !aSheet->
HasPin( label->GetText() ) )
3490 std::vector<SCH_HIERLABEL*> labels;
3497 labels.push_back( label );
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
PANEL_DESIGN_BLOCK_CHOOSER m_DesignBlockChooserPanel
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)
LIB_ID GetSelectedLibId(int *aUnit=nullptr) const
DESIGN_BLOCK * GetDesignBlock(const LIB_ID &aLibId, bool aUseCacheLib, bool aShowErrorMsg)
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
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
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.
wxString GetUniStringLibId() const
Define a library symbol object.
wxString GetDescription() const override
const LIB_ID & GetLibId() const override
wxString GetKeyWords() const override
bool IsPower() const override
void SetDescription(const wxString &aDescription)
Gets 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
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.
virtual void Push(const wxString &aMessage=wxT("A commit"), int aCommitFlags=0) override
Execute the changes.
virtual void Revert() override
Revert the commit by restoring the modified items state.
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.
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 SetSize(const VECTOR2I &aSize)
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.
VECTOR2I GetReferencePoint() const
virtual unsigned int GetSize() const override
Return the number of stored items.
int Size() const
Returns the number of selected parts.
SHEET_SYNCHRONIZATION_PLACEMENT
std::function< void()> MODIFICATION
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.
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 SKIP_STRUCT
flag indicating that the structure should be ignored
#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()
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
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.
@ SYMBOL_FILTER_NON_POWER
COLOR4D default_sheet_border_color
COLOR4D default_sheet_background_color
int default_line_thickness
POWER_SYMBOLS new_power_symbols
bool m_Reannotate
For a preselected multi-unit symbol, keep placing remaining units instead of exiting.
SCH_SYMBOL * m_Symbol
< Provide a symbol to place
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.