Commit 2694c524 authored by Wayne Stambaugh's avatar Wayne Stambaugh

EESchema back annotate code refactoring and other minor changes.

* Push schematic back annotation code down into the appropriate class.
* Minor improvements to back annotate file selection code and user prompt
  strings.
* Minor tool bar tool tip capitalization fixes.
* Change tool bar ID error from message dialog to a debug assert message.
parent 115d1adb
...@@ -17,78 +17,14 @@ ...@@ -17,78 +17,14 @@
#include "sch_component.h" #include "sch_component.h"
/** const wxString BackAnnotateFileWildcard( wxT( "EESchema Back Annotation File (*.stf)|*.stf" ) );
* Function FillFootprintFieldForAllInstancesofComponent
* Search for component "aReference", and place a Footprint in Footprint field
* @param aReference = reference of the component to initialize
* @param aFootPrint = new value for the filed Footprint component
* @param aSetVisible = true to have the field visible, false to set the
* invisible flag
* @return true if the given component is found
* Note:
* the component is searched in the whole schematic, and because some
* components
* have more than one instance (multiple parts per package components)
* the search is not stopped when a reference is found (all instances must be
* found).
*/
bool SCH_EDIT_FRAME::FillFootprintFieldForAllInstancesofComponent( const wxString& aReference,
const wxString& aFootPrint,
bool aSetVisible )
{
SCH_SHEET_PATH* sheet;
SCH_ITEM* DrawList = NULL;
SCH_SHEET_LIST SheetList;
SCH_COMPONENT* Cmp;
bool found = false;
for( sheet = SheetList.GetFirst();
sheet != NULL;
sheet = SheetList.GetNext() )
{
DrawList = (SCH_ITEM*) sheet->LastDrawList();
for( ; (DrawList != NULL); DrawList = DrawList->Next() )
{
if( DrawList->Type() != SCH_COMPONENT_T )
continue;
Cmp = (SCH_COMPONENT*) DrawList;
if( aReference.CmpNoCase( Cmp->GetRef( sheet ) ) == 0 )
{
// Found: Init Footprint Field
/* Give a reasonable value to the field position and
* orientation, if the text is empty at position 0, because
* it is probably not yet initialized
*/
if( Cmp->GetField( FOOTPRINT )->m_Text.IsEmpty()
&& ( Cmp->GetField( FOOTPRINT )->m_Pos == wxPoint( 0, 0 ) ) )
{
Cmp->GetField( FOOTPRINT )->m_Orient = Cmp->GetField(
VALUE )->m_Orient;
Cmp->GetField( FOOTPRINT )->m_Pos = Cmp->GetField(
VALUE )->m_Pos;
Cmp->GetField( FOOTPRINT )->m_Pos.y -= 100;
}
Cmp->GetField( FOOTPRINT )->m_Text = aFootPrint;
if( aSetVisible )
Cmp->GetField( FOOTPRINT )->m_Attributs &=
~TEXT_NO_VISIBLE;
else
Cmp->GetField( FOOTPRINT )->m_Attributs |= TEXT_NO_VISIBLE;
found = true;
}
}
}
return found;
}
bool SCH_EDIT_FRAME::ProcessStuffFile( FILE* aFilename, bool aSetFieldAttributeToVisible ) bool SCH_EDIT_FRAME::ProcessStuffFile( FILE* aFilename, bool aSetFieldAttributeToVisible )
{ {
int LineNum = 0; int LineNum = 0;
char* cp, Ref[256], FootPrint[256], Line[1024]; char* cp, Ref[256], FootPrint[256], Line[1024];
SCH_SHEET_LIST SheetList;
while( GetLine( aFilename, Line, &LineNum, sizeof(Line) ) ) while( GetLine( aFilename, Line, &LineNum, sizeof(Line) ) )
{ {
...@@ -104,9 +40,7 @@ bool SCH_EDIT_FRAME::ProcessStuffFile( FILE* aFilename, bool aSetFieldAttributeT ...@@ -104,9 +40,7 @@ bool SCH_EDIT_FRAME::ProcessStuffFile( FILE* aFilename, bool aSetFieldAttributeT
wxString reference = FROM_UTF8( Ref ); wxString reference = FROM_UTF8( Ref );
wxString Footprint = FROM_UTF8( FootPrint ); wxString Footprint = FROM_UTF8( FootPrint );
FillFootprintFieldForAllInstancesofComponent( reference, SheetList.SetComponentFootprint( reference, Footprint, aSetFieldAttributeToVisible );
Footprint,
aSetFieldAttributeToVisible );
} }
} }
...@@ -114,56 +48,44 @@ bool SCH_EDIT_FRAME::ProcessStuffFile( FILE* aFilename, bool aSetFieldAttributeT ...@@ -114,56 +48,44 @@ bool SCH_EDIT_FRAME::ProcessStuffFile( FILE* aFilename, bool aSetFieldAttributeT
} }
/* Backann footprint info to schematic.
*/
bool SCH_EDIT_FRAME::ReadInputStuffFile() bool SCH_EDIT_FRAME::ReadInputStuffFile()
{ {
wxString Line, filename; wxString title, filename;
FILE* StuffFile; FILE* file;
wxString msg; wxString msg;
bool SetFieldToVisible = true; bool visible = false;
filename = EDA_FileSelector( _( "Load Stuff File" ), wxFileDialog dlg( this, _( "Load Back Annotate File" ), wxEmptyString, wxEmptyString,
wxEmptyString, BackAnnotateFileWildcard, wxFD_OPEN | wxFD_FILE_MUST_EXIST );
wxEmptyString,
wxT( ".stf" ), if( dlg.ShowModal() == wxID_CANCEL )
wxT( "*.stf" ),
this,
wxFD_OPEN,
FALSE
);
if( filename.IsEmpty() )
return FALSE;
Line = wxGetApp().GetAppName() + wxT( " " ) + GetBuildVersion();
Line += wxT( " " ) + filename;
SetTitle( Line );
if( filename.IsEmpty() )
return FALSE;
int diag = wxMessageBox(
_( "Set the foot print field to visible?" ),
_( "Field Display Option" ),
wxYES_NO | wxICON_QUESTION | wxCANCEL, this );
if( diag == wxCANCEL )
return false; return false;
if( diag == wxYES )
SetFieldToVisible = true;
else
SetFieldToVisible = false;
StuffFile = wxFopen( filename, wxT( "rt" ) ); filename = dlg.GetPath();
if( StuffFile == NULL ) title = wxGetApp().GetAppName() + wxT( " " ) + GetBuildVersion();
title += wxT( " " ) + filename;
SetTitle( title );
int response = wxMessageBox( _( "Do you want to make all the foot print fields visible?" ),
_( "Field Display Option" ),
wxYES_NO | wxICON_QUESTION | wxCANCEL, this );
if( response == wxCANCEL )
return false;
if( response == wxYES )
visible = true;
file = wxFopen( filename, wxT( "rt" ) );
if( file == NULL )
{ {
msg.Printf( _( "Failed to open stuff file <%s>" ), filename.GetData() ); msg.Printf( _( "Failed to open back annotate file <%s>" ), filename.GetData() );
DisplayError( this, msg, 20 ); DisplayError( this, msg );
return FALSE; return false;
} }
ProcessStuffFile( StuffFile, SetFieldToVisible ); ProcessStuffFile( file, visible );
return TRUE; return true;
} }
...@@ -992,6 +992,50 @@ SCH_TEXT* SCH_SCREEN::GetLabel( const wxPoint& aPosition, int aAccuracy ) ...@@ -992,6 +992,50 @@ SCH_TEXT* SCH_SCREEN::GetLabel( const wxPoint& aPosition, int aAccuracy )
} }
bool SCH_SCREEN::SetComponentFootprint( SCH_SHEET_PATH* aSheetPath, const wxString& aReference,
const wxString& aFootPrint, bool aSetVisible )
{
SCH_COMPONENT* component;
bool found = false;
for( SCH_ITEM* item = GetDrawItems(); item != NULL; item = item->Next() )
{
if( item->Type() != SCH_COMPONENT_T )
continue;
component = (SCH_COMPONENT*) item;
if( aReference.CmpNoCase( component->GetRef( aSheetPath ) ) == 0 )
{
// Found: Init Footprint Field
/* Give a reasonable value to the field position and
* orientation, if the text is empty at position 0, because
* it is probably not yet initialized
*/
if( component->GetField( FOOTPRINT )->m_Text.IsEmpty()
&& ( component->GetField( FOOTPRINT )->m_Pos == wxPoint( 0, 0 ) ) )
{
component->GetField( FOOTPRINT )->m_Orient = component->GetField( VALUE )->m_Orient;
component->GetField( FOOTPRINT )->m_Pos = component->GetField( VALUE )->m_Pos;
component->GetField( FOOTPRINT )->m_Pos.y -= 100;
}
component->GetField( FOOTPRINT )->m_Text = aFootPrint;
if( aSetVisible )
component->GetField( FOOTPRINT )->m_Attributs &= ~TEXT_NO_VISIBLE;
else
component->GetField( FOOTPRINT )->m_Attributs |= TEXT_NO_VISIBLE;
found = true;
}
}
return found;
}
/******************************************************************/ /******************************************************************/
/* Class SCH_SCREENS to handle the list of screens in a hierarchy */ /* Class SCH_SCREENS to handle the list of screens in a hierarchy */
/******************************************************************/ /******************************************************************/
......
...@@ -448,6 +448,18 @@ SCH_ITEM* SCH_SHEET_PATH::MatchNextItem( wxFindReplaceData& aSearchData, ...@@ -448,6 +448,18 @@ SCH_ITEM* SCH_SHEET_PATH::MatchNextItem( wxFindReplaceData& aSearchData,
} }
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!
...@@ -786,3 +798,15 @@ SCH_ITEM* SCH_SHEET_LIST::MatchNextItem( wxFindReplaceData& aSearchData, ...@@ -786,3 +798,15 @@ SCH_ITEM* SCH_SHEET_LIST::MatchNextItem( wxFindReplaceData& aSearchData,
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 != NULL; path = GetNext() )
found = path->SetComponentFootprint( aReference, aFootPrint, aSetVisible );
return found;
}
...@@ -100,27 +100,27 @@ public: ...@@ -100,27 +100,27 @@ public:
* @param aSheetPathToTest = sheet path to compare * @param aSheetPathToTest = sheet path to compare
* @return -1 if different, 0 if same * @return -1 if different, 0 if same
*/ */
int Cmp( const SCH_SHEET_PATH& aSheetPathToTest ) const; int Cmp( const SCH_SHEET_PATH& aSheetPathToTest ) const;
/** /**
* Function Last * Function Last
* returns a pointer to the last sheet of the list * returns a pointer to the last sheet of the list
* One can see the others sheet as the "path" to reach this last sheet * One can see the others sheet as the "path" to reach this last sheet
*/ */
SCH_SHEET* Last(); SCH_SHEET* Last();
/** /**
* Function LastScreen * Function LastScreen
* @return the SCH_SCREEN relative to the last sheet in list * @return the SCH_SCREEN relative to the last sheet in list
*/ */
SCH_SCREEN* LastScreen(); SCH_SCREEN* LastScreen();
/** /**
* Function LastScreen * Function LastScreen
* @return a pointer to the first schematic item handled by the * @return a pointer to the first schematic item handled by the
* SCH_SCREEN relative to the last sheet in list * SCH_SCREEN relative to the last sheet in list
*/ */
SCH_ITEM* LastDrawList(); SCH_ITEM* LastDrawList();
/** /**
* Get the last schematic item relative to the first sheet in the list. * Get the last schematic item relative to the first sheet in the list.
...@@ -128,7 +128,7 @@ public: ...@@ -128,7 +128,7 @@ public:
* @return Last schematic item relative to the first sheet in the list if list * @return Last schematic item relative to the first sheet in the list if list
* is not empty. Otherwise NULL. * is not empty. Otherwise NULL.
*/ */
SCH_ITEM* FirstDrawList(); SCH_ITEM* FirstDrawList();
/** /**
* Function Push * Function Push
...@@ -137,7 +137,7 @@ public: ...@@ -137,7 +137,7 @@ public:
* Push is used when entered a sheet to select or analyze it * Push is used when entered a sheet to select or analyze it
* This is like cd &ltdirectory&gt in directories navigation * This is like cd &ltdirectory&gt in directories navigation
*/ */
void Push( SCH_SHEET* aSheet ); void Push( SCH_SHEET* aSheet );
/** /**
* Function Pop * Function Pop
...@@ -146,7 +146,7 @@ public: ...@@ -146,7 +146,7 @@ public:
* Pop is used when leaving a sheet after a selection or analyze * Pop is used when leaving a sheet after a selection or analyze
* This is like cd .. in directories navigation * This is like cd .. in directories navigation
*/ */
SCH_SHEET* Pop(); SCH_SHEET* Pop();
/** /**
* Function Path * Function Path
...@@ -154,7 +154,7 @@ public: ...@@ -154,7 +154,7 @@ public:
* sheet parameters * sheet parameters
* a path is something like / (root) or /34005677 or /34005677/00AE4523 * a path is something like / (root) or /34005677 or /34005677/00AE4523
*/ */
wxString Path(); wxString Path();
/** /**
* Function PathHumanReadable * Function PathHumanReadable
...@@ -163,7 +163,7 @@ public: ...@@ -163,7 +163,7 @@ public:
* stamps in the path. (Time stamps do not change even when editing * stamps in the path. (Time stamps do not change even when editing
* sheet parameters). * sheet parameters).
*/ */
wxString PathHumanReadable() const; wxString PathHumanReadable() const;
/** /**
* Function BuildSheetPathInfoFromSheetPathValue * Function BuildSheetPathInfoFromSheetPathValue
...@@ -172,8 +172,7 @@ public: ...@@ -172,8 +172,7 @@ public:
* @param aFound - Please document me. * @param aFound - Please document me.
* @return true if success else false * @return true if success else false
*/ */
bool BuildSheetPathInfoFromSheetPathValue( const wxString& aPath, bool BuildSheetPathInfoFromSheetPathValue( const wxString& aPath, bool aFound = false );
bool aFound = false );
/** /**
* Function UpdateAllScreenReferences * Function UpdateAllScreenReferences
...@@ -184,7 +183,7 @@ public: ...@@ -184,7 +183,7 @@ public:
* but with different references and part selections according to the * but with different references and part selections according to the
* displayed sheet * displayed sheet
*/ */
void UpdateAllScreenReferences(); void UpdateAllScreenReferences();
/** /**
* Function AnnotatePowerSymbols * Function AnnotatePowerSymbols
...@@ -202,8 +201,20 @@ public: ...@@ -202,8 +201,20 @@ public:
* @param aReferences List of references to populate. * @param aReferences List of references to populate.
* @param aIncludePowerSymbols Set to false to only get normal components. * @param aIncludePowerSymbols Set to false to only get normal components.
*/ */
void GetComponents( SCH_REFERENCE_LIST& aReferences, void GetComponents( SCH_REFERENCE_LIST& aReferences, bool aIncludePowerSymbols = true );
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 fiield.
* @param aSetVisible The value to set the field visibility flag.
* @retrun 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 ojbect. * Find the next schematic item in this sheet ojbect.
...@@ -405,6 +416,19 @@ public: ...@@ -405,6 +416,19 @@ public:
SCH_ITEM* aLastItem, SCH_ITEM* aLastItem,
wxPoint * aFindLocation ); wxPoint * aFindLocation );
/**
* 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 fiield.
* @param aSetVisible The value to set the field visibility flag.
* @retrun True if \a aReference was found otherwise false.
*/
bool SetComponentFootprint( const wxString& aReference, const wxString& aFootPrint,
bool aSetVisible );
private: private:
/** /**
......
...@@ -100,19 +100,19 @@ void SCH_EDIT_FRAME::ReCreateHToolbar() ...@@ -100,19 +100,19 @@ void SCH_EDIT_FRAME::ReCreateHToolbar()
m_HToolBar->AddSeparator(); m_HToolBar->AddSeparator();
m_HToolBar->AddTool( ID_GET_NETLIST, wxEmptyString, wxBitmap( netlist_xpm ), m_HToolBar->AddTool( ID_GET_NETLIST, wxEmptyString, wxBitmap( netlist_xpm ),
_( "Netlist generation" ) ); _( "Generate netlist" ) );
m_HToolBar->AddTool( ID_GET_ANNOTATE, wxEmptyString, wxBitmap( annotate_xpm ), m_HToolBar->AddTool( ID_GET_ANNOTATE, wxEmptyString, wxBitmap( annotate_xpm ),
_( "Annotate schematic" ) ); _( "Annotate schematic" ) );
m_HToolBar->AddTool( ID_GET_ERC, wxEmptyString, wxBitmap( erc_xpm ), m_HToolBar->AddTool( ID_GET_ERC, wxEmptyString, wxBitmap( erc_xpm ),
_( "Schematic Electric Rules Check" ) ); _( "Perform electric rules check" ) );
m_HToolBar->AddTool( ID_GET_TOOLS, wxEmptyString, wxBitmap( tools_xpm ), m_HToolBar->AddTool( ID_GET_TOOLS, wxEmptyString, wxBitmap( tools_xpm ),
_( "Bill of material and/or Cross references" ) ); _( "Generate bill of materials and/or cross references" ) );
m_HToolBar->AddTool( ID_BACKANNO_ITEMS, wxEmptyString, wxBitmap( backanno_xpm ), m_HToolBar->AddTool( ID_BACKANNO_ITEMS, wxEmptyString, wxBitmap( backanno_xpm ),
_( "Backannotate footprint" ) ); _( "Back bnnotate component foot prints" ) );
// after adding the tools to the toolbar, must call Realize() to reflect the changes // after adding the tools to the toolbar, must call Realize() to reflect the changes
m_HToolBar->Realize(); m_HToolBar->Realize();
...@@ -254,7 +254,7 @@ void SCH_EDIT_FRAME::OnSelectOptionToolbar( wxCommandEvent& event ) ...@@ -254,7 +254,7 @@ void SCH_EDIT_FRAME::OnSelectOptionToolbar( wxCommandEvent& event )
break; break;
default: default:
DisplayError( this, wxT( "OnSelectOptionToolbar() error" ) ); wxFAIL_MSG( wxT( "Unexpected select option tool bar ID." ) );
break; break;
} }
} }
...@@ -357,6 +357,20 @@ public: ...@@ -357,6 +357,20 @@ public:
*/ */
SCH_TEXT* GetLabel( const wxPoint& aPosition, int aAccuracy = 0 ); SCH_TEXT* GetLabel( const wxPoint& aPosition, int aAccuracy = 0 );
/**
* Function SetFootprintField
* searches screen for a component with \a aReference and set the footprint field to
* \a aFootPrint if found.
*
* @param aSheetPath The sheet path used to look up the reference designator.
* @param aReference The reference designator of the component.
* @param aFootPrint The value to set the footprint fiield.
* @param aSetVisible The value to set the field visibility flag.
* @retrun True if \a aReference was found otherwise false.
*/
bool SetComponentFootprint( SCH_SHEET_PATH* aSheetPath, const wxString& aReference,
const wxString& aFootPrint, bool aSetVisible );
/** /**
* Function SelectBlockItems * Function SelectBlockItems
* creates a list of items found when a block command is initiated. The items selected * creates a list of items found when a block command is initiated. The items selected
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment