File indexing completed on 2024-04-21 03:41:37
0001 /* 0002 SPDX-FileCopyrightText: 2005, 2006 Pino Toscano <toscano.pino@tiscali.it> 0003 SPDX-FileCopyrightText: 2007 Carste Niehaus <cniehaus@kde.org> 0004 SPDX-FileCopyrightText: 2010 Etienne Rebetez <etienne.rebetez@oberwallis.ch> 0005 0006 SPDX-License-Identifier: GPL-2.0-or-later 0007 */ 0008 0009 #include "psetables.h" 0010 0011 #include "kalzium_libscience_debug.h" 0012 0013 #include <KLocalizedString> 0014 0015 pseTables::pseTables() 0016 { 0017 m_tables << pseRegularTable::init(); 0018 m_tables << pseShortTable::init(); 0019 m_tables << pseLongTable::init(); 0020 m_tables << pseDTable::init(); 0021 m_tables << pseDZTable::init(); 0022 } 0023 0024 pseTables::~pseTables() = default; 0025 0026 pseTables *pseTables::instance() 0027 { 0028 static pseTables tables; 0029 return &tables; 0030 } 0031 0032 QStringList pseTables::tables() const 0033 { 0034 QStringList l; 0035 const auto nbTable{m_tables.count()}; 0036 l.reserve(nbTable); 0037 for (auto i = 0; i < nbTable; ++i) { 0038 l << m_tables.at(i)->description(); 0039 } 0040 return l; 0041 } 0042 0043 pseTable *pseTables::getTabletype(const int tableType) 0044 { 0045 if ((tableType < 0) || (tableType >= m_tables.count())) { 0046 return nullptr; 0047 } 0048 0049 return m_tables.at(tableType); 0050 } 0051 0052 pseTable *pseTables::getTabletype(const QString &tableName) 0053 { 0054 for (int i = 0; m_tables.count(); ++i) { 0055 if (tableName == m_tables.at(i)->name()) { 0056 return m_tables.at(i); 0057 } 0058 } 0059 return nullptr; 0060 } 0061 0062 pseTable::pseTable() = default; 0063 0064 pseTable::~pseTable() = default; 0065 0066 pseTable *pseTable::init() 0067 { 0068 return nullptr; 0069 } 0070 0071 QString pseTable::name() const 0072 { 0073 return m_name; 0074 } 0075 0076 QString pseTable::description() const 0077 { 0078 return m_description; 0079 } 0080 0081 QList<int> pseTable::elements() const 0082 { 0083 return m_elementList; 0084 } 0085 0086 int pseTable::previousOf(int element) const 0087 { 0088 int index = m_elementList.indexOf(element); 0089 return index > 0 ? m_elementList.at(index - 1) : -1; 0090 } 0091 0092 int pseTable::nextOf(int element) const 0093 { 0094 int index = m_elementList.indexOf(element); 0095 return index != -1 && (index < m_elementList.count() - 1) ? m_elementList.at(index + 1) : -1; 0096 } 0097 0098 int pseTable::firstElement() const 0099 { 0100 return m_elementList.first(); 0101 } 0102 0103 int pseTable::lastElement() const 0104 { 0105 return m_elementList.last(); 0106 } 0107 0108 QPoint pseTable::elementCoords(const int element) const 0109 { 0110 int x = -1, y = -1; 0111 int elementIndex = m_elementList.indexOf(element); 0112 0113 if (elementIndex >= 0 && elementIndex < m_elementList.count()) { 0114 // The positions lists are defined with the base of 1. 0115 // But coordinates start mostly with 0. 0116 x = m_posX.at(elementIndex) - 1; 0117 y = m_posY.at(elementIndex) - 1; 0118 } 0119 return {x, y}; 0120 } 0121 0122 QPoint pseTable::tableSize() const 0123 { 0124 int x = 0, y = 0, i; 0125 0126 for (i = 0; i < m_posX.count(); ++i) { 0127 if (m_posX.at(i) > x) { 0128 x = m_posX.at(i); 0129 } 0130 0131 if (m_posY.at(i) > y) { 0132 y = m_posY.at(i); 0133 } 0134 } 0135 return {x, y}; 0136 } 0137 0138 int pseTable::numerationAtPos(int xPos) const 0139 { 0140 if (xPos >= 0 && xPos < m_xCoordsNumeration.count()) { 0141 return m_xCoordsNumeration.at(xPos) - 1; 0142 } 0143 return -1; 0144 } 0145 0146 /// Regular Table Data 0147 pseRegularTable::pseRegularTable() 0148 : pseTable() 0149 { 0150 m_name = QStringLiteral("Classic"); 0151 0152 m_description = i18n("Classic Periodic Table"); 0153 0154 m_xCoordsNumeration << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16 << 17 << 18; 0155 0156 m_posX << 1 << 18 << 1 << 2 << 13 << 14 << 15 << 16 << 17 << 18 << 1 << 2 << 13 << 14 << 15 << 16 << 17 << 18 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 0157 << 10 << 11 << 12 << 13 << 14 << 15 << 16 << 17 << 18 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16 << 17 0158 << 18 << // Element 54 (Xe) 0159 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16 << 17 << // Element 58 (Ce) 71 (Lu) 0160 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16 << 17 << 18 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 << 13 0161 << 14 << 15 << 16 << 17 << // Element 71 (Lr) 0162 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16 << 17 << 18; 0163 0164 m_posY << 1 << 1 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 3 << 3 << 3 << 3 << 3 << 3 << 3 << 3 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 0165 << 4 << 4 << 4 << 4 << 4 << 4 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << // Element 54 (Xe) 0166 6 << 6 << 6 << 9 << 9 << 9 << 9 << 9 << 9 << 9 << 9 << 9 << 9 << 9 << 9 << 9 << 9 << // Element 71 (Lr) 0167 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 7 << 7 << 7 << 10 << 10 << 10 << 10 << 10 << 10 << 10 << 10 << 10 << 10 << 10 0168 << 10 << 10 << 10 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7; 0169 0170 // The classic PS has all Elements 0171 if (m_posX.count() == m_posY.count()) { 0172 for (int i = 1; i <= m_posX.count(); ++i) { 0173 m_elementList.append(i); 0174 } 0175 } 0176 } 0177 0178 pseRegularTable *pseRegularTable::init() 0179 { 0180 static pseRegularTable thisTable; 0181 return &thisTable; 0182 } 0183 0184 /// Long Table Data 0185 pseLongTable::pseLongTable() 0186 : pseTable() 0187 { 0188 m_name = QStringLiteral("Long"); 0189 0190 m_description = i18n("Long Periodic Table"); 0191 0192 m_xCoordsNumeration << 1 << 2 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 0193 << 13 << 14 << 15 << 16 << 17 << 18; 0194 0195 m_posX << 1 << 32 << 1 << 2 << 27 << 28 << 29 << 30 << 31 << 32 << 1 << 2 << 27 << 28 << 29 << 30 << 31 << 32 << 1 << 2 << 17 << 18 << 19 << 20 << 21 << 22 0196 << 23 << 24 << 25 << 26 << 27 << 28 << 29 << 30 << 31 << 32 << 1 << 2 << 17 << 18 << 19 << 20 << 21 << 22 << 23 << 24 << 25 << 26 << 27 << 28 << 29 0197 << 30 << 31 << 32 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16 << 17 << 18 << 19 << 20 << 21 << 22 << 23 0198 << 24 << 25 << 26 << 27 << 28 << 29 << 30 << 31 << 32 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16 << 17 0199 << 18 << 19 << 20 << 21 << 22 << 23 << 24 << 25 << 26 << 27 << 28 << 29 << 30 << 31 << 32; 0200 0201 m_posY << 1 << 1 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 3 << 3 << 3 << 3 << 3 << 3 << 3 << 3 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 0202 << 4 << 4 << 4 << 4 << 4 << 4 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 6 << 6 << 6 << 6 << 6 << 6 0203 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 7 << 7 << 7 << 7 0204 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7; 0205 0206 // The long PS has all Elements 0207 if (m_posX.count() == m_posY.count()) { 0208 for (int i = 1; i <= m_posX.count(); ++i) { 0209 m_elementList.append(i); 0210 } 0211 } 0212 } 0213 0214 pseLongTable *pseLongTable::init() 0215 { 0216 static pseLongTable thisTable; 0217 return &thisTable; 0218 } 0219 0220 /// Short Table Data 0221 pseShortTable::pseShortTable() 0222 : pseTable() 0223 { 0224 m_name = QStringLiteral("Short"); 0225 0226 m_description = i18n("Short Periodic Table"); 0227 0228 m_xCoordsNumeration << 1 << 2 << 13 << 14 << 15 << 16 << 17 << 18; 0229 0230 m_posX << 1 << 8 << // He 0231 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << // Ne 0232 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << // Ar 0233 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << // Kr 0234 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << // Xe 0235 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << // Rn 0236 1 << 2 // Fr and Ra 0237 ; 0238 0239 m_posY << 1 << 1 << // He 0240 2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << // Ne 0241 3 << 3 << 3 << 3 << 3 << 3 << 3 << 3 << // Ar 0242 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << // Kr 0243 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << // Xe 0244 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << // Rn 0245 7 << 7 // Fr and Ra 0246 ; 0247 0248 m_elementList << 1 << 2 << // He 0249 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << // Ne 0250 11 << 12 << 13 << 14 << 15 << 16 << 17 << 18 << // Ar 0251 19 << 20 << 31 << 32 << 33 << 34 << 35 << 36 << // Kr 0252 37 << 38 << 49 << 50 << 51 << 52 << 53 << 54 << // Xe 0253 55 << 56 << 81 << 82 << 83 << 84 << 85 << 86 << // Rn 0254 87 << 88 // Fr and Ra 0255 ; 0256 } 0257 0258 pseShortTable *pseShortTable::init() 0259 { 0260 static pseShortTable thisTable; 0261 return &thisTable; 0262 } 0263 0264 /// D-Group Table Data 0265 pseDTable::pseDTable() 0266 : pseTable() 0267 { 0268 m_name = 'D'; 0269 0270 m_description = i18n("Transition Elements"); 0271 0272 m_xCoordsNumeration << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12; 0273 0274 m_posX << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 0275 << 10 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10; 0276 0277 m_posY << 1 << 1 << 1 << 1 << 1 << 1 << 1 << 1 << 1 << 1 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 3 << 3 << 3 << 3 << 3 << 3 << 3 << 3 << 3 << 3 0278 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4; 0279 0280 m_elementList << 21 << 22 << 23 << 24 << 25 << 26 << 27 << 28 << 29 << 30 << 39 << 40 << 41 << 42 << 43 << 44 << 45 << 46 << 47 << 48 << 57 << 72 << 73 0281 << 74 << 75 << 76 << 77 << 78 << 79 << 80 << 89 << 104 << 105 << 106 << 107 << 108 << 109 << 110 << 111 << 112; 0282 } 0283 0284 pseDTable *pseDTable::init() 0285 { 0286 static pseDTable thisTable; 0287 return &thisTable; 0288 } 0289 0290 /// DZ Table Data 0291 pseDZTable::pseDZTable() 0292 : pseTable() 0293 { 0294 m_name = QStringLiteral("DZ"); 0295 0296 m_description = i18n("DZ Periodic Table"); 0297 0298 m_xCoordsNumeration << 1 << 2 << 13 << 14 << 15 << 16 << 17 << 18 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12; 0299 0300 m_posX << 1 << 2 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 1 << 2 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16 0301 << 17 << 18 << 3 << 4 << 5 << 6 << 7 << 8 << 1 << 2 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16 << 17 << 18 << 3 << 4 << 5 << 6 << 7 << 8 << 1 0302 << 2 << 19 << 20 << 21 << 22 << 23 << 24 << 25 << 26 << 27 << 28 << 29 << 30 << 31 << 32 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16 << 17 << 18 0303 << 3 << 4 << 5 << 6 << 7 << 8 << 1 << 2 << 19 << 20 << 21 << 22 << 23 << 24 << 25 << 26 << 27 << 28 << 29 << 30 << 31 << 32 << 9 << 10 << 11 << 12 0304 << 13 << 14 << 15 << 16 << 17 << 18 << 3 << 4 << 5 << 6 << 7 << 8; 0305 0306 m_posY << 1 << 1 << 2 << 2 << 3 << 3 << 3 << 3 << 3 << 3 << 4 << 4 << 5 << 5 << 5 << 5 << 5 << 5 << 6 << 6 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 0307 << 8 << 8 << 8 << 8 << 8 << 8 << 9 << 9 << 10 << 10 << 10 << 10 << 10 << 10 << 10 << 10 << 10 << 10 << 11 << 11 << 11 << 11 << 11 << 11 << 12 << 12 0308 << 0309 0310 13 << 13 << 13 << 13 << 13 << 13 << 13 << 13 << 13 << 13 << 13 << 13 << 13 << 13 << 14 << 14 << 14 << 14 << 14 << 14 << 14 << 14 << 14 << 14 << 15 << 15 0311 << 15 << 15 << 15 << 15 << 16 << 16 << 17 << 17 << 17 << 17 << 17 << 17 << 17 << 17 << 17 << 17 << 17 << 17 << 17 << 17 << 18 << 18 << 18 << 18 << 18 0312 << 18 << 18 << 18 << 18 << 18 << 19 << 19 << 19 << 19 << 19 << 19; 0313 0314 // The DZ PS has all Elements 0315 if (m_posX.count() == m_posY.count()) { 0316 for (int i = 1; i <= m_posX.count(); ++i) { 0317 m_elementList.append(i); 0318 } 0319 } 0320 } 0321 0322 pseDZTable *pseDZTable::init() 0323 { 0324 static pseDZTable thisTable; 0325 return &thisTable; 0326 }