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, see <https://www.gnu.org/licenses/>.
20 */
21
23#include <bitmaps.h>
24#include <base_units.h>
25#include <eda_draw_frame.h>
26#include <board.h>
28#include <pcb_marker.h>
29#include <layer_ids.h>
32#include <geometry/shape_null.h>
33#include <widgets/ui_common.h>
35#include <pgm_base.h>
36#include <drc/drc_item.h>
37#include <drc/drc_rule.h>
38#include <trigo.h>
39#include <properties/property.h>
41
42
44#define SCALING_FACTOR pcbIUScale.mmToIU( 0.1625 )
45
46
47
48PCB_MARKER::PCB_MARKER( std::shared_ptr<RC_ITEM> aItem, const VECTOR2I& aPosition, int aLayer ) :
49 BOARD_ITEM( nullptr, PCB_MARKER_T, F_Cu ), // parent set during BOARD::Add()
51 m_pathLength( 0 )
52{
53 if( m_rcItem )
54 {
55 m_rcItem->SetParent( this );
56
57 if( aLayer == LAYER_DRAWINGSHEET )
58 {
60 }
61 else
62 {
63 switch( m_rcItem->GetErrorCode() )
64 {
67 break;
68
77 break;
78
79 default:
81 break;
82 }
83
84 SetLayer( ToLAYER_ID( aLayer ) );
85 }
86 }
87
88 m_Pos = aPosition;
89}
90
91
92/* destructor */
94{
95 if( m_rcItem )
96 m_rcItem->SetParent( nullptr );
97}
98
99
101{
102 if( m_rcItem->GetErrorCode() == DRCE_COPPER_SLIVER
103 || m_rcItem->GetErrorCode() == DRCE_GENERIC_WARNING
104 || m_rcItem->GetErrorCode() == DRCE_GENERIC_ERROR )
105 {
106 return wxString::Format( wxT( "%s|%d|%d|%s|%s" ),
107 m_rcItem->GetSettingsKey(),
108 m_Pos.x,
109 m_Pos.y,
110 m_rcItem->GetMainItemID().AsString(),
111 LayerName( m_layer ) );
112 }
113 else if( m_rcItem->GetErrorCode() == DRCE_UNCONNECTED_ITEMS )
114 {
115 PCB_LAYER_ID layer = m_layer;
116
117 if( m_layer == UNDEFINED_LAYER )
118 layer = F_Cu;
119
120 return wxString::Format( wxT( "%s|%d|%d|%s|%d|%s|%s" ),
121 m_rcItem->GetSettingsKey(),
122 m_Pos.x,
123 m_Pos.y,
124 LayerName( layer ),
126 m_rcItem->GetMainItemID().AsString(),
127 m_rcItem->GetAuxItemID().AsString() );
128 }
129 else if( m_rcItem->GetErrorCode() == DRCE_STARVED_THERMAL )
130 {
131 return wxString::Format( wxT( "%s|%d|%d|%s|%s|%s" ),
132 m_rcItem->GetSettingsKey(),
133 m_Pos.x,
134 m_Pos.y,
135 m_rcItem->GetMainItemID().AsString(),
136 m_rcItem->GetAuxItemID().AsString(),
137 LayerName( m_layer ) );
138 }
139 else if( m_rcItem->GetErrorCode() == DRCE_UNRESOLVED_VARIABLE
140 && m_rcItem->GetParent()->GetMarkerType() == MARKER_DRAWING_SHEET )
141 {
142 return wxString::Format( wxT( "%s|%d|%d|%s|%s" ),
143 m_rcItem->GetSettingsKey(),
144 m_Pos.x,
145 m_Pos.y,
146 // Drawing sheet KIIDs aren't preserved between runs
147 wxEmptyString,
148 wxEmptyString );
149 }
150 else
151 {
152 return wxString::Format( wxT( "%s|%d|%d|%s|%s" ),
153 m_rcItem->GetSettingsKey(),
154 m_Pos.x,
155 m_Pos.y,
156 m_rcItem->GetMainItemID().AsString(),
157 m_rcItem->GetAuxItemID().AsString() );
158 }
159}
160
161
163{
164 auto getMarkerLayer =
165 []( const wxString& layerName ) -> int
166 {
167 for( int layer = 0; layer < PCB_LAYER_ID_COUNT; ++layer )
168 {
169 if( LayerName( ToLAYER_ID( layer ) ) == layerName )
170 return layer;
171 }
172
173 return F_Cu;
174 };
175
176 wxArrayString props = wxSplit( data, '|' );
177 int markerLayer = F_Cu;
178 VECTOR2I markerPos( (int) strtol( props[1].c_str(), nullptr, 10 ),
179 (int) strtol( props[2].c_str(), nullptr, 10 ) );
180
181 std::shared_ptr<DRC_ITEM> drcItem = DRC_ITEM::Create( props[0] );
182
183 if( !drcItem )
184 return nullptr;
185
186 if( drcItem->GetErrorCode() == DRCE_COPPER_SLIVER
187 || drcItem->GetErrorCode() == DRCE_GENERIC_WARNING
188 || drcItem->GetErrorCode() == DRCE_GENERIC_ERROR )
189 {
190 drcItem->SetItems( KIID( props[3] ) );
191 markerLayer = getMarkerLayer( props[4] );
192 }
193 else if( drcItem->GetErrorCode() == DRCE_UNCONNECTED_ITEMS )
194 {
195 // Pre-9.0.4 versions didn't have KIIDs as last two properties to allow sorting stability
196 if( props.size() < 6 )
197 drcItem->SetItems( KIID( props[3] ), KIID( props[4] ) );
198 else
199 drcItem->SetItems( KIID( props[5] ), KIID( props[6] ) );
200 }
201 else if( drcItem->GetErrorCode() == DRCE_STARVED_THERMAL )
202 {
203 drcItem->SetItems( KIID( props[3] ), KIID( props[4] ) );
204
205 // Pre-7.0 versions didn't differentiate between layers
206 if( props.size() == 6 )
207 markerLayer = getMarkerLayer( props[5] );
208 }
209 else if( drcItem->GetErrorCode() == DRCE_UNRESOLVED_VARIABLE
210 && props[3].IsEmpty() && props[4].IsEmpty() )
211 {
212 // Note: caller must load our item pointer with the drawing sheet proxy item
213 markerLayer = LAYER_DRAWINGSHEET;
214 }
215 else
216 {
217 drcItem->SetItems( KIID( props[3] ), KIID( props[4] ) );
218 }
219
220 return new PCB_MARKER( drcItem, markerPos, markerLayer );
221}
222
223
225{
226 wxASSERT( aImage->Type() == PCB_MARKER_T );
227
228 std::swap( *((PCB_MARKER*) this), *((PCB_MARKER*) aImage) );
229}
230
231
232void PCB_MARKER::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
233{
234 aList.emplace_back( _( "Type" ), _( "Marker" ) );
235 aList.emplace_back( _( "Violation" ), HYPERLINK_DV_RENDERER::StripMarkup( m_rcItem->GetErrorMessage( true ) ) );
236
237 switch( GetSeverity() )
238 {
240 aList.emplace_back( _( "Severity" ), _( "Ignore" ) );
241 break;
243 aList.emplace_back( _( "Severity" ), _( "Warning" ) );
244 break;
246 aList.emplace_back( _( "Severity" ), _( "Error" ) );
247 break;
248 default:
249 break;
250 }
251
253 {
254 aList.emplace_back( _( "Drawing Sheet" ), wxEmptyString );
255 }
256 else
257 {
258 wxString mainText;
259 wxString auxText;
260 EDA_ITEM* mainItem = aFrame->ResolveItem( m_rcItem->GetMainItemID() );
261 EDA_ITEM* auxItem = aFrame->ResolveItem( m_rcItem->GetAuxItemID() );
262
263 if( mainItem )
264 mainText = mainItem->GetItemDescription( aFrame, true );
265
266 if( auxItem )
267 auxText = auxItem->GetItemDescription( aFrame, true );
268
269 aList.emplace_back( mainText, auxText );
270 }
271
272 if( IsExcluded() )
273 aList.emplace_back( _( "Excluded" ), m_comment );
274}
275
276
277void PCB_MARKER::Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle )
278{
279 // Marker geometry isn't user-editable
280}
281
282
283void PCB_MARKER::Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
284{
285 // Marker geometry isn't user-editable
286}
287
288
289std::shared_ptr<SHAPE> PCB_MARKER::GetEffectiveShape( PCB_LAYER_ID aLayer, FLASHING aFlash ) const
290{
291 // Markers do not participate in the board geometry space, and therefore have no effective shape.
292 return std::make_shared<SHAPE_NULL>();
293}
294
295
297 int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth ) const
298{
299 // Markers do not participate in the board geometry space, and therefore have no shape.
300};
301
302
303wxString PCB_MARKER::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
304{
305 return wxString::Format( _( "Marker (%s)" ), aFull ? m_rcItem->GetErrorMessage( true )
306 : m_rcItem->GetErrorText( true ) );
307}
308
309
311{
312 return BITMAPS::drc;
313}
314
315
317{
318 if( IsExcluded() )
320
321 DRC_ITEM* item = static_cast<DRC_ITEM*>( m_rcItem.get() );
322
323 if( item->GetErrorCode() == DRCE_GENERIC_WARNING )
325 else if( item->GetErrorCode() == DRCE_GENERIC_ERROR )
326 return RPT_SEVERITY_ERROR;
327
328 DRC_RULE* rule = item->GetViolatingRule();
329
330 if( rule && rule->m_Severity != RPT_SEVERITY_UNDEFINED )
331 return rule->m_Severity;
332
333 return GetBoard()->GetDesignSettings().GetSeverity( item->GetErrorCode() );
334}
335
336
337std::vector<int> PCB_MARKER::ViewGetLayers() const
338{
340 return {};
341
342 std::vector<int> layers{ 0, LAYER_MARKER_SHADOWS, LAYER_DRC_SHAPES, LAYER_DRC_HIGHLIGHTED };
343
344 switch( GetSeverity() )
345 {
346 default:
347 case SEVERITY::RPT_SEVERITY_ERROR: layers[0] = LAYER_DRC_ERROR; break;
348 case SEVERITY::RPT_SEVERITY_WARNING: layers[0] = LAYER_DRC_WARNING; break;
350 }
351
352 return layers;
353}
354
355
366
367
369{
370 return ::GetColorSettings( DEFAULT_THEME )->GetColor( GetColorLayer() );
371}
372
373
374void PCB_MARKER::SetZoom( double aZoomFactor ) const
375{
376 SetMarkerScale( SCALING_FACTOR * aZoomFactor );
377}
378
379
380std::vector<PCB_SHAPE> PCB_MARKER::GetShapes() const
381{
382 STROKE_PARAMS hairline( 1.0 ); // Segments of width 1.0 will get drawn as lines by PCB_PAINTER
383 std::vector<PCB_SHAPE> pathShapes;
384
385 if( m_pathStart == m_pathEnd )
386 {
387 // Add a collision 'X'
388 const int len = KiROUND( 2.5 * MarkerScale() );
389
390 PCB_SHAPE s( nullptr, SHAPE_T::SEGMENT );
391 s.SetStroke( hairline );
392
393 s.SetStart( m_pathStart + VECTOR2I( -len, -len ) );
394 s.SetEnd( m_pathStart + VECTOR2I( len, len ) );
395 pathShapes.push_back( s );
396
397 s.SetStart( m_pathStart + VECTOR2I( -len, len ) );
398 s.SetEnd( m_pathStart + VECTOR2I( len, -len ) );
399 pathShapes.push_back( s );
400 }
401 else
402 {
403 // Add the path
404 for( PCB_SHAPE shape : m_pathShapes )
405 {
406 shape.SetStroke( hairline );
407 pathShapes.push_back( std::move( shape ) );
408 }
409
410 // Draw perpendicular begin/end stops
411 if( pathShapes.size() > 0 )
412 {
413 VECTOR2I V1 = pathShapes[0].GetStart() - pathShapes[0].GetEnd();
414 VECTOR2I V2 = pathShapes.back().GetStart() - pathShapes.back().GetEnd();
415 V1 = V1.Perpendicular().Resize( 2.5 * MarkerScale() );
416 V2 = V2.Perpendicular().Resize( 2.5 * MarkerScale() );
417
418 PCB_SHAPE s( nullptr, SHAPE_T::SEGMENT );
419 s.SetStroke( hairline );
420
421 s.SetStart( m_pathStart + V1 );
422 s.SetEnd( m_pathStart - V1 );
423 pathShapes.push_back( s );
424
425 s.SetStart( m_pathEnd + V2 );
426 s.SetEnd( m_pathEnd - V2 );
427 pathShapes.push_back( s );
428 }
429 }
430
431 // Add shaded areas
432 for( PCB_SHAPE shape : m_pathShapes )
433 {
434 shape.SetWidth( 10 * MarkerScale() );
435 pathShapes.push_back( std::move( shape ) );
436 }
437
438 return pathShapes;
439}
440
441
443{
445
446 for( const PCB_SHAPE& s : m_pathShapes )
447 box.Merge( s.GetBoundingBox() );
448
449 return box;
450}
451
452
454{
455 return GetBoundingBox();
456}
457
458
459static struct PCB_MARKER_DESC
460{
462 {
469
470 // Markers cannot be locked and have no user-accessible layer control
471 propMgr.Mask( TYPE_HASH( PCB_MARKER ), TYPE_HASH( BOARD_ITEM ), _HKI( "Layer" ) );
472 propMgr.Mask( TYPE_HASH( PCB_MARKER ), TYPE_HASH( BOARD_ITEM ), _HKI( "Locked" ) );
473 }
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:918
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition box2.h:986
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:81
BOARD_ITEM(BOARD_ITEM *aParent, KICAD_T idtype, PCB_LAYER_ID aLayer=F_Cu)
Definition board_item.h:83
PCB_LAYER_ID m_layer
Definition board_item.h:508
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition board_item.h:313
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:1149
constexpr BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
Definition box2.h:654
DRC_RULE * GetViolatingRule() const
Definition drc_item.h:161
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:158
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:169
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:108
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
Definition eda_item.cpp:37
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:101
Definition kiid.h:44
Marker are mainly used to show a DRC or ERC error or warning.
Definition marker_base.h:45
void SetMarkerScale(int aScale) const
Definition marker_base.h:66
bool IsExcluded() const
Definition marker_base.h:89
wxString m_comment
User supplied comment.
int MarkerScale() const
The scaling factor to convert polygonal shape coordinates to internal units.
Definition marker_base.h:65
VECTOR2I m_Pos
Position of the marker.
@ MARKER_DRAWING_SHEET
Definition marker_base.h:52
void SetMarkerType(enum MARKER_T aMarkerType)
Accessors to set/get marker type (DRC, ERC, or other)
Definition marker_base.h:86
std::shared_ptr< RC_ITEM > m_rcItem
enum MARKER_T GetMarkerType() const
Definition marker_base.h:87
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:168
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:167
std::vector< PCB_SHAPE > GetShapes() const
std::vector< PCB_SHAPE > m_pathShapes
Definition pcb_marker.h:166
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:169
void swapData(BOARD_ITEM *aImage) override
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
void SetEnd(const VECTOR2I &aEnd) override
void SetStart(const VECTOR2I &aStart) override
void SetStroke(const STROKE_PARAMS &aStroke) override
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:157
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:310
VECTOR2< T > Resize(T aNewLength) const
Return a vector of the same direction, but length specified in aNewLength.
Definition vector2d.h:381
@ DRCE_FOOTPRINT_FILTERS
Definition drc_item.h:76
@ DRCE_UNCONNECTED_ITEMS
Definition drc_item.h:36
@ DRCE_STARVED_THERMAL
Definition drc_item.h:46
@ DRCE_SCHEMATIC_FIELDS_PARITY
Definition drc_item.h:119
@ DRCE_GENERIC_ERROR
Definition drc_item.h:88
@ DRCE_COPPER_SLIVER
Definition drc_item.h:90
@ DRCE_UNRESOLVED_VARIABLE
Definition drc_item.h:85
@ DRCE_DUPLICATE_FOOTPRINT
Definition drc_item.h:72
@ DRCE_EXTRA_FOOTPRINT
Definition drc_item.h:73
@ DRCE_NET_CONFLICT
Definition drc_item.h:74
@ DRCE_MISSING_FOOTPRINT
Definition drc_item.h:71
@ DRCE_GENERIC_WARNING
Definition drc_item.h:87
@ DRCE_SCHEMATIC_PARITY
Definition drc_item.h:75
#define _(s)
@ SEGMENT
Definition eda_shape.h:46
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:180
GAL_LAYER_ID
GAL layers are "virtual" layers, i.e.
Definition layer_ids.h:224
@ LAYER_DRAWINGSHEET
Sheet frame and title block.
Definition layer_ids.h:274
@ LAYER_DRC_EXCLUSION
Layer for DRC markers which have been individually excluded.
Definition layer_ids.h:300
@ LAYER_DRC_HIGHLIGHTED
Color for highlighted DRC markers.
Definition layer_ids.h:328
@ LAYER_DRC_SHAPES
Custom shapes for DRC markers.
Definition layer_ids.h:311
@ LAYER_DRC_WARNING
Layer for DRC markers with #SEVERITY_WARNING.
Definition layer_ids.h:297
@ LAYER_MARKER_SHADOWS
Shadows for DRC markers.
Definition layer_ids.h:301
@ LAYER_DRC_ERROR
Layer for DRC markers with #SEVERITY_ERROR.
Definition layer_ids.h:273
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:56
@ UNDEFINED_LAYER
Definition layer_ids.h:57
@ PCB_LAYER_ID_COUNT
Definition layer_ids.h:167
@ F_Cu
Definition layer_ids.h:60
PCB_LAYER_ID ToLAYER_ID(int aLayer)
Definition lset.cpp:750
FLIP_DIRECTION
Definition mirror.h:23
#define _HKI(x)
Definition page_info.cpp:40
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:92
Functions to provide common constants and other functions to assist in making a consistent UI.
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:683