KiCad PCB EDA Suite
Loading...
Searching...
No Matches
symbol_editor_import_export.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) 2016 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 2008 Wayne Stambaugh <[email protected]>
6 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <https://www.gnu.org/licenses/>.
20 */
21
22#include <confirm.h>
23#include <kidialog.h>
24#include <common.h>
26#include <sch_io/sch_io.h>
27#include <symbol_edit_frame.h>
31#include <wx/filename.h>
32#include <wx/filedlg.h>
33#include <string_utils.h>
34#include <kiplatform/ui.h>
35
36
38{
39 wxString msg;
40 wxString libName = getTargetLib();
41
42 if( !m_libMgr->LibraryExists( libName ) )
43 libName = SelectLibrary( _( "Import Symbol" ), _( "Import symbol to library:" ) );
44
45 if( !m_libMgr->LibraryExists( libName ) )
46 return;
47
48 wxString fileFiltersStr;
49 wxString allWildcardsStr;
50
51 for( const SCH_IO_MGR::SCH_FILE_T& fileType : SCH_IO_MGR::SCH_FILE_T_vector )
52 {
53 IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( fileType ) );
54
55 if( !pi )
56 continue;
57
58 const IO_BASE::IO_FILE_DESC& desc = pi->GetLibraryFileDesc();
59
60 if( desc.m_FileExtensions.empty() )
61 continue;
62
63 if( !fileFiltersStr.IsEmpty() )
64 fileFiltersStr += wxChar( '|' );
65
66 fileFiltersStr += desc.FileFilter();
67
68 for( const std::string& ext : desc.m_FileExtensions )
69 allWildcardsStr << wxT( "*." ) << formatWildcardExt( ext ) << wxT( ";" );
70 }
71
72 fileFiltersStr = _( "All supported formats" ) + wxT( "|" ) + allWildcardsStr + wxT( "|" )
73 + fileFiltersStr;
74
75 wxFileDialog fileDlg( this, _( "Import Symbol" ), m_mruPath, wxEmptyString, fileFiltersStr,
76 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
77
79
80 if( fileDlg.ShowModal() == wxID_CANCEL )
81 return;
82
83 wxFileName fn( fileDlg.GetPath() );
84
85 m_mruPath = fn.GetPath();
86
87 SCH_IO_MGR::SCH_FILE_T piType = SCH_IO_MGR::GuessPluginTypeFromLibPath( fn.GetFullPath() );
88
89 if( piType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
90 {
91 msg.Printf( _( "Unable to find a reader for '%s'." ), fn.GetFullPath() );
92 DisplayError( this, msg );
93 return;
94 }
95
96 DIALOG_IMPORT_SYMBOL_SELECT selectDlg( this, fn.GetFullPath(), libName, piType );
97
98 if( selectDlg.ShowModal() != wxID_OK )
99 return;
100
101 std::vector<wxString> selectedSymbols = selectDlg.GetSelectedSymbols();
102
103 if( selectedSymbols.empty() )
104 return;
105
106 const auto& conflictResolutions = selectDlg.GetConflictResolutions();
107
108 // Load and import each selected symbol
109 IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( piType ) );
110 wxString firstImported;
111 int importedCount = 0;
112 int skippedCount = 0;
113
114 for( const wxString& symbolName : selectedSymbols )
115 {
116 auto conflictIt = conflictResolutions.find( symbolName );
117
118 if( conflictIt != conflictResolutions.end()
119 && conflictIt->second == CONFLICT_RESOLUTION::SKIP )
120 {
121 skippedCount++;
122 continue;
123 }
124
125 try
126 {
127 LIB_SYMBOL* entry = pi->LoadSymbol( fn.GetFullPath(), symbolName );
128
129 if( entry )
130 {
131 entry->SetName( EscapeString( entry->GetName(), CTX_LIBID ) );
132 m_libMgr->UpdateSymbol( entry, libName );
133
134 if( firstImported.IsEmpty() )
135 firstImported = entry->GetName();
136
137 importedCount++;
138 }
139 }
140 catch( const IO_ERROR& ioe )
141 {
142 msg.Printf( _( "Cannot import symbol '%s': %s" ), symbolName, ioe.What() );
143 DisplayErrorMessage( this, msg );
144 }
145 }
146
147 if( importedCount > 0 )
148 {
149 SyncLibraries( false );
150 LoadSymbol( firstImported, libName, 1 );
151
152 if( skippedCount > 0 )
153 {
154 msg.Printf( _( "Imported %d symbol(s), skipped %d." ), importedCount, skippedCount );
155 DisplayInfoMessage( this, msg );
156 }
157 }
158}
159
160
Dialog to select symbols for import from an external library file.
std::vector< wxString > GetSelectedSymbols() const
Get the list of symbols selected for import.
const std::map< wxString, CONFLICT_RESOLUTION > & GetConflictResolutions() const
Get the conflict resolutions chosen by the user.
int ShowModal() override
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
virtual const wxString What() const
A composite of Problem() and Where()
Define a library symbol object.
Definition lib_symbol.h:79
wxString GetName() const override
Definition lib_symbol.h:141
virtual void SetName(const wxString &aName)
wxString SelectLibrary(const wxString &aDialogTitle, const wxString &aListLabel, const std::vector< std::pair< wxString, bool * > > &aExtraCheckboxes={})
Display a list of loaded libraries and allows the user to select a library.
static SCH_FILE_T GuessPluginTypeFromLibPath(const wxString &aLibPath, int aCtl=0)
Return a plugin type given a symbol library using the file extension of aLibPath.
wxString getTargetLib() const
LIB_SYMBOL_LIBRARY_MANAGER * m_libMgr
void LoadSymbol(const wxString &aLibrary, const wxString &aSymbol, int Unit)
void SyncLibraries(bool aShowProgress, bool aPreloadCancelled=false, const wxString &aForceRefresh=wxEmptyString)
Synchronize the library manager to the symbol library table, and then the symbol tree to the library ...
The common library.
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
Definition confirm.cpp:245
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition confirm.cpp:217
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
Definition confirm.cpp:192
This file is part of the common library.
#define _(s)
std::unique_ptr< T > IO_RELEASER
Helper to hold and release an IO_BASE object when exceptions are thrown.
Definition io_mgr.h:33
void AllowNetworkFileSystems(wxDialog *aDialog)
Configure a file dialog to show network and virtual file systems.
Definition wxgtk/ui.cpp:448
MODEL3D_FORMAT_TYPE fileType(const char *aFileName)
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
Container that describes file type info.
Definition io_base.h:43
std::vector< std::string > m_FileExtensions
Filter used for file pickers if m_IsFile is true.
Definition io_base.h:47
wxString FileFilter() const
Definition io_base.cpp:40
@ SKIP
Don't import this symbol.
wxString formatWildcardExt(const wxString &aWildcard)
Format wildcard extension to support case sensitive file dialogs.
Definition of file extensions used in Kicad.