KiCad PCB EDA Suite
Loading...
Searching...
No Matches
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 The 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
28
29#include <json_common.h>
30#include <wx/filename.h>
31
33#include <gerbview.h>
34#include <richio.h>
35#include <string_utils.h>
36#include <gerber_file_image.h>
38#include <gerbview_frame.h>
39#include <reporter.h>
40#include <gbr_metadata.h>
42#include <view/view.h>
43#include <wx/filedlg.h>
44#include <kiplatform/ui.h>
45
46
47using json = nlohmann::json;
48
79
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 FILE_LINE_READER jobfileReader( jobFile, m_filename.GetFullPath() ); // Will close jobFile
115
116 wxString data;
117
118 // detect the file format: old (deprecated) gerber format of official JSON format
119 bool json_format = false;
120
121 char* line = jobfileReader.ReadLine();
122
123 if( !line ) // end of file
124 return false;
125
126 data = line;
127
128 if( data.Contains( wxT( "{" ) ) )
129 json_format = true;
130
131 if( json_format )
132 {
133 while( ( line = jobfileReader.ReadLine() ) != nullptr )
134 data << '\n' << line;
135
136 try
137 {
138 json js = json::parse( TO_UTF8( data ) );
139
140 for( json& entry : js["FilesAttributes"] )
141 {
142 std::string name = entry["Path"].get<std::string>();
144 }
145 }
146 catch( ... )
147 {
148 return false;
149 }
150 }
151 else
152 {
153 if( m_reporter )
154 m_reporter->ReportTail( _( "This job file uses an outdated format. Please recreate it." ),
156
157 return false;
158 }
159
160 return true;
161}
162
163
165{
166 // Convert a JSON string, that uses a escaped sequence of 4 hexadecimal digits
167 // to encode unicode chars
168 // Our json11 library returns in this case a UTF8 sequence. Just convert it to
169 // a wxString.
170 wxString wstr = From_UTF8( name.c_str() );
171 return wstr;
172}
173
174
175
176bool GERBVIEW_FRAME::LoadGerberJobFile( const wxString& aFullFileName )
177{
178 wxFileName filename = aFullFileName;
179 wxString currentPath;
180 bool success = true;
181
182 if( !filename.IsOk() )
183 {
184 // Use the current working directory if the file name path does not exist.
185 if( filename.DirExists() )
186 currentPath = filename.GetPath();
187 else
188 currentPath = m_mruPath;
189
190 wxFileDialog dlg( this, _( "Open Gerber Job File" ),
191 currentPath,
192 filename.GetFullName(),
194 wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_CHANGE_DIR );
195
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 WX_STRING_REPORTER reporter;
212
213 if( filename.IsOk() )
214 {
215 GERBER_JOBFILE_READER gbjReader( filename.GetFullPath(), &reporter );
216
217 if( gbjReader.ReadGerberJobFile() )
218 {
219 // Update the list of recent drill files.
220 UpdateFileHistory( filename.GetFullPath(), &m_jobFileHistory );
221
222 Clear_DrawLayers( false );
224
225 wxArrayString& gbrfiles = gbjReader.GetGerberFiles();
226
227 // 0 = Gerber file type
228 std::vector<int> fileTypesVec( gbrfiles.Count(), 0 );
229 success = LoadListOfGerberAndDrillFiles( currentPath, gbrfiles, &fileTypesVec );
230
231 Zoom_Automatique( false );
232 }
233 }
234
236
237 if( reporter.HasMessage() )
238 {
239 wxSafeYield(); // Allows slice of time to redraw the screen
240 // to refresh widgets, before displaying messages
241 HTML_MESSAGE_BOX mbox( this, _( "Messages" ) );
242 mbox.ListSet( reporter.GetMessages() );
243 mbox.ShowModal();
244 }
245
246 return success;
247}
const char * name
int ShowModal() override
void UpdateFileHistory(const wxString &FullFileName, FILE_HISTORY *aFileHistory=nullptr)
Update the list of recently opened files.
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:158
char * ReadLine() override
Read a line of text into the buffer and increments the line number counter.
Definition richio.cpp:208
this class read and parse a Gerber job file to extract useful info for GerbView
GERBER_JOBFILE_READER(const wxString &aFileName, REPORTER *aReporter)
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.
A pure virtual class used to derive REPORTER objects from.
Definition reporter.h:73
virtual bool HasMessage() const
Returns true if any messages were reported.
Definition reporter.h:134
A wrapper for reporting to a wxString object.
Definition reporter.h:191
const wxString & GetMessages() const
Definition reporter.cpp:78
#define _(s)
Handle special data (items attributes) during plot.
nlohmann::json json
Definition gerbview.cpp:50
static wxString GerberJobFileWildcard()
void AllowNetworkFileSystems(wxDialog *aDialog)
Configure a file dialog to show network and virtual file systems.
Definition wxgtk/ui.cpp:717
@ RPT_SEVERITY_WARNING
wxString From_UTF8(const char *cstring)
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition of file extensions used in Kicad.