KiCad PCB EDA Suite
Loading...
Searching...
No Matches
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-2023 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>
22#include <common.h>
24#include <export_to_pcbnew.h>
25#include <gerber_file_image.h>
27#include <gerbview_painter.h>
28#include <gerbview_frame.h>
29#include <gerbview_settings.h>
30#include <string_utils.h>
31#include <excellon_image.h>
32#include <menus_helpers.h>
33#include <tool/tool_manager.h>
34#include <project.h>
35#include <view/view.h>
37#include <wx/filedlg.h>
38
39#include "gerbview_actions.h"
40#include "gerbview_control.h"
42
43
44GERBVIEW_CONTROL::GERBVIEW_CONTROL() : TOOL_INTERACTIVE( "gerbview.Control" ), m_frame( nullptr )
45{
46}
47
48
50{
51 m_frame = getEditFrame<GERBVIEW_FRAME>();
52}
53
54
56{
57 m_frame->LoadAutodetectedFiles( wxEmptyString );
58
59 return 0;
60}
61
62
64{
65 m_frame->LoadGerberFiles( wxEmptyString );
66
67 return 0;
68}
69
70
72{
73 m_frame->LoadExcellonFiles( wxEmptyString );
74
75 return 0;
76}
77
78
80{
81 m_frame->LoadGerberJobFile( wxEmptyString );
82 canvas()->Refresh();
83
84 return 0;
85}
86
87
89{
90 m_frame->LoadZipArchiveFile( wxEmptyString );
91 canvas()->Refresh();
92
93 return 0;
94}
95
96
98{
100
101 return 0;
102}
103
104
106{
107 int layercount = 0;
108
110
111 // Count the Gerber layers which are actually currently used
112 for( int ii = 0; ii < (int) images->ImagesMaxCount(); ++ii )
113 {
114 if( images->GetGbrImage( ii ) )
115 layercount++;
116 }
117
118 if( layercount == 0 )
119 {
120 DisplayInfoMessage( m_frame, _( "None of the Gerber layers contain any data" ) );
121 return 0;
122 }
123
124 wxString fileDialogName( NAMELESS_PROJECT + wxT( "." ) + KiCadPcbFileExtension );
125 wxString path = m_frame->GetMruPath();
126
127 wxFileDialog filedlg( m_frame, _( "Board File Name" ), path, fileDialogName, PcbFileWildcard(),
128 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
129
130 if( filedlg.ShowModal() == wxID_CANCEL )
131 return 0;
132
133 wxFileName fileName = EnsureFileExtension( filedlg.GetPath(), KiCadPcbFileExtension );
134
135 /* Install a dialog frame to choose the mapping
136 * between gerber layers and Pcbnew layers
137 */
139 int ok = layerdlg->ShowModal();
140 layerdlg->Destroy();
141
142 if( ok != wxID_OK )
143 return 0;
144
145 m_frame->SetMruPath( fileName.GetPath() );
146
147 GBR_TO_PCB_EXPORTER gbr_exporter( m_frame, fileName.GetFullPath() );
148
149 gbr_exporter.ExportPcb( layerdlg->GetLayersLookUpTable(), layerdlg->GetCopperLayersCount() );
150
151 return 0;
152}
153
154
156{
157 auto settings = static_cast<KIGFX::GERBVIEW_PAINTER*>( getView()->GetPainter() )->GetSettings();
158 const auto& selection = m_toolMgr->GetTool<GERBVIEW_SELECTION_TOOL>()->GetSelection();
159 GERBER_DRAW_ITEM* item = nullptr;
160
161 if( selection.Size() == 1 )
162 {
163 item = static_cast<GERBER_DRAW_ITEM*>( selection[0] );
164 }
165
167 {
168 m_frame->m_SelComponentBox->SetSelection( 0 );
169 m_frame->m_SelNetnameBox->SetSelection( 0 );
170 m_frame->m_SelAperAttributesBox->SetSelection( 0 );
171
172 settings->ClearHighlightSelections();
173
175
176 if( gerber )
177 gerber->m_Selected_Tool = settings->m_dcodeHighlightValue;
178 }
179 else if( item && aEvent.IsAction( &GERBVIEW_ACTIONS::highlightNet ) )
180 {
181 wxString net_name = item->GetNetAttributes().m_Netname;
182 settings->m_netHighlightString = net_name;
183 m_frame->m_SelNetnameBox->SetStringSelection( UnescapeString( net_name ) );
184 }
185 else if( item && aEvent.IsAction( &GERBVIEW_ACTIONS::highlightComponent ) )
186 {
187 wxString net_attr = item->GetNetAttributes().m_Cmpref;
188 settings->m_componentHighlightString = net_attr;
189 m_frame->m_SelComponentBox->SetStringSelection( net_attr );
190 }
191 else if( item && aEvent.IsAction( &GERBVIEW_ACTIONS::highlightAttribute ) )
192 {
193 D_CODE* apertDescr = item->GetDcodeDescr();
194
195 if( apertDescr )
196 {
197 wxString ap_name = apertDescr->m_AperFunction;
198 settings->m_attributeHighlightString = ap_name;
199 m_frame->m_SelAperAttributesBox->SetStringSelection( ap_name );
200 }
201 }
202 else if( item && aEvent.IsAction( &GERBVIEW_ACTIONS::highlightDCode ) )
203 {
204 D_CODE* apertDescr = item->GetDcodeDescr();
205
206 if( apertDescr )
207 {
208 int dcodeSelected = -1;
210
211 if( gerber )
212 dcodeSelected = apertDescr->m_Num_Dcode;
213
214 if( dcodeSelected > 0 )
215 {
216 settings->m_dcodeHighlightValue = dcodeSelected;
217 gerber->m_Selected_Tool = dcodeSelected;
218 m_frame->syncLayerBox( false );
219 }
220 }
221 }
222
224 canvas()->Refresh();
225
226 return 0;
227}
228
229
231{
233 KIGFX::VIEW* view = m_frame->GetCanvas()->GetView();
234
236 {
238
240 []( KIGFX::VIEW_ITEM* aItem )
241 {
242 GERBER_DRAW_ITEM* item = static_cast<GERBER_DRAW_ITEM*>( aItem );
243
244 switch( item->m_ShapeType )
245 {
246 case GBR_CIRCLE:
247 case GBR_ARC:
248 case GBR_SEGMENT:
249 return true;
250
251 default:
252 return false;
253 }
254 } );
255 }
257 {
259
261 []( KIGFX::VIEW_ITEM* aItem )
262 {
263 GERBER_DRAW_ITEM* item = static_cast<GERBER_DRAW_ITEM*>( aItem );
264
265 switch( item->m_ShapeType )
266 {
267 case GBR_SPOT_CIRCLE:
268 case GBR_SPOT_RECT:
269 case GBR_SPOT_OVAL:
270 case GBR_SPOT_POLY:
271 case GBR_SPOT_MACRO:
272 return true;
273
274 default:
275 return false;
276 }
277 } );
278 }
280 {
282
284 []( KIGFX::VIEW_ITEM* aItem )
285 {
286 GERBER_DRAW_ITEM* item = static_cast<GERBER_DRAW_ITEM*>( aItem );
287
288 return ( item->m_ShapeType == GBR_POLYGON );
289 } );
290 }
292 {
294 }
295 else if( aEvent.IsAction( &GERBVIEW_ACTIONS::dcodeDisplay ) )
296 {
298 }
299 else if( aEvent.IsAction( &ACTIONS::highContrastMode )
301 {
303 }
304 else if( aEvent.IsAction( &GERBVIEW_ACTIONS::toggleDiffMode ) )
305 {
307
308 if( cfg->m_Display.m_DiffMode && cfg->m_Display.m_XORMode )
309 cfg->m_Display.m_XORMode = false;
310
312 }
313 else if( aEvent.IsAction( &GERBVIEW_ACTIONS::toggleXORMode ) )
314 {
316
317 if( cfg->m_Display.m_XORMode && cfg->m_Display.m_DiffMode )
318 cfg->m_Display.m_DiffMode = false;
319
321 }
322 else if( aEvent.IsAction( &GERBVIEW_ACTIONS::flipGerberView ) )
323 {
325 view->SetMirror( cfg->m_Display.m_FlipGerberView, false );
326 }
327
329
332
333 return 0;
334}
335
336
338{
339 int layer = m_frame->GetActiveLayer();
340
341 if( layer < ( (int) GERBER_FILE_IMAGE_LIST::GetImagesList().GetLoadedImageCount() - 1 ) )
342 m_frame->SetActiveLayer( layer + 1, true );
343
344 return 0;
345}
346
347
349{
350 int layer = m_frame->GetActiveLayer();
351
352 if( layer > 0 )
353 m_frame->SetActiveLayer( layer - 1, true );
354
355 return 0;
356}
357
358
360{
361 int layer = m_frame->GetActiveLayer();
362
363 if( layer > 0 )
364 {
366 GERBER_FILE_IMAGE_LIST::GetImagesList().SwapImages( layer, layer - 1 ) );
367 m_frame->SetActiveLayer( layer - 1 );
368 }
369
370 return 0;
371}
372
373
375{
376 int layer = m_frame->GetActiveLayer();
378
379 if( layer < ( (int) list.GetLoadedImageCount() - 1 ) )
380 {
381 m_frame->RemapLayers( list.SwapImages( layer, layer + 1 ) );
382 m_frame->SetActiveLayer( layer + 1 );
383 }
384
385 return 0;
386}
387
388
390{
393
394 return 0;
395}
396
397
399{
400 m_frame->Clear_DrawLayers( false );
402 canvas()->Refresh();
404
405 // Clear pending highlight selections, now outdated
407 static_cast<KIGFX::GERBVIEW_PAINTER*>( getView()->GetPainter() )->GetSettings();
408 settings->ClearHighlightSelections();
409
410 return 0;
411}
412
413
415{
416 // Store filenames
417 wxArrayString listOfGerberFiles;
418 std::vector<int> fileType;
420
421 for( unsigned i = 0; i < list->ImagesMaxCount(); i++ )
422 {
423 if( list->GetGbrImage( i ) == nullptr )
424 continue;
425
426 if( !list->GetGbrImage( i )->m_InUse )
427 continue;
428
429 EXCELLON_IMAGE* drill_file = dynamic_cast<EXCELLON_IMAGE*>( list->GetGbrImage( i ) );
430
431 if( drill_file )
432 fileType.push_back( 1 );
433 else
434 fileType.push_back( 0 );
435
436 listOfGerberFiles.Add( list->GetGbrImage( i )->m_FileName );
437 }
438
439 // Clear all layers
440 m_frame->Clear_DrawLayers( false );
442
443 // Load the layers from stored paths
444 wxBusyCursor wait;
445 m_frame->LoadListOfGerberAndDrillFiles( wxEmptyString, listOfGerberFiles, &fileType );
446
447 return 0;
448}
449
450
452{
454 GERBVIEW_SELECTION& selection = selTool->GetSelection();
455
456 if( selection.GetSize() == 1 )
457 {
458 EDA_ITEM* item = (EDA_ITEM*) selection.Front();
459
460 std::vector<MSG_PANEL_ITEM> msgItems;
461 item->GetMsgPanelInfo( m_frame, msgItems );
462 m_frame->SetMsgPanel( msgItems );
463 }
464 else
465 {
467 }
468
469 return 0;
470}
471
472
474{
475 m_frame->LoadZipArchiveFile( *aEvent.Parameter<wxString*>() );
476 canvas()->Refresh();
477
478 return 0;
479}
480
481
483{
484 // The event parameter is a string containing names of dropped files.
485 // Each file name has been enclosed with "", so file names with space character are allowed.
486 wxString files = *aEvent.Parameter<wxString*>();
487 // ie : files = "file1""another file""file3"...
488
489 std::vector<wxString> aFileNameList;
490
491 // Isolate each file name, deletting ""
492 files = files.AfterFirst( '"' );
493
494 // Gerber files are enclosed with "".
495 // Load files names in array.
496 while( !files.empty() )
497 {
498 wxString fileName = files.BeforeFirst( '"' );
499 // Check if file exists. If not, keep on and ignore fileName
500 if( wxFileName( fileName ).Exists() )
501 aFileNameList.push_back( fileName );
502 files = files.AfterFirst( '"' );
503 files = files.AfterFirst( '"' );
504 }
505
506 if( !aFileNameList.empty() )
507 m_frame->OpenProjectFiles( aFileNameList, KICTL_CREATE );
508
509 return 0;
510}
511
512
514{
523
529
537
548
553
556}
static TOOL_ACTION updateUnits
Definition: actions.h:157
static TOOL_ACTION highContrastModeCycle
Definition: actions.h:110
static TOOL_ACTION highContrastMode
Definition: actions.h:109
static TOOL_ACTION zoomFitScreen
Definition: actions.h:100
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:203
int m_Num_Dcode
D code value ( >= 10 )
Definition: dcode.h:193
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
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:199
static const TOOL_EVENT ClearedEvent
Definition: actions.h:234
static const TOOL_EVENT SelectedEvent
Definition: actions.h:232
static const TOOL_EVENT UnselectedEvent
Definition: actions.h:233
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.
GBR_BASIC_SHAPE_TYPE m_ShapeType
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:82
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:68
void SetMirror(bool aMirrorX, bool aMirrorY)
Control the mirroring of the VIEW.
Definition: view.cpp:534
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition: view.cpp:1500
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:212
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:1510
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:216
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:167
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:81
T Parameter() const
Return a parameter assigned to the event.
Definition: tool_event.h:461
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, T aParam)
Run the specified action immediately, pausing the current action to run the new one.
Definition: tool_manager.h:145
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:398
The common library.
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
Definition: confirm.cpp:332
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:77
@ LAYER_DCODES
Definition: layer_ids.h:420
@ LAYER_NEGATIVE_OBJECTS
Definition: layer_ids.h:421
Macros and inline functions to create menus items in menubars or popup menus.
@ COLOR
Color has changed.
Definition: view_item.h:53
@ REPAINT
Item needs to be redrawn.
Definition: view_item.h:57
#define NAMELESS_PROJECT
default name for nameless projects
Definition: project.h:42
MODEL3D_FORMAT_TYPE fileType(const char *aFileName)
wxString UnescapeString(const wxString &aSource)
Definition of file extensions used in Kicad.