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.

588 lines
15 KiB

  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-2021 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. bool compareFileExtensions( const std::string& aExtension,
  35. const std::vector<std::string>& aReference, bool aCaseSensitive )
  36. {
  37. // Form the regular expression string by placing all possible extensions into it as alternatives
  38. std::string regexString = "(";
  39. bool first = true;
  40. for( const auto& ext : aReference )
  41. {
  42. // The | separate goes between the extensions
  43. if( !first )
  44. regexString += "|";
  45. else
  46. first = false;
  47. regexString += ext;
  48. }
  49. regexString += ")";
  50. // Create the regex and see if it matches
  51. std::regex extRegex( regexString, aCaseSensitive ? std::regex::ECMAScript : std::regex::icase );
  52. return std::regex_match( aExtension, extRegex );
  53. }
  54. wxString formatWildcardExt( const wxString& aWildcard )
  55. {
  56. wxString wc;
  57. #if defined( __WXGTK__ )
  58. for( const auto& ch : aWildcard )
  59. {
  60. if( wxIsalpha( ch ) )
  61. wc += wxString::Format( "[%c%c]", wxTolower( ch ), wxToupper( ch ) );
  62. else
  63. wc += ch;
  64. }
  65. return wc;
  66. #else
  67. wc = aWildcard;
  68. return wc;
  69. #endif
  70. }
  71. wxString AddFileExtListToFilter( const std::vector<std::string>& aExts )
  72. {
  73. if( aExts.size() == 0 )
  74. {
  75. // The "all files" wildcard is different on different systems
  76. wxString filter;
  77. filter << " (" << wxFileSelectorDefaultWildcardStr << ")|"
  78. << wxFileSelectorDefaultWildcardStr;
  79. return filter;
  80. }
  81. wxString files_filter = " (";
  82. // Add extensions to the info message:
  83. for( const std::string& ext : aExts )
  84. {
  85. if( files_filter.length() > 2 )
  86. files_filter << "; ";
  87. files_filter << "*." << ext;
  88. }
  89. files_filter << ")|*.";
  90. // Add extensions to the filter list, using a formatted string (GTK specific):
  91. bool first = true;
  92. for( const auto& ext : aExts )
  93. {
  94. if( !first )
  95. files_filter << ";*.";
  96. first = false;
  97. files_filter << formatWildcardExt( ext );
  98. }
  99. return files_filter;
  100. }
  101. const std::string BackupFileSuffix( "-bak" );
  102. const std::string KiCadSymbolLibFileExtension( "kicad_sym" );
  103. const std::string SchematicSymbolFileExtension( "sym" );
  104. const std::string LegacySymbolLibFileExtension( "lib" );
  105. const std::string LegacySymbolDocumentFileExtension( "dcm" );
  106. const std::string VrmlFileExtension( "wrl" );
  107. const std::string ProjectFileExtension( "kicad_pro" );
  108. const std::string LegacyProjectFileExtension( "pro" );
  109. const std::string ProjectLocalSettingsFileExtension( "kicad_prl" );
  110. const std::string LegacySchematicFileExtension( "sch" );
  111. const std::string KiCadSchematicFileExtension( "kicad_sch" );
  112. const std::string OrCadPcb2NetlistFileExtension( "net" );
  113. const std::string NetlistFileExtension( "net" );
  114. const std::string FootprintAssignmentFileExtension( "cmp" );
  115. const std::string GerberFileExtension( "gbr" );
  116. const std::string GerberJobFileExtension( "gbrjob" );
  117. const std::string HtmlFileExtension( "html" );
  118. const std::string EquFileExtension( "equ" );
  119. const std::string HotkeyFileExtension( "hotkeys" );
  120. const std::string DatabaseLibraryFileExtension( "kicad_dbl" );
  121. const std::string ArchiveFileExtension( "zip" );
  122. const std::string LegacyPcbFileExtension( "brd" );
  123. const std::string KiCadPcbFileExtension( "kicad_pcb" );
  124. const std::string DrawingSheetFileExtension( "kicad_wks" );
  125. const std::string DesignRulesFileExtension( "kicad_dru" );
  126. const std::string PdfFileExtension( "pdf" );
  127. const std::string MacrosFileExtension( "mcr" );
  128. const std::string DrillFileExtension( "drl" );
  129. const std::string SVGFileExtension( "svg" );
  130. const std::string ReportFileExtension( "rpt" );
  131. const std::string FootprintPlaceFileExtension( "pos" );
  132. const std::string KiCadFootprintLibPathExtension( "pretty" ); // this is a directory
  133. const std::string LegacyFootprintLibPathExtension( "mod" ); // this is a file
  134. const std::string AltiumFootprintLibPathExtension( "PcbLib" ); // this is a file
  135. const std::string EagleFootprintLibPathExtension( "lbr" ); // this is a file
  136. const std::string GedaPcbFootprintLibFileExtension( "fp" ); // this is a file
  137. const std::string KiCadFootprintFileExtension( "kicad_mod" );
  138. const std::string SpecctraDsnFileExtension( "dsn" );
  139. const std::string SpecctraSessionFileExtension( "ses" );
  140. const std::string IpcD356FileExtension( "d356" );
  141. const std::string WorkbookFileExtension( "wbk" );
  142. const std::string PngFileExtension( "png" );
  143. const std::string JpegFileExtension( "jpg" );
  144. const std::string TextFileExtension( "txt" );
  145. const std::string CsvFileExtension( "csv" );
  146. bool IsProtelExtension( const wxString& ext )
  147. {
  148. static wxRegEx protelRE( wxT( "(gm1)|(g[tb][lapos])|(g\\d\\d*)" ), wxRE_ICASE );
  149. return protelRE.Matches( ext );
  150. }
  151. wxString AllFilesWildcard()
  152. {
  153. return _( "All files" ) + AddFileExtListToFilter( {} );
  154. }
  155. wxString SchematicSymbolFileWildcard()
  156. {
  157. return _( "KiCad drawing symbol files" ) + AddFileExtListToFilter( { "sym" } );
  158. }
  159. wxString KiCadSymbolLibFileWildcard()
  160. {
  161. return _( "KiCad symbol library files" )
  162. + AddFileExtListToFilter( { KiCadSymbolLibFileExtension } );
  163. }
  164. wxString LegacySymbolLibFileWildcard()
  165. {
  166. return _( "KiCad legacy symbol library files" ) + AddFileExtListToFilter( { "lib" } );
  167. }
  168. wxString DatabaseLibFileWildcard()
  169. {
  170. return _( "KiCad database library files" )
  171. + AddFileExtListToFilter( { DatabaseLibraryFileExtension } );
  172. }
  173. wxString AllSymbolLibFilesWildcard()
  174. {
  175. return _( "All KiCad symbol library files" )
  176. + AddFileExtListToFilter( { KiCadSymbolLibFileExtension,
  177. DatabaseLibraryFileExtension,
  178. "lib" } );
  179. }
  180. wxString ProjectFileWildcard()
  181. {
  182. return _( "KiCad project files" ) + AddFileExtListToFilter( { ProjectFileExtension } );
  183. }
  184. wxString LegacyProjectFileWildcard()
  185. {
  186. return _( "KiCad legacy project files" )
  187. + AddFileExtListToFilter( { LegacyProjectFileExtension } );
  188. }
  189. wxString AllProjectFilesWildcard()
  190. {
  191. return _( "All KiCad project files" )
  192. + AddFileExtListToFilter( { ProjectFileExtension, LegacyProjectFileExtension } );
  193. }
  194. wxString AllSchematicFilesWildcard()
  195. {
  196. return _( "All KiCad schematic files" )
  197. + AddFileExtListToFilter( { KiCadSchematicFileExtension, LegacySchematicFileExtension } );
  198. }
  199. wxString LegacySchematicFileWildcard()
  200. {
  201. return _( "KiCad legacy schematic files" )
  202. + AddFileExtListToFilter( { LegacySchematicFileExtension } );
  203. }
  204. wxString KiCadSchematicFileWildcard()
  205. {
  206. return _( "KiCad s-expression schematic files" )
  207. + AddFileExtListToFilter( { KiCadSchematicFileExtension } );
  208. }
  209. wxString AltiumSchematicFileWildcard()
  210. {
  211. return _( "Altium schematic files" ) + AddFileExtListToFilter( { "SchDoc" } );
  212. }
  213. wxString CadstarSchematicArchiveFileWildcard()
  214. {
  215. return _( "CADSTAR Schematic Archive files" ) + AddFileExtListToFilter( { "csa" } );
  216. }
  217. wxString CadstarArchiveFilesWildcard()
  218. {
  219. return _( "CADSTAR Archive files" ) + AddFileExtListToFilter( { "csa", "cpa" } );
  220. }
  221. wxString EagleSchematicFileWildcard()
  222. {
  223. return _( "Eagle XML schematic files" ) + AddFileExtListToFilter( { "sch" } );
  224. }
  225. wxString EagleFilesWildcard()
  226. {
  227. return _( "Eagle XML files" ) + AddFileExtListToFilter( { "sch", "brd" } );
  228. }
  229. wxString OrCadPcb2NetlistFileWildcard()
  230. {
  231. return _( "OrcadPCB2 netlist files" )
  232. + AddFileExtListToFilter( { OrCadPcb2NetlistFileExtension } );
  233. }
  234. wxString NetlistFileWildcard()
  235. {
  236. return _( "KiCad netlist files" ) + AddFileExtListToFilter( { "net" } );
  237. }
  238. wxString GerberFileWildcard()
  239. {
  240. return _( "Gerber files" ) + AddFileExtListToFilter( { "pho" } );
  241. }
  242. wxString LegacyPcbFileWildcard()
  243. {
  244. return _( "KiCad printed circuit board files" ) + AddFileExtListToFilter( { "brd" } );
  245. }
  246. wxString EaglePcbFileWildcard()
  247. {
  248. return _( "Eagle ver. 6.x XML PCB files" ) + AddFileExtListToFilter( { "brd" } );
  249. }
  250. wxString CadstarPcbArchiveFileWildcard()
  251. {
  252. return _( "CADSTAR PCB Archive files" ) + AddFileExtListToFilter( { "cpa" } );
  253. }
  254. wxString PCadPcbFileWildcard()
  255. {
  256. return _( "P-Cad 200x ASCII PCB files" ) + AddFileExtListToFilter( { "pcb" } );
  257. }
  258. wxString AltiumDesignerPcbFileWildcard()
  259. {
  260. return _( "Altium Designer PCB files" ) + AddFileExtListToFilter( { "PcbDoc" } );
  261. }
  262. wxString AltiumCircuitStudioPcbFileWildcard()
  263. {
  264. return _( "Altium Circuit Studio PCB files" ) + AddFileExtListToFilter( { "CSPcbDoc" } );
  265. }
  266. wxString AltiumCircuitMakerPcbFileWildcard()
  267. {
  268. return _( "Altium Circuit Maker PCB files" ) + AddFileExtListToFilter( { "CMPcbDoc" } );
  269. }
  270. wxString FabmasterPcbFileWildcard()
  271. {
  272. return _( "Fabmaster PCB files" ) + AddFileExtListToFilter( { "txt", "fab" } );
  273. }
  274. wxString PcbFileWildcard()
  275. {
  276. return _( "KiCad printed circuit board files" ) +
  277. AddFileExtListToFilter( { KiCadPcbFileExtension } );
  278. }
  279. wxString KiCadFootprintLibFileWildcard()
  280. {
  281. return _( "KiCad footprint files" )
  282. + AddFileExtListToFilter( { KiCadFootprintFileExtension } );
  283. }
  284. wxString KiCadFootprintLibPathWildcard()
  285. {
  286. return _( "KiCad footprint library paths" )
  287. + AddFileExtListToFilter( { KiCadFootprintLibPathExtension } );
  288. }
  289. wxString LegacyFootprintLibPathWildcard()
  290. {
  291. return _( "Legacy footprint library files" ) + AddFileExtListToFilter( { "mod" } );
  292. }
  293. wxString AltiumFootprintLibPathWildcard()
  294. {
  295. return _( "Altium PCB footprint library files" ) + AddFileExtListToFilter( { "PcbLib" } );
  296. }
  297. wxString EagleFootprintLibPathWildcard()
  298. {
  299. return _( "Eagle ver. 6.x XML library files" ) + AddFileExtListToFilter( { "lbr" } );
  300. }
  301. wxString GedaPcbFootprintLibFileWildcard()
  302. {
  303. return _( "Geda PCB footprint library files" ) + AddFileExtListToFilter( { "fp" } );
  304. }
  305. wxString DrawingSheetFileWildcard()
  306. {
  307. return _( "Drawing sheet files" )
  308. + AddFileExtListToFilter( { DrawingSheetFileExtension } );
  309. }
  310. // Wildcard for cvpcb symbol to footprint link file
  311. wxString FootprintAssignmentFileWildcard()
  312. {
  313. return _( "KiCad symbol footprint link files" )
  314. + AddFileExtListToFilter( { FootprintAssignmentFileExtension } );
  315. }
  316. // Wildcard for reports and fabrication documents
  317. wxString DrillFileWildcard()
  318. {
  319. return _( "Drill files" )
  320. + AddFileExtListToFilter( { DrillFileExtension, "nc", "xnc", "txt" } );
  321. }
  322. wxString SVGFileWildcard()
  323. {
  324. return _( "SVG files" ) + AddFileExtListToFilter( { SVGFileExtension } );
  325. }
  326. wxString HtmlFileWildcard()
  327. {
  328. return _( "HTML files" ) + AddFileExtListToFilter( { "htm", "html" } );
  329. }
  330. wxString CsvFileWildcard()
  331. {
  332. return _( "CSV Files" ) + AddFileExtListToFilter( { CsvFileExtension } );
  333. }
  334. wxString PdfFileWildcard()
  335. {
  336. return _( "Portable document format files" ) + AddFileExtListToFilter( { "pdf" } );
  337. }
  338. wxString PSFileWildcard()
  339. {
  340. return _( "PostScript files" ) + AddFileExtListToFilter( { "ps" } );
  341. }
  342. wxString ReportFileWildcard()
  343. {
  344. return _( "Report files" ) + AddFileExtListToFilter( { "rpt" } );
  345. }
  346. wxString FootprintPlaceFileWildcard()
  347. {
  348. return _( "Component placement files" ) + AddFileExtListToFilter( { "pos" } );
  349. }
  350. wxString Shapes3DFileWildcard()
  351. {
  352. return _( "VRML and X3D files" ) + AddFileExtListToFilter( { "wrl", "x3d" } );
  353. }
  354. wxString IDF3DFileWildcard()
  355. {
  356. return _( "IDFv3 footprint files" ) + AddFileExtListToFilter( { "idf" } );
  357. }
  358. wxString TextFileWildcard()
  359. {
  360. return _( "Text files" ) + AddFileExtListToFilter( { "txt" } );
  361. }
  362. wxString ModLegacyExportFileWildcard()
  363. {
  364. return _( "Legacy footprint export files" ) + AddFileExtListToFilter( { "emp" } );
  365. }
  366. wxString ErcFileWildcard()
  367. {
  368. return _( "Electrical rule check file" ) + AddFileExtListToFilter( { "erc" } );
  369. }
  370. wxString SpiceLibraryFileWildcard()
  371. {
  372. return _( "Spice library file" ) + AddFileExtListToFilter( { "lib", "mod" } );
  373. }
  374. wxString SpiceNetlistFileWildcard()
  375. {
  376. return _( "SPICE netlist file" ) + AddFileExtListToFilter( { "cir" } );
  377. }
  378. wxString CadstarNetlistFileWildcard()
  379. {
  380. return _( "CadStar netlist file" ) + AddFileExtListToFilter( { "frp" } );
  381. }
  382. wxString EquFileWildcard()
  383. {
  384. return _( "Symbol footprint association files" ) + AddFileExtListToFilter( { "equ" } );
  385. }
  386. wxString ZipFileWildcard()
  387. {
  388. return _( "Zip file" ) + AddFileExtListToFilter( { "zip" } );
  389. }
  390. wxString GencadFileWildcard()
  391. {
  392. return _( "GenCAD 1.4 board files" ) + AddFileExtListToFilter( { "cad" } );
  393. }
  394. wxString DxfFileWildcard()
  395. {
  396. return _( "DXF Files" ) + AddFileExtListToFilter( { "dxf" } );
  397. }
  398. wxString GerberJobFileWildcard()
  399. {
  400. return _( "Gerber job file" ) + AddFileExtListToFilter( { GerberJobFileExtension } );
  401. }
  402. wxString SpecctraDsnFileWildcard()
  403. {
  404. return _( "Specctra DSN file" )
  405. + AddFileExtListToFilter( { SpecctraDsnFileExtension } );
  406. }
  407. wxString SpecctraSessionFileWildcard()
  408. {
  409. return _( "Specctra Session file" )
  410. + AddFileExtListToFilter( { SpecctraSessionFileExtension } );
  411. }
  412. wxString IpcD356FileWildcard()
  413. {
  414. return _( "IPC-D-356 Test Files" )
  415. + AddFileExtListToFilter( { IpcD356FileExtension } );
  416. }
  417. wxString WorkbookFileWildcard()
  418. {
  419. return _( "Workbook file" )
  420. + AddFileExtListToFilter( { WorkbookFileExtension } );
  421. }
  422. wxString PngFileWildcard()
  423. {
  424. return _( "PNG file" ) + AddFileExtListToFilter( { "png" } );
  425. }
  426. wxString JpegFileWildcard()
  427. {
  428. return _( "Jpeg file" ) + AddFileExtListToFilter( { "jpg", "jpeg" } );
  429. }
  430. wxString HotkeyFileWildcard()
  431. {
  432. return _( "Hotkey file" ) + AddFileExtListToFilter( { HotkeyFileExtension } );
  433. }