summaryrefslogtreecommitdiffstats
path: root/kalzium/src/element.h
diff options
context:
space:
mode:
Diffstat (limited to 'kalzium/src/element.h')
-rw-r--r--kalzium/src/element.h515
1 files changed, 515 insertions, 0 deletions
diff --git a/kalzium/src/element.h b/kalzium/src/element.h
new file mode 100644
index 00000000..c3d2b091
--- /dev/null
+++ b/kalzium/src/element.h
@@ -0,0 +1,515 @@
+/***************************************************************************
+ * Copyright (C) 2003, 2004, 2005 by Carsten Niehaus *
+ * *
+ * 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. *
+ ***************************************************************************/
+#ifndef ELEMENT_H
+#define ELEMENT_H
+
+#define ELEMENTSIZE 40
+
+#include <qcolor.h>
+#include <qvaluelist.h>
+
+class Element;
+class QDomDocument;
+class QPainter;
+class QPoint;
+class QFont;
+class QRect;
+class Spectrum;
+class Isotope;
+
+struct coordinate;
+
+typedef QValueList<Element*> EList;
+typedef QValueList<coordinate> CList;
+typedef QValueList<double> doubleList;
+
+struct coordinate{
+ int x;
+ int y;
+};
+
+/**
+ * In this class all information about an element are stored. This means that
+ * both the chemical date and the data about the position are stored
+ * in this class.
+ * @short This class is the represention of a chemical element
+ * @author Carsten Niehaus
+*/
+class Element{
+ public:
+ Element();
+
+ virtual ~Element();
+
+ /**
+ * @returns a pointer to the istope with @p numberOfNucleons
+ * nucleons
+ */
+ Isotope* isotopeByNucleons( int numberOfNucleons );
+
+ enum RADIUSTYPE
+ {
+ ATOMIC = 0,
+ IONIC,
+ VDW, //van der Waals radius
+ COVALENT
+ };
+
+ /**
+ * @return the number of the element
+ */
+ int number() const {
+ return m_number;
+ }
+
+ /**
+ * @return if the Element is radioactive
+ */
+ bool radioactive() const{
+ return m_radioactive;
+ }
+
+ /**
+ * @return if the Element is artificial
+ */
+ bool artificial() const{
+ return m_artificial;
+ }
+
+ /**
+ * @return the information where the name of the Element comes from
+ */
+ QString nameOrigin() const{
+ return m_origin;
+ }
+
+ QString orbits() const{
+ return m_orbits;
+ }
+
+ void setMass( double value ) { m_mass = value; }
+ void setEN( double value ) { m_EN = value; }
+ void setEA( double value ) { m_EA = value; }
+ void setMeltingpoint( double value ) { m_MP = value; }
+ void setBoilingpoint( double value ) { m_BP = value; }
+
+ /**
+ * sets the density of the Element
+ * @param value the density of the Element
+ */
+ void setDensity( double value ) { m_Density = value; }
+
+ /**
+ * set the radius of the radiustype @p type to the value @p value.
+ * The ionicradius also has a name @p name. This will store the charge of
+ * the ion (for example, +2 or -3 )
+ */
+ void setRadius( RADIUSTYPE type, double value, const QString& name = 0 );
+
+ void setDate( int date ) { m_date = date; }
+ void setPeriod( int period ){ m_period = period; }
+ void setBiologicalMeaning( int value ) { m_biological = value; }
+ void setNumber( int num ){ m_number = num; }
+
+ /**
+ * set the abundance in crustal rocks [pm]
+ * @param abundance the abundace in crustal rocks
+ */
+ void setAbundance( int abundance ){ m_abundance = abundance; }
+
+ void setScientist( const QString& value ) { m_scientist = value; }
+ void setCrysatalstructure( const QString& value ) { m_crystalstructure = value; }
+ void setName( const QString& value ) { m_name = value; }
+ void setOrigin( const QString& value ) { m_origin = value; }
+ void setBlock( const QString& value ) { m_block = value; }
+ void setGroup( const QString& value ) { m_group = value; }
+ void setFamily( const QString& value ) { m_family = value; }
+ void setOrbits( const QString& value ) { m_orbits = value; }
+ void setSymbol( const QString& value ) { m_symbol = value; }
+ void setOxydation( const QString& value ) { m_oxstage = value; }
+ void setAcidicbehaviour( const QString& value ) { m_acidbeh = value; }
+ void setIsotopes( const QString& value ) { m_isotopes = value; }
+
+ void setArtificial(){ m_artificial = true; }
+ void setRadioactive(){ m_radioactive = true; }
+
+ void setIonisationList( doubleList l ){ m_ionenergies = l; }
+
+ QValueList<Isotope*> isotopes() const{
+ return m_isotopeList;
+ }
+
+ QValueList<double> spectrumList() const{
+ return m_spectrumList;
+ }
+
+ void setIsotopeList( QValueList<Isotope*> list ){
+ m_isotopeList = list;
+ }
+
+ /**
+ * sets the Spectrum of the Element
+ * @param spec the Spectrum of the Element
+ */
+ void setSpectrum( Spectrum *spec ){
+ m_spectrum = spec;
+ }
+
+ /**
+ * @return if the element has information about spectra
+ */
+ bool hasSpectrum() const{
+ return m_hasSpectrum;
+ }
+
+ /**
+ * define if the element has a known Spectrum
+ * @param value if true, the Element has a Spectrum
+ */
+ void setHasSepctrum(bool value){
+ m_hasSpectrum = value;
+ }
+
+ /**
+ * @return the Spectrum of the element
+ */
+ Spectrum* spectrum() const{
+ return m_spectrum;
+ }
+
+ doubleList ionisationList() const{
+ return m_ionenergies;
+ }
+
+ /**
+ * @return the date of discovery of the element
+ */
+ int date() const {
+ return m_date;
+ }
+
+ /**
+ * return the correct color of the element at the
+ * temperature @p temp
+ */
+ QColor currentColor( const double temp );
+
+ /**
+ * mutator for the element's color
+ */
+ void setElementColor( const QColor &c ) { m_Color = c; }
+
+ /**
+ * @return the importance of the element for biological
+ * systems.
+ * @li 0: blah
+ * @li 1: blub
+ * @li 2: blub
+ * @li 3: blub
+ * @li 4: blub
+ * @li 5: blub
+ * @li 6: blub
+ */
+ int biological() const {
+ return m_biological;
+ }
+
+ /**
+ * @return the abundance in crustal rocks in parts per million
+ */
+ int abundance() const {
+ return m_abundance;
+ }
+
+ /**
+ * @return the symbol of the element
+ */
+ QString symbol() const {
+ return m_symbol;
+ }
+
+ /**
+ * @return the scientist who discovered the element
+ */
+ QString scientist() const{
+ return m_scientist;
+ }
+
+ /**
+ * @return the crystal structure of the element
+ */
+ QString crystalstructure() const{
+ return m_crystalstructure;
+ }
+
+ /**
+ * @return the name of the element
+ */
+ QString elname() const {
+ return m_name;
+ }
+
+ //FIXME I need to add a way to have more than one ionic radius
+ QString ioncharge() const{
+ return m_ionvalue;
+ }
+
+ /**
+ * @return the chemical block (s, p, d, f) of the element
+ */
+ QString block() const {
+ return m_block;
+ }
+
+ /**
+ * @return the group of the element
+ */
+ QString group() const {
+ return m_group;
+ }
+
+ int period() const {
+ return m_period;
+ }
+
+ QString family() const {
+ return m_family;
+ }
+
+ /**
+ * @return the acidic behavior of the element
+ */
+ QString acidicbeh() const {
+ return m_acidbeh;
+ }
+
+ /**
+ * @return the oxydationstages of the element
+ */
+ QString oxstage() const {
+ return m_oxstage;
+ }
+
+ /**
+ * @return the orbits of the element. The QString is already
+ * parsed so that the numbers are superscripts and the first
+ * block is bold.
+ * @param canBeEmpty specifies if the string returned can be
+ * empty instead of a "Unknown structure" one.
+ */
+ QString parsedOrbits( bool canBeEmpty = false );
+
+ /**
+ * @return the boiling point of the element in Kelvin
+ */
+ double boiling() const {
+ return m_BP;
+ }
+
+ /**
+ * @return the melting point of the element in Kelvin
+ */
+ double melting() const {
+ return m_MP;
+ }
+
+ /**
+ * @return the electronegativity of the element in the
+ * Pauling-scale
+ */
+ double electroneg() const {
+ return m_EN;
+ }
+
+ /**
+ * @return the electroaffinity of the element
+ */
+ double electroaf() const {
+ return m_EA;
+ }
+
+ /**
+ * @return the atomic mass of the element in units
+ */
+ double mass() const {
+ return m_mass;
+ }
+
+ /**
+ * @return the density of the element in gramms per mol
+ */
+ double density() const {
+ return m_Density;
+ }
+
+ /**
+ * @return the radius of the element in picometers
+ */
+ double radius( RADIUSTYPE type );
+
+ /**
+ * @return the mean mass of the element
+ */
+ double meanmass();
+
+ int x, y; //for the RegularPerodicTableView
+
+ /**
+ * adjusts the units for the data. The user can
+ * for example define if Fahrenheit, Kelvin or
+ * Degrees Celsius should be used for the temperature.
+ * This method takes care of that and adjust the
+ * values.
+ * @param type the TYPE of the data
+ * @return the adjusted datastring
+ */
+ const QString adjustUnits( const int type );
+
+ const QString adjustRadius( RADIUSTYPE rtype );
+
+ /**
+ * adjusts the units for the data. The user can
+ * for example define if Fahrenheit, Kelvin or
+ * Degrees Celsius should be used for the temperature.
+ * This method takes care of that and adjust the
+ * values. Depending on @p type a unit will be
+ * added to the adjusted value.
+ * @param type the TYPE of the data
+ * @param value the value of the data.
+ * @return the adjusted datastring
+ */
+ const QString adjustUnits( const int type, double value );
+
+ /**
+ * types of datas
+ */
+ enum TYPE
+ {
+ NOGRADIENT = 0,
+ ATOMICRADIUS,
+ COVALENTRADIUS,
+ VDWRADIUS,
+ MASS,
+ DENSITY,
+ BOILINGPOINT,
+ MELTINGPOINT,
+ EN,
+ EA,
+ DATE,
+ IE,
+ IONICRADIUS
+ };
+
+ QPoint pos() const;
+ QPoint coords() const;
+
+ /**
+ * accessor for the element's color
+ */
+ QColor elementColor() const {
+ return m_Color;
+ }
+
+ void setupXY();
+
+ private:
+ /**
+ * the integer num represents the number of the element
+ */
+ int m_ElementNumber;
+
+ Spectrum *m_spectrum;
+
+ bool m_hasSpectrum;
+
+ QValueList<Isotope*> m_isotopeList;
+
+ QValueList<double> m_spectrumList;
+
+ QColor m_Color;
+
+ int xPos() const;
+ int yPos() const;
+
+ double m_mass,
+ m_MP,
+ m_BP,
+ m_EN,
+ m_EA,
+ m_Density,
+ m_RadiusAR,
+ m_RadiusCR,
+ m_RadiusVDW,
+ m_RadiusIon;
+
+
+ int m_number,
+ m_date,
+ m_biological,
+ m_period,
+ m_abundance;
+
+ QString m_symbol,
+ m_name,
+ m_origin,
+ m_oxstage,
+ m_block,
+ m_group,
+ m_family,
+ m_acidbeh,
+ m_orbits,
+ m_isotopes,
+ m_scientist,
+ m_crystalstructure,
+ m_ionvalue;
+
+ bool m_artificial,
+ m_radioactive;
+
+ doubleList m_ionenergies;
+
+ public:
+ /**
+ * draw the rectangle with the information
+ * @param p painter to do the drawing on
+ * @param value the value to display as text
+ * @param c the color used to paint the element
+ */
+ virtual void drawGradient( QPainter* p, const QString& value, const QColor& c);
+
+ /**
+ * Draw the Element grayed out. Used in the timeline
+ * @param p the painter used for the painting
+ */
+ virtual void drawGrayedOut( QPainter* p );
+
+ /**
+ * draw the rectangle with the information
+ * @param p painter to do the drawing on
+ * @param simple if True more information will be shown
+ * @param isCrystal whether the elements should draw its crystal structure
+ */
+ virtual void drawSelf( QPainter* p, bool simple = false, bool isCrystal = false );
+
+ virtual void drawStateOfMatter( QPainter* p, double temperature );
+};
+
+
+#endif