1 /***************************************************************************
2 * Copyright (C) 2005, 2006 by Pino Toscano, toscano.pino@tiscali.it *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
18 ***************************************************************************/
20 #include "kalziumgradienttype.h"
24 #include "kalziumdataobject.h"
33 KalziumGradientTypeFactory::KalziumGradientTypeFactory()
35 m_gradients
<< KalziumCovalentRadiusGradientType::instance();
36 m_gradients
<< KalziumVanDerWaalsRadiusGradientType::instance();
37 m_gradients
<< KalziumMassGradientType::instance();
38 m_gradients
<< KalziumBoilingPointGradientType::instance();
39 m_gradients
<< KalziumMeltingPointGradientType::instance();
40 m_gradients
<< KalziumElectronegativityGradientType::instance();
41 m_gradients
<< KalziumElectronaffinityGradientType::instance();
42 m_gradients
<< KalziumDiscoverydateGradientType::instance();
43 m_gradients
<< KalziumIonizationGradientType::instance();
46 KalziumGradientTypeFactory
* KalziumGradientTypeFactory::instance()
48 static KalziumGradientTypeFactory kttf
;
52 KalziumGradientType
* KalziumGradientTypeFactory::build( int id
) const
54 if ( ( id
< 0 ) || ( id
>= m_gradients
.count() ) )
57 return m_gradients
.at( id
);
60 KalziumGradientType
* KalziumGradientTypeFactory::build( const QByteArray
& id
) const
62 for ( int i
= 0; i
< m_gradients
.count(); i
++ )
64 if ( m_gradients
.at( i
)->name() == id
)
65 return m_gradients
.at( i
);
72 QStringList
KalziumGradientTypeFactory::gradients() const
75 for ( int i
= 0; i
< m_gradients
.count(); i
++ )
77 l
<< m_gradients
.at( i
)->description();
83 KalziumGradientType::KalziumGradientType()
87 KalziumGradientType::~KalziumGradientType()
91 KalziumGradientType
* KalziumGradientType::instance()
96 double KalziumGradientType::elementCoeff( int el
) const
98 double val
= value( el
);
99 if( val
<= 0.0 ) return -1;
101 if(logarithmicGradient()) {
102 double result
= ( log(val
) - log(minValue()) ) / ( log(maxValue()) - log(minValue()) );
104 // now we perform a "gamma-correction" on the result. Indeed, logarithmic gradients
105 // often have the problem that all high values have roughly the same color. Note that
106 // as firstColor() is not necessarily black and secondColor() is not necessarily white,
107 // this is not exactly a "gamma-correction" in the usual sense.
108 const double gamma
= 1.4;
109 result
= exp(gamma
* log(result
));
113 return ( val
- minValue() ) / ( maxValue() - minValue() );
117 QColor
KalziumGradientType::firstColor() const
122 QColor
KalziumGradientType::secondColor() const
127 QColor
KalziumGradientType::notAvailableColor() const
129 return Qt::lightGray
;
132 QColor
KalziumGradientType::calculateColor( const double coeff
) const
134 if ( ( coeff
< 0.0 ) || ( coeff
> 1.0 ) ) return notAvailableColor();
136 QColor color2
= secondColor();
137 QColor color1
= firstColor();
139 int red
= static_cast<int>( (color2
.red() - color1
.red()) * coeff
+ color1
.red() );
140 int green
= static_cast<int>( (color2
.green() - color1
.green()) * coeff
+ color1
.green() );
141 int blue
= static_cast<int>( (color2
.blue() - color1
.blue()) * coeff
+ color1
.blue() );
143 return QColor( red
, green
, blue
);
146 KalziumCovalentRadiusGradientType
* KalziumCovalentRadiusGradientType::instance()
148 static KalziumCovalentRadiusGradientType kcrgt
;
152 KalziumCovalentRadiusGradientType::KalziumCovalentRadiusGradientType()
153 : KalziumGradientType()
157 QByteArray
KalziumCovalentRadiusGradientType::name() const
159 return "CovalentRadius";
162 QString
KalziumCovalentRadiusGradientType::description() const
164 return i18n( "Covalent Radius" );
167 double KalziumCovalentRadiusGradientType::value( int el
) const
169 QVariant v
= KalziumDataObject::instance()->element( el
)->dataAsVariant( ChemicalDataObject::radiusCovalent
);
170 if ( v
.type() != QVariant::Double
) return -1;
174 double KalziumCovalentRadiusGradientType::minValue() const
179 double KalziumCovalentRadiusGradientType::maxValue() const
184 bool KalziumCovalentRadiusGradientType::logarithmicGradient() const
186 return Prefs::logarithmicCovalentRadiusGradient();
190 KalziumVanDerWaalsRadiusGradientType
* KalziumVanDerWaalsRadiusGradientType::instance()
192 static KalziumVanDerWaalsRadiusGradientType kvdwrgt
;
196 KalziumVanDerWaalsRadiusGradientType::KalziumVanDerWaalsRadiusGradientType()
197 : KalziumGradientType()
201 QByteArray
KalziumVanDerWaalsRadiusGradientType::name() const
203 return "KalziumVanDerWaalsRadiusGradientType";
206 QString
KalziumVanDerWaalsRadiusGradientType::description() const
208 return i18n( "van Der Waals" );
211 double KalziumVanDerWaalsRadiusGradientType::value( int el
) const
213 QVariant v
= KalziumDataObject::instance()->element( el
)->dataAsVariant( ChemicalDataObject::radiusVDW
);
214 if ( v
.type() != QVariant::Double
) return -1;
218 double KalziumVanDerWaalsRadiusGradientType::minValue() const
223 double KalziumVanDerWaalsRadiusGradientType::maxValue() const
228 bool KalziumVanDerWaalsRadiusGradientType::logarithmicGradient() const
230 return Prefs::logarithmicVanDerWaalsRadiusGradient();
234 KalziumMassGradientType
* KalziumMassGradientType::instance()
236 static KalziumMassGradientType kargt
;
240 KalziumMassGradientType::KalziumMassGradientType()
241 : KalziumGradientType()
245 QByteArray
KalziumMassGradientType::name() const
250 QString
KalziumMassGradientType::description() const
252 return i18n( "Atomic Mass" );
255 double KalziumMassGradientType::value( int el
) const
257 QVariant v
= KalziumDataObject::instance()->element( el
)->dataAsVariant( ChemicalDataObject::mass
);
258 if ( v
.type() != QVariant::Double
) return -1;
262 double KalziumMassGradientType::minValue() const
267 double KalziumMassGradientType::maxValue() const
272 bool KalziumMassGradientType::logarithmicGradient() const
274 return Prefs::logarithmicMassGradient();
277 KalziumBoilingPointGradientType
* KalziumBoilingPointGradientType::instance()
279 static KalziumBoilingPointGradientType kbpgt
;
283 KalziumBoilingPointGradientType::KalziumBoilingPointGradientType()
284 : KalziumGradientType()
288 QByteArray
KalziumBoilingPointGradientType::name() const
290 return "BoilingPoint";
293 QString
KalziumBoilingPointGradientType::description() const
295 return i18n( "Boiling Point" );
298 double KalziumBoilingPointGradientType::value( int el
) const
300 QVariant v
= KalziumDataObject::instance()->element( el
)->dataAsVariant( ChemicalDataObject::boilingpoint
);
301 if ( v
.type() != QVariant::Double
) return -1;
305 double KalziumBoilingPointGradientType::minValue() const
310 double KalziumBoilingPointGradientType::maxValue() const
315 bool KalziumBoilingPointGradientType::logarithmicGradient() const
317 return Prefs::logarithmicBoilingPointGradient();
320 KalziumMeltingPointGradientType
* KalziumMeltingPointGradientType::instance()
322 static KalziumMeltingPointGradientType kmpgt
;
326 KalziumMeltingPointGradientType::KalziumMeltingPointGradientType()
327 : KalziumGradientType()
331 QByteArray
KalziumMeltingPointGradientType::name() const
333 return "MeltingPoint";
336 QString
KalziumMeltingPointGradientType::description() const
338 return i18n( "Melting Point" );
341 double KalziumMeltingPointGradientType::value( int el
) const
343 QVariant v
= KalziumDataObject::instance()->element( el
)->dataAsVariant( ChemicalDataObject::meltingpoint
);
344 if ( v
.type() != QVariant::Double
) return -1;
348 double KalziumMeltingPointGradientType::minValue() const
353 double KalziumMeltingPointGradientType::maxValue() const
358 bool KalziumMeltingPointGradientType::logarithmicGradient() const
360 return Prefs::logarithmicMeltingPointGradient();
364 KalziumElectronegativityGradientType
* KalziumElectronegativityGradientType::instance()
366 static KalziumElectronegativityGradientType kegt
;
370 KalziumElectronegativityGradientType::KalziumElectronegativityGradientType()
371 : KalziumGradientType()
375 QByteArray
KalziumElectronegativityGradientType::name() const
377 return "Electronegativity";
380 QString
KalziumElectronegativityGradientType::description() const
382 return i18n( "Electronegativity (Pauling)" );
385 double KalziumElectronegativityGradientType::value( int el
) const
387 QVariant v
= KalziumDataObject::instance()->element( el
)->dataAsVariant( ChemicalDataObject::electronegativityPauling
);
388 if ( v
.type() != QVariant::Double
) return -1;
392 double KalziumElectronegativityGradientType::minValue() const
397 double KalziumElectronegativityGradientType::maxValue() const
402 bool KalziumElectronegativityGradientType::logarithmicGradient() const
404 return Prefs::logarithmicElectronegativityGradient();
409 KalziumDiscoverydateGradientType
* KalziumDiscoverydateGradientType::instance()
411 static KalziumDiscoverydateGradientType kegt
;
415 KalziumDiscoverydateGradientType::KalziumDiscoverydateGradientType()
416 : KalziumGradientType()
420 QByteArray
KalziumDiscoverydateGradientType::name() const
422 return "Discoverydate";
425 QString
KalziumDiscoverydateGradientType::description() const
427 return i18n( "Discoverydate" );
430 double KalziumDiscoverydateGradientType::value( int el
) const
432 QVariant v
= KalziumDataObject::instance()->element( el
)->dataAsVariant( ChemicalDataObject::date
);
437 double KalziumDiscoverydateGradientType::minValue() const
442 double KalziumDiscoverydateGradientType::maxValue() const
447 bool KalziumDiscoverydateGradientType::logarithmicGradient() const
449 return Prefs::logarithmicDiscoverydateGradient();
453 ///ELECTRONAFFINITY///
455 KalziumElectronaffinityGradientType
* KalziumElectronaffinityGradientType::instance()
457 static KalziumElectronaffinityGradientType kegt
;
461 KalziumElectronaffinityGradientType::KalziumElectronaffinityGradientType()
462 : KalziumGradientType()
466 QByteArray
KalziumElectronaffinityGradientType::name() const
468 return "Electronaffinity";
471 QString
KalziumElectronaffinityGradientType::description() const
473 return i18n( "Electronaffinity" );
476 double KalziumElectronaffinityGradientType::value( int el
) const
478 QVariant v
= KalziumDataObject::instance()->element( el
)->dataAsVariant( ChemicalDataObject::electronAffinity
);
483 double KalziumElectronaffinityGradientType::minValue() const
488 double KalziumElectronaffinityGradientType::maxValue() const
493 bool KalziumElectronaffinityGradientType::logarithmicGradient() const
495 return Prefs::logarithmicElectronaffinityGradient();
498 ///FIRST IONIZATINO///
500 KalziumIonizationGradientType
* KalziumIonizationGradientType::instance()
502 static KalziumIonizationGradientType kegt
;
506 KalziumIonizationGradientType::KalziumIonizationGradientType()
507 : KalziumGradientType()
511 QByteArray
KalziumIonizationGradientType::name() const
516 QString
KalziumIonizationGradientType::description() const
518 return i18n( "First Ionization" );
521 double KalziumIonizationGradientType::value( int el
) const
523 QVariant v
= KalziumDataObject::instance()->element( el
)->dataAsVariant( ChemicalDataObject::ionization
);
528 double KalziumIonizationGradientType::minValue() const
533 double KalziumIonizationGradientType::maxValue() const
538 bool KalziumIonizationGradientType::logarithmicGradient() const
540 return Prefs::logarithmicIonizationGradient();