• Skip to content
  • Skip to link menu
KDE 4.0 API Reference
  • KDE API Reference
  • kdeedu
  • Sitemap
  • Contact Us
 

kalzium

kalziumutils.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002     copyright            : (C) 2005, 2006, 2007 by Carsten Niehaus
00003     email                : cniehaus@kde.org
00004  ***************************************************************************/
00005 /***************************************************************************
00006  *                                                                         *
00007  *   This program is free software; you can redistribute it and/or modify  *
00008  *   it under the terms of the GNU General Public License as published by  *
00009  *   the Free Software Foundation; either version 2 of the License, or     *
00010  *   (at your option) any later version.                                   *
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; //the value to convert
00090 
00091     switch ( kind )
00092     {
00093         //FIXME I just copied the code from "boilingpoint", no clue 
00094         //if that really works
00095         case ChemicalDataObject::meltingpoint: // a temperature
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: // electronegativity
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: // an energy
00129             {
00130             val = el->dataAsVariant( kind ).toDouble();
00131             result = i18nc( "electron volt", "%1 eV", val );
00132             break;
00133             }
00134         //FIXME I don't check for the real unit here, that needs to be fixed
00135         case ChemicalDataObject::density: // g per cm3 
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: // use electronvolt
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: // a 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: // a 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: // a length
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 }

kalzium

Skip menu "kalzium"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

kdeedu

Skip menu "kdeedu"
  • kalzium
  • kanagram
  • kig
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  •   docs
  •   src
  • parley
Generated for kdeedu by doxygen 1.5.4
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal