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, you may find one here:
20 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21 * or you may search the http://www.gnu.org website for the version 2 license,
22 * or you may write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24 */
25
26#include <confirm.h>
27#include <kidialog.h>
28#include <common.h>
30#include <sch_io/sch_io.h>
31#include <symbol_edit_frame.h>
35#include <wx/filename.h>
36#include <wx/filedlg.h>
37#include <string_utils.h>
38
39
41{
42 wxString msg;
43 wxString libName = getTargetLib();
44
45 if( !m_libMgr->LibraryExists( libName ) )
46 libName = SelectLibrary( _( "Import Symbol" ), _( "Import symbol to library:" ) );
47
48 if( !m_libMgr->LibraryExists( libName ) )
49 return;
50
51 wxString fileFiltersStr;
52 wxString allWildcardsStr;
53
54 for( const SCH_IO_MGR::SCH_FILE_T& fileType : SCH_IO_MGR::SCH_FILE_T_vector )
55 {
56 IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( fileType ) );
57
58 if( !pi )
59 continue;
60
61 const IO_BASE::IO_FILE_DESC& desc = pi->GetLibraryFileDesc();
62
63 if( desc.m_FileExtensions.empty() )
64 continue;
65
66 if( !fileFiltersStr.IsEmpty() )
67 fileFiltersStr += wxChar( '|' );
68
69 fileFiltersStr += desc.FileFilter();
70
71 for( const std::string& ext : desc.m_FileExtensions )
72 allWildcardsStr << wxT( "*." ) << formatWildcardExt( ext ) << wxT( ";" );
73 }
74
75 fileFiltersStr = _( "All supported formats" ) + wxT( "|" ) + allWildcardsStr + wxT( "|" )
76 + fileFiltersStr;
77
78 wxFileDialog fileDlg( this, _( "Import Symbol" ), m_mruPath, wxEmptyString, fileFiltersStr,
79 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
80
81 if( fileDlg.ShowModal() == wxID_CANCEL )
82 return;
83
84 wxFileName fn( fileDlg.GetPath() );
85
86 m_mruPath = fn.GetPath();
87
88 SCH_IO_MGR::SCH_FILE_T piType = SCH_IO_MGR::GuessPluginTypeFromLibPath( fn.GetFullPath() );
89
90 if( piType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
91 {
92 msg.Printf( _( "Unable to find a reader for '%s'." ), fn.GetFullPath() );
93 DisplayError( this, msg );
94 return;
95 }
96
97 DIALOG_IMPORT_SYMBOL_SELECT selectDlg( this, fn.GetFullPath(), libName, piType );
98
99 if( selectDlg.ShowModal() != wxID_OK )
100 return;
101
102 std::vector<wxString> selectedSymbols = selectDlg.GetSelectedSymbols();
103
104 if( selectedSymbols.empty() )
105 return;
106
107 const auto& conflictResolutions = selectDlg.GetConflictResolutions();
108
109 // Load and import each selected symbol
110 IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( piType ) );
111 wxString firstImported;
112 int importedCount = 0;
113 int skippedCount = 0;
114
115 for( const wxString& symbolName : selectedSymbols )
116 {
117 auto conflictIt = conflictResolutions.find( symbolName );
118
119 if( conflictIt != conflictResolutions.end()
120 && conflictIt->second == CONFLICT_RESOLUTION::SKIP )
121 {
122 skippedCount++;
123 continue;
124 }
125
126 try
127 {
128 LIB_SYMBOL* entry = pi->LoadSymbol( fn.GetFullPath(), symbolName );
129
130 if( entry )
131 {
132 entry->SetName( EscapeString( entry->GetName(), CTX_LIBID ) );
133 m_libMgr->UpdateSymbol( entry, libName );
134
135 if( firstImported.IsEmpty() )
136 firstImported = entry->GetName();
137
138 importedCount++;
139 }
140 }
141 catch( const IO_ERROR& ioe )
142 {
143 msg.Printf( _( "Cannot import symbol '%s': %s" ), symbolName, ioe.What() );
144 DisplayErrorMessage( this, msg );
145 }
146 }
147
148 if( importedCount > 0 )
149 {
150 SyncLibraries( false );
151 LoadSymbol( firstImported, libName, 1 );
152
153 if( skippedCount > 0 )
154 {
155 msg.Printf( _( "Imported %d symbol(s), skipped %d." ), importedCount, skippedCount );
156 DisplayInfoMessage( this, msg );
157 }
158 }
159}
160
161
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:83
wxString GetName() const override
Definition lib_symbol.h:146
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:230
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition confirm.cpp:202
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
Definition confirm.cpp:177
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
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.