67#include <dialogs/dialog_text_properties.h>
70#include <dialogs/dialog_table_properties.h>
75#include <wx/filedlg.h>
110 auto belowRootSheetCondition =
113 return m_frame->GetCurrentSheet().Last() != &
m_frame->Schematic().Root();
116 auto inDrawingRuleArea =
139 bool placeOneOnly = symbol !=
nullptr;
142 std::vector<PICKED_SYMBOL>* historyList =
nullptr;
143 bool ignorePrimePosition =
false;
147 bool keepSymbol =
false;
148 bool placeAllUnits =
false;
176 filter.FilterPowerSymbols(
true );
180 wxFAIL_MSG(
"PlaceSymbol(): unexpected request" );
194 m_view->AddToPreview( aSymbol,
false );
215 existingRefs.
Clear();
243 for(
size_t i = 0; i < refs.
GetCount(); i++ )
244 existingRefs.
AddItem( refs[i] );
248 m_frame->GetCurrentSheet().UpdateAllScreenReferences();
276 ignorePrimePosition =
true;
284 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
290 bool isSyntheticClick = symbol && evt->IsActivate() && evt->HasPosition() && evt->Matches( aEvent );
292 if( evt->IsCancelInteractive() || ( symbol && evt->IsAction( &
ACTIONS::undo ) ) )
294 m_frame->GetInfoBar()->Dismiss();
312 else if( evt->IsActivate() && !isSyntheticClick )
314 if( symbol && evt->IsMoveTool() )
317 evt->SetPassEvent(
false );
323 m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel symbol creation." ) );
324 evt->SetPassEvent(
false );
328 if( evt->IsMoveTool() )
350 std::set<UTF8> unique_libid;
351 std::vector<PICKED_SYMBOL> alreadyPlaced;
368 alreadyPlaced.push_back( pickedSymbol );
374 bool footprintPreviews =
m_frame->eeconfig()->m_Appearance.footprint_preview;
389 if( evt->IsPrime() && !ignorePrimePosition )
416 if( keywords.Contains( wxT(
"global power" ) ) )
418 keywords.Replace( wxT(
"global power" ), wxT(
"local power" ) );
424 if( desc.Contains( wxT(
"global label" ) ) )
426 desc.Replace( wxT(
"global label" ), wxT(
"local label" ) );
439 symbol =
new SCH_SYMBOL( *libSymbol, &
m_frame->GetCurrentSheet(), sel, cursorPos,
446 existingRefs.
AddItem( placedSymbolReference );
449 if(
m_frame->eeconfig()->m_AutoplaceFields.enable )
461 m_frame->AddToScreen( symbol, screen );
463 if(
m_frame->eeconfig()->m_AutoplaceFields.enable )
466 m_frame->SaveCopyForRepeatItem( symbol );
469 commit.
Added( symbol, screen );
475 commit.
Push(
_(
"Place Symbol" ) );
485 if( keepSymbol || placeAllUnits )
492 while( currentReference.
GetUnit() <= symbol->GetUnitCount()
493 && schematic.Contains( currentReference ) )
498 if( currentReference.
GetUnit() > symbol->GetUnitCount() )
505 if( keepSymbol || currentReference.
GetUnit() > 1 )
511 addSymbol( nextSymbol );
514 if( currentReference.
GetUnit() == 1 )
519 existingRefs.
AddItem( placedSymbolReference );
544 m_frame->SelectUnit( symbol, unit );
553 if( symbol && symbol->GetBodyStyle() != bodyStyle )
555 m_frame->SelectBodyStyle( symbol, bodyStyle );
577 symbol->SetPosition( cursorPos );
579 m_view->AddToPreview( symbol,
false );
580 m_frame->SetMsgPanel( symbol );
633 int requestedUnit = params.
m_Unit;
638 static const std::vector<KICAD_T> symbolTypes = {
SCH_SYMBOL_T };
641 if( selection.
Size() != 1 )
643 m_frame->ShowInfoBarMsg(
_(
"Select a single symbol to place the next unit." ) );
654 if( !symbol->IsMultiUnit() )
656 m_frame->ShowInfoBarMsg(
_(
"This symbol has only one unit." ) );
662 if( missingUnits.empty() )
664 m_frame->ShowInfoBarMsg(
_(
"All units of this symbol are already placed." ) );
670 if( requestedUnit > 0 )
672 if( missingUnits.count( requestedUnit ) == 0 )
674 m_frame->ShowInfoBarMsg(
_(
"Requested unit already placed." ) );
678 nextMissing = requestedUnit;
683 nextMissing = *std::min_element( missingUnits.begin(), missingUnits.end() );
686 std::unique_ptr<SCH_SYMBOL> newSymbol = std::make_unique<SCH_SYMBOL>( *symbol );
692 newSymbol->SetUnitSelection( nextMissing );
693 newSymbol->SetUnit( nextMissing );
694 newSymbol->SetRefProp( symbol->GetRef( &sheetPath,
false ) );
716 struct RESET_FORCED_CURSOR_GUARD
723 RESET_FORCED_CURSOR_GUARD forcedCursorGuard{ controls };
725 if( !cfg || !common_settings )
733 std::unique_ptr<DESIGN_BLOCK> designBlock;
734 wxString sheetFileName = wxEmptyString;
737 if( placingDesignBlock )
749 msg.Printf(
_(
"Could not find design block %s." ),
751 m_frame->ShowInfoBarError( msg,
true );
755 sheetFileName = designBlock->GetSchematicFile();
757 if( sheetFileName.IsEmpty() || !wxFileExists( sheetFileName ) )
759 m_frame->ShowInfoBarError(
_(
"Design block has no schematic to place." ),
true );
766 wxString* importSourceFile = aEvent.
Parameter<wxString*>();
768 if( importSourceFile !=
nullptr )
769 sheetFileName = *importSourceFile;
779 auto placeSheetContents =
796 if( !
m_frame->LoadSheetFromFile( sheetPath.
Last(), &sheetPath, sheetFileName,
true,
797 placingDesignBlock ) )
802 m_frame->SetSheetNumberAndCount();
816 group->SetName( designBlock->GetLibId().GetLibItemName() );
817 group->SetDesignBlockLibId( designBlock->GetLibId() );
821 group->SetName( wxFileName( sheetFileName ).
GetName() );
824 if( repeatPlacement )
825 group->SetName(
group->GetName() + wxString::Format(
"%d", suffix++ ) );
840 if( item->Type() ==
SCH_SYMBOL_T && !keepAnnotations && !autoAnnotate )
841 static_cast<SCH_SYMBOL*
>( item )->ClearAnnotation( &sheetPath,
false );
846 if( !item->GetParentGroup() )
849 group->AddItem( item );
851 newItems.emplace_back( item );
854 commit.
Added( item, screen );
885 if( !keepAnnotations || placingDesignBlock )
899 if( placingDesignBlock )
936 commit.
Push( placingDesignBlock ?
_(
"Add Design Block" )
937 :
_(
"Import Schematic Sheet Content" ) );
945 m_frame->UpdateHierarchyNavigator();
952 if( sheetFileName.IsEmpty() )
957 if (!placingDesignBlock)
959 if( sheetFileName.IsEmpty() )
961 path = wxPathOnly(
m_frame->Prj().GetProjectFullName() );
962 file = wxEmptyString;
966 path = wxPathOnly( sheetFileName );
967 file = wxFileName( sheetFileName ).GetFullName();
972 wxFileDialog dlg(
m_frame,
_(
"Choose Schematic" ),
path, file,
976 dlg.SetCustomizeHook( dlgHook );
980 if( dlg.ShowModal() == wxID_CANCEL )
983 sheetFileName = dlg.GetPath();
985 m_frame->GetDesignBlockPane()->UpdateCheckboxes();
988 if( sheetFileName.IsEmpty() )
1024 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1030 bool isSyntheticClick = designBlock && evt->IsActivate() && evt->HasPosition() && evt->Matches( aEvent );
1032 if( evt->IsCancelInteractive() || ( designBlock && evt->IsAction( &
ACTIONS::undo ) ) )
1034 m_frame->GetInfoBar()->Dismiss();
1037 else if( evt->IsActivate() && !isSyntheticClick )
1039 m_frame->GetInfoBar()->Dismiss();
1046 if( placingDesignBlock )
1074 evt->SetPassEvent();
1088 bool immediateMode =
image !=
nullptr;
1089 bool ignorePrimePosition =
false;
1127 m_view->RecacheAllItems();
1152 ignorePrimePosition =
true;
1160 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1166 bool isSyntheticClick =
image && evt->IsActivate() && evt->HasPosition() && evt->Matches( aEvent );
1170 m_frame->GetInfoBar()->Dismiss();
1188 else if( evt->IsActivate() && !isSyntheticClick )
1190 if(
image && evt->IsMoveTool() )
1193 evt->SetPassEvent(
false );
1199 m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel image creation." ) );
1200 evt->SetPassEvent(
false );
1204 if( evt->IsMoveTool() )
1228 bool cancelled =
false;
1233 cancelled = dlg.ShowModal() != wxID_OK;
1242 if( evt->IsPrime() && !ignorePrimePosition )
1244 cursorPos =
grid.Align( evt->Position() );
1253 wxString fullFilename = dlg.GetPath();
1256 if( wxFileExists( fullFilename ) )
1259 if( !
image || !
image->GetReferenceImage().ReadImageFile( fullFilename ) )
1261 wxMessageBox( wxString::Format(
_(
"Could not load image from '%s'." ), fullFilename ) );
1273 m_view->RecacheAllItems();
1284 commit.
Push(
_(
"Place Image" ) );
1320 evt->SetPassEvent();
1325 image->SetPosition( cursorPos );
1328 m_view->RecacheAllItems();
1341 evt->SetPassEvent();
1376 if( dlgResult != wxID_OK )
1382 wxMessageBox(
_(
"No graphic items found in file." ) );
1389 std::vector<SCH_ITEM*> newItems;
1390 std::vector<SCH_ITEM*> selectedItems;
1394 for( std::unique_ptr<EDA_ITEM>& ptr : list )
1397 wxCHECK2_MSG( item,
continue, wxString::Format(
"Bad item type: ", ptr->Type() ) );
1399 newItems.push_back( item );
1400 selectedItems.push_back( item );
1401 preview.
Add( item );
1412 commit.
Push(
_(
"Import Graphic" ) );
1421 EDA_ITEMS selItems( selectedItems.begin(), selectedItems.end() );
1447 for(
SCH_ITEM* item : selectedItems )
1448 item->Move(
delta );
1450 currentOffset +=
delta;
1452 m_view->Update( &preview );
1460 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1465 if( evt->IsCancelInteractive() || evt->IsActivate() )
1474 else if( evt->IsMotion() )
1476 delta = cursorPos - currentOffset;
1478 for(
SCH_ITEM* item : selectedItems )
1479 item->Move(
delta );
1481 currentOffset +=
delta;
1483 m_view->Update( &preview );
1496 commit.
Push(
_(
"Import Graphic" ) );
1501 evt->SetPassEvent();
1506 m_view->Remove( &preview );
1524 bool loggedInfoBarError =
false;
1525 wxString description;
1527 bool allowRepeat =
false;
1553 description =
_(
"Add No Connect Flag" );
1560 description =
_(
"Add Junction" );
1566 description =
_(
"Add Wire to Bus Entry" );
1571 wxASSERT_MSG(
false,
"Unknown item type in SCH_DRAWING_TOOLS::SingleClickPlace" );
1609 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1611 cursorPos = evt->IsPrime() ? evt->Position() : controls->
GetMousePosition();
1612 cursorPos =
grid.BestSnapAnchor( cursorPos,
grid.GetItemGrid( previewItem ),
nullptr );
1615 if( evt->IsCancelInteractive() )
1620 else if( evt->IsActivate() )
1622 if( evt->IsMoveTool() )
1636 if( !screen->
GetItem( cursorPos, 0, type ) )
1642 m_frame->ShowInfoBarError(
_(
"Junction location contains no joinable wires and/or pins." ) );
1643 loggedInfoBarError =
true;
1646 else if( loggedInfoBarError )
1648 m_frame->GetInfoBar()->Dismiss();
1657 lwbTool->
AddJunction( &commit, screen, cursorPos );
1659 m_frame->Schematic().CleanUp( &commit );
1661 commit.
Push( description );
1669 m_frame->AddToScreen( newItem, screen );
1672 m_frame->SaveCopyForRepeatItem( newItem );
1675 commit.
Added( newItem, screen );
1677 m_frame->Schematic().CleanUp( &commit );
1679 commit.
Push( description );
1698 m_frame->SetMsgPanel( previewItem );
1735 std::deque<SCH_ITEM*> strokeItems;
1736 strokeItems.push_back( previewItem );
1751 std::deque<SCH_JUNCTION*> junctions;
1752 junctions.push_back(
static_cast<SCH_JUNCTION*
>( previewItem ) );
1775 evt->SetPassEvent();
1780 evt->SetPassEvent();
1813 wxASSERT( aWire->
IsWire() );
1819 SCH_ITEM* wireDriver = wireConnection->Driver();
1821 if( wireDriver && wireDriver->
IsType( { SCH_LABEL_T, SCH_GLOBAL_LABEL_T } ) )
1822 return wireConnection->LocalName();
1825 return wxEmptyString;
1830 std::list<std::unique_ptr<SCH_LABEL_BASE>>& aLabelList )
1853 labelItem->
GetFields().back().SetItalic(
true );
1854 labelItem->
GetFields().back().SetVisible(
true );
1868 labelItem = globalLabel;
1876 wxFAIL_MSG(
"SCH_DRAWING_TOOLS::createNewLabel() unknown label type" );
1896 if( !netName.IsEmpty() )
1899 labelItem->
SetText( netName );
1934 if( aLabelList.empty() )
1935 aLabelList.push_back( std::unique_ptr<SCH_LABEL_BASE>( labelItem ) );
1949 textItem =
new SCH_TEXT( aPosition );
1984 pin->SetText( std::to_string( aSheet->
GetPins().size() + 1 ) );
1986 pin->SetPosition( aPosition );
1987 pin->ClearSelected();
2011 bool ignorePrimePosition =
false;
2014 wxString description;
2016 std::list<std::unique_ptr<SCH_LABEL_BASE>> itemsToPlace;
2047 else if( isGlobalLabel )
2049 else if( isNetLabel || isClassLabel )
2051 else if( isHierLabel )
2057 auto updatePreview =
2061 m_view->AddToPreview( item,
false );
2064 m_view->AddToPreview( aChild,
false );
2078 while( !itemsToPlace.empty() )
2080 itemsToPlace.front().release();
2081 itemsToPlace.pop_front();
2085 auto prepItemForPlacement =
2117 && ( isText || isGlobalLabel || isHierLabel || isClassLabel || isNetLabel ) )
2120 ignorePrimePosition =
true;
2130 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2133 cursorPos =
grid.BestSnapAnchor( cursorPos, snapGrid, item );
2137 bool isSyntheticClick = item && evt->IsActivate() && evt->HasPosition() && evt->
Matches( aEvent );
2139 if( evt->IsCancelInteractive() || evt->IsAction( &
ACTIONS::undo ) )
2141 m_frame->GetInfoBar()->Dismiss();
2153 else if( evt->IsActivate() && !isSyntheticClick )
2155 if( item && evt->IsMoveTool() )
2158 evt->SetPassEvent(
false );
2164 m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel item creation." ) );
2165 evt->SetPassEvent(
false );
2169 if( evt->IsPointEditor() )
2173 else if( evt->IsMoveTool() )
2197 description =
_(
"Add Text" );
2199 else if( isHierLabel )
2214 schematic->Settings().m_DefaultTextSize ) );
2216 itemsToPlace.push_back( std::unique_ptr<SCH_LABEL_BASE>( label ) );
2223 description =
_(
"Add Hierarchical Label" );
2225 else if( isNetLabel )
2228 description =
_(
"Add Label" );
2230 else if( isGlobalLabel )
2233 description =
_(
"Add Label" );
2235 else if( isClassLabel )
2238 description =
_(
"Add Label" );
2240 else if( isSheetPin )
2245 if( !sheet &&
m_selectionTool->SelectPoint( cursorPos, { SCH_SHEET_T }, &i ) )
2253 + wxPoint( 20, 20 ) );
2274 m_statusPopup->SetText(
_(
"No new hierarchical labels found." ) );
2287 description =
_(
"Add Sheet Pin" );
2293 if( evt->IsPrime() && !ignorePrimePosition )
2295 cursorPos =
grid.Align( evt->Position() );
2302 cursorPos =
grid.BestSnapAnchor( cursorPos, snapGrid, item );
2305 if( !itemsToPlace.empty() )
2307 item = itemsToPlace.front().release();
2308 itemsToPlace.pop_front();
2312 prepItemForPlacement( item, cursorPos );
2314 if(
m_frame->GetMoveWarpsCursor() )
2326 if( isSheetPin && sheet )
2334 m_frame->SaveCopyForRepeatItem( item );
2341 commit.
Push( description );
2363 if( isSheetPin && sheet )
2370 m_statusPopup->SetText(
_(
"No new hierarchical labels found." ) );
2380 else if( !itemsToPlace.empty() )
2382 item = itemsToPlace.front().release();
2383 itemsToPlace.pop_front();
2384 prepItemForPlacement( item, cursorPos );
2396 else if( item && evt->IsSelectionEvent() )
2401 if( selection.
GetSize() == 1 )
2413 if( evt->HasParameter() )
2430 evt->SetPassEvent();
2467 evt->SetPassEvent();
2471 evt->SetPassEvent();
2501 wxString description;
2551 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2557 bool isSyntheticClick = item && evt->IsActivate() && evt->HasPosition() && evt->
Matches( aEvent );
2559 if( evt->IsCancelInteractive() || ( item && evt->IsAction( &
ACTIONS::undo ) ) )
2571 else if( evt->IsActivate() && !isSyntheticClick )
2573 if( item && evt->IsMoveTool() )
2576 evt->SetPassEvent(
false );
2583 if( evt->IsPointEditor() )
2587 else if( evt->IsMoveTool() )
2598 else if( !item && ( evt->IsClick(
BUT_LEFT )
2622 description =
_(
"Add Text Box" );
2645 bool finished =
false;
2697 commit.
Push( wxString::Format(
_(
"Draw %s" ), item->
GetClass() ) );
2718 evt->SetPassEvent();
2728 else if( evt->IsDblClick(
BUT_LEFT ) && !item )
2746 evt->SetPassEvent();
2775 bool started =
false;
2794 polyGeomMgr.
Reset();
2819 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2827 if( evt->IsCancelInteractive() )
2838 evt->SetPassEvent(
false );
2842 else if( evt->IsActivate() )
2847 if( evt->IsPointEditor() )
2851 else if( evt->IsMoveTool() )
2875 const bool endPolygon = evt->IsDblClick(
BUT_LEFT )
2883 polyGeomMgr.
Reset();
2890 else if( polyGeomMgr.
AddPoint( cursorPos ) )
2907 cursorPos = last.value();
2917 else if( started && ( evt->IsMotion() || evt->IsDrag(
BUT_LEFT ) ) )
2933 evt->SetPassEvent();
2938 evt->SetPassEvent();
3003 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
3009 bool isSyntheticClick =
table && evt->IsActivate() && evt->HasPosition() && evt->Matches( aEvent );
3023 else if( evt->IsActivate() && !isSyntheticClick )
3025 if(
table && evt->IsMoveTool() )
3028 evt->SetPassEvent(
false );
3035 if( evt->IsPointEditor() )
3039 else if( evt->IsMoveTool() )
3056 table->SetColCount( 1 );
3059 int defaultTextSize = schematic->Settings().m_DefaultTextSize;
3062 table->AddCell( tableCell );
3064 table->SetParent( schematic );
3066 table->SetPosition( cursorPos );
3076 table->ClearEditFlags();
3087 commit.
Push(
_(
"Draw Table" ) );
3103 int fontSize = schematic->Settings().m_DefaultTextSize;
3105 VECTOR2I requestedSize( cursorPos - origin );
3107 int colCount = std::max( 1, requestedSize.
x / ( fontSize * 15 ) );
3108 int rowCount = std::max( 1, requestedSize.
y / ( fontSize * 2 ) );
3110 VECTOR2I cellSize( std::max( gridSize.
x * 5, requestedSize.
x / colCount ),
3111 std::max( gridSize.
y * 2, requestedSize.
y / rowCount ) );
3113 cellSize.
x =
KiROUND( (
double) cellSize.
x / gridSize.
x ) * gridSize.
x;
3114 cellSize.
y =
KiROUND( (
double) cellSize.
y / gridSize.
y ) * gridSize.
y;
3116 table->ClearCells();
3117 table->SetColCount( colCount );
3119 for(
int col = 0; col < colCount; ++col )
3120 table->SetColWidth( col, cellSize.
x );
3122 for(
int row = 0; row < rowCount; ++row )
3124 table->SetRowHeight( row, cellSize.
y );
3126 for(
int col = 0; col < colCount; ++col )
3129 int defaultTextSize = schematic->Settings().m_DefaultTextSize;
3134 table->AddCell( cell );
3166 evt->SetPassEvent();
3175 evt->SetPassEvent();
3195 std::unique_ptr<DESIGN_BLOCK> designBlock;
3201 if( isDrawSheetCopy )
3203 wxString* ptr = aEvent.
Parameter<wxString*>();
3210 else if( isDrawSheetFromDesignBlock )
3213 wxCHECK( designBlock, 0 );
3214 filename = designBlock->GetSchematicFile();
3217 if( ( isDrawSheetCopy || isDrawSheetFromDesignBlock ) && !wxFileExists( filename ) )
3219 wxMessageBox( wxString::Format(
_(
"File '%s' does not exist." ), filename ) );
3233 bool startedWithDrag =
false;
3262 if( aEvent.
HasPosition() && !( isDrawSheetCopy || isDrawSheetFromDesignBlock ) )
3270 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
3276 bool isSyntheticClick = sheet && evt->IsActivate() && evt->HasPosition()
3279 if( evt->IsCancelInteractive() || ( sheet && evt->IsAction( &
ACTIONS::undo ) ) )
3281 m_frame->GetInfoBar()->Dismiss();
3293 else if( evt->IsActivate() && !isSyntheticClick )
3295 if( sheet && evt->IsMoveTool() )
3298 evt->SetPassEvent(
false );
3304 m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel sheet creation." ) );
3305 evt->SetPassEvent(
false );
3309 if( evt->IsPointEditor() )
3313 else if( evt->IsMoveTool() )
3324 else if( !sheet && ( evt->IsClick(
BUT_LEFT ) || evt->IsDblClick(
BUT_LEFT )
3330 if( selection.
Size() == 1
3355 startedWithDrag = evt->IsDrag(
BUT_LEFT );
3362 if( isDrawSheetCopy )
3364 wxFileName fn( filename );
3369 else if( isDrawSheetFromDesignBlock )
3371 wxFileName fn( filename );
3376 std::vector<SCH_FIELD>& sheetFields = sheet->
GetFields();
3379 for(
const auto& [fieldName, fieldValue] : designBlock->GetFields() )
3381 sheetFields.emplace_back( sheet,
FIELD_T::USER, fieldName );
3382 sheetFields.back().SetText( fieldValue );
3383 sheetFields.back().SetVisible(
false );
3407 else if( sheet && ( evt->IsClick(
BUT_LEFT ) || evt->IsDblClick(
BUT_LEFT )
3411 || ( startedWithDrag && evt->IsMouseUp(
BUT_LEFT ) ) ) )
3417 nullptr,
nullptr,
nullptr, &filename ) )
3429 m_frame->AddToScreen( sheet );
3434 m_frame->Schematic().RefreshHierarchy();
3437 && !( ( isDrawSheetCopy || isDrawSheetFromDesignBlock )
3439 bool annotatePowerSymbols = isDrawSheetFromDesignBlock;
3441 if( annotateNonPowerSymbols || annotatePowerSymbols )
3448 if( annotateNonPowerSymbols )
3459 if( annotatePowerSymbols )
3476 sheetGroup->
SetName( designBlock->GetLibId().GetLibItemName() );
3483 c.
Push( isDrawSheetCopy ?
"Import Sheet Copy" :
"Draw Sheet" );
3490 if( ( isDrawSheetCopy || isDrawSheetFromDesignBlock )
3517 evt->SetPassEvent();
3526 m_frame->SetMsgPanel( sheet );
3542 evt->SetPassEvent();
3574 if( !sheetPaths.size() )
3578 m_frame, std::move( sheetPaths ),
3579 std::make_shared<SHEET_SYNCHRONIZATION_AGENT>(
3589 commit.
Push(
_(
"Modify sheet pin" ) );
3595 commit.
Push(
_(
"Modify schematic item" ) );
3606 selectionTool->AddItemToSel( aItem,
true );
3611 std::set<EDA_ITEM*> aTemplates )
3684 if( labels.empty() )
3688 m_statusPopup->SetText(
_(
"No new hierarchical labels found." ) );
3702 SCH_ITEM* lastPlacedLabel =
nullptr;
3704 auto calculatePositionForLabel =
3715 int currentWidth = currentLabel->GetBoundingBox().GetWidth();
3716 int currentHeight = currentLabel->GetBoundingBox().GetHeight();
3720 return { lastX + lastWidth, lastY };
3731 if( !lastPlacedLabel )
3733 std::vector<SCH_SHEET_PIN*> existingPins = sheet->
GetPins();
3735 if( !existingPins.empty() )
3737 std::sort( existingPins.begin(), existingPins.end(),
3740 return ( a->GetPosition().x < b->GetPosition().x )
3741 || ( a->GetPosition().x == b->GetPosition().x
3742 && a->GetPosition().y < b->GetPosition().y );
3745 lastPlacedLabel = existingPins.back();
3749 cursorPos = calculatePositionForLabel( lastPlacedLabel, label );
3766 commit.
Push(
_(
"Add Sheet Pin" ) );
3768 lastPlacedLabel = item;
3778 static const std::function<void( std::list<SCH_SHEET_PATH>&,
SCH_SCREEN*, std::set<SCH_SCREEN*>&,
3780 []( std::list<SCH_SHEET_PATH>& aPaths,
SCH_SCREEN* aScene, std::set<SCH_SCREEN*>& aVisited,
3783 if( ! aScene || aVisited.find(aScene) != aVisited.end() )
3786 std::vector<SCH_ITEM*> sheetChildren;
3787 aScene->GetSheets( &sheetChildren );
3788 aVisited.insert( aScene );
3790 for(
SCH_ITEM* child : sheetChildren )
3795 aPaths.push_back( cp );
3796 getSheetChildren( aPaths, sheet->
GetScreen(), aVisited, cp );
3800 std::list<SCH_SHEET_PATH> sheetPaths;
3801 std::set<SCH_SCREEN*> visited;
3804 std::vector<SCH_SHEET*> topLevelSheets =
m_frame->Schematic().GetTopLevelSheets();
3806 for(
SCH_SHEET* topSheet : topLevelSheets )
3808 if( topSheet && topSheet->GetScreen() )
3812 getSheetChildren( sheetPaths, topSheet->GetScreen(), visited, current );
3816 if( sheetPaths.size() == 0 )
3818 m_frame->ShowInfoBarMsg(
_(
"No sub schematic found in the current project" ) );
3833 std::vector<SCH_HIERLABEL*> labels;
3838 labels.push_back( label );
3841 std::sort( labels.begin(), labels.end(),
3844 return StrNumCmp( label1->GetText(), label2->GetText(), true ) < 0;
3849 if( !aSheet->
HasPin( label->GetText() ) )
3862 std::vector<SCH_HIERLABEL*> labels;
3869 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 wxString GetFriendlyName() const
virtual EDA_ITEM * Clone() const
Create a duplicate of this item with linked list members set to NULL.
virtual void SetParent(EDA_ITEM *aParent)
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
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 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 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 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 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.
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 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.
@ SYMBOL_FILTER_NON_POWER
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.
std::vector< std::vector< std::string > > table
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.