/*
* 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 "pcb_calculator_frame.h"
#include "transline/transline.h"
/*
* Return the value from a string,
* Unlike standard string to double conversion,
* 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;
}
// Check for strings that cannot qualify as a number
if( brk_point == 0 )
{
return std::nan( "" );
}
/* Extract the numeric part */
if( !buf.Left( brk_point ).ToDouble( &value ) )
{
return std::nan( "" );
}
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 );
}
void SetPropertyBgColorInDialog( enum PRMS_ID aPrmId, const KIGFX::COLOR4D* aCol )
{
PCB_CALCULATOR_FRAME* frame = (PCB_CALCULATOR_FRAME*) wxTheApp->GetTopWindow();
frame->SetPrmBgColor( aPrmId, aCol );
}
/* 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 ) const
{
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;
}
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_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 SetPrmBgColor
* Set the background color for a given parameter
* @param aPrmId = @ref PRMS_ID of the parameter
* @param aCol = color ( @ref KIGFX::COLOR4D * )
*/
void PCB_CALCULATOR_FRAME::SetPrmBgColor( enum PRMS_ID aPrmId, const KIGFX::COLOR4D* aCol )
{
wxColour wxcol = wxColour( static_cast( aCol->r * 255 ),
static_cast( aCol->g * 255 ),
static_cast( aCol->b * 255 ) );
if( !wxcol.IsOk() )
{
return;
}
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 );
wxTextCtrl* ctl = static_cast( prm->m_ValueCtrl );
if( aPrmId == prm->m_Id )
{
ctl->SetBackgroundColour( wxcol );
ctl->SetStyle( 0, -1, ctl->GetDefaultStyle() );
return;
}
}
}
/**
* 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 8
wxStaticText* messages[MSG_CNT_MAX] =
{ m_Message1, m_Message2, m_Message3,
m_Message4, m_Message5, m_Message6,
m_Message7, m_Message8
};
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 ) const
{
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;
}