1 Commits

Author SHA1 Message Date
nou c6581e1122 Add method to modify XISF Property 2025-08-03 20:40:56 +02:00
3 changed files with 34 additions and 3 deletions
+28 -1
View File
@@ -1034,11 +1034,11 @@ public:
void save(std::ostream &io); void save(std::ostream &io);
void writeImage(const Image &image); void writeImage(const Image &image);
static void writeFITSKeyword(pugi::xml_node &node, const FITSKeyword &keyword); static void writeFITSKeyword(pugi::xml_node &node, const FITSKeyword &keyword);
static void writePropertyElement(pugi::xml_node &node, const Property &property);
private: private:
void writeHeader(); void writeHeader();
void writeImageElement(pugi::xml_node &node, const Image &image); void writeImageElement(pugi::xml_node &node, const Image &image);
void writeDataBlockAttributes(pugi::xml_node &image_node, const DataBlock &dataBlock); void writeDataBlockAttributes(pugi::xml_node &image_node, const DataBlock &dataBlock);
void writePropertyElement(pugi::xml_node &node, const Property &property);
void writeMetadata(pugi::xml_node &node); void writeMetadata(pugi::xml_node &node);
void updateImageAttachmentPos(pugi::xml_node &root, size_t offset); void updateImageAttachmentPos(pugi::xml_node &root, size_t offset);
ByteArray _xisfHeader; ByteArray _xisfHeader;
@@ -1371,6 +1371,7 @@ public:
void addFITSKeyword(uint32_t image, const FITSKeyword &keyword); void addFITSKeyword(uint32_t image, const FITSKeyword &keyword);
void updateFITSKeyword(uint32_t image, const FITSKeyword &keyword, bool add); void updateFITSKeyword(uint32_t image, const FITSKeyword &keyword, bool add);
void removeFITSKeyword(uint32_t image, const String &name); void removeFITSKeyword(uint32_t image, const String &name);
void updateProperty(uint32_t image, const Property &property);
private: private:
void readXISFHeader(); void readXISFHeader();
void parseAttachmentPos(pugi::xml_node &root); void parseAttachmentPos(pugi::xml_node &root);
@@ -1551,6 +1552,27 @@ void XISFModifyPrivate::removeFITSKeyword(uint32_t image, const String &name)
imageNode.remove_child(keywordNode); imageNode.remove_child(keywordNode);
} }
void XISFModifyPrivate::updateProperty(uint32_t image, const Property &property)
{
if(!_root)
throw Error("No input file opened");
pugi::xpath_node_set images = _root.select_nodes("//Image");
if(image >= images.size())
throw Error("Out of bounds");
pugi::xpath_variable_set variables;
variables.set("id", property.id.c_str());
pugi::xml_node imageNode = images[image].node();
pugi::xml_node propertyNode = imageNode.select_node("Property[@id=string($id)]", &variables).node();
if(propertyNode)
imageNode.remove_child(propertyNode);
XISFWriterPrivate::writePropertyElement(imageNode, property);
}
void XISFModifyPrivate::readXISFHeader() void XISFModifyPrivate::readXISFHeader()
{ {
char signature[8]; char signature[8];
@@ -1669,6 +1691,11 @@ void XISFModify::removeFITSKeyword(uint32_t image, const String &name)
p->removeFITSKeyword(image, name); p->removeFITSKeyword(image, name);
} }
void XISFModify::updateProperty(uint32_t image, const Property &property)
{
p->updateProperty(image, property);
}
#define STRING_ENUM(map, map2, c, e) { map.insert({#e, c::e}); map2.insert({c::e, #e}); } #define STRING_ENUM(map, map2, c, e) { map.insert({#e, c::e}); map2.insert({c::e, #e}); }
struct Init struct Init
+6
View File
@@ -443,6 +443,12 @@ public:
* @param name of keyword that will be removed * @param name of keyword that will be removed
*/ */
void removeFITSKeyword(uint32_t image, const String &name); void removeFITSKeyword(uint32_t image, const String &name);
/**
* @brief updateProperty add new or update existing XISF Property
* @param image index of image to update
* @param property new value of property
*/
void updateProperty(uint32_t image, const Property &property);
private: private:
XISFModifyPrivate *p; XISFModifyPrivate *p;
}; };
-2
View File
@@ -17,7 +17,6 @@
************************************************************************/ ************************************************************************/
#include <charconv> #include <charconv>
#include <type_traits>
#include <map> #include <map>
#include <regex> #include <regex>
#include <iomanip> #include <iomanip>
@@ -403,7 +402,6 @@ Variant variantFromString(Variant::Type type, const String &str)
Variant::Type Variant::type() const Variant::Type Variant::type() const
{ {
int idx = _value.index();
return (Variant::Type)_value.index(); return (Variant::Type)_value.index();
} }