File indexing completed on 2024-04-14 14:11:26

0001 /*
0002     SPDX-FileCopyrightText: 2001 Jason Harris <jharris@30doradus.org>
0003     SPDX-FileCopyrightText: 2021 Valentin Boettcher <hiro at protagon.space; @hiro98:tchncs.de>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "catalogobject.h"
0009 #include "ksutils.h"
0010 #include "Options.h"
0011 #include "skymap.h"
0012 #include "texturemanager.h"
0013 #include "kstarsdata.h"
0014 #include "kspopupmenu.h"
0015 #include "catalogsdb.h"
0016 #include <QCryptographicHash>
0017 #include <typeinfo>
0018 
0019 CatalogObject *CatalogObject::clone() const
0020 {
0021     Q_ASSERT(typeid(this) == typeid(static_cast<const CatalogObject *>(
0022                                         this))); // Ensure we are not slicing a derived class
0023     return new CatalogObject(*this);      // NOLINT, (b.c. returning raw memory is bad!)
0024 }
0025 
0026 float CatalogObject::e() const
0027 {
0028     if (m_major_axis == 0.0 || m_minor_axis == 0.0)
0029         return 1.0; //assume circular
0030     return m_minor_axis / m_major_axis;
0031 }
0032 
0033 double CatalogObject::labelOffset() const
0034 {
0035     //Calculate object size in pixels
0036     double major_axis = m_major_axis;
0037     double minor_axis = m_minor_axis;
0038 
0039     if (major_axis == 0.0 && type() == 1) //catalog stars
0040     {
0041         major_axis = 1.0;
0042         minor_axis = 1.0;
0043     }
0044 
0045     double size =
0046         ((major_axis + minor_axis) / 2.0) * dms::PI * Options::zoomFactor() / 10800.0;
0047 
0048     return 0.5 * size + 4.;
0049 }
0050 
0051 QString CatalogObject::labelString() const
0052 {
0053     QString oName;
0054     if (Options::showDeepSkyNames())
0055     {
0056         if (Options::deepSkyLongLabels() && translatedLongName() != translatedName())
0057             oName = translatedLongName() + " (" + translatedName() + ')';
0058         else
0059             oName = translatedName();
0060     }
0061 
0062     if (Options::showDeepSkyMagnitudes() && !std::isnan(mag()))
0063     {
0064         if (Options::showDeepSkyNames())
0065             oName += ' ';
0066         oName += '[' + QLocale().toString(mag(), 'f', 1) + "m]";
0067     }
0068 
0069     return oName;
0070 }
0071 
0072 SkyObject::UID CatalogObject::getUID() const
0073 {
0074     return m_object_id.toLongLong(); // = qint64
0075 }
0076 
0077 void CatalogObject::JITupdate()
0078 {
0079     KStarsData *data{ KStarsData::Instance() };
0080 
0081     if (m_updateID != data->updateID())
0082     {
0083         m_updateID = data->updateID();
0084 
0085         if (m_updateNumID != data->updateNumID())
0086         {
0087             updateCoords(data->updateNum());
0088             m_updateNumID = data->updateNumID();
0089         }
0090 
0091         EquatorialToHorizontal(data->lst(), data->geo()->lat());
0092     }
0093 }
0094 
0095 void CatalogObject::initPopupMenu(KSPopupMenu *pmenu)
0096 {
0097 #ifndef KSTARS_LITE
0098     pmenu->createCatalogObjectMenu(this);
0099 #else
0100     Q_UNUSED(pmenu);
0101 #endif
0102 }
0103 
0104 const CatalogsDB::Catalog CatalogObject::getCatalog() const
0105 {
0106     if (m_database_path.get().length() == 0)
0107         return {};
0108 
0109     CatalogsDB::DBManager db{ m_database_path };
0110 
0111     const auto &success = db.get_catalog(m_catalog_id);
0112     return (success.first ? success.second : CatalogsDB::Catalog{});
0113 }
0114 
0115 const CatalogObject::oid CatalogObject::getId() const
0116 
0117 {
0118     return CatalogObject::getId(SkyObject::TYPE(type()), ra0().Degrees(),
0119                                 dec0().Degrees(), name(), catalogIdentifier());
0120 }
0121 
0122 const CatalogObject::oid CatalogObject::getId(const SkyObject::TYPE type, const double ra,
0123         const double dec, const QString &name,
0124         const QString &catalog_identifier)
0125 {
0126     QString data;
0127     data += QString::number(type);
0128     data += QString::number(static_cast<int>(std::floor(ra)));
0129     data += QString::number(static_cast<int>(std::floor(dec)));
0130     data += name;
0131     data += catalog_identifier;
0132 
0133     QCryptographicHash hash{ QCryptographicHash::Sha256 };
0134     hash.addData(data.toUtf8());
0135 
0136     return hash.result();
0137 }
0138 
0139 void CatalogObject::load_image()
0140 {
0141     if (!m_image_loaded)
0142     {
0143         QString tname  = name().toLower().remove(' ');
0144         m_image        = TextureManager::getImage(tname);
0145         m_image_loaded = true;
0146     }
0147 }