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
25#include <advanced_config.h>
26#include <kiway.h>
27#include <pgm_base.h>
28#include <sch_painter.h>
29#include <tool/tool_manager.h>
30#include <tools/ee_actions.h>
32#include <symbol_edit_frame.h>
34#include <symbol_viewer_frame.h>
38#include <confirm.h>
39#include <gestfich.h> // To open with a text editor
40#include <wx/filedlg.h>
41#include "wx/generic/textdlgg.h"
42#include "string_utils.h"
43
45{
46 m_frame = getEditFrame<SCH_BASE_FRAME>();
49
51 {
52 CONDITIONAL_MENU& ctxMenu = m_menu.GetMenu();
53 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
54
55 wxCHECK( editFrame, false );
56
57 auto libSelectedCondition =
58 [ editFrame ]( const SELECTION& aSel )
59 {
60 LIB_ID sel = editFrame->GetTreeLIBID();
61 return !sel.GetLibNickname().empty() && sel.GetLibItemName().empty();
62 };
63 // The libInferredCondition allows you to do things like New Symbol and Paste with a
64 // symbol selected (in other words, when we know the library context even if the library
65 // itself isn't selected.
66 auto libInferredCondition =
67 [ editFrame ]( const SELECTION& aSel )
68 {
69 LIB_ID sel = editFrame->GetTreeLIBID();
70 return !sel.GetLibNickname().empty();
71 };
72 auto pinnedLibSelectedCondition =
73 [ editFrame ]( const SELECTION& aSel )
74 {
75 LIB_TREE_NODE* node = editFrame->GetCurrentTreeNode();
76 return node && node->m_Type == LIB_TREE_NODE::LIBRARY && node->m_Pinned;
77 };
78 auto unpinnedLibSelectedCondition =
79 [ editFrame ](const SELECTION& aSel )
80 {
81 LIB_TREE_NODE* node = editFrame->GetCurrentTreeNode();
82 return node && node->m_Type == LIB_TREE_NODE::LIBRARY && !node->m_Pinned;
83 };
84 auto symbolSelectedCondition =
85 [ editFrame ]( const SELECTION& aSel )
86 {
87 LIB_ID sel = editFrame->GetTargetLibId();
88 return !sel.GetLibNickname().empty() && !sel.GetLibItemName().empty();
89 };
90 auto saveSymbolAsCondition =
91 [ editFrame ]( const SELECTION& aSel )
92 {
93 LIB_ID sel = editFrame->GetTargetLibId();
94 return !sel.GetLibNickname().empty() && !sel.GetLibItemName().empty();
95 };
96 auto multiSelectedCondition =
97 [ editFrame ]( const SELECTION& aSel )
98 {
99 return editFrame->GetTreeSelectionCount() > 1;
100 };
101 auto canOpenWithTextEditor =
102 [ editFrame ]( const SELECTION& aSel )
103 {
104 // The option is shown if the lib has no current edits
105 LIB_SYMBOL_LIBRARY_MANAGER& libMgr = editFrame->GetLibManager();
106 wxString libName = editFrame->GetTargetLibId().GetLibNickname();
107 bool ret = !libMgr.IsLibraryModified( libName );
108 return ret;
109 };
110
111 ctxMenu.AddItem( ACTIONS::pinLibrary, unpinnedLibSelectedCondition );
112 ctxMenu.AddItem( ACTIONS::unpinLibrary, pinnedLibSelectedCondition );
113
114 ctxMenu.AddSeparator();
115 ctxMenu.AddItem( EE_ACTIONS::newSymbol, libInferredCondition );
116 ctxMenu.AddItem( EE_ACTIONS::deriveFromExistingSymbol, symbolSelectedCondition );
117
118 ctxMenu.AddSeparator();
119 ctxMenu.AddItem( ACTIONS::save, symbolSelectedCondition || libInferredCondition );
120 ctxMenu.AddItem( EE_ACTIONS::saveLibraryAs, libSelectedCondition );
121 ctxMenu.AddItem( EE_ACTIONS::saveSymbolCopyAs, saveSymbolAsCondition );
122 ctxMenu.AddItem( ACTIONS::revert, symbolSelectedCondition || libInferredCondition );
123
124 ctxMenu.AddSeparator();
125 ctxMenu.AddItem( EE_ACTIONS::cutSymbol, symbolSelectedCondition || multiSelectedCondition );
126 ctxMenu.AddItem( EE_ACTIONS::copySymbol, symbolSelectedCondition || multiSelectedCondition );
127 ctxMenu.AddItem( EE_ACTIONS::pasteSymbol, libInferredCondition );
128 ctxMenu.AddItem( EE_ACTIONS::duplicateSymbol, symbolSelectedCondition );
129 ctxMenu.AddItem( EE_ACTIONS::renameSymbol, symbolSelectedCondition );
130 ctxMenu.AddItem( EE_ACTIONS::deleteSymbol, symbolSelectedCondition || multiSelectedCondition );
131
132 ctxMenu.AddSeparator();
133 ctxMenu.AddItem( EE_ACTIONS::importSymbol, libInferredCondition );
134 ctxMenu.AddItem( EE_ACTIONS::exportSymbol, symbolSelectedCondition );
135
136 // If we've got nothing else to show, at least show a hide tree option
137 ctxMenu.AddSeparator();
138 ctxMenu.AddItem( EE_ACTIONS::hideSymbolTree, !libInferredCondition );
139
141 {
142 ctxMenu.AddSeparator();
144 canOpenWithTextEditor
145 && ( symbolSelectedCondition || libSelectedCondition ) );
146 }
147 }
148
149 return true;
150}
151
152
154{
155 bool createNew = aEvent.IsAction( &ACTIONS::newLibrary );
156
158 static_cast<SYMBOL_EDIT_FRAME*>( m_frame )->AddLibraryFile( createNew );
159
160 return 0;
161}
162
163
165{
166 wxString libFile = *aEvent.Parameter<wxString*>();
168 static_cast<SYMBOL_EDIT_FRAME*>( m_frame )->DdAddLibrary( libFile );
169
170 return 0;
171}
172
173
175{
177 {
178 SYMBOL_EDIT_FRAME* editFrame = static_cast<SYMBOL_EDIT_FRAME*>( m_frame );
179 int unit = 0;
180 LIB_ID partId = editFrame->GetTreeLIBID( &unit );
181
182 editFrame->LoadSymbol( partId.GetLibItemName(), partId.GetLibNickname(), unit );
183 }
184
185 return 0;
186}
187
188
190{
192 {
193 SYMBOL_EDIT_FRAME* editFrame = static_cast<SYMBOL_EDIT_FRAME*>( m_frame );
194
195 LIB_ID target = editFrame->GetTargetLibId();
196 const wxString& libName = target.GetLibNickname();
197 wxString msg;
198
199 if( libName.IsEmpty() )
200 {
201 msg.Printf( _( "No symbol library selected." ) );
203 return 0;
204 }
205
206 if( editFrame->GetLibManager().IsLibraryReadOnly( libName ) )
207 {
208 msg.Printf( _( "Symbol library '%s' is not writable." ), libName );
210 return 0;
211 }
212
213 if( aEvent.IsAction( &EE_ACTIONS::newSymbol ) )
214 {
215 editFrame->CreateNewSymbol();
216 }
218 {
219 editFrame->CreateNewSymbol( target.GetLibItemName() );
220 }
221 else if( aEvent.IsAction( &EE_ACTIONS::importSymbol ) )
222 {
223 editFrame->ImportSymbol();
224 }
225 }
226
227 return 0;
228}
229
230
232{
234 {
235 SYMBOL_EDIT_FRAME* editFrame = static_cast<SYMBOL_EDIT_FRAME*>( m_frame );
236
237 if( aEvt.IsAction( &EE_ACTIONS::save ) )
238 editFrame->Save();
239 else if( aEvt.IsAction( &EE_ACTIONS::saveLibraryAs ) )
240 editFrame->SaveLibraryAs();
241 else if( aEvt.IsAction( &EE_ACTIONS::saveSymbolCopyAs ) )
242 editFrame->SaveSymbolCopyAs();
243 else if( aEvt.IsAction( &EE_ACTIONS::saveAll ) )
244 editFrame->SaveAll();
245 }
246
247 return 0;
248}
249
250
252{
254 static_cast<SYMBOL_EDIT_FRAME*>( m_frame )->Revert();
255
256 return 0;
257}
258
259
261{
263 static_cast<SYMBOL_EDIT_FRAME*>( m_frame )->ExportSymbol();
264
265 return 0;
266}
267
268
270{
272 {
273 wxString fullEditorName = Pgm().GetTextEditor();
274
275 if( fullEditorName.IsEmpty() )
276 {
277 wxMessageBox( _( "No text editor selected in KiCad. Please choose one." ) );
278 return 0;
279 }
280
281 SYMBOL_EDIT_FRAME* editFrame = static_cast<SYMBOL_EDIT_FRAME*>( m_frame );
282
283 LIB_SYMBOL_LIBRARY_MANAGER& libMgr = editFrame->GetLibManager();
284
285 LIB_ID libId = editFrame->GetTreeLIBID();
286
287 wxString libName = libId.GetLibNickname();
288 wxString tempFName = libMgr.GetLibrary( libName )->GetFullURI( true ).wc_str();
289
290 if( !tempFName.IsEmpty() )
291 {
292 ExecuteFile( fullEditorName, tempFName, nullptr, false );
293 }
294 }
295 return 0;
296}
297
298
300{
302 {
303 SYMBOL_EDIT_FRAME* editFrame = static_cast<SYMBOL_EDIT_FRAME*>( m_frame );
304
306 editFrame->CopySymbolToClipboard();
307
309 {
310 bool hasWritableLibs = false;
311 wxString msg;
312
313 for( LIB_ID& sel : editFrame->GetSelectedLibIds() )
314 {
315 const wxString& libName = sel.GetLibNickname();
316
317 if( editFrame->GetLibManager().IsLibraryReadOnly( libName ) )
318 msg.Printf( _( "Symbol library '%s' is not writable." ), libName );
319 else
320 hasWritableLibs = true;
321 }
322
323 if( !msg.IsEmpty() )
325
326 if( !hasWritableLibs )
327 return 0;
328
329 editFrame->DeleteSymbolFromLibrary();
330 }
331 }
332
333 return 0;
334}
335
336
338{
340 {
341 SYMBOL_EDIT_FRAME* editFrame = static_cast<SYMBOL_EDIT_FRAME*>( m_frame );
342 LIB_ID sel = editFrame->GetTargetLibId();
343 // DuplicateSymbol() is called to duplicate a symbol, or to paste a previously
344 // saved symbol in clipboard
345 bool isPasteAction = aEvent.IsAction( &EE_ACTIONS::pasteSymbol );
346 wxString msg;
347
348 if( !sel.IsValid() && !isPasteAction )
349 {
350 // When duplicating a symbol, a source symbol must exists.
351 msg.Printf( _( "No symbol selected" ) );
353 return 0;
354 }
355
356 const wxString& libName = sel.GetLibNickname();
357
358 if( editFrame->GetLibManager().IsLibraryReadOnly( libName ) )
359 {
360 msg.Printf( _( "Symbol library '%s' is not writable." ), libName );
362 return 0;
363 }
364
365 editFrame->DuplicateSymbol( isPasteAction );
366 }
367
368 return 0;
369}
370
371
372class RENAME_DIALOG : public wxTextEntryDialog
373{
374public:
375 RENAME_DIALOG( wxWindow* aParent, const wxString& aName,
376 std::function<bool( wxString newName )> aValidator ) :
377 wxTextEntryDialog( aParent, _( "New name:" ), _( "Change Symbol Name" ), aName ),
378 m_validator( std::move( aValidator ) )
379 { }
380
381 wxString GetSymbolName()
382 {
383 wxString name = EscapeString( m_textctrl->GetValue(), CTX_LIBID );
384 name.Trim( true ).Trim( false );
385 return name;
386 }
387
388protected:
390 {
391 return m_validator( GetSymbolName() );
392 }
393
394private:
395 std::function<bool( wxString newName )> m_validator;
396};
397
398
400{
402 {
403 SYMBOL_EDIT_FRAME* editFrame = static_cast<SYMBOL_EDIT_FRAME*>( m_frame );
404 LIB_SYMBOL_LIBRARY_MANAGER& libMgr = editFrame->GetLibManager();
405
406 LIB_ID libId = editFrame->GetTreeLIBID();
407 wxString libName = libId.GetLibNickname();
408 wxString symbolName = libId.GetLibItemName();
409 wxString msg;
410
411 if( !libMgr.LibraryExists( libName ) )
412 return 0;
413
414 RENAME_DIALOG dlg( m_frame, symbolName,
415 [&]( wxString newName )
416 {
417 if( newName.IsEmpty() )
418 {
419 wxMessageBox( _( "Symbol must have a name." ) );
420 return false;
421 }
422
423 if( libMgr.SymbolExists( newName, libName ) )
424 {
425 msg = wxString::Format( _( "Symbol '%s' already exists in library '%s'." ),
426 newName, libName );
427
428 KIDIALOG errorDlg( m_frame, msg, _( "Confirmation" ),
429 wxOK | wxCANCEL | wxICON_WARNING );
430 errorDlg.SetOKLabel( _( "Overwrite" ) );
431
432 return errorDlg.ShowModal() == wxID_OK;
433 }
434
435 return true;
436 } );
437
438 if( dlg.ShowModal() != wxID_OK )
439 return 0; // canceled by user
440
441 wxString newName = dlg.GetSymbolName();
442 wxString oldName = symbolName;
443 LIB_SYMBOL* libSymbol = libMgr.GetBufferedSymbol( oldName, libName );
444 bool isCurrentSymbol = editFrame->IsCurrentSymbol( libId );
445
446 if( !libSymbol )
447 return 0;
448
449 libSymbol->SetName( newName );
450
451 if( libSymbol->GetFieldById( VALUE_FIELD )->GetText() == oldName )
452 libSymbol->GetFieldById( VALUE_FIELD )->SetText( newName );
453
454 libMgr.UpdateSymbolAfterRename( libSymbol, newName, libName );
455 libMgr.SetSymbolModified( newName, libName );
456
457 if( isCurrentSymbol && editFrame->GetCurSymbol())
458 {
459 libSymbol = editFrame->GetCurSymbol();
460
461 libSymbol->SetName( newName );
462
463 if( libSymbol->GetFieldById( VALUE_FIELD )->GetText() == oldName )
464 libSymbol->GetFieldById( VALUE_FIELD )->SetText( newName );
465
466 editFrame->RebuildView();
467 editFrame->OnModify();
468 editFrame->UpdateTitle();
469
470 // N.B. The view needs to be rebuilt first as the Symbol Properties change may
471 // invalidate the view pointers by rebuilting the field table
472 editFrame->UpdateMsgPanel();
473 }
474
475 wxDataViewItem treeItem = libMgr.GetAdapter()->FindItem( libId );
476 editFrame->UpdateLibraryTree( treeItem, libSymbol );
477 editFrame->FocusOnLibId( LIB_ID( libName, newName ) );
478 }
479
480 return 0;
481}
482
483
485{
486 int bodyStyle = aEvent.IsAction( &EE_ACTIONS::showDeMorganStandard ) ? BODY_STYLE::BASE
487 : BODY_STYLE::DEMORGAN;
488
490 {
493
494 SYMBOL_EDIT_FRAME* symbolEditor = static_cast<SYMBOL_EDIT_FRAME*>( m_frame );
495 symbolEditor->SetBodyStyle( bodyStyle );
496
498 symbolEditor->RebuildView();
499 }
500 else if( m_frame->IsType( FRAME_SCH_VIEWER ) )
501 {
502 SYMBOL_VIEWER_FRAME* symbolViewer = static_cast<SYMBOL_VIEWER_FRAME*>( m_frame );
503 symbolViewer->SetUnitAndBodyStyle( symbolViewer->GetUnit(), bodyStyle );
504 }
505
506 return 0;
507}
508
509
511{
513 {
514 SYMBOL_EDIT_FRAME* editFrame = static_cast<SYMBOL_EDIT_FRAME*>( m_frame );
515 LIB_TREE_NODE* currentNode = editFrame->GetCurrentTreeNode();
516
517 if( currentNode && !currentNode->m_Pinned )
518 {
519 m_frame->Prj().PinLibrary( currentNode->m_LibId.GetLibNickname(), true );
520
521 currentNode->m_Pinned = true;
522 editFrame->RegenerateLibraryTree();
523 }
524 }
525
526 return 0;
527}
528
529
531{
533 {
534 SYMBOL_EDIT_FRAME* editFrame = static_cast<SYMBOL_EDIT_FRAME*>( m_frame );
535 LIB_TREE_NODE* currentNode = editFrame->GetCurrentTreeNode();
536
537 if( currentNode && currentNode->m_Pinned )
538 {
539 m_frame->Prj().UnpinLibrary( currentNode->m_LibId.GetLibNickname(), true );
540
541 currentNode->m_Pinned = false;
542 editFrame->RegenerateLibraryTree();
543 }
544 }
545
546 return 0;
547}
548
549
551{
553 {
554 wxCommandEvent dummy;
555 static_cast<SYMBOL_EDIT_FRAME*>( m_frame )->OnToggleSymbolTree( dummy );
556 }
557
558 return 0;
559}
560
561
563{
565 getEditFrame<SYMBOL_EDIT_FRAME>()->ToggleProperties();
566
567 return 0;
568}
569
570
572{
573 SCH_RENDER_SETTINGS* renderSettings = m_frame->GetRenderSettings();
574 renderSettings->m_ShowPinsElectricalType = !renderSettings->m_ShowPinsElectricalType;
575
576 // Update canvas
579
580 return 0;
581}
582
583
585{
586 SCH_RENDER_SETTINGS* renderSettings = m_frame->GetRenderSettings();
587 renderSettings->m_ShowPinNumbers = !renderSettings->m_ShowPinNumbers;
588
589 // Update canvas
592
593 return 0;
594}
595
596
598{
599 if( !m_isSymbolEditor )
600 return 0;
601
602 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
603 editFrame->m_SyncPinEdit = !editFrame->m_SyncPinEdit;
604
605 return 0;
606}
607
608
610{
611 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
612 editFrame->GetRenderSettings()->m_ShowHiddenPins =
613 !editFrame->GetRenderSettings()->m_ShowHiddenPins;
614
616 editFrame->GetCanvas()->Refresh();
617
618 return 0;
619}
620
621
623{
624 SYMBOL_EDIT_FRAME* editFrame = getEditFrame<SYMBOL_EDIT_FRAME>();
627
629 editFrame->GetCanvas()->Refresh();
630
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{
797
799
805
817
820
828
832}
const char * name
Definition: DXF_plotter.cpp:57
constexpr EDA_IU_SCALE schIUScale
Definition: base_units.h:110
static TOOL_ACTION cancelInteractive
Definition: actions.h:63
static TOOL_ACTION revert
Definition: actions.h:55
static TOOL_ACTION addLibrary
Definition: actions.h:49
static TOOL_ACTION pinLibrary
Definition: actions.h:140
static TOOL_ACTION saveAll
Definition: actions.h:54
static TOOL_ACTION save
Definition: actions.h:51
static TOOL_ACTION unpinLibrary
Definition: actions.h:141
static TOOL_ACTION showProperties
Definition: actions.h:201
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.
const Vec & GetOrigin() const
Definition: box2.h:200
const SizeVec & GetSize() const
Definition: box2.h:196
BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition: box2.h:541
void AddItem(const TOOL_ACTION &aAction, const SELECTION_CONDITION &aCondition, int aOrder=ANY_ORDER)
Add a menu entry to run a TOOL_ACTION on selected items.
void AddSeparator(int aOrder=ANY_ORDER)
Add a separator to the menu.
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:103
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:98
AUTOPLACE_FIELDS m_AutoplaceFields
static TOOL_ACTION deleteSymbol
Definition: ee_actions.h:207
static TOOL_ACTION cutSymbol
Definition: ee_actions.h:208
static TOOL_ACTION placeSymbol
Definition: ee_actions.h:79
static TOOL_ACTION clearSelection
Clears the current selection.
Definition: ee_actions.h:56
static TOOL_ACTION openWithTextEditor
Definition: ee_actions.h:215
static TOOL_ACTION showHiddenFields
Definition: ee_actions.h:237
static TOOL_ACTION duplicateSymbol
Definition: ee_actions.h:205
static TOOL_ACTION showDeMorganAlternate
Definition: ee_actions.h:136
static TOOL_ACTION newSymbol
Definition: ee_actions.h:202
static TOOL_ACTION showDeMorganStandard
Definition: ee_actions.h:135
static TOOL_ACTION editSymbol
Definition: ee_actions.h:204
static TOOL_ACTION saveLibraryAs
Definition: ee_actions.h:200
static TOOL_ACTION addSymbolToSchematic
Definition: ee_actions.h:181
static TOOL_ACTION showPinNumbers
Definition: ee_actions.h:251
static TOOL_ACTION exportSymbolAsSVG
Definition: ee_actions.h:257
static TOOL_ACTION importSymbol
Definition: ee_actions.h:211
static TOOL_ACTION saveSymbolCopyAs
Definition: ee_actions.h:201
static TOOL_ACTION hideSymbolTree
Definition: ee_actions.h:253
static TOOL_ACTION copySymbol
Definition: ee_actions.h:209
static TOOL_ACTION renameSymbol
Definition: ee_actions.h:206
static TOOL_ACTION exportSymbol
Definition: ee_actions.h:212
static TOOL_ACTION toggleSyncedPinsMode
Definition: ee_actions.h:244
static TOOL_ACTION showSymbolTree
Definition: ee_actions.h:252
static TOOL_ACTION showHiddenPins
Definition: ee_actions.h:236
static TOOL_ACTION exportSymbolView
Definition: ee_actions.h:256
static TOOL_ACTION deriveFromExistingSymbol
Definition: ee_actions.h:203
static TOOL_ACTION pasteSymbol
Definition: ee_actions.h:210
static TOOL_ACTION showElectricalTypes
Definition: ee_actions.h:250
EE_SELECTION_TOOL * m_selectionTool
Definition: ee_tool_base.h:200
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition: view.cpp:1513
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
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:77
const LIB_ID & GetLibId() const override
Definition: lib_symbol.h:142
const BOX2I GetUnitBoundingBox(int aUnit, int aBodyStyle, bool aIgnoreHiddenFields=true) const
Get the bounding box for the symbol.
SCH_FIELD * GetFieldById(int aId) const
Return pointer to the requested field.
wxString GetName() const override
Definition: lib_symbol.h:136
virtual void SetName(const wxString &aName)
Definition: lib_symbol.cpp:563
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...
Model class in the component selector Model-View-Adapter (mediated MVC) architecture.
enum TYPE m_Type
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 const wxString & GetTextEditor(bool aCanShowFileChooser=true)
Return the path to the preferred text editor application.
Definition: pgm_base.cpp:195
virtual const wxString GetProjectFullName() const
Return the full path and name of the project.
Definition: project.cpp:129
void UnpinLibrary(const wxString &aLibrary, bool isSymbolLibrary)
Definition: project.cpp:192
void PinLibrary(const wxString &aLibrary, bool isSymbolLibrary)
Definition: project.cpp:171
std::function< bool(wxString newName)> m_validator
bool TransferDataFromWindow() override
RENAME_DIALOG(wxWindow *aParent, const wxString &aName, std::function< bool(wxString newName)> aValidator)
SCH_RENDER_SETTINGS * GetRenderSettings()
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
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:1138
const PAGE_INFO & GetPageSettings() const
Definition: sch_screen.h:131
void SetPageSettings(const PAGE_INFO &aPageSettings)
Definition: sch_screen.h:132
Schematic symbol object.
Definition: sch_symbol.h:108
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 RenameSymbol(const TOOL_EVENT &newName)
int DuplicateSymbol(const TOOL_EVENT &aEvent)
int ToggleHiddenPins(const TOOL_EVENT &aEvent)
int UnpinLibrary(const TOOL_EVENT &aEvent)
int AddLibrary(const TOOL_EVENT &aEvent)
int AddSymbol(const TOOL_EVENT &aEvent)
int Revert(const TOOL_EVENT &aEvent)
int ToggleHiddenFields(const TOOL_EVENT &aEvent)
int OpenWithTextEditor(const TOOL_EVENT &aEvent)
int ExportSymbol(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 ToggleSymbolTree(const TOOL_EVENT &aEvent)
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 PinLibrary(const TOOL_EVENT &aEvent)
int CutCopyDelete(const TOOL_EVENT &aEvent)
The symbol library editor main window.
void SaveAll()
Save all modified symbols and libraries.
void DeleteSymbolFromLibrary()
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.
LIB_ID GetTargetLibId() const
Return either the symbol selected in the symbol tree (if context menu is active) or the symbol on the...
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 SaveSymbolCopyAs()
Save the currently selected symbol to a new name and/or location.
void DuplicateSymbol(bool aFromClipboard)
Insert a duplicate symbol.
std::vector< LIB_ID > GetSelectedLibIds() const
LIB_TREE_NODE * GetCurrentTreeNode() const
void RegenerateLibraryTree()
Filter, sort, and redisplay the library tree.
LIB_SYMBOL * GetCurSymbol() const
Return the current symbol being edited or NULL if none selected.
void SetBodyStyle(int aBodyStyle)
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 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:216
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).
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:145
bool PostAction(const std::string &aActionName, T aParam)
Run the specified action after the current action (coroutine) ends.
Definition: tool_manager.h:230
void ResetTools(TOOL_BASE::RESET_REASON aReason)
Reset all tools (i.e.
CONDITIONAL_MENU & GetMenu()
Definition: tool_menu.cpp:44
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:305
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:139
bool m_EnableLibWithText
Enable option to load lib files with text editor.
static const std::string SVGFileExtension
static wxString PngFileWildcard()
static wxString SVGFileWildcard()
@ REPAINT
Item needs to be redrawn.
Definition: view_item.h:57
STL namespace.
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: pgm_base.cpp:1059
see class PGM_BASE
std::vector< FAB_LAYER_COLOR > dummy
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.