KiCad PCB EDA Suite
Loading...
Searching...
No Matches
pcb_marker.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) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <[email protected]>
6 * Copyright The KiCad Developers, see AUTHORS.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
27#include <bitmaps.h>
28#include <base_units.h>
29#include <eda_draw_frame.h>
30#include <board.h>
32#include <pcb_marker.h>
33#include <layer_ids.h>
36#include <geometry/shape_null.h>
37#include <widgets/ui_common.h>
39#include <pgm_base.h>
40#include <drc/drc_item.h>
41#include <drc/drc_rule.h>
42#include <trigo.h>
43#include <properties/property.h>
45
46
48#define SCALING_FACTOR pcbIUScale.mmToIU( 0.1625 )
49
50
51
52PCB_MARKER::PCB_MARKER( std::shared_ptr<RC_ITEM> aItem, const VECTOR2I& aPosition, int aLayer ) :
53 BOARD_ITEM( nullptr, PCB_MARKER_T, F_Cu ), // parent set during BOARD::Add()
55 m_pathLength( 0 )
56{
57 if( m_rcItem )
58 {
59 m_rcItem->SetParent( this );
60
61 if( aLayer == LAYER_DRAWINGSHEET )
62 {
64 }
65 else
66 {
67 switch( m_rcItem->GetErrorCode() )
68 {
71 break;
72
81 break;
82
83 default:
85 break;
86 }
87
88 SetLayer( ToLAYER_ID( aLayer ) );
89 }
90 }
91
92 m_Pos = aPosition;
93}
94
95
96/* destructor */
98{
99 if( m_rcItem )
100 m_rcItem->SetParent( nullptr );
101}
102
103
105{
106 if( m_rcItem->GetErrorCode() == DRCE_COPPER_SLIVER
107 || m_rcItem->GetErrorCode() == DRCE_GENERIC_WARNING
108 || m_rcItem->GetErrorCode() == DRCE_GENERIC_ERROR )
109 {
110 return wxString::Format( wxT( "%s|%d|%d|%s|%s" ),
111 m_rcItem->GetSettingsKey(),
112 m_Pos.x,
113 m_Pos.y,
114 m_rcItem->GetMainItemID().AsString(),
115 LayerName( m_layer ) );
116 }
117 else if( m_rcItem->GetErrorCode() == DRCE_UNCONNECTED_ITEMS )
118 {
119 PCB_LAYER_ID layer = m_layer;
120
121 if( m_layer == UNDEFINED_LAYER )
122 layer = F_Cu;
123
124 return wxString::Format( wxT( "%s|%d|%d|%s|%d|%s|%s" ),
125 m_rcItem->GetSettingsKey(),
126 m_Pos.x,
127 m_Pos.y,
128 LayerName( layer ),
130 m_rcItem->GetMainItemID().AsString(),
131 m_rcItem->GetAuxItemID().AsString() );
132 }
133 else if( m_rcItem->GetErrorCode() == DRCE_STARVED_THERMAL )
134 {
135 return wxString::Format( wxT( "%s|%d|%d|%s|%s|%s" ),
136 m_rcItem->GetSettingsKey(),
137 m_Pos.x,
138 m_Pos.y,
139 m_rcItem->GetMainItemID().AsString(),
140 m_rcItem->GetAuxItemID().AsString(),
141 LayerName( m_layer ) );
142 }
143 else if( m_rcItem->GetErrorCode() == DRCE_UNRESOLVED_VARIABLE
144 && m_rcItem->GetParent()->GetMarkerType() == MARKER_DRAWING_SHEET )
145 {
146 return wxString::Format( wxT( "%s|%d|%d|%s|%s" ),
147 m_rcItem->GetSettingsKey(),
148 m_Pos.x,
149 m_Pos.y,
150 // Drawing sheet KIIDs aren't preserved between runs
151 wxEmptyString,
152 wxEmptyString );
153 }
154 else
155 {
156 return wxString::Format( wxT( "%s|%d|%d|%s|%s" ),
157 m_rcItem->GetSettingsKey(),
158 m_Pos.x,
159 m_Pos.y,
160 m_rcItem->GetMainItemID().AsString(),
161 m_rcItem->GetAuxItemID().AsString() );
162 }
163}
164
165
167{
168 auto getMarkerLayer =
169 []( const wxString& layerName ) -> int
170 {
171 for( int layer = 0; layer < PCB_LAYER_ID_COUNT; ++layer )
172 {
173 if( LayerName( ToLAYER_ID( layer ) ) == layerName )
174 return layer;
175 }
176
177 return F_Cu;
178 };
179
180 wxArrayString props = wxSplit( data, '|' );
181 int markerLayer = F_Cu;
182 VECTOR2I markerPos( (int) strtol( props[1].c_str(), nullptr, 10 ),
183 (int) strtol( props[2].c_str(), nullptr, 10 ) );
184
185 std::shared_ptr<DRC_ITEM> drcItem = DRC_ITEM::Create( props[0] );
186
187 if( !drcItem )
188 return nullptr;
189
190 if( drcItem->GetErrorCode() == DRCE_COPPER_SLIVER
191 || drcItem->GetErrorCode() == DRCE_GENERIC_WARNING
192 || drcItem->GetErrorCode() == DRCE_GENERIC_ERROR )
193 {
194 drcItem->SetItems( KIID( props[3] ) );
195 markerLayer = getMarkerLayer( props[4] );
196 }
197 else if( drcItem->GetErrorCode() == DRCE_UNCONNECTED_ITEMS )
198 {
199 // Pre-9.0.4 versions didn't have KIIDs as last two properties to allow sorting stability
200 if( props.size() < 6 )
201 drcItem->SetItems( KIID( props[3] ), KIID( props[4] ) );
202 else
203 drcItem->SetItems( KIID( props[5] ), KIID( props[6] ) );
204 }
205 else if( drcItem->GetErrorCode() == DRCE_STARVED_THERMAL )
206 {
207 drcItem->SetItems( KIID( props[3] ), KIID( props[4] ) );
208
209 // Pre-7.0 versions didn't differentiate between layers
210 if( props.size() == 6 )
211 markerLayer = getMarkerLayer( props[5] );
212 }
213 else if( drcItem->GetErrorCode() == DRCE_UNRESOLVED_VARIABLE
214 && props[3].IsEmpty() && props[4].IsEmpty() )
215 {
216 // Note: caller must load our item pointer with the drawing sheet proxy item
217 markerLayer = LAYER_DRAWINGSHEET;
218 }
219 else
220 {
221 drcItem->SetItems( KIID( props[3] ), KIID( props[4] ) );
222 }
223
224 return new PCB_MARKER( drcItem, markerPos, markerLayer );
225}
226
227
229{
230 wxASSERT( aImage->Type() == PCB_MARKER_T );
231
232 std::swap( *((PCB_MARKER*) this), *((PCB_MARKER*) aImage) );
233}
234
235
236void PCB_MARKER::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
237{
238 aList.emplace_back( _( "Type" ), _( "Marker" ) );
239 aList.emplace_back( _( "Violation" ), HYPERLINK_DV_RENDERER::StripMarkup( m_rcItem->GetErrorMessage( true ) ) );
240
241 switch( GetSeverity() )
242 {
244 aList.emplace_back( _( "Severity" ), _( "Ignore" ) );
245 break;
247 aList.emplace_back( _( "Severity" ), _( "Warning" ) );
248 break;
250 aList.emplace_back( _( "Severity" ), _( "Error" ) );
251 break;
252 default:
253 break;
254 }
255
257 {
258 aList.emplace_back( _( "Drawing Sheet" ), wxEmptyString );
259 }
260 else
261 {
262 wxString mainText;
263 wxString auxText;
264 EDA_ITEM* mainItem = aFrame->ResolveItem( m_rcItem->GetMainItemID() );
265 EDA_ITEM* auxItem = aFrame->ResolveItem( m_rcItem->GetAuxItemID() );
266
267 if( mainItem )
268 mainText = mainItem->GetItemDescription( aFrame, true );
269
270 if( auxItem )
271 auxText = auxItem->GetItemDescription( aFrame, true );
272
273 aList.emplace_back( mainText, auxText );
274 }
275
276 if( IsExcluded() )
277 aList.emplace_back( _( "Excluded" ), m_comment );
278}
279
280
281void PCB_MARKER::Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle )
282{
283 // Marker geometry isn't user-editable
284}
285
286
287void PCB_MARKER::Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
288{
289 // Marker geometry isn't user-editable
290}
291
292
293std::shared_ptr<SHAPE> PCB_MARKER::GetEffectiveShape( PCB_LAYER_ID aLayer, FLASHING aFlash ) const
294{
295 // Markers do not participate in the board geometry space, and therefore have no effective shape.
296 return std::make_shared<SHAPE_NULL>();
297}
298
299
301 int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth ) const
302{
303 // Markers do not participate in the board geometry space, and therefore have no shape.
304};
305
306
307wxString PCB_MARKER::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
308{
309 return wxString::Format( _( "Marker (%s)" ), aFull ? m_rcItem->GetErrorMessage( true )
310 : m_rcItem->GetErrorText( true ) );
311}
312
313
315{
316 return BITMAPS::drc;
317}
318
319
321{
322 if( IsExcluded() )
324
325 DRC_ITEM* item = static_cast<DRC_ITEM*>( m_rcItem.get() );
326
327 if( item->GetErrorCode() == DRCE_GENERIC_WARNING )
329 else if( item->GetErrorCode() == DRCE_GENERIC_ERROR )
330 return RPT_SEVERITY_ERROR;
331
332 DRC_RULE* rule = item->GetViolatingRule();
333
334 if( rule && rule->m_Severity != RPT_SEVERITY_UNDEFINED )
335 return rule->m_Severity;
336
337 return GetBoard()->GetDesignSettings().GetSeverity( item->GetErrorCode() );
338}
339
340
341std::vector<int> PCB_MARKER::ViewGetLayers() const
342{
344 return {};
345
346 std::vector<int> layers{ 0, LAYER_MARKER_SHADOWS, LAYER_DRC_SHAPES, LAYER_DRC_HIGHLIGHTED };
347
348 switch( GetSeverity() )
349 {
350 default:
351 case SEVERITY::RPT_SEVERITY_ERROR: layers[0] = LAYER_DRC_ERROR; break;
352 case SEVERITY::RPT_SEVERITY_WARNING: layers[0] = LAYER_DRC_WARNING; break;
354 }
355
356 return layers;
357}
358
359
370
371
373{
374 return ::GetColorSettings( DEFAULT_THEME )->GetColor( GetColorLayer() );
375}
376
377
378void PCB_MARKER::SetZoom( double aZoomFactor ) const
379{
380 SetMarkerScale( SCALING_FACTOR * aZoomFactor );
381}
382
383
384std::vector<PCB_SHAPE> PCB_MARKER::GetShapes() const
385{
386 STROKE_PARAMS hairline( 1.0 ); // Segments of width 1.0 will get drawn as lines by PCB_PAINTER
387 std::vector<PCB_SHAPE> pathShapes;
388
389 if( m_pathStart == m_pathEnd )
390 {
391 // Add a collision 'X'
392 const int len = KiROUND( 2.5 * MarkerScale() );
393
394 PCB_SHAPE s( nullptr, SHAPE_T::SEGMENT );
395 s.SetStroke( hairline );
396
397 s.SetStart( m_pathStart + VECTOR2I( -len, -len ) );
398 s.SetEnd( m_pathStart + VECTOR2I( len, len ) );
399 pathShapes.push_back( s );
400
401 s.SetStart( m_pathStart + VECTOR2I( -len, len ) );
402 s.SetEnd( m_pathStart + VECTOR2I( len, -len ) );
403 pathShapes.push_back( s );
404 }
405 else
406 {
407 // Add the path
408 for( PCB_SHAPE shape : m_pathShapes )
409 {
410 shape.SetStroke( hairline );
411 pathShapes.push_back( std::move( shape ) );
412 }
413
414 // Draw perpendicular begin/end stops
415 if( pathShapes.size() > 0 )
416 {
417 VECTOR2I V1 = pathShapes[0].GetStart() - pathShapes[0].GetEnd();
418 VECTOR2I V2 = pathShapes.back().GetStart() - pathShapes.back().GetEnd();
419 V1 = V1.Perpendicular().Resize( 2.5 * MarkerScale() );
420 V2 = V2.Perpendicular().Resize( 2.5 * MarkerScale() );
421
422 PCB_SHAPE s( nullptr, SHAPE_T::SEGMENT );
423 s.SetStroke( hairline );
424
425 s.SetStart( m_pathStart + V1 );
426 s.SetEnd( m_pathStart - V1 );
427 pathShapes.push_back( s );
428
429 s.SetStart( m_pathEnd + V2 );
430 s.SetEnd( m_pathEnd - V2 );
431 pathShapes.push_back( s );
432 }
433 }
434
435 // Add shaded areas
436 for( PCB_SHAPE shape : m_pathShapes )
437 {
438 shape.SetWidth( 10 * MarkerScale() );
439 pathShapes.push_back( std::move( shape ) );
440 }
441
442 return pathShapes;
443}
444
445
447{
449
450 for( const PCB_SHAPE& s : m_pathShapes )
451 box.Merge( s.GetBoundingBox() );
452
453 return box;
454}
455
456
458{
459 return GetBoundingBox();
460}
461
462
463static struct PCB_MARKER_DESC
464{
466 {
473
474 // Markers cannot be locked and have no user-accessible layer control
475 propMgr.Mask( TYPE_HASH( PCB_MARKER ), TYPE_HASH( BOARD_ITEM ), _HKI( "Layer" ) );
476 propMgr.Mask( TYPE_HASH( PCB_MARKER ), TYPE_HASH( BOARD_ITEM ), _HKI( "Locked" ) );
477 }
ERROR_LOC
When approximating an arc or circle, should the error be placed on the outside or inside of the curve...
BITMAPS
A list of all bitmap identifiers.
BOX2< VECTOR2I > BOX2I
Definition box2.h:922
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition box2.h:990
SEVERITY GetSeverity(int aDRCErrorCode)
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition board_item.h:84
BOARD_ITEM(BOARD_ITEM *aParent, KICAD_T idtype, PCB_LAYER_ID aLayer=F_Cu)
Definition board_item.h:86
PCB_LAYER_ID m_layer
Definition board_item.h:490
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition board_item.h:316
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition board.cpp:1101
constexpr BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
Definition box2.h:658
DRC_RULE * GetViolatingRule() const
Definition drc_item.h:164
static std::shared_ptr< DRC_ITEM > Create(int aErrorCode)
Constructs a DRC_ITEM for the given error code.
Definition drc_item.cpp:417
SEVERITY m_Severity
Definition drc_rule.h:162
The base class for create windows for drawing purpose.
virtual EDA_ITEM * ResolveItem(const KIID &aId, bool aAllowNullptrReturn=false) const
Fetch an item by KIID.
virtual wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const
Return a user-visible description string of this item.
Definition eda_item.cpp:173
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:112
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
Definition eda_item.cpp:41
void SetStart(const VECTOR2I &aStart)
Definition eda_shape.h:198
void SetEnd(const VECTOR2I &aEnd)
Definition eda_shape.h:240
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:105
Definition kiid.h:48
Marker are mainly used to show a DRC or ERC error or warning.
Definition marker_base.h:49
void SetMarkerScale(int aScale) const
Definition marker_base.h:70
bool IsExcluded() const
Definition marker_base.h:93
wxString m_comment
User supplied comment.
int MarkerScale() const
The scaling factor to convert polygonal shape coordinates to internal units.
Definition marker_base.h:69
VECTOR2I m_Pos
Position of the marker.
@ MARKER_DRAWING_SHEET
Definition marker_base.h:56
void SetMarkerType(enum MARKER_T aMarkerType)
Accessors to set/get marker type (DRC, ERC, or other)
Definition marker_base.h:90
std::shared_ptr< RC_ITEM > m_rcItem
enum MARKER_T GetMarkerType() const
Definition marker_base.h:91
MARKER_BASE(int aScalingFactor, std::shared_ptr< RC_ITEM > aItem, MARKER_T aType=MARKER_UNSPEC)
BOX2I GetBoundingBoxMarker() const
Return the orthogonal, bounding box of this object for display purposes.
void SetZoom(double aZoomFactor) const
void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
VECTOR2I m_pathEnd
Definition pcb_marker.h:172
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth) const override
Convert the item shape to a closed polygon.
VECTOR2I m_pathStart
Definition pcb_marker.h:171
std::vector< PCB_SHAPE > GetShapes() const
std::vector< PCB_SHAPE > m_pathShapes
Definition pcb_marker.h:170
std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer, FLASHING aFlash=FLASHING::DEFAULT) const override
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
const BOX2I ViewBBox() const override
Return the bounding box of the item covering all its layers.
std::vector< int > ViewGetLayers() const override
Return the all the layers within the VIEW the object is painted on.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
SEVERITY GetSeverity() const override
static PCB_MARKER * DeserializeFromString(const wxString &data)
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
wxString SerializeToString() const
GAL_LAYER_ID GetColorLayer() const
PCB_MARKER(std::shared_ptr< RC_ITEM > aItem, const VECTOR2I &aPos, int aLayer=F_Cu)
KIGFX::COLOR4D getColor() const override
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
int m_pathLength
Definition pcb_marker.h:173
void swapData(BOARD_ITEM *aImage) override
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
void SetStroke(const STROKE_PARAMS &aStroke) override
Definition pcb_shape.h:98
Provide class metadata.Helper macro to map type hashes to names.
void InheritsAfter(TYPE_ID aDerived, TYPE_ID aBase)
Declare an inheritance relationship between types.
void Mask(TYPE_ID aDerived, TYPE_ID aBase, const wxString &aName)
Sets a base class property as masked in a derived class.
static PROPERTY_MANAGER & Instance()
void AddTypeCast(TYPE_CAST_BASE *aCast)
Register a type converter.
int GetErrorCode() const
Definition rc_item.h:161
Represent a set of closed polygons.
Simple container to manage line stroke parameters.
constexpr VECTOR2< T > Perpendicular() const
Compute the perpendicular vector.
Definition vector2d.h:314
VECTOR2< T > Resize(T aNewLength) const
Return a vector of the same direction, but length specified in aNewLength.
Definition vector2d.h:385
@ DRCE_FOOTPRINT_FILTERS
Definition drc_item.h:80
@ DRCE_UNCONNECTED_ITEMS
Definition drc_item.h:40
@ DRCE_STARVED_THERMAL
Definition drc_item.h:50
@ DRCE_SCHEMATIC_FIELDS_PARITY
Definition drc_item.h:122
@ DRCE_GENERIC_ERROR
Definition drc_item.h:91
@ DRCE_COPPER_SLIVER
Definition drc_item.h:93
@ DRCE_UNRESOLVED_VARIABLE
Definition drc_item.h:88
@ DRCE_DUPLICATE_FOOTPRINT
Definition drc_item.h:76
@ DRCE_EXTRA_FOOTPRINT
Definition drc_item.h:77
@ DRCE_NET_CONFLICT
Definition drc_item.h:78
@ DRCE_MISSING_FOOTPRINT
Definition drc_item.h:75
@ DRCE_GENERIC_WARNING
Definition drc_item.h:90
@ DRCE_SCHEMATIC_PARITY
Definition drc_item.h:79
#define _(s)
@ SEGMENT
Definition eda_shape.h:50
wxString LayerName(int aLayer)
Returns the default display name for a given layer.
Definition layer_id.cpp:31
FLASHING
Enum used during connectivity building to ensure we do not query connectivity while building the data...
Definition layer_ids.h:184
GAL_LAYER_ID
GAL layers are "virtual" layers, i.e.
Definition layer_ids.h:228
@ LAYER_DRAWINGSHEET
Sheet frame and title block.
Definition layer_ids.h:278
@ LAYER_DRC_EXCLUSION
Layer for DRC markers which have been individually excluded.
Definition layer_ids.h:304
@ LAYER_DRC_HIGHLIGHTED
Color for highlighted DRC markers.
Definition layer_ids.h:332
@ LAYER_DRC_SHAPES
Custom shapes for DRC markers.
Definition layer_ids.h:315
@ LAYER_DRC_WARNING
Layer for DRC markers with #SEVERITY_WARNING.
Definition layer_ids.h:301
@ LAYER_MARKER_SHADOWS
Shadows for DRC markers.
Definition layer_ids.h:305
@ LAYER_DRC_ERROR
Layer for DRC markers with #SEVERITY_ERROR.
Definition layer_ids.h:277
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:60
@ UNDEFINED_LAYER
Definition layer_ids.h:61
@ PCB_LAYER_ID_COUNT
Definition layer_ids.h:171
@ F_Cu
Definition layer_ids.h:64
PCB_LAYER_ID ToLAYER_ID(int aLayer)
Definition lset.cpp:754
FLIP_DIRECTION
Definition mirror.h:27
#define _HKI(x)
Definition page_info.cpp:44
static struct PCB_MARKER_DESC _PCB_MARKER_DESC
see class PGM_BASE
#define TYPE_HASH(x)
Definition property.h:74
#define REGISTER_TYPE(x)
SEVERITY
@ RPT_SEVERITY_WARNING
@ RPT_SEVERITY_ERROR
@ RPT_SEVERITY_UNDEFINED
@ RPT_SEVERITY_EXCLUSION
@ RPT_SEVERITY_IGNORE
#define SCALING_FACTOR
Factor to convert the maker unit shape to internal units:
#define DEFAULT_THEME
@ PCB_MARKER_T
class PCB_MARKER, a marker used to show something
Definition typeinfo.h:96
Functions to provide common constants and other functions to assist in making a consistent UI.
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:687