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 
26 #include <fctsys.h>
27 #include <pgm_base.h>
28 #include <kiface_i.h>
29 #include <confirm.h>
30 #include <gestfich.h>
31 #include <eda_dde.h>
32 #include <sch_edit_frame.h>
33 #include <lib_edit_frame.h>
34 #include <viewlib_frame.h>
35 #include <eda_text.h>
36 #include <general.h>
37 #include <class_libentry.h>
38 #include <transform.h>
40 #include <symbol_lib_table.h>
43 #include <kiway.h>
44 #include <sim/sim_plot_frame.h>
45 
46 // The main sheet of the project
48 
49 // a transform matrix, to display components in lib editor
51 
52 
53 namespace SCH {
54 
55 static struct IFACE : public KIFACE_I
56 {
57  // Of course all are virtual overloads, implementations of the KIFACE.
58 
59  IFACE( const char* aName, KIWAY::FACE_T aType ) :
60  KIFACE_I( aName, aType )
61  {}
62 
63  bool OnKifaceStart( PGM_BASE* aProgram, int aCtlBits ) override;
64 
65  void OnKifaceEnd() override;
66 
67  wxWindow* CreateWindow( wxWindow* aParent, int aClassId, KIWAY* aKiway, int aCtlBits = 0 ) override
68  {
69  switch( aClassId )
70  {
71  case FRAME_SCH:
72  {
73  SCH_EDIT_FRAME* frame = new SCH_EDIT_FRAME( aKiway, aParent );
74 
75  if( Kiface().IsSingle() )
76  {
77  // only run this under single_top, not under a project manager.
79  }
80 
81  return frame;
82  }
83 
85  {
86  LIB_EDIT_FRAME* frame = new LIB_EDIT_FRAME( aKiway, aParent );
87  return frame;
88  }
89 
90 #ifdef KICAD_SPICE
91  case FRAME_SIMULATOR:
92  {
93  SIM_PLOT_FRAME* frame = new SIM_PLOT_FRAME( aKiway, aParent );
94  return frame;
95  }
96 #endif
97  case FRAME_SCH_VIEWER:
99  {
100  LIB_VIEW_FRAME* frame = new LIB_VIEW_FRAME( aKiway, aParent, FRAME_T( aClassId ) );
101  return frame;
102  }
103 
105  InvokeSchEditSymbolLibTable( aKiway, aParent );
106  // Dialog has completed; nothing to return.
107  return nullptr;
108 
109  default:
110  return NULL;
111  }
112  }
113 
125  void* IfaceOrAddress( int aDataId ) override
126  {
127  return NULL;
128  }
129 
130 } kiface( "eeschema", KIWAY::FACE_SCH );
131 
132 } // namespace
133 
134 using namespace SCH;
135 
137 
138 
139 KIFACE_I& Kiface() { return kiface; }
140 
141 
142 // KIFACE_GETTER's actual spelling is a substitution macro found in kiway.h.
143 // KIFACE_GETTER will not have name mangling due to declaration in kiway.h.
144 MY_API( KIFACE* ) KIFACE_GETTER( int* aKIFACEversion, int aKiwayVersion, PGM_BASE* aProgram )
145 {
146  process = aProgram;
147  return &kiface;
148 }
149 
150 
152 {
153  wxASSERT( process ); // KIFACE_GETTER has already been called.
154  return *process;
155 }
156 
157 
159 
161 {
162  unsigned layer = ( aLayer );
163  wxASSERT( layer < arrayDim( s_layerColor ) );
164  return s_layerColor[layer];
165 }
166 
167 void SetLayerColor( COLOR4D aColor, SCH_LAYER_ID aLayer )
168 {
169  // Do not allow non-background layers to be completely white.
170  // This ensures the BW printing recognizes that the colors should be
171  // printed black.
172  if( aColor == COLOR4D::WHITE && aLayer != LAYER_SCHEMATIC_BACKGROUND )
173  aColor.Darken( 0.01 );
174 
175  unsigned layer = aLayer;
176  wxASSERT( layer < arrayDim( s_layerColor ) );
177  s_layerColor[layer] = aColor;
178 }
179 
180 
182 {
183  static PARAM_CFG_ARRAY ca;
184 
185  if( !ca.size() )
186  {
187  // These are KIFACE specific, they need to be loaded once when the
188  // eeschema KIFACE comes in.
189 
190 #define CLR(x, y, z)\
191  ca.push_back( new PARAM_CFG_SETCOLOR( true, wxT( x ),\
192  &s_layerColor[( y )], z ) );
193 
194  CLR( "Color4DWireEx", LAYER_WIRE, COLOR4D( GREEN ) )
195  CLR( "Color4DBusEx", LAYER_BUS, COLOR4D( BLUE ) )
196  CLR( "Color4DConnEx", LAYER_JUNCTION, COLOR4D( GREEN ) )
197  CLR( "Color4DLLabelEx", LAYER_LOCLABEL, COLOR4D( BLACK ) )
198  CLR( "Color4DHLabelEx", LAYER_HIERLABEL, COLOR4D( BROWN ) )
199  CLR( "Color4DGLabelEx", LAYER_GLOBLABEL, COLOR4D( RED ) )
200  CLR( "Color4DPinNumEx", LAYER_PINNUM, COLOR4D( RED ) )
201  CLR( "Color4DPinNameEx", LAYER_PINNAM, COLOR4D( CYAN ) )
202  CLR( "Color4DFieldEx", LAYER_FIELDS, COLOR4D( MAGENTA ) )
203  CLR( "Color4DReferenceEx", LAYER_REFERENCEPART, COLOR4D( CYAN ) )
204  CLR( "Color4DValueEx", LAYER_VALUEPART, COLOR4D( CYAN ) )
205  CLR( "Color4DNoteEx", LAYER_NOTES, COLOR4D( LIGHTBLUE ) )
206  CLR( "Color4DBodyEx", LAYER_DEVICE, COLOR4D( RED ) )
207  CLR( "Color4DBodyBgEx", LAYER_DEVICE_BACKGROUND, COLOR4D( LIGHTYELLOW ) )
208  CLR( "Color4DNetNameEx", LAYER_NETNAM, COLOR4D( DARKGRAY ) )
209  CLR( "Color4DPinEx", LAYER_PIN, COLOR4D( RED ) )
210  CLR( "Color4DSheetEx", LAYER_SHEET, COLOR4D( MAGENTA ) )
211  CLR( "Color4DSheetFileNameEx", LAYER_SHEETFILENAME, COLOR4D( BROWN ) )
212  CLR( "Color4DSheetNameEx", LAYER_SHEETNAME, COLOR4D( CYAN ) )
213  CLR( "Color4DSheetLabelEx", LAYER_SHEETLABEL, COLOR4D( BROWN ) )
214  CLR( "Color4DNoConnectEx", LAYER_NOCONNECT, COLOR4D( BLUE ) )
215  CLR( "Color4DErcWEx", LAYER_ERC_WARN, COLOR4D( GREEN ).WithAlpha(0.8 ) )
216  CLR( "Color4DErcEEx", LAYER_ERC_ERR, COLOR4D( RED ).WithAlpha(0.8 ) )
217  CLR( "Color4DGridEx", LAYER_SCHEMATIC_GRID, COLOR4D( DARKGRAY ) )
218  CLR( "Color4DBgCanvasEx", LAYER_SCHEMATIC_BACKGROUND, COLOR4D( WHITE ) )
219  CLR( "Color4DCursorEx", LAYER_SCHEMATIC_CURSOR, COLOR4D( BLACK ) )
220  CLR( "Color4DBrightenedEx", LAYER_BRIGHTENED, COLOR4D( PUREMAGENTA ) )
221  CLR( "Color4DHiddenEx", LAYER_HIDDEN, COLOR4D( LIGHTGRAY ) )
222  CLR( "Color4DWorksheetEx", LAYER_WORKSHEET, COLOR4D( RED ) )
223 // Macs look better with a lighter shadow
224 #ifdef __WXMAC__
225  CLR( "Color4DShadowEx", LAYER_SELECTION_SHADOWS, COLOR4D( .78, .92, 1.0, 0.8 ) )
226 #else
227  CLR( "Color4DShadowEx", LAYER_SELECTION_SHADOWS, COLOR4D( .4, .7, 1.0, 0.8 ) )
228 #endif
229  }
230 
231  return ca;
232 }
233 
234 
235 bool IFACE::OnKifaceStart( PGM_BASE* aProgram, int aCtlBits )
236 {
237  // This is process level, not project level, initialization of the DSO.
238 
239  // Do nothing in here pertinent to a project!
240 
241  start_common( aCtlBits );
242 
243  // Give a default colour for all layers
244  // (actual color will be initialized by config)
245  for( SCH_LAYER_ID ii = SCH_LAYER_ID_START; ii < SCH_LAYER_ID_END; ++ii )
246  SetLayerColor( COLOR4D( DARKGRAY ), ii );
247 
250 
252 
254 
255  if( !fn.FileExists() )
256  {
257  DIALOG_GLOBAL_SYM_LIB_TABLE_CONFIG fpDialog( NULL );
258 
259  fpDialog.ShowModal();
260  }
261  else
262  {
263  try
264  {
265  // The global table is not related to a specific project. All projects
266  // will use the same global table. So the KIFACE::OnKifaceStart() contract
267  // of avoiding anything project specific is not violated here.
269  return false;
270  }
271  catch( const IO_ERROR& ioe )
272  {
273  // if we are here, a incorrect global symbol library table was found.
274  // Incorrect global symbol library table is not a fatal error:
275  // the user just has to edit the (partially) loaded table.
276  wxString msg = _(
277  "An error occurred attempting to load the global symbol library table.\n"
278  "Please edit this global symbol library table in Preferences menu."
279  );
280 
281  DisplayErrorMessage( NULL, msg, ioe.What() );
282  }
283  }
284 
285  return true;
286 }
287 
288 
290 {
293 }
Definition: colors.h:57
SCH::IFACE KIFACE_I kiface("eeschema", KIWAY::FACE_SCH)
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
DDE server & client.
bool start_common(int aCtlBits)
Common things to do for a top program module, during OnKifaceStart().
Definition: kiface_i.cpp:90
void SetLayerColor(COLOR4D aColor, SCH_LAYER_ID aLayer)
Definition: eeschema.cpp:167
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:249
This file is part of the common library TODO brief description.
This file is part of the common library.
int aKiwayVersion
Definition: eeschema.cpp:144
void OnKifaceEnd() override
Function OnKifaceEnd is called just once just before the DSO is to be unloaded.
Definition: eeschema.cpp:289
Class PGM_BASE keeps program (whole process) data for KiCad programs.
Definition: pgm_base.h:166
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:67
void * IfaceOrAddress(int aDataId) override
Function IfaceOrAddress return a pointer to the requested object.
Definition: eeschema.cpp:125
wxConfigBase * KifaceSettings() const
Definition: kiface_i.h:103
void InvokeSchEditSymbolLibTable(KIWAY *aKiway, wxWindow *aParent)
IFACE(const char *aName, KIWAY::FACE_T aType)
Definition: eeschema.cpp:59
Schematic editor (Eeschema) main window.
COLOR4D GetLayerColor(SCH_LAYER_ID aLayer)
Definition: eeschema.cpp:160
Symbol library viewer main window.
Definition: viewlib_frame.h:43
int PGM_BASE * aProgram
Definition: eeschema.cpp:145
#define CLR(x, y, z)
Class for transforming 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:235
SCH_SHEET * g_RootSheet
Definition: eeschema.cpp:47
bool IsSingle() const
Function IsSingle is this KIFACE_I running under single_top?
Definition: kiface_i.h:115
static COLOR4D s_layerColor[LAYER_ID_COUNT]
Definition: eeschema.cpp:158
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:33
Definition: eeschema.cpp:53
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:100
Class LIB_PIN definition.
static PARAM_CFG_ARRAY & cfg_params()
Definition: eeschema.cpp:181
Definition: colors.h:59
Definition of file extensions used in Kicad.
Class KIWAY is a minimalistic software bus for communications between various DLLs/DSOs (DSOs) within...
Definition: kiway.h:258
Subclass of SIM_PLOT_FRAME_BASE, which is generated by wxFormBuilder.
Definition: colors.h:60
SCH_LAYER_ID
Eeschema drawing layers.
#define _(s)
#define LAYER_ID_COUNT
Must update this if you add any enums after GerbView!
Implementing SIM_PLOT_FRAME_BASE.
FACE_T
Known KIFACE implementations.
Definition: kiway.h:264
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition: sch_sheet.h:209
constexpr std::size_t arrayDim(T const (&)[N]) noexcept
Definition: macros.h:108
eeschema DSO
Definition: kiway.h:266
void wxConfigSaveSetups(wxConfigBase *aCfg, const PARAM_CFG_ARRAY &aList)
Function wxConfigSaveSetups writes aList of PARAM_CFG_ARRAY elements to save configuration values to ...
The symbol library editor main window.
Definition: colors.h:58
see class PGM_BASE
TRANSFORM DefaultTransform
Definition: eeschema.cpp:50
MY_API(KIFACE *) KIFACE_GETTER(int *aKIFACEversion
COLOR4D & Darken(double aFactor)
Function Darken Makes the color darker by a given factor.
Definition: color4d.h:163
Class KIFACE is used by a participant in the KIWAY alchemy.
Definition: kiway.h:151
static PGM_BASE * process
Definition: eeschema.cpp:136
KIFACE_I & Kiface()
Global KIFACE_I "get" accessor.
Definition: eeschema.cpp:139
Definition: colors.h:49
void CreateServer(int service, bool local=true)
Definition: eda_dde.cpp:49
Definition: colors.h:45
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: eeschema.cpp:151
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:76
static wxString GetGlobalTableFileName()
Fetch the global symbol library table file name.
Class COLOR4D is the color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:39
Definition: colors.h:62