diff --git a/common/common.cpp b/common/common.cpp index ba6d346cd5..b67dc35e68 100644 --- a/common/common.cpp +++ b/common/common.cpp @@ -52,14 +52,9 @@ wxString g_ProductName = wxT( "KiCad E.D.A. " ); bool g_ShowPageLimits = true; wxString g_UserLibDirBuffer; -wxString g_Prj_Default_Config_FullFilename; -wxString g_Prj_Config_LocalFilename; - EDA_UNITS_T g_UserUnit; - EDA_COLOR_T g_GhostColor; - #if defined(KICAD_GOST) static const bool s_gost = true; #else diff --git a/common/projet_config.cpp b/common/projet_config.cpp index dba92bb4e5..5ebb436256 100644 --- a/common/projet_config.cpp +++ b/common/projet_config.cpp @@ -20,7 +20,6 @@ #define CONFIG_VERSION 1 - #define FORCE_LOCAL_CONFIG true @@ -29,7 +28,6 @@ bool EDA_APP::ReCreatePrjConfig( const wxString& fileName, bool ForceUseLocalConfig ) { wxFileName fn = fileName; - wxString defaultFileName; // Free old config file. if( m_projectSettings ) @@ -38,9 +36,9 @@ bool EDA_APP::ReCreatePrjConfig( const wxString& fileName, m_projectSettings = NULL; } - /* Check the file name does not a KiCad project extension. + /* Force the file extension. * This allows the user to enter a filename without extension - * or use an existing name to create te project file + * or use an existing name to create the project file */ if( fn.GetExt() != ProjectFileExtension ) { @@ -58,8 +56,9 @@ bool EDA_APP::ReCreatePrjConfig( const wxString& fileName, // Init local config filename if( ForceUseLocalConfig || fn.FileExists() ) { + m_CurrentOptionFile = fn.GetFullPath(); m_projectSettings = new wxFileConfig( wxEmptyString, wxEmptyString, - fn.GetFullPath(), wxEmptyString ); + m_CurrentOptionFile, wxEmptyString ); m_projectSettings->DontCreateOnDemand(); if( ForceUseLocalConfig ) @@ -90,9 +89,10 @@ bool EDA_APP::ReCreatePrjConfig( const wxString& fileName, } } + wxString defaultFileName; defaultFileName = m_libSearchPaths.FindValidPath( wxT( "kicad.pro" ) ); - if( !defaultFileName ) + if( defaultFileName.IsEmpty() ) { wxLogDebug( wxT( "Template file not found." ) ); fn = wxFileName( GetTraits()->GetStandardPaths().GetDocumentsDir(), @@ -104,6 +104,7 @@ bool EDA_APP::ReCreatePrjConfig( const wxString& fileName, } // Create new project file using the default name. + m_CurrentOptionFile = fn.GetFullPath(); m_projectSettings = new wxFileConfig( wxEmptyString, wxEmptyString, wxEmptyString, fn.GetFullPath() ); m_projectSettings->DontCreateOnDemand(); @@ -112,63 +113,6 @@ bool EDA_APP::ReCreatePrjConfig( const wxString& fileName, } -void EDA_APP::WriteProjectConfig( const wxString& fileName, - const wxString& GroupName, - PARAM_CFG_BASE** List ) -{ - PARAM_CFG_BASE* pt_cfg; - wxString msg; - - ReCreatePrjConfig( fileName, GroupName, FORCE_LOCAL_CONFIG ); - - /* Write time (especially to avoid bug wxFileConfig that writes the - * wrong item if declaration [xx] in first line (If empty group) - */ - m_projectSettings->SetPath( wxCONFIG_PATH_SEPARATOR ); - - msg = DateAndTime(); - m_projectSettings->Write( wxT( "update" ), msg ); - - msg = GetAppName(); - m_projectSettings->Write( wxT( "last_client" ), msg ); - - /* Save parameters */ - m_projectSettings->DeleteGroup( GroupName ); // Erase all data - m_projectSettings->Flush(); - - m_projectSettings->SetPath( GroupName ); - m_projectSettings->Write( wxT( "version" ), CONFIG_VERSION ); - m_projectSettings->SetPath( wxCONFIG_PATH_SEPARATOR ); - - for( ; List != NULL && *List != NULL; List++ ) - { - pt_cfg = *List; - - if( pt_cfg->m_Group ) - m_projectSettings->SetPath( pt_cfg->m_Group ); - else - m_projectSettings->SetPath( GroupName ); - - if( pt_cfg->m_Setup ) - continue; - - if ( pt_cfg->m_Type == PARAM_COMMAND_ERASE ) // Erase all data - { - if( pt_cfg->m_Ident ) - m_projectSettings->DeleteGroup( pt_cfg->m_Ident ); - } - else - { - pt_cfg->SaveParam( m_projectSettings ); - } - } - - m_projectSettings->SetPath( UNIX_STRING_DIR_SEP ); - delete m_projectSettings; - m_projectSettings = NULL; -} - - void EDA_APP::WriteProjectConfig( const wxString& fileName, const wxString& GroupName, const PARAM_CFG_ARRAY& params ) @@ -213,44 +157,18 @@ void EDA_APP::WriteProjectConfig( const wxString& fileName, } m_projectSettings->SetPath( UNIX_STRING_DIR_SEP ); + delete m_projectSettings; m_projectSettings = NULL; } - -void EDA_APP::SaveCurrentSetupValues( PARAM_CFG_BASE** aList ) -{ - PARAM_CFG_BASE* pt_cfg; - - if( m_settings == NULL ) - return; - - for( ; *aList != NULL; aList++ ) - { - pt_cfg = *aList; - if( pt_cfg->m_Setup == false ) - continue; - - if ( pt_cfg->m_Type == PARAM_COMMAND_ERASE ) // Erase all data - { - if( pt_cfg->m_Ident ) - m_settings->DeleteGroup( pt_cfg->m_Ident ); - } - else - { - pt_cfg->SaveParam( m_settings ); - } - } -} - - void EDA_APP::SaveCurrentSetupValues( const PARAM_CFG_ARRAY& List ) { if( m_settings == NULL ) return; unsigned count = List.size(); - for( unsigned i=0; iSetPath( wxCONFIG_PATH_SEPARATOR ); - timestamp = m_projectSettings->Read( wxT( "update" ) ); - - if( Load_Only_if_New && ( !timestamp.IsEmpty() ) - && (timestamp == m_CurrentOptionFileDateAndTime) ) - { - return false; - } - - m_CurrentOptionFileDateAndTime = timestamp; - - if( !g_Prj_Default_Config_FullFilename.IsEmpty() ) - { - m_CurrentOptionFile = g_Prj_Default_Config_FullFilename; - } - else - { - if( wxPathOnly( g_Prj_Config_LocalFilename ).IsEmpty() ) - m_CurrentOptionFile = wxGetCwd() + wxFileName::GetPathSeparator() - + g_Prj_Config_LocalFilename; - else - m_CurrentOptionFile = g_Prj_Config_LocalFilename; - } - - for( ; List != NULL && *List != NULL; List++ ) - { - pt_cfg = *List; - - if( pt_cfg->m_Group ) - m_projectSettings->SetPath( pt_cfg->m_Group ); - else - m_projectSettings->SetPath( GroupName ); - - if( pt_cfg->m_Setup ) - continue; - - pt_cfg->ReadParam( m_projectSettings ); - } - - delete m_projectSettings; - m_projectSettings = NULL; - - return true; -} - - bool EDA_APP::ReadProjectConfig( const wxString& local_config_filename, const wxString& GroupName, const PARAM_CFG_ARRAY& params, bool Load_Only_if_New ) { - wxString timestamp; - ReCreatePrjConfig( local_config_filename, GroupName, false ); m_projectSettings->SetPath( wxCONFIG_PATH_SEPARATOR ); - timestamp = m_projectSettings->Read( wxT( "update" ) ); + wxString timestamp = m_projectSettings->Read( wxT( "update" ) ); if( Load_Only_if_New && ( !timestamp.IsEmpty() ) && (timestamp == m_CurrentOptionFileDateAndTime) ) @@ -346,19 +205,6 @@ bool EDA_APP::ReadProjectConfig( const wxString& local_config_filename, m_CurrentOptionFileDateAndTime = timestamp; - if( !g_Prj_Default_Config_FullFilename.IsEmpty() ) - { - m_CurrentOptionFile = g_Prj_Default_Config_FullFilename; - } - else - { - if( wxPathOnly( g_Prj_Config_LocalFilename ).IsEmpty() ) - m_CurrentOptionFile = wxGetCwd() + wxFileName::GetPathSeparator() - + g_Prj_Config_LocalFilename; - else - m_CurrentOptionFile = g_Prj_Config_LocalFilename; - } - BOOST_FOREACH( const PARAM_CFG_BASE& param, params ) { if( param.m_Group ) @@ -379,22 +225,6 @@ bool EDA_APP::ReadProjectConfig( const wxString& local_config_filename, } -void EDA_APP::ReadCurrentSetupValues( PARAM_CFG_BASE** aList ) -{ - PARAM_CFG_BASE* pt_cfg; - - for( ; *aList != NULL; aList++ ) - { - pt_cfg = *aList; - - if( pt_cfg->m_Setup == false ) - continue; - - pt_cfg->ReadParam( m_settings ); - } -} - - void EDA_APP::ReadCurrentSetupValues( const PARAM_CFG_ARRAY& List ) { BOOST_FOREACH( const PARAM_CFG_BASE& param, List ) @@ -491,8 +321,8 @@ void PARAM_CFG_INT_WITH_SCALE::ReadParam( wxConfigBase* aConfig ) const if( m_Pt_param == NULL || aConfig == NULL ) return; - double default_value = m_Default * m_BIU_to_cfgunit; - double dtmp = aConfig->Read( m_Ident, default_value ); + double dtmp = (double) m_Default * m_BIU_to_cfgunit; + aConfig->Read( m_Ident, &dtmp ); int itmp = KiROUND( dtmp / m_BIU_to_cfgunit ); @@ -508,7 +338,11 @@ void PARAM_CFG_INT_WITH_SCALE::SaveParam( wxConfigBase* aConfig ) const if( m_Pt_param == NULL || aConfig == NULL ) return; - aConfig->Write( m_Ident, *m_Pt_param * m_BIU_to_cfgunit ); + // We cannot use aConfig->Write for a double, because + // this function uses a format with very few digits in mantissa, + // and truncature issues are frequent. + // We uses our function. + ConfigBaseWriteDouble( aConfig, m_Ident, *m_Pt_param * m_BIU_to_cfgunit ); } @@ -592,23 +426,13 @@ void PARAM_CFG_DOUBLE::ReadParam( wxConfigBase* aConfig ) const if( m_Pt_param == NULL || aConfig == NULL ) return; - double ftmp = 0; - wxString msg; - msg = aConfig->Read( m_Ident, wxT( "" ) ); + double dtmp = m_Default; + aConfig->Read( m_Ident, &dtmp ); - if( msg.IsEmpty() ) - { - ftmp = m_Default; - } - else - { - msg.ToDouble( &ftmp ); + if( (dtmp < m_Min) || (dtmp > m_Max) ) + dtmp = m_Default; - if( (ftmp < m_Min) || (ftmp > m_Max) ) - ftmp = m_Default; - } - - *m_Pt_param = ftmp; + *m_Pt_param = dtmp; } @@ -617,7 +441,11 @@ void PARAM_CFG_DOUBLE::SaveParam( wxConfigBase* aConfig ) const if( m_Pt_param == NULL || aConfig == NULL ) return; - aConfig->Write( m_Ident, *m_Pt_param ); + // We cannot use aConfig->Write for a double, because + // this function uses a format with very few digits in mantissa, + // and truncature issues are frequent. + // We uses our function. + ConfigBaseWriteDouble( aConfig, m_Ident, *m_Pt_param ); } @@ -715,8 +543,9 @@ void PARAM_CFG_FILENAME::ReadParam( wxConfigBase* aConfig ) const { if( m_Pt_param == NULL || aConfig == NULL ) return; + wxString prm = aConfig->Read( m_Ident ); - // filesnames are stored using Unix notation + // file names are stored using Unix notation // under Window we must use \ instead of / // mainly if there is a server name in path (something like \\server\kicad) #ifdef __WINDOWS__ @@ -765,13 +594,13 @@ void PARAM_CFG_LIBNAME_LIST::ReadParam( wxConfigBase* aConfig ) const libname = aConfig->Read( id_lib, wxT( "" ) ); if( libname.IsEmpty() ) break; - // filesnames are stored using Unix notation + // file names are stored using Unix notation // under Window we must use \ instead of / // mainly if there is a server name in path (something like \\server\kicad) #ifdef __WINDOWS__ libname.Replace(wxT("/"), wxT("\\")); #endif - libname_list->Add( libname ); + libname_list->Add( libname ); } } diff --git a/include/appl_wxstruct.h b/include/appl_wxstruct.h index 5838249b7e..e793795dd3 100644 --- a/include/appl_wxstruct.h +++ b/include/appl_wxstruct.h @@ -120,7 +120,7 @@ public: * @return true if the application can be started. */ bool OnInit(); // should this be virtual - + wxHtmlHelpController* GetHtmlHelpController() { return m_HtmlCtrl; } void SetHtmlHelpController( wxHtmlHelpController* aController ); @@ -248,10 +248,6 @@ public: * saved parameters are parameters that have the .m_Setup member set to false * saving file is the .pro file project */ - void WriteProjectConfig( const wxString& local_config_filename, - const wxString& GroupName, - PARAM_CFG_BASE** List ); - void WriteProjectConfig( const wxString& fileName, const wxString& GroupName, const PARAM_CFG_ARRAY& params ); @@ -263,7 +259,6 @@ public: * true. * @param aList = array of PARAM_CFG_BASE pointers */ - void SaveCurrentSetupValues( PARAM_CFG_BASE** aList ); void SaveCurrentSetupValues( const PARAM_CFG_ARRAY& List ); /** @@ -273,7 +268,6 @@ public: * true. * @param aList = array of PARAM_CFG_BASE pointers */ - void ReadCurrentSetupValues( PARAM_CFG_BASE** aList ); void ReadCurrentSetupValues( const PARAM_CFG_ARRAY& List ); /** diff --git a/include/common.h b/include/common.h index fa44caa440..1d542fa609 100644 --- a/include/common.h +++ b/include/common.h @@ -457,12 +457,6 @@ extern wxString g_UserLibDirBuffer; extern bool g_ShowPageLimits; ///< true to display the page limits -/// Name of default configuration file. (kicad.pro) -extern wxString g_Prj_Default_Config_FullFilename; - -/// Name of local configuration file. (\.pro) -extern wxString g_Prj_Config_LocalFilename; - extern EDA_UNITS_T g_UserUnit; ///< display units /// Draw color for moving objects. diff --git a/include/param_config.h b/include/param_config.h index 1868cf9afb..65f8759779 100644 --- a/include/param_config.h +++ b/include/param_config.h @@ -14,6 +14,31 @@ +/** + * inline ConfigBaseWriteDouble + * This is a helper funvtion tor write doubles in config + * We cannot use wxConfigBase->Write for a double, because + * this function uses a format with very few digits in mantissa, + * and truncation issues are frequent. + * We use here a better floatting format. + * + * Note: prior to 2.9.1, the separator was localized, and after, uses + * the "C" notation + */ + void inline ConfigBaseWriteDouble( wxConfigBase* aConfig, + const wxString& aKey, double aValue ) + { + wxString tnumber; + +#if wxCHECK_VERSION(2,9,1) + tnumber = wxString::FromCDouble( aValue, 12 ); +#else + tnumber.Printf( wxT("%12f"), aValue ); +#endif + aConfig->Write( aKey, tnumber ); +} + + /** Type of parameter in the configuration file */ enum paramcfg_id { PARAM_INT, diff --git a/kicad/files-io.cpp b/kicad/files-io.cpp index 11eb9da57f..c88c7d5078 100644 --- a/kicad/files-io.cpp +++ b/kicad/files-io.cpp @@ -40,7 +40,6 @@ #include #include -#include static const wxString ZipFileExtension( wxT( "zip" ) ); static const wxString ZipFileWildcard( wxT( "Zip file (*.zip) | *.zip" ) ); diff --git a/kicad/prjconfig.cpp b/kicad/prjconfig.cpp index f136ff159b..8737574d99 100644 --- a/kicad/prjconfig.cpp +++ b/kicad/prjconfig.cpp @@ -32,7 +32,7 @@ #include #include #include -#include +#include #include #include #include @@ -47,11 +47,12 @@ #define SEP() wxFileName::GetPathSeparator() +// Not really useful, provided to save/restore params in project config file, +// (Add them in s_KicadManagerParams if any) +// Used also to create new .pro files from the kicad.pro template file +// for new projects static const wxString GeneralGroupName( wxT( "/general" ) ); - -/* KiCad project file entry names. */ -static const wxString SchematicRootNameEntry( wxT( "RootSch" ) ); -static const wxString BoardFileNameEntry( wxT( "BoardNm" ) ); +PARAM_CFG_ARRAY s_KicadManagerParams; void KICAD_MANAGER_FRAME::CreateNewProject( const wxString aPrjFullFileName, bool aTemplateSelector = false ) @@ -75,7 +76,7 @@ void KICAD_MANAGER_FRAME::CreateNewProject( const wxString aPrjFullFileName, boo if( ::wxGetEnv( wxT( "KICAD" ), NULL ) ) { wxString kicadEnv; - wxGetEnv( wxT( "KICAD"), &kicadEnv ); + wxGetEnv( wxT( "KICAD"), &kicadEnv ); templatePath = kicadEnv + SEP() + wxT("template")+SEP(); } else @@ -152,7 +153,8 @@ void KICAD_MANAGER_FRAME::CreateNewProject( const wxString aPrjFullFileName, boo m_ProjectFileName = newProjectName; // Write settings to project file - wxGetApp().WriteProjectConfig( aPrjFullFileName, GeneralGroupName, NULL ); + wxGetApp().WriteProjectConfig( aPrjFullFileName, + GeneralGroupName, s_KicadManagerParams ); } @@ -239,7 +241,7 @@ void KICAD_MANAGER_FRAME::OnLoadProject( wxCommandEvent& event ) wxSetWorkingDirectory( m_ProjectFileName.GetPath() ); wxGetApp().ReadProjectConfig( m_ProjectFileName.GetFullPath(), - GeneralGroupName, NULL, false ); + GeneralGroupName, s_KicadManagerParams, false ); title = wxGetApp().GetTitle() + wxT( " " ) + GetBuildVersion() + wxT( " " ) + m_ProjectFileName.GetFullPath(); @@ -269,5 +271,6 @@ void KICAD_MANAGER_FRAME::OnSaveProject( wxCommandEvent& event ) if( !IsWritable( m_ProjectFileName ) ) return; - wxGetApp().WriteProjectConfig( m_ProjectFileName.GetFullPath(), GeneralGroupName, NULL ); + wxGetApp().WriteProjectConfig( m_ProjectFileName.GetFullPath(), + GeneralGroupName, s_KicadManagerParams ); } diff --git a/kicad/prjconfig.h b/kicad/prjconfig.h deleted file mode 100644 index 8f813daf3e..0000000000 --- a/kicad/prjconfig.h +++ /dev/null @@ -1,9 +0,0 @@ -/**********************************************************/ -/* prjconfig.h : configuration: definition des structures */ -/**********************************************************/ - -#include - - -extern PARAM_CFG_BASE* CfgParamList[]; - diff --git a/pcbnew/class_pad.cpp b/pcbnew/class_pad.cpp index a2762e1b5c..7d3101e523 100644 --- a/pcbnew/class_pad.cpp +++ b/pcbnew/class_pad.cpp @@ -176,12 +176,21 @@ void D_PAD::Flip( int aTranslationY ) void D_PAD::AppendConfigs( PARAM_CFG_ARRAY* aResult ) { + // Parameters stored in config are only significant parameters + // for a template. + // So not all parameters are stored, just few. aResult->push_back( new PARAM_CFG_INT_WITH_SCALE( wxT( "PadDrill" ), &m_Drill.x, Millimeter2iu( 0.6 ), Millimeter2iu( 0.1 ), Millimeter2iu( 10.0 ), NULL, MM_PER_IU ) ); + aResult->push_back( new PARAM_CFG_INT_WITH_SCALE( wxT( "PadDrillOvalY" ), + &m_Drill.y, + Millimeter2iu( 0.6 ), + Millimeter2iu( 0.1 ), Millimeter2iu( 10.0 ), + NULL, MM_PER_IU ) ); + aResult->push_back( new PARAM_CFG_INT_WITH_SCALE( wxT( "PadSizeH" ), &m_Size.x, Millimeter2iu( 1.4 ), @@ -427,7 +436,7 @@ int D_PAD::GetSolderMaskMargin() * value is * 1 - the local value * 2 - if null, the parent footprint value - * 1 - if null, the global value + * 3 - if null, the global value */ wxSize D_PAD::GetSolderPasteMargin() { diff --git a/pcbnew/dialogs/dialog_copper_zones.cpp b/pcbnew/dialogs/dialog_copper_zones.cpp index 6daacdb21b..92167854f5 100644 --- a/pcbnew/dialogs/dialog_copper_zones.cpp +++ b/pcbnew/dialogs/dialog_copper_zones.cpp @@ -415,21 +415,20 @@ bool DIALOG_COPPER_ZONE::AcceptOptions( bool aPromptForErrors, bool aUseExportab m_settings.m_Zone_45_Only = true; m_settings.m_ThermalReliefGap = ReturnValueFromTextCtrl( *m_AntipadSizeValue ); - m_settings.m_ThermalReliefCopperBridge = ReturnValueFromTextCtrl( *m_CopperWidthValue ); if( m_Config ) { - m_Config->Write( ZONE_CLEARANCE_WIDTH_STRING_KEY, - (double) m_settings.m_ZoneClearance / IU_PER_MILS ); + ConfigBaseWriteDouble( m_Config, ZONE_CLEARANCE_WIDTH_STRING_KEY, + (double) m_settings.m_ZoneClearance / IU_PER_MILS ); - m_Config->Write( ZONE_MIN_THICKNESS_WIDTH_STRING_KEY, + ConfigBaseWriteDouble( m_Config, ZONE_MIN_THICKNESS_WIDTH_STRING_KEY, (double) m_settings.m_ZoneMinThickness / IU_PER_MILS ); - m_Config->Write( ZONE_THERMAL_RELIEF_GAP_STRING_KEY, + ConfigBaseWriteDouble( m_Config, ZONE_THERMAL_RELIEF_GAP_STRING_KEY, (double) m_settings.m_ThermalReliefGap / IU_PER_MILS ); - m_Config->Write( ZONE_THERMAL_RELIEF_COPPER_WIDTH_STRING_KEY, + ConfigBaseWriteDouble( m_Config, ZONE_THERMAL_RELIEF_COPPER_WIDTH_STRING_KEY, (double) m_settings.m_ThermalReliefCopperBridge / IU_PER_MILS ); } diff --git a/pcbnew/dialogs/dialog_edit_module_for_Modedit.cpp b/pcbnew/dialogs/dialog_edit_module_for_Modedit.cpp index 811607e3ce..f750c9ddc5 100644 --- a/pcbnew/dialogs/dialog_edit_module_for_Modedit.cpp +++ b/pcbnew/dialogs/dialog_edit_module_for_Modedit.cpp @@ -7,9 +7,10 @@ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 2012 Jean-Pierre Charras, jp.charras at wanadoo.fr - * Copyright (C) 2012 Dick Hollenbeck, dick@softplc.com - * Copyright (C) 2004-2011 KiCad Developers, see change_log.txt for contributors. + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 2013 Dick Hollenbeck, dick@softplc.com + * Copyright (C) 2008-2013 Wayne Stambaugh + * Copyright (C) 2004-2013 KiCad Developers, see change_log.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/pcbnew/dialogs/dialog_edit_module_text.cpp b/pcbnew/dialogs/dialog_edit_module_text.cpp index c75de02cfe..e9c291d656 100644 --- a/pcbnew/dialogs/dialog_edit_module_text.cpp +++ b/pcbnew/dialogs/dialog_edit_module_text.cpp @@ -1,8 +1,33 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: dialog_edit_module_text.cpp -// Author: jean-pierre Charras -// Licence: GPL -///////////////////////////////////////////////////////////////////////////// +/** + * @file dialog_edit_module_text.cpp. + * @brief dialog editor for texts (fields) in footprints + */ + +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 Jean-Pierre Charras + * Copyright (C) 2013 Dick Hollenbeck, dick@softplc.com + * Copyright (C) 2008-2013 Wayne Stambaugh + * Copyright (C) 1992-2013 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 + */ #include diff --git a/pcbnew/dialogs/dialog_pad_properties.cpp b/pcbnew/dialogs/dialog_pad_properties.cpp index 1a01bfbd98..20d8390fe3 100644 --- a/pcbnew/dialogs/dialog_pad_properties.cpp +++ b/pcbnew/dialogs/dialog_pad_properties.cpp @@ -1,13 +1,15 @@ -/*******************************************************************/ -/* dialog_pad_properties.cpp: Pad editing functions and dialog box */ -/* see also dialog_pad_properties_base.xxx (built with wxFormBuilder) */ -/*******************************************************************/ +/** + * @file dialog_pad_properties.cpp. + * @brief Pad editing functions and dialog pad editor + */ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 2012 Jean-Pierre Charras - * Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors. + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 2013 Dick Hollenbeck, dick@softplc.com + * Copyright (C) 2008-2013 Wayne Stambaugh + * Copyright (C) 1992-2013 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 @@ -93,15 +95,16 @@ public: } private: - PCB_BASE_FRAME* m_Parent; - D_PAD* m_CurrentPad; // pad currently being edited + PCB_BASE_FRAME* m_parent; + D_PAD* m_currentPad; // pad currently being edited D_PAD* m_dummyPad; // a working copy used to show changes - BOARD* m_Board; - D_PAD& m_Pad_Master; + BOARD* m_board; + D_PAD& m_padMaster; bool m_isFlipped; // true if the parent footprint (therefore pads) is flipped (mirrored) // in this case, some Y coordinates values must be negated bool m_canUpdate; +private: void initValues(); bool padValuesOK(); ///< test if all values are acceptable for the pad @@ -143,18 +146,18 @@ DIALOG_PAD_PROPERTIES::DIALOG_PAD_PROPERTIES( PCB_BASE_FRAME* aParent, D_PAD* aP // use aParent's parent, which is the original BOARD, not the dummy module editor BOARD, // since FOOTPRINT_EDIT_FRAME::GetDesignSettings() is tricked out to use the PCB_EDIT_FRAME's // BOARD, not its own BOARD. - m_Pad_Master( aParent->GetDesignSettings().m_Pad_Master ) + m_padMaster( aParent->GetDesignSettings().m_Pad_Master ) { m_canUpdate = false; - m_Parent = aParent; - m_CurrentPad = aPad; - m_Board = m_Parent->GetBoard(); + m_parent = aParent; + m_currentPad = aPad; + m_board = m_parent->GetBoard(); m_dummyPad = new D_PAD( (MODULE*) NULL ); if( aPad ) m_dummyPad->Copy( aPad ); else - m_dummyPad->Copy( &m_Pad_Master ); + m_dummyPad->Copy( &m_padMaster ); initValues(); @@ -175,12 +178,12 @@ void DIALOG_PAD_PROPERTIES::OnPaintShowPanel( wxPaintEvent& event ) if( m_dummyPad->GetLayerMask() & LAYER_FRONT ) { - color = m_Board->GetVisibleElementColor( PAD_FR_VISIBLE ); + color = m_board->GetVisibleElementColor( PAD_FR_VISIBLE ); } if( m_dummyPad->GetLayerMask() & LAYER_BACK ) { - color = ColorFromInt( color | m_Board->GetVisibleElementColor( PAD_BK_VISIBLE ) ); // XXX EVIL merge + color = ColorFromInt( color | m_board->GetVisibleElementColor( PAD_BK_VISIBLE ) ); // XXX EVIL merge } if( color == 0 ) @@ -249,26 +252,26 @@ void DIALOG_PAD_PROPERTIES::initValues() // Setup layers names from board // Should be made first, before calling m_rbCopperLayersSel->SetSelection() - m_rbCopperLayersSel->SetString( 0, m_Board->GetLayerName( LAYER_N_FRONT ) ); - m_rbCopperLayersSel->SetString( 1, m_Board->GetLayerName( LAYER_N_BACK ) ); + m_rbCopperLayersSel->SetString( 0, m_board->GetLayerName( LAYER_N_FRONT ) ); + m_rbCopperLayersSel->SetString( 1, m_board->GetLayerName( LAYER_N_BACK ) ); - m_PadLayerAdhCmp->SetLabel( m_Board->GetLayerName( ADHESIVE_N_FRONT ) ); - m_PadLayerAdhCu->SetLabel( m_Board->GetLayerName( ADHESIVE_N_BACK ) ); - m_PadLayerPateCmp->SetLabel( m_Board->GetLayerName( SOLDERPASTE_N_FRONT ) ); - m_PadLayerPateCu->SetLabel( m_Board->GetLayerName( SOLDERPASTE_N_BACK ) ); - m_PadLayerSilkCmp->SetLabel( m_Board->GetLayerName( SILKSCREEN_N_FRONT ) ); - m_PadLayerSilkCu->SetLabel( m_Board->GetLayerName( SILKSCREEN_N_BACK ) ); - m_PadLayerMaskCmp->SetLabel( m_Board->GetLayerName( SOLDERMASK_N_FRONT ) ); - m_PadLayerMaskCu->SetLabel( m_Board->GetLayerName( SOLDERMASK_N_BACK ) ); - m_PadLayerECO1->SetLabel( m_Board->GetLayerName( ECO1_N ) ); - m_PadLayerECO2->SetLabel( m_Board->GetLayerName( ECO2_N ) ); - m_PadLayerDraft->SetLabel( m_Board->GetLayerName( DRAW_N ) ); + m_PadLayerAdhCmp->SetLabel( m_board->GetLayerName( ADHESIVE_N_FRONT ) ); + m_PadLayerAdhCu->SetLabel( m_board->GetLayerName( ADHESIVE_N_BACK ) ); + m_PadLayerPateCmp->SetLabel( m_board->GetLayerName( SOLDERPASTE_N_FRONT ) ); + m_PadLayerPateCu->SetLabel( m_board->GetLayerName( SOLDERPASTE_N_BACK ) ); + m_PadLayerSilkCmp->SetLabel( m_board->GetLayerName( SILKSCREEN_N_FRONT ) ); + m_PadLayerSilkCu->SetLabel( m_board->GetLayerName( SILKSCREEN_N_BACK ) ); + m_PadLayerMaskCmp->SetLabel( m_board->GetLayerName( SOLDERMASK_N_FRONT ) ); + m_PadLayerMaskCu->SetLabel( m_board->GetLayerName( SOLDERMASK_N_BACK ) ); + m_PadLayerECO1->SetLabel( m_board->GetLayerName( ECO1_N ) ); + m_PadLayerECO2->SetLabel( m_board->GetLayerName( ECO2_N ) ); + m_PadLayerDraft->SetLabel( m_board->GetLayerName( DRAW_N ) ); m_isFlipped = false; - if( m_CurrentPad ) + if( m_currentPad ) { - MODULE* module = m_CurrentPad->GetParent(); + MODULE* module = m_currentPad->GetParent(); if( module->GetLayer() == LAYER_N_BACK ) { @@ -383,11 +386,11 @@ void DIALOG_PAD_PROPERTIES::initValues() break; } - if( m_CurrentPad ) + if( m_currentPad ) { - MODULE* module = m_CurrentPad->GetParent(); + MODULE* module = m_currentPad->GetParent(); - angle = m_CurrentPad->GetOrientation() - module->GetOrientation(); + angle = m_currentPad->GetOrientation() - module->GetOrientation(); if( m_isFlipped ) NEGATE( angle ); @@ -740,109 +743,109 @@ void DIALOG_PAD_PROPERTIES::PadPropertiesAccept( wxCommandEvent& event ) bool rastnestIsChanged = false; int isign = m_isFlipped ? -1 : 1; - transferDataToPad( &m_Pad_Master ); + transferDataToPad( &m_padMaster ); - if( m_CurrentPad ) // Set current Pad parameters + if( m_currentPad ) // Set current Pad parameters { wxSize size; - MODULE* module = m_CurrentPad->GetParent(); + MODULE* module = m_currentPad->GetParent(); - m_Parent->SaveCopyInUndoList( module, UR_CHANGED ); + m_parent->SaveCopyInUndoList( module, UR_CHANGED ); module->SetLastEditTime(); // redraw the area where the pad was, without pad (delete pad on screen) - m_CurrentPad->SetFlags( DO_NOT_DRAW ); - m_Parent->GetCanvas()->RefreshDrawingRect( m_CurrentPad->GetBoundingBox() ); - m_CurrentPad->ClearFlags( DO_NOT_DRAW ); + m_currentPad->SetFlags( DO_NOT_DRAW ); + m_parent->GetCanvas()->RefreshDrawingRect( m_currentPad->GetBoundingBox() ); + m_currentPad->ClearFlags( DO_NOT_DRAW ); // Update values - m_CurrentPad->SetShape( m_Pad_Master.GetShape() ); - m_CurrentPad->SetAttribute( m_Pad_Master.GetAttribute() ); + m_currentPad->SetShape( m_padMaster.GetShape() ); + m_currentPad->SetAttribute( m_padMaster.GetAttribute() ); - if( m_CurrentPad->GetPosition() != m_Pad_Master.GetPosition() ) + if( m_currentPad->GetPosition() != m_padMaster.GetPosition() ) { - m_CurrentPad->SetPosition( m_Pad_Master.GetPosition() ); + m_currentPad->SetPosition( m_padMaster.GetPosition() ); rastnestIsChanged = true; } // compute the pos 0 value, i.e. pad position for module with orientation = 0 // i.e. relative to module origin (module position) - wxPoint pt = m_CurrentPad->GetPosition() - module->GetPosition(); + wxPoint pt = m_currentPad->GetPosition() - module->GetPosition(); RotatePoint( &pt, -module->GetOrientation() ); - m_CurrentPad->SetPos0( pt ); + m_currentPad->SetPos0( pt ); - m_CurrentPad->SetOrientation( m_Pad_Master.GetOrientation() * isign + module->GetOrientation() ); + m_currentPad->SetOrientation( m_padMaster.GetOrientation() * isign + module->GetOrientation() ); - m_CurrentPad->SetSize( m_Pad_Master.GetSize() ); + m_currentPad->SetSize( m_padMaster.GetSize() ); - size = m_Pad_Master.GetDelta(); + size = m_padMaster.GetDelta(); size.y *= isign; - m_CurrentPad->SetDelta( size ); + m_currentPad->SetDelta( size ); - m_CurrentPad->SetDrillSize( m_Pad_Master.GetDrillSize() ); - m_CurrentPad->SetDrillShape( m_Pad_Master.GetDrillShape() ); + m_currentPad->SetDrillSize( m_padMaster.GetDrillSize() ); + m_currentPad->SetDrillShape( m_padMaster.GetDrillShape() ); - wxPoint offset = m_Pad_Master.GetOffset(); + wxPoint offset = m_padMaster.GetOffset(); offset.y *= isign; - m_CurrentPad->SetOffset( offset ); + m_currentPad->SetOffset( offset ); - m_CurrentPad->SetPadToDieLength( m_Pad_Master.GetPadToDieLength() ); + m_currentPad->SetPadToDieLength( m_padMaster.GetPadToDieLength() ); - if( m_CurrentPad->GetLayerMask() != m_Pad_Master.GetLayerMask() ) + if( m_currentPad->GetLayerMask() != m_padMaster.GetLayerMask() ) { rastnestIsChanged = true; - m_CurrentPad->SetLayerMask( m_Pad_Master.GetLayerMask() ); + m_currentPad->SetLayerMask( m_padMaster.GetLayerMask() ); } if( m_isFlipped ) - m_CurrentPad->SetLayerMask( ChangeSideMaskLayer( m_CurrentPad->GetLayerMask() ) ); + m_currentPad->SetLayerMask( ChangeSideMaskLayer( m_currentPad->GetLayerMask() ) ); - m_CurrentPad->SetPadName( m_Pad_Master.GetPadName() ); + m_currentPad->SetPadName( m_padMaster.GetPadName() ); - if( m_CurrentPad->GetNetname() != m_Pad_Master.GetNetname() ) + if( m_currentPad->GetNetname() != m_padMaster.GetNetname() ) { - if( m_Pad_Master.GetNetname().IsEmpty() ) + if( m_padMaster.GetNetname().IsEmpty() ) { rastnestIsChanged = true; - m_CurrentPad->SetNet( 0 ); - m_CurrentPad->SetNetname( wxEmptyString ); + m_currentPad->SetNet( 0 ); + m_currentPad->SetNetname( wxEmptyString ); } else { - const NETINFO_ITEM* net = m_Parent->GetBoard()->FindNet( m_Pad_Master.GetNetname() ); + const NETINFO_ITEM* net = m_board->FindNet( m_padMaster.GetNetname() ); if( net ) { rastnestIsChanged = true; - m_CurrentPad->SetNetname( m_Pad_Master.GetNetname() ); - m_CurrentPad->SetNet( net->GetNet() ); + m_currentPad->SetNetname( m_padMaster.GetNetname() ); + m_currentPad->SetNet( net->GetNet() ); } else DisplayError( NULL, _( "Unknown netname, netname not changed" ) ); } } - m_CurrentPad->SetLocalClearance( m_Pad_Master.GetLocalClearance() ); - m_CurrentPad->SetLocalSolderMaskMargin( m_Pad_Master.GetLocalSolderMaskMargin() ); - m_CurrentPad->SetLocalSolderPasteMargin( m_Pad_Master.GetLocalSolderPasteMargin() ); - m_CurrentPad->SetLocalSolderPasteMarginRatio( m_Pad_Master.GetLocalSolderPasteMarginRatio() ); - m_CurrentPad->SetZoneConnection( m_Pad_Master.GetZoneConnection() ); - m_CurrentPad->SetThermalWidth( m_Pad_Master.GetThermalWidth() ); - m_CurrentPad->SetThermalGap( m_Pad_Master.GetThermalGap() ); + m_currentPad->SetLocalClearance( m_padMaster.GetLocalClearance() ); + m_currentPad->SetLocalSolderMaskMargin( m_padMaster.GetLocalSolderMaskMargin() ); + m_currentPad->SetLocalSolderPasteMargin( m_padMaster.GetLocalSolderPasteMargin() ); + m_currentPad->SetLocalSolderPasteMarginRatio( m_padMaster.GetLocalSolderPasteMarginRatio() ); + m_currentPad->SetZoneConnection( m_padMaster.GetZoneConnection() ); + m_currentPad->SetThermalWidth( m_padMaster.GetThermalWidth() ); + m_currentPad->SetThermalGap( m_padMaster.GetThermalGap() ); module->CalculateBoundingBox(); - m_Parent->SetMsgPanel( m_CurrentPad ); + m_parent->SetMsgPanel( m_currentPad ); // redraw the area where the pad was - m_Parent->GetCanvas()->RefreshDrawingRect( m_CurrentPad->GetBoundingBox() ); - m_Parent->OnModify(); + m_parent->GetCanvas()->RefreshDrawingRect( m_currentPad->GetBoundingBox() ); + m_parent->OnModify(); } EndModal( wxID_OK ); if( rastnestIsChanged ) // The net ratsnest must be recalculated - m_Parent->GetBoard()->m_Status_Pcb = 0; + m_board->m_Status_Pcb = 0; } diff --git a/pcbnew/dialogs/dialog_plot.cpp b/pcbnew/dialogs/dialog_plot.cpp index 636f7eae8a..fff9f9bbf7 100644 --- a/pcbnew/dialogs/dialog_plot.cpp +++ b/pcbnew/dialogs/dialog_plot.cpp @@ -627,7 +627,7 @@ void DIALOG_PLOT::applyPlotSettings() m_messagesBox->AppendText( msg ); } - m_config->Write( OPTKEY_PLOT_X_FINESCALE_ADJ, m_XScaleAdjust ); + ConfigBaseWriteDouble( m_config, OPTKEY_PLOT_X_FINESCALE_ADJ, m_XScaleAdjust ); // Y scale msg = m_fineAdjustYscaleOpt->GetValue(); @@ -641,7 +641,7 @@ void DIALOG_PLOT::applyPlotSettings() m_messagesBox->AppendText( msg ); } - m_config->Write( OPTKEY_PLOT_Y_FINESCALE_ADJ, m_YScaleAdjust ); + ConfigBaseWriteDouble( m_config, OPTKEY_PLOT_Y_FINESCALE_ADJ, m_YScaleAdjust ); // PS Width correction msg = m_PSFineAdjustWidthOpt->GetValue(); @@ -661,7 +661,8 @@ void DIALOG_PLOT::applyPlotSettings() } // Store m_PSWidthAdjust in mm in user config - m_config->Write( CONFIG_PS_FINEWIDTH_ADJ, (double)m_PSWidthAdjust / IU_PER_MM ); + ConfigBaseWriteDouble( m_config, CONFIG_PS_FINEWIDTH_ADJ, + (double)m_PSWidthAdjust / IU_PER_MM ); tempOptions.SetUseGerberExtensions( m_useGerberExtensions->GetValue() ); diff --git a/pcbnew/dialogs/dialog_print_using_printer.cpp b/pcbnew/dialogs/dialog_print_using_printer.cpp index 379bd073f6..111d107391 100644 --- a/pcbnew/dialogs/dialog_print_using_printer.cpp +++ b/pcbnew/dialogs/dialog_print_using_printer.cpp @@ -314,8 +314,10 @@ void DIALOG_PRINT_USING_PRINTER::OnCloseWindow( wxCloseEvent& event ) if( m_config ) { - m_config->Write( OPTKEY_PRINT_X_FINESCALE_ADJ, s_Parameters.m_XScaleAdjust ); - m_config->Write( OPTKEY_PRINT_Y_FINESCALE_ADJ, s_Parameters.m_YScaleAdjust ); + ConfigBaseWriteDouble( m_config, OPTKEY_PRINT_X_FINESCALE_ADJ, + s_Parameters.m_XScaleAdjust ); + ConfigBaseWriteDouble( m_config, OPTKEY_PRINT_Y_FINESCALE_ADJ, + s_Parameters.m_YScaleAdjust ); m_config->Write( OPTKEY_PRINT_SCALE, m_ScaleOption->GetSelection() ); m_config->Write( OPTKEY_PRINT_PAGE_FRAME, s_Parameters.m_Print_Sheet_Ref); m_config->Write( OPTKEY_PRINT_MONOCHROME_MODE, s_Parameters.m_Print_Black_and_White); diff --git a/pcbnew/pcbframe.cpp b/pcbnew/pcbframe.cpp index 3378c576e3..5ee7f1a2f1 100644 --- a/pcbnew/pcbframe.cpp +++ b/pcbnew/pcbframe.cpp @@ -61,11 +61,11 @@ // Keys used in read/write config #define OPTKEY_DEFAULT_LINEWIDTH_VALUE wxT( "PlotLineWidth_mm" ) -#define PCB_SHOW_FULL_RATSNET_OPT wxT( "PcbFulRatsnest" ) -#define PCB_MAGNETIC_PADS_OPT wxT( "PcbMagPadOpt" ) -#define PCB_MAGNETIC_TRACKS_OPT wxT( "PcbMagTrackOpt" ) -#define SHOW_MICROWAVE_TOOLS wxT( "ShowMicrowaveTools" ) -#define SHOW_LAYER_MANAGER_TOOLS wxT( "ShowLayerManagerTools" ) +#define PCB_SHOW_FULL_RATSNET_OPT wxT( "PcbFullRatsnest" ) +#define PCB_MAGNETIC_PADS_OPT wxT( "PcbMagPadOpt" ) +#define PCB_MAGNETIC_TRACKS_OPT wxT( "PcbMagTrackOpt" ) +#define SHOW_MICROWAVE_TOOLS wxT( "ShowMicrowaveTools" ) +#define SHOW_LAYER_MANAGER_TOOLS wxT( "ShowLayerManagerTools" ) BEGIN_EVENT_TABLE( PCB_EDIT_FRAME, PCB_BASE_FRAME ) @@ -313,14 +313,6 @@ PCB_EDIT_FRAME::PCB_EDIT_FRAME( wxWindow* parent, const wxString& title, m_drc = new DRC( this ); // these 2 objects point to each other - m_DisplayPcbTrackFill = DisplayOpt.DisplayPcbTrackFill; - m_DisplayPadFill = DisplayOpt.DisplayPadFill; - m_DisplayViaFill = DisplayOpt.DisplayViaFill; - m_DisplayPadNum = DisplayOpt.DisplayPadNum; - - m_DisplayModEdge = DisplayOpt.DisplayModEdge; - m_DisplayModText = DisplayOpt.DisplayModText; - wxIcon icon; icon.CopyFromBitmap( KiBitmap( icon_pcbnew_xpm ) ); SetIcon( icon ); @@ -333,6 +325,16 @@ PCB_EDIT_FRAME::PCB_EDIT_FRAME( wxWindow* parent, const wxString& title, // LoadSettings() *after* creating m_LayersManager, because LoadSettings() // initialize parameters in m_LayersManager LoadSettings(); + + // Be sure options are updated + m_DisplayPcbTrackFill = DisplayOpt.DisplayPcbTrackFill; + m_DisplayPadFill = DisplayOpt.DisplayPadFill; + m_DisplayViaFill = DisplayOpt.DisplayViaFill; + m_DisplayPadNum = DisplayOpt.DisplayPadNum; + + m_DisplayModEdge = DisplayOpt.DisplayModEdge; + m_DisplayModText = DisplayOpt.DisplayModText; + SetSize( m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y ); GetScreen()->AddGrid( m_UserGridSize, m_UserGridUnit, ID_POPUP_GRID_USER ); @@ -592,6 +594,7 @@ void PCB_EDIT_FRAME::LoadSettings() long tmp; config->Read( PCB_SHOW_FULL_RATSNET_OPT, &tmp ); GetBoard()->SetElementVisibility(RATSNEST_VISIBLE, tmp); + config->Read( PCB_MAGNETIC_PADS_OPT, &g_MagneticPadOption ); config->Read( PCB_MAGNETIC_TRACKS_OPT, &g_MagneticTrackOption ); config->Read( SHOW_MICROWAVE_TOOLS, &m_show_microwave_tools ); diff --git a/pcbnew/pcbnew_config.cpp b/pcbnew/pcbnew_config.cpp index b6d1d76224..358c0e89fa 100644 --- a/pcbnew/pcbnew_config.cpp +++ b/pcbnew/pcbnew_config.cpp @@ -51,7 +51,6 @@ #include #include #include -#include #include #include @@ -348,6 +347,8 @@ PARAM_CFG_ARRAY& PCB_EDIT_FRAME::GetConfigurationSettings() &DisplayOpt.DisplayModText, FILLED, 0, 2 ) ); m_configSettings.push_back( new PARAM_CFG_INT( true, wxT( "PcbAffT" ), &DisplayOpt.DisplayDrawItems, FILLED, 0, 2 ) ); + m_configSettings.push_back( new PARAM_CFG_INT( true, wxT( "PcbShowZonesMode" ), + &DisplayOpt.DisplayZonesMode, 0, 0, 2 ) ); // Colors: m_configSettings.push_back( new PARAM_CFG_SETCOLOR( true, wxT( "ColLay0" ), LOC_COLOR( 0 ),