KiCad PCB EDA Suite
Loading...
Searching...
No Matches
typeinfo.h
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) 2014 CERN
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 * @author Tomasz Wlostowski <[email protected]>
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, see <https://www.gnu.org/licenses/>.
20 */
21
22#pragma once
23
24
25#include <type_traits>
26
33template <class T, class I>
34bool IsA( const I* aObject )
35{
36 return aObject && std::remove_pointer<T>::type::ClassOf( aObject );
37}
38
39template <class T, class I>
40bool IsA( const I& aObject )
41{
42 return std::remove_pointer<T>::type::ClassOf( &aObject );
43}
44
54template<class Casted, class From>
55Casted dyn_cast( From aObject )
56{
57 if( std::remove_pointer<Casted>::type::ClassOf ( aObject ) )
58 return static_cast<Casted>( aObject );
59
60 return nullptr;
61}
62
63class EDA_ITEM;
64
65
70{
71 NOT_USED = -1,
72
76
77 // Items in pcb
106
107 // Be prudent with these types:
108 // they should be used only to locate a specific field type among PCB_FIELD_Ts
109 // N.B. If you add a type here, be sure to add it below to the BaseType()
114
115 // Be prudent with these types:
116 // they should be used only to locate specific item sub-types
117 // N.B. If you add a type here, be sure to add it below to the BaseType()
127
128 // Same for locating shapes types from PCB_SHAPE_T items
135
136 /*
137 * Draw items in library symbol.
138 *
139 * The order of these items effects the sort order for items inside the
140 * "DRAW/ENDDRAW" section of the symbol definition in a library file.
141 * If you add a new draw item, type, please make sure you add it so the
142 * sort order is logical.
143 */
150
151 // Schematic draw Items. The order of these items effects the sort order.
152 // It is currently ordered to mimic the old Eeschema locate behavior where
153 // the smallest item is the selected item.
172
173 // Be prudent with these types:
174 // they should be used only to locate a specific field type among SCH_FIELD_Ts
175 // N.B. If you add a type here, be sure to add it below to the BaseType()
180
181 // Same for picking wires, buses and graphics from SCH_ITEM_T items
185
186 // Same for picking labels, or labels attached to wires and/or buses
190
191 // Same for picking symbols which are power symbols
193
194 // matches any type
196
197 // General
199
201
202 /*
203 * For GerbView: item types:
204 */
208
209 /*
210 * For Pl_Editor: item types:
211 */
218
219 // serialized layout used in undo/redo commands
220 WS_PROXY_UNDO_ITEM_T, // serialized layout used in undo/redo commands
221 WS_PROXY_UNDO_ITEM_PLUS_T, // serialized layout plus page and title block settings
222
223 /*
224 * FOR PROJECT::_ELEMs
225 */
232
233 // New types appended here to preserve historical KICAD_T ordinals
234 // (IPC clients with stale protobuf-generated headers depend on stable values).
242
243 // End value
245};
246
247static_assert( S3D_CACHE_T == 104,
248 "KICAD_T ordinals are exposed via IPC; new values must be appended at the end "
249 "of the enum, not inserted into existing blocks." );
250
260constexpr KICAD_T BaseType( const KICAD_T aType )
261{
262 switch( aType )
263 {
268 return SCH_FIELD_T;
269
273 return SCH_LINE_T;
274
278 return SCH_LABEL_T;
279
281 return SCH_SYMBOL_T;
282
287 return PCB_FIELD_T;
288
290 case PCB_LOCATE_PTH_T:
292 return PCB_LOCATE_HOLE_T;
293
302
304 case PCB_DIM_CENTER_T:
305 case PCB_DIM_RADIAL_T:
307 case PCB_DIM_LEADER_T:
308 return PCB_DIMENSION_T;
309
311 return PCB_TABLE_T;
312
313 default:
314 return aType;
315 }
316}
317
318constexpr bool IsNullType( const KICAD_T aType )
319{
320 return aType <= 0;
321}
322
326constexpr bool IsGeneratedTableType( const KICAD_T aType )
327{
328 return aType == PCB_DRILL_CHART_T;
329}
330
331constexpr bool IsInstantiableType( const KICAD_T aType )
332{
333 if( IsNullType( aType ) )
334 return false;
335
336 switch( aType )
337 {
338 case SCH_LOCATE_ANY_T:
339
344
348
352
354
359
366 case PCB_LOCATE_PTH_T:
369
378
379 case PCB_DIMENSION_T:
380
381 case SCH_SCREEN_T:
382 case PCB_ITEM_LIST_T:
383 return false;
384
385 default:
386 break;
387 }
388
389 return true;
390
391}
392
393constexpr bool IsEeschemaType( const KICAD_T aType )
394{
395 switch( aType )
396 {
397 case SCH_MARKER_T:
398 case SCH_JUNCTION_T:
399 case SCH_NO_CONNECT_T:
402 case SCH_LINE_T:
403 case SCH_SHAPE_T:
404 case SCH_RULE_AREA_T:
405 case SCH_BITMAP_T:
406 case SCH_TEXT_T:
407 case SCH_TEXTBOX_T:
408 case SCH_TABLE_T:
409 case SCH_TABLECELL_T:
410 case SCH_LABEL_T:
413 case SCH_HIER_LABEL_T:
414 case SCH_FIELD_T:
415 case SCH_SYMBOL_T:
416 case SCH_SHEET_PIN_T:
417 case SCH_GROUP_T:
418 case SCH_SHEET_T:
419 case SCH_PIN_T:
420
425
429
433
435 case SCH_LOCATE_ANY_T:
436
437 case SCH_SCREEN_T:
438 case SCHEMATIC_T:
439
440 case LIB_SYMBOL_T:
441 return true;
442
443 default:
444 return false;
445 }
446}
447
448constexpr bool IsPcbnewType( const KICAD_T aType )
449{
450 switch( aType )
451 {
452 case PCB_T:
453
454 case PCB_FOOTPRINT_T:
455 case PCB_PAD_T:
456 case PCB_SHAPE_T:
458 case PCB_FIELD_T:
459 case PCB_TEXT_T:
460 case PCB_TEXTBOX_T:
461 case PCB_BARCODE_T:
462 case PCB_TABLE_T:
463 case PCB_TABLECELL_T:
464 case PCB_TRACE_T:
465 case PCB_VIA_T:
466 case PCB_ARC_T:
467 case PCB_MARKER_T:
468 case PCB_DIMENSION_T:
470 case PCB_DIM_LEADER_T:
471 case PCB_DIM_CENTER_T:
472 case PCB_DIM_RADIAL_T:
474 case PCB_TARGET_T:
476 case PCB_DRILL_MAP_T:
477 case PCB_3D_BODY_T:
478 case PCB_POINT_T:
479 case PCB_ZONE_T:
480 case PCB_ITEM_LIST_T:
481 case PCB_NETINFO_T:
482 case PCB_GROUP_T:
483 case PCB_GENERATOR_T:
484 case PCB_GRID_ITEM_T:
485
496 case PCB_LOCATE_PTH_T:
508 case PCB_CONSTRAINT_T:
509 return true;
510
511 default:
512 return false;
513 }
514}
515
516constexpr bool IsSingleLayerType( const KICAD_T aType )
517{
518 switch( aType )
519 {
520 case PCB_SHAPE_T:
522 case PCB_FIELD_T:
523 case PCB_TEXT_T:
524 case PCB_TEXTBOX_T:
525 case PCB_BARCODE_T:
526 case PCB_TABLE_T:
528 case PCB_DRILL_MAP_T:
529 case PCB_TABLECELL_T:
530 case PCB_TRACE_T:
531 case PCB_ARC_T:
532 case PCB_MARKER_T:
533 case PCB_DIMENSION_T:
535 case PCB_DIM_LEADER_T:
536 case PCB_DIM_CENTER_T:
537 case PCB_DIM_RADIAL_T:
539 case PCB_TARGET_T:
540 case PCB_POINT_T:
541 case PCB_GENERATOR_T:
542 return true;
543
544 default:
545 return false;
546 }
547}
548
549constexpr bool IsGerbviewType( const KICAD_T aType )
550{
551 switch( aType )
552 {
553 case GERBER_LAYOUT_T:
555 case GERBER_IMAGE_T:
556 return true;
557
558 default:
559 return false;
560 }
561}
562
563constexpr bool IsPageLayoutEditorType( const KICAD_T aType )
564{
565 switch( aType )
566 {
567 case WSG_LINE_T:
568 case WSG_RECT_T:
569 case WSG_POLY_T:
570 case WSG_TEXT_T:
571 case WSG_BITMAP_T:
572 case WSG_PAGE_T:
573
576 return true;
577
578 default:
579 return false;
580 }
581}
582
583constexpr bool IsMiscType( const KICAD_T aType )
584{
585 switch( aType )
586 {
587 case SCREEN_T:
588
590 case FP_LIB_TABLE_T:
592 case SYMBOL_LIBS_T:
593 case SEARCH_STACK_T:
594 case S3D_CACHE_T:
595 return true;
596
597 default:
598 return false;
599 }
600}
601
602constexpr bool IsTypeCorrect( KICAD_T aType )
603{
604 return IsNullType( aType )
605 || IsEeschemaType( aType )
606 || IsPcbnewType( aType )
607 || IsGerbviewType( aType )
608 || IsPageLayoutEditorType( aType )
609 || IsMiscType( aType );
610}
A base class for most all the KiCad significant classes used in schematics and boards.
Definition eda_item.h:98
#define I(x, y, z)
Definition md5_hash.cpp:18
constexpr KICAD_T BaseType(const KICAD_T aType)
Return the underlying type of the given type.
Definition typeinfo.h:260
constexpr bool IsSingleLayerType(const KICAD_T aType)
Definition typeinfo.h:516
constexpr bool IsGerbviewType(const KICAD_T aType)
Definition typeinfo.h:549
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition typeinfo.h:70
@ FP_LIB_TABLE_T
Definition typeinfo.h:227
@ SCH_GROUP_T
Definition typeinfo.h:169
@ SCH_TABLE_T
Definition typeinfo.h:161
@ PCB_SHAPE_LOCATE_ELLIPSE_ARC_T
Definition typeinfo.h:236
@ PCB_T
Definition typeinfo.h:74
@ PCB_CONSTRAINT_T
a geometric constraint between board items
Definition typeinfo.h:237
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
Definition typeinfo.h:80
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
Definition typeinfo.h:98
@ SCH_LINE_T
Definition typeinfo.h:159
@ PCB_FIELD_LOCATE_VALUE_T
Definition typeinfo.h:111
@ LIB_SYMBOL_T
Definition typeinfo.h:144
@ SCH_NO_CONNECT_T
Definition typeinfo.h:156
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
Definition typeinfo.h:95
@ SCH_FIELD_LOCATE_REFERENCE_T
Definition typeinfo.h:176
@ PCB_GENERATOR_T
class PCB_GENERATOR, generator on a layer
Definition typeinfo.h:83
@ PCB_LOCATE_BOARD_EDGE_T
Definition typeinfo.h:126
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
Definition typeinfo.h:89
@ SCH_FIELD_LOCATE_FOOTPRINT_T
Definition typeinfo.h:178
@ TYPE_NOT_INIT
Definition typeinfo.h:73
@ MAX_STRUCT_TYPE_ID
Definition typeinfo.h:244
@ SCH_SYMBOL_T
Definition typeinfo.h:168
@ PCB_DRILL_MAP_T
class PCB_DRILL_MAP, drill symbols drawn at the holes
Definition typeinfo.h:240
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
Definition typeinfo.h:96
@ PCB_LOCATE_NPTH_T
Definition typeinfo.h:125
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
Definition typeinfo.h:103
@ SCH_TABLECELL_T
Definition typeinfo.h:162
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
Definition typeinfo.h:85
@ PCB_ZONE_T
class ZONE, a copper pour area
Definition typeinfo.h:100
@ PCB_LOCATE_BLINDVIA_T
Definition typeinfo.h:120
@ SCH_ITEM_LOCATE_WIRE_T
Definition typeinfo.h:182
@ SCH_FIELD_T
Definition typeinfo.h:146
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
Definition typeinfo.h:84
@ PCB_LOCATE_TEXT_T
Definition typeinfo.h:122
@ SCH_DIRECTIVE_LABEL_T
Definition typeinfo.h:167
@ SCH_LABEL_T
Definition typeinfo.h:163
@ SCH_LOCATE_ANY_T
Definition typeinfo.h:195
@ SCH_FIELD_LOCATE_VALUE_T
Definition typeinfo.h:177
@ S3D_CACHE_T
Definition typeinfo.h:231
@ SCH_SHEET_T
Definition typeinfo.h:171
@ SCH_ITEM_LOCATE_BUS_T
Definition typeinfo.h:183
@ PCB_3D_BODY_T
class PCB_3D_BODY, a 3D body (extruded or model) on a footprint
Definition typeinfo.h:241
@ PCB_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
Definition typeinfo.h:81
@ SCH_MARKER_T
Definition typeinfo.h:154
@ PCB_ITEM_LIST_T
class BOARD_ITEM_LIST, a list of board items
Definition typeinfo.h:101
@ SCH_SHAPE_T
Definition typeinfo.h:145
@ WSG_POLY_T
Definition typeinfo.h:214
@ SCH_RULE_AREA_T
Definition typeinfo.h:166
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
Definition typeinfo.h:82
@ PCB_LOCATE_STDVIA_T
Definition typeinfo.h:118
@ GERBER_DRAW_ITEM_T
Definition typeinfo.h:206
@ SCH_HIER_LABEL_T
Definition typeinfo.h:165
@ NOT_USED
the 3d code uses this value
Definition typeinfo.h:71
@ PCB_LOCATE_BURIEDVIA_T
Definition typeinfo.h:121
@ PCB_MARKER_T
class PCB_MARKER, a marker used to show something
Definition typeinfo.h:91
@ WSG_LINE_T
Definition typeinfo.h:212
@ SCH_BUS_BUS_ENTRY_T
Definition typeinfo.h:158
@ PCB_BARCODE_T
class PCB_BARCODE, a barcode (graphic item)
Definition typeinfo.h:93
@ SCH_SCREEN_T
Definition typeinfo.h:198
@ PCB_TARGET_T
class PCB_TARGET, a target (graphic item)
Definition typeinfo.h:99
@ SCH_LABEL_LOCATE_ANY_T
Definition typeinfo.h:187
@ PCB_SHAPE_LOCATE_CIRCLE_T
Definition typeinfo.h:131
@ PCB_SHAPE_LOCATE_SEGMENT_T
Definition typeinfo.h:129
@ SCH_FIELD_LOCATE_DATASHEET_T
Definition typeinfo.h:179
@ PCB_SHAPE_LOCATE_RECT_T
Definition typeinfo.h:130
@ SYMBOL_LIB_TABLE_T
Definition typeinfo.h:226
@ SCH_ITEM_LOCATE_GRAPHIC_LINE_T
Definition typeinfo.h:184
@ PCB_SHAPE_LOCATE_ELLIPSE_T
Definition typeinfo.h:235
@ SCHEMATIC_T
Definition typeinfo.h:200
@ SCH_LABEL_LOCATE_WIRE_T
Definition typeinfo.h:188
@ WSG_TEXT_T
Definition typeinfo.h:215
@ PCB_TABLECELL_T
class PCB_TABLECELL, PCB_TEXTBOX for use in tables
Definition typeinfo.h:87
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
Definition typeinfo.h:78
@ SCH_SHEET_PIN_T
Definition typeinfo.h:170
@ PCB_GRID_ITEM_T
a subgrid placed on a board
Definition typeinfo.h:238
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
Definition typeinfo.h:94
@ PCB_FIELD_LOCATE_REFERENCE_T
Definition typeinfo.h:110
@ SCH_TEXT_T
Definition typeinfo.h:147
@ PCB_SHAPE_LOCATE_BEZIER_T
Definition typeinfo.h:134
@ WSG_PAGE_T
Definition typeinfo.h:217
@ WS_PROXY_UNDO_ITEM_T
Definition typeinfo.h:220
@ SEARCH_STACK_T
Definition typeinfo.h:230
@ SYMBOL_LIBS_T
Definition typeinfo.h:229
@ SCH_LABEL_LOCATE_BUS_T
Definition typeinfo.h:189
@ PCB_LOCATE_PTH_T
Definition typeinfo.h:124
@ PCB_PAD_T
class PAD, a pad in a footprint
Definition typeinfo.h:79
@ WSG_RECT_T
Definition typeinfo.h:213
@ PCB_SHAPE_LOCATE_POLY_T
Definition typeinfo.h:133
@ PCB_SHAPE_LOCATE_ARC_T
Definition typeinfo.h:132
@ SCH_SYMBOL_LOCATE_POWER_T
Definition typeinfo.h:192
@ DESIGN_BLOCK_LIB_TABLE_T
Definition typeinfo.h:228
@ GERBER_IMAGE_T
Definition typeinfo.h:207
@ SCH_BUS_WIRE_ENTRY_T
Definition typeinfo.h:157
@ GERBER_LAYOUT_T
Definition typeinfo.h:205
@ SCREEN_T
not really an item, used to identify a screen
Definition typeinfo.h:75
@ SCH_BITMAP_T
Definition typeinfo.h:160
@ PCB_BOARD_OUTLINE_T
class PCB_BOARD_OUTLINE_T, a pcb board outline item
Definition typeinfo.h:104
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
Definition typeinfo.h:90
@ WS_PROXY_UNDO_ITEM_PLUS_T
Definition typeinfo.h:221
@ PCB_LOCATE_UVIA_T
Definition typeinfo.h:119
@ PCB_DIMENSION_T
class PCB_DIMENSION_BASE: abstract dimension meta-type
Definition typeinfo.h:92
@ PCB_TABLE_T
class PCB_TABLE, table of PCB_TABLECELLs
Definition typeinfo.h:86
@ PCB_NETINFO_T
class NETINFO_ITEM, a description of a net
Definition typeinfo.h:102
@ SCH_TEXTBOX_T
Definition typeinfo.h:148
@ WSG_BITMAP_T
Definition typeinfo.h:216
@ PCB_LOCATE_HOLE_T
Definition typeinfo.h:123
@ PCB_FIELD_LOCATE_DATASHEET_T
Definition typeinfo.h:113
@ PCB_POINT_T
class PCB_POINT, a 0-dimensional point
Definition typeinfo.h:105
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
Definition typeinfo.h:88
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
Definition typeinfo.h:97
@ PCB_DRILL_CHART_T
class PCB_DRILL_CHART, a live drill chart derived from PCB_TABLE
Definition typeinfo.h:239
@ SCH_GLOBAL_LABEL_T
Definition typeinfo.h:164
@ PCB_FIELD_LOCATE_FOOTPRINT_T
Definition typeinfo.h:112
@ SCH_JUNCTION_T
Definition typeinfo.h:155
@ SCH_PIN_T
Definition typeinfo.h:149
constexpr bool IsTypeCorrect(KICAD_T aType)
Definition typeinfo.h:602
constexpr bool IsPcbnewType(const KICAD_T aType)
Definition typeinfo.h:448
constexpr bool IsMiscType(const KICAD_T aType)
Definition typeinfo.h:583
constexpr bool IsInstantiableType(const KICAD_T aType)
Definition typeinfo.h:331
constexpr bool IsGeneratedTableType(const KICAD_T aType)
A PCB_TABLE subclass whose cells are generated from the board rather than typed by the user.
Definition typeinfo.h:326
Casted dyn_cast(From aObject)
A lightweight dynamic downcast.
Definition typeinfo.h:55
constexpr bool IsNullType(const KICAD_T aType)
Definition typeinfo.h:318
bool IsA(const I *aObject)
Check if the type of aObject is T.
Definition typeinfo.h:34
constexpr bool IsEeschemaType(const KICAD_T aType)
Definition typeinfo.h:393
constexpr bool IsPageLayoutEditorType(const KICAD_T aType)
Definition typeinfo.h:563