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 (C) 1992-2024 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
25#include <symbol_library.h>
26#include <confirm.h>
27#include <connection_graph.h>
36#include <project_rescue.h>
37#include <erc.h>
38#include <invoke_sch_dialog.h>
39#include <string_utils.h>
40#include <kiway.h>
42#include <paths.h>
43#include <pgm_base.h>
46#include <project_sch.h>
47#include <sch_edit_frame.h>
49#include <sch_line.h>
50#include <sch_junction.h>
51#include <sch_bus_entry.h>
52#include <sch_shape.h>
53#include <sch_painter.h>
54#include <sch_sheet.h>
55#include <sch_sheet_pin.h>
56#include <sch_view.h>
57#include <schematic.h>
58#include <sch_commit.h>
59#include <advanced_config.h>
61#include <sim/simulator_frame.h>
62#include <sim/spice_generator.h>
63#include <sim/sim_lib_mgr.h>
65#include <symbol_viewer_frame.h>
66#include <tool/common_tools.h>
67#include <tool/picker_tool.h>
68#include <tool/tool_manager.h>
69#include <tools/ee_actions.h>
70#include <tools/ee_selection.h>
73#include <tools/sch_move_tool.h>
75#include <eda_list_dialog.h>
77#include <wx_filename.h>
78#include <sch_sheet_path.h>
79#include <wx/filedlg.h>
80#include <wx/treectrl.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
359 SCH_REFERENCE_LIST symbols;
360 m_frame->Schematic().GetSheets().GetSymbols( symbols, savePowerSymbols );
361
362 std::map<LIB_ID, LIB_SYMBOL*> libSymbols;
363 std::map<LIB_ID, std::vector<SCH_SYMBOL*>> symbolMap;
364
365 for( size_t i = 0; i < symbols.GetCount(); ++i )
366 {
367 SCH_SYMBOL* symbol = symbols[i].GetSymbol();
368 LIB_SYMBOL* libSymbol = symbol->GetLibSymbolRef().get();
369 LIB_ID id = libSymbol->GetLibId();
370
371 if( libSymbols.count( id ) )
372 {
373 wxASSERT_MSG( libSymbols[id]->Compare( *libSymbol, SCH_ITEM::COMPARE_FLAGS::ERC ) == 0,
374 "Two symbols have the same LIB_ID but are different!" );
375 }
376 else
377 {
378 libSymbols[id] = libSymbol;
379 }
380
381 symbolMap[id].emplace_back( symbol );
382 }
383
385
386 wxString targetLib;
387
388 if( createNew )
389 {
390 wxFileName fn;
392
393 if( !libTable ) // Cancelled by user
394 return 0;
395
398 ( libTable == &SYMBOL_LIB_TABLE::GetGlobalLibTable() ),
400 {
401 return 0;
402 }
403
404 targetLib = fn.GetName();
405
406 if( libTable->HasLibrary( targetLib, false ) )
407 {
408 DisplayError( m_frame, wxString::Format( _( "Library '%s' already exists." ),
409 targetLib ) );
410 return 0;
411 }
412
413 // if the "new" library is in fact an existing library and the used asked for replacing
414 // it by the recreated lib, erase it:
415 if( fn.FileExists() )
416 wxRemoveFile( fn.GetFullPath() );
417
418 if( !mgr.CreateLibrary( fn.GetFullPath(), libTable ) )
419 {
420 DisplayError( m_frame, wxString::Format( _( "Could not add library '%s'." ),
421 targetLib ) );
422 return 0;
423 }
424 }
425 else
426 {
427 targetLib = m_frame->SelectLibraryFromList();
428 }
429
430 if( targetLib.IsEmpty() )
431 return 0;
432
433 bool map = IsOK( m_frame, _( "Update symbols in schematic to refer to new library?" ) );
434 bool append = false;
435
436 SYMBOL_LIB_TABLE_ROW* row = mgr.GetLibrary( targetLib );
437 SCH_IO_MGR::SCH_FILE_T type = SCH_IO_MGR::EnumFromStr( row->GetType() );
438 IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( type ) );
439
440 wxFileName dest = row->GetFullURI( true );
441 dest.Normalize( FN_NORMALIZE_FLAGS | wxPATH_NORM_ENV_VARS );
442
443 for( const std::pair<const LIB_ID, LIB_SYMBOL*>& it : libSymbols )
444 {
445 LIB_SYMBOL* origSym = it.second;
446 LIB_SYMBOL* newSym = origSym->Flatten().release();
447
448 try
449 {
450 pi->SaveSymbol( dest.GetFullPath(), newSym );
451 }
452 catch( const IO_ERROR& ioe )
453 {
454 wxString msg;
455 msg.Printf( _( "Error saving symbol %s to library '%s'." ),
456 newSym->GetName(), row->GetNickName() );
457 msg += wxS( "\n\n" ) + ioe.What();
458 wxLogWarning( msg );
459 return 0;
460 }
461
462 if( map )
463 {
464 LIB_ID id = it.first;
465 id.SetLibNickname( targetLib );
466
467 for( SCH_SYMBOL* symbol : symbolMap[it.first] )
468 {
469 m_frame->SaveCopyInUndoList( m_frame->GetScreen(), symbol, UNDO_REDO::CHANGED,
470 append, false );
471 symbol->SetLibId( id );
472 append = true;
473 }
474 }
475 }
476
477 // Save the modified symbol library table. We need to look this up by name in each table to find
478 // whether the new library is a global or project entity as the code above to choose the library
479 // returns a different type depending on whether a global or project library is chosen.
481 SYMBOL_LIB_TABLE* projectTable = nullptr;
482
483 if( !m_frame->Prj().IsNullProject() )
484 projectTable = PROJECT_SCH::SchSymbolLibTable( &m_frame->Prj() );
485
486 if( globalTable->FindRow( targetLib ) )
487 {
488 try
489 {
490 wxString globalTablePath = SYMBOL_LIB_TABLE::GetGlobalTableFileName();
491 globalTable->Save( globalTablePath );
492 }
493 catch( const IO_ERROR& ioe )
494 {
495 wxString msg;
496 msg.Printf( _( "Error saving global library table:\n\n%s" ), ioe.What() );
497 wxMessageBox( msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
498 }
499 }
500 else if( projectTable && projectTable->FindRow( targetLib ) )
501 {
502 try
503 {
504 wxString projectPath = m_frame->Prj().GetProjectPath();
505 wxFileName projectTableFn( projectPath, SYMBOL_LIB_TABLE::GetSymbolLibTableFileName() );
506 projectTable->Save( projectTableFn.GetFullPath() );
507 }
508 catch( const IO_ERROR& ioe )
509 {
510 wxString msg;
511 msg.Printf( _( "Error saving project-specific library table:\n\n%s" ), ioe.What() );
512 wxMessageBox( msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
513 }
514 }
515
516 if( append )
517 {
518 std::set<SCH_SCREEN*> processedScreens;
520
521 for( SCH_SHEET_PATH& sheet : sheets )
522 {
523 SCH_SCREEN* screen = sheet.LastScreen();
524
525 if( processedScreens.find( ( screen ) ) == processedScreens.end() )
526 {
527 processedScreens.insert( screen );
528 screen->UpdateSymbolLinks();
529 }
530 }
531
532 m_frame->OnModify();
533 }
534
535 return 0;
536}
537
538
539#define HITTEST_THRESHOLD_PIXELS 5
540
542{
545 false );
546
547 if( !simFrame ) // Defensive coding; shouldn't happen.
548 return 0;
549
550 if( wxWindow* blocking_win = simFrame->Kiway().GetBlockingDialog() )
551 blocking_win->Close( true );
552
553 // Deactivate other tools; particularly important if another PICKER is currently running
554 Activate();
555
556 picker->SetCursor( KICURSOR::VOLTAGE_PROBE );
557 picker->SetSnapping( false );
558
559 picker->SetClickHandler(
560 [this, simFrame]( const VECTOR2D& aPosition )
561 {
563 EDA_ITEM* item = selTool->GetNode( aPosition );
565
566 if( !item )
567 return false;
568
569 if( item->Type() == SCH_PIN_T )
570 {
571 try
572 {
573 SCH_PIN* pin = static_cast<SCH_PIN*>( item )->GetLibPin();
574 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item->GetParent() );
575
576 wxString msg;
577 WX_STRING_REPORTER reporter( &msg );
578 SIM_LIB_MGR mgr( &m_frame->Prj() );
579
580 SIM_MODEL& model = mgr.CreateModel( &sheet, *symbol, reporter ).model;
581
582 if( reporter.HasMessage() )
583 THROW_IO_ERROR( msg );
584
585 SPICE_ITEM spiceItem;
586 spiceItem.refName = symbol->GetRef( &sheet ).ToStdString();
587 std::vector<std::string> currentNames =
588 model.SpiceGenerator().CurrentNames( spiceItem );
589
590 if( currentNames.size() == 0 )
591 {
592 return true;
593 }
594 else if( currentNames.size() == 1 )
595 {
596 simFrame->AddCurrentTrace( currentNames.at( 0 ) );
597 return true;
598 }
599
600 int modelPinIndex = model.FindModelPinIndex( pin->GetNumber().ToStdString() );
601
602 if( modelPinIndex != SIM_MODEL::PIN::NOT_CONNECTED )
603 {
604 wxString name = currentNames.at( modelPinIndex );
605 simFrame->AddCurrentTrace( name );
606 }
607 }
608 catch( const IO_ERROR& e )
609 {
611 }
612 }
613 else if( item->IsType( { SCH_ITEM_LOCATE_WIRE_T } )
614 || item->IsType( { SCH_JUNCTION_T } ) )
615 {
616 if( SCH_CONNECTION* conn = static_cast<SCH_ITEM*>( item )->Connection() )
617 {
618 std::string spiceNet = UnescapeString( conn->Name() ).ToStdString();
620
621 simFrame->AddVoltageTrace( wxString::Format( "V(%s)", spiceNet ) );
622 }
623 }
624
625 return true;
626 } );
627
628 picker->SetMotionHandler(
629 [this, picker]( const VECTOR2D& aPos )
630 {
631 EE_COLLECTOR collector;
632 collector.m_Threshold = KiROUND( getView()->ToWorld( HITTEST_THRESHOLD_PIXELS ) );
633 collector.Collect( m_frame->GetScreen(), { SCH_ITEM_LOCATE_WIRE_T,
634 SCH_PIN_T,
635 SCH_SHEET_PIN_T }, aPos );
636
638 selectionTool->GuessSelectionCandidates( collector, aPos );
639
640 EDA_ITEM* item = collector.GetCount() == 1 ? collector[ 0 ] : nullptr;
641 SCH_LINE* wire = dynamic_cast<SCH_LINE*>( item );
642
643 const SCH_CONNECTION* conn = nullptr;
644
645 if( wire )
646 {
647 item = nullptr;
648 conn = wire->Connection();
649 }
650
651 if( item && item->Type() == SCH_PIN_T )
652 picker->SetCursor( KICURSOR::CURRENT_PROBE );
653 else
654 picker->SetCursor( KICURSOR::VOLTAGE_PROBE );
655
656 if( m_pickerItem != item )
657 {
658 if( m_pickerItem )
659 selectionTool->UnbrightenItem( m_pickerItem );
660
661 m_pickerItem = item;
662
663 if( m_pickerItem )
664 selectionTool->BrightenItem( m_pickerItem );
665 }
666
667 wxString connectionName = ( conn ) ? conn->Name() : wxString( wxS( "" ) );
668
669 if( m_frame->GetHighlightedConnection() != connectionName )
670 {
671 m_frame->SetHighlightedConnection( connectionName );
672
673 TOOL_EVENT dummyEvent;
674 UpdateNetHighlighting( dummyEvent );
675 }
676 } );
677
678 picker->SetFinalizeHandler(
679 [this]( const int& aFinalState )
680 {
681 if( m_pickerItem )
682 m_toolMgr->GetTool<EE_SELECTION_TOOL>()->UnbrightenItem( m_pickerItem );
683
684 if( !m_frame->GetHighlightedConnection().IsEmpty() )
685 {
686 m_frame->SetHighlightedConnection( wxEmptyString );
687
688 TOOL_EVENT dummyEvent;
689 UpdateNetHighlighting( dummyEvent );
690 }
691
692 // Wake the selection tool after exiting to ensure the cursor gets updated
694 } );
695
697
698 return 0;
699}
700
701
703{
705
706 // Deactivate other tools; particularly important if another PICKER is currently running
707 Activate();
708
709 picker->SetCursor( KICURSOR::TUNE );
710 picker->SetSnapping( false );
711
712 picker->SetClickHandler(
713 [this]( const VECTOR2D& aPosition )
714 {
716 EDA_ITEM* item = nullptr;
717 selTool->SelectPoint( aPosition, { SCH_SYMBOL_T, SCH_FIELD_T }, &item );
718
719 if( !item )
720 return false;
721
722 if( item->Type() != SCH_SYMBOL_T )
723 {
724 item = item->GetParent();
725
726 if( item->Type() != SCH_SYMBOL_T )
727 return false;
728 }
729
730 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
731 SCH_SHEET_PATH sheetPath = symbol->Schematic()->CurrentSheet();
732 KIWAY_PLAYER* simFrame = m_frame->Kiway().Player( FRAME_SIMULATOR, false );
733
734 if( simFrame )
735 {
736 if( wxWindow* blocking_win = simFrame->Kiway().GetBlockingDialog() )
737 blocking_win->Close( true );
738
739 static_cast<SIMULATOR_FRAME*>( simFrame )->AddTuner( sheetPath, symbol );
740 }
741
742 // We do not really want to keep a symbol selected in schematic,
743 // so clear the current selection
744 selTool->ClearSelection();
745 return true;
746 } );
747
748 picker->SetMotionHandler(
749 [this]( const VECTOR2D& aPos )
750 {
751 EE_COLLECTOR collector;
752 collector.m_Threshold = KiROUND( getView()->ToWorld( HITTEST_THRESHOLD_PIXELS ) );
753 collector.Collect( m_frame->GetScreen(), { SCH_SYMBOL_T, SCH_FIELD_T }, aPos );
754
756 selectionTool->GuessSelectionCandidates( collector, aPos );
757
758 EDA_ITEM* item = collector.GetCount() == 1 ? collector[ 0 ] : nullptr;
759
760 if( m_pickerItem != item )
761 {
762 if( m_pickerItem )
763 selectionTool->UnbrightenItem( m_pickerItem );
764
765 m_pickerItem = item;
766
767 if( m_pickerItem )
768 selectionTool->BrightenItem( m_pickerItem );
769 }
770 } );
771
772 picker->SetFinalizeHandler(
773 [this]( const int& aFinalState )
774 {
775 if( m_pickerItem )
776 m_toolMgr->GetTool<EE_SELECTION_TOOL>()->UnbrightenItem( m_pickerItem );
777
778 // Wake the selection tool after exiting to ensure the cursor gets updated
779 // and deselect previous selection from simulator to avoid any issue
780 // ( avoid crash in some cases when the SimTune tool is deselected )
782 selectionTool->ClearSelection();
784 } );
785
787
788 return 0;
789}
790
791
792// A singleton reference for clearing the highlight
794
795
796static bool highlightNet( TOOL_MANAGER* aToolMgr, const VECTOR2D& aPosition )
797{
798 SCH_EDIT_FRAME* editFrame = static_cast<SCH_EDIT_FRAME*>( aToolMgr->GetToolHolder() );
799 EE_SELECTION_TOOL* selTool = aToolMgr->GetTool<EE_SELECTION_TOOL>();
800 SCH_EDITOR_CONTROL* editorControl = aToolMgr->GetTool<SCH_EDITOR_CONTROL>();
801 SCH_CONNECTION* conn = nullptr;
802 SCH_ITEM* item = nullptr;
803 bool retVal = true;
804
805 if( aPosition != CLEAR )
806 {
807 ERC_TESTER erc( &editFrame->Schematic() );
808
809 if( erc.TestDuplicateSheetNames( false ) > 0 )
810 {
811 wxMessageBox( _( "Error: duplicate sub-sheet names found in current sheet." ) );
812 retVal = false;
813 }
814 else
815 {
816 item = static_cast<SCH_ITEM*>( selTool->GetNode( aPosition ) );
817 SCH_SYMBOL* symbol = dynamic_cast<SCH_SYMBOL*>( item );
818
819 if( item )
820 {
821 if( item->IsConnectivityDirty() )
822 editFrame->RecalculateConnections( nullptr, NO_CLEANUP );
823
824 if( item->Type() == SCH_FIELD_T )
825 symbol = dynamic_cast<SCH_SYMBOL*>( item->GetParent() );
826
827 if( symbol && symbol->GetLibSymbolRef() && symbol->GetLibSymbolRef()->IsPower() )
828 {
829 std::vector<SCH_PIN*> pins = symbol->GetPins();
830
831 if( pins.size() == 1 )
832 conn = pins[0]->Connection();
833 }
834 else
835 {
836 conn = item->Connection();
837 }
838 }
839 }
840 }
841
842 wxString connName = ( conn ) ? conn->Name() : wxString( wxS( "" ) );
843
844 if( !conn )
845 {
846 editFrame->SetStatusText( wxT( "" ) );
847 editFrame->SendCrossProbeClearHighlight();
848 editFrame->SetHighlightedConnection( wxEmptyString );
849 editorControl->SetHighlightBusMembers( false );
850 }
851 else
852 {
853 NET_NAVIGATOR_ITEM_DATA itemData( editFrame->GetCurrentSheet(), item );
854
855 if( connName != editFrame->GetHighlightedConnection() )
856 {
857 editorControl->SetHighlightBusMembers( false );
858 editFrame->SetCrossProbeConnection( conn );
859 editFrame->SetHighlightedConnection( connName, &itemData );
860 }
861 else
862 {
863 editorControl->SetHighlightBusMembers( !editorControl->GetHighlightBusMembers() );
864
865 if( item != editFrame->GetSelectedNetNavigatorItem() )
866 editFrame->SelectNetNavigatorItem( &itemData );
867 }
868 }
869
870 editFrame->UpdateNetHighlightStatus();
871
873 editorControl->UpdateNetHighlighting( dummy );
874
875 return retVal;
876}
877
878
880{
882 VECTOR2D cursorPos = controls->GetCursorPosition( !aEvent.DisableGridSnapping() );
883
884 highlightNet( m_toolMgr, cursorPos );
885
886 return 0;
887}
888
889
891{
893
894 return 0;
895}
896
897
899{
901 SCHEMATIC& schematic = m_frame->Schematic();
903
904 const SCH_CONNECTION* conn = nullptr;
905 VECTOR2D connPos;
906
907 for( EDA_ITEM* item : selectionTool->GetSelection() )
908 {
909 conn = static_cast<SCH_ITEM*>( item )->Connection();
910 connPos = item->GetPosition();
911
912 if( conn )
913 break;
914 }
915
916 if( !conn )
917 {
918 m_frame->ShowInfoBarError( _( "No net selected." ) );
919 return 0;
920 }
921
922 // Remove selection in favor of highlighting so the whole net is highlighted
923 selectionTool->ClearSelection();
924 highlightNet( m_toolMgr, connPos );
925
926 wxString netName = conn->Name();
927
928 if( conn->IsBus() )
929 {
930 wxString prefix;
931
932 if( NET_SETTINGS::ParseBusVector( netName, &prefix, nullptr ) )
933 {
934 netName = prefix + wxT( "*" );
935 }
936 else if( NET_SETTINGS::ParseBusGroup( netName, &prefix, nullptr ) )
937 {
938 netName = prefix + wxT( ".*" );
939 }
940 }
941 else if( !conn->Driver() || CONNECTION_SUBGRAPH::GetDriverPriority( conn->Driver() )
943 {
944 m_frame->ShowInfoBarError( _( "Net must be labeled to assign a netclass." ) );
946 return 0;
947 }
948
949 DIALOG_ASSIGN_NETCLASS dlg( m_frame, netName, schematic.GetNetClassAssignmentCandidates(),
950 [&]( const std::vector<wxString>& aNetNames )
951 {
952 for( SCH_ITEM* item : screen->Items() )
953 {
954 bool redraw = item->IsBrightened();
955 SCH_CONNECTION* itemConn = item->Connection();
956
957 if( itemConn && alg::contains( aNetNames, itemConn->Name() ) )
958 item->SetBrightened();
959 else
960 item->ClearBrightened();
961
962 redraw |= item->IsBrightened();
963
964 if( item->Type() == SCH_SYMBOL_T )
965 {
966 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
967
968 redraw |= symbol->HasBrightenedPins();
969
970 symbol->ClearBrightenedPins();
971
972 for( SCH_PIN* pin : symbol->GetPins() )
973 {
974 SCH_CONNECTION* pin_conn = pin->Connection();
975
976 if( pin_conn && alg::contains( aNetNames, pin_conn->Name() ) )
977 {
978 pin->SetBrightened();
979 redraw = true;
980 }
981 }
982 }
983 else if( item->Type() == SCH_SHEET_T )
984 {
985 for( SCH_SHEET_PIN* pin : static_cast<SCH_SHEET*>( item )->GetPins() )
986 {
987 SCH_CONNECTION* pin_conn = pin->Connection();
988
989 redraw |= pin->IsBrightened();
990
991 if( pin_conn && alg::contains( aNetNames, pin_conn->Name() ) )
992 pin->SetBrightened();
993 else
994 pin->ClearBrightened();
995
996 redraw |= pin->IsBrightened();
997 }
998 }
999
1000 if( redraw )
1001 getView()->Update( item, KIGFX::VIEW_UPDATE_FLAGS::REPAINT );
1002 }
1003
1005 } );
1006
1007 if( dlg.ShowModal() )
1008 {
1009 getView()->UpdateAllItemsConditionally(
1010 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
1011 {
1012 int flags = 0;
1013
1014 // Netclass coloured items
1015 //
1016 if( dynamic_cast<SCH_LINE*>( aItem ) )
1017 flags |= KIGFX::REPAINT;
1018 else if( dynamic_cast<SCH_JUNCTION*>( aItem ) )
1019 flags |= KIGFX::REPAINT;
1020 else if( dynamic_cast<SCH_BUS_ENTRY_BASE*>( aItem ) )
1021 flags |= KIGFX::REPAINT;
1022
1023 // Items that might reference an item's netclass name
1024 //
1025 if( SCH_ITEM* item = dynamic_cast<SCH_ITEM*>( aItem ) )
1026 {
1027 item->RunOnChildren(
1028 [&flags]( SCH_ITEM* aChild )
1029 {
1030 EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aChild );
1031
1032 if( text && text->HasTextVars() )
1033 {
1034 text->ClearRenderCache();
1035 text->ClearBoundingBoxCache();
1036 flags |= KIGFX::GEOMETRY | KIGFX::REPAINT;
1037 }
1038 } );
1039
1040 EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem );
1041
1042 if( text && text->HasTextVars() )
1043 {
1044 text->ClearRenderCache();
1045 text->ClearBoundingBoxCache();
1047 }
1048
1049 if( flags & KIGFX::GEOMETRY )
1050 m_frame->GetScreen()->Update( item, false ); // Refresh RTree
1051 }
1052
1053 return flags;
1054 } );
1055 }
1056
1057 highlightNet( m_toolMgr, CLEAR );
1058 return 0;
1059}
1060
1061
1063{
1064 wxCHECK( m_frame, 0 );
1065
1066 const SCH_SHEET_PATH& sheetPath = m_frame->GetCurrentSheet();
1068 CONNECTION_GRAPH* connectionGraph = m_frame->Schematic().ConnectionGraph();
1069 wxString selectedName = m_frame->GetHighlightedConnection();
1070
1071 std::set<wxString> connNames;
1072 std::vector<EDA_ITEM*> itemsToRedraw;
1073
1074 wxCHECK( screen && connectionGraph, 0 );
1075
1076 if( !selectedName.IsEmpty() )
1077 {
1078 connNames.emplace( selectedName );
1079
1080 CONNECTION_SUBGRAPH* sg = connectionGraph->FindSubgraphByName( selectedName, sheetPath );
1081
1082 if( sg && m_highlightBusMembers )
1083 {
1084 for( const SCH_ITEM* item : sg->GetItems() )
1085 {
1086 wxCHECK2( item, continue );
1087
1088 SCH_CONNECTION* connection = item->Connection();
1089
1090 wxCHECK2( connection, continue );
1091
1092 for( const std::shared_ptr<SCH_CONNECTION>& member : connection->AllMembers() )
1093 {
1094 if( member )
1095 connNames.emplace( member->Name() );
1096 }
1097 }
1098 }
1099 }
1100
1101 for( SCH_ITEM* item : screen->Items() )
1102 {
1103 wxCHECK2( item, continue );
1104
1105 if( !item->IsConnectable() )
1106 continue;
1107
1108 SCH_ITEM* redrawItem = nullptr;
1109
1110 if( item->Type() == SCH_SYMBOL_T )
1111 {
1112 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
1113
1114 wxCHECK2( symbol, continue );
1115
1116 for( SCH_PIN* pin : symbol->GetPins() )
1117 {
1118 SCH_CONNECTION* pin_conn = pin->Connection();
1119
1120 wxCHECK2( pin_conn, continue );
1121
1122 if( !pin->IsBrightened() && connNames.count( pin_conn->Name() ) )
1123 {
1124 pin->SetBrightened();
1125 redrawItem = symbol;
1126 }
1127 else if( pin->IsBrightened() && !connNames.count( pin_conn->Name() ) )
1128 {
1129 pin->ClearBrightened();
1130 redrawItem = symbol;
1131 }
1132 }
1133
1134 if( symbol->IsPower() )
1135 {
1136 wxCHECK2( symbol->GetPins().size(), continue );
1137
1138 SCH_CONNECTION* pinConn = symbol->GetPins()[0]->Connection();
1139
1140 wxCHECK2( pinConn, continue );
1141
1142 std::vector<SCH_FIELD>& fields = symbol->GetFields();
1143
1144 for( int id : { REFERENCE_FIELD, VALUE_FIELD } )
1145 {
1146 if( !fields[id].IsVisible() )
1147 continue;
1148
1149 if( !fields[id].IsBrightened() && connNames.count( pinConn->Name() ) )
1150 {
1151 fields[id].SetBrightened();
1152 redrawItem = symbol;
1153 }
1154 else if( fields[id].IsBrightened() && !connNames.count( pinConn->Name() ) )
1155 {
1156 fields[id].ClearBrightened();
1157 redrawItem = symbol;
1158 }
1159 }
1160 }
1161 }
1162 else if( item->Type() == SCH_SHEET_T )
1163 {
1164 SCH_SHEET* sheet = static_cast<SCH_SHEET*>( item );
1165
1166 wxCHECK2( sheet, continue );
1167
1168 for( SCH_SHEET_PIN* pin : sheet->GetPins() )
1169 {
1170 wxCHECK2( pin, continue );
1171
1172 SCH_CONNECTION* pin_conn = pin->Connection();
1173
1174 wxCHECK2( pin_conn, continue );
1175
1176 if( !pin->IsBrightened() && connNames.count( pin_conn->Name() ) )
1177 {
1178 pin->SetBrightened();
1179 redrawItem = sheet;
1180 }
1181 else if( pin->IsBrightened() && !connNames.count( pin_conn->Name() ) )
1182 {
1183 pin->ClearBrightened();
1184 redrawItem = sheet;
1185 }
1186 }
1187 }
1188 else
1189 {
1190 SCH_CONNECTION* itemConn = item->Connection();
1191
1192 wxCHECK2( itemConn, continue );
1193
1194 if( !item->IsBrightened() && connNames.count( itemConn->Name() ) )
1195 {
1196 item->SetBrightened();
1197 redrawItem = item;
1198 }
1199 else if( item->IsBrightened() && !connNames.count( itemConn->Name() ) )
1200 {
1201 item->ClearBrightened();
1202 redrawItem = item;
1203 }
1204 }
1205
1206 if( redrawItem )
1207 itemsToRedraw.push_back( redrawItem );
1208 }
1209
1210 if( itemsToRedraw.size() )
1211 {
1212 // Be sure highlight change will be redrawn
1213 KIGFX::VIEW* view = getView();
1214
1215 for( EDA_ITEM* redrawItem : itemsToRedraw )
1217
1219 }
1220
1221 return 0;
1222}
1223
1224
1226{
1228
1229 // Deactivate other tools; particularly important if another PICKER is currently running
1230 Activate();
1231
1232 picker->SetCursor( KICURSOR::BULLSEYE );
1233 picker->SetSnapping( false );
1234
1235 picker->SetClickHandler(
1236 [this] ( const VECTOR2D& aPos )
1237 {
1238 return highlightNet( m_toolMgr, aPos );
1239 } );
1240
1242
1243 return 0;
1244}
1245
1246
1248{
1249 wxCHECK( m_frame, 0 );
1250
1251 if( m_frame->GetUndoCommandCount() <= 0 )
1252 return 0;
1253
1254 // Inform tools that undo command was issued
1256
1257 // Get the old list
1259
1260 wxCHECK( undo_list, 0 );
1261
1262 m_frame->PutDataInPreviousState( undo_list );
1263
1264 // Now push the old command to the RedoList
1265 undo_list->ReversePickersListOrder();
1266 m_frame->PushCommandToRedoList( undo_list );
1267
1268 m_toolMgr->GetTool<EE_SELECTION_TOOL>()->RebuildSelection();
1269
1271 m_frame->OnModify();
1272
1273 return 0;
1274}
1275
1276
1278{
1279 wxCHECK( m_frame, 0 );
1280
1281 if( m_frame->GetRedoCommandCount() == 0 )
1282 return 0;
1283
1284 // Inform tools that undo command was issued
1286
1287 /* Get the old list */
1289
1290 wxCHECK( list, 0 );
1291
1292 /* Redo the command: */
1294
1295 /* Put the old list in UndoList */
1298
1299 m_toolMgr->GetTool<EE_SELECTION_TOOL>()->RebuildSelection();
1300
1302 m_frame->OnModify();
1303
1304 return 0;
1305}
1306
1307
1308bool SCH_EDITOR_CONTROL::doCopy( bool aUseDuplicateClipboard )
1309{
1311 EE_SELECTION& selection = selTool->RequestSelection();
1312 SCHEMATIC& schematic = m_frame->Schematic();
1313
1314 if( selection.Empty() )
1315 return false;
1316
1317 if( aUseDuplicateClipboard )
1318 m_duplicateIsHoverSelection = selection.IsHover();
1319
1320 selection.SetScreen( m_frame->GetScreen() );
1322
1323 for( EDA_ITEM* item : selection )
1324 {
1325 if( item->Type() == SCH_SHEET_T )
1326 {
1327 SCH_SHEET* sheet = (SCH_SHEET*) item;
1328 m_supplementaryClipboard[ sheet->GetFileName() ] = sheet->GetScreen();
1329 }
1330 else if( item->Type() == SCH_FIELD_T && selection.IsHover() )
1331 {
1332 // Most of the time the user is trying to duplicate the parent symbol
1333 // and the field text is in it
1334 selection.Add( item->GetParent() );
1335 }
1336 else if( item->Type() == SCH_MARKER_T )
1337 {
1338 // Don't let the markers be copied
1339 selection.Remove( item );
1340 }
1341 }
1342
1343 STRING_FORMATTER formatter;
1344 SCH_IO_KICAD_SEXPR plugin;
1345 SCH_SHEET_LIST hierarchy = schematic.GetSheets();
1347
1348 plugin.Format( &selection, &selPath, schematic, &formatter, true );
1349
1350 if( selection.IsHover() )
1352
1353 if( aUseDuplicateClipboard )
1354 {
1355 m_duplicateClipboard = formatter.GetString();
1356 return true;
1357 }
1358
1359 return m_toolMgr->SaveClipboard( formatter.GetString() );
1360}
1361
1362
1363bool SCH_EDITOR_CONTROL::searchSupplementaryClipboard( const wxString& aSheetFilename,
1364 SCH_SCREEN** aScreen )
1365{
1366 if( m_supplementaryClipboard.count( aSheetFilename ) > 0 )
1367 {
1368 *aScreen = m_supplementaryClipboard[ aSheetFilename ];
1369 return true;
1370 }
1371
1372 return false;
1373}
1374
1375
1377{
1378 doCopy( true ); // Use the local clipboard
1379 Paste( aEvent );
1380
1381 return 0;
1382}
1383
1384
1386{
1387 wxTextEntry* textEntry = dynamic_cast<wxTextEntry*>( wxWindow::FindFocus() );
1388
1389 if( textEntry )
1390 {
1391 textEntry->Cut();
1392 return 0;
1393 }
1394
1395 if( doCopy() )
1397
1398 return 0;
1399}
1400
1401
1403{
1404 wxTextEntry* textEntry = dynamic_cast<wxTextEntry*>( wxWindow::FindFocus() );
1405
1406 if( textEntry )
1407 {
1408 textEntry->Copy();
1409 return 0;
1410 }
1411
1412 doCopy();
1413
1414 return 0;
1415}
1416
1417
1419 const SCH_SHEET_PATH& aPastePath,
1420 const KIID_PATH& aClipPath,
1421 bool aForceKeepAnnotations )
1422{
1423 wxCHECK( m_frame && aSymbol, /* void */ );
1424
1425 SCH_SYMBOL_INSTANCE newInstance;
1426 bool instanceFound = false;
1427 KIID_PATH pasteLookupPath = aClipPath;
1428
1429 m_pastedSymbols.insert( aSymbol );
1430
1431 for( const SCH_SYMBOL_INSTANCE& tmp : aSymbol->GetInstances() )
1432 {
1433 if( ( tmp.m_Path.empty() && aClipPath.empty() )
1434 || ( !aClipPath.empty() && tmp.m_Path.EndsWith( aClipPath ) ) )
1435 {
1436 newInstance = tmp;
1437 instanceFound = true;
1438
1439 wxLogTrace( traceSchPaste,
1440 wxS( "Pasting found symbol instance with reference %s, unit %d:"
1441 "\n\tClipboard path: %s\n\tSymbol UUID: %s." ),
1442 tmp.m_Reference, tmp.m_Unit,
1443 aClipPath.AsString(), aSymbol->m_Uuid.AsString() );
1444
1445 break;
1446 }
1447 }
1448
1449 // The pasted symbol look up paths include the symbol UUID.
1450 pasteLookupPath.push_back( aSymbol->m_Uuid );
1451
1452 if( !instanceFound )
1453 {
1454 wxLogTrace( traceSchPaste,
1455 wxS( "Clipboard symbol instance **not** found:\n\tClipboard path: %s\n\t"
1456 "Symbol UUID: %s." ),
1457 aClipPath.AsString(), aSymbol->m_Uuid.AsString() );
1458
1459 // Some legacy versions saved value fields escaped. While we still do in the symbol
1460 // editor, we don't anymore in the schematic, so be sure to unescape them.
1461 SCH_FIELD* valueField = aSymbol->GetField( VALUE_FIELD );
1462 valueField->SetText( UnescapeString( valueField->GetText() ) );
1463
1464 // Pasted from notepad or an older instance of eeschema. Use the values in the fields
1465 // instead.
1466 newInstance.m_Reference = aSymbol->GetField( REFERENCE_FIELD )->GetText();
1467 newInstance.m_Unit = aSymbol->GetUnit();
1468 }
1469
1470 newInstance.m_Path = aPastePath.Path();
1471 newInstance.m_ProjectName = m_frame->Prj().GetProjectName();
1472
1473 aSymbol->AddHierarchicalReference( newInstance );
1474
1475 if( !aForceKeepAnnotations )
1476 aSymbol->ClearAnnotation( &aPastePath, false );
1477
1478 // We might clear annotations but always leave the original unit number from the paste.
1479 aSymbol->SetUnit( newInstance.m_Unit );
1480}
1481
1482
1484 const SCH_SHEET_PATH& aPastePath,
1485 const KIID_PATH& aClipPath,
1486 bool aForceKeepAnnotations,
1487 SCH_SHEET_LIST* aPastedSheets,
1488 std::map<SCH_SHEET_PATH,
1489 SCH_REFERENCE_LIST>& aPastedSymbols )
1490{
1491 wxCHECK( aSheet && aPastedSheets, aPastePath );
1492
1493 SCH_SHEET_PATH sheetPath = aPastePath;
1494 sheetPath.push_back( aSheet );
1495
1496 aPastedSheets->push_back( sheetPath );
1497
1498 if( aSheet->GetScreen() == nullptr )
1499 return sheetPath; // We can only really set the page number but not load any items
1500
1501 for( SCH_ITEM* item : aSheet->GetScreen()->Items() )
1502 {
1503 if( item->IsConnectable() )
1504 item->SetConnectivityDirty();
1505
1506 if( item->Type() == SCH_SYMBOL_T )
1507 {
1508 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
1509
1510 wxCHECK2( symbol, continue );
1511
1512 // Only do this once if the symbol is shared across multiple sheets.
1513 if( !m_pastedSymbols.count( symbol ) )
1514 {
1515 for( SCH_PIN* pin : symbol->GetPins() )
1516 {
1517 const_cast<KIID&>( pin->m_Uuid ) = KIID();
1518 pin->SetConnectivityDirty();
1519 }
1520 }
1521
1522 updatePastedSymbol( symbol, sheetPath, aClipPath, aForceKeepAnnotations );
1523 }
1524 else if( item->Type() == SCH_SHEET_T )
1525 {
1526 SCH_SHEET* subsheet = static_cast<SCH_SHEET*>( item );
1527
1528 wxCHECK2( subsheet, continue );
1529
1530 // Make sure pins get a new UUID and set the dirty connectivity flag.
1531 if( !aPastedSheets->ContainsSheet( subsheet ) )
1532 {
1533 for( SCH_SHEET_PIN* pin : subsheet->GetPins() )
1534 {
1535 const_cast<KIID&>( pin->m_Uuid ) = KIID();
1536 pin->SetConnectivityDirty();
1537 }
1538 }
1539
1540 KIID_PATH newClipPath = aClipPath;
1541 newClipPath.push_back( subsheet->m_Uuid );
1542
1543 updatePastedSheet( subsheet, sheetPath, newClipPath, aForceKeepAnnotations,
1544 aPastedSheets, aPastedSymbols );
1545 }
1546 }
1547
1548 sheetPath.GetSymbols( aPastedSymbols[aPastePath] );
1549
1550 return sheetPath;
1551}
1552
1553
1555{
1556 wxCHECK( aScreen, /* void */ );
1557
1558 for( const SCH_ITEM* item : aScreen->Items() )
1559 {
1560 if( item->Type() == SCH_SYMBOL_T )
1561 {
1562 const SCH_SYMBOL* symbol = static_cast<const SCH_SYMBOL*>( item );
1563
1564 wxCHECK2( symbol, continue );
1565
1566 for( const SCH_SYMBOL_INSTANCE& symbolInstance : symbol->GetInstances() )
1567 {
1568 KIID_PATH pathWithSymbol = symbolInstance.m_Path;
1569
1570 pathWithSymbol.push_back( symbol->m_Uuid );
1571
1572 m_clipboardSymbolInstances[pathWithSymbol] = symbolInstance;
1573 }
1574 }
1575 }
1576}
1577
1578
1580{
1581 wxCHECK( m_frame, /* void */ );
1582
1583 for( SCH_SYMBOL* symbol : m_pastedSymbols )
1584 {
1585 wxCHECK2( symbol, continue );
1586
1587 std::vector<KIID_PATH> instancePathsToRemove;
1588
1589 for( const SCH_SYMBOL_INSTANCE& instance : symbol->GetInstances() )
1590 {
1591 if( ( instance.m_ProjectName != m_frame->Prj().GetProjectName() )
1592 || instance.m_Path.empty() )
1593 instancePathsToRemove.emplace_back( instance.m_Path );
1594 }
1595
1596 for( const KIID_PATH& path : instancePathsToRemove )
1597 symbol->RemoveInstance( path );
1598 }
1599}
1600
1601
1603{
1604 wxTextEntry* textEntry = dynamic_cast<wxTextEntry*>( wxWindow::FindFocus() );
1605
1606 if( textEntry )
1607 {
1608 textEntry->Paste();
1609 return 0;
1610 }
1611
1613 std::string content;
1614 VECTOR2I eventPos;
1615
1616 if( aEvent.IsAction( &ACTIONS::duplicate ) )
1617 content = m_duplicateClipboard;
1618 else
1619 content = m_toolMgr->GetClipboardUTF8();
1620
1621 if( content.empty() )
1622 return 0;
1623
1624 if( aEvent.IsAction( &ACTIONS::duplicate ) )
1625 eventPos = getViewControls()->GetCursorPosition( false );
1626
1627 STRING_LINE_READER reader( content, "Clipboard" );
1628 SCH_IO_KICAD_SEXPR plugin;
1629
1630 SCH_SHEET tempSheet;
1631 SCH_SCREEN* tempScreen = new SCH_SCREEN( &m_frame->Schematic() );
1632
1634 int annotateStartNum = m_frame->Schematic().Settings().m_AnnotateStartNum;
1635
1636 // Screen object on heap is owned by the sheet.
1637 tempSheet.SetScreen( tempScreen );
1638
1639 try
1640 {
1641 plugin.LoadContent( reader, &tempSheet );
1642 }
1643 catch( IO_ERROR& )
1644 {
1645 // If it wasn't content, then paste as text object.
1646 SCH_TEXT* text_item = new SCH_TEXT( VECTOR2I( 0, 0 ), content );
1647 tempScreen->Append( text_item );
1648 }
1649
1650 m_pastedSymbols.clear();
1652
1653 // Save pasted symbol instances in case the user chooses to keep existing symbol annotation.
1654 setPastedSymbolInstances( tempScreen );
1655
1656 tempScreen->MigrateSimModels();
1657
1658 PASTE_MODE pasteMode = annotate.automatic ? PASTE_MODE::RESPECT_OPTIONS
1659 : PASTE_MODE::REMOVE_ANNOTATIONS;
1660
1661 if( aEvent.IsAction( &ACTIONS::pasteSpecial ) )
1662 {
1663 DIALOG_PASTE_SPECIAL dlg( m_frame, &pasteMode );
1664
1665 if( dlg.ShowModal() == wxID_CANCEL )
1666 return 0;
1667 }
1668
1669 bool forceKeepAnnotations = pasteMode != PASTE_MODE::REMOVE_ANNOTATIONS;
1670
1671 // SCH_SEXP_PLUGIN added the items to the paste screen, but not to the view or anything
1672 // else. Pull them back out to start with.
1673 SCH_COMMIT commit( m_toolMgr );
1674 EDA_ITEMS loadedItems;
1675 std::vector<SCH_ITEM*> sortedLoadedItems;
1676 bool sheetsPasted = false;
1677 SCH_SHEET_LIST hierarchy = m_frame->Schematic().GetSheets();
1678 SCH_SHEET_PATH& pasteRoot = m_frame->GetCurrentSheet();
1679 wxFileName destFn = pasteRoot.Last()->GetFileName();
1680
1681 if( destFn.IsRelative() )
1682 destFn.MakeAbsolute( m_frame->Prj().GetProjectPath() );
1683
1684 // List of paths in the hierarchy that refer to the destination sheet of the paste
1685 SCH_SHEET_LIST sheetPathsForScreen = hierarchy.FindAllSheetsForScreen( pasteRoot.LastScreen() );
1686 sheetPathsForScreen.SortByPageNumbers();
1687
1688 // Build a list of screens from the current design (to avoid loading sheets that already exist)
1689 std::map<wxString, SCH_SCREEN*> loadedScreens;
1690
1691 for( const SCH_SHEET_PATH& item : hierarchy )
1692 {
1693 if( item.LastScreen() )
1694 loadedScreens[item.Last()->GetFileName()] = item.LastScreen();
1695 }
1696
1697 // Build symbol list for reannotation of duplicates
1698 SCH_REFERENCE_LIST existingRefs;
1699 hierarchy.GetSymbols( existingRefs );
1700 existingRefs.SortByReferenceOnly();
1701
1702 // Build UUID map for fetching last-resolved-properties
1703 std::map<KIID, EDA_ITEM*> itemMap;
1704 hierarchy.FillItemMap( itemMap );
1705
1706 // Keep track of pasted sheets and symbols for the different paths to the hierarchy.
1707 std::map<SCH_SHEET_PATH, SCH_REFERENCE_LIST> pastedSymbols;
1708 std::map<SCH_SHEET_PATH, SCH_SHEET_LIST> pastedSheets;
1709
1710 for( SCH_ITEM* item : tempScreen->Items() )
1711 {
1712 if( item->Type() == SCH_SHEET_T )
1713 sortedLoadedItems.push_back( item );
1714 else
1715 loadedItems.push_back( item );
1716 }
1717
1718 sort( sortedLoadedItems.begin(), sortedLoadedItems.end(),
1719 []( SCH_ITEM* firstItem, SCH_ITEM* secondItem )
1720 {
1721 SCH_SHEET* firstSheet = static_cast<SCH_SHEET*>( firstItem );
1722 SCH_SHEET* secondSheet = static_cast<SCH_SHEET*>( secondItem );
1723 return StrNumCmp( firstSheet->GetName(), secondSheet->GetName(), false ) < 0;
1724 });
1725
1726
1727 for( SCH_ITEM* item : sortedLoadedItems )
1728 {
1729 loadedItems.push_back( item );
1730
1731 if( item->Type() == SCH_SHEET_T )
1732 {
1733 SCH_SHEET* sheet = static_cast<SCH_SHEET*>( item );
1734 SCH_FIELD& nameField = sheet->GetFields()[SHEETNAME];
1735 wxString baseName = nameField.GetText();
1736 wxFileName srcFn = sheet->GetFileName();
1737
1738 if( srcFn.IsRelative() )
1739 srcFn.MakeAbsolute( m_frame->Prj().GetProjectPath() );
1740
1741 SCH_SHEET_LIST sheetHierarchy( sheet );
1742
1743 if( hierarchy.TestForRecursion( sheetHierarchy, destFn.GetFullPath( wxPATH_UNIX ) ) )
1744 {
1745 auto msg = wxString::Format( _( "The pasted sheet '%s'\n"
1746 "was dropped because the destination already has "
1747 "the sheet or one of its subsheets as a parent." ),
1748 sheet->GetFileName() );
1749 DisplayError( m_frame, msg );
1750 loadedItems.pop_back();
1751 }
1752 }
1753 }
1754
1755 // Remove the references from our temporary screen to prevent freeing on the DTOR
1756 tempScreen->Clear( false );
1757
1758 for( EDA_ITEM* item : loadedItems )
1759 {
1760 KIID_PATH clipPath( wxT( "/" ) ); // clipboard is at root
1761
1762 SCH_ITEM* schItem = static_cast<SCH_ITEM*>( item );
1763
1764 wxCHECK2( schItem, continue );
1765
1766 if( schItem->IsConnectable() )
1767 schItem->SetConnectivityDirty();
1768
1769 if( item->Type() == SCH_SYMBOL_T )
1770 {
1771 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
1772
1773 // The library symbol gets set from the cached library symbols in the current
1774 // schematic not the symbol libraries. The cached library symbol may have
1775 // changed from the original library symbol which would cause the copy to
1776 // be incorrect.
1777 SCH_SCREEN* currentScreen = m_frame->GetScreen();
1778
1779 wxCHECK2( currentScreen, continue );
1780
1781 auto it = currentScreen->GetLibSymbols().find( symbol->GetSchSymbolLibraryName() );
1782 auto end = currentScreen->GetLibSymbols().end();
1783
1784 if( it == end )
1785 {
1786 // If can't find library definition in the design, use the pasted library
1787 it = tempScreen->GetLibSymbols().find( symbol->GetSchSymbolLibraryName() );
1788 end = tempScreen->GetLibSymbols().end();
1789 }
1790
1791 LIB_SYMBOL* libSymbol = nullptr;
1792
1793 if( it != end )
1794 {
1795 libSymbol = new LIB_SYMBOL( *it->second );
1796 symbol->SetLibSymbol( libSymbol );
1797 }
1798
1799 for( SCH_SHEET_PATH& sheetPath : sheetPathsForScreen )
1800 updatePastedSymbol( symbol, sheetPath, clipPath, forceKeepAnnotations );
1801
1802 // Assign a new KIID
1803 const_cast<KIID&>( item->m_Uuid ) = KIID();
1804
1805 // Make sure pins get a new UUID
1806 for( SCH_PIN* pin : symbol->GetPins() )
1807 {
1808 const_cast<KIID&>( pin->m_Uuid ) = KIID();
1809 pin->SetConnectivityDirty();
1810 }
1811
1812 for( SCH_SHEET_PATH& sheetPath : sheetPathsForScreen )
1813 {
1814 // Ignore symbols from a non-existant library.
1815 if( libSymbol )
1816 {
1817 SCH_REFERENCE schReference( symbol, libSymbol, sheetPath );
1818 schReference.SetSheetNumber( sheetPath.GetVirtualPageNumber() );
1819 pastedSymbols[sheetPath].AddItem( schReference );
1820 }
1821 }
1822 }
1823 else if( item->Type() == SCH_SHEET_T )
1824 {
1825 SCH_SHEET* sheet = (SCH_SHEET*) item;
1826 SCH_FIELD& nameField = sheet->GetFields()[SHEETNAME];
1827 wxString baseName = nameField.GetText();
1828 wxString candidateName = baseName;
1829 wxString number;
1830
1831 while( !baseName.IsEmpty() && wxIsdigit( baseName.Last() ) )
1832 {
1833 number = baseName.Last() + number;
1834 baseName.RemoveLast();
1835 }
1836
1837 // Update hierarchy to include any other sheets we already added, avoiding
1838 // duplicate sheet names
1839 hierarchy = m_frame->Schematic().GetSheets();
1840
1841 //@todo: it might be better to just iterate through the sheet names
1842 // in this screen instead of the whole hierarchy.
1843 int uniquifier = std::max( 0, wxAtoi( number ) ) + 1;
1844
1845 while( hierarchy.NameExists( candidateName ) )
1846 candidateName = wxString::Format( wxT( "%s%d" ), baseName, uniquifier++ );
1847
1848 nameField.SetText( candidateName );
1849
1850 wxFileName fn = sheet->GetFileName();
1851 SCH_SCREEN* existingScreen = nullptr;
1852
1853 sheet->SetParent( pasteRoot.Last() );
1854 sheet->SetScreen( nullptr );
1855
1856 if( !fn.IsAbsolute() )
1857 {
1858 wxFileName currentSheetFileName = pasteRoot.LastScreen()->GetFileName();
1859 fn.Normalize( FN_NORMALIZE_FLAGS | wxPATH_NORM_ENV_VARS,
1860 currentSheetFileName.GetPath() );
1861 }
1862
1863 // Try to find the screen for the pasted sheet by several means
1864 if( !m_frame->Schematic().Root().SearchHierarchy( fn.GetFullPath( wxPATH_UNIX ),
1865 &existingScreen ) )
1866 {
1867 if( loadedScreens.count( sheet->GetFileName() ) > 0 )
1868 existingScreen = loadedScreens.at( sheet->GetFileName() );
1869 else
1870 searchSupplementaryClipboard( sheet->GetFileName(), &existingScreen );
1871 }
1872
1873 if( existingScreen )
1874 {
1875 sheet->SetScreen( existingScreen );
1876 }
1877 else
1878 {
1879 if( !m_frame->LoadSheetFromFile( sheet, &pasteRoot, fn.GetFullPath() ) )
1880 m_frame->InitSheet( sheet, sheet->GetFileName() );
1881 }
1882
1883 // Save the symbol instances in case the user chooses to keep the existing
1884 // symbol annotation.
1886 sheetsPasted = true;
1887
1888 // Push it to the clipboard path while it still has its old KIID
1889 clipPath.push_back( sheet->m_Uuid );
1890
1891 // Assign a new KIID to the pasted sheet
1892 const_cast<KIID&>( sheet->m_Uuid ) = KIID();
1893
1894 // Make sure pins get a new UUID
1895 for( SCH_SHEET_PIN* pin : sheet->GetPins() )
1896 {
1897 const_cast<KIID&>( pin->m_Uuid ) = KIID();
1898 pin->SetConnectivityDirty();
1899 }
1900
1901 // Once we have our new KIID we can update all pasted instances. This will either
1902 // reset the annotations or copy "kept" annotations from the supplementary clipboard.
1903 for( SCH_SHEET_PATH& sheetPath : sheetPathsForScreen )
1904 {
1905 SCH_SHEET_PATH subPath = updatePastedSheet( sheet, sheetPath, clipPath,
1906 ( forceKeepAnnotations && annotate.automatic ),
1907 &pastedSheets[sheetPath],
1908 pastedSymbols );
1909 }
1910 }
1911 else
1912 {
1913 SCH_ITEM* srcItem = dynamic_cast<SCH_ITEM*>( itemMap[ item->m_Uuid ] );
1914 SCH_ITEM* destItem = dynamic_cast<SCH_ITEM*>( item );
1915
1916 // Everything gets a new KIID
1917 const_cast<KIID&>( item->m_Uuid ) = KIID();
1918
1919 if( srcItem && destItem )
1920 {
1921 destItem->SetConnectivityDirty( true );
1922 destItem->SetLastResolvedState( srcItem );
1923 }
1924 }
1925
1926 // Lines need both ends selected for a move after paste so the whole line moves.
1927 if( item->Type() == SCH_LINE_T )
1928 item->SetFlags( STARTPOINT | ENDPOINT );
1929
1930 item->SetFlags( IS_NEW | IS_PASTED | IS_MOVING );
1931
1932 if( !m_frame->GetScreen()->CheckIfOnDrawList( (SCH_ITEM*) item ) ) // don't want a loop!
1933 m_frame->AddToScreen( item, m_frame->GetScreen() );
1934
1935 commit.Added( (SCH_ITEM*) item, m_frame->GetScreen() );
1936
1937 // Start out hidden so the pasted items aren't "ghosted" in their original location
1938 // before being moved to the current location.
1939 getView()->Hide( item, true );
1940 }
1941
1942 if( sheetsPasted )
1943 {
1944 // Update page numbers: Find next free numeric page number
1945 for( SCH_SHEET_PATH& sheetPath : sheetPathsForScreen )
1946 {
1947 for( SCH_SHEET_PATH& pastedSheet : pastedSheets[sheetPath] )
1948 {
1949 int page = 1;
1950 wxString pageNum = wxString::Format( "%d", page );
1951
1952 while( hierarchy.PageNumberExists( pageNum ) )
1953 pageNum = wxString::Format( "%d", ++page );
1954
1955 SCH_SHEET_INSTANCE sheetInstance;
1956
1957 sheetInstance.m_Path = pastedSheet.Path();
1958
1959 // Don't include the actual sheet in the instance path.
1960 sheetInstance.m_Path.pop_back();
1961 sheetInstance.m_PageNumber = pageNum;
1962 sheetInstance.m_ProjectName = m_frame->Prj().GetProjectName();
1963
1964 SCH_SHEET* sheet = pastedSheet.Last();
1965
1966 wxCHECK2( sheet, continue );
1967
1968 sheet->AddInstance( sheetInstance );
1969 hierarchy.push_back( pastedSheet );
1970
1971 // Remove all pasted sheet instance data that is not part of the current project.
1972 std::vector<KIID_PATH> instancesToRemove;
1973
1974 for( const SCH_SHEET_INSTANCE& instance : sheet->GetInstances() )
1975 {
1976 if( !hierarchy.HasPath( instance.m_Path ) )
1977 instancesToRemove.push_back( instance.m_Path );
1978 }
1979
1980 for( const KIID_PATH& instancePath : instancesToRemove )
1981 sheet->RemoveInstance( instancePath );
1982 }
1983 }
1984
1986
1987 // Get a version with correct sheet numbers since we've pasted sheets,
1988 // we'll need this when annotating next
1989 hierarchy = m_frame->Schematic().GetSheets();
1990 }
1991
1992 std::map<SCH_SHEET_PATH, SCH_REFERENCE_LIST> annotatedSymbols;
1993
1994 // Update the list of symbol instances that satisfy the annotation criteria.
1995 for( const SCH_SHEET_PATH& sheetPath : sheetPathsForScreen )
1996 {
1997 for( size_t i = 0; i < pastedSymbols[sheetPath].GetCount(); i++ )
1998 {
1999 if( pasteMode == PASTE_MODE::UNIQUE_ANNOTATIONS
2000 || pasteMode == PASTE_MODE::RESPECT_OPTIONS
2001 || pastedSymbols[sheetPath][i].AlwaysAnnotate() )
2002 {
2003 annotatedSymbols[sheetPath].AddItem( pastedSymbols[sheetPath][i] );
2004 }
2005 }
2006
2007 for( const SCH_SHEET_PATH& pastedSheetPath : pastedSheets[sheetPath] )
2008 {
2009 for( size_t i = 0; i < pastedSymbols[pastedSheetPath].GetCount(); i++ )
2010 {
2011 if( pasteMode == PASTE_MODE::UNIQUE_ANNOTATIONS
2012 || pasteMode == PASTE_MODE::RESPECT_OPTIONS
2013 || pastedSymbols[pastedSheetPath][i].AlwaysAnnotate() )
2014 {
2015 annotatedSymbols[pastedSheetPath].AddItem( pastedSymbols[pastedSheetPath][i] );
2016 }
2017 }
2018 }
2019 }
2020
2021 if( !annotatedSymbols.empty() )
2022 {
2023 for( SCH_SHEET_PATH& path : sheetPathsForScreen )
2024 {
2025 annotatedSymbols[path].SortByReferenceOnly();
2026
2027 if( pasteMode == PASTE_MODE::UNIQUE_ANNOTATIONS )
2028 {
2029 annotatedSymbols[path].ReannotateDuplicates( existingRefs );
2030 }
2031 else
2032 {
2033 annotatedSymbols[path].ReannotateByOptions( (ANNOTATE_ORDER_T) annotate.sort_order,
2034 (ANNOTATE_ALGO_T) annotate.method,
2035 annotateStartNum, existingRefs, false,
2036 &hierarchy );
2037 }
2038
2039 annotatedSymbols[path].UpdateAnnotation();
2040
2041 // Update existing refs for next iteration
2042 for( size_t i = 0; i < annotatedSymbols[path].GetCount(); i++ )
2043 existingRefs.AddItem( annotatedSymbols[path][i] );
2044
2045 for( const SCH_SHEET_PATH& pastedSheetPath : pastedSheets[path] )
2046 {
2047 annotatedSymbols[pastedSheetPath].SortByReferenceOnly();
2048
2049 if( pasteMode == PASTE_MODE::UNIQUE_ANNOTATIONS )
2050 {
2051 annotatedSymbols[pastedSheetPath].ReannotateDuplicates( existingRefs );
2052 }
2053 else
2054 {
2055 annotatedSymbols[pastedSheetPath].ReannotateByOptions( (ANNOTATE_ORDER_T) annotate.sort_order,
2056 (ANNOTATE_ALGO_T) annotate.method,
2057 annotateStartNum, existingRefs,
2058 false,
2059 &hierarchy );
2060 }
2061
2062 annotatedSymbols[pastedSheetPath].UpdateAnnotation();
2063
2064 // Update existing refs for next iteration
2065 for( size_t i = 0; i < annotatedSymbols[pastedSheetPath].GetCount(); i++ )
2066 existingRefs.AddItem( annotatedSymbols[pastedSheetPath][i] );
2067 }
2068 }
2069 }
2070
2072
2073 // The copy operation creates instance paths that are not valid for the current project or
2074 // saved as part of another project. Prune them now so they do not accumulate in the saved
2075 // schematic file.
2077
2078 SCH_SCREENS allScreens( m_frame->Schematic().Root() );
2079
2084
2085 // Now clear the previous selection, select the pasted items, and fire up the "move" tool.
2088
2089 EE_SELECTION& selection = selTool->GetSelection();
2090
2091 if( !selection.Empty() )
2092 {
2093 if( aEvent.IsAction( &ACTIONS::duplicate ) )
2094 {
2095 int closest_dist = INT_MAX;
2096
2097 auto processPt =
2098 [&]( const VECTOR2I& pt )
2099 {
2100 int dist = ( eventPos - pt ).EuclideanNorm();
2101
2102 if( dist < closest_dist )
2103 {
2104 selection.SetReferencePoint( pt );
2105 closest_dist = dist;
2106 }
2107 };
2108
2109 // Prefer connection points (which should remain on grid)
2110 for( EDA_ITEM* item : selection.Items() )
2111 {
2112 SCH_ITEM* sch_item = dynamic_cast<SCH_ITEM*>( item );
2113 SCH_PIN* pin = dynamic_cast<SCH_PIN*>( item );
2114
2115 if( sch_item && sch_item->IsConnectable() )
2116 {
2117 for( const VECTOR2I& pt : sch_item->GetConnectionPoints() )
2118 processPt( pt );
2119 }
2120 else if( pin )
2121 {
2122 processPt( pin->GetPosition() );
2123 }
2124 }
2125
2126 // Only process other points if we didn't find any connection points
2127 if( closest_dist == INT_MAX )
2128 {
2129 for( EDA_ITEM* item : selection.Items() )
2130 {
2131 switch( item->Type() )
2132 {
2133 case SCH_LINE_T:
2134 processPt( static_cast<SCH_LINE*>( item )->GetStartPoint() );
2135 processPt( static_cast<SCH_LINE*>( item )->GetEndPoint() );
2136 break;
2137
2138 case SCH_SHAPE_T:
2139 {
2140 SCH_SHAPE* shape = static_cast<SCH_SHAPE*>( item );
2141
2142 switch( shape->GetShape() )
2143 {
2144 case SHAPE_T::RECTANGLE:
2145 for( const VECTOR2I& pt : shape->GetRectCorners() )
2146 processPt( pt );
2147
2148 break;
2149
2150 case SHAPE_T::CIRCLE:
2151 processPt( shape->GetCenter() );
2152 break;
2153
2154 case SHAPE_T::POLY:
2155 for( int ii = 0; ii < shape->GetPolyShape().TotalVertices(); ++ii )
2156 processPt( shape->GetPolyShape().CVertex( ii ) );
2157
2158 break;
2159
2160 default:
2161 processPt( shape->GetStart() );
2162 processPt( shape->GetEnd() );
2163 break;
2164 }
2165
2166 break;
2167 }
2168
2169 default:
2170 processPt( item->GetPosition() );
2171 break;
2172 }
2173 }
2174 }
2175
2176 selection.SetIsHover( m_duplicateIsHoverSelection );
2177 }
2178 else
2179 {
2180 SCH_ITEM* item = static_cast<SCH_ITEM*>( selection.GetTopLeftItem() );
2181
2182 selection.SetReferencePoint( item->GetPosition() );
2183 }
2184
2186 {
2187 // Pushing the commit will update the connectivity.
2188 commit.Push( _( "Paste" ) );
2189
2190 if( sheetsPasted )
2192 // UpdateHierarchyNavigator() will call RefreshNetNavigator()
2193 else
2195 }
2196 else
2197 {
2198 commit.Revert();
2199 }
2200 }
2201
2202 return 0;
2203}
2204
2205
2207{
2209 EE_SELECTION& selection = selTool->RequestSelection( { SCH_SYMBOL_T } );
2210 SCH_SYMBOL* symbol = nullptr;
2211 SYMBOL_EDIT_FRAME* symbolEditor;
2212
2213 if( selection.GetSize() >= 1 )
2214 symbol = (SCH_SYMBOL*) selection.Front();
2215
2216 if( selection.IsHover() )
2218
2219 if( !symbol )
2220 {
2221 // Giant hack: by default we assign Edit Table to the same hotkey, so give the table
2222 // tool a chance to handle it if we can't.
2224 tableTool->EditTable( aEvent );
2225
2226 return 0;
2227 }
2228
2229 if( symbol->GetEditFlags() != 0 )
2230 return 0;
2231
2232 if( symbol->IsMissingLibSymbol() )
2233 {
2234 m_frame->ShowInfoBarError( _( "Symbols with broken library symbol links cannot "
2235 "be edited." ) );
2236 return 0;
2237 }
2238
2240 symbolEditor = (SYMBOL_EDIT_FRAME*) m_frame->Kiway().Player( FRAME_SCH_SYMBOL_EDITOR, false );
2241
2242 if( symbolEditor )
2243 {
2244 if( wxWindow* blocking_win = symbolEditor->Kiway().GetBlockingDialog() )
2245 blocking_win->Close( true );
2246
2247 if( aEvent.IsAction( &EE_ACTIONS::editWithLibEdit ) )
2248 {
2249 symbolEditor->LoadSymbolFromSchematic( symbol );
2250 }
2252 {
2253 symbolEditor->LoadSymbol( symbol->GetLibId(), symbol->GetUnit(),
2254 symbol->GetBodyStyle() );
2255
2256 if( !symbolEditor->IsSymbolTreeShown() )
2257 {
2258 wxCommandEvent evt;
2259 symbolEditor->OnToggleSymbolTree( evt );
2260 }
2261 }
2262 }
2263
2264 return 0;
2265}
2266
2267
2269{
2270 wxCommandEvent dummy;
2272 return 0;
2273}
2274
2275
2277{
2278 wxCommandEvent dummy;
2280 return 0;
2281}
2282
2283
2285{
2287
2288 wxCHECK( dlg, 0 );
2289
2290 // Needed at least on Windows. Raise() is not enough
2291 dlg->Show( true );
2292
2293 // Bring it to the top if already open. Dual monitor users need this.
2294 dlg->Raise();
2295
2296 dlg->ShowEditTab();
2297
2298 return 0;
2299}
2300
2301
2303{
2306
2307 return 0;
2308}
2309
2310
2312{
2313 wxCommandEvent dummy;
2315 return 0;
2316}
2317
2318
2320{
2321 wxCommandEvent dummy;
2323 return 0;
2324}
2325
2326
2328{
2330 dlg.ShowModal();
2331 return 0;
2332}
2333
2334
2336{
2337 int result = NET_PLUGIN_CHANGE;
2338
2339 // If a plugin is removed or added, rebuild and reopen the new dialog
2340 while( result == NET_PLUGIN_CHANGE )
2341 result = InvokeDialogNetList( m_frame );
2342
2343 return 0;
2344}
2345
2346
2348{
2350
2351 wxCHECK( dlg, 0 );
2352
2353 // Needed at least on Windows. Raise() is not enough
2354 dlg->Show( true );
2355
2356 // Bring it to the top if already open. Dual monitor users need this.
2357 dlg->Raise();
2358
2359 dlg->ShowExportTab();
2360
2361 return 0;
2362}
2363
2364
2366{
2368 return 0;
2369}
2370
2371
2373{
2376 return 0;
2377}
2378
2379
2381{
2382 getEditFrame<SCH_EDIT_FRAME>()->ToggleSearch();
2383 return 0;
2384}
2385
2386
2388{
2389 getEditFrame<SCH_EDIT_FRAME>()->ToggleSchematicHierarchy();
2390 return 0;
2391}
2392
2393
2395{
2396 getEditFrame<SCH_EDIT_FRAME>()->ToggleNetNavigator();
2397 return 0;
2398}
2399
2400
2402{
2403 getEditFrame<SCH_EDIT_FRAME>()->ToggleProperties();
2404 return 0;
2405}
2406
2407
2409{
2412
2415
2416 return 0;
2417}
2418
2419
2421{
2424
2427
2428 return 0;
2429}
2430
2431
2433{
2436
2439
2440 return 0;
2441}
2442
2443
2445{
2448
2451
2452 return 0;
2453}
2454
2455
2457{
2460
2463
2464 return 0;
2465}
2466
2467
2469{
2472
2475
2476 return 0;
2477}
2478
2479
2481{
2484
2488
2489 return 0;
2490}
2491
2492
2494{
2497
2501
2502 return 0;
2503}
2504
2505
2507{
2510 return 0;
2511}
2512
2513
2515{
2517 m_frame->eeconfig()->m_Drawing.line_mode %= LINE_MODE::LINE_MODE_COUNT;
2519 return 0;
2520}
2521
2522
2524{
2527 return 0;
2528}
2529
2530
2532{
2535 return 0;
2536}
2537
2538
2540{
2541
2543 return 0;
2544}
2545
2546
2548{
2549#ifdef KICAD_IPC_API
2550 Pgm().GetPluginManager().ReloadPlugins();
2551#endif
2552 return 0;
2553}
2554
2555
2557{
2558 int errors = 0;
2559 wxString details;
2560 bool quiet = aEvent.Parameter<bool>();
2561
2562 // Repair duplicate IDs.
2563 std::map<KIID, EDA_ITEM*> ids;
2564 int duplicates = 0;
2565
2566 auto processItem =
2567 [&]( EDA_ITEM* aItem )
2568 {
2569 auto it = ids.find( aItem->m_Uuid );
2570
2571 if( it != ids.end() && it->second != aItem )
2572 {
2573 duplicates++;
2574 const_cast<KIID&>( aItem->m_Uuid ) = KIID();
2575 }
2576
2577 ids[ aItem->m_Uuid ] = aItem;
2578 };
2579
2580 // Symbol IDs are the most important, so give them the first crack at "claiming" a
2581 // particular KIID.
2582
2583 for( const SCH_SHEET_PATH& sheet : m_frame->Schematic().GetSheets() )
2584 {
2585 SCH_SCREEN* screen = sheet.LastScreen();
2586
2587 for( SCH_ITEM* item : screen->Items().OfType( SCH_SYMBOL_T ) )
2588 {
2589 processItem( item );
2590
2591 for( SCH_PIN* pin : static_cast<SCH_SYMBOL*>( item )->GetPins( &sheet ) )
2592 processItem( pin );
2593 }
2594 }
2595
2596 for( const SCH_SHEET_PATH& sheet : m_frame->Schematic().GetSheets() )
2597 {
2598 SCH_SCREEN* screen = sheet.LastScreen();
2599
2600 for( SCH_ITEM* item : screen->Items() )
2601 {
2602 processItem( item );
2603
2604 item->RunOnChildren(
2605 [&]( SCH_ITEM* aChild )
2606 {
2607 processItem( item );
2608 } );
2609 }
2610 }
2611
2612 /*******************************
2613 * Your test here
2614 */
2615
2616 /*******************************
2617 * Inform the user
2618 */
2619
2620 if( duplicates )
2621 {
2622 errors += duplicates;
2623 details += wxString::Format( _( "%d duplicate IDs replaced.\n" ), duplicates );
2624 }
2625
2626 if( errors )
2627 {
2628 m_frame->OnModify();
2629
2630 wxString msg = wxString::Format( _( "%d potential problems repaired." ), errors );
2631
2632 if( !quiet )
2633 DisplayInfoMessage( m_frame, msg, details );
2634 }
2635 else if( !quiet )
2636 {
2637 DisplayInfoMessage( m_frame, _( "No errors found." ) );
2638 }
2639
2640 return 0;
2641}
2642
2643
2645{
2646 if( !Pgm().GetCommonSettings()->m_Input.hotkey_feedback )
2647 return 0;
2648
2649 GRID_SETTINGS& gridSettings = m_toolMgr->GetSettings()->m_Window.grid;
2650 int currentIdx = m_toolMgr->GetSettings()->m_Window.grid.last_size_idx;
2651
2652 wxArrayString gridsLabels;
2653
2654 for( const GRID& grid : gridSettings.grids )
2655 gridsLabels.Add( grid.UserUnitsMessageText( m_frame ) );
2656
2657 if( !m_frame->GetHotkeyPopup() )
2659
2661
2662 if( popup )
2663 popup->Popup( _( "Grid" ), gridsLabels, currentIdx );
2664
2665 return 0;
2666}
2667
2668
2670{
2671 Go( &SCH_EDITOR_CONTROL::New, ACTIONS::doNew.MakeEvent() );
2672 Go( &SCH_EDITOR_CONTROL::Open, ACTIONS::open.MakeEvent() );
2673 Go( &SCH_EDITOR_CONTROL::Save, ACTIONS::save.MakeEvent() );
2680 Go( &SCH_EDITOR_CONTROL::Plot, ACTIONS::plot.MakeEvent() );
2681 Go( &SCH_EDITOR_CONTROL::Quit, ACTIONS::quit.MakeEvent() );
2682
2685
2691
2694
2700
2702
2703 Go( &SCH_EDITOR_CONTROL::Undo, ACTIONS::undo.MakeEvent() );
2704 Go( &SCH_EDITOR_CONTROL::Redo, ACTIONS::redo.MakeEvent() );
2705 Go( &SCH_EDITOR_CONTROL::Cut, ACTIONS::cut.MakeEvent() );
2706 Go( &SCH_EDITOR_CONTROL::Copy, ACTIONS::copy.MakeEvent() );
2710
2712
2729
2734
2748
2751
2753
2758}
const char * name
Definition: DXF_plotter.cpp:57
static TOOL_ACTION updatePcbFromSchematic
Definition: actions.h:199
static TOOL_ACTION paste
Definition: actions.h:70
static TOOL_ACTION cancelInteractive
Definition: actions.h:63
static TOOL_ACTION revert
Definition: actions.h:55
static TOOL_ACTION saveAs
Definition: actions.h:52
static TOOL_ACTION copy
Definition: actions.h:69
static TOOL_ACTION pluginsReload
Cursor control event types.
Definition: actions.h:224
static TOOL_ACTION pickerTool
Definition: actions.h:189
static TOOL_ACTION showSymbolEditor
Definition: actions.h:196
static TOOL_ACTION pasteSpecial
Definition: actions.h:71
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:98
static TOOL_ACTION undo
Definition: actions.h:66
static TOOL_ACTION duplicate
Definition: actions.h:74
static TOOL_ACTION doDelete
Definition: actions.h:75
static TOOL_ACTION quit
Definition: actions.h:59
static TOOL_ACTION save
Definition: actions.h:51
static TOOL_ACTION redo
Definition: actions.h:67
static TOOL_ACTION updateSchematicFromPcb
Definition: actions.h:200
static TOOL_ACTION print
Definition: actions.h:57
static TOOL_ACTION showProperties
Definition: actions.h:201
static TOOL_ACTION doNew
Definition: actions.h:47
static TOOL_ACTION cut
Definition: actions.h:68
static TOOL_ACTION refreshPreview
Definition: actions.h:137
WINDOW_SETTINGS m_Window
Definition: app_settings.h:170
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 & Added(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Remove a new item from the model.
Definition: commit.h:86
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.
A subgraph is a set of items that are electrically connected on a single sheet.
PRIORITY GetDriverPriority()
const std::set< SCH_ITEM * > & GetItems() const
Provide a read-only reference to the items in the subgraph.
void SetWksFileName(const wxString &aFilename)
bool PrjConfigChanged()
Return true if the project configuration was modified.
bool Show(bool show) override
int ShowQuasiModal()
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()
Toggles 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:88
virtual VECTOR2I GetPosition() const
Definition: eda_item.h:242
EDA_ITEM_FLAGS GetEditFlags() const
Definition: eda_item.h:132
const KIID m_Uuid
Definition: eda_item.h:485
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:100
virtual void SetParent(EDA_ITEM *aParent)
Definition: eda_item.h:103
void ClearBrightened()
Definition: eda_item.h:122
EDA_ITEM * GetParent() const
Definition: eda_item.h:102
SHAPE_POLY_SET & GetPolyShape()
Definition: eda_shape.h:262
SHAPE_T GetShape() const
Definition: eda_shape.h:120
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:150
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:125
std::vector< VECTOR2I > GetRectCorners() const
Definition: eda_shape.cpp:1137
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition: eda_text.h:83
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:176
static TOOL_ACTION repairSchematic
Definition: ee_actions.h:259
static TOOL_ACTION remapSymbols
Definition: ee_actions.h:170
static TOOL_ACTION selectionActivate
Activation of the selection tool.
Definition: ee_actions.h:46
static TOOL_ACTION toggleAnnotateAuto
Definition: ee_actions.h:268
static TOOL_ACTION lineMode90
Definition: ee_actions.h:263
static TOOL_ACTION toggleHiddenPins
Definition: ee_actions.h:234
static TOOL_ACTION highlightNet
Definition: ee_actions.h:292
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:121
static TOOL_ACTION clearHighlight
Definition: ee_actions.h:293
static TOOL_ACTION assignNetclass
Definition: ee_actions.h:162
static TOOL_ACTION clearSelection
Clears the current selection.
Definition: ee_actions.h:56
static TOOL_ACTION showPythonConsole
Definition: ee_actions.h:258
static TOOL_ACTION toggleERCWarnings
Definition: ee_actions.h:239
static TOOL_ACTION simTune
Definition: ee_actions.h:281
static TOOL_ACTION toggleERCExclusions
Definition: ee_actions.h:241
static TOOL_ACTION lineModeNext
Definition: ee_actions.h:265
static TOOL_ACTION lineModeFree
Definition: ee_actions.h:262
static TOOL_ACTION editLibSymbolWithLibEdit
Definition: ee_actions.h:174
static TOOL_ACTION generateBOMLegacy
Definition: ee_actions.h:179
static TOOL_ACTION toggleERCErrors
Definition: ee_actions.h:240
static TOOL_ACTION toggleOPCurrents
Definition: ee_actions.h:243
static TOOL_ACTION highlightNetTool
Definition: ee_actions.h:295
static TOOL_ACTION updateNetHighlighting
Definition: ee_actions.h:294
static TOOL_ACTION exportNetlist
Definition: ee_actions.h:177
static TOOL_ACTION assignFootprints
Definition: ee_actions.h:161
static TOOL_ACTION selectOnPCB
Definition: ee_actions.h:246
static TOOL_ACTION rescueSymbols
Definition: ee_actions.h:169
static TOOL_ACTION toggleHiddenFields
Definition: ee_actions.h:235
static TOOL_ACTION editWithLibEdit
Definition: ee_actions.h:173
static TOOL_ACTION simProbe
Definition: ee_actions.h:280
static TOOL_ACTION exportSymbolsToLibrary
Definition: ee_actions.h:182
static TOOL_ACTION drawSheetOnClipboard
Definition: ee_actions.h:254
static TOOL_ACTION editSymbolFields
Definition: ee_actions.h:153
static TOOL_ACTION showNetNavigator
Definition: ee_actions.h:296
static TOOL_ACTION annotate
Definition: ee_actions.h:152
static TOOL_ACTION toggleDirectiveLabels
Definition: ee_actions.h:238
static TOOL_ACTION showHierarchy
Definition: ee_actions.h:226
static TOOL_ACTION toggleOPVoltages
Definition: ee_actions.h:242
static TOOL_ACTION lineMode45
Definition: ee_actions.h:264
static TOOL_ACTION editSymbolLibraryLinks
Definition: ee_actions.h:154
static TOOL_ACTION saveCurrSheetCopyAs
Definition: ee_actions.h:42
static TOOL_ACTION showPcbNew
Definition: ee_actions.h:175
static TOOL_ACTION generateBOM
Definition: ee_actions.h:178
static TOOL_ACTION schematicSetup
Definition: ee_actions.h:163
static TOOL_ACTION exportSymbolsToNewLibrary
Definition: ee_actions.h:183
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:50
static const TOOL_EVENT ClearedEvent
Definition: actions.h:262
static const TOOL_EVENT GridChangedByKeyEvent
Definition: actions.h:280
static const TOOL_EVENT SelectedEvent
Definition: actions.h:260
static const TOOL_EVENT SelectedItemsModified
Selected items were moved, this can be very high frequency on the canvas, use with care.
Definition: actions.h:267
static const TOOL_EVENT PointSelectedEvent
Definition: actions.h:259
static const TOOL_EVENT UnselectedEvent
Definition: actions.h:261
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:84
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:68
double GetScale() const
Definition: view.h:271
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:1631
void SetLayerVisible(int aLayer, bool aVisible=true)
Control the visibility of a particular layer.
Definition: view.h:395
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition: view.cpp:1513
void Hide(VIEW_ITEM *aItem, bool aHide=true, bool aHideOverlay=false)
Temporarily hide the item in the view (e.g.
Definition: view.cpp:1579
void MarkDirty()
Force redraw of view on the next rendering.
Definition: view.h:643
bool EndsWith(const KIID_PATH &aPath) const
Test if aPath from the last path towards the first path.
Definition: kiid.cpp:347
wxString AsString() const
Definition: kiid.cpp:368
Definition: kiid.h:49
wxString AsString() const
Definition: kiid.cpp:257
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:67
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:669
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:77
const LIB_ID & GetLibId() const override
Definition: lib_symbol.h:142
wxString GetName() const override
Definition: lib_symbol.h:136
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
Definition: lib_symbol.cpp:579
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(std::string &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:87
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:83
void SetClickHandler(CLICK_HANDLER aHandler)
Set a handler for mouse click event.
Definition: picker_tool.h:72
void SetSnapping(bool aSnap)
Definition: picker_tool.h:65
void SetCursor(KICURSOR aCursor)
Definition: picker_tool.h:63
void SetFinalizeHandler(FINALIZE_HANDLER aHandler)
Set a handler for the finalize event.
Definition: picker_tool.h:103
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:135
virtual const wxString GetProjectName() const
Return the short name of the project.
Definition: project.cpp:147
virtual bool IsNullProject() const
Check if this project is a null project (i.e.
Definition: project.cpp:153
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:75
SCH_SHEET_PATH & CurrentSheet() const override
Definition: schematic.h:136
wxString GetFileName() const override
Helper to retrieve the filename from the root sheet screen.
Definition: schematic.cpp:281
SCHEMATIC_SETTINGS & Settings() const
Definition: schematic.cpp:287
CONNECTION_GRAPH * ConnectionGraph() const override
Definition: schematic.h:146
SCH_SHEET_LIST GetSheets() const override
Builds and returns an updated schematic hierarchy TODO: can this be cached?
Definition: schematic.h:100
SCH_SHEET & Root() const
Definition: schematic.h:105
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
Revert the commit by restoring the modified items state.
Definition: sch_commit.cpp:405
virtual void Revert() override
Definition: sch_commit.cpp:483
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
const std::vector< std::shared_ptr< SCH_CONNECTION > > AllMembers() const
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 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 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 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)
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 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()
bool LoadSheetFromFile(SCH_SHEET *aSheet, SCH_SHEET_PATH *aCurrentSheet, const wxString &aFileName)
Load a the KiCad schematic file aFileName into the sheet aSheet.
Definition: sheet.cpp:164
void RefreshOperatingPointDisplay()
Refresh the display of any operaintg points.
void OnOpenCvpcb(wxCommandEvent &event)
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:105
void UpdateHierarchyNavigator(bool aRefreshNetNavigator=true)
Update the hierarchy navigation tree and history.
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.
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:611
void RefreshNetNavigator(const NET_NAVIGATOR_ITEM_DATA *aSelection=nullptr)
void OnUpdatePCB(wxCommandEvent &event)
void OnOpenPcbnew(wxCommandEvent &event)
void OnAnnotate(wxCommandEvent &event)
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:1138
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:174
virtual bool IsConnectable() const
Definition: sch_item.h:457
SCHEMATIC * Schematic() const
Searches the item hierarchy to find a SCHEMATIC.
Definition: sch_item.cpp:139
virtual void SetLastResolvedState(const SCH_ITEM *aItem)
Definition: sch_item.h:549
int GetBodyStyle() const
Definition: sch_item.h:240
int GetUnit() const
Definition: sch_item.h:237
void SetConnectivityDirty(bool aDirty=true)
Definition: sch_item.h:520
bool IsConnectivityDirty() const
Definition: sch_item.h:518
virtual void SetUnit(int aUnit)
Definition: sch_item.h:236
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:210
virtual std::vector< VECTOR2I > GetConnectionPoints() const
Add all the connection points for this item to aPoints.
Definition: sch_item.h:472
Segment description base class to describe items which have 2 end points (track, wire,...
Definition: sch_line.h:40
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 AddItem(const SCH_REFERENCE &aItem)
A helper to define a symbol's reference designator in a schematic.
void SetSheetNumber(int aSheetNumber)
Container class that holds multiple SCH_SCREEN objects in a hierarchy.
Definition: sch_screen.h:704
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:150
void Clear(bool aFree=true)
Delete all draw items and clears the project settings.
Definition: sch_screen.cpp:275
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:880
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:481
double m_LastZoomLevel
last value for the zoom level, useful in Eeschema when changing the current displayed sheet to reuse ...
Definition: sch_screen.h:628
EE_RTREE & Items()
Gets the full RTree, usually for iterating.
Definition: sch_screen.h:109
const wxString & GetFileName() const
Definition: sch_screen.h:144
bool Remove(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
Remove aItem from the schematic associated with this screen.
Definition: sch_screen.cpp:320
bool CheckIfOnDrawList(const SCH_ITEM *aItem) const
Definition: sch_screen.cpp:383
void MigrateSimModels()
Migrate any symbols having V6 simulation models to their V7 equivalents.
VECTOR2I GetCenter() const
Definition: sch_shape.h:73
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:306
void RemoveInstance(const KIID_PATH &aInstancePath)
Definition: sch_sheet.cpp:1275
std::vector< SCH_FIELD > & GetFields()
Definition: sch_sheet.h:93
bool SearchHierarchy(const wxString &aFilename, SCH_SCREEN **aScreen)
Search the existing hierarchy for an instance of screen loaded from aFileName.
Definition: sch_sheet.cpp:728
void AddInstance(const SCH_SHEET_INSTANCE &aInstance)
Definition: sch_sheet.cpp:1296
SCH_SCREEN * GetScreen() const
Definition: sch_sheet.h:110
void SetScreen(SCH_SCREEN *aScreen)
Set the SCH_SCREEN associated with this sheet to aScreen.
Definition: sch_sheet.cpp:162
std::vector< SCH_SHEET_PIN * > & GetPins()
Definition: sch_sheet.h:181
const std::vector< SCH_SHEET_INSTANCE > & GetInstances() const
Definition: sch_sheet.h:393
Schematic symbol object.
Definition: sch_symbol.h:108
const std::vector< SCH_SYMBOL_INSTANCE > & GetInstances() const
Definition: sch_symbol.h:167
wxString GetSchSymbolLibraryName() const
Definition: sch_symbol.cpp:265
SCH_FIELD * GetField(MANDATORY_FIELD_T aFieldType)
Return a mandatory field in this symbol.
Definition: sch_symbol.cpp:910
void ClearAnnotation(const SCH_SHEET_PATH *aSheetPath, bool aResetPrefix)
Clear exiting symbol annotation.
std::vector< SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve a list of the SCH_PINs for the given sheet path.
void AddHierarchicalReference(const KIID_PATH &aPath, const wxString &aRef, int aUnit)
Add a full hierarchical reference to this symbol.
Definition: sch_symbol.cpp:611
bool IsMissingLibSymbol() const
Check to see if the library symbol is set to the dummy library symbol.
Definition: sch_symbol.cpp:232
const LIB_ID & GetLibId() const override
Definition: sch_symbol.h:197
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly)
Populate a std::vector with SCH_FIELDs.
Definition: sch_symbol.cpp:958
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
Definition: sch_symbol.h:216
void SetLibSymbol(LIB_SYMBOL *aLibSymbol)
Set this schematic symbol library symbol reference to aLibSymbol.
Definition: sch_symbol.cpp:274
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const override
Definition: sch_symbol.cpp:711
bool IsPower() const override
void BrightenItem(EDA_ITEM *aItem)
void UnbrightenItem(EDA_ITEM *aItem)
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.
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:708
const SPICE_GENERATOR & SpiceGenerator() const
Definition: sim_model.h:436
virtual std::vector< std::string > CurrentNames(const SPICE_ITEM &aItem) const
Implement an OUTPUTFORMATTER to a memory buffer.
Definition: richio.h:433
const std::string & GetString()
Definition: richio.h:456
Is a LINE_READER that reads from a multiline 8 bit wide std::string.
Definition: richio.h:253
The symbol library editor main window.
void LoadSymbol(const wxString &aLibrary, const wxString &aSymbol, int Unit)
bool IsSymbolTreeShown() const
void OnToggleSymbolTree(wxCommandEvent &event)
void LoadSymbolFromSchematic(SCH_SYMBOL *aSymbol)
Load a symbol from the schematic to edit in place.
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:42
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:216
KIGFX::VIEW * getView() const
Returns the instance of #VIEW object used in the application.
Definition: tool_base.cpp:36
Generic, UI-independent tool event.
Definition: tool_event.h:167
bool DisableGridSnapping() const
Definition: tool_event.h:363
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:460
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:57
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:145
std::string GetClipboardUTF8() const
Return the information currently stored in the system clipboard.
TOOLS_HOLDER * GetToolHolder() const
Definition: tool_manager.h:397
APP_SETTINGS_BASE * GetSettings() const
Definition: tool_manager.h:395
bool PostAction(const std::string &aActionName, T aParam)
Run the specified action after the current action (coroutine) ends.
Definition: tool_manager.h:230
bool SaveClipboard(const std::string &aTextUTF8)
Store information to the system clipboard.
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:192
A wrapper for reporting to a wxString object.
Definition: reporter.h:164
bool HasMessage() const override
Returns true if the reporter client is non-empty.
Definition: reporter.cpp:71
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:415
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
Definition: confirm.cpp:360
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
Definition: confirm.cpp:280
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
Definition: confirm.cpp:332
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:305
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:110
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:532
#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
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:80
@ LAYER_ERC_WARN
Definition: layer_ids.h:383
@ LAYER_ERC_EXCLUSION
Definition: layer_ids.h:385
@ LAYER_ERC_ERR
Definition: layer_ids.h:384
@ LAYER_OP_CURRENTS
Definition: layer_ids.h:402
@ LAYER_OP_VOLTAGES
Definition: layer_ids.h:401
@ REPAINT
Item needs to be redrawn.
Definition: view_item.h:57
@ GEOMETRY
Position or shape has changed.
Definition: view_item.h:54
#define MAX_PAGE_SIZE_EESCHEMA_MILS
Definition: page_info.h:40
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: pgm_base.cpp:1059
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
Definition of the SCH_SHEET_PATH and SCH_SHEET_LIST classes for Eeschema.
std::vector< FAB_LAYER_COLOR > dummy
wxString UnescapeString(const wxString &aSource)
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:311
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
Definition: tool_event.h:105
@ TC_MESSAGE
Definition: tool_event.h:57
double EuclideanNorm(const VECTOR2I &vector)
Definition: trigo.h:128
@ 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
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:118
VECTOR2< int > VECTOR2I
Definition: vector2d.h:588
Definition of file extensions used in Kicad.
#define FN_NORMALIZE_FLAGS
Default flags to pass to wxFileName::Normalize().
Definition: wx_filename.h:39