diff --git a/libXISF b/libXISF index fa39440..c6581e1 160000 --- a/libXISF +++ b/libXISF @@ -1 +1 @@ -Subproject commit fa39440b9e48dd42382d7b71db084f9560476537 +Subproject commit c6581e11220cfce71aef1c77a9797b9bf8838c31 diff --git a/src/scriptengine.cpp b/src/scriptengine.cpp index 5c933a6..8a2d88e 100644 --- a/src/scriptengine.cpp +++ b/src/scriptengine.cpp @@ -625,16 +625,22 @@ bool File::modifyFITSRecords(const FITSRecordModify *modify) int naxis; long naxes[3] = {0}; int type = -1; + std::vector imageIdxs; for(int i=1; i <= num; i++) { fits_movabs_hdu(file, i, IMAGE_HDU, &status); fits_get_hdu_type(file, &type, &status); - fits_get_img_param(file, 3, &imgtype, &naxis, naxes, &status); - if(type == IMAGE_HDU && naxis >= 2 && naxis <= 3 && status == 0) - break; - if(i == num)return false; + if(type == IMAGE_HDU) + { + fits_get_img_param(file, 3, &imgtype, &naxis, naxes, &status); + if(naxis >= 2 && naxis <= 3)imageIdxs.push_back(i); + } } + if(modify->_imageIdx >= imageIdxs.size())return false; + fits_movabs_hdu(file, imageIdxs[modify->_imageIdx], &type, &status); + fits_get_img_param(file, 3, &imgtype, &naxis, naxes, &status); + for(auto &remove : modify->_remove) { int status = 0;//we ignore errors from here @@ -742,13 +748,16 @@ bool File::modifyFITSRecords(const FITSRecordModify *modify) qDebug() << "modify" << in << out; for(auto &remove : modify->_remove) - modifyXISF.removeFITSKeyword(0, remove.toStdString()); + modifyXISF.removeFITSKeyword(modify->_imageIdx, remove.toStdString()); for(auto &record : modify->_update) - modifyXISF.updateFITSKeyword(0, {record.key.toStdString(), record.value.toString().toStdString(), record.comment.toStdString()}, true); + modifyXISF.updateFITSKeyword(modify->_imageIdx, {record.key.toStdString(), record.value.toString().toStdString(), record.comment.toStdString()}, true); for(auto &record : modify->_add) - modifyXISF.addFITSKeyword(0, {record.key.toStdString(), record.value.toString().toStdString(), record.comment.toStdString()}); + modifyXISF.addFITSKeyword(modify->_imageIdx, {record.key.toStdString(), record.value.toString().toStdString(), record.comment.toStdString()}); + + for(auto &property : modify->_property) + modifyXISF.updateProperty(modify->_imageIdx, property); modifyXISF.save(out.toLocal8Bit().toStdString()); modifyXISF.close(); @@ -757,6 +766,7 @@ bool File::modifyFITSRecords(const FITSRecordModify *modify) } catch(std::filesystem::filesystem_error &err) { + if(_engine)_engine->newMessage("Failed to modify file " + _path + " " + err.what(), true); return false; } catch(LibXISF::Error &err) @@ -926,6 +936,21 @@ void FITSRecordModify::addKeyword(const QString &key, const QVariant &value, con _update.append({key.toLatin1(), value, comment.toLatin1()}); } +void FITSRecordModify::updateProperty(const QString &id, const LibXISF::Variant &value) +{ + _property.append(LibXISF::Property(id.toStdString(), value)); +} + +uint32_t FITSRecordModify::imageIndex() const +{ + return _imageIdx; +} + +void FITSRecordModify::setImageIndex(uint32_t idx) +{ + _imageIdx = idx; +} + bool TextFile::open(const QString &path, const QString &mode) { _fr.setFileName(path); diff --git a/src/scriptengine.h b/src/scriptengine.h index 9a0a0a3..f4667d9 100644 --- a/src/scriptengine.h +++ b/src/scriptengine.h @@ -9,6 +9,7 @@ #include #include "database.h" #include "imageinfodata.h" +#include "libxisf.h" class BatchProcessing; class Solver; @@ -140,6 +141,8 @@ class FITSRecordModify : public QObject QStringList _remove; QVector _update; QVector _add; + QVector _property; + uint32_t _imageIdx = 0; friend class File; public: @@ -147,6 +150,10 @@ public: Q_INVOKABLE void removeKeyword(const QString &key); Q_INVOKABLE void updateKeyword(const QString &key, const QVariant &value, const QString &comment = QString()); Q_INVOKABLE void addKeyword(const QString &key, const QVariant &value, const QString &comment = QString()); + Q_PROPERTY(uint32_t imageIndex READ imageIndex WRITE setImageIndex); + void updateProperty(const QString &id, const LibXISF::Variant &value); + uint32_t imageIndex() const; + void setImageIndex(uint32_t idx); }; class TextFile : public QObject