KiCad PCB EDA Suite
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
sch_shape.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) 2017 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#include <sch_draw_panel.h>
26#include <macros.h>
27#include <plotters/plotter.h>
28#include <base_units.h>
29#include <widgets/msgpanel.h>
30#include <bitmaps.h>
31#include <eda_draw_frame.h>
32#include <gr_basic.h>
33#include <schematic.h>
34#include <sch_shape.h>
35
36
37SCH_SHAPE::SCH_SHAPE( SHAPE_T aShape, SCH_LAYER_ID aLayer, int aLineWidth, FILL_T aFillType,
38 KICAD_T aType ) :
39 SCH_ITEM( nullptr, aType ),
40 EDA_SHAPE( aShape, aLineWidth, aFillType )
41{
42 SetLayer( aLayer );
43}
44
45
47{
48 return new SCH_SHAPE( *this );
49}
50
51
53{
54 SCH_ITEM::SwapFlags( aItem );
55
56 SCH_SHAPE* shape = static_cast<SCH_SHAPE*>( aItem );
57
58 EDA_SHAPE::SwapShape( shape );
59 std::swap( m_layer, shape->m_layer );
60}
61
62
63void SCH_SHAPE::SetStroke( const STROKE_PARAMS& aStroke )
64{
65 m_stroke = aStroke;
66}
67
68
69void SCH_SHAPE::SetFilled( bool aFilled )
70{
71 if( !aFilled )
72 m_fill = FILL_T::NO_FILL;
73 else if( GetParentSymbol() )
74 m_fill = FILL_T::FILLED_SHAPE;
75 else
76 m_fill = FILL_T::FILLED_WITH_COLOR;
77}
78
79
80void SCH_SHAPE::Move( const VECTOR2I& aOffset )
81{
82 move( aOffset );
83}
84
85
87{
88 if( GetShape() == SHAPE_T::RECTANGLE )
89 {
90 VECTOR2I size = GetEnd() - GetPosition();
91
92 if( size.y < 0 )
93 {
94 SetStartY( GetStartY() + size.y );
95 SetEndY( GetStartY() - size.y );
96 }
97
98 if( size.x < 0 )
99 {
100 SetStartX( GetStartX() + size.x );
101 SetEndX( GetStartX() - size.x );
102 }
103 }
104}
105
106
108{
109 flip( VECTOR2I( aCenter, 0 ), FLIP_DIRECTION::LEFT_RIGHT );
110}
111
112
114{
115 flip( VECTOR2I( 0, aCenter ), FLIP_DIRECTION::TOP_BOTTOM );
116}
117
118
119void SCH_SHAPE::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
120{
121 rotate( aCenter, aRotateCCW ? ANGLE_90 : ANGLE_270 );
122}
123
124
125bool SCH_SHAPE::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
126{
127 return hitTest( aPosition, aAccuracy );
128}
129
130
131bool SCH_SHAPE::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
132{
134 return false;
135
136 return hitTest( aRect, aContained, aAccuracy );
137}
138
139
140void SCH_SHAPE::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS& aPlotOpts,
141 int aUnit, int aBodyStyle, const VECTOR2I& aOffset, bool aDimmed )
142{
143 if( IsPrivate() )
144 return;
145
146 // note: if aBodyStyle == -1 the outline shape is not plotted. Only the filled area
147 // is plotted (used to plot cells for SCH_TABLE items
148
149 SCH_RENDER_SETTINGS* renderSettings = getRenderSettings( aPlotter );
150 int pen_size = GetEffectivePenWidth( renderSettings );
151
152 static std::vector<VECTOR2I> ptList;
153
154 if( GetShape() == SHAPE_T::POLY )
155 {
156 ptList.clear();
157
158 for( const VECTOR2I& pt : m_poly.Outline( 0 ).CPoints() )
159 ptList.push_back( renderSettings->TransformCoordinate( pt ) + aOffset );
160 }
161 else if( GetShape() == SHAPE_T::BEZIER )
162 {
163 ptList.clear();
164
165 for( const VECTOR2I& pt : m_bezierPoints )
166 ptList.push_back( renderSettings->TransformCoordinate( pt ) + aOffset );
167 }
168
170 COLOR4D bg = renderSettings->GetBackgroundColor();
171 LINE_STYLE lineStyle = GetStroke().GetLineStyle();
172 FILL_T fill = m_fill;
173
174 if( aBackground )
175 {
176 switch( m_fill )
177 {
178 case FILL_T::FILLED_SHAPE:
179 // Fill in the foreground layer
180 return;
181
182 case FILL_T::HATCH:
183 case FILL_T::REVERSE_HATCH:
184 case FILL_T::CROSS_HATCH:
185 if( !aPlotter->GetColorMode() || color == COLOR4D::UNSPECIFIED )
186 color = renderSettings->GetLayerColor( m_layer );
187
188 color.a = color.a * 0.4;
189 break;
190
191 case FILL_T::FILLED_WITH_COLOR:
192 // drop fill in B&W mode
193 if( !aPlotter->GetColorMode() )
194 return;
195
197 break;
198
199 case FILL_T::FILLED_WITH_BG_BODYCOLOR:
200 // drop fill in B&W mode
201 if( !aPlotter->GetColorMode() )
202 return;
203
204 color = renderSettings->GetLayerColor( LAYER_DEVICE_BACKGROUND );
205 break;
206
207 default:
208 return;
209 }
210
211 pen_size = 0;
212 lineStyle = LINE_STYLE::SOLID;
213 }
214 else /* if( aForeground ) */
215 {
216 if( !aPlotter->GetColorMode() || color == COLOR4D::UNSPECIFIED )
217 color = renderSettings->GetLayerColor( m_layer );
218
219 if( lineStyle == LINE_STYLE::DEFAULT )
220 lineStyle = LINE_STYLE::SOLID;
221
222 if( m_fill == FILL_T::FILLED_SHAPE )
223 fill = m_fill;
224 else
225 fill = FILL_T::NO_FILL;
226
227 pen_size = aBodyStyle == -1 ? 0 : GetEffectivePenWidth( renderSettings );
228 }
229
230 if( bg == COLOR4D::UNSPECIFIED || !aPlotter->GetColorMode() )
231 bg = COLOR4D::WHITE;
232
233 if( aDimmed )
234 {
235 color.Desaturate( );
236 color = color.Mix( bg, 0.5f );
237 }
238
239 aPlotter->SetColor( color );
240
241 if( aBackground && IsHatchedFill() )
242 {
243 for( int ii = 0; ii < GetHatching().OutlineCount(); ++ii )
244 aPlotter->PlotPoly( GetHatching().COutline( ii ), FILL_T::FILLED_SHAPE, 0 );
245
246 return;
247 }
248
249 aPlotter->SetCurrentLineWidth( pen_size );
250 aPlotter->SetDash( pen_size, lineStyle );
251
252 VECTOR2I start = renderSettings->TransformCoordinate( m_start ) + aOffset;
253 VECTOR2I end = renderSettings->TransformCoordinate( m_end ) + aOffset;
254 VECTOR2I mid, center;
255
256 switch( GetShape() )
257 {
258 case SHAPE_T::ARC:
259 mid = renderSettings->TransformCoordinate( GetArcMid() ) + aOffset;
260 aPlotter->Arc( start, mid, end, fill, pen_size );
261 break;
262
263 case SHAPE_T::CIRCLE:
264 center = renderSettings->TransformCoordinate( getCenter() ) + aOffset;
265 aPlotter->Circle( center, GetRadius() * 2, fill, pen_size );
266 break;
267
268 case SHAPE_T::RECTANGLE:
269 aPlotter->Rect( start, end, fill, pen_size );
270 break;
271
272 case SHAPE_T::POLY:
273 case SHAPE_T::BEZIER:
274 aPlotter->PlotPoly( ptList, fill, pen_size );
275 break;
276
277 default:
279 }
280
281 aPlotter->SetDash( pen_size, LINE_STYLE::SOLID );
282}
283
284
286{
287 if( GetPenWidth() > 0 )
288 return GetPenWidth();
289
290 // Historically 0 meant "default width" and negative numbers meant "don't stroke".
291 if( GetPenWidth() < 0 )
292 return 0;
293
294 SCHEMATIC* schematic = Schematic();
295
296 if( schematic )
297 return schematic->Settings().m_DefaultLineWidth;
298
300}
301
302
304{
305 return getBoundingBox();
306}
307
308
309void SCH_SHAPE::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
310{
311 if( m_layer == LAYER_DEVICE )
312 getSymbolEditorMsgPanelInfo( aFrame, aList );
313 else
314 SCH_ITEM::GetMsgPanelInfo( aFrame, aList );
315
316 ShapeGetMsgPanelInfo( aFrame, aList );
317}
318
319
320wxString SCH_SHAPE::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
321{
322 switch( GetShape() )
323 {
324 case SHAPE_T::ARC:
325 return wxString::Format( _( "Arc, radius %s" ),
326 aUnitsProvider->MessageTextFromValue( GetRadius() ) );
327
328 case SHAPE_T::CIRCLE:
329 return wxString::Format( _( "Circle, radius %s" ),
330 aUnitsProvider->MessageTextFromValue( GetRadius() ) );
331
332 case SHAPE_T::RECTANGLE:
333 return wxString::Format( _( "Rectangle, width %s height %s" ),
334 aUnitsProvider->MessageTextFromValue( std::abs( m_start.x - m_end.x ) ),
335 aUnitsProvider->MessageTextFromValue( std::abs( m_start.y - m_end.y ) ) );
336
337 case SHAPE_T::POLY:
338 return wxString::Format( _( "Polyline, %d points" ),
339 int( m_poly.Outline( 0 ).GetPointCount() ) );
340
341 case SHAPE_T::BEZIER:
342 return wxString::Format( _( "Bezier Curve, %d points" ),
343 int( m_bezierPoints.size() ) );
344
345 default:
347 return wxEmptyString;
348 }
349}
350
351
353{
354 switch( GetShape() )
355 {
356 case SHAPE_T::SEGMENT: return BITMAPS::add_line;
357 case SHAPE_T::ARC: return BITMAPS::add_arc;
358 case SHAPE_T::CIRCLE: return BITMAPS::add_circle;
359 case SHAPE_T::RECTANGLE: return BITMAPS::add_rectangle;
360 case SHAPE_T::POLY: return BITMAPS::add_graphical_segments;
361 case SHAPE_T::BEZIER: return BITMAPS::add_bezier;
362
363 default:
365 return BITMAPS::question_mark;
366 }
367}
368
369
370std::vector<int> SCH_SHAPE::ViewGetLayers() const
371{
372 std::vector<int> layers( 3 );
373
374 layers[0] = IsPrivate() ? LAYER_PRIVATE_NOTES : m_layer;
375
376 if( m_layer == LAYER_DEVICE )
377 {
378 if( m_fill == FILL_T::FILLED_WITH_BG_BODYCOLOR )
379 layers[1] = LAYER_DEVICE_BACKGROUND;
380 else
381 layers[1] = LAYER_SHAPES_BACKGROUND;
382 }
383 else
384 {
385 layers[1] = LAYER_SHAPES_BACKGROUND;
386 }
387
388 layers[2] = LAYER_SELECTION_SHADOWS;
389
390 return layers;
391}
392
393
394void SCH_SHAPE::AddPoint( const VECTOR2I& aPosition )
395{
396 if( GetShape() == SHAPE_T::POLY )
397 {
398 if( m_poly.IsEmpty() )
399 {
401 m_poly.Outline( 0 ).SetClosed( false );
402 }
403
404 m_poly.Outline( 0 ).Append( aPosition, true );
405 }
406 else
407 {
409 }
410}
411
412
413bool SCH_SHAPE::operator==( const SCH_ITEM& aOther ) const
414{
415 if( aOther.Type() != Type() )
416 return false;
417
418 const SCH_SHAPE& other = static_cast<const SCH_SHAPE&>( aOther );
419
420 return SCH_ITEM::operator==( aOther ) && EDA_SHAPE::operator==( other );
421}
422
423
424double SCH_SHAPE::Similarity( const SCH_ITEM& aOther ) const
425{
426 if( m_Uuid == aOther.m_Uuid )
427 return 1.0;
428
429 if( aOther.Type() != Type() )
430 return 0.0;
431
432 const SCH_SHAPE& other = static_cast<const SCH_SHAPE&>( aOther );
433
434 double similarity = SimilarityBase( other );
435
436 similarity *= EDA_SHAPE::Similarity( other );
437
438 return similarity;
439}
440
441
442int SCH_SHAPE::compare( const SCH_ITEM& aOther, int aCompareFlags ) const
443{
444 int cmpFlags = aCompareFlags;
445
446 // The object UUIDs must be compared after the shape coordinates because shapes do not
447 // have immutable UUIDs.
450
451 int retv = SCH_ITEM::compare( aOther, cmpFlags );
452
453 if( retv )
454 return retv;
455
456 retv = EDA_SHAPE::Compare( &static_cast<const SCH_SHAPE&>( aOther ) );
457
458 if( retv )
459 return retv;
460
461 if( ( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::EQUALITY )
462 || ( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::ERC ) )
463 {
464 return 0;
465 }
466
467 if( m_Uuid < aOther.m_Uuid )
468 return -1;
469
470 if( m_Uuid > aOther.m_Uuid )
471 return 1;
472
473 return 0;
474}
475
476
477static struct SCH_SHAPE_DESC
478{
480 {
482
483 if( fillEnum.Choices().GetCount() == 0 )
484 {
485 fillEnum.Map( FILL_T::NO_FILL, _HKI( "None" ) )
486 .Map( FILL_T::FILLED_SHAPE, _HKI( "Body outline color" ) )
487 .Map( FILL_T::FILLED_WITH_BG_BODYCOLOR, _HKI( "Body background color" ) )
488 .Map( FILL_T::FILLED_WITH_COLOR, _HKI( "Fill color" ) );
489 }
490
497
498 // Only polygons have meaningful Position properties.
499 // On other shapes, these are duplicates of the Start properties.
500 auto isPolygon =
501 []( INSPECTABLE* aItem ) -> bool
502 {
503 if( SCH_SHAPE* shape = dynamic_cast<SCH_SHAPE*>( aItem ) )
504 return shape->GetShape() == SHAPE_T::POLY;
505
506 return false;
507 };
508
509 auto isSymbolItem =
510 []( INSPECTABLE* aItem ) -> bool
511 {
512 if( SCH_SHAPE* shape = dynamic_cast<SCH_SHAPE*>( aItem ) )
513 return shape->GetLayer() == LAYER_DEVICE;
514
515 return false;
516 };
517
518 auto isSchematicItem =
519 []( INSPECTABLE* aItem ) -> bool
520 {
521 if( SCH_SHAPE* shape = dynamic_cast<SCH_SHAPE*>( aItem ) )
522 return shape->GetLayer() != LAYER_DEVICE;
523
524 return false;
525 };
526
527 auto isFillColorEditable =
528 []( INSPECTABLE* aItem ) -> bool
529 {
530 if( SCH_SHAPE* shape = dynamic_cast<SCH_SHAPE*>( aItem ) )
531 {
532 if( shape->GetParentSymbol() )
533 return shape->GetFillMode() == FILL_T::FILLED_WITH_COLOR;
534 else
535 return shape->IsSolidFill();
536 }
537
538 return true;
539 };
540
542 _HKI( "Position X" ), isPolygon );
544 _HKI( "Position Y" ), isPolygon );
545
547 _HKI( "Filled" ), isSchematicItem );
548
550 _HKI( "Fill Color" ), isFillColorEditable );
551
552 void ( SCH_SHAPE::*fillModeSetter )( FILL_T ) = &SCH_SHAPE::SetFillMode;
553 FILL_T ( SCH_SHAPE::*fillModeGetter )() const = &SCH_SHAPE::GetFillMode;
554
555 propMgr.AddProperty( new PROPERTY_ENUM<SCH_SHAPE, FILL_T>( _HKI( "Fill Mode" ),
556 fillModeSetter, fillModeGetter ),
557 _HKI( "Shape Properties" ) )
558 .SetAvailableFunc( isSymbolItem );
559 }
561
int color
Definition: DXF_plotter.cpp:60
constexpr EDA_IU_SCALE schIUScale
Definition: base_units.h:110
BITMAPS
A list of all bitmap identifiers.
Definition: bitmaps_list.h:33
The base class for create windows for drawing purpose.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:95
const KIID m_Uuid
Definition: eda_item.h:494
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:107
EDA_ITEM_FLAGS m_flags
Definition: eda_item.h:505
virtual void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList)
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
Definition: eda_item.h:208
void SetStartX(int x)
Definition: eda_shape.h:191
VECTOR2I getCenter() const
Definition: eda_shape.cpp:886
int GetStartY() const
Definition: eda_shape.h:174
void rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle)
Definition: eda_shape.cpp:751
const SHAPE_POLY_SET & GetHatching() const
Definition: eda_shape.cpp:569
FILL_T GetFillMode() const
Definition: eda_shape.h:142
void SetEndY(int aY)
Definition: eda_shape.h:226
void SetStartY(int y)
Definition: eda_shape.h:184
void ShapeGetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList)
Definition: eda_shape.cpp:1103
bool operator==(const EDA_SHAPE &aOther) const
Definition: eda_shape.cpp:2325
int GetRadius() const
Definition: eda_shape.cpp:961
SHAPE_T GetShape() const
Definition: eda_shape.h:168
bool IsHatchedFill() const
Definition: eda_shape.h:124
bool hitTest(const VECTOR2I &aPosition, int aAccuracy=0) const
Definition: eda_shape.cpp:1216
void SetEndX(int aX)
Definition: eda_shape.h:233
void flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection)
Definition: eda_shape.cpp:814
VECTOR2I m_start
Definition: eda_shape.h:498
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:215
COLOR4D GetFillColor() const
Definition: eda_shape.h:152
void SwapShape(EDA_SHAPE *aImage)
Definition: eda_shape.cpp:2110
std::vector< VECTOR2I > m_bezierPoints
Definition: eda_shape.h:507
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:340
int GetStartX() const
Definition: eda_shape.h:175
double Similarity(const EDA_SHAPE &aOther) const
Definition: eda_shape.cpp:2370
VECTOR2I m_end
Definition: eda_shape.h:499
const BOX2I getBoundingBox() const
Definition: eda_shape.cpp:1162
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:508
STROKE_PARAMS m_stroke
Definition: eda_shape.h:485
FILL_T m_fill
Definition: eda_shape.h:486
void SetFillMode(FILL_T aFill)
Definition: eda_shape.cpp:536
int Compare(const EDA_SHAPE *aOther) const
Definition: eda_shape.cpp:2135
VECTOR2I GetArcMid() const
Definition: eda_shape.cpp:931
ENUM_MAP & Map(T aValue, const wxString &aName)
Definition: property.h:686
static ENUM_MAP< T > & Instance()
Definition: property.h:680
wxPGChoices & Choices()
Definition: property.h:729
Class that other classes need to inherit from, in order to be inspectable.
Definition: inspectable.h:37
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
const COLOR4D & GetLayerColor(int aLayer) const
Return the color used to draw a layer.
Base plotter engine class.
Definition: plotter.h:105
virtual void Circle(const VECTOR2I &pos, int diametre, FILL_T fill, int width=USE_DEFAULT_LINE_WIDTH)=0
virtual void Arc(const VECTOR2D &aStart, const VECTOR2D &aMid, const VECTOR2D &aEnd, FILL_T aFill, int aWidth=USE_DEFAULT_LINE_WIDTH)
Definition: plotter.cpp:150
virtual void SetDash(int aLineWidth, LINE_STYLE aLineStyle)=0
bool GetColorMode() const
Definition: plotter.h:133
virtual void SetCurrentLineWidth(int width, void *aData=nullptr)=0
Set the line width for the next drawing.
virtual void PlotPoly(const std::vector< VECTOR2I > &aCornerList, FILL_T aFill, int aWidth=USE_DEFAULT_LINE_WIDTH, void *aData=nullptr)=0
Draw a polygon ( filled or not ).
virtual void Rect(const VECTOR2I &p1, const VECTOR2I &p2, FILL_T fill, int width=USE_DEFAULT_LINE_WIDTH)=0
virtual void SetColor(const COLOR4D &color)=0
Provide class metadata.Helper macro to map type hashes to names.
Definition: property_mgr.h:85
void InheritsAfter(TYPE_ID aDerived, TYPE_ID aBase)
Declare an inheritance relationship between types.
static PROPERTY_MANAGER & Instance()
Definition: property_mgr.h:87
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
void OverrideAvailability(TYPE_ID aDerived, TYPE_ID aBase, const wxString &aName, std::function< bool(INSPECTABLE *)> aFunc)
Sets an override availability functor for a base class property of a given derived class.
void OverrideWriteability(TYPE_ID aDerived, TYPE_ID aBase, const wxString &aName, std::function< bool(INSPECTABLE *)> aFunc)
Sets an override writeability functor for a base class property of a given derived class.
void AddTypeCast(TYPE_CAST_BASE *aCast)
Register a type converter.
Holds all the data relating to one schematic.
Definition: schematic.h:69
SCHEMATIC_SETTINGS & Settings() const
Definition: schematic.cpp:306
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:168
SCH_RENDER_SETTINGS * getRenderSettings(PLOTTER *aPlotter) const
Definition: sch_item.h:657
const SYMBOL * GetParentSymbol() const
Definition: sch_item.cpp:172
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
Definition: sch_item.cpp:156
@ EQUALITY
Definition: sch_item.h:638
virtual bool operator==(const SCH_ITEM &aOther) const
Definition: sch_item.cpp:417
bool IsPrivate() const
Definition: sch_item.h:246
void SetLayer(SCH_LAYER_ID aLayer)
Definition: sch_item.h:296
virtual int compare(const SCH_ITEM &aOther, int aCompareFlags=0) const
Provide the draw object specific comparison called by the == and < operators.
Definition: sch_item.cpp:441
void SwapFlags(SCH_ITEM *aItem)
Swap the non-temp and non-edit flags.
Definition: sch_item.cpp:376
int GetEffectivePenWidth(const SCH_RENDER_SETTINGS *aSettings) const
Definition: sch_item.cpp:498
SCH_LAYER_ID m_layer
Definition: sch_item.h:710
double SimilarityBase(const SCH_ITEM &aItem) const
Calculate the boilerplate similarity for all LIB_ITEMs without preventing the use above of a pure vir...
Definition: sch_item.h:332
void getSymbolEditorMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList)
Definition: sch_item.cpp:524
VECTOR2I TransformCoordinate(const VECTOR2I &aPoint) const
const KIGFX::COLOR4D & GetBackgroundColor() const override
Return current background color settings.
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
Definition: sch_shape.cpp:107
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
Definition: sch_shape.cpp:320
void SetFilled(bool aFilled) override
Definition: sch_shape.cpp:69
void Move(const VECTOR2I &aOffset) override
Move the item by aMoveVector to a new position.
Definition: sch_shape.cpp:80
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
Definition: sch_shape.cpp:46
void SetStroke(const STROKE_PARAMS &aStroke) override
Definition: sch_shape.cpp:63
void swapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
Definition: sch_shape.cpp:52
void Normalize()
Definition: sch_shape.cpp:86
double Similarity(const SCH_ITEM &aOther) const override
Return a measure of how likely the other object is to represent the same object.
Definition: sch_shape.cpp:424
void Plot(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed) override
Plot the item to aPlotter.
Definition: sch_shape.cpp:140
SCH_SHAPE(SHAPE_T aShape=SHAPE_T::UNDEFINED, SCH_LAYER_ID aLayer=LAYER_NOTES, int aLineWidth=0, FILL_T aFillType=FILL_T::NO_FILL, KICAD_T aType=SCH_SHAPE_T)
Definition: sch_shape.cpp:37
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
Definition: sch_shape.cpp:303
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
Definition: sch_shape.cpp:113
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.
Definition: sch_shape.cpp:309
void AddPoint(const VECTOR2I &aPosition)
Definition: sch_shape.cpp:394
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
Definition: sch_shape.cpp:352
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
Definition: sch_shape.cpp:125
void Rotate(const VECTOR2I &aCenter, bool aRotateCCW) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
Definition: sch_shape.cpp:119
bool operator==(const SCH_ITEM &aOther) const override
Definition: sch_shape.cpp:413
std::vector< int > ViewGetLayers() const override
Return the layers the item is drawn on (which may be more than its "home" layer)
Definition: sch_shape.cpp:370
int GetPenWidth() const override
Definition: sch_shape.h:51
STROKE_PARAMS GetStroke() const override
Definition: sch_shape.h:54
VECTOR2I GetPosition() const override
Definition: sch_shape.h:81
int GetEffectiveWidth() const override
Definition: sch_shape.cpp:285
int compare(const SCH_ITEM &aOther, int aCompareFlags=0) const override
Provide the draw object specific comparison called by the == and < operators.
Definition: sch_shape.cpp:442
void SetClosed(bool aClosed)
Mark the line chain as closed (i.e.
virtual size_t GetPointCount() const override
void Append(int aX, int aY, bool aAllowDuplication=false)
Append a new point at the end of the line chain.
const std::vector< VECTOR2I > & CPoints() const
bool IsEmpty() const
Return true if the set is empty (no polygons at all)
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
int NewOutline()
Creates a new empty polygon in the set and returns its index.
int OutlineCount() const
Return the number of outlines in the set.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
Simple container to manage line stroke parameters.
Definition: stroke_params.h:94
LINE_STYLE GetLineStyle() const
KIGFX::COLOR4D GetColor() const
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
#define DEFAULT_LINE_WIDTH_MILS
The default wire width in mils. (can be changed in preference menu)
#define _HKI(x)
#define _(s)
static constexpr EDA_ANGLE ANGLE_90
Definition: eda_angle.h:403
static constexpr EDA_ANGLE ANGLE_270
Definition: eda_angle.h:406
#define STRUCT_DELETED
flag indication structures to be erased
#define SKIP_STRUCT
flag indicating that the structure should be ignored
SHAPE_T
Definition: eda_shape.h:43
FILL_T
Definition: eda_shape.h:56
SCH_LAYER_ID
Eeschema drawing layers.
Definition: layer_ids.h:438
@ LAYER_SHAPES_BACKGROUND
Definition: layer_ids.h:472
@ LAYER_DEVICE
Definition: layer_ids.h:455
@ LAYER_PRIVATE_NOTES
Definition: layer_ids.h:457
@ LAYER_DEVICE_BACKGROUND
Definition: layer_ids.h:473
@ LAYER_SELECTION_SHADOWS
Definition: layer_ids.h:483
This file contains miscellaneous commonly used macros and functions.
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:96
Message panel definition file.
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
Definition: eda_angle.h:390
#define TYPE_HASH(x)
Definition: property.h:71
#define ENUM_TO_WXANY(type)
Macro to define read-only fields (no setter method available)
Definition: property.h:782
#define REGISTER_TYPE(x)
Definition: property_mgr.h:371
static struct SCH_SHAPE_DESC _SCH_SHAPE_DESC
LINE_STYLE
Dashed line types.
Definition: stroke_params.h:46
constexpr int MilsToIU(int mils) const
Definition: base_units.h:93
VECTOR2I center
VECTOR2I end
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition: typeinfo.h:78
VECTOR2< int32_t > VECTOR2I
Definition: vector2d.h:695