KiCad PCB EDA Suite
eeschema.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) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
5  * Copyright (C) 2008 Wayne Stambaugh <stambaughw@verizon.net>
6  * Copyright (C) 2004-2017 KiCad Developers, see change_log.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 
31 #include <fctsys.h>
32 #include <pgm_base.h>
33 #include <kiface_i.h>
34 #include <class_drawpanel.h>
35 #include <confirm.h>
36 #include <gestfich.h>
37 #include <eda_dde.h>
38 #include <schframe.h>
39 #include <libeditframe.h>
40 #include <viewlib_frame.h>
41 #include <eda_text.h>
42 
43 #include <general.h>
44 #include <class_libentry.h>
45 #include <hotkeys.h>
46 #include <transform.h>
48 #include <symbol_lib_table.h>
50 
51 #include <kiway.h>
52 #include <sim/sim_plot_frame.h>
53 
54 // The main sheet of the project
56 
57 // a transform matrix, to display components in lib editor
59 
60 
61 namespace SCH {
62 
63 static struct IFACE : public KIFACE_I
64 {
65  // Of course all are virtual overloads, implementations of the KIFACE.
66 
67  IFACE( const char* aName, KIWAY::FACE_T aType ) :
68  KIFACE_I( aName, aType )
69  {}
70 
71  bool OnKifaceStart( PGM_BASE* aProgram, int aCtlBits ) override;
72 
73  void OnKifaceEnd() override;
74 
75  wxWindow* CreateWindow( wxWindow* aParent, int aClassId, KIWAY* aKiway, int aCtlBits = 0 ) override
76  {
77  switch( aClassId )
78  {
79  case FRAME_SCH:
80  {
81  SCH_EDIT_FRAME* frame = new SCH_EDIT_FRAME( aKiway, aParent );
82 
83  if( Kiface().IsSingle() )
84  {
85  // only run this under single_top, not under a project manager.
87  }
88  return frame;
89  }
90  break;
91 
93  {
94  LIB_EDIT_FRAME* frame = new LIB_EDIT_FRAME( aKiway, aParent );
95  return frame;
96  }
97  break;
98 
99 #ifdef KICAD_SPICE
100  case FRAME_SIMULATOR:
101  {
102  SIM_PLOT_FRAME* frame = new SIM_PLOT_FRAME( aKiway, aParent );
103  return frame;
104  }
105  break;
106 #endif /* KICAD_SPICE */
107 
108  case FRAME_SCH_VIEWER:
110  {
111  LIB_VIEW_FRAME* frame = new LIB_VIEW_FRAME( aKiway, aParent, FRAME_T( aClassId ) );
112  return frame;
113  }
114  break;
115 
116  default:
117  return NULL;
118  }
119  }
120 
132  void* IfaceOrAddress( int aDataId ) override
133  {
134  return NULL;
135  }
136 
137 } kiface( "eeschema", KIWAY::FACE_SCH );
138 
139 } // namespace
140 
141 using namespace SCH;
142 
144 
145 
146 KIFACE_I& Kiface() { return kiface; }
147 
148 
149 // KIFACE_GETTER's actual spelling is a substitution macro found in kiway.h.
150 // KIFACE_GETTER will not have name mangling due to declaration in kiway.h.
151 MY_API( KIFACE* ) KIFACE_GETTER( int* aKIFACEversion, int aKiwayVersion, PGM_BASE* aProgram )
152 {
153  process = aProgram;
154  return &kiface;
155 }
156 
157 
159 {
160  wxASSERT( process ); // KIFACE_GETTER has already been called.
161  return *process;
162 }
163 
164 
166 
168 {
169  unsigned layer = SCH_LAYER_INDEX( aLayer );
170  wxASSERT( layer < DIM( s_layerColor ) );
171  return s_layerColor[layer];
172 }
173 
174 void SetLayerColor( COLOR4D aColor, SCH_LAYER_ID aLayer )
175 {
176  unsigned layer = SCH_LAYER_INDEX( aLayer );
177  wxASSERT( layer < DIM( s_layerColor ) );
178  s_layerColor[layer] = aColor;
179 }
180 
181 
183 {
184  static PARAM_CFG_ARRAY ca;
185 
186  if( !ca.size() )
187  {
188  // These are KIFACE specific, they need to be loaded once when the
189  // eeschema KIFACE comes in.
190 
191 #define CLR(x, y, z)\
192  ca.push_back( new PARAM_CFG_SETCOLOR( true, wxT( x ),\
193  &s_layerColor[SCH_LAYER_INDEX( y )], z ) );
194 
195  CLR( "Color4DWireEx", LAYER_WIRE, COLOR4D( GREEN ) )
196  CLR( "Color4DBusEx", LAYER_BUS, COLOR4D( BLUE ) )
197  CLR( "Color4DConnEx", LAYER_JUNCTION, COLOR4D( GREEN ) )
198  CLR( "Color4DLLabelEx", LAYER_LOCLABEL, COLOR4D( BLACK ) )
199  CLR( "Color4DHLabelEx", LAYER_HIERLABEL, COLOR4D( BROWN ) )
200  CLR( "Color4DGLabelEx", LAYER_GLOBLABEL, COLOR4D( RED ) )
201  CLR( "Color4DPinNumEx", LAYER_PINNUM, COLOR4D( RED ) )
202  CLR( "Color4DPinNameEx", LAYER_PINNAM, COLOR4D( CYAN ) )
203  CLR( "Color4DFieldEx", LAYER_FIELDS, COLOR4D( MAGENTA ) )
204  CLR( "Color4DReferenceEx", LAYER_REFERENCEPART, COLOR4D( CYAN ) )
205  CLR( "Color4DValueEx", LAYER_VALUEPART, COLOR4D( CYAN ) )
206  CLR( "Color4DNoteEx", LAYER_NOTES, COLOR4D( LIGHTBLUE ) )
207  CLR( "Color4DBodyEx", LAYER_DEVICE, COLOR4D( RED ) )
208  CLR( "Color4DBodyBgEx", LAYER_DEVICE_BACKGROUND, COLOR4D( LIGHTYELLOW ) )
209  CLR( "Color4DNetNameEx", LAYER_NETNAM, COLOR4D( DARKGRAY ) )
210  CLR( "Color4DPinEx", LAYER_PIN, COLOR4D( RED ) )
211  CLR( "Color4DSheetEx", LAYER_SHEET, COLOR4D( MAGENTA ) )
212  CLR( "Color4DSheetFileNameEx", LAYER_SHEETFILENAME, COLOR4D( BROWN ) )
213  CLR( "Color4DSheetNameEx", LAYER_SHEETNAME, COLOR4D( CYAN ) )
214  CLR( "Color4DSheetLabelEx", LAYER_SHEETLABEL, COLOR4D( BROWN ) )
215  CLR( "Color4DNoConnectEx", LAYER_NOCONNECT, COLOR4D( BLUE ) )
216  CLR( "Color4DErcWEx", LAYER_ERC_WARN, COLOR4D( GREEN ) )
217  CLR( "Color4DErcEEx", LAYER_ERC_ERR, COLOR4D( RED ) )
218  CLR( "Color4DGridEx", LAYER_SCHEMATIC_GRID, COLOR4D( DARKGRAY ) )
219  CLR( "Color4DBgCanvasEx", LAYER_SCHEMATIC_BACKGROUND, COLOR4D( WHITE ) )
220  CLR( "Color4DBrighenedEx", LAYER_BRIGHTENED, COLOR4D( PUREMAGENTA ) )
221  }
222 
223  return ca;
224 }
225 
226 
227 bool IFACE::OnKifaceStart( PGM_BASE* aProgram, int aCtlBits )
228 {
229  // This is process level, not project level, initialization of the DSO.
230 
231  // Do nothing in here pertinent to a project!
232 
233  start_common( aCtlBits );
234 
235  // Give a default colour for all layers
236  // (actual color will be initialized by config)
237  for( SCH_LAYER_ID ii = SCH_LAYER_ID_START; ii < SCH_LAYER_ID_END; ++ii )
238  SetLayerColor( COLOR4D( DARKGRAY ), ii );
239 
241 
242  // Must be called before creating the main frame in order to
243  // display the real hotkeys in menus or tool tips
245 
247 
249 
250  if( !fn.FileExists() )
251  {
252  DIALOG_GLOBAL_SYM_LIB_TABLE_CONFIG fpDialog( NULL );
253 
254  fpDialog.ShowModal();
255  }
256  else
257  {
258  try
259  {
260  // The global table is not related to a specific project. All projects
261  // will use the same global table. So the KIFACE::OnKifaceStart() contract
262  // of avoiding anything project specific is not violated here.
264  return false;
265  }
266  catch( const IO_ERROR& ioe )
267  {
268  // if we are here, a incorrect global symbol library table was found.
269  // Incorrect global symbol library table is not a fatal error:
270  // the user just has to edit the (partially) loaded table.
271  wxString msg = _(
272  "An error occurred attempting to load the global symbol library table.\n"
273  "Please edit this global symbol library table in Preferences menu."
274  );
275 
276  DisplayErrorMessage( NULL, msg, ioe.What() );
277  }
278  }
279 
280  return true;
281 }
282 
283 
285 {
288 }
Definition: colors.h:57
SCH::IFACE KIFACE_I kiface("eeschema", KIWAY::FACE_SCH)
void ReadHotkeyConfig(const wxString &Appname, struct EDA_HOTKEY_CONFIG *aDescList)
Function ReadHotkeyConfig Read hotkey configuration for a given app, possibly before the frame for th...
#define DIM(x)
of elements in an array
Definition: macros.h:98
static SYMBOL_LIB_TABLE & GetGlobalLibTable()
A list of parameters type.
Class KIFACE_I is a KIFACE (I)mplementation, with some features useful for DSOs which implement a KIF...
Definition: kiface_i.h:37
static COLOR4D s_layerColor[SCH_LAYER_ID_COUNT]
Definition: eeschema.cpp:165
DDE server & client.
bool start_common(int aCtlBits)
Common things to do for a top program module, during OnKifaceStart().
Definition: kiface_i.cpp:94
void SetLayerColor(COLOR4D aColor, SCH_LAYER_ID aLayer)
Definition: eeschema.cpp:174
This file is part of the common library TODO brief description.
wxSocketServer * CreateServer(wxWindow *window, int service, bool local)
Definition: eda_dde.cpp:49
This file is part of the common library.
int aKiwayVersion
Definition: eeschema.cpp:151
void OnKifaceEnd() override
Function OnKifaceEnd is called just once just before the DSO is to be unloaded.
Definition: eeschema.cpp:284
Class PGM_BASE keeps program (whole process) data for KiCad programs.
Definition: pgm_base.h:107
FRAME_T
Enum FRAME_T is the set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
Definition: frame_type.h:34
Definition: colors.h:61
wxWindow * CreateWindow(wxWindow *aParent, int aClassId, KIWAY *aKiway, int aCtlBits=0) override
Function CreateWindow creates a wxWindow for the current project.
Definition: eeschema.cpp:75
void * IfaceOrAddress(int aDataId) override
Function IfaceOrAddress return a pointer to the requested object.
Definition: eeschema.cpp:132
IFACE(const char *aName, KIWAY::FACE_T aType)
Definition: eeschema.cpp:67
#define SCH_LAYER_INDEX(x)
Schematic editor (Eeschema) main window.
Definition: schframe.h:117
#define SCH_LAYER_ID_COUNT
COLOR4D GetLayerColor(SCH_LAYER_ID aLayer)
Definition: eeschema.cpp:167
Definition of base KiCad text object.
Component library viewer main window.
Definition: viewlib_frame.h:49
int PGM_BASE * aProgram
Definition: eeschema.cpp:152
#define CLR(x, y, z)
Class for tranforming drawing coordinates for a wxDC device context.
Definition: transform.h:45
static bool LoadGlobalTable(SYMBOL_LIB_TABLE &aTable)
Load the global symbol library table into aTable.
#define KICAD_SCH_PORT_SERVICE_NUMBER
Definition: eda_dde.h:42
bool OnKifaceStart(PGM_BASE *aProgram, int aCtlBits) override
Function OnKifaceStart is called just once shortly after the DSO is loaded.
Definition: eeschema.cpp:227
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString aExtraInfo)
Function DisplayErrorMessage displays an error message with aMessage.
Definition: confirm.cpp:85
SCH_SHEET * g_RootSheet
Definition: eeschema.cpp:55
Definition: eeschema.cpp:61
KIFACE * KIFACE_GETTER(int *aKIFACEversion, int aKIWAYversion, PGM_BASE *aProgram)
No name mangling. Each KIFACE (DSO/DLL) will implement this once.
void end_common()
Common things to do for a top program module, during OnKifaceEnd();.
Definition: kiface_i.cpp:104
Class LIB_ITEM definition.
static PARAM_CFG_ARRAY & cfg_params()
Definition: eeschema.cpp:182
struct EDA_HOTKEY_CONFIG g_Eeschema_Hokeys_Descr[]
Definition: colors.h:59
The common library.
Class KIWAY is a minimalistic software bus for communications between various DLLs/DSOs (DSOs) within...
Definition: kiway.h:257
wxConfigBase * KifaceSettings() const
Definition: kiface_i.h:103
Subclass of SIM_PLOT_FRAME_BASE, which is generated by wxFormBuilder.
Definition: colors.h:60
SCH_LAYER_ID
Eeschema drawing layers.
Implementing SIM_PLOT_FRAME_BASE.
FACE_T
Known KIFACE implementations.
Definition: kiway.h:263
Class SCH_SHEET is the sheet symbol placed in a schematic, and is the entry point for a sub schematic...
Definition: sch_sheet.h:216
eeschema DSO
Definition: kiway.h:265
bool IsSingle() const
Function IsSingle is this KIFACE_I running under single_top?
Definition: kiface_i.h:115
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:33
void wxConfigSaveSetups(wxConfigBase *aCfg, const PARAM_CFG_ARRAY &aList)
Function wxConfigSaveSetups writes aList of PARAM_CFG_ARRAY elements to save configuration values to ...
The component library editor main window.
Definition: libeditframe.h:51
Definition: colors.h:58
see class PGM_BASE
TRANSFORM DefaultTransform
Definition: eeschema.cpp:58
MY_API(KIFACE *) KIFACE_GETTER(int *aKIFACEversion
Class KIFACE is used by a participant in the KIWAY alchemy.
Definition: kiway.h:150
static PGM_BASE * process
Definition: eeschema.cpp:143
KIFACE_I & Kiface()
Global KIFACE_I "get" accessor.
Definition: eeschema.cpp:146
Definition: colors.h:49
Definition: colors.h:45
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: eeschema.cpp:158
#define SCH_EDIT_FRAME_NAME
Definition: schframe.h:112
void wxConfigLoadSetups(wxConfigBase *aCfg, const PARAM_CFG_ARRAY &aList)
Function wxConfigLoadSetups uses aList of PARAM_CFG_ARRAY elements to load configuration values from ...
Struct IO_ERROR is a class used to hold an error message and may be used when throwing exceptions con...
Definition: ki_exception.h:47
static wxString GetGlobalTableFileName()
Fetch the global symbol library table file name.
Definition of class LIB_EDIT_FRAME.
Class COLOR4D is the color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:39
Definition: colors.h:62