KiCad PCB EDA Suite
Loading...
Searching...
No Matches
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/ee_actions.h>
68#include <tools/ee_selection.h>
70#include <tools/ee_tool_utils.h>
72#include <eda_list_dialog.h>
73#include <view/view_controls.h>
75#include <wx_filename.h>
76#include <wx/filedlg.h>
77#include <wx/log.h>
78#include <wx/treectrl.h>
79#include <wx/msgdlg.h>
81#include "sch_edit_table_tool.h"
82
83#ifdef KICAD_IPC_API
85#endif
86
87
93static const wxChar traceSchPaste[] = wxT( "KICAD_SCH_PASTE" );
94
95
97{
99 return 0;
100}
101
102
104{
106 return 0;
107}
108
109
111{
113 return 0;
114}
115
116
118{
119 m_frame->SaveProject( true );
120 return 0;
121}
122
123
125{
126 SCH_SHEET* curr_sheet = m_frame->GetCurrentSheet().Last();
127 wxFileName curr_fn = curr_sheet->GetFileName();
128 wxFileDialog dlg( m_frame, _( "Schematic Files" ), curr_fn.GetPath(), curr_fn.GetFullName(),
130 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
131
132 if( dlg.ShowModal() == wxID_CANCEL )
133 return false;
134
135 wxString newFilename =
137
138 m_frame->saveSchematicFile( curr_sheet, newFilename );
139 return 0;
140}
141
142
144{
145 SCHEMATIC& schematic = m_frame->Schematic();
146 SCH_SHEET& root = schematic.Root();
147
148 if( m_frame->GetCurrentSheet().Last() != &root )
149 {
152
153 // Store the current zoom level into the current screen before switching
155
156 SCH_SHEET_PATH rootSheetPath;
157 rootSheetPath.push_back( &root );
158 m_frame->SetCurrentSheet( rootSheetPath );
160
161 wxSafeYield();
162 }
163
164 wxString msg;
165 msg.Printf( _( "Revert '%s' (and all sub-sheets) to last version saved?" ),
166 schematic.GetFileName() );
167
168 if( !IsOK( m_frame, msg ) )
169 return false;
170
171 SCH_SCREENS screenList( schematic.Root() );
172
173 for( SCH_SCREEN* screen = screenList.GetFirst(); screen; screen = screenList.GetNext() )
174 screen->SetContentModified( false ); // do not prompt the user for changes
175
177 m_frame->OpenProjectFiles( std::vector<wxString>( 1, schematic.GetFileName() ), KICTL_REVERT );
178
179 return 0;
180}
181
182
184{
186 return 0;
187}
188
189
191{
192 PICKED_ITEMS_LIST undoCmd;
194 ITEM_PICKER wrapper( m_frame->GetScreen(), undoItem, UNDO_REDO::PAGESETTINGS );
195
196 undoCmd.PushItem( wrapper );
197 undoCmd.SetDescription( _( "Page Settings" ) );
198 m_frame->SaveCopyInUndoList( undoCmd, UNDO_REDO::PAGESETTINGS, false, false );
199
203
204 if( dlg.ShowModal() == wxID_OK )
205 {
206 // Update text variables
210
211 m_frame->OnModify();
212 }
213 else
214 {
216 }
217
218 return 0;
219}
220
221
223{
224 SCH_SCREENS schematic( m_frame->Schematic().Root() );
225
226 if( schematic.HasNoFullyDefinedLibIds() )
227 RescueLegacyProject( true );
228 else
230
231 return 0;
232}
233
234
235bool SCH_EDITOR_CONTROL::RescueLegacyProject( bool aRunningOnDemand )
236{
239
240 return rescueProject( rescuer, aRunningOnDemand );
241}
242
243
245{
249
250 return rescueProject( rescuer, aRunningOnDemand );
251}
252
253
254bool SCH_EDITOR_CONTROL::rescueProject( RESCUER& aRescuer, bool aRunningOnDemand )
255{
256 if( !RESCUER::RescueProject( m_frame, aRescuer, aRunningOnDemand ) )
257 return false;
258
259 if( aRescuer.GetCandidateCount() )
260 {
261 KIWAY_PLAYER* viewer = m_frame->Kiway().Player( FRAME_SCH_VIEWER, false );
262
263 if( viewer )
264 static_cast<SYMBOL_VIEWER_FRAME*>( viewer )->ReCreateLibList();
265
266 if( aRunningOnDemand )
267 {
268 SCH_SCREENS schematic( m_frame->Schematic().Root() );
269
270 schematic.UpdateSymbolLinks();
272 }
273
275 m_frame->SyncView();
277 m_frame->OnModify();
278 }
279
280 return true;
281}
282
283
285{
286 DIALOG_SYMBOL_REMAP dlgRemap( m_frame );
287
288 dlgRemap.ShowQuasiModal();
289
290 m_frame->GetCanvas()->Refresh( true );
291
292 return 0;
293}
294
295
297{
299 return 0;
300}
301
302
304{
306
307 dlg.ShowModal();
308
309 // save project config if the prj config has changed:
310 if( dlg.PrjConfigChanged() )
311 m_frame->OnModify();
312
313 return 0;
314}
315
316
318{
319 m_frame->Close( false );
320 return 0;
321}
322
323
325{
326 doCrossProbeSchToPcb( aEvent, false );
327 return 0;
328}
329
330
332{
333 doCrossProbeSchToPcb( aEvent, true );
334 return 0;
335}
336
337
338void SCH_EDITOR_CONTROL::doCrossProbeSchToPcb( const TOOL_EVENT& aEvent, bool aForce )
339{
340 // Don't get in an infinite loop SCH -> PCB -> SCH -> PCB -> SCH -> ...
342 return;
343
345
346 EE_SELECTION& selection = aForce ? selTool->RequestSelection() : selTool->GetSelection();
347
348 m_frame->SendSelectItemsToPcb( selection.GetItemsSortedBySelectionOrder(), aForce );
349}
350
351
353{
354 bool savePowerSymbols = IsOK( m_frame,
355 _( "Include power symbols in schematic to the library?" ) );
356
357 bool createNew = aEvent.IsAction( &EE_ACTIONS::exportSymbolsToNewLibrary );
358
360 SCH_REFERENCE_LIST symbols;
361 sheets.GetSymbols( symbols, savePowerSymbols );
362
363 std::map<LIB_ID, LIB_SYMBOL*> libSymbols;
364 std::map<LIB_ID, std::vector<SCH_SYMBOL*>> symbolMap;
365
366 for( size_t i = 0; i < symbols.GetCount(); ++i )
367 {
368 SCH_SYMBOL* symbol = symbols[i].GetSymbol();
369 LIB_SYMBOL* libSymbol = symbol->GetLibSymbolRef().get();
370 LIB_ID id = libSymbol->GetLibId();
371
372 if( libSymbols.count( id ) )
373 {
374 wxASSERT_MSG( libSymbols[id]->Compare( *libSymbol, SCH_ITEM::COMPARE_FLAGS::ERC ) == 0,
375 "Two symbols have the same LIB_ID but are different!" );
376 }
377 else
378 {
379 libSymbols[id] = libSymbol;
380 }
381
382 symbolMap[id].emplace_back( symbol );
383 }
384
386
387 wxString targetLib;
388
389 if( createNew )
390 {
391 wxFileName fn;
393
394 if( !libTable ) // Cancelled by user
395 return 0;
396
399 ( libTable == &SYMBOL_LIB_TABLE::GetGlobalLibTable() ),
401 {
402 return 0;
403 }
404
405 targetLib = fn.GetName();
406
407 if( libTable->HasLibrary( targetLib, false ) )
408 {
409 DisplayError( m_frame, wxString::Format( _( "Library '%s' already exists." ),
410 targetLib ) );
411 return 0;
412 }
413
414 // if the "new" library is in fact an existing library and the used asked for replacing
415 // it by the recreated lib, erase it:
416 if( fn.FileExists() )
417 wxRemoveFile( fn.GetFullPath() );
418
419 if( !mgr.CreateLibrary( fn.GetFullPath(), *libTable ) )
420 {
421 DisplayError( m_frame, wxString::Format( _( "Could not add library '%s'." ),
422 targetLib ) );
423 return 0;
424 }
425 }
426 else
427 {
428 targetLib = m_frame->SelectLibraryFromList();
429 }
430
431 if( targetLib.IsEmpty() )
432 return 0;
433
434 bool map = IsOK( m_frame, _( "Update symbols in schematic to refer to new library?" ) );
435 bool append = false;
436
437 SCH_COMMIT commit( m_frame );
438 SYMBOL_LIB_TABLE_ROW* row = mgr.GetLibrary( targetLib );
439 SCH_IO_MGR::SCH_FILE_T type = SCH_IO_MGR::EnumFromStr( row->GetType() );
440 IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( type ) );
441
442 wxFileName dest = row->GetFullURI( true );
443 dest.Normalize( FN_NORMALIZE_FLAGS | wxPATH_NORM_ENV_VARS );
444
445 for( const std::pair<const LIB_ID, LIB_SYMBOL*>& it : libSymbols )
446 {
447 LIB_SYMBOL* origSym = it.second;
448 LIB_SYMBOL* newSym = origSym->Flatten().release();
449
450 try
451 {
452 pi->SaveSymbol( dest.GetFullPath(), newSym );
453 }
454 catch( const IO_ERROR& ioe )
455 {
456 wxString msg;
457 msg.Printf( _( "Error saving symbol %s to library '%s'." ),
458 newSym->GetName(), row->GetNickName() );
459 msg += wxS( "\n\n" ) + ioe.What();
460 wxLogWarning( msg );
461 return 0;
462 }
463
464 if( map )
465 {
466 LIB_ID id = it.first;
467 id.SetLibNickname( targetLib );
468
469 for( SCH_SYMBOL* symbol : symbolMap[it.first] )
470 {
471 SCH_SCREEN* parentScreen = static_cast<SCH_SCREEN*>( symbol->GetParent() );
472
473 wxCHECK2( parentScreen, continue );
474
475 commit.Modify( symbol, parentScreen );
476 symbol->SetLibId( id );
477 append = true;
478 }
479 }
480 }
481
482 // Save the modified symbol library table. We need to look this up by name in each table to find
483 // whether the new library is a global or project entity as the code above to choose the library
484 // returns a different type depending on whether a global or project library is chosen.
486 SYMBOL_LIB_TABLE* projectTable = nullptr;
487
488 if( !m_frame->Prj().IsNullProject() )
489 projectTable = PROJECT_SCH::SchSymbolLibTable( &m_frame->Prj() );
490
491 if( globalTable->FindRow( targetLib ) )
492 {
493 try
494 {
495 wxString globalTablePath = SYMBOL_LIB_TABLE::GetGlobalTableFileName();
496 globalTable->Save( globalTablePath );
497 }
498 catch( const IO_ERROR& ioe )
499 {
500 wxString msg;
501 msg.Printf( _( "Error saving global library table:\n\n%s" ), ioe.What() );
502 wxMessageBox( msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
503 }
504 }
505 else if( projectTable && projectTable->FindRow( targetLib ) )
506 {
507 try
508 {
509 wxString projectPath = m_frame->Prj().GetProjectPath();
510 wxFileName projectTableFn( projectPath, SYMBOL_LIB_TABLE::GetSymbolLibTableFileName() );
511 projectTable->Save( projectTableFn.GetFullPath() );
512 }
513 catch( const IO_ERROR& ioe )
514 {
515 wxString msg;
516 msg.Printf( _( "Error saving project-specific library table:\n\n%s" ), ioe.What() );
517 wxMessageBox( msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
518 }
519 }
520
521 if( append )
522 {
523 std::set<SCH_SCREEN*> processedScreens;
524
525 for( SCH_SHEET_PATH& sheet : sheets )
526 {
527 SCH_SCREEN* screen = sheet.LastScreen();
528
529 if( processedScreens.find( ( screen ) ) == processedScreens.end() )
530 {
531 processedScreens.insert( screen );
532 screen->UpdateSymbolLinks();
533 }
534 }
535
536 commit.Push( wxS( "Update Library Identifiers" ) );
537 }
538
539 return 0;
540}
541
542
543#define HITTEST_THRESHOLD_PIXELS 5
544
546{
548 KIWAY_PLAYER* player = m_frame->Kiway().Player( FRAME_SIMULATOR, false );
549 SIMULATOR_FRAME* simFrame = static_cast<SIMULATOR_FRAME*>( player );
550
551 if( !simFrame ) // Defensive coding; shouldn't happen.
552 return 0;
553
554 if( wxWindow* blocking_win = simFrame->Kiway().GetBlockingDialog() )
555 blocking_win->Close( true );
556
557 // Deactivate other tools; particularly important if another PICKER is currently running
558 Activate();
559
560 picker->SetCursor( KICURSOR::VOLTAGE_PROBE );
561 picker->SetSnapping( false );
562
563 picker->SetClickHandler(
564 [this, simFrame]( const VECTOR2D& aPosition )
565 {
567
568 // We do not really want to keep an item selected in schematic,
569 // so clear the current selection
570 selTool->ClearSelection();
571
572 EDA_ITEM* item = selTool->GetNode( aPosition );
574
575 if( !item )
576 return false;
577
578 if( item->Type() == SCH_PIN_T )
579 {
580 try
581 {
582 SCH_PIN* pin = static_cast<SCH_PIN*>( item )->GetLibPin();
583 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item->GetParent() );
584
585 WX_STRING_REPORTER reporter;
586 SIM_LIB_MGR mgr( &m_frame->Prj() );
587
588 SIM_MODEL& model = mgr.CreateModel( &sheet, *symbol, reporter ).model;
589
590 if( reporter.HasMessage() )
591 THROW_IO_ERROR( reporter.GetMessages() );
592
593 SPICE_ITEM spiceItem;
594 spiceItem.refName = symbol->GetRef( &sheet ).ToStdString();
595 std::vector<std::string> currentNames =
596 model.SpiceGenerator().CurrentNames( spiceItem );
597
598 if( currentNames.size() == 0 )
599 {
600 return true;
601 }
602 else if( currentNames.size() == 1 )
603 {
604 simFrame->AddCurrentTrace( currentNames.at( 0 ) );
605 return true;
606 }
607
608 int modelPinIndex = model.FindModelPinIndex( pin->GetNumber().ToStdString() );
609
610 if( modelPinIndex != SIM_MODEL_PIN::NOT_CONNECTED )
611 {
612 wxString name = currentNames.at( modelPinIndex );
613 simFrame->AddCurrentTrace( name );
614 }
615 }
616 catch( const IO_ERROR& e )
617 {
619 }
620 }
621 else if( item->IsType( { SCH_ITEM_LOCATE_WIRE_T } )
622 || item->IsType( { SCH_JUNCTION_T } ) )
623 {
624 if( SCH_CONNECTION* conn = static_cast<SCH_ITEM*>( item )->Connection() )
625 {
626 wxString spiceNet = UnescapeString( conn->Name() );
628
629 simFrame->AddVoltageTrace( wxString::Format( "V(%s)", spiceNet ) );
630 }
631 }
632
633 return true;
634 } );
635
636 picker->SetMotionHandler(
637 [this, picker]( const VECTOR2D& aPos )
638 {
639 EE_COLLECTOR collector;
640 collector.m_Threshold = KiROUND( getView()->ToWorld( HITTEST_THRESHOLD_PIXELS ) );
641 collector.Collect( m_frame->GetScreen(), { SCH_ITEM_LOCATE_WIRE_T,
642 SCH_PIN_T,
643 SCH_SHEET_PIN_T }, aPos );
644
646 selectionTool->GuessSelectionCandidates( collector, aPos );
647
648 EDA_ITEM* item = collector.GetCount() == 1 ? collector[ 0 ] : nullptr;
649 SCH_LINE* wire = dynamic_cast<SCH_LINE*>( item );
650
651 const SCH_CONNECTION* conn = nullptr;
652
653 if( wire )
654 {
655 item = nullptr;
656 conn = wire->Connection();
657 }
658
659 if( item && item->Type() == SCH_PIN_T )
660 picker->SetCursor( KICURSOR::CURRENT_PROBE );
661 else
662 picker->SetCursor( KICURSOR::VOLTAGE_PROBE );
663
664 if( m_pickerItem != item )
665 {
666 if( m_pickerItem )
667 selectionTool->UnbrightenItem( m_pickerItem );
668
669 m_pickerItem = item;
670
671 if( m_pickerItem )
672 selectionTool->BrightenItem( m_pickerItem );
673 }
674
675 wxString connectionName = ( conn ) ? conn->Name() : wxString( wxS( "" ) );
676
677 if( m_frame->GetHighlightedConnection() != connectionName )
678 {
679 m_frame->SetHighlightedConnection( connectionName );
680
681 TOOL_EVENT dummyEvent;
682 UpdateNetHighlighting( dummyEvent );
683 }
684 } );
685
686 picker->SetFinalizeHandler(
687 [this]( const int& aFinalState )
688 {
689 if( m_pickerItem )
690 m_toolMgr->GetTool<EE_SELECTION_TOOL>()->UnbrightenItem( m_pickerItem );
691
692 if( !m_frame->GetHighlightedConnection().IsEmpty() )
693 {
694 m_frame->SetHighlightedConnection( wxEmptyString );
695
696 TOOL_EVENT dummyEvent;
697 UpdateNetHighlighting( dummyEvent );
698 }
699
700 // Wake the selection tool after exiting to ensure the cursor gets updated
701 // and deselect previous selection from simulator to avoid any issue
702 // ( avoid crash in some cases when the SimProbe tool is deselected )
704 selectionTool->ClearSelection();
706 } );
707
709
710 return 0;
711}
712
713
715{
717
718 // Deactivate other tools; particularly important if another PICKER is currently running
719 Activate();
720
721 picker->SetCursor( KICURSOR::TUNE );
722 picker->SetSnapping( false );
723
724 picker->SetClickHandler(
725 [this]( const VECTOR2D& aPosition )
726 {
728 EDA_ITEM* item = nullptr;
729 selTool->SelectPoint( aPosition, { SCH_SYMBOL_T, SCH_FIELD_T }, &item );
730
731 if( !item )
732 return false;
733
734 if( item->Type() != SCH_SYMBOL_T )
735 {
736 item = item->GetParent();
737
738 if( item->Type() != SCH_SYMBOL_T )
739 return false;
740 }
741
742 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
743 SCH_SHEET_PATH sheetPath = symbol->Schematic()->CurrentSheet();
744 KIWAY_PLAYER* simFrame = m_frame->Kiway().Player( FRAME_SIMULATOR, false );
745
746 if( simFrame )
747 {
748 if( wxWindow* blocking_win = simFrame->Kiway().GetBlockingDialog() )
749 blocking_win->Close( true );
750
751 static_cast<SIMULATOR_FRAME*>( simFrame )->AddTuner( sheetPath, symbol );
752 }
753
754 // We do not really want to keep a symbol selected in schematic,
755 // so clear the current selection
756 selTool->ClearSelection();
757 return true;
758 } );
759
760 picker->SetMotionHandler(
761 [this]( const VECTOR2D& aPos )
762 {
763 EE_COLLECTOR collector;
764 collector.m_Threshold = KiROUND( getView()->ToWorld( HITTEST_THRESHOLD_PIXELS ) );
765 collector.Collect( m_frame->GetScreen(), { SCH_SYMBOL_T, SCH_FIELD_T }, aPos );
766
768 selectionTool->GuessSelectionCandidates( collector, aPos );
769
770 EDA_ITEM* item = collector.GetCount() == 1 ? collector[ 0 ] : nullptr;
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<EE_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 EE_SELECTION_TOOL* selTool = aToolMgr->GetTool<EE_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 } );
1056
1057 if( flags & KIGFX::GEOMETRY )
1058 m_frame->GetScreen()->Update( item, false ); // Refresh RTree
1059 }
1060
1061 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem ) )
1062 invalidateTextVars( text );
1063
1064 return flags;
1065 } );
1066 }
1067
1068 highlightNet( m_toolMgr, CLEAR );
1069 return 0;
1070}
1071
1072
1074{
1075 wxCHECK( m_frame, 0 );
1076
1077 const SCH_SHEET_PATH& sheetPath = m_frame->GetCurrentSheet();
1079 CONNECTION_GRAPH* connectionGraph = m_frame->Schematic().ConnectionGraph();
1080 wxString selectedName = m_frame->GetHighlightedConnection();
1081
1082 std::set<wxString> connNames;
1083 std::vector<EDA_ITEM*> itemsToRedraw;
1084
1085 wxCHECK( screen && connectionGraph, 0 );
1086
1087 if( !selectedName.IsEmpty() )
1088 {
1089 connNames.emplace( selectedName );
1090
1091 if( CONNECTION_SUBGRAPH* sg =
1092 connectionGraph->FindSubgraphByName( selectedName, sheetPath ) )
1093 {
1095 {
1096 for( const SCH_ITEM* item : sg->GetItems() )
1097 {
1098 wxCHECK2( item, continue );
1099
1100 if( SCH_CONNECTION* connection = item->Connection() )
1101 {
1102 for( const std::shared_ptr<SCH_CONNECTION>& member :
1103 connection->AllMembers() )
1104 {
1105 if( member )
1106 connNames.emplace( member->Name() );
1107 }
1108 }
1109 }
1110 }
1111 }
1112
1113 // Place all bus names that are connected to the selected net in the set, regardless of
1114 // their sheet. This ensures that nets that are connected to a bus on a different sheet
1115 // get their buses highlighted as well.
1116 for( CONNECTION_SUBGRAPH* sg : connectionGraph->GetAllSubgraphs( selectedName ) )
1117 {
1118 for( const auto& [_, bus_sgs] : sg->GetBusParents() )
1119 {
1120 for( CONNECTION_SUBGRAPH* bus_sg : bus_sgs )
1121 {
1122 connNames.emplace( bus_sg->GetNetName() );
1123 }
1124 }
1125
1126 }
1127 }
1128
1129 for( SCH_ITEM* item : screen->Items() )
1130 {
1131 wxCHECK2( item, continue );
1132
1133 if( !item->IsConnectable() )
1134 continue;
1135
1136 SCH_ITEM* redrawItem = nullptr;
1137
1138 if( item->Type() == SCH_SYMBOL_T )
1139 {
1140 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
1141
1142 for( SCH_PIN* pin : symbol->GetPins() )
1143 {
1144 if( SCH_CONNECTION* pin_conn = pin->Connection() )
1145 {
1146 if( !pin->IsBrightened() && connNames.count( pin_conn->Name() ) )
1147 {
1148 pin->SetBrightened();
1149 redrawItem = symbol;
1150 }
1151 else if( pin->IsBrightened() && !connNames.count( pin_conn->Name() ) )
1152 {
1153 pin->ClearBrightened();
1154 redrawItem = symbol;
1155 }
1156 }
1157 }
1158
1159 if( symbol->IsPower() && symbol->GetPins().size() )
1160 {
1161 if( SCH_CONNECTION* pinConn = symbol->GetPins()[0]->Connection() )
1162 {
1163 std::vector<SCH_FIELD>& fields = symbol->GetFields();
1164
1165 for( int id : { REFERENCE_FIELD, VALUE_FIELD } )
1166 {
1167 if( !fields[id].IsVisible() )
1168 continue;
1169
1170 if( !fields[id].IsBrightened() && connNames.count( pinConn->Name() ) )
1171 {
1172 fields[id].SetBrightened();
1173 redrawItem = symbol;
1174 }
1175 else if( fields[id].IsBrightened() && !connNames.count( pinConn->Name() ) )
1176 {
1177 fields[id].ClearBrightened();
1178 redrawItem = symbol;
1179 }
1180 }
1181 }
1182 }
1183 }
1184 else if( item->Type() == SCH_SHEET_T )
1185 {
1186 SCH_SHEET* sheet = static_cast<SCH_SHEET*>( item );
1187
1188 for( SCH_SHEET_PIN* pin : sheet->GetPins() )
1189 {
1190 wxCHECK2( pin, continue );
1191
1192 if( SCH_CONNECTION* pin_conn = pin->Connection() )
1193 {
1194 if( !pin->IsBrightened() && connNames.count( pin_conn->Name() ) )
1195 {
1196 pin->SetBrightened();
1197 redrawItem = sheet;
1198 }
1199 else if( pin->IsBrightened() && !connNames.count( pin_conn->Name() ) )
1200 {
1201 pin->ClearBrightened();
1202 redrawItem = sheet;
1203 }
1204 }
1205 }
1206 }
1207 else
1208 {
1209 if( SCH_CONNECTION* itemConn = item->Connection() )
1210 {
1211 if( !item->IsBrightened() && connNames.count( itemConn->Name() ) )
1212 {
1213 item->SetBrightened();
1214 redrawItem = item;
1215 }
1216 else if( item->IsBrightened() && !connNames.count( itemConn->Name() ) )
1217 {
1218 item->ClearBrightened();
1219 redrawItem = item;
1220 }
1221 }
1222 }
1223
1224 if( redrawItem )
1225 itemsToRedraw.push_back( redrawItem );
1226 }
1227
1228 if( itemsToRedraw.size() )
1229 {
1230 // Be sure highlight change will be redrawn
1231 KIGFX::VIEW* view = getView();
1232
1233 for( EDA_ITEM* redrawItem : itemsToRedraw )
1235
1237 }
1238
1239 return 0;
1240}
1241
1242
1244{
1246
1247 // Deactivate other tools; particularly important if another PICKER is currently running
1248 Activate();
1249
1250 picker->SetCursor( KICURSOR::BULLSEYE );
1251 picker->SetSnapping( false );
1252
1253 picker->SetClickHandler(
1254 [this] ( const VECTOR2D& aPos )
1255 {
1256 return highlightNet( m_toolMgr, aPos );
1257 } );
1258
1260
1261 return 0;
1262}
1263
1264
1266{
1267 wxCHECK( m_frame, 0 );
1268
1269 if( m_frame->GetUndoCommandCount() <= 0 )
1270 return 0;
1271
1272 // Inform tools that undo command was issued
1274
1275 // Get the old list
1277
1278 wxCHECK( undo_list, 0 );
1279
1280 m_frame->PutDataInPreviousState( undo_list );
1281
1282 // Now push the old command to the RedoList
1283 undo_list->ReversePickersListOrder();
1284 m_frame->PushCommandToRedoList( undo_list );
1285
1286 m_toolMgr->GetTool<EE_SELECTION_TOOL>()->RebuildSelection();
1287
1289 m_frame->OnModify();
1290
1291 return 0;
1292}
1293
1294
1296{
1297 wxCHECK( m_frame, 0 );
1298
1299 if( m_frame->GetRedoCommandCount() == 0 )
1300 return 0;
1301
1302 // Inform tools that undo command was issued
1304
1305 /* Get the old list */
1307
1308 wxCHECK( list, 0 );
1309
1310 /* Redo the command: */
1312
1313 /* Put the old list in UndoList */
1316
1317 m_toolMgr->GetTool<EE_SELECTION_TOOL>()->RebuildSelection();
1318
1320 m_frame->OnModify();
1321
1322 return 0;
1323}
1324
1325
1326bool SCH_EDITOR_CONTROL::doCopy( bool aUseDuplicateClipboard )
1327{
1329 EE_SELECTION& selection = selTool->RequestSelection();
1330 SCHEMATIC& schematic = m_frame->Schematic();
1331
1332 if( selection.Empty() )
1333 return false;
1334
1335 if( aUseDuplicateClipboard )
1336 m_duplicateIsHoverSelection = selection.IsHover();
1337
1338 selection.SetScreen( m_frame->GetScreen() );
1340
1341 for( EDA_ITEM* item : selection )
1342 {
1343 if( item->Type() == SCH_SHEET_T )
1344 {
1345 SCH_SHEET* sheet = (SCH_SHEET*) item;
1346 m_supplementaryClipboard[ sheet->GetFileName() ] = sheet->GetScreen();
1347 }
1348 else if( item->Type() == SCH_FIELD_T && selection.IsHover() )
1349 {
1350 // Most of the time the user is trying to duplicate the parent symbol
1351 // and the field text is in it
1352 selection.Add( item->GetParent() );
1353 }
1354 else if( item->Type() == SCH_MARKER_T )
1355 {
1356 // Don't let the markers be copied
1357 selection.Remove( item );
1358 }
1359 }
1360
1361 STRING_FORMATTER formatter;
1362 SCH_IO_KICAD_SEXPR plugin;
1364
1365 plugin.Format( &selection, &selPath, schematic, &formatter, true );
1366
1367 std::string prettyData = formatter.GetString();
1368 KICAD_FORMAT::Prettify( prettyData, true );
1369
1370 if( selection.IsHover() )
1372
1373 if( aUseDuplicateClipboard )
1374 {
1375 m_duplicateClipboard = prettyData;
1376 return true;
1377 }
1378
1379 return SaveClipboard( prettyData );
1380}
1381
1382
1383bool SCH_EDITOR_CONTROL::searchSupplementaryClipboard( const wxString& aSheetFilename,
1384 SCH_SCREEN** aScreen )
1385{
1386 if( m_supplementaryClipboard.count( aSheetFilename ) > 0 )
1387 {
1388 *aScreen = m_supplementaryClipboard[ aSheetFilename ];
1389 return true;
1390 }
1391
1392 return false;
1393}
1394
1395
1397{
1398 doCopy( true ); // Use the local clipboard
1399 Paste( aEvent );
1400
1401 return 0;
1402}
1403
1404
1406{
1407 wxTextEntry* textEntry = dynamic_cast<wxTextEntry*>( wxWindow::FindFocus() );
1408
1409 if( textEntry )
1410 {
1411 textEntry->Cut();
1412 return 0;
1413 }
1414
1415 if( doCopy() )
1417
1418 return 0;
1419}
1420
1421
1423{
1424 wxTextEntry* textEntry = dynamic_cast<wxTextEntry*>( wxWindow::FindFocus() );
1425
1426 if( textEntry )
1427 {
1428 textEntry->Copy();
1429 return 0;
1430 }
1431
1432 doCopy();
1433
1434 return 0;
1435}
1436
1437
1439{
1441 EE_SELECTION& selection = selTool->RequestSelection();
1442
1443 if( selection.Empty() )
1444 return false;
1445
1446 wxString itemsAsText = GetSelectedItemsAsText( selection );
1447
1448 if( selection.IsHover() )
1450
1451 return SaveClipboard( itemsAsText.ToStdString() );
1452}
1453
1454
1456 const SCH_SHEET_PATH& aPastePath,
1457 const KIID_PATH& aClipPath,
1458 bool aForceKeepAnnotations )
1459{
1460 wxCHECK( m_frame && aSymbol, /* void */ );
1461
1462 SCH_SYMBOL_INSTANCE newInstance;
1463 bool instanceFound = false;
1464 KIID_PATH pasteLookupPath = aClipPath;
1465
1466 m_pastedSymbols.insert( aSymbol );
1467
1468 for( const SCH_SYMBOL_INSTANCE& tmp : aSymbol->GetInstances() )
1469 {
1470 if( ( tmp.m_Path.empty() && aClipPath.empty() )
1471 || ( !aClipPath.empty() && tmp.m_Path.EndsWith( aClipPath ) ) )
1472 {
1473 newInstance = tmp;
1474 instanceFound = true;
1475
1476 wxLogTrace( traceSchPaste,
1477 wxS( "Pasting found symbol instance with reference %s, unit %d:"
1478 "\n\tClipboard path: %s\n\tSymbol UUID: %s." ),
1479 tmp.m_Reference, tmp.m_Unit,
1480 aClipPath.AsString(), aSymbol->m_Uuid.AsString() );
1481
1482 break;
1483 }
1484 }
1485
1486 // The pasted symbol look up paths include the symbol UUID.
1487 pasteLookupPath.push_back( aSymbol->m_Uuid );
1488
1489 if( !instanceFound )
1490 {
1491 wxLogTrace( traceSchPaste,
1492 wxS( "Clipboard symbol instance **not** found:\n\tClipboard path: %s\n\t"
1493 "Symbol UUID: %s." ),
1494 aClipPath.AsString(), aSymbol->m_Uuid.AsString() );
1495
1496 // Some legacy versions saved value fields escaped. While we still do in the symbol
1497 // editor, we don't anymore in the schematic, so be sure to unescape them.
1498 SCH_FIELD* valueField = aSymbol->GetField( VALUE_FIELD );
1499 valueField->SetText( UnescapeString( valueField->GetText() ) );
1500
1501 // Pasted from notepad or an older instance of eeschema. Use the values in the fields
1502 // instead.
1503 newInstance.m_Reference = aSymbol->GetField( REFERENCE_FIELD )->GetText();
1504 newInstance.m_Unit = aSymbol->GetUnit();
1505 }
1506
1507 newInstance.m_Path = aPastePath.Path();
1508 newInstance.m_ProjectName = m_frame->Prj().GetProjectName();
1509
1510 aSymbol->AddHierarchicalReference( newInstance );
1511
1512 if( !aForceKeepAnnotations )
1513 aSymbol->ClearAnnotation( &aPastePath, false );
1514
1515 // We might clear annotations but always leave the original unit number from the paste.
1516 aSymbol->SetUnit( newInstance.m_Unit );
1517}
1518
1519
1521 const SCH_SHEET_PATH& aPastePath,
1522 const KIID_PATH& aClipPath,
1523 bool aForceKeepAnnotations,
1524 SCH_SHEET_LIST* aPastedSheets,
1525 std::map<SCH_SHEET_PATH,
1526 SCH_REFERENCE_LIST>& aPastedSymbols )
1527{
1528 wxCHECK( aSheet && aPastedSheets, aPastePath );
1529
1530 SCH_SHEET_PATH sheetPath = aPastePath;
1531 sheetPath.push_back( aSheet );
1532
1533 aPastedSheets->push_back( sheetPath );
1534
1535 if( aSheet->GetScreen() == nullptr )
1536 return sheetPath; // We can only really set the page number but not load any items
1537
1538 for( SCH_ITEM* item : aSheet->GetScreen()->Items() )
1539 {
1540 if( item->IsConnectable() )
1541 item->SetConnectivityDirty();
1542
1543 if( item->Type() == SCH_SYMBOL_T )
1544 {
1545 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
1546
1547 wxCHECK2( symbol, continue );
1548
1549 // Only do this once if the symbol is shared across multiple sheets.
1550 if( !m_pastedSymbols.count( symbol ) )
1551 {
1552 for( SCH_PIN* pin : symbol->GetPins() )
1553 {
1554 const_cast<KIID&>( pin->m_Uuid ) = KIID();
1555 pin->SetConnectivityDirty();
1556 }
1557 }
1558
1559 updatePastedSymbol( symbol, sheetPath, aClipPath, aForceKeepAnnotations );
1560 }
1561 else if( item->Type() == SCH_SHEET_T )
1562 {
1563 SCH_SHEET* subsheet = static_cast<SCH_SHEET*>( item );
1564
1565 wxCHECK2( subsheet, continue );
1566
1567 // Make sure pins get a new UUID and set the dirty connectivity flag.
1568 if( !aPastedSheets->ContainsSheet( subsheet ) )
1569 {
1570 for( SCH_SHEET_PIN* pin : subsheet->GetPins() )
1571 {
1572 const_cast<KIID&>( pin->m_Uuid ) = KIID();
1573 pin->SetConnectivityDirty();
1574 }
1575 }
1576
1577 KIID_PATH newClipPath = aClipPath;
1578 newClipPath.push_back( subsheet->m_Uuid );
1579
1580 updatePastedSheet( subsheet, sheetPath, newClipPath, aForceKeepAnnotations,
1581 aPastedSheets, aPastedSymbols );
1582 }
1583 }
1584
1585 sheetPath.GetSymbols( aPastedSymbols[aPastePath] );
1586
1587 return sheetPath;
1588}
1589
1590
1592{
1593 wxCHECK( aScreen, /* void */ );
1594
1595 for( const SCH_ITEM* item : aScreen->Items() )
1596 {
1597 if( item->Type() == SCH_SYMBOL_T )
1598 {
1599 const SCH_SYMBOL* symbol = static_cast<const SCH_SYMBOL*>( item );
1600
1601 wxCHECK2( symbol, continue );
1602
1603 for( const SCH_SYMBOL_INSTANCE& symbolInstance : symbol->GetInstances() )
1604 {
1605 KIID_PATH pathWithSymbol = symbolInstance.m_Path;
1606
1607 pathWithSymbol.push_back( symbol->m_Uuid );
1608
1609 m_clipboardSymbolInstances[pathWithSymbol] = symbolInstance;
1610 }
1611 }
1612 }
1613}
1614
1615
1617{
1618 wxCHECK( m_frame, /* void */ );
1619
1620 for( SCH_SYMBOL* symbol : m_pastedSymbols )
1621 {
1622 wxCHECK2( symbol, continue );
1623
1624 std::vector<KIID_PATH> instancePathsToRemove;
1625
1626 for( const SCH_SYMBOL_INSTANCE& instance : symbol->GetInstances() )
1627 {
1628 if( ( instance.m_ProjectName != m_frame->Prj().GetProjectName() )
1629 || instance.m_Path.empty() )
1630 instancePathsToRemove.emplace_back( instance.m_Path );
1631 }
1632
1633 for( const KIID_PATH& path : instancePathsToRemove )
1634 symbol->RemoveInstance( path );
1635 }
1636}
1637
1638
1640{
1641 wxTextEntry* textEntry = dynamic_cast<wxTextEntry*>( wxWindow::FindFocus() );
1642
1643 if( textEntry )
1644 {
1645 textEntry->Paste();
1646 return 0;
1647 }
1648
1650 std::string content;
1651 VECTOR2I eventPos;
1652
1653 SCH_SHEET tempSheet;
1654 SCH_SCREEN* tempScreen = new SCH_SCREEN( &m_frame->Schematic() );
1655
1656 if( std::unique_ptr<wxImage> clipImg = GetImageFromClipboard() )
1657 {
1658 // Just image data
1659 auto bitmap = std::make_unique<SCH_BITMAP>();
1660 bitmap->GetReferenceImage().SetImage( *clipImg );
1661
1662 tempScreen->Append( bitmap.release() );
1663 }
1664 else
1665 {
1666 if( aEvent.IsAction( &ACTIONS::duplicate ) )
1667 content = m_duplicateClipboard;
1668 else
1669 content = GetClipboardUTF8();
1670
1671 if( content.empty() )
1672 {
1673 delete tempScreen;
1674 return 0;
1675 }
1676
1677 if( aEvent.IsAction( &ACTIONS::duplicate ) )
1678 eventPos = getViewControls()->GetCursorPosition( false );
1679
1680 STRING_LINE_READER reader( content, "Clipboard" );
1681 SCH_IO_KICAD_SEXPR plugin;
1682
1683 // Screen object on heap is owned by the sheet.
1684 tempSheet.SetScreen( tempScreen );
1685
1686 try
1687 {
1688 plugin.LoadContent( reader, &tempSheet );
1689 }
1690 catch( IO_ERROR& )
1691 {
1692 // If it wasn't content, then paste as a text object.
1693 SCH_TEXT* text_item = new SCH_TEXT( VECTOR2I( 0, 0 ), content );
1694 tempScreen->Append( text_item );
1695 }
1696 }
1697
1698 m_pastedSymbols.clear();
1700
1701 // Save pasted symbol instances in case the user chooses to keep existing symbol annotation.
1702 setPastedSymbolInstances( tempScreen );
1703
1704 tempScreen->MigrateSimModels();
1705
1707 int annotateStartNum = m_frame->Schematic().Settings().m_AnnotateStartNum;
1708
1709 PASTE_MODE pasteMode = PASTE_MODE::UNIQUE_ANNOTATIONS;
1710
1711 if( aEvent.IsAction( &ACTIONS::pasteSpecial ) )
1712 {
1713 DIALOG_PASTE_SPECIAL dlg( m_frame, &pasteMode );
1714
1715 if( dlg.ShowModal() == wxID_CANCEL )
1716 return 0;
1717 }
1718
1719 bool forceKeepAnnotations = pasteMode != PASTE_MODE::REMOVE_ANNOTATIONS;
1720
1721 // SCH_SEXP_PLUGIN added the items to the paste screen, but not to the view or anything
1722 // else. Pull them back out to start with.
1723 SCH_COMMIT commit( m_toolMgr );
1724 EDA_ITEMS loadedItems;
1725 std::vector<SCH_ITEM*> sortedLoadedItems;
1726 bool sheetsPasted = false;
1727 SCH_SHEET_LIST hierarchy = m_frame->Schematic().Hierarchy();
1728 SCH_SHEET_PATH& pasteRoot = m_frame->GetCurrentSheet();
1729 wxFileName destFn = pasteRoot.Last()->GetFileName();
1730
1731 if( destFn.IsRelative() )
1732 destFn.MakeAbsolute( m_frame->Prj().GetProjectPath() );
1733
1734 // List of paths in the hierarchy that refer to the destination sheet of the paste
1735 SCH_SHEET_LIST sheetPathsForScreen = hierarchy.FindAllSheetsForScreen( pasteRoot.LastScreen() );
1736 sheetPathsForScreen.SortByPageNumbers();
1737
1738 // Build a list of screens from the current design (to avoid loading sheets that already exist)
1739 std::map<wxString, SCH_SCREEN*> loadedScreens;
1740
1741 for( const SCH_SHEET_PATH& item : hierarchy )
1742 {
1743 if( item.LastScreen() )
1744 loadedScreens[item.Last()->GetFileName()] = item.LastScreen();
1745 }
1746
1747 // Build symbol list for reannotation of duplicates
1748 SCH_REFERENCE_LIST existingRefs;
1749 hierarchy.GetSymbols( existingRefs );
1750 existingRefs.SortByReferenceOnly();
1751
1752 std::set<wxString> existingRefsSet;
1753
1754 for( const SCH_REFERENCE& ref : existingRefs )
1755 existingRefsSet.insert( ref.GetRef() );
1756
1757 // Build UUID map for fetching last-resolved-properties
1758 std::map<KIID, EDA_ITEM*> itemMap;
1759 hierarchy.FillItemMap( itemMap );
1760
1761 // Keep track of pasted sheets and symbols for the different paths to the hierarchy.
1762 std::map<SCH_SHEET_PATH, SCH_REFERENCE_LIST> pastedSymbols;
1763 std::map<SCH_SHEET_PATH, SCH_SHEET_LIST> pastedSheets;
1764
1765 for( SCH_ITEM* item : tempScreen->Items() )
1766 {
1767 if( item->Type() == SCH_SHEET_T )
1768 sortedLoadedItems.push_back( item );
1769 else
1770 loadedItems.push_back( item );
1771 }
1772
1773 sort( sortedLoadedItems.begin(), sortedLoadedItems.end(),
1774 []( SCH_ITEM* firstItem, SCH_ITEM* secondItem )
1775 {
1776 SCH_SHEET* firstSheet = static_cast<SCH_SHEET*>( firstItem );
1777 SCH_SHEET* secondSheet = static_cast<SCH_SHEET*>( secondItem );
1778 return StrNumCmp( firstSheet->GetName(), secondSheet->GetName(), false ) < 0;
1779 });
1780
1781
1782 for( SCH_ITEM* item : sortedLoadedItems )
1783 {
1784 loadedItems.push_back( item );
1785
1786 if( item->Type() == SCH_SHEET_T )
1787 {
1788 SCH_SHEET* sheet = static_cast<SCH_SHEET*>( item );
1789 SCH_FIELD& nameField = sheet->GetFields()[SHEETNAME];
1790 wxString baseName = nameField.GetText();
1791 wxFileName srcFn = sheet->GetFileName();
1792
1793 if( srcFn.IsRelative() )
1794 srcFn.MakeAbsolute( m_frame->Prj().GetProjectPath() );
1795
1796 SCH_SHEET_LIST sheetHierarchy( sheet );
1797
1798 if( hierarchy.TestForRecursion( sheetHierarchy, destFn.GetFullPath( wxPATH_UNIX ) ) )
1799 {
1800 auto msg = wxString::Format( _( "The pasted sheet '%s'\n"
1801 "was dropped because the destination already has "
1802 "the sheet or one of its subsheets as a parent." ),
1803 sheet->GetFileName() );
1804 DisplayError( m_frame, msg );
1805 loadedItems.pop_back();
1806 }
1807 }
1808 }
1809
1810 // Remove the references from our temporary screen to prevent freeing on the DTOR
1811 tempScreen->Clear( false );
1812
1813 for( EDA_ITEM* item : loadedItems )
1814 {
1815 KIID_PATH clipPath( wxT( "/" ) ); // clipboard is at root
1816
1817 SCH_ITEM* schItem = static_cast<SCH_ITEM*>( item );
1818
1819 wxCHECK2( schItem, continue );
1820
1821 if( schItem->IsConnectable() )
1822 schItem->SetConnectivityDirty();
1823
1824 if( item->Type() == SCH_SYMBOL_T )
1825 {
1826 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
1827
1828 // The library symbol gets set from the cached library symbols in the current
1829 // schematic not the symbol libraries. The cached library symbol may have
1830 // changed from the original library symbol which would cause the copy to
1831 // be incorrect.
1832 SCH_SCREEN* currentScreen = m_frame->GetScreen();
1833
1834 wxCHECK2( currentScreen, continue );
1835
1836 auto it = currentScreen->GetLibSymbols().find( symbol->GetSchSymbolLibraryName() );
1837 auto end = currentScreen->GetLibSymbols().end();
1838
1839 if( it == end )
1840 {
1841 // If can't find library definition in the design, use the pasted library
1842 it = tempScreen->GetLibSymbols().find( symbol->GetSchSymbolLibraryName() );
1843 end = tempScreen->GetLibSymbols().end();
1844 }
1845
1846 LIB_SYMBOL* libSymbol = nullptr;
1847
1848 if( it != end )
1849 {
1850 libSymbol = new LIB_SYMBOL( *it->second );
1851 symbol->SetLibSymbol( libSymbol );
1852 }
1853
1854 for( SCH_SHEET_PATH& sheetPath : sheetPathsForScreen )
1855 updatePastedSymbol( symbol, sheetPath, clipPath, forceKeepAnnotations );
1856
1857 // Most modes will need new KIIDs for the symbol and its pins
1858 // However, if we are pasting unique annotations, we need to check if the symbol
1859 // is not already in the hierarchy. If we don't already have a copy of the
1860 // symbol, we just keep the existing KIID data as it is likely the same symbol
1861 // being moved around the schematic
1862 bool needsNewKiid = ( pasteMode != PASTE_MODE::UNIQUE_ANNOTATIONS );
1863
1864 for( const SCH_SYMBOL_INSTANCE& instance : symbol->GetInstances() )
1865 {
1866 if( existingRefsSet.contains( instance.m_Reference ) )
1867 {
1868 needsNewKiid = true;
1869 break;
1870 }
1871 }
1872
1873 if( needsNewKiid )
1874 {
1875 // Assign a new KIID
1876 const_cast<KIID&>( item->m_Uuid ) = KIID();
1877
1878 // Make sure pins get a new UUID
1879 for( SCH_PIN* pin : symbol->GetPins() )
1880 {
1881 const_cast<KIID&>( pin->m_Uuid ) = KIID();
1882 pin->SetConnectivityDirty();
1883 }
1884 }
1885
1886 for( SCH_SHEET_PATH& sheetPath : sheetPathsForScreen )
1887 {
1888 // Ignore symbols from a non-existant library.
1889 if( libSymbol )
1890 {
1891 SCH_REFERENCE schReference( symbol, sheetPath );
1892 schReference.SetSheetNumber( sheetPath.GetVirtualPageNumber() );
1893 pastedSymbols[sheetPath].AddItem( schReference );
1894 }
1895 }
1896 }
1897 else if( item->Type() == SCH_SHEET_T )
1898 {
1899 SCH_SHEET* sheet = (SCH_SHEET*) item;
1900 SCH_FIELD& nameField = sheet->GetFields()[SHEETNAME];
1901 wxString baseName = nameField.GetText();
1902 wxString candidateName = baseName;
1903 wxString number;
1904
1905 while( !baseName.IsEmpty() && wxIsdigit( baseName.Last() ) )
1906 {
1907 number = baseName.Last() + number;
1908 baseName.RemoveLast();
1909 }
1910
1911 // Update hierarchy to include any other sheets we already added, avoiding
1912 // duplicate sheet names
1913 hierarchy = m_frame->Schematic().Hierarchy();
1914
1915 //@todo: it might be better to just iterate through the sheet names
1916 // in this screen instead of the whole hierarchy.
1917 int uniquifier = std::max( 0, wxAtoi( number ) ) + 1;
1918
1919 while( hierarchy.NameExists( candidateName ) )
1920 candidateName = wxString::Format( wxT( "%s%d" ), baseName, uniquifier++ );
1921
1922 nameField.SetText( candidateName );
1923
1924 wxFileName fn = sheet->GetFileName();
1925 SCH_SCREEN* existingScreen = nullptr;
1926
1927 sheet->SetParent( pasteRoot.Last() );
1928 sheet->SetScreen( nullptr );
1929
1930 if( !fn.IsAbsolute() )
1931 {
1932 wxFileName currentSheetFileName = pasteRoot.LastScreen()->GetFileName();
1933 fn.Normalize( FN_NORMALIZE_FLAGS | wxPATH_NORM_ENV_VARS,
1934 currentSheetFileName.GetPath() );
1935 }
1936
1937 // Try to find the screen for the pasted sheet by several means
1938 if( !m_frame->Schematic().Root().SearchHierarchy( fn.GetFullPath( wxPATH_UNIX ),
1939 &existingScreen ) )
1940 {
1941 if( loadedScreens.count( sheet->GetFileName() ) > 0 )
1942 existingScreen = loadedScreens.at( sheet->GetFileName() );
1943 else
1944 searchSupplementaryClipboard( sheet->GetFileName(), &existingScreen );
1945 }
1946
1947 if( existingScreen )
1948 {
1949 sheet->SetScreen( existingScreen );
1950 }
1951 else
1952 {
1953 if( !m_frame->LoadSheetFromFile( sheet, &pasteRoot, fn.GetFullPath() ) )
1954 m_frame->InitSheet( sheet, sheet->GetFileName() );
1955 }
1956
1957 // Save the symbol instances in case the user chooses to keep the existing
1958 // symbol annotation.
1960 sheetsPasted = true;
1961
1962 // Push it to the clipboard path while it still has its old KIID
1963 clipPath.push_back( sheet->m_Uuid );
1964
1965 // Assign a new KIID to the pasted sheet
1966 const_cast<KIID&>( sheet->m_Uuid ) = KIID();
1967
1968 // Make sure pins get a new UUID
1969 for( SCH_SHEET_PIN* pin : sheet->GetPins() )
1970 {
1971 const_cast<KIID&>( pin->m_Uuid ) = KIID();
1972 pin->SetConnectivityDirty();
1973 }
1974
1975 // Once we have our new KIID we can update all pasted instances. This will either
1976 // reset the annotations or copy "kept" annotations from the supplementary clipboard.
1977 for( SCH_SHEET_PATH& sheetPath : sheetPathsForScreen )
1978 {
1979 SCH_SHEET_PATH subPath = updatePastedSheet( sheet, sheetPath, clipPath,
1980 ( forceKeepAnnotations && annotate.automatic ),
1981 &pastedSheets[sheetPath],
1982 pastedSymbols );
1983 }
1984 }
1985 else
1986 {
1987 SCH_ITEM* srcItem = dynamic_cast<SCH_ITEM*>( itemMap[ item->m_Uuid ] );
1988 SCH_ITEM* destItem = dynamic_cast<SCH_ITEM*>( item );
1989
1990 // Everything gets a new KIID
1991 const_cast<KIID&>( item->m_Uuid ) = KIID();
1992
1993 if( srcItem && destItem )
1994 {
1995 destItem->SetConnectivityDirty( true );
1996 destItem->SetLastResolvedState( srcItem );
1997 }
1998 }
1999
2000 // Lines need both ends selected for a move after paste so the whole line moves.
2001 if( item->Type() == SCH_LINE_T )
2002 item->SetFlags( STARTPOINT | ENDPOINT );
2003
2004 item->SetFlags( IS_NEW | IS_PASTED | IS_MOVING );
2005
2006 if( !m_frame->GetScreen()->CheckIfOnDrawList( (SCH_ITEM*) item ) ) // don't want a loop!
2007 m_frame->AddToScreen( item, m_frame->GetScreen() );
2008
2009 commit.Added( (SCH_ITEM*) item, m_frame->GetScreen() );
2010
2011 // Start out hidden so the pasted items aren't "ghosted" in their original location
2012 // before being moved to the current location.
2013 getView()->Hide( item, true );
2014 }
2015
2016 if( sheetsPasted )
2017 {
2018 // The full schematic hierarchy need to be update before assigning new annotation and
2019 // page numbers.
2021
2022 // Update page numbers: Find next free numeric page number
2023 for( SCH_SHEET_PATH& sheetPath : sheetPathsForScreen )
2024 {
2025 for( SCH_SHEET_PATH& pastedSheet : pastedSheets[sheetPath] )
2026 {
2027 int page = 1;
2028 wxString pageNum = wxString::Format( "%d", page );
2029
2030 while( hierarchy.PageNumberExists( pageNum ) )
2031 pageNum = wxString::Format( "%d", ++page );
2032
2033 SCH_SHEET_INSTANCE sheetInstance;
2034
2035 sheetInstance.m_Path = pastedSheet.Path();
2036
2037 // Don't include the actual sheet in the instance path.
2038 sheetInstance.m_Path.pop_back();
2039 sheetInstance.m_PageNumber = pageNum;
2040 sheetInstance.m_ProjectName = m_frame->Prj().GetProjectName();
2041
2042 SCH_SHEET* sheet = pastedSheet.Last();
2043
2044 wxCHECK2( sheet, continue );
2045
2046 sheet->AddInstance( sheetInstance );
2047 hierarchy.push_back( pastedSheet );
2048
2049 // Remove all pasted sheet instance data that is not part of the current project.
2050 std::vector<KIID_PATH> instancesToRemove;
2051
2052 for( const SCH_SHEET_INSTANCE& instance : sheet->GetInstances() )
2053 {
2054 if( !hierarchy.HasPath( instance.m_Path ) )
2055 instancesToRemove.push_back( instance.m_Path );
2056 }
2057
2058 for( const KIID_PATH& instancePath : instancesToRemove )
2059 sheet->RemoveInstance( instancePath );
2060 }
2061 }
2062
2064
2065 // Get a version with correct sheet numbers since we've pasted sheets,
2066 // we'll need this when annotating next
2067 hierarchy = m_frame->Schematic().Hierarchy();
2068 }
2069
2070 std::map<SCH_SHEET_PATH, SCH_REFERENCE_LIST> annotatedSymbols;
2071
2072 // Update the list of symbol instances that satisfy the annotation criteria.
2073 for( const SCH_SHEET_PATH& sheetPath : sheetPathsForScreen )
2074 {
2075 for( size_t i = 0; i < pastedSymbols[sheetPath].GetCount(); i++ )
2076 {
2077 if( pasteMode == PASTE_MODE::UNIQUE_ANNOTATIONS
2078 || pasteMode == PASTE_MODE::RESPECT_OPTIONS
2079 || pastedSymbols[sheetPath][i].AlwaysAnnotate() )
2080 {
2081 annotatedSymbols[sheetPath].AddItem( pastedSymbols[sheetPath][i] );
2082 }
2083 }
2084
2085 for( const SCH_SHEET_PATH& pastedSheetPath : pastedSheets[sheetPath] )
2086 {
2087 for( size_t i = 0; i < pastedSymbols[pastedSheetPath].GetCount(); i++ )
2088 {
2089 if( pasteMode == PASTE_MODE::UNIQUE_ANNOTATIONS
2090 || pasteMode == PASTE_MODE::RESPECT_OPTIONS
2091 || pastedSymbols[pastedSheetPath][i].AlwaysAnnotate() )
2092 {
2093 annotatedSymbols[pastedSheetPath].AddItem( pastedSymbols[pastedSheetPath][i] );
2094 }
2095 }
2096 }
2097 }
2098
2099 if( !annotatedSymbols.empty() )
2100 {
2101 for( SCH_SHEET_PATH& path : sheetPathsForScreen )
2102 {
2103 annotatedSymbols[path].SortByReferenceOnly();
2104
2105 if( pasteMode == PASTE_MODE::UNIQUE_ANNOTATIONS )
2106 {
2107 annotatedSymbols[path].ReannotateDuplicates( existingRefs );
2108 }
2109 else
2110 {
2111 annotatedSymbols[path].ReannotateByOptions( (ANNOTATE_ORDER_T) annotate.sort_order,
2112 (ANNOTATE_ALGO_T) annotate.method,
2113 annotateStartNum, existingRefs, false,
2114 &hierarchy );
2115 }
2116
2117 annotatedSymbols[path].UpdateAnnotation();
2118
2119 // Update existing refs for next iteration
2120 for( size_t i = 0; i < annotatedSymbols[path].GetCount(); i++ )
2121 existingRefs.AddItem( annotatedSymbols[path][i] );
2122
2123 for( const SCH_SHEET_PATH& pastedSheetPath : pastedSheets[path] )
2124 {
2125 annotatedSymbols[pastedSheetPath].SortByReferenceOnly();
2126
2127 if( pasteMode == PASTE_MODE::UNIQUE_ANNOTATIONS )
2128 {
2129 annotatedSymbols[pastedSheetPath].ReannotateDuplicates( existingRefs );
2130 }
2131 else
2132 {
2133 annotatedSymbols[pastedSheetPath].ReannotateByOptions( (ANNOTATE_ORDER_T) annotate.sort_order,
2134 (ANNOTATE_ALGO_T) annotate.method,
2135 annotateStartNum, existingRefs,
2136 false,
2137 &hierarchy );
2138 }
2139
2140 annotatedSymbols[pastedSheetPath].UpdateAnnotation();
2141
2142 // Update existing refs for next iteration
2143 for( size_t i = 0; i < annotatedSymbols[pastedSheetPath].GetCount(); i++ )
2144 existingRefs.AddItem( annotatedSymbols[pastedSheetPath][i] );
2145 }
2146 }
2147 }
2148
2150
2151 // The copy operation creates instance paths that are not valid for the current project or
2152 // saved as part of another project. Prune them now so they do not accumulate in the saved
2153 // schematic file.
2155
2157 SCH_SCREENS allScreens( m_frame->Schematic().Root() );
2158
2159 allScreens.PruneOrphanedSymbolInstances( m_frame->Prj().GetProjectName(), sheets );
2160 allScreens.PruneOrphanedSheetInstances( m_frame->Prj().GetProjectName(), sheets );
2161
2162 // Now clear the previous selection, select the pasted items, and fire up the "move" tool.
2165
2166 EE_SELECTION& selection = selTool->GetSelection();
2167
2168 if( !selection.Empty() )
2169 {
2170 if( aEvent.IsAction( &ACTIONS::duplicate ) )
2171 {
2172 int closest_dist = INT_MAX;
2173
2174 auto processPt =
2175 [&]( const VECTOR2I& pt )
2176 {
2177 int dist = ( eventPos - pt ).EuclideanNorm();
2178
2179 if( dist < closest_dist )
2180 {
2181 selection.SetReferencePoint( pt );
2182 closest_dist = dist;
2183 }
2184 };
2185
2186 // Prefer connection points (which should remain on grid)
2187 for( EDA_ITEM* item : selection.Items() )
2188 {
2189 SCH_ITEM* sch_item = dynamic_cast<SCH_ITEM*>( item );
2190 SCH_PIN* pin = dynamic_cast<SCH_PIN*>( item );
2191
2192 if( sch_item && sch_item->IsConnectable() )
2193 {
2194 for( const VECTOR2I& pt : sch_item->GetConnectionPoints() )
2195 processPt( pt );
2196 }
2197 else if( pin )
2198 {
2199 processPt( pin->GetPosition() );
2200 }
2201
2202 // Symbols need to have their center point added since often users are trying to
2203 // move parts from their center.
2204 if( dynamic_cast<SCH_SYMBOL*>( item ) )
2205 processPt( item->GetPosition() );
2206 }
2207
2208 // Only process other points if we didn't find any connection points
2209 if( closest_dist == INT_MAX )
2210 {
2211 for( EDA_ITEM* item : selection.Items() )
2212 {
2213 switch( item->Type() )
2214 {
2215 case SCH_LINE_T:
2216 processPt( static_cast<SCH_LINE*>( item )->GetStartPoint() );
2217 processPt( static_cast<SCH_LINE*>( item )->GetEndPoint() );
2218 break;
2219
2220 case SCH_SHAPE_T:
2221 {
2222 SCH_SHAPE* shape = static_cast<SCH_SHAPE*>( item );
2223
2224 switch( shape->GetShape() )
2225 {
2226 case SHAPE_T::RECTANGLE:
2227 for( const VECTOR2I& pt : shape->GetRectCorners() )
2228 processPt( pt );
2229
2230 break;
2231
2232 case SHAPE_T::CIRCLE:
2233 processPt( shape->GetCenter() );
2234 break;
2235
2236 case SHAPE_T::POLY:
2237 for( int ii = 0; ii < shape->GetPolyShape().TotalVertices(); ++ii )
2238 processPt( shape->GetPolyShape().CVertex( ii ) );
2239
2240 break;
2241
2242 default:
2243 processPt( shape->GetStart() );
2244 processPt( shape->GetEnd() );
2245 break;
2246 }
2247
2248 break;
2249 }
2250
2251 default:
2252 processPt( item->GetPosition() );
2253 break;
2254 }
2255 }
2256 }
2257
2258 selection.SetIsHover( m_duplicateIsHoverSelection );
2259 }
2260 else
2261 {
2262 SCH_ITEM* item = static_cast<SCH_ITEM*>( selection.GetTopLeftItem() );
2263
2264 selection.SetReferencePoint( item->GetPosition() );
2265 }
2266
2268 {
2269 // Pushing the commit will update the connectivity.
2270 commit.Push( _( "Paste" ) );
2271
2272 if( sheetsPasted )
2274 // UpdateHierarchyNavigator() will call RefreshNetNavigator()
2275 else
2277 }
2278 else
2279 {
2280 commit.Revert();
2281 }
2282 }
2283
2284 return 0;
2285}
2286
2287
2289{
2291 EE_SELECTION& selection = selTool->RequestSelection( { SCH_SYMBOL_T } );
2292 SCH_SYMBOL* symbol = nullptr;
2293 SYMBOL_EDIT_FRAME* symbolEditor;
2294
2295 if( selection.GetSize() >= 1 )
2296 symbol = (SCH_SYMBOL*) selection.Front();
2297
2298 if( selection.IsHover() )
2300
2301 if( !symbol )
2302 {
2303 // Giant hack: by default we assign Edit Table to the same hotkey, so give the table
2304 // tool a chance to handle it if we can't.
2306 tableTool->EditTable( aEvent );
2307
2308 return 0;
2309 }
2310
2311 if( symbol->GetEditFlags() != 0 )
2312 return 0;
2313
2314 if( symbol->IsMissingLibSymbol() )
2315 {
2316 m_frame->ShowInfoBarError( _( "Symbols with broken library symbol links cannot "
2317 "be edited." ) );
2318 return 0;
2319 }
2320
2322 symbolEditor = (SYMBOL_EDIT_FRAME*) m_frame->Kiway().Player( FRAME_SCH_SYMBOL_EDITOR, false );
2323
2324 if( symbolEditor )
2325 {
2326 if( wxWindow* blocking_win = symbolEditor->Kiway().GetBlockingDialog() )
2327 blocking_win->Close( true );
2328
2329 if( aEvent.IsAction( &EE_ACTIONS::editWithLibEdit ) )
2330 {
2331 symbolEditor->LoadSymbolFromSchematic( symbol );
2332 }
2334 {
2335 symbolEditor->LoadSymbol( symbol->GetLibId(), symbol->GetUnit(),
2336 symbol->GetBodyStyle() );
2337
2338 if( !symbolEditor->IsLibraryTreeShown() )
2339 symbolEditor->ToggleLibraryTree();
2340 }
2341 }
2342
2343 return 0;
2344}
2345
2346
2348{
2350 return 0;
2351}
2352
2353
2355{
2357
2358 dlg.SetInitialFocus( dlg.m_FirstRefDes );
2359
2360 if( dlg.ShowModal() == wxID_OK )
2361 {
2362 SCH_REFERENCE startRef;
2363 startRef.SetRef( dlg.m_FirstRefDes->GetValue() );
2364
2365 if( startRef.IsSplitNeeded() )
2366 startRef.Split();
2367 else
2368 return 0;
2369
2370 int startNum = atoi( startRef.GetRefNumber().utf8_string().c_str() );
2371
2372 SCH_COMMIT commit( m_frame );
2373 SCHEMATIC* schematic = m_frame->m_schematic;
2374 SCH_REFERENCE_LIST references;
2375
2376 if( dlg.m_AllSheets->GetValue() )
2377 schematic->Hierarchy().GetSymbols( references );
2378 else
2379 schematic->CurrentSheet().GetSymbols( references );
2380
2381 references.SplitReferences();
2382
2383 for( SCH_REFERENCE& ref : references )
2384 {
2385 if( ref.GetRef() == startRef.GetRef() )
2386 {
2387 int num = atoi( ref.GetRefNumber().utf8_string().c_str() );
2388
2389 if( num >= startNum )
2390 {
2391 const SCH_SHEET_PATH& sheet = ref.GetSheetPath();
2392 wxString fullRef = ref.GetRef();
2393
2394 num += dlg.m_Increment->GetValue();
2395 fullRef << num;
2396
2397 commit.Modify( ref.GetSymbol(), sheet.LastScreen() );
2398 ref.GetSymbol()->SetRef( &sheet, From_UTF8( fullRef.c_str() ) );
2399 }
2400 }
2401 }
2402
2403 if( !commit.Empty() )
2404 commit.Push( _( "Increment Annotations" ) );
2405 }
2406
2407 return 0;
2408}
2409
2410
2412{
2414 return 0;
2415}
2416
2417
2419{
2421
2422 wxCHECK( dlg, 0 );
2423
2424 // Needed at least on Windows. Raise() is not enough
2425 dlg->Show( true );
2426
2427 // Bring it to the top if already open. Dual monitor users need this.
2428 dlg->Raise();
2429
2430 dlg->ShowEditTab();
2431
2432 return 0;
2433}
2434
2435
2437{
2440
2441 return 0;
2442}
2443
2444
2446{
2448 return 0;
2449}
2450
2451
2453{
2455 return 0;
2456}
2457
2458
2460{
2462 dlg.ShowModal();
2463 return 0;
2464}
2465
2466
2468{
2469 int result = NET_PLUGIN_CHANGE;
2470
2471 // If a plugin is removed or added, rebuild and reopen the new dialog
2472 while( result == NET_PLUGIN_CHANGE )
2473 result = InvokeDialogNetList( m_frame );
2474
2475 return 0;
2476}
2477
2478
2480{
2482
2483 wxCHECK( dlg, 0 );
2484
2485 // Needed at least on Windows. Raise() is not enough
2486 dlg->Show( true );
2487
2488 // Bring it to the top if already open. Dual monitor users need this.
2489 dlg->Raise();
2490
2491 dlg->ShowExportTab();
2492
2493 return 0;
2494}
2495
2496
2498{
2500 return 0;
2501}
2502
2503
2505{
2508 return 0;
2509}
2510
2511
2513{
2514 getEditFrame<SCH_EDIT_FRAME>()->ToggleSearch();
2515 return 0;
2516}
2517
2518
2520{
2521 getEditFrame<SCH_EDIT_FRAME>()->ToggleSchematicHierarchy();
2522 return 0;
2523}
2524
2525
2527{
2528 getEditFrame<SCH_EDIT_FRAME>()->ToggleNetNavigator();
2529 return 0;
2530}
2531
2532
2534{
2535 getEditFrame<SCH_EDIT_FRAME>()->ToggleProperties();
2536 return 0;
2537}
2538
2539
2541{
2542 getEditFrame<SCH_EDIT_FRAME>()->ToggleLibraryTree();
2543 return 0;
2544}
2545
2546
2548{
2551
2554
2555 return 0;
2556}
2557
2558
2560{
2563
2566
2567 return 0;
2568}
2569
2570
2572{
2575
2578
2579 return 0;
2580}
2581
2582
2584{
2587
2590
2591 return 0;
2592}
2593
2594
2596{
2599
2602
2603 return 0;
2604}
2605
2606
2608{
2611
2613
2614 return 0;
2615}
2616
2617
2619{
2622
2624 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
2625 {
2626 int flags = 0;
2627
2628 auto invalidateTextVars =
2629 [&flags]( EDA_TEXT* text )
2630 {
2631 if( text->HasTextVars() )
2632 {
2633 text->ClearRenderCache();
2634 text->ClearBoundingBoxCache();
2636 }
2637 };
2638
2639 if( SCH_ITEM* item = dynamic_cast<SCH_ITEM*>( aItem ) )
2640 {
2641 item->RunOnChildren(
2642 [&invalidateTextVars]( SCH_ITEM* aChild )
2643 {
2644 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aChild ) )
2645 invalidateTextVars( text );
2646 } );
2647
2648 if( item->GetExcludedFromSim() )
2650 }
2651
2652 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem ) )
2653 invalidateTextVars( text );
2654
2655 return flags;
2656 } );
2657
2659
2660 return 0;
2661}
2662
2663
2665{
2668
2672
2673 return 0;
2674}
2675
2676
2678{
2681
2685
2686 return 0;
2687}
2688
2689
2691{
2694
2696
2699
2700 return 0;
2701}
2702
2703
2705{
2708 return 0;
2709}
2710
2711
2713{
2715 m_frame->eeconfig()->m_Drawing.line_mode %= LINE_MODE::LINE_MODE_COUNT;
2717 return 0;
2718}
2719
2720
2722{
2725 return 0;
2726}
2727
2728
2730{
2733 return 0;
2734}
2735
2736
2738{
2739
2741 return 0;
2742}
2743
2744
2746{
2747#ifdef KICAD_IPC_API
2748 if( Pgm().GetCommonSettings()->m_Api.enable_server )
2749 Pgm().GetPluginManager().ReloadPlugins();
2750#endif
2751 return 0;
2752}
2753
2754
2756{
2757 int errors = 0;
2758 wxString details;
2759 bool quiet = aEvent.Parameter<bool>();
2760
2761 // Repair duplicate IDs.
2762 std::map<KIID, EDA_ITEM*> ids;
2763 int duplicates = 0;
2764
2766
2767 auto processItem =
2768 [&]( EDA_ITEM* aItem )
2769 {
2770 auto it = ids.find( aItem->m_Uuid );
2771
2772 if( it != ids.end() && it->second != aItem )
2773 {
2774 duplicates++;
2775 const_cast<KIID&>( aItem->m_Uuid ) = KIID();
2776 }
2777
2778 ids[ aItem->m_Uuid ] = aItem;
2779 };
2780
2781 // Symbol IDs are the most important, so give them the first crack at "claiming" a
2782 // particular KIID.
2783
2784 for( const SCH_SHEET_PATH& sheet : sheets )
2785 {
2786 SCH_SCREEN* screen = sheet.LastScreen();
2787
2788 for( SCH_ITEM* item : screen->Items().OfType( SCH_SYMBOL_T ) )
2789 {
2790 processItem( item );
2791
2792 for( SCH_PIN* pin : static_cast<SCH_SYMBOL*>( item )->GetPins( &sheet ) )
2793 processItem( pin );
2794 }
2795 }
2796
2797 for( const SCH_SHEET_PATH& sheet : sheets )
2798 {
2799 SCH_SCREEN* screen = sheet.LastScreen();
2800
2801 for( SCH_ITEM* item : screen->Items() )
2802 {
2803 processItem( item );
2804
2805 item->RunOnChildren(
2806 [&]( SCH_ITEM* aChild )
2807 {
2808 processItem( item );
2809 } );
2810 }
2811 }
2812
2813 /*******************************
2814 * Your test here
2815 */
2816
2817 /*******************************
2818 * Inform the user
2819 */
2820
2821 if( duplicates )
2822 {
2823 errors += duplicates;
2824 details += wxString::Format( _( "%d duplicate IDs replaced.\n" ), duplicates );
2825
2826 // Rehash sheetpaths as we may have changed their uuids.
2828 }
2829
2830 if( errors )
2831 {
2832 m_frame->OnModify();
2833
2834 wxString msg = wxString::Format( _( "%d potential problems repaired." ), errors );
2835
2836 if( !quiet )
2837 DisplayInfoMessage( m_frame, msg, details );
2838 }
2839 else if( !quiet )
2840 {
2841 DisplayInfoMessage( m_frame, _( "No errors found." ) );
2842 }
2843
2844 return 0;
2845}
2846
2847
2849{
2850 if( !Pgm().GetCommonSettings()->m_Input.hotkey_feedback )
2851 return 0;
2852
2853 GRID_SETTINGS& gridSettings = m_toolMgr->GetSettings()->m_Window.grid;
2854 int currentIdx = m_toolMgr->GetSettings()->m_Window.grid.last_size_idx;
2855
2856 wxArrayString gridsLabels;
2857
2858 for( const GRID& grid : gridSettings.grids )
2859 gridsLabels.Add( grid.UserUnitsMessageText( m_frame ) );
2860
2861 if( !m_frame->GetHotkeyPopup() )
2863
2865
2866 if( popup )
2867 popup->Popup( _( "Grid" ), gridsLabels, currentIdx );
2868
2869 return 0;
2870}
2871
2872
2874{
2875 Go( &SCH_EDITOR_CONTROL::New, ACTIONS::doNew.MakeEvent() );
2876 Go( &SCH_EDITOR_CONTROL::Open, ACTIONS::open.MakeEvent() );
2877 Go( &SCH_EDITOR_CONTROL::Save, ACTIONS::save.MakeEvent() );
2884 Go( &SCH_EDITOR_CONTROL::Plot, ACTIONS::plot.MakeEvent() );
2885 Go( &SCH_EDITOR_CONTROL::Quit, ACTIONS::quit.MakeEvent() );
2886
2889
2895
2898
2904
2906
2907 Go( &SCH_EDITOR_CONTROL::Undo, ACTIONS::undo.MakeEvent() );
2908 Go( &SCH_EDITOR_CONTROL::Redo, ACTIONS::redo.MakeEvent() );
2909 Go( &SCH_EDITOR_CONTROL::Cut, ACTIONS::cut.MakeEvent() );
2910 Go( &SCH_EDITOR_CONTROL::Copy, ACTIONS::copy.MakeEvent() );
2915
2917
2935
2942
2958
2960
2962
2967}
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:214
static TOOL_ACTION paste
Definition: actions.h:73
static TOOL_ACTION cancelInteractive
Definition: actions.h:65
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:241
static TOOL_ACTION pickerTool
Definition: actions.h:204
static TOOL_ACTION showSymbolEditor
Definition: actions.h:211
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:215
static TOOL_ACTION print
Definition: actions.h:57
static TOOL_ACTION showProperties
Definition: actions.h:216
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:196
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:81
int m_Threshold
Definition: collector.h:234
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:102
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:89
virtual VECTOR2I GetPosition() const
Definition: eda_item.h:244
EDA_ITEM_FLAGS GetEditFlags() const
Definition: eda_item.h:133
const KIID m_Uuid
Definition: eda_item.h:490
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:101
virtual bool IsType(const std::vector< KICAD_T > &aScanTypes) const
Check whether the item is one of the listed types.
Definition: eda_item.h:176
virtual void SetParent(EDA_ITEM *aParent)
Definition: eda_item.h:104
void ClearBrightened()
Definition: eda_item.h:123
void SetBrightened()
Definition: eda_item.h:120
EDA_ITEM * GetParent() const
Definition: eda_item.h:103
SHAPE_POLY_SET & GetPolyShape()
Definition: eda_shape.h:291
SHAPE_T GetShape() const
Definition: eda_shape.h:132
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:174
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:137
std::vector< VECTOR2I > GetRectCorners() const
Definition: eda_shape.cpp:1404
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
PANEL_ANNOTATE m_AnnotatePanel
static TOOL_ACTION importFPAssignments
Definition: ee_actions.h:182
static TOOL_ACTION repairSchematic
Definition: ee_actions.h:273
static TOOL_ACTION remapSymbols
Definition: ee_actions.h:176
static TOOL_ACTION selectionActivate
Activation of the selection tool.
Definition: ee_actions.h:46
static TOOL_ACTION toggleAnnotateAuto
Definition: ee_actions.h:284
static TOOL_ACTION lineMode90
Definition: ee_actions.h:279
static TOOL_ACTION toggleHiddenPins
Definition: ee_actions.h:247
static TOOL_ACTION highlightNet
Definition: ee_actions.h:308
static TOOL_ACTION addItemsToSel
Selects a list of items (specified as the event parameter)
Definition: ee_actions.h:63
static TOOL_ACTION move
Definition: ee_actions.h:127
static TOOL_ACTION clearHighlight
Definition: ee_actions.h:309
static TOOL_ACTION assignNetclass
Definition: ee_actions.h:168
static TOOL_ACTION clearSelection
Clears the current selection.
Definition: ee_actions.h:56
static TOOL_ACTION toggleERCWarnings
Definition: ee_actions.h:252
static TOOL_ACTION simTune
Definition: ee_actions.h:297
static TOOL_ACTION toggleERCExclusions
Definition: ee_actions.h:254
static TOOL_ACTION lineModeNext
Definition: ee_actions.h:281
static TOOL_ACTION lineModeFree
Definition: ee_actions.h:278
static TOOL_ACTION editLibSymbolWithLibEdit
Definition: ee_actions.h:180
static TOOL_ACTION incrementAnnotations
Definition: ee_actions.h:158
static TOOL_ACTION generateBOMLegacy
Definition: ee_actions.h:185
static TOOL_ACTION toggleERCErrors
Definition: ee_actions.h:253
static TOOL_ACTION toggleOPCurrents
Definition: ee_actions.h:257
static TOOL_ACTION highlightNetTool
Definition: ee_actions.h:311
static TOOL_ACTION updateNetHighlighting
Definition: ee_actions.h:310
static TOOL_ACTION exportNetlist
Definition: ee_actions.h:183
static TOOL_ACTION assignFootprints
Definition: ee_actions.h:167
static TOOL_ACTION selectOnPCB
Definition: ee_actions.h:261
static TOOL_ACTION togglePinAltIcons
Definition: ee_actions.h:258
static TOOL_ACTION rescueSymbols
Definition: ee_actions.h:175
static TOOL_ACTION toggleHiddenFields
Definition: ee_actions.h:248
static TOOL_ACTION editWithLibEdit
Definition: ee_actions.h:179
static TOOL_ACTION simProbe
Definition: ee_actions.h:296
static TOOL_ACTION exportSymbolsToLibrary
Definition: ee_actions.h:188
static TOOL_ACTION drawSheetOnClipboard
Definition: ee_actions.h:268
static TOOL_ACTION editSymbolFields
Definition: ee_actions.h:159
static TOOL_ACTION showNetNavigator
Definition: ee_actions.h:312
static TOOL_ACTION annotate
Definition: ee_actions.h:157
static TOOL_ACTION toggleDirectiveLabels
Definition: ee_actions.h:251
static TOOL_ACTION showHierarchy
Definition: ee_actions.h:239
static TOOL_ACTION toggleOPVoltages
Definition: ee_actions.h:256
static TOOL_ACTION showDesignBlockPanel
Definition: ee_actions.h:206
static TOOL_ACTION lineMode45
Definition: ee_actions.h:280
static TOOL_ACTION markSimExclusions
Definition: ee_actions.h:255
static TOOL_ACTION editSymbolLibraryLinks
Definition: ee_actions.h:160
static TOOL_ACTION saveCurrSheetCopyAs
Definition: ee_actions.h:42
static TOOL_ACTION showPcbNew
Definition: ee_actions.h:181
static TOOL_ACTION generateBOM
Definition: ee_actions.h:184
static TOOL_ACTION schematicSetup
Definition: ee_actions.h:169
static TOOL_ACTION exportSymbolsToNewLibrary
Definition: ee_actions.h:189
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.
EE_TYPE OfType(KICAD_T aType) const
Definition: sch_rtree.h:238
void GuessSelectionCandidates(EE_COLLECTOR &collector, const VECTOR2I &aPos)
Apply heuristics to try and determine a single object when multiple are found under the cursor.
EE_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...
EDA_ITEM * GetNode(const VECTOR2I &aPosition)
Finds a connected item at a point (usually the cursor position).
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.
EE_SELECTION & GetSelection()
Definition: erc.h:52
static const TOOL_EVENT ClearedEvent
Definition: actions.h:294
static const TOOL_EVENT GridChangedByKeyEvent
Definition: actions.h:312
static const TOOL_EVENT SelectedEvent
Definition: actions.h:292
static const TOOL_EVENT SelectedItemsModified
Selected items were moved, this can be very high frequency on the canvas, use with care.
Definition: actions.h:299
static const TOOL_EVENT PointSelectedEvent
Definition: actions.h:291
static const TOOL_EVENT UnselectedEvent
Definition: actions.h:293
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
double GetScale() const
Definition: view.h:272
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:99
Define a library symbol object.
Definition: lib_symbol.h:84
const LIB_ID & GetLibId() const override
Definition: lib_symbol.h:154
wxString GetName() const override
Definition: lib_symbol.h:148
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
Definition: lib_symbol.cpp:333
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:82
SCH_SHEET_PATH & CurrentSheet() const override
Definition: schematic.h:161
wxString GetFileName() const override
Helper to retrieve the filename from the root sheet screen.
Definition: schematic.cpp:306
SCHEMATIC_SETTINGS & Settings() const
Definition: schematic.cpp:312
CONNECTION_GRAPH * ConnectionGraph() const override
Definition: schematic.h:171
SCH_SHEET_LIST Hierarchy() const override
Return the full schematic flattened hierarchical sheet list.
Definition: schematic.cpp:214
EMBEDDED_FILES * GetEmbeddedFiles() override
Definition: schematic.cpp:876
SCH_SHEET & Root() const
Definition: schematic.h:130
SCH_SHEET_LIST BuildSheetListSortedByPageNumbers() const override
Definition: schematic.h:102
void RefreshHierarchy()
Definition: schematic.cpp:222
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
virtual void Push(const wxString &aMessage=wxT("A commit"), int aCommitFlags=0) override
Execute the changes.
Definition: sch_commit.cpp:432
virtual void Revert() override
Revert the commit by restoring the modified items state.
Definition: sch_commit.cpp:510
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 operaintg 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
void UpdateHierarchyNavigator(bool aRefreshNetNavigator=true)
Update the hierarchy navigation tree and history.
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:624
void RefreshNetNavigator(const NET_NAVIGATOR_ITEM_DATA *aSelection=nullptr)
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 SetCurrentSheet(const SCH_SHEET_PATH &aSheet)
void DisplayCurrentSheet()
Draw the current sheet on the display.
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.
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
Definition: sch_field.h:51
void SetText(const wxString &aText) override
Definition: sch_field.cpp:1212
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:167
virtual bool IsConnectable() const
Definition: sch_item.h:450
SCHEMATIC * Schematic() const
Searches the item hierarchy to find a SCHEMATIC.
Definition: sch_item.cpp:150
virtual void SetLastResolvedState(const SCH_ITEM *aItem)
Definition: sch_item.h:542
int GetBodyStyle() const
Definition: sch_item.h:233
int GetUnit() const
Definition: sch_item.h:230
void SetConnectivityDirty(bool aDirty=true)
Definition: sch_item.h:513
bool IsConnectivityDirty() const
Definition: sch_item.h:511
virtual void SetUnit(int aUnit)
Definition: sch_item.h:229
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:218
virtual std::vector< VECTOR2I > GetConnectionPoints() const
Add all the connection points for this item to aPoints.
Definition: sch_item.h:465
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:712
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:153
void Clear(bool aFree=true)
Delete all draw items and clears the project settings.
Definition: sch_screen.cpp:278
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:666
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:480
double m_LastZoomLevel
last value for the zoom level, useful in Eeschema when changing the current displayed sheet to reuse ...
Definition: sch_screen.h:636
EE_RTREE & Items()
Gets the full RTree, usually for iterating.
Definition: sch_screen.h:108
const wxString & GetFileName() const
Definition: sch_screen.h:143
bool Remove(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
Remove aItem from the schematic associated with this screen.
Definition: sch_screen.cpp:323
bool CheckIfOnDrawList(const SCH_ITEM *aItem) const
Definition: sch_screen.cpp:386
void MigrateSimModels()
Migrate any symbols having V6 simulation models to their V7 equivalents.
VECTOR2I GetCenter() const
Definition: sch_shape.h:75
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.
bool NameExists(const wxString &aSheetName) const
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:57
wxString GetFileName() const
Return the filename corresponding to this sheet.
Definition: sch_sheet.h:305
void RemoveInstance(const KIID_PATH &aInstancePath)
Definition: sch_sheet.cpp:1400
std::vector< SCH_FIELD > & GetFields()
Definition: sch_sheet.h:92
bool SearchHierarchy(const wxString &aFilename, SCH_SCREEN **aScreen)
Search the existing hierarchy for an instance of screen loaded from aFileName.
Definition: sch_sheet.cpp:778
void AddInstance(const SCH_SHEET_INSTANCE &aInstance)
Definition: sch_sheet.cpp:1421
SCH_SCREEN * GetScreen() const
Definition: sch_sheet.h:109
void SetScreen(SCH_SCREEN *aScreen)
Set the SCH_SCREEN associated with this sheet to aScreen.
Definition: sch_sheet.cpp:172
std::vector< SCH_SHEET_PIN * > & GetPins()
Definition: sch_sheet.h:180
const std::vector< SCH_SHEET_INSTANCE > & GetInstances() const
Definition: sch_sheet.h:419
Schematic symbol object.
Definition: sch_symbol.h:77
const std::vector< SCH_SYMBOL_INSTANCE > & GetInstances() const
Definition: sch_symbol.h:136
wxString GetSchSymbolLibraryName() const
Definition: sch_symbol.cpp:241
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) override
Populate a std::vector with SCH_FIELDs.
Definition: sch_symbol.cpp:953
SCH_FIELD * GetField(MANDATORY_FIELD_T aFieldType)
Return a mandatory field in this symbol.
Definition: sch_symbol.cpp:905
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:603
bool IsMissingLibSymbol() const
Check to see if the library symbol is set to the dummy library symbol.
Definition: sch_symbol.cpp:208
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:166
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
Definition: sch_symbol.h:185
void SetLibSymbol(LIB_SYMBOL *aLibSymbol)
Set this schematic symbol library symbol reference to aLibSymbol.
Definition: sch_symbol.cpp:250
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const override
Definition: sch_symbol.cpp:703
bool IsPower() const override
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:723
const SPICE_GENERATOR & SpiceGenerator() const
Definition: sim_model.h:435
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.
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:402
APP_SETTINGS_BASE * GetSettings() const
Definition: tool_manager.h:400
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:171
bool HasMessage() const override
Returns true if the reporter client is non-empty.
Definition: reporter.cpp:97
const wxString & GetMessages() const
Definition: reporter.cpp:84
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:250
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
Definition: confirm.cpp:170
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
Definition: confirm.cpp:222
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:195
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)
std::vector< EDA_ITEM * > EDA_ITEMS
Define list of drawing items for screens.
Definition: eda_item.h:538
#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.
#define HITTEST_THRESHOLD_PIXELS
wxString GetSelectedItemsAsText(const SELECTION &aSel)
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.
int InvokeDialogPrintUsingPrinter(SCH_EDIT_FRAME *aCaller)
Create and show DIALOG_PRINT_USING_PRINTER and return whatever DIALOG_PRINT_USING_PRINTER::ShowModal(...
#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:431
@ LAYER_ERC_ERR
Definition: layer_ids.h:432
@ LAYER_OP_CURRENTS
Definition: layer_ids.h:453
@ LAYER_OP_VOLTAGES
Definition: layer_ids.h:452
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:1073
see class PGM_BASE
@ LOCAL_CLEANUP
@ NO_CLEANUP
@ GLOBAL_CLEANUP
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.
@ SHEETNAME
Definition: sch_sheet.h:45
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.
@ VALUE_FIELD
Field Value of part, i.e. "3.3K".
@ REFERENCE_FIELD
Field Reference of part, i.e. "IC21".
@ AS_GLOBAL
Global action (toolbar/main menu event, global shortcut)
Definition: tool_action.h:48
@ 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