KiCad PCB EDA Suite
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
sch_editor_control.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2019-2023 CERN
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
26
27#include <clipboard.h>
28#include <confirm.h>
29#include <connection_graph.h>
39#include <project_rescue.h>
40#include <erc/erc.h>
41#include <invoke_sch_dialog.h>
42#include <string_utils.h>
43#include <kiway.h>
45#include <paths.h>
46#include <pgm_base.h>
49#include <project_sch.h>
50#include <sch_edit_frame.h>
52#include <sch_bitmap.h>
53#include <sch_line.h>
54#include <sch_junction.h>
55#include <sch_bus_entry.h>
56#include <sch_shape.h>
57#include <sch_painter.h>
58#include <sch_sheet_pin.h>
59#include <sch_commit.h>
60#include <sim/simulator_frame.h>
61#include <symbol_lib_table.h>
62#include <symbol_library.h>
64#include <symbol_viewer_frame.h>
65#include <tool/picker_tool.h>
66#include <tool/tool_manager.h>
67#include <tools/sch_actions.h>
68#include <tools/sch_selection.h>
73#include <eda_list_dialog.h>
74#include <view/view_controls.h>
76#include <wx_filename.h>
77#include <wx/filedlg.h>
78#include <wx/log.h>
79#include <wx/treectrl.h>
80#include <wx/msgdlg.h>
83
84#ifdef KICAD_IPC_API
86#endif
87
88
94static const wxChar traceSchPaste[] = wxT( "KICAD_SCH_PASTE" );
95
96
98{
100 return 0;
101}
102
103
105{
107 return 0;
108}
109
110
112{
114 return 0;
115}
116
117
119{
120 m_frame->SaveProject( true );
121 return 0;
122}
123
124
126{
127 SCH_SHEET* curr_sheet = m_frame->GetCurrentSheet().Last();
128 wxFileName curr_fn = curr_sheet->GetFileName();
129 wxFileDialog dlg( m_frame, _( "Schematic Files" ), curr_fn.GetPath(), curr_fn.GetFullName(),
131 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
132
133 if( dlg.ShowModal() == wxID_CANCEL )
134 return false;
135
136 wxString newFilename =
138
139 m_frame->saveSchematicFile( curr_sheet, newFilename );
140 return 0;
141}
142
143
145{
146 SCHEMATIC& schematic = m_frame->Schematic();
147 SCH_SHEET& root = schematic.Root();
148
149 if( m_frame->GetCurrentSheet().Last() != &root )
150 {
151 SCH_SHEET_PATH rootSheetPath;
152 rootSheetPath.push_back( &root );
153
155 &rootSheetPath );
156 wxSafeYield();
157 }
158
159 wxString msg;
160 msg.Printf( _( "Revert '%s' (and all sub-sheets) to last version saved?" ),
161 schematic.GetFileName() );
162
163 if( !IsOK( m_frame, msg ) )
164 return false;
165
166 SCH_SCREENS screenList( schematic.Root() );
167
168 for( SCH_SCREEN* screen = screenList.GetFirst(); screen; screen = screenList.GetNext() )
169 screen->SetContentModified( false ); // do not prompt the user for changes
170
172 m_frame->OpenProjectFiles( std::vector<wxString>( 1, schematic.GetFileName() ), KICTL_REVERT );
173
174 return 0;
175}
176
177
179{
181 return 0;
182}
183
184
186{
187 PICKED_ITEMS_LIST undoCmd;
189 ITEM_PICKER wrapper( m_frame->GetScreen(), undoItem, UNDO_REDO::PAGESETTINGS );
190
191 undoCmd.PushItem( wrapper );
192 undoCmd.SetDescription( _( "Page Settings" ) );
193 m_frame->SaveCopyInUndoList( undoCmd, UNDO_REDO::PAGESETTINGS, false, false );
194
198
199 if( dlg.ShowModal() == wxID_OK )
200 {
201 // Update text variables
205
206 m_frame->OnModify();
207 }
208 else
209 {
211 }
212
213 return 0;
214}
215
216
218{
219 SCH_SCREENS schematic( m_frame->Schematic().Root() );
220
221 if( schematic.HasNoFullyDefinedLibIds() )
222 RescueLegacyProject( true );
223 else
225
226 return 0;
227}
228
229
230bool SCH_EDITOR_CONTROL::RescueLegacyProject( bool aRunningOnDemand )
231{
234
235 return rescueProject( rescuer, aRunningOnDemand );
236}
237
238
240{
244
245 return rescueProject( rescuer, aRunningOnDemand );
246}
247
248
249bool SCH_EDITOR_CONTROL::rescueProject( RESCUER& aRescuer, bool aRunningOnDemand )
250{
251 if( !RESCUER::RescueProject( m_frame, aRescuer, aRunningOnDemand ) )
252 return false;
253
254 if( aRescuer.GetCandidateCount() )
255 {
256 KIWAY_PLAYER* viewer = m_frame->Kiway().Player( FRAME_SCH_VIEWER, false );
257
258 if( viewer )
259 static_cast<SYMBOL_VIEWER_FRAME*>( viewer )->ReCreateLibList();
260
261 if( aRunningOnDemand )
262 {
263 SCH_SCREENS schematic( m_frame->Schematic().Root() );
264
265 schematic.UpdateSymbolLinks();
267 }
268
270 m_frame->SyncView();
272 m_frame->OnModify();
273 }
274
275 return true;
276}
277
278
280{
281 DIALOG_SYMBOL_REMAP dlgRemap( m_frame );
282
283 dlgRemap.ShowQuasiModal();
284
285 m_frame->GetCanvas()->Refresh( true );
286
287 return 0;
288}
289
290
292{
293 DIALOG_PRINT dlg( m_frame );
294
295 dlg.ShowModal();
296
297 return 0;
298}
299
300
302{
304
305 dlg.ShowModal();
306
307 // save project config if the prj config has changed:
308 if( dlg.PrjConfigChanged() )
309 m_frame->OnModify();
310
311 return 0;
312}
313
314
316{
317 m_frame->Close( false );
318 return 0;
319}
320
321
323{
324 doCrossProbeSchToPcb( aEvent, false );
325 return 0;
326}
327
328
330{
331 doCrossProbeSchToPcb( aEvent, true );
332 return 0;
333}
334
335
336void SCH_EDITOR_CONTROL::doCrossProbeSchToPcb( const TOOL_EVENT& aEvent, bool aForce )
337{
338 // Don't get in an infinite loop SCH -> PCB -> SCH -> PCB -> SCH -> ...
340 return;
341
343 SCH_SELECTION& selection = aForce ? selTool->RequestSelection() : selTool->GetSelection();
344
345 m_frame->SendSelectItemsToPcb( selection.GetItemsSortedBySelectionOrder(), aForce );
346}
347
348
350{
351 bool savePowerSymbols = IsOK( m_frame,
352 _( "Include power symbols in schematic to the library?" ) );
353
354 bool createNew = aEvent.IsAction( &SCH_ACTIONS::exportSymbolsToNewLibrary );
355
357 SCH_REFERENCE_LIST symbols;
358 sheets.GetSymbols( symbols, savePowerSymbols );
359
360 std::map<LIB_ID, LIB_SYMBOL*> libSymbols;
361 std::map<LIB_ID, std::vector<SCH_SYMBOL*>> symbolMap;
362
363 for( size_t i = 0; i < symbols.GetCount(); ++i )
364 {
365 SCH_SYMBOL* symbol = symbols[i].GetSymbol();
366 LIB_SYMBOL* libSymbol = symbol->GetLibSymbolRef().get();
367 LIB_ID id = libSymbol->GetLibId();
368
369 if( libSymbols.count( id ) )
370 {
371 wxASSERT_MSG( libSymbols[id]->Compare( *libSymbol, SCH_ITEM::COMPARE_FLAGS::ERC ) == 0,
372 "Two symbols have the same LIB_ID but are different!" );
373 }
374 else
375 {
376 libSymbols[id] = libSymbol;
377 }
378
379 symbolMap[id].emplace_back( symbol );
380 }
381
383
384 wxString targetLib;
385
386 if( createNew )
387 {
388 wxFileName fn;
390
391 if( !libTable ) // Cancelled by user
392 return 0;
393
396 ( libTable == &SYMBOL_LIB_TABLE::GetGlobalLibTable() ),
398 {
399 return 0;
400 }
401
402 targetLib = fn.GetName();
403
404 if( libTable->HasLibrary( targetLib, false ) )
405 {
406 DisplayError( m_frame, wxString::Format( _( "Library '%s' already exists." ),
407 targetLib ) );
408 return 0;
409 }
410
411 // if the "new" library is in fact an existing library and the used asked for replacing
412 // it by the recreated lib, erase it:
413 if( fn.FileExists() )
414 wxRemoveFile( fn.GetFullPath() );
415
416 if( !mgr.CreateLibrary( fn.GetFullPath(), *libTable ) )
417 {
418 DisplayError( m_frame, wxString::Format( _( "Could not add library '%s'." ),
419 targetLib ) );
420 return 0;
421 }
422 }
423 else
424 {
425 targetLib = m_frame->SelectLibraryFromList();
426 }
427
428 if( targetLib.IsEmpty() )
429 return 0;
430
431 bool map = IsOK( m_frame, _( "Update symbols in schematic to refer to new library?" ) );
432 bool append = false;
433
434 SCH_COMMIT commit( m_frame );
435 SYMBOL_LIB_TABLE_ROW* row = mgr.GetLibrary( targetLib );
436 SCH_IO_MGR::SCH_FILE_T type = SCH_IO_MGR::EnumFromStr( row->GetType() );
437 IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( type ) );
438
439 wxFileName dest = row->GetFullURI( true );
440 dest.Normalize( FN_NORMALIZE_FLAGS | wxPATH_NORM_ENV_VARS );
441
442 for( const std::pair<const LIB_ID, LIB_SYMBOL*>& it : libSymbols )
443 {
444 LIB_SYMBOL* origSym = it.second;
445 LIB_SYMBOL* newSym = origSym->Flatten().release();
446
447 try
448 {
449 pi->SaveSymbol( dest.GetFullPath(), newSym );
450 }
451 catch( const IO_ERROR& ioe )
452 {
453 wxString msg;
454 msg.Printf( _( "Error saving symbol %s to library '%s'." ),
455 newSym->GetName(), row->GetNickName() );
456 msg += wxS( "\n\n" ) + ioe.What();
457 wxLogWarning( msg );
458 return 0;
459 }
460
461 if( map )
462 {
463 LIB_ID id = it.first;
464 id.SetLibNickname( targetLib );
465
466 for( SCH_SYMBOL* symbol : symbolMap[it.first] )
467 {
468 SCH_SCREEN* parentScreen = static_cast<SCH_SCREEN*>( symbol->GetParent() );
469
470 wxCHECK2( parentScreen, continue );
471
472 commit.Modify( symbol, parentScreen );
473 symbol->SetLibId( id );
474 append = true;
475 }
476 }
477 }
478
479 // Save the modified symbol library table. We need to look this up by name in each table to find
480 // whether the new library is a global or project entity as the code above to choose the library
481 // returns a different type depending on whether a global or project library is chosen.
483 SYMBOL_LIB_TABLE* projectTable = nullptr;
484
485 if( !m_frame->Prj().IsNullProject() )
486 projectTable = PROJECT_SCH::SchSymbolLibTable( &m_frame->Prj() );
487
488 if( globalTable->FindRow( targetLib ) )
489 {
490 try
491 {
492 wxString globalTablePath = SYMBOL_LIB_TABLE::GetGlobalTableFileName();
493 globalTable->Save( globalTablePath );
494 }
495 catch( const IO_ERROR& ioe )
496 {
497 wxString msg;
498 msg.Printf( _( "Error saving global library table:\n\n%s" ), ioe.What() );
499 wxMessageBox( msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
500 }
501 }
502 else if( projectTable && projectTable->FindRow( targetLib ) )
503 {
504 try
505 {
506 wxString projectPath = m_frame->Prj().GetProjectPath();
507 wxFileName projectTableFn( projectPath, SYMBOL_LIB_TABLE::GetSymbolLibTableFileName() );
508 projectTable->Save( projectTableFn.GetFullPath() );
509 }
510 catch( const IO_ERROR& ioe )
511 {
512 wxString msg;
513 msg.Printf( _( "Error saving project-specific library table:\n\n%s" ), ioe.What() );
514 wxMessageBox( msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
515 }
516 }
517
518 if( append )
519 {
520 std::set<SCH_SCREEN*> processedScreens;
521
522 for( SCH_SHEET_PATH& sheet : sheets )
523 {
524 SCH_SCREEN* screen = sheet.LastScreen();
525
526 if( processedScreens.find( ( screen ) ) == processedScreens.end() )
527 {
528 processedScreens.insert( screen );
529 screen->UpdateSymbolLinks();
530 }
531 }
532
533 commit.Push( wxS( "Update Library Identifiers" ) );
534 }
535
536 return 0;
537}
538
539
540#define HITTEST_THRESHOLD_PIXELS 5
541
543{
545 KIWAY_PLAYER* player = m_frame->Kiway().Player( FRAME_SIMULATOR, false );
546 SIMULATOR_FRAME* simFrame = static_cast<SIMULATOR_FRAME*>( player );
547
548 if( !simFrame ) // Defensive coding; shouldn't happen.
549 return 0;
550
551 if( wxWindow* blocking_win = simFrame->Kiway().GetBlockingDialog() )
552 blocking_win->Close( true );
553
554 // Deactivate other tools; particularly important if another PICKER is currently running
555 Activate();
556
557 picker->SetCursor( KICURSOR::VOLTAGE_PROBE );
558 picker->SetSnapping( false );
559
560 picker->SetClickHandler(
561 [this, simFrame]( const VECTOR2D& aPosition )
562 {
564
565 // We do not really want to keep an item selected in schematic,
566 // so clear the current selection
567 selTool->ClearSelection();
568
569 EDA_ITEM* item = selTool->GetNode( aPosition );
571
572 if( !item )
573 return false;
574
575 if( item->Type() == SCH_PIN_T )
576 {
577 try
578 {
579 SCH_PIN* pin = static_cast<SCH_PIN*>( item )->GetLibPin();
580 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item->GetParent() );
581
582 WX_STRING_REPORTER reporter;
583 SIM_LIB_MGR mgr( &m_frame->Prj(), &m_frame->Schematic() );
584
585 SIM_MODEL& model = mgr.CreateModel( &sheet, *symbol, reporter ).model;
586
587 if( reporter.HasMessage() )
588 THROW_IO_ERROR( reporter.GetMessages() );
589
590 SPICE_ITEM spiceItem;
591 spiceItem.refName = symbol->GetRef( &sheet ).ToStdString();
592 std::vector<std::string> currentNames =
593 model.SpiceGenerator().CurrentNames( spiceItem );
594
595 if( currentNames.size() == 0 )
596 {
597 return true;
598 }
599 else if( currentNames.size() == 1 )
600 {
601 simFrame->AddCurrentTrace( currentNames.at( 0 ) );
602 return true;
603 }
604
605 int modelPinIndex = model.FindModelPinIndex( pin->GetNumber().ToStdString() );
606
607 if( modelPinIndex != SIM_MODEL_PIN::NOT_CONNECTED )
608 {
609 wxString name = currentNames.at( modelPinIndex );
610 simFrame->AddCurrentTrace( name );
611 }
612 }
613 catch( const IO_ERROR& e )
614 {
616 }
617 }
618 else if( item->IsType( { SCH_ITEM_LOCATE_WIRE_T } )
619 || item->IsType( { SCH_JUNCTION_T } ) )
620 {
621 if( SCH_CONNECTION* conn = static_cast<SCH_ITEM*>( item )->Connection() )
622 {
623 wxString spiceNet = UnescapeString( conn->Name() );
625
626 simFrame->AddVoltageTrace( wxString::Format( "V(%s)", spiceNet ) );
627 }
628 }
629
630 return true;
631 } );
632
633 picker->SetMotionHandler(
634 [this, picker]( const VECTOR2D& aPos )
635 {
636 SCH_COLLECTOR collector;
637 collector.m_Threshold = KiROUND( getView()->ToWorld( HITTEST_THRESHOLD_PIXELS ) );
638 collector.Collect( m_frame->GetScreen(), { SCH_ITEM_LOCATE_WIRE_T,
639 SCH_PIN_T,
640 SCH_SHEET_PIN_T }, aPos );
641
643 selectionTool->GuessSelectionCandidates( collector, aPos );
644
645 EDA_ITEM* item = collector.GetCount() == 1 ? collector[ 0 ] : nullptr;
646 SCH_LINE* wire = dynamic_cast<SCH_LINE*>( item );
647
648 const SCH_CONNECTION* conn = nullptr;
649
650 if( wire )
651 {
652 item = nullptr;
653 conn = wire->Connection();
654 }
655
656 if( item && item->Type() == SCH_PIN_T )
657 picker->SetCursor( KICURSOR::CURRENT_PROBE );
658 else
659 picker->SetCursor( KICURSOR::VOLTAGE_PROBE );
660
661 if( m_pickerItem != item )
662 {
663 if( m_pickerItem )
664 selectionTool->UnbrightenItem( m_pickerItem );
665
666 m_pickerItem = item;
667
668 if( m_pickerItem )
669 selectionTool->BrightenItem( m_pickerItem );
670 }
671
672 wxString connectionName = ( conn ) ? conn->Name() : wxString( wxS( "" ) );
673
674 if( m_frame->GetHighlightedConnection() != connectionName )
675 {
676 m_frame->SetHighlightedConnection( connectionName );
677
678 TOOL_EVENT dummyEvent;
679 UpdateNetHighlighting( dummyEvent );
680 }
681 } );
682
683 picker->SetFinalizeHandler(
684 [this]( const int& aFinalState )
685 {
686 if( m_pickerItem )
687 m_toolMgr->GetTool<SCH_SELECTION_TOOL>()->UnbrightenItem( m_pickerItem );
688
689 if( !m_frame->GetHighlightedConnection().IsEmpty() )
690 {
691 m_frame->SetHighlightedConnection( wxEmptyString );
692
693 TOOL_EVENT dummyEvent;
694 UpdateNetHighlighting( dummyEvent );
695 }
696
697 // Wake the selection tool after exiting to ensure the cursor gets updated
698 // and deselect previous selection from simulator to avoid any issue
699 // ( avoid crash in some cases when the SimProbe tool is deselected )
701 selectionTool->ClearSelection();
703 } );
704
706
707 return 0;
708}
709
710
712{
714
715 // Deactivate other tools; particularly important if another PICKER is currently running
716 Activate();
717
718 picker->SetCursor( KICURSOR::TUNE );
719 picker->SetSnapping( false );
720
721 picker->SetClickHandler(
722 [this]( const VECTOR2D& aPosition )
723 {
725 EDA_ITEM* item = nullptr;
726 selTool->SelectPoint( aPosition, { SCH_SYMBOL_T, SCH_FIELD_T }, &item );
727
728 if( !item )
729 return false;
730
731 if( item->Type() != SCH_SYMBOL_T )
732 {
733 item = item->GetParent();
734
735 if( item->Type() != SCH_SYMBOL_T )
736 return false;
737 }
738
739 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
740 SCH_SHEET_PATH sheetPath = symbol->Schematic()->CurrentSheet();
741 KIWAY_PLAYER* simFrame = m_frame->Kiway().Player( FRAME_SIMULATOR, false );
742
743 if( simFrame )
744 {
745 if( wxWindow* blocking_win = simFrame->Kiway().GetBlockingDialog() )
746 blocking_win->Close( true );
747
748 static_cast<SIMULATOR_FRAME*>( simFrame )->AddTuner( sheetPath, symbol );
749 }
750
751 // We do not really want to keep a symbol selected in schematic,
752 // so clear the current selection
753 selTool->ClearSelection();
754 return true;
755 } );
756
757 picker->SetMotionHandler(
758 [this]( const VECTOR2D& aPos )
759 {
760 SCH_COLLECTOR collector;
761 collector.m_Threshold = KiROUND( getView()->ToWorld( HITTEST_THRESHOLD_PIXELS ) );
762 collector.Collect( m_frame->GetScreen(), { SCH_SYMBOL_T, SCH_FIELD_T }, aPos );
763
765 selectionTool->GuessSelectionCandidates( collector, aPos );
766
767 EDA_ITEM* item = collector.GetCount() == 1 ? collector[ 0 ] : nullptr;
768
769 if( item && item->Type() == SCH_FIELD_T )
770 item = static_cast<SCH_FIELD*>( item )->GetParentSymbol();
771
772 if( m_pickerItem != item )
773 {
774 if( m_pickerItem )
775 selectionTool->UnbrightenItem( m_pickerItem );
776
777 m_pickerItem = item;
778
779 if( m_pickerItem )
780 selectionTool->BrightenItem( m_pickerItem );
781 }
782 } );
783
784 picker->SetFinalizeHandler(
785 [this]( const int& aFinalState )
786 {
787 if( m_pickerItem )
788 m_toolMgr->GetTool<SCH_SELECTION_TOOL>()->UnbrightenItem( m_pickerItem );
789
790 // Wake the selection tool after exiting to ensure the cursor gets updated
791 // and deselect previous selection from simulator to avoid any issue
792 // ( avoid crash in some cases when the SimTune tool is deselected )
794 selectionTool->ClearSelection();
796 } );
797
799
800 return 0;
801}
802
803
804// A singleton reference for clearing the highlight
806
807
808static bool highlightNet( TOOL_MANAGER* aToolMgr, const VECTOR2D& aPosition )
809{
810 SCH_EDIT_FRAME* editFrame = static_cast<SCH_EDIT_FRAME*>( aToolMgr->GetToolHolder() );
811 SCH_SELECTION_TOOL* selTool = aToolMgr->GetTool<SCH_SELECTION_TOOL>();
812 SCH_EDITOR_CONTROL* editorControl = aToolMgr->GetTool<SCH_EDITOR_CONTROL>();
813 SCH_CONNECTION* conn = nullptr;
814 SCH_ITEM* item = nullptr;
815 bool retVal = true;
816
817 if( aPosition != CLEAR )
818 {
819 ERC_TESTER erc( &editFrame->Schematic() );
820
821 if( erc.TestDuplicateSheetNames( false ) > 0 )
822 {
823 wxMessageBox( _( "Error: duplicate sub-sheet names found in current sheet." ) );
824 retVal = false;
825 }
826 else
827 {
828 item = static_cast<SCH_ITEM*>( selTool->GetNode( aPosition ) );
829 SCH_SYMBOL* symbol = dynamic_cast<SCH_SYMBOL*>( item );
830
831 if( item )
832 {
833 if( item->IsConnectivityDirty() )
834 editFrame->RecalculateConnections( nullptr, NO_CLEANUP );
835
836 if( item->Type() == SCH_FIELD_T )
837 symbol = dynamic_cast<SCH_SYMBOL*>( item->GetParent() );
838
839 if( symbol && symbol->GetLibSymbolRef() && symbol->GetLibSymbolRef()->IsPower() )
840 {
841 std::vector<SCH_PIN*> pins = symbol->GetPins();
842
843 if( pins.size() == 1 )
844 conn = pins[0]->Connection();
845 }
846 else
847 {
848 conn = item->Connection();
849 }
850 }
851 }
852 }
853
854 wxString connName = ( conn ) ? conn->Name() : wxString( wxS( "" ) );
855
856 if( !conn )
857 {
858 editFrame->SetStatusText( wxT( "" ) );
859 editFrame->SendCrossProbeClearHighlight();
860 editFrame->SetHighlightedConnection( wxEmptyString );
861 editorControl->SetHighlightBusMembers( false );
862 }
863 else
864 {
865 NET_NAVIGATOR_ITEM_DATA itemData( editFrame->GetCurrentSheet(), item );
866
867 if( connName != editFrame->GetHighlightedConnection() )
868 {
869 editorControl->SetHighlightBusMembers( false );
870 editFrame->SetCrossProbeConnection( conn );
871 editFrame->SetHighlightedConnection( connName, &itemData );
872 }
873 else
874 {
875 editorControl->SetHighlightBusMembers( !editorControl->GetHighlightBusMembers() );
876
877 if( item != editFrame->GetSelectedNetNavigatorItem() )
878 editFrame->SelectNetNavigatorItem( &itemData );
879 }
880 }
881
882 editFrame->UpdateNetHighlightStatus();
883
885 editorControl->UpdateNetHighlighting( dummy );
886
887 return retVal;
888}
889
890
892{
894 VECTOR2D cursorPos = controls->GetCursorPosition( !aEvent.DisableGridSnapping() );
895
896 highlightNet( m_toolMgr, cursorPos );
897
898 return 0;
899}
900
901
903{
905
906 return 0;
907}
908
909
911{
913 SCHEMATIC& schematic = m_frame->Schematic();
915
916 const SCH_CONNECTION* conn = nullptr;
917 VECTOR2D connPos;
918
919 for( EDA_ITEM* item : selectionTool->GetSelection() )
920 {
921 conn = static_cast<SCH_ITEM*>( item )->Connection();
922 connPos = item->GetPosition();
923
924 if( conn )
925 break;
926 }
927
928 if( !conn )
929 {
930 m_frame->ShowInfoBarError( _( "No net selected." ) );
931 return 0;
932 }
933
934 // Remove selection in favor of highlighting so the whole net is highlighted
935 selectionTool->ClearSelection();
936 highlightNet( m_toolMgr, connPos );
937
938 wxString netName = conn->Name();
939
940 if( conn->IsBus() )
941 {
942 wxString prefix;
943
944 if( NET_SETTINGS::ParseBusVector( netName, &prefix, nullptr ) )
945 {
946 netName = prefix + wxT( "*" );
947 }
948 else if( NET_SETTINGS::ParseBusGroup( netName, &prefix, nullptr ) )
949 {
950 netName = prefix + wxT( ".*" );
951 }
952 }
953 else if( !conn->Driver() || CONNECTION_SUBGRAPH::GetDriverPriority( conn->Driver() )
955 {
956 m_frame->ShowInfoBarError( _( "Net must be labeled to assign a netclass." ) );
958 return 0;
959 }
960
961 DIALOG_ASSIGN_NETCLASS dlg( m_frame, netName, schematic.GetNetClassAssignmentCandidates(),
962 [&]( const std::vector<wxString>& aNetNames )
963 {
964 for( SCH_ITEM* item : screen->Items() )
965 {
966 bool redraw = item->IsBrightened();
967 SCH_CONNECTION* itemConn = item->Connection();
968
969 if( itemConn && alg::contains( aNetNames, itemConn->Name() ) )
970 item->SetBrightened();
971 else
972 item->ClearBrightened();
973
974 redraw |= item->IsBrightened();
975
976 if( item->Type() == SCH_SYMBOL_T )
977 {
978 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
979
980 redraw |= symbol->HasBrightenedPins();
981
982 symbol->ClearBrightenedPins();
983
984 for( SCH_PIN* pin : symbol->GetPins() )
985 {
986 SCH_CONNECTION* pin_conn = pin->Connection();
987
988 if( pin_conn && alg::contains( aNetNames, pin_conn->Name() ) )
989 {
990 pin->SetBrightened();
991 redraw = true;
992 }
993 }
994 }
995 else if( item->Type() == SCH_SHEET_T )
996 {
997 for( SCH_SHEET_PIN* pin : static_cast<SCH_SHEET*>( item )->GetPins() )
998 {
999 SCH_CONNECTION* pin_conn = pin->Connection();
1000
1001 redraw |= pin->IsBrightened();
1002
1003 if( pin_conn && alg::contains( aNetNames, pin_conn->Name() ) )
1004 pin->SetBrightened();
1005 else
1006 pin->ClearBrightened();
1007
1008 redraw |= pin->IsBrightened();
1009 }
1010 }
1011
1012 if( redraw )
1013 getView()->Update( item, KIGFX::VIEW_UPDATE_FLAGS::REPAINT );
1014 }
1015
1017 } );
1018
1019 if( dlg.ShowModal() )
1020 {
1021 getView()->UpdateAllItemsConditionally(
1022 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
1023 {
1024 int flags = 0;
1025
1026 auto invalidateTextVars =
1027 [&flags]( EDA_TEXT* text )
1028 {
1029 if( text->HasTextVars() )
1030 {
1031 text->ClearRenderCache();
1032 text->ClearBoundingBoxCache();
1034 }
1035 };
1036
1037 // Netclass coloured items
1038 //
1039 if( dynamic_cast<SCH_LINE*>( aItem ) )
1040 flags |= KIGFX::REPAINT;
1041 else if( dynamic_cast<SCH_JUNCTION*>( aItem ) )
1042 flags |= KIGFX::REPAINT;
1043 else if( dynamic_cast<SCH_BUS_ENTRY_BASE*>( aItem ) )
1044 flags |= KIGFX::REPAINT;
1045
1046 // Items that might reference an item's netclass name
1047 //
1048 if( SCH_ITEM* item = dynamic_cast<SCH_ITEM*>( aItem ) )
1049 {
1050 item->RunOnChildren(
1051 [&invalidateTextVars]( SCH_ITEM* aChild )
1052 {
1053 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aChild ) )
1054 invalidateTextVars( text );
1055 },
1057
1058 if( flags & KIGFX::GEOMETRY )
1059 m_frame->GetScreen()->Update( item, false ); // Refresh RTree
1060 }
1061
1062 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem ) )
1063 invalidateTextVars( text );
1064
1065 return flags;
1066 } );
1067 }
1068
1069 highlightNet( m_toolMgr, CLEAR );
1070 return 0;
1071}
1072
1073
1075{
1076 wxCHECK( m_frame, 0 );
1077
1078 const SCH_SHEET_PATH& sheetPath = m_frame->GetCurrentSheet();
1080 CONNECTION_GRAPH* connectionGraph = m_frame->Schematic().ConnectionGraph();
1081 wxString selectedName = m_frame->GetHighlightedConnection();
1082
1083 std::set<wxString> connNames;
1084 std::vector<EDA_ITEM*> itemsToRedraw;
1085
1086 wxCHECK( screen && connectionGraph, 0 );
1087
1088 if( !selectedName.IsEmpty() )
1089 {
1090 connNames.emplace( selectedName );
1091
1092 if( CONNECTION_SUBGRAPH* sg =
1093 connectionGraph->FindSubgraphByName( selectedName, sheetPath ) )
1094 {
1096 {
1097 for( const SCH_ITEM* item : sg->GetItems() )
1098 {
1099 wxCHECK2( item, continue );
1100
1101 if( SCH_CONNECTION* connection = item->Connection() )
1102 {
1103 for( const std::shared_ptr<SCH_CONNECTION>& member :
1104 connection->AllMembers() )
1105 {
1106 if( member )
1107 connNames.emplace( member->Name() );
1108 }
1109 }
1110 }
1111 }
1112 }
1113
1114 // Place all bus names that are connected to the selected net in the set, regardless of
1115 // their sheet. This ensures that nets that are connected to a bus on a different sheet
1116 // get their buses highlighted as well.
1117 for( CONNECTION_SUBGRAPH* sg : connectionGraph->GetAllSubgraphs( selectedName ) )
1118 {
1119 for( const auto& [_, bus_sgs] : sg->GetBusParents() )
1120 {
1121 for( CONNECTION_SUBGRAPH* bus_sg : bus_sgs )
1122 {
1123 connNames.emplace( bus_sg->GetNetName() );
1124 }
1125 }
1126
1127 }
1128 }
1129
1130 for( SCH_ITEM* item : screen->Items() )
1131 {
1132 wxCHECK2( item, continue );
1133
1134 if( !item->IsConnectable() )
1135 continue;
1136
1137 SCH_ITEM* redrawItem = nullptr;
1138
1139 if( item->Type() == SCH_SYMBOL_T )
1140 {
1141 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
1142
1143 for( SCH_PIN* pin : symbol->GetPins() )
1144 {
1145 if( SCH_CONNECTION* pin_conn = pin->Connection() )
1146 {
1147 if( !pin->IsBrightened() && connNames.count( pin_conn->Name() ) )
1148 {
1149 pin->SetBrightened();
1150 redrawItem = symbol;
1151 }
1152 else if( pin->IsBrightened() && !connNames.count( pin_conn->Name() ) )
1153 {
1154 pin->ClearBrightened();
1155 redrawItem = symbol;
1156 }
1157 }
1158 }
1159
1160 if( symbol->IsPower() && symbol->GetPins().size() )
1161 {
1162 if( SCH_CONNECTION* pinConn = symbol->GetPins()[0]->Connection() )
1163 {
1164 for( FIELD_T id : { FIELD_T::REFERENCE, FIELD_T::VALUE } )
1165 {
1166 SCH_FIELD* field = symbol->GetField( id );
1167
1168 if( !field->IsVisible() )
1169 continue;
1170
1171 if( !field->IsBrightened() && connNames.count( pinConn->Name() ) )
1172 {
1173 field->SetBrightened();
1174 redrawItem = symbol;
1175 }
1176 else if( field->IsBrightened() && !connNames.count( pinConn->Name() ) )
1177 {
1178 field->ClearBrightened();
1179 redrawItem = symbol;
1180 }
1181 }
1182 }
1183 }
1184 }
1185 else if( item->Type() == SCH_SHEET_T )
1186 {
1187 SCH_SHEET* sheet = static_cast<SCH_SHEET*>( item );
1188
1189 for( SCH_SHEET_PIN* pin : sheet->GetPins() )
1190 {
1191 wxCHECK2( pin, continue );
1192
1193 if( SCH_CONNECTION* pin_conn = pin->Connection() )
1194 {
1195 if( !pin->IsBrightened() && connNames.count( pin_conn->Name() ) )
1196 {
1197 pin->SetBrightened();
1198 redrawItem = sheet;
1199 }
1200 else if( pin->IsBrightened() && !connNames.count( pin_conn->Name() ) )
1201 {
1202 pin->ClearBrightened();
1203 redrawItem = sheet;
1204 }
1205 }
1206 }
1207 }
1208 else
1209 {
1210 if( SCH_CONNECTION* itemConn = item->Connection() )
1211 {
1212 if( !item->IsBrightened() && connNames.count( itemConn->Name() ) )
1213 {
1214 item->SetBrightened();
1215 redrawItem = item;
1216 }
1217 else if( item->IsBrightened() && !connNames.count( itemConn->Name() ) )
1218 {
1219 item->ClearBrightened();
1220 redrawItem = item;
1221 }
1222 }
1223 }
1224
1225 if( redrawItem )
1226 itemsToRedraw.push_back( redrawItem );
1227 }
1228
1229 if( itemsToRedraw.size() )
1230 {
1231 // Be sure highlight change will be redrawn
1232 KIGFX::VIEW* view = getView();
1233
1234 for( EDA_ITEM* redrawItem : itemsToRedraw )
1236
1238 }
1239
1240 return 0;
1241}
1242
1243
1245{
1247
1248 // Deactivate other tools; particularly important if another PICKER is currently running
1249 Activate();
1250
1251 picker->SetCursor( KICURSOR::BULLSEYE );
1252 picker->SetSnapping( false );
1253
1254 picker->SetClickHandler(
1255 [this] ( const VECTOR2D& aPos )
1256 {
1257 return highlightNet( m_toolMgr, aPos );
1258 } );
1259
1261
1262 return 0;
1263}
1264
1265
1267{
1268 wxCHECK( m_frame, 0 );
1269
1270 if( m_frame->GetUndoCommandCount() <= 0 )
1271 return 0;
1272
1273 // Inform tools that undo command was issued
1275
1276 // Get the old list
1278
1279 wxCHECK( undo_list, 0 );
1280
1281 m_frame->PutDataInPreviousState( undo_list );
1282
1283 // Now push the old command to the RedoList
1284 undo_list->ReversePickersListOrder();
1285 m_frame->PushCommandToRedoList( undo_list );
1286
1287 m_toolMgr->GetTool<SCH_SELECTION_TOOL>()->RebuildSelection();
1288
1290 m_frame->OnModify();
1291
1292 return 0;
1293}
1294
1295
1297{
1298 wxCHECK( m_frame, 0 );
1299
1300 if( m_frame->GetRedoCommandCount() == 0 )
1301 return 0;
1302
1303 // Inform tools that undo command was issued
1305
1306 /* Get the old list */
1308
1309 wxCHECK( list, 0 );
1310
1311 /* Redo the command: */
1313
1314 /* Put the old list in UndoList */
1317
1318 m_toolMgr->GetTool<SCH_SELECTION_TOOL>()->RebuildSelection();
1319
1321 m_frame->OnModify();
1322
1323 return 0;
1324}
1325
1326
1327bool SCH_EDITOR_CONTROL::doCopy( bool aUseDuplicateClipboard )
1328{
1330 SCH_SELECTION& selection = selTool->RequestSelection();
1331 SCHEMATIC& schematic = m_frame->Schematic();
1332
1333 if( selection.Empty() )
1334 return false;
1335
1336 if( aUseDuplicateClipboard )
1337 m_duplicateIsHoverSelection = selection.IsHover();
1338
1339 selection.SetScreen( m_frame->GetScreen() );
1341
1342 for( EDA_ITEM* item : selection )
1343 {
1344 if( item->Type() == SCH_SHEET_T )
1345 {
1346 SCH_SHEET* sheet = (SCH_SHEET*) item;
1347 m_supplementaryClipboard[ sheet->GetFileName() ] = sheet->GetScreen();
1348 }
1349 else if( item->Type() == SCH_FIELD_T && selection.IsHover() )
1350 {
1351 // Most of the time the user is trying to duplicate the parent symbol
1352 // and the field text is in it
1353 selection.Add( item->GetParent() );
1354 }
1355 else if( item->Type() == SCH_MARKER_T )
1356 {
1357 // Don't let the markers be copied
1358 selection.Remove( item );
1359 }
1360 }
1361
1362 STRING_FORMATTER formatter;
1363 SCH_IO_KICAD_SEXPR plugin;
1365
1366 plugin.Format( &selection, &selPath, schematic, &formatter, true );
1367
1368 std::string prettyData = formatter.GetString();
1369 KICAD_FORMAT::Prettify( prettyData, true );
1370
1371 if( selection.IsHover() )
1373
1374 if( aUseDuplicateClipboard )
1375 {
1376 m_duplicateClipboard = prettyData;
1377 return true;
1378 }
1379
1380 return SaveClipboard( prettyData );
1381}
1382
1383
1384bool SCH_EDITOR_CONTROL::searchSupplementaryClipboard( const wxString& aSheetFilename,
1385 SCH_SCREEN** aScreen )
1386{
1387 if( m_supplementaryClipboard.count( aSheetFilename ) > 0 )
1388 {
1389 *aScreen = m_supplementaryClipboard[ aSheetFilename ];
1390 return true;
1391 }
1392
1393 return false;
1394}
1395
1396
1398{
1399 doCopy( true ); // Use the local clipboard
1400 Paste( aEvent );
1401
1402 return 0;
1403}
1404
1405
1407{
1408 wxTextEntry* textEntry = dynamic_cast<wxTextEntry*>( wxWindow::FindFocus() );
1409
1410 if( textEntry )
1411 {
1412 textEntry->Cut();
1413 return 0;
1414 }
1415
1416 if( doCopy() )
1418
1419 return 0;
1420}
1421
1422
1424{
1425 wxTextEntry* textEntry = dynamic_cast<wxTextEntry*>( wxWindow::FindFocus() );
1426
1427 if( textEntry )
1428 {
1429 textEntry->Copy();
1430 return 0;
1431 }
1432
1433 doCopy();
1434
1435 return 0;
1436}
1437
1438
1440{
1442 SCH_SELECTION& selection = selTool->RequestSelection();
1443
1444 if( selection.Empty() )
1445 return false;
1446
1447 wxString itemsAsText = GetSelectedItemsAsText( selection );
1448
1449 if( selection.IsHover() )
1451
1452 return SaveClipboard( itemsAsText.ToStdString() );
1453}
1454
1455
1457 const SCH_SHEET_PATH& aPastePath,
1458 const KIID_PATH& aClipPath,
1459 bool aForceKeepAnnotations )
1460{
1461 wxCHECK( m_frame && aSymbol, /* void */ );
1462
1463 SCH_SYMBOL_INSTANCE newInstance;
1464 bool instanceFound = false;
1465 KIID_PATH pasteLookupPath = aClipPath;
1466
1467 m_pastedSymbols.insert( aSymbol );
1468
1469 for( const SCH_SYMBOL_INSTANCE& tmp : aSymbol->GetInstances() )
1470 {
1471 if( ( tmp.m_Path.empty() && aClipPath.empty() )
1472 || ( !aClipPath.empty() && tmp.m_Path.EndsWith( aClipPath ) ) )
1473 {
1474 newInstance = tmp;
1475 instanceFound = true;
1476
1477 wxLogTrace( traceSchPaste,
1478 wxS( "Pasting found symbol instance with reference %s, unit %d:"
1479 "\n\tClipboard path: %s\n\tSymbol UUID: %s." ),
1480 tmp.m_Reference, tmp.m_Unit,
1481 aClipPath.AsString(), aSymbol->m_Uuid.AsString() );
1482
1483 break;
1484 }
1485 }
1486
1487 // The pasted symbol look up paths include the symbol UUID.
1488 pasteLookupPath.push_back( aSymbol->m_Uuid );
1489
1490 if( !instanceFound )
1491 {
1492 wxLogTrace( traceSchPaste,
1493 wxS( "Clipboard symbol instance **not** found:\n\tClipboard path: %s\n\t"
1494 "Symbol UUID: %s." ),
1495 aClipPath.AsString(), aSymbol->m_Uuid.AsString() );
1496
1497 // Some legacy versions saved value fields escaped. While we still do in the symbol
1498 // editor, we don't anymore in the schematic, so be sure to unescape them.
1499 SCH_FIELD* valueField = aSymbol->GetField( FIELD_T::VALUE );
1500 valueField->SetText( UnescapeString( valueField->GetText() ) );
1501
1502 // Pasted from notepad or an older instance of eeschema. Use the values in the fields
1503 // instead.
1504 newInstance.m_Reference = aSymbol->GetField( FIELD_T::REFERENCE )->GetText();
1505 newInstance.m_Unit = aSymbol->GetUnit();
1506 }
1507
1508 newInstance.m_Path = aPastePath.Path();
1509 newInstance.m_ProjectName = m_frame->Prj().GetProjectName();
1510
1511 aSymbol->AddHierarchicalReference( newInstance );
1512
1513 if( !aForceKeepAnnotations )
1514 aSymbol->ClearAnnotation( &aPastePath, false );
1515
1516 // We might clear annotations but always leave the original unit number from the paste.
1517 aSymbol->SetUnit( newInstance.m_Unit );
1518}
1519
1520
1522 const SCH_SHEET_PATH& aPastePath,
1523 const KIID_PATH& aClipPath,
1524 bool aForceKeepAnnotations,
1525 SCH_SHEET_LIST* aPastedSheets,
1526 std::map<SCH_SHEET_PATH,
1527 SCH_REFERENCE_LIST>& aPastedSymbols )
1528{
1529 wxCHECK( aSheet && aPastedSheets, aPastePath );
1530
1531 SCH_SHEET_PATH sheetPath = aPastePath;
1532 sheetPath.push_back( aSheet );
1533
1534 aPastedSheets->push_back( sheetPath );
1535
1536 if( aSheet->GetScreen() == nullptr )
1537 return sheetPath; // We can only really set the page number but not load any items
1538
1539 for( SCH_ITEM* item : aSheet->GetScreen()->Items() )
1540 {
1541 if( item->IsConnectable() )
1542 item->SetConnectivityDirty();
1543
1544 if( item->Type() == SCH_SYMBOL_T )
1545 {
1546 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
1547
1548 wxCHECK2( symbol, continue );
1549
1550 // Only do this once if the symbol is shared across multiple sheets.
1551 if( !m_pastedSymbols.count( symbol ) )
1552 {
1553 for( SCH_PIN* pin : symbol->GetPins() )
1554 {
1555 const_cast<KIID&>( pin->m_Uuid ) = KIID();
1556 pin->SetConnectivityDirty();
1557 }
1558 }
1559
1560 updatePastedSymbol( symbol, sheetPath, aClipPath, aForceKeepAnnotations );
1561 }
1562 else if( item->Type() == SCH_SHEET_T )
1563 {
1564 SCH_SHEET* subsheet = static_cast<SCH_SHEET*>( item );
1565
1566 wxCHECK2( subsheet, continue );
1567
1568 // Make sure pins get a new UUID and set the dirty connectivity flag.
1569 if( !aPastedSheets->ContainsSheet( subsheet ) )
1570 {
1571 for( SCH_SHEET_PIN* pin : subsheet->GetPins() )
1572 {
1573 const_cast<KIID&>( pin->m_Uuid ) = KIID();
1574 pin->SetConnectivityDirty();
1575 }
1576 }
1577
1578 KIID_PATH newClipPath = aClipPath;
1579 newClipPath.push_back( subsheet->m_Uuid );
1580
1581 updatePastedSheet( subsheet, sheetPath, newClipPath, aForceKeepAnnotations,
1582 aPastedSheets, aPastedSymbols );
1583 }
1584 }
1585
1586 sheetPath.GetSymbols( aPastedSymbols[aPastePath] );
1587
1588 return sheetPath;
1589}
1590
1591
1593{
1594 wxCHECK( aScreen, /* void */ );
1595
1596 for( const SCH_ITEM* item : aScreen->Items() )
1597 {
1598 if( item->Type() == SCH_SYMBOL_T )
1599 {
1600 const SCH_SYMBOL* symbol = static_cast<const SCH_SYMBOL*>( item );
1601
1602 wxCHECK2( symbol, continue );
1603
1604 for( const SCH_SYMBOL_INSTANCE& symbolInstance : symbol->GetInstances() )
1605 {
1606 KIID_PATH pathWithSymbol = symbolInstance.m_Path;
1607
1608 pathWithSymbol.push_back( symbol->m_Uuid );
1609
1610 m_clipboardSymbolInstances[pathWithSymbol] = symbolInstance;
1611 }
1612 }
1613 }
1614}
1615
1616
1618{
1619 wxCHECK( m_frame, /* void */ );
1620
1621 for( SCH_SYMBOL* symbol : m_pastedSymbols )
1622 {
1623 wxCHECK2( symbol, continue );
1624
1625 std::vector<KIID_PATH> instancePathsToRemove;
1626
1627 for( const SCH_SYMBOL_INSTANCE& instance : symbol->GetInstances() )
1628 {
1629 if( ( instance.m_ProjectName != m_frame->Prj().GetProjectName() )
1630 || instance.m_Path.empty() )
1631 instancePathsToRemove.emplace_back( instance.m_Path );
1632 }
1633
1634 for( const KIID_PATH& path : instancePathsToRemove )
1635 symbol->RemoveInstance( path );
1636 }
1637}
1638
1639
1641{
1642 wxTextEntry* textEntry = dynamic_cast<wxTextEntry*>( wxWindow::FindFocus() );
1643
1644 if( textEntry )
1645 {
1646 textEntry->Paste();
1647 return 0;
1648 }
1649
1651 std::string content;
1652 VECTOR2I eventPos;
1653
1654 SCH_SHEET tempSheet;
1655 SCH_SCREEN* tempScreen = new SCH_SCREEN( &m_frame->Schematic() );
1656 std::unique_ptr<wxImage> clipImg = GetImageFromClipboard();
1657
1658 if( !aEvent.IsAction( &ACTIONS::duplicate ) && clipImg )
1659 {
1660 // Just image data
1661 auto bitmap = std::make_unique<SCH_BITMAP>();
1662
1663 bool ok = bitmap->GetReferenceImage().SetImage( *clipImg );
1664
1665 if( !ok )
1666 {
1667 delete tempScreen;
1668 return 0;
1669 }
1670
1671 tempScreen->Append( bitmap.release() );
1672 }
1673 else
1674 {
1675 if( aEvent.IsAction( &ACTIONS::duplicate ) )
1676 content = m_duplicateClipboard;
1677 else
1678 content = GetClipboardUTF8();
1679
1680 if( content.empty() )
1681 {
1682 delete tempScreen;
1683 return 0;
1684 }
1685
1686 if( aEvent.IsAction( &ACTIONS::duplicate ) )
1687 eventPos = getViewControls()->GetCursorPosition( false );
1688
1689 STRING_LINE_READER reader( content, "Clipboard" );
1690 SCH_IO_KICAD_SEXPR plugin;
1691
1692 // Screen object on heap is owned by the sheet.
1693 tempSheet.SetScreen( tempScreen );
1694
1695 try
1696 {
1697 plugin.LoadContent( reader, &tempSheet );
1698 }
1699 catch( IO_ERROR& )
1700 {
1701 // If it wasn't content, then paste as a text object.
1702 SCH_TEXT* text_item = new SCH_TEXT( VECTOR2I( 0, 0 ), content );
1703 tempScreen->Append( text_item );
1704 }
1705 }
1706
1707 m_pastedSymbols.clear();
1709
1710 // Save pasted symbol instances in case the user chooses to keep existing symbol annotation.
1711 setPastedSymbolInstances( tempScreen );
1712
1713 tempScreen->MigrateSimModels();
1714
1716 int annotateStartNum = m_frame->Schematic().Settings().m_AnnotateStartNum;
1717
1718 PASTE_MODE pasteMode = PASTE_MODE::UNIQUE_ANNOTATIONS;
1719
1720 if( aEvent.IsAction( &ACTIONS::pasteSpecial ) )
1721 {
1722 DIALOG_PASTE_SPECIAL dlg( m_frame, &pasteMode );
1723
1724 if( dlg.ShowModal() == wxID_CANCEL )
1725 return 0;
1726 }
1727
1728 bool forceKeepAnnotations = pasteMode != PASTE_MODE::REMOVE_ANNOTATIONS;
1729
1730 // SCH_SEXP_PLUGIN added the items to the paste screen, but not to the view or anything
1731 // else. Pull them back out to start with.
1732 SCH_COMMIT commit( m_toolMgr );
1733 EDA_ITEMS loadedItems;
1734 std::vector<SCH_ITEM*> sortedLoadedItems;
1735 bool sheetsPasted = false;
1736 SCH_SHEET_LIST hierarchy = m_frame->Schematic().Hierarchy();
1737 SCH_SHEET_PATH& pasteRoot = m_frame->GetCurrentSheet();
1738 wxFileName destFn = pasteRoot.Last()->GetFileName();
1739
1740 if( destFn.IsRelative() )
1741 destFn.MakeAbsolute( m_frame->Prj().GetProjectPath() );
1742
1743 // List of paths in the hierarchy that refer to the destination sheet of the paste
1744 SCH_SHEET_LIST sheetPathsForScreen = hierarchy.FindAllSheetsForScreen( pasteRoot.LastScreen() );
1745 sheetPathsForScreen.SortByPageNumbers();
1746
1747 // Build a list of screens from the current design (to avoid loading sheets that already exist)
1748 std::map<wxString, SCH_SCREEN*> loadedScreens;
1749
1750 for( const SCH_SHEET_PATH& item : hierarchy )
1751 {
1752 if( item.LastScreen() )
1753 loadedScreens[item.Last()->GetFileName()] = item.LastScreen();
1754 }
1755
1756 // Get set of sheet names in the current schematic to prevent duplicate sheet names on paste.
1757 std::set<wxString> existingSheetNames = pasteRoot.LastScreen()->GetSheetNames();
1758
1759 // Build symbol list for reannotation of duplicates
1760 SCH_REFERENCE_LIST existingRefs;
1761 hierarchy.GetSymbols( existingRefs );
1762 existingRefs.SortByReferenceOnly();
1763
1764 std::set<wxString> existingRefsSet;
1765
1766 for( const SCH_REFERENCE& ref : existingRefs )
1767 existingRefsSet.insert( ref.GetRef() );
1768
1769 // Build UUID map for fetching last-resolved-properties
1770 std::map<KIID, EDA_ITEM*> itemMap;
1771 hierarchy.FillItemMap( itemMap );
1772
1773 // Keep track of pasted sheets and symbols for the different paths to the hierarchy.
1774 std::map<SCH_SHEET_PATH, SCH_REFERENCE_LIST> pastedSymbols;
1775 std::map<SCH_SHEET_PATH, SCH_SHEET_LIST> pastedSheets;
1776
1777 for( SCH_ITEM* item : tempScreen->Items() )
1778 {
1779 if( item->Type() == SCH_SHEET_T )
1780 sortedLoadedItems.push_back( item );
1781 else
1782 loadedItems.push_back( item );
1783 }
1784
1785 sort( sortedLoadedItems.begin(), sortedLoadedItems.end(),
1786 []( SCH_ITEM* firstItem, SCH_ITEM* secondItem )
1787 {
1788 SCH_SHEET* firstSheet = static_cast<SCH_SHEET*>( firstItem );
1789 SCH_SHEET* secondSheet = static_cast<SCH_SHEET*>( secondItem );
1790 return StrNumCmp( firstSheet->GetName(), secondSheet->GetName(), false ) < 0;
1791 });
1792
1793
1794 for( SCH_ITEM* item : sortedLoadedItems )
1795 {
1796 loadedItems.push_back( item );
1797
1798 if( item->Type() == SCH_SHEET_T )
1799 {
1800 SCH_SHEET* sheet = static_cast<SCH_SHEET*>( item );
1801 SCH_FIELD* nameField = sheet->GetField( FIELD_T::SHEET_NAME );
1802 wxString baseName = nameField->GetText();
1803 wxFileName srcFn = sheet->GetFileName();
1804
1805 if( srcFn.IsRelative() )
1806 srcFn.MakeAbsolute( m_frame->Prj().GetProjectPath() );
1807
1808 SCH_SHEET_LIST sheetHierarchy( sheet );
1809
1810 if( hierarchy.TestForRecursion( sheetHierarchy, destFn.GetFullPath( wxPATH_UNIX ) ) )
1811 {
1812 auto msg = wxString::Format( _( "The pasted sheet '%s'\n"
1813 "was dropped because the destination already has "
1814 "the sheet or one of its subsheets as a parent." ),
1815 sheet->GetFileName() );
1816 DisplayError( m_frame, msg );
1817 loadedItems.pop_back();
1818 }
1819 }
1820 }
1821
1822 // Remove the references from our temporary screen to prevent freeing on the DTOR
1823 tempScreen->Clear( false );
1824
1825 for( EDA_ITEM* item : loadedItems )
1826 {
1827 KIID_PATH clipPath( wxT( "/" ) ); // clipboard is at root
1828
1829 SCH_ITEM* schItem = static_cast<SCH_ITEM*>( item );
1830
1831 wxCHECK2( schItem, continue );
1832
1833 if( schItem->IsConnectable() )
1834 schItem->SetConnectivityDirty();
1835
1836 if( item->Type() == SCH_SYMBOL_T )
1837 {
1838 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
1839
1840 // The library symbol gets set from the cached library symbols in the current
1841 // schematic not the symbol libraries. The cached library symbol may have
1842 // changed from the original library symbol which would cause the copy to
1843 // be incorrect.
1844 SCH_SCREEN* currentScreen = m_frame->GetScreen();
1845
1846 wxCHECK2( currentScreen, continue );
1847
1848 auto it = currentScreen->GetLibSymbols().find( symbol->GetSchSymbolLibraryName() );
1849 auto end = currentScreen->GetLibSymbols().end();
1850
1851 if( it == end )
1852 {
1853 // If can't find library definition in the design, use the pasted library
1854 it = tempScreen->GetLibSymbols().find( symbol->GetSchSymbolLibraryName() );
1855 end = tempScreen->GetLibSymbols().end();
1856 }
1857
1858 LIB_SYMBOL* libSymbol = nullptr;
1859
1860 if( it != end )
1861 {
1862 libSymbol = new LIB_SYMBOL( *it->second );
1863 symbol->SetLibSymbol( libSymbol );
1864 }
1865
1866 for( SCH_SHEET_PATH& sheetPath : sheetPathsForScreen )
1867 updatePastedSymbol( symbol, sheetPath, clipPath, forceKeepAnnotations );
1868
1869 // Most modes will need new KIIDs for the symbol and its pins
1870 // However, if we are pasting unique annotations, we need to check if the symbol
1871 // is not already in the hierarchy. If we don't already have a copy of the
1872 // symbol, we just keep the existing KIID data as it is likely the same symbol
1873 // being moved around the schematic
1874 bool needsNewKiid = ( pasteMode != PASTE_MODE::UNIQUE_ANNOTATIONS );
1875
1876 for( const SCH_SYMBOL_INSTANCE& instance : symbol->GetInstances() )
1877 {
1878 if( existingRefsSet.contains( instance.m_Reference ) )
1879 {
1880 needsNewKiid = true;
1881 break;
1882 }
1883 }
1884
1885 if( needsNewKiid )
1886 {
1887 // Assign a new KIID
1888 const_cast<KIID&>( item->m_Uuid ) = KIID();
1889
1890 // Make sure pins get a new UUID
1891 for( SCH_PIN* pin : symbol->GetPins() )
1892 {
1893 const_cast<KIID&>( pin->m_Uuid ) = KIID();
1894 pin->SetConnectivityDirty();
1895 }
1896 }
1897
1898 for( SCH_SHEET_PATH& sheetPath : sheetPathsForScreen )
1899 {
1900 // Ignore symbols from a non-existant library.
1901 if( libSymbol )
1902 {
1903 SCH_REFERENCE schReference( symbol, sheetPath );
1904 schReference.SetSheetNumber( sheetPath.GetVirtualPageNumber() );
1905 pastedSymbols[sheetPath].AddItem( schReference );
1906 }
1907 }
1908 }
1909 else if( item->Type() == SCH_SHEET_T )
1910 {
1911 SCH_SHEET* sheet = (SCH_SHEET*) item;
1912 SCH_FIELD* nameField = sheet->GetField( FIELD_T::SHEET_NAME );
1913 wxString baseName = nameField->GetText();
1914 wxString candidateName = baseName;
1915 wxString number;
1916
1917 while( !baseName.IsEmpty() && wxIsdigit( baseName.Last() ) )
1918 {
1919 number = baseName.Last() + number;
1920 baseName.RemoveLast();
1921 }
1922
1923 // Update hierarchy to include any other sheets we already added, avoiding
1924 // duplicate sheet names
1925 hierarchy = m_frame->Schematic().Hierarchy();
1926
1927 int uniquifier = std::max( 0, wxAtoi( number ) ) + 1;
1928
1929 while( existingSheetNames.count( candidateName ) )
1930 candidateName = wxString::Format( wxT( "%s%d" ), baseName, uniquifier++ );
1931
1932 nameField->SetText( candidateName );
1933 existingSheetNames.emplace( candidateName );
1934
1935 wxFileName fn = sheet->GetFileName();
1936 SCH_SCREEN* existingScreen = nullptr;
1937
1938 sheet->SetParent( pasteRoot.Last() );
1939 sheet->SetScreen( nullptr );
1940
1941 if( !fn.IsAbsolute() )
1942 {
1943 wxFileName currentSheetFileName = pasteRoot.LastScreen()->GetFileName();
1944 fn.Normalize( FN_NORMALIZE_FLAGS | wxPATH_NORM_ENV_VARS,
1945 currentSheetFileName.GetPath() );
1946 }
1947
1948 // Try to find the screen for the pasted sheet by several means
1949 if( !m_frame->Schematic().Root().SearchHierarchy( fn.GetFullPath( wxPATH_UNIX ),
1950 &existingScreen ) )
1951 {
1952 if( loadedScreens.count( sheet->GetFileName() ) > 0 )
1953 existingScreen = loadedScreens.at( sheet->GetFileName() );
1954 else
1955 searchSupplementaryClipboard( sheet->GetFileName(), &existingScreen );
1956 }
1957
1958 if( existingScreen )
1959 {
1960 sheet->SetScreen( existingScreen );
1961 }
1962 else
1963 {
1964 if( !m_frame->LoadSheetFromFile( sheet, &pasteRoot, fn.GetFullPath() ) )
1965 m_frame->InitSheet( sheet, sheet->GetFileName() );
1966 }
1967
1968 // Save the symbol instances in case the user chooses to keep the existing
1969 // symbol annotation.
1971 sheetsPasted = true;
1972
1973 // Push it to the clipboard path while it still has its old KIID
1974 clipPath.push_back( sheet->m_Uuid );
1975
1976 // Assign a new KIID to the pasted sheet
1977 const_cast<KIID&>( sheet->m_Uuid ) = KIID();
1978
1979 // Make sure pins get a new UUID
1980 for( SCH_SHEET_PIN* pin : sheet->GetPins() )
1981 {
1982 const_cast<KIID&>( pin->m_Uuid ) = KIID();
1983 pin->SetConnectivityDirty();
1984 }
1985
1986 // Once we have our new KIID we can update all pasted instances. This will either
1987 // reset the annotations or copy "kept" annotations from the supplementary clipboard.
1988 for( SCH_SHEET_PATH& sheetPath : sheetPathsForScreen )
1989 {
1990 SCH_SHEET_PATH subPath = updatePastedSheet( sheet, sheetPath, clipPath,
1991 ( forceKeepAnnotations && annotate.automatic ),
1992 &pastedSheets[sheetPath],
1993 pastedSymbols );
1994 }
1995 }
1996 else
1997 {
1998 SCH_ITEM* srcItem = dynamic_cast<SCH_ITEM*>( itemMap[ item->m_Uuid ] );
1999 SCH_ITEM* destItem = dynamic_cast<SCH_ITEM*>( item );
2000
2001 // Everything gets a new KIID
2002 const_cast<KIID&>( item->m_Uuid ) = KIID();
2003
2004 if( srcItem && destItem )
2005 {
2006 destItem->SetConnectivityDirty( true );
2007 destItem->SetLastResolvedState( srcItem );
2008 }
2009 }
2010
2011 // Lines need both ends selected for a move after paste so the whole line moves.
2012 if( item->Type() == SCH_LINE_T )
2013 item->SetFlags( STARTPOINT | ENDPOINT );
2014
2015 item->SetFlags( IS_NEW | IS_PASTED | IS_MOVING );
2016
2017 if( !m_frame->GetScreen()->CheckIfOnDrawList( (SCH_ITEM*) item ) ) // don't want a loop!
2018 m_frame->AddToScreen( item, m_frame->GetScreen() );
2019
2020 commit.Added( (SCH_ITEM*) item, m_frame->GetScreen() );
2021
2022 // Start out hidden so the pasted items aren't "ghosted" in their original location
2023 // before being moved to the current location.
2024 getView()->Hide( item, true );
2025 }
2026
2027 if( sheetsPasted )
2028 {
2029 // The full schematic hierarchy need to be update before assigning new annotation and
2030 // page numbers.
2032
2033 // Update page numbers: Find next free numeric page number
2034 for( SCH_SHEET_PATH& sheetPath : sheetPathsForScreen )
2035 {
2036 for( SCH_SHEET_PATH& pastedSheet : pastedSheets[sheetPath] )
2037 {
2038 int page = 1;
2039 wxString pageNum = wxString::Format( "%d", page );
2040
2041 while( hierarchy.PageNumberExists( pageNum ) )
2042 pageNum = wxString::Format( "%d", ++page );
2043
2044 SCH_SHEET_INSTANCE sheetInstance;
2045
2046 sheetInstance.m_Path = pastedSheet.Path();
2047
2048 // Don't include the actual sheet in the instance path.
2049 sheetInstance.m_Path.pop_back();
2050 sheetInstance.m_PageNumber = pageNum;
2051 sheetInstance.m_ProjectName = m_frame->Prj().GetProjectName();
2052
2053 SCH_SHEET* sheet = pastedSheet.Last();
2054
2055 wxCHECK2( sheet, continue );
2056
2057 sheet->AddInstance( sheetInstance );
2058 hierarchy.push_back( pastedSheet );
2059
2060 // Remove all pasted sheet instance data that is not part of the current project.
2061 std::vector<KIID_PATH> instancesToRemove;
2062
2063 for( const SCH_SHEET_INSTANCE& instance : sheet->GetInstances() )
2064 {
2065 if( !hierarchy.HasPath( instance.m_Path ) )
2066 instancesToRemove.push_back( instance.m_Path );
2067 }
2068
2069 for( const KIID_PATH& instancePath : instancesToRemove )
2070 sheet->RemoveInstance( instancePath );
2071 }
2072 }
2073
2075
2076 // Get a version with correct sheet numbers since we've pasted sheets,
2077 // we'll need this when annotating next
2078 hierarchy = m_frame->Schematic().Hierarchy();
2079 }
2080
2081 std::map<SCH_SHEET_PATH, SCH_REFERENCE_LIST> annotatedSymbols;
2082
2083 // Update the list of symbol instances that satisfy the annotation criteria.
2084 for( const SCH_SHEET_PATH& sheetPath : sheetPathsForScreen )
2085 {
2086 for( size_t i = 0; i < pastedSymbols[sheetPath].GetCount(); i++ )
2087 {
2088 if( pasteMode == PASTE_MODE::UNIQUE_ANNOTATIONS
2089 || pasteMode == PASTE_MODE::RESPECT_OPTIONS
2090 || pastedSymbols[sheetPath][i].AlwaysAnnotate() )
2091 {
2092 annotatedSymbols[sheetPath].AddItem( pastedSymbols[sheetPath][i] );
2093 }
2094 }
2095
2096 for( const SCH_SHEET_PATH& pastedSheetPath : pastedSheets[sheetPath] )
2097 {
2098 for( size_t i = 0; i < pastedSymbols[pastedSheetPath].GetCount(); i++ )
2099 {
2100 if( pasteMode == PASTE_MODE::UNIQUE_ANNOTATIONS
2101 || pasteMode == PASTE_MODE::RESPECT_OPTIONS
2102 || pastedSymbols[pastedSheetPath][i].AlwaysAnnotate() )
2103 {
2104 annotatedSymbols[pastedSheetPath].AddItem( pastedSymbols[pastedSheetPath][i] );
2105 }
2106 }
2107 }
2108 }
2109
2110 if( !annotatedSymbols.empty() )
2111 {
2112 for( SCH_SHEET_PATH& path : sheetPathsForScreen )
2113 {
2114 annotatedSymbols[path].SortByReferenceOnly();
2115
2116 if( pasteMode == PASTE_MODE::UNIQUE_ANNOTATIONS )
2117 {
2118 annotatedSymbols[path].ReannotateDuplicates( existingRefs );
2119 }
2120 else
2121 {
2122 annotatedSymbols[path].ReannotateByOptions( (ANNOTATE_ORDER_T) annotate.sort_order,
2123 (ANNOTATE_ALGO_T) annotate.method,
2124 annotateStartNum, existingRefs, false,
2125 &hierarchy );
2126 }
2127
2128 annotatedSymbols[path].UpdateAnnotation();
2129
2130 // Update existing refs for next iteration
2131 for( size_t i = 0; i < annotatedSymbols[path].GetCount(); i++ )
2132 existingRefs.AddItem( annotatedSymbols[path][i] );
2133
2134 for( const SCH_SHEET_PATH& pastedSheetPath : pastedSheets[path] )
2135 {
2136 annotatedSymbols[pastedSheetPath].SortByReferenceOnly();
2137
2138 if( pasteMode == PASTE_MODE::UNIQUE_ANNOTATIONS )
2139 {
2140 annotatedSymbols[pastedSheetPath].ReannotateDuplicates( existingRefs );
2141 }
2142 else
2143 {
2144 annotatedSymbols[pastedSheetPath].ReannotateByOptions( (ANNOTATE_ORDER_T) annotate.sort_order,
2145 (ANNOTATE_ALGO_T) annotate.method,
2146 annotateStartNum, existingRefs,
2147 false,
2148 &hierarchy );
2149 }
2150
2151 annotatedSymbols[pastedSheetPath].UpdateAnnotation();
2152
2153 // Update existing refs for next iteration
2154 for( size_t i = 0; i < annotatedSymbols[pastedSheetPath].GetCount(); i++ )
2155 existingRefs.AddItem( annotatedSymbols[pastedSheetPath][i] );
2156 }
2157 }
2158 }
2159
2161
2162 // The copy operation creates instance paths that are not valid for the current project or
2163 // saved as part of another project. Prune them now so they do not accumulate in the saved
2164 // schematic file.
2166
2168 SCH_SCREENS allScreens( m_frame->Schematic().Root() );
2169
2170 allScreens.PruneOrphanedSymbolInstances( m_frame->Prj().GetProjectName(), sheets );
2171 allScreens.PruneOrphanedSheetInstances( m_frame->Prj().GetProjectName(), sheets );
2172
2173 // Now clear the previous selection, select the pasted items, and fire up the "move" tool.
2176
2177 SCH_SELECTION& selection = selTool->GetSelection();
2178
2179 if( !selection.Empty() )
2180 {
2181 if( aEvent.IsAction( &ACTIONS::duplicate ) )
2182 {
2183 int closest_dist = INT_MAX;
2184
2185 auto processPt =
2186 [&]( const VECTOR2I& pt )
2187 {
2188 int dist = ( eventPos - pt ).EuclideanNorm();
2189
2190 if( dist < closest_dist )
2191 {
2192 selection.SetReferencePoint( pt );
2193 closest_dist = dist;
2194 }
2195 };
2196
2197 // Prefer connection points (which should remain on grid)
2198 for( EDA_ITEM* item : selection.Items() )
2199 {
2200 SCH_ITEM* sch_item = dynamic_cast<SCH_ITEM*>( item );
2201 SCH_PIN* pin = dynamic_cast<SCH_PIN*>( item );
2202
2203 if( sch_item && sch_item->IsConnectable() )
2204 {
2205 for( const VECTOR2I& pt : sch_item->GetConnectionPoints() )
2206 processPt( pt );
2207 }
2208 else if( pin )
2209 {
2210 processPt( pin->GetPosition() );
2211 }
2212
2213 // Symbols need to have their center point added since often users are trying to
2214 // move parts from their center.
2215 if( dynamic_cast<SCH_SYMBOL*>( item ) )
2216 processPt( item->GetPosition() );
2217 }
2218
2219 // Only process other points if we didn't find any connection points
2220 if( closest_dist == INT_MAX )
2221 {
2222 for( EDA_ITEM* item : selection.Items() )
2223 {
2224 switch( item->Type() )
2225 {
2226 case SCH_LINE_T:
2227 processPt( static_cast<SCH_LINE*>( item )->GetStartPoint() );
2228 processPt( static_cast<SCH_LINE*>( item )->GetEndPoint() );
2229 break;
2230
2231 case SCH_SHAPE_T:
2232 {
2233 SCH_SHAPE* shape = static_cast<SCH_SHAPE*>( item );
2234
2235 switch( shape->GetShape() )
2236 {
2237 case SHAPE_T::RECTANGLE:
2238 for( const VECTOR2I& pt : shape->GetRectCorners() )
2239 processPt( pt );
2240
2241 break;
2242
2243 case SHAPE_T::CIRCLE:
2244 processPt( shape->GetCenter() );
2245 break;
2246
2247 case SHAPE_T::POLY:
2248 for( int ii = 0; ii < shape->GetPolyShape().TotalVertices(); ++ii )
2249 processPt( shape->GetPolyShape().CVertex( ii ) );
2250
2251 break;
2252
2253 default:
2254 processPt( shape->GetStart() );
2255 processPt( shape->GetEnd() );
2256 break;
2257 }
2258
2259 break;
2260 }
2261
2262 default:
2263 processPt( item->GetPosition() );
2264 break;
2265 }
2266 }
2267 }
2268
2269 selection.SetIsHover( m_duplicateIsHoverSelection );
2270 }
2271 else
2272 {
2273 SCH_ITEM* item = static_cast<SCH_ITEM*>( selection.GetTopLeftItem() );
2274
2275 selection.SetReferencePoint( item->GetPosition() );
2276 }
2277
2279 {
2280 // Pushing the commit will update the connectivity.
2281 commit.Push( _( "Paste" ) );
2282
2283 if( sheetsPasted )
2285 // UpdateHierarchyNavigator() will call RefreshNetNavigator()
2286 else
2288 }
2289 else
2290 {
2291 commit.Revert();
2292 }
2293 }
2294
2295 return 0;
2296}
2297
2298
2300{
2302 SCH_SELECTION& selection = selTool->RequestSelection( { SCH_SYMBOL_T } );
2303 SCH_SYMBOL* symbol = nullptr;
2304 SYMBOL_EDIT_FRAME* symbolEditor;
2305
2306 if( selection.GetSize() >= 1 )
2307 symbol = (SCH_SYMBOL*) selection.Front();
2308
2309 if( selection.IsHover() )
2311
2312 if( !symbol )
2313 {
2314 // Giant hack: by default we assign Edit Table to the same hotkey, so give the table
2315 // tool a chance to handle it if we can't.
2317 tableTool->EditTable( aEvent );
2318
2319 return 0;
2320 }
2321
2322 if( symbol->GetEditFlags() != 0 )
2323 return 0;
2324
2325 if( symbol->IsMissingLibSymbol() )
2326 {
2327 m_frame->ShowInfoBarError( _( "Symbols with broken library symbol links cannot "
2328 "be edited." ) );
2329 return 0;
2330 }
2331
2333 symbolEditor = (SYMBOL_EDIT_FRAME*) m_frame->Kiway().Player( FRAME_SCH_SYMBOL_EDITOR, false );
2334
2335 if( symbolEditor )
2336 {
2337 if( wxWindow* blocking_win = symbolEditor->Kiway().GetBlockingDialog() )
2338 blocking_win->Close( true );
2339
2340 if( aEvent.IsAction( &SCH_ACTIONS::editWithLibEdit ) )
2341 {
2342 symbolEditor->LoadSymbolFromSchematic( symbol );
2343 }
2345 {
2346 symbolEditor->LoadSymbol( symbol->GetLibId(), symbol->GetUnit(),
2347 symbol->GetBodyStyle() );
2348
2349 if( !symbolEditor->IsLibraryTreeShown() )
2350 symbolEditor->ToggleLibraryTree();
2351 }
2352 }
2353
2354 return 0;
2355}
2356
2357
2359{
2361 return 0;
2362}
2363
2364
2366{
2368
2369 dlg.SetInitialFocus( dlg.m_FirstRefDes );
2370
2371 if( dlg.ShowModal() == wxID_OK )
2372 {
2373 SCH_REFERENCE startRef;
2374 startRef.SetRef( dlg.m_FirstRefDes->GetValue() );
2375
2376 if( startRef.IsSplitNeeded() )
2377 startRef.Split();
2378 else
2379 return 0;
2380
2381 int startNum = atoi( startRef.GetRefNumber().utf8_string().c_str() );
2382
2383 SCH_COMMIT commit( m_frame );
2384 SCHEMATIC* schematic = m_frame->m_schematic;
2385 SCH_REFERENCE_LIST references;
2386
2387 if( dlg.m_AllSheets->GetValue() )
2388 schematic->Hierarchy().GetSymbols( references );
2389 else
2390 schematic->CurrentSheet().GetSymbols( references );
2391
2392 references.SplitReferences();
2393
2394 for( SCH_REFERENCE& ref : references )
2395 {
2396 if( ref.GetRef() == startRef.GetRef() )
2397 {
2398 int num = atoi( ref.GetRefNumber().utf8_string().c_str() );
2399
2400 if( num >= startNum )
2401 {
2402 const SCH_SHEET_PATH& sheet = ref.GetSheetPath();
2403 wxString fullRef = ref.GetRef();
2404
2405 num += dlg.m_Increment->GetValue();
2406 fullRef << num;
2407
2408 commit.Modify( ref.GetSymbol(), sheet.LastScreen() );
2409 ref.GetSymbol()->SetRef( &sheet, From_UTF8( fullRef.c_str() ) );
2410 }
2411 }
2412 }
2413
2414 if( !commit.Empty() )
2415 commit.Push( _( "Increment Annotations" ) );
2416 }
2417
2418 return 0;
2419}
2420
2421
2423{
2425 return 0;
2426}
2427
2428
2430{
2432
2433 wxCHECK( dlg, 0 );
2434
2435 // Needed at least on Windows. Raise() is not enough
2436 dlg->Show( true );
2437
2438 // Bring it to the top if already open. Dual monitor users need this.
2439 dlg->Raise();
2440
2441 dlg->ShowEditTab();
2442
2443 return 0;
2444}
2445
2446
2448{
2451
2452 return 0;
2453}
2454
2455
2457{
2459 return 0;
2460}
2461
2462
2464{
2466 return 0;
2467}
2468
2469
2471{
2473 dlg.ShowModal();
2474 return 0;
2475}
2476
2477
2479{
2480 int result = NET_PLUGIN_CHANGE;
2481
2482 // If a plugin is removed or added, rebuild and reopen the new dialog
2483 while( result == NET_PLUGIN_CHANGE )
2484 result = InvokeDialogNetList( m_frame );
2485
2486 return 0;
2487}
2488
2489
2491{
2493
2494 wxCHECK( dlg, 0 );
2495
2496 // Needed at least on Windows. Raise() is not enough
2497 dlg->Show( true );
2498
2499 // Bring it to the top if already open. Dual monitor users need this.
2500 dlg->Raise();
2501
2502 dlg->ShowExportTab();
2503
2504 return 0;
2505}
2506
2507
2509{
2511 return 0;
2512}
2513
2514
2516{
2519 return 0;
2520}
2521
2522
2524{
2525 getEditFrame<SCH_EDIT_FRAME>()->ToggleSearch();
2526 return 0;
2527}
2528
2529
2531{
2532 getEditFrame<SCH_EDIT_FRAME>()->ToggleSchematicHierarchy();
2533 return 0;
2534}
2535
2536
2538{
2539 getEditFrame<SCH_EDIT_FRAME>()->ToggleNetNavigator();
2540 return 0;
2541}
2542
2543
2545{
2546 getEditFrame<SCH_EDIT_FRAME>()->ToggleProperties();
2547 return 0;
2548}
2549
2550
2552{
2553 getEditFrame<SCH_EDIT_FRAME>()->ToggleLibraryTree();
2554 return 0;
2555}
2556
2557
2559{
2562
2565
2566 return 0;
2567}
2568
2569
2571{
2574
2577
2578 return 0;
2579}
2580
2581
2583{
2586
2589
2590 return 0;
2591}
2592
2593
2595{
2598
2601
2602 return 0;
2603}
2604
2605
2607{
2610
2613
2614 return 0;
2615}
2616
2617
2619{
2622
2624
2625 return 0;
2626}
2627
2628
2630{
2633
2635 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
2636 {
2637 int flags = 0;
2638
2639 auto invalidateTextVars =
2640 [&flags]( EDA_TEXT* text )
2641 {
2642 if( text->HasTextVars() )
2643 {
2644 text->ClearRenderCache();
2645 text->ClearBoundingBoxCache();
2647 }
2648 };
2649
2650 if( SCH_ITEM* item = dynamic_cast<SCH_ITEM*>( aItem ) )
2651 {
2652 item->RunOnChildren(
2653 [&invalidateTextVars]( SCH_ITEM* aChild )
2654 {
2655 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aChild ) )
2656 invalidateTextVars( text );
2657 },
2658 RECURSE_MODE::NO_RECURSE );
2659
2660 if( item->GetExcludedFromSim() )
2662 }
2663
2664 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem ) )
2665 invalidateTextVars( text );
2666
2667 return flags;
2668 } );
2669
2671
2672 return 0;
2673}
2674
2675
2677{
2680
2684
2685 return 0;
2686}
2687
2688
2690{
2693
2697
2698 return 0;
2699}
2700
2701
2703{
2706
2708
2711
2712 return 0;
2713}
2714
2715
2717{
2720 return 0;
2721}
2722
2723
2725{
2727 m_frame->eeconfig()->m_Drawing.line_mode %= LINE_MODE::LINE_MODE_COUNT;
2729 return 0;
2730}
2731
2732
2734{
2737 return 0;
2738}
2739
2740
2742{
2745 return 0;
2746}
2747
2748
2750{
2751
2753 return 0;
2754}
2755
2756
2758{
2759#ifdef KICAD_IPC_API
2760 if( Pgm().GetCommonSettings()->m_Api.enable_server )
2761 Pgm().GetPluginManager().ReloadPlugins();
2762#endif
2763 return 0;
2764}
2765
2766
2768{
2769 int errors = 0;
2770 wxString details;
2771 bool quiet = aEvent.Parameter<bool>();
2772
2773 // Repair duplicate IDs.
2774 std::map<KIID, EDA_ITEM*> ids;
2775 int duplicates = 0;
2776
2778
2779 auto processItem =
2780 [&]( EDA_ITEM* aItem )
2781 {
2782 auto it = ids.find( aItem->m_Uuid );
2783
2784 if( it != ids.end() && it->second != aItem )
2785 {
2786 duplicates++;
2787 const_cast<KIID&>( aItem->m_Uuid ) = KIID();
2788 }
2789
2790 ids[ aItem->m_Uuid ] = aItem;
2791 };
2792
2793 // Symbol IDs are the most important, so give them the first crack at "claiming" a
2794 // particular KIID.
2795
2796 for( const SCH_SHEET_PATH& sheet : sheets )
2797 {
2798 SCH_SCREEN* screen = sheet.LastScreen();
2799
2800 for( SCH_ITEM* item : screen->Items().OfType( SCH_SYMBOL_T ) )
2801 {
2802 processItem( item );
2803
2804 for( SCH_PIN* pin : static_cast<SCH_SYMBOL*>( item )->GetPins( &sheet ) )
2805 processItem( pin );
2806 }
2807 }
2808
2809 for( const SCH_SHEET_PATH& sheet : sheets )
2810 {
2811 SCH_SCREEN* screen = sheet.LastScreen();
2812
2813 for( SCH_ITEM* item : screen->Items() )
2814 {
2815 processItem( item );
2816
2817 item->RunOnChildren(
2818 [&]( SCH_ITEM* aChild )
2819 {
2820 processItem( item );
2821 },
2822 RECURSE_MODE::NO_RECURSE );
2823 }
2824 }
2825
2826 /*******************************
2827 * Your test here
2828 */
2829
2830 /*******************************
2831 * Inform the user
2832 */
2833
2834 if( duplicates )
2835 {
2836 errors += duplicates;
2837 details += wxString::Format( _( "%d duplicate IDs replaced.\n" ), duplicates );
2838
2839 // Rehash sheetpaths as we may have changed their uuids.
2841 }
2842
2843 if( errors )
2844 {
2845 m_frame->OnModify();
2846
2847 wxString msg = wxString::Format( _( "%d potential problems repaired." ), errors );
2848
2849 if( !quiet )
2850 DisplayInfoMessage( m_frame, msg, details );
2851 }
2852 else if( !quiet )
2853 {
2854 DisplayInfoMessage( m_frame, _( "No errors found." ) );
2855 }
2856
2857 return 0;
2858}
2859
2860
2862{
2863 if( !Pgm().GetCommonSettings()->m_Input.hotkey_feedback )
2864 return 0;
2865
2866 GRID_SETTINGS& gridSettings = m_toolMgr->GetSettings()->m_Window.grid;
2867 int currentIdx = m_toolMgr->GetSettings()->m_Window.grid.last_size_idx;
2868
2869 wxArrayString gridsLabels;
2870
2871 for( const GRID& grid : gridSettings.grids )
2872 gridsLabels.Add( grid.UserUnitsMessageText( m_frame ) );
2873
2874 if( !m_frame->GetHotkeyPopup() )
2876
2878
2879 if( popup )
2880 popup->Popup( _( "Grid" ), gridsLabels, currentIdx );
2881
2882 return 0;
2883}
2884
2885
2887{
2888 Go( &SCH_EDITOR_CONTROL::New, ACTIONS::doNew.MakeEvent() );
2889 Go( &SCH_EDITOR_CONTROL::Open, ACTIONS::open.MakeEvent() );
2890 Go( &SCH_EDITOR_CONTROL::Save, ACTIONS::save.MakeEvent() );
2897 Go( &SCH_EDITOR_CONTROL::Plot, ACTIONS::plot.MakeEvent() );
2898 Go( &SCH_EDITOR_CONTROL::Quit, ACTIONS::quit.MakeEvent() );
2899
2902
2908
2911
2917
2919
2920 Go( &SCH_EDITOR_CONTROL::Undo, ACTIONS::undo.MakeEvent() );
2921 Go( &SCH_EDITOR_CONTROL::Redo, ACTIONS::redo.MakeEvent() );
2922 Go( &SCH_EDITOR_CONTROL::Cut, ACTIONS::cut.MakeEvent() );
2923 Go( &SCH_EDITOR_CONTROL::Copy, ACTIONS::copy.MakeEvent() );
2928
2930
2946
2953
2969
2971
2973
2976}
const char * name
Definition: DXF_plotter.cpp:59
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition: box2.h:990
static TOOL_ACTION updatePcbFromSchematic
Definition: actions.h:218
static TOOL_ACTION paste
Definition: actions.h:73
static TOOL_ACTION revert
Definition: actions.h:55
static TOOL_ACTION saveAs
Definition: actions.h:52
static TOOL_ACTION copy
Definition: actions.h:71
static TOOL_ACTION pluginsReload
Definition: actions.h:245
static TOOL_ACTION pickerTool
Definition: actions.h:208
static TOOL_ACTION showSymbolEditor
Definition: actions.h:215
static TOOL_ACTION pasteSpecial
Definition: actions.h:74
static TOOL_ACTION plot
Definition: actions.h:58
static TOOL_ACTION open
Definition: actions.h:50
static TOOL_ACTION pageSettings
Definition: actions.h:56
static TOOL_ACTION showSearch
Definition: actions.h:108
static TOOL_ACTION undo
Definition: actions.h:68
static TOOL_ACTION duplicate
Definition: actions.h:77
static TOOL_ACTION doDelete
Definition: actions.h:78
static TOOL_ACTION quit
Definition: actions.h:59
static TOOL_ACTION save
Definition: actions.h:51
static TOOL_ACTION redo
Definition: actions.h:69
static TOOL_ACTION updateSchematicFromPcb
Definition: actions.h:219
static TOOL_ACTION print
Definition: actions.h:57
static TOOL_ACTION showProperties
Definition: actions.h:220
static TOOL_ACTION doNew
Definition: actions.h:47
static TOOL_ACTION cut
Definition: actions.h:70
static TOOL_ACTION copyAsText
Definition: actions.h:72
static TOOL_ACTION refreshPreview
Definition: actions.h:149
WINDOW_SETTINGS m_Window
Definition: app_settings.h:213
static wxString m_DrawingSheetFileName
the name of the drawing sheet file, or empty to use the default drawing sheet
Definition: base_screen.h:85
int GetCount() const
Return the number of objects in the list.
Definition: collector.h:82
int m_Threshold
Definition: collector.h:235
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Modify a given item in the model.
Definition: commit.h:108
COMMIT & Added(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Notify observers that aItem has been added.
Definition: commit.h:86
bool Empty() const
Definition: commit.h:150
Calculate the connectivity of a schematic and generates netlists.
CONNECTION_SUBGRAPH * FindSubgraphByName(const wxString &aNetName, const SCH_SHEET_PATH &aPath)
Return the subgraph for a given net name on a given sheet.
const std::vector< CONNECTION_SUBGRAPH * > & GetAllSubgraphs(const wxString &aNetName) const
A subgraph is a set of items that are electrically connected on a single sheet.
PRIORITY GetDriverPriority()
Class DIALOG_INCREMENT_ANNOTATIONS_BASE.
void SetWksFileName(const wxString &aFilename)
bool PrjConfigChanged()
Return true if the project configuration was modified.
bool Show(bool show) override
void SetInitialFocus(wxWindow *aWindow)
Sets the window (usually a wxTextCtrl) that should be focused when the dialog is shown.
Definition: dialog_shim.h:66
int ShowQuasiModal()
int ShowModal() override
virtual void PushCommandToUndoList(PICKED_ITEMS_LIST *aItem)
Add a command to undo in the undo list.
virtual int GetRedoCommandCount() const
virtual void ClearUndoRedoList()
Clear the undo and redo list using ClearUndoORRedoList()
virtual PICKED_ITEMS_LIST * PopCommandFromRedoList()
Return the last command to undo and remove it from list, nothing is deleted.
virtual PICKED_ITEMS_LIST * PopCommandFromUndoList()
Return the last command to undo and remove it from list, nothing is deleted.
virtual int GetUndoCommandCount() const
virtual void PushCommandToRedoList(PICKED_ITEMS_LIST *aItem)
Add a command to redo in the redo list.
void ShowInfoBarError(const wxString &aErrorMsg, bool aShowCloseButton=false, WX_INFOBAR::MESSAGE_TYPE aType=WX_INFOBAR::MESSAGE_TYPE::GENERIC)
Show the WX_INFOBAR displayed on the top of the canvas with a message and an error icon on the left o...
HOTKEY_CYCLE_POPUP * GetHotkeyPopup()
void ReleaseFile()
Release the current file marked in use.
void ScriptingConsoleEnableDisable()
Toggle the scripting console visibility.
bool LibraryFileBrowser(bool doOpen, wxFileName &aFilename, const wxString &wildcard, const wxString &ext, bool isDirectory=false, bool aIsGlobal=false, const wxString &aGlobalPath=wxEmptyString)
virtual void CreateHotkeyPopup()
GAL_TYPE GetBackend() const
Return the type of backend currently used by GAL canvas.
void ForceRefresh()
Force a redraw.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:95
virtual VECTOR2I GetPosition() const
Definition: eda_item.h:248
EDA_ITEM_FLAGS GetEditFlags() const
Definition: eda_item.h:137
const KIID m_Uuid
Definition: eda_item.h:494
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:107
virtual bool IsType(const std::vector< KICAD_T > &aScanTypes) const
Check whether the item is one of the listed types.
Definition: eda_item.h:180
virtual void SetParent(EDA_ITEM *aParent)
Definition: eda_item.h:110
void ClearBrightened()
Definition: eda_item.h:127
void SetBrightened()
Definition: eda_item.h:124
EDA_ITEM * GetParent() const
Definition: eda_item.h:109
bool IsBrightened() const
Definition: eda_item.h:118
SHAPE_POLY_SET & GetPolyShape()
Definition: eda_shape.h:337
SHAPE_T GetShape() const
Definition: eda_shape.h:168
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:215
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:173
std::vector< VECTOR2I > GetRectCorners() const
Definition: eda_shape.cpp:1544
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition: eda_text.h:80
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:98
virtual bool IsVisible() const
Definition: eda_text.h:174
PANEL_ANNOTATE m_AnnotatePanel
EE_TYPE OfType(KICAD_T aType) const
Definition: sch_rtree.h:241
Definition: erc.h:52
static const TOOL_EVENT ClearedEvent
Definition: actions.h:298
static const TOOL_EVENT GridChangedByKeyEvent
Definition: actions.h:316
static const TOOL_EVENT SelectedEvent
Definition: actions.h:296
static const TOOL_EVENT SelectedItemsModified
Selected items were moved, this can be very high frequency on the canvas, use with care.
Definition: actions.h:303
static const TOOL_EVENT PointSelectedEvent
Definition: actions.h:295
static const TOOL_EVENT UnselectedEvent
Definition: actions.h:297
Similar to EDA_VIEW_SWITCHER, this dialog is a popup that shows feedback when using a hotkey to cycle...
void Popup(const wxString &aTitle, const wxArrayString &aItems, int aSelection)
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
Definition: ki_exception.h:77
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:30
An interface for classes handling user events controlling the view behavior such as zooming,...
VECTOR2D GetCursorPosition() const
Return the current cursor position in world coordinates.
An abstract base class for deriving all objects that can be added to a VIEW.
Definition: view_item.h:86
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:67
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
Definition: view.cpp:1673
void SetLayerVisible(int aLayer, bool aVisible=true)
Control the visibility of a particular layer.
Definition: view.h:396
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition: view.cpp:1549
void Hide(VIEW_ITEM *aItem, bool aHide=true, bool aHideOverlay=false)
Temporarily hide the item in the view (e.g.
Definition: view.cpp:1621
void MarkDirty()
Force redraw of view on the next rendering.
Definition: view.h:655
void UpdateAllItemsConditionally(int aUpdateFlags, std::function< bool(VIEW_ITEM *)> aCondition)
Update items in the view according to the given flags and condition.
Definition: view.cpp:1559
bool EndsWith(const KIID_PATH &aPath) const
Test if aPath from the last path towards the first path.
Definition: kiid.cpp:335
wxString AsString() const
Definition: kiid.cpp:356
Definition: kiid.h:49
wxString AsString() const
Definition: kiid.cpp:246
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
Definition: kiway_holder.h:55
A wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of a KiCad project.
Definition: kiway_player.h:65
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition: kiway.cpp:406
wxWindow * GetBlockingDialog()
Gets the window pointer to the blocking dialog (to send it signals)
Definition: kiway.cpp:670
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:49
int SetLibNickname(const UTF8 &aLibNickname)
Override the logical library name portion of the LIB_ID to aLibNickname.
Definition: lib_id.cpp:100
Define a library symbol object.
Definition: lib_symbol.h:85
const LIB_ID & GetLibId() const override
Definition: lib_symbol.h:155
wxString GetName() const override
Definition: lib_symbol.h:149
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
Definition: lib_symbol.cpp:342
const wxString & GetNickName() const
const wxString GetFullURI(bool aSubstituted=false) const
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library table.
void Save(const wxString &aFileName) const
Write this library table to aFileName in s-expression form.
static void ConvertToSpiceMarkup(wxString *aNetName)
Remove formatting wrappers and replace illegal spice net name characters with underscores.
Tree view item data for the net navigator.
static bool ParseBusGroup(const wxString &aGroup, wxString *name, std::vector< wxString > *aMemberList)
Parse a bus group label into the name and a list of components.
static bool ParseBusVector(const wxString &aBus, wxString *aName, std::vector< wxString > *aMemberList)
Parse a bus vector (e.g.
static wxString GetDefaultUserSymbolsPath()
Gets the default path we point users to create projects.
Definition: paths.cpp:88
A holder to handle information on schematic or board items.
void PushItem(const ITEM_PICKER &aItem)
Push aItem to the top of the list.
void SetDescription(const wxString &aDescription)
void ReversePickersListOrder()
Reverse the order of pickers stored in this list.
void SetMotionHandler(MOTION_HANDLER aHandler)
Set a handler for mouse motion.
Definition: picker_tool.h:84
void SetClickHandler(CLICK_HANDLER aHandler)
Set a handler for mouse click event.
Definition: picker_tool.h:73
void SetSnapping(bool aSnap)
Definition: picker_tool.h:66
void SetCursor(KICURSOR aCursor)
Definition: picker_tool.h:64
void SetFinalizeHandler(FINALIZE_HANDLER aHandler)
Set a handler for the finalize event.
Definition: picker_tool.h:104
static SYMBOL_LIB_TABLE * SchSymbolLibTable(PROJECT *aProject)
Accessor for project symbol library table.
virtual const wxString GetProjectPath() const
Return the full path of the project.
Definition: project.cpp:146
virtual const wxString GetProjectName() const
Return the short name of the project.
Definition: project.cpp:158
virtual bool IsNullProject() const
Check if this project is a null project (i.e.
Definition: project.cpp:164
static bool RescueProject(wxWindow *aParent, RESCUER &aRescuer, bool aRunningOnDemand)
size_t GetCandidateCount()
Return the number of rescue candidates found.
Holds all the data relating to one schematic.
Definition: schematic.h:69
SCH_SHEET_LIST BuildSheetListSortedByPageNumbers() const
Definition: schematic.h:89
wxString GetFileName() const
Helper to retrieve the filename from the root sheet screen.
Definition: schematic.cpp:300
SCHEMATIC_SETTINGS & Settings() const
Definition: schematic.cpp:306
SCH_SHEET_LIST Hierarchy() const
Return the full schematic flattened hierarchical sheet list.
Definition: schematic.cpp:208
EMBEDDED_FILES * GetEmbeddedFiles() override
Definition: schematic.cpp:871
CONNECTION_GRAPH * ConnectionGraph() const
Definition: schematic.h:158
SCH_SHEET & Root() const
Definition: schematic.h:117
SCH_SHEET_PATH & CurrentSheet() const
Definition: schematic.h:148
void RefreshHierarchy()
Definition: schematic.cpp:216
static TOOL_ACTION showPcbNew
Definition: sch_actions.h:186
static TOOL_ACTION assignFootprints
Definition: sch_actions.h:169
static TOOL_ACTION lineModeNext
Definition: sch_actions.h:280
static TOOL_ACTION toggleOPCurrents
Definition: sch_actions.h:256
static TOOL_ACTION clearHighlight
Definition: sch_actions.h:308
static TOOL_ACTION clearSelection
Clears the current selection.
Definition: sch_actions.h:57
static TOOL_ACTION editSymbolFields
Definition: sch_actions.h:161
static TOOL_ACTION importFPAssignments
Definition: sch_actions.h:187
static TOOL_ACTION toggleAnnotateAuto
Definition: sch_actions.h:283
static TOOL_ACTION editLibSymbolWithLibEdit
Definition: sch_actions.h:185
static TOOL_ACTION toggleERCWarnings
Definition: sch_actions.h:251
static TOOL_ACTION schematicSetup
Definition: sch_actions.h:171
static TOOL_ACTION toggleDirectiveLabels
Definition: sch_actions.h:250
static TOOL_ACTION highlightNetTool
Definition: sch_actions.h:310
static TOOL_ACTION toggleHiddenFields
Definition: sch_actions.h:247
static TOOL_ACTION saveCurrSheetCopyAs
Definition: sch_actions.h:43
static TOOL_ACTION exportSymbolsToNewLibrary
Definition: sch_actions.h:194
static TOOL_ACTION repairSchematic
Definition: sch_actions.h:272
static TOOL_ACTION remapSymbols
Definition: sch_actions.h:178
static TOOL_ACTION lineMode45
Definition: sch_actions.h:279
static TOOL_ACTION editSymbolLibraryLinks
Definition: sch_actions.h:162
static TOOL_ACTION simTune
Definition: sch_actions.h:296
static TOOL_ACTION generateBOM
Definition: sch_actions.h:189
static TOOL_ACTION showHierarchy
Definition: sch_actions.h:238
static TOOL_ACTION showNetNavigator
Definition: sch_actions.h:311
static TOOL_ACTION markSimExclusions
Definition: sch_actions.h:254
static TOOL_ACTION editWithLibEdit
Definition: sch_actions.h:184
static TOOL_ACTION toggleERCErrors
Definition: sch_actions.h:252
static TOOL_ACTION incrementAnnotations
Definition: sch_actions.h:160
static TOOL_ACTION rescueSymbols
Definition: sch_actions.h:177
static TOOL_ACTION generateBOMLegacy
Definition: sch_actions.h:190
static TOOL_ACTION toggleOPVoltages
Definition: sch_actions.h:255
static TOOL_ACTION simProbe
Definition: sch_actions.h:295
static TOOL_ACTION lineMode90
Definition: sch_actions.h:278
static TOOL_ACTION lineModeFree
Definition: sch_actions.h:277
static TOOL_ACTION changeSheet
Definition: sch_actions.h:230
static TOOL_ACTION highlightNet
Definition: sch_actions.h:307
static TOOL_ACTION assignNetclass
Definition: sch_actions.h:170
static TOOL_ACTION annotate
Definition: sch_actions.h:159
static TOOL_ACTION showDesignBlockPanel
Definition: sch_actions.h:203
static TOOL_ACTION togglePinAltIcons
Definition: sch_actions.h:257
static TOOL_ACTION toggleERCExclusions
Definition: sch_actions.h:253
static TOOL_ACTION updateNetHighlighting
Definition: sch_actions.h:309
static TOOL_ACTION exportNetlist
Definition: sch_actions.h:188
static TOOL_ACTION addItemsToSel
Selects a list of items (specified as the event parameter)
Definition: sch_actions.h:64
static TOOL_ACTION drawSheetOnClipboard
Definition: sch_actions.h:267
static TOOL_ACTION exportSymbolsToLibrary
Definition: sch_actions.h:193
static TOOL_ACTION toggleHiddenPins
Definition: sch_actions.h:246
static TOOL_ACTION selectOnPCB
Definition: sch_actions.h:260
static TOOL_ACTION move
Definition: sch_actions.h:129
static TOOL_ACTION selectionActivate
Activation of the selection tool.
Definition: sch_actions.h:47
SCH_RENDER_SETTINGS * GetRenderSettings()
void AddToScreen(EDA_ITEM *aItem, SCH_SCREEN *aScreen=nullptr)
Add an item to the screen (and view) aScreen is the screen the item is located on,...
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
SYMBOL_LIB_TABLE * SelectSymLibTable(bool aOptional=false)
Display a dialog asking the user to select a symbol library table.
wxString SelectLibraryFromList()
Display a list of loaded libraries and allows the user to select a library.
void SyncView()
Mark all items for refresh.
EESCHEMA_SETTINGS * eeconfig() const
Base class for a bus or wire entry.
Definition: sch_bus_entry.h:38
void Collect(SCH_SCREEN *aScreen, const std::vector< KICAD_T > &aScanTypes, const VECTOR2I &aPos, int aUnit=0, int aConvert=0)
Scan a EDA_ITEM using this class's Inspector method which does the collection.
virtual void Push(const wxString &aMessage=wxT("A commit"), int aCommitFlags=0) override
Execute the changes.
Definition: sch_commit.cpp:435
virtual void Revert() override
Revert the commit by restoring the modified items state.
Definition: sch_commit.cpp:513
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
wxString Name(bool aIgnoreSheet=false) const
bool IsBus() const
SCH_ITEM * Driver() const
KIGFX::SCH_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
Handle actions specific to the schematic editor.
int PageSetup(const TOOL_EVENT &aEvent)
bool RescueLegacyProject(bool aRunningOnDemand)
int ToggleDirectiveLabels(const TOOL_EVENT &aEvent)
int SaveAs(const TOOL_EVENT &aEvent)
int MarkSimExclusions(const TOOL_EVENT &aEvent)
int Annotate(const TOOL_EVENT &aEvent)
int ToggleAnnotateRecursive(const TOOL_EVENT &aEvent)
int ShowSchematicSetup(const TOOL_EVENT &aEvent)
int HighlightNet(const TOOL_EVENT &aEvent)
Remove any net highlighting.
int ClearHighlight(const TOOL_EVENT &aEvent)
Update net highlighting after an edit.
int EditSymbolFields(const TOOL_EVENT &aEvent)
int GenerateBOMLegacy(const TOOL_EVENT &aEvent)
int HighlightNetCursor(const TOOL_EVENT &aEvent)
int CopyAsText(const TOOL_EVENT &aEvent)
int ImportFPAssignments(const TOOL_EVENT &aEvent)
int ChangeLineMode(const TOOL_EVENT &aEvent)
void doCrossProbeSchToPcb(const TOOL_EVENT &aEvent, bool aForce)
int ExportSymbolsToLibrary(const TOOL_EVENT &aEvent)
int SaveCurrSheetCopyAs(const TOOL_EVENT &aEvent)
Saves the currently-open schematic sheet to an other name.
bool rescueProject(RESCUER &aRescuer, bool aRunningOnDemand)
int CrossProbeToPcb(const TOOL_EVENT &aEvent)
Equivalent to the above, but initiated by the user.
int Quit(const TOOL_EVENT &aEvent)
int RemapSymbols(const TOOL_EVENT &aEvent)
int DrawSheetOnClipboard(const TOOL_EVENT &aEvent)
SCH_SHEET_PATH updatePastedSheet(SCH_SHEET *aSheet, const SCH_SHEET_PATH &aPastePath, const KIID_PATH &aClipPath, bool aForceKeepAnnotations, SCH_SHEET_LIST *aPastedSheets, std::map< SCH_SHEET_PATH, SCH_REFERENCE_LIST > &aPastedSymbols)
int TogglePinAltIcons(const TOOL_EVENT &aEvent)
int RescueSymbols(const TOOL_EVENT &aEvent)
Perform rescue operations to recover old projects from before certain changes were made.
int AssignNetclass(const TOOL_EVENT &aEvent)
std::string m_duplicateClipboard
int ExportNetlist(const TOOL_EVENT &aEvent)
int Open(const TOOL_EVENT &aEvent)
int Paste(const TOOL_EVENT &aEvent)
int ToggleOPVoltages(const TOOL_EVENT &aEvent)
int Copy(const TOOL_EVENT &aEvent)
int ToggleERCWarnings(const TOOL_EVENT &aEvent)
int NextLineMode(const TOOL_EVENT &aEvent)
int Redo(const TOOL_EVENT &aEvent)
Clipboard support.
int UpdatePCB(const TOOL_EVENT &aEvent)
int UpdateFromPCB(const TOOL_EVENT &aEvent)
int ToggleAnnotateAuto(const TOOL_EVENT &aEvent)
int ToggleHiddenPins(const TOOL_EVENT &aEvent)
int Duplicate(const TOOL_EVENT &aEvent)
int IncrementAnnotations(const TOOL_EVENT &aEvent)
bool searchSupplementaryClipboard(const wxString &aSheetFilename, SCH_SCREEN **aScreen)
int GridFeedback(const TOOL_EVENT &aEvent)
int ShowSearch(const TOOL_EVENT &aEvent)
int EditWithSymbolEditor(const TOOL_EVENT &aEvent)
int SimTune(const TOOL_EVENT &aEvent)
Highlight net under the cursor.
int EditSymbolLibraryLinks(const TOOL_EVENT &aEvent)
int New(const TOOL_EVENT &aEvent)
std::map< wxString, SCH_SCREEN * > m_supplementaryClipboard
int ExplicitCrossProbeToPcb(const TOOL_EVENT &aEvent)
int ToggleOPCurrents(const TOOL_EVENT &aEvent)
int ShowPcbNew(const TOOL_EVENT &aEvent)
int UpdateNetHighlighting(const TOOL_EVENT &aEvent)
Launch a tool to highlight nets.
int ToggleERCErrors(const TOOL_EVENT &aEvent)
int TogglePythonConsole(const TOOL_EVENT &aEvent)
int ShowHierarchy(const TOOL_EVENT &aEvent)
void setTransitions() override
This method is meant to be overridden in order to specify handlers for events.
int ShowNetNavigator(const TOOL_EVENT &aEvent)
int SimProbe(const TOOL_EVENT &aEvent)
void updatePastedSymbol(SCH_SYMBOL *aSymbol, const SCH_SHEET_PATH &aPastePath, const KIID_PATH &aClipPath, bool aForceKeepAnnotations)
int ShowCvpcb(const TOOL_EVENT &aEvent)
int ToggleLibraryTree(const TOOL_EVENT &aEvent)
int RepairSchematic(const TOOL_EVENT &aEvent)
std::set< SCH_SYMBOL * > m_pastedSymbols
void prunePastedSymbolInstances()
Remove all pasted symbol instances that do not belong to the current project.
int Cut(const TOOL_EVENT &aEvent)
int ToggleProperties(const TOOL_EVENT &aEvent)
std::map< KIID_PATH, SCH_SYMBOL_INSTANCE > m_clipboardSymbolInstances
int Save(const TOOL_EVENT &aEvent)
bool RescueSymbolLibTableProject(bool aRunningOnDemand)
Notifies pcbnew about the selected item.
bool doCopy(bool aUseDuplicateClipboard=false)
< copy selection to clipboard or to m_duplicateClipboard
int Undo(const TOOL_EVENT &aEvent)
int ToggleERCExclusions(const TOOL_EVENT &aEvent)
int Plot(const TOOL_EVENT &aEvent)
int Print(const TOOL_EVENT &aEvent)
int Revert(const TOOL_EVENT &aEvent)
int GenerateBOM(const TOOL_EVENT &aEvent)
int ReloadPlugins(const TOOL_EVENT &aEvent)
void setPastedSymbolInstances(const SCH_SCREEN *aScreen)
int ToggleHiddenFields(const TOOL_EVENT &aEvent)
Schematic editor (Eeschema) main window.
void ShowSchematicSetupDialog(const wxString &aInitialPage=wxEmptyString)
void RollbackSchematicFromUndo()
Perform an undo of the last edit without logging a corresponding redo.
bool IsSyncingSelection()
void RefreshOperatingPointDisplay()
Refresh the display of any operating points.
void OnModify() override
Must be called after a schematic change in order to set the "modify" flag and update other data struc...
bool OpenProjectFiles(const std::vector< wxString > &aFileSet, int aCtl=0) override
Open a project or set of files given by aFileList.
void SetHighlightedConnection(const wxString &aConnection, const NET_NAVIGATOR_ITEM_DATA *aSelection=nullptr)
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
void InitSheet(SCH_SHEET *aSheet, const wxString &aNewFilename)
Definition: sheet.cpp:110
bool LoadSheetFromFile(SCH_SHEET *aSheet, SCH_SHEET_PATH *aCurrentSheet, const wxString &aFileName, bool aSkipRecursionCheck=false, bool aSkipLibCheck=false)
Load a the KiCad schematic file aFileName into the sheet aSheet.
Definition: sheet.cpp:169
void SendSelectItemsToPcb(const std::vector< EDA_ITEM * > &aItems, bool aForce)
Send items to board editor for selection.
void SaveCopyInUndoList(SCH_SCREEN *aScreen, SCH_ITEM *aItemToCopy, UNDO_REDO aTypeCommand, bool aAppend, bool aDirtyConnectivity=true)
Create a copy of the current schematic item, and put it in the undo list.
void SendCrossProbeClearHighlight()
Tell Pcbnew to clear the existing highlighted net, if one exists.
void HardRedraw() override
Rebuild the GAL and redraw the screen.
SCHEMATIC * m_schematic
The currently loaded schematic.
SCH_SHEET_PATH & GetCurrentSheet() const
const SCH_ITEM * GetSelectedNetNavigatorItem() const
SCHEMATIC & Schematic() const
bool saveSchematicFile(SCH_SHEET *aSheet, const wxString &aSavePath)
Save aSheet to a schematic file.
void DrawCurrentSheetToClipboard()
Use the wxWidgets print code to draw an image of the current sheet onto the clipboard.
Definition: sheet.cpp:622
void RefreshNetNavigator(const NET_NAVIGATOR_ITEM_DATA *aSelection=nullptr)
void UpdateHierarchyNavigator(bool aRefreshNetNavigator=true, bool aClear=false)
Update the hierarchy navigation tree and history.
void SetSheetNumberAndCount()
Set the m_ScreenNumber and m_NumberOfScreens members for screens.
void RecalculateConnections(SCH_COMMIT *aCommit, SCH_CLEANUP_FLAGS aCleanupFlags)
Generate the connection data for the entire schematic hierarchy.
void PutDataInPreviousState(PICKED_ITEMS_LIST *aList)
Restore an undo or redo command to put data pointed by aList in the previous state.
const wxString & GetHighlightedConnection() const
void UpdateNetHighlightStatus()
void SelectNetNavigatorItem(const NET_NAVIGATOR_ITEM_DATA *aSelection=nullptr)
DIALOG_SYMBOL_FIELDS_TABLE * GetSymbolFieldsTableDialog()
void SetCrossProbeConnection(const SCH_CONNECTION *aConnection)
Send a connection (net or bus) to Pcbnew for highlighting.
bool SaveProject(bool aSaveAs=false)
Save the currently-open schematic (including its hierarchy) and associated project.
void SetText(const wxString &aText) override
Definition: sch_field.cpp:1069
A SCH_IO derivation for loading schematic files using the new s-expression file format.
void LoadContent(LINE_READER &aReader, SCH_SHEET *aSheet, int aVersion=SEXPR_SCHEMATIC_FILE_VERSION)
void Format(SCH_SHEET *aSheet)
static SCH_FILE_T EnumFromStr(const wxString &aFileType)
Return the #SCH_FILE_T from the corresponding plugin type name: "kicad", "legacy",...
Definition: sch_io_mgr.cpp:107
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:168
virtual bool IsConnectable() const
Definition: sch_item.h:466
const SYMBOL * GetParentSymbol() const
Definition: sch_item.cpp:172
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
Definition: sch_item.cpp:156
virtual void SetLastResolvedState(const SCH_ITEM *aItem)
Definition: sch_item.h:558
int GetBodyStyle() const
Definition: sch_item.h:243
int GetUnit() const
Definition: sch_item.h:240
void SetConnectivityDirty(bool aDirty=true)
Definition: sch_item.h:529
bool IsConnectivityDirty() const
Definition: sch_item.h:527
virtual void SetUnit(int aUnit)
Definition: sch_item.h:239
SCH_CONNECTION * Connection(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve the connection associated with this object in the given sheet.
Definition: sch_item.cpp:224
virtual std::vector< VECTOR2I > GetConnectionPoints() const
Add all the connection points for this item to aPoints.
Definition: sch_item.h:481
Segment description base class to describe items which have 2 end points (track, wire,...
Definition: sch_line.h:41
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.
size_t GetCount() const
void SplitReferences()
Attempt to split all reference designators into a name (U) and number (1).
void AddItem(const SCH_REFERENCE &aItem)
A helper to define a symbol's reference designator in a schematic.
void SetRef(const wxString &aReference)
void Split()
Attempt to split the reference designator into a name (U) and number (1).
bool IsSplitNeeded()
Determine if this reference needs to be split or if it likely already has been.
wxString GetRef() const
void SetSheetNumber(int aSheetNumber)
wxString GetRefNumber() const
Container class that holds multiple SCH_SCREEN objects in a hierarchy.
Definition: sch_screen.h:734
SCH_SCREEN * GetNext()
void UpdateSymbolLinks(REPORTER *aReporter=nullptr)
Initialize the LIB_SYMBOL reference for each SCH_SYMBOL found in the full schematic.
SCH_SCREEN * GetFirst()
void PruneOrphanedSheetInstances(const wxString &aProjectName, const SCH_SHEET_LIST &aValidSheetPaths)
void PruneOrphanedSymbolInstances(const wxString &aProjectName, const SCH_SHEET_LIST &aValidSheetPaths)
bool HasNoFullyDefinedLibIds()
Test all of the schematic symbols to see if all LIB_ID objects library nickname is not set.
void Append(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
Definition: sch_screen.cpp:155
void Clear(bool aFree=true)
Delete all draw items and clears the project settings.
Definition: sch_screen.cpp:280
void UpdateSymbolLinks(REPORTER *aReporter=nullptr)
Initialize the LIB_SYMBOL reference for each SCH_SYMBOL found in this schematic from the project SYMB...
Definition: sch_screen.cpp:671
std::set< wxString > GetSheetNames() const
const std::map< wxString, LIB_SYMBOL * > & GetLibSymbols() const
Fetch a list of unique LIB_SYMBOL object pointers required to properly render each SCH_SYMBOL in this...
Definition: sch_screen.h:479
EE_RTREE & Items()
Get the full RTree, usually for iterating.
Definition: sch_screen.h:112
const wxString & GetFileName() const
Definition: sch_screen.h:147
bool Remove(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
Remove aItem from the schematic associated with this screen.
Definition: sch_screen.cpp:325
bool CheckIfOnDrawList(const SCH_ITEM *aItem) const
Definition: sch_screen.cpp:388
void MigrateSimModels()
Migrate any symbols having V6 simulation models to their V7 equivalents.
EDA_ITEM * GetNode(const VECTOR2I &aPosition)
Finds a connected item at a point (usually the cursor position).
SCH_SELECTION & RequestSelection(const std::vector< KICAD_T > &aScanTypes={ SCH_LOCATE_ANY_T }, bool aPromoteCellSelections=false)
Return either an existing selection (filtered), or the selection at the current cursor position if th...
bool SelectPoint(const VECTOR2I &aWhere, const std::vector< KICAD_T > &aScanTypes={ SCH_LOCATE_ANY_T }, EDA_ITEM **aItem=nullptr, bool *aSelectionCancelledFlag=nullptr, bool aCheckLocked=false, bool aAdd=false, bool aSubtract=false, bool aExclusiveOr=false)
Perform a click-type selection at a point (usually the cursor position).
int ClearSelection(const TOOL_EVENT &aEvent)
Select all visible items in sheet.
void GuessSelectionCandidates(SCH_COLLECTOR &collector, const VECTOR2I &aPos)
Apply heuristics to try and determine a single object when multiple are found under the cursor.
SCH_SELECTION & GetSelection()
VECTOR2I GetCenter() const
Definition: sch_shape.h:84
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
void FillItemMap(std::map< KIID, EDA_ITEM * > &aMap)
Fill an item cache for temporary use when many items need to be fetched.
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.
bool PageNumberExists(const wxString &aPageNumber) const
bool ContainsSheet(const SCH_SHEET *aSheet) const
bool HasPath(const KIID_PATH &aPath) const
bool TestForRecursion(const SCH_SHEET_LIST &aSrcSheetHierarchy, const wxString &aDestFileName)
Test every SCH_SHEET_PATH in this SCH_SHEET_LIST to verify if adding the sheets stored in aSrcSheetHi...
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
void GetSymbols(SCH_REFERENCE_LIST &aReferences, bool aIncludePowerSymbols=true, bool aForceIncludeOrphanSymbols=false) const
Adds SCH_REFERENCE object to aReferences for each symbol in the sheet.
KIID_PATH Path() const
Get the sheet path as an KIID_PATH.
void UpdateAllScreenReferences() const
Update all the symbol references for this sheet path.
SCH_SCREEN * LastScreen()
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.
Definition: sch_sheet_pin.h:66
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition: sch_sheet.h:47
wxString GetFileName() const
Return the filename corresponding to this sheet.
Definition: sch_sheet.h:321
void RemoveInstance(const KIID_PATH &aInstancePath)
Definition: sch_sheet.cpp:1339
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this sheet.
Definition: sch_sheet.cpp:369
bool SearchHierarchy(const wxString &aFilename, SCH_SCREEN **aScreen)
Search the existing hierarchy for an instance of screen loaded from aFileName.
Definition: sch_sheet.cpp:753
void AddInstance(const SCH_SHEET_INSTANCE &aInstance)
Definition: sch_sheet.cpp:1360
SCH_SCREEN * GetScreen() const
Definition: sch_sheet.h:116
void SetScreen(SCH_SCREEN *aScreen)
Set the SCH_SCREEN associated with this sheet to aScreen.
Definition: sch_sheet.cpp:137
std::vector< SCH_SHEET_PIN * > & GetPins()
Definition: sch_sheet.h:187
const std::vector< SCH_SHEET_INSTANCE > & GetInstances() const
Definition: sch_sheet.h:429
Schematic symbol object.
Definition: sch_symbol.h:75
const std::vector< SCH_SYMBOL_INSTANCE > & GetInstances() const
Definition: sch_symbol.h:134
wxString GetSchSymbolLibraryName() const
Definition: sch_symbol.cpp:242
void ClearAnnotation(const SCH_SHEET_PATH *aSheetPath, bool aResetPrefix)
Clear exiting symbol annotation.
void AddHierarchicalReference(const KIID_PATH &aPath, const wxString &aRef, int aUnit)
Add a full hierarchical reference to this symbol.
Definition: sch_symbol.cpp:511
bool IsMissingLibSymbol() const
Check to see if the library symbol is set to the dummy library symbol.
Definition: sch_symbol.cpp:209
std::vector< SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet) const
Retrieve a list of the SCH_PINs for the given sheet path.
const LIB_ID & GetLibId() const override
Definition: sch_symbol.h:164
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
Definition: sch_symbol.h:183
void SetLibSymbol(LIB_SYMBOL *aLibSymbol)
Set this schematic symbol library symbol reference to aLibSymbol.
Definition: sch_symbol.cpp:251
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const override
Definition: sch_symbol.cpp:611
bool IsPower() const override
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this symbol.
Definition: sch_symbol.cpp:813
void BrightenItem(EDA_ITEM *aItem)
void UnbrightenItem(EDA_ITEM *aItem)
void SetReferencePoint(const VECTOR2I &aP)
Definition: selection.cpp:178
const VECTOR2I & CVertex(int aIndex, int aOutline, int aHole) const
Return the index-th vertex in a given hole outline within a given outline.
The SIMULATOR_FRAME holds the main user-interface for running simulations.
void AddCurrentTrace(const wxString &aDeviceName)
Add a current trace for a given device to the current plot.
void AddVoltageTrace(const wxString &aNetName)
Add a voltage trace for a given net to the current plot.
SIM_MODEL & CreateModel(SIM_MODEL::TYPE aType, const std::vector< SCH_PIN * > &aPins, REPORTER &aReporter)
int FindModelPinIndex(const std::string &aSymbolPinNumber)
Definition: sim_model.cpp:654
const SPICE_GENERATOR & SpiceGenerator() const
Definition: sim_model.h:428
virtual std::vector< std::string > CurrentNames(const SPICE_ITEM &aItem) const
Implement an OUTPUTFORMATTER to a memory buffer.
Definition: richio.h:449
const std::string & GetString()
Definition: richio.h:472
Is a LINE_READER that reads from a multiline 8 bit wide std::string.
Definition: richio.h:253
The symbol library editor main window.
bool IsLibraryTreeShown() const override
void LoadSymbol(const wxString &aLibrary, const wxString &aSymbol, int Unit)
void LoadSymbolFromSchematic(SCH_SYMBOL *aSymbol)
Load a symbol from the schematic to edit in place.
void ToggleLibraryTree() override
Class to handle modifications to the symbol libraries.
bool CreateLibrary(const wxString &aFilePath, SYMBOL_LIB_TABLE &aTable)
Create an empty library and adds it to the library table.
SYMBOL_LIB_TABLE_ROW * GetLibrary(const wxString &aLibrary) const
Find a single library within the (aggregate) library table.
Hold a record identifying a symbol library accessed by the appropriate symbol library SCH_IO object i...
const wxString GetType() const override
Return the type of symbol library table represented by this row.
static SYMBOL_LIB_TABLE & GetGlobalLibTable()
static const wxString GetSymbolLibTableFileName()
static wxString GetGlobalTableFileName()
Fetch the global symbol library table file name.
SYMBOL_LIB_TABLE_ROW * FindRow(const wxString &aNickName, bool aCheckIfEnabled=false)
Return an SYMBOL_LIB_TABLE_ROW if aNickName is found in this table or in any chained fallBack table f...
Symbol library viewer main window.
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:55
KIGFX::VIEW_CONTROLS * getViewControls() const
Return the instance of VIEW_CONTROLS object used in the application.
Definition: tool_base.cpp:44
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:220
KIGFX::VIEW * getView() const
Returns the instance of #VIEW object used in the application.
Definition: tool_base.cpp:38
Generic, UI-independent tool event.
Definition: tool_event.h:168
bool DisableGridSnapping() const
Definition: tool_event.h:368
bool IsAction(const TOOL_ACTION *aAction) const
Test if the event contains an action issued upon activation of the given TOOL_ACTION.
Definition: tool_event.cpp:82
T Parameter() const
Return a parameter assigned to the event.
Definition: tool_event.h:465
void Go(int(T::*aStateFunc)(const TOOL_EVENT &), const TOOL_EVENT_LIST &aConditions=TOOL_EVENT(TC_ANY, TA_ANY))
Define which state (aStateFunc) to go when a certain event arrives (aConditions).
void Activate()
Run the tool.
Master controller class:
Definition: tool_manager.h:62
bool ProcessEvent(const TOOL_EVENT &aEvent)
Propagate an event to tools that requested events of matching type(s).
bool RunAction(const std::string &aActionName, T aParam)
Run the specified action immediately, pausing the current action to run the new one.
Definition: tool_manager.h:150
TOOLS_HOLDER * GetToolHolder() const
Definition: tool_manager.h:406
APP_SETTINGS_BASE * GetSettings() const
Definition: tool_manager.h:404
bool PostAction(const std::string &aActionName, T aParam)
Run the specified action after the current action (coroutine) ends.
Definition: tool_manager.h:235
bool RunSynchronousAction(const TOOL_ACTION &aAction, COMMIT *aCommit, T aParam)
Run the specified action immediately, pausing the current action to run the new one.
Definition: tool_manager.h:197
A wrapper for reporting to a wxString object.
Definition: reporter.h:172
bool HasMessage() const override
Returns true if the reporter client is non-empty.
Definition: reporter.cpp:100
const wxString & GetMessages() const
Definition: reporter.cpp:87
bool SaveClipboard(const std::string &aTextUTF8)
Store information to the system clipboard.
Definition: clipboard.cpp:31
std::string GetClipboardUTF8()
Return the information currently stored in the system clipboard.
Definition: clipboard.cpp:51
std::unique_ptr< wxImage > GetImageFromClipboard()
Get image data from the clipboard, if there is any.
Definition: clipboard.cpp:77
wxString EnsureFileExtension(const wxString &aFilename, const wxString &aExtension)
It's annoying to throw up nag dialogs when the extension isn't right.
Definition: common.cpp:425
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
Definition: confirm.cpp:249
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
Definition: confirm.cpp:221
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:194
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
Definition: confirm.cpp:170
This file is part of the common library.
int InvokeDialogCreateBOM(SCH_EDIT_FRAME *aCaller)
Create and show DIALOG_BOM and return whatever DIALOG_BOM::ShowModal() returns.
Definition: dialog_bom.cpp:60
bool InvokeDialogEditSymbolsLibId(SCH_EDIT_FRAME *aCaller)
Run a dialog to modify the LIB_ID of symbols for instance when a symbol has moved from a symbol libra...
int InvokeDialogNetList(SCH_EDIT_FRAME *aCaller)
#define _(s)
@ NO_RECURSE
Definition: eda_item.h:51
std::vector< EDA_ITEM * > EDA_ITEMS
Define list of drawing items for screens.
Definition: eda_item.h:543
#define IS_PASTED
Modifier on IS_NEW which indicates it came from clipboard.
#define IS_NEW
New item, just created.
#define ENDPOINT
ends. (Used to support dragging.)
#define IS_MOVING
Item being moved.
#define STARTPOINT
When a line is selected, these flags indicate which.
LINE_MODE
@ FRAME_SCH_SYMBOL_EDITOR
Definition: frame_type.h:35
@ FRAME_SCH_VIEWER
Definition: frame_type.h:36
@ FRAME_SIMULATOR
Definition: frame_type.h:38
static const std::string KiCadSchematicFileExtension
static const std::string KiCadSymbolLibFileExtension
static wxString KiCadSymbolLibFileWildcard()
static wxString KiCadSchematicFileWildcard()
static const wxChar traceSchPaste[]
Flag to enable schematic paste debugging output.
#define NET_PLUGIN_CHANGE
Create and shows DIALOG_EXPORT_NETLIST and returns whatever DIALOG_EXPORT_NETLIST::ShowModal() return...
std::unique_ptr< T > IO_RELEASER
Helper to hold and release an IO_BASE object when exceptions are thrown.
Definition: io_mgr.h:33
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:39
#define KICTL_REVERT
reverting to a previously-saved (KiCad) file.
Definition: kiway_player.h:78
@ LAYER_ERC_WARN
Definition: layer_ids.h:468
@ LAYER_ERC_ERR
Definition: layer_ids.h:469
@ LAYER_OP_CURRENTS
Definition: layer_ids.h:490
@ LAYER_OP_VOLTAGES
Definition: layer_ids.h:489
void Prettify(std::string &aSource, bool aCompactSave)
@ REPAINT
Item needs to be redrawn.
Definition: view_item.h:58
@ GEOMETRY
Position or shape has changed.
Definition: view_item.h:55
#define MAX_PAGE_SIZE_EESCHEMA_MILS
Definition: page_info.h:40
PGM_BASE & Pgm()
The global program "get" accessor.
Definition: pgm_base.cpp:1071
see class PGM_BASE
@ LOCAL_CLEANUP
@ NO_CLEANUP
@ GLOBAL_CLEANUP
#define HITTEST_THRESHOLD_PIXELS
static bool highlightNet(TOOL_MANAGER *aToolMgr, const VECTOR2D &aPosition)
static VECTOR2D CLEAR
ANNOTATE_ORDER_T
Schematic annotation order options.
ANNOTATE_ALGO_T
Schematic annotation type options.
wxString GetSelectedItemsAsText(const SELECTION &aSel)
std::vector< FAB_LAYER_COLOR > dummy
wxString UnescapeString(const wxString &aSource)
wxString From_UTF8(const char *cstring)
std::vector< GRID > grids
Definition: grid_settings.h:66
Common grid settings, available to every frame.
Definition: grid_settings.h:34
A simple container for sheet instance information.
A simple container for schematic symbol instance information.
static constexpr auto NOT_CONNECTED
Definition: sim_model.h:73
std::string refName
GRID_SETTINGS grid
Definition: app_settings.h:81
Definition for symbol library class.
FIELD_T
The set of all field indices assuming an array like sequence that a SCH_COMPONENT or LIB_PART can hol...
VECTOR2I end
@ AS_GLOBAL
Global action (toolbar/main menu event, global shortcut)
Definition: tool_action.h:49
@ TA_UNDO_REDO_PRE
This event is sent before undo/redo command is performed.
Definition: tool_event.h:106
@ TC_MESSAGE
Definition: tool_event.h:58
@ SCH_LINE_T
Definition: typeinfo.h:163
@ SCH_SYMBOL_T
Definition: typeinfo.h:172
@ SCH_FIELD_T
Definition: typeinfo.h:150
@ SCH_SHEET_T
Definition: typeinfo.h:174
@ SCH_MARKER_T
Definition: typeinfo.h:158
@ SCH_SHAPE_T
Definition: typeinfo.h:149
@ SCH_PIN_T
Definition: typeinfo.h:153
VECTOR2< int32_t > VECTOR2I
Definition: vector2d.h:695
Definition of file extensions used in Kicad.
#define FN_NORMALIZE_FLAGS
Default flags to pass to wxFileName::Normalize().
Definition: wx_filename.h:39