Sync with main branch r6563
This commit is contained in:
commit
25a5db9092
File diff suppressed because it is too large
Load Diff
|
@ -182,20 +182,27 @@ void EDA_DRAW_PANEL_GAL::Refresh( bool aEraseBackground, const wxRect* aRect )
|
||||||
if( m_pendingRefresh )
|
if( m_pendingRefresh )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
m_pendingRefresh = true;
|
||||||
|
|
||||||
|
#ifdef __WXMAC__
|
||||||
|
// Timers on OS X may have a high latency (seen up to 500ms and more) which
|
||||||
|
// makes repaints jerky. No negative impact seen without throttling, so just
|
||||||
|
// do an unconditional refresh for OS X.
|
||||||
|
ForceRefresh();
|
||||||
|
#else
|
||||||
wxLongLong t = wxGetLocalTimeMillis();
|
wxLongLong t = wxGetLocalTimeMillis();
|
||||||
wxLongLong delta = t - m_lastRefresh;
|
wxLongLong delta = t - m_lastRefresh;
|
||||||
|
|
||||||
if( delta >= MinRefreshPeriod )
|
if( delta >= MinRefreshPeriod )
|
||||||
{
|
{
|
||||||
ForceRefresh();
|
ForceRefresh();
|
||||||
m_pendingRefresh = true;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// One shot timer
|
// One shot timer
|
||||||
m_refreshTimer.Start( ( MinRefreshPeriod - delta ).ToLong(), true );
|
m_refreshTimer.Start( ( MinRefreshPeriod - delta ).ToLong(), true );
|
||||||
m_pendingRefresh = true;
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
/*
|
/*
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2004-2015 KiCad Developers, see change_log.txt for contributors.
|
* Copyright (C) 2004-2013 KiCad Developers, see change_log.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
@ -33,25 +33,25 @@
|
||||||
#include <confirm.h>
|
#include <confirm.h>
|
||||||
#include <schframe.h>
|
#include <schframe.h>
|
||||||
|
|
||||||
#include <class_library.h>
|
|
||||||
#include <sch_reference_list.h>
|
#include <sch_reference_list.h>
|
||||||
#include <sch_sheet.h>
|
#include <class_library.h>
|
||||||
#include <sch_sheet_path.h>
|
|
||||||
|
|
||||||
|
|
||||||
void SCH_EDIT_FRAME::DeleteAnnotation( bool aCurrentSheetOnly )
|
void SCH_EDIT_FRAME::DeleteAnnotation( bool aCurrentSheetOnly )
|
||||||
{
|
{
|
||||||
if( aCurrentSheetOnly )
|
if( aCurrentSheetOnly )
|
||||||
{
|
{
|
||||||
m_CurrentSheet->Last()->ClearAnnotation();
|
SCH_SCREEN* screen = GetScreen();
|
||||||
|
wxCHECK_RET( screen != NULL, wxT( "Attempt to clear annotation of a NULL screen." ) );
|
||||||
|
screen->ClearAnnotation( m_CurrentSheet );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_CurrentSheet->Last()->GetRootSheet()->ClearAnnotation( true );
|
SCH_SCREENS ScreenList;
|
||||||
|
ScreenList.ClearAnnotation();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the references for the sheet that is currently being displayed.
|
// Update the references for the sheet that is currently being displayed.
|
||||||
m_CurrentSheet->Last()->UpdateAllScreenReferences();
|
m_CurrentSheet->UpdateAllScreenReferences();
|
||||||
GetCanvas()->Refresh();
|
GetCanvas()->Refresh();
|
||||||
OnModify();
|
OnModify();
|
||||||
}
|
}
|
||||||
|
@ -94,11 +94,11 @@ void SCH_EDIT_FRAME::AnnotateComponents( bool aAnnotateSchematic,
|
||||||
{
|
{
|
||||||
if( aAnnotateSchematic )
|
if( aAnnotateSchematic )
|
||||||
{
|
{
|
||||||
g_RootSheet->GetMultiUnitComponents( Prj().SchLibs(), lockedComponents );
|
sheets.GetMultiUnitComponents( Prj().SchLibs(), lockedComponents );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_CurrentSheet->Last()->GetMultiUnitComponents( Prj().SchLibs(), lockedComponents );
|
m_CurrentSheet->GetMultiUnitComponents( Prj().SchLibs(), lockedComponents );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,11 +112,11 @@ void SCH_EDIT_FRAME::AnnotateComponents( bool aAnnotateSchematic,
|
||||||
// Build component list
|
// Build component list
|
||||||
if( aAnnotateSchematic )
|
if( aAnnotateSchematic )
|
||||||
{
|
{
|
||||||
g_RootSheet->GetComponents( Prj().SchLibs(), references );
|
sheets.GetComponents( Prj().SchLibs(), references );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_CurrentSheet->Last()->GetComponents( Prj().SchLibs(), references, true, false );
|
m_CurrentSheet->GetComponents( Prj().SchLibs(), references );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Break full components reference in name (prefix) and number:
|
// Break full components reference in name (prefix) and number:
|
||||||
|
@ -177,7 +177,7 @@ void SCH_EDIT_FRAME::AnnotateComponents( bool aAnnotateSchematic,
|
||||||
OnModify();
|
OnModify();
|
||||||
|
|
||||||
// Update on screen references, that can be modified by previous calculations:
|
// Update on screen references, that can be modified by previous calculations:
|
||||||
m_CurrentSheet->Last()->UpdateAllScreenReferences();
|
m_CurrentSheet->UpdateAllScreenReferences();
|
||||||
SetSheetNumberAndCount();
|
SetSheetNumberAndCount();
|
||||||
|
|
||||||
m_canvas->Refresh( true );
|
m_canvas->Refresh( true );
|
||||||
|
@ -187,13 +187,14 @@ void SCH_EDIT_FRAME::AnnotateComponents( bool aAnnotateSchematic,
|
||||||
int SCH_EDIT_FRAME::CheckAnnotate( wxArrayString* aMessageList, bool aOneSheetOnly )
|
int SCH_EDIT_FRAME::CheckAnnotate( wxArrayString* aMessageList, bool aOneSheetOnly )
|
||||||
{
|
{
|
||||||
// build the screen list
|
// build the screen list
|
||||||
|
SCH_SHEET_LIST SheetList;
|
||||||
SCH_REFERENCE_LIST ComponentsList;
|
SCH_REFERENCE_LIST ComponentsList;
|
||||||
|
|
||||||
// Build the list of components
|
// Build the list of components
|
||||||
if( !aOneSheetOnly )
|
if( !aOneSheetOnly )
|
||||||
g_RootSheet->GetComponents( Prj().SchLibs(), ComponentsList );
|
SheetList.GetComponents( Prj().SchLibs(), ComponentsList );
|
||||||
else
|
else
|
||||||
m_CurrentSheet->Last()->GetComponents( Prj().SchLibs(), ComponentsList, true, false );
|
m_CurrentSheet->GetComponents( Prj().SchLibs(), ComponentsList );
|
||||||
|
|
||||||
return ComponentsList.CheckAnnotation( aMessageList );
|
return ComponentsList.CheckAnnotation( aMessageList );
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,10 +38,9 @@
|
||||||
#include <wildcards_and_files_ext.h>
|
#include <wildcards_and_files_ext.h>
|
||||||
|
|
||||||
#include <general.h>
|
#include <general.h>
|
||||||
#include <sch_sheet.h>
|
#include <sch_sheet_path.h>
|
||||||
#include <sch_component.h>
|
#include <sch_component.h>
|
||||||
#include <sch_reference_list.h>
|
#include <sch_reference_list.h>
|
||||||
#include <sch_sheet_path.h>
|
|
||||||
|
|
||||||
#include <dsnlexer.h>
|
#include <dsnlexer.h>
|
||||||
#include <ptree.h>
|
#include <ptree.h>
|
||||||
|
@ -54,9 +53,10 @@ void SCH_EDIT_FRAME::backAnnotateFootprints( const std::string& aChangedSetOfRef
|
||||||
{
|
{
|
||||||
// Build a flat list of components in schematic:
|
// Build a flat list of components in schematic:
|
||||||
SCH_REFERENCE_LIST refs;
|
SCH_REFERENCE_LIST refs;
|
||||||
|
SCH_SHEET_LIST sheets;
|
||||||
bool isChanged = false;
|
bool isChanged = false;
|
||||||
|
|
||||||
g_RootSheet->GetComponents( Prj().SchLibs(), refs, false );
|
sheets.GetComponents( Prj().SchLibs(), refs, false );
|
||||||
|
|
||||||
DSNLEXER lexer( aChangedSetOfReferences, FROM_UTF8( __func__ ) );
|
DSNLEXER lexer( aChangedSetOfReferences, FROM_UTF8( __func__ ) );
|
||||||
PTREE doc;
|
PTREE doc;
|
||||||
|
@ -135,8 +135,9 @@ bool SCH_EDIT_FRAME::ProcessCmpToFootprintLinkFile( const wxString& aFullFilenam
|
||||||
{
|
{
|
||||||
// Build a flat list of components in schematic:
|
// Build a flat list of components in schematic:
|
||||||
SCH_REFERENCE_LIST referencesList;
|
SCH_REFERENCE_LIST referencesList;
|
||||||
|
SCH_SHEET_LIST sheetList;
|
||||||
|
|
||||||
g_RootSheet->GetComponents( Prj().SchLibs(), referencesList, false );
|
sheetList.GetComponents( Prj().SchLibs(), referencesList, false );
|
||||||
|
|
||||||
FILE* cmpFile = wxFopen( aFullFilename, wxT( "rt" ) );
|
FILE* cmpFile = wxFopen( aFullFilename, wxT( "rt" ) );
|
||||||
|
|
||||||
|
|
|
@ -475,11 +475,10 @@ void SCH_EDIT_FRAME::PasteListOfItems( wxDC* DC )
|
||||||
if( srcFn.IsRelative() )
|
if( srcFn.IsRelative() )
|
||||||
srcFn.MakeAbsolute( Prj().GetProjectPath() );
|
srcFn.MakeAbsolute( Prj().GetProjectPath() );
|
||||||
|
|
||||||
std::vector< std::vector< const SCH_SHEET* > > sheetHierarchy;
|
SCH_SHEET_LIST sheetHierarchy( sheet );
|
||||||
sheet->GetSheetPaths( sheetHierarchy );
|
|
||||||
|
|
||||||
if( g_RootSheet->TestForRecursion( sheetHierarchy,
|
if( hierarchy.TestForRecursion( sheetHierarchy,
|
||||||
destFn.GetFullPath( wxPATH_UNIX ) ) )
|
destFn.GetFullPath( wxPATH_UNIX ) ) )
|
||||||
{
|
{
|
||||||
wxString msg;
|
wxString msg;
|
||||||
|
|
||||||
|
|
|
@ -357,7 +357,7 @@ wxString NETLIST_OBJECT::GetShortNetName() const
|
||||||
if( link ) // Should be always true
|
if( link ) // Should be always true
|
||||||
{
|
{
|
||||||
netName = wxT("Net-(");
|
netName = wxT("Net-(");
|
||||||
netName << link->GetRef( m_netNameCandidate->m_SheetPath.Last() );
|
netName << link->GetRef( &m_netNameCandidate->m_SheetPath );
|
||||||
netName << wxT("-Pad")
|
netName << wxT("-Pad")
|
||||||
<< LIB_PIN::PinStringNum( m_netNameCandidate->m_PinNum )
|
<< LIB_PIN::PinStringNum( m_netNameCandidate->m_PinNum )
|
||||||
<< wxT(")");
|
<< wxT(")");
|
||||||
|
|
|
@ -49,7 +49,6 @@ class SCH_SHEET_PIN;
|
||||||
class SCH_LINE;
|
class SCH_LINE;
|
||||||
class SCH_TEXT;
|
class SCH_TEXT;
|
||||||
class PLOTTER;
|
class PLOTTER;
|
||||||
class SCH_SHEET;
|
|
||||||
|
|
||||||
|
|
||||||
enum SCH_LINE_TEST_T
|
enum SCH_LINE_TEST_T
|
||||||
|
@ -426,11 +425,11 @@ public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function ClearAnnotation
|
* Function ClearAnnotation
|
||||||
* clears the annotation for the components in \a aSheet on the screen.
|
* clears the annotation for the components in \a aSheetPath on the screen.
|
||||||
* @param aSheet The sheet of the component annotation to clear. If NULL then
|
* @param aSheetPath The sheet path of the component annotation to clear. If NULL then
|
||||||
* the entire hierarchy is cleared for this screen.
|
* the entire hierarchy is cleared.
|
||||||
*/
|
*/
|
||||||
void ClearAnnotation( SCH_SHEET* aSheet );
|
void ClearAnnotation( SCH_SHEET_PATH* aSheetPath );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function GetHierarchicalItems
|
* Function GetHierarchicalItems
|
||||||
|
@ -501,13 +500,13 @@ public:
|
||||||
* searches screen for a component with \a aReference and set the footprint field to
|
* searches screen for a component with \a aReference and set the footprint field to
|
||||||
* \a aFootPrint if found.
|
* \a aFootPrint if found.
|
||||||
*
|
*
|
||||||
* @param aSheet The sheet used to look up the reference designator.
|
* @param aSheetPath The sheet path used to look up the reference designator.
|
||||||
* @param aReference The reference designator of the component.
|
* @param aReference The reference designator of the component.
|
||||||
* @param aFootPrint The value to set the footprint field.
|
* @param aFootPrint The value to set the footprint field.
|
||||||
* @param aSetVisible The value to set the field visibility flag.
|
* @param aSetVisible The value to set the field visibility flag.
|
||||||
* @return True if \a aReference was found otherwise false.
|
* @return True if \a aReference was found otherwise false.
|
||||||
*/
|
*/
|
||||||
bool SetComponentFootprint( SCH_SHEET* aSheet, const wxString& aReference,
|
bool SetComponentFootprint( SCH_SHEET_PATH* aSheetPath, const wxString& aReference,
|
||||||
const wxString& aFootPrint, bool aSetVisible );
|
const wxString& aFootPrint, bool aSetVisible );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -550,6 +549,12 @@ public:
|
||||||
SCH_SCREEN* GetNext();
|
SCH_SCREEN* GetNext();
|
||||||
SCH_SCREEN* GetScreen( unsigned int aIndex ) const;
|
SCH_SCREEN* GetScreen( unsigned int aIndex ) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function ClearAnnotation
|
||||||
|
* clears the annotation for all components in the hierarchy.
|
||||||
|
*/
|
||||||
|
void ClearAnnotation();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function SchematicCleanUp
|
* Function SchematicCleanUp
|
||||||
* merges and breaks wire segments in the entire schematic hierarchy.
|
* merges and breaks wire segments in the entire schematic hierarchy.
|
||||||
|
|
|
@ -7,8 +7,8 @@
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 1992-2011 jean-pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
|
* Copyright (C) 1992-2011 jean-pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
|
||||||
* Copyright (C) 1992-2015 Wayne Stambaugh <stambaughw@verizon.net>
|
* Copyright (C) 1992-2011 Wayne Stambaugh <stambaughw@verizon.net>
|
||||||
* Copyright (C) 1992-2015 KiCad Developers, see change_log.txt for contributors.
|
* Copyright (C) 1992-2011 KiCad Developers, see change_log.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
@ -36,9 +36,8 @@
|
||||||
#include <fctsys.h>
|
#include <fctsys.h>
|
||||||
#include <kicad_string.h>
|
#include <kicad_string.h>
|
||||||
#include <schframe.h>
|
#include <schframe.h>
|
||||||
#include <sch_component.h>
|
|
||||||
#include <sch_sheet.h>
|
|
||||||
#include <sch_reference_list.h>
|
#include <sch_reference_list.h>
|
||||||
|
#include <sch_component.h>
|
||||||
|
|
||||||
#include <boost/foreach.hpp>
|
#include <boost/foreach.hpp>
|
||||||
|
|
||||||
|
@ -70,7 +69,6 @@ bool SCH_REFERENCE_LIST::sortByXPosition( const SCH_REFERENCE& item1,
|
||||||
return ii < 0;
|
return ii < 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool SCH_REFERENCE_LIST::sortByYPosition( const SCH_REFERENCE& item1,
|
bool SCH_REFERENCE_LIST::sortByYPosition( const SCH_REFERENCE& item1,
|
||||||
const SCH_REFERENCE& item2 )
|
const SCH_REFERENCE& item2 )
|
||||||
{
|
{
|
||||||
|
@ -134,9 +132,7 @@ bool SCH_REFERENCE_LIST::sortByReferenceOnly( const SCH_REFERENCE& item1,
|
||||||
bool SCH_REFERENCE_LIST::sortByTimeStamp( const SCH_REFERENCE& item1,
|
bool SCH_REFERENCE_LIST::sortByTimeStamp( const SCH_REFERENCE& item1,
|
||||||
const SCH_REFERENCE& item2 )
|
const SCH_REFERENCE& item2 )
|
||||||
{
|
{
|
||||||
wxCHECK( item1.m_Sheet != NULL && item2.m_Sheet != NULL, false );
|
int ii = item1.m_SheetPath.Cmp( item2.m_SheetPath );
|
||||||
|
|
||||||
int ii = *item1.m_Sheet - *item2.m_Sheet;
|
|
||||||
|
|
||||||
if( ii == 0 )
|
if( ii == 0 )
|
||||||
ii = item1.m_TimeStamp - item2.m_TimeStamp;
|
ii = item1.m_TimeStamp - item2.m_TimeStamp;
|
||||||
|
@ -144,7 +140,6 @@ bool SCH_REFERENCE_LIST::sortByTimeStamp( const SCH_REFERENCE& item1,
|
||||||
return ii < 0;
|
return ii < 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int SCH_REFERENCE_LIST::FindUnit( size_t aIndex, int aUnit )
|
int SCH_REFERENCE_LIST::FindUnit( size_t aIndex, int aUnit )
|
||||||
{
|
{
|
||||||
int NumRef;
|
int NumRef;
|
||||||
|
@ -291,7 +286,7 @@ int SCH_REFERENCE_LIST::CreateFirstFreeRefId( std::vector<int>& aIdList, int aFi
|
||||||
|
|
||||||
|
|
||||||
void SCH_REFERENCE_LIST::Annotate( bool aUseSheetNum, int aSheetIntervalId,
|
void SCH_REFERENCE_LIST::Annotate( bool aUseSheetNum, int aSheetIntervalId,
|
||||||
SCH_MULTI_UNIT_REFERENCE_MAP& aLockedUnitMap )
|
SCH_MULTI_UNIT_REFERENCE_MAP aLockedUnitMap )
|
||||||
{
|
{
|
||||||
if ( componentFlatList.size() == 0 )
|
if ( componentFlatList.size() == 0 )
|
||||||
return;
|
return;
|
||||||
|
@ -337,11 +332,9 @@ void SCH_REFERENCE_LIST::Annotate( bool aUseSheetNum, int aSheetIntervalId,
|
||||||
|
|
||||||
// Check whether this component is in aLockedUnitMap.
|
// Check whether this component is in aLockedUnitMap.
|
||||||
SCH_REFERENCE_LIST* lockedList = NULL;
|
SCH_REFERENCE_LIST* lockedList = NULL;
|
||||||
|
|
||||||
BOOST_FOREACH( SCH_MULTI_UNIT_REFERENCE_MAP::value_type& pair, aLockedUnitMap )
|
BOOST_FOREACH( SCH_MULTI_UNIT_REFERENCE_MAP::value_type& pair, aLockedUnitMap )
|
||||||
{
|
{
|
||||||
unsigned n_refs = pair.second.GetCount();
|
unsigned n_refs = pair.second.GetCount();
|
||||||
|
|
||||||
for( unsigned thisRefI = 0; thisRefI < n_refs; ++thisRefI )
|
for( unsigned thisRefI = 0; thisRefI < n_refs; ++thisRefI )
|
||||||
{
|
{
|
||||||
SCH_REFERENCE &thisRef = pair.second[thisRefI];
|
SCH_REFERENCE &thisRef = pair.second[thisRefI];
|
||||||
|
@ -421,29 +414,22 @@ void SCH_REFERENCE_LIST::Annotate( bool aUseSheetNum, int aSheetIntervalId,
|
||||||
if( lockedList != NULL )
|
if( lockedList != NULL )
|
||||||
{
|
{
|
||||||
unsigned n_refs = lockedList->GetCount();
|
unsigned n_refs = lockedList->GetCount();
|
||||||
|
|
||||||
for( unsigned thisRefI = 0; thisRefI < n_refs; ++thisRefI )
|
for( unsigned thisRefI = 0; thisRefI < n_refs; ++thisRefI )
|
||||||
{
|
{
|
||||||
SCH_REFERENCE &thisRef = (*lockedList)[thisRefI];
|
SCH_REFERENCE &thisRef = (*lockedList)[thisRefI];
|
||||||
|
|
||||||
if( thisRef.IsSameInstance( componentFlatList[ii] ) )
|
if( thisRef.IsSameInstance( componentFlatList[ii] ) )
|
||||||
{
|
{
|
||||||
// This is the component we're currently annotating. Hold the unit!
|
// This is the component we're currently annotating. Hold the unit!
|
||||||
componentFlatList[ii].m_Unit = thisRef.m_Unit;
|
componentFlatList[ii].m_Unit = thisRef.m_Unit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( thisRef.CompareValue( componentFlatList[ii] ) != 0 )
|
if( thisRef.CompareValue( componentFlatList[ii] ) != 0 ) continue;
|
||||||
continue;
|
if( thisRef.CompareLibName( componentFlatList[ii] ) != 0 ) continue;
|
||||||
|
|
||||||
if( thisRef.CompareLibName( componentFlatList[ii] ) != 0 )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Find the matching component
|
// Find the matching component
|
||||||
for( unsigned jj = ii + 1; jj < componentFlatList.size(); jj++ )
|
for( unsigned jj = ii + 1; jj < componentFlatList.size(); jj++ )
|
||||||
{
|
{
|
||||||
if( ! thisRef.IsSameInstance( componentFlatList[jj] ) )
|
if( ! thisRef.IsSameInstance( componentFlatList[jj] ) ) continue;
|
||||||
continue;
|
|
||||||
|
|
||||||
componentFlatList[jj].m_NumRef = componentFlatList[ii].m_NumRef;
|
componentFlatList[jj].m_NumRef = componentFlatList[ii].m_NumRef;
|
||||||
componentFlatList[jj].m_Unit = thisRef.m_Unit;
|
componentFlatList[jj].m_Unit = thisRef.m_Unit;
|
||||||
componentFlatList[jj].m_IsNew = false;
|
componentFlatList[jj].m_IsNew = false;
|
||||||
|
@ -452,12 +438,13 @@ void SCH_REFERENCE_LIST::Annotate( bool aUseSheetNum, int aSheetIntervalId,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* search for others units of this component.
|
/* search for others units of this component.
|
||||||
* we search for others parts that have the same value and the same
|
* we search for others parts that have the same value and the same
|
||||||
* reference prefix (ref without ref number)
|
* reference prefix (ref without ref number)
|
||||||
*/
|
*/
|
||||||
for( Unit = 1; Unit <= NumberOfUnits; Unit++ )
|
for( Unit = 1; Unit <= NumberOfUnits; Unit++ )
|
||||||
{
|
{
|
||||||
if( componentFlatList[ii].m_Unit == Unit )
|
if( componentFlatList[ii].m_Unit == Unit )
|
||||||
|
@ -511,7 +498,7 @@ int SCH_REFERENCE_LIST::CheckAnnotation( wxArrayString* aMessageList )
|
||||||
|
|
||||||
SortByRefAndValue();
|
SortByRefAndValue();
|
||||||
|
|
||||||
// Split reference designators into name (prefix) and number: IC1 becomes IC, and 1.
|
// Spiit reference designators into name (prefix) and number: IC1 becomes IC, and 1.
|
||||||
SplitReferences();
|
SplitReferences();
|
||||||
|
|
||||||
// count not yet annotated items or annotation error.
|
// count not yet annotated items or annotation error.
|
||||||
|
@ -681,14 +668,14 @@ int SCH_REFERENCE_LIST::CheckAnnotation( wxArrayString* aMessageList )
|
||||||
for( int ii = 0; ( ii < imax ) && ( error < 4 ); ii++ )
|
for( int ii = 0; ( ii < imax ) && ( error < 4 ); ii++ )
|
||||||
{
|
{
|
||||||
if( ( componentFlatList[ii].m_TimeStamp != componentFlatList[ii + 1].m_TimeStamp )
|
if( ( componentFlatList[ii].m_TimeStamp != componentFlatList[ii + 1].m_TimeStamp )
|
||||||
|| ( componentFlatList[ii].GetSheet() != componentFlatList[ii + 1].GetSheet() ) )
|
|| ( componentFlatList[ii].GetSheetPath() != componentFlatList[ii + 1].GetSheetPath() ) )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Same time stamp found.
|
// Same time stamp found.
|
||||||
wxString full_path;
|
wxString full_path;
|
||||||
|
|
||||||
full_path.Printf( wxT( "%s%8.8X" ),
|
full_path.Printf( wxT( "%s%8.8X" ),
|
||||||
GetChars( componentFlatList[ii].GetSheet()->GetPath() ),
|
GetChars( componentFlatList[ii].GetSheetPath().Path() ),
|
||||||
componentFlatList[ii].m_TimeStamp );
|
componentFlatList[ii].m_TimeStamp );
|
||||||
|
|
||||||
msg.Printf( _( "Duplicate time stamp (%s) for %s%d and %s%d" ),
|
msg.Printf( _( "Duplicate time stamp (%s) for %s%d and %s%d" ),
|
||||||
|
@ -707,25 +694,25 @@ int SCH_REFERENCE_LIST::CheckAnnotation( wxArrayString* aMessageList )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SCH_REFERENCE::SCH_REFERENCE( SCH_COMPONENT* aComponent, LIB_PART* aLibComponent,
|
SCH_REFERENCE::SCH_REFERENCE( SCH_COMPONENT* aComponent, LIB_PART* aLibComponent,
|
||||||
SCH_SHEET* aSheet )
|
SCH_SHEET_PATH& aSheetPath )
|
||||||
{
|
{
|
||||||
wxASSERT( aComponent != NULL && aLibComponent != NULL );
|
wxASSERT( aComponent != NULL && aLibComponent != NULL );
|
||||||
|
|
||||||
m_RootCmp = aComponent;
|
m_RootCmp = aComponent;
|
||||||
m_Entry = aLibComponent;
|
m_Entry = aLibComponent;
|
||||||
m_Unit = aComponent->GetUnitSelection( aSheet );
|
m_Unit = aComponent->GetUnitSelection( &aSheetPath );
|
||||||
m_Sheet = aSheet;
|
m_SheetPath = aSheetPath;
|
||||||
m_IsNew = false;
|
m_IsNew = false;
|
||||||
m_Flag = 0;
|
m_Flag = 0;
|
||||||
m_TimeStamp = aComponent->GetTimeStamp();
|
m_TimeStamp = aComponent->GetTimeStamp();
|
||||||
m_CmpPos = aComponent->GetPosition();
|
m_CmpPos = aComponent->GetPosition();
|
||||||
m_SheetNum = 0;
|
m_SheetNum = 0;
|
||||||
|
|
||||||
if( aComponent->GetRef( aSheet ).IsEmpty() )
|
if( aComponent->GetRef( &aSheetPath ).IsEmpty() )
|
||||||
aComponent->SetRef( aSheet, wxT( "DefRef?" ) );
|
aComponent->SetRef( &aSheetPath, wxT( "DefRef?" ) );
|
||||||
|
|
||||||
SetRef( aComponent->GetRef( aSheet ) );
|
SetRef( aComponent->GetRef( &aSheetPath ) );
|
||||||
|
|
||||||
m_NumRef = -1;
|
m_NumRef = -1;
|
||||||
|
|
||||||
|
@ -736,24 +723,6 @@ 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 )
|
||||||
|
@ -761,9 +730,9 @@ void SCH_REFERENCE::Annotate()
|
||||||
else
|
else
|
||||||
m_Ref = TO_UTF8( GetRef() << m_NumRef );
|
m_Ref = TO_UTF8( GetRef() << m_NumRef );
|
||||||
|
|
||||||
m_RootCmp->SetRef( m_Sheet, FROM_UTF8( m_Ref.c_str() ) );
|
m_RootCmp->SetRef( &m_SheetPath, FROM_UTF8( m_Ref.c_str() ) );
|
||||||
m_RootCmp->SetUnit( m_Unit );
|
m_RootCmp->SetUnit( m_Unit );
|
||||||
m_RootCmp->SetUnitSelection( m_Sheet, m_Unit );
|
m_RootCmp->SetUnitSelection( &m_SheetPath, m_Unit );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -797,7 +766,7 @@ void SCH_REFERENCE::Split()
|
||||||
{
|
{
|
||||||
while( ll >= 0 )
|
while( ll >= 0 )
|
||||||
{
|
{
|
||||||
if( ( refText[ll] <= ' ' ) || isdigit( refText[ll] ) )
|
if( (refText[ll] <= ' ' ) || isdigit( refText[ll] ) )
|
||||||
ll--;
|
ll--;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -108,7 +108,7 @@ SCH_ITEM* SCH_EDIT_FRAME::LocateAndShowItem( const wxPoint& aPosition, const KIC
|
||||||
Pin->GetMsgPanelInfo( items );
|
Pin->GetMsgPanelInfo( items );
|
||||||
|
|
||||||
if( LibItem )
|
if( LibItem )
|
||||||
items.push_back( MSG_PANEL_ITEM( LibItem->GetRef( m_CurrentSheet->Last() ),
|
items.push_back( MSG_PANEL_ITEM( LibItem->GetRef( m_CurrentSheet ),
|
||||||
LibItem->GetField( VALUE )->GetShownText(), DARKCYAN ) );
|
LibItem->GetField( VALUE )->GetShownText(), DARKCYAN ) );
|
||||||
|
|
||||||
SetMsgPanel( items );
|
SetMsgPanel( items );
|
||||||
|
@ -187,7 +187,7 @@ SCH_ITEM* SCH_EDIT_FRAME::LocateItem( const wxPoint& aPosition, const KICAD_T aF
|
||||||
if( item )
|
if( item )
|
||||||
{
|
{
|
||||||
if( item->Type() == SCH_COMPONENT_T )
|
if( item->Type() == SCH_COMPONENT_T )
|
||||||
( (SCH_COMPONENT*) item )->SetCurrentSheet( GetCurrentSheet().Last() );
|
( (SCH_COMPONENT*) item )->SetCurrentSheetPath( &GetCurrentSheet() );
|
||||||
|
|
||||||
MSG_PANEL_ITEMS items;
|
MSG_PANEL_ITEMS items;
|
||||||
item->GetMsgPanelInfo( items );
|
item->GetMsgPanelInfo( items );
|
||||||
|
|
|
@ -42,7 +42,6 @@
|
||||||
#include <sch_base_frame.h>
|
#include <sch_base_frame.h>
|
||||||
#include <class_library.h>
|
#include <class_library.h>
|
||||||
#include <sch_component.h>
|
#include <sch_component.h>
|
||||||
#include <sch_sheet_path.h>
|
|
||||||
#include <dialog_helpers.h>
|
#include <dialog_helpers.h>
|
||||||
#include <dialog_edit_component_in_schematic_fbp.h>
|
#include <dialog_edit_component_in_schematic_fbp.h>
|
||||||
|
|
||||||
|
@ -340,7 +339,7 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::copyPanelToOptions()
|
||||||
{
|
{
|
||||||
int unit_selection = unitChoice->GetCurrentSelection() + 1;
|
int unit_selection = unitChoice->GetCurrentSelection() + 1;
|
||||||
|
|
||||||
m_cmp->SetUnitSelection( m_parent->GetCurrentSheet().Last(), unit_selection );
|
m_cmp->SetUnitSelection( &m_parent->GetCurrentSheet(), unit_selection );
|
||||||
m_cmp->SetUnit( unit_selection );
|
m_cmp->SetUnit( unit_selection );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -459,7 +458,7 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::OnOKButtonClick( wxCommandEvent& event
|
||||||
// Reference has a specific initialization, depending on the current active sheet
|
// Reference has a specific initialization, depending on the current active sheet
|
||||||
// because for a given component, in a complex hierarchy, there are more than one
|
// because for a given component, in a complex hierarchy, there are more than one
|
||||||
// reference.
|
// reference.
|
||||||
m_cmp->SetRef( m_parent->GetCurrentSheet().Last(), m_FieldsBuf[REFERENCE].GetText() );
|
m_cmp->SetRef( &m_parent->GetCurrentSheet(), m_FieldsBuf[REFERENCE].GetText() );
|
||||||
|
|
||||||
m_parent->OnModify();
|
m_parent->OnModify();
|
||||||
m_parent->GetScreen()->TestDanglingEnds();
|
m_parent->GetScreen()->TestDanglingEnds();
|
||||||
|
@ -727,7 +726,7 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::InitBuffers( SCH_COMPONENT* aComponent
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_FieldsBuf[REFERENCE].SetText( m_cmp->GetRef( m_parent->GetCurrentSheet().Last() ) );
|
m_FieldsBuf[REFERENCE].SetText( m_cmp->GetRef( &m_parent->GetCurrentSheet() ) );
|
||||||
|
|
||||||
for( unsigned i = 0; i<m_FieldsBuf.size(); ++i )
|
for( unsigned i = 0; i<m_FieldsBuf.size(); ++i )
|
||||||
{
|
{
|
||||||
|
|
|
@ -235,7 +235,7 @@ void DIALOG_ERC::OnLeftClickMarkersList( wxHtmlLinkEvent& event )
|
||||||
{
|
{
|
||||||
sheet->LastScreen()->SetZoom( m_parent->GetScreen()->GetZoom() );
|
sheet->LastScreen()->SetZoom( m_parent->GetScreen()->GetZoom() );
|
||||||
m_parent->SetCurrentSheet( *sheet );
|
m_parent->SetCurrentSheet( *sheet );
|
||||||
m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
|
m_parent->GetCurrentSheet().UpdateAllScreenReferences();
|
||||||
}
|
}
|
||||||
|
|
||||||
m_lastMarkerFound = marker;
|
m_lastMarkerFound = marker;
|
||||||
|
@ -455,8 +455,8 @@ void DIALOG_ERC::TestErc( wxArrayString* aMessagesList )
|
||||||
m_tstUniqueGlobalLabels = m_cbTestUniqueGlbLabels->GetValue();
|
m_tstUniqueGlobalLabels = m_cbTestUniqueGlbLabels->GetValue();
|
||||||
|
|
||||||
// Build the whole sheet list in hierarchy (sheet, not screen)
|
// Build the whole sheet list in hierarchy (sheet, not screen)
|
||||||
int refDes = 1;
|
SCH_SHEET_LIST sheets;
|
||||||
g_RootSheet->AnnotatePowerSymbols( Prj().SchLibs(), &refDes );
|
sheets.AnnotatePowerSymbols( Prj().SchLibs() );
|
||||||
|
|
||||||
if( m_parent->CheckAnnotate( aMessagesList, false ) )
|
if( m_parent->CheckAnnotate( aMessagesList, false ) )
|
||||||
{
|
{
|
||||||
|
|
|
@ -327,7 +327,7 @@ bool SCH_PRINTOUT::OnPrintPage( int page )
|
||||||
if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) )
|
if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) )
|
||||||
{
|
{
|
||||||
m_parent->SetCurrentSheet( list );
|
m_parent->SetCurrentSheet( list );
|
||||||
m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
|
m_parent->GetCurrentSheet().UpdateAllScreenReferences();
|
||||||
m_parent->SetSheetNumberAndCount();
|
m_parent->SetSheetNumberAndCount();
|
||||||
screen = m_parent->GetCurrentSheet().LastScreen();
|
screen = m_parent->GetCurrentSheet().LastScreen();
|
||||||
}
|
}
|
||||||
|
@ -341,7 +341,7 @@ bool SCH_PRINTOUT::OnPrintPage( int page )
|
||||||
|
|
||||||
DrawPage( screen );
|
DrawPage( screen );
|
||||||
m_parent->SetCurrentSheet( oldsheetpath );
|
m_parent->SetCurrentSheet( oldsheetpath );
|
||||||
m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
|
m_parent->GetCurrentSheet().UpdateAllScreenReferences();
|
||||||
m_parent->SetSheetNumberAndCount();
|
m_parent->SetSheetNumberAndCount();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -34,8 +34,6 @@
|
||||||
#include <boost/foreach.hpp>
|
#include <boost/foreach.hpp>
|
||||||
#include <project_rescue.h>
|
#include <project_rescue.h>
|
||||||
#include <eeschema_config.h>
|
#include <eeschema_config.h>
|
||||||
#include <sch_sheet_path.h>
|
|
||||||
|
|
||||||
|
|
||||||
class DIALOG_RESCUE_EACH: public DIALOG_RESCUE_EACH_BASE
|
class DIALOG_RESCUE_EACH: public DIALOG_RESCUE_EACH_BASE
|
||||||
{
|
{
|
||||||
|
@ -158,7 +156,7 @@ void DIALOG_RESCUE_EACH::PopulateInstanceList()
|
||||||
SCH_FIELD* valueField = each_component->GetField( 1 );
|
SCH_FIELD* valueField = each_component->GetField( 1 );
|
||||||
|
|
||||||
data.clear();
|
data.clear();
|
||||||
data.push_back( each_component->GetRef( m_Parent->GetCurrentSheet().Last() ) );
|
data.push_back( each_component->GetRef( & m_Parent->GetCurrentSheet() ) );
|
||||||
data.push_back( valueField ? valueField->GetText() : wxT( "" ) );
|
data.push_back( valueField ? valueField->GetText() : wxT( "" ) );
|
||||||
m_ListOfInstances->AppendItem( data );
|
m_ListOfInstances->AppendItem( data );
|
||||||
|
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
* Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
||||||
* Copyright (C) 2008-2015 Wayne Stambaugh <stambaughw@verizon.net>
|
* Copyright (C) 2008-2013 Wayne Stambaugh <stambaughw@verizon.net>
|
||||||
* Copyright (C) 2004-2015 KiCad Developers, see change_log.txt for contributors.
|
* Copyright (C) 2004-2013 KiCad Developers, see change_log.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
@ -38,7 +38,6 @@
|
||||||
#include <general.h>
|
#include <general.h>
|
||||||
#include <class_library.h>
|
#include <class_library.h>
|
||||||
#include <sch_component.h>
|
#include <sch_component.h>
|
||||||
#include <sch_sheet_path.h>
|
|
||||||
|
|
||||||
#include <dialog_edit_one_field.h>
|
#include <dialog_edit_one_field.h>
|
||||||
|
|
||||||
|
@ -102,7 +101,7 @@ void SCH_EDIT_FRAME::EditComponentFieldText( SCH_FIELD* aField )
|
||||||
// Test if the reference string is valid:
|
// Test if the reference string is valid:
|
||||||
if( SCH_COMPONENT::IsReferenceStringValid( newtext ) )
|
if( SCH_COMPONENT::IsReferenceStringValid( newtext ) )
|
||||||
{
|
{
|
||||||
component->SetRef( m_CurrentSheet->Last(), newtext );
|
component->SetRef( m_CurrentSheet, newtext );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -146,7 +145,7 @@ void SCH_EDIT_FRAME::EditComponentFieldText( SCH_FIELD* aField )
|
||||||
}
|
}
|
||||||
|
|
||||||
MSG_PANEL_ITEMS items;
|
MSG_PANEL_ITEMS items;
|
||||||
component->SetCurrentSheet( GetCurrentSheet().Last() );
|
component->SetCurrentSheetPath( &GetCurrentSheet() );
|
||||||
component->GetMsgPanelInfo( items );
|
component->GetMsgPanelInfo( items );
|
||||||
SetMsgPanel( items );
|
SetMsgPanel( items );
|
||||||
}
|
}
|
||||||
|
|
|
@ -289,7 +289,7 @@ void Diagnose( NETLIST_OBJECT* aNetItemRef, NETLIST_OBJECT* aNetItemTst,
|
||||||
cmp_ref = wxT( "?" );
|
cmp_ref = wxT( "?" );
|
||||||
|
|
||||||
if( aNetItemRef->m_Type == NET_PIN && aNetItemRef->m_Link )
|
if( aNetItemRef->m_Type == NET_PIN && aNetItemRef->m_Link )
|
||||||
cmp_ref = aNetItemRef->GetComponentParent()->GetRef( aNetItemRef->m_SheetPath.Last() );
|
cmp_ref = aNetItemRef->GetComponentParent()->GetRef( &aNetItemRef->m_SheetPath );
|
||||||
|
|
||||||
if( aNetItemTst == NULL )
|
if( aNetItemTst == NULL )
|
||||||
{
|
{
|
||||||
|
@ -310,7 +310,7 @@ void Diagnose( NETLIST_OBJECT* aNetItemRef, NETLIST_OBJECT* aNetItemTst,
|
||||||
{
|
{
|
||||||
if( aNetItemRef->m_Type == NET_PIN && aNetItemRef->m_Link )
|
if( aNetItemRef->m_Type == NET_PIN && aNetItemRef->m_Link )
|
||||||
cmp_ref = aNetItemRef->GetComponentParent()->GetRef(
|
cmp_ref = aNetItemRef->GetComponentParent()->GetRef(
|
||||||
aNetItemRef->m_SheetPath.Last() );
|
&aNetItemRef->m_SheetPath );
|
||||||
|
|
||||||
msg.Printf( _( "Pin %s (%s) of component %s is not driven (Net %d)." ),
|
msg.Printf( _( "Pin %s (%s) of component %s is not driven (Net %d)." ),
|
||||||
GetChars( string_pinnum ),
|
GetChars( string_pinnum ),
|
||||||
|
@ -352,7 +352,7 @@ void Diagnose( NETLIST_OBJECT* aNetItemRef, NETLIST_OBJECT* aNetItemTst,
|
||||||
alt_cmp = wxT( "?" );
|
alt_cmp = wxT( "?" );
|
||||||
|
|
||||||
if( aNetItemTst->m_Type == NET_PIN && aNetItemTst->m_Link )
|
if( aNetItemTst->m_Type == NET_PIN && aNetItemTst->m_Link )
|
||||||
alt_cmp = aNetItemTst->GetComponentParent()->GetRef( aNetItemTst->m_SheetPath.Last() );
|
alt_cmp = aNetItemTst->GetComponentParent()->GetRef( &aNetItemTst->m_SheetPath );
|
||||||
|
|
||||||
msg.Printf( _( "Pin %s (%s) of component %s is connected to " ),
|
msg.Printf( _( "Pin %s (%s) of component %s is connected to " ),
|
||||||
GetChars( string_pinnum ),
|
GetChars( string_pinnum ),
|
||||||
|
@ -425,9 +425,9 @@ void TestOthersItems( NETLIST_OBJECT_LIST* aList,
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( ( (SCH_COMPONENT*) aList->GetItem( aNetItemRef )->
|
if( ( (SCH_COMPONENT*) aList->GetItem( aNetItemRef )->
|
||||||
m_Link )->GetRef( aList->GetItem( aNetItemRef )->m_SheetPath.Last() ) !=
|
m_Link )->GetRef( &aList->GetItem( aNetItemRef )-> m_SheetPath ) !=
|
||||||
( (SCH_COMPONENT*) aList->GetItem( duplicate )->m_Link )
|
( (SCH_COMPONENT*) aList->GetItem( duplicate )->m_Link )
|
||||||
->GetRef( aList->GetItem( duplicate )->m_SheetPath.Last() ) )
|
->GetRef( &aList->GetItem( duplicate )->m_SheetPath ) )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Same component and same pin. Do dot create error for this pin
|
// Same component and same pin. Do dot create error for this pin
|
||||||
|
|
|
@ -260,7 +260,7 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
|
||||||
|
|
||||||
GetScreen()->SetFileName( fullFileName );
|
GetScreen()->SetFileName( fullFileName );
|
||||||
g_RootSheet->SetFileName( fullFileName );
|
g_RootSheet->SetFileName( fullFileName );
|
||||||
g_RootSheet->SetName( "root" );
|
|
||||||
SetStatusText( wxEmptyString );
|
SetStatusText( wxEmptyString );
|
||||||
ClearMsgPanel();
|
ClearMsgPanel();
|
||||||
|
|
||||||
|
@ -327,7 +327,7 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
|
||||||
GetScreen()->SetGrid( ID_POPUP_GRID_LEVEL_1000 + m_LastGridSizeId );
|
GetScreen()->SetGrid( ID_POPUP_GRID_LEVEL_1000 + m_LastGridSizeId );
|
||||||
Zoom_Automatique( false );
|
Zoom_Automatique( false );
|
||||||
SetSheetNumberAndCount();
|
SetSheetNumberAndCount();
|
||||||
g_RootSheet->SetPageNumbers();
|
|
||||||
m_canvas->Refresh( true );
|
m_canvas->Refresh( true );
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -71,8 +71,7 @@ void SCH_EDIT_FRAME::OnFindDrcMarker( wxFindDialogEvent& event )
|
||||||
if( event.GetFlags() & FR_CURRENT_SHEET_ONLY )
|
if( event.GetFlags() & FR_CURRENT_SHEET_ONLY )
|
||||||
{
|
{
|
||||||
sheetFoundIn = m_CurrentSheet;
|
sheetFoundIn = m_CurrentSheet;
|
||||||
lastMarker = (SCH_MARKER*) m_CurrentSheet->Last()->FindNextItem( SCH_MARKER_T,
|
lastMarker = (SCH_MARKER*) m_CurrentSheet->FindNextItem( SCH_MARKER_T, lastMarker, wrap );
|
||||||
lastMarker, wrap );
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -86,7 +85,7 @@ void SCH_EDIT_FRAME::OnFindDrcMarker( wxFindDialogEvent& event )
|
||||||
{
|
{
|
||||||
sheetFoundIn->LastScreen()->SetZoom( GetScreen()->GetZoom() );
|
sheetFoundIn->LastScreen()->SetZoom( GetScreen()->GetZoom() );
|
||||||
*m_CurrentSheet = *sheetFoundIn;
|
*m_CurrentSheet = *sheetFoundIn;
|
||||||
m_CurrentSheet->Last()->UpdateAllScreenReferences();
|
m_CurrentSheet->UpdateAllScreenReferences();
|
||||||
}
|
}
|
||||||
|
|
||||||
SetCrossHairPosition( lastMarker->GetPosition() );
|
SetCrossHairPosition( lastMarker->GetPosition() );
|
||||||
|
@ -140,7 +139,7 @@ SCH_ITEM* SCH_EDIT_FRAME::FindComponentAndItem( const wxString& aReference,
|
||||||
|
|
||||||
SCH_COMPONENT* pSch = (SCH_COMPONENT*) item;
|
SCH_COMPONENT* pSch = (SCH_COMPONENT*) item;
|
||||||
|
|
||||||
if( aReference.CmpNoCase( pSch->GetRef( sheet->Last() ) ) == 0 )
|
if( aReference.CmpNoCase( pSch->GetRef( sheet ) ) == 0 )
|
||||||
{
|
{
|
||||||
Component = pSch;
|
Component = pSch;
|
||||||
sheetWithComponentFound = sheet;
|
sheetWithComponentFound = sheet;
|
||||||
|
@ -194,7 +193,7 @@ SCH_ITEM* SCH_EDIT_FRAME::FindComponentAndItem( const wxString& aReference,
|
||||||
{
|
{
|
||||||
sheet->LastScreen()->SetZoom( GetScreen()->GetZoom() );
|
sheet->LastScreen()->SetZoom( GetScreen()->GetZoom() );
|
||||||
*m_CurrentSheet = *sheet;
|
*m_CurrentSheet = *sheet;
|
||||||
m_CurrentSheet->Last()->UpdateAllScreenReferences();
|
m_CurrentSheet->UpdateAllScreenReferences();
|
||||||
centerAndRedraw = true;
|
centerAndRedraw = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -490,7 +489,7 @@ void SCH_EDIT_FRAME::updateFindReplaceView( wxFindDialogEvent& aEvent )
|
||||||
{
|
{
|
||||||
sheet->LastScreen()->SetZoom( GetScreen()->GetZoom() );
|
sheet->LastScreen()->SetZoom( GetScreen()->GetZoom() );
|
||||||
*m_CurrentSheet = *sheet;
|
*m_CurrentSheet = *sheet;
|
||||||
m_CurrentSheet->Last()->UpdateAllScreenReferences();
|
m_CurrentSheet->UpdateAllScreenReferences();
|
||||||
SetScreen( sheet->LastScreen() );
|
SetScreen( sheet->LastScreen() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,6 @@
|
||||||
#include <general.h>
|
#include <general.h>
|
||||||
#include <class_library.h>
|
#include <class_library.h>
|
||||||
#include <sch_component.h>
|
#include <sch_component.h>
|
||||||
#include <sch_sheet_path.h>
|
|
||||||
#include <libeditframe.h>
|
#include <libeditframe.h>
|
||||||
#include <viewlib_frame.h>
|
#include <viewlib_frame.h>
|
||||||
#include <eeschema_id.h>
|
#include <eeschema_id.h>
|
||||||
|
@ -221,8 +220,8 @@ SCH_COMPONENT* SCH_EDIT_FRAME::Load_Component( wxDC* aDC,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
SCH_COMPONENT* component = new SCH_COMPONENT( *part, m_CurrentSheet->Last(), unit, convert,
|
SCH_COMPONENT* component = new SCH_COMPONENT( *part, m_CurrentSheet, unit, convert,
|
||||||
GetCrossHairPosition(), true );
|
GetCrossHairPosition(), true );
|
||||||
|
|
||||||
// Set the m_ChipName value, from component name in lib, for aliases
|
// Set the m_ChipName value, from component name in lib, for aliases
|
||||||
// Note if part is found, and if name is an alias of a component,
|
// Note if part is found, and if name is an alias of a component,
|
||||||
|
@ -237,7 +236,7 @@ SCH_COMPONENT* SCH_EDIT_FRAME::Load_Component( wxDC* aDC,
|
||||||
|
|
||||||
MSG_PANEL_ITEMS items;
|
MSG_PANEL_ITEMS items;
|
||||||
|
|
||||||
component->SetCurrentSheet( GetCurrentSheet().Last() );
|
component->SetCurrentSheetPath( &GetCurrentSheet() );
|
||||||
component->GetMsgPanelInfo( items );
|
component->GetMsgPanelInfo( items );
|
||||||
|
|
||||||
SetMsgPanel( items );
|
SetMsgPanel( items );
|
||||||
|
@ -326,7 +325,7 @@ void SCH_EDIT_FRAME::OnSelectUnit( wxCommandEvent& aEvent )
|
||||||
component->Draw( m_canvas, &dc, wxPoint( 0, 0 ), g_XorMode );
|
component->Draw( m_canvas, &dc, wxPoint( 0, 0 ), g_XorMode );
|
||||||
|
|
||||||
/* Update the unit number. */
|
/* Update the unit number. */
|
||||||
component->SetUnitSelection( m_CurrentSheet->Last(), unit );
|
component->SetUnitSelection( m_CurrentSheet, unit );
|
||||||
component->SetUnit( unit );
|
component->SetUnit( unit );
|
||||||
component->ClearFlags();
|
component->ClearFlags();
|
||||||
component->SetFlags( flags ); // Restore m_Flag modified by SetUnit()
|
component->SetFlags( flags ); // Restore m_Flag modified by SetUnit()
|
||||||
|
|
|
@ -285,7 +285,7 @@ void SCH_EDIT_FRAME::DisplayCurrentSheet()
|
||||||
GetScreen()->SetGrid( m_LastGridSizeId + ID_POPUP_GRID_LEVEL_1000 );
|
GetScreen()->SetGrid( m_LastGridSizeId + ID_POPUP_GRID_LEVEL_1000 );
|
||||||
|
|
||||||
// update the References
|
// update the References
|
||||||
m_CurrentSheet->Last()->UpdateAllScreenReferences();
|
m_CurrentSheet->UpdateAllScreenReferences();
|
||||||
SetSheetNumberAndCount();
|
SetSheetNumberAndCount();
|
||||||
m_canvas->SetCanStartBlock( -1 );
|
m_canvas->SetCanStartBlock( -1 );
|
||||||
|
|
||||||
|
|
|
@ -100,8 +100,8 @@ void SCH_EDIT_FRAME::ReCreateMenuBar()
|
||||||
}
|
}
|
||||||
|
|
||||||
AddMenuItem( fileMenu,
|
AddMenuItem( fileMenu,
|
||||||
ID_APPEND_PROJECT, _( "App&end Schematic Sheet" ),
|
ID_APPEND_PROJECT, _( "Imp&ort Schematic Sheet Content" ),
|
||||||
_( "Append schematic sheet to current project" ),
|
_( "Import a schematic sheet content from an other project in the current sheet" ),
|
||||||
KiBitmap( open_document_xpm ) );
|
KiBitmap( open_document_xpm ) );
|
||||||
|
|
||||||
fileMenu->AppendSeparator();
|
fileMenu->AppendSeparator();
|
||||||
|
|
|
@ -67,9 +67,9 @@ int TestDuplicateSheetNames( bool aCreateMarker );
|
||||||
|
|
||||||
bool SCH_EDIT_FRAME::prepareForNetlist()
|
bool SCH_EDIT_FRAME::prepareForNetlist()
|
||||||
{
|
{
|
||||||
int refDes = 1;
|
SCH_SHEET_LIST sheets;
|
||||||
|
|
||||||
g_RootSheet->AnnotatePowerSymbols( Prj().SchLibs(), &refDes );
|
sheets.AnnotatePowerSymbols( Prj().SchLibs() );
|
||||||
|
|
||||||
// Performs some controls:
|
// Performs some controls:
|
||||||
if( CheckAnnotate( NULL, 0 ) )
|
if( CheckAnnotate( NULL, 0 ) )
|
||||||
|
|
|
@ -115,8 +115,7 @@ SCH_COMPONENT* NETLIST_EXPORTER::findNextComponent( EDA_ITEM* aItem, SCH_SHEET_P
|
||||||
|
|
||||||
// Power symbols and other components which have the reference starting
|
// Power symbols and other components which have the reference starting
|
||||||
// with "#" are not included in netlist (pseudo or virtual components)
|
// with "#" are not included in netlist (pseudo or virtual components)
|
||||||
ref = comp->GetRef( aSheetPath->Last() );
|
ref = comp->GetRef( aSheetPath );
|
||||||
|
|
||||||
if( ref[0] == wxChar( '#' ) )
|
if( ref[0] == wxChar( '#' ) )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -174,7 +173,7 @@ SCH_COMPONENT* NETLIST_EXPORTER::findNextComponentAndCreatePinList( EDA_ITEM*
|
||||||
|
|
||||||
// Power symbols and other components which have the reference starting
|
// Power symbols and other components which have the reference starting
|
||||||
// with "#" are not included in netlist (pseudo or virtual components)
|
// with "#" are not included in netlist (pseudo or virtual components)
|
||||||
ref = comp->GetRef( aSheetPath->Last() );
|
ref = comp->GetRef( aSheetPath );
|
||||||
|
|
||||||
if( ref[0] == wxChar( '#' ) )
|
if( ref[0] == wxChar( '#' ) )
|
||||||
continue;
|
continue;
|
||||||
|
@ -207,7 +206,7 @@ SCH_COMPONENT* NETLIST_EXPORTER::findNextComponentAndCreatePinList( EDA_ITEM*
|
||||||
{
|
{
|
||||||
LIB_PINS pins; // constructed once here
|
LIB_PINS pins; // constructed once here
|
||||||
|
|
||||||
part->GetPins( pins, comp->GetUnitSelection( aSheetPath->Last() ), comp->GetConvert() );
|
part->GetPins( pins, comp->GetUnitSelection( aSheetPath ), comp->GetConvert() );
|
||||||
|
|
||||||
for( size_t i = 0; i < pins.size(); i++ )
|
for( size_t i = 0; i < pins.size(); i++ )
|
||||||
{
|
{
|
||||||
|
@ -323,10 +322,10 @@ void NETLIST_EXPORTER::eraseDuplicatePins()
|
||||||
|
|
||||||
|
|
||||||
void NETLIST_EXPORTER::findAllInstancesOfComponent( SCH_COMPONENT* aComponent,
|
void NETLIST_EXPORTER::findAllInstancesOfComponent( SCH_COMPONENT* aComponent,
|
||||||
LIB_PART* aEntry,
|
LIB_PART* aEntry,
|
||||||
SCH_SHEET_PATH* aSheetPath )
|
SCH_SHEET_PATH* aSheetPath )
|
||||||
{
|
{
|
||||||
wxString ref = aComponent->GetRef( aSheetPath->Last() );
|
wxString ref = aComponent->GetRef( aSheetPath );
|
||||||
wxString ref2;
|
wxString ref2;
|
||||||
|
|
||||||
SCH_SHEET_LIST sheetList;
|
SCH_SHEET_LIST sheetList;
|
||||||
|
@ -340,11 +339,11 @@ void NETLIST_EXPORTER::findAllInstancesOfComponent( SCH_COMPONENT* aComponent,
|
||||||
|
|
||||||
SCH_COMPONENT* comp2 = (SCH_COMPONENT*) item;
|
SCH_COMPONENT* comp2 = (SCH_COMPONENT*) item;
|
||||||
|
|
||||||
ref2 = comp2->GetRef( sheet->Last() );
|
ref2 = comp2->GetRef( sheet );
|
||||||
if( ref2.CmpNoCase( ref ) != 0 )
|
if( ref2.CmpNoCase( ref ) != 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
int unit2 = comp2->GetUnitSelection( sheet->Last() ); // slow
|
int unit2 = comp2->GetUnitSelection( sheet ); // slow
|
||||||
|
|
||||||
for( LIB_PIN* pin = aEntry->GetNextPin(); pin; pin = aEntry->GetNextPin( pin ) )
|
for( LIB_PIN* pin = aEntry->GetNextPin(); pin; pin = aEntry->GetNextPin( pin ) )
|
||||||
{
|
{
|
||||||
|
|
|
@ -93,7 +93,7 @@ bool NETLIST_EXPORTER_CADSTAR::WriteNetlist( const wxString& aOutFileName, unsig
|
||||||
footprint = wxT( "$noname" );
|
footprint = wxT( "$noname" );
|
||||||
*/
|
*/
|
||||||
|
|
||||||
msg = component->GetRef( sheet->Last() );
|
msg = component->GetRef( sheet );
|
||||||
ret |= fprintf( f, "%s ", TO_UTF8( StartCmpDesc ) );
|
ret |= fprintf( f, "%s ", TO_UTF8( StartCmpDesc ) );
|
||||||
ret |= fprintf( f, "%s", TO_UTF8( msg ) );
|
ret |= fprintf( f, "%s", TO_UTF8( msg ) );
|
||||||
|
|
||||||
|
@ -159,8 +159,7 @@ bool NETLIST_EXPORTER_CADSTAR::writeListOfNets( FILE* f )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
Cmp = nitem->GetComponentParent();
|
Cmp = nitem->GetComponentParent();
|
||||||
wxString refstr = Cmp->GetRef( nitem->m_SheetPath.Last() );
|
wxString refstr = Cmp->GetRef( &nitem->m_SheetPath );
|
||||||
|
|
||||||
if( refstr[0] == '#' )
|
if( refstr[0] == '#' )
|
||||||
continue; // Power supply symbols.
|
continue; // Power supply symbols.
|
||||||
|
|
||||||
|
|
|
@ -131,7 +131,7 @@ XNODE* NETLIST_EXPORTER_GENERIC::makeComponents()
|
||||||
// an element.
|
// an element.
|
||||||
|
|
||||||
xcomps->AddChild( xcomp = node( sComponent ) );
|
xcomps->AddChild( xcomp = node( sComponent ) );
|
||||||
xcomp->AddAttribute( sRef, comp->GetRef( path->Last() ) );
|
xcomp->AddAttribute( sRef, comp->GetRef( path ) );
|
||||||
|
|
||||||
xcomp->AddChild( node( sValue, comp->GetField( VALUE )->GetText() ) );
|
xcomp->AddChild( node( sValue, comp->GetField( VALUE )->GetText() ) );
|
||||||
|
|
||||||
|
@ -467,8 +467,7 @@ XNODE* NETLIST_EXPORTER_GENERIC::makeListOfNets()
|
||||||
comp = nitem->GetComponentParent();
|
comp = nitem->GetComponentParent();
|
||||||
|
|
||||||
// Get the reference for the net name and the main parent component
|
// Get the reference for the net name and the main parent component
|
||||||
ref = comp->GetRef( nitem->m_SheetPath.Last() );
|
ref = comp->GetRef( &nitem->m_SheetPath );
|
||||||
|
|
||||||
if( ref[0] == wxChar( '#' ) )
|
if( ref[0] == wxChar( '#' ) )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -530,8 +529,7 @@ bool NETLIST_EXPORTER_GENERIC::writeListOfNets( FILE* f, NETLIST_OBJECT_LIST& aO
|
||||||
comp = nitem->GetComponentParent();
|
comp = nitem->GetComponentParent();
|
||||||
|
|
||||||
// Get the reference for the net name and the main parent component
|
// Get the reference for the net name and the main parent component
|
||||||
ref = comp->GetRef( nitem->m_SheetPath.Last() );
|
ref = comp->GetRef( &nitem->m_SheetPath );
|
||||||
|
|
||||||
if( ref[0] == wxChar( '#' ) )
|
if( ref[0] == wxChar( '#' ) )
|
||||||
continue; // Pseudo component (Like Power symbol)
|
continue; // Pseudo component (Like Power symbol)
|
||||||
|
|
||||||
|
|
|
@ -87,7 +87,7 @@ bool NETLIST_EXPORTER_ORCADPCB2::WriteNetlist( const wxString& aOutFileName, uns
|
||||||
{
|
{
|
||||||
if( part->GetFootPrints().GetCount() != 0 ) // Put in list
|
if( part->GetFootPrints().GetCount() != 0 ) // Put in list
|
||||||
{
|
{
|
||||||
cmpList.push_back( SCH_REFERENCE( comp, part, path->Last() ) );
|
cmpList.push_back( SCH_REFERENCE( comp, part, *path ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,10 +99,10 @@ bool NETLIST_EXPORTER_ORCADPCB2::WriteNetlist( const wxString& aOutFileName, uns
|
||||||
else
|
else
|
||||||
footprint = wxT( "$noname" );
|
footprint = wxT( "$noname" );
|
||||||
|
|
||||||
field = comp->GetRef( path->Last() );
|
field = comp->GetRef( path );
|
||||||
|
|
||||||
ret |= fprintf( f, " ( %s %s",
|
ret |= fprintf( f, " ( %s %s",
|
||||||
TO_UTF8( comp->GetPath( path->Last() ) ),
|
TO_UTF8( comp->GetPath( path ) ),
|
||||||
TO_UTF8( footprint ) );
|
TO_UTF8( footprint ) );
|
||||||
|
|
||||||
ret |= fprintf( f, " %s", TO_UTF8( field ) );
|
ret |= fprintf( f, " %s", TO_UTF8( field ) );
|
||||||
|
|
|
@ -235,7 +235,7 @@ bool NETLIST_EXPORTER_PSPICE::WriteNetlist( const wxString& aOutFileName, unsign
|
||||||
}
|
}
|
||||||
|
|
||||||
//Get Standard Reference Designator:
|
//Get Standard Reference Designator:
|
||||||
wxString RefName = comp->GetRef( sheet->Last() );
|
wxString RefName = comp->GetRef( sheet );
|
||||||
|
|
||||||
//Conditionally add Prefix only for devices that begin with U or IC:
|
//Conditionally add Prefix only for devices that begin with U or IC:
|
||||||
if( aUsePrefix )
|
if( aUsePrefix )
|
||||||
|
|
|
@ -98,11 +98,6 @@ void SCH_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition )
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
item = LocateAndShowItem( aPosition );
|
item = LocateAndShowItem( aPosition );
|
||||||
|
|
||||||
// Show the sheet information when the user clicks anywhere there are no items
|
|
||||||
// in the schematic.
|
|
||||||
if( item == NULL )
|
|
||||||
SetMsgPanel( GetCurrentSheet().Last() );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
#include <class_sch_screen.h>
|
#include <class_sch_screen.h>
|
||||||
#include <schframe.h>
|
#include <schframe.h>
|
||||||
#include <sch_sheet_path.h>
|
#include <sch_sheet_path.h>
|
||||||
#include <sch_sheet.h>
|
|
||||||
#include <project.h>
|
#include <project.h>
|
||||||
|
|
||||||
#include <dialog_plot_schematic.h>
|
#include <dialog_plot_schematic.h>
|
||||||
|
@ -68,7 +67,7 @@ void DIALOG_PLOT_SCHEMATIC::CreateDXFFile( bool aPlotAll, bool aPlotFrameRef )
|
||||||
if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) )
|
if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) )
|
||||||
{
|
{
|
||||||
schframe->SetCurrentSheet( list );
|
schframe->SetCurrentSheet( list );
|
||||||
schframe->GetCurrentSheet().Last()->UpdateAllScreenReferences();
|
schframe->GetCurrentSheet().UpdateAllScreenReferences();
|
||||||
schframe->SetSheetNumberAndCount();
|
schframe->SetSheetNumberAndCount();
|
||||||
screen = schframe->GetCurrentSheet().LastScreen();
|
screen = schframe->GetCurrentSheet().LastScreen();
|
||||||
}
|
}
|
||||||
|
@ -106,7 +105,7 @@ void DIALOG_PLOT_SCHEMATIC::CreateDXFFile( bool aPlotAll, bool aPlotFrameRef )
|
||||||
msg.Printf( wxT( "DXF Plotter exception: %s"), GetChars( e.errorText ) );
|
msg.Printf( wxT( "DXF Plotter exception: %s"), GetChars( e.errorText ) );
|
||||||
reporter.Report( msg, REPORTER::RPT_ERROR );
|
reporter.Report( msg, REPORTER::RPT_ERROR );
|
||||||
schframe->SetCurrentSheet( oldsheetpath );
|
schframe->SetCurrentSheet( oldsheetpath );
|
||||||
schframe->GetCurrentSheet().Last()->UpdateAllScreenReferences();
|
schframe->GetCurrentSheet().UpdateAllScreenReferences();
|
||||||
schframe->SetSheetNumberAndCount();
|
schframe->SetSheetNumberAndCount();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -117,7 +116,7 @@ void DIALOG_PLOT_SCHEMATIC::CreateDXFFile( bool aPlotAll, bool aPlotFrameRef )
|
||||||
}
|
}
|
||||||
|
|
||||||
schframe->SetCurrentSheet( oldsheetpath );
|
schframe->SetCurrentSheet( oldsheetpath );
|
||||||
schframe->GetCurrentSheet().Last()->UpdateAllScreenReferences();
|
schframe->GetCurrentSheet().UpdateAllScreenReferences();
|
||||||
schframe->SetSheetNumberAndCount();
|
schframe->SetSheetNumberAndCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,7 +125,7 @@ bool DIALOG_PLOT_SCHEMATIC::PlotOneSheetDXF( const wxString& aFileName,
|
||||||
SCH_SCREEN* aScreen,
|
SCH_SCREEN* aScreen,
|
||||||
wxPoint aPlotOffset,
|
wxPoint aPlotOffset,
|
||||||
double aScale,
|
double aScale,
|
||||||
bool aPlotFrameRef )
|
bool aPlotFrameRef )
|
||||||
{
|
{
|
||||||
DXF_PLOTTER* plotter = new DXF_PLOTTER();
|
DXF_PLOTTER* plotter = new DXF_PLOTTER();
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
#include <class_sch_screen.h>
|
#include <class_sch_screen.h>
|
||||||
#include <schframe.h>
|
#include <schframe.h>
|
||||||
#include <base_units.h>
|
#include <base_units.h>
|
||||||
#include <sch_sheet.h>
|
|
||||||
#include <sch_sheet_path.h>
|
#include <sch_sheet_path.h>
|
||||||
#include <project.h>
|
#include <project.h>
|
||||||
|
|
||||||
|
@ -141,7 +140,7 @@ void DIALOG_PLOT_SCHEMATIC::createHPGLFile( bool aPlotAll, bool aPlotFrameRef )
|
||||||
if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) )
|
if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) )
|
||||||
{
|
{
|
||||||
m_parent->SetCurrentSheet( list );
|
m_parent->SetCurrentSheet( list );
|
||||||
m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
|
m_parent->GetCurrentSheet().UpdateAllScreenReferences();
|
||||||
m_parent->SetSheetNumberAndCount();
|
m_parent->SetSheetNumberAndCount();
|
||||||
|
|
||||||
screen = m_parent->GetCurrentSheet().LastScreen();
|
screen = m_parent->GetCurrentSheet().LastScreen();
|
||||||
|
@ -209,7 +208,7 @@ void DIALOG_PLOT_SCHEMATIC::createHPGLFile( bool aPlotAll, bool aPlotFrameRef )
|
||||||
}
|
}
|
||||||
|
|
||||||
m_parent->SetCurrentSheet( oldsheetpath );
|
m_parent->SetCurrentSheet( oldsheetpath );
|
||||||
m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
|
m_parent->GetCurrentSheet().UpdateAllScreenReferences();
|
||||||
m_parent->SetSheetNumberAndCount();
|
m_parent->SetSheetNumberAndCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
#include <fctsys.h>
|
#include <fctsys.h>
|
||||||
#include <plot_common.h>
|
#include <plot_common.h>
|
||||||
#include <class_sch_screen.h>
|
#include <class_sch_screen.h>
|
||||||
#include <sch_sheet.h>
|
|
||||||
#include <schframe.h>
|
#include <schframe.h>
|
||||||
#include <base_units.h>
|
#include <base_units.h>
|
||||||
#include <sch_sheet_path.h>
|
#include <sch_sheet_path.h>
|
||||||
|
@ -78,7 +77,7 @@ void DIALOG_PLOT_SCHEMATIC::createPDFFile( bool aPlotAll, bool aPlotFrameRef )
|
||||||
if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) )
|
if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) )
|
||||||
{
|
{
|
||||||
m_parent->SetCurrentSheet( list );
|
m_parent->SetCurrentSheet( list );
|
||||||
m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
|
m_parent->GetCurrentSheet().UpdateAllScreenReferences();
|
||||||
m_parent->SetSheetNumberAndCount();
|
m_parent->SetSheetNumberAndCount();
|
||||||
screen = m_parent->GetCurrentSheet().LastScreen();
|
screen = m_parent->GetCurrentSheet().LastScreen();
|
||||||
}
|
}
|
||||||
|
@ -155,7 +154,7 @@ void DIALOG_PLOT_SCHEMATIC::restoreEnvironment( PDF_PLOTTER* aPlotter,
|
||||||
|
|
||||||
// Restore the previous sheet
|
// Restore the previous sheet
|
||||||
m_parent->SetCurrentSheet( aOldsheetpath );
|
m_parent->SetCurrentSheet( aOldsheetpath );
|
||||||
m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
|
m_parent->GetCurrentSheet().UpdateAllScreenReferences();
|
||||||
m_parent->SetSheetNumberAndCount();
|
m_parent->SetSheetNumberAndCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
#include <class_sch_screen.h>
|
#include <class_sch_screen.h>
|
||||||
#include <schframe.h>
|
#include <schframe.h>
|
||||||
#include <base_units.h>
|
#include <base_units.h>
|
||||||
#include <sch_sheet.h>
|
|
||||||
#include <sch_sheet_path.h>
|
#include <sch_sheet_path.h>
|
||||||
#include <project.h>
|
#include <project.h>
|
||||||
#include <reporter.h>
|
#include <reporter.h>
|
||||||
|
@ -68,7 +67,7 @@ void DIALOG_PLOT_SCHEMATIC::createPSFile( bool aPlotAll, bool aPlotFrameRef )
|
||||||
if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) )
|
if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) )
|
||||||
{
|
{
|
||||||
m_parent->SetCurrentSheet( list );
|
m_parent->SetCurrentSheet( list );
|
||||||
m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
|
m_parent->GetCurrentSheet().UpdateAllScreenReferences();
|
||||||
m_parent->SetSheetNumberAndCount();
|
m_parent->SetSheetNumberAndCount();
|
||||||
screen = m_parent->GetCurrentSheet().LastScreen();
|
screen = m_parent->GetCurrentSheet().LastScreen();
|
||||||
}
|
}
|
||||||
|
@ -142,7 +141,7 @@ void DIALOG_PLOT_SCHEMATIC::createPSFile( bool aPlotAll, bool aPlotFrameRef )
|
||||||
}
|
}
|
||||||
|
|
||||||
m_parent->SetCurrentSheet( oldsheetpath );
|
m_parent->SetCurrentSheet( oldsheetpath );
|
||||||
m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
|
m_parent->GetCurrentSheet().UpdateAllScreenReferences();
|
||||||
m_parent->SetSheetNumberAndCount();
|
m_parent->SetSheetNumberAndCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,6 @@
|
||||||
#include <schframe.h>
|
#include <schframe.h>
|
||||||
#include <base_units.h>
|
#include <base_units.h>
|
||||||
#include <libeditframe.h>
|
#include <libeditframe.h>
|
||||||
#include <sch_sheet.h>
|
|
||||||
#include <sch_sheet_path.h>
|
#include <sch_sheet_path.h>
|
||||||
#include <project.h>
|
#include <project.h>
|
||||||
#include <reporter.h>
|
#include <reporter.h>
|
||||||
|
@ -68,7 +67,7 @@ void DIALOG_PLOT_SCHEMATIC::createSVGFile( bool aPrintAll, bool aPrintFrameRef )
|
||||||
if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) )
|
if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) )
|
||||||
{
|
{
|
||||||
m_parent->SetCurrentSheet( list );
|
m_parent->SetCurrentSheet( list );
|
||||||
m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
|
m_parent->GetCurrentSheet().UpdateAllScreenReferences();
|
||||||
m_parent->SetSheetNumberAndCount();
|
m_parent->SetSheetNumberAndCount();
|
||||||
screen = m_parent->GetCurrentSheet().LastScreen();
|
screen = m_parent->GetCurrentSheet().LastScreen();
|
||||||
}
|
}
|
||||||
|
@ -110,14 +109,14 @@ void DIALOG_PLOT_SCHEMATIC::createSVGFile( bool aPrintAll, bool aPrintFrameRef )
|
||||||
reporter.Report( msg, REPORTER::RPT_ERROR );
|
reporter.Report( msg, REPORTER::RPT_ERROR );
|
||||||
|
|
||||||
m_parent->SetCurrentSheet( oldsheetpath );
|
m_parent->SetCurrentSheet( oldsheetpath );
|
||||||
m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
|
m_parent->GetCurrentSheet().UpdateAllScreenReferences();
|
||||||
m_parent->SetSheetNumberAndCount();
|
m_parent->SetSheetNumberAndCount();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_parent->SetCurrentSheet( oldsheetpath );
|
m_parent->SetCurrentSheet( oldsheetpath );
|
||||||
m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
|
m_parent->GetCurrentSheet().UpdateAllScreenReferences();
|
||||||
m_parent->SetSheetNumberAndCount();
|
m_parent->SetSheetNumberAndCount();
|
||||||
}
|
}
|
||||||
else // Print current sheet
|
else // Print current sheet
|
||||||
|
|
|
@ -118,22 +118,22 @@ SCH_COMPONENT::SCH_COMPONENT( const wxPoint& aPos, SCH_ITEM* aParent ) :
|
||||||
SCH_ITEM( aParent, SCH_COMPONENT_T )
|
SCH_ITEM( aParent, SCH_COMPONENT_T )
|
||||||
{
|
{
|
||||||
Init( aPos );
|
Init( aPos );
|
||||||
m_currentSheet = NULL;
|
m_currentSheetPath = NULL;
|
||||||
m_fieldsAutoplaced = AUTOPLACED_NO;
|
m_fieldsAutoplaced = AUTOPLACED_NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SCH_COMPONENT::SCH_COMPONENT( LIB_PART& aPart, SCH_SHEET* aSheet, int unit,
|
SCH_COMPONENT::SCH_COMPONENT( LIB_PART& aPart, SCH_SHEET_PATH* sheet, int unit,
|
||||||
int convert, const wxPoint& pos, bool setNewItemFlag ) :
|
int convert, const wxPoint& pos, bool setNewItemFlag ) :
|
||||||
SCH_ITEM( NULL, SCH_COMPONENT_T )
|
SCH_ITEM( NULL, SCH_COMPONENT_T )
|
||||||
{
|
{
|
||||||
Init( pos );
|
Init( pos );
|
||||||
|
|
||||||
m_unit = unit;
|
m_unit = unit;
|
||||||
m_convert = convert;
|
m_convert = convert;
|
||||||
m_part_name = aPart.GetName();
|
m_part_name = aPart.GetName();
|
||||||
m_part = aPart.SharedPtr();
|
m_part = aPart.SharedPtr();
|
||||||
m_currentSheet = aSheet;
|
m_currentSheetPath = NULL;
|
||||||
m_fieldsAutoplaced = AUTOPLACED_NO;
|
m_fieldsAutoplaced = AUTOPLACED_NO;
|
||||||
|
|
||||||
SetTimeStamp( GetNewTimeStamp() );
|
SetTimeStamp( GetNewTimeStamp() );
|
||||||
|
@ -186,7 +186,7 @@ SCH_COMPONENT::SCH_COMPONENT( LIB_PART& aPart, SCH_SHEET* aSheet, int unit,
|
||||||
|
|
||||||
// update the reference -- just the prefix for now.
|
// update the reference -- just the prefix for now.
|
||||||
msg += wxT( "?" );
|
msg += wxT( "?" );
|
||||||
SetRef( aSheet, msg );
|
SetRef( sheet, msg );
|
||||||
|
|
||||||
// Use the schematic component name instead of the library value field
|
// Use the schematic component name instead of the library value field
|
||||||
// name.
|
// name.
|
||||||
|
@ -197,13 +197,13 @@ SCH_COMPONENT::SCH_COMPONENT( LIB_PART& aPart, SCH_SHEET* aSheet, int unit,
|
||||||
SCH_COMPONENT::SCH_COMPONENT( const SCH_COMPONENT& aComponent ) :
|
SCH_COMPONENT::SCH_COMPONENT( const SCH_COMPONENT& aComponent ) :
|
||||||
SCH_ITEM( aComponent )
|
SCH_ITEM( aComponent )
|
||||||
{
|
{
|
||||||
m_currentSheet = NULL;
|
m_currentSheetPath = NULL;
|
||||||
m_Parent = aComponent.m_Parent;
|
m_Parent = aComponent.m_Parent;
|
||||||
m_Pos = aComponent.m_Pos;
|
m_Pos = aComponent.m_Pos;
|
||||||
m_unit = aComponent.m_unit;
|
m_unit = aComponent.m_unit;
|
||||||
m_convert = aComponent.m_convert;
|
m_convert = aComponent.m_convert;
|
||||||
m_part_name = aComponent.m_part_name;
|
m_part_name = aComponent.m_part_name;
|
||||||
m_part = aComponent.m_part;
|
m_part = aComponent.m_part;
|
||||||
|
|
||||||
SetTimeStamp( aComponent.m_TimeStamp );
|
SetTimeStamp( aComponent.m_TimeStamp );
|
||||||
|
|
||||||
|
@ -432,21 +432,21 @@ void SCH_COMPONENT::AddHierarchicalReference( const wxString& aPath,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
wxString SCH_COMPONENT::GetPath( const SCH_SHEET* aSheet ) const
|
wxString SCH_COMPONENT::GetPath( const SCH_SHEET_PATH* sheet ) const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( aSheet != NULL, wxEmptyString,
|
wxCHECK_MSG( sheet != NULL, wxEmptyString,
|
||||||
wxT( "Cannot get component path with invalid sheet object." ) );
|
wxT( "Cannot get component path with invalid sheet object." ) );
|
||||||
|
|
||||||
wxString str;
|
wxString str;
|
||||||
|
|
||||||
str.Printf( wxT( "%8.8lX" ), (long unsigned) m_TimeStamp );
|
str.Printf( wxT( "%8.8lX" ), (long unsigned) m_TimeStamp );
|
||||||
return aSheet->GetPath() + str;
|
return sheet->Path() + str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const wxString SCH_COMPONENT::GetRef( const SCH_SHEET* aSheet )
|
const wxString SCH_COMPONENT::GetRef( const SCH_SHEET_PATH* sheet )
|
||||||
{
|
{
|
||||||
wxString path = GetPath( aSheet );
|
wxString path = GetPath( sheet );
|
||||||
wxString h_path, h_ref;
|
wxString h_path, h_ref;
|
||||||
wxStringTokenizer tokenizer;
|
wxStringTokenizer tokenizer;
|
||||||
wxString separators( wxT( " " ) );
|
wxString separators( wxT( " " ) );
|
||||||
|
@ -473,7 +473,7 @@ const wxString SCH_COMPONENT::GetRef( const SCH_SHEET* aSheet )
|
||||||
// all have the same component references, but perhaps this is best.
|
// all have the same component references, but perhaps this is best.
|
||||||
if( !GetField( REFERENCE )->GetText().IsEmpty() )
|
if( !GetField( REFERENCE )->GetText().IsEmpty() )
|
||||||
{
|
{
|
||||||
SetRef( aSheet, GetField( REFERENCE )->GetText() );
|
SetRef( sheet, GetField( REFERENCE )->GetText() );
|
||||||
return GetField( REFERENCE )->GetText();
|
return GetField( REFERENCE )->GetText();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -481,6 +481,12 @@ const wxString SCH_COMPONENT::GetRef( const SCH_SHEET* aSheet )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Function IsReferenceStringValid (static function)
|
||||||
|
* Tests for an acceptable reference string
|
||||||
|
* An acceptable reference string must support unannotation
|
||||||
|
* i.e starts by letter
|
||||||
|
* returns true if OK
|
||||||
|
*/
|
||||||
bool SCH_COMPONENT::IsReferenceStringValid( const wxString& aReferenceString )
|
bool SCH_COMPONENT::IsReferenceStringValid( const wxString& aReferenceString )
|
||||||
{
|
{
|
||||||
wxString text = aReferenceString;
|
wxString text = aReferenceString;
|
||||||
|
@ -500,9 +506,9 @@ bool SCH_COMPONENT::IsReferenceStringValid( const wxString& aReferenceString )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SCH_COMPONENT::SetRef( const SCH_SHEET* aSheet, const wxString& ref )
|
void SCH_COMPONENT::SetRef( const SCH_SHEET_PATH* sheet, const wxString& ref )
|
||||||
{
|
{
|
||||||
wxString path = GetPath( aSheet );
|
wxString path = GetPath( sheet );
|
||||||
|
|
||||||
bool notInArray = true;
|
bool notInArray = true;
|
||||||
|
|
||||||
|
@ -578,7 +584,7 @@ void SCH_COMPONENT::SetTimeStamp( time_t aNewTimeStamp )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int SCH_COMPONENT::GetUnitSelection( SCH_SHEET* aSheet )
|
int SCH_COMPONENT::GetUnitSelection( SCH_SHEET_PATH* aSheet )
|
||||||
{
|
{
|
||||||
wxString path = GetPath( aSheet );
|
wxString path = GetPath( aSheet );
|
||||||
wxString h_path, h_multi;
|
wxString h_path, h_multi;
|
||||||
|
@ -606,7 +612,7 @@ int SCH_COMPONENT::GetUnitSelection( SCH_SHEET* aSheet )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SCH_COMPONENT::SetUnitSelection( SCH_SHEET* aSheet, int aUnitSelection )
|
void SCH_COMPONENT::SetUnitSelection( SCH_SHEET_PATH* aSheet, int aUnitSelection )
|
||||||
{
|
{
|
||||||
wxString path = GetPath( aSheet );
|
wxString path = GetPath( aSheet );
|
||||||
|
|
||||||
|
@ -745,7 +751,7 @@ void SCH_COMPONENT::SwapData( SCH_ITEM* aItem )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SCH_COMPONENT::ClearAnnotation( SCH_SHEET* aSheet )
|
void SCH_COMPONENT::ClearAnnotation( SCH_SHEET_PATH* aSheetPath )
|
||||||
{
|
{
|
||||||
bool keepMulti = false;
|
bool keepMulti = false;
|
||||||
wxArrayString reference_fields;
|
wxArrayString reference_fields;
|
||||||
|
@ -768,7 +774,7 @@ void SCH_COMPONENT::ClearAnnotation( SCH_SHEET* aSheet )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // This is a malformed reference: reinit this reference
|
{ // This is a malformed reference: reinit this reference
|
||||||
m_prefix = defRef = wxT( "U" ); // Set to default ref prefix
|
m_prefix = defRef = wxT("U"); // Set to default ref prefix
|
||||||
}
|
}
|
||||||
|
|
||||||
defRef.Append( wxT( "?" ) );
|
defRef.Append( wxT( "?" ) );
|
||||||
|
@ -777,22 +783,22 @@ void SCH_COMPONENT::ClearAnnotation( SCH_SHEET* aSheet )
|
||||||
|
|
||||||
// For components with units locked,
|
// For components with units locked,
|
||||||
// we cannot remove all annotations: part selection must be kept
|
// we cannot remove all annotations: part selection must be kept
|
||||||
// For all components: if aSheet is not NULL,
|
// For all components: if aSheetPath is not NULL,
|
||||||
// remove annotation only for the given path
|
// remove annotation only for the given path
|
||||||
if( keepMulti || aSheet )
|
if( keepMulti || aSheetPath )
|
||||||
{
|
{
|
||||||
wxString NewHref;
|
wxString NewHref;
|
||||||
wxString path;
|
wxString path;
|
||||||
|
|
||||||
if( aSheet )
|
if( aSheetPath )
|
||||||
path = GetPath( aSheet );
|
path = GetPath( aSheetPath );
|
||||||
|
|
||||||
for( unsigned int ii = 0; ii < m_PathsAndReferences.GetCount(); ii++ )
|
for( unsigned int ii = 0; ii < m_PathsAndReferences.GetCount(); ii++ )
|
||||||
{
|
{
|
||||||
// Break hierarchical reference in path, ref and multi selection:
|
// Break hierarchical reference in path, ref and multi selection:
|
||||||
reference_fields = wxStringTokenize( m_PathsAndReferences[ii], separators );
|
reference_fields = wxStringTokenize( m_PathsAndReferences[ii], separators );
|
||||||
|
|
||||||
if( aSheet == NULL || reference_fields[0].Cmp( path ) == 0 )
|
if( aSheetPath == NULL || reference_fields[0].Cmp( path ) == 0 )
|
||||||
{
|
{
|
||||||
if( keepMulti ) // Get and keep part selection
|
if( keepMulti ) // Get and keep part selection
|
||||||
multi = reference_fields[2];
|
multi = reference_fields[2];
|
||||||
|
@ -1528,8 +1534,9 @@ void SCH_COMPONENT::GetMsgPanelInfo( MSG_PANEL_ITEMS& aList )
|
||||||
if( !alias )
|
if( !alias )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( m_currentSheet )
|
if( m_currentSheetPath )
|
||||||
aList.push_back( MSG_PANEL_ITEM( _( "Reference" ), GetRef( m_currentSheet ),
|
aList.push_back( MSG_PANEL_ITEM( _( "Reference" ),
|
||||||
|
GetRef( m_currentSheetPath ),
|
||||||
DARKCYAN ) );
|
DARKCYAN ) );
|
||||||
|
|
||||||
wxString msg = part->IsPower() ? _( "Power symbol" ) : _( "Value" );
|
wxString msg = part->IsPower() ? _( "Power symbol" ) : _( "Value" );
|
||||||
|
@ -1879,7 +1886,7 @@ void SCH_COMPONENT::GetNetListItem( NETLIST_OBJECT_LIST& aNetListItems,
|
||||||
{
|
{
|
||||||
wxASSERT( pin->Type() == LIB_PIN_T );
|
wxASSERT( pin->Type() == LIB_PIN_T );
|
||||||
|
|
||||||
if( pin->GetUnit() && ( pin->GetUnit() != GetUnitSelection( aSheetPath->Last() ) ) )
|
if( pin->GetUnit() && ( pin->GetUnit() != GetUnitSelection( aSheetPath ) ) )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( pin->GetConvert() && ( pin->GetConvert() != GetConvert() ) )
|
if( pin->GetConvert() && ( pin->GetConvert() != GetConvert() ) )
|
||||||
|
|
|
@ -89,12 +89,12 @@ private:
|
||||||
AUTOPLACED m_fieldsAutoplaced; ///< indicates status of field autoplacement
|
AUTOPLACED m_fieldsAutoplaced; ///< indicates status of field autoplacement
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A temporary sheet is required to generate the correct reference designator string
|
* A temporary sheet path is required to generate the correct reference designator string
|
||||||
* in complex heirarchies. Hopefully this is only a temporary hack to decouple schematic
|
* in complex heirarchies. Hopefully this is only a temporary hack to decouple schematic
|
||||||
* objects from the drawing window until a better design for handling complex heirarchies
|
* objects from the drawing window until a better design for handling complex heirarchies
|
||||||
* can be implemented.
|
* can be implemented.
|
||||||
*/
|
*/
|
||||||
const SCH_SHEET* m_currentSheet;
|
const SCH_SHEET_PATH* m_currentSheetPath;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines the hierarchical path and reference of the component. This allows support
|
* Defines the hierarchical path and reference of the component. This allows support
|
||||||
|
@ -121,7 +121,7 @@ public:
|
||||||
* @param pos - Position to place new component.
|
* @param pos - Position to place new component.
|
||||||
* @param setNewItemFlag - Set the component IS_NEW and IS_MOVED flags.
|
* @param setNewItemFlag - Set the component IS_NEW and IS_MOVED flags.
|
||||||
*/
|
*/
|
||||||
SCH_COMPONENT( LIB_PART& aPart, SCH_SHEET* aSheet,
|
SCH_COMPONENT( LIB_PART& aPart, SCH_SHEET_PATH* aSheet,
|
||||||
int unit = 0, int convert = 0,
|
int unit = 0, int convert = 0,
|
||||||
const wxPoint& pos = wxPoint( 0, 0 ),
|
const wxPoint& pos = wxPoint( 0, 0 ),
|
||||||
bool setNewItemFlag = false );
|
bool setNewItemFlag = false );
|
||||||
|
@ -244,10 +244,10 @@ public:
|
||||||
/**
|
/**
|
||||||
* Function ClearAnnotation
|
* Function ClearAnnotation
|
||||||
* clears exiting component annotation ( i.i IC23 changed to IC? and part reset to 1)
|
* clears exiting component annotation ( i.i IC23 changed to IC? and part reset to 1)
|
||||||
* @param aSheet: SCH_SHEET value: if NULL remove all annotations,
|
* @param aSheetPath: SCH_SHEET_PATH value: if NULL remove all annotations,
|
||||||
* else remove annotation relative to \a aSheet.
|
* else remove annotation relative to this sheetpath
|
||||||
*/
|
*/
|
||||||
void ClearAnnotation( SCH_SHEET* aSheet );
|
void ClearAnnotation( SCH_SHEET_PATH* aSheetPath );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function SetTimeStamp
|
* Function SetTimeStamp
|
||||||
|
@ -391,8 +391,8 @@ public:
|
||||||
|
|
||||||
void SwapData( SCH_ITEM* aItem );
|
void SwapData( SCH_ITEM* aItem );
|
||||||
|
|
||||||
// returns a unique ID, in the form of a path determined by \a aSheet.
|
// returns a unique ID, in the form of a path.
|
||||||
wxString GetPath( const SCH_SHEET* sheet ) const;
|
wxString GetPath( const SCH_SHEET_PATH* sheet ) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function IsReferenceStringValid (static)
|
* Function IsReferenceStringValid (static)
|
||||||
|
@ -404,21 +404,21 @@ public:
|
||||||
*/
|
*/
|
||||||
static bool IsReferenceStringValid( const wxString& aReferenceString );
|
static bool IsReferenceStringValid( const wxString& aReferenceString );
|
||||||
|
|
||||||
void SetCurrentSheet( const SCH_SHEET* aSheet )
|
void SetCurrentSheetPath( const SCH_SHEET_PATH* aSheetPath )
|
||||||
{
|
{
|
||||||
m_currentSheet = aSheet;
|
m_currentSheetPath = aSheetPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function GetRef
|
* Function GetRef
|
||||||
* returns the reference, for the given sheet path.
|
* returns the reference, for the given sheet path.
|
||||||
*/
|
*/
|
||||||
const wxString GetRef( const SCH_SHEET* sheet );
|
const wxString GetRef( const SCH_SHEET_PATH* sheet );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the reference, for the given sheet path.
|
* Set the reference, for the given sheet path.
|
||||||
*/
|
*/
|
||||||
void SetRef( const SCH_SHEET* aSheet, const wxString& ref );
|
void SetRef( const SCH_SHEET_PATH* sheet, const wxString& ref );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function AddHierarchicalReference
|
* Function AddHierarchicalReference
|
||||||
|
@ -432,11 +432,11 @@ public:
|
||||||
const wxString& aRef,
|
const wxString& aRef,
|
||||||
int aMulti );
|
int aMulti );
|
||||||
|
|
||||||
// returns the unit selection, for the given sheet.
|
// returns the unit selection, for the given sheet path.
|
||||||
int GetUnitSelection( SCH_SHEET* aSheet );
|
int GetUnitSelection( SCH_SHEET_PATH* aSheet );
|
||||||
|
|
||||||
// Set the unit selection, for the given sheet.
|
// Set the unit selection, for the given sheet path.
|
||||||
void SetUnitSelection( SCH_SHEET* aSheet, int aUnitSelection );
|
void SetUnitSelection( SCH_SHEET_PATH* aSheet, int aUnitSelection );
|
||||||
|
|
||||||
// Geometric transforms (used in block operations):
|
// Geometric transforms (used in block operations):
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,6 @@
|
||||||
#include <class_library.h>
|
#include <class_library.h>
|
||||||
#include <sch_component.h>
|
#include <sch_component.h>
|
||||||
#include <sch_field.h>
|
#include <sch_field.h>
|
||||||
#include <sch_sheet_path.h>
|
|
||||||
#include <kicad_string.h>
|
#include <kicad_string.h>
|
||||||
|
|
||||||
|
|
||||||
|
@ -402,7 +401,7 @@ bool SCH_FIELD::Matches( wxFindReplaceData& aSearchData, void* aAuxData, wxPoint
|
||||||
wxCHECK_MSG( component != NULL, false,
|
wxCHECK_MSG( component != NULL, false,
|
||||||
wxT( "No component associated with field" ) + text );
|
wxT( "No component associated with field" ) + text );
|
||||||
|
|
||||||
text = component->GetRef( ((SCH_SHEET_PATH*) aAuxData)->Last() );
|
text = component->GetRef( (SCH_SHEET_PATH*) aAuxData );
|
||||||
|
|
||||||
if( component->GetUnitCount() > 1 )
|
if( component->GetUnitCount() > 1 )
|
||||||
text << LIB_PART::SubReference( component->GetUnit() );
|
text << LIB_PART::SubReference( component->GetUnit() );
|
||||||
|
@ -440,7 +439,7 @@ bool SCH_FIELD::Replace( wxFindReplaceData& aSearchData, void* aAuxData )
|
||||||
wxCHECK_MSG( component != NULL, false,
|
wxCHECK_MSG( component != NULL, false,
|
||||||
wxT( "No component associated with field" ) + text );
|
wxT( "No component associated with field" ) + text );
|
||||||
|
|
||||||
text = component->GetRef( ((SCH_SHEET_PATH*) aAuxData)->Last() );
|
text = component->GetRef( (SCH_SHEET_PATH*) aAuxData );
|
||||||
|
|
||||||
// if( component->GetUnitCount() > 1 )
|
// if( component->GetUnitCount() > 1 )
|
||||||
// text << LIB_PART::SubReference( component->GetUnit() );
|
// text << LIB_PART::SubReference( component->GetUnit() );
|
||||||
|
@ -448,7 +447,7 @@ bool SCH_FIELD::Replace( wxFindReplaceData& aSearchData, void* aAuxData )
|
||||||
isReplaced = EDA_ITEM::Replace( aSearchData, text );
|
isReplaced = EDA_ITEM::Replace( aSearchData, text );
|
||||||
|
|
||||||
if( isReplaced )
|
if( isReplaced )
|
||||||
component->SetRef( ((SCH_SHEET_PATH*) aAuxData)->Last(), text );
|
component->SetRef( (SCH_SHEET_PATH*) aAuxData, text );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 1992-2011 jean-pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
|
* Copyright (C) 1992-2011 jean-pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
|
||||||
* Copyright (C) 1992-2015 Wayne Stambaugh <stambaughw@verizon.net>
|
* Copyright (C) 1992-2011 Wayne Stambaugh <stambaughw@verizon.net>
|
||||||
* Copyright (C) 1992-2015 KiCad Developers, see authors.txt for contributors.
|
* Copyright (C) 1992-2015 KiCad Developers, see authors.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
|
@ -35,16 +35,15 @@
|
||||||
#include <macros.h>
|
#include <macros.h>
|
||||||
|
|
||||||
#include <class_libentry.h>
|
#include <class_libentry.h>
|
||||||
|
#include <sch_sheet_path.h>
|
||||||
|
#include <sch_component.h>
|
||||||
#include <sch_text.h>
|
#include <sch_text.h>
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
|
class SCH_REFERENCE;
|
||||||
class SCH_SHEET;
|
|
||||||
class SCH_COMPONENT;
|
|
||||||
class SCH_REFERENCE_LIST;
|
class SCH_REFERENCE_LIST;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class SCH_REFERENCE
|
* Class SCH_REFERENCE
|
||||||
* is used as a helper to define a component's reference designator in a schematic. This
|
* is used as a helper to define a component's reference designator in a schematic. This
|
||||||
|
@ -63,11 +62,11 @@ class SCH_REFERENCE
|
||||||
///< used to annotate by X or Y position
|
///< used to annotate by X or Y position
|
||||||
int m_Unit; ///< The unit number for components with multiple parts
|
int m_Unit; ///< The unit number for components with multiple parts
|
||||||
///< per package.
|
///< per package.
|
||||||
SCH_SHEET* m_Sheet; ///< The sheet for this reference.
|
SCH_SHEET_PATH m_SheetPath; ///< The sheet path for this reference.
|
||||||
bool m_IsNew; ///< True if not yet annotated.
|
bool m_IsNew; ///< True if not yet annotated.
|
||||||
int m_SheetNum; ///< The sheet number for the reference.
|
int m_SheetNum; ///< The sheet number for the reference.
|
||||||
time_t m_TimeStamp; ///< The time stamp for the reference.
|
time_t m_TimeStamp; ///< The time stamp for the reference.
|
||||||
EDA_TEXT* m_Value; ///< The component value of the reference. It is the
|
EDA_TEXT* m_Value; ///< The component value of the refernce. It is the
|
||||||
///< same for all instances.
|
///< same for all instances.
|
||||||
int m_NumRef; ///< The numeric part of the reference designator.
|
int m_NumRef; ///< The numeric part of the reference designator.
|
||||||
int m_Flag;
|
int m_Flag;
|
||||||
|
@ -78,7 +77,7 @@ class SCH_REFERENCE
|
||||||
public:
|
public:
|
||||||
|
|
||||||
SCH_REFERENCE() :
|
SCH_REFERENCE() :
|
||||||
m_Sheet()
|
m_SheetPath()
|
||||||
{
|
{
|
||||||
m_RootCmp = NULL;
|
m_RootCmp = NULL;
|
||||||
m_Entry = NULL;
|
m_Entry = NULL;
|
||||||
|
@ -91,13 +90,14 @@ public:
|
||||||
m_SheetNum = 0;
|
m_SheetNum = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SCH_REFERENCE( SCH_COMPONENT* aComponent, LIB_PART* aLibComponent, SCH_SHEET* aSheet );
|
SCH_REFERENCE( SCH_COMPONENT* aComponent, LIB_PART* aLibComponent,
|
||||||
|
SCH_SHEET_PATH& aSheetPath );
|
||||||
|
|
||||||
SCH_COMPONENT* GetComp() const { return m_RootCmp; }
|
SCH_COMPONENT* GetComp() const { return m_RootCmp; }
|
||||||
|
|
||||||
LIB_PART* GetLibComponent() const { return m_Entry; }
|
LIB_PART* GetLibComponent() const { return m_Entry; }
|
||||||
|
|
||||||
SCH_SHEET* GetSheet() const { return m_Sheet; }
|
SCH_SHEET_PATH GetSheetPath() const { return m_SheetPath; }
|
||||||
|
|
||||||
int GetUnit() const { return m_Unit; }
|
int GetUnit() const { return m_Unit; }
|
||||||
|
|
||||||
|
@ -131,12 +131,10 @@ public:
|
||||||
{
|
{
|
||||||
return m_Ref;
|
return m_Ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetRefStr( const std::string& aReference )
|
void SetRefStr( const std::string& aReference )
|
||||||
{
|
{
|
||||||
m_Ref = aReference;
|
m_Ref = aReference;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* GetRefStr() const
|
const char* GetRefStr() const
|
||||||
{
|
{
|
||||||
return m_Ref.c_str();
|
return m_Ref.c_str();
|
||||||
|
@ -152,16 +150,25 @@ 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() && GetSheetPath().Path() == other.GetSheetPath().Path();
|
||||||
|
}
|
||||||
|
|
||||||
bool IsUnitsLocked() const;
|
bool IsUnitsLocked()
|
||||||
|
{
|
||||||
|
return m_Entry->UnitsLocked();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -289,8 +296,7 @@ public:
|
||||||
* referenced U201 to U351, and items in sheet 3 start from U352
|
* referenced U201 to U351, and items in sheet 3 start from U352
|
||||||
* </p>
|
* </p>
|
||||||
*/
|
*/
|
||||||
void Annotate( bool aUseSheetNum, int aSheetIntervalId,
|
void Annotate( bool aUseSheetNum, int aSheetIntervalId, SCH_MULTI_UNIT_REFERENCE_MAP aLockedUnitMap );
|
||||||
std::map<wxString, SCH_REFERENCE_LIST>& aLockedUnitMap );
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function CheckAnnotation
|
* Function CheckAnnotation
|
||||||
|
@ -460,12 +466,4 @@ private:
|
||||||
int CreateFirstFreeRefId( std::vector<int>& aIdList, int aFirstValue );
|
int CreateFirstFreeRefId( std::vector<int>& aIdList, int aFirstValue );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Type SCH_MULTI_UNIT_REFERENCE_MAP
|
|
||||||
* is used to create a map of reference designators for multi-unit parts.
|
|
||||||
*/
|
|
||||||
typedef std::map<wxString, SCH_REFERENCE_LIST> SCH_MULTI_UNIT_REFERENCE_MAP;
|
|
||||||
|
|
||||||
|
|
||||||
#endif // _SCH_REFERENCE_LIST_H_
|
#endif // _SCH_REFERENCE_LIST_H_
|
||||||
|
|
|
@ -755,7 +755,7 @@ int SCH_SCREEN::CountConnectedItems( const wxPoint& aPos, bool aTestJunctions )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SCH_SCREEN::ClearAnnotation( SCH_SHEET* aSheet )
|
void SCH_SCREEN::ClearAnnotation( SCH_SHEET_PATH* aSheetPath )
|
||||||
{
|
{
|
||||||
for( SCH_ITEM* item = m_drawList.begin(); item; item = item->Next() )
|
for( SCH_ITEM* item = m_drawList.begin(); item; item = item->Next() )
|
||||||
{
|
{
|
||||||
|
@ -763,7 +763,7 @@ void SCH_SCREEN::ClearAnnotation( SCH_SHEET* aSheet )
|
||||||
{
|
{
|
||||||
SCH_COMPONENT* component = (SCH_COMPONENT*) item;
|
SCH_COMPONENT* component = (SCH_COMPONENT*) item;
|
||||||
|
|
||||||
component->ClearAnnotation( aSheet );
|
component->ClearAnnotation( aSheetPath );
|
||||||
|
|
||||||
// Clear the modified component flag set by component->ClearAnnotation
|
// Clear the modified component flag set by component->ClearAnnotation
|
||||||
// because we do not use it here and we should not leave this flag set,
|
// because we do not use it here and we should not leave this flag set,
|
||||||
|
@ -1103,7 +1103,7 @@ SCH_TEXT* SCH_SCREEN::GetLabel( const wxPoint& aPosition, int aAccuracy )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool SCH_SCREEN::SetComponentFootprint( SCH_SHEET* aSheet, const wxString& aReference,
|
bool SCH_SCREEN::SetComponentFootprint( SCH_SHEET_PATH* aSheetPath, const wxString& aReference,
|
||||||
const wxString& aFootPrint, bool aSetVisible )
|
const wxString& aFootPrint, bool aSetVisible )
|
||||||
{
|
{
|
||||||
SCH_COMPONENT* component;
|
SCH_COMPONENT* component;
|
||||||
|
@ -1116,7 +1116,7 @@ bool SCH_SCREEN::SetComponentFootprint( SCH_SHEET* aSheet, const wxString& aRefe
|
||||||
|
|
||||||
component = (SCH_COMPONENT*) item;
|
component = (SCH_COMPONENT*) item;
|
||||||
|
|
||||||
if( aReference.CmpNoCase( component->GetRef( aSheet ) ) == 0 )
|
if( aReference.CmpNoCase( component->GetRef( aSheetPath ) ) == 0 )
|
||||||
{
|
{
|
||||||
// Found: Init Footprint Field
|
// Found: Init Footprint Field
|
||||||
|
|
||||||
|
@ -1125,7 +1125,6 @@ bool SCH_SCREEN::SetComponentFootprint( SCH_SHEET* aSheet, const wxString& aRefe
|
||||||
* it is probably not yet initialized
|
* it is probably not yet initialized
|
||||||
*/
|
*/
|
||||||
SCH_FIELD * fpfield = component->GetField( FOOTPRINT );
|
SCH_FIELD * fpfield = component->GetField( FOOTPRINT );
|
||||||
|
|
||||||
if( fpfield->GetText().IsEmpty()
|
if( fpfield->GetText().IsEmpty()
|
||||||
&& ( fpfield->GetTextPosition() == component->GetPosition() ) )
|
&& ( fpfield->GetTextPosition() == component->GetPosition() ) )
|
||||||
{
|
{
|
||||||
|
@ -1432,6 +1431,13 @@ void SCH_SCREENS::BuildScreenList( EDA_ITEM* aItem )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCH_SCREENS::ClearAnnotation()
|
||||||
|
{
|
||||||
|
for( size_t i = 0; i < m_screens.size(); i++ )
|
||||||
|
m_screens[i]->ClearAnnotation( NULL );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void SCH_SCREENS::SchematicCleanUp()
|
void SCH_SCREENS::SchematicCleanUp()
|
||||||
{
|
{
|
||||||
for( size_t i = 0; i < m_screens.size(); i++ )
|
for( size_t i = 0; i < m_screens.size(); i++ )
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
* Copyright (C) 2009 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
||||||
* Copyright (C) 1992-2015 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 1992-2011 Kicad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
@ -37,7 +37,6 @@
|
||||||
#include <kicad_string.h>
|
#include <kicad_string.h>
|
||||||
#include <msgpanel.h>
|
#include <msgpanel.h>
|
||||||
|
|
||||||
#include <class_library.h>
|
|
||||||
#include <sch_sheet.h>
|
#include <sch_sheet.h>
|
||||||
#include <sch_sheet_path.h>
|
#include <sch_sheet_path.h>
|
||||||
#include <sch_component.h>
|
#include <sch_component.h>
|
||||||
|
@ -56,7 +55,6 @@ SCH_SHEET::SCH_SHEET( const wxPoint& pos ) :
|
||||||
m_screen = NULL;
|
m_screen = NULL;
|
||||||
m_name.Printf( wxT( "Sheet%8.8lX" ), (long) m_TimeStamp );
|
m_name.Printf( wxT( "Sheet%8.8lX" ), (long) m_TimeStamp );
|
||||||
m_fileName.Printf( wxT( "file%8.8lX.sch" ), (long) m_TimeStamp );
|
m_fileName.Printf( wxT( "file%8.8lX.sch" ), (long) m_TimeStamp );
|
||||||
m_number = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -73,7 +71,6 @@ SCH_SHEET::SCH_SHEET( const SCH_SHEET& aSheet ) :
|
||||||
m_name = aSheet.m_name;
|
m_name = aSheet.m_name;
|
||||||
m_fileName = aSheet.m_fileName;
|
m_fileName = aSheet.m_fileName;
|
||||||
m_pins = aSheet.m_pins;
|
m_pins = aSheet.m_pins;
|
||||||
m_number = aSheet.m_number;
|
|
||||||
|
|
||||||
for( size_t i = 0; i < m_pins.size(); i++ )
|
for( size_t i = 0; i < m_pins.size(); i++ )
|
||||||
m_pins[i].SetParent( this );
|
m_pins[i].SetParent( this );
|
||||||
|
@ -207,7 +204,7 @@ bool SCH_SHEET::Load( LINE_READER& aLine, wxString& aErrorMsg )
|
||||||
&m_pos.x, &m_pos.y, &m_size.x, &m_size.y ) != 4 )
|
&m_pos.x, &m_pos.y, &m_size.x, &m_size.y ) != 4 )
|
||||||
|| ( ((char*)aLine)[0] != 'S' ) )
|
|| ( ((char*)aLine)[0] != 'S' ) )
|
||||||
{
|
{
|
||||||
aErrorMsg.Printf( wxT( " ** Eeschema file sheet error at line %d, aborted\n" ),
|
aErrorMsg.Printf( wxT( " ** Eeschema file sheet struct error at line %d, aborted\n" ),
|
||||||
aLine.LineNumber() );
|
aLine.LineNumber() );
|
||||||
|
|
||||||
aErrorMsg << FROM_UTF8( ((char*)aLine) );
|
aErrorMsg << FROM_UTF8( ((char*)aLine) );
|
||||||
|
@ -223,10 +220,8 @@ bool SCH_SHEET::Load( LINE_READER& aLine, wxString& aErrorMsg )
|
||||||
if( ((char*)aLine)[0] == 'U' )
|
if( ((char*)aLine)[0] == 'U' )
|
||||||
{
|
{
|
||||||
sscanf( ((char*)aLine) + 1, "%lX", &m_TimeStamp );
|
sscanf( ((char*)aLine) + 1, "%lX", &m_TimeStamp );
|
||||||
|
|
||||||
if( m_TimeStamp == 0 ) // zero is not unique!
|
if( m_TimeStamp == 0 ) // zero is not unique!
|
||||||
SetTimeStamp( GetNewTimeStamp() );
|
SetTimeStamp( GetNewTimeStamp() );
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -306,7 +301,7 @@ bool SCH_SHEET::Load( LINE_READER& aLine, wxString& aErrorMsg )
|
||||||
|
|
||||||
if( strnicmp( "$End", ((char*)aLine), 4 ) != 0 )
|
if( strnicmp( "$End", ((char*)aLine), 4 ) != 0 )
|
||||||
{
|
{
|
||||||
aErrorMsg.Printf( wxT( "**Eeschema file end_sheet error at line %d, aborted\n" ),
|
aErrorMsg.Printf( wxT( "**Eeschema file end_sheet struct error at line %d, aborted\n" ),
|
||||||
aLine.LineNumber() );
|
aLine.LineNumber() );
|
||||||
aErrorMsg << FROM_UTF8( ((char*)aLine) );
|
aErrorMsg << FROM_UTF8( ((char*)aLine) );
|
||||||
return false;
|
return false;
|
||||||
|
@ -479,6 +474,9 @@ int SCH_SHEET::GetMinHeight() const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete sheet labels which do not have corresponding hierarchical label.
|
||||||
|
*/
|
||||||
void SCH_SHEET::CleanupSheet()
|
void SCH_SHEET::CleanupSheet()
|
||||||
{
|
{
|
||||||
SCH_SHEET_PINS::iterator i = m_pins.begin();
|
SCH_SHEET_PINS::iterator i = m_pins.begin();
|
||||||
|
@ -723,15 +721,44 @@ bool SCH_SHEET::SearchHierarchy( const wxString& aFilename, SCH_SCREEN** aScreen
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool SCH_SHEET::LocatePathOfScreen( SCH_SCREEN* aScreen, SCH_SHEET_PATH* aList )
|
||||||
|
{
|
||||||
|
if( m_screen )
|
||||||
|
{
|
||||||
|
aList->Push( this );
|
||||||
|
|
||||||
|
if( m_screen == aScreen )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
EDA_ITEM* strct = m_screen->GetDrawItems();
|
||||||
|
|
||||||
|
while( strct )
|
||||||
|
{
|
||||||
|
if( strct->Type() == SCH_SHEET_T )
|
||||||
|
{
|
||||||
|
SCH_SHEET* ss = (SCH_SHEET*) strct;
|
||||||
|
|
||||||
|
if( ss->LocatePathOfScreen( aScreen, aList ) )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
strct = strct->Next();
|
||||||
|
}
|
||||||
|
|
||||||
|
aList->Pop();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool SCH_SHEET::Load( SCH_EDIT_FRAME* aFrame )
|
bool SCH_SHEET::Load( SCH_EDIT_FRAME* aFrame )
|
||||||
{
|
{
|
||||||
bool success = true;
|
bool success = true;
|
||||||
|
|
||||||
SCH_SCREEN* screen = NULL;
|
SCH_SCREEN* screen = NULL;
|
||||||
|
|
||||||
if( !m_screen )
|
if( !m_screen )
|
||||||
{
|
{
|
||||||
GetRootSheet()->SearchHierarchy( m_fileName, &screen );
|
g_RootSheet->SearchHierarchy( m_fileName, &screen );
|
||||||
|
|
||||||
if( screen )
|
if( screen )
|
||||||
{
|
{
|
||||||
|
@ -755,11 +782,6 @@ bool SCH_SHEET::Load( SCH_EDIT_FRAME* aFrame )
|
||||||
{
|
{
|
||||||
SCH_SHEET* sheetstruct = (SCH_SHEET*) bs;
|
SCH_SHEET* sheetstruct = (SCH_SHEET*) bs;
|
||||||
|
|
||||||
// Set the parent to this sheet. This effectively creates the
|
|
||||||
// schematic sheet hierarchy eliminating the need to keep a
|
|
||||||
// copy of the root sheet in order to generate the hierarchy.
|
|
||||||
sheetstruct->SetParent( this );
|
|
||||||
|
|
||||||
if( !sheetstruct->Load( aFrame ) )
|
if( !sheetstruct->Load( aFrame ) )
|
||||||
success = false;
|
success = false;
|
||||||
}
|
}
|
||||||
|
@ -791,7 +813,6 @@ int SCH_SHEET::CountSheets()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -806,15 +827,11 @@ void SCH_SHEET::GetMsgPanelInfo( MSG_PANEL_ITEMS& aList )
|
||||||
{
|
{
|
||||||
aList.push_back( MSG_PANEL_ITEM( _( "Sheet Name" ), m_name, CYAN ) );
|
aList.push_back( MSG_PANEL_ITEM( _( "Sheet Name" ), m_name, CYAN ) );
|
||||||
aList.push_back( MSG_PANEL_ITEM( _( "File Name" ), m_fileName, BROWN ) );
|
aList.push_back( MSG_PANEL_ITEM( _( "File Name" ), m_fileName, BROWN ) );
|
||||||
aList.push_back( MSG_PANEL_ITEM( _( "Path" ), GetHumanReadablePath(), DARKMAGENTA ) );
|
|
||||||
|
|
||||||
if( IsRootSheet() )
|
#if 0 // Set to 1 to display the sheet time stamp (mainly for test)
|
||||||
aList.push_back( MSG_PANEL_ITEM( _( "Hierarchy Type" ),
|
wxString msg;
|
||||||
IsComplexHierarchy() ? _( "Complex" ) : _( "Simple" ),
|
msg.Printf( wxT( "%.8X" ), m_TimeStamp );
|
||||||
GREEN ) );
|
aList.push_back( MSG_PANEL_ITEM( _( "Time Stamp" ), msg, BLUE ) );
|
||||||
|
|
||||||
#if 1 // Set to 1 to display the sheet time stamp (mainly for test)
|
|
||||||
aList.push_back( MSG_PANEL_ITEM( _( "Time Stamp" ), GetPath(), BLUE ) );
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1131,6 +1148,7 @@ void SCH_SHEET::Plot( PLOTTER* aPlotter )
|
||||||
Text = m_name;
|
Text = m_name;
|
||||||
size = wxSize( m_sheetNameSize, m_sheetNameSize );
|
size = wxSize( m_sheetNameSize, m_sheetNameSize );
|
||||||
|
|
||||||
|
//pos = m_pos; pos.y -= 4;
|
||||||
thickness = GetDefaultLineThickness();
|
thickness = GetDefaultLineThickness();
|
||||||
thickness = Clamp_Text_PenSize( thickness, size, false );
|
thickness = Clamp_Text_PenSize( thickness, size, false );
|
||||||
|
|
||||||
|
@ -1163,312 +1181,6 @@ void SCH_SHEET::Plot( PLOTTER* aPlotter )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SCH_SHEET::SetPageNumbers()
|
|
||||||
{
|
|
||||||
int pageNumber = 1;
|
|
||||||
std::vector< const SCH_SHEET* > sheets;
|
|
||||||
|
|
||||||
GetRootSheet()->GetSheets( sheets );
|
|
||||||
|
|
||||||
for( unsigned i = 0; i < sheets.size(); i++ )
|
|
||||||
{
|
|
||||||
const_cast< SCH_SHEET* >( sheets[i] )->m_number = pageNumber;
|
|
||||||
pageNumber += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
SCH_SHEET* SCH_SHEET::FindSheetByName( const wxString& aSheetName )
|
|
||||||
{
|
|
||||||
std::vector< const SCH_SHEET* > sheets;
|
|
||||||
|
|
||||||
GetSheets( sheets );
|
|
||||||
|
|
||||||
for( unsigned i = 0; i < sheets.size(); i++ )
|
|
||||||
{
|
|
||||||
if( sheets[i]->GetName().CmpNoCase( aSheetName ) == 0 )
|
|
||||||
return const_cast< SCH_SHEET* >( sheets[i] );
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
unsigned SCH_SHEET::GetSheets( std::vector< const SCH_SHEET* >& aSheetList,
|
|
||||||
bool aSortByPath ) const
|
|
||||||
{
|
|
||||||
// Sheet pointers must be unique.
|
|
||||||
wxASSERT( find( aSheetList.begin(), aSheetList.end(), this ) == aSheetList.end() );
|
|
||||||
|
|
||||||
aSheetList.push_back( this );
|
|
||||||
|
|
||||||
const SCH_ITEM* item = m_screen->GetDrawItems();
|
|
||||||
|
|
||||||
while( item )
|
|
||||||
{
|
|
||||||
if( item->Type() == SCH_SHEET_T )
|
|
||||||
( (SCH_SHEET*) item )->GetSheets( aSheetList );
|
|
||||||
|
|
||||||
item = item->Next();
|
|
||||||
}
|
|
||||||
|
|
||||||
if( aSortByPath )
|
|
||||||
std::sort( aSheetList.begin(), aSheetList.end(), SortByPath() );
|
|
||||||
|
|
||||||
return aSheetList.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void SCH_SHEET::GetSheetPaths( std::vector< std::vector< const SCH_SHEET* > >& aSheetPaths ) const
|
|
||||||
{
|
|
||||||
static std::vector< const SCH_SHEET* > path;
|
|
||||||
|
|
||||||
path.push_back( const_cast< SCH_SHEET* >( this ) );
|
|
||||||
aSheetPaths.push_back( path );
|
|
||||||
|
|
||||||
SCH_ITEM* item = m_screen->GetDrawItems();
|
|
||||||
|
|
||||||
while( item )
|
|
||||||
{
|
|
||||||
if( item->Type() == SCH_SHEET_T )
|
|
||||||
( (SCH_SHEET*) item )->GetSheetPaths( aSheetPaths );
|
|
||||||
|
|
||||||
item = item->Next();
|
|
||||||
}
|
|
||||||
|
|
||||||
path.pop_back();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const SCH_SHEET* SCH_SHEET::GetRootSheet() const
|
|
||||||
{
|
|
||||||
EDA_ITEM* parent = GetParent();
|
|
||||||
const SCH_SHEET* rootSheet = const_cast< SCH_SHEET* >( this );
|
|
||||||
|
|
||||||
while( parent )
|
|
||||||
{
|
|
||||||
// The parent of a SCH_SHEET object can only be another SCH_SHEET object or NULL.
|
|
||||||
wxASSERT_MSG( parent->Type() == SCH_SHEET_T, "SCH_SHEET parent is not a SCH_SHEET" );
|
|
||||||
rootSheet = static_cast<SCH_SHEET*>( parent );
|
|
||||||
parent = parent->GetParent();
|
|
||||||
}
|
|
||||||
|
|
||||||
return const_cast< SCH_SHEET* >( rootSheet );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void SCH_SHEET::GetPath( std::vector< const SCH_SHEET* >& aSheetPath ) const
|
|
||||||
{
|
|
||||||
aSheetPath.insert( aSheetPath.begin(), const_cast<SCH_SHEET*>( this ) );
|
|
||||||
|
|
||||||
if( GetParent() )
|
|
||||||
static_cast<SCH_SHEET*>( GetParent() )->GetPath( aSheetPath );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
wxString SCH_SHEET::GetPath() const
|
|
||||||
{
|
|
||||||
wxString tmp;
|
|
||||||
wxString path = "/";
|
|
||||||
const SCH_SHEET* sheet = this;
|
|
||||||
|
|
||||||
while( sheet->GetParent() )
|
|
||||||
{
|
|
||||||
tmp.Printf( "/%8.8lX", (long unsigned) sheet->GetTimeStamp() );
|
|
||||||
|
|
||||||
// We are walking up the parent stack so prepend each time stamp.
|
|
||||||
path = tmp + path;
|
|
||||||
sheet = static_cast<SCH_SHEET*>( sheet->GetParent() );
|
|
||||||
}
|
|
||||||
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
wxString SCH_SHEET::GetHumanReadablePath() const
|
|
||||||
{
|
|
||||||
wxString path = "/";
|
|
||||||
const SCH_SHEET* sheet = this;
|
|
||||||
|
|
||||||
while( sheet->GetParent() )
|
|
||||||
{
|
|
||||||
// We are walking up the parent stack so prepend each sheet name.
|
|
||||||
path = "/" + sheet->GetName() + path;
|
|
||||||
sheet = static_cast<SCH_SHEET*>( sheet->GetParent() );
|
|
||||||
}
|
|
||||||
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void SCH_SHEET::ClearAnnotation( bool aIncludeSubSheets )
|
|
||||||
{
|
|
||||||
m_screen->ClearAnnotation( this );
|
|
||||||
|
|
||||||
if( aIncludeSubSheets )
|
|
||||||
{
|
|
||||||
SCH_ITEM* item = m_screen->GetDrawItems();
|
|
||||||
|
|
||||||
while( item )
|
|
||||||
{
|
|
||||||
if( item->Type() == SCH_SHEET_T )
|
|
||||||
static_cast<SCH_SHEET*>( item )->ClearAnnotation( aIncludeSubSheets );
|
|
||||||
|
|
||||||
item = item->Next();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool SCH_SHEET::IsModified() const
|
|
||||||
{
|
|
||||||
if( m_screen->IsModify() )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
bool retv = false;
|
|
||||||
SCH_ITEM* item = m_screen->GetDrawItems();
|
|
||||||
|
|
||||||
while( item && !retv )
|
|
||||||
{
|
|
||||||
if( item->Type() == SCH_SHEET_T )
|
|
||||||
retv = static_cast<SCH_SHEET*>( item )->IsModified();
|
|
||||||
|
|
||||||
item = item->Next();
|
|
||||||
}
|
|
||||||
|
|
||||||
return retv;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool SCH_SHEET::IsAutoSaveRequired()
|
|
||||||
{
|
|
||||||
if( m_screen->IsModify() )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
bool retv = false;
|
|
||||||
SCH_ITEM* item = m_screen->GetDrawItems();
|
|
||||||
|
|
||||||
while( item && !retv )
|
|
||||||
{
|
|
||||||
if( item->Type() == SCH_SHEET_T )
|
|
||||||
{
|
|
||||||
SCH_SHEET* sheet = static_cast<SCH_SHEET*>( item );
|
|
||||||
|
|
||||||
if( sheet->m_screen )
|
|
||||||
retv = sheet->m_screen->IsSave();
|
|
||||||
}
|
|
||||||
|
|
||||||
item = item->Next();
|
|
||||||
}
|
|
||||||
|
|
||||||
return retv;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void SCH_SHEET::ClearModifyStatus()
|
|
||||||
{
|
|
||||||
m_screen->ClrModify();
|
|
||||||
|
|
||||||
SCH_ITEM* item = m_screen->GetDrawItems();
|
|
||||||
|
|
||||||
while( item )
|
|
||||||
{
|
|
||||||
if( item->Type() == SCH_SHEET_T )
|
|
||||||
static_cast<SCH_SHEET*>( item )->m_screen->ClrModify();
|
|
||||||
|
|
||||||
item = item->Next();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void SCH_SHEET::AnnotatePowerSymbols( PART_LIBS* aLibs, int* aReference )
|
|
||||||
{
|
|
||||||
int ref = 1;
|
|
||||||
|
|
||||||
if( aReference )
|
|
||||||
ref = *aReference;
|
|
||||||
|
|
||||||
for( EDA_ITEM* item = m_screen->GetDrawItems(); item; item = item->Next() )
|
|
||||||
{
|
|
||||||
if( item->Type() != SCH_COMPONENT_T )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
SCH_COMPONENT* component = (SCH_COMPONENT*) item;
|
|
||||||
LIB_PART* part = aLibs->FindLibPart( component->GetPartName() );
|
|
||||||
|
|
||||||
if( !part || !part->IsPower() )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
wxString refstr = component->GetPrefix();
|
|
||||||
|
|
||||||
//str will be "C?" or so after the ClearAnnotation call.
|
|
||||||
while( refstr.Last() == '?' )
|
|
||||||
refstr.RemoveLast();
|
|
||||||
|
|
||||||
if( !refstr.StartsWith( wxT( "#" ) ) )
|
|
||||||
refstr = wxT( "#" ) + refstr;
|
|
||||||
|
|
||||||
refstr << wxT( "0" ) << ref;
|
|
||||||
component->SetRef( this, refstr );
|
|
||||||
ref++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( aReference )
|
|
||||||
*aReference = ref;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void SCH_SHEET::UpdateAllScreenReferences()
|
|
||||||
{
|
|
||||||
EDA_ITEM* t = m_screen->GetDrawItems();
|
|
||||||
|
|
||||||
while( t )
|
|
||||||
{
|
|
||||||
if( t->Type() == SCH_COMPONENT_T )
|
|
||||||
{
|
|
||||||
SCH_COMPONENT* component = (SCH_COMPONENT*) t;
|
|
||||||
component->GetField( REFERENCE )->SetText( component->GetRef( this ) );
|
|
||||||
component->UpdateUnit( component->GetUnitSelection( this ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
t = t->Next();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void SCH_SHEET::GetComponents( PART_LIBS* aLibs, SCH_REFERENCE_LIST& aReferences,
|
|
||||||
bool aIncludePowerSymbols, bool aIncludeSubSheets )
|
|
||||||
{
|
|
||||||
for( SCH_ITEM* item = m_screen->GetDrawItems(); item; item = item->Next() )
|
|
||||||
{
|
|
||||||
if( item->Type() == SCH_SHEET_T && aIncludeSubSheets )
|
|
||||||
{
|
|
||||||
((SCH_SHEET*)item)->GetComponents( aLibs, aReferences, aIncludePowerSymbols,
|
|
||||||
aIncludeSubSheets );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( item->Type() == SCH_COMPONENT_T )
|
|
||||||
{
|
|
||||||
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 )
|
|
||||||
{
|
|
||||||
SCH_REFERENCE reference = SCH_REFERENCE( component, part, this );
|
|
||||||
reference.SetSheetNumber( m_number );
|
|
||||||
aReferences.AddItem( reference );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
SCH_ITEM& SCH_SHEET::operator=( const SCH_ITEM& aItem )
|
SCH_ITEM& SCH_SHEET::operator=( const SCH_ITEM& aItem )
|
||||||
{
|
{
|
||||||
wxLogDebug( wxT( "Sheet assignment operator." ) );
|
wxLogDebug( wxT( "Sheet assignment operator." ) );
|
||||||
|
@ -1502,221 +1214,6 @@ 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::IsComplexHierarchy() const
|
|
||||||
{
|
|
||||||
std::set<wxString> fileNames;
|
|
||||||
std::vector< const SCH_SHEET* > sheets;
|
|
||||||
|
|
||||||
unsigned count = GetSheets( sheets );
|
|
||||||
|
|
||||||
for( unsigned i = 0; i < count; i++ )
|
|
||||||
{
|
|
||||||
if( fileNames.find( sheets[i]->m_fileName ) != fileNames.end() )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
fileNames.insert( sheets[i]->m_fileName );
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
SCH_ITEM* SCH_SHEET::FindNextItem( KICAD_T aType, SCH_ITEM* aLastItem, bool aWrap ) const
|
|
||||||
{
|
|
||||||
wxCHECK( m_screen != NULL, NULL );
|
|
||||||
|
|
||||||
bool hasWrapped = false;
|
|
||||||
bool firstItemFound = false;
|
|
||||||
SCH_ITEM* drawItem = m_screen->GetDrawItems();
|
|
||||||
|
|
||||||
while( drawItem )
|
|
||||||
{
|
|
||||||
if( drawItem->Type() == aType )
|
|
||||||
{
|
|
||||||
if( !aLastItem || firstItemFound )
|
|
||||||
{
|
|
||||||
return drawItem;
|
|
||||||
}
|
|
||||||
else if( !firstItemFound && drawItem == aLastItem )
|
|
||||||
{
|
|
||||||
firstItemFound = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
drawItem = drawItem->Next();
|
|
||||||
|
|
||||||
if( !drawItem && aLastItem && aWrap && !hasWrapped )
|
|
||||||
{
|
|
||||||
hasWrapped = true;
|
|
||||||
drawItem = m_screen->GetDrawItems();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool SCH_SHEET::operator<( const SCH_SHEET& aRhs ) const
|
|
||||||
{
|
|
||||||
if( (*this - aRhs) < 0 )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int SCH_SHEET::operator-( const SCH_SHEET& aRhs ) const
|
|
||||||
{
|
|
||||||
// Don't waste time against comparing the same objects..
|
|
||||||
if( this == &aRhs )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
std::vector< const SCH_SHEET* > lhsPath, rhsPath;
|
|
||||||
|
|
||||||
GetPath( lhsPath );
|
|
||||||
aRhs.GetPath( rhsPath );
|
|
||||||
|
|
||||||
// Shorter paths are less than longer paths.
|
|
||||||
int retv = lhsPath.size() - rhsPath.size();
|
|
||||||
|
|
||||||
if( retv == 0 )
|
|
||||||
{
|
|
||||||
// Compare time stamps when path lengths are the same.
|
|
||||||
for( unsigned i = 0; i < lhsPath.size(); i++ )
|
|
||||||
{
|
|
||||||
retv = lhsPath[i]->GetTimeStamp() - rhsPath[i]->GetTimeStamp();
|
|
||||||
|
|
||||||
if( retv != 0 )
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return retv;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool SCH_SHEET::TestForRecursion( std::vector< std::vector< const SCH_SHEET* > >& aSrcSheetHierarchy,
|
|
||||||
const wxString& aDestFileName ) const
|
|
||||||
{
|
|
||||||
std::vector< std::vector< const SCH_SHEET* > > hierarchy;
|
|
||||||
wxFileName rootFn = GetRootSheet()->GetFileName();
|
|
||||||
wxFileName destFn = aDestFileName;
|
|
||||||
|
|
||||||
if( destFn.IsRelative() )
|
|
||||||
destFn.MakeAbsolute( rootFn.GetPath() );
|
|
||||||
|
|
||||||
GetRootSheet()->GetSheetPaths( hierarchy );
|
|
||||||
|
|
||||||
// Test each SCH_SHEET_PATH in this SCH_SHEET_LIST for potential recursion.
|
|
||||||
for( unsigned i = 0; i < hierarchy.size(); i++ )
|
|
||||||
{
|
|
||||||
// Test each SCH_SHEET_PATH in the source sheet.
|
|
||||||
for( unsigned j = 0; j < aSrcSheetHierarchy.size(); j++ )
|
|
||||||
{
|
|
||||||
std::vector< const SCH_SHEET* > sheetPath = aSrcSheetHierarchy[ j ];
|
|
||||||
|
|
||||||
for( unsigned k = 0; k < sheetPath.size(); k++ )
|
|
||||||
{
|
|
||||||
wxFileName srcFn = sheetPath[k]->GetFileName();
|
|
||||||
|
|
||||||
if( srcFn.IsRelative() )
|
|
||||||
srcFn.MakeAbsolute( rootFn.GetPath() );
|
|
||||||
|
|
||||||
// The source and destination sheet file names cannot be the same.
|
|
||||||
if( srcFn == destFn )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
/// @todo Store sheet file names with full path, either relative to project path
|
|
||||||
/// or absolute path. The current design always assumes subsheet files are
|
|
||||||
/// located in the project folder which may or may not be desirable.
|
|
||||||
std::vector< const SCH_SHEET* > destPath = hierarchy[i];
|
|
||||||
unsigned l = 0;
|
|
||||||
|
|
||||||
while( l < destPath.size() )
|
|
||||||
{
|
|
||||||
wxFileName cmpFn = destPath[i]->GetFileName();
|
|
||||||
|
|
||||||
if( cmpFn.IsRelative() )
|
|
||||||
cmpFn.MakeAbsolute( rootFn.GetPath() );
|
|
||||||
|
|
||||||
// Test if the file name of the destination sheet is in anywhere in the
|
|
||||||
// source sheet path.
|
|
||||||
if( cmpFn == destFn )
|
|
||||||
break;
|
|
||||||
|
|
||||||
l++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The destination sheet file name was not found in the any of the source sheet
|
|
||||||
// path or the destination sheet file name is the root sheet so no recursion is
|
|
||||||
// possible.
|
|
||||||
if( l >= destPath.size() || l == 0 )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Walk back up to the root sheet to see if the source file name is already a
|
|
||||||
// parent in destination the sheet path. If so, recursion will occur.
|
|
||||||
do
|
|
||||||
{
|
|
||||||
l -= 1;
|
|
||||||
|
|
||||||
wxFileName cmpFn = destPath[i]->GetFileName();
|
|
||||||
|
|
||||||
if( cmpFn.IsRelative() )
|
|
||||||
cmpFn.MakeAbsolute( rootFn.GetPath() );
|
|
||||||
|
|
||||||
if( cmpFn == srcFn )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
} while( l != 0 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// The source sheet file can safely be added to the destination sheet file.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(DEBUG)
|
#if defined(DEBUG)
|
||||||
|
|
||||||
void SCH_SHEET::Show( int nestLevel, std::ostream& os ) const
|
void SCH_SHEET::Show( int nestLevel, std::ostream& os ) const
|
||||||
|
|
|
@ -33,10 +33,8 @@
|
||||||
#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 LINE_READER;
|
class LINE_READER;
|
||||||
class SCH_SCREEN;
|
class SCH_SCREEN;
|
||||||
class SCH_SHEET;
|
class SCH_SHEET;
|
||||||
|
@ -245,13 +243,6 @@ class SCH_SHEET : public SCH_ITEM
|
||||||
/// The size of the sheet.
|
/// The size of the sheet.
|
||||||
wxSize m_size;
|
wxSize m_size;
|
||||||
|
|
||||||
/// The sheet number ordered by file load.
|
|
||||||
// @todo: At some point this should really be a sheet number assigned by the user rather
|
|
||||||
// than assigned in the order the sheets were parsed and loaded.
|
|
||||||
int m_number;
|
|
||||||
|
|
||||||
SCH_SHEET* getRootSheet();
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SCH_SHEET( const wxPoint& pos = wxPoint( 0, 0 ) );
|
SCH_SHEET( const wxPoint& pos = wxPoint( 0, 0 ) );
|
||||||
|
|
||||||
|
@ -274,7 +265,7 @@ public:
|
||||||
* Return true for items which are moved with the anchor point at mouse cursor
|
* Return true for items which are moved with the anchor point at mouse cursor
|
||||||
* and false for items moved with no reference to anchor
|
* and false for items moved with no reference to anchor
|
||||||
* Usually return true for small items (labels, junctions) and false for
|
* Usually return true for small items (labels, junctions) and false for
|
||||||
* items which can be large (hierarchical sheets, components)
|
* items which can be large (hierarchical sheets, compoments)
|
||||||
* @return false for a hierarchical sheet
|
* @return false for a hierarchical sheet
|
||||||
*/
|
*/
|
||||||
bool IsMovableFromAnchorPoint() { return false; }
|
bool IsMovableFromAnchorPoint() { return false; }
|
||||||
|
@ -466,6 +457,19 @@ public:
|
||||||
*/
|
*/
|
||||||
bool SearchHierarchy( const wxString& aFilename, SCH_SCREEN** aScreen );
|
bool SearchHierarchy( const wxString& aFilename, SCH_SCREEN** aScreen );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function LocatePathOfScreen
|
||||||
|
* search the existing hierarchy for an instance of screen "FileName".
|
||||||
|
* don't bother looking at the root sheet - it must be unique,
|
||||||
|
* no other references to its m_screen otherwise there would be
|
||||||
|
* loops in the hierarchy.
|
||||||
|
*
|
||||||
|
* @param aScreen = the SCH_SCREEN* screen that we search for
|
||||||
|
* @param aList = the SCH_SHEET_PATH* that must be used
|
||||||
|
* @return true if found
|
||||||
|
*/
|
||||||
|
bool LocatePathOfScreen( SCH_SCREEN* aScreen, SCH_SHEET_PATH* aList );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function CountSheets
|
* Function CountSheets
|
||||||
* calculates the number of sheets found in "this"
|
* calculates the number of sheets found in "this"
|
||||||
|
@ -486,7 +490,7 @@ public:
|
||||||
{
|
{
|
||||||
m_fileName = aFilename;
|
m_fileName = aFilename;
|
||||||
// Filenames are stored using unix notation
|
// Filenames are stored using unix notation
|
||||||
m_fileName.Replace( wxT( "\\" ), wxT( "/" ) );
|
m_fileName.Replace( wxT("\\"), wxT("/") );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ChangeFileName( SCH_EDIT_FRAME* aFrame, const wxString& aFileName );
|
bool ChangeFileName( SCH_EDIT_FRAME* aFrame, const wxString& aFileName );
|
||||||
|
@ -551,7 +555,7 @@ public:
|
||||||
void GetConnectionPoints( std::vector< wxPoint >& aPoints ) const;
|
void GetConnectionPoints( std::vector< wxPoint >& aPoints ) const;
|
||||||
|
|
||||||
SEARCH_RESULT Visit( INSPECTOR* inspector, const void* testData,
|
SEARCH_RESULT Visit( INSPECTOR* inspector, const void* testData,
|
||||||
const KICAD_T scanTypes[] );
|
const KICAD_T scanTypes[] );
|
||||||
|
|
||||||
wxString GetSelectMenuText() const;
|
wxString GetSelectMenuText() const;
|
||||||
|
|
||||||
|
@ -562,42 +566,6 @@ public:
|
||||||
|
|
||||||
SCH_ITEM& operator=( const SCH_ITEM& aSheet );
|
SCH_ITEM& operator=( const SCH_ITEM& aSheet );
|
||||||
|
|
||||||
/**
|
|
||||||
* Operator <
|
|
||||||
*
|
|
||||||
* test if a \a aRhs is less than this sheet.
|
|
||||||
*
|
|
||||||
* Sheet comparison order is:
|
|
||||||
* The number of parent sheets of this sheet is less than \a aRhs.
|
|
||||||
* When the number of parent sheets for this sheet are the same as \a aRhs, the time
|
|
||||||
* stamps of each parent sheet are compared from the root sheet to the last sheet.
|
|
||||||
*
|
|
||||||
* @param aRhs is an SCH_SHEET reference to the right hand side of the comparison.
|
|
||||||
* @return true if this #SCH_SHEET is less than \a aRhs.
|
|
||||||
*/
|
|
||||||
bool operator<( const SCH_SHEET& aRhs ) const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Structure SortByPath
|
|
||||||
*
|
|
||||||
* tests if \a aLhs is less than \a aRhs.
|
|
||||||
*
|
|
||||||
* @param aLhs is the left hand side reference to a #SCH_SHEET for comparison.
|
|
||||||
* @param aRhs is the right hand side reference to a #SCH_SHEET for comparison.
|
|
||||||
* @return true if \a aLhs is less than \a aRhs otherwise false.
|
|
||||||
*/
|
|
||||||
struct SortByPath
|
|
||||||
{
|
|
||||||
bool operator()( const SCH_SHEET* aLhs, const SCH_SHEET* aRhs )
|
|
||||||
{
|
|
||||||
wxCHECK( aLhs != NULL && aRhs != NULL, false );
|
|
||||||
|
|
||||||
return *aLhs < *aRhs;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
int operator-( const SCH_SHEET& aRhs ) const;
|
|
||||||
|
|
||||||
wxPoint GetPosition() const { return m_pos; }
|
wxPoint GetPosition() const { return m_pos; }
|
||||||
|
|
||||||
void SetPosition( const wxPoint& aPosition );
|
void SetPosition( const wxPoint& aPosition );
|
||||||
|
@ -610,225 +578,6 @@ public:
|
||||||
|
|
||||||
EDA_ITEM* Clone() const;
|
EDA_ITEM* Clone() const;
|
||||||
|
|
||||||
/**
|
|
||||||
* Function SetPageNumbers
|
|
||||||
*
|
|
||||||
* sets the page numbers for each sheet by load order.
|
|
||||||
*
|
|
||||||
* The root sheet is always used to set the page numbers no matter which sheet this
|
|
||||||
* function is called. This function will only have meaning when loading legacy
|
|
||||||
* schematics. The upcoming s-expression schematic file format will allow for user
|
|
||||||
* defined page numbers.
|
|
||||||
*/
|
|
||||||
void SetPageNumbers();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function FindSheetByName
|
|
||||||
*
|
|
||||||
* searches this #SCH_SHEET and all of it's sub-sheets for a sheet named \a aSheetName.
|
|
||||||
*
|
|
||||||
* @param aSheetName is the name of the sheet to find.
|
|
||||||
* @return a pointer to the sheet named \a aSheetName if found or NULL if not found.
|
|
||||||
*/
|
|
||||||
SCH_SHEET* FindSheetByName( const wxString& aSheetName );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function GetSheets
|
|
||||||
*
|
|
||||||
* add the pointers to the #SCH_SHEET and all of it's sub-sheets to \a aSheetList.
|
|
||||||
*
|
|
||||||
* By default no sorting is performed and the #SCH_SHEET pointers are add to the list
|
|
||||||
* in the order they were loaded when the schematic was parse. When \a aSortByPath is
|
|
||||||
* true, the list is sorted using the < operator which sort by path length then path
|
|
||||||
* time stamps. This has the same sorting effect as the old SCH_SHEET_PATH::Cmp()
|
|
||||||
* function.
|
|
||||||
*
|
|
||||||
* @param aSheetList is a reference to a set containing the #SCH_SHEET pointers.
|
|
||||||
* @param aSortByPath true to sort by path. False for load order.
|
|
||||||
* @return the number of #SCH_SHEET object pointers in \a aSheetList.
|
|
||||||
*/
|
|
||||||
unsigned GetSheets( std::vector< const SCH_SHEET* >& aSheetList,
|
|
||||||
bool aSortByPath = false ) const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function GetSheetPaths
|
|
||||||
*
|
|
||||||
* Returns a list of lists of #SCH_SHEET pointers to \a sSheetPaths.
|
|
||||||
*
|
|
||||||
* This is analagous to the old SCH_SHEET_LIST::BuildSheetList(). It creates a list of
|
|
||||||
* stacks to the sheet pointer hierarchy.
|
|
||||||
*
|
|
||||||
* @param aSheetPaths is a vector of vector of #SCH_SHEET pointers.
|
|
||||||
*/
|
|
||||||
void GetSheetPaths( std::vector< std::vector< const SCH_SHEET* > >& aSheetPaths ) const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function GetRootSheet
|
|
||||||
*
|
|
||||||
* returns the root sheet of this SCH_SHEET object.
|
|
||||||
*
|
|
||||||
* The root (top level) sheet can be found by walking up the parent links until the only
|
|
||||||
* sheet that has no parent is found. The root sheet can be found from any sheet in the
|
|
||||||
* hierarchy.
|
|
||||||
*
|
|
||||||
* @return a SCH_SHEET pointer to the root sheet.
|
|
||||||
*/
|
|
||||||
const SCH_SHEET* GetRootSheet() const;
|
|
||||||
|
|
||||||
SCH_SHEET* GetRootSheet()
|
|
||||||
{
|
|
||||||
return const_cast< SCH_SHEET* >( static_cast< const SCH_SHEET&>( *this ).GetRootSheet() );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function IsRootSheet
|
|
||||||
*
|
|
||||||
* returns true if `this` sheet has no parent which indicates it is the root (top level)
|
|
||||||
* sheet.
|
|
||||||
*
|
|
||||||
* @return true if this is the root sheet, otherwise false.
|
|
||||||
*/
|
|
||||||
bool IsRootSheet() const { return GetParent() == NULL; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function GetPath
|
|
||||||
*
|
|
||||||
* recurses up the parent branch up to the root sheet adding a pointer for each
|
|
||||||
* parent sheet to \a aSheetPath.
|
|
||||||
*
|
|
||||||
* @param aSheetPath is a refernce to an #SCH_SHEET object to populate.
|
|
||||||
*/
|
|
||||||
void GetPath( std::vector< const SCH_SHEET* >& aSheetPath ) const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function GetPath
|
|
||||||
*
|
|
||||||
* returns a wxString containing the sheet path of this SCH_SHEET.
|
|
||||||
*
|
|
||||||
* The SCH_SHEET path is a Posix like path containing the hexadecimal time stamps in
|
|
||||||
* the parent order of this SCH_SHEET. It looks something like /4567FEDC/AA2233DD/.
|
|
||||||
*/
|
|
||||||
wxString GetPath() const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function GetHumanReadablePath
|
|
||||||
*
|
|
||||||
* returns a wxString containing the human readable path of this sheet.
|
|
||||||
*
|
|
||||||
* Human readable SCH_SHEET paths are Posix like paths made up of the sheet names
|
|
||||||
* in the parent order of this SCH_SHEET. It looks something like /sheet1/sheet2.
|
|
||||||
*/
|
|
||||||
wxString GetHumanReadablePath() const;
|
|
||||||
|
|
||||||
void ClearAnnotation( bool aIncludeSubSheets = false );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function IsModified
|
|
||||||
* checks the sheet and any of it's sub-sheets (hierarchy) for any modifications.
|
|
||||||
* @return true if the hierarchy is modified otherwise false.
|
|
||||||
*/
|
|
||||||
bool IsModified() const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function ClearModifyStatus
|
|
||||||
*
|
|
||||||
* clears the modification flag for everything in the sheet and all sub-sheets.
|
|
||||||
*/
|
|
||||||
void ClearModifyStatus();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function IsAutoSaveRequired
|
|
||||||
* checks the entire hierarchy for any modifications that require auto save.
|
|
||||||
* @return True if the hierarchy is modified otherwise false.
|
|
||||||
*/
|
|
||||||
bool IsAutoSaveRequired();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function AnnotatePowerSymbols
|
|
||||||
* annotates the power symbols only starting at \a aReference in the sheet path.
|
|
||||||
* @param aLibs the library list to use
|
|
||||||
* @param aReference A pointer to the number for the reference designator of the
|
|
||||||
* first power symbol to be annotated. If the pointer is NULL
|
|
||||||
* the annotation starts at 1. The number is incremented for
|
|
||||||
* each power symbol in the sheet that is annotated.
|
|
||||||
*/
|
|
||||||
void AnnotatePowerSymbols( PART_LIBS* aLibs, int* aReference );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function UpdateAllScreenReferences
|
|
||||||
* updates the reference and the m_Multi parameter (part selection) for all
|
|
||||||
* components on a screen depending on the actual sheet.
|
|
||||||
* Mandatory in complex hierarchies because sheets use the same screen
|
|
||||||
* (basic schematic)
|
|
||||||
* but with different references and part selections according to the
|
|
||||||
* displayed sheet
|
|
||||||
*/
|
|
||||||
void UpdateAllScreenReferences();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function GetComponents
|
|
||||||
* adds a SCH_REFERENCE() object to \a aReferences for each component in the sheet.
|
|
||||||
*
|
|
||||||
* @param aLibs the library list to use
|
|
||||||
* @param aReferences List of references to populate.
|
|
||||||
* @param aIncludePowerSymbols : false to only get normal components.
|
|
||||||
* @param aIncludeSubSheets true includes components of all sub-sheets and false includes
|
|
||||||
* only the components in this sheet.
|
|
||||||
*/
|
|
||||||
void GetComponents( PART_LIBS* aLibs, SCH_REFERENCE_LIST& aReferences,
|
|
||||||
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 );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function IsComplexHierarchy
|
|
||||||
* searches all of the sheets for duplicate files names which indicates a complex
|
|
||||||
* hierarchy.
|
|
||||||
*
|
|
||||||
* Typically this function would be called from the root sheet. However, it is possible
|
|
||||||
* to test only the sub-hierarchy from any #SCH_SHEET object.
|
|
||||||
*
|
|
||||||
* @return true if the #SCH_SHEET is a complex hierarchy.
|
|
||||||
*/
|
|
||||||
bool IsComplexHierarchy() const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Find the next schematic item in this sheet object.
|
|
||||||
*
|
|
||||||
* @param aType - The type of schematic item object to search for.
|
|
||||||
* @param aLastItem - Start search from aLastItem. If no aLastItem, search from
|
|
||||||
* the beginning of the list.
|
|
||||||
* @param aWrap - Wrap around the end of the list to find the next item if aLastItem
|
|
||||||
* is defined.
|
|
||||||
* @return - The next schematic item if found. Otherwise, NULL is returned.
|
|
||||||
*/
|
|
||||||
SCH_ITEM* FindNextItem( KICAD_T aType, SCH_ITEM* aLastItem = NULL, bool aWrap = false ) const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function TestForRecursion
|
|
||||||
*
|
|
||||||
* test every SCH_SHEET in the SCH_SHEET hierarchy to verify if adding the sheets stored
|
|
||||||
* in \a aSrcSheetHierarchy to the sheet stored in \a aDestFileName will cause recursion.
|
|
||||||
*
|
|
||||||
* @param aSrcSheetHierarchy is a list #SCH_SHEET pointer lists of the source sheet add
|
|
||||||
* to \a aDestFileName.
|
|
||||||
* @param aDestFileName is the file name of the destination sheet for \a aSrcFileName.
|
|
||||||
* @return true if \a aFileName will cause recursion in the sheet path. Otherwise false.
|
|
||||||
*/
|
|
||||||
bool TestForRecursion( std::vector< std::vector< const SCH_SHEET* > >& aSrcSheetHierarchy,
|
|
||||||
const wxString& aDestFileName ) const;
|
|
||||||
|
|
||||||
#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
|
||||||
|
@ -846,4 +595,6 @@ protected:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
typedef std::vector< SCH_SHEET* > SCH_SHEETS;
|
||||||
|
|
||||||
#endif /* SCH_SHEEET_H */
|
#endif /* SCH_SHEEET_H */
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
|
* Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
|
||||||
* Copyright (C) 2011-2015 Wayne Stambaugh <stambaughw@verizon.net>
|
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
|
||||||
* Copyright (C) 1992-2015 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
@ -227,6 +227,169 @@ wxString SCH_SHEET_PATH::PathHumanReadable() const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCH_SHEET_PATH::UpdateAllScreenReferences()
|
||||||
|
{
|
||||||
|
EDA_ITEM* t = LastDrawList();
|
||||||
|
|
||||||
|
while( t )
|
||||||
|
{
|
||||||
|
if( t->Type() == SCH_COMPONENT_T )
|
||||||
|
{
|
||||||
|
SCH_COMPONENT* component = (SCH_COMPONENT*) t;
|
||||||
|
component->GetField( REFERENCE )->SetText( component->GetRef( this ) );
|
||||||
|
component->UpdateUnit( component->GetUnitSelection( this ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
t = t->Next();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCH_SHEET_PATH::AnnotatePowerSymbols( PART_LIBS* aLibs, int* aReference )
|
||||||
|
{
|
||||||
|
int ref = 1;
|
||||||
|
|
||||||
|
if( aReference )
|
||||||
|
ref = *aReference;
|
||||||
|
|
||||||
|
for( EDA_ITEM* item = LastDrawList(); item; item = item->Next() )
|
||||||
|
{
|
||||||
|
if( item->Type() != SCH_COMPONENT_T )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
SCH_COMPONENT* component = (SCH_COMPONENT*) item;
|
||||||
|
LIB_PART* part = aLibs->FindLibPart( component->GetPartName() );
|
||||||
|
|
||||||
|
if( !part || !part->IsPower() )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
wxString refstr = component->GetPrefix();
|
||||||
|
|
||||||
|
//str will be "C?" or so after the ClearAnnotation call.
|
||||||
|
while( refstr.Last() == '?' )
|
||||||
|
refstr.RemoveLast();
|
||||||
|
|
||||||
|
if( !refstr.StartsWith( wxT( "#" ) ) )
|
||||||
|
refstr = wxT( "#" ) + refstr;
|
||||||
|
|
||||||
|
refstr << wxT( "0" ) << ref;
|
||||||
|
component->SetRef( this, refstr );
|
||||||
|
ref++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( aReference )
|
||||||
|
*aReference = ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCH_SHEET_PATH::GetComponents( PART_LIBS* aLibs, SCH_REFERENCE_LIST& aReferences, bool aIncludePowerSymbols )
|
||||||
|
{
|
||||||
|
// Search to 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 )
|
||||||
|
{
|
||||||
|
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 )
|
||||||
|
{
|
||||||
|
SCH_REFERENCE reference = SCH_REFERENCE( component, part, *this );
|
||||||
|
reference.SetSheetNumber( sheetnumber );
|
||||||
|
aReferences.AddItem( reference );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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( 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( 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
|
||||||
|
{
|
||||||
|
bool hasWrapped = false;
|
||||||
|
bool firstItemFound = false;
|
||||||
|
SCH_ITEM* drawItem = LastDrawList();
|
||||||
|
|
||||||
|
while( drawItem )
|
||||||
|
{
|
||||||
|
if( drawItem->Type() == aType )
|
||||||
|
{
|
||||||
|
if( !aLastItem || firstItemFound )
|
||||||
|
{
|
||||||
|
return drawItem;
|
||||||
|
}
|
||||||
|
else if( !firstItemFound && drawItem == aLastItem )
|
||||||
|
{
|
||||||
|
firstItemFound = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
drawItem = drawItem->Next();
|
||||||
|
|
||||||
|
if( !drawItem && aLastItem && aWrap && !hasWrapped )
|
||||||
|
{
|
||||||
|
hasWrapped = true;
|
||||||
|
drawItem = LastDrawList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
SCH_ITEM* SCH_SHEET_PATH::FindPreviousItem( KICAD_T aType, SCH_ITEM* aLastItem, bool aWrap ) const
|
SCH_ITEM* SCH_SHEET_PATH::FindPreviousItem( KICAD_T aType, SCH_ITEM* aLastItem, bool aWrap ) const
|
||||||
{
|
{
|
||||||
bool hasWrapped = false;
|
bool hasWrapped = false;
|
||||||
|
@ -260,6 +423,18 @@ SCH_ITEM* SCH_SHEET_PATH::FindPreviousItem( KICAD_T aType, SCH_ITEM* aLastItem,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool SCH_SHEET_PATH::SetComponentFootprint( const wxString& aReference, const wxString& aFootPrint,
|
||||||
|
bool aSetVisible )
|
||||||
|
{
|
||||||
|
SCH_SCREEN* screen = LastScreen();
|
||||||
|
|
||||||
|
if( screen == NULL )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return screen->SetComponentFootprint( this, aReference, aFootPrint, aSetVisible );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
SCH_SHEET_PATH& SCH_SHEET_PATH::operator=( const SCH_SHEET_PATH& d1 )
|
SCH_SHEET_PATH& SCH_SHEET_PATH::operator=( const SCH_SHEET_PATH& d1 )
|
||||||
{
|
{
|
||||||
if( this == &d1 ) // Self assignment is bad!
|
if( this == &d1 ) // Self assignment is bad!
|
||||||
|
@ -294,6 +469,93 @@ bool SCH_SHEET_PATH::operator==( const SCH_SHEET_PATH& d1 ) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool SCH_SHEET_PATH::TestForRecursion( const wxString& aSrcFileName,
|
||||||
|
const wxString& aDestFileName ) const
|
||||||
|
{
|
||||||
|
wxFileName rootFn = g_RootSheet->GetFileName();
|
||||||
|
wxFileName srcFn = aSrcFileName;
|
||||||
|
wxFileName destFn = aDestFileName;
|
||||||
|
|
||||||
|
if( srcFn.IsRelative() )
|
||||||
|
srcFn.MakeAbsolute( rootFn.GetPath() );
|
||||||
|
|
||||||
|
if( destFn.IsRelative() )
|
||||||
|
destFn.MakeAbsolute( rootFn.GetPath() );
|
||||||
|
|
||||||
|
|
||||||
|
// The source and destination sheet file names cannot be the same.
|
||||||
|
if( srcFn == destFn )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/// @todo Store sheet file names with full path, either relative to project path
|
||||||
|
/// or absolute path. The current design always assumes subsheet files are
|
||||||
|
/// located in the project folder which may or may not be desirable.
|
||||||
|
unsigned i = 0;
|
||||||
|
|
||||||
|
while( i < m_numSheets )
|
||||||
|
{
|
||||||
|
wxFileName cmpFn = m_sheets[i]->GetFileName();
|
||||||
|
|
||||||
|
if( cmpFn.IsRelative() )
|
||||||
|
cmpFn.MakeAbsolute( rootFn.GetPath() );
|
||||||
|
|
||||||
|
// Test if the file name of the destination sheet is in anywhere in this sheet path.
|
||||||
|
if( cmpFn == destFn )
|
||||||
|
break;
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The destination sheet file name was not found in the sheet path or the destination
|
||||||
|
// sheet file name is the root sheet so no recursion is possible.
|
||||||
|
if( i >= m_numSheets || i == 0 )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Walk back up to the root sheet to see if the source file name is already a parent in
|
||||||
|
// the sheet path. If so, recursion will occur.
|
||||||
|
do
|
||||||
|
{
|
||||||
|
i -= 1;
|
||||||
|
|
||||||
|
wxFileName cmpFn = m_sheets[i]->GetFileName();
|
||||||
|
|
||||||
|
if( cmpFn.IsRelative() )
|
||||||
|
cmpFn.MakeAbsolute( rootFn.GetPath() );
|
||||||
|
|
||||||
|
if( cmpFn == srcFn )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} while( i != 0 );
|
||||||
|
|
||||||
|
// The source sheet file name is not a parent of the destination sheet file name.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int SCH_SHEET_PATH::FindSheet( const wxString& aFileName ) const
|
||||||
|
{
|
||||||
|
for( unsigned i = 0; i < m_numSheets; i++ )
|
||||||
|
{
|
||||||
|
if( m_sheets[i]->GetFileName().CmpNoCase( aFileName ) == 0 )
|
||||||
|
return (int)i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SHEET_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SCH_SHEET* SCH_SHEET_PATH::FindSheetByName( const wxString& aSheetName )
|
||||||
|
{
|
||||||
|
for( unsigned i = 0; i < m_numSheets; i++ )
|
||||||
|
{
|
||||||
|
if( m_sheets[i]->GetName().CmpNoCase( aSheetName ) == 0 )
|
||||||
|
return m_sheets[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/********************************************************************/
|
/********************************************************************/
|
||||||
/* Class SCH_SHEET_LIST to handle the list of Sheets in a hierarchy */
|
/* Class SCH_SHEET_LIST to handle the list of Sheets in a hierarchy */
|
||||||
/********************************************************************/
|
/********************************************************************/
|
||||||
|
@ -422,6 +684,76 @@ void SCH_SHEET_LIST::BuildSheetList( SCH_SHEET* aSheet )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool SCH_SHEET_LIST::IsModified()
|
||||||
|
{
|
||||||
|
for( SCH_SHEET_PATH* sheet = GetFirst(); sheet; sheet = GetNext() )
|
||||||
|
{
|
||||||
|
if( sheet->LastScreen() && sheet->LastScreen()->IsModify() )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool SCH_SHEET_LIST::IsAutoSaveRequired()
|
||||||
|
{
|
||||||
|
for( SCH_SHEET_PATH* sheet = GetFirst(); sheet; sheet = GetNext() )
|
||||||
|
{
|
||||||
|
if( sheet->LastScreen() && sheet->LastScreen()->IsSave() )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCH_SHEET_LIST::ClearModifyStatus()
|
||||||
|
{
|
||||||
|
for( SCH_SHEET_PATH* sheet = GetFirst(); sheet; sheet = GetNext() )
|
||||||
|
{
|
||||||
|
if( sheet->LastScreen() )
|
||||||
|
sheet->LastScreen()->ClrModify();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCH_SHEET_LIST::AnnotatePowerSymbols( PART_LIBS* aLibs )
|
||||||
|
{
|
||||||
|
int ref = 1;
|
||||||
|
|
||||||
|
for( SCH_SHEET_PATH* path = GetFirst(); path; path = GetNext() )
|
||||||
|
path->AnnotatePowerSymbols( aLibs, &ref );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCH_SHEET_LIST::GetComponents( PART_LIBS* aLibs, SCH_REFERENCE_LIST& aReferences,
|
||||||
|
bool aIncludePowerSymbols )
|
||||||
|
{
|
||||||
|
for( SCH_SHEET_PATH* path = GetFirst(); path; path = GetNext() )
|
||||||
|
path->GetComponents( aLibs, aReferences, aIncludePowerSymbols );
|
||||||
|
}
|
||||||
|
|
||||||
|
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 )
|
||||||
{
|
{
|
||||||
|
@ -511,3 +843,82 @@ SCH_ITEM* SCH_SHEET_LIST::FindPreviousItem( KICAD_T aType, SCH_SHEET_PATH** aShe
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool SCH_SHEET_LIST::SetComponentFootprint( const wxString& aReference,
|
||||||
|
const wxString& aFootPrint, bool aSetVisible )
|
||||||
|
{
|
||||||
|
bool found = false;
|
||||||
|
|
||||||
|
for( SCH_SHEET_PATH* path = GetFirst(); path; path = GetNext() )
|
||||||
|
found = path->SetComponentFootprint( aReference, aFootPrint, aSetVisible );
|
||||||
|
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool SCH_SHEET_LIST::IsComplexHierarchy() const
|
||||||
|
{
|
||||||
|
wxString fileName;
|
||||||
|
|
||||||
|
for( int i = 0; i < m_count; i++ )
|
||||||
|
{
|
||||||
|
fileName = m_list[i].Last()->GetFileName();
|
||||||
|
|
||||||
|
for( int j = 0; j < m_count; j++ )
|
||||||
|
{
|
||||||
|
if( i == j )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if( fileName == m_list[j].Last()->GetFileName() )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool SCH_SHEET_LIST::TestForRecursion( const SCH_SHEET_LIST& aSrcSheetHierarchy,
|
||||||
|
const wxString& aDestFileName ) const
|
||||||
|
{
|
||||||
|
wxFileName rootFn = g_RootSheet->GetFileName();
|
||||||
|
wxFileName destFn = aDestFileName;
|
||||||
|
|
||||||
|
if( destFn.IsRelative() )
|
||||||
|
destFn.MakeAbsolute( rootFn.GetPath() );
|
||||||
|
|
||||||
|
// Test each SCH_SHEET_PATH in this SCH_SHEET_LIST for potential recursion.
|
||||||
|
for( int i = 0; i < m_count; i++ )
|
||||||
|
{
|
||||||
|
// Test each SCH_SHEET_PATH in the source sheet.
|
||||||
|
for( int j = 0; j < aSrcSheetHierarchy.GetCount(); j++ )
|
||||||
|
{
|
||||||
|
SCH_SHEET_PATH* sheetPath = aSrcSheetHierarchy.GetSheet( j );
|
||||||
|
|
||||||
|
for( unsigned k = 0; k < sheetPath->GetCount(); k++ )
|
||||||
|
{
|
||||||
|
if( m_list[i].TestForRecursion( sheetPath->GetSheet( k )->GetFileName(),
|
||||||
|
aDestFileName ) )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The source sheet file can safely be added to the destination sheet file.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SCH_SHEET* SCH_SHEET_LIST::FindSheetByName( const wxString& aSheetName )
|
||||||
|
{
|
||||||
|
for( int i = 0; i < m_count; i++ )
|
||||||
|
{
|
||||||
|
SCH_SHEET* sheet = m_list[i].FindSheetByName( aSheetName );
|
||||||
|
|
||||||
|
if( sheet )
|
||||||
|
return sheet;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
|
* Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
|
||||||
* Copyright (C) 2011-2015 Wayne Stambaugh <stambaughw@verizon.net>
|
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
|
||||||
* Copyright (C) 1992-2015 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
@ -80,13 +79,21 @@
|
||||||
|
|
||||||
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 SCH_REFERENCE_LIST;
|
||||||
|
class PART_LIBS;
|
||||||
|
|
||||||
#define SHEET_NOT_FOUND -1
|
#define SHEET_NOT_FOUND -1
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Type SCH_MULTI_UNIT_REFERENCE_MAP
|
||||||
|
* is used to create a map of reference designators for multi-unit parts.
|
||||||
|
*/
|
||||||
|
typedef std::map<wxString, SCH_REFERENCE_LIST> SCH_MULTI_UNIT_REFERENCE_MAP;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class SCH_SHEET_PATH
|
* Class SCH_SHEET_PATH
|
||||||
* handles access to a sheet by way of a path.
|
* handles access to a sheet by way of a path.
|
||||||
|
@ -208,6 +215,75 @@ public:
|
||||||
*/
|
*/
|
||||||
bool BuildSheetPathInfoFromSheetPathValue( const wxString& aPath, bool aFound = false );
|
bool BuildSheetPathInfoFromSheetPathValue( const wxString& aPath, bool aFound = false );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function UpdateAllScreenReferences
|
||||||
|
* updates the reference and the m_Multi parameter (part selection) for all
|
||||||
|
* components on a screen depending on the actual sheet path.
|
||||||
|
* Mandatory in complex hierarchies because sheets use the same screen
|
||||||
|
* (basic schematic)
|
||||||
|
* but with different references and part selections according to the
|
||||||
|
* displayed sheet
|
||||||
|
*/
|
||||||
|
void UpdateAllScreenReferences();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function AnnotatePowerSymbols
|
||||||
|
* annotates the power symbols only starting at \a aReference in the sheet path.
|
||||||
|
* @param aLibs the library list to use
|
||||||
|
* @param aReference A pointer to the number for the reference designator of the
|
||||||
|
* first power symbol to be annotated. If the pointer is NULL
|
||||||
|
* the annotation starts at 1. The number is incremented for
|
||||||
|
* each power symbol annotated.
|
||||||
|
*/
|
||||||
|
void AnnotatePowerSymbols( PART_LIBS* aLibs, int* aReference );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function GetComponents
|
||||||
|
* adds a SCH_REFERENCE() object to \a aReferences for each component in the sheet.
|
||||||
|
* @param aLibs the library list to use
|
||||||
|
* @param aReferences List of references to populate.
|
||||||
|
* @param aIncludePowerSymbols : false to only get normal components.
|
||||||
|
*/
|
||||||
|
void GetComponents( PART_LIBS* aLibs, SCH_REFERENCE_LIST& aReferences,
|
||||||
|
bool aIncludePowerSymbols = true );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
||||||
|
* searches last sheet in the path for a component with \a aReference and set the footprint
|
||||||
|
* field to \a aFootPrint if found.
|
||||||
|
*
|
||||||
|
* @param aReference The reference designator of the component.
|
||||||
|
* @param aFootPrint The value to set the footprint field.
|
||||||
|
* @param aSetVisible The value to set the field visibility flag.
|
||||||
|
* @return True if \a aReference was found otherwise false.
|
||||||
|
*/
|
||||||
|
bool SetComponentFootprint( const wxString& aReference, const wxString& aFootPrint,
|
||||||
|
bool aSetVisible );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find the next schematic item in this sheet object.
|
||||||
|
*
|
||||||
|
* @param aType - The type of schematic item object to search for.
|
||||||
|
* @param aLastItem - Start search from aLastItem. If no aLastItem, search from
|
||||||
|
* the beginning of the list.
|
||||||
|
* @param aWrap - Wrap around the end of the list to find the next item if aLastItem
|
||||||
|
* is defined.
|
||||||
|
* @return - The next schematic item if found. Otherwise, NULL is returned.
|
||||||
|
*/
|
||||||
|
SCH_ITEM* FindNextItem( KICAD_T aType, SCH_ITEM* aLastItem = NULL, bool aWrap = false ) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find the previous schematic item in this sheet path object.
|
* Find the previous schematic item in this sheet path object.
|
||||||
*
|
*
|
||||||
|
@ -220,6 +296,31 @@ public:
|
||||||
*/
|
*/
|
||||||
SCH_ITEM* FindPreviousItem( KICAD_T aType, SCH_ITEM* aLastItem = NULL, bool aWrap = false ) const;
|
SCH_ITEM* FindPreviousItem( KICAD_T aType, SCH_ITEM* aLastItem = NULL, bool aWrap = false ) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function TestForRecursion
|
||||||
|
*
|
||||||
|
* test the SCH_SHEET_PATH file names to check adding the sheet stored in the file
|
||||||
|
* \a aSrcFileName to the sheet stored in file \a aDestFileName will cause a sheet
|
||||||
|
* path recursion.
|
||||||
|
*
|
||||||
|
* @param aSrcFileName is the source file name of the sheet add to \a aDestFileName.
|
||||||
|
* @param aDestFileName is the file name of the destination sheet for \a aSrcFileName.
|
||||||
|
* @return true if \a aFileName will cause recursion in the sheet path. Otherwise false.
|
||||||
|
*/
|
||||||
|
bool TestForRecursion( const wxString& aSrcFileName, const wxString& aDestFileName ) const;
|
||||||
|
|
||||||
|
int FindSheet( const wxString& aFileName ) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function FindSheetByName
|
||||||
|
*
|
||||||
|
* searches the #SCH_SHEET_PATH for a sheet named \a aSheetName.
|
||||||
|
*
|
||||||
|
* @param aSheetName is the name of the sheet to find.
|
||||||
|
* @return a pointer to the sheet named \a aSheetName if found or NULL if not found.
|
||||||
|
*/
|
||||||
|
SCH_SHEET* FindSheetByName( const wxString& aSheetName );
|
||||||
|
|
||||||
SCH_SHEET_PATH& operator=( const SCH_SHEET_PATH& d1 );
|
SCH_SHEET_PATH& operator=( const SCH_SHEET_PATH& d1 );
|
||||||
|
|
||||||
bool operator==( const SCH_SHEET_PATH& d1 ) const;
|
bool operator==( const SCH_SHEET_PATH& d1 ) const;
|
||||||
|
@ -335,6 +436,51 @@ public:
|
||||||
*/
|
*/
|
||||||
SCH_SHEET_PATH* GetSheetByPath( const wxString aPath, bool aHumanReadable = true );
|
SCH_SHEET_PATH* GetSheetByPath( const wxString aPath, bool aHumanReadable = true );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function IsModified
|
||||||
|
* checks the entire hierarchy for any modifications.
|
||||||
|
* @returns True if the hierarchy is modified otherwise false.
|
||||||
|
*/
|
||||||
|
bool IsModified();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function IsAutoSaveRequired
|
||||||
|
* checks the entire hierarchy for any modifications that require auto save.
|
||||||
|
* @return True if the hierarchy is modified otherwise false.
|
||||||
|
*/
|
||||||
|
bool IsAutoSaveRequired();
|
||||||
|
|
||||||
|
void ClearModifyStatus();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function AnnotatePowerSymbols
|
||||||
|
* clear and annotates the entire hierarchy of the sheet path list.
|
||||||
|
* @param aLib the library list to use
|
||||||
|
*/
|
||||||
|
void AnnotatePowerSymbols( PART_LIBS* aLib );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function GetComponents
|
||||||
|
* adds a SCH_REFERENCE() object to \a aReferences for each component in the list
|
||||||
|
* of sheets.
|
||||||
|
* @param aLibs the library list to use
|
||||||
|
* @param aReferences List of references to populate.
|
||||||
|
* @param aIncludePowerSymbols Set to false to only get normal components.
|
||||||
|
*/
|
||||||
|
void GetComponents( PART_LIBS* aLibs, SCH_REFERENCE_LIST& aReferences, bool aIncludePowerSymbols = 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.
|
||||||
|
@ -363,6 +509,51 @@ public:
|
||||||
SCH_ITEM* FindPreviousItem( KICAD_T aType, SCH_SHEET_PATH** aSheetFound = NULL,
|
SCH_ITEM* FindPreviousItem( KICAD_T aType, SCH_SHEET_PATH** aSheetFound = NULL,
|
||||||
SCH_ITEM* aLastItem = NULL, bool aWrap = true );
|
SCH_ITEM* aLastItem = NULL, bool aWrap = true );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function SetFootprintField
|
||||||
|
* searches all the sheets for a component with \a aReference and set the footprint
|
||||||
|
* field to \a aFootPrint if found.
|
||||||
|
*
|
||||||
|
* @param aReference The reference designator of the component.
|
||||||
|
* @param aFootPrint The value to set the footprint field.
|
||||||
|
* @param aSetVisible The value to set the field visibility flag.
|
||||||
|
* @return True if \a aReference was found otherwise false.
|
||||||
|
*/
|
||||||
|
bool SetComponentFootprint( const wxString& aReference, const wxString& aFootPrint,
|
||||||
|
bool aSetVisible );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function IsComplexHierarchy
|
||||||
|
* searches all of the sheets for duplicate files names which indicates a complex
|
||||||
|
* hierarchy.
|
||||||
|
*
|
||||||
|
* @return true if the #SCH_SHEET_LIST is a complex hierarchy.
|
||||||
|
*/
|
||||||
|
bool IsComplexHierarchy() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function TestForRecursion
|
||||||
|
*
|
||||||
|
* test every SCH_SHEET_PATH in the SCH_SHEET_LIST to verify if adding the sheets stored
|
||||||
|
* in \a aSrcSheetHierarchy to the sheet stored in \a aDestFileName will cause recursion.
|
||||||
|
*
|
||||||
|
* @param aSrcSheetHierarchy is the SCH_SHEET_LIST of the source sheet add to \a aDestFileName.
|
||||||
|
* @param aDestFileName is the file name of the destination sheet for \a aSrcFileName.
|
||||||
|
* @return true if \a aFileName will cause recursion in the sheet path. Otherwise false.
|
||||||
|
*/
|
||||||
|
bool TestForRecursion( const SCH_SHEET_LIST& aSrcSheetHierarchy,
|
||||||
|
const wxString& aDestFileName ) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function FindSheetByName
|
||||||
|
*
|
||||||
|
* searches the entire #SCH_SHEET_LIST for a sheet named \a aSheetName.
|
||||||
|
*
|
||||||
|
* @param aSheetName is the name of the sheet to find.
|
||||||
|
* @return a pointer to the sheet named \a aSheetName if found or NULL if not found.
|
||||||
|
*/
|
||||||
|
SCH_SHEET* FindSheetByName( const wxString& aSheetName );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -983,7 +983,7 @@ void SCH_EDIT_FRAME::OnEditItem( wxCommandEvent& aEvent )
|
||||||
}
|
}
|
||||||
|
|
||||||
case SCH_SHEET_T:
|
case SCH_SHEET_T:
|
||||||
if( EditSheet( (SCH_SHEET*) item, m_CurrentSheet->Last() ) )
|
if( EditSheet( (SCH_SHEET*) item, m_CurrentSheet ) )
|
||||||
m_canvas->Refresh();
|
m_canvas->Refresh();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
* Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
||||||
* Copyright (C) 1992-2015 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 1992-2013 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
@ -523,8 +523,6 @@ void SCH_EDIT_FRAME::CreateScreens()
|
||||||
if( g_RootSheet == NULL )
|
if( g_RootSheet == NULL )
|
||||||
{
|
{
|
||||||
g_RootSheet = new SCH_SHEET();
|
g_RootSheet = new SCH_SHEET();
|
||||||
g_RootSheet->SetName( "root" );
|
|
||||||
g_RootSheet->SetFileName( "noname.sch" );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( g_RootSheet->GetScreen() == NULL )
|
if( g_RootSheet->GetScreen() == NULL )
|
||||||
|
@ -616,7 +614,9 @@ void SCH_EDIT_FRAME::OnCloseWindow( wxCloseEvent& aEvent )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( g_RootSheet->IsModified() )
|
SCH_SHEET_LIST sheetList;
|
||||||
|
|
||||||
|
if( sheetList.IsModified() )
|
||||||
{
|
{
|
||||||
wxString fileName = Prj().AbsolutePath( g_RootSheet->GetScreen()->GetFileName() );
|
wxString fileName = Prj().AbsolutePath( g_RootSheet->GetScreen()->GetFileName() );
|
||||||
wxString msg = wxString::Format( _(
|
wxString msg = wxString::Format( _(
|
||||||
|
@ -667,7 +667,7 @@ void SCH_EDIT_FRAME::OnCloseWindow( wxCloseEvent& aEvent )
|
||||||
wxRemoveFile( fn.GetFullPath() );
|
wxRemoveFile( fn.GetFullPath() );
|
||||||
}
|
}
|
||||||
|
|
||||||
g_RootSheet->ClearModifyStatus();
|
sheetList.ClearModifyStatus();
|
||||||
|
|
||||||
wxString fileName = Prj().AbsolutePath( g_RootSheet->GetScreen()->GetFileName() );
|
wxString fileName = Prj().AbsolutePath( g_RootSheet->GetScreen()->GetFileName() );
|
||||||
|
|
||||||
|
@ -787,13 +787,16 @@ void SCH_EDIT_FRAME::OnUpdateHiddenPins( wxUpdateUIEvent& aEvent )
|
||||||
|
|
||||||
void SCH_EDIT_FRAME::OnUpdateSave( wxUpdateUIEvent& aEvent )
|
void SCH_EDIT_FRAME::OnUpdateSave( wxUpdateUIEvent& aEvent )
|
||||||
{
|
{
|
||||||
aEvent.Enable( g_RootSheet->IsModified() );
|
SCH_SHEET_LIST sheetList;
|
||||||
|
|
||||||
|
aEvent.Enable( sheetList.IsModified() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SCH_EDIT_FRAME::OnUpdateSaveSheet( wxUpdateUIEvent& aEvent )
|
void SCH_EDIT_FRAME::OnUpdateSaveSheet( wxUpdateUIEvent& aEvent )
|
||||||
{
|
{
|
||||||
aEvent.Enable( GetScreen()->IsModify() );
|
aEvent.Enable( GetScreen()->IsModify() );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1226,9 +1229,12 @@ bool SCH_EDIT_FRAME::isAutoSaveRequired() const
|
||||||
{
|
{
|
||||||
// In case this event happens before g_RootSheet is initialized which does happen
|
// In case this event happens before g_RootSheet is initialized which does happen
|
||||||
// on mingw64 builds.
|
// on mingw64 builds.
|
||||||
|
|
||||||
if( g_RootSheet != NULL )
|
if( g_RootSheet != NULL )
|
||||||
{
|
{
|
||||||
return g_RootSheet->IsAutoSaveRequired();
|
SCH_SHEET_LIST sheetList;
|
||||||
|
|
||||||
|
return sheetList.IsAutoSaveRequired();
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -1274,7 +1280,7 @@ void SCH_EDIT_FRAME::addCurrentItemToList( bool aRedraw )
|
||||||
// the m_mouseCaptureCallback function.
|
// the m_mouseCaptureCallback function.
|
||||||
m_canvas->SetMouseCapture( NULL, NULL );
|
m_canvas->SetMouseCapture( NULL, NULL );
|
||||||
|
|
||||||
if( !EditSheet( (SCH_SHEET*)item, m_CurrentSheet->Last() ) )
|
if( !EditSheet( (SCH_SHEET*)item, m_CurrentSheet ) )
|
||||||
{
|
{
|
||||||
screen->SetCurItem( NULL );
|
screen->SetCurItem( NULL );
|
||||||
delete item;
|
delete item;
|
||||||
|
|
|
@ -1015,7 +1015,7 @@ public:
|
||||||
*
|
*
|
||||||
* Note: the screen is not refresh. The caller is responsible to do that
|
* Note: the screen is not refresh. The caller is responsible to do that
|
||||||
*/
|
*/
|
||||||
bool EditSheet( SCH_SHEET* aSheet, SCH_SHEET* aHierarchy );
|
bool EditSheet( SCH_SHEET* aSheet, SCH_SHEET_PATH* aHierarchy );
|
||||||
|
|
||||||
wxPoint GetLastSheetPinPosition() const { return m_lastSheetPinPosition; }
|
wxPoint GetLastSheetPinPosition() const { return m_lastSheetPinPosition; }
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
#include <project.h>
|
#include <project.h>
|
||||||
|
|
||||||
|
|
||||||
bool SCH_EDIT_FRAME::EditSheet( SCH_SHEET* aSheet, SCH_SHEET* aHierarchy )
|
bool SCH_EDIT_FRAME::EditSheet( SCH_SHEET* aSheet, SCH_SHEET_PATH* aHierarchy )
|
||||||
{
|
{
|
||||||
if( aSheet == NULL || aHierarchy == NULL )
|
if( aSheet == NULL || aHierarchy == NULL )
|
||||||
return false;
|
return false;
|
||||||
|
@ -86,7 +86,7 @@ bool SCH_EDIT_FRAME::EditSheet( SCH_SHEET* aSheet, SCH_SHEET* aHierarchy )
|
||||||
}
|
}
|
||||||
|
|
||||||
// Duplicate sheet names are not valid.
|
// Duplicate sheet names are not valid.
|
||||||
const SCH_SHEET* sheet = g_RootSheet->FindSheetByName( dlg.GetSheetName() );
|
const SCH_SHEET* sheet = hierarchy.FindSheetByName( dlg.GetSheetName() );
|
||||||
|
|
||||||
if( sheet && (sheet != aSheet) )
|
if( sheet && (sheet != aSheet) )
|
||||||
{
|
{
|
||||||
|
@ -235,16 +235,15 @@ bool SCH_EDIT_FRAME::EditSheet( SCH_SHEET* aSheet, SCH_SHEET* aHierarchy )
|
||||||
(long unsigned) aSheet->GetTimeStamp() ) );
|
(long unsigned) aSheet->GetTimeStamp() ) );
|
||||||
|
|
||||||
// Make sure the sheet changes do not cause any recursion.
|
// Make sure the sheet changes do not cause any recursion.
|
||||||
std::vector< std::vector< const SCH_SHEET* > > sheetHierarchy;
|
SCH_SHEET_LIST sheetHierarchy( aSheet );
|
||||||
aSheet->GetSheetPaths( sheetHierarchy );
|
|
||||||
|
|
||||||
// Make sure files have fully qualified path and file name.
|
// Make sure files have fully qualified path and file name.
|
||||||
wxFileName destFn = aHierarchy->GetFileName();
|
wxFileName destFn = aHierarchy->Last()->GetFileName();
|
||||||
|
|
||||||
if( destFn.IsRelative() )
|
if( destFn.IsRelative() )
|
||||||
destFn.MakeAbsolute( Prj().GetProjectPath() );
|
destFn.MakeAbsolute( Prj().GetProjectPath() );
|
||||||
|
|
||||||
if( g_RootSheet->TestForRecursion( sheetHierarchy, destFn.GetFullPath( wxPATH_UNIX ) ) )
|
if( hierarchy.TestForRecursion( sheetHierarchy, destFn.GetFullPath( wxPATH_UNIX ) ) )
|
||||||
{
|
{
|
||||||
msg.Printf( _( "The sheet changes cannot be made because the destination sheet already "
|
msg.Printf( _( "The sheet changes cannot be made because the destination sheet already "
|
||||||
"has the sheet <%s> or one of it's subsheets as a parent somewhere in "
|
"has the sheet <%s> or one of it's subsheets as a parent somewhere in "
|
||||||
|
@ -358,7 +357,7 @@ SCH_SHEET* SCH_EDIT_FRAME::CreateSheet( wxDC* aDC )
|
||||||
|
|
||||||
sheet->SetFlags( IS_NEW | IS_RESIZED );
|
sheet->SetFlags( IS_NEW | IS_RESIZED );
|
||||||
sheet->SetTimeStamp( GetNewTimeStamp() );
|
sheet->SetTimeStamp( GetNewTimeStamp() );
|
||||||
sheet->SetParent( GetCurrentSheet().Last() );
|
sheet->SetParent( GetScreen() );
|
||||||
sheet->SetScreen( NULL );
|
sheet->SetScreen( NULL );
|
||||||
|
|
||||||
// need to check if this is being added to the GetDrawItems().
|
// need to check if this is being added to the GetDrawItems().
|
||||||
|
|
|
@ -548,6 +548,7 @@ bool GERBER_IMAGE::Execute_G_Command( char*& text, int G_command )
|
||||||
|
|
||||||
case GC_TURN_ON_POLY_FILL:
|
case GC_TURN_ON_POLY_FILL:
|
||||||
m_PolygonFillMode = true;
|
m_PolygonFillMode = true;
|
||||||
|
m_Exposure = false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GC_TURN_OFF_POLY_FILL:
|
case GC_TURN_OFF_POLY_FILL:
|
||||||
|
@ -617,7 +618,7 @@ bool GERBER_IMAGE::Execute_DCODE_Command( char*& text, int D_commande )
|
||||||
switch( D_commande )
|
switch( D_commande )
|
||||||
{
|
{
|
||||||
case 1: // code D01 Draw line, exposure ON
|
case 1: // code D01 Draw line, exposure ON
|
||||||
if( !m_Exposure )
|
if( !m_Exposure ) // Start a new polygon outline:
|
||||||
{
|
{
|
||||||
m_Exposure = true;
|
m_Exposure = true;
|
||||||
gbritem = new GERBER_DRAW_ITEM( layout, this );
|
gbritem = new GERBER_DRAW_ITEM( layout, this );
|
||||||
|
|
|
@ -51,7 +51,8 @@ void LoadInputFile( wxString aFileName, wxXmlDocument* aXmlDoc )
|
||||||
|
|
||||||
// check file format
|
// check file format
|
||||||
if( !fgets( line, sizeof( line ), fp )
|
if( !fgets( line, sizeof( line ), fp )
|
||||||
|| strcmp( line, ACCEL_ASCII_KEYWORD ) )
|
// first line starts with "ACCEL_ASCII" with optional stuff on same line after that.
|
||||||
|
|| memcmp( line, ACCEL_ASCII_KEYWORD, sizeof(ACCEL_ASCII_KEYWORD)-1 ) )
|
||||||
THROW_IO_ERROR( "Unknown file type" );
|
THROW_IO_ERROR( "Unknown file type" );
|
||||||
|
|
||||||
// rewind the file
|
// rewind the file
|
||||||
|
|
|
@ -248,7 +248,7 @@ class HelpfulFootprintWizardPlugin(pcbnew.FootprintWizardPlugin,
|
||||||
def GetValue(self):
|
def GetValue(self):
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
# this value come from our KiCad Library Convention 0.11
|
# this value come from our KiCad Library Convention 1.0
|
||||||
def GetReferencePrefix(self):
|
def GetReferencePrefix(self):
|
||||||
return "REF"
|
return "REF"
|
||||||
|
|
||||||
|
@ -259,7 +259,7 @@ class HelpfulFootprintWizardPlugin(pcbnew.FootprintWizardPlugin,
|
||||||
"""
|
"""
|
||||||
IPC nominal
|
IPC nominal
|
||||||
"""
|
"""
|
||||||
return pcbnew.FromMM(1.2)
|
return pcbnew.FromMM(1.0)
|
||||||
|
|
||||||
def GetTextThickness(self):
|
def GetTextThickness(self):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -37,7 +37,7 @@ class RowedGridArray(PA.PadGridArray):
|
||||||
|
|
||||||
class RowedFootprint(HFPW.HelpfulFootprintWizardPlugin):
|
class RowedFootprint(HFPW.HelpfulFootprintWizardPlugin):
|
||||||
|
|
||||||
pad_count_key = 'pas count'
|
pad_count_key = 'pad count'
|
||||||
row_count_key = 'row count'
|
row_count_key = 'row count'
|
||||||
row_spacing_key = 'row spacing'
|
row_spacing_key = 'row spacing'
|
||||||
pad_length_key = 'pad length'
|
pad_length_key = 'pad length'
|
||||||
|
|
|
@ -289,7 +289,7 @@ static DRAWSEGMENT* findPoint( const wxPoint& aPoint, ::PCB_TYPE_COLLECTOR* item
|
||||||
DRAWSEGMENT* graphic = (DRAWSEGMENT*) (*items)[i];
|
DRAWSEGMENT* graphic = (DRAWSEGMENT*) (*items)[i];
|
||||||
unsigned d;
|
unsigned d;
|
||||||
|
|
||||||
wxASSERT( graphic->Type() == PCB_LINE_T );
|
wxASSERT( graphic->Type() == PCB_LINE_T || graphic->Type() == PCB_MODULE_EDGE_T );
|
||||||
|
|
||||||
switch( graphic->GetShape() )
|
switch( graphic->GetShape() )
|
||||||
{
|
{
|
||||||
|
@ -348,7 +348,7 @@ static DRAWSEGMENT* findPoint( const wxPoint& aPoint, ::PCB_TYPE_COLLECTOR* item
|
||||||
#if defined(DEBUG)
|
#if defined(DEBUG)
|
||||||
if( items->GetCount() )
|
if( items->GetCount() )
|
||||||
{
|
{
|
||||||
printf( "Unable to find segment matching point (%.6g,%.6g) (seg count %d)\n",
|
printf( "Unable to find segment matching point (%.6g;%.6g) (seg count %d)\n",
|
||||||
IU2um( aPoint.x )/1000, IU2um( aPoint.y )/1000,
|
IU2um( aPoint.x )/1000, IU2um( aPoint.y )/1000,
|
||||||
items->GetCount());
|
items->GetCount());
|
||||||
|
|
||||||
|
@ -356,13 +356,22 @@ static DRAWSEGMENT* findPoint( const wxPoint& aPoint, ::PCB_TYPE_COLLECTOR* item
|
||||||
{
|
{
|
||||||
DRAWSEGMENT* graphic = (DRAWSEGMENT*) (*items)[i];
|
DRAWSEGMENT* graphic = (DRAWSEGMENT*) (*items)[i];
|
||||||
|
|
||||||
printf( "item %d, type=%s, start=%.6g %.6g end=%.6g,%.6g\n",
|
if( graphic->GetShape() == S_ARC )
|
||||||
i + 1,
|
printf( "item %d, type=%s, start=%.6g;%.6g end=%.6g;%.6g\n",
|
||||||
TO_UTF8( BOARD_ITEM::ShowShape( graphic->GetShape() ) ),
|
i + 1,
|
||||||
IU2um( graphic->GetStart().x )/1000,
|
TO_UTF8( BOARD_ITEM::ShowShape( graphic->GetShape() ) ),
|
||||||
IU2um( graphic->GetStart().y )/1000,
|
IU2um( graphic->GetArcStart().x )/1000,
|
||||||
IU2um( graphic->GetEnd().x )/1000,
|
IU2um( graphic->GetArcStart().y )/1000,
|
||||||
IU2um( graphic->GetEnd().y )/1000 );
|
IU2um( graphic->GetArcEnd().x )/1000,
|
||||||
|
IU2um( graphic->GetArcEnd().y )/1000 );
|
||||||
|
else
|
||||||
|
printf( "item %d, type=%s, start=%.6g;%.6g end=%.6g;%.6g\n",
|
||||||
|
i + 1,
|
||||||
|
TO_UTF8( BOARD_ITEM::ShowShape( graphic->GetShape() ) ),
|
||||||
|
IU2um( graphic->GetStart().x )/1000,
|
||||||
|
IU2um( graphic->GetStart().y )/1000,
|
||||||
|
IU2um( graphic->GetEnd().x )/1000,
|
||||||
|
IU2um( graphic->GetEnd().y )/1000 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue