KiCad PCB EDA Suite
Loading...
Searching...
No Matches
bitmap2cmp_frame.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) 1992-2010 jean-pierre.charras
5 * Copyright (C) 1992-2023 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
25#include <bitmap2component.h>
26#include <bitmap2cmp_frame.h>
27#include <bitmap2cmp_panel.h>
28#include <bitmap2cmp_settings.h>
29#include <bitmap_io.h>
30#include <bitmaps.h>
31#include <common.h>
32#include <id.h>
33#include <kiface_base.h>
34#include <pgm_base.h>
35#include <widgets/wx_menubar.h>
37#include <file_history.h>
38#include <tool/tool_manager.h>
40#include <tool/common_control.h>
41#include <bitmap2cmp_control.h>
42#include <tool/actions.h>
43
44#include <wx/filedlg.h>
45#include <wx/msgdlg.h>
46
47
48#define DEFAULT_DPI 300 // the image DPI used in formats that do not define a DPI
49
51{
52 m_outputSize = 0.0;
55 m_unit = EDA_UNITS::MILLIMETRES;
56}
57
58
60{
61 // Safety-check to guarantee no divide-by-zero
62 m_originalDPI = std::max( 1, m_originalDPI );
63
64 // Set the m_outputSize value from the m_originalSizePixels and the selected unit
65 if( m_unit == EDA_UNITS::MILLIMETRES )
67 else if( m_unit == EDA_UNITS::INCHES )
69 else
71}
72
73
75{
76 int outputDPI;
77
78 if( m_unit == EDA_UNITS::MILLIMETRES )
79 outputDPI = GetOriginalSizePixels() / ( m_outputSize / 25.4 );
80 else if( m_unit == EDA_UNITS::INCHES )
81 outputDPI = GetOriginalSizePixels() / m_outputSize;
82 else
83 outputDPI = KiROUND( m_outputSize );
84
85 // Zero is not a DPI, and may cause divide-by-zero errors...
86 outputDPI = std::max( 1, outputDPI );
87
88 return outputDPI;
89}
90
91
93{
94 // Set the unit used for m_outputSize, and convert the old m_outputSize value
95 // to the value in new unit
96 if( aUnit == m_unit )
97 return;
98
99 // Convert m_outputSize to mm:
100 double size_mm;
101
102 if( m_unit == EDA_UNITS::MILLIMETRES )
103 {
104 size_mm = m_outputSize;
105 }
106 else if( m_unit == EDA_UNITS::INCHES )
107 {
108 size_mm = m_outputSize * 25.4;
109 }
110 else
111 {
112 // m_outputSize is the DPI, not an image size
113 // the image size is m_originalSizePixels / m_outputSize (in inches)
114 if( m_outputSize )
115 size_mm = m_originalSizePixels / m_outputSize * 25.4;
116 else
117 size_mm = 0;
118 }
119
120 // Convert m_outputSize to new value:
121 if( aUnit == EDA_UNITS::MILLIMETRES )
122 {
123 m_outputSize = size_mm;
124 }
125 else if( aUnit == EDA_UNITS::INCHES )
126 {
127 m_outputSize = size_mm / 25.4;
128 }
129 else
130 {
131 if( size_mm )
132 m_outputSize = m_originalSizePixels / size_mm * 25.4;
133 else
134 m_outputSize = 0;
135 }
136
137 m_unit = aUnit;
138}
139
140
141BEGIN_EVENT_TABLE( BITMAP2CMP_FRAME, EDA_BASE_FRAME )
142 EVT_MENU( wxID_CLOSE, BITMAP2CMP_FRAME::OnExit )
143 EVT_MENU( wxID_EXIT, BITMAP2CMP_FRAME::OnExit )
144
147END_EVENT_TABLE()
148
149
150BITMAP2CMP_FRAME::BITMAP2CMP_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
151 KIWAY_PLAYER( aKiway, aParent, FRAME_BM2CMP, _( "Image Converter" ), wxDefaultPosition,
152 wxDefaultSize, wxDEFAULT_FRAME_STYLE, wxT( "bitmap2cmp" ), unityScale ),
153 m_panel( nullptr ),
154 m_statusBar( nullptr )
155{
156 m_aboutTitle = _HKI( "KiCad Image Converter" );
157
158 // Give an icon
159 wxIcon icon;
160 wxIconBundle icon_bundle;
161
162 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_bitmap2component, 48 ) );
163 icon_bundle.AddIcon( icon );
164 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_bitmap2component, 128 ) );
165 icon_bundle.AddIcon( icon );
166 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_bitmap2component, 256 ) );
167 icon_bundle.AddIcon( icon );
168 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_bitmap2component_32 ) );
169 icon_bundle.AddIcon( icon );
170 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_bitmap2component_16 ) );
171 icon_bundle.AddIcon( icon );
172
173 SetIcons( icon_bundle );
174
175 wxBoxSizer* mainSizer = new wxBoxSizer( wxVERTICAL );
176 SetSizer( mainSizer );
177
178 m_panel = new BITMAP2CMP_PANEL( this );
179 mainSizer->Add( m_panel, 1, wxEXPAND, 5 );
180
181 m_statusBar = this->CreateStatusBar( 1, wxSTB_SIZEGRIP, wxID_ANY );
182
183 LoadSettings( config() );
184
185 m_toolManager = new TOOL_MANAGER;
186 m_toolManager->SetEnvironment( nullptr, nullptr, nullptr, config(), this );
187
188 m_toolDispatcher = new TOOL_DISPATCHER( m_toolManager );
189
190 // Register tools
191 m_toolManager->RegisterTool( new COMMON_CONTROL );
192 m_toolManager->RegisterTool( new BITMAP2CMP_CONTROL );
193 m_toolManager->InitTools();
194
195 ReCreateMenuBar();
196
197 GetSizer()->SetSizeHints( this );
198
199 SetSize( m_framePos.x, m_framePos.y, m_frameSize.x, m_frameSize.y );
200
201 if ( m_framePos == wxDefaultPosition )
202 Centre();
203}
204
205
207{
208 SaveSettings( config() );
209 /*
210 * This needed for OSX: avoids further OnDraw processing after this
211 * destructor and before the native window is destroyed
212 */
213 Freeze();
214}
215
216
217void BITMAP2CMP_FRAME::OnExit( wxCommandEvent& aEvent )
218{
219 // Just generate a wxCloseEvent
220 Close( false );
221}
222
223
225{
226 return m_panel->GetCurrentPage();
227}
228
229
230void BITMAP2CMP_FRAME::OnFileHistory( wxCommandEvent& event )
231{
232 wxString fn = GetFileFromHistory( event.GetId(), _( "Image files" ) );
233
234 if( !fn.IsEmpty() )
235 {
236 OpenProjectFiles( std::vector<wxString>( 1, fn ) );
237 Refresh();
238 }
239}
240
241
242void BITMAP2CMP_FRAME::OnClearFileHistory( wxCommandEvent& aEvent )
243{
245}
246
247
249{
251 EDA_BASE_FRAME* base_frame = dynamic_cast<EDA_BASE_FRAME*>( this );
252
253 // base_frame == nullptr should not happen, but it makes Coverity happy
254 wxCHECK( base_frame, /* void */ );
255
256 // wxWidgets handles the OSX Application menu behind the scenes, but that means
257 // we always have to start from scratch with a new wxMenuBar.
258 wxMenuBar* oldMenuBar = base_frame->GetMenuBar();
259 WX_MENUBAR* menuBar = new WX_MENUBAR();
260
261 //-- File menu -----------------------------------------------------------
262 //
263 ACTION_MENU* fileMenu = new ACTION_MENU( false, tool );
264
265 fileMenu->Add( ACTIONS::open );
266
267 static ACTION_MENU* openRecentMenu;
268 FILE_HISTORY& fileHistory = GetFileHistory();
269
270 // Create the menu if it does not exist. Adding a file to/from the history
271 // will automatically refresh the menu.
272 if( !openRecentMenu )
273 {
274 openRecentMenu = new ACTION_MENU( false, tool );
275 openRecentMenu->SetIcon( BITMAPS::recent );
276
277 fileHistory.UseMenu( openRecentMenu );
278 fileHistory.AddFilesToMenu();
279 }
280
281 // Ensure the title is up to date after changing language
282 openRecentMenu->SetTitle( _( "Open Recent" ) );
283 fileHistory.UpdateClearText( openRecentMenu, _( "Clear Recent Files" ) );
284
285 wxMenuItem* item = fileMenu->Add( openRecentMenu->Clone() );
286
287 // Add the file menu condition here since it needs the item ID for the submenu
289 cond.Enable( FILE_HISTORY::FileHistoryNotEmpty( fileHistory ) );
290 RegisterUIUpdateHandler( item->GetId(), cond );
291
292 fileMenu->AppendSeparator();
293 fileMenu->AddQuit( _( "Image Converter" ) );
294
295 //-- Preferences menu -----------------------------------------------
296 //
297 ACTION_MENU* prefsMenu = new ACTION_MENU( false, tool );
298
299 prefsMenu->Add( ACTIONS::openPreferences );
300
301 prefsMenu->AppendSeparator();
302 AddMenuLanguageList( prefsMenu, tool );
303
304
305 //-- Menubar -------------------------------------------------------------
306 //
307 menuBar->Append( fileMenu, _( "&File" ) );
308 menuBar->Append( prefsMenu, _( "&Preferences" ) );
309 base_frame->AddStandardHelpMenu( menuBar );
310
311 base_frame->SetMenuBar( menuBar );
312 delete oldMenuBar;
313}
314
315
317{
319
320 UpdateTitle();
321
322 SaveSettings( config() );
323 IMAGE_SIZE imageSizeX = m_panel->GetOutputSizeX();
324 IMAGE_SIZE imageSizeY = m_panel->GetOutputSizeY();
325 Freeze();
326
327 wxSizer* mainSizer = m_panel->GetContainingSizer();
328 mainSizer->Detach( m_panel );
329 m_panel->Destroy();
330
331 m_panel = new BITMAP2CMP_PANEL( this );
332 mainSizer->Add( m_panel, 1, wxEXPAND, 5 );
333 Layout();
334
335 if( !m_bitmapFileName.IsEmpty() )
336 OpenProjectFiles( std::vector<wxString>( 1, m_bitmapFileName ) );
337
338 LoadSettings( config() );
339 m_panel->SetOutputSize( imageSizeX, imageSizeY );
340
341 Thaw();
342 Refresh();
343}
344
345
347{
348 wxString title;
349
350 if( !m_bitmapFileName.IsEmpty() )
351 {
352 wxFileName filename( m_bitmapFileName );
353 title = filename.GetFullName() + wxT( " \u2014 " );
354 }
355
356 title += _( "Image Converter" );
357
358 SetTitle( title );
359}
360
361
363{
365
366 BITMAP2CMP_SETTINGS* cfg = dynamic_cast<BITMAP2CMP_SETTINGS*>( aCfg );
367
368 if( cfg )
369 {
372 m_panel->LoadSettings( cfg );
373 }
374}
375
376
378{
380
381 BITMAP2CMP_SETTINGS* cfg = dynamic_cast<BITMAP2CMP_SETTINGS*>( aCfg );
382
383 if( cfg )
384 {
387 m_panel->SaveSettings( cfg );
388 }
389}
390
391
393{
394 wxFileName fn( m_bitmapFileName );
395 wxString path = fn.GetPath();
396
397 if( path.IsEmpty() || !wxDirExists( path ) )
398 path = m_mruPath;
399
400 wxFileDialog fileDlg( this, _( "Choose Image" ), path, wxEmptyString,
401 _( "Image Files" ) + wxS( " " )+ wxImage::GetImageExtWildcard(),
402 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
403
404 int diag = fileDlg.ShowModal();
405
406 if( diag != wxID_OK )
407 return;
408
409 wxString fullFilename = fileDlg.GetPath();
410
411 if( !OpenProjectFiles( std::vector<wxString>( 1, fullFilename ) ) )
412 return;
413
414 fn = fullFilename;
415 m_mruPath = fn.GetPath();
416 SetStatusText( fullFilename );
417 UpdateTitle();
418 Refresh();
419}
420
421
422bool BITMAP2CMP_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, int aCtl )
423{
424 m_bitmapFileName = aFileSet[0];
425
426 if( m_panel->OpenProjectFiles( aFileSet, aCtl ) )
427 {
429 return true;
430 }
431
432 return false;
433}
434
435
437{
438 wxFileName fn( m_convertedFileName );
439 wxString path = fn.GetPath();
440
441 if( path.IsEmpty() || !wxDirExists(path) )
442 path = ::wxGetCwd();
443
444 wxFileDialog fileDlg( this, _( "Create Drawing Sheet File" ), path, wxEmptyString,
445 FILEEXT::DrawingSheetFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
446 int diag = fileDlg.ShowModal();
447
448 if( diag != wxID_OK )
449 return;
450
451 fn = fileDlg.GetPath();
453 m_convertedFileName = fn.GetFullPath();
454
455 FILE* outfile;
456 outfile = wxFopen( m_convertedFileName, wxT( "w" ) );
457
458 if( outfile == nullptr )
459 {
460 wxString msg;
461 msg.Printf( _( "File '%s' could not be created." ), m_convertedFileName );
462 wxMessageBox( msg );
463 return;
464 }
465
466 std::string buffer;
468 fputs( buffer.c_str(), outfile );
469 fclose( outfile );
470}
471
472
474{
475 wxFileName fn( m_convertedFileName );
476 wxString path = fn.GetPath();
477
478 if( path.IsEmpty() || !wxDirExists( path ) )
479 path = ::wxGetCwd();
480
481 wxFileDialog fileDlg( this, _( "Create PostScript File" ), path, wxEmptyString,
482 FILEEXT::PSFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
483
484 if( fileDlg.ShowModal() != wxID_OK )
485 return;
486
487 fn = fileDlg.GetPath();
488 fn.SetExt( wxT( "ps" ) );
489 m_convertedFileName = fn.GetFullPath();
490
491 FILE* outfile;
492 outfile = wxFopen( m_convertedFileName, wxT( "w" ) );
493
494 if( outfile == nullptr )
495 {
496 wxString msg;
497 msg.Printf( _( "File '%s' could not be created." ), m_convertedFileName );
498 wxMessageBox( msg );
499 return;
500 }
501
502 std::string buffer;
504 fputs( buffer.c_str(), outfile );
505 fclose( outfile );
506}
507
508
510{
511 wxFileName fn( m_convertedFileName );
512 wxString path = fn.GetPath();
513
514 if( path.IsEmpty() || !wxDirExists(path) )
515 path = ::wxGetCwd();
516
517 wxFileDialog fileDlg( this, _( "Create Symbol Library" ), path, wxEmptyString,
519 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
520
521 if( fileDlg.ShowModal() != wxID_OK )
522 return;
523
525 m_convertedFileName = fn.GetFullPath();
526
527 FILE* outfile = wxFopen( m_convertedFileName, wxT( "w" ) );
528
529 if( outfile == nullptr )
530 {
531 wxString msg;
532 msg.Printf( _( "File '%s' could not be created." ), m_convertedFileName );
533 wxMessageBox( msg );
534 return;
535 }
536
537 std::string buffer;
539 fputs( buffer.c_str(), outfile );
540 fclose( outfile );
541}
542
543
545{
546 wxFileName fn( m_convertedFileName );
547 wxString path = fn.GetPath();
548
549 if( path.IsEmpty() || !wxDirExists( path ) )
550 path = m_mruPath;
551
552 wxFileDialog fileDlg( this, _( "Create Footprint Library" ), path, wxEmptyString,
554 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
555
556 if( fileDlg.ShowModal() != wxID_OK )
557 return;
558
560 m_convertedFileName = fn.GetFullPath();
561
562 FILE* outfile = wxFopen( m_convertedFileName, wxT( "w" ) );
563
564 if( outfile == nullptr )
565 {
566 wxString msg;
567 msg.Printf( _( "File '%s' could not be created." ), m_convertedFileName );
568 wxMessageBox( msg );
569 return;
570 }
571
572 std::string buffer;
574 fputs( buffer.c_str(), outfile );
575 fclose( outfile );
576 m_mruPath = fn.GetPath();
577}
578
579
constexpr EDA_IU_SCALE unityScale
Definition: base_units.h:111
#define DEFAULT_DPI
@ KICAD_WKS_LOGO
@ PCBNEW_KICAD_MOD
@ POSTSCRIPT_FMT
@ EESCHEMA_FMT
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
Definition: bitmap.cpp:104
@ icon_bitmap2component
@ icon_bitmap2component_32
@ icon_bitmap2component_16
static TOOL_ACTION openPreferences
Definition: actions.h:211
static TOOL_ACTION open
Definition: actions.h:50
Defines the structure of a menu based on ACTIONs.
Definition: action_menu.h:49
void AddQuit(const wxString &aAppname="")
Add a standard Quit item to the menu.
ACTION_MENU * Clone() const
Create a deep, recursive copy of this ACTION_MENU.
void SetTitle(const wxString &aTitle) override
Set title for the menu.
Definition: action_menu.cpp:92
void SetIcon(BITMAPS aIcon)
Assign an icon for the entry.
Definition: action_menu.cpp:78
wxMenuItem * Add(const wxString &aLabel, int aId, BITMAPS aIcon)
Add a wxWidgets-style entry to the menu.
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
Definition: app_settings.h:92
Handle actions for the various symbol editor and viewers.
void ExportPcbnewFormat()
Generate a footprint in S expr format.
void ExportDrawingSheetFormat()
Generate a file suitable to be copied into a drawing sheet (.kicad_wks) file.
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
void ExportEeschemaFormat()
Generate a schematic library which contains one component: the logo.
void OnExit(wxCommandEvent &aEvent)
Event handler for the wxID_EXIT and wxID_CLOSE events.
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
void OnFileHistory(wxCommandEvent &event)
wxString m_convertedFileName
void doReCreateMenuBar() override
wxString m_bitmapFileName
wxWindow * GetToolCanvas() const override
Canvas access.
void ExportPostScriptFormat()
Generate a postscript file.
BITMAP2CMP_PANEL * m_panel
bool OpenProjectFiles(const std::vector< wxString > &aFilenames, int aCtl=0) override
Open a project or set of files given by aFileList.
void OnClearFileHistory(wxCommandEvent &event)
void ShowChangedLanguage() override
void SetOutputSize(const IMAGE_SIZE &aSizeX, const IMAGE_SIZE &aSizeY)
void LoadSettings(BITMAP2CMP_SETTINGS *aCfg)
IMAGE_SIZE GetOutputSizeX() const
bool OpenProjectFiles(const std::vector< wxString > &aFilenames, int aCtl=0)
wxWindow * GetCurrentPage()
void SaveSettings(BITMAP2CMP_SETTINGS *aCfg)
IMAGE_SIZE GetOutputSizeY() const
void ExportToBuffer(std::string &aOutput, OUTPUT_FMT_ID aFormat)
generate a export data of the current bitmap.
Handle actions that are shared between different applications.
The base frame for deriving all KiCad main window classes.
virtual APP_SETTINGS_BASE * config() const
Returns the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
void ShowChangedLanguage() override
Redraw the menus and what not in current language.
void AddMenuLanguageList(ACTION_MENU *aMasterMenu, TOOL_INTERACTIVE *aControlTool)
Function AddMenuLanguageList creates a menu list for language choice, and add it as submenu to Master...
void UpdateFileHistory(const wxString &FullFileName, FILE_HISTORY *aFileHistory=nullptr)
Update the list of recently opened files.
void ClearFileHistory(FILE_HISTORY *aFileHistory=nullptr)
Removes all files from the file history.
virtual void LoadSettings(APP_SETTINGS_BASE *aCfg)
Load common frame parameters from a configuration file.
FILE_HISTORY & GetFileHistory()
Get the frame's main file history.
wxString GetFileFromHistory(int cmdId, const wxString &type, FILE_HISTORY *aFileHistory=nullptr)
Fetches the file name from the file history list.
virtual void SaveSettings(APP_SETTINGS_BASE *aCfg)
Save common frame parameters to a configuration data file.
virtual void RegisterUIUpdateHandler(int aID, const ACTION_CONDITIONS &aConditions) override
Register a UI update handler for the control with ID aID.
wxString m_mruPath
This class implements a file history object to store a list of files, that can then be added to a men...
Definition: file_history.h:43
static SELECTION_CONDITION FileHistoryNotEmpty(const FILE_HISTORY &aHistory)
Create a SELECTION_CONDITION that can be used to enable a menu item when the file history has items i...
void UpdateClearText(wxMenu *aMenu, wxString aClearText)
Update the text displayed on the menu item that clears the entire menu.
void AddFilesToMenu() override
Add the files to all registered menus.
Definition: file_history.h:98
void SetUnit(EDA_UNITS aUnit)
double m_outputSize
EDA_UNITS m_unit
int GetOriginalSizePixels()
int m_originalSizePixels
void SetOutputSizeFromInitialImageSize()
A wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of a KiCad project.
Definition: kiway_player.h:67
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition: kiway.h:279
TOOL_MANAGER * m_toolManager
Definition: tools_holder.h:167
Master controller class:
Definition: tool_manager.h:57
void SetEnvironment(EDA_ITEM *aModel, KIGFX::VIEW *aView, KIGFX::VIEW_CONTROLS *aViewControls, APP_SETTINGS_BASE *aSettings, TOOLS_HOLDER *aFrame)
Set the work environment (model, view, view controls and the parent window).
Wrapper around a wxMenuBar object that prevents the accelerator table from being used.
Definition: wx_menubar.h:47
wxString EnsureFileExtension(const wxString &aFilename, const wxString &aExtension)
It's annoying to throw up nag dialogs when the extension isn't right.
Definition: common.cpp:415
The common library.
#define _HKI(x)
#define _(s)
EDA_UNITS
Definition: eda_units.h:46
EVT_MENU_RANGE(ID_GERBVIEW_DRILL_FILE1, ID_GERBVIEW_DRILL_FILEMAX, GERBVIEW_FRAME::OnDrlFileHistory) EVT_MENU_RANGE(ID_GERBVIEW_ZIP_FILE1
@ FRAME_BM2CMP
Definition: frame_type.h:61
static const std::string KiCadSymbolLibFileExtension
static const std::string DrawingSheetFileExtension
static const std::string KiCadFootprintFileExtension
static wxString KiCadSymbolLibFileWildcard()
static wxString KiCadFootprintLibFileWildcard()
static wxString PSFileWildcard()
static wxString DrawingSheetFileWildcard()
@ ID_FILE_LIST_CLEAR
Definition: id.h:87
@ ID_FILEMAX
Definition: id.h:85
@ ID_FILE1
Definition: id.h:84
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
see class PGM_BASE
Functors that can be used to figure out how the action controls should be displayed in the UI and if ...
ACTION_CONDITIONS & Enable(const SELECTION_CONDITION &aCondition)
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:118
Definition of file extensions used in Kicad.