diff --git a/CMakeLists.txt b/CMakeLists.txt index ca9ca67476..442ef49517 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,8 +17,18 @@ set( CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMakeModules ) option( USE_KIWAY_DLLS "Build the major modules as DLLs or DSOs, will soon be the norm." OFF ) -#for those who bored with uppercase -option( KICAD_KEEPCASE "turn-off automatic component name conversion to uppercase if selected" ) +# The desire is to migrate designs *away from* case independence, and to create designs which use +# literally (case specific) interpreted component names. But for backwards compatibility, +# you may turn OFF this option if you really must. (Remember that with KiCad using text +# data files, typically you would be better off simply doctoring those files into +# a case literal state with a text editor and move forward into the brave new +# world of case specificity. Also, BOM generators may not work properly when you +# have this option turned OFF, the xml export's referential integrity is broken +# on library part name. Hence the default is ON now, as of 29-Jan-2014. +option( KICAD_KEEPCASE + "ON= case specific string matching on component names, OFF= match names as if they were spelt using uppercase." + ON + ) option( USE_WX_GRAPHICS_CONTEXT "Use wxGraphicsContext for rendering ( default OFF). Warning, this is experimental" ) @@ -308,7 +318,7 @@ if ( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC ) if( KICAD_BUILD_DYNAMIC ) message(STATUS "KICAD_BUILD_DYNAMIC set") - # TODO - Library packaging/relocation + # TODO - Library packaging/relocation endif() add_custom_target( lib-dependencies @@ -335,7 +345,7 @@ if ( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC ) set( CAIRO_INCLUDE_DIR "${CAIRO_ROOT}/include/cairo") set( CAIRO_LIBRARY "${CAIRO_ROOT}/lib/libcairo.a") - if( KICAD_BUILD_DYNAMIC AND APPLE ) + if( KICAD_BUILD_DYNAMIC AND APPLE ) add_custom_target( osx_fix_bundles ALL DEPENDS cvpcb eeschema gerbview kicad pcbnew bitmap2component pcb_calculator pl_editor) add_custom_command(TARGET osx_fix_bundles POST_BUILD COMMAND scripts/osx_fixbundle.sh COMMENT "Migrating dylibs to bundles") endif() @@ -533,7 +543,7 @@ add_dependencies( pcad2kicadpcb lib-dependencies ) add_dependencies( polygon lib-dependencies ) add_dependencies( pl_editor lib-dependencies ) add_dependencies( pnsrouter lib-dependencies ) - if ( BUILD_GITHUB_PLUGIN ) + if ( BUILD_GITHUB_PLUGIN ) add_dependencies( github_plugin lib-dependencies ) endif() endif() diff --git a/TODO.txt b/TODO.txt index f7c42ce854..0eeec9f0d9 100644 --- a/TODO.txt +++ b/TODO.txt @@ -63,6 +63,6 @@ PCBNew Dick's Final TODO List: ====================== *) Get licensing cleaned up. -*) Re-arrange the repo architecture. *) DLL-ization of pcbnew & eeschema http://www.eevblog.com/forum/open-source-kicad-geda/seriously-irritated-with-the-library-editor!/ + https://blueprints.launchpad.net/kicad/+spec/modular-kicad diff --git a/eeschema/class_libentry.cpp b/eeschema/class_libentry.cpp index f42078798e..489114efb8 100644 --- a/eeschema/class_libentry.cpp +++ b/eeschema/class_libentry.cpp @@ -588,7 +588,7 @@ bool LIB_COMPONENT::Save( OUTPUTFORMATTER& aFormatter ) // Save data aFormatter.Print( 0, "DEF" ); -#if defined(DEBUG) +#if 0 && defined(DEBUG) if( value.GetText() == wxT( "R" ) ) { int breakhere = 1; @@ -779,7 +779,11 @@ bool LIB_COMPONENT::Load( LINE_READER& aLineReader, wxString& aErrorMsg ) if( componentName[0] != '~' ) { m_name = FROM_UTF8( componentName ); + +#ifndef KICAD_KEEPCASE m_name = m_name.MakeUpper(); +#endif + value.SetText( m_name ); } else diff --git a/eeschema/class_libentry.h b/eeschema/class_libentry.h index f5856758bd..695102bc20 100644 --- a/eeschema/class_libentry.h +++ b/eeschema/class_libentry.h @@ -45,15 +45,31 @@ class LIB_COMPONENT; class LIB_FIELD; +/// Compiler controlled string compare function, either case independent or not: +inline int Cmp_KEEPCASE( const wxString& aString1, const wxString& aString2 ) +{ +#ifdef KICAD_KEEPCASE + // case specificity: + return aString1.Cmp( aString2 ); +#else + // case independence: + return aString1.CmpNoCase( aString2 ); +#endif +} + + /** * LIB_ALIAS map sorting. */ struct AliasMapSort { bool operator() ( const wxString& aItem1, const wxString& aItem2 ) const - { return aItem1.CmpNoCase( aItem2 ) < 0; } + { + return Cmp_KEEPCASE( aItem1, aItem2 ) < 0; + } }; + /** * Alias map used by component library object. */ diff --git a/eeschema/class_library.cpp b/eeschema/class_library.cpp index 284142bc43..50e7da1ad2 100644 --- a/eeschema/class_library.cpp +++ b/eeschema/class_library.cpp @@ -45,13 +45,14 @@ #include static const wxString duplicate_name_msg = -_( "Library <%s> has duplicate entry name <%s>.\n\ -This may cause some unexpected behavior when loading components into a schematic." ); + _( "Library '%s' has duplicate entry name '%s'.\n" + "This may cause some unexpected behavior when loading components into a schematic." ); bool operator==( const CMP_LIBRARY& aLibrary, const wxString& aName ) { - return aLibrary.GetName().CmpNoCase( aName ) == 0; + // See our header class_libentry.h for function Cmp_KEEPCASE(). + return Cmp_KEEPCASE( aLibrary.GetName(), aName ) == 0; } @@ -70,9 +71,9 @@ bool operator<( const CMP_LIBRARY& aItem1, const CMP_LIBRARY& aItem2 ) if( aItem1.IsCache() ) return false; - /* If the sort order array isn't set, then sort alphabetically except. */ + // If the sort order array isn't set, then sort alphabetically except. if( CMP_LIBRARY::GetSortOrder().IsEmpty() ) - return aItem1.GetName().CmpNoCase( aItem2.GetName() ) < 0; + return Cmp_KEEPCASE( aItem1.GetName(), aItem2.GetName() ) < 0; int i1 = CMP_LIBRARY::GetSortOrder().Index( aItem1.GetName(), false ); int i2 = CMP_LIBRARY::GetSortOrder().Index( aItem2.GetName(), false ); @@ -109,8 +110,9 @@ CMP_LIBRARY::~CMP_LIBRARY() { for( LIB_ALIAS_MAP::iterator it=aliases.begin(); it!=aliases.end(); it++ ) { - LIB_ALIAS* alias = (*it).second; - LIB_COMPONENT* component = alias->GetComponent(); + LIB_ALIAS* alias = (*it).second; + LIB_COMPONENT* component = alias->GetComponent(); + alias = component->RemoveAlias( alias ); if( alias == NULL ) @@ -165,7 +167,6 @@ void CMP_LIBRARY::SearchEntryNames( std::vector& aNames, for( it = aliases.begin(); it!=aliases.end(); it++ ) { - if( !aKeySearch.IsEmpty() && KeyWordOk( aKeySearch, (*it).second->GetKeyWords() ) ) { wxArrayString item; @@ -226,7 +227,6 @@ bool CMP_LIBRARY::Conflicts( LIB_COMPONENT* aComponent ) LIB_ALIAS* CMP_LIBRARY::FindEntry( const wxString& aName ) { - LIB_ALIAS_MAP::iterator it = aliases.find( aName ); if( it != aliases.end() ) @@ -247,10 +247,19 @@ LIB_ALIAS* CMP_LIBRARY::GetFirstEntry() LIB_COMPONENT* CMP_LIBRARY::FindComponent( const wxString& aName ) { - LIB_COMPONENT* component = NULL; - LIB_ALIAS* entry = FindEntry( aName ); - if( entry != NULL ) +#if 0 && defined(DEBUG) + if( !aName.Cmp( wxT( "TI_STELLARIS_BOOSTERPACK" ) ) ) + { + int breakhere = 1; + (void) breakhere; + } +#endif + + LIB_COMPONENT* component = NULL; + LIB_ALIAS* entry = FindEntry( aName ); + + if( entry ) component = entry->GetComponent(); return component; @@ -259,7 +268,15 @@ LIB_COMPONENT* CMP_LIBRARY::FindComponent( const wxString& aName ) bool CMP_LIBRARY::AddAlias( LIB_ALIAS* aAlias ) { - wxASSERT( aAlias != NULL ); + wxASSERT( aAlias ); + +#if 0 && defined(DEBUG) + if( !aAlias->GetName().Cmp( wxT( "TI_STELLARIS_BOOSTERPACK" ) ) ) + { + int breakhere = 1; + (void) breakhere; + } +#endif LIB_ALIAS_MAP::iterator it = aliases.find( aAlias->GetName() ); @@ -281,7 +298,7 @@ bool CMP_LIBRARY::AddAlias( LIB_ALIAS* aAlias ) LIB_COMPONENT* CMP_LIBRARY::AddComponent( LIB_COMPONENT* aComponent ) { - if( aComponent == NULL ) + if( !aComponent ) return NULL; // Conflict detection: See if already existing aliases exist, @@ -296,7 +313,6 @@ LIB_COMPONENT* CMP_LIBRARY::AddComponent( LIB_COMPONENT* aComponent ) return NULL; } - LIB_COMPONENT* newCmp = new LIB_COMPONENT( *aComponent, this ); for( size_t i = 0; i < newCmp->m_aliases.size(); i++ ) diff --git a/eeschema/class_library.h b/eeschema/class_library.h index 9c17b3cd8a..4ab56f1986 100644 --- a/eeschema/class_library.h +++ b/eeschema/class_library.h @@ -193,10 +193,10 @@ public: */ void GetEntryNames( wxArrayString& aNames, bool aSort = true, bool aMakeUpperCase = -#ifndef KICAD_KEEPCASE - true -#else +#ifdef KICAD_KEEPCASE false +#else + true #endif ); diff --git a/eeschema/getpart.cpp b/eeschema/getpart.cpp index f456831881..a423d2ea72 100644 --- a/eeschema/getpart.cpp +++ b/eeschema/getpart.cpp @@ -112,7 +112,7 @@ wxString SCH_BASE_FRAME::SelectComponentFromLibrary( const wxString& aLibname, if( aHistoryList.GetCount() ) dlg.SetComponentName( aHistoryList[0] ); - if ( dlg.ShowModal() == wxID_CANCEL ) + if( dlg.ShowModal() == wxID_CANCEL ) return wxEmptyString; if( dlg.m_GetExtraFunction ) @@ -166,7 +166,7 @@ wxString SCH_BASE_FRAME::SelectComponentFromLibrary( const wxString& aLibname, libEntry = CMP_LIBRARY::FindLibraryComponent( cmpName, aLibname ); - if( ( libEntry == NULL ) && allowWildSeach ) // Search with wildcard + if( !libEntry && allowWildSeach ) // Search with wildcard { allowWildSeach = false; wxString wildname = wxChar( '*' ) + cmpName + wxChar( '*' ); @@ -176,11 +176,11 @@ wxString SCH_BASE_FRAME::SelectComponentFromLibrary( const wxString& aLibname, if( !cmpName.IsEmpty() ) libEntry = CMP_LIBRARY::FindLibraryComponent( cmpName, aLibname ); - if( libEntry == NULL ) + if( !libEntry ) return wxEmptyString; } - if( libEntry == NULL ) + if( !libEntry ) { msg.Printf( _( "Failed to find part <%s> in library" ), GetChars( cmpName ) ); DisplayError( this, msg );