From 50391db34639ce5ccb4134c694194646c8513988 Mon Sep 17 00:00:00 2001 From: whitlocb Date: Mon, 12 Oct 2015 20:31:09 +0000 Subject: [PATCH] Added code generation support for floatVector. Add window generation support for stringVector. git-svn-id: http://visit.ilight.com/svn/visit/trunk/src@27452 18c085ea-50e0-402c-830e-de6fd14e8384 --- common/state/AttributeGroup.C | 4 ++ gui/GUIBase.C | 41 +++++++++++++ gui/GUIBase.h | 3 + tools/xml/Field.h | 48 +++++++++++++++ tools/xml/GenerateAtts.h | 26 ++++++++ tools/xml/GenerateJava.h | 64 ++++++++++++++++++++ tools/xml/GeneratePython.h | 102 +++++++++++++++++++++++++++++++ tools/xml/GenerateWindow.h | 109 ++++++++++++++++++++++++++++++++++ tools/xmledit/XMLEditFields.C | 1 + 9 files changed, 398 insertions(+) diff --git a/common/state/AttributeGroup.C b/common/state/AttributeGroup.C index cec1cacbbe9..13ea659f1f8 100644 --- a/common/state/AttributeGroup.C +++ b/common/state/AttributeGroup.C @@ -648,6 +648,10 @@ AttributeGroup::EqualTo(const AttributeGroup *atts) const if (!(EqualVal::EqualArray(addr1,addr2,length))) return false; break; + case FieldType_floatVector: + if (!(EqualVal::EqualVector(addr1,addr2))) + return false; + break; case FieldType_double: if (!(EqualVal::EqualScalar(addr1,addr2))) return false; diff --git a/gui/GUIBase.C b/gui/GUIBase.C index 9cf6f51fbc6..bb7ade7ea9e 100644 --- a/gui/GUIBase.C +++ b/gui/GUIBase.C @@ -1030,6 +1030,19 @@ GUIBase::FloatsToQString(const float *vals, int nvals, int precision) return s; } +QString +GUIBase::FloatsToQString(const floatVector &vals, int precision) +{ + QString s; + for(size_t i = 0; i < vals.size(); ++i) + { + s += QString().setNum(vals[i], 'g', precision); + if(i < vals.size()-1) + s += " "; + } + return s; +} + // **************************************************************************** // Method: GUIBase::FloatToQString // @@ -1268,6 +1281,12 @@ GUIBase::LineEditGetFloats(QLineEdit *lineEdit, float *vals, int maxVals) return QStringToFloats(lineEdit->displayText().trimmed(), vals, maxVals); } +bool +GUIBase::LineEditGetFloats(QLineEdit *lineEdit, floatVector &vals, int maxVals) +{ + return QStringToFloats(lineEdit->displayText().trimmed(), vals, maxVals); +} + // **************************************************************************** // Method: GUIBase::LineEditGetFloat // @@ -1514,6 +1533,28 @@ GUIBase::QStringToFloats(const QString &str, float *vals, int maxVals) return retval; } +bool +GUIBase::QStringToFloats(const QString &str, floatVector &vals, int maxVals) +{ + bool retval = false; + + if(!str.isEmpty()) + { + bool okay = true; + QStringList s = str.split(" ", QString::SkipEmptyParts); + for(int i = 0; i < s.size() && okay; ++i) + { + if(maxVals == -1 || i < maxVals) + vals.push_back(s[i].toFloat(&okay)); + else + vals.push_back(0.); + } + retval = okay; + } + + return retval; +} + // **************************************************************************** // Method: GUIBase::QStringToInts // diff --git a/gui/GUIBase.h b/gui/GUIBase.h index 2f6a2c6e837..ac379e6589a 100644 --- a/gui/GUIBase.h +++ b/gui/GUIBase.h @@ -128,6 +128,7 @@ public: // Helpers for converting between values and qstrings static QString FloatsToQString(const float *, int, int precision=7); + static QString FloatsToQString(const floatVector &, int precision=7); static QString FloatToQString(float, int precision=7); static QString DoublesToQString(const double *, int, int precision=16); static QString DoublesToQString(const doubleVector &, int precision=16); @@ -137,6 +138,7 @@ public: static QString IntToQString(int); static bool QStringToFloats(const QString &str, float *vals, int maxVals); + static bool QStringToFloats(const QString &str, floatVector &vals, int maxVals=-1); static bool QStringToDoubles(const QString &str, double *vals, int maxVals); static bool QStringToDoubles(const QString &str, doubleVector &vals, int maxVal=-1); static bool QStringToInts(const QString &str, int *vals, int maxVals); @@ -145,6 +147,7 @@ public: static bool LineEditGetDoubles(QLineEdit *lineEdit, double *vals, int maxVals); static bool LineEditGetDoubles(QLineEdit *lineEdit, doubleVector &vals, int maxVals=-1); static bool LineEditGetFloats(QLineEdit *lineEdit, float *vals, int maxVals); + static bool LineEditGetFloats(QLineEdit *lineEdit, floatVector &vals, int maxVals=-1); static bool LineEditGetInts(QLineEdit *lineEdit, int *vals, int maxVals); static bool LineEditGetInts(QLineEdit *lineEdit, intVector &vals, int maxVals=-1); diff --git a/tools/xml/Field.h b/tools/xml/Field.h index 9ada6d28660..d7234374d40 100644 --- a/tools/xml/Field.h +++ b/tools/xml/Field.h @@ -662,6 +662,53 @@ class FloatArray : public virtual Field }; +// +// ------------------------------- FloatVector ------------------------------- +// +class FloatVector : public virtual Field +{ + public: + std::vector val; + public: + FloatVector(const QString &n, const QString &l) : Field("floatVector",n,l) { } + virtual QString GetCPPName(bool, const QString &) + { + return "floatVector"; + } + virtual void ClearValues() + { + val.clear(); + } + virtual void SetValue(const QString &s, int = 0) + { + // can't use toFloat -- some versions of Qt disallow exponents beyond + // single precision range. + //val.push_back(s.toFloat()); + val.push_back(atof(s.toStdString().c_str())); + valueSet = true; + } + virtual void Print(QTextStream &out) + { + Field::Print(out); + if (valueSet) + { + out << " value: "; + for (size_t i=0; i GetValueAsText() + { + std::vector retval; + if (valueSet) + for (size_t i=0; idata->"; + if(accessType == Field::AccessPublic) + c << name; + else + c << MethodNameGet() << "()"; + c << ";" << Endl; + c << " PyObject *tuple;" << Endl; + c << " if(!PyArg_ParseTuple(args, \"O\", &tuple))" << Endl; + c << " return NULL;" << Endl; + c << Endl; + c << " if(PyTuple_Check(tuple))" << Endl; + c << " {" << Endl; + c << " vec.resize(PyTuple_Size(tuple));" << Endl; + c << " for(int i = 0; i < PyTuple_Size(tuple); ++i)" << Endl; + c << " {" << Endl; + c << " PyObject *item = PyTuple_GET_ITEM(tuple, i);" << Endl; + c << " if(PyFloat_Check(item))" << Endl; + c << " vec[i] = float(PyFloat_AS_DOUBLE(item));" << Endl; + c << " else if(PyInt_Check(item))" << Endl; + c << " vec[i] = float(PyInt_AS_LONG(item));" << Endl; + c << " else if(PyLong_Check(item))" << Endl; + c << " vec[i] = float(PyLong_AsDouble(item));" << Endl; + c << " else" << Endl; + c << " vec[i] = 0.f;" << Endl; + c << " }" << Endl; + c << " }" << Endl; + c << " else if(PyFloat_Check(tuple))" << Endl; + c << " {" << Endl; + c << " vec.resize(1);" << Endl; + c << " vec[0] = float(PyFloat_AS_DOUBLE(tuple));" << Endl; + c << " }" << Endl; + c << " else if(PyInt_Check(tuple))" << Endl; + c << " {" << Endl; + c << " vec.resize(1);" << Endl; + c << " vec[0] = float(PyInt_AS_LONG(tuple));" << Endl; + c << " }" << Endl; + c << " else if(PyLong_Check(tuple))" << Endl; + c << " {" << Endl; + c << " vec.resize(1);" << Endl; + c << " vec[0] = float(PyLong_AsDouble(tuple));" << Endl; + c << " }" << Endl; + c << " else" << Endl; + c << " return NULL;" << Endl; + c << Endl; + c << " // Mark the "<data->SelectAll();" << Endl; + else + c << " obj->data->Select"<data->"; + if(accessType == Field::AccessPublic) + c << name; + else + c <"; + if(accessType == Field::AccessPublic) + c << name; + else + c << MethodNameGet() << "()"; + c << ";" << Endl; + c << " SNPRINTF(tmpStr, 1000, \"%s" << name << " = (\", prefix);" << Endl; + c << " str += tmpStr;" << Endl; + c << " for(size_t i = 0; i < " << name << ".size(); ++i)" << Endl; + c << " {" << Endl; + c << " SNPRINTF(tmpStr, 1000, \"%f\", " << name << "[i]);" << Endl; + c << " str += tmpStr;" << Endl; + c << " if(i < " << name << ".size() - 1)" << Endl; + c << " {" << Endl; + c << " SNPRINTF(tmpStr, 1000, \", \");" << Endl; + c << " str += tmpStr;" << Endl; + c << " }" << Endl; + c << " }" << Endl; + c << " SNPRINTF(tmpStr, 1000, \")\\n\");" << Endl; + c << " str += tmpStr;" << Endl; + c << " }" << Endl; + } +}; + // // ---------------------------------- Double ---------------------------------- @@ -2737,6 +2838,7 @@ class PythonFieldFactory else if (type == "bool") f = new AttsGeneratorBool(name,label); else if (type == "float") f = new AttsGeneratorFloat(name,label); else if (type == "floatArray") f = new AttsGeneratorFloatArray(length,name,label); + else if (type == "floatVector") f = new AttsGeneratorFloatVector(name,label); else if (type == "double") f = new AttsGeneratorDouble(name,label); else if (type == "doubleArray") f = new AttsGeneratorDoubleArray(length,name,label); else if (type == "doubleVector") f = new AttsGeneratorDoubleVector(name,label); diff --git a/tools/xml/GenerateWindow.h b/tools/xml/GenerateWindow.h index bb33f8159b5..defe1d58b20 100644 --- a/tools/xml/GenerateWindow.h +++ b/tools/xml/GenerateWindow.h @@ -570,6 +570,59 @@ class WindowGeneratorFloatArray : public virtual FloatArray , public virtual Win }; +// +// -------------------------------- FloatVector ------------------------------ +// +class WindowGeneratorFloatVector : public virtual FloatVector , public virtual WindowGeneratorField +{ + public: + WindowGeneratorFloatVector(const QString &n, const QString &l) + : Field("floatVector",n,l), FloatVector(n,l), WindowGeneratorField("floatVector",n,l) { } + virtual void writeHeaderCallback(QTextStream &h) + { + h << " void "<addWidget("<Set"<0) ? label : name; + c << " ResettingError(tr(\""<Get"<Set"<Get"<setText(FloatsToQString(atts->Get"<addWidget("<displayText();" << endl; + c << " if(!temp.isEmpty())" << endl; + c << " {" << endl; + c << " QStringList s = temp.split(\" \", QString::SkipEmptyParts);" << endl; + c << " stringVector sv;" << endl; + c << " for(int i = 0; i < s.size(); ++i)" << endl; + c << " sv.push_back(s[i].toStdString());" << endl; + c << " atts->Set"<Set"<Get"<Get"<Get"<Get"<setText(stmp);" << endl; + c << " }" << endl; + } + virtual void writeSourceCallback(QString &classname, QString &windowname, QTextStream &c, bool isEnabler) + { + c << "void" << endl; + c << windowname<<"::"<addItem("bool"); type->addItem("float"); type->addItem("floatArray"); + type->addItem("floatVector"); type->addItem("double"); type->addItem("doubleArray"); type->addItem("doubleVector"); -- GitLab