From 2694c524b468777906bb60a064488acba599dfaf Mon Sep 17 00:00:00 2001 From: Wayne Stambaugh Date: Mon, 28 Mar 2011 14:23:01 -0400 Subject: [PATCH] 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. --- eeschema/backanno.cpp | 142 ++++++++---------------------------- eeschema/sch_screen.cpp | 44 +++++++++++ eeschema/sch_sheet_path.cpp | 24 ++++++ eeschema/sch_sheet_path.h | 52 +++++++++---- eeschema/tool_sch.cpp | 10 +-- include/class_sch_screen.h | 14 ++++ 6 files changed, 157 insertions(+), 129 deletions(-) diff --git a/eeschema/backanno.cpp b/eeschema/backanno.cpp index 10c86dc4d3..c65c894b4c 100644 --- a/eeschema/backanno.cpp +++ b/eeschema/backanno.cpp @@ -17,78 +17,14 @@ #include "sch_component.h" -/** - * 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; -} +const wxString BackAnnotateFileWildcard( wxT( "EESchema Back Annotation File (*.stf)|*.stf" ) ); bool SCH_EDIT_FRAME::ProcessStuffFile( FILE* aFilename, bool aSetFieldAttributeToVisible ) { int LineNum = 0; char* cp, Ref[256], FootPrint[256], Line[1024]; + SCH_SHEET_LIST SheetList; while( GetLine( aFilename, Line, &LineNum, sizeof(Line) ) ) { @@ -104,9 +40,7 @@ bool SCH_EDIT_FRAME::ProcessStuffFile( FILE* aFilename, bool aSetFieldAttributeT wxString reference = FROM_UTF8( Ref ); wxString Footprint = FROM_UTF8( FootPrint ); - FillFootprintFieldForAllInstancesofComponent( reference, - Footprint, - aSetFieldAttributeToVisible ); + SheetList.SetComponentFootprint( reference, Footprint, aSetFieldAttributeToVisible ); } } @@ -114,56 +48,44 @@ bool SCH_EDIT_FRAME::ProcessStuffFile( FILE* aFilename, bool aSetFieldAttributeT } -/* Backann footprint info to schematic. - */ bool SCH_EDIT_FRAME::ReadInputStuffFile() { - wxString Line, filename; - FILE* StuffFile; + wxString title, filename; + FILE* file; wxString msg; - bool SetFieldToVisible = true; + bool visible = false; - filename = EDA_FileSelector( _( "Load Stuff File" ), - wxEmptyString, - wxEmptyString, - wxT( ".stf" ), - wxT( "*.stf" ), - this, - wxFD_OPEN, - FALSE - ); + wxFileDialog dlg( this, _( "Load Back Annotate File" ), wxEmptyString, wxEmptyString, + BackAnnotateFileWildcard, wxFD_OPEN | wxFD_FILE_MUST_EXIST ); - 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 ) + if( dlg.ShowModal() == wxID_CANCEL ) return false; - if( diag == wxYES ) - SetFieldToVisible = true; - else - SetFieldToVisible = false; - StuffFile = wxFopen( filename, wxT( "rt" ) ); - if( StuffFile == NULL ) + filename = dlg.GetPath(); + 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() ); - DisplayError( this, msg, 20 ); - return FALSE; + msg.Printf( _( "Failed to open back annotate file <%s>" ), filename.GetData() ); + DisplayError( this, msg ); + return false; } - ProcessStuffFile( StuffFile, SetFieldToVisible ); + ProcessStuffFile( file, visible ); - return TRUE; + return true; } diff --git a/eeschema/sch_screen.cpp b/eeschema/sch_screen.cpp index 2c9872fe21..5402e89975 100644 --- a/eeschema/sch_screen.cpp +++ b/eeschema/sch_screen.cpp @@ -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 */ /******************************************************************/ diff --git a/eeschema/sch_sheet_path.cpp b/eeschema/sch_sheet_path.cpp index 5857a9b812..7403eb021f 100644 --- a/eeschema/sch_sheet_path.cpp +++ b/eeschema/sch_sheet_path.cpp @@ -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 ) { if( this == &d1 ) // Self assignment is bad! @@ -786,3 +798,15 @@ SCH_ITEM* SCH_SHEET_LIST::MatchNextItem( wxFindReplaceData& aSearchData, 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; +} diff --git a/eeschema/sch_sheet_path.h b/eeschema/sch_sheet_path.h index 4f1ca32c4d..5fcf152304 100644 --- a/eeschema/sch_sheet_path.h +++ b/eeschema/sch_sheet_path.h @@ -100,27 +100,27 @@ public: * @param aSheetPathToTest = sheet path to compare * @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 * returns a pointer to the last sheet of the list * One can see the others sheet as the "path" to reach this last sheet */ - SCH_SHEET* Last(); + SCH_SHEET* Last(); /** * Function LastScreen * @return the SCH_SCREEN relative to the last sheet in list */ - SCH_SCREEN* LastScreen(); + SCH_SCREEN* LastScreen(); /** * Function LastScreen * @return a pointer to the first schematic item handled by the * 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. @@ -128,7 +128,7 @@ public: * @return Last schematic item relative to the first sheet in the list if list * is not empty. Otherwise NULL. */ - SCH_ITEM* FirstDrawList(); + SCH_ITEM* FirstDrawList(); /** * Function Push @@ -137,7 +137,7 @@ public: * Push is used when entered a sheet to select or analyze it * This is like cd <directory> in directories navigation */ - void Push( SCH_SHEET* aSheet ); + void Push( SCH_SHEET* aSheet ); /** * Function Pop @@ -146,7 +146,7 @@ public: * Pop is used when leaving a sheet after a selection or analyze * This is like cd .. in directories navigation */ - SCH_SHEET* Pop(); + SCH_SHEET* Pop(); /** * Function Path @@ -154,7 +154,7 @@ public: * sheet parameters * a path is something like / (root) or /34005677 or /34005677/00AE4523 */ - wxString Path(); + wxString Path(); /** * Function PathHumanReadable @@ -163,7 +163,7 @@ public: * stamps in the path. (Time stamps do not change even when editing * sheet parameters). */ - wxString PathHumanReadable() const; + wxString PathHumanReadable() const; /** * Function BuildSheetPathInfoFromSheetPathValue @@ -172,8 +172,7 @@ public: * @param aFound - Please document me. * @return true if success else false */ - bool BuildSheetPathInfoFromSheetPathValue( const wxString& aPath, - bool aFound = false ); + bool BuildSheetPathInfoFromSheetPathValue( const wxString& aPath, bool aFound = false ); /** * Function UpdateAllScreenReferences @@ -184,7 +183,7 @@ public: * but with different references and part selections according to the * displayed sheet */ - void UpdateAllScreenReferences(); + void UpdateAllScreenReferences(); /** * Function AnnotatePowerSymbols @@ -202,8 +201,20 @@ public: * @param aReferences List of references to populate. * @param aIncludePowerSymbols Set to false to only get normal components. */ - void GetComponents( SCH_REFERENCE_LIST& aReferences, - bool aIncludePowerSymbols = true ); + void GetComponents( SCH_REFERENCE_LIST& aReferences, 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. @@ -405,6 +416,19 @@ public: SCH_ITEM* aLastItem, 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: /** diff --git a/eeschema/tool_sch.cpp b/eeschema/tool_sch.cpp index 7017e97fa9..9d67ebd350 100644 --- a/eeschema/tool_sch.cpp +++ b/eeschema/tool_sch.cpp @@ -100,19 +100,19 @@ void SCH_EDIT_FRAME::ReCreateHToolbar() m_HToolBar->AddSeparator(); m_HToolBar->AddTool( ID_GET_NETLIST, wxEmptyString, wxBitmap( netlist_xpm ), - _( "Netlist generation" ) ); + _( "Generate netlist" ) ); m_HToolBar->AddTool( ID_GET_ANNOTATE, wxEmptyString, wxBitmap( annotate_xpm ), _( "Annotate schematic" ) ); 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 ), - _( "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 ), - _( "Backannotate footprint" ) ); + _( "Back bnnotate component foot prints" ) ); // after adding the tools to the toolbar, must call Realize() to reflect the changes m_HToolBar->Realize(); @@ -254,7 +254,7 @@ void SCH_EDIT_FRAME::OnSelectOptionToolbar( wxCommandEvent& event ) break; default: - DisplayError( this, wxT( "OnSelectOptionToolbar() error" ) ); + wxFAIL_MSG( wxT( "Unexpected select option tool bar ID." ) ); break; } } diff --git a/include/class_sch_screen.h b/include/class_sch_screen.h index a5fca4637e..f3b89dd9ce 100644 --- a/include/class_sch_screen.h +++ b/include/class_sch_screen.h @@ -357,6 +357,20 @@ public: */ 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 * creates a list of items found when a block command is initiated. The items selected