summaryrefslogtreecommitdiffstats
path: root/kalzium/src/kalziumdataobject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kalzium/src/kalziumdataobject.cpp')
-rw-r--r--kalzium/src/kalziumdataobject.cpp264
1 files changed, 264 insertions, 0 deletions
diff --git a/kalzium/src/kalziumdataobject.cpp b/kalzium/src/kalziumdataobject.cpp
new file mode 100644
index 00000000..3d1a33bf
--- /dev/null
+++ b/kalzium/src/kalziumdataobject.cpp
@@ -0,0 +1,264 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Carsten Niehaus *
+ * 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. *
+ * *
+ * 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, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#include "kalziumdataobject.h"
+
+#include "isotope.h"
+#include "spectrum.h"
+
+#include <qdom.h>
+#include <qfile.h>
+
+#include <klocale.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kurl.h>
+#include <kstandarddirs.h>
+#include <kapplication.h>
+
+KalziumDataObject* KalziumDataObject::instance()
+{
+ static KalziumDataObject kdo;
+ return &kdo;
+}
+
+KalziumDataObject::KalziumDataObject()
+{
+ QDomDocument doc( "datadocument" );
+
+ KURL url;
+ url.setPath( locate("data", "kalzium/data/"));
+ url.setFileName( "data.xml" );
+ QFile layoutFile( url.path() );
+
+ if (!layoutFile.exists())
+ {
+ kdDebug() << "data.xml not found, exiting" << endl;
+ kapp->exit(0);
+ return;
+ }
+
+ if (!layoutFile.open(IO_ReadOnly))
+ {
+ kdDebug() << "data.xml IO-error" << endl;
+ return;
+ }
+
+ // Check if the document is well-formed
+ if (!doc.setContent(&layoutFile))
+ {
+ kdDebug() << "wrong xml" << endl;
+ layoutFile.close();
+ return;
+ }
+ layoutFile.close();
+
+ ElementList = readData( doc );
+ m_numOfElements = ElementList.count();
+}
+
+KalziumDataObject::~KalziumDataObject()
+{
+}
+
+Element* KalziumDataObject::element( int number )
+{
+ // checking that we are requesting a valid element
+ if ( ( number <= 0 ) || ( number > m_numOfElements ) )
+ return 0;
+ return *( ElementList.at( number-1 ) );
+}
+
+EList KalziumDataObject::readData( QDomDocument &dataDocument )
+{
+ EList list;
+ QDomNodeList elementNodes; //the list of all element
+ QDomElement domElement; //a single element
+
+ //read in all elements
+ elementNodes = dataDocument.elementsByTagName( "element" );
+
+ const uint count = elementNodes.count();
+
+ for ( uint i = 0; i < count; ++i )
+ {//iterate through all elements
+ domElement = ( const QDomElement& ) elementNodes.item( i ).toElement();
+
+ double mass = domElement.namedItem( "mass" ).toElement().text().toDouble();
+ double en = domElement.namedItem( "electronegativity" ).toElement().text().toDouble();
+ double ea = domElement.namedItem( "electronaffinity" ).toElement().text().toDouble();
+ double mp = domElement.namedItem( "meltingpoint" ).toElement().text().toDouble();
+ double bp = domElement.namedItem( "boilingpoint" ).toElement().text().toDouble();
+ double density = domElement.namedItem( "density" ).toElement().text().toDouble();
+ double covalent_radius = domElement.namedItem( "radius" ).namedItem( "covalent" ).toElement().text().toDouble();
+ //van der Waals-Radius
+ double vdw_radius = domElement.namedItem( "radius" ).namedItem( "vdw" ).toElement().text().toDouble();
+ double atomic_radius = domElement.namedItem( "radius" ).namedItem( "atomic" ).toElement().text().toDouble();
+ double ionic_radius = domElement.namedItem( "radius" ).namedItem( "ionic" ).toElement().text().toDouble();
+ QString ionic_charge = domElement.namedItem( "radius" ).namedItem( "ionic" ).toElement().attributeNode( "charge" ).value();
+
+ int bio = domElement.namedItem( "biologicalmeaning" ).toElement().text().toInt();
+ int radioactive = domElement.namedItem( "radioactive" ).toElement().text().toInt();
+ int period = domElement.namedItem( "period" ).toElement().text().toInt();
+ int artificial = domElement.namedItem( "artificial" ).toElement().text().toInt();
+ int date = domElement.namedItem( "date" ).toElement().text().toInt();
+ int number = domElement.namedItem( "number" ).toElement().text().toInt();
+ int abundance = domElement.namedItem( "abundance" ).toElement().text().toInt();
+
+ QString scientist = domElement.namedItem( "date" ).toElement().attributeNode( "scientist" ).value();
+ QString crystal = domElement.namedItem( "crystalstructure" ).toElement().text();
+
+ QDomElement nameE = domElement.namedItem( "name" ).toElement();
+ QString name = nameE.text();
+ QString origin = i18n( nameE.attributeNode( "origin" ).value().utf8() );
+
+ QString block = domElement.namedItem( "block" ).toElement().text();
+ QString group = domElement.namedItem( "group" ).toElement().text();
+ QString family = domElement.namedItem( "family" ).toElement().text();
+ QString orbits = domElement.namedItem( "orbits" ).toElement().text();
+ QString symbol = domElement.namedItem( "symbol" ).toElement().text();
+ QString oxydation = domElement.namedItem( "oxydation" ).toElement().text();
+ QString acidicbehaviour = domElement.namedItem( "acidicbehaviour" ).toElement().text();
+
+ QDomNodeList elist = domElement.elementsByTagName( "energy" );
+ QValueList<double> ionlist;
+ for( uint i = 0; i < elist.length(); i++ )
+ {
+ ionlist.append( elist.item( i ).toElement().text().toDouble() );
+ }
+
+ //now read in all the date for the isotopes
+ QDomNodeList isotopelist = domElement.elementsByTagName( "isotope" );
+ QValueList<Isotope*> isolist;
+ for( uint i = 0; i < isotopelist.length(); i++ )
+ {
+ QDomElement iso = isotopelist.item( i ).toElement();
+ double halflife = iso.attributeNode( "halflife" ).value().toDouble();
+ double weight = iso.attributeNode( "weight" ).value().toDouble();
+ QString format = iso.attributeNode( "halflifeformat" ).value();
+ int neutrons = iso.attributeNode( "neutron" ).value().toInt();
+ double percentage = iso.attributeNode( "percentage" ).value().toDouble();
+ double alphapercentage = iso.attributeNode( "alphapercentage" ).value().toDouble();
+ double betapluspercentage = iso.attributeNode( "betapluspercentage" ).value().toDouble();
+ double betaminuspercentage = iso.attributeNode( "betaminuspercentage" ).value().toDouble();
+ double ecpercentage = iso.attributeNode( "ecpercentage" ).value().toDouble();
+ double alphadecay = iso.attributeNode( "alphadecay" ).value().toDouble();
+ double betaplusdecay = iso.attributeNode( "betaplusdecay" ).value().toDouble();
+ double betaminusdecay = iso.attributeNode( "betaminusdecay" ).value().toDouble();
+ double ecdecay = iso.attributeNode( "ecdecay" ).value().toDouble();
+ QString spin = iso.attributeNode( "spin" ).value();
+ QString magmoment = iso.attributeNode( "magmoment" ).value();
+
+
+ Isotope *isotope = new Isotope( neutrons,
+ number,
+ percentage,
+ weight,
+ halflife,
+ format,
+ alphadecay,
+ betaplusdecay,
+ betaminusdecay,
+ ecdecay,
+ alphapercentage,
+ betapluspercentage,
+ betaminuspercentage,
+ ecpercentage,
+ spin,
+ magmoment );
+ isolist.append( isotope );
+ }
+
+ QDomNodeList spectrumList = domElement.namedItem( "spectra" ).toElement().elementsByTagName( "spectrum" );
+
+ Element *e = new Element();
+ e->setDate(date);
+ e->setBiologicalMeaning(bio);
+ e->setNumber( number );
+ e->setName(i18n(name.utf8()));
+ e->setRadius( Element::ATOMIC, atomic_radius );
+ e->setRadius( Element::IONIC, ionic_radius, ionic_charge );
+ e->setRadius( Element::COVALENT, covalent_radius );
+ e->setRadius( Element::VDW, vdw_radius );
+ e->setAbundance( abundance );
+
+ if ( artificial == 1 )
+ e->setArtificial();
+ if ( radioactive == 1 )
+ e->setRadioactive();
+
+ e->setScientist(scientist);
+ e->setPeriod( period );
+ e->setCrysatalstructure( crystal );
+ e->setOrigin(origin);
+ e->setBlock(block);
+ e->setGroup(group);
+ e->setFamily(family);
+ e->setOrbits(orbits);
+ e->setSymbol(symbol);
+ e->setOxydation(oxydation);
+ e->setAcidicbehaviour(acidicbehaviour);
+ e->setIonisationList( ionlist );
+ e->setIsotopeList( isolist );
+
+ e->setMass( mass );
+ e->setEN( en );
+ e->setEA( ea );
+ e->setMeltingpoint( mp );
+ e->setBoilingpoint( bp );
+ e->setDensity( density );
+
+ e->setupXY();
+
+ Spectrum *spectrum = new Spectrum();
+ bool spectrum_temp = false;
+ if ( spectrumList.length() > 0 )
+ spectrum_temp = true;
+ for( uint i = 0; i < spectrumList.length(); i++ )
+ {
+ Spectrum::band b;
+ QDomElement spec = spectrumList.item( i ).toElement();
+
+ b.intensity = spec.attributeNode( "intensity" ).value().toInt();
+ b.wavelength = spec.attributeNode( "wavelength" ).value().toDouble()/10.0;
+ b.aki = spec.attributeNode( "aki" ).value().toDouble();
+ b.energy1 = spec.attributeNode( "energy1" ).value().toDouble();
+ b.energy2 = spec.attributeNode( "energy2" ).value().toDouble();
+ b.electronconfig1 = spec.attributeNode( "electronconfig1" ).value();
+ b.electronconfig2 = spec.attributeNode( "electronconfig1" ).value();
+ b.term1 = spec.attributeNode( "term1" ).value();
+ b.term2 = spec.attributeNode( "term2" ).value();
+ b.J1 = spec.attributeNode( "J1" ).value();
+ b.J2 = spec.attributeNode( "J2" ).value();
+
+ spectrum->addBand( b );
+ }
+ if ( spectrum_temp ) //if no spectrumdata are found don't use this object
+ e->setSpectrum( spectrum );
+ e->setHasSepctrum( spectrum_temp );
+
+ list.append( e );
+ coordinate point; point.x = e->x; point.y = e->y;
+ CoordinateList.append( point );
+ }
+
+ return list;
+}
+