77    if( 
board->Footprints().empty() )
 
   79        m_frame->ShowInfoBarError( 
_( 
"Cannot export BOM: there are no footprints on the PCB." ) );
 
   84    fn = 
board->GetFileName();
 
   87    wxString pro_dir = wxPathOnly( 
m_frame->Prj().GetProjectFullName() );
 
   89    wxFileDialog dlg( 
m_frame, 
_( 
"Save Bill of Materials" ), pro_dir, fn.GetFullName(),
 
   92    if( dlg.ShowModal() == wxID_CANCEL )
 
   97    fp_bom = wxFopen( fn.GetFullPath(), wxT( 
"wt" ) );
 
   99    if( fp_bom == 
nullptr )
 
  101        DisplayError( 
m_frame, wxString::Format( 
_( 
"Failed to create file '%s'." ), fn.GetFullPath() ) );
 
  106    wxString msg = wxT( 
"\"" );
 
  107    msg << 
_( 
"Id" ) << wxT( 
"\";\"" );
 
  108    msg << 
_( 
"Designator" ) << wxT( 
"\";\"" );
 
  109    msg << 
_( 
"Footprint" ) << wxT( 
"\";\"" );
 
  110    msg << 
_( 
"Quantity" ) << wxT( 
"\";\"" );
 
  111    msg << 
_( 
"Designation" ) << wxT( 
"\";\"" );
 
  112    msg << 
_( 
"Supplier and ref" ) << wxT( 
"\";\n" );
 
  113    fprintf( fp_bom, 
"%s", 
TO_UTF8( msg ) );
 
  124        bool valExist = 
false;
 
  129            if( curEntry.m_Val == 
footprint->GetValue() && curEntry.m_FPID == 
footprint->GetFPID() )
 
  131                curEntry.m_Ref.Append( wxT( 
", " ), 1 );
 
  132                curEntry.m_Ref.Append( 
footprint->Reference().GetShownText( 
false ) );
 
  158        msg << curEntry.m_Id << wxT( 
";\"" );
 
  159        msg << curEntry.m_Ref << wxT( 
"\";\"" );
 
  160        msg << 
From_UTF8( curEntry.m_FPID.GetLibItemName().c_str() ) << wxT( 
"\";" );
 
  161        msg << curEntry.m_Count << wxT( 
";\"" );
 
  162        msg << curEntry.m_Val << wxT( 
"\";;;\n" );
 
  163        fprintf( fp_bom, 
"%s", 
TO_UTF8( msg ) );