KiCad PCB EDA Suite
Loading...
Searching...
No Matches
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>
34#include <schematic.h>
35#include <sch_shape.h>
36
37
38SCH_SHAPE::SCH_SHAPE( SHAPE_T aShape, SCH_LAYER_ID aLayer, int aLineWidth, FILL_T aFillType,
39 KICAD_T aType ) :
40 SCH_ITEM( nullptr, aType ),
41 EDA_SHAPE( aShape, aLineWidth, aFillType )
42{
43 SetLayer( aLayer );
44}
45
46
48{
49 return new SCH_SHAPE( *this );
50}
51
52
54{
55 SCH_SHAPE* shape = static_cast<SCH_SHAPE*>( aItem );
56
57 EDA_SHAPE::SwapShape( shape );
58}
59
60
61void SCH_SHAPE::SetStroke( const STROKE_PARAMS& aStroke )
62{
63 m_stroke = aStroke;
64}
65
66
67void SCH_SHAPE::SetFilled( bool aFilled )
68{
69 if( !aFilled )
71 else if( GetParentSymbol() )
73 else
75}
76
77
78void SCH_SHAPE::Move( const VECTOR2I& aOffset )
79{
80 move( aOffset );
81}
82
83
85{
87 {
88 VECTOR2I size = GetEnd() - GetPosition();
89
90 if( size.y < 0 )
91 {
92 SetStartY( GetStartY() + size.y );
93 SetEndY( GetStartY() - size.y );
94 }
95
96 if( size.x < 0 )
97 {
98 SetStartX( GetStartX() + size.x );
99 SetEndX( GetStartX() - size.x );
100 }
101 }
102}
103
104
106{
107 flip( VECTOR2I( aCenter, 0 ), FLIP_DIRECTION::LEFT_RIGHT );
108}
109
110
112{
113 flip( VECTOR2I( 0, aCenter ), FLIP_DIRECTION::TOP_BOTTOM );
114}
115
116
117void SCH_SHAPE::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
118{
119 rotate( aCenter, aRotateCCW ? ANGLE_90 : ANGLE_270 );
120}
121
122
123bool SCH_SHAPE::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
124{
125 return hitTest( aPosition, aAccuracy );
126}
127
128
129bool SCH_SHAPE::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
130{
132 return false;
133
134 return hitTest( aRect, aContained, aAccuracy );
135}
136
137
138bool SCH_SHAPE::HitTest( const SHAPE_LINE_CHAIN& aPoly, bool aContained ) const
139{
141 return false;
142
143 std::vector<SHAPE*> shapes = MakeEffectiveShapes( false );
144
145 for( SHAPE* shape : shapes )
146 {
147 bool hit = KIGEOM::ShapeHitTest( aPoly, *shape, aContained );
148
149 if( hit )
150 {
151 for( SHAPE* s : shapes )
152 delete s;
153 return true;
154 }
155 }
156
157 for( SHAPE* shape : shapes )
158 delete shape;
159
160 return false;
161}
162
163
164bool SCH_SHAPE::IsEndPoint( const VECTOR2I& aPt ) const
165{
166 SHAPE_T shape = GetShape();
167
168 if( ( shape == SHAPE_T::ARC ) || ( shape == SHAPE_T::BEZIER ) )
169 return ( aPt == GetStart() ) || ( aPt == GetEnd() );
170
171 return false;
172}
173
174
175void SCH_SHAPE::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS& aPlotOpts,
176 int aUnit, int aBodyStyle, const VECTOR2I& aOffset, bool aDimmed )
177{
178 if( IsPrivate() )
179 return;
180
181 // note: if aBodyStyle == -1 the outline shape is not plotted. Only the filled area
182 // is plotted (used to plot cells for SCH_TABLE items
183
184 SCH_RENDER_SETTINGS* renderSettings = getRenderSettings( aPlotter );
185 int pen_size = GetEffectivePenWidth( renderSettings );
186
187 static std::vector<VECTOR2I> ptList;
188
189 if( GetShape() == SHAPE_T::POLY )
190 {
191 ptList.clear();
192
193 for( const VECTOR2I& pt : m_poly.Outline( 0 ).CPoints() )
194 ptList.push_back( renderSettings->TransformCoordinate( pt ) + aOffset );
195 }
196 else if( GetShape() == SHAPE_T::BEZIER )
197 {
198 ptList.clear();
199
200 for( const VECTOR2I& pt : m_bezierPoints )
201 ptList.push_back( renderSettings->TransformCoordinate( pt ) + aOffset );
202 }
203
205 COLOR4D bg = renderSettings->GetBackgroundColor();
206 LINE_STYLE lineStyle = GetStroke().GetLineStyle();
207 FILL_T fill = m_fill;
208
209 if( aBackground )
210 {
211 switch( m_fill )
212 {
214 // Fill in the foreground layer
215 return;
216
217 case FILL_T::HATCH:
220 if( !aPlotter->GetColorMode() || color == COLOR4D::UNSPECIFIED )
221 color = renderSettings->GetLayerColor( m_layer );
222
223 color.a = color.a * 0.4;
224 break;
225
227 // drop fill in B&W mode
228 if( !aPlotter->GetColorMode() )
229 return;
230
232 break;
233
235 // drop fill in B&W mode
236 if( !aPlotter->GetColorMode() )
237 return;
238
239 color = renderSettings->GetLayerColor( LAYER_DEVICE_BACKGROUND );
240 break;
241
242 default:
243 return;
244 }
245
246 pen_size = 0;
247 lineStyle = LINE_STYLE::SOLID;
248 }
249 else /* if( aForeground ) */
250 {
251 if( !aPlotter->GetColorMode() || color == COLOR4D::UNSPECIFIED )
252 color = renderSettings->GetLayerColor( m_layer );
253
254 if( lineStyle == LINE_STYLE::DEFAULT )
255 lineStyle = LINE_STYLE::SOLID;
256
258 fill = m_fill;
259 else
260 fill = FILL_T::NO_FILL;
261
262 pen_size = aBodyStyle == -1 ? 0 : GetEffectivePenWidth( renderSettings );
263 }
264
265 if( bg == COLOR4D::UNSPECIFIED || !aPlotter->GetColorMode() )
266 bg = COLOR4D::WHITE;
267
268 if( aDimmed )
269 {
270 color.Desaturate( );
271 color = color.Mix( bg, 0.5f );
272 }
273
274 aPlotter->SetColor( color );
275
276 if( aBackground && IsHatchedFill() )
277 {
278 for( int ii = 0; ii < GetHatching().OutlineCount(); ++ii )
279 aPlotter->PlotPoly( GetHatching().COutline( ii ), FILL_T::FILLED_SHAPE, 0, nullptr );
280
281 return;
282 }
283
284 aPlotter->SetCurrentLineWidth( pen_size );
285 aPlotter->SetDash( pen_size, lineStyle );
286
287 VECTOR2I start = renderSettings->TransformCoordinate( m_start ) + aOffset;
288 VECTOR2I end = renderSettings->TransformCoordinate( m_end ) + aOffset;
289 VECTOR2I mid, center;
290
291 switch( GetShape() )
292 {
293 case SHAPE_T::ARC:
294 mid = renderSettings->TransformCoordinate( GetArcMid() ) + aOffset;
295 aPlotter->Arc( start, mid, end, fill, pen_size );
296 break;
297
298 case SHAPE_T::CIRCLE:
299 center = renderSettings->TransformCoordinate( getCenter() ) + aOffset;
300 aPlotter->Circle( center, GetRadius() * 2, fill, pen_size );
301 break;
302
304 aPlotter->Rect( start, end, fill, pen_size, GetCornerRadius() );
305 break;
306
307 case SHAPE_T::POLY:
308 case SHAPE_T::BEZIER:
309 aPlotter->PlotPoly( ptList, fill, pen_size, nullptr );
310 break;
311
312 default:
314 }
315
316 aPlotter->SetDash( pen_size, LINE_STYLE::SOLID );
317}
318
319
321{
322 if( GetPenWidth() > 0 )
323 return GetPenWidth();
324
325 // Historically 0 meant "default width" and negative numbers meant "don't stroke".
326 if( GetPenWidth() < 0 )
327 return 0;
328
329 SCHEMATIC* schematic = Schematic();
330
331 if( schematic )
332 return schematic->Settings().m_DefaultLineWidth;
333
334 return schIUScale.MilsToIU( DEFAULT_LINE_WIDTH_MILS );
335}
336
337
339{
340 return getBoundingBox();
341}
342
343
344void SCH_SHAPE::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
345{
346 SCH_ITEM::GetMsgPanelInfo( aFrame, aList );
347
348 ShapeGetMsgPanelInfo( aFrame, aList );
349}
350
351
352wxString SCH_SHAPE::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
353{
354 switch( GetShape() )
355 {
356 case SHAPE_T::ARC:
357 return wxString::Format( _( "Arc, radius %s" ),
358 aUnitsProvider->MessageTextFromValue( GetRadius() ) );
359
360 case SHAPE_T::CIRCLE:
361 return wxString::Format( _( "Circle, radius %s" ),
362 aUnitsProvider->MessageTextFromValue( GetRadius() ) );
363
365 return wxString::Format( _( "Rectangle, width %s height %s" ),
366 aUnitsProvider->MessageTextFromValue( std::abs( m_start.x - m_end.x ) ),
367 aUnitsProvider->MessageTextFromValue( std::abs( m_start.y - m_end.y ) ) );
368
369 case SHAPE_T::POLY:
370 return wxString::Format( _( "Polyline, %d points" ),
371 int( m_poly.Outline( 0 ).GetPointCount() ) );
372
373 case SHAPE_T::BEZIER:
374 return wxString::Format( _( "Bezier Curve, %d points" ),
375 int( m_bezierPoints.size() ) );
376
377 default:
379 return wxEmptyString;
380 }
381}
382
383
385{
386 switch( GetShape() )
387 {
389 case SHAPE_T::ARC: return BITMAPS::add_arc;
394
395 default:
398 }
399}
400
401
402std::vector<int> SCH_SHAPE::ViewGetLayers() const
403{
404 std::vector<int> layers( 3 );
405
406 layers[0] = IsPrivate() ? LAYER_PRIVATE_NOTES : m_layer;
407
408 if( m_layer == LAYER_DEVICE )
409 {
411 layers[1] = LAYER_DEVICE_BACKGROUND;
412 else
413 layers[1] = LAYER_SHAPES_BACKGROUND;
414 }
415 else
416 {
417 layers[1] = LAYER_SHAPES_BACKGROUND;
418 }
419
420 layers[2] = LAYER_SELECTION_SHADOWS;
421
422 return layers;
423}
424
425
426void SCH_SHAPE::AddPoint( const VECTOR2I& aPosition )
427{
428 if( GetShape() == SHAPE_T::POLY )
429 {
430 if( m_poly.IsEmpty() )
431 {
432 m_poly.NewOutline();
433 m_poly.Outline( 0 ).SetClosed( false );
434 }
435
436 m_poly.Outline( 0 ).Append( aPosition, true );
437 }
438 else
439 {
441 }
442}
443
444
445bool SCH_SHAPE::operator==( const SCH_ITEM& aOther ) const
446{
447 if( aOther.Type() != Type() )
448 return false;
449
450 const SCH_SHAPE& other = static_cast<const SCH_SHAPE&>( aOther );
451
452 return SCH_ITEM::operator==( aOther ) && EDA_SHAPE::operator==( other );
453}
454
455
456double SCH_SHAPE::Similarity( const SCH_ITEM& aOther ) const
457{
458 if( m_Uuid == aOther.m_Uuid )
459 return 1.0;
460
461 if( aOther.Type() != Type() )
462 return 0.0;
463
464 const SCH_SHAPE& other = static_cast<const SCH_SHAPE&>( aOther );
465
466 double similarity = SimilarityBase( other );
467
468 similarity *= EDA_SHAPE::Similarity( other );
469
470 return similarity;
471}
472
473
474int SCH_SHAPE::compare( const SCH_ITEM& aOther, int aCompareFlags ) const
475{
476 int cmpFlags = aCompareFlags;
477
478 // The object UUIDs must be compared after the shape coordinates because shapes do not
479 // have immutable UUIDs.
482
483 int retv = SCH_ITEM::compare( aOther, cmpFlags );
484
485 if( retv )
486 return retv;
487
488 retv = EDA_SHAPE::Compare( &static_cast<const SCH_SHAPE&>( aOther ) );
489
490 if( retv )
491 return retv;
492
493 if( ( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::EQUALITY )
494 || ( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::ERC ) )
495 {
496 return 0;
497 }
498
499 if( m_Uuid < aOther.m_Uuid )
500 return -1;
501
502 if( m_Uuid > aOther.m_Uuid )
503 return 1;
504
505 return 0;
506}
507
508
509static struct SCH_SHAPE_DESC
510{
512 {
514
515 if( fillEnum.Choices().GetCount() == 0 )
516 {
517 fillEnum.Map( FILL_T::NO_FILL, _HKI( "None" ) )
518 .Map( FILL_T::FILLED_SHAPE, _HKI( "Body outline color" ) )
519 .Map( FILL_T::FILLED_WITH_BG_BODYCOLOR, _HKI( "Body background color" ) )
520 .Map( FILL_T::FILLED_WITH_COLOR, _HKI( "Fill color" ) );
521 }
522
529
530 // Only polygons have meaningful Position properties.
531 // On other shapes, these are duplicates of the Start properties.
532 auto isPolygon =
533 []( INSPECTABLE* aItem ) -> bool
534 {
535 if( SCH_SHAPE* shape = dynamic_cast<SCH_SHAPE*>( aItem ) )
536 return shape->GetShape() == SHAPE_T::POLY;
537
538 return false;
539 };
540
541 auto isSymbolItem =
542 []( INSPECTABLE* aItem ) -> bool
543 {
544 if( SCH_SHAPE* shape = dynamic_cast<SCH_SHAPE*>( aItem ) )
545 return shape->GetLayer() == LAYER_DEVICE;
546
547 return false;
548 };
549
550 auto isSchematicItem =
551 []( INSPECTABLE* aItem ) -> bool
552 {
553 if( SCH_SHAPE* shape = dynamic_cast<SCH_SHAPE*>( aItem ) )
554 return shape->GetLayer() != LAYER_DEVICE;
555
556 return false;
557 };
558
559 auto isFillColorEditable =
560 []( INSPECTABLE* aItem ) -> bool
561 {
562 if( SCH_SHAPE* shape = dynamic_cast<SCH_SHAPE*>( aItem ) )
563 {
564 if( shape->GetParentSymbol() )
565 return shape->GetFillMode() == FILL_T::FILLED_WITH_COLOR;
566 else
567 return shape->IsSolidFill();
568 }
569
570 return true;
571 };
572
574 _HKI( "Position X" ), isPolygon );
576 _HKI( "Position Y" ), isPolygon );
577
579 _HKI( "Filled" ), isSchematicItem );
580
582 _HKI( "Fill Color" ), isFillColorEditable );
583
584 void ( SCH_SHAPE::*fillModeSetter )( FILL_T ) = &SCH_SHAPE::SetFillMode;
585 FILL_T ( SCH_SHAPE::*fillModeGetter )() const = &SCH_SHAPE::GetFillMode;
586
587 propMgr.AddProperty( new PROPERTY_ENUM<SCH_SHAPE, FILL_T>( _HKI( "Fill Mode" ),
588 fillModeSetter, fillModeGetter ),
589 _HKI( "Shape Properties" ) )
590 .SetAvailableFunc( isSymbolItem );
591 }
593
int color
constexpr EDA_IU_SCALE schIUScale
Definition base_units.h:114
BITMAPS
A list of all bitmap identifiers.
@ add_rectangle
@ add_graphical_segments
BOX2< VECTOR2I > BOX2I
Definition box2.h:922
static const COLOR4D WHITE
Definition color4d.h:401
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
Definition color4d.h:398
The base class for create windows for drawing purpose.
const KIID m_Uuid
Definition eda_item.h:516
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
EDA_ITEM_FLAGS m_flags
Definition eda_item.h:527
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
Definition eda_item.cpp:39
void SetStartX(int x)
Definition eda_shape.h:191
VECTOR2I getCenter() const
int GetStartY() const
Definition eda_shape.h:174
void rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle)
const SHAPE_POLY_SET & GetHatching() const
Definition eda_shape.h:148
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)
bool operator==(const EDA_SHAPE &aOther) const
int GetRadius() const
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
void SetEndX(int aX)
Definition eda_shape.h:233
void flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection)
EDA_SHAPE(SHAPE_T aType, int aLineWidth, FILL_T aFill)
Definition eda_shape.cpp:51
VECTOR2I m_start
Definition eda_shape.h:507
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
Definition eda_shape.h:215
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
Definition eda_shape.h:173
COLOR4D GetFillColor() const
Definition eda_shape.h:152
void SwapShape(EDA_SHAPE *aImage)
std::vector< VECTOR2I > m_bezierPoints
Definition eda_shape.h:516
wxString SHAPE_T_asString() const
int GetStartX() const
Definition eda_shape.h:175
double Similarity(const EDA_SHAPE &aOther) const
VECTOR2I m_end
Definition eda_shape.h:508
const BOX2I getBoundingBox() const
SHAPE_POLY_SET m_poly
Definition eda_shape.h:517
STROKE_PARAMS m_stroke
Definition eda_shape.h:493
FILL_T m_fill
Definition eda_shape.h:494
int GetCornerRadius() const
void SetFillMode(FILL_T aFill)
int Compare(const EDA_SHAPE *aOther) const
VECTOR2I GetArcMid() const
ENUM_MAP & Map(T aValue, const wxString &aName)
Definition property.h:705
static ENUM_MAP< T > & Instance()
Definition property.h:699
wxPGChoices & Choices()
Definition property.h:748
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:121
virtual void Circle(const VECTOR2I &pos, int diametre, FILL_T fill, int width)=0
virtual void SetDash(int aLineWidth, LINE_STYLE aLineStyle)=0
virtual void Rect(const VECTOR2I &p1, const VECTOR2I &p2, FILL_T fill, int width, int aCornerRadius=0)=0
bool GetColorMode() const
Definition plotter.h:149
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, void *aData)=0
Draw a polygon ( filled or not ).
virtual void SetColor(const COLOR4D &color)=0
virtual void Arc(const VECTOR2D &aStart, const VECTOR2D &aMid, const VECTOR2D &aEnd, FILL_T aFill, int aWidth)
Definition plotter.cpp:151
PROPERTY_BASE & SetAvailableFunc(std::function< bool(INSPECTABLE *)> aFunc)
Set a callback function to determine whether an object provides this property.
Definition property.h:259
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.
static PROPERTY_MANAGER & Instance()
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:88
SCHEMATIC_SETTINGS & Settings() const
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition sch_item.h:167
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_item.cpp:637
SCH_RENDER_SETTINGS * getRenderSettings(PLOTTER *aPlotter) const
Definition sch_item.h:688
const SYMBOL * GetParentSymbol() const
Definition sch_item.cpp:223
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
Definition sch_item.cpp:217
virtual bool operator==(const SCH_ITEM &aOther) const
Definition sch_item.cpp:517
bool IsPrivate() const
Definition sch_item.h:250
void SetLayer(SCH_LAYER_ID aLayer)
Definition sch_item.h:310
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:541
SCH_ITEM(EDA_ITEM *aParent, KICAD_T aType, int aUnit=0, int aBodyStyle=0)
Definition sch_item.cpp:51
int GetEffectivePenWidth(const SCH_RENDER_SETTINGS *aSettings) const
Definition sch_item.cpp:602
SCH_LAYER_ID m_layer
Definition sch_item.h:739
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:346
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.
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
std::vector< SHAPE * > MakeEffectiveShapes(bool aEdgeOnly=false) const override
Make a set of SHAPE objects representing the SCH_SHAPE.
Definition sch_shape.h:112
void SetFilled(bool aFilled) override
Definition sch_shape.cpp:67
void Move(const VECTOR2I &aOffset) override
Move the item by aMoveVector to a new position.
Definition sch_shape.cpp:78
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
Definition sch_shape.cpp:47
void SetStroke(const STROKE_PARAMS &aStroke) override
Definition sch_shape.cpp:61
void swapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
Definition sch_shape.cpp:53
void Normalize()
Definition sch_shape.cpp:84
double Similarity(const SCH_ITEM &aOther) const override
Return a measure of how likely the other object is to represent the same object.
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.
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:38
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
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.
void AddPoint(const VECTOR2I &aPosition)
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
void Rotate(const VECTOR2I &aCenter, bool aRotateCCW) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
bool operator==(const SCH_ITEM &aOther) const override
std::vector< int > ViewGetLayers() const override
Return the layers the item is drawn on (which may be more than its "home" layer)
int GetPenWidth() const override
Definition sch_shape.h:55
bool IsEndPoint(const VECTOR2I &aPoint) const override
Test if aPt is an end point of this schematic object.
STROKE_PARAMS GetStroke() const override
Definition sch_shape.h:58
VECTOR2I GetPosition() const override
Definition sch_shape.h:85
int GetEffectiveWidth() const override
int compare(const SCH_ITEM &aOther, int aCompareFlags=0) const override
Provide the draw object specific comparison called by the == and < operators.
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
int OutlineCount() const
Return the number of outlines in the set.
An abstract shape on 2D plane.
Definition shape.h:126
Simple container to manage line stroke parameters.
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 _(s)
static constexpr EDA_ANGLE ANGLE_90
Definition eda_angle.h:413
static constexpr EDA_ANGLE ANGLE_270
Definition eda_angle.h:416
#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
@ SEGMENT
Definition eda_shape.h:45
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
Definition eda_shape.h:46
FILL_T
Definition eda_shape.h:56
@ FILLED_WITH_COLOR
Definition eda_shape.h:60
@ NO_FILL
Definition eda_shape.h:57
@ REVERSE_HATCH
Definition eda_shape.h:62
@ HATCH
Definition eda_shape.h:61
@ FILLED_WITH_BG_BODYCOLOR
Definition eda_shape.h:59
@ FILLED_SHAPE
Fill with object color.
Definition eda_shape.h:58
@ CROSS_HATCH
Definition eda_shape.h:63
a few functions useful in geometry calculations.
SCH_LAYER_ID
Eeschema drawing layers.
Definition layer_ids.h:448
@ LAYER_SHAPES_BACKGROUND
Definition layer_ids.h:482
@ LAYER_DEVICE
Definition layer_ids.h:465
@ LAYER_PRIVATE_NOTES
Definition layer_ids.h:467
@ LAYER_DEVICE_BACKGROUND
Definition layer_ids.h:483
@ LAYER_SELECTION_SHADOWS
Definition layer_ids.h:493
This file contains miscellaneous commonly used macros and functions.
#define UNIMPLEMENTED_FOR(type)
Definition macros.h:96
@ LEFT_RIGHT
Flip left to right (around the Y axis)
Definition mirror.h:28
@ TOP_BOTTOM
Flip top to bottom (around the X axis)
Definition mirror.h:29
Message panel definition file.
bool ShapeHitTest(const SHAPE_LINE_CHAIN &aHitter, const SHAPE &aHittee, bool aHitteeContained)
Perform a shape-to-shape hit test.
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
Definition eda_angle.h:400
#define _HKI(x)
Definition page_info.cpp:44
#define TYPE_HASH(x)
Definition property.h:73
#define ENUM_TO_WXANY(type)
Macro to define read-only fields (no setter method available)
Definition property.h:801
#define REGISTER_TYPE(x)
static struct SCH_SHAPE_DESC _SCH_SHAPE_DESC
LINE_STYLE
Dashed line types.
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