Commit 61b4f8a9 authored by Wayne Stambaugh's avatar Wayne Stambaugh

Pcbnew NETLIST_READER improvements.

* Create separate NETLIST object to hold contents of netlist files.
* Read entire netlist and footprint link files before making applying
  changes to board.
* Add BOARD::ReplaceNetlist() function to eliminate the calls between the
  NETLIST_READER, PCB_EDIT_FRAME, and BOARD objects.
* Change placement of new components below the center of the current board
  or in the center of the page if the BOARD is empty.
* Add dry run option to netlist dialog to print changes to message control
  without making changes.
* Add button to netlist dialog to allow saving contents of message control
  to a file.
* Eliminate the need to compile netlist_reader_*.cpp in both CvPcb and Pcbnew.
* Add netlist_reader_*.cpp to the pcbcommon library.
* Remove redundant load component link file code from CvPcb.
* Modify CvPcb new to work with the new NETLIST_READER object.
* Add compare() function and < and == operators to FPID object.
* Add REPORTER class to hide an underlying string writing implementation for
  use in low level objects.  Thank you Dick for the idea.
* Lots of minor coding policy, Doxygen comment, and missing license fixes.
parent d8ba7b3a
...@@ -112,7 +112,8 @@ public: ...@@ -112,7 +112,8 @@ public:
* Function GetNodeProperties * Function GetNodeProperties
* Collects all node properties to map. * Collects all node properties to map.
* *
* @param aProps contains map of found properties * @param aNode is an XML node.
* @param aProps contains map of found properties.
*/ */
static void GetNodeProperties( wxXmlNode* aNode, PROPERTY_MAP& aProps ); static void GetNodeProperties( wxXmlNode* aNode, PROPERTY_MAP& aProps );
......
...@@ -10,7 +10,7 @@ WXMAC Platform ...@@ -10,7 +10,7 @@ WXMAC Platform
Common Common
------ ------
* Grep for @TODO or TODO for sourcecode tasks * Grep for @TODO or TODO for sourcecode tasks
* Use doxygen compatible comments on member functions (.h files) * Use Doxygen compatible comments on member functions (.h files)
* Add tooltip text to all non-obvious controls in every dialog window. * Add tooltip text to all non-obvious controls in every dialog window.
Use wxFormBuilder. Use wxFormBuilder.
* Component and module search displays in which library the * Component and module search displays in which library the
...@@ -113,9 +113,9 @@ const wxString FP_LIB_TABLE::ExpandSubtitutions( const wxString aString ) ...@@ -113,9 +113,9 @@ const wxString FP_LIB_TABLE::ExpandSubtitutions( const wxString aString )
EESchema Eeschema
-------- --------
* Drag and drop between two EESchema windows. * Drag and drop between two Eeschema windows.
Wayne: Wayne:
E3) Hook up perform last library search hot key to replace search libraries for E3) Hook up perform last library search hot key to replace search libraries for
...@@ -159,5 +159,6 @@ PCBNew ...@@ -159,5 +159,6 @@ PCBNew
of PLUGIN::Footprint*() functions. At least LEGACY and KICAD are both needed of PLUGIN::Footprint*() functions. At least LEGACY and KICAD are both needed
concurrently. concurrently.
*) Add a hot key to toggle the 45 degree constraint on and off so that it can be
changed when drawing a trace.
...@@ -72,6 +72,7 @@ set(COMMON_SRCS ...@@ -72,6 +72,7 @@ set(COMMON_SRCS
newstroke_font.cpp newstroke_font.cpp
projet_config.cpp projet_config.cpp
ptree.cpp ptree.cpp
reporter.cpp
richio.cpp richio.cpp
selcolor.cpp selcolor.cpp
string.cpp string.cpp
...@@ -116,6 +117,9 @@ set(PCB_COMMON_SRCS ...@@ -116,6 +117,9 @@ set(PCB_COMMON_SRCS
../pcbnew/class_zone_settings.cpp ../pcbnew/class_zone_settings.cpp
../pcbnew/classpcb.cpp ../pcbnew/classpcb.cpp
../pcbnew/collectors.cpp ../pcbnew/collectors.cpp
../pcbnew/netlist_reader_common.cpp
../pcbnew/netlist_reader_firstformat.cpp
../pcbnew/netlist_reader_kicad.cpp
../pcbnew/sel_layer.cpp ../pcbnew/sel_layer.cpp
../pcbnew/pcb_plot_params.cpp ../pcbnew/pcb_plot_params.cpp
../pcbnew/io_mgr.cpp ../pcbnew/io_mgr.cpp
......
...@@ -310,6 +310,26 @@ std::string FPID::Format( const std::string& aLogicalLib, const std::string& aFo ...@@ -310,6 +310,26 @@ std::string FPID::Format( const std::string& aLogicalLib, const std::string& aFo
} }
int FPID::compare( const FPID& aFPID ) const
{
// Don't bother comparing the same object.
if( this == &aFPID )
return 0;
int retv = nickname.compare( aFPID.nickname );
if( retv != 0 )
return retv;
retv = footprint.compare( aFPID.footprint );
if( retv != 0 )
return retv;
return revision.compare( aFPID.revision );
}
#if 0 && defined(DEBUG) #if 0 && defined(DEBUG)
// build this with Debug CMAKE_BUILD_TYPE // build this with Debug CMAKE_BUILD_TYPE
......
/**
* @file reporter.h
*/
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2013 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-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 <macros.h>
#include <reporter.h>
REPORTER& REPORTER::Report( const char *aText )
{
Report( FROM_UTF8( aText ) );
return *this;
}
REPORTER& WX_TEXT_CTRL_REPORTER::Report( const wxString& aText )
{
wxCHECK_MSG( m_textCtrl != NULL, *this,
wxT( "No wxTextCtrl object defined in WX_TEXT_CTRL_REPORTER." ) );
m_textCtrl->AppendText( aText );
return *this;
}
/* /*
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 20012 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com * Copyright (C) 2012 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 2008-2012 Wayne Stambaugh <stambaughw@verizon.net> * Copyright (C) 2008-2012 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors.
* *
...@@ -96,3 +96,4 @@ const wxString PSFileWildcard( _( "PostScript files (.ps)|*.ps" ) ); ...@@ -96,3 +96,4 @@ const wxString PSFileWildcard( _( "PostScript files (.ps)|*.ps" ) );
const wxString ReportFileWildcard = _( "Report files (*.rpt)|*.rpt" ); const wxString ReportFileWildcard = _( "Report files (*.rpt)|*.rpt" );
const wxString FootprintPlaceFileWildcard = _( "Footprint place files (*.pos)|*.pos" ); const wxString FootprintPlaceFileWildcard = _( "Footprint place files (*.pos)|*.pos" );
const wxString Shapes3DFileWildcard( _( "Vrml and x3d files (*.wrl *.x3d)|*.wrl;*.x3d" ) ); const wxString Shapes3DFileWildcard( _( "Vrml and x3d files (*.wrl *.x3d)|*.wrl;*.x3d" ) );
const wxString TextWildcard( _( "Text files (*.txt)|*.txt" ) );
...@@ -27,9 +27,6 @@ set(CVPCB_DIALOGS ...@@ -27,9 +27,6 @@ set(CVPCB_DIALOGS
set(CVPCB_SRCS set(CVPCB_SRCS
../common/base_units.cpp ../common/base_units.cpp
../pcbnew/netlist_reader_common.cpp
../pcbnew/netlist_reader_kicad.cpp
../pcbnew/netlist_reader_firstformat.cpp
../pcbnew/class_drc_item.cpp ../pcbnew/class_drc_item.cpp
autosel.cpp autosel.cpp
cfg.cpp cfg.cpp
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.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
*/
/** /**
* @file autosel.cpp * @file autosel.cpp
*/ */
...@@ -39,10 +62,16 @@ typedef boost::ptr_vector< FOOTPRINT_ALIAS > FOOTPRINT_ALIAS_LIST; ...@@ -39,10 +62,16 @@ typedef boost::ptr_vector< FOOTPRINT_ALIAS > FOOTPRINT_ALIAS_LIST;
wxString GetQuotedText( wxString & text ) wxString GetQuotedText( wxString & text )
{ {
int i = text.Find( QUOTE ); int i = text.Find( QUOTE );
if( wxNOT_FOUND == i ) return wxT( "" );
if( wxNOT_FOUND == i )
return wxT( "" );
wxString shrt = text.Mid( i + 1 ); wxString shrt = text.Mid( i + 1 );
i = shrt.Find( QUOTE ); i = shrt.Find( QUOTE );
if( wxNOT_FOUND == i ) return wxT( "" );
if( wxNOT_FOUND == i )
return wxT( "" );
text = shrt.Mid( i + 1 ); text = shrt.Mid( i + 1 );
return shrt.Mid( 0, i ); return shrt.Mid( 0, i );
} }
...@@ -52,13 +81,14 @@ void CVPCB_MAINFRAME::AssocieModule( wxCommandEvent& event ) ...@@ -52,13 +81,14 @@ void CVPCB_MAINFRAME::AssocieModule( wxCommandEvent& event )
{ {
FOOTPRINT_ALIAS_LIST aliases; FOOTPRINT_ALIAS_LIST aliases;
FOOTPRINT_ALIAS* alias; FOOTPRINT_ALIAS* alias;
COMPONENT* component;
wxFileName fn; wxFileName fn;
wxString msg, tmp; wxString msg, tmp;
char Line[1024]; char Line[1024];
FILE* file; FILE* file;
size_t ii; size_t ii;
if( m_components.empty() ) if( m_netlist.IsEmpty() )
return; return;
/* Find equivalents in all available files. */ /* Find equivalents in all available files. */
...@@ -79,8 +109,8 @@ void CVPCB_MAINFRAME::AssocieModule( wxCommandEvent& event ) ...@@ -79,8 +109,8 @@ void CVPCB_MAINFRAME::AssocieModule( wxCommandEvent& event )
if( !tmp ) if( !tmp )
{ {
msg.Printf( _( "Footprint alias library file <%s> could not be \ msg.Printf( _( "Footprint alias library file <%s> could not be found in the "
found in the default search paths." ), "default search paths." ),
GetChars( fn.GetFullName() ) ); GetChars( fn.GetFullName() ) );
wxMessageBox( msg, titleLibLoadError, wxOK | wxICON_ERROR ); wxMessageBox( msg, titleLibLoadError, wxOK | wxICON_ERROR );
continue; continue;
...@@ -127,18 +157,21 @@ found in the default search paths." ), ...@@ -127,18 +157,21 @@ found in the default search paths." ),
m_skipComponentSelect = true; m_skipComponentSelect = true;
ii = 0; ii = 0;
BOOST_FOREACH( COMPONENT_INFO& component, m_components )
for( unsigned kk = 0; kk < m_netlist.GetCount(); kk++ )
{ {
component = m_netlist.GetComponent( kk );
bool found = false; bool found = false;
m_ListCmp->SetSelection( ii++, true ); m_ListCmp->SetSelection( ii++, true );
if( !component.m_Footprint.IsEmpty() ) if( !component->GetFootprintLibName().IsEmpty() )
continue; continue;
BOOST_FOREACH( FOOTPRINT_ALIAS& alias, aliases ) BOOST_FOREACH( FOOTPRINT_ALIAS& alias, aliases )
{ {
if( alias.m_Name.CmpNoCase( component.m_Value ) != 0 ) if( alias.m_Name.CmpNoCase( component->GetValue() ) != 0 )
continue; continue;
/* filter alias so one can use multiple aliases (for polar and nonpolar caps for /* filter alias so one can use multiple aliases (for polar and nonpolar caps for
...@@ -147,23 +180,23 @@ found in the default search paths." ), ...@@ -147,23 +180,23 @@ found in the default search paths." ),
if( module ) if( module )
{ {
size_t filtercount = component.m_FootprintFilter.GetCount(); size_t filtercount = component->GetFootprintFilters().GetCount();
found = ( 0 == filtercount ); // if no entries, do not filter found = ( 0 == filtercount ); // if no entries, do not filter
for( size_t jj = 0; jj < filtercount && !found; jj++ ) for( size_t jj = 0; jj < filtercount && !found; jj++ )
{ {
found = module->m_Module.Matches( component.m_FootprintFilter[jj] ); found = module->m_Module.Matches( component->GetFootprintFilters()[jj] );
} }
} }
else else
{ {
msg.Printf( _( "Component %s: footprint %s not found in \ msg.Printf( _( "Component %s: footprint %s not found in any of the project "
any of the project footprint libraries." ), "footprint libraries." ),
GetChars( component.m_Reference ), GetChars( component->GetReference() ),
GetChars( alias.m_FootprintName ) ); GetChars( alias.m_FootprintName ) );
wxMessageBox( msg, _( "CvPcb Error" ), wxOK | wxICON_ERROR, wxMessageBox( msg, _( "CvPcb Error" ), wxOK | wxICON_ERROR, this );
this );
} }
if( found ) if( found )
{ {
SetNewPkg( alias.m_FootprintName ); SetNewPkg( alias.m_FootprintName );
...@@ -171,15 +204,20 @@ any of the project footprint libraries." ), ...@@ -171,15 +204,20 @@ any of the project footprint libraries." ),
} }
} }
/* obviously the last chance: there's only one filter matching one footprint */ /* obviously the last chance: there's only one filter matching one footprint */
if( !found && 1 == component.m_FootprintFilter.GetCount() ) { if( !found && 1 == component->GetFootprintFilters().GetCount() )
{
/* we do not need to analyse wildcards: single footprint do not contain them */ /* we do not need to analyse wildcards: single footprint do not contain them */
/* and if there are wildcards it just will not match any */ /* and if there are wildcards it just will not match any */
FOOTPRINT_INFO *module = m_footprints.GetModuleInfo( component.m_FootprintFilter[0] ); FOOTPRINT_INFO *module = m_footprints.GetModuleInfo( component->GetFootprintFilters()[0] );
if( module ) {
SetNewPkg( component.m_FootprintFilter[0] ); if( module )
{
SetNewPkg( component->GetFootprintFilters()[0] );
} }
} }
} }
m_skipComponentSelect = false; m_skipComponentSelect = false;
} }
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.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
*/
/** /**
* @file class_footprints_listbox.cpp * @file class_footprints_listbox.cpp
* class to display the list fo available footprints * class to display the list of available footprints
*/ */
#include <fctsys.h> #include <fctsys.h>
...@@ -132,7 +156,7 @@ void FOOTPRINTS_LISTBOX::SetFootprintFullList( FOOTPRINT_LIST& list ) ...@@ -132,7 +156,7 @@ void FOOTPRINTS_LISTBOX::SetFootprintFullList( FOOTPRINT_LIST& list )
} }
void FOOTPRINTS_LISTBOX::SetFootprintFilteredList( COMPONENT_INFO* Component, void FOOTPRINTS_LISTBOX::SetFootprintFilteredList( COMPONENT* aComponent,
FOOTPRINT_LIST& list ) FOOTPRINT_LIST& list )
{ {
wxString msg; wxString msg;
...@@ -149,13 +173,16 @@ void FOOTPRINTS_LISTBOX::SetFootprintFilteredList( COMPONENT_INFO* Component, ...@@ -149,13 +173,16 @@ void FOOTPRINTS_LISTBOX::SetFootprintFilteredList( COMPONENT_INFO* Component,
// The search is case insensitive // The search is case insensitive
wxString module = footprint.m_Module.Upper(); wxString module = footprint.m_Module.Upper();
wxString candidate; wxString candidate;
for( jj = 0; jj < Component->m_FootprintFilter.GetCount(); jj++ )
for( jj = 0; jj < aComponent->GetFootprintFilters().GetCount(); jj++ )
{ {
candidate = Component->m_FootprintFilter[jj].Upper(); candidate = aComponent->GetFootprintFilters()[jj].Upper();
if( !module.Matches( candidate ) ) if( !module.Matches( candidate ) )
continue; continue;
msg.Printf( wxT( "%3zu %s" ), m_FilteredFootprintList.GetCount() + 1, msg.Printf( wxT( "%3zu %s" ), m_FilteredFootprintList.GetCount() + 1,
footprint.m_Module.GetData() ); footprint.m_Module.GetData() );
m_FilteredFootprintList.Add( msg ); m_FilteredFootprintList.Add( msg );
hasItem = true; hasItem = true;
} }
...@@ -172,8 +199,10 @@ void FOOTPRINTS_LISTBOX::SetFootprintFilteredList( COMPONENT_INFO* Component, ...@@ -172,8 +199,10 @@ void FOOTPRINTS_LISTBOX::SetFootprintFilteredList( COMPONENT_INFO* Component,
Refresh(); Refresh();
} }
void FOOTPRINTS_LISTBOX::SetFootprintFilteredByPinCount( COMPONENT_INFO* Component,
FOOTPRINT_LIST& list ) { void FOOTPRINTS_LISTBOX::SetFootprintFilteredByPinCount( COMPONENT* aComponent,
FOOTPRINT_LIST& list )
{
wxString msg; wxString msg;
int oldSelection = GetSelection(); int oldSelection = GetSelection();
bool hasItem = false; bool hasItem = false;
...@@ -184,10 +213,10 @@ void FOOTPRINTS_LISTBOX::SetFootprintFilteredByPinCount( COMPONENT_INFO* Compone ...@@ -184,10 +213,10 @@ void FOOTPRINTS_LISTBOX::SetFootprintFilteredByPinCount( COMPONENT_INFO* Compone
{ {
FOOTPRINT_INFO& footprint = list.GetItem(ii); FOOTPRINT_INFO& footprint = list.GetItem(ii);
if( Component->m_pinCount == footprint.m_padCount ) if( aComponent->GetNetCount() == footprint.m_padCount )
{ {
msg.Printf( wxT( "%3zu %s" ), m_FilteredFootprintList.GetCount() + 1, msg.Printf( wxT( "%3zu %s" ), m_FilteredFootprintList.GetCount() + 1,
footprint.m_Module.GetData() ); footprint.m_Module.GetData() );
m_FilteredFootprintList.Add( msg ); m_FilteredFootprintList.Add( msg );
hasItem = true; hasItem = true;
} }
...@@ -204,13 +233,7 @@ void FOOTPRINTS_LISTBOX::SetFootprintFilteredByPinCount( COMPONENT_INFO* Compone ...@@ -204,13 +233,7 @@ void FOOTPRINTS_LISTBOX::SetFootprintFilteredByPinCount( COMPONENT_INFO* Compone
Refresh(); Refresh();
} }
/** Set the footprint list. We can have 2 footprint list:
* The full footprint list
* The filtered footprint list (if the current selected component has a
* filter for footprints)
* @param FullList true = full footprint list, false = filtered footprint list
* @param Redraw = true to redraw the window
*/
void FOOTPRINTS_LISTBOX::SetActiveFootprintList( bool FullList, bool Redraw ) void FOOTPRINTS_LISTBOX::SetActiveFootprintList( bool FullList, bool Redraw )
{ {
bool old_selection = m_UseFootprintFullList; bool old_selection = m_UseFootprintFullList;
...@@ -226,10 +249,12 @@ void FOOTPRINTS_LISTBOX::SetActiveFootprintList( bool FullList, bool Redraw ) ...@@ -226,10 +249,12 @@ void FOOTPRINTS_LISTBOX::SetActiveFootprintList( bool FullList, bool Redraw )
if( m_ActiveFootprintList ) if( m_ActiveFootprintList )
{ {
bool new_selection; bool new_selection;
if( FullList ) if( FullList )
new_selection = true; new_selection = true;
else else
new_selection = false; new_selection = false;
if( new_selection != old_selection ) if( new_selection != old_selection )
SetSelection( 0, true ); SetSelection( 0, true );
} }
...@@ -264,14 +289,12 @@ void FOOTPRINTS_LISTBOX::SetActiveFootprintList( bool FullList, bool Redraw ) ...@@ -264,14 +289,12 @@ void FOOTPRINTS_LISTBOX::SetActiveFootprintList( bool FullList, bool Redraw )
/**************************************/ /**************************************/
BEGIN_EVENT_TABLE( FOOTPRINTS_LISTBOX, ITEMS_LISTBOX_BASE ) BEGIN_EVENT_TABLE( FOOTPRINTS_LISTBOX, ITEMS_LISTBOX_BASE )
EVT_SIZE( ITEMS_LISTBOX_BASE::OnSize ) EVT_SIZE( ITEMS_LISTBOX_BASE::OnSize )
EVT_CHAR( FOOTPRINTS_LISTBOX::OnChar ) EVT_CHAR( FOOTPRINTS_LISTBOX::OnChar )
END_EVENT_TABLE() END_EVENT_TABLE()
/********************************************************/
void FOOTPRINTS_LISTBOX::OnLeftClick( wxListEvent& event ) void FOOTPRINTS_LISTBOX::OnLeftClick( wxListEvent& event )
/********************************************************/
{ {
FOOTPRINT_INFO* Module; FOOTPRINT_INFO* Module;
wxString footprintName = GetSelectedFootprint(); wxString footprintName = GetSelectedFootprint();
...@@ -297,9 +320,7 @@ void FOOTPRINTS_LISTBOX::OnLeftClick( wxListEvent& event ) ...@@ -297,9 +320,7 @@ void FOOTPRINTS_LISTBOX::OnLeftClick( wxListEvent& event )
} }
/******************************************************/
void FOOTPRINTS_LISTBOX::OnLeftDClick( wxListEvent& event ) void FOOTPRINTS_LISTBOX::OnLeftDClick( wxListEvent& event )
/******************************************************/
{ {
wxString footprintName = GetSelectedFootprint(); wxString footprintName = GetSelectedFootprint();
...@@ -307,21 +328,10 @@ void FOOTPRINTS_LISTBOX::OnLeftDClick( wxListEvent& event ) ...@@ -307,21 +328,10 @@ void FOOTPRINTS_LISTBOX::OnLeftDClick( wxListEvent& event )
} }
/**
* Function OnChar
* called on a key pressed
* Call default handler for some special keys,
* and for "ascii" keys, select the first footprint
* that the name starts by the letter.
* This is the defaut behaviour of a listbox, but because we use
* virtual lists, the listbox does not know anything to what is displayed,
* we must handle this behaviour here.
* Furthermore the footprint name is not at the beginning of
* displayed lines (the first word is the line number)
*/
void FOOTPRINTS_LISTBOX::OnChar( wxKeyEvent& event ) void FOOTPRINTS_LISTBOX::OnChar( wxKeyEvent& event )
{ {
int key = event.GetKeyCode(); int key = event.GetKeyCode();
switch( key ) switch( key )
{ {
case WXK_LEFT: case WXK_LEFT:
...@@ -343,16 +353,20 @@ void FOOTPRINTS_LISTBOX::OnChar( wxKeyEvent& event ) ...@@ -343,16 +353,20 @@ void FOOTPRINTS_LISTBOX::OnChar( wxKeyEvent& event )
default: default:
break; break;
} }
// Search for an item name starting by the key code: // Search for an item name starting by the key code:
key = toupper(key); key = toupper(key);
for( unsigned ii = 0; ii < m_ActiveFootprintList->GetCount(); ii++ ) for( unsigned ii = 0; ii < m_ActiveFootprintList->GetCount(); ii++ )
{ {
wxString text = m_ActiveFootprintList->Item(ii); wxString text = m_ActiveFootprintList->Item(ii);
/* search for the start char of the footprint name. /* search for the start char of the footprint name.
* we must skip the line number * we must skip the line number
*/ */
text.Trim(false); // Remove leading spaces in line text.Trim(false); // Remove leading spaces in line
unsigned jj = 0; unsigned jj = 0;
for( ; jj < text.Len(); jj++ ) for( ; jj < text.Len(); jj++ )
{ {
// skip line number // skip line number
...@@ -367,6 +381,7 @@ void FOOTPRINTS_LISTBOX::OnChar( wxKeyEvent& event ) ...@@ -367,6 +381,7 @@ void FOOTPRINTS_LISTBOX::OnChar( wxKeyEvent& event )
} }
int start_char = toupper( text[jj] ); int start_char = toupper( text[jj] );
if( key == start_char ) if( key == start_char )
{ {
Focus( ii ); Focus( ii );
......
...@@ -334,7 +334,7 @@ void CVPCB_MAINFRAME::ToFirstNA( wxCommandEvent& event ) ...@@ -334,7 +334,7 @@ void CVPCB_MAINFRAME::ToFirstNA( wxCommandEvent& event )
int ii = 0; int ii = 0;
int selection; int selection;
if( m_components.empty() ) if( m_netlist.IsEmpty() )
return; return;
selection = m_ListCmp->GetSelection(); selection = m_ListCmp->GetSelection();
...@@ -342,9 +342,9 @@ void CVPCB_MAINFRAME::ToFirstNA( wxCommandEvent& event ) ...@@ -342,9 +342,9 @@ void CVPCB_MAINFRAME::ToFirstNA( wxCommandEvent& event )
if( selection < 0 ) if( selection < 0 )
selection = 0; selection = 0;
BOOST_FOREACH( COMPONENT_INFO & component, m_components ) for( unsigned jj = 0; jj < m_netlist.GetCount(); jj++ )
{ {
if( component.m_Footprint.IsEmpty() && ii > selection ) if( m_netlist.GetComponent( jj )->GetFootprintLibName().IsEmpty() && ii > selection )
{ {
m_ListCmp->SetSelection( ii ); m_ListCmp->SetSelection( ii );
SendMessageToEESCHEMA(); SendMessageToEESCHEMA();
...@@ -363,7 +363,7 @@ void CVPCB_MAINFRAME::ToPreviousNA( wxCommandEvent& event ) ...@@ -363,7 +363,7 @@ void CVPCB_MAINFRAME::ToPreviousNA( wxCommandEvent& event )
int ii; int ii;
int selection; int selection;
if( m_components.empty() ) if( m_netlist.IsEmpty() )
return; return;
ii = m_ListCmp->GetCount() - 1; ii = m_ListCmp->GetCount() - 1;
...@@ -372,9 +372,9 @@ void CVPCB_MAINFRAME::ToPreviousNA( wxCommandEvent& event ) ...@@ -372,9 +372,9 @@ void CVPCB_MAINFRAME::ToPreviousNA( wxCommandEvent& event )
if( selection < 0 ) if( selection < 0 )
selection = m_ListCmp->GetCount() - 1; selection = m_ListCmp->GetCount() - 1;
BOOST_REVERSE_FOREACH( COMPONENT_INFO & component, m_components ) for( unsigned kk = m_netlist.GetCount() - 1; kk >= 0; kk-- )
{ {
if( component.m_Footprint.IsEmpty() && ii < selection ) if( m_netlist.GetComponent( kk )->GetFootprintLibName().IsEmpty() && ii < selection )
{ {
m_ListCmp->SetSelection( ii ); m_ListCmp->SetSelection( ii );
SendMessageToEESCHEMA(); SendMessageToEESCHEMA();
...@@ -412,15 +412,15 @@ void CVPCB_MAINFRAME::DelAssociations( wxCommandEvent& event ) ...@@ -412,15 +412,15 @@ void CVPCB_MAINFRAME::DelAssociations( wxCommandEvent& event )
m_skipComponentSelect = true; m_skipComponentSelect = true;
m_ListCmp->SetSelection( 0 ); m_ListCmp->SetSelection( 0 );
BOOST_FOREACH( COMPONENT_INFO & component, m_components ) for( unsigned i = 0; i < m_netlist.GetCount(); i++ )
{ {
component.m_Footprint.Empty(); m_netlist.GetComponent( i )->SetFootprintLibName( wxEmptyString );
SetNewPkg( wxEmptyString ); SetNewPkg( wxEmptyString );
} }
m_skipComponentSelect = false; m_skipComponentSelect = false;
m_ListCmp->SetSelection( 0 ); m_ListCmp->SetSelection( 0 );
m_undefinedComponentCnt = m_components.size(); m_undefinedComponentCnt = m_netlist.GetCount();
} }
DisplayStatus(); DisplayStatus();
...@@ -538,18 +538,18 @@ void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event ) ...@@ -538,18 +538,18 @@ void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event )
else else
{ {
if( &m_components[ selection ] == NULL ) if( m_netlist.GetComponent( selection ) == NULL )
m_FootprintList->SetActiveFootprintList( SELECT_FULL_LIST, REDRAW_LIST ); m_FootprintList->SetActiveFootprintList( SELECT_FULL_LIST, REDRAW_LIST );
else else
{ {
if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_PIN_FILTERED_LIST ) ) if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_PIN_FILTERED_LIST ) )
{ {
m_FootprintList->SetFootprintFilteredByPinCount( &m_components[ selection ], m_FootprintList->SetFootprintFilteredByPinCount( m_netlist.GetComponent( selection ),
m_footprints ); m_footprints );
} }
else else
{ {
m_FootprintList->SetFootprintFilteredList( &m_components[ selection ], m_FootprintList->SetFootprintFilteredList( m_netlist.GetComponent( selection ),
m_footprints ); m_footprints );
} }
} }
...@@ -568,7 +568,7 @@ void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event ) ...@@ -568,7 +568,7 @@ void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event )
if( FindFocus() == m_ListCmp ) if( FindFocus() == m_ListCmp )
{ {
wxString module = *(&m_components[ selection ].m_Footprint); wxString module = m_netlist.GetComponent( selection )->GetFootprintLibName();
bool found = false; bool found = false;
for( int ii = 0; ii < m_FootprintList->GetCount(); ii++ ) for( int ii = 0; ii < m_FootprintList->GetCount(); ii++ )
...@@ -642,7 +642,8 @@ void CVPCB_MAINFRAME::DisplayStatus() ...@@ -642,7 +642,8 @@ void CVPCB_MAINFRAME::DisplayStatus()
{ {
wxString msg; wxString msg;
msg.Printf( _( "Components: %d (free: %d)" ), (int) m_components.size(), m_undefinedComponentCnt ); msg.Printf( _( "Components: %d (free: %d)" ), (int) m_netlist.GetCount(),
m_undefinedComponentCnt );
SetStatusText( msg, 0 ); SetStatusText( msg, 0 );
SetStatusText( wxEmptyString, 1 ); SetStatusText( wxEmptyString, 1 );
...@@ -733,9 +734,9 @@ void CVPCB_MAINFRAME::SendMessageToEESCHEMA() ...@@ -733,9 +734,9 @@ void CVPCB_MAINFRAME::SendMessageToEESCHEMA()
{ {
char cmd[1024]; char cmd[1024];
int selection; int selection;
COMPONENT_INFO* Component; COMPONENT* Component;
if( m_components.empty() ) if( m_netlist.IsEmpty() )
return; return;
selection = m_ListCmp->GetSelection(); selection = m_ListCmp->GetSelection();
...@@ -743,12 +744,12 @@ void CVPCB_MAINFRAME::SendMessageToEESCHEMA() ...@@ -743,12 +744,12 @@ void CVPCB_MAINFRAME::SendMessageToEESCHEMA()
if ( selection < 0 ) if ( selection < 0 )
selection = 0; selection = 0;
if( &m_components[ selection ] == NULL ) if( m_netlist.GetComponent( selection ) == NULL )
return; return;
Component = &m_components[ selection ]; Component = m_netlist.GetComponent( selection );
sprintf( cmd, "$PART: \"%s\"", TO_UTF8( Component->m_Reference ) ); sprintf( cmd, "$PART: \"%s\"", TO_UTF8( Component->GetReference() ) );
SendCommand( MSG_TO_SCH, cmd ); SendCommand( MSG_TO_SCH, cmd );
......
...@@ -21,10 +21,6 @@ ...@@ -21,10 +21,6 @@
#define LISTB_STYLE (wxSUNKEN_BORDER | wxLC_NO_HEADER | wxLC_REPORT | wxLC_VIRTUAL) #define LISTB_STYLE (wxSUNKEN_BORDER | wxLC_NO_HEADER | wxLC_REPORT | wxLC_VIRTUAL)
#include <netlist_reader.h>
typedef boost::ptr_vector< COMPONENT_INFO > COMPONENT_LIST;
extern const wxString FootprintAliasFileExtension; extern const wxString FootprintAliasFileExtension;
extern const wxString RetroFileExtension; extern const wxString RetroFileExtension;
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2011 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.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
*/
/** /**
* @file cvpcb_mainframe.h * @file cvpcb_mainframe.h
*/ */
...@@ -7,6 +31,7 @@ ...@@ -7,6 +31,7 @@
#include <wx/listctrl.h> #include <wx/listctrl.h>
#include <wx/filename.h> #include <wx/filename.h>
#include <netlist_reader.h>
#include <wxBasePcbFrame.h> #include <wxBasePcbFrame.h>
#include <param_config.h> #include <param_config.h>
...@@ -28,19 +53,19 @@ class CVPCB_MAINFRAME : public EDA_BASE_FRAME ...@@ -28,19 +53,19 @@ class CVPCB_MAINFRAME : public EDA_BASE_FRAME
{ {
public: public:
bool m_KeepCvpcbOpen; bool m_KeepCvpcbOpen;
FOOTPRINTS_LISTBOX* m_FootprintList; FOOTPRINTS_LISTBOX* m_FootprintList;
COMPONENTS_LISTBOX* m_ListCmp; COMPONENTS_LISTBOX* m_ListCmp;
DISPLAY_FOOTPRINTS_FRAME* m_DisplayFootprintFrame; DISPLAY_FOOTPRINTS_FRAME* m_DisplayFootprintFrame;
wxAuiToolBar* m_mainToolBar; wxAuiToolBar* m_mainToolBar;
wxFileName m_NetlistFileName; wxFileName m_NetlistFileName;
wxArrayString m_ModuleLibNames; wxArrayString m_ModuleLibNames;
wxArrayString m_AliasLibNames; wxArrayString m_AliasLibNames;
wxString m_UserLibraryPath; wxString m_UserLibraryPath;
wxString m_NetlistFileExtension; wxString m_NetlistFileExtension;
wxString m_DocModulesFileName; wxString m_DocModulesFileName;
FOOTPRINT_LIST m_footprints; FOOTPRINT_LIST m_footprints;
COMPONENT_LIST m_components; NETLIST m_netlist;
protected: protected:
int m_undefinedComponentCnt; int m_undefinedComponentCnt;
...@@ -60,7 +85,7 @@ public: ...@@ -60,7 +85,7 @@ public:
/** /**
* Function OnSelectComponent * Function OnSelectComponent
* Called when clicking on a component in component list window * Called when clicking on a component in component list window
* * Updates the filtered foorprint list, if the filtered list option is selected * * Updates the filtered footprint list, if the filtered list option is selected
* * Updates the current selected footprint in footprint list * * Updates the current selected footprint in footprint list
* * Updates the footprint shown in footprint display window (if opened) * * Updates the footprint shown in footprint display window (if opened)
*/ */
...@@ -141,22 +166,12 @@ public: ...@@ -141,22 +166,12 @@ public:
* file name of the netlist or cmp file. * file name of the netlist or cmp file.
* If aFullFileName is empty, a file name will be asked to the user * If aFullFileName is empty, a file name will be asked to the user
* @return 0 if an error occurred saving the link file to \a aFullFileName. * @return 0 if an error occurred saving the link file to \a aFullFileName.
* -1 if cancelled * -1 if canceled
* 1 if OK * 1 if OK
*/ */
int SaveCmpLinkFile( const wxString& aFullFileName ); int SaveCmpLinkFile( const wxString& aFullFileName );
/**
* Function LoadComponentFile
* loads the .cmp link file \a aCmpFileName which stores
* the component/footprint association.
*
* @param aFileName The full filename of .cmp file to load
* If empty, a filename will be asked to the user
*/
bool LoadComponentLinkFile( const wxString& aFileName );
/** /**
* Function WriteComponentLinkFile * Function WriteComponentLinkFile
* Writes the component footprint link file \a aFullFileName on disk. * Writes the component footprint link file \a aFullFileName on disk.
...@@ -166,16 +181,6 @@ public: ...@@ -166,16 +181,6 @@ public:
*/ */
bool WriteComponentLinkFile( const wxString& aFullFileName ); bool WriteComponentLinkFile( const wxString& aFullFileName );
/**
* Function ReadComponentLinkFile
* Reads the component footprint link file \a aFullFileName.
*
* @param aFile = the opened the opened file to read.
* ReadComponentLinkFile will close the file
* @return true if OK, false if error.
*/
bool ReadComponentLinkFile( FILE * aFile );
/** /**
* Function ReadNetList * Function ReadNetList
* reads the netlist (.net) file defined by #m_NetlistFileName. * reads the netlist (.net) file defined by #m_NetlistFileName.
......
/*********************************************************/ /*
/* cvstruct.h */ * This program source code file is part of KiCad, a free EDA CAD application.
/*********************************************************/ *
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.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
*/
/**
* @file cvstruct.h
*/
#ifndef CVSTRUCT_H #ifndef CVSTRUCT_H
#define CVSTRUCT_H #define CVSTRUCT_H
...@@ -10,6 +33,8 @@ ...@@ -10,6 +33,8 @@
/* Forward declarations of all top-level window classes. */ /* Forward declarations of all top-level window classes. */
class CVPCB_MAINFRAME; class CVPCB_MAINFRAME;
class COMPONENT;
/*********************************************************************/ /*********************************************************************/
/* ListBox (base class) to display lists of components or footprints */ /* ListBox (base class) to display lists of components or footprints */
...@@ -53,10 +78,19 @@ public: ...@@ -53,10 +78,19 @@ public:
void SetString( unsigned linecount, const wxString& text ); void SetString( unsigned linecount, const wxString& text );
void AppendLine( const wxString& text ); void AppendLine( const wxString& text );
void SetFootprintFullList( FOOTPRINT_LIST& list ); void SetFootprintFullList( FOOTPRINT_LIST& list );
void SetFootprintFilteredList( COMPONENT_INFO* Component, void SetFootprintFilteredList( COMPONENT* aComponent,
FOOTPRINT_LIST& list ); FOOTPRINT_LIST& aList );
void SetFootprintFilteredByPinCount( COMPONENT_INFO* Component, void SetFootprintFilteredByPinCount( COMPONENT* aComponent,
FOOTPRINT_LIST& list ); FOOTPRINT_LIST& aList );
/**
* Set the footprint list. We can have 2 footprint list:
* The full footprint list
* The filtered footprint list (if the current selected component has a
* filter for footprints)
* @param FullList true = full footprint list, false = filtered footprint list
* @param Redraw = true to redraw the window
*/
void SetActiveFootprintList( bool FullList, bool Redraw = false ); void SetActiveFootprintList( bool FullList, bool Redraw = false );
wxString GetSelectedFootprint(); wxString GetSelectedFootprint();
...@@ -65,6 +99,19 @@ public: ...@@ -65,6 +99,19 @@ public:
// Events functions: // Events functions:
void OnLeftClick( wxListEvent& event ); void OnLeftClick( wxListEvent& event );
void OnLeftDClick( wxListEvent& event ); void OnLeftDClick( wxListEvent& event );
/**
* Function OnChar
* called on a key pressed
* Call default handler for some special keys,
* and for "ascii" keys, select the first footprint
* that the name starts by the letter.
* This is the default behavior of a listbox, but because we use
* virtual lists, the listbox does not know anything to what is displayed,
* we must handle this behavior here.
* Furthermore the footprint name is not at the beginning of
* displayed lines (the first word is the line number)
*/
void OnChar( wxKeyEvent& event ); void OnChar( wxKeyEvent& event );
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
...@@ -78,7 +125,7 @@ class COMPONENTS_LISTBOX : public ITEMS_LISTBOX_BASE ...@@ -78,7 +125,7 @@ class COMPONENTS_LISTBOX : public ITEMS_LISTBOX_BASE
{ {
public: public:
wxArrayString m_ComponentList; wxArrayString m_ComponentList;
CVPCB_MAINFRAME* m_Parent; CVPCB_MAINFRAME* m_Parent;
public: public:
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.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
*/
/** /**
* @file listboxes.cpp * @file listboxes.cpp
* @brief Implementation of class for displaying footprint list and component lists. * @brief Implementation of class for displaying footprint list and component lists.
...@@ -67,9 +90,10 @@ CVPCB_MAINFRAME* ITEMS_LISTBOX_BASE::GetParent() ...@@ -67,9 +90,10 @@ CVPCB_MAINFRAME* ITEMS_LISTBOX_BASE::GetParent()
*/ */
void CVPCB_MAINFRAME::BuildCmpListBox() void CVPCB_MAINFRAME::BuildCmpListBox()
{ {
wxString msg; COMPONENT* component;
wxSize size( 10, 10 ); wxString msg;
wxFont guiFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ); wxSize size( 10, 10 );
wxFont guiFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT );
if( m_ListCmp == NULL ) if( m_ListCmp == NULL )
{ {
...@@ -86,11 +110,14 @@ void CVPCB_MAINFRAME::BuildCmpListBox() ...@@ -86,11 +110,14 @@ void CVPCB_MAINFRAME::BuildCmpListBox()
m_ListCmp->m_ComponentList.Clear(); m_ListCmp->m_ComponentList.Clear();
BOOST_FOREACH( COMPONENT_INFO & component, m_components ) { for( unsigned i = 0; i < m_netlist.GetCount(); i++ )
{
component = m_netlist.GetComponent( i );
msg.Printf( CMP_FORMAT, m_ListCmp->GetCount() + 1, msg.Printf( CMP_FORMAT, m_ListCmp->GetCount() + 1,
GetChars(component.m_Reference), GetChars( component->GetReference() ),
GetChars(component.m_Value), GetChars( component->GetValue() ),
GetChars(component.m_Footprint) ); GetChars( component->GetFootprintLibName() ) );
m_ListCmp->m_ComponentList.Add( msg ); m_ListCmp->m_ComponentList.Add( msg );
} }
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <pcbstruct.h> #include <pcbstruct.h>
#include <class_module.h> #include <class_module.h>
#include <class_board.h>
#include <cvpcb.h> #include <cvpcb.h>
#include <cvpcb_mainframe.h> #include <cvpcb_mainframe.h>
...@@ -45,9 +46,9 @@ MODULE* DISPLAY_FOOTPRINTS_FRAME::Get_Module( const wxString& aFootprintName ) ...@@ -45,9 +46,9 @@ MODULE* DISPLAY_FOOTPRINTS_FRAME::Get_Module( const wxString& aFootprintName )
if( !libPath ) if( !libPath )
{ {
wxString msg = wxString::Format( wxString msg = wxString::Format( _( "PCB footprint library file <%s> could not "
_("PCB foot print library file <%s> could not be found in the default search paths." ), "be found in the default search paths." ),
fn.GetFullName().GetData() ); fn.GetFullName().GetData() );
// @todo we should not be using wxMessageBox directly. // @todo we should not be using wxMessageBox directly.
wxMessageBox( msg, titleLibLoadError, wxOK | wxICON_ERROR, this ); wxMessageBox( msg, titleLibLoadError, wxOK | wxICON_ERROR, this );
...@@ -58,7 +59,7 @@ MODULE* DISPLAY_FOOTPRINTS_FRAME::Get_Module( const wxString& aFootprintName ) ...@@ -58,7 +59,7 @@ MODULE* DISPLAY_FOOTPRINTS_FRAME::Get_Module( const wxString& aFootprintName )
if( footprint ) if( footprint )
{ {
footprint->SetParent( GetBoard() ); footprint->SetParent( (EDA_ITEM*) GetBoard() );
footprint->SetPosition( wxPoint( 0, 0 ) ); footprint->SetPosition( wxPoint( 0, 0 ) );
return footprint; return footprint;
} }
...@@ -74,4 +75,3 @@ MODULE* DISPLAY_FOOTPRINTS_FRAME::Get_Module( const wxString& aFootprintName ) ...@@ -74,4 +75,3 @@ MODULE* DISPLAY_FOOTPRINTS_FRAME::Get_Module( const wxString& aFootprintName )
DisplayError( this, msg ); DisplayError( this, msg );
return NULL; return NULL;
} }
...@@ -54,6 +54,7 @@ static char HeaderLinkFile[] = { "Cmp-Mod V01" }; ...@@ -54,6 +54,7 @@ static char HeaderLinkFile[] = { "Cmp-Mod V01" };
bool CVPCB_MAINFRAME::WriteComponentLinkFile( const wxString& aFullFileName ) bool CVPCB_MAINFRAME::WriteComponentLinkFile( const wxString& aFullFileName )
{ {
COMPONENT* component;
FILE* outputFile; FILE* outputFile;
wxFileName fn( aFullFileName ); wxFileName fn( aFullFileName );
wxString Title = wxGetApp().GetTitle() + wxT( " " ) + GetBuildVersion(); wxString Title = wxGetApp().GetTitle() + wxT( " " ) + GetBuildVersion();
...@@ -69,13 +70,15 @@ bool CVPCB_MAINFRAME::WriteComponentLinkFile( const wxString& aFullFileName ) ...@@ -69,13 +70,15 @@ bool CVPCB_MAINFRAME::WriteComponentLinkFile( const wxString& aFullFileName )
retval |= fprintf( outputFile, " Created by %s", TO_UTF8( Title ) ); retval |= fprintf( outputFile, " Created by %s", TO_UTF8( Title ) );
retval |= fprintf( outputFile, " date = %s\n", TO_UTF8( DateAndTime() ) ); retval |= fprintf( outputFile, " date = %s\n", TO_UTF8( DateAndTime() ) );
BOOST_FOREACH( COMPONENT_INFO& component, m_components ) for( unsigned i = 0; i < m_netlist.GetCount(); i++ )
{ {
component = m_netlist.GetComponent( i );
retval |= fprintf( outputFile, "\nBeginCmp\n" ); retval |= fprintf( outputFile, "\nBeginCmp\n" );
retval |= fprintf( outputFile, "TimeStamp = %s;\n", TO_UTF8( component.m_TimeStamp ) ); retval |= fprintf( outputFile, "TimeStamp = %s;\n", TO_UTF8( component->GetTimeStamp() ) );
retval |= fprintf( outputFile, "Reference = %s;\n", TO_UTF8( component.m_Reference ) ); retval |= fprintf( outputFile, "Reference = %s;\n", TO_UTF8( component->GetReference() ) );
retval |= fprintf( outputFile, "ValeurCmp = %s;\n", TO_UTF8( component.m_Value ) ); retval |= fprintf( outputFile, "ValeurCmp = %s;\n", TO_UTF8( component->GetValue() ) );
retval |= fprintf( outputFile, "IdModule = %s;\n", TO_UTF8( component.m_Footprint ) ); retval |= fprintf( outputFile, "IdModule = %s;\n",
TO_UTF8( component->GetFootprintLibName() ) );
retval |= fprintf( outputFile, "EndCmp\n" ); retval |= fprintf( outputFile, "EndCmp\n" );
} }
...@@ -83,98 +86,3 @@ bool CVPCB_MAINFRAME::WriteComponentLinkFile( const wxString& aFullFileName ) ...@@ -83,98 +86,3 @@ bool CVPCB_MAINFRAME::WriteComponentLinkFile( const wxString& aFullFileName )
fclose( outputFile ); fclose( outputFile );
return retval >= 0; return retval >= 0;
} }
bool CVPCB_MAINFRAME::ReadComponentLinkFile( FILE * aFile )
{
wxString timestamp, valeur, ilib, namecmp, msg;
bool read_cmp_data = false, eof = false;
char Line[1024], * ident, * data;
// Identification of the type of link file
if( fgets( Line, sizeof(Line), aFile ) == 0 ||
strnicmp( Line, HeaderLinkFile, 11 ) != 0 )
{
fclose( aFile );
return false;
}
while( !eof && fgets( Line, sizeof(Line), aFile ) != 0 )
{
if( strnicmp( Line, "EndListe", 8 ) == 0 )
break;
/* Search the beginning of the component description. */
if( strnicmp( Line, "BeginCmp", 8 ) != 0 )
continue;
timestamp.Empty();
valeur.Empty();
ilib.Empty();
namecmp.Empty();
read_cmp_data = true;
while( !eof && read_cmp_data )
{
if( fgets( Line, 1024, aFile ) == 0 )
{
eof = true;
break;
}
if( strnicmp( Line, "EndCmp", 6 ) == 0 )
{
read_cmp_data = true;
break;
}
ident = strtok( Line, "=;\n\r" );
data = strtok( NULL, ";\n\r" );
if( strnicmp( ident, "TimeStamp", 9 ) == 0 )
{
timestamp = FROM_UTF8( data );
timestamp.Trim( true );
timestamp.Trim( false );
continue;
}
if( strnicmp( ident, "Reference", 9 ) == 0 )
{
namecmp = FROM_UTF8( data );
namecmp.Trim( true );
namecmp.Trim( false );
continue;
}
if( strnicmp( ident, "ValeurCmp", 9 ) == 0 )
{
valeur = FROM_UTF8( data );
valeur.Trim( true );
valeur.Trim( false );
continue;
}
if( strnicmp( ident, "IdModule", 8 ) == 0 )
{
ilib = FROM_UTF8( data );
ilib.Trim( true );
ilib.Trim( false );
continue;
}
} // End reading one component link block.
// Search corresponding component info in list and update its parameters.
BOOST_FOREACH( COMPONENT_INFO& component, m_components )
{
if( namecmp != component.m_Reference )
continue;
/* Copy the name of the corresponding module. */
component.m_Footprint = ilib;
}
}
fclose( aFile );
return true;
}
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/ */
/* Read a nelist type Eeschema (New and Old format) /* Read a netlist type Eeschema (New and Old format)
* or OrcadPCB2 and build the component list * or OrcadPCB2 and build the component list
*/ */
...@@ -35,82 +35,56 @@ ...@@ -35,82 +35,56 @@
#include <confirm.h> #include <confirm.h>
#include <kicad_string.h> #include <kicad_string.h>
#include <macros.h> #include <macros.h>
#include <wildcards_and_files_ext.h>
#include <cvpcb_mainframe.h> #include <cvpcb_mainframe.h>
#include <richio.h> #include <richio.h>
#include <netlist_reader.h> #include <netlist_reader.h>
// COMPONENT_INFO object list sort function:
bool operator < ( const COMPONENT_INFO& item1, const COMPONENT_INFO& item2 )
{
return StrNumCmp( item1.m_Reference, item2.m_Reference, INT_MAX, true ) < 0;
}
int CVPCB_MAINFRAME::ReadSchematicNetlist() int CVPCB_MAINFRAME::ReadSchematicNetlist()
{ {
FILE* netfile = wxFopen( m_NetlistFileName.GetFullPath(), wxT( "rt" ) ); wxBusyCursor dummy; // Shows an hourglass while loading.
NETLIST_READER* netlistReader;
if( netfile == NULL ) wxString msg;
{ wxString compFootprintLinkFileName;
wxString msg; wxFileName fn = m_NetlistFileName;
msg.Printf( _( "Could not open file <%>" ),
GetChars( m_NetlistFileName.GetFullPath() ) );
wxMessageBox( msg );
return -1;
}
NETLIST_READER netList_Reader( NULL, NULL ); // Load the footprint association file if it has already been created.
netList_Reader.m_UseTimeStamp = false; fn.SetExt( ComponentFileExtension );
netList_Reader.m_ChangeFootprints = false;
netList_Reader.m_UseCmpFile = false;
netList_Reader.SetFilesnames( m_NetlistFileName.GetFullPath(), wxEmptyString );
// True to read footprint filters section: true for CvPcb, false for Pcbnew if( fn.FileExists() && fn.IsFileReadable() )
netList_Reader.ReadLibpartSectionSetOpt( true ); compFootprintLinkFileName = fn.GetFullPath();
// on OSX otherwise reloading a file you will see duplicates m_netlist.Clear();
m_components.clear();
bool success = netList_Reader.ReadNetList( netfile ); try
if( !success )
{ {
wxMessageBox( _("Netlist read error") ); netlistReader = NETLIST_READER::GetNetlistReader( &m_netlist,
return false; m_NetlistFileName.GetFullPath(),
compFootprintLinkFileName );
std::auto_ptr< NETLIST_READER > nlr( netlistReader );
netlistReader->LoadNetlist();
} }
catch( IO_ERROR& ioe )
// Now copy footprints info into Cvpcb list:
// We also remove footprint name if it is "$noname"
// because this is a dummy name,, not an actual name
COMPONENT_INFO_LIST& cmpInfo = netList_Reader.GetComponentInfoList();
for( unsigned ii = 0; ii < cmpInfo.size(); ii++ )
{ {
m_components.push_back( cmpInfo[ii] ); msg = wxString::Format( _( "Error loading netlist.\n%s" ), ioe.errorText.GetData() );
if( cmpInfo[ii]->m_Footprint == wxT( "$noname" ) ) wxMessageBox( msg, _( "Netlist Load Error" ), wxOK | wxICON_ERROR );
cmpInfo[ii]->m_Footprint.Empty(); return 1;
} }
cmpInfo.clear(); // cmpInfo is no more owner of the list.
// Sort components by reference:
sort( m_components.begin(), m_components.end() );
// Now copy filters in m_components, if netlist type is KICAD // We also remove footprint name if it is "$noname" because this is a dummy name,
// ( when the format is the "old" PCBNEW format, filters are already in // not the actual name of the footprint.
// m_component list for( unsigned ii = 0; ii < m_netlist.GetCount(); ii++ )
if( NETLIST_TYPE_KICAD == netList_Reader.GetNetlistType() )
{ {
for( unsigned ii = 0; ii < m_components.size(); ii++ ) if( m_netlist.GetComponent( ii )->GetFootprintLibName() == wxT( "$noname" ) )
{ m_netlist.GetComponent( ii )->SetFootprintLibName( wxEmptyString );
LIPBART_INFO* libpart = netList_Reader.GetLibpart(m_components[ii].m_Libpart);
if( libpart == NULL )
continue;
// now copy filter list
m_components[ii].m_FootprintFilter = libpart->m_FootprintFilter;
}
} }
// Sort components by reference:
m_netlist.SortByReference();
return 0; return 0;
} }
...@@ -41,17 +41,17 @@ ...@@ -41,17 +41,17 @@
void CVPCB_MAINFRAME::SetNewPkg( const wxString& aFootprintName ) void CVPCB_MAINFRAME::SetNewPkg( const wxString& aFootprintName )
{ {
COMPONENT_INFO* component; COMPONENT* component;
bool hasFootprint = false; bool hasFootprint = false;
int componentIndex; int componentIndex;
wxString description; wxString description;
if( m_components.empty() ) if( m_netlist.IsEmpty() )
return; return;
// if no component is selected, select the first one // If no component is selected, select the first one
if(m_ListCmp->GetFirstSelected() < 0) if( m_ListCmp->GetFirstSelected() < 0 )
{ {
componentIndex = 0; componentIndex = 0;
m_ListCmp->SetSelection( componentIndex, true ); m_ListCmp->SetSelection( componentIndex, true );
...@@ -61,28 +61,28 @@ void CVPCB_MAINFRAME::SetNewPkg( const wxString& aFootprintName ) ...@@ -61,28 +61,28 @@ void CVPCB_MAINFRAME::SetNewPkg( const wxString& aFootprintName )
while( m_ListCmp->GetFirstSelected() != -1) while( m_ListCmp->GetFirstSelected() != -1)
{ {
// get the component for the current iteration // Get the component for the current iteration
componentIndex = m_ListCmp->GetFirstSelected(); componentIndex = m_ListCmp->GetFirstSelected();
component = &m_components[componentIndex]; component = m_netlist.GetComponent( componentIndex );
if( component == NULL ) if( component == NULL )
return; return;
// check to see if the component has allready a footprint set. // Check to see if the component has already a footprint set.
hasFootprint = !(component->m_Footprint.IsEmpty()); hasFootprint = !(component->GetFootprintLibName().IsEmpty());
component->m_Footprint = aFootprintName; component->SetFootprintLibName( aFootprintName );
// create the new component description // create the new component description
description.Printf( CMP_FORMAT, componentIndex + 1, description.Printf( CMP_FORMAT, componentIndex + 1,
GetChars( component->m_Reference ), GetChars( component->GetReference() ),
GetChars( component->m_Value ), GetChars( component->GetValue() ),
GetChars( component->m_Footprint ) ); GetChars( component->GetFootprintLibName() ) );
// if the component hasn't had a footprint associated with it // If the component hasn't had a footprint associated with it
// it now has, so we decrement the count of components without // it now has, so we decrement the count of components without
// a footprint assigned. // a footprint assigned.
...@@ -92,12 +92,12 @@ void CVPCB_MAINFRAME::SetNewPkg( const wxString& aFootprintName ) ...@@ -92,12 +92,12 @@ void CVPCB_MAINFRAME::SetNewPkg( const wxString& aFootprintName )
m_undefinedComponentCnt -= 1; m_undefinedComponentCnt -= 1;
} }
// set the new description and deselect the processed component // Set the new description and deselect the processed component
m_ListCmp->SetString( componentIndex, description ); m_ListCmp->SetString( componentIndex, description );
m_ListCmp->SetSelection( componentIndex, false ); m_ListCmp->SetSelection( componentIndex, false );
} }
// mark this "session" as modified // Mark this "session" as modified
m_modified = true; m_modified = true;
// select the next component, if there is one // select the next component, if there is one
...@@ -113,22 +113,10 @@ void CVPCB_MAINFRAME::SetNewPkg( const wxString& aFootprintName ) ...@@ -113,22 +113,10 @@ void CVPCB_MAINFRAME::SetNewPkg( const wxString& aFootprintName )
bool CVPCB_MAINFRAME::ReadNetListAndLinkFiles() bool CVPCB_MAINFRAME::ReadNetListAndLinkFiles()
{ {
COMPONENT* component;
wxString msg; wxString msg;
int error_level;
error_level = ReadSchematicNetlist(); ReadSchematicNetlist();
if( error_level < 0 )
{
msg.Printf( _( "File <%s> does not appear to be a valid KiCad net list file." ),
GetChars( m_NetlistFileName.GetFullPath() ) );
wxMessageBox( msg, _( "File Error" ), wxOK | wxICON_ERROR, this );
m_NetlistFileName.Clear();
UpdateTitle();
return false;
}
LoadComponentLinkFile( m_NetlistFileName.GetFullPath() );
if( m_ListCmp == NULL ) if( m_ListCmp == NULL )
return false; return false;
...@@ -140,19 +128,21 @@ bool CVPCB_MAINFRAME::ReadNetListAndLinkFiles() ...@@ -140,19 +128,21 @@ bool CVPCB_MAINFRAME::ReadNetListAndLinkFiles()
m_ListCmp->Clear(); m_ListCmp->Clear();
m_undefinedComponentCnt = 0; m_undefinedComponentCnt = 0;
BOOST_FOREACH( COMPONENT_INFO& component, m_components ) for( unsigned i = 0; i < m_netlist.GetCount(); i++ )
{ {
component = m_netlist.GetComponent( i );
msg.Printf( CMP_FORMAT, m_ListCmp->GetCount() + 1, msg.Printf( CMP_FORMAT, m_ListCmp->GetCount() + 1,
GetChars( component.m_Reference ), GetChars( component->GetReference() ),
GetChars( component.m_Value ), GetChars( component->GetValue() ),
GetChars( component.m_Footprint ) ); GetChars( component->GetFootprintLibName() ) );
m_ListCmp->AppendLine( msg ); m_ListCmp->AppendLine( msg );
if( component.m_Footprint.IsEmpty() ) if( component->GetFootprintLibName().IsEmpty() )
m_undefinedComponentCnt += 1; m_undefinedComponentCnt += 1;
} }
if( !m_components.empty() ) if( !m_netlist.IsEmpty() )
m_ListCmp->SetSelection( 0, true ); m_ListCmp->SetSelection( 0, true );
DisplayStatus(); DisplayStatus();
...@@ -165,37 +155,6 @@ bool CVPCB_MAINFRAME::ReadNetListAndLinkFiles() ...@@ -165,37 +155,6 @@ bool CVPCB_MAINFRAME::ReadNetListAndLinkFiles()
} }
bool CVPCB_MAINFRAME::LoadComponentLinkFile( const wxString& aFileName )
{
FILE* linkfile;
wxFileName fn = aFileName;
fn.SetExt( ComponentFileExtension );
linkfile = wxFopen( fn.GetFullPath(), wxT( "rt" ) );
if( linkfile == NULL )
{
wxString msg;
msg.Printf( _( "Cannot open CvPcb component file <%s>." ),
GetChars( fn.GetFullPath() ) );
msg << wxT( "\n" ) << _( "This is normal if you are opening a new netlist file" );
wxMessageBox( msg, titleComponentLibErr, wxOK | wxICON_ERROR );
return false;
}
// read and close the file
if( ! ReadComponentLinkFile( linkfile ) )
{
wxString msg;
msg.Printf( _( " <%s> does not appear to be a valid KiCad component link file." ),
GetChars( fn.GetFullPath() ) );
wxMessageBox( msg, titleComponentLibErr, wxOK | wxICON_ERROR );
return false;
}
return true;
}
int CVPCB_MAINFRAME::SaveCmpLinkFile( const wxString& aFullFileName ) int CVPCB_MAINFRAME::SaveCmpLinkFile( const wxString& aFullFileName )
{ {
wxFileName fn; wxFileName fn;
...@@ -207,7 +166,7 @@ int CVPCB_MAINFRAME::SaveCmpLinkFile( const wxString& aFullFileName ) ...@@ -207,7 +166,7 @@ int CVPCB_MAINFRAME::SaveCmpLinkFile( const wxString& aFullFileName )
} }
else else
{ {
wxFileDialog dlg( this, _( "Save Component/Footprint Link File" ), wxGetCwd(), wxFileDialog dlg( this, _( "Save Component Footprint Link File" ), wxGetCwd(),
wxEmptyString, ComponentFileWildcard, wxFD_SAVE ); wxEmptyString, ComponentFileWildcard, wxFD_SAVE );
if( dlg.ShowModal() == wxID_CANCEL ) if( dlg.ShowModal() == wxID_CANCEL )
...@@ -224,7 +183,7 @@ int CVPCB_MAINFRAME::SaveCmpLinkFile( const wxString& aFullFileName ) ...@@ -224,7 +183,7 @@ int CVPCB_MAINFRAME::SaveCmpLinkFile( const wxString& aFullFileName )
if( WriteComponentLinkFile( fn.GetFullPath() ) == 0 ) if( WriteComponentLinkFile( fn.GetFullPath() ) == 0 )
{ {
DisplayError( this, _( "Unable to create component file (.cmp)" ) ); DisplayError( this, _( "Unable to create component footprint link file (.cmp)" ) );
return 0; return 0;
} }
......
...@@ -148,7 +148,7 @@ void CMP_LIBRARY::GetEntryNames( wxArrayString& aNames, bool aSort, bool aMakeUp ...@@ -148,7 +148,7 @@ void CMP_LIBRARY::GetEntryNames( wxArrayString& aNames, bool aSort, bool aMakeUp
* simple function used as comparator to sort a std::vector<wxArrayString>&. * simple function used as comparator to sort a std::vector<wxArrayString>&.
* *
* @param aItem1 is the first comparison parameter. * @param aItem1 is the first comparison parameter.
* @param aItem1 is the second. * @param aItem2 is the second.
* @return bool - which item should be put first in the sorted list. * @return bool - which item should be put first in the sorted list.
*/ */
bool sortFunction( wxArrayString aItem1, wxArrayString aItem2 ) bool sortFunction( wxArrayString aItem1, wxArrayString aItem2 )
......
...@@ -259,7 +259,7 @@ public: ...@@ -259,7 +259,7 @@ public:
* true. * true.
* @param aList = array of PARAM_CFG_BASE pointers * @param aList = array of PARAM_CFG_BASE pointers
*/ */
void SaveCurrentSetupValues( const PARAM_CFG_ARRAY& List ); void SaveCurrentSetupValues( const PARAM_CFG_ARRAY& aList );
/** /**
* Function ReadCurrentSetupValues * Function ReadCurrentSetupValues
...@@ -268,7 +268,7 @@ public: ...@@ -268,7 +268,7 @@ public:
* true. * true.
* @param aList = array of PARAM_CFG_BASE pointers * @param aList = array of PARAM_CFG_BASE pointers
*/ */
void ReadCurrentSetupValues( const PARAM_CFG_ARRAY& List ); void ReadCurrentSetupValues( const PARAM_CFG_ARRAY& aList );
/** /**
* Function ReadProjectConfig * Function ReadProjectConfig
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2010 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.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
*/
/** /**
* @file dialog_helpers.h * @file dialog_helpers.h
* @brief Helper dialog and control classes. * @brief Helper dialog and control classes.
...@@ -38,6 +62,7 @@ public: ...@@ -38,6 +62,7 @@ public:
* Constructor: * Constructor:
* @param aParent Pointer to the parent window. * @param aParent Pointer to the parent window.
* @param aTitle = The title shown on top. * @param aTitle = The title shown on top.
* @param aItemHeaders is an array containing the column header names for the dialog.
* @param aItemList = A wxArrayString of the list of elements. * @param aItemList = A wxArrayString of the list of elements.
* @param aRefText = An item name if an item must be preselected. * @param aRefText = An item name if an item must be preselected.
* @param aCallBackFunction = callback function to display comments * @param aCallBackFunction = callback function to display comments
......
...@@ -133,8 +133,31 @@ public: ...@@ -133,8 +133,31 @@ public:
const std::string& aRevision ) const std::string& aRevision )
throw( PARSE_ERROR ); throw( PARSE_ERROR );
/**
* Function clear
* clears the contents of the library nickname, footprint name, and revision strings.
*/
void clear(); void clear();
/**
* Function empty
* @return a boolean true value if the FPID is empty. Otherwise return false.
*/
bool empty() const { return nickname.empty() && footprint.empty() && revision.empty(); }
/**
* Function Compare
* compares the contents of FPID objects by performing a std::string comparison of the
* library nickname, footprint name, and revision strings respectively.
*
* @param aFPID is the FPID to compare against.
* @return -1 if less than \a aFPID, 1 if greater than \a aFPID, and 0 if equal to \a aFPID.
*/
int compare( const FPID& aFPID ) const;
bool operator <( const FPID& aFPID ) const { return this->compare( aFPID ) < 0; }
bool operator ==( const FPID& aFPID ) const { return this->compare( aFPID ) == 0; }
#if defined(DEBUG) #if defined(DEBUG)
static void Test(); static void Test();
#endif #endif
......
#ifndef _REPORTER_H_
#define _REPORTER_H_
/**
* @file reporter.h
* @author Wayne Stambaugh
* @note A special thanks to Dick Hollenbeck who came up with the idea that inspired
* me to write this.
*/
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2013 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-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
*/
class wxString;
class wxTextCtrl;
/**
* Class REPORTER
* is a pure virtual class used to derive REPORTOR objects from.
*
* The purpose of the REPORTER object is to hide an object that take a string as an input
* from other objects. This prevents objects such as wxWidgets UI control internals from
* being exposed to low level KiCad objects dervice from #BOARD_ITEM and #SCH_ITEM.
*/
class REPORTER
{
public:
/**
* Function Report
* is a pure virtual function to override in the derived object.
*
* @param aText is the string to report.
*/
virtual REPORTER& Report( const wxString& aText ) = 0;
REPORTER& Report( const char *aText );
REPORTER& operator <<( const wxString& aText ) { return Report( aText ); }
REPORTER& operator <<( const wxChar* aText ) { return Report( wxString( aText ) ); }
REPORTER& operator <<( wxChar aChar ) { return Report( wxString( aChar ) ); }
REPORTER& operator <<( const char* aText ) { return Report( aText ); }
};
/**
* Class WX_TEXT_CTRL_REPORTER
* is wrapper for reporting to a wxTextCtrl object.
*/
class WX_TEXT_CTRL_REPORTER : public REPORTER
{
wxTextCtrl* m_textCtrl;
public:
WX_TEXT_CTRL_REPORTER( wxTextCtrl* aTextCtrl ) :
REPORTER(),
m_textCtrl( aTextCtrl )
{
}
REPORTER& Report( const wxString& aText );
};
#endif // _REPORTER_H_
...@@ -98,6 +98,7 @@ extern const wxString KiCadFootprintLibFileWildcard; ...@@ -98,6 +98,7 @@ extern const wxString KiCadFootprintLibFileWildcard;
extern const wxString KiCadFootprintLibPathWildcard; extern const wxString KiCadFootprintLibPathWildcard;
extern const wxString GedaPcbFootprintLibFileWildcard; extern const wxString GedaPcbFootprintLibFileWildcard;
extern const wxString EagleFootprintLibPathWildcard; extern const wxString EagleFootprintLibPathWildcard;
extern const wxString TextWildcard;
#endif // INCLUDE_WILDCARDS_AND_FILES_EXT_H_ #endif // INCLUDE_WILDCARDS_AND_FILES_EXT_H_
...@@ -91,6 +91,19 @@ protected: ...@@ -91,6 +91,19 @@ protected:
void updateZoomSelectBox(); void updateZoomSelectBox();
virtual void unitsChangeRefresh(); virtual void unitsChangeRefresh();
/**
* Function loadFootprint
* attempts to load \a aFootprintName from the list of libraries.
*
* @param aFootprintName is the name of component footprint to load.
* @return the #MODULE if found or NULL if \a aFootprintName not found in any of the
* libraries.
* @throw IO_ERROR if an I/O error occurs or a #PARSE_ERROR if a file parsing error
* occurs while reading footprint library files.
*/
MODULE* loadFootprint( const wxString& aFootprintName )
throw( IO_ERROR, PARSE_ERROR );
public: public:
PCB_BASE_FRAME( wxWindow* aParent, ID_DRAWFRAME_TYPE aFrameType, PCB_BASE_FRAME( wxWindow* aParent, ID_DRAWFRAME_TYPE aFrameType,
const wxString& aTitle, const wxString& aTitle,
......
...@@ -59,6 +59,10 @@ class PCB_LAYER_WIDGET; ...@@ -59,6 +59,10 @@ class PCB_LAYER_WIDGET;
class MARKER_PCB; class MARKER_PCB;
class BOARD_ITEM; class BOARD_ITEM;
class PCB_LAYER_BOX_SELECTOR; class PCB_LAYER_BOX_SELECTOR;
class NETLIST;
class REPORTER;
class PARSE_ERROR;
class IO_ERROR;
/** /**
...@@ -80,6 +84,18 @@ class PCB_EDIT_FRAME : public PCB_BASE_FRAME ...@@ -80,6 +84,18 @@ class PCB_EDIT_FRAME : public PCB_BASE_FRAME
/// The auxiliary right vertical tool bar used to access the microwave tools. /// The auxiliary right vertical tool bar used to access the microwave tools.
wxAuiToolBar* m_microWaveToolBar; wxAuiToolBar* m_microWaveToolBar;
/**
* Function loadFootprints
* loads the footprints for each #COMPONENT in \a aNetlist from the list of libraries.
*
* @param aNetlist is the netlist of components to load the footprints into.
* @param aReporter is the #REPORTER object to report to.
* @throw IO_ERROR if an I/O error occurs or a #PARSE_ERROR if a file parsing error
* occurs while reading footprint library files.
*/
void loadFootprints( NETLIST& aNetlist, REPORTER* aReporter )
throw( IO_ERROR, PARSE_ERROR );
protected: protected:
#ifdef KICAD_SCRIPTING_WXPYTHON #ifdef KICAD_SCRIPTING_WXPYTHON
...@@ -414,27 +430,6 @@ public: ...@@ -414,27 +430,6 @@ public:
m_useCmpFileForFpNames = aUseCmpfile; m_useCmpFileForFpNames = aUseCmpfile;
} }
/**
* Function Test_Duplicate_Missing_And_Extra_Footprints
* Build a list of duplicate, missing and extra footprints
* from the current board and a netlist netlist :
* Shows 3 lists:
* 1 - duplicate footprints on board
* 2 - missing footprints (found in netlist but not on board)
* 3 - footprints not in netlist but on board
* @param aFilename = the full filename netlist
* @param aDuplicate = the list of duplicate modules to populate
* @param aMissing = the list of missing module references and values
* to populate. For each missing item, the first string is the ref,
* the second is the value.
* @param aNotInNetlist = the list of not-in-netlist modules to populate
* @return true if the netlist was read, or false
*/
bool Test_Duplicate_Missing_And_Extra_Footprints( const wxString& aFilename,
std::vector <MODULE*>& aDuplicate,
wxArrayString& aMissing,
std::vector <MODULE*>& aNotInNetlist );
/** /**
* Function OnHotKey. * Function OnHotKey.
* ** Commands are case insensitive ** * ** Commands are case insensitive **
...@@ -960,6 +955,11 @@ public: ...@@ -960,6 +955,11 @@ public:
*/ */
void Access_to_External_Tool( wxCommandEvent& event ); void Access_to_External_Tool( wxCommandEvent& event );
/**
* Function ListAndSelectModuleName
* builds and shows a list of existing modules on board that the user can select.
* @return a pointer to the selected module or NULL.
*/
MODULE* ListAndSelectModuleName(); MODULE* ListAndSelectModuleName();
/** /**
...@@ -1421,29 +1421,31 @@ public: ...@@ -1421,29 +1421,31 @@ public:
/** /**
* Function ReadPcbNetlist * Function ReadPcbNetlist
* Update footprints (load missing footprints and delete on demand extra * reads \a aNetlistFileName and ppdates the footprints (load missing footprints and
* footprints) * delete on demand extra footprints) on the board.
* Update connectivity info, references, values and "TIME STAMP" * Update connectivity info, references, values and "TIME STAMP"
* @param aNetlistFullFilename = netlist file name (*.net) *
* @param aCmpFullFileName = cmp/footprint link file name (*.cmp). * @param aNetlistFileName = netlist file name (*.net)
* if not found or empty, only the netlist will be used * @param aCmpFileName = cmp/footprint link file name (*.cmp).
* @param aMessageWindow = a reference to a wxTextCtrl where to display messages. * if not found or empty, only the netlist will be used
* can be NULL * @param aReporter is a pointer to a #REPORTER object to write display messages.
* can be NULL.
* @param aChangeFootprint if true, footprints that have changed in netlist will be changed * @param aChangeFootprint if true, footprints that have changed in netlist will be changed
* @param aDeleteBadTracks if true, erroneous tracks will be deleted * @param aDeleteBadTracks if true, erroneous tracks will be deleted
* @param aDeleteExtraFootprints if true, remove unlocked footprints that are not in netlist * @param aDeleteExtraFootprints if true, remove unlocked footprints that are not in netlist
* @param aSelect_By_Timestamp if true, use timestamp instead of reference to identify * @param aSelectByTimestamp if true, use timestamp instead of reference to identify
* footprints from components (use after reannotation of the * footprints from components (use after reannotation of the
* schematic) * schematic)
* @return true if Ok * @param aIsDryRun performs a dry run without making any changes if true.
*/ */
bool ReadPcbNetlist( const wxString& aNetlistFullFilename, void ReadPcbNetlist( const wxString& aNetlistFileName,
const wxString& aCmpFullFileName, const wxString& aCmpFileName,
wxTextCtrl* aMessageWindow, REPORTER* aReporter,
bool aChangeFootprint, bool aChangeFootprint,
bool aDeleteBadTracks, bool aDeleteBadTracks,
bool aDeleteExtraFootprints, bool aDeleteExtraFootprints,
bool aSelect_By_Timestamp ); bool aSelectByTimestamp,
bool aIsDryRun );
/** /**
* Function RemoveMisConnectedTracks * Function RemoveMisConnectedTracks
...@@ -1480,8 +1482,7 @@ public: ...@@ -1480,8 +1482,7 @@ public:
* @param include_fixe = true to orient locked footprints * @param include_fixe = true to orient locked footprints
* @return true if some footprints modified, false if no change * @return true if some footprints modified, false if no change
*/ */
bool ReOrientModules( const wxString& ModuleMask, int Orient, bool ReOrientModules( const wxString& ModuleMask, int Orient, bool include_fixe );
bool include_fixe );
void LockModule( MODULE* aModule, bool aLocked ); void LockModule( MODULE* aModule, bool aLocked );
void AutoMoveModulesOnPcb( bool PlaceModulesHorsPcb ); void AutoMoveModulesOnPcb( bool PlaceModulesHorsPcb );
......
...@@ -181,9 +181,6 @@ set(PCBNEW_CLASS_SRCS ...@@ -181,9 +181,6 @@ set(PCBNEW_CLASS_SRCS
muonde.cpp muonde.cpp
muwave_command.cpp muwave_command.cpp
netlist.cpp netlist.cpp
netlist_reader_common.cpp
netlist_reader_firstformat.cpp
netlist_reader_kicad.cpp
onleftclick.cpp onleftclick.cpp
onrightclick.cpp onrightclick.cpp
pad_edition_functions.cpp pad_edition_functions.cpp
......
This diff is collapsed.
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2007 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.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
*/
/** /**
* @file class_board.h * @file class_board.h
* @brief Class BOARD to handle a board. * @brief Class BOARD to handle a board.
...@@ -30,6 +54,8 @@ class TRACK; ...@@ -30,6 +54,8 @@ class TRACK;
class D_PAD; class D_PAD;
class MARKER_PCB; class MARKER_PCB;
class MSG_PANEL_ITEM; class MSG_PANEL_ITEM;
class NETLIST;
class REPORTER;
// non-owning container of item candidates when searching for items on the same track. // non-owning container of item candidates when searching for items on the same track.
...@@ -282,6 +308,12 @@ public: ...@@ -282,6 +308,12 @@ public:
BOARD(); BOARD();
~BOARD(); ~BOARD();
bool IsEmpty() const
{
return m_Drawings.GetCount() == 0 && m_Modules.GetCount() == 0 &&
m_Track.GetCount() == 0 && m_Zone.GetCount() == 0;
}
void Move( const wxPoint& aMoveVector ); // overload void Move( const wxPoint& aMoveVector ); // overload
void SetFileFormatVersionAtLoad( int aVersion ) { m_fileFormatVersionAtLoad = aVersion; } void SetFileFormatVersionAtLoad( int aVersion ) { m_fileFormatVersionAtLoad = aVersion; }
...@@ -849,6 +881,47 @@ public: ...@@ -849,6 +881,47 @@ public:
*/ */
MODULE* FindModuleByReference( const wxString& aReference ) const; MODULE* FindModuleByReference( const wxString& aReference ) const;
/**
* Function FindModule
* searches for a module matching \a aRefOrTimeStamp depending on the state of
* \a aSearchByTimeStamp.
* @param aRefOrTimeStamp is the search string.
* @param aSearchByTimeStamp searches by the module time stamp value if true. Otherwise
* search by reference designator.
* @return the module found or NULL if not module is found that meets the search criteria.
*/
MODULE* FindModule( const wxString& aRefOrTimeStamp, bool aSearchByTimeStamp = false );
/**
* Function ReplaceNetlist
* updates the #BOARD according to \a aNetlist.
*
* The changes are made to the board are as follows they are not disabled in the status
* settings in the #NETLIST:
* - If a new component is found in the #NETLIST and not in the #BOARD, it is added
* to the #BOARD.
* - If a the component in the #NETLIST is already on the #BOARD, then one or more of the
* following actions can occur:
* + If the footprint name in the #NETLIST does not match the footprint name on the
* #BOARD, the footprint on the #BOARD is replaced with the footprint specified in
* the #NETLIST and the proper parameters are copied from the existing footprint.
* + If the reference designator in the #NETLIST does not match the reference designator
* on the #BOARD, the reference designator is updated from the #NETLIST.
* + If the value field in the #NETLIST does not match the value field on the #BOARD,
* the value field is updated from the #NETLIST.
* + If the time stamp in the #NETLIST does not match the time stamp on the #BOARD,
* the time stamp is updated from the #NETLIST.
* - After each footprint is added or update as described above, each footprint pad net
* name is compared and updated to the value defined in the #NETLIST.
* - After all of the footprints have been added, updated, and net names properly set,
* any extra unlock footprints are removed from the #BOARD.
*
* @param aNetlist is the new netlist to revise the contents of the #BOARD with.
* @param aReporter is a #REPORTER object to report the changes \a aNetlist makes to
* the #BOARD. If NULL, no change reporting occurs.
*/
void ReplaceNetlist( NETLIST& aNetlist, REPORTER* aReporter = NULL );
/** /**
* Function ReturnSortedNetnamesList * Function ReturnSortedNetnamesList
* @param aNames An array string to fill with net names. * @param aNames An array string to fill with net names.
...@@ -1229,12 +1302,12 @@ public: ...@@ -1229,12 +1302,12 @@ public:
/** /**
* Function GetPadFast * Function GetPadFast
* return pad found at \a aPosition on \a aLayer using the fast search method. * return pad found at \a aPosition on \a aLayerMask using the fast search method.
* <p> * <p>
* The fast search method only works if the pad list has already been built. * The fast search method only works if the pad list has already been built.
* </p> * </p>
* @param aPosition A wxPoint object containing the position to hit test. * @param aPosition A wxPoint object containing the position to hit test.
* @param aLayer A layer or layers to mask the hit test. * @param aLayerMask A layer or layers to mask the hit test.
* @return A pointer to a D_PAD object if found or NULL if not found. * @return A pointer to a D_PAD object if found or NULL if not found.
*/ */
D_PAD* GetPadFast( const wxPoint& aPosition, LAYER_MSK aLayerMask ); D_PAD* GetPadFast( const wxPoint& aPosition, LAYER_MSK aLayerMask );
......
...@@ -290,15 +290,45 @@ void MODULE::Copy( MODULE* aModule ) ...@@ -290,15 +290,45 @@ void MODULE::Copy( MODULE* aModule )
} }
/** void MODULE::CopyNetlistSettings( MODULE* aModule )
* Function Draw {
* Draws the footprint to the current Device Context // Don't do anything foolish like trying to copy to yourself.
* @param aPanel = draw panel, Used to know the clip box wxCHECK_RET( aModule != NULL && aModule != this, wxT( "Cannot copy to NULL or yourself." ) );
* @param aDC = Current Device Context
* @param aDrawMode = GR_OR, GR_XOR.. // Not sure what to do with the value field. Use netlist for now.
* @param aOffset = draw offset (usually wxPoint(0,0) aModule->SetPosition( GetPosition() );
*/
void MODULE::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, GR_DRAWMODE aDrawMode, const wxPoint& aOffset ) if( aModule->GetLayer() != GetLayer() )
aModule->Flip( aModule->GetPosition() );
if( aModule->GetOrientation() != GetOrientation() )
aModule->Rotate( aModule->GetPosition(), GetOrientation() );
aModule->SetLocalSolderMaskMargin( GetLocalSolderMaskMargin() );
aModule->SetLocalClearance( GetLocalClearance() );
aModule->SetLocalSolderPasteMargin( GetLocalSolderPasteMargin() );
aModule->SetLocalSolderPasteMarginRatio( GetLocalSolderPasteMarginRatio() );
aModule->SetZoneConnection( GetZoneConnection() );
aModule->SetThermalWidth( GetThermalWidth() );
aModule->SetThermalGap( GetThermalGap() );
for( D_PAD* pad = Pads(); pad; pad = pad->Next() )
{
D_PAD* newPad = aModule->FindPadByName( pad->GetPadName() );
if( newPad )
pad->CopyNetlistSettings( newPad );
}
// Not sure about copying description, keywords, 3D models or any other
// local user changes to footprint. Stick with the new footprint settings
// called out in the footprint loaded in the netlist.
aModule->CalculateBoundingBox();
}
void MODULE::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, GR_DRAWMODE aDrawMode,
const wxPoint& aOffset )
{ {
if( (m_Flags & DO_NOT_DRAW) || (IsMoving()) ) if( (m_Flags & DO_NOT_DRAW) || (IsMoving()) )
return; return;
...@@ -354,14 +384,6 @@ void MODULE::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, GR_DRAWMODE aDrawMode, con ...@@ -354,14 +384,6 @@ void MODULE::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, GR_DRAWMODE aDrawMode, con
} }
/**
* Function DrawEdgesOnly
* Draws the footprint edges only to the current Device Context
* @param panel = The active Draw Panel (used to know the clip box)
* @param DC = current Device Context
* @param offset = draw offset (usually wxPoint(0,0)
* @param draw_mode = GR_OR, GR_XOR, GR_AND
*/
void MODULE::DrawEdgesOnly( EDA_DRAW_PANEL* panel, wxDC* DC, const wxPoint& offset, void MODULE::DrawEdgesOnly( EDA_DRAW_PANEL* panel, wxDC* DC, const wxPoint& offset,
GR_DRAWMODE draw_mode ) GR_DRAWMODE draw_mode )
{ {
...@@ -687,6 +709,7 @@ EDA_ITEM* MODULE::Clone() const ...@@ -687,6 +709,7 @@ EDA_ITEM* MODULE::Clone() const
return new MODULE( *this ); return new MODULE( *this );
} }
/* Test for validity of the name in a library of the footprint /* Test for validity of the name in a library of the footprint
* ( no spaces, dir separators ... ) * ( no spaces, dir separators ... )
* return true if the given name is valid * return true if the given name is valid
...@@ -874,6 +897,7 @@ void MODULE::SetPosition( const wxPoint& newpos ) ...@@ -874,6 +897,7 @@ void MODULE::SetPosition( const wxPoint& newpos )
CalculateBoundingBox(); CalculateBoundingBox();
} }
void MODULE::MoveAnchorPosition( const wxPoint& aMoveVector ) void MODULE::MoveAnchorPosition( const wxPoint& aMoveVector )
{ {
/* Move the reference point of the footprint /* Move the reference point of the footprint
...@@ -932,6 +956,7 @@ void MODULE::MoveAnchorPosition( const wxPoint& aMoveVector ) ...@@ -932,6 +956,7 @@ void MODULE::MoveAnchorPosition( const wxPoint& aMoveVector )
CalculateBoundingBox(); CalculateBoundingBox();
} }
void MODULE::SetOrientation( double newangle ) void MODULE::SetOrientation( double newangle )
{ {
double angleChange = newangle - m_Orient; // change in rotation double angleChange = newangle - m_Orient; // change in rotation
......
...@@ -229,6 +229,14 @@ public: ...@@ -229,6 +229,14 @@ public:
/* drawing functions */ /* drawing functions */
/**
* Function Draw
* draws the footprint to the \a aDC.
* @param aPanel = draw panel, Used to know the clip box
* @param aDC = Current Device Context
* @param aDrawMode = GR_OR, GR_XOR..
* @param aOffset = draw offset (usually wxPoint(0,0)
*/
void Draw( EDA_DRAW_PANEL* aPanel, void Draw( EDA_DRAW_PANEL* aPanel,
wxDC* aDC, wxDC* aDC,
GR_DRAWMODE aDrawMode, GR_DRAWMODE aDrawMode,
...@@ -236,6 +244,14 @@ public: ...@@ -236,6 +244,14 @@ public:
void Draw3D( EDA_3D_CANVAS* glcanvas ); void Draw3D( EDA_3D_CANVAS* glcanvas );
/**
* Function DrawEdgesOnly
* Draws the footprint edges only to the current Device Context
* @param panel = The active Draw Panel (used to know the clip box)
* @param DC = current Device Context
* @param offset = draw offset (usually wxPoint(0,0)
* @param draw_mode = GR_OR, GR_XOR, GR_AND
*/
void DrawEdgesOnly( EDA_DRAW_PANEL* panel, wxDC* DC, const wxPoint& offset, void DrawEdgesOnly( EDA_DRAW_PANEL* panel, wxDC* DC, const wxPoint& offset,
GR_DRAWMODE draw_mode ); GR_DRAWMODE draw_mode );
...@@ -306,7 +322,7 @@ public: ...@@ -306,7 +322,7 @@ public:
/** /**
* Function GetPad * Function GetPad
* get a pad at \a aPosition on \a aLayer in the footprint. * get a pad at \a aPosition on \a aLayerMask in the footprint.
* *
* @param aPosition A wxPoint object containing the position to hit test. * @param aPosition A wxPoint object containing the position to hit test.
* @param aLayerMask A layer or layers to mask the hit test. * @param aLayerMask A layer or layers to mask the hit test.
...@@ -361,6 +377,19 @@ public: ...@@ -361,6 +377,19 @@ public:
EDA_ITEM* Clone() const; EDA_ITEM* Clone() const;
/**
* Function CopyNetlistSettings
* copies the netlist settings to \a aModule.
*
* The netlist settings are all of the #MODULE settings not define by a #MODULE in
* a netlist. These setting include position, orientation, local clearances, ets.
* The reference designator, value, path, and physical geometry settings are not
* copied.
*
* @param aModule is the #MODULE to copy the settings to.
*/
void CopyNetlistSettings( MODULE* aModule );
/** /**
* static function IsLibNameValid * static function IsLibNameValid
* Test for validity of a name of a footprint to be used in a footprint library * Test for validity of a name of a footprint to be used in a footprint library
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.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
*/
/** /**
* @file class_netinfo.h * @file class_netinfo.h
*/ */
...@@ -384,6 +408,13 @@ public: ...@@ -384,6 +408,13 @@ public:
*/ */
void SetNetname( const wxString& aNetname ); void SetNetname( const wxString& aNetname );
/**
* Function GetMsgPanelInfo
* returns the information about the #NETINFO_ITEM in \a aList to display in the
* message panel.
*
* @param aList is the list in which to place the status information.
*/
void GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList ); void GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList );
}; };
......
...@@ -99,13 +99,6 @@ void NETINFO_ITEM::Draw( EDA_DRAW_PANEL* panel, ...@@ -99,13 +99,6 @@ void NETINFO_ITEM::Draw( EDA_DRAW_PANEL* panel,
} }
/**
* Function DisplayInfo
* has knowledge about the frame and how and where to put status information
* about this object into the frame's message panel.
* Is virtual from EDA_ITEM.
* @param frame A EDA_DRAW_FRAME in which to print status information.
*/
void NETINFO_ITEM::GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList ) void NETINFO_ITEM::GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList )
{ {
int count; int count;
......
...@@ -301,10 +301,6 @@ void D_PAD::SetPadName( const wxString& name ) ...@@ -301,10 +301,6 @@ void D_PAD::SetPadName( const wxString& name )
} }
/**
* Function SetNetname
* @param aNetname: the new netname
*/
void D_PAD::SetNetname( const wxString& aNetname ) void D_PAD::SetNetname( const wxString& aNetname )
{ {
m_Netname = aNetname; m_Netname = aNetname;
...@@ -348,14 +344,23 @@ void D_PAD::Copy( D_PAD* source ) ...@@ -348,14 +344,23 @@ void D_PAD::Copy( D_PAD* source )
} }
/** void D_PAD::CopyNetlistSettings( D_PAD* aPad )
* Function GetClearance (virtual) {
* returns the clearance in internal units. If \a aItem is not NULL then the // Don't do anything foolish like trying to copy to yourself.
* returned clearance is the greater of this object's clearance and wxCHECK_RET( aPad != NULL && aPad != this, wxT( "Cannot copy to NULL or yourself." ) );
* aItem's clearance. If \a aItem is NULL, then this object clearance is returned.
* @param aItem is another BOARD_CONNECTED_ITEM or NULL aPad->SetNetname( GetNetname() );
* @return int - the clearance in internal units.
*/ aPad->SetLocalClearance( m_LocalClearance );
aPad->SetLocalSolderMaskMargin( m_LocalSolderMaskMargin );
aPad->SetLocalSolderPasteMargin( m_LocalSolderPasteMargin );
aPad->SetLocalSolderPasteMarginRatio( m_LocalSolderPasteMarginRatio );
aPad->SetZoneConnection( m_ZoneConnection );
aPad->SetThermalWidth( m_ThermalWidth );
aPad->SetThermalGap( m_ThermalGap );
}
int D_PAD::GetClearance( BOARD_CONNECTED_ITEM* aItem ) const int D_PAD::GetClearance( BOARD_CONNECTED_ITEM* aItem ) const
{ {
// A pad can have specific clearance parameters that // A pad can have specific clearance parameters that
...@@ -387,15 +392,6 @@ int D_PAD::GetClearance( BOARD_CONNECTED_ITEM* aItem ) const ...@@ -387,15 +392,6 @@ int D_PAD::GetClearance( BOARD_CONNECTED_ITEM* aItem ) const
// Mask margins handling: // Mask margins handling:
/**
* Function GetSolderMaskMargin
* @return the margin for the solder mask layer
* usually > 0 (mask shape bigger than pad
* value is
* 1 - the local value
* 2 - if null, the parent footprint value
* 1 - if null, the global value
*/
int D_PAD::GetSolderMaskMargin() int D_PAD::GetSolderMaskMargin()
{ {
int margin = m_LocalSolderMaskMargin; int margin = m_LocalSolderMaskMargin;
...@@ -429,15 +425,6 @@ int D_PAD::GetSolderMaskMargin() ...@@ -429,15 +425,6 @@ int D_PAD::GetSolderMaskMargin()
} }
/**
* Function GetSolderPasteMargin
* @return the margin for the solder mask layer
* usually < 0 (mask shape smaller than pad
* value is
* 1 - the local value
* 2 - if null, the parent footprint value
* 3 - if null, the global value
*/
wxSize D_PAD::GetSolderPasteMargin() wxSize D_PAD::GetSolderPasteMargin()
{ {
int margin = m_LocalSolderPasteMargin; int margin = m_LocalSolderPasteMargin;
...@@ -538,7 +525,7 @@ void D_PAD::GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM>& aList ) ...@@ -538,7 +525,7 @@ void D_PAD::GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM>& aList )
board = GetBoard(); board = GetBoard();
aList.push_back( MSG_PANEL_ITEM( _( "Layer" ), aList.push_back( MSG_PANEL_ITEM( _( "Layer" ),
LayerMaskDescribe( board, m_layerMask ), DARKGREEN ) ); LayerMaskDescribe( board, m_layerMask ), DARKGREEN ) );
aList.push_back( MSG_PANEL_ITEM( ShowPadShape(), ShowPadAttr(), DARKGREEN ) ); aList.push_back( MSG_PANEL_ITEM( ShowPadShape(), ShowPadAttr(), DARKGREEN ) );
...@@ -754,6 +741,7 @@ wxString D_PAD::GetSelectMenuText() const ...@@ -754,6 +741,7 @@ wxString D_PAD::GetSelectMenuText() const
return text; return text;
} }
EDA_ITEM* D_PAD::Clone() const EDA_ITEM* D_PAD::Clone() const
{ {
return new D_PAD( *this ); return new D_PAD( *this );
......
...@@ -395,6 +395,18 @@ public: ...@@ -395,6 +395,18 @@ public:
EDA_ITEM* Clone() const; EDA_ITEM* Clone() const;
/**
* Function CopyNetlistSettings
* copies the netlist settings to \a aPad.
*
* The netlist settings are all of the #D_PAD settings not define by a #D_PAD in
* a netlist. These setting include local clearances, net names, etc. The pad
* physical geometry settings are not copied.
*
* @param aPad is the #D_PAD to copy the settings to.
*/
void CopyNetlistSettings( D_PAD* aPad );
#if defined(DEBUG) #if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const; // overload void Show( int nestLevel, std::ostream& os ) const; // overload
#endif #endif
......
/** /**
* @file dialog_edit_module_text.cpp. * @file dialog_edit_module_text.cpp
* @brief dialog editor for texts (fields) in footprints * @brief dialog editor for texts (fields) in footprints.
*/ */
/* /*
......
This diff is collapsed.
...@@ -31,31 +31,68 @@ ...@@ -31,31 +31,68 @@
#include <dialog_netlist_fbp.h> #include <dialog_netlist_fbp.h>
class MODULE;
class NETLIST;
class DIALOG_NETLIST : public DIALOG_NETLIST_FBP class DIALOG_NETLIST : public DIALOG_NETLIST_FBP
{ {
private: private:
PCB_EDIT_FRAME * m_parent; PCB_EDIT_FRAME* m_parent;
wxDC * m_dc; wxDC* m_dc;
public: public:
DIALOG_NETLIST( PCB_EDIT_FRAME* aParent, wxDC * aDC, DIALOG_NETLIST( PCB_EDIT_FRAME* aParent, wxDC* aDC, const wxString & aNetlistFullFilename );
const wxString & aNetlistFullFilename );
~DIALOG_NETLIST() {}; ~DIALOG_NETLIST() {};
// return true if the user choice is tu use the .cmp file
// created by CvPcb to know footprin names associated to components // return true if the user choice is to use the .cmp file
// and false tu use the netlist only // created by CvPcb to know footprint names associated to components
// and false to use the netlist only
bool UseCmpFileForFpNames() bool UseCmpFileForFpNames()
{ {
return m_cmpNameSourceOpt->GetSelection() == 1; return m_cmpNameSourceOpt->GetSelection() == 1;
} }
private: private:
/**
* Function verifyFootprints
* compares the netlist to the board and builds a list of duplicate, missing, and
* extra footprints.
*
* @param aNetlistFilename the netlist filename.
* @param aCmpFilename the component link filename.
* @param aDuplicate the list of duplicate modules to populate
* @param aMissing the list of missing module references and values to populate. For
* each missing item, the first string is the reference designator and
* the second is the value.
* @param aNotInNetlist is the list of component footprint found in the netlist but not on
* the board.
* @return true if no errors occurred while reading the netlist. Otherwise false.
*/
bool verifyFootprints( const wxString& aNetlistFilename,
const wxString& aCmpFilename,
std::vector< MODULE* >& aDuplicate,
wxArrayString& aMissing,
std::vector< MODULE* >& aNotInNetlist );
/**
* Function loadFootprints
* loads the footprints for each #COMPONENT in \a aNetlist from the list of libraries.
*
* @param aNetlist is the netlist of components to load the footprints into.
*/
void loadFootprints( NETLIST& aNetlist );
// Virtual event handlers: // Virtual event handlers:
void OnOpenNetlistClick( wxCommandEvent& event ); void OnOpenNetlistClick( wxCommandEvent& event );
void OnReadNetlistFileClick( wxCommandEvent& event ); void OnReadNetlistFileClick( wxCommandEvent& event );
void OnTestFootprintsClick( wxCommandEvent& event ); void OnTestFootprintsClick( wxCommandEvent& event );
void OnCompileRatsnestClick( wxCommandEvent& event ); void OnCompileRatsnestClick( wxCommandEvent& event );
void OnCancelClick( wxCommandEvent& event ); void OnCancelClick( wxCommandEvent& event );
void OnSaveMessagesToFile( wxCommandEvent& aEvent );
void OnUpdateUISaveMessagesToFile( wxUpdateUIEvent& aEvent );
void OnUpdateUIValidNetlistFile( wxUpdateUIEvent& aEvent );
}; };
......
...@@ -24,7 +24,7 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w ...@@ -24,7 +24,7 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w
wxString m_Select_By_TimestampChoices[] = { _("Reference"), _("Timestamp") }; wxString m_Select_By_TimestampChoices[] = { _("Reference"), _("Timestamp") };
int m_Select_By_TimestampNChoices = sizeof( m_Select_By_TimestampChoices ) / sizeof( wxString ); int m_Select_By_TimestampNChoices = sizeof( m_Select_By_TimestampChoices ) / sizeof( wxString );
m_Select_By_Timestamp = new wxRadioBox( this, wxID_ANY, _("Module Selection:"), wxDefaultPosition, wxDefaultSize, m_Select_By_TimestampNChoices, m_Select_By_TimestampChoices, 1, wxRA_SPECIFY_COLS ); m_Select_By_Timestamp = new wxRadioBox( this, wxID_ANY, _("Module Selection"), wxDefaultPosition, wxDefaultSize, m_Select_By_TimestampNChoices, m_Select_By_TimestampChoices, 1, wxRA_SPECIFY_COLS );
m_Select_By_Timestamp->SetSelection( 0 ); m_Select_By_Timestamp->SetSelection( 0 );
m_Select_By_Timestamp->SetToolTip( _("Select how footprints are recognized:\nby their reference (U1, R3...) (normal setting)\nor their time stamp (special setting after a full schematic reannotation)") ); m_Select_By_Timestamp->SetToolTip( _("Select how footprints are recognized:\nby their reference (U1, R3...) (normal setting)\nor their time stamp (special setting after a full schematic reannotation)") );
...@@ -32,7 +32,7 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w ...@@ -32,7 +32,7 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w
wxString m_cmpNameSourceOptChoices[] = { _("From netlist"), _("From separate .cmp file") }; wxString m_cmpNameSourceOptChoices[] = { _("From netlist"), _("From separate .cmp file") };
int m_cmpNameSourceOptNChoices = sizeof( m_cmpNameSourceOptChoices ) / sizeof( wxString ); int m_cmpNameSourceOptNChoices = sizeof( m_cmpNameSourceOptChoices ) / sizeof( wxString );
m_cmpNameSourceOpt = new wxRadioBox( this, wxID_ANY, _("Module Name Source:"), wxDefaultPosition, wxDefaultSize, m_cmpNameSourceOptNChoices, m_cmpNameSourceOptChoices, 1, wxRA_SPECIFY_COLS ); m_cmpNameSourceOpt = new wxRadioBox( this, wxID_ANY, _("Module Name Source"), wxDefaultPosition, wxDefaultSize, m_cmpNameSourceOptNChoices, m_cmpNameSourceOptChoices, 1, wxRA_SPECIFY_COLS );
m_cmpNameSourceOpt->SetSelection( 0 ); m_cmpNameSourceOpt->SetSelection( 0 );
m_cmpNameSourceOpt->SetToolTip( _("Source of footprints names for component:\n- the netlist (if you have filled the footprint field of each component in schematic)\n- the .cmp file created by CvPcb") ); m_cmpNameSourceOpt->SetToolTip( _("Source of footprints names for component:\n- the netlist (if you have filled the footprint field of each component in schematic)\n- the .cmp file created by CvPcb") );
...@@ -40,7 +40,7 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w ...@@ -40,7 +40,7 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w
wxString m_ChangeExistingFootprintCtrlChoices[] = { _("Keep"), _("Change") }; wxString m_ChangeExistingFootprintCtrlChoices[] = { _("Keep"), _("Change") };
int m_ChangeExistingFootprintCtrlNChoices = sizeof( m_ChangeExistingFootprintCtrlChoices ) / sizeof( wxString ); int m_ChangeExistingFootprintCtrlNChoices = sizeof( m_ChangeExistingFootprintCtrlChoices ) / sizeof( wxString );
m_ChangeExistingFootprintCtrl = new wxRadioBox( this, wxID_ANY, _("Exchange Module:"), wxDefaultPosition, wxDefaultSize, m_ChangeExistingFootprintCtrlNChoices, m_ChangeExistingFootprintCtrlChoices, 1, wxRA_SPECIFY_COLS ); m_ChangeExistingFootprintCtrl = new wxRadioBox( this, wxID_ANY, _("Exchange Module"), wxDefaultPosition, wxDefaultSize, m_ChangeExistingFootprintCtrlNChoices, m_ChangeExistingFootprintCtrlChoices, 1, wxRA_SPECIFY_COLS );
m_ChangeExistingFootprintCtrl->SetSelection( 0 ); m_ChangeExistingFootprintCtrl->SetSelection( 0 );
m_ChangeExistingFootprintCtrl->SetToolTip( _("Keep or change an existing footprint when the netlist gives a different footprint") ); m_ChangeExistingFootprintCtrl->SetToolTip( _("Keep or change an existing footprint when the netlist gives a different footprint") );
...@@ -54,7 +54,7 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w ...@@ -54,7 +54,7 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w
wxString m_DeleteBadTracksChoices[] = { _("Keep"), _("Delete") }; wxString m_DeleteBadTracksChoices[] = { _("Keep"), _("Delete") };
int m_DeleteBadTracksNChoices = sizeof( m_DeleteBadTracksChoices ) / sizeof( wxString ); int m_DeleteBadTracksNChoices = sizeof( m_DeleteBadTracksChoices ) / sizeof( wxString );
m_DeleteBadTracks = new wxRadioBox( this, wxID_ANY, _("Bad Tracks Deletion:"), wxDefaultPosition, wxDefaultSize, m_DeleteBadTracksNChoices, m_DeleteBadTracksChoices, 1, wxRA_SPECIFY_COLS ); m_DeleteBadTracks = new wxRadioBox( this, wxID_ANY, _("Unconnected Tracks"), wxDefaultPosition, wxDefaultSize, m_DeleteBadTracksNChoices, m_DeleteBadTracksChoices, 1, wxRA_SPECIFY_COLS );
m_DeleteBadTracks->SetSelection( 0 ); m_DeleteBadTracks->SetSelection( 0 );
m_DeleteBadTracks->SetToolTip( _("Keep or delete bad tracks after a netlist change") ); m_DeleteBadTracks->SetToolTip( _("Keep or delete bad tracks after a netlist change") );
...@@ -74,7 +74,7 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w ...@@ -74,7 +74,7 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w
wxBoxSizer* bRightSizerButtons; wxBoxSizer* bRightSizerButtons;
bRightSizerButtons = new wxBoxSizer( wxVERTICAL ); bRightSizerButtons = new wxBoxSizer( wxVERTICAL );
m_buttonBrowse = new wxButton( this, ID_OPEN_NELIST, _("Browse Netlist Files"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonBrowse = new wxButton( this, ID_OPEN_NELIST, _("Open Netlist File"), wxDefaultPosition, wxDefaultSize, 0 );
bRightSizerButtons->Add( m_buttonBrowse, 0, wxEXPAND|wxALL, 5 ); bRightSizerButtons->Add( m_buttonBrowse, 0, wxEXPAND|wxALL, 5 );
m_buttonRead = new wxButton( this, ID_READ_NETLIST_FILE, _("Read Current Netlist"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonRead = new wxButton( this, ID_READ_NETLIST_FILE, _("Read Current Netlist"), wxDefaultPosition, wxDefaultSize, 0 );
...@@ -83,7 +83,7 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w ...@@ -83,7 +83,7 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w
bRightSizerButtons->Add( m_buttonRead, 0, wxEXPAND|wxALL, 5 ); bRightSizerButtons->Add( m_buttonRead, 0, wxEXPAND|wxALL, 5 );
m_buttonFPTest = new wxButton( this, ID_TEST_NETLIST, _("Footprints Test"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonFPTest = new wxButton( this, ID_TEST_NETLIST, _("Test Footprints"), wxDefaultPosition, wxDefaultSize, 0 );
m_buttonFPTest->SetToolTip( _("Read the current neltist file and list missing and extra footprints") ); m_buttonFPTest->SetToolTip( _("Read the current neltist file and list missing and extra footprints") );
bRightSizerButtons->Add( m_buttonFPTest, 0, wxEXPAND|wxALL, 5 ); bRightSizerButtons->Add( m_buttonFPTest, 0, wxEXPAND|wxALL, 5 );
...@@ -93,15 +93,27 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w ...@@ -93,15 +93,27 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w
bRightSizerButtons->Add( m_buttonRebild, 0, wxEXPAND|wxALL, 5 ); bRightSizerButtons->Add( m_buttonRebild, 0, wxEXPAND|wxALL, 5 );
m_buttonSaveMessages = new wxButton( this, wxID_ANY, _("Save Messages to File"), wxDefaultPosition, wxDefaultSize, 0 );
bRightSizerButtons->Add( m_buttonSaveMessages, 0, wxALL|wxEXPAND, 5 );
m_buttonClose = new wxButton( this, wxID_CANCEL, _("Close"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonClose = new wxButton( this, wxID_CANCEL, _("Close"), wxDefaultPosition, wxDefaultSize, 0 );
bRightSizerButtons->Add( m_buttonClose, 0, wxALL|wxEXPAND, 5 ); bRightSizerButtons->Add( m_buttonClose, 0, wxALL|wxEXPAND, 5 );
bUpperSizer->Add( bRightSizerButtons, 0, wxALIGN_CENTER_VERTICAL, 5 ); bUpperSizer->Add( bRightSizerButtons, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP, 5 );
bMainSizer->Add( bUpperSizer, 0, wxEXPAND|wxLEFT|wxRIGHT|wxTOP, 5 ); bMainSizer->Add( bUpperSizer, 0, wxEXPAND|wxLEFT|wxRIGHT|wxTOP, 5 );
wxBoxSizer* bCenterSizer;
bCenterSizer = new wxBoxSizer( wxVERTICAL );
m_checkDryRun = new wxCheckBox( this, wxID_ANY, _("Only report changes in message panel"), wxDefaultPosition, wxDefaultSize, 0 );
bCenterSizer->Add( m_checkDryRun, 0, wxALL, 5 );
bMainSizer->Add( bCenterSizer, 0, wxALL|wxEXPAND, 5 );
m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
bMainSizer->Add( m_staticline1, 0, wxEXPAND | wxALL, 5 ); bMainSizer->Add( m_staticline1, 0, wxEXPAND | wxALL, 5 );
...@@ -137,8 +149,13 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w ...@@ -137,8 +149,13 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w
// Connect Events // Connect Events
m_buttonBrowse->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnOpenNetlistClick ), NULL, this ); m_buttonBrowse->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnOpenNetlistClick ), NULL, this );
m_buttonRead->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnReadNetlistFileClick ), NULL, this ); m_buttonRead->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnReadNetlistFileClick ), NULL, this );
m_buttonRead->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_NETLIST_FBP::OnUpdateUIValidNetlistFile ), NULL, this );
m_buttonFPTest->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnTestFootprintsClick ), NULL, this ); m_buttonFPTest->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnTestFootprintsClick ), NULL, this );
m_buttonFPTest->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_NETLIST_FBP::OnUpdateUIValidNetlistFile ), NULL, this );
m_buttonRebild->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnCompileRatsnestClick ), NULL, this ); m_buttonRebild->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnCompileRatsnestClick ), NULL, this );
m_buttonRebild->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_NETLIST_FBP::OnUpdateUIValidNetlistFile ), NULL, this );
m_buttonSaveMessages->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnSaveMessagesToFile ), NULL, this );
m_buttonSaveMessages->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_NETLIST_FBP::OnUpdateUISaveMessagesToFile ), NULL, this );
m_buttonClose->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnCancelClick ), NULL, this ); m_buttonClose->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnCancelClick ), NULL, this );
} }
...@@ -147,8 +164,13 @@ DIALOG_NETLIST_FBP::~DIALOG_NETLIST_FBP() ...@@ -147,8 +164,13 @@ DIALOG_NETLIST_FBP::~DIALOG_NETLIST_FBP()
// Disconnect Events // Disconnect Events
m_buttonBrowse->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnOpenNetlistClick ), NULL, this ); m_buttonBrowse->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnOpenNetlistClick ), NULL, this );
m_buttonRead->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnReadNetlistFileClick ), NULL, this ); m_buttonRead->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnReadNetlistFileClick ), NULL, this );
m_buttonRead->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_NETLIST_FBP::OnUpdateUIValidNetlistFile ), NULL, this );
m_buttonFPTest->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnTestFootprintsClick ), NULL, this ); m_buttonFPTest->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnTestFootprintsClick ), NULL, this );
m_buttonFPTest->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_NETLIST_FBP::OnUpdateUIValidNetlistFile ), NULL, this );
m_buttonRebild->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnCompileRatsnestClick ), NULL, this ); m_buttonRebild->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnCompileRatsnestClick ), NULL, this );
m_buttonRebild->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_NETLIST_FBP::OnUpdateUIValidNetlistFile ), NULL, this );
m_buttonSaveMessages->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnSaveMessagesToFile ), NULL, this );
m_buttonSaveMessages->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_NETLIST_FBP::OnUpdateUISaveMessagesToFile ), NULL, this );
m_buttonClose->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnCancelClick ), NULL, this ); m_buttonClose->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnCancelClick ), NULL, this );
} }
This diff is collapsed.
...@@ -22,6 +22,7 @@ class DIALOG_SHIM; ...@@ -22,6 +22,7 @@ class DIALOG_SHIM;
#include <wx/settings.h> #include <wx/settings.h>
#include <wx/sizer.h> #include <wx/sizer.h>
#include <wx/button.h> #include <wx/button.h>
#include <wx/checkbox.h>
#include <wx/statline.h> #include <wx/statline.h>
#include <wx/stattext.h> #include <wx/stattext.h>
#include <wx/textctrl.h> #include <wx/textctrl.h>
...@@ -54,7 +55,9 @@ class DIALOG_NETLIST_FBP : public DIALOG_SHIM ...@@ -54,7 +55,9 @@ class DIALOG_NETLIST_FBP : public DIALOG_SHIM
wxButton* m_buttonRead; wxButton* m_buttonRead;
wxButton* m_buttonFPTest; wxButton* m_buttonFPTest;
wxButton* m_buttonRebild; wxButton* m_buttonRebild;
wxButton* m_buttonSaveMessages;
wxButton* m_buttonClose; wxButton* m_buttonClose;
wxCheckBox* m_checkDryRun;
wxStaticLine* m_staticline1; wxStaticLine* m_staticline1;
wxStaticText* m_staticTextNetfilename; wxStaticText* m_staticTextNetfilename;
wxTextCtrl* m_NetlistFilenameCtrl; wxTextCtrl* m_NetlistFilenameCtrl;
...@@ -64,8 +67,11 @@ class DIALOG_NETLIST_FBP : public DIALOG_SHIM ...@@ -64,8 +67,11 @@ class DIALOG_NETLIST_FBP : public DIALOG_SHIM
// Virtual event handlers, overide them in your derived class // Virtual event handlers, overide them in your derived class
virtual void OnOpenNetlistClick( wxCommandEvent& event ) { event.Skip(); } virtual void OnOpenNetlistClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnReadNetlistFileClick( wxCommandEvent& event ) { event.Skip(); } virtual void OnReadNetlistFileClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnUpdateUIValidNetlistFile( wxUpdateUIEvent& event ) { event.Skip(); }
virtual void OnTestFootprintsClick( wxCommandEvent& event ) { event.Skip(); } virtual void OnTestFootprintsClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnCompileRatsnestClick( wxCommandEvent& event ) { event.Skip(); } virtual void OnCompileRatsnestClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSaveMessagesToFile( wxCommandEvent& event ) { event.Skip(); }
virtual void OnUpdateUISaveMessagesToFile( wxUpdateUIEvent& event ) { event.Skip(); }
virtual void OnCancelClick( wxCommandEvent& event ) { event.Skip(); } virtual void OnCancelClick( wxCommandEvent& event ) { event.Skip(); }
......
/** /**
* @file DIALOG_ORIENT_FOOTPRINTS.cpp * @file dialog_orient_footprints.cpp
*/ */
/* /*
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
...@@ -58,10 +58,12 @@ public: ...@@ -58,10 +58,12 @@ public:
{ {
return m_ApplyToLocked->IsChecked(); return m_ApplyToLocked->IsChecked();
} }
int GetOrientation() int GetOrientation()
{ {
return newOrientation; return newOrientation;
} }
wxString GetFilter() wxString GetFilter()
{ {
return m_FilterPattern->GetValue(); return m_FilterPattern->GetValue();
...@@ -73,6 +75,8 @@ private: ...@@ -73,6 +75,8 @@ private:
void OnOkClick( wxCommandEvent& event ); void OnOkClick( wxCommandEvent& event );
void OnCancelClick( wxCommandEvent& event ); void OnCancelClick( wxCommandEvent& event );
}; };
int DIALOG_ORIENT_FOOTPRINTS::newOrientation = 0; int DIALOG_ORIENT_FOOTPRINTS::newOrientation = 0;
...@@ -81,23 +85,18 @@ DIALOG_ORIENT_FOOTPRINTS::DIALOG_ORIENT_FOOTPRINTS( PCB_EDIT_FRAME* parent ) ...@@ -81,23 +85,18 @@ DIALOG_ORIENT_FOOTPRINTS::DIALOG_ORIENT_FOOTPRINTS( PCB_EDIT_FRAME* parent )
{ {
m_Parent = parent; m_Parent = parent;
wxString txt; wxString txt;
txt.Printf(wxT("%g"), (double) newOrientation/10); txt.Printf( wxT( "%g" ), (double) newOrientation/10 );
m_OrientationCtrl->SetValue(txt); m_OrientationCtrl->SetValue( txt );
SetFocus( ); SetFocus();
GetSizer()->SetSizeHints(this); GetSizer()->SetSizeHints( this );
Centre(); Centre();
} }
/****************************************************************/
void PCB_EDIT_FRAME::OnOrientFootprints( wxCommandEvent& event ) void PCB_EDIT_FRAME::OnOrientFootprints( wxCommandEvent& event )
/****************************************************************/
/**
* Function OnOrientFootprints
* install the dialog box for the comman Orient Footprints
*/
{ {
DIALOG_ORIENT_FOOTPRINTS dlg(this); DIALOG_ORIENT_FOOTPRINTS dlg( this );
if( dlg.ShowModal() != wxID_OK ) if( dlg.ShowModal() != wxID_OK )
return; return;
...@@ -111,23 +110,13 @@ void PCB_EDIT_FRAME::OnOrientFootprints( wxCommandEvent& event ) ...@@ -111,23 +110,13 @@ void PCB_EDIT_FRAME::OnOrientFootprints( wxCommandEvent& event )
} }
/*******************************************************************/ bool PCB_EDIT_FRAME::ReOrientModules( const wxString& ModuleMask, int Orient, bool include_fixe )
bool PCB_EDIT_FRAME::ReOrientModules( const wxString& ModuleMask,
int Orient, bool include_fixe )
/*******************************************************************/
/**
* Function ReOrientModules
* Set the orientation of footprints
* @param ModuleMask = mask (wildcard allowed) selection
* @param Orient = new orientation
* @param include_fixe = true to orient locked footprints
* @return true if some footprints modified, false if no change
*/
{ {
wxString line; wxString line;
bool modified = false; bool modified = false;
line.Printf( _( "OK to set footprints orientation to %.1f degrees ?" ), (double)Orient / 10 ); line.Printf( _( "OK to set footprints orientation to %.1f degrees ?" ), (double)Orient / 10 );
if( !IsOK( this, line ) ) if( !IsOK( this, line ) )
return false; return false;
...@@ -155,13 +144,13 @@ void DIALOG_ORIENT_FOOTPRINTS::OnOkClick( wxCommandEvent& event ) ...@@ -155,13 +144,13 @@ void DIALOG_ORIENT_FOOTPRINTS::OnOkClick( wxCommandEvent& event )
double d_orient; double d_orient;
wxString text = m_OrientationCtrl->GetValue(); wxString text = m_OrientationCtrl->GetValue();
if ( ! text.ToDouble(&d_orient) ) if ( ! text.ToDouble( &d_orient ) )
{ {
DisplayError(this, _("Bad value for footprints orientation")); DisplayError( this, _( "Bad value for footprints orientation" ) );
return; return;
} }
newOrientation = KiROUND(d_orient * 10); newOrientation = KiROUND( d_orient * 10 );
NORMALIZE_ANGLE_180( newOrientation ); NORMALIZE_ANGLE_180( newOrientation );
EndModal( wxID_OK ); EndModal( wxID_OK );
} }
......
/** /**
* @file dialog_pad_properties.cpp. * @file dialog_pad_properties.cpp
* @brief Pad editing functions and dialog pad editor * @brief Pad editing functions and dialog pad editor.
*/ */
/* /*
......
...@@ -132,7 +132,7 @@ wxString PCB_BASE_FRAME::SelectFootprintFromLibBrowser( void ) ...@@ -132,7 +132,7 @@ wxString PCB_BASE_FRAME::SelectFootprintFromLibBrowser( void )
wxMilliSleep( 50 ); wxMilliSleep( 50 );
} }
// Returnd the full fp name, i.e. the lib name and th fp name, // Returns the full fp name, i.e. the lib name and th fp name,
// separated by a '/' // separated by a '/'
// (/ is now an illegal char in fp names) // (/ is now an illegal char in fp names)
wxString fpname = viewer->GetSelectedLibraryFullName(); wxString fpname = viewer->GetSelectedLibraryFullName();
...@@ -269,15 +269,6 @@ MODULE* PCB_BASE_FRAME::Load_Module_From_Library( const wxString& aLibrary, ...@@ -269,15 +269,6 @@ MODULE* PCB_BASE_FRAME::Load_Module_From_Library( const wxString& aLibrary,
} }
/* scans active libraries to find and load aFootprintName.
* If found the module is added to the BOARD, just for good measure.
* aLibraryPath is the full/short name of the library.
* if empty, search in all libraries
* aFootprintName is the footprint to load
* aDisplayError = true to display an error message if any.
*
* return a pointer to the new module, or NULL
*/
MODULE* PCB_BASE_FRAME::GetModuleLibrary( const wxString& aLibraryPath, MODULE* PCB_BASE_FRAME::GetModuleLibrary( const wxString& aLibraryPath,
const wxString& aFootprintName, const wxString& aFootprintName,
bool aDisplayError ) bool aDisplayError )
...@@ -289,12 +280,6 @@ MODULE* PCB_BASE_FRAME::GetModuleLibrary( const wxString& aLibraryPath, ...@@ -289,12 +280,6 @@ MODULE* PCB_BASE_FRAME::GetModuleLibrary( const wxString& aLibraryPath,
} }
/* loads aFootprintName from aLibraryPath.
* If found the module is added to the BOARD, just for good measure.
*
* aLibraryPath - the full filename or the short name of the library to read.
* if it is a short name, the file is searched in all library valid paths
*/
MODULE* PCB_BASE_FRAME::loadFootprintFromLibrary( const wxString& aLibraryPath, MODULE* PCB_BASE_FRAME::loadFootprintFromLibrary( const wxString& aLibraryPath,
const wxString& aFootprintName, const wxString& aFootprintName,
bool aDisplayError, bool aDisplayError,
...@@ -337,10 +322,6 @@ MODULE* PCB_BASE_FRAME::loadFootprintFromLibrary( const wxString& aLibraryPath, ...@@ -337,10 +322,6 @@ MODULE* PCB_BASE_FRAME::loadFootprintFromLibrary( const wxString& aLibraryPath,
} }
/* Explore the libraries list and
* loads aFootprintName from the first library it is found
* If found add the module is also added to the BOARD, just for good measure.
*/
MODULE* PCB_BASE_FRAME::loadFootprintFromLibraries( MODULE* PCB_BASE_FRAME::loadFootprintFromLibraries(
const wxString& aFootprintName, bool aDisplayError ) const wxString& aFootprintName, bool aDisplayError )
{ {
...@@ -399,6 +380,35 @@ MODULE* PCB_BASE_FRAME::loadFootprintFromLibraries( ...@@ -399,6 +380,35 @@ MODULE* PCB_BASE_FRAME::loadFootprintFromLibraries(
{ {
DisplayError( this, ioe.errorText ); DisplayError( this, ioe.errorText );
} }
return NULL;
}
MODULE* PCB_BASE_FRAME::loadFootprint( const wxString& aFootprintName )
throw( IO_ERROR, PARSE_ERROR )
{
wxString libPath;
wxFileName fn;
MODULE* footprint;
PLUGIN::RELEASER pi( IO_MGR::PluginFind( IO_MGR::LEGACY ) );
for( unsigned ii = 0; ii < g_LibraryNames.GetCount(); ii++ )
{
fn = wxFileName( wxEmptyString, g_LibraryNames[ii], LegacyFootprintLibPathExtension );
libPath = wxGetApp().FindLibraryPath( fn );
if( !libPath )
continue;
footprint = pi->FootprintLoad( libPath, aFootprintName );
if( footprint )
return footprint;
}
return NULL; return NULL;
} }
...@@ -486,9 +496,6 @@ wxString PCB_BASE_FRAME::Select_1_Module_From_List( EDA_DRAW_FRAME* aWindow, ...@@ -486,9 +496,6 @@ wxString PCB_BASE_FRAME::Select_1_Module_From_List( EDA_DRAW_FRAME* aWindow,
} }
/* Find and display the doc Component Name
* The list of doc is pointed to by mlist.
*/
static void DisplayCmpDoc( wxString& Name ) static void DisplayCmpDoc( wxString& Name )
{ {
FOOTPRINT_INFO* module_info = MList.GetModuleInfo( Name ); FOOTPRINT_INFO* module_info = MList.GetModuleInfo( Name );
......
...@@ -688,40 +688,40 @@ MODULE* PCB_EDIT_FRAME::Create_MuWaveComponent( int shape_type ) ...@@ -688,40 +688,40 @@ MODULE* PCB_EDIT_FRAME::Create_MuWaveComponent( int shape_type )
break; break;
case 2: // Arc Stub created by a polygonal approach: case 2: // Arc Stub created by a polygonal approach:
{ {
EDGE_MODULE* edge = new EDGE_MODULE( module ); EDGE_MODULE* edge = new EDGE_MODULE( module );
module->GraphicalItems().PushFront( edge ); module->GraphicalItems().PushFront( edge );
edge->SetShape( S_POLYGON ); edge->SetShape( S_POLYGON );
edge->SetLayer( LAYER_N_FRONT ); edge->SetLayer( LAYER_N_FRONT );
int numPoints = angle / 50 + 3; // Note: angles are in 0.1 degrees int numPoints = angle / 50 + 3; // Note: angles are in 0.1 degrees
std::vector<wxPoint> polyPoints = edge->GetPolyPoints(); std::vector<wxPoint> polyPoints = edge->GetPolyPoints();
polyPoints.reserve( numPoints ); polyPoints.reserve( numPoints );
edge->m_Start0.y = -pad->GetSize().y / 2; edge->m_Start0.y = -pad->GetSize().y / 2;
polyPoints.push_back( wxPoint( 0, 0 ) ); polyPoints.push_back( wxPoint( 0, 0 ) );
int theta = -angle / 2; int theta = -angle / 2;
for( int ii = 1; ii<numPoints - 1; ii++ ) for( int ii = 1; ii<numPoints - 1; ii++ )
{ {
wxPoint pt( 0, -gap_size ); wxPoint pt( 0, -gap_size );
RotatePoint( &pt.x, &pt.y, theta );
polyPoints.push_back( pt ); RotatePoint( &pt.x, &pt.y, theta );
theta += 50; polyPoints.push_back( pt );
if( theta > angle / 2 ) theta += 50;
theta = angle / 2;
}
// Close the polygon: if( theta > angle / 2 )
polyPoints.push_back( polyPoints[0] ); theta = angle / 2;
} }
// Close the polygon:
polyPoints.push_back( polyPoints[0] );
}
break; break;
default: default:
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment