/*
* This program source code file is part of KICAD, a free EDA CAD application.
*
* Copyright (C) 2011 jean-pierre.charras
* Copyright (C) 2011 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 3
* 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, see .
*/
#include
#include
#include
#include
#include
#include
/*
* Return the value from a string,
* Unlike standard string to double convertion,
* both point and comma F.P. separator are accepted
* and values having units (like 4.7 K) are accepted
* but units are ignored.
* notation like 1e+3 is legal
*/
double DoubleFromString( const wxString& TextValue )
{
double value = 0;
/* Acquire the 'right' decimal point separator */
const struct lconv* lc = localeconv();
wxChar decimal_point = lc->decimal_point[0];
wxString buf( TextValue.Strip( wxString::both ) );
/* Convert the period in decimal point */
buf.Replace( wxT( "." ), wxString( decimal_point, 1 ) );
// An ugly fix needed by WxWidgets 2.9.1 that sometimes
// back to a point as separator, although the separator is the comma
buf.Replace( wxT( "," ), wxString( decimal_point, 1 ) );
/* Find the end of the numeric part
*(when units are append to the number, remove them)
*/
unsigned brk_point = 0;
while( brk_point < buf.Len() )
{
wxChar ch = buf[brk_point];
if( !( (ch >= '0' && ch <='9') || (ch == decimal_point)
|| (ch == '-') || (ch == '+') || (ch == 'e') || (ch == 'E') ) )
{
break;
}
++brk_point;
}
/* Extract the numeric part */
buf.Left( brk_point ).ToDouble( &value );
return value;
}
// Functions to Read/Write parameters in pcb_calculator main frame:
// They are only wrapper to actual functions, so all transline functions do not
// depend on Graphic User Interface
void SetPropertyInDialog( enum PRMS_ID aPrmId, double value )
{
PCB_CALCULATOR_FRAME * frame = (PCB_CALCULATOR_FRAME *) wxTheApp->GetTopWindow();
frame->SetPrmValue( aPrmId, value );
}
/* Puts the text into the given result line.
*/
void SetResultInDialog( int line, const char* aText )
{
PCB_CALCULATOR_FRAME * frame = (PCB_CALCULATOR_FRAME *) wxTheApp->GetTopWindow();
wxString msg = wxString::FromUTF8( aText );
frame->SetResult( line, msg );
}
/* print aValue into the given result line.
*/
void SetResultInDialog( int aLineNumber, double aValue, const char* aText )
{
PCB_CALCULATOR_FRAME * frame = (PCB_CALCULATOR_FRAME *) wxTheApp->GetTopWindow();
wxString msg = wxString::FromUTF8( aText );
wxString fullmsg;
fullmsg.Printf( wxT("%g "), aValue );
fullmsg += msg;
frame->SetResult( aLineNumber, fullmsg );
}
/* Returns a named property value. */
double GetPropertyInDialog( enum PRMS_ID aPrmId )
{
PCB_CALCULATOR_FRAME * frame = (PCB_CALCULATOR_FRAME *) wxTheApp->GetTopWindow();
return frame->GetPrmValue( aPrmId );
}
// Returns true if the param aPrmId is selected
// Has meaning only for params that have a radio button
bool IsSelectedInDialog( enum PRMS_ID aPrmId )
{
PCB_CALCULATOR_FRAME * frame = (PCB_CALCULATOR_FRAME *) wxTheApp->GetTopWindow();
return frame->IsPrmSelected( aPrmId );
}
/**
* Function GetPrmValue
* Returns a param value.
* @param aPrmId = param id to write
* @return the value always in normalized unit (meter, Hz, Ohm, radian)
*/
double PCB_CALCULATOR_FRAME::GetPrmValue( enum PRMS_ID aPrmId )
{
TRANSLINE_IDENT* tr_ident = m_transline_list[m_currTransLineType];
for( unsigned ii = 0; ii < tr_ident->GetPrmsCount(); ii++ )
{
TRANSLINE_PRM* prm = tr_ident->GetPrm( ii );
if( aPrmId == prm->m_Id )
return prm->m_NormalizedValue;
}
wxLogMessage( wxT("GetPrmValue: prm %d not found"), (int) aPrmId );
return 1.0;
}
/**
* Function SetPrmValue
* Read/write params values and results
* @param aPrmId = param id to write
* @param aValue = value to write
*/
void PCB_CALCULATOR_FRAME::SetPrmValue( enum PRMS_ID aPrmId, double aValue )
{
TRANSLINE_IDENT* tr_ident = m_transline_list[m_currTransLineType];
for( unsigned ii = 0; ii < tr_ident->GetPrmsCount(); ii++ )
{
TRANSLINE_PRM* prm = tr_ident->GetPrm( ii );
if( aPrmId == prm->m_Id )
{
prm->m_Value = prm->m_NormalizedValue = aValue;
prm->m_NormalizedValue = aValue;
prm->m_Value = prm->m_NormalizedValue * prm->ToUserUnit();
wxString msg;
msg.Printf( wxT("%g"), prm->m_Value);
((wxTextCtrl*)prm->m_ValueCtrl )->SetValue( msg );
return;
}
}
wxLogMessage( wxT("GetPrmValue: prm %d not found"), (int) aPrmId );
}
/**
* Function SetResult
* Puts the text into the given result line.
* @param aLineNumber = the line (0 to MSG_CNT_MAX-1) wher to display the text
* @param aText = the text to display
*/
void PCB_CALCULATOR_FRAME::SetResult( int aLineNumber, const wxString & aText )
{
#define MSG_CNT_MAX 7
wxStaticText * messages[MSG_CNT_MAX] =
{ m_Message1, m_Message2, m_Message3,
m_Message4, m_Message5, m_Message6,
m_Message7
};
wxASSERT( ( aLineNumber >= 0 ) && ( aLineNumber < MSG_CNT_MAX ) );
if( aLineNumber < 0 )
aLineNumber = 0;
if( aLineNumber >= MSG_CNT_MAX )
aLineNumber = MSG_CNT_MAX-1;
messages[aLineNumber]->SetLabel( aText );
}
/**
* Function IsPrmSelected
* @return true if the param aPrmId is selected
* Has meaning only for params that have a radio button
*/
bool PCB_CALCULATOR_FRAME::IsPrmSelected( enum PRMS_ID aPrmId )
{
switch( aPrmId )
{
default:
wxMessageBox( wxT("IsPrmSelected() error") );
break;
case PHYS_WIDTH_PRM:
case PHYS_DIAM_IN_PRM:
return m_radioBtnPrm1->GetValue();
break;
case PHYS_S_PRM:
case PHYS_DIAM_OUT_PRM:
return m_radioBtnPrm2->GetValue();
break;
}
return false;
}