Commit d425956d5a83a755b3fd7493c84d0490bf0a045c
1 parent
e095c645
Fix issue #265 (csv format broken with FTE templates)
Retain the number of columns generated per key output, so that the csv layout will not be broken if point/rect metadata keys are missing (since they are output as multiple columns of the csv).
Showing
1 changed file
with
47 additions
and
12 deletions
openbr/plugins/gallery.cpp
| @@ -857,20 +857,27 @@ class csvGallery : public FileGallery | @@ -857,20 +857,27 @@ class csvGallery : public FileGallery | ||
| 857 | QStringList lines; | 857 | QStringList lines; |
| 858 | lines.reserve(files.size()+1); | 858 | lines.reserve(files.size()+1); |
| 859 | 859 | ||
| 860 | + QMap<QString, int> columnCounts; | ||
| 861 | + | ||
| 860 | { // Make header | 862 | { // Make header |
| 861 | QStringList words; | 863 | QStringList words; |
| 862 | words.append("File"); | 864 | words.append("File"); |
| 863 | - foreach (const QString &key, samples.keys()) | ||
| 864 | - words.append(getCSVElement(key, samples[key], true)); | 865 | + foreach (const QString &key, samples.keys()) { |
| 866 | + int count = 0; | ||
| 867 | + words.append(getCSVElement(key, samples[key], true, count)); | ||
| 868 | + columnCounts.insert(key, count); | ||
| 869 | + } | ||
| 865 | lines.append(words.join(",")); | 870 | lines.append(words.join(",")); |
| 866 | } | 871 | } |
| 867 | - | 872 | + |
| 868 | // Make table | 873 | // Make table |
| 869 | foreach (const File &file, files) { | 874 | foreach (const File &file, files) { |
| 870 | QStringList words; | 875 | QStringList words; |
| 871 | words.append(file.name); | 876 | words.append(file.name); |
| 872 | - foreach (const QString &key, samples.keys()) | ||
| 873 | - words.append(getCSVElement(key, file.value(key), false)); | 877 | + foreach (const QString &key, samples.keys()) { |
| 878 | + int count = columnCounts[key]; | ||
| 879 | + words.append(getCSVElement(key, file.value(key), false, count)); | ||
| 880 | + } | ||
| 874 | lines.append(words.join(",")); | 881 | lines.append(words.join(",")); |
| 875 | } | 882 | } |
| 876 | 883 | ||
| @@ -919,22 +926,50 @@ class csvGallery : public FileGallery | @@ -919,22 +926,50 @@ class csvGallery : public FileGallery | ||
| 919 | files.append(t.file); | 926 | files.append(t.file); |
| 920 | } | 927 | } |
| 921 | 928 | ||
| 922 | - static QString getCSVElement(const QString &key, const QVariant &value, bool header) | 929 | + static QString getCSVElement(const QString &key, const QVariant &value, bool header, int & columnCount) |
| 923 | { | 930 | { |
| 931 | + if (header) | ||
| 932 | + columnCount = 1; | ||
| 933 | + | ||
| 924 | if (value.canConvert<QString>()) { | 934 | if (value.canConvert<QString>()) { |
| 925 | if (header) return key; | 935 | if (header) return key; |
| 926 | - else return value.value<QString>(); | 936 | + else { |
| 937 | + if (columnCount != 1) | ||
| 938 | + qFatal("Inconsistent datatype for key %s, csv file cannot be generated", qPrintable(key)); | ||
| 939 | + return value.value<QString>(); | ||
| 940 | + } | ||
| 927 | } else if (value.canConvert<QPointF>()) { | 941 | } else if (value.canConvert<QPointF>()) { |
| 928 | const QPointF point = value.value<QPointF>(); | 942 | const QPointF point = value.value<QPointF>(); |
| 929 | - if (header) return key+"_X,"+key+"_Y"; | ||
| 930 | - else return QString::number(point.x())+","+QString::number(point.y()); | 943 | + if (header) { |
| 944 | + columnCount = 2; | ||
| 945 | + return key+"_X,"+key+"_Y"; | ||
| 946 | + } | ||
| 947 | + else { | ||
| 948 | + if (columnCount != 2) | ||
| 949 | + qFatal("Inconsistent datatype for key %s, csv file cannot be generated", qPrintable(key)); | ||
| 950 | + | ||
| 951 | + return QString::number(point.x())+","+QString::number(point.y()); | ||
| 952 | + } | ||
| 931 | } else if (value.canConvert<QRectF>()) { | 953 | } else if (value.canConvert<QRectF>()) { |
| 932 | const QRectF rect = value.value<QRectF>(); | 954 | const QRectF rect = value.value<QRectF>(); |
| 933 | - if (header) return key+"_X,"+key+"_Y,"+key+"_Width,"+key+"_Height"; | ||
| 934 | - else return QString::number(rect.x())+","+QString::number(rect.y())+","+QString::number(rect.width())+","+QString::number(rect.height()); | 955 | + if (header) { |
| 956 | + columnCount = 4; | ||
| 957 | + return key+"_X,"+key+"_Y,"+key+"_Width,"+key+"_Height"; | ||
| 958 | + } | ||
| 959 | + else { | ||
| 960 | + if (columnCount != 4) | ||
| 961 | + qFatal("Inconsistent datatype for key %s, csv file cannot be generated", qPrintable(key)); | ||
| 962 | + | ||
| 963 | + return QString::number(rect.x())+","+QString::number(rect.y())+","+QString::number(rect.width())+","+QString::number(rect.height()); | ||
| 964 | + } | ||
| 935 | } else { | 965 | } else { |
| 936 | if (header) return key; | 966 | if (header) return key; |
| 937 | - else return QString::number(std::numeric_limits<float>::quiet_NaN()); | 967 | + else { |
| 968 | + QString output = QString::number(std::numeric_limits<float>::quiet_NaN()); | ||
| 969 | + for (int i = 1; i < columnCount; i++) | ||
| 970 | + output += "," + QString::number(std::numeric_limits<float>::quiet_NaN()); | ||
| 971 | + return output; | ||
| 972 | + } | ||
| 938 | } | 973 | } |
| 939 | } | 974 | } |
| 940 | }; | 975 | }; |