You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeedu/kalzium/src/orbitswidget.cpp

258 lines
7.5 KiB

/***************************************************************************
begin : Jun 23 2003
copyright : (C) 2003, 2004, 2005 by Carsten Niehaus
email : cniehaus@kde.org
***************************************************************************/
/***************************************************************************
* *
* 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. *
* *
***************************************************************************/
#include "orbitswidget.h"
#include <kdebug.h>
//QT-Includes
#include <tqpainter.h>
#include <tqregexp.h>
#include <tqpixmap.h>
static TQStringList hulllist;
OrbitsWidget::OrbitsWidget( TQWidget *parent, const char *name) : TQWidget( parent, name )
{
if ( hulllist.count() == 0 )
{
hulllist.append( "1" );
hulllist.append( "2" ); //Helium
hulllist.append( "2 1" );
hulllist.append( "2 2" );
hulllist.append( "2 3" );
hulllist.append( "2 4" );
hulllist.append( "2 5" );
hulllist.append( "2 6" );
hulllist.append( "2 7" );
hulllist.append( "2 8" ); //Neon
hulllist.append( "2 8 1" );
hulllist.append( "2 8 2" );
hulllist.append( "2 8 3" );
hulllist.append( "2 8 4" );
hulllist.append( "2 8 5" );
hulllist.append( "2 8 6" );
hulllist.append( "2 8 7" );
hulllist.append( "2 8 8" ); //Argon
hulllist.append( "2 8 8 1" );
hulllist.append( "2 8 8 2" );//Calcium
hulllist.append( "2 8 9 2" );
hulllist.append( "2 8 10 2" );
hulllist.append( "2 8 11 2" );
hulllist.append( "2 8 13 1" );
hulllist.append( "2 8 13 2" );//Manganese
hulllist.append( "2 8 14 2" );
hulllist.append( "2 8 15 2" );
hulllist.append( "2 8 16 2" );
hulllist.append( "2 8 18 1" );//Copper
hulllist.append( "2 8 18 2" );
hulllist.append( "2 8 18 3" );
hulllist.append( "2 8 18 4" );
hulllist.append( "2 8 18 5" );
hulllist.append( "2 8 18 6" );
hulllist.append( "2 8 18 7" );
hulllist.append( "2 8 18 8" );//Krypton
hulllist.append( "2 8 18 8 1" );
hulllist.append( "2 8 18 8 2" );//Rubidium
hulllist.append( "2 8 18 9 2" );
hulllist.append( "2 8 18 10 2" );//Zirconium
hulllist.append( "2 8 18 12 1" );
hulllist.append( "2 8 18 13 1" );
hulllist.append( "2 8 18 14 1" );//Techneticum
hulllist.append( "2 8 18 15 1" );
hulllist.append( "2 8 18 16 1" );
hulllist.append( "2 8 18 18" ); //Palladium
hulllist.append( "2 8 18 18 1" );
hulllist.append( "2 8 18 18 2" );
hulllist.append( "2 8 18 18 3" );//Indium
hulllist.append( "2 8 18 18 4" );
hulllist.append( "2 8 18 18 5" );
hulllist.append( "2 8 18 18 6" );
hulllist.append( "2 8 18 18 7" );
hulllist.append( "2 8 18 18 8" );//Xenon
hulllist.append( "2 8 18 18 8 1" );//Caesium
hulllist.append( "2 8 18 18 8 2" );//Barium
hulllist.append( "2 8 18 18 9 2" );
hulllist.append( "2 8 18 20 8 2" );//Cerium
hulllist.append( "2 8 18 21 8 2" );
hulllist.append( "2 8 18 22 8 2" );
hulllist.append( "2 8 18 23 8 2" );
hulllist.append( "2 8 18 24 8 2" );
hulllist.append( "2 8 18 25 8 2" );
hulllist.append( "2 8 18 25 9 2" );//Gadolinium
hulllist.append( "2 8 18 27 8 2" );//Terbium
hulllist.append( "2 8 18 28 8 2" );
hulllist.append( "2 8 18 29 8 2" );
hulllist.append( "2 8 18 30 8 2" );
hulllist.append( "2 8 18 31 8 2" );
hulllist.append( "2 8 18 32 8 2" );//Ytterbium
hulllist.append( "2 8 18 32 9 2" );//Lutetium
hulllist.append( "2 8 18 32 10 2" );//Hafnium
hulllist.append( "2 8 18 32 11 2" );
hulllist.append( "2 8 18 32 12 2" );
hulllist.append( "2 8 18 32 13 2" );
hulllist.append( "2 8 18 32 14 2" );
hulllist.append( "2 8 18 32 15 2" );//Irdium
hulllist.append( "2 8 18 32 17 1" );
hulllist.append( "2 8 18 32 18 1" );
hulllist.append( "2 8 18 32 18 2" );//Mercury
hulllist.append( "2 8 18 32 18 3" );
hulllist.append( "2 8 18 32 18 4" );
hulllist.append( "2 8 18 32 18 5" );
hulllist.append( "2 8 18 32 18 6" );
hulllist.append( "2 8 18 32 18 7" );
hulllist.append( "2 8 18 32 18 8" );//Radon
hulllist.append( "2 8 18 32 18 8 1" );//Francium
hulllist.append( "2 8 18 32 18 8 2" );//Radium
hulllist.append( "2 8 18 32 18 9 2" );//Actinium
hulllist.append( "2 8 18 32 20 8 2" );//Thorium
hulllist.append( "2 8 18 32 21 8 2" );
hulllist.append( "2 8 18 32 22 8 2" );//Uran
hulllist.append( "2 8 18 32 23 8 2" );
hulllist.append( "2 8 18 32 24 8 2" );//Plutonium
hulllist.append( "2 8 18 32 25 8 2" );
hulllist.append( "2 8 18 32 26 8 2" );//Cm
hulllist.append( "2 8 18 32 27 8 2" );
hulllist.append( "2 8 18 32 28 8 2" );//Cf
hulllist.append( "2 8 18 32 29 8 2" );
hulllist.append( "2 8 18 32 30 8 2" );//Fm
hulllist.append( "2 8 18 32 31 8 2" );
hulllist.append( "2 8 18 32 32 8 2" );//Nobelium
hulllist.append( "2 8 18 32 32 9 2" );//Lawrencium
hulllist.append( "2 8 18 32 32 10 2" );
hulllist.append( "2 8 18 32 32 11 2" );//Dubnium (105)
hulllist.append( "2 8 18 32 32 12 2" );
hulllist.append( "2 8 18 32 32 13 2" );//Bohrium
hulllist.append( "2 8 18 32 32 14 2" );
hulllist.append( "2 8 18 32 32 15 2" );//Mt
hulllist.append( "2 8 18 32 32 16 2" );//Darmstadtium
hulllist.append( "2 8 18 32 32 17 2" );//Roentgenium
}
}
void OrbitsWidget::setElementNumber( const int num )
{
Elemno = num;
getNumberOfOrbits();
update();
}
void OrbitsWidget::getNumberOfOrbits()
{
numOfElectrons.clear();
TQRegExp rxb( "\\s" ); //space
TQString o = getNumber();
num = 1;
int pos = 0;
int cut = 0;
bool cont = true;
if ( !o.contains( rxb ) ) //only true for H and He
numOfElectrons.append( o.toInt() );
else //every other element
{
while ( cont )
{
pos = o.find( rxb );
cut = o.length()-pos-1;
numOfElectrons.append(o.left( pos ).toInt());
o = o.right( cut );
num++;
if ( !o.contains( rxb ) )
{
numOfElectrons.append( o.toInt() );
cont = false;
}
}
}
}
const TQString& OrbitsWidget::getNumber() const
{
return *hulllist.at( Elemno-1 );
}
void OrbitsWidget::paintEvent( TQPaintEvent* )
{
TQPainter DC;
DC.begin( this );
int h=height();
int w=width();
int w_c=h/10;
int h_c=h/10;
//the radius of the current orbit
int r;
//the radius of an 'electron'
int r_electron;
//make sure the biggest orbit fits in the widget
if ( h < w )
r = ( h-2*h_c )/2;
else r = ( w-2*w_c )/2;
r_electron = r/20; //diameter of an electron-circle
TQBrush brush( yellow );
int d = 2*r; //Diameter
int ddx = d/(2*num);//difference to the previous circle
numOfElectrons.prepend( 999 );
intList::Iterator it = numOfElectrons.end();
it--;
for ( int i = 0 ; i < num ; ++i )
{
int mx = w_c+ddx*i; //the x-coordinate for the current circle
int my = h_c+ddx*i; //the y-coordinate for the current circle
DC.setBrush( NoBrush );
DC.setPen( black );
//draw the big ellipses in concentric circles
DC.drawEllipse( mx , my , d , d);
DC.setBrush( brush );
for ( int e = 0 ; e < *it ; ++e )
{
int x = (int)translateToDX( ( double )d/2 , ( double )e , *it);
int y = (int)translateToDY( ( double )d/2 , ( double )e , *it);
DC.drawEllipse( x + mx + d/2 - r_electron,
y + mx + d/2 - r_electron,
2*r_electron ,
2*r_electron );
}
--it;
d = d-2*ddx;
}
}
#include "orbitswidget.moc"