diff options
Diffstat (limited to 'eeschema/annotate.cpp')
-rw-r--r-- | eeschema/annotate.cpp | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/eeschema/annotate.cpp b/eeschema/annotate.cpp new file mode 100644 index 0000000..1b2a27d --- /dev/null +++ b/eeschema/annotate.cpp @@ -0,0 +1,200 @@ +/** + * @file annotate.cpp + * @brief Component annotation. + */ + +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2004-2013 KiCad Developers, see change_log.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include <algorithm> + +#include <fctsys.h> +#include <class_drawpanel.h> +#include <confirm.h> +#include <schframe.h> + +#include <sch_reference_list.h> +#include <class_library.h> + +void SCH_EDIT_FRAME::DeleteAnnotation( bool aCurrentSheetOnly ) +{ + if( aCurrentSheetOnly ) + { + SCH_SCREEN* screen = GetScreen(); + wxCHECK_RET( screen != NULL, wxT( "Attempt to clear annotation of a NULL screen." ) ); + screen->ClearAnnotation( m_CurrentSheet ); + } + else + { + SCH_SCREENS ScreenList; + ScreenList.ClearAnnotation(); + } + + // Update the references for the sheet that is currently being displayed. + m_CurrentSheet->UpdateAllScreenReferences(); + GetCanvas()->Refresh(); + OnModify(); +} + + +void SCH_EDIT_FRAME::AnnotateComponents( bool aAnnotateSchematic, + ANNOTATE_ORDER_T aSortOption, + ANNOTATE_OPTION_T aAlgoOption, + bool aResetAnnotation, + bool aRepairTimestamps, + bool aLockUnits ) +{ + SCH_REFERENCE_LIST references; + + SCH_SCREENS screens; + + // Build the sheet list. + SCH_SHEET_LIST sheets; + + // Map of locked components + SCH_MULTI_UNIT_REFERENCE_MAP lockedComponents; + + // Test for and replace duplicate time stamps in components and sheets. Duplicate + // time stamps can happen with old schematics, schematic conversions, or manual + // editing of files. + if( aRepairTimestamps ) + { + int count = screens.ReplaceDuplicateTimeStamps(); + + if( count ) + { + wxString msg; + msg.Printf( _( "%d duplicate time stamps were found and replaced." ), count ); + DisplayInfoMessage( NULL, msg, 2 ); + } + } + + // If units must be locked, collect all the sets that must be annotated together. + if( aLockUnits ) + { + if( aAnnotateSchematic ) + { + sheets.GetMultiUnitComponents( Prj().SchLibs(), lockedComponents ); + } + else + { + m_CurrentSheet->GetMultiUnitComponents( Prj().SchLibs(), lockedComponents ); + } + } + + // If it is an annotation for all the components, reset previous annotation. + if( aResetAnnotation ) + DeleteAnnotation( !aAnnotateSchematic ); + + // Set sheet number and number of sheets. + SetSheetNumberAndCount(); + + // Build component list + if( aAnnotateSchematic ) + { + sheets.GetComponents( Prj().SchLibs(), references ); + } + else + { + m_CurrentSheet->GetComponents( Prj().SchLibs(), references ); + } + + // Break full components reference in name (prefix) and number: + // example: IC1 become IC, and 1 + references.SplitReferences(); + + switch( aSortOption ) + { + default: + case SORT_BY_X_POSITION: + references.SortByXCoordinate(); + break; + + case SORT_BY_Y_POSITION: + references.SortByYCoordinate(); + break; + } + + bool useSheetNum = false; + int idStep = 100; + + switch( aAlgoOption ) + { + default: + case INCREMENTAL_BY_REF: + break; + + case SHEET_NUMBER_X_100: + useSheetNum = true; + break; + + case SHEET_NUMBER_X_1000: + useSheetNum = true; + idStep = 1000; + break; + } + + // Recalculate and update reference numbers in schematic + references.Annotate( useSheetNum, idStep, lockedComponents ); + references.UpdateAnnotation(); + + wxArrayString errors; + + // Final control (just in case ... ). + if( CheckAnnotate( &errors, !aAnnotateSchematic ) ) + { + wxString msg; + + for( size_t i = 0; i < errors.GetCount(); i++ ) + msg += errors[i]; + + // wxLogWarning is a cheap and dirty way to dump a potentially long list of + // strings to a dialog that can be saved to a file. This should be replaced + // by a more elegant solution. + wxLogWarning( msg ); + } + + OnModify(); + + // Update on screen references, that can be modified by previous calculations: + m_CurrentSheet->UpdateAllScreenReferences(); + SetSheetNumberAndCount(); + + m_canvas->Refresh( true ); +} + + +int SCH_EDIT_FRAME::CheckAnnotate( wxArrayString* aMessageList, bool aOneSheetOnly ) +{ + // build the screen list + SCH_SHEET_LIST SheetList; + SCH_REFERENCE_LIST ComponentsList; + + // Build the list of components + if( !aOneSheetOnly ) + SheetList.GetComponents( Prj().SchLibs(), ComponentsList ); + else + m_CurrentSheet->GetComponents( Prj().SchLibs(), ComponentsList ); + + return ComponentsList.CheckAnnotation( aMessageList ); +} |