KiCad PCB EDA Suite
Loading...
Searching...
No Matches
symbol_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 CERN
5 * Copyright (C) 2019-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
26
27#include <advanced_config.h>
28#include <kiway.h>
29#include <pgm_base.h>
30#include <sch_painter.h>
31#include <tool/tool_manager.h>
33#include <tools/ee_actions.h>
36#include <symbol_viewer_frame.h>
38#include <symbol_lib_table.h>
41#include <confirm.h>
42#include <kidialog.h>
43#include <launch_ext.h> // To default when file manager setting is empty
44#include <gestfich.h> // To open with a text editor
45#include <wx/filedlg.h>
46#include "string_utils.h"
47
49{
50 m_frame = getEditFrame<SCH_BASE_FRAME>();
53
55 {
57 CONDITIONAL_MENU& ctxMenu = m_menu->GetMenu();
58 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
59
60 wxCHECK( editFrame, false );
61
62 auto libSelectedCondition =
63 [ editFrame ]( const SELECTION& aSel )
64 {
65 LIB_ID sel = editFrame->GetTreeLIBID();
66 return !sel.GetLibNickname().empty() && sel.GetLibItemName().empty();
67 };
68
69 // The libInferredCondition allows you to do things like New Symbol and Paste with a
70 // symbol selected (in other words, when we know the library context even if the library
71 // itself isn't selected.
72 auto libInferredCondition =
73 [ editFrame ]( const SELECTION& aSel )
74 {
75 LIB_ID sel = editFrame->GetTreeLIBID();
76 return !sel.GetLibNickname().empty();
77 };
78
79 auto symbolSelectedCondition =
80 [ editFrame ]( const SELECTION& aSel )
81 {
82 LIB_ID sel = editFrame->GetTargetLibId();
83 return !sel.GetLibNickname().empty() && !sel.GetLibItemName().empty();
84 };
85
86/* not used, but used to be used
87 auto multiSelectedCondition =
88 [ editFrame ]( const SELECTION& aSel )
89 {
90 return editFrame->GetTreeSelectionCount() > 1;
91 };
92*/
93 auto multiSymbolSelectedCondition =
94 [ editFrame ]( const SELECTION& aSel )
95 {
96 if( editFrame->GetTreeSelectionCount() > 1 )
97 {
98 for( LIB_ID& sel : editFrame->GetSelectedLibIds() )
99 {
100 if( !sel.IsValid() )
101 return false;
102 }
103 return true;
104 }
105 return false;
106 };
107/* not used, yet
108 auto multiLibrarySelectedCondition =
109 [ editFrame ]( const SELECTION& aSel )
110 {
111 if( editFrame->GetTreeSelectionCount() > 1 )
112 {
113 for( LIB_ID& sel : editFrame->GetSelectedLibIds() )
114 {
115 if( sel.IsValid() )
116 return false;
117 }
118 return true;
119 }
120 return false;
121 };
122*/
123 auto canOpenExternally =
124 [ editFrame ]( const SELECTION& aSel )
125 {
126 // The option is shown if the lib has no current edits
127 LIB_SYMBOL_LIBRARY_MANAGER& libMgr = editFrame->GetLibManager();
128 wxString libName = editFrame->GetTargetLibId().GetLibNickname();
129 bool ret = !libMgr.IsLibraryModified( libName );
130 return ret;
131 };
132
133// clang-format off
134 ctxMenu.AddItem( EE_ACTIONS::newSymbol, libInferredCondition, 10 );
135 ctxMenu.AddItem( EE_ACTIONS::deriveFromExistingSymbol, symbolSelectedCondition, 10 );
136
137 ctxMenu.AddSeparator( 10 );
138 ctxMenu.AddItem( ACTIONS::save, symbolSelectedCondition || libInferredCondition, 10 );
139 ctxMenu.AddItem( EE_ACTIONS::saveLibraryAs, libSelectedCondition, 10 );
140 ctxMenu.AddItem( EE_ACTIONS::saveSymbolAs, symbolSelectedCondition, 10 );
141 ctxMenu.AddItem( EE_ACTIONS::saveSymbolCopyAs, symbolSelectedCondition, 10 );
142 ctxMenu.AddItem( ACTIONS::revert, symbolSelectedCondition || libInferredCondition, 10 );
143
144 ctxMenu.AddSeparator( 10 );
145 ctxMenu.AddItem( EE_ACTIONS::cutSymbol, symbolSelectedCondition || multiSymbolSelectedCondition, 10 );
146 ctxMenu.AddItem( EE_ACTIONS::copySymbol, symbolSelectedCondition || multiSymbolSelectedCondition, 10 );
147 ctxMenu.AddItem( EE_ACTIONS::pasteSymbol, libInferredCondition, 10 );
148 ctxMenu.AddItem( EE_ACTIONS::duplicateSymbol, symbolSelectedCondition, 10 );
149 ctxMenu.AddItem( EE_ACTIONS::renameSymbol, symbolSelectedCondition, 10 );
150 ctxMenu.AddItem( EE_ACTIONS::deleteSymbol, symbolSelectedCondition || multiSymbolSelectedCondition, 10 );
151
152 ctxMenu.AddSeparator( 100 );
153 ctxMenu.AddItem( EE_ACTIONS::importSymbol, libInferredCondition, 100 );
154
156 {
157 ctxMenu.AddSeparator( 200 );
158 ctxMenu.AddItem( ACTIONS::openWithTextEditor, canOpenExternally && ( symbolSelectedCondition || libSelectedCondition ), 200 );
159 }
160
162 {
163 ctxMenu.AddSeparator( 200 );
164 ctxMenu.AddItem( ACTIONS::openDirectory, canOpenExternally && ( symbolSelectedCondition || libSelectedCondition ), 200 );
165 }
166
167 libraryTreeTool->AddContextMenuItems( &ctxMenu );
168 }
169// clang-format on
170
171 return true;
172}
173
174
176{
177 bool createNew = aEvent.IsAction( &ACTIONS::newLibrary );
178
180 static_cast<SYMBOL_EDIT_FRAME*>( m_frame )->AddLibraryFile( createNew );
181
182 return 0;
183}
184
185
187{
188 wxString libFile = *aEvent.Parameter<wxString*>();
189
191 static_cast<SYMBOL_EDIT_FRAME*>( m_frame )->DdAddLibrary( libFile );
192
193 return 0;
194}
195
196
198{
199 if( !m_isSymbolEditor )
200 return 0;
201
202 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
203 int unit = 0;
204 LIB_ID partId = editFrame->GetTreeLIBID( &unit );
205
206 editFrame->LoadSymbol( partId.GetLibItemName(), partId.GetLibNickname(), unit );
207 return 0;
208}
209
210
212{
213 if( !m_isSymbolEditor )
214 return 0;
215
216 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
217 LIB_ID target = editFrame->GetTargetLibId();
218 const wxString& libName = target.GetLibNickname();
219 wxString msg;
220
221 if( libName.IsEmpty() )
222 {
223 msg.Printf( _( "No symbol library selected." ) );
225 return 0;
226 }
227
228 if( editFrame->GetLibManager().IsLibraryReadOnly( libName ) )
229 {
230 msg.Printf( _( "Symbol library '%s' is not writable." ), libName );
232 return 0;
233 }
234
235 if( aEvent.IsAction( &EE_ACTIONS::newSymbol ) )
236 editFrame->CreateNewSymbol();
238 editFrame->CreateNewSymbol( target.GetLibItemName() );
239 else if( aEvent.IsAction( &EE_ACTIONS::importSymbol ) )
240 editFrame->ImportSymbol();
241
242 return 0;
243}
244
245
247{
248 if( !m_isSymbolEditor )
249 return 0;
250
251 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
252
253 if( aEvt.IsAction( &EE_ACTIONS::save ) )
254 editFrame->Save();
255 else if( aEvt.IsAction( &EE_ACTIONS::saveLibraryAs ) )
256 editFrame->SaveLibraryAs();
257 else if( aEvt.IsAction( &EE_ACTIONS::saveSymbolAs ) )
258 editFrame->SaveSymbolCopyAs( true );
259 else if( aEvt.IsAction( &EE_ACTIONS::saveSymbolCopyAs ) )
260 editFrame->SaveSymbolCopyAs( false );
261 else if( aEvt.IsAction( &EE_ACTIONS::saveAll ) )
262 editFrame->SaveAll();
263
264 return 0;
265}
266
267
269{
271 static_cast<SYMBOL_EDIT_FRAME*>( m_frame )->Revert();
272
273 return 0;
274}
275
276
278{
279 if( !m_isSymbolEditor )
280 return 0;
281
282 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
283 LIB_SYMBOL_LIBRARY_MANAGER& libMgr = editFrame->GetLibManager();
284
285 LIB_ID libId = editFrame->GetTreeLIBID();
286
287 wxString libName = libId.GetLibNickname();
288 wxString libItemName = libMgr.GetLibrary( libName )->GetFullURI( true );
289
290 wxFileName fileName( libItemName );
291
292 wxString filePath = wxEmptyString;
293
295
296 wxString explCommand = cfg->m_System.file_explorer;
297
298 if( explCommand.IsEmpty() )
299 {
300 filePath = fileName.GetFullPath().BeforeLast( wxFileName::GetPathSeparator() );
301
302 if( !filePath.IsEmpty() && wxDirExists( filePath ) )
303 LaunchExternal( filePath );
304 return 0;
305 }
306
307 if( !explCommand.EndsWith( "%F" ) )
308 {
309 wxMessageBox( _( "Missing/malformed file explorer argument '%F' in common settings." ) );
310 return 0;
311 }
312
313 filePath = fileName.GetFullPath();
314 filePath.Replace( wxS( "\"" ), wxS( "_" ) );
315
316 wxString fileArg = '"' + filePath + '"';
317
318 explCommand.Replace( wxT( "%F" ), fileArg );
319
320 if( !explCommand.IsEmpty() )
321 wxExecute( explCommand );
322
323 return 0;
324}
325
326
328{
329 if( !m_isSymbolEditor )
330 return 0;
331
332 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
333 LIB_SYMBOL_LIBRARY_MANAGER& libMgr = editFrame->GetLibManager();
334 wxString textEditorName = Pgm().GetTextEditor();
335
336 if( textEditorName.IsEmpty() )
337 {
338 wxMessageBox( _( "No text editor selected in KiCad. Please choose one." ) );
339 return 0;
340 }
341
342 LIB_ID libId = editFrame->GetTreeLIBID();
343 wxString libName = libId.GetLibNickname();
344 wxString tempFName = libMgr.GetLibrary( libName )->GetFullURI( true ).wc_str();
345
346 if( !tempFName.IsEmpty() )
347 ExecuteFile( textEditorName, tempFName, nullptr, false );
348
349 return 0;
350}
351
352
354{
355 if( !m_isSymbolEditor )
356 return 0;
357
358 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
359
361 editFrame->CopySymbolToClipboard();
362
364 {
365 bool hasWritableLibs = false;
366 wxString msg;
367
368 for( LIB_ID& sel : editFrame->GetSelectedLibIds() )
369 {
370 const wxString& libName = sel.GetLibNickname();
371
372 if( editFrame->GetLibManager().IsLibraryReadOnly( libName ) )
373 msg.Printf( _( "Symbol library '%s' is not writable." ), libName );
374 else
375 hasWritableLibs = true;
376 }
377
378 if( !msg.IsEmpty() )
380
381 if( !hasWritableLibs )
382 return 0;
383
384 editFrame->DeleteSymbolFromLibrary();
385 }
386
387 return 0;
388}
389
390
392{
393 if( !m_isSymbolEditor )
394 return 0;
395
396 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
397 LIB_ID sel = editFrame->GetTargetLibId();
398 // DuplicateSymbol() is called to duplicate a symbol, or to paste a previously
399 // saved symbol in clipboard
400 bool isPasteAction = aEvent.IsAction( &EE_ACTIONS::pasteSymbol );
401 wxString msg;
402
403 if( !sel.IsValid() && !isPasteAction )
404 {
405 // When duplicating a symbol, a source symbol must exists.
406 msg.Printf( _( "No symbol selected" ) );
408 return 0;
409 }
410
411 const wxString& libName = sel.GetLibNickname();
412
413 if( editFrame->GetLibManager().IsLibraryReadOnly( libName ) )
414 {
415 msg.Printf( _( "Symbol library '%s' is not writable." ), libName );
417 return 0;
418 }
419
420 editFrame->DuplicateSymbol( isPasteAction );
421 return 0;
422}
423
424
426{
427 if( !m_isSymbolEditor )
428 return 0;
429
430 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
431 LIB_SYMBOL_LIBRARY_MANAGER& libMgr = editFrame->GetLibManager();
433
434 LIB_ID libId = editFrame->GetTreeLIBID();
435 wxString libName = libId.GetLibNickname();
436 wxString oldName = libId.GetLibItemName();
437 wxString newName;
438 wxString msg;
439
440 if( !libMgr.LibraryExists( libName ) )
441 return 0;
442
443 if( !libTool->RenameLibrary( _( "Change Symbol Name" ), oldName,
444 [&]( const wxString& aNewName )
445 {
446 newName = EscapeString( aNewName, CTX_LIBID );
447
448 if( newName.IsEmpty() )
449 {
450 wxMessageBox( _( "Symbol must have a name." ) );
451 return false;
452 }
453
454 if( libMgr.SymbolExists( newName, libName ) )
455 {
456 msg = wxString::Format( _( "Symbol '%s' already exists in library '%s'." ),
457 newName, libName );
458
459 KIDIALOG errorDlg( m_frame, msg, _( "Confirmation" ),
460 wxOK | wxCANCEL | wxICON_WARNING );
461 errorDlg.SetOKLabel( _( "Overwrite" ) );
462
463 return errorDlg.ShowModal() == wxID_OK;
464 }
465
466 return true;
467 } ) )
468 {
469 return 0; // cancelled by user
470 }
471
472 LIB_SYMBOL* libSymbol = libMgr.GetBufferedSymbol( oldName, libName );
473 bool isCurrentSymbol = editFrame->IsCurrentSymbol( libId );
474
475 if( !libSymbol )
476 return 0;
477
478 libSymbol->SetName( newName );
479
480 if( libSymbol->GetFieldById( VALUE_FIELD )->GetText() == oldName )
481 libSymbol->GetFieldById( VALUE_FIELD )->SetText( newName );
482
483 libMgr.UpdateSymbolAfterRename( libSymbol, newName, libName );
484 libMgr.SetSymbolModified( newName, libName );
485
486 if( isCurrentSymbol && editFrame->GetCurSymbol())
487 {
488 libSymbol = editFrame->GetCurSymbol();
489
490 libSymbol->SetName( newName );
491
492 if( libSymbol->GetFieldById( VALUE_FIELD )->GetText() == oldName )
493 libSymbol->GetFieldById( VALUE_FIELD )->SetText( newName );
494
495 editFrame->RebuildView();
496 editFrame->OnModify();
497 editFrame->UpdateTitle();
498
499 // N.B. The view needs to be rebuilt first as the Symbol Properties change may
500 // invalidate the view pointers by rebuilting the field table
501 editFrame->UpdateMsgPanel();
502 }
503
504 wxDataViewItem treeItem = libMgr.GetAdapter()->FindItem( libId );
505 editFrame->UpdateLibraryTree( treeItem, libSymbol );
506 editFrame->FocusOnLibId( LIB_ID( libName, newName ) );
507 return 0;
508}
509
510
512{
513 int bodyStyle = aEvent.IsAction( &EE_ACTIONS::showDeMorganStandard ) ? BODY_STYLE::BASE
514 : BODY_STYLE::DEMORGAN;
515
517 {
520
521 SYMBOL_EDIT_FRAME* symbolEditor = static_cast<SYMBOL_EDIT_FRAME*>( m_frame );
522 symbolEditor->SetBodyStyle( bodyStyle );
523
525 symbolEditor->RebuildView();
526 }
527 else if( m_frame->IsType( FRAME_SCH_VIEWER ) )
528 {
529 SYMBOL_VIEWER_FRAME* symbolViewer = static_cast<SYMBOL_VIEWER_FRAME*>( m_frame );
530 symbolViewer->SetUnitAndBodyStyle( symbolViewer->GetUnit(), bodyStyle );
531 }
532
533 return 0;
534}
535
536
538{
540 getEditFrame<SYMBOL_EDIT_FRAME>()->ToggleProperties();
541
542 return 0;
543}
544
545
547{
548 SCH_RENDER_SETTINGS* renderSettings = m_frame->GetRenderSettings();
549 renderSettings->m_ShowPinsElectricalType = !renderSettings->m_ShowPinsElectricalType;
550
551 // Update canvas
554
555 return 0;
556}
557
558
560{
561 SCH_RENDER_SETTINGS* renderSettings = m_frame->GetRenderSettings();
562 renderSettings->m_ShowPinNumbers = !renderSettings->m_ShowPinNumbers;
563
564 // Update canvas
567
568 return 0;
569}
570
571
573{
574 if( !m_isSymbolEditor )
575 return 0;
576
577 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
578 editFrame->m_SyncPinEdit = !editFrame->m_SyncPinEdit;
579
580 return 0;
581}
582
583
585{
586 if( !m_isSymbolEditor )
587 return 0;
588
591
592 getEditFrame<SYMBOL_EDIT_FRAME>()->GetRenderSettings()->m_ShowHiddenPins =
593 cfg->m_ShowHiddenPins;
594
597 return 0;
598}
599
600
602{
603 if( !m_isSymbolEditor )
604 return 0;
605
608
609 // TODO: Why is this needed in symbol edit and not in schematic edit?
610 getEditFrame<SYMBOL_EDIT_FRAME>()->GetRenderSettings()->m_ShowHiddenFields =
612
615 return 0;
616}
617
618
620{
621 if( !m_isSymbolEditor )
622 return 0;
623
626
628
631 return 0;
632}
633
634
636{
637 if( !m_isSymbolEditor )
638 return 0;
639
640 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
641 LIB_SYMBOL* symbol = editFrame->GetCurSymbol();
642
643 if( !symbol )
644 {
645 wxMessageBox( _( "No symbol to export" ) );
646 return 0;
647 }
648
649 wxFileName fn( symbol->GetName() );
650 fn.SetExt( "png" );
651
652 wxString projectPath = wxPathOnly( m_frame->Prj().GetProjectFullName() );
653
654 wxFileDialog dlg( editFrame, _( "Export View as PNG" ), projectPath, fn.GetFullName(),
655 FILEEXT::PngFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
656
657 if( dlg.ShowModal() == wxID_OK && !dlg.GetPath().IsEmpty() )
658 {
659 // calling wxYield is mandatory under Linux, after closing the file selector dialog
660 // to refresh the screen before creating the PNG or JPEG image from screen
661 wxYield();
662
663 if( !editFrame->SaveCanvasImageToFile( dlg.GetPath(), BITMAP_TYPE::PNG ) )
664 {
665 wxMessageBox( wxString::Format( _( "Can't save file '%s'." ), dlg.GetPath() ) );
666 }
667 }
668
669 return 0;
670}
671
672
674{
675 if( !m_isSymbolEditor )
676 return 0;
677
678 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
679 LIB_SYMBOL* symbol = editFrame->GetCurSymbol();
680
681 if( !symbol )
682 {
683 wxMessageBox( _( "No symbol to export" ) );
684 return 0;
685 }
686
687 wxFileName fn( symbol->GetName() );
688 fn.SetExt( FILEEXT::SVGFileExtension );
689
690 wxString pro_dir = wxPathOnly( m_frame->Prj().GetProjectFullName() );
691
692 wxString fullFileName = wxFileSelector( _( "SVG File Name" ), pro_dir, fn.GetFullName(),
694 wxFD_SAVE,
695 m_frame );
696
697 if( !fullFileName.IsEmpty() )
698 {
699 PAGE_INFO pageSave = editFrame->GetScreen()->GetPageSettings();
700 PAGE_INFO pageTemp = pageSave;
701
702 BOX2I symbolBBox = symbol->GetUnitBoundingBox( editFrame->GetUnit(),
703 editFrame->GetBodyStyle(), false );
704
705 // Add a small margin (10% of size)to the plot bounding box
706 symbolBBox.Inflate( symbolBBox.GetSize().x * 0.1, symbolBBox.GetSize().y * 0.1 );
707
708 pageTemp.SetWidthMils( schIUScale.IUToMils( symbolBBox.GetSize().x ) );
709 pageTemp.SetHeightMils( schIUScale.IUToMils( symbolBBox.GetSize().y ) );
710
711 // Add an offet to plot the symbol centered on the page.
712 VECTOR2I plot_offset = symbolBBox.GetOrigin();
713
714 editFrame->GetScreen()->SetPageSettings( pageTemp );
715 editFrame->SVGPlotSymbol( fullFileName, -plot_offset );
716 editFrame->GetScreen()->SetPageSettings( pageSave );
717 }
718
719 return 0;
720}
721
722
724{
725 LIB_SYMBOL* libSymbol = nullptr;
726 LIB_ID libId;
727 int unit, bodyStyle;
728
729 if( m_isSymbolEditor )
730 {
731 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
732
733 libSymbol = editFrame->GetCurSymbol();
734 unit = editFrame->GetUnit();
735 bodyStyle = editFrame->GetBodyStyle();
736
737 if( libSymbol )
738 libId = libSymbol->GetLibId();
739 }
740 else
741 {
742 SYMBOL_VIEWER_FRAME* viewerFrame = getEditFrame<SYMBOL_VIEWER_FRAME>();
743
744 libSymbol = viewerFrame->GetSelectedSymbol();
745 unit = viewerFrame->GetUnit();
746 bodyStyle = viewerFrame->GetBodyStyle();
747
748 if( libSymbol )
749 libId = libSymbol->GetLibId();
750 }
751
752 if( libSymbol )
753 {
754 SCH_EDIT_FRAME* schframe = (SCH_EDIT_FRAME*) m_frame->Kiway().Player( FRAME_SCH, false );
755
756 if( !schframe ) // happens when the schematic editor is not active (or closed)
757 {
758 DisplayErrorMessage( m_frame, _( "No schematic currently open." ) );
759 return 0;
760 }
761
762 wxWindow* blocking_dialog = schframe->Kiway().GetBlockingDialog();
763
764 if( blocking_dialog )
765 {
766 blocking_dialog->Raise();
767 wxBell();
768 return 0;
769 }
770
771 wxCHECK( libSymbol->GetLibId().IsValid(), 0 );
772
773 SCH_SYMBOL* symbol = new SCH_SYMBOL( *libSymbol, libId, &schframe->GetCurrentSheet(),
774 unit, bodyStyle );
775
776 symbol->SetParent( schframe->GetScreen() );
777
778 if( schframe->eeconfig()->m_AutoplaceFields.enable )
779 symbol->AutoplaceFields( /* aScreen */ nullptr, /* aManual */ false );
780
781 schframe->Raise();
782 schframe->GetToolManager()->PostAction( EE_ACTIONS::placeSymbol, symbol );
783 }
784
785 return 0;
786}
787
788
790{
791 if( !m_isSymbolEditor )
792 return 0;
793
794 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
795 const int deltaUnit = aEvent.Parameter<int>();
796
797 const int nUnits = editFrame->GetCurSymbol()->GetUnitCount();
798 const int newUnit = ( ( editFrame->GetUnit() - 1 + deltaUnit + nUnits ) % nUnits ) + 1;
799
800 editFrame->SetUnit( newUnit );
801
802 return 0;
803}
804
805
807{
808 // clang-format off
815
817
824
831
834
838
841
845
850
853 // clang-format on
854}
constexpr EDA_IU_SCALE schIUScale
Definition: base_units.h:110
static TOOL_ACTION cancelInteractive
Definition: actions.h:65
static TOOL_ACTION openWithTextEditor
Definition: actions.h:61
static TOOL_ACTION revert
Definition: actions.h:55
static TOOL_ACTION addLibrary
Definition: actions.h:49
static TOOL_ACTION openDirectory
Definition: actions.h:62
static TOOL_ACTION saveAll
Definition: actions.h:54
static TOOL_ACTION save
Definition: actions.h:51
static TOOL_ACTION showProperties
Definition: actions.h:207
static TOOL_ACTION newLibrary
Definition: actions.h:48
static TOOL_ACTION ddAddLibrary
Definition: actions.h:60
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition: box2.h:558
constexpr const Vec & GetOrigin() const
Definition: box2.h:210
constexpr const SizeVec & GetSize() const
Definition: box2.h:206
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...
bool IsType(FRAME_T aType) const
bool SaveCanvasImageToFile(const wxString &aFileName, BITMAP_TYPE aBitmapType)
Save the current view as an image file.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
virtual void SetParent(EDA_ITEM *aParent)
Definition: eda_item.h:104
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:94
AUTOPLACE_FIELDS m_AutoplaceFields
static TOOL_ACTION deleteSymbol
Definition: ee_actions.h:219
static TOOL_ACTION cutSymbol
Definition: ee_actions.h:220
static TOOL_ACTION saveSymbolAs
Definition: ee_actions.h:212
static TOOL_ACTION placeSymbol
Definition: ee_actions.h:78
static TOOL_ACTION clearSelection
Clears the current selection.
Definition: ee_actions.h:55
static TOOL_ACTION showHiddenFields
Definition: ee_actions.h:248
static TOOL_ACTION duplicateSymbol
Definition: ee_actions.h:217
static TOOL_ACTION showDeMorganAlternate
Definition: ee_actions.h:140
static TOOL_ACTION newSymbol
Definition: ee_actions.h:214
static TOOL_ACTION showDeMorganStandard
Definition: ee_actions.h:139
static TOOL_ACTION editSymbol
Definition: ee_actions.h:216
static TOOL_ACTION saveLibraryAs
Definition: ee_actions.h:211
static TOOL_ACTION addSymbolToSchematic
Definition: ee_actions.h:185
static TOOL_ACTION showPinNumbers
Definition: ee_actions.h:264
static TOOL_ACTION togglePinAltIcons
Definition: ee_actions.h:256
static TOOL_ACTION exportSymbolAsSVG
Definition: ee_actions.h:269
static TOOL_ACTION importSymbol
Definition: ee_actions.h:223
static TOOL_ACTION saveSymbolCopyAs
Definition: ee_actions.h:213
static TOOL_ACTION copySymbol
Definition: ee_actions.h:221
static TOOL_ACTION renameSymbol
Definition: ee_actions.h:218
static TOOL_ACTION previousUnit
Definition: ee_actions.h:272
static TOOL_ACTION toggleSyncedPinsMode
Definition: ee_actions.h:257
static TOOL_ACTION nextUnit
Definition: ee_actions.h:273
static TOOL_ACTION showHiddenPins
Definition: ee_actions.h:247
static TOOL_ACTION exportSymbolView
Definition: ee_actions.h:268
static TOOL_ACTION deriveFromExistingSymbol
Definition: ee_actions.h:215
static TOOL_ACTION pasteSymbol
Definition: ee_actions.h:222
static TOOL_ACTION showElectricalTypes
Definition: ee_actions.h:263
EE_SELECTION_TOOL * m_selectionTool
Definition: ee_tool_base.h:200
Helper class to create more flexible dialogs, including 'do not show again' checkbox handling.
Definition: kidialog.h:43
int ShowModal() override
Definition: kidialog.cpp:95
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition: view.cpp:1563
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
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
Module editor specific tools.
bool RenameLibrary(const wxString &aTitle, const wxString &aName, std::function< bool(const wxString &aNewName)> aValidator)
void AddContextMenuItems(CONDITIONAL_MENU *aMenu)
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:49
bool IsValid() const
Check if this LID_ID is valid.
Definition: lib_id.h:172
const UTF8 & GetLibItemName() const
Definition: lib_id.h:102
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Definition: lib_id.h:87
Symbol library management helper that is specific to the symbol library editor frame.
wxObjectDataPtr< LIB_TREE_MODEL_ADAPTER > & GetAdapter()
Return the adapter object that provides the stored data.
Define a library symbol object.
Definition: lib_symbol.h:78
const LIB_ID & GetLibId() const override
Definition: lib_symbol.h:143
const BOX2I GetUnitBoundingBox(int aUnit, int aBodyStyle, bool aIgnoreHiddenFields=true) const
Get the bounding box for the symbol.
Definition: lib_symbol.cpp:931
SCH_FIELD * GetFieldById(int aId) const
Return pointer to the requested field.
wxString GetName() const override
Definition: lib_symbol.h:137
int GetUnitCount() const override
virtual void SetName(const wxString &aName)
Definition: lib_symbol.cpp:288
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...
Describe the page size and margins of a paper page on which to eventually print or plot.
Definition: page_info.h:59
void SetHeightMils(double aHeightInMils)
Definition: page_info.cpp:261
void SetWidthMils(double aWidthInMils)
Definition: page_info.cpp:247
virtual COMMON_SETTINGS * GetCommonSettings() const
Definition: pgm_base.cpp:679
virtual const wxString & GetTextEditor(bool aCanShowFileChooser=true)
Return the path to the preferred text editor application.
Definition: pgm_base.cpp:196
virtual const wxString GetProjectFullName() const
Return the full path and name of the project.
Definition: project.cpp:129
SCH_RENDER_SETTINGS * GetRenderSettings()
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
SYMBOL_EDITOR_SETTINGS * libeditconfig() const
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
EESCHEMA_SETTINGS * eeconfig() const
KIGFX::SCH_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
Schematic editor (Eeschema) main window.
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
SCH_SHEET_PATH & GetCurrentSheet() const
void SetText(const wxString &aText) override
Definition: sch_field.cpp:1212
const PAGE_INFO & GetPageSettings() const
Definition: sch_screen.h:130
void SetPageSettings(const PAGE_INFO &aPageSettings)
Definition: sch_screen.h:131
Schematic symbol object.
Definition: sch_symbol.h:104
void AutoplaceFields(SCH_SCREEN *aScreen, bool aManual) override
Automatically orient all the fields in the symbol.
int ToggleSyncedPinsMode(const TOOL_EVENT &aEvent)
int OnDeMorgan(const TOOL_EVENT &aEvent)
int Save(const TOOL_EVENT &aEvt)
int EditSymbol(const TOOL_EVENT &aEvent)
int ExportView(const TOOL_EVENT &aEvent)
int ShowElectricalTypes(const TOOL_EVENT &aEvent)
int OpenDirectory(const TOOL_EVENT &aEvent)
int RenameSymbol(const TOOL_EVENT &newName)
int DuplicateSymbol(const TOOL_EVENT &aEvent)
int ToggleHiddenPins(const TOOL_EVENT &aEvent)
int AddLibrary(const TOOL_EVENT &aEvent)
int AddSymbol(const TOOL_EVENT &aEvent)
int TogglePinAltIcons(const TOOL_EVENT &aEvent)
int ChangeUnit(const TOOL_EVENT &aEvent)
int Revert(const TOOL_EVENT &aEvent)
int ToggleHiddenFields(const TOOL_EVENT &aEvent)
int OpenWithTextEditor(const TOOL_EVENT &aEvent)
void setTransitions() override
< Set up handlers for various events.
int ToggleProperties(const TOOL_EVENT &aEvent)
bool Init() override
Init() is called once upon a registration of the tool.
int ExportSymbolAsSVG(const TOOL_EVENT &aEvent)
int ShowPinNumbers(const TOOL_EVENT &aEvent)
int DdAddLibrary(const TOOL_EVENT &aEvent)
int AddSymbolToSchematic(const TOOL_EVENT &aEvent)
int CutCopyDelete(const TOOL_EVENT &aEvent)
bool m_ShowPinAltIcons
When true, dragging an outline edge will drag pins rooted on it.
The symbol library editor main window.
void SaveAll()
Save all modified symbols and libraries.
bool IsCurrentSymbol(const LIB_ID &aLibId) const
Restore the empty editor screen, without any symbol or library selected.
LIB_ID GetTreeLIBID(int *aUnit=nullptr) const
Return the LIB_ID of the library or symbol selected in the symbol tree.
void FocusOnLibId(const LIB_ID &aLibID)
void SVGPlotSymbol(const wxString &aFullFileName, const VECTOR2I &aOffset)
Create the SVG print file for the current edited symbol.
void Save()
Save the selected symbol or library.
void LoadSymbol(const wxString &aLibrary, const wxString &aSymbol, int Unit)
int GetBodyStyle() const
bool m_SyncPinEdit
Set to true to synchronize pins at the same position when editing symbols with multiple units or mult...
int GetTreeSelectionCount() const
void DuplicateSymbol(bool aFromClipboard)
Insert a duplicate symbol.
std::vector< LIB_ID > GetSelectedLibIds() const
LIB_SYMBOL * GetCurSymbol() const
Return the current symbol being edited or NULL if none selected.
LIB_ID GetTargetLibId() const override
Return either the symbol selected in the symbol tree (if context menu is active) or the symbol on the...
void SetBodyStyle(int aBodyStyle)
void SetUnit(int aUnit)
void UpdateMsgPanel() override
Redraw the message panel.
void CreateNewSymbol(const wxString &newName=wxEmptyString)
Create a new symbol in the selected library.
void UpdateTitle()
Update the main window title bar with the current library name and read only status of the library.
LIB_SYMBOL_LIBRARY_MANAGER & GetLibManager()
void SaveSymbolCopyAs(bool aOpenCopy)
Save the currently selected symbol to a new name and/or location.
void DdAddLibrary(wxString aLibFile)
Add a library dropped file to the symbol library table.
void UpdateLibraryTree(const wxDataViewItem &aTreeItem, LIB_SYMBOL *aSymbol)
Update a symbol node in the library tree.
void OnModify() override
Must be called after a schematic change in order to set the "modify" flag of the current symbol.
void SaveLibraryAs()
Save the currently selected library to a new file.
LIB_SYMBOL * GetBufferedSymbol(const wxString &aAlias, const wxString &aLibrary)
Return the symbol copy from the buffer.
bool UpdateSymbolAfterRename(LIB_SYMBOL *aSymbol, const wxString &oldAlias, const wxString &aLibrary)
Update the symbol buffer with a new version of the symbol when the name has changed.
bool IsLibraryReadOnly(const wxString &aLibrary) const
Return true if the library is stored in a read-only file.
bool LibraryExists(const wxString &aLibrary, bool aCheckEnabled=false) const
Return true if library exists.
bool IsLibraryModified(const wxString &aLibrary) const
Return true if library has unsaved modifications.
void SetSymbolModified(const wxString &aAlias, const wxString &aLibrary)
bool SymbolExists(const wxString &aAlias, const wxString &aLibrary) const
Return true if symbol with a specific alias exists in library (either original one or buffered).
SYMBOL_LIB_TABLE_ROW * GetLibrary(const wxString &aLibrary) const
Find a single library within the (aggregate) library table.
Symbol library viewer main window.
void SetUnitAndBodyStyle(int aUnit, int aBodyStyle)
Set unit and convert, and set flag preventing them from automatically resetting to 1.
LIB_SYMBOL * GetSelectedSymbol() const
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:55
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:218
KIGFX::VIEW * getView() const
Returns the instance of #VIEW object used in the application.
Definition: tool_base.cpp:36
@ MODEL_RELOAD
Model changes (the sheet for a schematic)
Definition: tool_base.h:80
Generic, UI-independent tool event.
Definition: tool_event.h:167
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).
std::unique_ptr< TOOL_MENU > m_menu
The functions below are not yet implemented - their interface may change.
bool RunAction(const std::string &aActionName, T aParam)
Run the specified action immediately, pausing the current action to run the new one.
Definition: tool_manager.h:150
bool PostAction(const std::string &aActionName, T aParam)
Run the specified action after the current action (coroutine) ends.
Definition: tool_manager.h:235
void ResetTools(TOOL_BASE::RESET_REASON aReason)
Reset all tools (i.e.
bool empty() const
Definition: utf8.h:104
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:195
This file is part of the common library.
#define _(s)
@ FRAME_SCH_SYMBOL_EDITOR
Definition: frame_type.h:35
@ FRAME_SCH_VIEWER
Definition: frame_type.h:36
@ FRAME_SCH
Definition: frame_type.h:34
int ExecuteFile(const wxString &aEditorName, const wxString &aFileName, wxProcess *aCallback, bool aFileForKicad)
Call the executable file aEditorName with the parameter aFileName.
Definition: gestfich.cpp:143
bool m_EnableLibDir
Enable option to open lib file directory.
bool m_EnableLibWithText
Enable option to load lib files with text editor.
static const std::string SVGFileExtension
static wxString PngFileWildcard()
static wxString SVGFileWildcard()
This file is part of the common library.
bool LaunchExternal(const wxString &aPath)
Launches the given file or folder in the host OS.
Definition: launch_ext.cpp:25
@ REPAINT
Item needs to be redrawn.
Definition: view_item.h:57
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: pgm_base.cpp:1060
see class PGM_BASE
wxString EscapeString(const wxString &aSource, ESCAPE_CONTEXT aContext)
The Escape/Unescape routines use HTML-entity-reference-style encoding to handle characters which are:...
@ CTX_LIBID
Definition: string_utils.h:54
constexpr int IUToMils(int iu) const
Definition: base_units.h:99
@ VALUE_FIELD
Field Value of part, i.e. "3.3K".
Definition of file extensions used in Kicad.