43#include <wx/snglinst.h>
78#include <wx/stdpaths.h>
80#include <wx/filedlg.h>
81#include <wx/txtstrm.h>
82#include <wx/wfstream.h>
83#include <wx/zipstrm.h>
86#include "widgets/filedlg_hook_save_project.h"
89#define USE_INSTRUMENTATION 0
103 std::vector<IO_BASE::IO_FILE_DESC> descriptions;
116 wxCHECK( pi,
false );
123 descriptions.emplace_back( desc );
126 wxString fileFiltersStr;
127 std::vector<std::string> allExtensions;
128 std::set<wxString> allWildcardsSet;
132 if( !fileFiltersStr.IsEmpty() )
133 fileFiltersStr += wxChar(
'|' );
135 fileFiltersStr += desc.FileFilter();
137 for(
const std::string& ext : desc.m_FileExtensions )
139 allExtensions.emplace_back( ext );
144 wxString allWildcardsStr;
146 for(
const wxString& wildcard : allWildcardsSet )
147 allWildcardsStr << wildcard;
155 fileFiltersStr =
_(
"All supported formats" ) + wxT(
"|" ) + allWildcardsStr + wxT(
"|" )
159 wxFileName fileName( *aFileName );
163 if( fileName.FileExists() )
165 path = fileName.GetPath();
166 name = fileName.GetFullName();
179 wxFileDialog dlg( aParent,
180 kicadFormat ?
_(
"Open Board File" ) :
_(
"Import Non KiCad Board File" ),
181 path,
name, fileFiltersStr, wxFD_OPEN | wxFD_FILE_MUST_EXIST );
186 dlg.SetCustomizeHook( importOptions );
188 if( dlg.ShowModal() == wxID_OK )
190 *aFileName = dlg.GetPath();
191 aParent->
SetMruPath( wxFileName( dlg.GetPath() ).GetPath() );
217 wxFileName fn = *aFileName;
221 wxFileDialog dlg( aParent,
_(
"Save Board File As" ), fn.GetPath(), fn.GetFullName(), wildcard,
222 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
228 dlg.SetCustomizeHook( newProjectHook );
230 if( dlg.ShowModal() != wxID_OK )
233 *aFileName = dlg.GetPath();
239 *aCreateProject =
true;
251 if( !wxFileName::IsFileReadable( fn ) )
270 int id =
event.GetId();
284 if( !
Kiface().IsSingle() )
307 wxFileName fn = currfn;
310 fn.SetName( rec_name );
312 if( !fn.FileExists() )
314 msg.Printf(
_(
"Recovery file '%s' not found." ), fn.GetFullPath() );
319 msg.Printf(
_(
"OK to load recovery file '%s'?" ), fn.GetFullPath() );
321 if( !
IsOK(
this, msg ) )
341 msg.Printf(
_(
"Revert '%s' to last version saved?" ), fn.GetFullPath() );
343 if( !
IsOK(
this, msg ) )
356 if( !
Kiface().IsSingle() )
362 wxString saveMsg =
_(
"Current board will be closed, save changes to '%s' before "
368 return Files_io_from_id( ID_SAVE_BOARD );
376 if( !
IsOK(
this,
_(
"Current Board will be closed. Continue?" ) ) )
400 if( !
GetBoard()->GetFileName().IsEmpty() )
419 wxFileName::SplitPath(
GetBoard()->GetFileName(),
nullptr,
nullptr, &orig_name,
nullptr );
421 if( orig_name.IsEmpty() )
424 wxFileName savePath(
Prj().GetProjectFullName() );
426 if( !savePath.IsOk() || !savePath.IsDirWritable() )
430 if( !savePath.IsOk() || !savePath.IsDirWritable() )
435 wxString filename = fn.GetFullPath();
436 bool createProject =
false;
437 bool success =
false;
447 success =
SavePcbFile( filename, addToHistory, createProject );
473 for(
int i = 0; i < collector.
GetCount(); i++ )
477 int itemWidth =
static_cast<PCB_SHAPE*
>( collector[i] )->GetWidth();
479 if( edgeWidth != -1 && edgeWidth != itemWidth )
482 edgeWidth = std::max( edgeWidth, itemWidth );
486 edgeWidth = itemWidth;
491 if( mixed && aShowUserMsg )
495 _(
"If the zones on this board are refilled the Copper Edge "
496 "Clearance setting will be used (see Board Setup > Design "
497 "Rules > Constraints).\n This may result in different fills "
498 "from previous KiCad versions which used the line thicknesses "
499 "of the board boundary on the Edge Cuts layer." ) );
502 return std::max( 0, edgeWidth / 2 );
509 if( aFileSet.size() != 1 )
511 UTF8 msg =
StrPrintf(
"Pcbnew:%s() takes a single filename", __func__ );
516 wxString fullFileName( aFileSet[0] );
517 wxFileName wx_filename( fullFileName );
524 wxASSERT_MSG( wx_filename.IsAbsolute(), wxT(
"Path is not absolute!" ) );
526 std::unique_ptr<LOCKFILE> lock = std::make_unique<LOCKFILE>( fullFileName );
528 if( !lock->Valid() && lock->IsLockedByMe() )
534 if( !
Pgm().SingleInstance()->IsAnotherRunning() )
535 lock->OverrideLock();
540 msg.Printf(
_(
"PCB '%s' is already open by '%s' at '%s'." ),
541 wx_filename.GetFullName(),
543 lock->GetHostname() );
548 lock->OverrideLock();
563 wxFileName pro = fullFileName;
566 bool is_new = !wxFileName::IsFileReadable( fullFileName );
572 msg.Printf(
_(
"PCB '%s' does not exist. Do you wish to create it?" ), fullFileName );
574 if( !
IsOK(
this, msg ) )
582 :
_(
"Loading PCB" ), 1 );
594 progressReporter.Hide();
614 wxString
path = wxPathOnly(
Prj().GetProjectFullName() );
647 BOARD* loadedBoard =
nullptr;
653 this, std::placeholders::_1 ) );
660 std::placeholders::_1 ) );
674 bool failedLoad =
false;
684 std::map<std::string, UTF8> props;
693 pi->SetQueryUserCallback(
694 [&]( wxString aTitle,
int aIcon, wxString aMessage, wxString aAction ) ->
bool
696 KIDIALOG dlg(
nullptr, aMessage, aTitle, wxOK | wxCANCEL | aIcon );
698 if( !aAction.IsEmpty() )
699 dlg.SetOKLabel( aAction );
706#if USE_INSTRUMENTATION
710 if(
config()->m_System.show_import_issues )
715 pi->SetProgressReporter( &progressReporter );
716 loadedBoard = pi->LoadBoard( fullFileName,
nullptr, &props, &
Prj() );
718#if USE_INSTRUMENTATION
720 printf(
"PCB_IO::Load(): %u usecs\n", stopTime - startTime );
725 msg.Printf(
_(
"Error loading PCB '%s'." ), fullFileName );
726 progressReporter.Hide();
733 if( ioe.
Problem() != wxT(
"CANCEL" ) )
735 msg.Printf(
_(
"Error loading PCB '%s'." ), fullFileName );
736 progressReporter.Hide();
742 catch(
const std::bad_alloc& )
744 msg.Printf(
_(
"Memory exhausted loading PCB '%s'" ), fullFileName );
745 progressReporter.Hide();
751 if( failedLoad || !loadedBoard )
767 errorReporter.ShowModal();
771 SetBoard( loadedBoard,
false, &progressReporter );
822 && loadedBoard->
GetGenerator().Lower() != wxT(
"gerbview" ) ) )
827 "It will be converted to the new format when saved." ),
837 wxFileName loadedBoardFn( fullFileName );
838 wxString libNickName = loadedBoardFn.GetName();
843 std::vector<FOOTPRINT*> loadedFootprints = pi->GetImportedCachedLibraryFootprints();
849 if( newLibPath.Length() > 0 )
853 for(
FOOTPRINT* footprint : loadedFootprints )
857 if( !footprint->GetFPID().GetLibItemName().empty() )
859 footprint->SetReference(
"REF**" );
860 piSexpr->FootprintSave( newLibPath, footprint );
866 wxLogError(
_(
"Error saving footprint %s to project specific library." )
868 footprint->GetFPID().GetUniStringLibItemName(),
875 wxString rel_path, env_path;
877 wxASSERT_MSG( wxGetEnv( project_env, &env_path ),
878 wxT(
"There is no project variable?" ) );
880 wxString result( newLibPath );
882 if( result.Replace( env_path, wxT(
"$(" ) + project_env + wxT(
")" ) ) )
886 wxT(
"KiCad" ), wxEmptyString );
897 wxLogError(
_(
"Error saving project specific footprint library table." )
905 LIB_ID libId = footprint->GetFPID();
911 footprint->SetFPID( libId );
920 fn.SetPath(
Prj().GetProjectPath() );
921 fn.SetName(
Prj().GetProjectName() );
924 wxString fname = fn.GetFullPath();
937 std::vector<ZONE*> toFill;
954#if 0 && defined(DEBUG)
978 bool aChangeProject )
981 wxFileName pcbFileName = aFileName;
991 wxString msg = wxString::Format(
_(
"Insufficient permissions to write file '%s'." ),
992 pcbFileName.GetFullPath() );
999 wxFileName projectFile( pcbFileName );
1000 wxFileName rulesFile( pcbFileName );
1006 if( projectFile.FileExists() )
1010 else if( aChangeProject )
1018 if( currentRules.FileExists() && !rulesFile.FileExists() && aChangeProject )
1019 KiCopyFile( currentRules.GetFullPath(), rulesFile.GetFullPath(), msg );
1021 if( !msg.IsEmpty() )
1023 DisplayError(
this, wxString::Format(
_(
"Error saving custom rules file '%s'." ),
1024 rulesFile.GetFullPath() ) );
1027 if( projectFile.FileExists() )
1037 wxString tempFile = wxFileName::CreateTempFileName( wxS(
"pcbnew" ) );
1045 pi->SaveBoard( tempFile,
GetBoard(),
nullptr );
1049 DisplayError(
this, wxString::Format(
_(
"Error saving board file '%s'.\n%s" ),
1050 pcbFileName.GetFullPath(),
1053 lowerTxt.Printf(
_(
"Failed to create temporary file '%s'." ), tempFile );
1058 wxRemoveFile( tempFile );
1067 if( !wxRenameFile( tempFile, pcbFileName.GetFullPath() ) )
1069 DisplayError(
this, wxString::Format(
_(
"Error saving board file '%s'.\n"
1070 "Failed to rename temporary file '%s." ),
1071 pcbFileName.GetFullPath(),
1074 lowerTxt.Printf(
_(
"Failed to rename temporary file '%s'." ),
1082 if( !
Kiface().IsSingle() )
1093 LockFile( pcbFileName.GetFullPath() );
1100 wxFileName autoSaveFileName = pcbFileName;
1104 if( autoSaveFileName.FileExists() )
1105 wxRemoveFile( autoSaveFileName.GetFullPath() );
1107 lowerTxt.Printf(
_(
"File '%s' saved." ), pcbFileName.GetFullPath() );
1109 SetStatusText( lowerTxt, 0 );
1130 DisplayError(
this, wxString::Format(
_(
"Insufficient permissions to write file '%s'." ),
1131 pcbFileName.GetFullPath() ) );
1145 wxASSERT( pcbFileName.IsAbsolute() );
1147 pi->SaveBoard( pcbFileName.GetFullPath(),
GetBoard(),
nullptr );
1151 DisplayError(
this, wxString::Format(
_(
"Error saving board file '%s'.\n%s" ),
1152 pcbFileName.GetFullPath(),
1158 wxFileName projectFile( pcbFileName );
1159 wxFileName rulesFile( pcbFileName );
1165 if( aCreateProject && !projectFile.FileExists() )
1170 if( aCreateProject && currentRules.FileExists() && !rulesFile.FileExists() )
1171 KiCopyFile( currentRules.GetFullPath(), rulesFile.GetFullPath(), msg );
1173 if( !msg.IsEmpty() )
1175 DisplayError(
this, wxString::Format(
_(
"Error saving custom rules file '%s'." ),
1176 rulesFile.GetFullPath() ) );
1180 pcbFileName.GetFullPath() ) );
1188 wxFileName tmpFileName;
1194 wxString title = GetTitle();
1196 if(
GetBoard()->GetFileName().IsEmpty() )
1207 wxFileName autoSaveFileName = tmpFileName;
1212 if( !autoSaveFileName.IsOk() )
1217 if( !autoSaveFileName.IsDirWritable() )
1219 autoSaveFileName.SetPath( wxFileName::GetTempDir() );
1221 if( !autoSaveFileName.IsOk() || !autoSaveFileName.IsDirWritable() )
1226 wxT(
"Creating auto save file <" ) + autoSaveFileName.GetFullPath() + wxT(
">" ) );
1228 if(
SavePcbFile( autoSaveFileName.GetFullPath(),
false,
false ) )
1236 if( !
Kiface().IsSingle() &&
1256 const std::map<std::string, UTF8>* aProperties )
1282 if( dlg.ShowModal() != wxID_OK )
1290 if( pcbFileName.GetName().empty() )
1292 DisplayError(
this,
_(
"The board must be saved before generating IPC2581 file." ) );
1298 wxString msg = wxString::Format(
_(
"Insufficient permissions to write file '%s'." ),
1299 pcbFileName.GetFullPath() );
1305 wxString tempFile = wxFileName::CreateTempFileName( wxS(
"pcbnew_ipc" ) );
1309 std::map<std::string, UTF8> props;
1314 props[
"OEMRef"] = dlg.
GetOEM();
1315 props[
"mpn"] = dlg.
GetMPN();
1316 props[
"mfg"] = dlg.
GetMfg();
1317 props[
"dist"] = dlg.
GetDist();
1326 pi->SetProgressReporter( &reporter );
1327 pi->SaveBoard( tempFile,
GetBoard(), &props );
1332 DisplayError(
this, wxString::Format(
_(
"Error generating IPC2581 file '%s'.\n%s" ),
1333 pcbFileName.GetFullPath(), ioe.
What() ) );
1335 lowerTxt.Printf(
_(
"Failed to create temporary file '%s'." ), tempFile );
1340 wxRemoveFile( tempFile );
1347 auto ret =
tp.submit( saveFile );
1350 std::future_status status = ret.wait_for( std::chrono::milliseconds( 250 ) );
1352 while( status != std::future_status::ready )
1355 status = ret.wait_for( std::chrono::milliseconds( 250 ) );
1363 catch(
const std::exception& e )
1365 wxLogError(
"Exception in IPC2581 generation: %s", e.what() );
1375 wxFileName tempfn = pcbFileName;
1377 wxFileName zipfn = tempFile;
1378 zipfn.SetExt(
"zip" );
1380 wxFFileOutputStream fnout( zipfn.GetFullPath() );
1381 wxZipOutputStream
zip( fnout );
1382 wxFFileInputStream fnin( tempFile );
1384 zip.PutNextEntry( tempfn.GetFullName() );
1389 wxRemoveFile( tempFile );
1390 tempFile = zipfn.GetFullPath();
1394 if( !wxRenameFile( tempFile, pcbFileName.GetFullPath() ) )
1396 DisplayError(
this, wxString::Format(
_(
"Error generating IPC2581 file '%s'.\n"
1397 "Failed to rename temporary file '%s." ),
1398 pcbFileName.GetFullPath(),
1401 lowerTxt.Printf(
_(
"Failed to rename temporary file '%s'." ),
1415 if( dlg.ShowModal() != wxID_OK )
1425 wxString msg = wxString::Format(
_(
"Insufficient permissions to write file '%s'." ),
1426 pcbFileName.GetFullPath() );
1432 if( !wxFileName::DirExists( pcbFileName.GetFullPath() ) )
1435 if( !wxFileName::Mkdir( pcbFileName.GetFullPath(), wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL ) )
1439 msg.Printf(
_(
"Cannot create output directory '%s'." ), pcbFileName.GetFullPath() );
1446 wxFileName tempFile( pcbFileName.GetFullPath(),
"" );
1447 tempFile.AppendDir(
"odb" );
1451 std::map<std::string, UTF8> props;
1457 auto saveFile = [&]() ->
bool
1462 pi->SetProgressReporter( &reporter );
1463 pi->SaveBoard( pcbFileName.GetFullPath(),
GetBoard(), &props );
1468 DisplayError(
this, wxString::Format(
_(
"Error generating ODBPP files '%s'.\n%s" ),
1469 tempFile.GetFullPath(), ioe.
What() ) );
1471 lowerTxt.Printf(
_(
"Failed to create directory '%s'." ), tempFile.GetFullPath() );
1476 wxFileName::Rmdir( tempFile.GetFullPath() );
1482 auto ret =
tp.submit( saveFile );
1484 std::future_status status = ret.wait_for( std::chrono::milliseconds( 250 ) );
1486 while( status != std::future_status::ready )
1489 status = ret.wait_for( std::chrono::milliseconds( 250 ) );
1497 catch(
const std::exception& e )
1499 wxLogError(
"Exception in ODB++ generation: %s", e.what() );
1506 wxFileName zipFileName( pcbFileName.GetFullPath(),
"odb.zip" );
1508 wxFFileOutputStream fnout( zipFileName.GetFullPath() );
1509 wxZipOutputStream zipStream( fnout );
1511 std::function<void(
const wxString&,
const wxString& )> addDirToZip =
1512 [&](
const wxString& dirPath,
const wxString& parentPath )
1514 wxDir dir( dirPath );
1517 bool cont = dir.GetFirst( &fileName, wxEmptyString, wxDIR_DEFAULT );
1520 wxFileName fileInZip( dirPath, fileName );
1521 wxString relativePath =
1522 parentPath.IsEmpty()
1524 : parentPath + wxString( wxFileName::GetPathSeparator() )
1527 if( wxFileName::DirExists( fileInZip.GetFullPath() ) )
1529 zipStream.PutNextDirEntry( relativePath );
1530 addDirToZip( fileInZip.GetFullPath(), relativePath );
1534 wxFFileInputStream fileStream( fileInZip.GetFullPath() );
1535 zipStream.PutNextEntry( relativePath );
1536 fileStream.Read( zipStream );
1538 cont = dir.GetNext( &fileName );
1542 addDirToZip( tempFile.GetFullPath(), wxEmptyString );
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
void SetContentModified(bool aModified=true)
int m_CopperEdgeClearance
Information pertinent to a Pcbnew printed circuit board.
bool m_LegacyDesignSettingsLoaded
True if the legacy board design settings were loaded from a file.
GAL_SET m_LegacyVisibleItems
void SetFileName(const wxString &aFileName)
bool BuildConnectivity(PROGRESS_REPORTER *aReporter=nullptr)
Build or rebuild the board connectivity database for the board, especially the list of connected item...
void SynchronizeNetsAndNetClasses(bool aResetTrackAndViaSizes)
Copy NETCLASS info to each NET, based on NET membership in a NETCLASS.
LSET m_LegacyVisibleLayers
Visibility settings stored in board prior to 6.0, only used for loading legacy files.
void SetProject(PROJECT *aProject, bool aReferenceOnly=false)
Link a board to a given project.
const wxString & GetFileName() const
int GetFileFormatVersionAtLoad() const
const wxString & GetGenerator() const
Adds an item to the container.
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
void SynchronizeProperties()
Copy the current project's text variables into the boards property cache.
bool m_LegacyCopperEdgeClearanceLoaded
int GetCount() const
Return the number of objects in the list.
wxString GetPrecision() const
wxString GetDistPN() const
wxString GetUnitsString() const
wxString GetOutputPath() const
wxString GetOutputPath() const
wxString GetPrecision() const
wxString GetUnitsString() const
Class DIALOG_HTML_REPORTER.
WX_HTML_REPORT_BOX * m_Reporter
static std::vector< IMPORT_PROJECT_DESC > RunModal(wxWindow *aParent, const std::vector< IMPORT_PROJECT_DESC > &aProjectDesc)
Create and show a dialog (modal) and returns the data from it after completion.
static std::map< wxString, PCB_LAYER_ID > RunModal(wxWindow *aParent, const std::vector< INPUT_LAYER_DESC > &aLayerDesc)
Create and show a dialog (modal) and returns the data from it after completion.
Create and handle a window for the 3d viewer connected to a Kiway and a pcbboard.
void NewDisplay(bool aForceImmediateRedraw=false)
Reload and refresh (rebuild) the 3D scene.
virtual APP_SETTINGS_BASE * config() const
Returns the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
virtual void CheckForAutoSaveFile(const wxFileName &aFileName)
Check if an auto save file exists for aFileName and takes the appropriate action depending on the use...
void UpdateFileHistory(const wxString &FullFileName, FILE_HISTORY *aFileHistory=nullptr)
Update the list of recently opened files.
void ClearFileHistory(FILE_HISTORY *aFileHistory=nullptr)
Removes all files from the file history.
wxString GetMruPath() const
virtual void DeleteAutoSaveFile(const wxFileName &aFileName)
bool IsWritable(const wxFileName &aFileName, bool aVerbose=true)
Checks if aFileName can be written.
wxString GetFileFromHistory(int cmdId, const wxString &type, FILE_HISTORY *aFileHistory=nullptr)
Fetches the file name from the file history list.
void SetMruPath(const wxString &aPath)
WX_INFOBAR * GetInfoBar()
void ReleaseFile()
Release the current file marked in use.
std::unique_ptr< LOCKFILE > m_file_checker
void SetMsgPanel(const std::vector< MSG_PANEL_ITEM > &aList)
Clear the message panel and populates it with the contents of aList.
bool LockFile(const wxString &aFileName)
Mark a schematic file as being in use.
bool GetCreateNewProject() const
Gets if this hook has attached controls to a dialog box.
bool IsAttachedToDialog() const
bool GetShowIssues() const
Hold a record identifying a library accessed by the appropriate footprint library #PLUGIN object in t...
static const std::vector< KICAD_T > AllBoardItems
A scan list for all editable board items.
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()
virtual const wxString Problem() const
what was the problem?
Helper class to create more flexible dialogs, including 'do not show again' checkbox handling.
void DoNotShowCheckbox(wxString file, int line)
Checks the 'do not show again' setting for the dialog.
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
Plugin class for import plugins that support remappable layers.
A logical library item identifier and consists of various portions much like a URI.
int SetLibNickname(const UTF8 &aLibNickname)
Override the logical library name portion of the LIB_ID to aLibNickname.
const UTF8 & GetLibItemName() const
bool InsertRow(LIB_TABLE_ROW *aRow, bool doReplace=false)
Adds aRow if it does not already exist or if doReplace is true.
void Save(const wxString &aFileName) const
Write this library table to aFileName in s-expression form.
static REPORTER & GetInstance()
static wxString GetDefaultUserProjectsPath()
Gets the default path we point users to create projects.
static TOOL_ACTION repairBoard
wxString GetDesignRulesPath()
Return the absolute path to the design rules file for the currently-loaded board.
wxString CreateNewProjectLibrary(const wxString &aLibName=wxEmptyString, const wxString &aProposedName=wxEmptyString)
const VECTOR2I GetPageSizeIU() const override
Works off of GetPageSettings() to return the size of the paper page in the internal units of this par...
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
PCB_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
EDA_3D_VIEWER_FRAME * Get3DViewerFrame()
The main frame for Pcbnew.
void LoadDrawingSheet()
Load the drawing sheet file.
void ResolveDRCExclusions(bool aCreateMarkers)
If aCreateMarkers then create DRC exclusion markers from the serialized data.
void SetBoard(BOARD *aBoard, PROGRESS_REPORTER *aReporter=nullptr) override
Set the #m_Pcb member in such as way as to ensure deleting any previous BOARD.
void GenIPC2581File(wxCommandEvent &event)
Create and IPC2581 output file.
bool doAutoSave() override
Perform auto save when the board has been modified and not saved within the auto save interval.
void OnModify() override
Must be called after a board change to set the modified flag.
void OnClearFileHistory(wxCommandEvent &aEvent)
bool SavePcbCopy(const wxString &aFileName, bool aCreateProject=false)
Write the board data structures to aFileName.
bool OpenProjectFiles(const std::vector< wxString > &aFileSet, int aCtl=0) override
Load a KiCad board (.kicad_pcb) from aFileName.
void onBoardLoaded()
Update the state of the GUI after a new board is loaded or created.
void SaveProjectLocalSettings() override
Save changes to the project local settings.
bool Files_io_from_id(int aId)
Read and write board files according to aId.
void GenODBPPFiles(wxCommandEvent &event)
Create and Generate ODB++ output files.
bool IsContentModified() const override
Get if the current board has been modified but not saved.
bool LoadProjectSettings()
Load the current project's file configuration settings which are pertinent to this PCB_EDIT_FRAME ins...
bool Clear_Pcb(bool doAskAboutUnsavedChanges, bool aFinal=false)
Delete all and reinitialize the current board.
void Files_io(wxCommandEvent &event)
Call Files_io_from_id with the wxCommandEvent id.
void UpdateTitle()
Set the main window title bar text.
int inferLegacyEdgeClearance(BOARD *aBoard, bool aShowUserMsg=true)
const std::map< std::string, UTF8 > * m_importProperties
bool SavePcbFile(const wxString &aFileName, bool addToHistory=true, bool aChangeProject=true)
Write the board data structures to a aFileName.
bool importFile(const wxString &aFileName, int aFileType, const std::map< std::string, UTF8 > *aProperties=nullptr)
Load the given filename but sets the path to the current project path.
void saveProjectSettings() override
Saves any design-related project settings associated with this frame.
void OnFileHistory(wxCommandEvent &event)
static PLUGIN_REGISTRY * Instance()
static PCB_IO * PluginFind(PCB_FILE_T aFileType)
Return a #PLUGIN which the caller can use to import, export, save, or load design documents.
PCB_FILE_T
The set of file types that the PCB_IO_MGR knows about, and for which there has been a plugin written,...
@ KICAD_SEXP
S-expression Pcbnew file format.
@ LEGACY
Legacy Pcbnew file formats prior to s-expression.
static PCB_FILE_T FindPluginTypeFromBoardPath(const wxString &aFileName, int aCtl=0)
Return a plugin type given a path for a board file.
Collect all BOARD_ITEM objects on a given layer.
void Collect(BOARD_ITEM *aBoard, const std::vector< KICAD_T > &aTypes)
Test a BOARD_ITEM using this class's Inspector method, which does the collection.
void SetLayerId(PCB_LAYER_ID aLayerId)
bool KeepRefreshing(bool aWait=false) override
Update the UI dialog.
Plugin class for import plugins that support choosing a project.
LSET m_VisibleLayers
Board settings.
GAL_SET m_VisibleItems
The GAL layers (aka items) that are turned on for viewing (.
static FP_LIB_TABLE * PcbFootprintLibs(PROJECT *aProject)
Return the table of footprint libraries without Kiway.
virtual void SetReadOnly(bool aReadOnly=true)
virtual const wxString GetProjectFullName() const
Return the full path and name of the project.
virtual PROJECT_LOCAL_SETTINGS & GetLocalSettings() const
virtual const wxString FootprintLibTblName() const
Returns the path and filename of this project's footprint library table.
virtual const wxString AbsolutePath(const wxString &aFileName) const
Fix up aFileName if it is relative to the project's directory to be an absolute path and filename.
virtual bool IsNullProject() const
Check if this project is a null project (i.e.
void SaveProjectAs(const wxString &aFullPath, PROJECT *aProject=nullptr)
Sets the currently loaded project path and saves it (pointers remain valid) Note that this will not m...
void SaveProjectCopy(const wxString &aFullPath, PROJECT *aProject=nullptr)
Saves a copy of the current project under the given path.
bool SaveProject(const wxString &aFullPath=wxEmptyString, PROJECT *aProject=nullptr)
Saves a loaded project.
bool LoadProject(const wxString &aFullPath, bool aSetActive=true)
Loads a project or sets up a new project with a specified path.
bool UnloadProject(PROJECT *aProject, bool aSave=true)
Saves, unloads and unregisters the given PROJECT.
bool TriggerBackupIfNeeded(REPORTER &aReporter) const
Calls BackupProject if a new backup is needed according to the current backup policy.
PROJECT & Prj() const
A helper while we are not MDI-capable – return the one and only project.
An 8 bit string that is assuredly encoded in UTF8, and supplies special conversion support to and fro...
static void ResolvePossibleSymlinks(wxFileName &aFilename)
void Flush()
Build the HTML messages page.
bool HasMessage() const override
Returns true if the reporter client is non-empty.
void RemoveAllButtons()
Remove all the buttons that have been added by the user.
bool HasCloseButton() const
@ OUTDATED_SAVE
OUTDATED_SAVE Messages that should be cleared on save.
void Dismiss() override
Dismisses the infobar and updates the containing layout and AUI manager (if one is provided).
void AddCloseButton(const wxString &aTooltip=_("Hide this message."))
Add the default close button to the infobar on the right side.
MESSAGE_TYPE GetMessageType() const
void ShowMessage(const wxString &aMessage, int aFlags=wxICON_INFORMATION) override
Show the info bar with the provided message and icon.
Multi-thread safe progress reporter dialog, intended for use of tasks that parallel reporting back of...
A wrapper for reporting to a wxString object.
const wxString & GetMessages() const
wxString EnsureFileExtension(const wxString &aFilename, const wxString &aExtension)
It's annoying to throw up nag dialogs when the extension isn't right.
bool AskOverrideLock(wxWindow *aParent, const wxString &aMessage)
Display a dialog indicating the file is already open, with an option to reset the lock.
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
bool HandleUnsavedChanges(wxWindow *aParent, const wxString &aMessage, const std::function< bool()> &aSaveFunction)
Display a dialog with Save, Cancel and Discard Changes buttons.
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
This file is part of the common library.
Declaration of the eda_3d_viewer class.
void KiCopyFile(const wxString &aSrcPath, const wxString &aDestPath, wxString &aErrors)
#define WIN_STRING_DIR_SEP
#define UNIX_STRING_DIR_SEP
static const std::string ProjectFileExtension
static const std::string LegacyPcbFileExtension
static const std::string Ipc2581FileExtension
static const std::string AutoSaveFilePrefix
static const std::string DesignRulesFileExtension
static const std::string KiCadPcbFileExtension
static wxString PcbFileWildcard()
const wxChar *const traceAutoSave
Flag to enable auto save feature debug tracing.
std::unique_ptr< T > IO_RELEASER
Helper to hold and release an IO_BASE object when exceptions are thrown.
#define THROW_IO_ERROR(msg)
This file is part of the common library.
#define KICTL_CREATE
caller thinks requested project files may not exist.
#define KICTL_REVERT
reverting to a previously-saved (KiCad) file.
#define KICTL_IMPORT_LIB
import all footprints into a project library.
#define KICTL_KICAD_ONLY
chosen file is from KiCad according to user
#define KICTL_NONKICAD_ONLY
chosen file is non-KiCad according to user
@ GAL_LAYER_ID_BITMASK_END
This is the end of the layers used for visibility bit masks in legacy board files.
#define GAL_LAYER_INDEX(x)
Use this macro to convert a GAL layer to a 0-indexed offset from LAYER_VIAS.
This file contains miscellaneous commonly used macros and functions.
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
#define SEXPR_BOARD_FILE_VERSION
Current s-expression file format version. 2 was the last legacy format version.
bool AskLoadBoardFileName(PCB_EDIT_FRAME *aParent, wxString *aFileName, int aCtl=0)
Show a wxFileDialog asking for a BOARD filename to open.
bool AskSaveBoardFileName(PCB_EDIT_FRAME *aParent, wxString *aFileName, bool *aCreateProject)
Put up a wxFileDialog asking for a BOARD filename to save.
@ ID_IMPORT_NON_KICAD_BOARD
@ ID_MENU_RECOVER_BOARD_AUTOSAVE
SETTINGS_MANAGER * GetSettingsManager()
PGM_BASE & Pgm()
The global Program "get" accessor.
int64_t GetRunningMicroSecs()
An alternate way to calculate an elapsed time (in microsecondes) to class PROF_COUNTER.
#define PROJECT_VAR_NAME
A variable name whose value holds the current project directory.
#define NAMELESS_PROJECT
default name for nameless projects
int StrPrintf(std::string *result, const char *format,...)
This is like sprintf() but the output is appended to a std::string instead of to a character array.
bool show_import_issues
Stored value for "show import issues" when importing non-KiCad designs to this application.
Container that describes file type info.
std::vector< std::string > m_FileExtensions
Filter used for file pickers if m_IsFile is true.
bool m_CanRead
Whether the IO can read this file type.
BS::thread_pool thread_pool
thread_pool & GetKiCadThreadPool()
Get a reference to the current thread pool.
wxLogTrace helper definitions.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
wxString AddFileExtListToFilter(const std::vector< std::string > &aExts)
Build the wildcard extension file dialog wildcard filter to add to the base message dialog.
wxString formatWildcardExt(const wxString &aWildcard)
Format wildcard extension to support case sensitive file dialogs.
Definition of file extensions used in Kicad.