You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

583 lines
17 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. /*
  2. * This program source code file is part of KiCad, a free EDA CAD application.
  3. *
  4. * Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
  5. * Copyright (C) 2008 Wayne Stambaugh <stambaughw@gmail.com>
  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. * @file wildcards_and_files_ext.cpp
  27. * Definition of file extensions used in Kicad.
  28. */
  29. #include <regex>
  30. #include <wildcards_and_files_ext.h>
  31. #include <wx/filedlg.h>
  32. #include <wx/regex.h>
  33. #include <wx/translation.h>
  34. #include <regex>
  35. bool compareFileExtensions( const std::string& aExtension,
  36. const std::vector<std::string>& aReference, bool aCaseSensitive )
  37. {
  38. // Form the regular expression string by placing all possible extensions into it as alternatives
  39. std::string regexString = "(";
  40. bool first = true;
  41. for( const std::string& ext : aReference )
  42. {
  43. // The | separate goes between the extensions
  44. if( !first )
  45. regexString += "|";
  46. else
  47. first = false;
  48. regexString += ext;
  49. }
  50. regexString += ")";
  51. // Create the regex and see if it matches
  52. std::regex extRegex( regexString, aCaseSensitive ? std::regex::ECMAScript : std::regex::icase );
  53. return std::regex_match( aExtension, extRegex );
  54. }
  55. wxString formatWildcardExt( const wxString& aWildcard )
  56. {
  57. wxString wc;
  58. #if defined( __WXGTK__ )
  59. for( const auto& ch : aWildcard )
  60. {
  61. if( wxIsalpha( ch ) )
  62. wc += wxString::Format( "[%c%c]", wxTolower( ch ), wxToupper( ch ) );
  63. else
  64. wc += ch;
  65. }
  66. return wc;
  67. #else
  68. wc = aWildcard;
  69. return wc;
  70. #endif
  71. }
  72. wxString AddFileExtListToFilter( const std::vector<std::string>& aExts )
  73. {
  74. if( aExts.size() == 0 )
  75. {
  76. // The "all files" wildcard is different on different systems
  77. wxString filter;
  78. filter << wxS( " (" ) << wxFileSelectorDefaultWildcardStr << wxS( ")|" )
  79. << wxFileSelectorDefaultWildcardStr;
  80. return filter;
  81. }
  82. wxString files_filter = wxS( " (" );
  83. // Add extensions to the info message:
  84. for( const std::string& ext : aExts )
  85. {
  86. if( files_filter.length() > 2 )
  87. files_filter << wxS( "; " );
  88. files_filter << "*." << ext;
  89. }
  90. files_filter << wxS( ")|*." );
  91. // Add extensions to the filter list, using a formatted string (GTK specific):
  92. bool first = true;
  93. for( const std::string& ext : aExts )
  94. {
  95. if( !first )
  96. files_filter << wxS( ";*." );
  97. first = false;
  98. files_filter << formatWildcardExt( ext );
  99. }
  100. return files_filter;
  101. }
  102. const std::string FILEEXT::BackupFileSuffix( "-bak" );
  103. const std::string FILEEXT::LockFilePrefix( "~" );
  104. const std::string FILEEXT::LockFileExtension( "lck" );
  105. const std::string FILEEXT::AutoSaveFilePrefix( "_autosave-" );
  106. const std::string FILEEXT::KiCadSymbolLibFileExtension( "kicad_sym" );
  107. const std::string FILEEXT::SchematicSymbolFileExtension( "sym" );
  108. const std::string FILEEXT::LegacySymbolLibFileExtension( "lib" );
  109. const std::string FILEEXT::LegacySymbolDocumentFileExtension( "dcm" );
  110. const std::string FILEEXT::VrmlFileExtension( "wrl" );
  111. const std::string FILEEXT::ProjectFileExtension( "kicad_pro" );
  112. const std::string FILEEXT::LegacyProjectFileExtension( "pro" );
  113. const std::string FILEEXT::ProjectLocalSettingsFileExtension( "kicad_prl" );
  114. const std::string FILEEXT::LegacySchematicFileExtension( "sch" );
  115. const std::string FILEEXT::CadstarSchematicFileExtension( "csa" );
  116. const std::string FILEEXT::CadstarPartsLibraryFileExtension( "lib" );
  117. const std::string FILEEXT::KiCadSchematicFileExtension( "kicad_sch" );
  118. const std::string FILEEXT::SpiceFileExtension( "cir" );
  119. const std::string FILEEXT::SpiceModelFileExtension( "model" );
  120. const std::string FILEEXT::SpiceSubcircuitFileExtension( "sub" );
  121. const std::string FILEEXT::IbisFileExtension( "ibs" );
  122. const std::string FILEEXT::CadstarNetlistFileExtension( "frp" );
  123. const std::string FILEEXT::OrCadPcb2NetlistFileExtension( "net" );
  124. const std::string FILEEXT::NetlistFileExtension( "net" );
  125. const std::string FILEEXT::AllegroNetlistFileExtension( "txt" );
  126. const std::string FILEEXT::PADSNetlistFileExtension( "asc" );
  127. const std::string FILEEXT::FootprintAssignmentFileExtension( "cmp" );
  128. const std::string FILEEXT::GerberFileExtension( "gbr" );
  129. const std::string FILEEXT::GerberJobFileExtension( "gbrjob" );
  130. const std::string FILEEXT::HtmlFileExtension( "html" );
  131. const std::string FILEEXT::EquFileExtension( "equ" );
  132. const std::string FILEEXT::HotkeyFileExtension( "hotkeys" );
  133. const std::string FILEEXT::DatabaseLibraryFileExtension( "kicad_dbl" );
  134. const std::string FILEEXT::HTTPLibraryFileExtension( "kicad_httplib" );
  135. const std::string FILEEXT::KiCadJobSetFileExtension( "kicad_jobset" );
  136. const std::string FILEEXT::ArchiveFileExtension( "zip" );
  137. const std::string FILEEXT::LegacyPcbFileExtension( "brd" );
  138. const std::string FILEEXT::EaglePcbFileExtension( "brd" );
  139. const std::string FILEEXT::CadstarPcbFileExtension( "cpa" );
  140. const std::string FILEEXT::KiCadPcbFileExtension( "kicad_pcb" );
  141. const std::string FILEEXT::DrawingSheetFileExtension( "kicad_wks" );
  142. const std::string FILEEXT::DesignRulesFileExtension( "kicad_dru" );
  143. const std::string FILEEXT::PdfFileExtension( "pdf" );
  144. const std::string FILEEXT::MacrosFileExtension( "mcr" );
  145. const std::string FILEEXT::DrillFileExtension( "drl" );
  146. const std::string FILEEXT::SVGFileExtension( "svg" );
  147. const std::string FILEEXT::ReportFileExtension( "rpt" );
  148. const std::string FILEEXT::FootprintPlaceFileExtension( "pos" );
  149. const std::string FILEEXT::KiCadFootprintLibPathExtension( "pretty" ); // this is a directory
  150. const std::string FILEEXT::LegacyFootprintLibPathExtension( "mod" ); // this is a file
  151. const std::string FILEEXT::AltiumFootprintLibPathExtension( "PcbLib" ); // this is a file
  152. const std::string FILEEXT::CadstarFootprintLibPathExtension( "cpa" ); // this is a file
  153. const std::string FILEEXT::EagleFootprintLibPathExtension( "lbr" ); // this is a file
  154. const std::string FILEEXT::GedaPcbFootprintLibFileExtension( "fp" ); // this is a file
  155. const std::string FILEEXT::KiCadFootprintFileExtension( "kicad_mod" );
  156. const std::string FILEEXT::SpecctraDsnFileExtension( "dsn" );
  157. const std::string FILEEXT::SpecctraSessionFileExtension( "ses" );
  158. const std::string FILEEXT::IpcD356FileExtension( "d356" );
  159. const std::string FILEEXT::Ipc2581FileExtension( "xml" );
  160. const std::string FILEEXT::WorkbookFileExtension( "wbk" );
  161. const std::string FILEEXT::KiCadDesignBlockLibPathExtension( "kicad_blocks" ); // this is a directory
  162. const std::string FILEEXT::KiCadDesignBlockPathExtension( "kicad_block" ); // this is a directory
  163. const std::string FILEEXT::PngFileExtension( "png" );
  164. const std::string FILEEXT::JpegFileExtension( "jpg" );
  165. const std::string FILEEXT::TextFileExtension( "txt" );
  166. const std::string FILEEXT::MarkdownFileExtension( "md" );
  167. const std::string FILEEXT::CsvFileExtension( "csv" );
  168. const std::string FILEEXT::TsvFileExtension( "tsv" );
  169. const std::string FILEEXT::XmlFileExtension( "xml" );
  170. const std::string FILEEXT::JsonFileExtension( "json" );
  171. const std::string FILEEXT::PythonFileExtension( "py" );
  172. const std::string FILEEXT::StepFileExtension( "step" );
  173. const std::string FILEEXT::StepFileAbrvExtension( "stp" );
  174. const std::string FILEEXT::GltfBinaryFileExtension( "glb" );
  175. const std::string FILEEXT::BrepFileExtension( "brep" );
  176. const std::string FILEEXT::XaoFileExtension( "xao" );
  177. const std::string FILEEXT::PlyFileExtension( "ply" );
  178. const std::string FILEEXT::StlFileExtension( "stl" );
  179. const std::string FILEEXT::U3DFileExtension( "u3d" );
  180. const std::string FILEEXT::GencadFileExtension( "cad" );
  181. const wxString
  182. FILEEXT::GerberFileExtensionsRegex( "(gbr|gko|pho|(g[tb][alops])|(gm?\\d\\d*)|(gp[tb]))" );
  183. const std::string FILEEXT::FootprintLibraryTableFileName( "fp-lib-table" );
  184. const std::string FILEEXT::SymbolLibraryTableFileName( "sym-lib-table" );
  185. const std::string FILEEXT::DesignBlockLibraryTableFileName( "design-block-lib-table" );
  186. const std::string FILEEXT::KiCadUriPrefix( "kicad-embed" );
  187. bool FILEEXT::IsGerberFileExtension( const wxString& ext )
  188. {
  189. static wxRegEx gerberRE( GerberFileExtensionsRegex, wxRE_ICASE );
  190. return gerberRE.Matches( ext );
  191. }
  192. wxString FILEEXT::AllFilesWildcard()
  193. {
  194. return _( "All files" ) + AddFileExtListToFilter( {} );
  195. }
  196. wxString FILEEXT::KiCadSymbolLibFileWildcard()
  197. {
  198. return _( "KiCad symbol library files" )
  199. + AddFileExtListToFilter( { KiCadSymbolLibFileExtension } );
  200. }
  201. wxString FILEEXT::ProjectFileWildcard()
  202. {
  203. return _( "KiCad project files" ) + AddFileExtListToFilter( { ProjectFileExtension } );
  204. }
  205. wxString FILEEXT::LegacyProjectFileWildcard()
  206. {
  207. return _( "KiCad legacy project files" )
  208. + AddFileExtListToFilter( { LegacyProjectFileExtension } );
  209. }
  210. wxString FILEEXT::AllProjectFilesWildcard()
  211. {
  212. return _( "All KiCad project files" )
  213. + AddFileExtListToFilter( { ProjectFileExtension, LegacyProjectFileExtension } );
  214. }
  215. wxString FILEEXT::AllSchematicFilesWildcard()
  216. {
  217. return _( "All KiCad schematic files" )
  218. + AddFileExtListToFilter( { KiCadSchematicFileExtension, LegacySchematicFileExtension } );
  219. }
  220. wxString FILEEXT::LegacySchematicFileWildcard()
  221. {
  222. return _( "KiCad legacy schematic files" )
  223. + AddFileExtListToFilter( { LegacySchematicFileExtension } );
  224. }
  225. wxString FILEEXT::KiCadSchematicFileWildcard()
  226. {
  227. return _( "KiCad s-expression schematic files" )
  228. + AddFileExtListToFilter( { KiCadSchematicFileExtension } );
  229. }
  230. wxString FILEEXT::AltiumProjectFilesWildcard()
  231. {
  232. return _( "Altium Project files" ) + AddFileExtListToFilter( { "PrjPcb" } );
  233. }
  234. wxString FILEEXT::CadstarArchiveFilesWildcard()
  235. {
  236. return _( "CADSTAR Archive files" ) + AddFileExtListToFilter( { "csa", "cpa" } );
  237. }
  238. wxString FILEEXT::EagleFilesWildcard()
  239. {
  240. return _( "Eagle XML files" ) + AddFileExtListToFilter( { "sch", "brd" } );
  241. }
  242. wxString FILEEXT::OrCadPcb2NetlistFileWildcard()
  243. {
  244. return _( "OrcadPCB2 netlist files" )
  245. + AddFileExtListToFilter( { OrCadPcb2NetlistFileExtension } );
  246. }
  247. wxString FILEEXT::NetlistFileWildcard()
  248. {
  249. return _( "KiCad netlist files" ) + AddFileExtListToFilter( { "net" } );
  250. }
  251. wxString FILEEXT::AllegroNetlistFileWildcard()
  252. {
  253. return _( "Allegro netlist files" )
  254. + AddFileExtListToFilter( { AllegroNetlistFileExtension } );
  255. }
  256. wxString FILEEXT::PADSNetlistFileWildcard()
  257. {
  258. return _( "PADS netlist files" ) + AddFileExtListToFilter( { PADSNetlistFileExtension } );
  259. }
  260. wxString FILEEXT::EasyEdaArchiveWildcard()
  261. {
  262. return _( "EasyEDA (JLCEDA) Std backup archive" ) + AddFileExtListToFilter( { "zip" } );
  263. }
  264. wxString FILEEXT::EasyEdaProFileWildcard()
  265. {
  266. return _( "EasyEDA (JLCEDA) Pro files" ) + AddFileExtListToFilter( { "epro", "zip" } );
  267. }
  268. wxString FILEEXT::PcbFileWildcard()
  269. {
  270. return _( "KiCad printed circuit board files" )
  271. + AddFileExtListToFilter( { KiCadPcbFileExtension } );
  272. }
  273. wxString FILEEXT::KiCadFootprintLibFileWildcard()
  274. {
  275. return _( "KiCad footprint files" ) + AddFileExtListToFilter( { KiCadFootprintFileExtension } );
  276. }
  277. wxString FILEEXT::KiCadFootprintLibPathWildcard()
  278. {
  279. return _( "KiCad footprint library paths" )
  280. + AddFileExtListToFilter( { KiCadFootprintLibPathExtension } );
  281. }
  282. wxString FILEEXT::KiCadDesignBlockPathWildcard()
  283. {
  284. return _( "KiCad design block path" )
  285. + AddFileExtListToFilter( { KiCadDesignBlockPathExtension } );
  286. }
  287. wxString FILEEXT::KiCadDesignBlockLibPathWildcard()
  288. {
  289. return _( "KiCad design block library paths" )
  290. + AddFileExtListToFilter( { KiCadDesignBlockLibPathExtension } );
  291. }
  292. wxString FILEEXT::DrawingSheetFileWildcard()
  293. {
  294. return _( "Drawing sheet files" )
  295. + AddFileExtListToFilter( { DrawingSheetFileExtension } );
  296. }
  297. // Wildcard for cvpcb symbol to footprint link file
  298. wxString FILEEXT::FootprintAssignmentFileWildcard()
  299. {
  300. return _( "KiCad symbol footprint link files" )
  301. + AddFileExtListToFilter( { FootprintAssignmentFileExtension } );
  302. }
  303. // Wildcard for reports and fabrication documents
  304. wxString FILEEXT::DrillFileWildcard()
  305. {
  306. return _( "Drill files" )
  307. + AddFileExtListToFilter( { DrillFileExtension, "nc", "xnc", "txt" } );
  308. }
  309. wxString FILEEXT::SVGFileWildcard()
  310. {
  311. return _( "SVG files" ) + AddFileExtListToFilter( { SVGFileExtension } );
  312. }
  313. wxString FILEEXT::HtmlFileWildcard()
  314. {
  315. return _( "HTML files" ) + AddFileExtListToFilter( { "htm", "html" } );
  316. }
  317. wxString FILEEXT::CsvFileWildcard()
  318. {
  319. return _( "CSV Files" ) + AddFileExtListToFilter( { CsvFileExtension } );
  320. }
  321. wxString FILEEXT::CsvTsvFileWildcard()
  322. {
  323. return _( "CSV/TSV Files" ) + AddFileExtListToFilter( { CsvFileExtension, TsvFileExtension } );
  324. }
  325. wxString FILEEXT::PdfFileWildcard()
  326. {
  327. return _( "Portable document format files" ) + AddFileExtListToFilter( { "pdf" } );
  328. }
  329. wxString FILEEXT::PSFileWildcard()
  330. {
  331. return _( "PostScript files" ) + AddFileExtListToFilter( { "ps" } );
  332. }
  333. wxString FILEEXT::JsonFileWildcard()
  334. {
  335. return _( "Json files" ) + AddFileExtListToFilter( { JsonFileExtension } );
  336. }
  337. wxString FILEEXT::ReportFileWildcard()
  338. {
  339. return _( "Report files" ) + AddFileExtListToFilter( { ReportFileExtension } );
  340. }
  341. wxString FILEEXT::FootprintPlaceFileWildcard()
  342. {
  343. return _( "Component placement files" ) + AddFileExtListToFilter( { "pos" } );
  344. }
  345. wxString FILEEXT::Shapes3DFileWildcard()
  346. {
  347. return _( "VRML and X3D files" ) + AddFileExtListToFilter( { "wrl", "x3d" } );
  348. }
  349. wxString FILEEXT::IDF3DFileWildcard()
  350. {
  351. return _( "IDFv3 footprint files" ) + AddFileExtListToFilter( { "idf" } );
  352. }
  353. wxString FILEEXT::TextFileWildcard()
  354. {
  355. return _( "Text files" ) + AddFileExtListToFilter( { "txt" } );
  356. }
  357. wxString FILEEXT::ModLegacyExportFileWildcard()
  358. {
  359. return _( "Legacy footprint export files" ) + AddFileExtListToFilter( { "emp" } );
  360. }
  361. wxString FILEEXT::ErcFileWildcard()
  362. {
  363. return _( "Electrical rule check file" ) + AddFileExtListToFilter( { "erc" } );
  364. }
  365. wxString FILEEXT::SpiceLibraryFileWildcard()
  366. {
  367. return _( "SPICE library file" ) + AddFileExtListToFilter( { "lib", "mod" } );
  368. }
  369. wxString FILEEXT::SpiceNetlistFileWildcard()
  370. {
  371. return _( "SPICE netlist file" ) + AddFileExtListToFilter( { "cir" } );
  372. }
  373. wxString FILEEXT::CadstarNetlistFileWildcard()
  374. {
  375. return _( "CadStar netlist file" ) + AddFileExtListToFilter( { "frp" } );
  376. }
  377. wxString FILEEXT::EquFileWildcard()
  378. {
  379. return _( "Symbol footprint association files" ) + AddFileExtListToFilter( { "equ" } );
  380. }
  381. wxString FILEEXT::ZipFileWildcard()
  382. {
  383. return _( "Zip file" ) + AddFileExtListToFilter( { "zip" } );
  384. }
  385. wxString FILEEXT::GencadFileWildcard()
  386. {
  387. return _( "GenCAD 1.4 board files" ) + AddFileExtListToFilter( { GencadFileExtension } );
  388. }
  389. wxString FILEEXT::DxfFileWildcard()
  390. {
  391. return _( "DXF Files" ) + AddFileExtListToFilter( { "dxf" } );
  392. }
  393. wxString FILEEXT::GerberJobFileWildcard()
  394. {
  395. return _( "Gerber job file" ) + AddFileExtListToFilter( { GerberJobFileExtension } );
  396. }
  397. wxString FILEEXT::SpecctraDsnFileWildcard()
  398. {
  399. return _( "Specctra DSN file" )
  400. + AddFileExtListToFilter( { SpecctraDsnFileExtension } );
  401. }
  402. wxString FILEEXT::SpecctraSessionFileWildcard()
  403. {
  404. return _( "Specctra Session file" )
  405. + AddFileExtListToFilter( { SpecctraSessionFileExtension } );
  406. }
  407. wxString FILEEXT::IpcD356FileWildcard()
  408. {
  409. return _( "IPC-D-356 Test Files" )
  410. + AddFileExtListToFilter( { IpcD356FileExtension } );
  411. }
  412. wxString FILEEXT::WorkbookFileWildcard()
  413. {
  414. return _( "Workbook file" )
  415. + AddFileExtListToFilter( { WorkbookFileExtension } );
  416. }
  417. wxString FILEEXT::PngFileWildcard()
  418. {
  419. return _( "PNG file" ) + AddFileExtListToFilter( { "png" } );
  420. }
  421. wxString FILEEXT::JpegFileWildcard()
  422. {
  423. return _( "Jpeg file" ) + AddFileExtListToFilter( { "jpg", "jpeg" } );
  424. }
  425. wxString FILEEXT::HotkeyFileWildcard()
  426. {
  427. return _( "Hotkey file" ) + AddFileExtListToFilter( { HotkeyFileExtension } );
  428. }
  429. wxString FILEEXT::JobsetFileWildcard()
  430. {
  431. return _( "KiCad jobset files" ) + AddFileExtListToFilter( { KiCadJobSetFileExtension } );
  432. }