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.

621 lines
16 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 (C) 1992-2023 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 BackupFileSuffix( "-bak" );
  103. const std::string LockFilePrefix( "~" );
  104. const std::string LockFileExtension( "lck" );
  105. const std::string KiCadSymbolLibFileExtension( "kicad_sym" );
  106. const std::string SchematicSymbolFileExtension( "sym" );
  107. const std::string LegacySymbolLibFileExtension( "lib" );
  108. const std::string LegacySymbolDocumentFileExtension( "dcm" );
  109. const std::string LtspiceSymbolExtension( "asy" );
  110. const std::string VrmlFileExtension( "wrl" );
  111. const std::string ProjectFileExtension( "kicad_pro" );
  112. const std::string LegacyProjectFileExtension( "pro" );
  113. const std::string ProjectLocalSettingsFileExtension( "kicad_prl" );
  114. const std::string LegacySchematicFileExtension( "sch" );
  115. const std::string EagleSchematicFileExtension( "sch" );
  116. const std::string CadstarSchematicFileExtension( "csa" );
  117. const std::string CadstarPartsLibraryFileExtension( "lib" );
  118. const std::string KiCadSchematicFileExtension( "kicad_sch" );
  119. const std::string SpiceFileExtension( "cir" );
  120. const std::string LtspiceSchematicExtension( "asc" );
  121. const std::string CadstarNetlistFileExtension( "frp" );
  122. const std::string OrCadPcb2NetlistFileExtension( "net" );
  123. const std::string NetlistFileExtension( "net" );
  124. const std::string AllegroNetlistFileExtension( "txt" );
  125. const std::string FootprintAssignmentFileExtension( "cmp" );
  126. const std::string GerberFileExtension( "gbr" );
  127. const std::string GerberJobFileExtension( "gbrjob" );
  128. const std::string HtmlFileExtension( "html" );
  129. const std::string EquFileExtension( "equ" );
  130. const std::string HotkeyFileExtension( "hotkeys" );
  131. const std::string DatabaseLibraryFileExtension( "kicad_dbl" );
  132. const std::string ArchiveFileExtension( "zip" );
  133. const std::string LegacyPcbFileExtension( "brd" );
  134. const std::string EaglePcbFileExtension( "brd" );
  135. const std::string CadstarPcbFileExtension( "cpa" );
  136. const std::string KiCadPcbFileExtension( "kicad_pcb" );
  137. const std::string DrawingSheetFileExtension( "kicad_wks" );
  138. const std::string DesignRulesFileExtension( "kicad_dru" );
  139. const std::string PdfFileExtension( "pdf" );
  140. const std::string MacrosFileExtension( "mcr" );
  141. const std::string DrillFileExtension( "drl" );
  142. const std::string SVGFileExtension( "svg" );
  143. const std::string ReportFileExtension( "rpt" );
  144. const std::string FootprintPlaceFileExtension( "pos" );
  145. const std::string KiCadFootprintLibPathExtension( "pretty" ); // this is a directory
  146. const std::string LegacyFootprintLibPathExtension( "mod" ); // this is a file
  147. const std::string AltiumFootprintLibPathExtension( "PcbLib" ); // this is a file
  148. const std::string EagleFootprintLibPathExtension( "lbr" ); // this is a file
  149. const std::string GedaPcbFootprintLibFileExtension( "fp" ); // this is a file
  150. const std::string KiCadFootprintFileExtension( "kicad_mod" );
  151. const std::string SpecctraDsnFileExtension( "dsn" );
  152. const std::string SpecctraSessionFileExtension( "ses" );
  153. const std::string IpcD356FileExtension( "d356" );
  154. const std::string WorkbookFileExtension( "wbk" );
  155. const std::string PngFileExtension( "png" );
  156. const std::string JpegFileExtension( "jpg" );
  157. const std::string TextFileExtension( "txt" );
  158. const std::string MarkdownFileExtension( "md" );
  159. const std::string CsvFileExtension( "csv" );
  160. const std::string XmlFileExtension( "xml" );
  161. const std::string JsonFileExtension( "json" );
  162. const wxString GerberFileExtensionsRegex( "(gbr|gko|pho|(g[tb][alops])|(gm?\\d\\d*)|(gp[tb]))" );
  163. bool IsGerberFileExtension( const wxString& ext )
  164. {
  165. static wxRegEx gerberRE( GerberFileExtensionsRegex, wxRE_ICASE );
  166. return gerberRE.Matches( ext );
  167. }
  168. wxString AllFilesWildcard()
  169. {
  170. return _( "All files" ) + AddFileExtListToFilter( {} );
  171. }
  172. wxString SchematicSymbolFileWildcard()
  173. {
  174. return _( "KiCad drawing symbol files" ) + AddFileExtListToFilter( { "sym" } );
  175. }
  176. wxString KiCadSymbolLibFileWildcard()
  177. {
  178. return _( "KiCad symbol library files" )
  179. + AddFileExtListToFilter( { KiCadSymbolLibFileExtension } );
  180. }
  181. wxString LegacySymbolLibFileWildcard()
  182. {
  183. return _( "KiCad legacy symbol library files" ) + AddFileExtListToFilter( { "lib" } );
  184. }
  185. wxString DatabaseLibFileWildcard()
  186. {
  187. return _( "KiCad database library files" )
  188. + AddFileExtListToFilter( { DatabaseLibraryFileExtension } );
  189. }
  190. wxString AllSymbolLibFilesWildcard()
  191. {
  192. return _( "All KiCad symbol library files" )
  193. + AddFileExtListToFilter( { KiCadSymbolLibFileExtension,
  194. DatabaseLibraryFileExtension,
  195. "lib" } );
  196. }
  197. wxString ProjectFileWildcard()
  198. {
  199. return _( "KiCad project files" ) + AddFileExtListToFilter( { ProjectFileExtension } );
  200. }
  201. wxString LegacyProjectFileWildcard()
  202. {
  203. return _( "KiCad legacy project files" )
  204. + AddFileExtListToFilter( { LegacyProjectFileExtension } );
  205. }
  206. wxString AllProjectFilesWildcard()
  207. {
  208. return _( "All KiCad project files" )
  209. + AddFileExtListToFilter( { ProjectFileExtension, LegacyProjectFileExtension } );
  210. }
  211. wxString AllSchematicFilesWildcard()
  212. {
  213. return _( "All KiCad schematic files" )
  214. + AddFileExtListToFilter( { KiCadSchematicFileExtension, LegacySchematicFileExtension } );
  215. }
  216. wxString LegacySchematicFileWildcard()
  217. {
  218. return _( "KiCad legacy schematic files" )
  219. + AddFileExtListToFilter( { LegacySchematicFileExtension } );
  220. }
  221. wxString KiCadSchematicFileWildcard()
  222. {
  223. return _( "KiCad s-expression schematic files" )
  224. + AddFileExtListToFilter( { KiCadSchematicFileExtension } );
  225. }
  226. wxString AltiumSchematicFileWildcard()
  227. {
  228. return _( "Altium schematic files" ) + AddFileExtListToFilter( { "SchDoc" } );
  229. }
  230. wxString CadstarSchematicArchiveFileWildcard()
  231. {
  232. return _( "CADSTAR Schematic Archive files" ) + AddFileExtListToFilter( { "csa" } );
  233. }
  234. wxString CadstarArchiveFilesWildcard()
  235. {
  236. return _( "CADSTAR Archive files" ) + AddFileExtListToFilter( { "csa", "cpa" } );
  237. }
  238. wxString EagleSchematicFileWildcard()
  239. {
  240. return _( "Eagle XML schematic files" ) + AddFileExtListToFilter( { "sch" } );
  241. }
  242. wxString LtspiceSchematicFileWildcard()
  243. {
  244. return _( "LTspice schematic files" ) + AddFileExtListToFilter( { "asc" } );
  245. }
  246. wxString EagleFilesWildcard()
  247. {
  248. return _( "Eagle XML files" ) + AddFileExtListToFilter( { "sch", "brd" } );
  249. }
  250. wxString OrCadPcb2NetlistFileWildcard()
  251. {
  252. return _( "OrcadPCB2 netlist files" )
  253. + AddFileExtListToFilter( { OrCadPcb2NetlistFileExtension } );
  254. }
  255. wxString NetlistFileWildcard()
  256. {
  257. return _( "KiCad netlist files" ) + AddFileExtListToFilter( { "net" } );
  258. }
  259. wxString AllegroNetlistFileWildcard()
  260. {
  261. return _( "Allegro netlist files" )
  262. + AddFileExtListToFilter( { AllegroNetlistFileExtension } );
  263. }
  264. wxString LegacyPcbFileWildcard()
  265. {
  266. return _( "KiCad printed circuit board files" ) + AddFileExtListToFilter( { "brd" } );
  267. }
  268. wxString EaglePcbFileWildcard()
  269. {
  270. return _( "Eagle ver. 6.x XML PCB files" ) + AddFileExtListToFilter( { "brd" } );
  271. }
  272. wxString CadstarPcbArchiveFileWildcard()
  273. {
  274. return _( "CADSTAR PCB Archive files" ) + AddFileExtListToFilter( { "cpa" } );
  275. }
  276. wxString PCadPcbFileWildcard()
  277. {
  278. return _( "P-Cad 200x ASCII PCB files" ) + AddFileExtListToFilter( { "pcb" } );
  279. }
  280. wxString AltiumDesignerPcbFileWildcard()
  281. {
  282. return _( "Altium Designer PCB files" ) + AddFileExtListToFilter( { "PcbDoc" } );
  283. }
  284. wxString AltiumCircuitStudioPcbFileWildcard()
  285. {
  286. return _( "Altium Circuit Studio PCB files" ) + AddFileExtListToFilter( { "CSPcbDoc" } );
  287. }
  288. wxString AltiumCircuitMakerPcbFileWildcard()
  289. {
  290. return _( "Altium Circuit Maker PCB files" ) + AddFileExtListToFilter( { "CMPcbDoc" } );
  291. }
  292. wxString SolidworksPcbFileWildcard()
  293. {
  294. return _( "Solidworks PCB files" ) + AddFileExtListToFilter( { "SWPcbDoc" } );
  295. }
  296. wxString FabmasterPcbFileWildcard()
  297. {
  298. return _( "Fabmaster PCB files" ) + AddFileExtListToFilter( { "txt", "fab" } );
  299. }
  300. wxString PcbFileWildcard()
  301. {
  302. return _( "KiCad printed circuit board files" ) +
  303. AddFileExtListToFilter( { KiCadPcbFileExtension } );
  304. }
  305. wxString KiCadFootprintLibFileWildcard()
  306. {
  307. return _( "KiCad footprint files" )
  308. + AddFileExtListToFilter( { KiCadFootprintFileExtension } );
  309. }
  310. wxString KiCadFootprintLibPathWildcard()
  311. {
  312. return _( "KiCad footprint library paths" )
  313. + AddFileExtListToFilter( { KiCadFootprintLibPathExtension } );
  314. }
  315. wxString LegacyFootprintLibPathWildcard()
  316. {
  317. return _( "Legacy footprint library files" ) + AddFileExtListToFilter( { "mod" } );
  318. }
  319. wxString AltiumFootprintLibPathWildcard()
  320. {
  321. return _( "Altium PCB footprint library files" ) + AddFileExtListToFilter( { "PcbLib" } );
  322. }
  323. wxString EagleFootprintLibPathWildcard()
  324. {
  325. return _( "Eagle ver. 6.x XML library files" ) + AddFileExtListToFilter( { "lbr" } );
  326. }
  327. wxString GedaPcbFootprintLibFileWildcard()
  328. {
  329. return _( "Geda PCB footprint library files" ) + AddFileExtListToFilter( { "fp" } );
  330. }
  331. wxString DrawingSheetFileWildcard()
  332. {
  333. return _( "Drawing sheet files" )
  334. + AddFileExtListToFilter( { DrawingSheetFileExtension } );
  335. }
  336. // Wildcard for cvpcb symbol to footprint link file
  337. wxString FootprintAssignmentFileWildcard()
  338. {
  339. return _( "KiCad symbol footprint link files" )
  340. + AddFileExtListToFilter( { FootprintAssignmentFileExtension } );
  341. }
  342. // Wildcard for reports and fabrication documents
  343. wxString DrillFileWildcard()
  344. {
  345. return _( "Drill files" )
  346. + AddFileExtListToFilter( { DrillFileExtension, "nc", "xnc", "txt" } );
  347. }
  348. wxString SVGFileWildcard()
  349. {
  350. return _( "SVG files" ) + AddFileExtListToFilter( { SVGFileExtension } );
  351. }
  352. wxString HtmlFileWildcard()
  353. {
  354. return _( "HTML files" ) + AddFileExtListToFilter( { "htm", "html" } );
  355. }
  356. wxString CsvFileWildcard()
  357. {
  358. return _( "CSV Files" ) + AddFileExtListToFilter( { CsvFileExtension } );
  359. }
  360. wxString PdfFileWildcard()
  361. {
  362. return _( "Portable document format files" ) + AddFileExtListToFilter( { "pdf" } );
  363. }
  364. wxString PSFileWildcard()
  365. {
  366. return _( "PostScript files" ) + AddFileExtListToFilter( { "ps" } );
  367. }
  368. wxString ReportFileWildcard()
  369. {
  370. return _( "Report files" ) + AddFileExtListToFilter( { "rpt" } );
  371. }
  372. wxString FootprintPlaceFileWildcard()
  373. {
  374. return _( "Component placement files" ) + AddFileExtListToFilter( { "pos" } );
  375. }
  376. wxString Shapes3DFileWildcard()
  377. {
  378. return _( "VRML and X3D files" ) + AddFileExtListToFilter( { "wrl", "x3d" } );
  379. }
  380. wxString IDF3DFileWildcard()
  381. {
  382. return _( "IDFv3 footprint files" ) + AddFileExtListToFilter( { "idf" } );
  383. }
  384. wxString TextFileWildcard()
  385. {
  386. return _( "Text files" ) + AddFileExtListToFilter( { "txt" } );
  387. }
  388. wxString ModLegacyExportFileWildcard()
  389. {
  390. return _( "Legacy footprint export files" ) + AddFileExtListToFilter( { "emp" } );
  391. }
  392. wxString ErcFileWildcard()
  393. {
  394. return _( "Electrical rule check file" ) + AddFileExtListToFilter( { "erc" } );
  395. }
  396. wxString SpiceLibraryFileWildcard()
  397. {
  398. return _( "Spice library file" ) + AddFileExtListToFilter( { "lib", "mod" } );
  399. }
  400. wxString SpiceNetlistFileWildcard()
  401. {
  402. return _( "SPICE netlist file" ) + AddFileExtListToFilter( { "cir" } );
  403. }
  404. wxString CadstarNetlistFileWildcard()
  405. {
  406. return _( "CadStar netlist file" ) + AddFileExtListToFilter( { "frp" } );
  407. }
  408. wxString EquFileWildcard()
  409. {
  410. return _( "Symbol footprint association files" ) + AddFileExtListToFilter( { "equ" } );
  411. }
  412. wxString ZipFileWildcard()
  413. {
  414. return _( "Zip file" ) + AddFileExtListToFilter( { "zip" } );
  415. }
  416. wxString GencadFileWildcard()
  417. {
  418. return _( "GenCAD 1.4 board files" ) + AddFileExtListToFilter( { "cad" } );
  419. }
  420. wxString DxfFileWildcard()
  421. {
  422. return _( "DXF Files" ) + AddFileExtListToFilter( { "dxf" } );
  423. }
  424. wxString GerberJobFileWildcard()
  425. {
  426. return _( "Gerber job file" ) + AddFileExtListToFilter( { GerberJobFileExtension } );
  427. }
  428. wxString SpecctraDsnFileWildcard()
  429. {
  430. return _( "Specctra DSN file" )
  431. + AddFileExtListToFilter( { SpecctraDsnFileExtension } );
  432. }
  433. wxString SpecctraSessionFileWildcard()
  434. {
  435. return _( "Specctra Session file" )
  436. + AddFileExtListToFilter( { SpecctraSessionFileExtension } );
  437. }
  438. wxString IpcD356FileWildcard()
  439. {
  440. return _( "IPC-D-356 Test Files" )
  441. + AddFileExtListToFilter( { IpcD356FileExtension } );
  442. }
  443. wxString WorkbookFileWildcard()
  444. {
  445. return _( "Workbook file" )
  446. + AddFileExtListToFilter( { WorkbookFileExtension } );
  447. }
  448. wxString PngFileWildcard()
  449. {
  450. return _( "PNG file" ) + AddFileExtListToFilter( { "png" } );
  451. }
  452. wxString JpegFileWildcard()
  453. {
  454. return _( "Jpeg file" ) + AddFileExtListToFilter( { "jpg", "jpeg" } );
  455. }
  456. wxString HotkeyFileWildcard()
  457. {
  458. return _( "Hotkey file" ) + AddFileExtListToFilter( { HotkeyFileExtension } );
  459. }