KiCad PCB EDA Suite
gerbview_control.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) 2017 Jon Evans <[email protected]>
5 * Copyright (C) 2017-2022 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software: you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation, either version 3 of the License, or (at your
10 * option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21#include <confirm.h>
23#include <export_to_pcbnew.h>
24#include <gerber_file_image.h>
26#include <gerbview_painter.h>
27#include <gerbview_frame.h>
28#include <gerbview_settings.h>
29#include <string_utils.h>
30#include <excellon_image.h>
31#include <menus_helpers.h>
32#include <tool/tool_manager.h>
33#include <project.h>
34#include <view/view.h>
36#include <wx/filedlg.h>
37
38#include "gerbview_actions.h"
39#include "gerbview_control.h"
41
42
43GERBVIEW_CONTROL::GERBVIEW_CONTROL() : TOOL_INTERACTIVE( "gerbview.Control" ), m_frame( nullptr )
44{
45}
46
47
49{
50 m_frame = getEditFrame<GERBVIEW_FRAME>();
51}
52
53
55{
56 m_frame->LoadAutodetectedFiles( wxEmptyString );
57
58 return 0;
59}
60
61
63{
64 m_frame->LoadGerberFiles( wxEmptyString );
65
66 return 0;
67}
68
69
71{
72 m_frame->LoadExcellonFiles( wxEmptyString );
73
74 return 0;
75}
76
77
79{
80 m_frame->LoadGerberJobFile( wxEmptyString );
81 canvas()->Refresh();
82
83 return 0;
84}
85
86
88{
89 m_frame->LoadZipArchiveFile( wxEmptyString );
90 canvas()->Refresh();
91
92 return 0;
93}
94
95
97{
99
100 return 0;
101}
102
103
105{
106 int layercount = 0;
107
109
110 // Count the Gerber layers which are actually currently used
111 for( int ii = 0; ii < (int) images->ImagesMaxCount(); ++ii )
112 {
113 if( images->GetGbrImage( ii ) )
114 layercount++;
115 }
116
117 if( layercount == 0 )
118 {
119 DisplayInfoMessage( m_frame, _( "None of the Gerber layers contain any data" ) );
120 return 0;
121 }
122
123 wxString fileDialogName( NAMELESS_PROJECT + wxT( "." ) + KiCadPcbFileExtension );
124 wxString path = m_frame->GetMruPath();
125
126 wxFileDialog filedlg( m_frame, _( "Board File Name" ), path, fileDialogName, PcbFileWildcard(),
127 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
128
129 if( filedlg.ShowModal() == wxID_CANCEL )
130 return 0;
131
132 wxFileName fileName = filedlg.GetPath();
133
134 /* Install a dialog frame to choose the mapping
135 * between gerber layers and Pcbnew layers
136 */
138 int ok = layerdlg->ShowModal();
139 layerdlg->Destroy();
140
141 if( ok != wxID_OK )
142 return 0;
143
144 // If no extension was entered, then force the extension to be a KiCad PCB file
145 if( !fileName.HasExt() )
146 fileName.SetExt( KiCadPcbFileExtension );
147
148 m_frame->SetMruPath( fileName.GetPath() );
149
150 GBR_TO_PCB_EXPORTER gbr_exporter( m_frame, fileName.GetFullPath() );
151
152 gbr_exporter.ExportPcb( layerdlg->GetLayersLookUpTable(), layerdlg->GetCopperLayersCount() );
153
154 return 0;
155}
156
157
159{
160 auto settings = static_cast<KIGFX::GERBVIEW_PAINTER*>( getView()->GetPainter() )->GetSettings();
161 const auto& selection = m_toolMgr->GetTool<GERBVIEW_SELECTION_TOOL>()->GetSelection();
162 GERBER_DRAW_ITEM* item = nullptr;
163
164 if( selection.Size() == 1 )
165 {
166 item = static_cast<GERBER_DRAW_ITEM*>( selection[0] );
167 }
168
170 {
171 m_frame->m_SelComponentBox->SetSelection( 0 );
172 m_frame->m_SelNetnameBox->SetSelection( 0 );
173 m_frame->m_SelAperAttributesBox->SetSelection( 0 );
174
175 settings->ClearHighlightSelections();
176
178
179 if( gerber )
180 gerber->m_Selected_Tool = settings->m_dcodeHighlightValue;
181 }
182 else if( item && aEvent.IsAction( &GERBVIEW_ACTIONS::highlightNet ) )
183 {
184 wxString net_name = item->GetNetAttributes().m_Netname;
185 settings->m_netHighlightString = net_name;
186 m_frame->m_SelNetnameBox->SetStringSelection( UnescapeString( net_name ) );
187 }
188 else if( item && aEvent.IsAction( &GERBVIEW_ACTIONS::highlightComponent ) )
189 {
190 wxString net_attr = item->GetNetAttributes().m_Cmpref;
191 settings->m_componentHighlightString = net_attr;
192 m_frame->m_SelComponentBox->SetStringSelection( net_attr );
193 }
194 else if( item && aEvent.IsAction( &GERBVIEW_ACTIONS::highlightAttribute ) )
195 {
196 D_CODE* apertDescr = item->GetDcodeDescr();
197
198 if( apertDescr )
199 {
200 wxString ap_name = apertDescr->m_AperFunction;
201 settings->m_attributeHighlightString = ap_name;
202 m_frame->m_SelAperAttributesBox->SetStringSelection( ap_name );
203 }
204 }
205 else if( item && aEvent.IsAction( &GERBVIEW_ACTIONS::highlightDCode ) )
206 {
207 D_CODE* apertDescr = item->GetDcodeDescr();
208
209 if( apertDescr )
210 {
211 int dcodeSelected = -1;
213
214 if( gerber )
215 dcodeSelected = apertDescr->m_Num_Dcode;
216
217 if( dcodeSelected > 0 )
218 {
219 settings->m_dcodeHighlightValue = dcodeSelected;
220 gerber->m_Selected_Tool = dcodeSelected;
221 m_frame->syncLayerBox( false );
222 }
223 }
224 }
225
227 canvas()->Refresh();
228
229 return 0;
230}
231
232
234{
236 KIGFX::VIEW* view = m_frame->GetCanvas()->GetView();
237
239 {
241
243 []( KIGFX::VIEW_ITEM* aItem )
244 {
245 GERBER_DRAW_ITEM* item = static_cast<GERBER_DRAW_ITEM*>( aItem );
246
247 switch( item->m_Shape )
248 {
249 case GBR_CIRCLE:
250 case GBR_ARC:
251 case GBR_SEGMENT:
252 return true;
253
254 default:
255 return false;
256 }
257 } );
258 }
260 {
262
264 []( KIGFX::VIEW_ITEM* aItem )
265 {
266 GERBER_DRAW_ITEM* item = static_cast<GERBER_DRAW_ITEM*>( aItem );
267
268 switch( item->m_Shape )
269 {
270 case GBR_SPOT_CIRCLE:
271 case GBR_SPOT_RECT:
272 case GBR_SPOT_OVAL:
273 case GBR_SPOT_POLY:
274 case GBR_SPOT_MACRO:
275 return true;
276
277 default:
278 return false;
279 }
280 } );
281 }
283 {
285
287 []( KIGFX::VIEW_ITEM* aItem )
288 {
289 GERBER_DRAW_ITEM* item = static_cast<GERBER_DRAW_ITEM*>( aItem );
290
291 return ( item->m_Shape == GBR_POLYGON );
292 } );
293 }
295 {
297 }
298 else if( aEvent.IsAction( &GERBVIEW_ACTIONS::dcodeDisplay ) )
299 {
301 }
302 else if( aEvent.IsAction( &ACTIONS::highContrastMode )
304 {
306 }
307 else if( aEvent.IsAction( &GERBVIEW_ACTIONS::toggleDiffMode ) )
308 {
310
311 if( cfg->m_Display.m_DiffMode && cfg->m_Display.m_XORMode )
312 {
313 cfg->m_Display.m_XORMode = false;
315 }
316 }
317 else if( aEvent.IsAction( &GERBVIEW_ACTIONS::toggleXORMode ) )
318 {
320
321 if( cfg->m_Display.m_XORMode && cfg->m_Display.m_DiffMode )
322 cfg->m_Display.m_DiffMode = false;
323
325 }
326 else if( aEvent.IsAction( &GERBVIEW_ACTIONS::flipGerberView ) )
327 {
329 view->SetMirror( cfg->m_Display.m_FlipGerberView, false );
330 }
331
333
336
337 return 0;
338}
339
340
342{
343 int layer = m_frame->GetActiveLayer();
344
345 if( layer < ( (int) GERBER_FILE_IMAGE_LIST::GetImagesList().GetLoadedImageCount() - 1 ) )
346 m_frame->SetActiveLayer( layer + 1, true );
347
348 return 0;
349}
350
351
353{
354 int layer = m_frame->GetActiveLayer();
355
356 if( layer > 0 )
357 m_frame->SetActiveLayer( layer - 1, true );
358
359 return 0;
360}
361
362
364{
365 int layer = m_frame->GetActiveLayer();
366
367 if( layer > 0 )
368 {
370 GERBER_FILE_IMAGE_LIST::GetImagesList().SwapImages( layer, layer - 1 ) );
371 m_frame->SetActiveLayer( layer - 1 );
372 }
373
374 return 0;
375}
376
377
379{
380 int layer = m_frame->GetActiveLayer();
382
383 if( layer < ( (int) list.GetLoadedImageCount() - 1 ) )
384 {
385 m_frame->RemapLayers( list.SwapImages( layer, layer + 1 ) );
386 m_frame->SetActiveLayer( layer + 1 );
387 }
388
389 return 0;
390}
391
392
394{
397
398 return 0;
399}
400
401
403{
404 m_frame->Clear_DrawLayers( false );
406 canvas()->Refresh();
408
409 // Clear pending highlight selections, now outdated
411 static_cast<KIGFX::GERBVIEW_PAINTER*>( getView()->GetPainter() )->GetSettings();
412 settings->ClearHighlightSelections();
413
414 return 0;
415}
416
417
419{
420 // Store filenames
421 wxArrayString listOfGerberFiles;
422 std::vector<int> fileType;
424
425 for( unsigned i = 0; i < list->ImagesMaxCount(); i++ )
426 {
427 if( list->GetGbrImage( i ) == nullptr )
428 continue;
429
430 if( !list->GetGbrImage( i )->m_InUse )
431 continue;
432
433 EXCELLON_IMAGE* drill_file = dynamic_cast<EXCELLON_IMAGE*>( list->GetGbrImage( i ) );
434
435 if( drill_file )
436 fileType.push_back( 1 );
437 else
438 fileType.push_back( 0 );
439
440 listOfGerberFiles.Add( list->GetGbrImage( i )->m_FileName );
441 }
442
443 // Clear all layers
444 m_frame->Clear_DrawLayers( false );
446
447 // Load the layers from stored paths
448 wxBusyCursor wait;
449 m_frame->LoadListOfGerberAndDrillFiles( wxEmptyString, listOfGerberFiles, &fileType );
450
451 return 0;
452}
453
454
456{
458 GERBVIEW_SELECTION& selection = selTool->GetSelection();
459
460 if( selection.GetSize() == 1 )
461 {
462 EDA_ITEM* item = (EDA_ITEM*) selection.Front();
463
464 std::vector<MSG_PANEL_ITEM> msgItems;
465 item->GetMsgPanelInfo( m_frame, msgItems );
466 m_frame->SetMsgPanel( msgItems );
467 }
468 else
469 {
471 }
472
473 return 0;
474}
475
476
478{
479 m_frame->LoadZipArchiveFile( *aEvent.Parameter<wxString*>() );
480 canvas()->Refresh();
481
482 return 0;
483}
484
485
487{
488 // The event parameter is a string containing names of dropped files.
489 // Each file name has been enclosed with "", so file names with space character are allowed.
490 wxString files = *aEvent.Parameter<wxString*>();
491 // ie : files = "file1""another file""file3"...
492
493 std::vector<wxString> aFileNameList;
494
495 // Isolate each file name, deletting ""
496 files = files.AfterFirst( '"' );
497
498 // Gerber files are enclosed with "".
499 // Load files names in array.
500 while( !files.empty() )
501 {
502 wxString fileName = files.BeforeFirst( '"' );
503 // Check if file exists. If not, keep on and ignore fileName
504 if( wxFileName( fileName ).Exists() )
505 aFileNameList.push_back( fileName );
506 files = files.AfterFirst( '"' );
507 files = files.AfterFirst( '"' );
508 }
509
510 if( !aFileNameList.empty() )
511 m_frame->OpenProjectFiles( aFileNameList, KICTL_CREATE );
512
513 return 0;
514}
515
516
518{
527
533
541
552
557
560}
static TOOL_ACTION updateUnits
Definition: actions.h:150
static TOOL_ACTION highContrastModeCycle
Definition: actions.h:106
static TOOL_ACTION highContrastMode
Definition: actions.h:105
static TOOL_ACTION zoomFitScreen
Definition: actions.h:98
static TOOL_ACTION print
Definition: actions.h:57
A gerber DCODE (also called Aperture) definition.
Definition: dcode.h:80
wxString m_AperFunction
the aperture attribute (created by a TA.AperFunction command).
Definition: dcode.h:201
int m_Num_Dcode
D code value ( >= 10 )
Definition: dcode.h:191
wxString GetMruPath() const
void SetMruPath(const wxString &aPath)
virtual void ClearMsgPanel()
Clear all messages from the message panel.
void SetMsgPanel(const std::vector< MSG_PANEL_ITEM > &aList)
Clear the message panel and populates it with the contents of aList.
virtual EDA_DRAW_PANEL_GAL * GetCanvas() const
Return a pointer to GAL-based canvas of given EDA draw frame.
virtual KIGFX::VIEW * GetView() const
Return a pointer to the #VIEW instance used in the panel.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
Update the board display after modifying it by a python script (note: it is automatically called by a...
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:85
virtual void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList)
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
Definition: eda_item.h:211
static const TOOL_EVENT ClearedEvent
Definition: actions.h:208
static const TOOL_EVENT SelectedEvent
Definition: actions.h:206
static const TOOL_EVENT UnselectedEvent
Definition: actions.h:207
Handle a drill image.
bool m_DisplayFlashedItemsFill
Option to draw flashed items (filled/sketch)
bool m_HighContrastMode
High contrast mode (dim un-highlighted objects)
bool m_DiffMode
Display layers in diff mode.
bool m_XORMode
Display layers in exclusive-or mode.
bool m_FlipGerberView
Display as a mirror image.
bool m_DisplayPolygonsFill
Option to draw polygons (filled/sketch)
bool m_DisplayLinesFill
Option to draw line items (filled/sketch)
GERBER_FILE_IMAGE_LIST * GetImagesList() const
Definition: gbr_layout.cpp:41
wxString m_Cmpref
the component reference parent of the data
wxString m_Netname
for items associated to a net: the netname
A helper class to export a Gerber set of files to Pcbnew.
bool ExportPcb(const int *aLayerLookUpTable, int aCopperLayers)
Save a board from a set of Gerber images.
D_CODE * GetDcodeDescr() const
Return the GetDcodeDescr of this object, or NULL.
const GBR_NETLIST_METADATA & GetNetAttributes() const
GERBER_FILE_IMAGE_LIST is a helper class to handle a list of GERBER_FILE_IMAGE files which are loaded...
std::unordered_map< int, int > SwapImages(unsigned int layer1, unsigned int layer2)
Swap two images and their orders.
unsigned GetLoadedImageCount()
Get number of loaded images.
static GERBER_FILE_IMAGE_LIST & GetImagesList()
GERBER_FILE_IMAGE * GetGbrImage(int aIdx)
Hold the image data and parameters for one gerber file and layer parameters.
wxString m_FileName
Full File Name for this layer.
bool m_InUse
true if this image is currently in use (a file is loaded in it) false if it must be not drawn
static TOOL_ACTION dcodeDisplay
static TOOL_ACTION negativeObjectDisplay
static TOOL_ACTION flashedDisplayOutlines
static TOOL_ACTION highlightAttribute
static TOOL_ACTION exportToPcbnew
static TOOL_ACTION highlightNet
static TOOL_ACTION toggleXORMode
static TOOL_ACTION loadZipFile
static TOOL_ACTION toggleLayerManager
static TOOL_ACTION openGerber
static TOOL_ACTION toggleDiffMode
static TOOL_ACTION clearAllLayers
static TOOL_ACTION layerNext
static TOOL_ACTION flipGerberView
static TOOL_ACTION openAutodetected
static TOOL_ACTION reloadAllLayers
static TOOL_ACTION linesDisplayOutlines
static TOOL_ACTION layerPrev
static TOOL_ACTION openDrillFile
static TOOL_ACTION polygonsDisplayOutlines
static TOOL_ACTION highlightComponent
static TOOL_ACTION openZipFile
static TOOL_ACTION highlightDCode
static TOOL_ACTION moveLayerUp
static TOOL_ACTION moveLayerDown
static TOOL_ACTION loadGerbFiles
static TOOL_ACTION openJobFile
static TOOL_ACTION clearLayer
static TOOL_ACTION highlightClear
EDA_DRAW_PANEL_GAL * canvas()
int OpenDrillFile(const TOOL_EVENT &aEvent)
int OpenAutodetected(const TOOL_EVENT &aEvent)
int LayerNext(const TOOL_EVENT &aEvent)
int HighlightControl(const TOOL_EVENT &aEvent)
void Reset(RESET_REASON aReason) override
Bring the tool to a known, initial state.
int MoveLayerDown(const TOOL_EVENT &aEvent)
int ClearLayer(const TOOL_EVENT &aEvent)
int LayerPrev(const TOOL_EVENT &aEvent)
void setTransitions() override
This method is meant to be overridden in order to specify handlers for events.
int ReloadAllLayers(const TOOL_EVENT &aEvent)
GERBVIEW_FRAME * m_frame
int ToggleLayerManager(const TOOL_EVENT &aEvent)
int OpenJobFile(const TOOL_EVENT &aEvent)
int MoveLayerUp(const TOOL_EVENT &aEvent)
int ExportToPcbnew(const TOOL_EVENT &aEvent)
int OpenGerber(const TOOL_EVENT &aEvent)
int LoadGerbFiles(const TOOL_EVENT &aEvent)
Set up handlers for various events.
int ClearAllLayers(const TOOL_EVENT &aEvent)
int DisplayControl(const TOOL_EVENT &aEvent)
int LoadZipfile(const TOOL_EVENT &aEvent)
int OpenZipFile(const TOOL_EVENT &aEvent)
int UpdateMessagePanel(const TOOL_EVENT &aEvent)
int Print(const TOOL_EVENT &aEvent)
wxChoice * m_SelAperAttributesBox
void UpdateXORLayers()
Update each layers' differential option.
GERBVIEW_SETTINGS * gvconfig() const
void ApplyDisplaySettingsToGAL()
Updates the GAL with display settings changes.
bool LoadGerberJobFile(const wxString &aFileName)
Load a Gerber job file, and load gerber files found in job files.
GERBER_FILE_IMAGE_LIST * GetImagesList() const
Accessors to GERBER_FILE_IMAGE_LIST and GERBER_FILE_IMAGE data.
void syncLayerBox(bool aRebuildLayerBox=false)
Update the currently "selected" layer within m_SelLayerBox.
GBR_LAYOUT * GetGerberLayout() const
bool LoadGerberFiles(const wxString &aFileName)
Load a given Gerber file or selected file(s), if the filename is empty.
wxChoice * m_SelComponentBox
wxChoice * m_SelNetnameBox
int GetActiveLayer() const
Return the active layer.
void SetActiveLayer(int aLayer, bool doLayerWidgetUpdate=true)
change the currently active layer to aLayer and update the GERBER_LAYER_WIDGET.
bool Clear_DrawLayers(bool query)
GERBER_FILE_IMAGE * GetGbrImage(int aIdx) const
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.
bool LoadAutodetectedFiles(const wxString &aFileName)
Load a given file or selected file(s), if the filename is empty.
bool OpenProjectFiles(const std::vector< wxString > &aFileSet, int aCtl) override
Open a project or set of files given by aFileList.
void Erase_Current_DrawLayer(bool query)
bool LoadZipArchiveFile(const wxString &aFileName)
Load a zipped archive file.
void SetElementVisibility(int aLayerID, bool aNewState)
Change the visibility of an element category.
void RemapLayers(std::unordered_map< int, int > remapping)
Takes a layer remapping and reorders the layers.
bool LoadExcellonFiles(const wxString &aFileName)
Load a drill (EXCELLON) file or many files.
Selection tool for GerbView, based on the one in Pcbnew.
GERBVIEW_SELECTION & GetSelection()
Return the set of currently selected items.
GBR_DISPLAY_OPTIONS m_Display
Methods for drawing GerbView specific items.
Store GerbView specific render settings.
void ClearHighlightSelections()
Clear all highlight selections (dcode, net, component, attribute selection)
An abstract base class for deriving all objects that can be added to a VIEW.
Definition: view_item.h:77
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:69
void SetMirror(bool aMirrorX, bool aMirrorY)
Control the mirroring of the VIEW.
Definition: view.cpp:535
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition: view.cpp:1479
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:213
void UpdateAllItemsConditionally(int aUpdateFlags, std::function< bool(VIEW_ITEM *)> aCondition)
Update items in the view according to the given flags and condition.
Definition: view.cpp:1489
Show the Gerber files loaded and allow the user to choose between Gerber layers and pcb layers.
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:214
KIGFX::VIEW * getView() const
Returns the instance of #VIEW object used in the application.
Definition: tool_base.cpp:36
RESET_REASON
Determine the reason of reset for a tool.
Definition: tool_base.h:78
Generic, UI-independent tool event.
Definition: tool_event.h:156
T Parameter() const
Return a non-standard parameter assigned to the event.
Definition: tool_event.h:442
bool IsAction(const TOOL_ACTION *aAction) const
Test if the event contains an action issued upon activation of the given TOOL_ACTION.
Definition: tool_event.cpp:88
void Go(int(T::*aStateFunc)(const TOOL_EVENT &), const TOOL_EVENT_LIST &aConditions=TOOL_EVENT(TC_ANY, TA_ANY))
Define which state (aStateFunc) to go when a certain event arrives (aConditions).
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Run the specified action.
Definition: tool_manager.h:142
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
Definition: confirm.cpp:320
This file is part of the common library.
#define _(s)
@ GBR_SPOT_OVAL
@ GBR_SEGMENT
@ GBR_SPOT_POLY
@ GBR_SPOT_RECT
@ GBR_CIRCLE
@ GBR_POLYGON
@ GBR_SPOT_CIRCLE
@ GBR_ARC
@ GBR_SPOT_MACRO
const std::string KiCadPcbFileExtension
wxString PcbFileWildcard()
#define KICTL_CREATE
caller thinks requested project files may not exist.
Definition: kiway_player.h:82
@ LAYER_DCODES
Definition: layer_ids.h:412
@ LAYER_NEGATIVE_OBJECTS
Definition: layer_ids.h:413
Macros and inline functions to create menus items in menubars or popup menus.
@ COLOR
Color has changed.
Definition: view_item.h:48
@ REPAINT
Item needs to be redrawn.
Definition: view_item.h:52
#define NAMELESS_PROJECT
default name for nameless projects
Definition: project.h:42
FormatType fileType(const char *aFileName)
wxString UnescapeString(const wxString &aSource)
Definition of file extensions used in Kicad.