diff --git a/openbr/core/core.cpp b/openbr/core/core.cpp index c4b2c2f..2bbad5b 100644 --- a/openbr/core/core.cpp +++ b/openbr/core/core.cpp @@ -542,10 +542,25 @@ private: return; } + File parsed("."+description); + const QString parsedFname = getFileName(parsed.suffix()); + QFileInfo pFile(parsedFname); + if (pFile.exists()) { + load(parsedFname); + applyAdditionalProperties(parsed, transform.data()); + return; + } + // Expand abbreviated algorithms to their full strings if (Globals->abbreviations.contains(description)) return init(Globals->abbreviations[description]); + if (Globals->abbreviations.contains(parsed.suffix())) { + init(Globals->abbreviations[parsed.suffix()]); + applyAdditionalProperties(parsed, transform.data()); + return; + } + const bool compareTransform = description.contains('!'); QStringList words = QtUtils::parse(description, compareTransform ? '!' : ':'); diff --git a/openbr/openbr_plugin.cpp b/openbr/openbr_plugin.cpp index 3c0d05d..5c4544b 100644 --- a/openbr/openbr_plugin.cpp +++ b/openbr/openbr_plugin.cpp @@ -38,6 +38,7 @@ #include "core/common.h" #include "core/opencvutils.h" #include "core/qtutils.h" +#include "openbr/plugins/openbr_internal.h" using namespace br; using namespace cv; @@ -721,7 +722,6 @@ bool Object::setPropertyRecursive(const QString &name, QVariant value) { if (this->metaObject()->indexOfProperty(qPrintable(name)) == -1) return false; - setProperty(name, value); init(); return true; @@ -1235,6 +1235,13 @@ Transform *Transform::make(QString str, QObject *parent) if (Globals->abbreviations.contains(str)) return make(Globals->abbreviations[str], parent); + File parsed("."+str); + if (Globals->abbreviations.contains(parsed.suffix())) { + Transform * res = make(Globals->abbreviations[parsed.suffix()], parent); + applyAdditionalProperties(parsed, res); + return res; + } + //! [Make a pipe] { // Check for use of '+' as shorthand for Pipe(...) QStringList words = parse(str, '+'); @@ -1435,3 +1442,14 @@ void Distance::compareBlock(const TemplateList &target, const TemplateList &quer if (target[j].isEmpty() || query[i].isEmpty()) output->setRelative(-std::numeric_limits::max(),i+queryOffset, j+targetOffset); else output->setRelative(compare(target[j], query[i]), i+queryOffset, j+targetOffset); } + +void br::applyAdditionalProperties(File & temp, Transform * target) +{ + QVariantMap meta = temp.localMetadata(); + for (QVariantMap::iterator i = meta.begin(); i != meta.end(); ++i) { + if (i.key().startsWith("_Arg")) + continue; + + target->setPropertyRecursive(i.key(), i.value() ); + } +} diff --git a/openbr/plugins/openbr_internal.h b/openbr/plugins/openbr_internal.h index 085a0d5..2b86b9b 100644 --- a/openbr/plugins/openbr_internal.h +++ b/openbr/plugins/openbr_internal.h @@ -385,6 +385,9 @@ public: qint64 position() { return f.pos(); } }; + +void applyAdditionalProperties(File & temp, Transform * target); + } #endif // OPENBR_INTERNAL_H