tahoma2d/toonz/sources/common/tparam/tdoubleparamfile.cpp

118 lines
2.8 KiB
C++
Raw Normal View History

2016-03-19 06:57:51 +13:00
#include "tdoubleparamfile.h"
#include "tfilepath_io.h"
#include "tconvert.h"
2016-06-15 18:43:10 +12:00
namespace {
2016-03-19 06:57:51 +13:00
//---------------------------------------------------------
2016-06-15 18:43:10 +12:00
bool parseDouble(double &value, char *&s) {
if (!(*s == '-' || *s == '.' || '0' <= *s && *s <= '9')) return false;
char *t = s;
if (*s == '-') s++;
while ('0' <= *s && *s <= '9') s++;
if (*s == '.') {
s++;
while ('0' <= *s && *s <= '9') s++;
if (*s == 'e' || *s == 'E') {
s++;
if (*s == '+' || *s == '-') s++;
while ('0' <= *s && *s <= '9') s++;
}
}
std::string w(t, s - t);
value = std::stod(w);
return true;
2016-03-19 06:57:51 +13:00
}
//---------------------------------------------------------
2016-06-15 18:43:10 +12:00
int split(std::vector<double> &values, char *s) {
int count = 0;
for (;;) {
while (*s == ' ' || *s == '\t') s++;
if (*s == '\0') break;
double value = 0;
bool found = parseDouble(value, s);
if (found) {
count++;
values.push_back(value);
while (*s == ' ' || *s == '\t') s++;
}
if (*s == ',' || *s == ';') {
if (!found) {
count++;
values.push_back(0);
}
s++;
} else {
if (!found) break;
}
}
return count;
2016-03-19 06:57:51 +13:00
}
//---------------------------------------------------------
2016-06-15 18:43:10 +12:00
} // namespace
2016-03-19 06:57:51 +13:00
//---------------------------------------------------------
2016-06-15 18:43:10 +12:00
TDoubleParamFileData::TDoubleParamFileData() : m_params(), m_dirtyFlag(false) {}
2016-03-19 06:57:51 +13:00
//---------------------------------------------------------
2016-06-15 18:43:10 +12:00
TDoubleParamFileData::~TDoubleParamFileData() {}
2016-03-19 06:57:51 +13:00
//---------------------------------------------------------
2016-06-15 18:43:10 +12:00
void TDoubleParamFileData::setParams(
const TDoubleKeyframe::FileParams &params) {
m_params = params;
invalidate();
2016-03-19 06:57:51 +13:00
}
//---------------------------------------------------------
2016-06-15 18:43:10 +12:00
void TDoubleParamFileData::invalidate() {
m_dirtyFlag = true;
m_values.clear();
2016-03-19 06:57:51 +13:00
}
//---------------------------------------------------------
2016-06-15 18:43:10 +12:00
double TDoubleParamFileData::getValue(double frame, double defaultValue) {
if (frame < 0) return defaultValue;
int intFrame = (int)frame;
if (m_dirtyFlag) read();
if (intFrame >= (int)m_values.size())
return defaultValue;
else
return m_values[intFrame];
2016-03-19 06:57:51 +13:00
}
//---------------------------------------------------------
2016-06-15 18:43:10 +12:00
void TDoubleParamFileData::read() {
m_dirtyFlag = false;
m_values.clear();
int k = m_params.m_fieldIndex;
if (k < 0) return;
TFilePath fp = m_params.m_path;
Tifstream is(fp);
char buffer[2048];
memset(buffer, 0, sizeof buffer);
while (is) {
is.getline(buffer, sizeof(buffer) - 1);
std::vector<double> fields;
QString line(buffer);
if (line.size() == 0 || line.startsWith("#")) continue;
split(fields, buffer);
double value = 0;
if (k < (int)fields.size()) value = fields[k];
m_values.push_back(value);
}
2016-03-19 06:57:51 +13:00
}
//---------------------------------------------------------