KiCad PCB EDA Suite
Loading...
Searching...
No Matches
sch_item.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) 2006 Jean-Pierre Charras, [email protected]
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 <pgm_base.h>
27#include <eeschema_settings.h>
28#include <eda_item.h>
29#include <sch_connection.h>
30#include <sch_group.h>
31#include <sch_rule_area.h>
32#include <sch_draw_panel.h>
33#include <sch_edit_frame.h>
34#include <connection_graph.h>
35#include <netclass.h>
39
40
41// Rendering fonts is expensive (particularly when using outline fonts). At small effective
42// sizes (ie: zoomed out) the visual differences between outline and/or stroke fonts and the
43// bitmap font becomes immaterial, and there's often more to draw when zoomed out so the
44// performance gain becomes more significant.
45#define BITMAP_FONT_SIZE_THRESHOLD 3
46
47
48static const std::vector<KICAD_T> labelTypes = { SCH_LABEL_LOCATE_ANY_T };
49
50
51/* Constructor and destructor for SCH_ITEM */
52/* They are not inline because this creates problems with gcc at linking time in debug mode */
53
54SCH_ITEM::SCH_ITEM( EDA_ITEM* aParent, KICAD_T aType, int aUnit, int aBodyStyle ) :
55 EDA_ITEM( aParent, aType, true, false ),
56 m_unit( aUnit ),
57 m_bodyStyle( aBodyStyle ),
58 m_private( false )
59{
60 m_layer = LAYER_WIRE; // It's only a default, in fact
62 m_connectivity_dirty = false; // Item is unconnected until it is placed, so it's clean
63}
64
65
67 EDA_ITEM( aItem )
68{
69 m_layer = aItem.m_layer;
70 m_unit = aItem.m_unit;
72 m_private = aItem.m_private;
75}
76
77
79{
80 m_layer = aItem.m_layer;
81 m_unit = aItem.m_unit;
83 m_private = aItem.m_private;
86
87 return *this;
88}
89
90
92{
93 for( const auto& it : m_connection_map )
94 delete it.second;
95
96 // Do not try to modify SCHEMATIC::ConnectionGraph()
97 // if the schematic does not exist
99 return;
100
101 SCHEMATIC* sch = Schematic();
102
103 if( sch != nullptr )
104 sch->ConnectionGraph()->RemoveItem( this );
105}
106
107
109{
110 switch( Type() )
111 {
112 case SCH_SYMBOL_T:
113 case SCH_PIN_T:
114 case SCH_SHAPE_T:
115 case SCH_BITMAP_T:
116 case SCH_FIELD_T:
117 case SCH_TEXT_T:
118 case SCH_TEXTBOX_T:
119 case SCH_TABLE_T:
120 case SCH_GROUP_T:
121 case SCH_LINE_T:
122 case SCH_JUNCTION_T:
123 case SCH_NO_CONNECT_T:
126 case SCH_LABEL_T:
128 case SCH_HIER_LABEL_T:
129 case SCH_RULE_AREA_T:
131 case SCH_SHEET_PIN_T:
132 case SCH_SHEET_T:
133 return true;
134 default:
135 return false;
136 }
137}
138
139
140SCH_ITEM* SCH_ITEM::Duplicate( bool addToParentGroup, SCH_COMMIT* aCommit, bool doClone ) const
141{
142 SCH_ITEM* newItem = (SCH_ITEM*) Clone();
143
144 if( !doClone )
145 const_cast<KIID&>( newItem->m_Uuid ) = KIID();
146
147 newItem->ClearFlags( SELECTED | BRIGHTENED );
148
149 newItem->RunOnChildren(
150 []( SCH_ITEM* aChild )
151 {
152 aChild->ClearFlags( SELECTED | BRIGHTENED );
153 },
155
156 if( addToParentGroup )
157 {
158 wxCHECK_MSG( aCommit, newItem, "Must supply a commit to update parent group" );
159
160 if( EDA_GROUP* group = newItem->GetParentGroup() )
161 {
162 aCommit->Modify( group->AsEdaItem(), nullptr, RECURSE_MODE::NO_RECURSE );
163 group->AddItem( newItem );
164 }
165 }
166
167 return newItem;
168}
169
170
171wxString SCH_ITEM::GetUnitDisplayName( int aUnit, bool aLabel ) const
172{
173 if( aUnit == 0 )
174 return aLabel ? _( "All units" ) : wxString( _HKI( "All units" ) );
175 else if( const SYMBOL* symbol = GetParentSymbol() )
176 return symbol->GetUnitDisplayName( aUnit, aLabel );
177
178 return wxEmptyString;
179}
180
181
182wxString SCH_ITEM::GetBodyStyleDescription( int aBodyStyle, bool aLabel ) const
183{
184 if( aBodyStyle == 0 )
185 return aLabel ? _( "All body styles" ) : wxString( _HKI( "All body styles" ) );
186 else if( const SYMBOL* symbol = GetParentSymbol() )
187 return symbol->GetBodyStyleDescription( aBodyStyle, aLabel );
188
189 return wxEmptyString;
190}
191
192void SCH_ITEM::SetUnitString( const wxString& aUnit )
193{
194 if( aUnit == _HKI( "All units" ) )
195 {
196 m_unit = 0;
197 return;
198 }
199
200 if( SYMBOL* symbol = GetParentSymbol() )
201 {
202 for( int ii = 1; ii <= symbol->GetUnitCount(); ii++ )
203 {
204 if( symbol->GetUnitDisplayName( ii, false ) == aUnit )
205 {
206 m_unit = ii;
207 return;
208 }
209 }
210 }
211}
212
213
215{
216 return GetUnitDisplayName( m_unit, false );
217}
218
219void SCH_ITEM::SetBodyStyleProp( const wxString& aBodyStyle )
220{
221 if( aBodyStyle == _HKI( "All body styles" ) )
222 {
223 m_bodyStyle = 0;
224 return;
225 }
226
227 if( SYMBOL* symbol = GetParentSymbol() )
228 {
229 for( int bodyStyle : { BODY_STYLE::BASE, BODY_STYLE::DEMORGAN } )
230 {
231 if( symbol->GetBodyStyleDescription( bodyStyle, false ) == aBodyStyle )
232 {
233 m_bodyStyle = bodyStyle;
234 return;
235 }
236 }
237 }
238}
239
240
242{
243 return GetBodyStyleDescription( m_bodyStyle, false );
244}
245
246
248{
249 return static_cast<SCHEMATIC*>( findParent( SCHEMATIC_T ) );
250}
251
252
254{
255 if( SYMBOL* sch_symbol = static_cast<SCH_SYMBOL*>( findParent( SCH_SYMBOL_T ) ) )
256 return sch_symbol;
257
258 if( SYMBOL* lib_symbol = static_cast<LIB_SYMBOL*>( findParent( LIB_SYMBOL_T ) ) )
259 return lib_symbol;
260
261 return nullptr;
262}
263
264
266{
267 if( SYMBOL* sch_symbol = static_cast<SCH_SYMBOL*>( findParent( SCH_SYMBOL_T ) ) )
268 return sch_symbol;
269
270 if( SYMBOL* lib_symbol = static_cast<LIB_SYMBOL*>( findParent( LIB_SYMBOL_T ) ) )
271 return lib_symbol;
272
273 return nullptr;
274}
275
276
278 const wxString& aVariantName ) const
279{
280 if( GetExcludedFromSim( aInstance, aVariantName ) )
281 return true;
282
283 for( SCH_RULE_AREA* area : m_rule_areas_cache )
284 {
285 if( area->GetExcludedFromSim( aInstance, aVariantName ) )
286 return true;
287 }
288
289 return false;
290}
291
292
294 const wxString& aVariantName ) const
295{
296 if( GetExcludedFromBOM( aInstance, aVariantName ) )
297 return true;
298
299 for( SCH_RULE_AREA* area : m_rule_areas_cache )
300 {
301 if( area->GetExcludedFromBOM( aInstance, aVariantName ) )
302 return true;
303 }
304
305 return false;
306}
307
308
310 const wxString& aVariantName ) const
311{
312 if( GetExcludedFromBoard( aInstance, aVariantName ) )
313 return true;
314
315 for( SCH_RULE_AREA* area : m_rule_areas_cache )
316 {
317 if( area->GetExcludedFromBoard( aInstance, aVariantName ) )
318 return true;
319 }
320
321 return false;
322}
323
324
326 const wxString& aVariantName ) const
327{
328 if( GetExcludedFromPosFiles( aInstance, aVariantName ) )
329 return true;
330
331 for( SCH_RULE_AREA* area : m_rule_areas_cache )
332 {
333 if( area->GetExcludedFromPosFiles( aInstance, aVariantName ) )
334 return true;
335 }
336
337 return false;
338}
339
340
341bool SCH_ITEM::ResolveDNP( const SCH_SHEET_PATH* aInstance, const wxString& aVariantName ) const
342{
343 if( GetDNP( aInstance, aVariantName ) )
344 return true;
345
346 for( SCH_RULE_AREA* area : m_rule_areas_cache )
347 {
348 if( area->GetDNP( aInstance, aVariantName ) )
349 return true;
350 }
351
352 return false;
353}
354
355
356wxString SCH_ITEM::ResolveText( const wxString& aText, const SCH_SHEET_PATH* aPath, int aDepth ) const
357{
358 // Use local depth counter so each text element starts fresh
359 int depth = 0;
360
361 std::function<bool( wxString* )> libSymbolResolver =
362 [&]( wxString* token ) -> bool
363 {
364 LIB_SYMBOL* symbol = static_cast<LIB_SYMBOL*>( m_parent );
365 return symbol->ResolveTextVar( token, depth + 1 );
366 };
367
368 std::function<bool( wxString* )> symbolResolver =
369 [&]( wxString* token ) -> bool
370 {
371 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( m_parent );
372 return symbol->ResolveTextVar( aPath, token, depth + 1 );
373 };
374
375 std::function<bool( wxString* )> schematicResolver =
376 [&]( wxString* token ) -> bool
377 {
378 if( !aPath )
379 return false;
380
381 if( SCHEMATIC* schematic = Schematic() )
382 return schematic->ResolveTextVar( aPath, token, depth + 1 );
383
384 return false;
385 };
386
387 std::function<bool( wxString* )> sheetResolver =
388 [&]( wxString* token ) -> bool
389 {
390 if( !aPath )
391 return false;
392
393 SCH_SHEET* sheet = static_cast<SCH_SHEET*>( m_parent );
394
395 SCHEMATIC* schematic = Schematic();
396 SCH_SHEET_PATH path = *aPath;
397 path.push_back( sheet );
398
399 bool retval = sheet->ResolveTextVar( &path, token, depth + 1 );
400
401 if( schematic )
402 retval |= schematic->ResolveTextVar( &path, token, depth + 1 );
403
404 return retval;
405 };
406
407 std::function<bool( wxString* )> labelResolver =
408 [&]( wxString* token ) -> bool
409 {
410 if( !aPath )
411 return false;
412
413 SCH_LABEL_BASE* label = static_cast<SCH_LABEL_BASE*>( m_parent );
414 return label->ResolveTextVar( aPath, token, depth + 1 );
415 };
416
417 wxString variantName;
418
419 if( SCHEMATIC* schematic = Schematic() )
420 variantName = schematic->GetCurrentVariant();
421
422 // Create a unified resolver that delegates to the appropriate resolver based on parent type
423 std::function<bool( wxString* )> fieldResolver =
424 [&]( wxString* token ) -> bool
425 {
426 bool resolved = false;
427
428 if( m_parent && m_parent->Type() == LIB_SYMBOL_T )
429 resolved = libSymbolResolver( token );
430 else if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
431 resolved = symbolResolver( token );
432 else if( m_parent && m_parent->Type() == SCH_SHEET_T )
433 resolved = sheetResolver( token );
434 else if( m_parent && m_parent->IsType( labelTypes ) )
435 resolved = labelResolver( token );
436 else if( Schematic() )
437 {
438 // Project-level and schematic-level variables
439 resolved = Schematic()->Project().TextVarResolver( token );
440 resolved |= schematicResolver( token );
441 }
442
443 return resolved;
444 };
445
446 return ResolveTextVars( aText, &fieldResolver, depth );
447}
448
449
450std::vector<int> SCH_ITEM::ViewGetLayers() const
451{
452 // Basic fallback
454}
455
456
457bool SCH_ITEM::IsConnected( const VECTOR2I& aPosition ) const
458{
459 if(( m_flags & STRUCT_DELETED ) || ( m_flags & SKIP_STRUCT ) )
460 return false;
461
462 return doIsConnected( aPosition );
463}
464
465
467{
468 if( !IsConnectable() )
469 return nullptr;
470
471 if( !aSheet )
472 {
473 SCHEMATIC* sch = Schematic();
474
475 if( !sch )
476 return nullptr; // Item has been removed from schematic (e.g. SCH_PIN during symbol deletion)
477
478 aSheet = &sch->CurrentSheet();
479 }
480
481 auto it = m_connection_map.find( *aSheet );
482
483 if( it == m_connection_map.end() )
484 return nullptr;
485 else
486 return it->second;
487}
488
489
491{
492 for( auto& [path, conn] : m_connection_map )
493 {
494 conn->SetGraph( aGraph );
495
496 for( auto& member : conn->AllMembers() )
497 member->SetGraph( aGraph );
498 }
499}
500
501
502std::shared_ptr<NETCLASS> SCH_ITEM::GetEffectiveNetClass( const SCH_SHEET_PATH* aSheet ) const
503{
504 static std::shared_ptr<NETCLASS> nullNetclass = std::make_shared<NETCLASS>( wxEmptyString );
505
506 SCHEMATIC* schematic = Schematic();
507
508 if( schematic )
509 {
510 std::shared_ptr<NET_SETTINGS>& netSettings = schematic->Project().GetProjectFile().m_NetSettings;
511 SCH_CONNECTION* connection = Connection( aSheet );
512
513 if( connection )
514 return netSettings->GetEffectiveNetClass( connection->Name() );
515 else
516 return netSettings->GetDefaultNetclass();
517 }
518
519 return nullNetclass;
520}
521
522
524{
525 auto it = m_connected_items.find( aSheet );
526
527 if( it != m_connected_items.end() )
528 it->second.clear();
529}
530
531
533{
534 return m_connected_items[ aSheet ];
535}
536
537
539{
540 SCH_ITEM_VEC& vec = m_connected_items[ aSheet ];
541
542 // The vector elements are small, so reserve 1k at a time to prevent re-allocations
543 if( vec.size() == vec.capacity() )
544 vec.reserve( vec.size() + 4096 );
545
546 // Add item to the correct place in the sorted vector if it is not already there
547 auto it = std::lower_bound( vec.begin(), vec.end(), aItem );
548
549 if( it == vec.end() || *it != aItem )
550 vec.insert( it, aItem );
551}
552
553
555 CONNECTION_GRAPH* aGraph )
556{
557 SCH_CONNECTION* connection = Connection( &aSheet );
558
559 // N.B. Do not clear the dirty connectivity flag here because we may need
560 // to create a connection for a different sheet, and we don't want to
561 // skip the connection creation because the flag is cleared.
562 if( connection )
563 {
564 connection->Reset();
565 }
566 else
567 {
568 connection = new SCH_CONNECTION( this );
569 m_connection_map.insert( std::make_pair( aSheet, connection ) );
570 }
571
572 connection->SetGraph( aGraph );
573 connection->SetSheet( aSheet );
574 return connection;
575}
576
577
579 CONNECTION_GRAPH* aGraph )
580{
581 if( !IsConnectable() )
582 return nullptr;
583
584 SCH_CONNECTION* connection = Connection( &aSheet );
585
586 if( connection )
587 return connection;
588 else
589 return InitializeConnection( aSheet, aGraph );
590}
591
592
593const wxString& SCH_ITEM::GetCachedDriverName() const
594{
595 static wxString s_empty;
596 return s_empty;
597}
598
599
601{
603}
604
605
607{
608 if( aImage == nullptr )
609 return;
610
611 EDA_ITEM* parent = GetParent();
612
613 SwapFlags( aImage );
614 std::swap( m_layer, aImage->m_layer );
615 std::swap( m_unit, aImage->m_unit );
616 std::swap( m_bodyStyle, aImage->m_bodyStyle );
617 std::swap( m_private, aImage->m_private );
618 std::swap( m_fieldsAutoplaced, aImage->m_fieldsAutoplaced );
619 std::swap( m_group, aImage->m_group );
620 swapData( aImage );
621
622 SetParent( parent );
623}
624
625
627{
628 EDA_ITEM_FLAGS editFlags = GetEditFlags();
629 EDA_ITEM_FLAGS tempFlags = GetTempFlags();
630 EDA_ITEM_FLAGS aItem_editFlags = aItem->GetEditFlags();
631 EDA_ITEM_FLAGS aItem_tempFlags = aItem->GetTempFlags();
632
633 std::swap( m_flags, aItem->m_flags );
634
636 SetFlags( editFlags );
638 SetFlags( tempFlags );
639
640 aItem->ClearEditFlags();
641 aItem->SetFlags( aItem_editFlags );
642 aItem->ClearTempFlags();
643 aItem->SetFlags( aItem_tempFlags );
644}
645
646
648{
649 auto clearTextCaches =
650 []( SCH_ITEM* aItem )
651 {
652 EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem );
653
654 if( text )
655 {
656 text->ClearBoundingBoxCache();
657 text->ClearRenderCache();
658 }
659 };
660
661 clearTextCaches( this );
662
663 RunOnChildren( clearTextCaches, RECURSE_MODE::NO_RECURSE );
664}
665
666
667bool SCH_ITEM::operator==( const SCH_ITEM& aOther ) const
668{
669 if( Type() != aOther.Type() )
670 return false;
671
672 return compare( aOther, SCH_ITEM::COMPARE_FLAGS::EQUALITY ) == 0;
673}
674
675
676bool SCH_ITEM::operator<( const SCH_ITEM& aOther ) const
677{
678 if( Type() != aOther.Type() )
679 return Type() < aOther.Type();
680
681 return ( compare( aOther ) < 0 );
682}
683
684
685bool SCH_ITEM::cmp_items::operator()( const SCH_ITEM* aFirst, const SCH_ITEM* aSecond ) const
686{
687 return aFirst->compare( *aSecond, COMPARE_FLAGS::EQUALITY ) < 0;
688}
689
690
691int SCH_ITEM::compare( const SCH_ITEM& aOther, int aCompareFlags ) const
692{
693 if( Type() != aOther.Type() )
694 return Type() - aOther.Type();
695
696 if( !( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::UNIT ) && m_unit != aOther.m_unit )
697 return m_unit - aOther.m_unit;
698
699 if( !( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::UNIT ) && m_bodyStyle != aOther.m_bodyStyle )
700 return m_bodyStyle - aOther.m_bodyStyle;
701
702 if( IsPrivate() != aOther.IsPrivate() )
703 return IsPrivate() ? 1 : -1;
704
705 if( !( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::SKIP_TST_POS ) )
706 {
707 if( GetPosition().x != aOther.GetPosition().x )
708 return GetPosition().x - aOther.GetPosition().x;
709
710 if( GetPosition().y != aOther.GetPosition().y )
711 return GetPosition().y - aOther.GetPosition().y;
712 }
713
714 if( ( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::EQUALITY )
715 || ( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::ERC ) )
716 {
717 return 0;
718 }
719
720 if( m_Uuid < aOther.m_Uuid )
721 return -1;
722
723 if( m_Uuid > aOther.m_Uuid )
724 return 1;
725
726 return 0;
727}
728
729
731{
732 if( SCHEMATIC* schematic = Schematic() )
733 return schematic->Settings().m_MaxError;
734 else
735 return schIUScale.mmToIU( ARC_LOW_DEF_MM );
736}
737
738
739const wxString& SCH_ITEM::GetDefaultFont( const RENDER_SETTINGS* aSettings ) const
740{
741 static wxString defaultName = KICAD_FONT_NAME;
742
743 if( aSettings )
744 return aSettings->GetDefaultFont();
745 else if( EESCHEMA_SETTINGS* cfg = GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" ) )
746 return cfg->m_Appearance.default_font;
747 else
748 return defaultName;
749}
750
751
753{
754 if( SCHEMATIC* schematic = Schematic() )
755 return schematic->Settings().m_FontMetrics;
756
758}
759
760
762{
763 // For historical reasons, a stored value of 0 means "default width" and negative
764 // numbers meant "don't stroke".
765
766 if( GetPenWidth() < 0 )
767 {
768 return 0;
769 }
770 else if( GetPenWidth() == 0 )
771 {
772 if( GetParent() && GetParent()->Type() == LIB_SYMBOL_T )
773 return std::max( aSettings->m_SymbolLineWidth, aSettings->GetMinPenWidth() );
774 else
775 return std::max( aSettings->GetDefaultPenWidth(), aSettings->GetMinPenWidth() );
776 }
777 else
778 {
779 return std::max( GetPenWidth(), aSettings->GetMinPenWidth() );
780 }
781}
782
783
784bool SCH_ITEM::RenderAsBitmap( double aWorldScale ) const
785{
786 if( HasHypertext() )
787 return false;
788
789 if( const EDA_TEXT* text = dynamic_cast<const EDA_TEXT*>( this ) )
790 return text->GetTextHeight() * aWorldScale < BITMAP_FONT_SIZE_THRESHOLD;
791
792 return false;
793}
794
795
796void SCH_ITEM::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
797{
798 if( SYMBOL* symbol = GetParentSymbol() )
799 {
800 if( symbol->IsMultiUnit() )
801 aList.emplace_back( _( "Unit" ), GetUnitDisplayName( GetUnit(), false ) );
802
803 if( symbol->IsMultiBodyStyle() )
804 aList.emplace_back( _( "Body Style" ), GetBodyStyleDescription( GetBodyStyle(), true ) );
805
806 if( dynamic_cast<LIB_SYMBOL*>( symbol ) && IsPrivate() )
807 aList.emplace_back( _( "Private" ), wxEmptyString );
808 }
809}
810
811
812const std::vector<wxString>* SCH_ITEM::GetEmbeddedFonts()
813{
814 if( SCHEMATIC* schematic = Schematic() )
815 return schematic->GetEmbeddedFiles()->GetFontFiles();
816
817 if( SYMBOL* symbol = GetParentSymbol() )
818 {
819 if( EMBEDDED_FILES* symbolEmbeddedFiles = symbol->GetEmbeddedFiles() )
820 return symbolEmbeddedFiles->UpdateFontFiles();
821 }
822
823 return nullptr;
824}
825
826
827static struct SCH_ITEM_DESC
828{
830 {
834
835#ifdef NOTYET
836 // Not yet functional in UI
837 propMgr.AddProperty( new PROPERTY<SCH_ITEM, bool>( _HKI( "Locked" ),
839#endif
840
841 auto multiUnit =
842 [=]( INSPECTABLE* aItem ) -> bool
843 {
844 if( SCH_ITEM* schItem = dynamic_cast<SCH_ITEM*>( aItem ) )
845 {
846 if( const SYMBOL* symbol = schItem->GetParentSymbol() )
847 return symbol->IsMultiUnit();
848 }
849
850 return false;
851 };
852
853 auto multiBodyStyle =
854 [=]( INSPECTABLE* aItem ) -> bool
855 {
856 if( SCH_ITEM* schItem = dynamic_cast<SCH_ITEM*>( aItem ) )
857 {
858 if( const SYMBOL* symbol = schItem->GetParentSymbol() )
859 return symbol->IsMultiBodyStyle();
860 }
861
862 return false;
863 };
864
865 propMgr.AddProperty( new PROPERTY<SCH_ITEM, wxString>( _HKI( "Unit" ),
867 .SetAvailableFunc( multiUnit )
869 .SetChoicesFunc( []( INSPECTABLE* aItem )
870 {
871 wxPGChoices choices;
872 choices.Add( _HKI( "All units" ), 0 );
873
874 if( SCH_ITEM* item = dynamic_cast<SCH_ITEM*>( aItem ) )
875 {
876 if( SYMBOL* symbol = item->GetParentSymbol() )
877 {
878 for( int ii = 1; ii <= symbol->GetUnitCount(); ii++ )
879 choices.Add( symbol->GetUnitDisplayName( ii, false ), ii );
880 }
881 }
882
883 return choices;
884 } );
885
886
887 propMgr.AddProperty( new PROPERTY<SCH_ITEM, wxString>( _HKI( "Body Style" ),
889 .SetAvailableFunc( multiBodyStyle )
891 .SetChoicesFunc( []( INSPECTABLE* aItem )
892 {
893 wxPGChoices choices;
894 choices.Add( _HKI( "All body styles" ) );
895
896 if( SCH_ITEM* item = dynamic_cast<SCH_ITEM*>( aItem ) )
897 {
898 if( SYMBOL* symbol = item->GetParentSymbol() )
899 {
900 for( int ii : { BODY_STYLE::BASE, BODY_STYLE::DEMORGAN } )
901 choices.Add( symbol->GetBodyStyleDescription( ii, false ) );
902 }
903 }
904
905 return choices;
906 } );
907
908 propMgr.AddProperty( new PROPERTY<SCH_ITEM, bool>( _HKI( "Private" ),
911 }
913
915
916
917static bool lessYX( const DANGLING_END_ITEM& a, const DANGLING_END_ITEM& b )
918{
919 const auto aPos = a.GetPosition();
920 const auto bPos = b.GetPosition();
921 return aPos.y < bPos.y ? true : ( aPos.y > bPos.y ? false : aPos.x < bPos.x );
922};
923
924
925static bool lessType( const DANGLING_END_ITEM& a, const DANGLING_END_ITEM& b )
926{
927 return a.GetType() < b.GetType();
928};
929
930
931std::vector<DANGLING_END_ITEM>::iterator
932DANGLING_END_ITEM_HELPER::get_lower_pos( std::vector<DANGLING_END_ITEM>& aItemListByPos,
933 const VECTOR2I& aPos )
934{
935 DANGLING_END_ITEM needle = DANGLING_END_ITEM( PIN_END, nullptr, aPos );
936 auto start = aItemListByPos.begin();
937 auto end = aItemListByPos.end();
938 return std::lower_bound( start, end, needle, lessYX );
939}
940
941
942std::vector<DANGLING_END_ITEM>::iterator
943DANGLING_END_ITEM_HELPER::get_lower_type( std::vector<DANGLING_END_ITEM>& aItemListByType,
944 const DANGLING_END_T& aType )
945{
946 DANGLING_END_ITEM needle = DANGLING_END_ITEM( aType, nullptr, VECTOR2I{} );
947 auto start = aItemListByType.begin();
948 auto end = aItemListByType.end();
949 return std::lower_bound( start, end, needle, lessType );
950}
951
952
954 std::vector<DANGLING_END_ITEM>& aItemListByType,
955 std::vector<DANGLING_END_ITEM>& aItemListByPos )
956{
957 // WIRE_END pairs must be kept together. Hence stable sort.
958 std::stable_sort( aItemListByType.begin(), aItemListByType.end(), lessType );
959
960 // Sort by y first, pins are more likely to share x than y.
961 std::sort( aItemListByPos.begin(), aItemListByPos.end(), lessYX );
962}
constexpr EDA_IU_SCALE schIUScale
Definition base_units.h:114
constexpr double ARC_LOW_DEF_MM
Definition base_units.h:118
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
Definition commit.h:106
void RemoveItem(SCH_ITEM *aItem)
static std::vector< DANGLING_END_ITEM >::iterator get_lower_type(std::vector< DANGLING_END_ITEM > &aItemListByType, const DANGLING_END_T &aType)
Definition sch_item.cpp:943
static std::vector< DANGLING_END_ITEM >::iterator get_lower_pos(std::vector< DANGLING_END_ITEM > &aItemListByPos, const VECTOR2I &aPos)
Definition sch_item.cpp:932
static void sort_dangling_end_items(std::vector< DANGLING_END_ITEM > &aItemListByType, std::vector< DANGLING_END_ITEM > &aItemListByPos)
Both contain the same information.
Definition sch_item.cpp:953
Helper class used to store the state of schematic items that can be connected to other schematic item...
Definition sch_item.h:96
DANGLING_END_T GetType() const
Definition sch_item.h:132
The base class for create windows for drawing purpose.
A set of EDA_ITEMs (i.e., without duplicates).
Definition eda_group.h:46
A base class for most all the KiCad significant classes used in schematics and boards.
Definition eda_item.h:98
virtual VECTOR2I GetPosition() const
Definition eda_item.h:278
virtual void ClearEditFlags()
Definition eda_item.h:162
virtual void SetLocked(bool aLocked)
Definition eda_item.h:121
EDA_ITEM_FLAGS GetEditFlags() const
Definition eda_item.h:154
void SetFlags(EDA_ITEM_FLAGS aMask)
Definition eda_item.h:148
const KIID m_Uuid
Definition eda_item.h:522
virtual EDA_GROUP * GetParentGroup() const
Definition eda_item.h:116
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
Definition eda_item.h:150
EDA_ITEM_FLAGS m_flags
Definition eda_item.h:533
EDA_ITEM_FLAGS GetTempFlags() const
Definition eda_item.h:167
EDA_GROUP * m_group
The group this item belongs to, if any. No ownership implied.
Definition eda_item.h:535
virtual void SetParent(EDA_ITEM *aParent)
Definition eda_item.h:113
EDA_ITEM * GetParent() const
Definition eda_item.h:112
virtual EDA_ITEM * Clone() const
Create a duplicate of this item with linked list members set to NULL.
Definition eda_item.cpp:118
virtual bool IsLocked() const
Definition eda_item.h:120
EDA_ITEM * m_parent
Owner.
Definition eda_item.h:534
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
Definition eda_item.cpp:39
virtual void ClearTempFlags()
Definition eda_item.h:175
EDA_ITEM * findParent(KICAD_T aType) const
Definition eda_item.cpp:75
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition eda_text.h:80
Class that other classes need to inherit from, in order to be inspectable.
Definition inspectable.h:37
static const METRICS & Default()
Definition font.cpp:52
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
const wxString & GetDefaultFont() const
Definition kiid.h:49
bool ResolveTextVar(wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the symbol.
std::shared_ptr< NET_SETTINGS > m_NetSettings
Net settings for this project (owned here)
virtual bool TextVarResolver(wxString *aToken) const
Definition project.cpp:84
virtual PROJECT_FILE & GetProjectFile() const
Definition project.h:199
PROPERTY_BASE & SetChoicesFunc(std::function< wxPGChoices(INSPECTABLE *)> aFunc)
Definition property.h:276
PROPERTY_BASE & SetAvailableFunc(std::function< bool(INSPECTABLE *)> aFunc)
Set a callback function to determine whether an object provides this property.
Definition property.h:262
PROPERTY_BASE & SetIsHiddenFromDesignEditors(bool aIsHidden=true)
Definition property.h:340
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.
Holds all the data relating to one schematic.
Definition schematic.h:88
PROJECT & Project() const
Return a reference to the project this schematic is part of.
Definition schematic.h:103
CONNECTION_GRAPH * ConnectionGraph() const
Definition schematic.h:199
bool ResolveTextVar(const SCH_SHEET_PATH *aSheetPath, wxString *token, int aDepth) const
static bool m_IsSchematicExists
True if a SCHEMATIC exists, false if not.
Definition schematic.h:527
SCH_SHEET_PATH & CurrentSheet() const
Definition schematic.h:187
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
void Reset()
Clears connectivity information.
wxString Name(bool aIgnoreSheet=false) const
void SetGraph(CONNECTION_GRAPH *aGraph)
void SetSheet(const SCH_SHEET_PATH &aSheet)
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:796
friend class CONNECTION_GRAPH
Definition sch_item.h:754
SCH_ITEM * Duplicate(bool addToParentGroup, SCH_COMMIT *aCommit=nullptr, bool doClone=false) const
Routine to create a new copy of given item.
Definition sch_item.cpp:140
virtual bool IsConnectable() const
Definition sch_item.h:526
int m_unit
Definition sch_item.h:773
bool ResolveExcludedFromPosFiles(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const
Definition sch_item.cpp:325
virtual int GetPenWidth() const
Definition sch_item.h:353
const SCH_ITEM_VEC & ConnectedItems(const SCH_SHEET_PATH &aPath)
Retrieve the set of items connected to this item on the given sheet.
Definition sch_item.cpp:532
SCH_ITEM & operator=(const SCH_ITEM &aPin)
Definition sch_item.cpp:78
void ClearConnectedItems(const SCH_SHEET_PATH &aPath)
Clear all connections to this item.
Definition sch_item.cpp:523
virtual bool doIsConnected(const VECTOR2I &aPosition) const
Provide the object specific test to see if it is connected to aPosition.
Definition sch_item.h:769
virtual void RunOnChildren(const std::function< void(SCH_ITEM *)> &aFunction, RECURSE_MODE aMode)
Definition sch_item.h:630
int m_bodyStyle
Definition sch_item.h:774
const std::vector< wxString > * GetEmbeddedFonts() override
Definition sch_item.cpp:812
virtual ~SCH_ITEM()
Definition sch_item.cpp:91
const SYMBOL * GetParentSymbol() const
Definition sch_item.cpp:253
virtual wxString GetBodyStyleDescription(int aBodyStyle, bool aLabel) const
Definition sch_item.cpp:182
void SetPrivate(bool aPrivate)
Definition sch_item.h:252
virtual void swapData(SCH_ITEM *aItem)
Swap the internal data structures aItem with the schematic item.
Definition sch_item.cpp:600
virtual const wxString & GetCachedDriverName() const
Definition sch_item.cpp:593
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
Definition sch_item.cpp:247
int GetBodyStyle() const
Definition sch_item.h:247
std::vector< int > ViewGetLayers() const override
Return the layers the item is drawn on (which may be more than its "home" layer)
Definition sch_item.cpp:450
SCH_CONNECTION * InitializeConnection(const SCH_SHEET_PATH &aPath, CONNECTION_GRAPH *aGraph)
Create a new connection object associated with this object.
Definition sch_item.cpp:554
virtual wxString GetUnitDisplayName(int aUnit, bool aLabel) const
Definition sch_item.cpp:171
void AddConnectionTo(const SCH_SHEET_PATH &aPath, SCH_ITEM *aItem)
Add a connection link between this item and another.
Definition sch_item.cpp:538
friend class LIB_SYMBOL
Definition sch_item.h:792
@ SKIP_TST_POS
Definition sch_item.h:704
virtual bool HasHypertext() const
Indicates that the item has at least one hypertext action.
Definition sch_item.h:327
virtual bool GetExcludedFromPosFiles(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const
Definition sch_item.h:278
int GetUnit() const
Definition sch_item.h:238
std::shared_ptr< NETCLASS > GetEffectiveNetClass(const SCH_SHEET_PATH *aSheet=nullptr) const
Definition sch_item.cpp:502
virtual bool operator==(const SCH_ITEM &aOther) const
Definition sch_item.cpp:667
bool m_connectivity_dirty
Definition sch_item.h:786
bool IsPrivate() const
Definition sch_item.h:253
virtual void ClearCaches()
Definition sch_item.cpp:647
int GetMaxError() const
Definition sch_item.cpp:730
virtual bool GetExcludedFromBoard(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const
Definition sch_item.h:271
virtual void SetBodyStyleProp(const wxString &aBodyStyle)
Definition sch_item.cpp:219
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:691
virtual wxString GetBodyStyleProp() const
Definition sch_item.cpp:241
bool RenderAsBitmap(double aWorldScale) const override
Definition sch_item.cpp:784
const wxString & GetDefaultFont(const RENDER_SETTINGS *aSettings) const
Definition sch_item.cpp:739
void SetConnectionGraph(CONNECTION_GRAPH *aGraph)
Update the connection graph for all connections in this item.
Definition sch_item.cpp:490
AUTOPLACE_ALGO m_fieldsAutoplaced
Definition sch_item.h:776
std::unordered_set< SCH_RULE_AREA * > m_rule_areas_cache
Store pointers to rule areas which this item is contained within.
Definition sch_item.h:789
void SwapFlags(SCH_ITEM *aItem)
Swap the non-temp and non-edit flags.
Definition sch_item.cpp:626
bool IsConnected(const VECTOR2I &aPoint) const
Test the item to see if it is connected to aPoint.
Definition sch_item.cpp:457
virtual void SetUnitString(const wxString &aUnit)
Definition sch_item.cpp:192
SCH_ITEM(EDA_ITEM *aParent, KICAD_T aType, int aUnit=0, int aBodyStyle=0)
Definition sch_item.cpp:54
std::unordered_map< SCH_SHEET_PATH, SCH_CONNECTION * > m_connection_map
Store connectivity information, per sheet.
Definition sch_item.h:784
virtual bool operator<(const SCH_ITEM &aItem) const
Definition sch_item.cpp:676
bool ResolveExcludedFromBOM(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const
Definition sch_item.cpp:293
bool m_private
Definition sch_item.h:775
SCH_CONNECTION * GetOrInitConnection(const SCH_SHEET_PATH &aPath, CONNECTION_GRAPH *aGraph)
Definition sch_item.cpp:578
SCH_CONNECTION * Connection(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve the connection associated with this object in the given sheet.
Definition sch_item.cpp:466
wxString ResolveText(const wxString &aText, const SCH_SHEET_PATH *aPath, int aDepth=0) const
Definition sch_item.cpp:356
wxString GetClass() const override
Return the class name.
Definition sch_item.h:177
bool ResolveExcludedFromBoard(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const
Definition sch_item.cpp:309
const KIFONT::METRICS & GetFontMetrics() const
Definition sch_item.cpp:752
std::map< SCH_SHEET_PATH, SCH_ITEM_VEC, SHEET_PATH_CMP > m_connected_items
Store pointers to other items that are connected to this one, per sheet.
Definition sch_item.h:781
bool ResolveDNP(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const
Definition sch_item.cpp:341
virtual wxString GetUnitString() const
Definition sch_item.cpp:214
int GetEffectivePenWidth(const SCH_RENDER_SETTINGS *aSettings) const
Definition sch_item.cpp:761
bool IsGroupableType() const
Definition sch_item.cpp:108
void SwapItemData(SCH_ITEM *aImage)
Swap data between aItem and aImage.
Definition sch_item.cpp:606
bool ResolveExcludedFromSim(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const
Definition sch_item.cpp:277
SCH_LAYER_ID m_layer
Definition sch_item.h:772
virtual bool GetExcludedFromSim(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const
Definition sch_item.h:257
virtual bool GetDNP(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const
Definition sch_item.h:285
virtual bool GetExcludedFromBOM(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const
Definition sch_item.h:264
virtual bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth) const
Resolve any references to system tokens supported by the label.
int m_SymbolLineWidth
Override line widths for symbol drawing objects set to default line width.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition sch_sheet.h:48
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the sheet.
Schematic symbol object.
Definition sch_symbol.h:76
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the symbol.
A base class for LIB_SYMBOL and SCH_SYMBOL.
Definition symbol.h:63
wxString ResolveTextVars(const wxString &aSource, const std::function< bool(wxString *)> *aResolver, int &aDepth)
Multi-pass text variable expansion and math expression evaluation.
Definition common.cpp:295
#define _(s)
@ NO_RECURSE
Definition eda_item.h:52
#define BRIGHTENED
item is drawn with a bright contour
#define SELECTED
Item was manually selected by the user.
#define STRUCT_DELETED
flag indication structures to be erased
#define SKIP_STRUCT
flag indicating that the structure should be ignored
std::uint32_t EDA_ITEM_FLAGS
#define KICAD_FONT_NAME
SCH_LAYER_ID
Eeschema drawing layers.
Definition layer_ids.h:449
@ LAYER_DEVICE
Definition layer_ids.h:466
@ LAYER_WIRE
Definition layer_ids.h:452
@ LAYER_DEVICE_BACKGROUND
Definition layer_ids.h:484
@ LAYER_SELECTION_SHADOWS
Definition layer_ids.h:495
#define UNIMPLEMENTED_FOR(type)
Definition macros.h:96
#define _HKI(x)
Definition page_info.cpp:44
see class PGM_BASE
#define TYPE_HASH(x)
Definition property.h:74
#define IMPLEMENT_ENUM_TO_WXANY(type)
Definition property.h:821
#define REGISTER_TYPE(x)
static const std::vector< KICAD_T > labelTypes
Definition sch_field.cpp:44
Class to handle a set of SCH_ITEMs.
static bool lessYX(const DANGLING_END_ITEM &a, const DANGLING_END_ITEM &b)
Definition sch_item.cpp:917
#define BITMAP_FONT_SIZE_THRESHOLD
Definition sch_item.cpp:45
static bool lessType(const DANGLING_END_ITEM &a, const DANGLING_END_ITEM &b)
Definition sch_item.cpp:925
static struct SCH_ITEM_DESC _SCH_ITEM_DESC
@ AUTOPLACE_NONE
Definition sch_item.h:69
DANGLING_END_T
Definition sch_item.h:77
@ PIN_END
Definition sch_item.h:82
std::vector< SCH_ITEM * > SCH_ITEM_VEC
Definition sch_item.h:156
@ BASE
Definition sch_item.h:59
@ DEMORGAN
Definition sch_item.h:60
T * GetAppSettings(const char *aFilename)
bool operator()(const SCH_ITEM *aFirst, const SCH_ITEM *aSecond) const
Definition sch_item.cpp:685
std::string path
VECTOR2I end
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition typeinfo.h:78
@ SCH_GROUP_T
Definition typeinfo.h:177
@ SCH_TABLE_T
Definition typeinfo.h:169
@ SCH_LINE_T
Definition typeinfo.h:167
@ LIB_SYMBOL_T
Definition typeinfo.h:152
@ SCH_NO_CONNECT_T
Definition typeinfo.h:164
@ SCH_SYMBOL_T
Definition typeinfo.h:176
@ SCH_FIELD_T
Definition typeinfo.h:154
@ SCH_DIRECTIVE_LABEL_T
Definition typeinfo.h:175
@ SCH_LABEL_T
Definition typeinfo.h:171
@ SCH_SHEET_T
Definition typeinfo.h:179
@ SCH_SHAPE_T
Definition typeinfo.h:153
@ SCH_RULE_AREA_T
Definition typeinfo.h:174
@ SCH_HIER_LABEL_T
Definition typeinfo.h:173
@ SCH_BUS_BUS_ENTRY_T
Definition typeinfo.h:166
@ SCH_LABEL_LOCATE_ANY_T
Definition typeinfo.h:195
@ SCHEMATIC_T
Definition typeinfo.h:208
@ SCH_SHEET_PIN_T
Definition typeinfo.h:178
@ SCH_TEXT_T
Definition typeinfo.h:155
@ SCH_BUS_WIRE_ENTRY_T
Definition typeinfo.h:165
@ SCH_BITMAP_T
Definition typeinfo.h:168
@ SCH_TEXTBOX_T
Definition typeinfo.h:156
@ SCH_GLOBAL_LABEL_T
Definition typeinfo.h:172
@ SCH_JUNCTION_T
Definition typeinfo.h:163
@ SCH_PIN_T
Definition typeinfo.h:157
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:695