KiCad PCB EDA Suite
Loading...
Searching...
No Matches
sch_table.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 The KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <https://www.gnu.org/licenses/>.
18 */
19
20#include <pgm_base.h>
21#include <sch_edit_frame.h>
22#include <plotters/plotter.h>
24#include <geometry/shape_rect.h>
25#include <bitmaps.h>
26#include <string_utils.h>
27#include <schematic.h>
29#include <sch_painter.h>
30#include <wx/log.h>
31#include <sch_table.h>
33#include <properties/property.h>
35
36#include <api/api_enums.h>
37#include <api/api_utils.h>
38#include <api/schematic/schematic_types.pb.h>
39
40SCH_TABLE::SCH_TABLE( int aLineWidth ) :
41 SCH_ITEM( nullptr, SCH_TABLE_T ),
42 m_strokeExternal( true ),
45 m_strokeRows( true ),
46 m_strokeColumns( true ),
48 m_colCount( 0 )
49{
51}
52
53
55 SCH_ITEM( aTable )
56{
63
64 m_colCount = aTable.m_colCount;
65 m_colWidths = aTable.m_colWidths;
67
68 for( SCH_TABLECELL* src : aTable.m_cells )
69 AddCell( new SCH_TABLECELL( *src ) );
70}
71
72
74{
75 // We own our cells; delete them
76 for( SCH_TABLECELL* cell : m_cells )
77 delete cell;
78}
79
80
81void SCH_TABLE::Serialize( google::protobuf::Any& aContainer ) const
82{
83 using namespace kiapi::common;
84 using namespace kiapi::schematic::types;
85
86 SchematicTable table;
87
88 table.mutable_id()->set_value( m_Uuid.AsStdString() );
89 table.set_locked( IsLocked() ? types::LockedState::LS_LOCKED : types::LockedState::LS_UNLOCKED );
90
91 table.set_column_count( m_colCount );
92
93 for( int col = 0; col < m_colCount; ++col )
94 PackDistance( *table.add_column_widths(), GetColWidth( col ), schIUScale );
95
96 for( int row = 0; row < GetRowCount(); ++row )
97 PackDistance( *table.add_row_heights(), GetRowHeight( row ), schIUScale );
98
99 for( const SCH_TABLECELL* cell : m_cells )
100 cell->Serialize( *table.add_cells() );
101
102 table.set_external_border( m_strokeExternal ? TableStrokeMode::TSM_ENABLED : TableStrokeMode::TSM_DISABLED );
103 table.set_header_separator( m_StrokeHeaderSeparator ? TableStrokeMode::TSM_ENABLED
104 : TableStrokeMode::TSM_DISABLED );
105
106 PackStroke( *table.mutable_border_stroke(), m_borderStroke, schIUScale );
107
108 table.set_row_separators( m_strokeRows ? TableStrokeMode::TSM_ENABLED : TableStrokeMode::TSM_DISABLED );
109 table.set_column_separators( m_strokeColumns ? TableStrokeMode::TSM_ENABLED : TableStrokeMode::TSM_DISABLED );
110
111 PackStroke( *table.mutable_separators_stroke(), m_separatorsStroke, schIUScale );
112
113 kiapi::common::PackCustomProperties( table.mutable_custom_properties(), *this );
114 aContainer.PackFrom( table );
115}
116
117
118bool SCH_TABLE::Deserialize( const google::protobuf::Any& aContainer )
119{
120 using namespace kiapi::schematic::types;
121
122 SchematicTable table;
123
124 if( !aContainer.UnpackTo( &table ) )
125 return false;
126
127 kiapi::common::UnpackCustomProperties( table.custom_properties(), *this );
128
129 if( table.column_count() < 1 )
130 return false;
131
132 const_cast<KIID&>( m_Uuid ) = KIID( table.id().value() );
133 SetLocked( table.locked() == kiapi::common::types::LockedState::LS_LOCKED );
134
135 ClearCells();
136 m_colWidths.clear();
137 m_rowHeights.clear();
138
139 SetColCount( table.column_count() );
140
141 for( int i = 0; i < table.column_widths_size() && i < table.column_count(); ++i )
142 SetColWidth( i, kiapi::common::UnpackDistance( table.column_widths( i ), schIUScale ) );
143
144 for( const SchematicTableCell& protoCell : table.cells() )
145 {
146 SCH_TABLECELL* cell = new SCH_TABLECELL();
147
148 if( !cell->Deserialize( protoCell ) )
149 {
150 delete cell;
151 continue;
152 }
153
154 AddCell( cell );
155 }
156
157 int rowCount = m_colCount > 0 ? static_cast<int>( m_cells.size() ) / m_colCount : 0;
158
159 for( int i = 0; i < table.row_heights_size() && i < rowCount; ++i )
161
162 m_strokeExternal = table.external_border() == TableStrokeMode::TSM_ENABLED;
163 m_StrokeHeaderSeparator = table.header_separator() == TableStrokeMode::TSM_ENABLED;
164
165 if( table.has_border_stroke() )
167
168 m_strokeRows = table.row_separators() == TableStrokeMode::TSM_ENABLED;
169 m_strokeColumns = table.column_separators() == TableStrokeMode::TSM_ENABLED;
170
171 if( table.has_separators_stroke() )
173
174 return true;
175}
176
177
179{
180 wxCHECK_RET( aItem != nullptr && aItem->Type() == SCH_TABLE_T, wxT( "Cannot swap data with invalid table." ) );
181
182 SCH_TABLE* table = static_cast<SCH_TABLE*>( aItem );
183
184 std::swap( m_strokeExternal, table->m_strokeExternal );
185 std::swap( m_StrokeHeaderSeparator, table->m_StrokeHeaderSeparator );
186 std::swap( m_borderStroke, table->m_borderStroke );
187 std::swap( m_strokeRows, table->m_strokeRows );
188 std::swap( m_strokeColumns, table->m_strokeColumns );
189 std::swap( m_separatorsStroke, table->m_separatorsStroke );
190
191 std::swap( m_colCount, table->m_colCount );
192 std::swap( m_colWidths, table->m_colWidths );
193 std::swap( m_rowHeights, table->m_rowHeights );
194
195 std::swap( m_cells, table->m_cells );
196
197 for( SCH_TABLECELL* cell : m_cells )
198 cell->SetParent( this );
199
200 for( SCH_TABLECELL* cell : table->m_cells )
201 cell->SetParent( table );
202}
203
204
206{
207 Move( aPos - GetPosition() );
208}
209
210
212{
213 if( m_cells.empty() )
214 return VECTOR2I( 0, 0 ); // Return origin if table has no cells
215
216 return m_cells[0]->GetPosition();
217}
218
219
221{
222 BOX2I bbox;
223
224 for( SCH_TABLECELL* cell : m_cells )
225 {
226 bbox.Merge( cell->GetPosition() );
227 bbox.Merge( cell->GetEnd() );
228 }
229
230 return bbox.GetCenter();
231}
232
233
235{
236 VECTOR2I tableSize;
237
238 for( int ii = 0; ii < GetColCount(); ++ii )
239 tableSize.x += GetColWidth( ii );
240
241 for( int ii = 0; ii < GetRowCount(); ++ii )
242 tableSize.y += GetRowHeight( ii );
243
244 return GetPosition() + tableSize;
245}
246
247
249{
250 int y = GetPosition().y;
251
252 for( int row = 0; row < GetRowCount(); ++row )
253 {
254 int x = GetPosition().x;
255 int rowHeight = m_rowHeights[row];
256
257 for( int col = 0; col < GetColCount(); ++col )
258 {
259 int colWidth = m_colWidths[col];
260
261 SCH_TABLECELL* cell = GetCell( row, col );
262
263 if( !cell )
264 continue; // Skip if cell doesn't exist (shouldn't happen, but be defensive)
265
266 VECTOR2I pos( x, y );
267
268 RotatePoint( pos, GetPosition(), cell->GetTextAngle() );
269
270 if( cell->GetPosition() != pos )
271 {
272 cell->SetPosition( pos );
273 cell->ClearRenderCache();
274 }
275
276 VECTOR2I end = VECTOR2I( x + colWidth, y + rowHeight );
277
278 if( cell->GetColSpan() > 1 || cell->GetRowSpan() > 1 )
279 {
280 for( int ii = col + 1; ii < col + cell->GetColSpan(); ++ii )
281 end.x += m_colWidths[ii];
282
283 for( int ii = row + 1; ii < row + cell->GetRowSpan(); ++ii )
284 end.y += m_rowHeights[ii];
285 }
286
288
289 if( cell->GetEnd() != end )
290 {
291 cell->SetEnd( end );
292 cell->ClearRenderCache();
293 }
294
295 x += colWidth;
296 }
297
298 y += rowHeight;
299 }
300}
301
302
303void SCH_TABLE::Move( const VECTOR2I& aMoveVector )
304{
305 for( SCH_TABLECELL* cell : m_cells )
306 cell->Move( aMoveVector );
307}
308
309
311{
312 // We could mirror all the cells, but it doesn't seem useful....
313}
314
315
317{
318 // We could mirror all the cells, but it doesn't seem useful....
319}
320
321
322void SCH_TABLE::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
323{
324 for( SCH_TABLECELL* cell : m_cells )
325 cell->Rotate( aCenter, aRotateCCW );
326
327 Normalize();
328}
329
330
331bool SCH_TABLE::operator<( const SCH_ITEM& aItem ) const
332{
333 if( Type() != aItem.Type() )
334 return Type() < aItem.Type();
335
336 const SCH_TABLE& other = static_cast<const SCH_TABLE&>( aItem );
337
338 if( m_cells.size() != other.m_cells.size() )
339 return m_cells.size() < other.m_cells.size();
340
341 if( GetPosition().x != other.GetPosition().x )
342 return GetPosition().x < other.GetPosition().x;
343
344 if( GetPosition().y != other.GetPosition().y )
345 return GetPosition().y < other.GetPosition().y;
346
347 return m_cells[0] < other.m_cells[0];
348}
349
350
351void SCH_TABLE::RunOnChildren( const std::function<void( SCH_ITEM* )>& aFunction, RECURSE_MODE aMode )
352{
353 for( SCH_TABLECELL* cell : m_cells )
354 aFunction( cell );
355}
356
357
359{
360 if( m_cells.empty() )
361 return BOX2I();
362
363 BOX2I bbox = m_cells[0]->GetBoundingBox();
364
365 bbox.Merge( m_cells[m_cells.size() - 1]->GetBoundingBox() );
366
367 return bbox;
368}
369
370
371INSPECT_RESULT SCH_TABLE::Visit( INSPECTOR aInspector, void* aTestData, const std::vector<KICAD_T>& aScanTypes )
372{
373 for( KICAD_T scanType : aScanTypes )
374 {
375 if( scanType == SCH_LOCATE_ANY_T || scanType == SCH_TABLE_T )
376 {
377 if( INSPECT_RESULT::QUIT == aInspector( this, aTestData ) )
379 }
380
381 if( scanType == SCH_LOCATE_ANY_T || scanType == SCH_TABLECELL_T )
382 {
383 for( SCH_TABLECELL* cell : m_cells )
384 {
385 if( INSPECT_RESULT::QUIT == aInspector( cell, (void*) this ) )
387 }
388 }
389 }
390
392}
393
394
395wxString SCH_TABLE::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
396{
397 return wxString::Format( _( "%d Column Table" ), m_colCount );
398}
399
400
402{
403 return BITMAPS::spreadsheet; // JEY TODO
404}
405
406
407std::vector<int> SCH_TABLE::ViewGetLayers() const
408{
410}
411
412
413bool SCH_TABLE::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
414{
415 BOX2I rect = GetBoundingBox();
416
417 rect.Inflate( aAccuracy );
418
419 return rect.Contains( aPosition );
420}
421
422
423bool SCH_TABLE::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
424{
425 BOX2I rect = aRect;
426
427 rect.Inflate( aAccuracy );
428
429 if( aContained )
430 return rect.Contains( GetBoundingBox() );
431
432 return rect.Intersects( GetBoundingBox() );
433}
434
435
436bool SCH_TABLE::HitTest( const SHAPE_LINE_CHAIN& aPoly, bool aContained ) const
437{
438 return KIGEOM::BoxHitTest( aPoly, GetBoundingBox(), aContained );
439}
440
441
442void SCH_TABLE::DrawBorders( const std::function<void( const VECTOR2I& aPt1, const VECTOR2I& aPt2,
443 const STROKE_PARAMS& aStroke )>& aCallback ) const
444{
445 EDA_ANGLE drawAngle = GetCell( 0, 0 )->GetTextAngle();
446
447 std::vector<VECTOR2I> topLeft = GetCell( 0, 0 )->GetCornersInSequence( drawAngle );
448 std::vector<VECTOR2I> bottomLeft = GetCell( GetRowCount() - 1, 0 )->GetCornersInSequence( drawAngle );
449 std::vector<VECTOR2I> topRight = GetCell( 0, GetColCount() - 1 )->GetCornersInSequence( drawAngle );
450 std::vector<VECTOR2I> bottomRight =
451 GetCell( GetRowCount() - 1, GetColCount() - 1 )->GetCornersInSequence( drawAngle );
452 STROKE_PARAMS stroke;
453
454 for( int col = 0; col < GetColCount() - 1; ++col )
455 {
456 for( int row = 0; row < GetRowCount(); ++row )
457 {
458 if( row == 0 && StrokeHeaderSeparator() )
459 stroke = GetBorderStroke();
460 else if( StrokeColumns() )
461 stroke = GetSeparatorsStroke();
462 else
463 continue;
464
465 SCH_TABLECELL* cell = GetCell( row, col );
466
467 if( cell->GetColSpan() == 0 )
468 continue;
469
470 if( col + cell->GetColSpan() == GetColCount() )
471 continue;
472
473 std::vector<VECTOR2I> corners = cell->GetCornersInSequence( drawAngle );
474
475 if( corners.size() == 4 )
476 aCallback( corners[1], corners[2], stroke );
477 }
478 }
479
480 for( int row = 0; row < GetRowCount() - 1; ++row )
481 {
482 if( row == 0 && StrokeHeaderSeparator() )
483 stroke = GetBorderStroke();
484 else if( StrokeRows() )
485 stroke = GetSeparatorsStroke();
486 else
487 continue;
488
489 for( int col = 0; col < GetColCount(); ++col )
490 {
491 SCH_TABLECELL* cell = GetCell( row, col );
492
493 if( cell->GetRowSpan() == 0 )
494 continue;
495
496 if( row + cell->GetRowSpan() == GetRowCount() )
497 continue;
498
499 std::vector<VECTOR2I> corners = cell->GetCornersInSequence( drawAngle );
500
501 if( corners.size() == 4 )
502 aCallback( corners[2], corners[3], stroke );
503 }
504 }
505
506 if( StrokeExternal() && GetBorderStroke().GetWidth() >= 0 )
507 {
508 aCallback( topLeft[0], topRight[1], GetBorderStroke() );
509 aCallback( topRight[1], bottomRight[2], GetBorderStroke() );
510 aCallback( bottomRight[2], bottomLeft[3], GetBorderStroke() );
511 aCallback( bottomLeft[3], topLeft[0], GetBorderStroke() );
512 }
513}
514
515
516void SCH_TABLE::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS& aPlotOpts, int aUnit, int aBodyStyle,
517 const VECTOR2I& aOffset, bool aDimmed )
518{
519 for( SCH_TABLECELL* cell : m_cells )
520 cell->Plot( aPlotter, aBackground, aPlotOpts, aUnit, aBodyStyle, aOffset, aDimmed );
521
522 if( aBackground )
523 return;
524
525 RENDER_SETTINGS* settings = aPlotter->RenderSettings();
526
528 [&]( const VECTOR2I& ptA, const VECTOR2I& ptB, const STROKE_PARAMS& stroke )
529 {
530 int lineWidth = stroke.GetWidth();
531 COLOR4D color = stroke.GetColor();
532 LINE_STYLE lineStyle = stroke.GetLineStyle();
533
534 if( lineWidth == 0 )
535 {
536 if( SCHEMATIC* schematic = Schematic() )
537 lineWidth = schematic->Settings().m_DefaultLineWidth;
538 else
539 lineWidth = schIUScale.MilsToIU( DEFAULT_LINE_WIDTH_MILS );
540 }
541
542 if( lineWidth < settings->GetMinPenWidth() )
543 lineWidth = settings->GetMinPenWidth();
544
545 if( !aPlotter->GetColorMode() || color == COLOR4D::UNSPECIFIED )
546 color = settings->GetLayerColor( m_layer );
547
548 if( color.m_text && Schematic() )
549 color = COLOR4D( ResolveText( *color.m_text, &Schematic()->CurrentSheet() ) );
550
551 if( lineStyle == LINE_STYLE::DEFAULT )
552 lineStyle = LINE_STYLE::SOLID;
553
554 aPlotter->SetColor( color );
555 aPlotter->SetDash( lineWidth, lineStyle );
556
557 aPlotter->MoveTo( ptA );
558 aPlotter->FinishTo( ptB );
559 } );
560}
561
562
563void SCH_TABLE::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
564{
565 // Don't use GetShownText() here; we want to show the user the variable references
566 aList.emplace_back( _( "Table" ), wxString::Format( _( "%d Columns" ), m_colCount ) );
567
568 SCH_ITEM::GetMsgPanelInfo( aFrame, aList );
569}
570
571
572bool SCH_TABLE::operator==( const SCH_ITEM& aOther ) const
573{
574 if( Type() != aOther.Type() )
575 return false;
576
577 const SCH_TABLE& other = static_cast<const SCH_TABLE&>( aOther );
578
579 if( m_cells.size() != other.m_cells.size() )
580 return false;
581
582 if( m_colWidths != other.m_colWidths )
583 return false;
584
585 if( m_rowHeights != other.m_rowHeights )
586 return false;
587
588 for( int ii = 0; ii < (int) m_cells.size(); ++ii )
589 {
590 if( !( *m_cells[ii] == *other.m_cells[ii] ) )
591 return false;
592 }
593
594 return true;
595}
596
597
598double SCH_TABLE::Similarity( const SCH_ITEM& aOther ) const
599{
600 if( aOther.Type() != Type() )
601 return 0.0;
602
603 const SCH_TABLE& other = static_cast<const SCH_TABLE&>( aOther );
604
605 if( m_cells.size() != other.m_cells.size() )
606 return 0.1;
607
608 double similarity = 1.0;
609
610 for( int ii = 0; ii < (int) m_cells.size(); ++ii )
611 similarity *= m_cells[ii]->Similarity( *other.m_cells[ii] );
612
613 return similarity;
614}
615
616
617static struct SCH_TABLE_DESC
618{
620 {
623
626
627 propMgr.AddProperty( new PROPERTY<SCH_TABLE, int>( _HKI( "Start X" ),
630 propMgr.AddProperty( new PROPERTY<SCH_TABLE, int>( _HKI( "Start Y" ),
633
634 const wxString tableProps = _( "Table Properties" );
635
636 propMgr.AddProperty( new PROPERTY<SCH_TABLE, bool>( _HKI( "External Border" ),
638 tableProps );
639
640 propMgr.AddProperty( new PROPERTY<SCH_TABLE, bool>( _HKI( "Header Border" ),
642 tableProps );
643
644 propMgr.AddProperty( new PROPERTY<SCH_TABLE, int>( _HKI( "Border Width" ),
647 tableProps );
648
649 propMgr.AddProperty( new PROPERTY_ENUM<SCH_TABLE, LINE_STYLE>( _HKI( "Border Style" ),
651 tableProps );
652
653 propMgr.AddProperty( new PROPERTY<SCH_TABLE, COLOR4D>( _HKI( "Border Color" ),
655 tableProps );
656
657 propMgr.AddProperty( new PROPERTY<SCH_TABLE, bool>( _HKI( "Row Separators" ),
659 tableProps );
660
661 propMgr.AddProperty( new PROPERTY<SCH_TABLE, bool>( _HKI( "Cell Separators" ),
663 tableProps );
664
665 propMgr.AddProperty( new PROPERTY<SCH_TABLE, int>( _HKI( "Separators Width" ),
668 tableProps );
669
670 propMgr.AddProperty( new PROPERTY_ENUM<SCH_TABLE, LINE_STYLE>( _HKI( "Separators Style" ),
672 tableProps );
673
674 propMgr.AddProperty( new PROPERTY<SCH_TABLE, COLOR4D>( _HKI( "Separators Color" ),
676 tableProps );
677 }
constexpr EDA_IU_SCALE schIUScale
Definition base_units.h:123
BITMAPS
A list of all bitmap identifiers.
BOX2< VECTOR2I > BOX2I
Definition box2.h:927
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition box2.h:553
constexpr BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
Definition box2.h:653
constexpr const Vec GetCenter() const
Definition box2.h:227
constexpr bool Contains(const Vec &aPoint) const
Definition box2.h:165
constexpr bool Intersects(const BOX2< Vec > &aRect) const
Definition box2.h:308
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
Definition color4d.h:399
The base class for create windows for drawing purpose.
const KIID m_Uuid
Definition eda_item.h:597
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
virtual void SetParent(EDA_ITEM *aParent)
Definition eda_item.cpp:153
virtual void SetEnd(const VECTOR2I &aEnd)
Definition eda_shape.h:329
virtual std::vector< VECTOR2I > GetCornersInSequence(EDA_ANGLE angle) const
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
Definition eda_shape.h:325
virtual void ClearRenderCache()
Definition eda_text.cpp:652
virtual EDA_ANGLE GetTextAngle() const
Definition eda_text.h:178
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:101
std::shared_ptr< wxString > m_text
Definition color4d.h:396
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
const COLOR4D & GetLayerColor(int aLayer) const
Return the color used to draw a layer.
Definition kiid.h:46
Base plotter engine class.
Definition plotter.h:136
void MoveTo(const VECTOR2I &pos)
Definition plotter.h:308
virtual void SetDash(int aLineWidth, LINE_STYLE aLineStyle)=0
void FinishTo(const VECTOR2I &pos)
Definition plotter.h:318
RENDER_SETTINGS * RenderSettings()
Definition plotter.h:167
bool GetColorMode() const
Definition plotter.h:164
virtual void SetColor(const COLOR4D &color)=0
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 AddTypeCast(TYPE_CAST_BASE *aCast)
Register a type converter.
Holds all the data relating to one schematic.
Definition schematic.h:148
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition sch_item.h:165
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:859
void SetLocked(bool aLocked) override
Definition sch_item.h:256
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
Definition sch_item.cpp:281
bool IsLocked() const override
Definition sch_item.cpp:158
void SetLayer(SCH_LAYER_ID aLayer)
Definition sch_item.h:346
SCH_ITEM(EDA_ITEM *aParent, KICAD_T aType, int aUnit=0, int aBodyStyle=0)
Definition sch_item.cpp:52
wxString ResolveText(const wxString &aText, const SCH_SHEET_PATH *aPath, int aDepth=0) const
Definition sch_item.cpp:390
SCH_LAYER_ID m_layer
Definition sch_item.h:790
void SetPosition(const VECTOR2I &aPos) override
Definition sch_shape.h:87
VECTOR2I GetPosition() const override
Definition sch_shape.h:86
int GetColSpan() const
int GetRowSpan() const
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
void SetBorderWidth(int aWidth)
Definition sch_table.h:60
void SetSeparatorsStyle(const LINE_STYLE aStyle)
Definition sch_table.h:81
LINE_STYLE GetSeparatorsStyle() const
Definition sch_table.h:86
std::vector< int > ViewGetLayers() const override
Return the layers the item is drawn on (which may be more than its "home" layer)
double Similarity(const SCH_ITEM &aOther) const override
Return a measure of how likely the other object is to represent the same object.
bool operator<(const SCH_ITEM &aItem) const override
void SetRowHeight(int aRow, int aHeight)
Definition sch_table.h:138
std::vector< SCH_TABLECELL * > m_cells
Definition sch_table.h:260
const STROKE_PARAMS & GetSeparatorsStroke() const
Definition sch_table.h:76
std::map< int, int > m_rowHeights
Definition sch_table.h:259
bool m_strokeColumns
Definition sch_table.h:254
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
void SetColCount(int aCount)
Definition sch_table.h:118
bool StrokeExternal() const
Definition sch_table.h:52
void SetBorderColor(const COLOR4D &aColor)
Definition sch_table.h:72
bool m_strokeRows
Definition sch_table.h:253
int GetPositionY() const
Definition sch_table.h:116
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
void SetPositionX(int x)
Definition sch_table.h:113
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
LINE_STYLE GetBorderStyle() const
Definition sch_table.h:64
void SetSeparatorsColor(const COLOR4D &aColor)
Definition sch_table.h:94
int GetRowHeight(int aRow) const
Definition sch_table.h:140
void SetColWidth(int aCol, int aWidth)
Definition sch_table.h:128
void RunOnChildren(const std::function< void(SCH_ITEM *)> &aFunction, RECURSE_MODE aMode) override
COLOR4D GetSeparatorsColor() const
Definition sch_table.h:95
SCH_TABLE(int aLineWidth=0)
Definition sch_table.cpp:40
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
INSPECT_RESULT Visit(INSPECTOR inspector, void *testData, const std::vector< KICAD_T > &aScanTypes) override
May be re-implemented for each derived class in order to handle all the types given by its member dat...
void DrawBorders(const std::function< void(const VECTOR2I &aPt1, const VECTOR2I &aPt2, const STROKE_PARAMS &aStroke)> &aCallback) const
int GetColWidth(int aCol) const
Definition sch_table.h:130
void SetStrokeHeaderSeparator(bool aDoStroke)
Definition sch_table.h:54
void AddCell(SCH_TABLECELL *aCell)
Definition sch_table.h:163
void SetSeparatorsWidth(int aWidth)
Definition sch_table.h:78
const STROKE_PARAMS & GetBorderStroke() const
Definition sch_table.h:58
bool m_StrokeHeaderSeparator
Definition sch_table.h:251
VECTOR2I GetCenter() const
int m_colCount
Definition sch_table.h:257
VECTOR2I GetPosition() const override
void swapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
void SetStrokeExternal(bool aDoStroke)
Definition sch_table.h:51
VECTOR2I GetEnd() 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.
void SetPositionY(int y)
Definition sch_table.h:114
STROKE_PARAMS m_separatorsStroke
Definition sch_table.h:255
int GetColCount() const
Definition sch_table.h:119
bool StrokeHeaderSeparator() const
Definition sch_table.h:55
bool m_strokeExternal
Definition sch_table.h:250
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.
std::map< int, int > m_colWidths
Definition sch_table.h:258
void SetStrokeColumns(bool aDoStroke)
Definition sch_table.h:97
SCH_TABLECELL * GetCell(int aRow, int aCol) const
Definition sch_table.h:148
void ClearCells()
Definition sch_table.h:175
int GetSeparatorsWidth() const
Definition sch_table.h:79
bool StrokeColumns() const
Definition sch_table.h:98
void SetPosition(const VECTOR2I &aPos) override
int GetPositionX() const
Definition sch_table.h:115
bool StrokeRows() const
Definition sch_table.h:101
STROKE_PARAMS m_borderStroke
Definition sch_table.h:252
int GetRowCount() const
Definition sch_table.h:121
void SetStrokeRows(bool aDoStroke)
Definition sch_table.h:100
void SetBorderStyle(const LINE_STYLE aStyle)
Definition sch_table.h:63
COLOR4D GetBorderColor() const
Definition sch_table.h:73
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
bool operator==(const SCH_ITEM &aOther) const override
int GetBorderWidth() const
Definition sch_table.h:61
void Normalize()
void Move(const VECTOR2I &aMoveVector) override
Move the item by aMoveVector to a new position.
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
Definition sch_table.cpp:81
void Rotate(const VECTOR2I &aCenter, bool aRotateCCW) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
Simple container to manage line stroke parameters.
int GetWidth() const
LINE_STYLE GetLineStyle() const
KIGFX::COLOR4D GetColor() const
#define DEFAULT_LINE_WIDTH_MILS
The default wire width in mils. (can be changed in preference menu)
#define _(s)
RECURSE_MODE
Definition eda_item.h:50
INSPECT_RESULT
Definition eda_item.h:44
const INSPECTOR_FUNC & INSPECTOR
std::function passed to nested users by ref, avoids copying std::function.
Definition eda_item.h:91
a few functions useful in geometry calculations.
@ LAYER_NOTES
Definition layer_ids.h:489
@ LAYER_NOTES_BACKGROUND
Definition layer_ids.h:491
@ LAYER_SELECTION_SHADOWS
Definition layer_ids.h:517
bool BoxHitTest(const VECTOR2I &aHitPoint, const BOX2I &aHittee, int aAccuracy)
Perform a point-to-box hit test.
KICOMMON_API void UnpackStroke(STROKE_PARAMS &aOutput, const types::StrokeAttributes &aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API int UnpackDistance(const types::Distance &aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API void PackCustomProperties(google::protobuf::RepeatedPtrField< types::CustomProperty > *aOutput, const EDA_ITEM &aItem)
KICOMMON_API void PackDistance(types::Distance &aOutput, int aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API void PackStroke(types::StrokeAttributes &aOutput, const STROKE_PARAMS &aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API void UnpackCustomProperties(const google::protobuf::RepeatedPtrField< types::CustomProperty > &aInput, EDA_ITEM &aItem)
#define _HKI(x)
Definition page_info.cpp:40
see class PGM_BASE
#define TYPE_HASH(x)
Definition property.h:74
@ PT_COORD
Coordinate expressed in distance units (mm/inch)
Definition property.h:65
@ PT_SIZE
Size expressed in distance units (mm/inch)
Definition property.h:63
#define REGISTER_TYPE(x)
static struct SCH_TABLE_DESC _SCH_TABLE_DESC
LINE_STYLE
Dashed line types.
VECTOR2I end
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
Definition trigo.cpp:225
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition typeinfo.h:70
@ SCH_TABLE_T
Definition typeinfo.h:161
@ SCH_TABLECELL_T
Definition typeinfo.h:162
@ SCH_LOCATE_ANY_T
Definition typeinfo.h:195
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:683