00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "kalziumutils.h"
00015
00016 #include <QFont>
00017 #include <QRect>
00018 #include <QPainter>
00019
00020 #include <kdebug.h>
00021 #include <klocale.h>
00022
00023 #include <tempunit.h>
00024 #include <element.h>
00025
00026 #include "prefs.h"
00027
00028 #include <math.h>
00029 #if defined(Q_OS_SOLARIS)
00030 #include <ieeefp.h>
00031 #endif
00032
00033 int KalziumUtils::maxSize( const QString& string, const QRect& rect, QFont font, QPainter* p, int minFontSize, int maxFontSize )
00034 {
00035 bool goodSizeFound = false;
00036 int size = maxFontSize;
00037 QRect r;
00038
00039 do
00040 {
00041 font.setPointSize( size );
00042 p->setFont( font );
00043 r = p->boundingRect( QRect(), Qt::AlignTop | Qt::AlignLeft, string );
00044 r.translate( rect.left(), rect.top() );
00045
00046 if ( rect.contains( r ) )
00047 goodSizeFound = true;
00048 else
00049 size--;
00050 }
00051 while ( !goodSizeFound && ( size > minFontSize ) );
00052
00053 return size;
00054 }
00055
00056 int KalziumUtils::StringHeight( const QString& string, const QFont& font, QPainter* p )
00057 {
00058 Q_UNUSED( font );
00059 return p->boundingRect( QRect(), Qt::AlignTop | Qt::AlignLeft, string ).height();
00060 }
00061
00062 int KalziumUtils::StringWidth( const QString& string, const QFont& font, QPainter* p )
00063 {
00064 Q_UNUSED( font );
00065 return p->boundingRect( QRect(), Qt::AlignTop | Qt::AlignLeft, string ).width();
00066 }
00067
00068 double KalziumUtils::strippedValue( double num )
00069 {
00070 if ( !finite( num ) )
00071 return num;
00072
00073 double power;
00074 power = 1e-6;
00075 while ( power < num )
00076 power *= 10;
00077
00078 num = num / power * 10000;
00079 num = qRound( num );
00080
00081 return num * power / 10000;
00082 }
00083
00084 QString KalziumUtils::prettyUnit( const Element* el, ChemicalDataObject::BlueObelisk kind )
00085 {
00086 if (!el) return "error";
00087
00088 QString result;
00089 double val = 0.0;
00090
00091 switch ( kind )
00092 {
00093
00094
00095 case ChemicalDataObject::meltingpoint:
00096 {
00097 val = el->dataAsVariant( kind ).toDouble();
00098 if ( val <= 0.0 )
00099 result = i18n( "Unknown Value" );
00100 else
00101 {
00102 val = TempUnit::convert( val, (int)TempUnit::Kelvin, Prefs::temperature() );
00103 result = i18nc( "%1 is the temperature, %2 is the unit, like \"300 K\"", "%1 %2", val, TempUnit::unitListSymbol( Prefs::temperature() ) );
00104 }
00105 break;
00106 }
00107 case ChemicalDataObject::boilingpoint:
00108 {
00109 val = el->dataAsVariant( kind ).toDouble();
00110 if ( val <= 0.0 )
00111 result = i18n( "Unknown Value" );
00112 else
00113 {
00114 val = TempUnit::convert( val, (int)TempUnit::Kelvin, Prefs::temperature() );
00115 result = i18nc( "%1 is the temperature, %2 is the unit, like \"300 K\"", "%1 %2", val, TempUnit::unitListSymbol( Prefs::temperature() ) );
00116 }
00117 break;
00118 }
00119 case ChemicalDataObject::electronegativityPauling:
00120 {
00121 val = el->dataAsVariant( kind ).toDouble();
00122 if ( val <= 0.0 )
00123 result = i18n( "Value not defined" );
00124 else
00125 result = i18nc("Just a number", "%1", val );
00126 break;
00127 }
00128 case ChemicalDataObject::electronAffinity:
00129 {
00130 val = el->dataAsVariant( kind ).toDouble();
00131 result = i18nc( "electron volt", "%1 eV", val );
00132 break;
00133 }
00134
00135 case ChemicalDataObject::density:
00136 {
00137 val = el->dataAsVariant( kind ).toDouble();
00138 if ( val <= 0.0 )
00139 result = i18n( "Unknown Value" );
00140 else
00141 {
00142 result = i18nc( "x gramm per cubic centimeter. This is the density.", "%1 g/cm³", val );
00143 }
00144 break;
00145 }
00146 case ChemicalDataObject::ionization:
00147 {
00148 val = el->dataAsVariant( kind ).toDouble();
00149 if ( val <= 0.0 )
00150 result = i18n( "Value not defined" );
00151 else
00152 {
00153 switch ( Prefs::energies() )
00154 {
00155 case 0:
00156 {
00157 result = i18nc( "kilo joule per mol", "%1 kJ/mol", val );
00158 break;
00159 }
00160 case 1:
00161 {
00162 val /= 96.6;
00163 result = i18nc( "electron volt", "%1 eV", val );
00164 break;
00165 }
00166 }
00167 }
00168 break;
00169 }
00170 case ChemicalDataObject::mass:
00171 {
00172 val = el->dataAsVariant( kind ).toDouble();
00173 if ( val <= 0.0 )
00174 result = i18n( "Unknown Value" );
00175 else
00176 result = i18nc( "x u (units). The atomic mass.", "%1 u", val );
00177 break;
00178 }
00179 case ChemicalDataObject::date:
00180 {
00181 val = el->dataAsVariant( kind ).toInt();
00182 if ( val > 1600 ) {
00183 result = i18n( "This element was discovered in the year <numid>%1</numid>.", val );
00184 }else if( val == 0 ){
00185 result = i18n( "Unknown." );
00186 } else {
00187 result = i18n( "This element was known to ancient cultures." );
00188 }
00189 break;
00190 }
00191 case ChemicalDataObject::radiusCovalent:
00192 {
00193 val = el->dataAsVariant( kind ).toDouble() * 100;
00194 if ( val <= 0.0 )
00195 result = i18n( "Unknown Value" );
00196 else
00197 result = i18nc( "%1 is a length, eg: 12.3 pm", "%1 pm", val );
00198 break;
00199 }
00200 case ChemicalDataObject::radiusVDW:
00201 {
00202 val = el->dataAsVariant( kind ).toDouble() * 100;
00203 if ( val <= 0.0 )
00204 result = i18n( "Unknown Value" );
00205 else
00206 result = i18nc( "%1 is a length, eg: 12.3 pm", "%1 pm", val );
00207 break;
00208 }
00209 default:
00210 {
00211 }
00212 }
00213
00214 return result;
00215 }