Compare commits

..

10 Commits

Author SHA1 Message Date
nou f9f005e7ea Another test 2025-07-16 23:17:22 +02:00
nou 5ba6b4863c Fix metainfo linter 2025-07-16 09:07:08 +02:00
nou 6c7e078340 Testing filetree crash on ARM 2025-07-16 07:44:19 +02:00
nou b58559a18a Update modify FITS header script 2025-07-13 10:43:15 +02:00
nou 2ac14a6c04 Fix thumbnailer compilation 2025-07-13 10:42:59 +02:00
nou b84256625c Add stellarsolver6 as name 2025-06-12 16:48:09 +02:00
nou 202a2b11b7 Add marked files in batch processing 2025-06-09 19:09:50 +02:00
nou 32f192ed7e Add draw grid button 2025-05-31 00:19:15 +02:00
nou a0422683bd Move source files to src directory 2025-05-30 16:49:33 +02:00
nou ce67b35bfa Mention OpenNGC 2025-05-29 23:44:55 +02:00
71 changed files with 340 additions and 64 deletions
+32 -32
View File
@@ -23,39 +23,39 @@ find_library(FITS_LIB cfitsio REQUIRED)
find_library(RAW_LIB NAMES raw_r REQUIRED) find_library(RAW_LIB NAMES raw_r REQUIRED)
find_library(WCS_LIB wcs wcslib REQUIRED) find_library(WCS_LIB wcs wcslib REQUIRED)
find_library(LCMS2_LIB lcms2 REQUIRED) find_library(LCMS2_LIB lcms2 REQUIRED)
find_library(STELLARSOLVER_LIB stellarsolver) find_library(STELLARSOLVER_LIB NAMES stellarsolver stellarsolver6)
add_subdirectory(libXISF) add_subdirectory(libXISF)
set(TENMON_SRC set(TENMON_SRC
about.cpp about.h src/about.cpp src/about.h
batchprocessing.cpp batchprocessing.h batchprocessing.ui src/batchprocessing.cpp src/batchprocessing.h src/batchprocessing.ui
chartgraph.h chartgraph.cpp src/chartgraph.h src/chartgraph.cpp
database.cpp database.h src/database.cpp src/database.h
databaseview.cpp databaseview.h src/databaseview.cpp src/databaseview.h
delete.cpp src/delete.cpp
filesystemwidget.cpp filesystemwidget.h src/filesystemwidget.cpp src/filesystemwidget.h
histogram.cpp histogram.h src/histogram.cpp src/histogram.h
httpdownloader.h httpdownloader.cpp src/httpdownloader.h src/httpdownloader.cpp
imageinfo.cpp imageinfo.h src/imageinfo.cpp src/imageinfo.h
imageinfodata.cpp imageinfodata.h src/imageinfodata.cpp src/imageinfodata.h
imageringlist.cpp imageringlist.h src/imageringlist.cpp src/imageringlist.h
imagescrollarea.cpp imagescrollarea.h src/imagescrollarea.cpp src/imagescrollarea.h
imagewidget.h imagewidget.cpp src/imagewidget.h src/imagewidget.cpp
loadimage.h loadimage.cpp src/loadimage.h src/loadimage.cpp
loadrunable.cpp loadrunable.h src/loadrunable.cpp src/loadrunable.h
main.cpp src/main.cpp
mainwindow.cpp mainwindow.h src/mainwindow.cpp src/mainwindow.h
markedfiles.cpp markedfiles.h src/markedfiles.cpp src/markedfiles.h
mtfparam.h src/mtfparam.h
rawimage.cpp rawimage.h src/rawimage.cpp src/rawimage.h
rawimage_sse.cpp src/rawimage_sse.cpp
scriptengine.cpp scriptengine.h src/scriptengine.cpp src/scriptengine.h
settingsdialog.cpp settingsdialog.h src/settingsdialog.cpp src/settingsdialog.h
statusbar.cpp statusbar.h src/statusbar.cpp src/statusbar.h
stfslider.cpp stfslider.h src/stfslider.cpp src/stfslider.h
stretchtoolbar.cpp stretchtoolbar.h src/stretchtoolbar.cpp src/stretchtoolbar.h
tfloat16.h src/tfloat16.h
thumbnailer/genthumbnail.cpp thumbnailer/genthumbnail.h thumbnailer/genthumbnail.cpp thumbnailer/genthumbnail.h
) )
@@ -96,9 +96,9 @@ if(STELLARSOLVER_INCLUDE AND STELLARSOLVER_LIB)
endif(MXE) endif(MXE)
target_compile_definitions(tenmon PRIVATE "PLATESOLVER") target_compile_definitions(tenmon PRIVATE "PLATESOLVER")
target_sources(tenmon PRIVATE target_sources(tenmon PRIVATE
solver.cpp solver.h src/solver.cpp src/solver.h
platesolving.cpp platesolving.h platesolving.ui src/platesolving.cpp src/platesolving.h src/platesolving.ui
platesolvingsettings.cpp platesolvingsettings.h platesolvingsettings.ui src/platesolvingsettings.cpp src/platesolvingsettings.h src/platesolvingsettings.ui
) )
message(STATUS "Found stellarsolver ${STELLARSOLVER_INCLUDE} ${STELLARSOLVER_LIB}") message(STATUS "Found stellarsolver ${STELLARSOLVER_INCLUDE} ${STELLARSOLVER_LIB}")
endif(STELLARSOLVER_INCLUDE AND STELLARSOLVER_LIB) endif(STELLARSOLVER_INCLUDE AND STELLARSOLVER_LIB)
+2
View File
@@ -29,3 +29,5 @@ Then to build run standard cmake sequence
For working plate solving you must have compiled and installed StellarSolver https://github.com/rlancaste/stellarsolver For working plate solving you must have compiled and installed StellarSolver https://github.com/rlancaste/stellarsolver
It is important that you compile StellarSolver with Qt6. By default it use Qt5 but when linked with Qt6 program it will It is important that you compile StellarSolver with Qt6. By default it use Qt5 but when linked with Qt6 program it will
crash. crash.
Using OpenNGC database https://github.com/mattiaverga/OpenNGC under CC-BY-SA-4.0 https://creativecommons.org/licenses/by-sa/4.0/
+141
View File
@@ -0,0 +1,141 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="48"
height="48"
viewBox="0 0 12.699999 12.699999"
version="1.1"
id="svg5"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="grid.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="9.5144352"
inkscape:cx="39.361243"
inkscape:cy="25.067174"
inkscape:window-width="2510"
inkscape:window-height="1371"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs2">
<inkscape:path-effect
effect="skeletal"
id="path-effect636"
is_visible="true"
lpeversion="1"
pattern="M 0,4.992138 C 0,2.2364778 2.2364778,0 4.992138,0 c 2.7556601,0 4.9921379,2.2364778 4.9921379,4.992138 0,2.7556601 -2.2364778,4.9921379 -4.9921379,4.9921379 C 2.2364778,9.9842759 0,7.7477981 0,4.992138 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
hide_knot="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect632"
is_visible="true"
lpeversion="1"
pattern="M 0,4.992138 C 0,2.2364778 2.2364778,0 4.992138,0 c 2.7556601,0 4.9921379,2.2364778 4.9921379,4.992138 0,2.7556601 -2.2364778,4.9921379 -4.9921379,4.9921379 C 2.2364778,9.9842759 0,7.7477981 0,4.992138 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
hide_knot="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect628"
is_visible="true"
lpeversion="1"
pattern="M 0,4.992138 C 0,2.2364778 2.2364778,0 4.992138,0 c 2.7556601,0 4.9921379,2.2364778 4.9921379,4.992138 0,2.7556601 -2.2364778,4.9921379 -4.9921379,4.9921379 C 2.2364778,9.9842759 0,7.7477981 0,4.992138 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
hide_knot="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="bspline"
id="path-effect624"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="spiro"
id="path-effect620"
is_visible="true"
lpeversion="1" />
</defs>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1">
<path
style="fill:none;stroke:#000000;stroke-width:0.503;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-dasharray:none"
d="M -5,-5 13,13"
id="path616"
sodipodi:nodetypes="cc" />
<circle
style="fill:none;stroke:#000000;stroke-width:0.503;stroke-linejoin:round;stroke-opacity:1;stroke-dasharray:none"
id="path643"
cx="-4.9824347"
cy="-4.9865055"
r="12.973718" />
<circle
style="fill:none;stroke:#000000;stroke-width:0.503;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
id="path1665"
cx="-4.9600825"
cy="-4.9741392"
r="17.086035" />
<circle
style="fill:none;stroke:#000000;stroke-width:0.503;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
id="path1667"
cx="-5.0079365"
cy="-5.0034046"
r="21.147657" />
<path
style="fill:none;stroke:#000000;stroke-width:0.467;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-dasharray:none"
d="M 14.371451,3.5622727 -4.9904999,-5.0054782 4.2432806,13.903978"
id="path1734" />
<circle
style="fill:none;stroke:#000000;stroke-width:0.503;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
id="path1736"
cx="-5.155458"
cy="-5.1256938"
r="9.6808758" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.7 KiB

+4 -3
View File
@@ -20,14 +20,15 @@
<file alias="help">../about/help_en</file> <file alias="help">../about/help_en</file>
<file>colormap.png</file> <file>colormap.png</file>
<file>ngc.db</file> <file>ngc.db</file>
<file>grid.svg</file>
</qresource> </qresource>
<qresource prefix="/" lang="en"> <qresource lang="en" prefix="/">
<file alias="help">../about/help_en</file> <file alias="help">../about/help_en</file>
</qresource> </qresource>
<qresource prefix="/" lang="sk"> <qresource lang="sk" prefix="/">
<file alias="help">../about/help_sk</file> <file alias="help">../about/help_sk</file>
</qresource> </qresource>
<qresource prefix="/" lang="fr"> <qresource lang="fr" prefix="/">
<file alias="help">../about/help_fr</file> <file alias="help">../about/help_fr</file>
</qresource> </qresource>
</RCC> </RCC>
+35 -2
View File
@@ -12,10 +12,12 @@ if(files.length == 0)
throw ""; throw "";
} }
let action = core.getItem(["UPDATE", "ADD", "REMOVE"], "Do you want update, add or remove record?"); let action = core.getItem(["UPDATE", "UPDATE_ADD", "ADD", "REMOVE"], "Do you want update, add or remove record?");
let modify = new FITSRecordModify(); let modify = new FITSRecordModify();
let proceed = false;
if(action == "UPDATE") if(action == "UPDATE")
{ {
let keywords = files[0].fitsKeywords().filter(checkFITS); let keywords = files[0].fitsKeywords().filter(checkFITS);
@@ -25,28 +27,59 @@ if(action == "UPDATE")
value = core.getString("Enter new value", value); value = core.getString("Enter new value", value);
else else
value = core.getFloat("Enter new value", value); value = core.getFloat("Enter new value", value);
if(keyword && value)
{
proceed = true;
modify.updateKeyword(keyword, value); modify.updateKeyword(keyword, value);
}
}
else if(action == "UPDATE_ADD")
{
let keyword = core.getString("Enter keyword to update");
let value = core.getString("Enter new value");
if(keyword && value)
{
proceed = true;
keyword = keyword.toUpperCase();
modify.updateKeyword(keyword, value);
}
} }
else if(action == "ADD") else if(action == "ADD")
{ {
let keyword = core.getString("Enter keyword to add"); let keyword = core.getString("Enter keyword to add");
let value = core.getString("Enter new value"); let value = core.getString("Enter new value");
if(keyword && value)
{
proceed = true;
keyword = keyword.toUpperCase(); keyword = keyword.toUpperCase();
modify.addKeyword(keyword, value); modify.addKeyword(keyword, value);
}
} }
else if(action == "REMOVE") else if(action == "REMOVE")
{ {
let keywords = files[0].fitsKeywords().filter(checkFITS); let keywords = files[0].fitsKeywords().filter(checkFITS);
let keyword = core.getItem(keywords, "Select keyword to remove"); let keyword = core.getItem(keywords, "Select keyword to remove");
if(keyword)
{
proceed = true;
modify.removeKeyword(keyword); modify.removeKeyword(keyword);
}
} }
for(file of files) if(proceed)
{ {
for(file of files)
{
if(file.suffix() == "fits" || file.suffix() == "fit" || file.suffix() == "xisf") if(file.suffix() == "fits" || file.suffix() == "fit" || file.suffix() == "xisf")
{ {
core.log("Modifing " + file.fileName()); core.log("Modifing " + file.fileName());
file.modifyFITSRecords(modify); file.modifyFITSRecords(modify);
} }
}
}
else
{
core.log("Canceled");
} }
+1 -1
View File
@@ -118,7 +118,7 @@
</release> </release>
<release version="20240816" date="2024-08-16"> <release version="20240816" date="2024-08-16">
<description> <description>
Fix saving image <p>Fix saving image</p>
</description> </description>
</release> </release>
<release version="20240616" date="2024-06-16"> <release version="20240616" date="2024-06-16">
View File
View File
@@ -100,6 +100,7 @@ BatchProcessing::BatchProcessing(Database *database, QWidget *parent) : QDialog(
connect(_ui->addFilesButton, &QPushButton::released, this, &BatchProcessing::addFiles); connect(_ui->addFilesButton, &QPushButton::released, this, &BatchProcessing::addFiles);
connect(_ui->addDirButton, &QPushButton::released, this, &BatchProcessing::addDir); connect(_ui->addDirButton, &QPushButton::released, this, &BatchProcessing::addDir);
connect(_ui->addMarkedButton, &QPushButton::released, this, &BatchProcessing::addMarked);
connect(_ui->removeButton, &QPushButton::released, this, &BatchProcessing::removePath); connect(_ui->removeButton, &QPushButton::released, this, &BatchProcessing::removePath);
connect(_ui->removeAllButton, &QPushButton::released, this, &BatchProcessing::removeAllPaths); connect(_ui->removeAllButton, &QPushButton::released, this, &BatchProcessing::removeAllPaths);
connect(_ui->startButton, &QPushButton::released, this, &BatchProcessing::runScript); connect(_ui->startButton, &QPushButton::released, this, &BatchProcessing::runScript);
@@ -164,6 +165,17 @@ void BatchProcessing::addDir()
} }
} }
void BatchProcessing::addMarked()
{
QStringList files = _database->getMarkedFiles();
for(const QString &file : files)
{
QFileInfo info(file);
if(info.exists() && info.isReadable())
_ui->pathsList->addItem(file);
};
}
void BatchProcessing::removePath() void BatchProcessing::removePath()
{ {
for(auto &item : _ui->pathsList->selectedItems()) for(auto &item : _ui->pathsList->selectedItems())
@@ -28,6 +28,7 @@ protected:
public slots: public slots:
void addFiles(); void addFiles();
void addDir(); void addDir();
void addMarked();
void removePath(); void removePath();
void removeAllPaths(); void removeAllPaths();
void browse(); void browse();
@@ -52,6 +52,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QPushButton" name="addMarkedButton">
<property name="text">
<string>Add marked</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QPushButton" name="removeButton"> <widget class="QPushButton" name="removeButton">
<property name="text"> <property name="text">
View File
+1 -1
View File
@@ -284,7 +284,7 @@ QVector<SkyObject> Database::getObjects(double minRa, double maxRa, double minDe
m_getNgc.value("MajAx").toDouble(), m_getNgc.value("MajAx").toDouble(),
m_getNgc.value("MinAx").toDouble(), m_getNgc.value("MinAx").toDouble(),
m_getNgc.value("PosAng").toDouble(), m_getNgc.value("PosAng").toDouble(),
m_getNgc.value("mag").toDouble(), m_getNgc.value("mag").isNull() ? NAN : m_getNgc.value("mag").toDouble(),
{0, 0}, {0, 0},
}); });
} }
View File
View File
View File
View File
View File
View File
+1 -1
View File
@@ -65,7 +65,7 @@ struct SkyObject
double maj_ax; double maj_ax;
double min_ax; double min_ax;
double pos_ang; double pos_ang;
double vmag; double mag;
QPointF pixel; QPointF pixel;
}; };
@@ -142,6 +142,11 @@ void ImageScrollArea::falseColor(bool enable)
m_imageWidget->falseColor(enable); m_imageWidget->falseColor(enable);
} }
void ImageScrollArea::drawGrid(bool enable)
{
m_imageWidget->drawGrid(enable);
}
QImage ImageScrollArea::renderToImage() QImage ImageScrollArea::renderToImage()
{ {
return m_imageWidget->renderToImage(); return m_imageWidget->renderToImage();
@@ -31,6 +31,7 @@ public slots:
void invert(bool enable); void invert(bool enable);
void superPixel(bool enable); void superPixel(bool enable);
void falseColor(bool enable); void falseColor(bool enable);
void drawGrid(bool enable);
QImage renderToImage(); QImage renderToImage();
protected slots: protected slots:
void scrollEvent(); void scrollEvent();
View File
View File
View File
View File
+18 -1
View File
@@ -4,10 +4,27 @@
#include <QTranslator> #include <QTranslator>
#include <QCommandLineParser> #include <QCommandLineParser>
#include <stdlib.h> #include <stdlib.h>
#include "thumbnailer/genthumbnail.h" #include "../thumbnailer/genthumbnail.h"
#include <QTreeView>
#include <QFileSystemModel>
#include <QTimer>
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
QApplication app(argc, argv);
QFileSystemModel model;
QTreeView treeView;
QTimer::singleShot(5000, [&model,&treeView](){
treeView.setModel(&model);
model.setRootPath("/home");
});
treeView.resize(800, 600);
treeView.show();
return app.exec();
#ifdef __linux__ #ifdef __linux__
setenv("LC_NUMERIC", "C", 1); setenv("LC_NUMERIC", "C", 1);
#endif #endif
+1
View File
@@ -92,6 +92,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
connect(m_stretchPanel, &StretchToolbar::invert, m_image, &ImageScrollArea::invert); connect(m_stretchPanel, &StretchToolbar::invert, m_image, &ImageScrollArea::invert);
connect(m_stretchPanel, &StretchToolbar::superPixel, m_image, &ImageScrollArea::superPixel); connect(m_stretchPanel, &StretchToolbar::superPixel, m_image, &ImageScrollArea::superPixel);
connect(m_stretchPanel, &StretchToolbar::falseColor, m_image, &ImageScrollArea::falseColor); connect(m_stretchPanel, &StretchToolbar::falseColor, m_image, &ImageScrollArea::falseColor);
connect(m_stretchPanel, &StretchToolbar::drawGrid, m_image, &ImageScrollArea::drawGrid);
m_ringList = new ImageRingList(m_database, nameFilter, this); m_ringList = new ImageRingList(m_database, nameFilter, this);
m_filesystem = new FilesystemWidget(m_ringList, this); m_filesystem = new FilesystemWidget(m_ringList, this);
View File
View File
View File
View File
View File
+49 -2
View File
@@ -107,7 +107,34 @@ QJSValue ScriptEngine::getObjects(double ra, double dec, double distance)
jsObj.setProperty("name2", object.name2); jsObj.setProperty("name2", object.name2);
jsObj.setProperty("ra", object.skyPoint.RA()); jsObj.setProperty("ra", object.skyPoint.RA());
jsObj.setProperty("dec", object.skyPoint.DEC()); jsObj.setProperty("dec", object.skyPoint.DEC());
jsObj.setProperty("vmag", object.vmag); jsObj.setProperty("mag", object.mag);
ret.setProperty(i++, jsObj);
}
return ret;
}
QJSValue ScriptEngine::getObjects(const QJSValue &bounds)
{
QVector<SkyObject> objects;
double minRa = bounds.property("minRA").toNumber();
double maxRa = bounds.property("maxRA").toNumber();
double minDec = bounds.property("minDEC").toNumber();
double maxDec = bounds.property("maxDEC").toNumber();
QMetaObject::invokeMethod(_database, [this, minRa, maxRa, minDec, maxDec](){
return _database->getObjects(minRa, maxRa, minDec, maxDec); }, Qt::BlockingQueuedConnection, &objects);
QJSValue ret = newArray(objects.size());
qint32 i = 0;
for(auto &object : objects)
{
QJSValue jsObj = newObject();
jsObj.setProperty("name", object.name);
jsObj.setProperty("name2", object.name2);
jsObj.setProperty("ra", object.skyPoint.RA());
jsObj.setProperty("dec", object.skyPoint.DEC());
jsObj.setProperty("mag", object.mag);
ret.setProperty(i++, jsObj); ret.setProperty(i++, jsObj);
} }
@@ -432,12 +459,14 @@ void File::loadFitsKeywords()
{ {
readXISFHeader(_path, info); readXISFHeader(_path, info);
} }
else if(suffix().toLower() == "fits" || suffix().toLower() == "fit") else if(suffix().toLower() == "fits" || suffix().toLower() == "fit" || suffix().toLower() == "fz")
{ {
readFITSHeader(_path, info); readFITSHeader(_path, info);
} }
else return; else return;
_wcs = info.wcs;
for(auto &record : info.fitsHeader) for(auto &record : info.fitsHeader)
{ {
_fitsKeywords.append(record.key); _fitsKeywords.append(record.key);
@@ -810,6 +839,24 @@ QJSValue File::stats()
return _stats; return _stats;
} }
QJSValue File::calculatedBounds()
{
QJSValue ret = _engine->newObject();
loadFitsKeywords();
if(_wcs)
{
double minRa, maxRa, minDec, maxDec, crVal1, crVal2;
_wcs->calculateBounds(minRa, maxRa, minDec, maxDec, crVal1, crVal2);
ret.setProperty("minRA", minRa);
ret.setProperty("maxRA", maxRa);
ret.setProperty("minDEC", minDec);
ret.setProperty("maxDEC", maxDec);
ret.setProperty("crVal1", crVal1);
ret.setProperty("crVal2", crVal2);
}
return ret;
}
#ifdef PLATESOLVER #ifdef PLATESOLVER
QJSValue File::solve(bool updateHeader) QJSValue File::solve(bool updateHeader)
{ {
+3
View File
@@ -42,6 +42,7 @@ public:
Q_INVOKABLE void unmark(File *file); Q_INVOKABLE void unmark(File *file);
Q_INVOKABLE bool isMarked(const File *file); Q_INVOKABLE bool isMarked(const File *file);
Q_INVOKABLE QJSValue getObjects(double ra, double dec, double distance); Q_INVOKABLE QJSValue getObjects(double ra, double dec, double distance);
Q_INVOKABLE QJSValue getObjects(const QJSValue &bounds);
Q_INVOKABLE void setMaxThread(int maxthread); Q_INVOKABLE void setMaxThread(int maxthread);
Q_INVOKABLE void sync(); Q_INVOKABLE void sync();
Q_INVOKABLE QJSValue getString(const QString &label = QString(), const QString &text = QString()) const; Q_INVOKABLE QJSValue getString(const QString &label = QString(), const QString &text = QString()) const;
@@ -97,6 +98,7 @@ class File : public QObject
bool _fitsKeywordsLoaded = false; bool _fitsKeywordsLoaded = false;
QStringList _fitsKeywords; QStringList _fitsKeywords;
QMultiHash<QString, FITSRecord> _fitsRecords; QMultiHash<QString, FITSRecord> _fitsRecords;
std::shared_ptr<WCSDataT> _wcs;
void loadFitsKeywords(); void loadFitsKeywords();
bool mkpath(const QString &path) const; bool mkpath(const QString &path) const;
QJSValue _stats; QJSValue _stats;
@@ -125,6 +127,7 @@ public:
Q_INVOKABLE File* convert(const QString &outpath, const QString &format, const QVariantMap &params = QVariantMap()); Q_INVOKABLE File* convert(const QString &outpath, const QString &format, const QVariantMap &params = QVariantMap());
Q_INVOKABLE File* convertAsync(const QString &outpath, const QString &format, const QVariantMap &params = QVariantMap()); Q_INVOKABLE File* convertAsync(const QString &outpath, const QString &format, const QVariantMap &params = QVariantMap());
Q_INVOKABLE QJSValue stats(); Q_INVOKABLE QJSValue stats();
Q_INVOKABLE QJSValue calculatedBounds();
#ifdef PLATESOLVER #ifdef PLATESOLVER
Q_INVOKABLE QJSValue solve(bool updateHeader = false); Q_INVOKABLE QJSValue solve(bool updateHeader = false);
Q_INVOKABLE QJSValue extractStars(bool hfr); Q_INVOKABLE QJSValue extractStars(bool hfr);
View File
View File
View File
View File
View File
View File
@@ -89,6 +89,11 @@ StretchToolbar::StretchToolbar(QWidget *parent) : QToolBar(tr("Stretch toolbar")
m_autoStretchOnLoad = addAction(QIcon(":/nuke_a.png"), tr("Apply auto stretch on load")); m_autoStretchOnLoad = addAction(QIcon(":/nuke_a.png"), tr("Apply auto stretch on load"));
m_autoStretchOnLoad->setCheckable(true); m_autoStretchOnLoad->setCheckable(true);
QAction *showGridButton = addAction(QIcon(":/grid.svg"), tr("Draw equatorial grid"));
showGridButton->setCheckable(true);
connect(showGridButton, &QAction::toggled, this, &StretchToolbar::drawGrid);
QSettings settings; QSettings settings;
m_autoStretchOnLoad->setChecked(settings.value("stretchtoolbar/autostretch", false).toBool()); m_autoStretchOnLoad->setChecked(settings.value("stretchtoolbar/autostretch", false).toBool());
} }
@@ -33,6 +33,7 @@ signals:
void invert(bool enable); void invert(bool enable);
void superPixel(bool enable); void superPixel(bool enable);
void falseColor(bool enable); void falseColor(bool enable);
void drawGrid(bool enable);
}; };
#endif // STRETCHTOOLBAR_H #endif // STRETCHTOOLBAR_H
View File
+5 -5
View File
@@ -6,9 +6,9 @@ if(BUILD_THUMBNAILER)
Dll.cpp Dll.cpp
loadimage.cpp loadimage.cpp
TenmonThumbnailProvider.cpp TenmonThumbnailProvider.cpp
../rawimage.h ../src/rawimage.h
../rawimage.cpp ../src/rawimage.cpp
../rawimage_sse.cpp) ../src/rawimage_sse.cpp)
set_target_properties(tenmonthumbnailer PROPERTIES PREFIX "") set_target_properties(tenmonthumbnailer PROPERTIES PREFIX "")
target_compile_definitions(tenmonthumbnailer PRIVATE NO_QT) target_compile_definitions(tenmonthumbnailer PRIVATE NO_QT)
@@ -19,8 +19,8 @@ if(BUILD_THUMBNAILER)
qt_add_executable(tenmonthumbnailer qt_add_executable(tenmonthumbnailer
main.cpp main.cpp
loadimage.cpp loadimage.cpp
../rawimage.cpp ../src/rawimage.cpp
../rawimage_sse.cpp) ../src/rawimage_sse.cpp)
target_link_libraries(tenmonthumbnailer PRIVATE ${FITS_LIB} XISF) target_link_libraries(tenmonthumbnailer PRIVATE ${FITS_LIB} XISF)
+1 -1
View File
@@ -2,7 +2,7 @@
#include <thumbcache.h> // For IThumbnailProvider. #include <thumbcache.h> // For IThumbnailProvider.
#include <new> #include <new>
#include "libxisf.h" #include "libxisf.h"
#include "../rawimage.h" #include "../src/rawimage.h"
bool loadXISF(const LibXISF::ByteArray &data, std::shared_ptr<RawImage> &rawImage); bool loadXISF(const LibXISF::ByteArray &data, std::shared_ptr<RawImage> &rawImage);
bool loadFITS(const LibXISF::ByteArray &data, std::shared_ptr<RawImage> &rawImage); bool loadFITS(const LibXISF::ByteArray &data, std::shared_ptr<RawImage> &rawImage);
+2 -3
View File
@@ -1,7 +1,6 @@
#include "genthumbnail.h" #include "genthumbnail.h"
#include "../rawimage.h" #include "../src/rawimage.h"
#include "../loadimage.h" #include "../src/loadimage.h"
int generateThumbnail(const QString &input, const QString &output, uint32_t size) int generateThumbnail(const QString &input, const QString &output, uint32_t size)
{ {
+1 -1
View File
@@ -1,5 +1,5 @@
#include "libxisf.h" #include "libxisf.h"
#include "../rawimage.h" #include "../src/rawimage.h"
#ifdef WIN32 #ifdef WIN32
#include <windows.h> #include <windows.h>
#endif #endif
+1 -1
View File
@@ -1,7 +1,7 @@
#include <vector> #include <vector>
#include <string> #include <string>
#include <iostream> #include <iostream>
#include "../rawimage.h" #include "../src/rawimage.h"
#define STB_IMAGE_WRITE_IMPLEMENTATION #define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h" #include "stb_image_write.h"