KiCad PCB EDA Suite
job_file_reader.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) 2007-2019 Jean-Pierre Charras jp.charras at wanadoo.fr
5 * Copyright (C) 1992-2019 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
29#include <nlohmann/json.hpp>
30#include <wx/filename.h>
31
33#include <gerbview.h>
34#include <richio.h>
35#include <locale_io.h>
36#include <macros.h>
37#include <gerber_file_image.h>
39#include <gerbview_frame.h>
40#include <reporter.h>
41#include <gbr_metadata.h>
43#include <view/view.h>
44#include <wx/filedlg.h>
45
46
48
81{
82public:
83 GERBER_JOBFILE_READER( const wxString& aFileName, REPORTER* aReporter )
84 {
85 m_filename = aFileName;
86 m_reporter = aReporter;
87 }
88
90
91 bool ReadGerberJobFile();
92 wxArrayString& GetGerberFiles() { return m_GerberFiles; }
93
94private:
96 wxFileName m_filename;
97 wxArrayString m_GerberFiles; // List of gerber files in job
98
99 // Convert a JSON string, that uses escaped sequence of 4 hexadecimal digits
100 // to encode unicode chars when not ASCII7 codes
101 // json11 converts this sequence to UTF8 string
102 wxString formatStringFromJSON( const std::string& name );
103};
104
105
107{
108 // Read the gerber file */
109 FILE* jobFile = wxFopen( m_filename.GetFullPath(), wxT( "rt" ) );
110
111 if( jobFile == nullptr )
112 return false;
113
114 LOCALE_IO toggleIo;
115
116 FILE_LINE_READER jobfileReader( jobFile, m_filename.GetFullPath() ); // Will close jobFile
117
118 wxString data;
119
120 // detect the file format: old (deprecated) gerber format of official JSON format
121 bool json_format = false;
122
123 char* line = jobfileReader.ReadLine();
124
125 if( !line ) // end of file
126 return false;
127
128 data = line;
129
130 if( data.Contains( wxT( "{" ) ) )
131 json_format = true;
132
133 if( json_format )
134 {
135 while( ( line = jobfileReader.ReadLine() ) )
136 data << '\n' << line;
137
138 try
139 {
140 json js = json::parse( TO_UTF8( data ) );
141
142 for( json& entry : js["FilesAttributes"] )
143 {
144 std::string name = entry["Path"].get<std::string>();
146 }
147 }
148 catch( ... )
149 {
150 return false;
151 }
152 }
153 else
154 {
155 if( m_reporter )
156 m_reporter->ReportTail( _( "This job file uses an outdated format. Please recreate it." ),
158
159 return false;
160 }
161
162 return true;
163}
164
165
167{
168 // Convert a JSON string, that uses a escaped sequence of 4 hexadecimal digits
169 // to encode unicode chars
170 // Our json11 library returns in this case a UTF8 sequence. Just convert it to
171 // a wxString.
172 wxString wstr = FROM_UTF8( name.c_str() );
173 return wstr;
174}
175
176
177
178bool GERBVIEW_FRAME::LoadGerberJobFile( const wxString& aFullFileName )
179{
180 wxFileName filename = aFullFileName;
181 wxString currentPath;
182 bool success = true;
183
184 if( !filename.IsOk() )
185 {
186 // Use the current working directory if the file name path does not exist.
187 if( filename.DirExists() )
188 currentPath = filename.GetPath();
189 else
190 currentPath = m_mruPath;
191
192 wxFileDialog dlg( this, _( "Open Gerber Job File" ),
193 currentPath,
194 filename.GetFullName(),
196 wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_CHANGE_DIR );
197
198 if( dlg.ShowModal() == wxID_CANCEL )
199 return false;
200
201 filename = dlg.GetPath();
202 currentPath = filename.GetPath();
203 m_mruPath = currentPath;
204 }
205 else
206 {
207 currentPath = filename.GetPath();
208 m_mruPath = currentPath;
209 }
210
211 wxString msg;
212 WX_STRING_REPORTER reporter( &msg );
213
214 if( filename.IsOk() )
215 {
216 GERBER_JOBFILE_READER gbjReader( filename.GetFullPath(), &reporter );
217
218 if( gbjReader.ReadGerberJobFile() )
219 {
220 // Update the list of recent drill files.
221 UpdateFileHistory( filename.GetFullPath(), &m_jobFileHistory );
222
223 Clear_DrawLayers( false );
225
226 wxArrayString& gbrfiles = gbjReader.GetGerberFiles();
227
228 // 0 = Gerber file type
229 std::vector<int> fileTypesVec( gbrfiles.Count(), 0 );
230 success = LoadListOfGerberAndDrillFiles( currentPath, gbrfiles, &fileTypesVec );
231
232 Zoom_Automatique( false );
233 }
234 }
235
237
238 if( !msg.IsEmpty() )
239 {
240 wxSafeYield(); // Allows slice of time to redraw the screen
241 // to refresh widgets, before displaying messages
242 HTML_MESSAGE_BOX mbox( this, _( "Messages" ) );
243 mbox.ListSet( msg );
244 mbox.ShowModal();
245 }
246
247 return success;
248}
const char * name
Definition: DXF_plotter.cpp:56
void UpdateFileHistory(const wxString &FullFileName, FILE_HISTORY *aFileHistory=nullptr)
Update the list of recently opened files.
wxString m_mruPath
virtual void ClearMsgPanel()
Clear all messages from the message panel.
virtual void Zoom_Automatique(bool aWarpPointer)
Redraw the screen with best zoom level and the best centering that shows all the page or the board.
A LINE_READER that reads from an open file.
Definition: richio.h:173
char * ReadLine() override
Read a line of text into the buffer and increments the line number counter.
Definition: richio.cpp:219
this class read and parse a Gerber job file to extract useful info for GerbView
GERBER_JOBFILE_READER(const wxString &aFileName, REPORTER *aReporter)
wxArrayString m_GerberFiles
wxArrayString & GetGerberFiles()
read a .gbrjob file
wxString formatStringFromJSON(const std::string &name)
void SortLayersByX2Attributes()
bool LoadGerberJobFile(const wxString &aFileName)
Load a Gerber job file, and load gerber files found in job files.
FILE_HISTORY m_jobFileHistory
bool Clear_DrawLayers(bool query)
bool LoadListOfGerberAndDrillFiles(const wxString &aPath, const wxArrayString &aFilenameList, std::vector< int > *aFileType)
Load a list of Gerber and NC drill files and updates the view based on them.
void ListSet(const wxString &aList)
Add a list of items.
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: locale_io.h:41
A pure virtual class used to derive REPORTER objects from.
Definition: reporter.h:71
virtual REPORTER & ReportTail(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED)
Places the report at the end of the list, for objects that support report ordering.
Definition: reporter.h:99
A wrapper for reporting to a wxString object.
Definition: reporter.h:164
#define _(s)
Handle special data (items attributes) during plot.
nlohmann::json json
Definition: gerbview.cpp:44
wxString GerberJobFileWildcard()
nlohmann::json json
This file contains miscellaneous commonly used macros and functions.
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:96
static wxString FROM_UTF8(const char *cstring)
Convert a UTF8 encoded C string to a wxString for all wxWidgets build modes.
Definition: macros.h:110
bool parse(std::istream &aStream, bool aVerbose)
Parse a PCB or footprint file from the given input stream.
@ RPT_SEVERITY_WARNING
Definition of file extensions used in Kicad.