From c7f4b987a1bce4d4fa3012fa72ee969625b2d25a Mon Sep 17 00:00:00 2001
From: Paolo Cignoni cignoni " + floatGuiInfo(MLXMLElNames::absPercTag,var) + " " + defaultGuiInfo(MLXMLElNames::checkBoxTag,var) + " " + defaultGuiInfo(MLXMLElNames::editTag,var) + " " + defaultGuiInfo(MLXMLElNames::vec3WidgetTag,var) + " " + defaultGuiInfo(MLXMLElNames::colorWidgetTag,var) + " " + floatGuiInfo(MLXMLElNames::sliderWidgetTag,var) + " " + defaultGuiInfo(MLXMLElNames::enumWidgetTag,var) + " " + defaultGuiInfo(MLXMLElNames::meshWidgetTag,var) + " " + defaultGuiInfo(MLXMLElNames::shotWidgetTag,var) + " " + floatGuiInfo(MLXMLElNames::absPercTag,var) + " " + defaultGuiInfo(MLXMLElNames::checkBoxTag,var) + " " + defaultGuiInfo(MLXMLElNames::editTag,var) + " " + defaultGuiInfo(MLXMLElNames::vec3WidgetTag,var) + " " + defaultGuiInfo(MLXMLElNames::colorWidgetTag,var) + " " + floatGuiInfo(MLXMLElNames::sliderWidgetTag,var) + " " + defaultGuiInfo(MLXMLElNames::enumWidgetTag,var) + " " + defaultGuiInfo(MLXMLElNames::meshWidgetTag,var) + " " + defaultGuiInfo(MLXMLElNames::shotWidgetTag,var) + " {data($a/@" + MLXMLElNames::filterName + ")}
{data(@name)}
/string()"; - //QString namesQuery = docMFIPluginFilterNameParam(fileName,filterName) + "/{data(@" + MLXMLElNames::paramName + ")}
/string()"; - - //in order to resolve the ordering problem - QString namesQuery = "for $a in " + docMFIPluginFilterNameParam(filevarname,filterName) + " return{data($a/@" + MLXMLElNames::paramName + ")}
/string()"; - - XMLMapList mplist; - try - { - QStringList nameList = query(namesQuery); - foreach(QString paramName,nameList) - { - MLXMLPluginInfo::XMLMap ss = filterParameterExtendedInfo(filterName,paramName); - mplist.push_back(ss); - } - return mplist; - } - catch (QueryException e) - { - qDebug("Caught a QueryException %s",e.what()); - } - assert(0); - return MLXMLPluginInfo::XMLMapList(); + QDomDocument qDom; + QFile qFile(this->fileName); + qDom.setContent(&qFile); + QDomNodeList nodelist = qDom.elementsByTagName(MLXMLElNames::filterTag); + XMLMapList mplist; + for(int i=0;i{data(@name)}
/string()"; +// //QString namesQuery = docMFIPluginFilterNameParam(fileName,filterName) + "/{data(@" + MLXMLElNames::paramName + ")}
/string()"; + +// //in order to resolve the ordering problem +// QString namesQuery = "for $a in " + docMFIPluginFilterNameParam(filevarname,filterName) + " return{data($a/@" + MLXMLElNames::paramName + ")}
/string()"; + +// XMLMapList mplist; +// try +// { +// QStringList nameList = query(namesQuery); +// foreach(QString paramName,nameList) +// { +// MLXMLPluginInfo::XMLMap ss = filterParameterExtendedInfo(filterName,paramName); +// mplist.push_back(ss); +// } +// return mplist; +// } +// catch (QueryException e) +// { +// qDebug("Caught a QueryException %s",e.what()); +// } +// assert(0); +// return MLXMLPluginInfo::XMLMapList(); +//} MLXMLPluginInfo::XMLMapList MLXMLPluginInfo::filterParameters( const QString& filterName) { @@ -252,124 +317,197 @@ MLXMLPluginInfo::XMLMapList MLXMLPluginInfo::filterParameters( const QString& fi MLXMLPluginInfo::XMLMapList MLXMLPluginInfo::mapListFromStringList( const QStringList& list ) { - XMLMapList result; - //"attribute0=value0|attribute1=value1|...|attributeN=valueN" "attribute0=value0|attribute1=value1|...|attributeN=valueN" "attribute0=value0|attribute1=value1|...|attributeN=valueN" - foreach(QString st, list) - { - MLXMLPluginInfo::XMLMap attrValue = mapFromString(st.trimmed()); - result.push_back(attrValue); - } - return result; + XMLMapList result; + //"attribute0=value0|attribute1=value1|...|attributeN=valueN" "attribute0=value0|attribute1=value1|...|attributeN=valueN" "attribute0=value0|attribute1=value1|...|attributeN=valueN" + foreach(QString st, list) + { + MLXMLPluginInfo::XMLMap attrValue = mapFromString(st.trimmed()); + result.push_back(attrValue); + } + return result; } MLXMLPluginInfo::XMLMap MLXMLPluginInfo::mapFromString(const QString& st,const QRegExp& extsep,const QRegExp& intsep) { - QStringList coupleList = st.split(extsep); - MLXMLPluginInfo::XMLMap attrValue; - foreach(QString couple,coupleList) - { - QStringList cl = couple.split(intsep); - if (cl.size() == 2) - attrValue[cl[0].trimmed()]=cl[1].trimmed(); - } - return attrValue; + QStringList coupleList = st.split(extsep); + MLXMLPluginInfo::XMLMap attrValue; + foreach(QString couple,coupleList) + { + QStringList cl = couple.split(intsep); + if (cl.size() == 2) + attrValue[cl[0].trimmed()]=cl[1].trimmed(); + } + return attrValue; } MLXMLPluginInfo::XMLMap MLXMLPluginInfo::filterParameterGui( const QString& filterName,const QString& parameterName) -{ - QString var("$gui"); - //QString totQuery("for " + var + " in doc(\"" + this->fileName + "\")/MESHLAB_FILTER_INTERFACE/PLUGIN/FILTER[@name = \"" + filterName + "\"]/PARAM[@name = \"" + parameterName + "\"]/(* except PARAM_HELP) return " + guiTypeSwitchQueryText(var)); - QString totQuery("for " + var + " in " + docMFIPluginFilterNameParamName(filevarname,filterName,parameterName) + "/(* except PARAM_HELP) return " + guiTypeSwitchQueryText(var)); - MLXMLPluginInfo::XMLMap mp; - try - { - QStringList res = query(totQuery); - MLXMLPluginInfo::XMLMapList tmp = mapListFromStringList(res); - //MUST BE FOR EACH PARAMETER ONLY ONE GUI DECLARATION - if (tmp.size() != 1) - throw ParsingException("In filter " + filterName + " more than a single GUI declaration has been found for parameter " + parameterName); - else if (res[0] == MLXMLPluginInfo::guiErrorMsg()) - //GUI NOT DEFINED - throw ParsingException("In filter " + filterName + " no valid GUI declaration has been found for parameter " + parameterName); - else return tmp[0]; - } - catch(QueryException e) - { +{ + + + + + QString var("$gui"); + //QString totQuery("for " + var + " in doc(\"" + this->fileName + "\")/MESHLAB_FILTER_INTERFACE/PLUGIN/FILTER[@name = \"" + filterName + "\"]/PARAM[@name = \"" + parameterName + "\"]/(* except PARAM_HELP) return " + guiTypeSwitchQueryText(var)); + QString totQuery("for " + var + " in " + docMFIPluginFilterNameParamName(filevarname,filterName,parameterName) + "/(* except PARAM_HELP) return " + guiTypeSwitchQueryText(var)); + try + { + QStringList res = query(totQuery); + MLXMLPluginInfo::XMLMapList tmp = mapListFromStringList(res); + //MUST BE FOR EACH PARAMETER ONLY ONE GUI DECLARATION + if (tmp.size() != 1) + throw ParsingException("In filter " + filterName + " more than a single GUI declaration has been found for parameter " + parameterName); + else if (res[0] == MLXMLPluginInfo::guiErrorMsg()) + //GUI NOT DEFINED + throw ParsingException("In filter " + filterName + " no valid GUI declaration has been found for parameter " + parameterName); + else return tmp[0]; + } + catch(QueryException e) + { qDebug("Caught a QueryException %s",e.what()); - } + } assert(0); return MLXMLPluginInfo::XMLMap(); } QString MLXMLPluginInfo::filterParameterHelp( const QString& filterName,const QString& paramName ) { - //QString namesQuery = "doc(\"" + this->fileName + "\")/MESHLAB_FILTER_INTERFACE/PLUGIN/FILTER[@name = \"" + filterName + "\"]/PARAM[@name = \"" + paramName + "\"]/PARAM_HELP/string()"; - QString namesQuery = docMFIPluginFilterNameParamName(filterName,filevarname,paramName) + "/" + MLXMLElNames::paramHelpTag + "/string()"; - try - { - QStringList res = query(namesQuery); - if (res.size() == 0) - throw ParsingException("Help section has not been defined for Parameter: " + paramName + " in filter: " + filterName); - return res[0]; - } - catch (QueryException e) - { + //QString namesQuery = "doc(\"" + this->fileName + "\")/MESHLAB_FILTER_INTERFACE/PLUGIN/FILTER[@name = \"" + filterName + "\"]/PARAM[@name = \"" + paramName + "\"]/PARAM_HELP/string()"; + QString namesQuery = docMFIPluginFilterNameParamName(filterName,filevarname,paramName) + "/" + MLXMLElNames::paramHelpTag + "/string()"; + try + { + QStringList res = query(namesQuery); + if (res.size() == 0) + throw ParsingException("Help section has not been defined for Parameter: " + paramName + " in filter: " + filterName); + return res[0]; + } + catch (QueryException e) + { qDebug("Caught a QueryException %s",e.what()); - } + } assert(0); return QString(); } QString MLXMLPluginInfo::filterParameterElement( const QString& filterName,const QString& paramName,const QString& elemName ) { - //QString namesQuery = "doc(\"" + this->fileName + "\")/MESHLAB_FILTER_INTERFACE/PLUGIN/FILTER[@name = \"" + filterName + "\"]/PARAM[@name = \"" + paramName + "\"]/PARAM_HELP/string()"; - QString namesQuery = docMFIPluginFilterNameParamName(filevarname,filterName,paramName) + "/" + elemName + "/string()"; - try - { - QStringList res = query(namesQuery); - if (res.size() == 0) - throw ParsingException(elemName + " section has not been defined for Parameter: " + paramName + " in filter: " + filterName); - return res[0]; - } - catch (QueryException e) - { - qDebug("Caught a QueryException %s",e.what()); - } - assert(0); - return QString(); + //QString namesQuery = "doc(\"" + this->fileName + "\")/MESHLAB_FILTER_INTERFACE/PLUGIN/FILTER[@name = \"" + filterName + "\"]/PARAM[@name = \"" + paramName + "\"]/PARAM_HELP/string()"; + QString namesQuery = docMFIPluginFilterNameParamName(filevarname,filterName,paramName) + "/" + elemName + "/string()"; + try + { + QStringList res = query(namesQuery); + if (res.size() == 0) + throw ParsingException(elemName + " section has not been defined for Parameter: " + paramName + " in filter: " + filterName); + return res[0]; + } + catch (QueryException e) + { + qDebug("Caught a QueryException %s",e.what()); + } + assert(0); + return QString(); } MLXMLPluginInfo::XMLMap MLXMLPluginInfo::filterParameterExtendedInfo( const QString& filterName,const QString& paramName ) { - //QString namesQuery = "for $x in doc(\"" + this->fileName + "\")/MESHLAB_FILTER_INTERFACE/PLUGIN/FILTER[@name=\"" + filterName + "\"]/PARAM[@name=\"" + paramName + "\"] returntype={data($x/@type)}|name={data($x/@name)}|defaultExpression={data($x/@defaultExpression)}|help={$x/PARAM_HELP}
/string()"; - QString namesQuery = "for $x in " + docMFIPluginFilterNameParamName(filevarname,filterName,paramName) + " return" + attrNameAttrVal(MLXMLElNames::paramType,"$x/") + externalSep() + attrNameAttrVal(MLXMLElNames::paramName,"$x/") + externalSep() + attrNameAttrVal(MLXMLElNames::paramDefExpr,"$x/") + externalSep() + attrNameAttrVal(MLXMLElNames::paramIsImportant,"$x/") + externalSep() + MLXMLElNames::paramHelpTag + "={$x/" + MLXMLElNames::paramHelpTag + "}
/string()"; - try - { - MLXMLPluginInfo::XMLMap res; - QStringList par = query(namesQuery); - if (par.size() == 0) - throw ParsingException("Parameter: " + paramName + " has not been defined in filter: " + filterName); - else - { - if (par.size() != 1) - throw ParsingException("Parameter: " + paramName + " in filter: " + filterName + " is not unique. Each parameter in the same filter must have a unique name."); - else - { - res = mapFromString(par[0]); - MLXMLPluginInfo::XMLMap tmpres = filterParameterGui(filterName,paramName); - for(MLXMLPluginInfo::XMLMap::const_iterator it = tmpres.constBegin();it != tmpres.constEnd();++it) - res[it.key()] = it.value(); - } - } - return res; - } - catch (QueryException e) - { - qDebug("Caught a QueryException %s",e.what()); - } - return MLXMLPluginInfo::XMLMap(); + QFile file(this->fileName); + QDomDocument doc; + doc.setContent(&file); + + QDomNodeList filterlist = doc.elementsByTagName(MLXMLElNames::filterTag); + if (filterlist.size() == 0) + throw ParsingException("No filters have been defined inside file " + fileName); + int ii = 0; + bool found = false; + while ((ii < filterlist.size()) && !found) + { + if (filterlist.at(ii).toElement().attribute(MLXMLElNames::filterName) == filterName) + found = true; + else + ++ii; + } + if (!found) + throw ParsingException("Filter: " +filterName + " has not been defined"); + + QDomNodeList paramlist = filterlist.at(ii).toElement().elementsByTagName(MLXMLElNames::paramTag); + bool paramfound = false; + int jj = 0; + while ((jj < paramlist.size()) && !paramfound) + { + if (paramlist.at(jj).toElement().attribute(MLXMLElNames::paramName) == paramName) + paramfound = true; + else + ++jj; + } + if (!paramfound) + throw ParsingException("Parameter: " + paramName + " has not been defined in filter: " + filterName); + + MLXMLPluginInfo::XMLMap map; + QDomElement paramnode = paramlist.at(jj).toElement(); + map[MLXMLElNames::paramType] = paramnode.attribute(MLXMLElNames::paramType); + map[MLXMLElNames::paramName] = paramnode.attribute(MLXMLElNames::paramName); + map[MLXMLElNames::paramDefExpr] = paramnode.attribute(MLXMLElNames::paramDefExpr); + map[MLXMLElNames::paramIsImportant] = paramnode.attribute(MLXMLElNames::paramIsImportant); + QDomNodeList phelpnode = paramnode.elementsByTagName(MLXMLElNames::paramHelpTag); + if (phelpnode.size() == 1) + map[MLXMLElNames::paramHelpTag] = phelpnode.at(0).firstChild().toCDATASection().data(); + else + throw ParsingException("In filter: " + filterName + " Parameter: " + paramName + " has not help section."); + + QStringList guitypelist; + MLXMLElNames::initMLXMLGUITypeList(guitypelist); + int zz = 0; + bool guitypefound = false; + while ((jj < guitypelist.size()) && !guitypefound) + { + QDomNodeList guinodelist = paramnode.elementsByTagName(guitypelist[zz]); + if (guinodelist.size() == 1) + { + map[MLXMLElNames::guiType] = guitypelist[zz]; + QDomElement guinode = guinodelist.at(0).toElement(); + map[MLXMLElNames::guiLabel] = guinode.attribute(MLXMLElNames::guiLabel); + map[MLXMLElNames::guiMinExpr] = guinode.attribute(MLXMLElNames::guiMinExpr); + map[MLXMLElNames::guiMaxExpr] = guinode.attribute(MLXMLElNames::guiMaxExpr); + guitypefound = true; + } + else + ++zz; + } + if (!guitypefound) + throw ParsingException("GUI info for Parameter: " + paramName + " have not been defined in filter: " + filterName); + return map; } +//MLXMLPluginInfo::XMLMap MLXMLPluginInfo::filterParameterExtendedInfo( const QString& filterName,const QString& paramName ) +//{ +// //QString namesQuery = "for $x in doc(\"" + this->fileName + "\")/MESHLAB_FILTER_INTERFACE/PLUGIN/FILTER[@name=\"" + filterName + "\"]/PARAM[@name=\"" + paramName + "\"] returntype={data($x/@type)}|name={data($x/@name)}|defaultExpression={data($x/@defaultExpression)}|help={$x/PARAM_HELP}
/string()"; +// QString namesQuery = "for $x in " + docMFIPluginFilterNameParamName(filevarname,filterName,paramName) + " return" + attrNameAttrVal(MLXMLElNames::paramType,"$x/") + externalSep() + attrNameAttrVal(MLXMLElNames::paramName,"$x/") + externalSep() + attrNameAttrVal(MLXMLElNames::paramDefExpr,"$x/") + externalSep() + attrNameAttrVal(MLXMLElNames::paramIsImportant,"$x/") + externalSep() + MLXMLElNames::paramHelpTag + "={$x/" + MLXMLElNames::paramHelpTag + "}
/string()"; +// try +// { +// MLXMLPluginInfo::XMLMap res; +// QStringList par = query(namesQuery); +// if (par.size() == 0) +// throw ParsingException("Parameter: " + paramName + " has not been defined in filter: " + filterName); +// else +// { +// if (par.size() != 1) +// throw ParsingException("Parameter: " + paramName + " in filter: " + filterName + " is not unique. Each parameter in the same filter must have a unique name."); +// else +// { +// res = mapFromString(par[0]); +// MLXMLPluginInfo::XMLMap tmpres = filterParameterGui(filterName,paramName); +// for(MLXMLPluginInfo::XMLMap::const_iterator it = tmpres.constBegin();it != tmpres.constEnd();++it) +// res[it.key()] = it.value(); +// } +// } +// return res; +// } +// catch (QueryException e) +// { +// qDebug("Caught a QueryException %s",e.what()); +// } +// return MLXMLPluginInfo::XMLMap(); +//} + //QMaptype={data(@type)}|name={data(@name)}|defaultExpression={data(@defaultExpression)}
/string()"; @@ -379,7 +517,7 @@ MLXMLPluginInfo::XMLMap MLXMLPluginInfo::filterParameterExtendedInfo( const QStr // QStringList par = query(namesQuery); // if (par.size() == 0) // throw ParsingException("Parameter: " + paramName + " has not been defined in filter: " + filterName); -// else +// else // { // if (par.size() != 1) // throw ParsingException("Parameter: " + paramName + " in filter: " + filterName + " is not unique. Each parameter in the same filter must have a unique name."); @@ -402,85 +540,94 @@ MLXMLPluginInfo::XMLMap MLXMLPluginInfo::filterParameterExtendedInfo( const QStr QString MLXMLPluginInfo::filterParameterAttribute( const QString& filterName,const QString& paramName,const QString& attribute ) { - //QString namesQuery = "doc(\"" + this->fileName + "\")/MESHLAB_FILTER_INTERFACE/PLUGIN/FILTER[@name = \"" + filterName + "\"]/PARAM[@name = \"" + paramName + "\"]/@" + attribute + "/string()"; - QString namesQuery = docMFIPluginFilterNameParamName(filevarname,filterName,paramName) + "/@" + attribute + "/string()"; - try - { - QStringList res = query(namesQuery); - if (res.size() != 1) - throw ParsingException("Attribute " + attribute + " has not been specified for parameter " + paramName + " in filter " + filterName); - return res[0]; - } - catch (QueryException e) - { + //QString namesQuery = "doc(\"" + this->fileName + "\")/MESHLAB_FILTER_INTERFACE/PLUGIN/FILTER[@name = \"" + filterName + "\"]/PARAM[@name = \"" + paramName + "\"]/@" + attribute + "/string()"; + QString namesQuery = docMFIPluginFilterNameParamName(filevarname,filterName,paramName) + "/@" + attribute + "/string()"; + try + { + QStringList res = query(namesQuery); + if (res.size() != 1) + throw ParsingException("Attribute " + attribute + " has not been specified for parameter " + paramName + " in filter " + filterName); + return res[0]; + } + catch (QueryException e) + { qDebug("Caught a QueryException %s",e.what()); - } + } assert(0); return QString(); } QString MLXMLPluginInfo::interfaceAttribute( const QString& attribute ) { - QString namesQuery = docMFI(filevarname) + "/" +attrVal(attribute)+"
/string()"; - try - { - QStringList res = query(namesQuery); - if (res.size() != 1) - throw ParsingException("Attribute " + attribute + " has not been specified for MeshLab XML Interface Info."); - return res[0]; - } - catch(QueryException e) - { - qDebug("Caught a QueryException %s",e.what()); - } + QString namesQuery = docMFI(filevarname) + "/" +attrVal(attribute)+"
/string()"; + try + { + QStringList res = query(namesQuery); + if (res.size() != 1) + throw ParsingException("Attribute " + attribute + " has not been specified for MeshLab XML Interface Info."); + return res[0]; + } + catch(QueryException e) + { + qDebug("Caught a QueryException %s",e.what()); + } - assert(0); - return QString(); + assert(0); + return QString(); } QString MLXMLPluginInfo::pluginAttribute(const QString& attribute ) { - QString namesQuery = docMFIPlugin(filevarname) + "/" +attrVal(attribute)+"
/string()"; - try - { - QStringList res = query(namesQuery); - if (res.size() != 1) - throw ParsingException("Attribute " + attribute + " has not been specified for plugin."); - return res[0]; - } - catch(QueryException e) - { - qDebug("Caught a QueryException %s",e.what()); - } + QString namesQuery = docMFIPlugin(filevarname) + "/" +attrVal(attribute)+"
/string()"; + try + { + QStringList res = query(namesQuery); + if (res.size() != 1) + throw ParsingException("Attribute " + attribute + " has not been specified for plugin."); + return res[0]; + } + catch(QueryException e) + { + qDebug("Caught a QueryException %s",e.what()); + } - assert(0); - return QString(); + assert(0); + return QString(); } QString MLXMLPluginInfo::pluginScriptName() { - QString namesQuery = docMFIPlugin(filevarname) + "/" +attrVal(MLXMLElNames::pluginScriptName)+"
/string()"; - try - { - QStringList res = query(namesQuery); - if (res.size() != 1) - throw ParsingException("Attribute " + MLXMLElNames::pluginScriptName + " has not been specified for plugin."); - return res[0]; - } - catch(QueryException e) - { - qDebug("Caught a QueryException %s",e.what()); - } + QDomDocument qDom; + QFile qFile(this->fileName); + qDom.setContent(&qFile); + QDomNodeList nodelist = qDom.elementsByTagName(MLXMLElNames::pluginTag); + if(nodelist.size()!=1) + throw ParsingException("Attribute " + MLXMLElNames::pluginScriptName + " has not been specified for plugin."); + return nodelist.at(0).toElement().attribute(MLXMLElNames::pluginScriptName); - assert(0); - return QString(); + +// QString namesQuery = docMFIPlugin(filevarname) + "/" +attrVal(MLXMLElNames::pluginScriptName)+"
/string()"; +// try +// { +// QStringList res = query(namesQuery); +// if (res.size() != 1) +// throw ParsingException("Attribute " + MLXMLElNames::pluginScriptName + " has not been specified for plugin."); +// return res[0]; +// } +// catch(QueryException e) +// { +// qDebug("Caught a QueryException %s",e.what()); +// } + +// assert(0); +// return QString(); } void MLXMLPluginInfo::destroyXMLPluginInfo( MLXMLPluginInfo* plug ) { - delete plug; + delete plug; } MLXMLPluginInfo::MLXMLPluginInfo( const QString& file ) @@ -494,423 +641,439 @@ MLXMLPluginInfo::~MLXMLPluginInfo() QString MLXMLPluginInfo::filterScriptCode( const QString& filterName ) { - QString namesQuery = docMFIPluginFilterName(filevarname,filterName) + "/" + MLXMLElNames::filterJSCodeTag + "/string()"; - try - { - QStringList res = query(namesQuery); - if (res.size() == 0) - return QString(); - return res[0]; - } - catch (QueryException e) - { - qDebug("Caught a QueryException %s",e.what()); - } - assert(0); - return QString(); + QDomDocument qDom; + QFile qFile(this->fileName); + qDom.setContent(&qFile); + QDomNodeList nodelist = qDom.elementsByTagName(MLXMLElNames::filterTag); + + for(int i=0;i