66#include <dialogs/dialog_text_properties.h>
69#include <dialogs/dialog_table_properties.h>
74#include <wx/filedlg.h>
109 auto belowRootSheetCondition =
112 return m_frame->GetCurrentSheet().Last() != &
m_frame->Schematic().Root();
115 auto inDrawingRuleArea =
138 bool placeOneOnly = symbol !=
nullptr;
141 std::vector<PICKED_SYMBOL>* historyList =
nullptr;
142 bool ignorePrimePosition =
false;
146 bool keepSymbol =
false;
147 bool placeAllUnits =
false;
175 filter.FilterPowerSymbols(
true );
179 wxFAIL_MSG(
"PlaceSymbol(): unexpected request" );
193 m_view->AddToPreview( aSymbol,
false );
214 existingRefs.
Clear();
242 for(
size_t i = 0; i < refs.
GetCount(); i++ )
243 existingRefs.
AddItem( refs[i] );
247 m_frame->GetCurrentSheet().UpdateAllScreenReferences();
275 ignorePrimePosition =
true;
283 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
289 bool isSyntheticClick = symbol && evt->IsActivate() && evt->HasPosition() && evt->Matches( aEvent );
291 if( evt->IsCancelInteractive() || ( symbol && evt->IsAction( &
ACTIONS::undo ) ) )
293 m_frame->GetInfoBar()->Dismiss();
311 else if( evt->IsActivate() && !isSyntheticClick )
313 if( symbol && evt->IsMoveTool() )
316 evt->SetPassEvent(
false );
322 m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel symbol creation." ) );
323 evt->SetPassEvent(
false );
327 if( evt->IsMoveTool() )
349 std::set<UTF8> unique_libid;
350 std::vector<PICKED_SYMBOL> alreadyPlaced;
367 alreadyPlaced.push_back( pickedSymbol );
373 bool footprintPreviews =
m_frame->eeconfig()->m_Appearance.footprint_preview;
388 if( evt->IsPrime() && !ignorePrimePosition )
408 if( keywords.Contains( wxT(
"global power" ) ) )
410 keywords.Replace( wxT(
"global power" ), wxT(
"local power" ) );
416 if( desc.Contains( wxT(
"global label" ) ) )
418 desc.Replace( wxT(
"global label" ), wxT(
"local label" ) );
430 symbol =
new SCH_SYMBOL( *libSymbol, &
m_frame->GetCurrentSheet(), sel, cursorPos,
437 existingRefs.
AddItem( placedSymbolReference );
440 if(
m_frame->eeconfig()->m_AutoplaceFields.enable )
452 m_frame->AddToScreen( symbol, screen );
454 if(
m_frame->eeconfig()->m_AutoplaceFields.enable )
457 m_frame->SaveCopyForRepeatItem( symbol );
460 commit.
Added( symbol, screen );
466 commit.
Push(
_(
"Place Symbol" ) );
476 if( keepSymbol || placeAllUnits )
483 while( currentReference.
GetUnit() <= symbol->GetUnitCount()
484 && schematic.
Contains( currentReference ) )
489 if( currentReference.
GetUnit() > symbol->GetUnitCount() )
496 if( keepSymbol || currentReference.
GetUnit() > 1 )
502 addSymbol( nextSymbol );
505 if( currentReference.
GetUnit() == 1 )
510 existingRefs.
AddItem( placedSymbolReference );
535 m_frame->SelectUnit( symbol, unit );
544 if( symbol && symbol->GetBodyStyle() != bodyStyle )
546 m_frame->SelectBodyStyle( symbol, bodyStyle );
568 symbol->SetPosition( cursorPos );
570 m_view->AddToPreview( symbol,
false );
571 m_frame->SetMsgPanel( symbol );
624 int requestedUnit = params.
m_Unit;
629 static const std::vector<KICAD_T> symbolTypes = {
SCH_SYMBOL_T };
632 if( selection.
Size() != 1 )
634 m_frame->ShowInfoBarMsg(
_(
"Select a single symbol to place the next unit." ) );
645 if( !symbol->IsMultiUnit() )
647 m_frame->ShowInfoBarMsg(
_(
"This symbol has only one unit." ) );
653 if( missingUnits.empty() )
655 m_frame->ShowInfoBarMsg(
_(
"All units of this symbol are already placed." ) );
661 if( requestedUnit > 0 )
663 if( missingUnits.count( requestedUnit ) == 0 )
665 m_frame->ShowInfoBarMsg(
_(
"Requested unit already placed." ) );
669 nextMissing = requestedUnit;
674 nextMissing = *std::min_element( missingUnits.begin(), missingUnits.end() );
677 std::unique_ptr<SCH_SYMBOL> newSymbol = std::make_unique<SCH_SYMBOL>( *symbol );
683 newSymbol->SetUnitSelection( nextMissing );
684 newSymbol->SetUnit( nextMissing );
685 newSymbol->SetRefProp( symbol->GetRef( &sheetPath,
false ) );
707 struct RESET_FORCED_CURSOR_GUARD
714 RESET_FORCED_CURSOR_GUARD forcedCursorGuard{ controls };
716 if( !cfg || !common_settings )
724 std::unique_ptr<DESIGN_BLOCK> designBlock;
725 wxString sheetFileName = wxEmptyString;
728 if( placingDesignBlock )
740 msg.Printf(
_(
"Could not find design block %s." ),
742 m_frame->ShowInfoBarError( msg,
true );
746 sheetFileName = designBlock->GetSchematicFile();
748 if( sheetFileName.IsEmpty() || !wxFileExists( sheetFileName ) )
750 m_frame->ShowInfoBarError(
_(
"Design block has no schematic to place." ),
true );
757 wxString* importSourceFile = aEvent.
Parameter<wxString*>();
759 if( importSourceFile !=
nullptr )
760 sheetFileName = *importSourceFile;
770 auto placeSheetContents =
787 if( !
m_frame->LoadSheetFromFile( sheetPath.
Last(), &sheetPath, sheetFileName,
true,
788 placingDesignBlock ) )
793 m_frame->SetSheetNumberAndCount();
807 group->SetName( designBlock->GetLibId().GetLibItemName() );
808 group->SetDesignBlockLibId( designBlock->GetLibId() );
812 group->SetName( wxFileName( sheetFileName ).
GetName() );
815 if( repeatPlacement )
816 group->SetName(
group->GetName() + wxString::Format(
"%d", suffix++ ) );
825 static_cast<SCH_SYMBOL*
>( item )->ClearAnnotation( &sheetPath,
false );
830 if( !item->GetParentGroup() )
833 group->AddItem( item );
835 newItems.emplace_back( item );
838 commit.
Added( item, screen );
869 if( !keepAnnotations )
901 commit.
Push( placingDesignBlock ?
_(
"Add Design Block" )
902 :
_(
"Import Schematic Sheet Content" ) );
910 m_frame->UpdateHierarchyNavigator();
917 if( sheetFileName.IsEmpty() )
922 if (!placingDesignBlock)
924 if( sheetFileName.IsEmpty() )
926 path = wxPathOnly(
m_frame->Prj().GetProjectFullName() );
927 file = wxEmptyString;
931 path = wxPathOnly( sheetFileName );
932 file = wxFileName( sheetFileName ).GetFullName();
937 wxFileDialog dlg(
m_frame,
_(
"Choose Schematic" ),
path, file,
941 dlg.SetCustomizeHook( dlgHook );
945 if( dlg.ShowModal() == wxID_CANCEL )
948 sheetFileName = dlg.GetPath();
950 m_frame->GetDesignBlockPane()->UpdateCheckboxes();
953 if( sheetFileName.IsEmpty() )
989 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
995 bool isSyntheticClick = designBlock && evt->IsActivate() && evt->HasPosition() && evt->Matches( aEvent );
997 if( evt->IsCancelInteractive() || ( designBlock && evt->IsAction( &
ACTIONS::undo ) ) )
999 m_frame->GetInfoBar()->Dismiss();
1002 else if( evt->IsActivate() && !isSyntheticClick )
1004 m_frame->GetInfoBar()->Dismiss();
1011 if( placingDesignBlock )
1039 evt->SetPassEvent();
1053 bool immediateMode =
image !=
nullptr;
1054 bool ignorePrimePosition =
false;
1092 m_view->RecacheAllItems();
1117 ignorePrimePosition =
true;
1125 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1131 bool isSyntheticClick =
image && evt->IsActivate() && evt->HasPosition() && evt->Matches( aEvent );
1135 m_frame->GetInfoBar()->Dismiss();
1153 else if( evt->IsActivate() && !isSyntheticClick )
1155 if(
image && evt->IsMoveTool() )
1158 evt->SetPassEvent(
false );
1164 m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel image creation." ) );
1165 evt->SetPassEvent(
false );
1169 if( evt->IsMoveTool() )
1193 bool cancelled =
false;
1198 cancelled = dlg.ShowModal() != wxID_OK;
1207 if( evt->IsPrime() && !ignorePrimePosition )
1209 cursorPos =
grid.Align( evt->Position() );
1218 wxString fullFilename = dlg.GetPath();
1221 if( wxFileExists( fullFilename ) )
1224 if( !
image || !
image->GetReferenceImage().ReadImageFile( fullFilename ) )
1226 wxMessageBox( wxString::Format(
_(
"Could not load image from '%s'." ), fullFilename ) );
1238 m_view->RecacheAllItems();
1249 commit.
Push(
_(
"Place Image" ) );
1285 evt->SetPassEvent();
1290 image->SetPosition( cursorPos );
1293 m_view->RecacheAllItems();
1306 evt->SetPassEvent();
1341 if( dlgResult != wxID_OK )
1347 wxMessageBox(
_(
"No graphic items found in file." ) );
1354 std::vector<SCH_ITEM*> newItems;
1355 std::vector<SCH_ITEM*> selectedItems;
1359 for( std::unique_ptr<EDA_ITEM>& ptr : list )
1362 wxCHECK2_MSG( item,
continue, wxString::Format(
"Bad item type: ", ptr->Type() ) );
1364 newItems.push_back( item );
1365 selectedItems.push_back( item );
1366 preview.
Add( item );
1377 commit.
Push(
_(
"Import Graphic" ) );
1386 EDA_ITEMS selItems( selectedItems.begin(), selectedItems.end() );
1412 for(
SCH_ITEM* item : selectedItems )
1413 item->Move(
delta );
1415 currentOffset +=
delta;
1417 m_view->Update( &preview );
1425 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1430 if( evt->IsCancelInteractive() || evt->IsActivate() )
1439 else if( evt->IsMotion() )
1441 delta = cursorPos - currentOffset;
1443 for(
SCH_ITEM* item : selectedItems )
1444 item->Move(
delta );
1446 currentOffset +=
delta;
1448 m_view->Update( &preview );
1461 commit.
Push(
_(
"Import Graphic" ) );
1466 evt->SetPassEvent();
1471 m_view->Remove( &preview );
1489 bool loggedInfoBarError =
false;
1490 wxString description;
1492 bool allowRepeat =
false;
1518 description =
_(
"Add No Connect Flag" );
1525 description =
_(
"Add Junction" );
1531 description =
_(
"Add Wire to Bus Entry" );
1536 wxASSERT_MSG(
false,
"Unknown item type in SCH_DRAWING_TOOLS::SingleClickPlace" );
1574 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1576 cursorPos = evt->IsPrime() ? evt->Position() : controls->
GetMousePosition();
1577 cursorPos =
grid.BestSnapAnchor( cursorPos,
grid.GetItemGrid( previewItem ),
nullptr );
1580 if( evt->IsCancelInteractive() )
1585 else if( evt->IsActivate() )
1587 if( evt->IsMoveTool() )
1601 if( !screen->
GetItem( cursorPos, 0, type ) )
1607 m_frame->ShowInfoBarError(
_(
"Junction location contains no joinable wires and/or pins." ) );
1608 loggedInfoBarError =
true;
1611 else if( loggedInfoBarError )
1613 m_frame->GetInfoBar()->Dismiss();
1622 lwbTool->
AddJunction( &commit, screen, cursorPos );
1624 m_frame->Schematic().CleanUp( &commit );
1626 commit.
Push( description );
1634 m_frame->AddToScreen( newItem, screen );
1637 m_frame->SaveCopyForRepeatItem( newItem );
1640 commit.
Added( newItem, screen );
1642 m_frame->Schematic().CleanUp( &commit );
1644 commit.
Push( description );
1663 m_frame->SetMsgPanel( previewItem );
1700 std::deque<SCH_ITEM*> strokeItems;
1701 strokeItems.push_back( previewItem );
1716 std::deque<SCH_JUNCTION*> junctions;
1717 junctions.push_back(
static_cast<SCH_JUNCTION*
>( previewItem ) );
1740 evt->SetPassEvent();
1745 evt->SetPassEvent();
1778 wxASSERT( aWire->
IsWire() );
1784 SCH_ITEM* wireDriver = wireConnection->Driver();
1786 if( wireDriver && wireDriver->
IsType( { SCH_LABEL_T, SCH_GLOBAL_LABEL_T } ) )
1787 return wireConnection->LocalName();
1790 return wxEmptyString;
1795 std::list<std::unique_ptr<SCH_LABEL_BASE>>& aLabelList )
1818 labelItem->
GetFields().back().SetItalic(
true );
1819 labelItem->
GetFields().back().SetVisible(
true );
1833 labelItem = globalLabel;
1841 wxFAIL_MSG(
"SCH_DRAWING_TOOLS::createNewLabel() unknown label type" );
1861 if( !netName.IsEmpty() )
1864 labelItem->
SetText( netName );
1899 if( aLabelList.empty() )
1900 aLabelList.push_back( std::unique_ptr<SCH_LABEL_BASE>( labelItem ) );
1914 textItem =
new SCH_TEXT( aPosition );
1949 pin->SetText( std::to_string( aSheet->
GetPins().size() + 1 ) );
1951 pin->SetPosition( aPosition );
1952 pin->ClearSelected();
1976 bool ignorePrimePosition =
false;
1979 wxString description;
1981 std::list<std::unique_ptr<SCH_LABEL_BASE>> itemsToPlace;
2012 else if( isGlobalLabel )
2014 else if( isNetLabel )
2016 else if( isClassLabel )
2018 else if( isHierLabel )
2024 auto updatePreview =
2028 m_view->AddToPreview( item,
false );
2031 m_view->AddToPreview( aChild,
false );
2045 while( !itemsToPlace.empty() )
2047 itemsToPlace.front().release();
2048 itemsToPlace.pop_front();
2052 auto prepItemForPlacement =
2084 && ( isText || isGlobalLabel || isHierLabel || isClassLabel || isNetLabel ) )
2087 ignorePrimePosition =
true;
2097 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2100 cursorPos =
grid.BestSnapAnchor( cursorPos, snapGrid, item );
2104 bool isSyntheticClick = item && evt->IsActivate() && evt->HasPosition() && evt->
Matches( aEvent );
2106 if( evt->IsCancelInteractive() || evt->IsAction( &
ACTIONS::undo ) )
2108 m_frame->GetInfoBar()->Dismiss();
2120 else if( evt->IsActivate() && !isSyntheticClick )
2122 if( item && evt->IsMoveTool() )
2125 evt->SetPassEvent(
false );
2131 m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel item creation." ) );
2132 evt->SetPassEvent(
false );
2136 if( evt->IsPointEditor() )
2140 else if( evt->IsMoveTool() )
2164 description =
_(
"Add Text" );
2166 else if( isHierLabel )
2183 itemsToPlace.push_back( std::unique_ptr<SCH_LABEL_BASE>( label ) );
2190 description =
_(
"Add Hierarchical Label" );
2192 else if( isNetLabel )
2195 description =
_(
"Add Label" );
2197 else if( isGlobalLabel )
2200 description =
_(
"Add Label" );
2202 else if( isClassLabel )
2205 description =
_(
"Add Label" );
2207 else if( isSheetPin )
2212 if( !sheet &&
m_selectionTool->SelectPoint( cursorPos, { SCH_SHEET_T }, &i ) )
2220 + wxPoint( 20, 20 ) );
2241 m_statusPopup->SetText(
_(
"No new hierarchical labels found." ) );
2254 description =
_(
"Add Sheet Pin" );
2260 if( evt->IsPrime() && !ignorePrimePosition )
2262 cursorPos =
grid.Align( evt->Position() );
2269 cursorPos =
grid.BestSnapAnchor( cursorPos, snapGrid, item );
2272 if( !itemsToPlace.empty() )
2274 item = itemsToPlace.front().release();
2275 itemsToPlace.pop_front();
2279 prepItemForPlacement( item, cursorPos );
2281 if(
m_frame->GetMoveWarpsCursor() )
2293 if( isSheetPin && sheet )
2301 m_frame->SaveCopyForRepeatItem( item );
2308 commit.
Push( description );
2330 if( isSheetPin && sheet )
2337 m_statusPopup->SetText(
_(
"No new hierarchical labels found." ) );
2347 else if( !itemsToPlace.empty() )
2349 item = itemsToPlace.front().release();
2350 itemsToPlace.pop_front();
2351 prepItemForPlacement( item, cursorPos );
2363 else if( item && evt->IsSelectionEvent() )
2368 if( selection.
GetSize() == 1 )
2380 if( evt->HasParameter() )
2397 evt->SetPassEvent();
2434 evt->SetPassEvent();
2438 evt->SetPassEvent();
2468 wxString description;
2518 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2524 bool isSyntheticClick = item && evt->IsActivate() && evt->HasPosition() && evt->
Matches( aEvent );
2526 if( evt->IsCancelInteractive() || ( item && evt->IsAction( &
ACTIONS::undo ) ) )
2538 else if( evt->IsActivate() && !isSyntheticClick )
2540 if( item && evt->IsMoveTool() )
2543 evt->SetPassEvent(
false );
2550 if( evt->IsPointEditor() )
2554 else if( evt->IsMoveTool() )
2565 else if( !item && ( evt->IsClick(
BUT_LEFT )
2589 description =
_(
"Add Text Box" );
2612 bool finished =
false;
2664 commit.
Push( wxString::Format(
_(
"Draw %s" ), item->
GetClass() ) );
2685 evt->SetPassEvent();
2695 else if( evt->IsDblClick(
BUT_LEFT ) && !item )
2713 evt->SetPassEvent();
2742 bool started =
false;
2761 polyGeomMgr.
Reset();
2786 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2794 if( evt->IsCancelInteractive() )
2805 evt->SetPassEvent(
false );
2809 else if( evt->IsActivate() )
2814 if( evt->IsPointEditor() )
2818 else if( evt->IsMoveTool() )
2842 const bool endPolygon = evt->IsDblClick(
BUT_LEFT )
2850 polyGeomMgr.
Reset();
2857 else if( polyGeomMgr.
AddPoint( cursorPos ) )
2874 cursorPos = last.value();
2884 else if( started && ( evt->IsMotion() || evt->IsDrag(
BUT_LEFT ) ) )
2900 evt->SetPassEvent();
2905 evt->SetPassEvent();
2970 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2976 bool isSyntheticClick =
table && evt->IsActivate() && evt->HasPosition() && evt->Matches( aEvent );
2990 else if( evt->IsActivate() && !isSyntheticClick )
2992 if(
table && evt->IsMoveTool() )
2995 evt->SetPassEvent(
false );
3002 if( evt->IsPointEditor() )
3006 else if( evt->IsMoveTool() )
3023 table->SetColCount( 1 );
3029 table->AddCell( tableCell );
3031 table->SetParent( schematic );
3033 table->SetPosition( cursorPos );
3043 table->ClearEditFlags();
3054 commit.
Push(
_(
"Draw Table" ) );
3072 VECTOR2I requestedSize( cursorPos - origin );
3074 int colCount = std::max( 1, requestedSize.
x / ( fontSize * 15 ) );
3075 int rowCount = std::max( 1, requestedSize.
y / ( fontSize * 2 ) );
3077 VECTOR2I cellSize( std::max( gridSize.
x * 5, requestedSize.
x / colCount ),
3078 std::max( gridSize.
y * 2, requestedSize.
y / rowCount ) );
3080 cellSize.
x =
KiROUND( (
double) cellSize.
x / gridSize.
x ) * gridSize.
x;
3081 cellSize.
y =
KiROUND( (
double) cellSize.
y / gridSize.
y ) * gridSize.
y;
3083 table->ClearCells();
3084 table->SetColCount( colCount );
3086 for(
int col = 0; col < colCount; ++col )
3087 table->SetColWidth( col, cellSize.
x );
3089 for(
int row = 0; row < rowCount; ++row )
3091 table->SetRowHeight( row, cellSize.
y );
3093 for(
int col = 0; col < colCount; ++col )
3101 table->AddCell( cell );
3133 evt->SetPassEvent();
3142 evt->SetPassEvent();
3162 std::unique_ptr<DESIGN_BLOCK> designBlock;
3168 if( isDrawSheetCopy )
3170 wxString* ptr = aEvent.
Parameter<wxString*>();
3177 else if( isDrawSheetFromDesignBlock )
3180 wxCHECK( designBlock, 0 );
3181 filename = designBlock->GetSchematicFile();
3184 if( ( isDrawSheetCopy || isDrawSheetFromDesignBlock ) && !wxFileExists( filename ) )
3186 wxMessageBox( wxString::Format(
_(
"File '%s' does not exist." ), filename ) );
3200 bool startedWithDrag =
false;
3229 if( aEvent.
HasPosition() && !( isDrawSheetCopy || isDrawSheetFromDesignBlock ) )
3237 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
3243 bool isSyntheticClick = sheet && evt->IsActivate() && evt->HasPosition()
3246 if( evt->IsCancelInteractive() || ( sheet && evt->IsAction( &
ACTIONS::undo ) ) )
3248 m_frame->GetInfoBar()->Dismiss();
3260 else if( evt->IsActivate() && !isSyntheticClick )
3262 if( sheet && evt->IsMoveTool() )
3265 evt->SetPassEvent(
false );
3271 m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel sheet creation." ) );
3272 evt->SetPassEvent(
false );
3276 if( evt->IsPointEditor() )
3280 else if( evt->IsMoveTool() )
3291 else if( !sheet && ( evt->IsClick(
BUT_LEFT ) || evt->IsDblClick(
BUT_LEFT )
3297 if( selection.
Size() == 1
3322 startedWithDrag = evt->IsDrag(
BUT_LEFT );
3329 if( isDrawSheetCopy )
3331 wxFileName fn( filename );
3336 else if( isDrawSheetFromDesignBlock )
3338 wxFileName fn( filename );
3343 std::vector<SCH_FIELD>& sheetFields = sheet->
GetFields();
3346 for(
const auto& [fieldName, fieldValue] : designBlock->GetFields() )
3348 sheetFields.emplace_back( sheet,
FIELD_T::USER, fieldName );
3349 sheetFields.back().SetText( fieldValue );
3350 sheetFields.back().SetVisible(
false );
3368 wxString pageNumber;
3371 std::set<int> usedPageNumbers;
3375 wxString existingPageNum =
path.GetPageNumber();
3378 if( existingPageNum.ToLong( &pageNum ) && pageNum > 0 )
3379 usedPageNumbers.insert(
static_cast<int>( pageNum ) );
3383 int nextAvailable = 1;
3385 while( usedPageNumbers.count( nextAvailable ) > 0 )
3388 pageNumber.Printf( wxT(
"%d" ), nextAvailable );
3394 else if( sheet && ( evt->IsClick(
BUT_LEFT ) || evt->IsDblClick(
BUT_LEFT )
3398 || ( startedWithDrag && evt->IsMouseUp(
BUT_LEFT ) ) ) )
3404 nullptr,
nullptr,
nullptr, &filename ) )
3416 m_frame->AddToScreen( sheet );
3421 m_frame->Schematic().RefreshHierarchy();
3427 && !( ( isDrawSheetCopy || isDrawSheetFromDesignBlock )
3449 sheetGroup->
SetName( designBlock->GetLibId().GetLibItemName() );
3456 c.
Push( isDrawSheetCopy ?
"Import Sheet Copy" :
"Draw Sheet" );
3463 if( ( isDrawSheetCopy || isDrawSheetFromDesignBlock )
3490 evt->SetPassEvent();
3499 m_frame->SetMsgPanel( sheet );
3515 evt->SetPassEvent();
3547 if( !sheetPaths.size() )
3551 m_frame, std::move( sheetPaths ),
3552 std::make_shared<SHEET_SYNCHRONIZATION_AGENT>(
3562 commit.
Push(
_(
"Modify sheet pin" ) );
3568 commit.
Push(
_(
"Modify schematic item" ) );
3579 selectionTool->AddItemToSel( aItem,
true );
3584 std::set<EDA_ITEM*> aTemplates )
3657 if( labels.empty() )
3661 m_statusPopup->SetText(
_(
"No new hierarchical labels found." ) );
3675 SCH_ITEM* lastPlacedLabel =
nullptr;
3677 auto calculatePositionForLabel =
3688 int currentWidth = currentLabel->GetBoundingBox().GetWidth();
3689 int currentHeight = currentLabel->GetBoundingBox().GetHeight();
3693 return { lastX + lastWidth, lastY };
3704 if( !lastPlacedLabel )
3706 std::vector<SCH_SHEET_PIN*> existingPins = sheet->
GetPins();
3708 if( !existingPins.empty() )
3710 std::sort( existingPins.begin(), existingPins.end(),
3713 return ( a->GetPosition().x < b->GetPosition().x )
3714 || ( a->GetPosition().x == b->GetPosition().x
3715 && a->GetPosition().y < b->GetPosition().y );
3718 lastPlacedLabel = existingPins.back();
3722 cursorPos = calculatePositionForLabel( lastPlacedLabel, label );
3739 commit.
Push(
_(
"Add Sheet Pin" ) );
3741 lastPlacedLabel = item;
3751 static const std::function<void( std::list<SCH_SHEET_PATH>&,
SCH_SCREEN*, std::set<SCH_SCREEN*>&,
3753 []( std::list<SCH_SHEET_PATH>& aPaths,
SCH_SCREEN* aScene, std::set<SCH_SCREEN*>& aVisited,
3756 if( ! aScene || aVisited.find(aScene) != aVisited.end() )
3759 std::vector<SCH_ITEM*> sheetChildren;
3760 aScene->GetSheets( &sheetChildren );
3761 aVisited.insert( aScene );
3763 for(
SCH_ITEM* child : sheetChildren )
3768 aPaths.push_back( cp );
3769 getSheetChildren( aPaths, sheet->
GetScreen(), aVisited, cp );
3773 std::list<SCH_SHEET_PATH> sheetPaths;
3774 std::set<SCH_SCREEN*> visited;
3777 std::vector<SCH_SHEET*> topLevelSheets =
m_frame->Schematic().GetTopLevelSheets();
3779 for(
SCH_SHEET* topSheet : topLevelSheets )
3781 if( topSheet && topSheet->GetScreen() )
3785 getSheetChildren( sheetPaths, topSheet->GetScreen(), visited, current );
3789 if( sheetPaths.size() == 0 )
3791 m_frame->ShowInfoBarMsg(
_(
"No sub schematic found in the current project" ) );
3806 std::vector<SCH_HIERLABEL*> labels;
3811 labels.push_back( label );
3814 std::sort( labels.begin(), labels.end(),
3817 return StrNumCmp( label1->GetText(), label2->GetText(), true ) < 0;
3822 if( !aSheet->
HasPin( label->GetText() ) )
3835 std::vector<SCH_HIERLABEL*> labels;
3842 labels.push_back( label );
constexpr EDA_IU_SCALE schIUScale
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
static TOOL_ACTION cancelInteractive
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 TOOL_ACTION selectItems
Select a list of items (specified as the event parameter)
PANEL_DESIGN_BLOCK_CHOOSER m_DesignBlockChooserPanel
constexpr const Vec & GetPosition() const
constexpr size_type GetWidth() const
constexpr size_type GetHeight() const
constexpr bool Contains(const Vec &aPoint) const
constexpr const SizeVec & GetSize() 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.
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 SetFilenameOverride(const wxString &aFilenameOverride)
Set the filename override to be applied in TransferDataToWindow.
std::list< std::unique_ptr< EDA_ITEM > > & GetImportedItems()
bool IsPlacementInteractive()
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 VECTOR2I GetPosition() const
virtual void ClearEditFlags()
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 void SetParent(EDA_ITEM *aParent)
virtual wxString GetFriendlyName() const
virtual EDA_ITEM * Clone() const
Create a duplicate of this item with linked list members set to NULL.
FILL_T GetFillMode() const
void SetFillColor(const COLOR4D &aColor)
COLOR4D GetFillColor() const
void SetEnd(const VECTOR2I &aEnd)
const EDA_ANGLE & GetTextAngle() const
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)
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
A color representation with 4 components: red, green, blue, alpha.
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.
VECTOR2D GetCursorPosition() const
Return the current cursor position 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.
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
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
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 drawTextBox
static TOOL_ACTION autoplaceFields
static TOOL_ACTION changeSymbol
static TOOL_ACTION syncAllSheetsPins
static TOOL_ACTION closeOutline
static TOOL_ACTION drawArc
static TOOL_ACTION drawSheet
static TOOL_ACTION properties
static TOOL_ACTION editReference
static TOOL_ACTION leaveSheet
static TOOL_ACTION ddImportGraphics
static TOOL_ACTION autoplaceAllSheetPins
static TOOL_ACTION drawRectangle
static TOOL_ACTION placeHierLabel
static TOOL_ACTION placeLabel
static TOOL_ACTION drawCircle
static TOOL_ACTION importGraphics
static TOOL_ACTION toText
static TOOL_ACTION placeBusWireEntry
static TOOL_ACTION toHLabel
static TOOL_ACTION drawBezier
static TOOL_ACTION rotateCW
static TOOL_ACTION importSheet
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 deleteLastPoint
static TOOL_ACTION editWithLibEdit
static TOOL_ACTION toDLabel
static TOOL_ACTION cycleBodyStyle
static TOOL_ACTION drawSheetFromDesignBlock
static TOOL_ACTION mirrorH
static TOOL_ACTION placeDesignBlock
static TOOL_ACTION setExcludeFromSimulation
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 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
void BeginEdit(const VECTOR2I &aStartPoint) override
Begin drawing a symbol library draw item at aPosition.
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
void EndEdit(bool aClosed=false) override
End an object editing action.
void SetStroke(const STROKE_PARAMS &aStroke) override
bool ContinueEdit(const VECTOR2I &aPosition) override
Continue an edit in progress at aPosition.
void CalcEdit(const VECTOR2I &aPosition) override
Calculate the attributes of an item at aPosition when it is being edited.
wxString GetClass() const override
Return the class name.
STROKE_PARAMS GetStroke() const 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.
void GetSymbols(SCH_REFERENCE_LIST &aReferences, bool aIncludePowerSymbols=true, 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 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.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
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 void Add(EDA_ITEM *aItem)
VECTOR2I GetReferencePoint() const
virtual unsigned int GetSize() const override
Return the number of stored items.
virtual void Clear() override
Remove all the stored items from the group.
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.
LINE_STYLE
Dashed line types.
COLOR4D default_sheet_border_color
COLOR4D default_sheet_background_color
int default_line_thickness
POWER_SYMBOLS new_power_symbols
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.
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.