Eeschema: move get multi-unit components from SCH_SHEET_PATH to SCH_SHEET.

This commit is contained in:
Wayne Stambaugh 2016-01-21 19:01:34 -05:00
parent 8e8e126dcd
commit ac30be332f
7 changed files with 82 additions and 111 deletions

View File

@ -34,6 +34,7 @@
#include <schframe.h> #include <schframe.h>
#include <class_library.h> #include <class_library.h>
#include <sch_reference_list.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <sch_sheet_path.h> #include <sch_sheet_path.h>
@ -93,11 +94,11 @@ void SCH_EDIT_FRAME::AnnotateComponents( bool aAnnotateSchematic,
{ {
if( aAnnotateSchematic ) if( aAnnotateSchematic )
{ {
sheets.GetMultiUnitComponents( Prj().SchLibs(), lockedComponents ); g_RootSheet->GetMultiUnitComponents( Prj().SchLibs(), lockedComponents );
} }
else else
{ {
m_CurrentSheet->GetMultiUnitComponents( Prj().SchLibs(), lockedComponents ); m_CurrentSheet->Last()->GetMultiUnitComponents( Prj().SchLibs(), lockedComponents );
} }
} }

View File

@ -736,6 +736,24 @@ SCH_REFERENCE::SCH_REFERENCE( SCH_COMPONENT* aComponent, LIB_PART* aLibComponent
} }
int SCH_REFERENCE::CompareLibName( const SCH_REFERENCE& item ) const
{
return Cmp_KEEPCASE( m_RootCmp->GetPartName(), item.m_RootCmp->GetPartName() );
}
bool SCH_REFERENCE::IsSameInstance( const SCH_REFERENCE& other ) const
{
return GetComp() == other.GetComp() && GetSheet()->GetPath() == other.GetSheet()->GetPath();
}
bool SCH_REFERENCE::IsUnitsLocked() const
{
return m_Entry->UnitsLocked();
}
void SCH_REFERENCE::Annotate() void SCH_REFERENCE::Annotate()
{ {
if( m_NumRef < 0 ) if( m_NumRef < 0 )

View File

@ -35,12 +35,13 @@
#include <macros.h> #include <macros.h>
#include <class_libentry.h> #include <class_libentry.h>
#include <sch_sheet.h>
#include <sch_component.h>
#include <sch_text.h> #include <sch_text.h>
#include <map> #include <map>
class SCH_SHEET;
class SCH_COMPONENT;
class SCH_REFERENCE_LIST; class SCH_REFERENCE_LIST;
@ -90,8 +91,7 @@ public:
m_SheetNum = 0; m_SheetNum = 0;
} }
SCH_REFERENCE( SCH_COMPONENT* aComponent, LIB_PART* aLibComponent, SCH_REFERENCE( SCH_COMPONENT* aComponent, LIB_PART* aLibComponent, SCH_SHEET* aSheet );
SCH_SHEET* aSheet );
SCH_COMPONENT* GetComp() const { return m_RootCmp; } SCH_COMPONENT* GetComp() const { return m_RootCmp; }
@ -152,25 +152,16 @@ public:
return m_Ref.compare( item.m_Ref ); return m_Ref.compare( item.m_Ref );
} }
int CompareLibName( const SCH_REFERENCE& item ) const int CompareLibName( const SCH_REFERENCE& item ) const;
{
return Cmp_KEEPCASE( m_RootCmp->GetPartName(), item.m_RootCmp->GetPartName() );
}
/** /**
* Function IsSameInstance * Function IsSameInstance
* returns whether this reference refers to the same component instance * returns whether this reference refers to the same component instance
* (component and sheet) as another. * (component and sheet) as another.
*/ */
bool IsSameInstance( const SCH_REFERENCE& other ) const bool IsSameInstance( const SCH_REFERENCE& other ) const;
{
return GetComp() == other.GetComp() && GetSheet()->GetPath() == other.GetSheet()->GetPath();
}
bool IsUnitsLocked() bool IsUnitsLocked() const;
{
return m_Entry->UnitsLocked();
}
}; };

View File

@ -42,7 +42,6 @@
#include <sch_sheet_path.h> #include <sch_sheet_path.h>
#include <sch_component.h> #include <sch_component.h>
#include <class_netlist_object.h> #include <class_netlist_object.h>
#include <sch_reference_list.h>
SCH_SHEET::SCH_SHEET( const wxPoint& pos ) : SCH_SHEET::SCH_SHEET( const wxPoint& pos ) :
@ -1424,6 +1423,46 @@ SCH_ITEM& SCH_SHEET::operator=( const SCH_ITEM& aItem )
} }
void SCH_SHEET::GetMultiUnitComponents( PART_LIBS* aLibs,
SCH_MULTI_UNIT_REFERENCE_MAP& aRefList,
bool aIncludePowerSymbols )
{
for( SCH_ITEM* item = m_screen->GetDrawItems(); item; item = item->Next() )
{
if( item->Type() == SCH_SHEET_T )
{
( (SCH_SHEET*) item )->GetMultiUnitComponents( aLibs, aRefList, aIncludePowerSymbols );
continue;
}
if( item->Type() != SCH_COMPONENT_T )
continue;
SCH_COMPONENT* component = (SCH_COMPONENT*) item;
// Skip pseudo components, which have a reference starting with #. This mainly
// affects power symbols.
if( !aIncludePowerSymbols && component->GetRef( this )[0] == wxT( '#' ) )
continue;
LIB_PART* part = aLibs->FindLibPart( component->GetPartName() );
if( part && part->GetUnitCount() > 1 )
{
SCH_REFERENCE reference = SCH_REFERENCE( component, part, this );
reference.SetSheetNumber( m_number );
wxString reference_str = reference.GetRef();
// Never lock unassigned references
if( reference_str[reference_str.Len() - 1] == '?' )
continue;
aRefList[reference_str].AddItem( reference );
}
}
}
bool SCH_SHEET::operator<( const SCH_SHEET& aRhs ) const bool SCH_SHEET::operator<( const SCH_SHEET& aRhs ) const
{ {
if( (*this - aRhs) < 0 ) if( (*this - aRhs) < 0 )

View File

@ -33,6 +33,7 @@
#include <boost/ptr_container/ptr_vector.hpp> #include <boost/ptr_container/ptr_vector.hpp>
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
#include <sch_text.h> #include <sch_text.h>
#include <sch_reference_list.h>
class PART_LIBS; class PART_LIBS;
@ -44,7 +45,6 @@ class SCH_SHEET_PATH;
class DANGLING_END_ITEM; class DANGLING_END_ITEM;
class SCH_EDIT_FRAME; class SCH_EDIT_FRAME;
class NETLIST_OBJECT_LIST; class NETLIST_OBJECT_LIST;
class SCH_REFERENCE_LIST;
#define MIN_SHEET_WIDTH 500 #define MIN_SHEET_WIDTH 500
@ -700,6 +700,19 @@ public:
void GetComponents( PART_LIBS* aLibs, SCH_REFERENCE_LIST& aReferences, void GetComponents( PART_LIBS* aLibs, SCH_REFERENCE_LIST& aReferences,
bool aIncludePowerSymbols = true, bool aIncludeSubSheets = true ); bool aIncludePowerSymbols = true, bool aIncludeSubSheets = true );
/**
* Function GetMultiUnitComponents
* adds a SCH_REFERENCE_LIST object to \a aRefList for each component with multiple units
* that has the same reference designator for this sheet and all of it's sub-sheets. The
* map key for each element will be the reference designator.
*
* @param aLibs a pointer to the #PART_LIB to use.
* @param aRefList Map of reference designators to reference lists
* @param aIncludePowerSymbols : false to only get normal components.
*/
void GetMultiUnitComponents( PART_LIBS* aLibs, SCH_MULTI_UNIT_REFERENCE_MAP& aRefList,
bool aIncludePowerSymbols = true );
#if defined(DEBUG) #if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const; // override void Show( int nestLevel, std::ostream& os ) const; // override
#endif #endif

View File

@ -227,47 +227,6 @@ wxString SCH_SHEET_PATH::PathHumanReadable() const
} }
void SCH_SHEET_PATH::GetMultiUnitComponents( PART_LIBS* aLibs,
SCH_MULTI_UNIT_REFERENCE_MAP& aRefList,
bool aIncludePowerSymbols )
{
// Find sheet path number
int sheetnumber = 1; // 1 = root
SCH_SHEET_LIST sheetList;
for( SCH_SHEET_PATH* path = sheetList.GetFirst(); path; path = sheetList.GetNext(), sheetnumber++ )
{
if( Cmp( *path ) == 0 )
break;
}
for( SCH_ITEM* item = LastDrawList(); item; item = item->Next() )
{
if( item->Type() != SCH_COMPONENT_T ) continue;
SCH_COMPONENT* component = (SCH_COMPONENT*) item;
// Skip pseudo components, which have a reference starting with #. This mainly
// affects power symbols.
if( !aIncludePowerSymbols && component->GetRef( Last() )[0] == wxT( '#' ) )
continue;
LIB_PART* part = aLibs->FindLibPart( component->GetPartName() );
if( part && part->GetUnitCount() > 1 )
{
SCH_REFERENCE reference = SCH_REFERENCE( component, part, Last() );
reference.SetSheetNumber( sheetnumber );
wxString reference_str = reference.GetRef();
// Never lock unassigned references
if( reference_str[reference_str.Len() - 1] == '?' ) continue;
aRefList[reference_str].AddItem( reference );
}
}
}
SCH_ITEM* SCH_SHEET_PATH::FindNextItem( KICAD_T aType, SCH_ITEM* aLastItem, bool aWrap ) const SCH_ITEM* SCH_SHEET_PATH::FindNextItem( KICAD_T aType, SCH_ITEM* aLastItem, bool aWrap ) const
{ {
bool hasWrapped = false; bool hasWrapped = false;
@ -595,29 +554,6 @@ void SCH_SHEET_LIST::BuildSheetList( SCH_SHEET* aSheet )
} }
void SCH_SHEET_LIST::GetMultiUnitComponents( PART_LIBS* aLibs,
SCH_MULTI_UNIT_REFERENCE_MAP& aRefList,
bool aIncludePowerSymbols )
{
for( SCH_SHEET_PATH* path = GetFirst(); path; path = GetNext() )
{
SCH_MULTI_UNIT_REFERENCE_MAP tempMap;
path->GetMultiUnitComponents( aLibs, tempMap );
BOOST_FOREACH( SCH_MULTI_UNIT_REFERENCE_MAP::value_type& pair, tempMap )
{
// Merge this list into the main one
unsigned n_refs = pair.second.GetCount();
for( unsigned thisRef = 0; thisRef < n_refs; ++thisRef )
{
aRefList[pair.first].AddItem( pair.second[thisRef] );
}
}
}
}
SCH_ITEM* SCH_SHEET_LIST::FindNextItem( KICAD_T aType, SCH_SHEET_PATH** aSheetFoundIn, SCH_ITEM* SCH_SHEET_LIST::FindNextItem( KICAD_T aType, SCH_SHEET_PATH** aSheetFoundIn,
SCH_ITEM* aLastItem, bool aWrap ) SCH_ITEM* aLastItem, bool aWrap )
{ {

View File

@ -33,7 +33,6 @@
#define CLASS_DRAWSHEET_PATH_H #define CLASS_DRAWSHEET_PATH_H
#include <base_struct.h> #include <base_struct.h>
#include <sch_reference_list.h>
/** Info about complex hierarchies handling: /** Info about complex hierarchies handling:
@ -81,10 +80,8 @@
class wxFindReplaceData; class wxFindReplaceData;
class SCH_SCREEN; class SCH_SCREEN;
class SCH_MARKER;
class SCH_SHEET; class SCH_SHEET;
class SCH_ITEM; class SCH_ITEM;
class PART_LIBS;
#define SHEET_NOT_FOUND -1 #define SHEET_NOT_FOUND -1
@ -211,18 +208,6 @@ public:
*/ */
bool BuildSheetPathInfoFromSheetPathValue( const wxString& aPath, bool aFound = false ); bool BuildSheetPathInfoFromSheetPathValue( const wxString& aPath, bool aFound = false );
/**
* Function GetMultiUnitComponents
* adds a SCH_REFERENCE_LIST object to \a aRefList for each same-reference set of
* multi-unit parts in the sheet. The map key for each element will be the
* reference designator.
* @param aLibs the library list to use
* @param aRefList Map of reference designators to reference lists
* @param aIncludePowerSymbols : false to only get normal components.
*/
void GetMultiUnitComponents( PART_LIBS* aLibs, SCH_MULTI_UNIT_REFERENCE_MAP& aRefList,
bool aIncludePowerSymbols = true );
/** /**
* Function SetFootprintField * Function SetFootprintField
* searches last sheet in the path for a component with \a aReference and set the footprint * searches last sheet in the path for a component with \a aReference and set the footprint
@ -400,18 +385,6 @@ public:
*/ */
SCH_SHEET_PATH* GetSheetByPath( const wxString aPath, bool aHumanReadable = true ); SCH_SHEET_PATH* GetSheetByPath( const wxString aPath, bool aHumanReadable = true );
/**
* Function GetMultiUnitComponents
* adds a SCH_REFERENCE_LIST object to \a aRefList for each same-reference set of
* multi-unit parts in the list of sheets. The map key for each element will be the
* reference designator.
* @param aLibs the library list to use
* @param aRefList Map of reference designators to reference lists
* @param aIncludePowerSymbols Set to false to only get normal components.
*/
void GetMultiUnitComponents( PART_LIBS* aLibs, SCH_MULTI_UNIT_REFERENCE_MAP& aRefList,
bool aIncludePowerSymbols = true );
/** /**
* Function FindNextItem * Function FindNextItem
* searches the entire schematic for the next schematic object. * searches the entire schematic for the next schematic object.