void CVPCB_MAINFRAME::AssocieModule( wxCommandEvent& event ) { FOOTPRINT_ALIAS_LIST aliases; FOOTPRINT_ALIAS* alias; COMPONENT* component; wxFileName fn; wxString msg, tmp; char Line[1024]; FILE* file; size_t ii; SEARCH_STACK& search = Kiface().KifaceSearch(); if( m_netlist.IsEmpty() ) return; // Find equivalents in all available files. for( ii = 0; ii < m_AliasLibNames.GetCount(); ii++ ) { fn = m_AliasLibNames[ii]; if( !fn.HasExt() ) { fn.SetExt( FootprintAliasFileExtension ); // above fails if filename has more than one point } else { fn.SetExt( fn.GetExt() + wxT( "." ) + FootprintAliasFileExtension ); } tmp = search.FindValidPath( fn.GetFullPath() ); if( !tmp ) { msg.Printf( _( "Footprint alias library file '%s' could not be found in the " "default search paths." ), GetChars( fn.GetFullName() ) ); wxMessageBox( msg, FMT_TITLE_LIB_LOAD_ERROR, wxOK | wxICON_ERROR ); continue; } file = wxFopen( tmp, wxT( "rt" ) ); if( file == NULL ) { msg.Printf( _( "Error opening alias library '%s'." ), GetChars( tmp ) ); wxMessageBox( msg, FMT_TITLE_LIB_LOAD_ERROR, wxOK | wxICON_ERROR ); continue; } while( GetLine( file, Line, NULL, sizeof(Line) ) != NULL ) { char* text = Line; wxString value, footprint, wtext = FROM_UTF8( Line ); value = GetQuotedText( wtext ); if( text == NULL || ( *text == 0 ) || value.IsEmpty() ) continue; footprint = GetQuotedText( wtext ); if( footprint.IsEmpty() ) continue; value.Replace( wxT( " " ), wxT( "_" ) ); alias = new FOOTPRINT_ALIAS(); alias->m_Name = value; alias->m_FootprintName = footprint; aliases.push_back( alias ); } fclose( file ); } // Display the number of footprint aliases. msg.Printf( _( "%d footprint aliases found." ), aliases.size() ); SetStatusText( msg, 0 ); m_skipComponentSelect = true; ii = 0; for( unsigned kk = 0; kk < m_netlist.GetCount(); kk++ ) { component = m_netlist.GetComponent( kk ); bool found = false; m_compListBox->SetSelection( ii++, true ); if( !component->GetFPID().empty() ) continue; BOOST_FOREACH( FOOTPRINT_ALIAS& alias, aliases ) { if( alias.m_Name.CmpNoCase( component->GetValue() ) != 0 ) continue; // filter alias so one can use multiple aliases (for polar and // nonpolar caps for example) const FOOTPRINT_INFO *module = m_footprints.GetModuleInfo( alias.m_FootprintName ); if( module ) { size_t filtercount = component->GetFootprintFilters().GetCount(); found = ( 0 == filtercount ); // if no entries, do not filter for( size_t jj = 0; jj < filtercount && !found; jj++ ) { found = module->GetFootprintName().Matches( component->GetFootprintFilters()[jj] ); } } else { msg.Printf( _( "Component %s: footprint %s not found in any of the project " "footprint libraries." ), GetChars( component->GetReference() ), GetChars( alias.m_FootprintName ) ); wxMessageBox( msg, _( "CvPcb Error" ), wxOK | wxICON_ERROR, this ); } if( found ) { SetNewPkg( alias.m_FootprintName ); break; } } // obviously the last chance: there's only one filter matching one footprint if( !found && 1 == component->GetFootprintFilters().GetCount() ) { // we do not need to analyse wildcards: single footprint do not // contain them and if there are wildcards it just will not match any const FOOTPRINT_INFO* module = m_footprints.GetModuleInfo( component->GetFootprintFilters()[0] ); if( module ) { SetNewPkg( component->GetFootprintFilters()[0] ); } } } m_skipComponentSelect = false; }
void CVPCB_MAINFRAME::DisplayStatus() { wxString msg; COMPONENT* component; if( wxWindow::FindFocus() == m_compListBox || wxWindow::FindFocus() == m_libListBox ) { msg.Printf( _( "Components: %d, unassigned: %d" ), (int) m_netlist.GetCount(), m_undefinedComponentCnt ); SetStatusText( msg, 0 ); msg.Empty(); component = GetSelectedComponent(); if( component ) { for( unsigned ii = 0; ii < component->GetFootprintFilters().GetCount(); ii++ ) { if( msg.IsEmpty() ) msg += component->GetFootprintFilters()[ii]; else msg += wxT( ", " ) + component->GetFootprintFilters()[ii]; } msg = _( "Filter list: " ) + msg; } SetStatusText( msg, 1 ); } else { wxString footprintName = m_footprintListBox->GetSelectedFootprint(); FOOTPRINT_INFO* module = m_footprints.GetModuleInfo( footprintName ); if( module ) // can be NULL if no netlist loaded { msg = _( "Description: " ) + module->GetDoc(); SetStatusText( msg, 0 ); msg = _( "Key words: " ) + module->GetKeywords(); SetStatusText( msg, 1 ); } } msg.Empty(); wxString filters; if( m_footprintListBox ) { if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST ) ) filters = _( "key words" ); if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_PIN_FILTERED_LIST ) ) { if( !filters.IsEmpty() ) filters += wxT( "+" ); filters += _( "pin count" ); } if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_BY_LIBRARY_LIST ) ) { if( !filters.IsEmpty() ) filters += wxT( "+" ); filters += _( "library" ); } if( filters.IsEmpty() ) msg = _( "No filtering" ); else msg.Printf( _( "Filtered by %s" ), GetChars( filters ) ); msg << wxT( ": " ) << m_footprintListBox->GetCount(); SetStatusText( msg, 2 ); } }
void CVPCB_MAINFRAME::AutomaticFootprintMatching( wxCommandEvent& event ) { FOOTPRINT_EQUIVALENCE_LIST equiv_List; COMPONENT* component; wxString msg, error_msg; size_t ii; if( m_netlist.IsEmpty() ) return; if( buildEquivalenceList( equiv_List, &error_msg ) ) wxMessageBox( error_msg, _( "Equivalence File Load Error" ), wxOK | wxICON_WARNING, this ); // Sort the association list by component value. // When sorted, find duplicate definitions (i.e. 2 or more items // having the same component value) is more easy. std::sort( equiv_List.begin(), equiv_List.end(), sortListbyCmpValue ); // Display the number of footprint/component equivalences. msg.Printf( _( "%lu footprint/cmp equivalences found." ), (unsigned long)equiv_List.size() ); SetStatusText( msg, 0 ); // Now, associate each free component with a footprint, when the association // is found in list m_skipComponentSelect = true; ii = 0; error_msg.Empty(); for( unsigned kk = 0; kk < m_netlist.GetCount(); kk++ ) { component = m_netlist.GetComponent( kk ); bool found = false; m_compListBox->SetSelection( ii++, true ); if( !component->GetFPID().empty() ) // the component has already a footprint continue; // Here a first attempt is made. We can have multiple equivItem of the same value. // When happens, using the footprint filter of components can remove the ambiguity by // filtering equivItem so one can use multiple equiv_List (for polar and // non-polar caps for example) for( unsigned idx = 0; idx < equiv_List.size(); idx++ ) { FOOTPRINT_EQUIVALENCE& equivItem = equiv_List[idx]; if( equivItem.m_ComponentValue.CmpNoCase( component->GetValue() ) != 0 ) continue; const FOOTPRINT_INFO *module = m_FootprintsList.GetModuleInfo( equivItem.m_FootprintFPID ); bool equ_is_unique = true; unsigned next = idx+1; int previous = idx-1; if( next < equiv_List.size() && equivItem.m_ComponentValue == equiv_List[next].m_ComponentValue ) equ_is_unique = false; if( previous >= 0 && equivItem.m_ComponentValue == equiv_List[previous].m_ComponentValue ) equ_is_unique = false; // If the equivalence is unique, no ambiguity: use the association if( module && equ_is_unique ) { SetNewPkg( equivItem.m_FootprintFPID ); found = true; break; } // The equivalence is not unique: use the footprint filter to try to remove // ambiguity if( module ) { size_t filtercount = component->GetFootprintFilters().GetCount(); found = ( 0 == filtercount ); // if no entries, do not filter for( size_t jj = 0; jj < filtercount && !found; jj++ ) { found = module->GetFootprintName().Matches( component->GetFootprintFilters()[jj] ); } } else { msg.Printf( _( "Component %s: footprint %s not found in any of the project " "footprint libraries." ), GetChars( component->GetReference() ), GetChars( equivItem.m_FootprintFPID ) ); if( ! error_msg.IsEmpty() ) error_msg << wxT("\n\n"); error_msg += msg; } if( found ) { SetNewPkg( equivItem.m_FootprintFPID ); break; } } if( found ) continue; // obviously the last chance: there's only one filter matching one footprint if( 1 == component->GetFootprintFilters().GetCount() ) { // we do not need to analyze wildcards: single footprint do not // contain them and if there are wildcards it just will not match any const FOOTPRINT_INFO* module = m_FootprintsList.GetModuleInfo( component->GetFootprintFilters()[0] ); if( module ) SetNewPkg( component->GetFootprintFilters()[0] ); } } if( !error_msg.IsEmpty() ) wxMessageBox( error_msg, _( "CvPcb Warning" ), wxOK | wxICON_WARNING, this ); m_skipComponentSelect = false; }