From 3d98ec3a708379f84425ae10b3b6ba131d482577 Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Thu, 27 Aug 2020 14:32:38 +0200 Subject: [PATCH] Better management of filterscript, removed unuseful pointers --- src/common/filterscript.cpp | 126 +++++++++++++---------------- src/common/filterscript.h | 25 +++--- src/meshlab/filterScriptDialog.cpp | 48 +++++------ src/meshlab/mainwindow_RunTime.cpp | 17 ++-- src/meshlab/ml_std_par_dialog.cpp | 6 +- src/meshlabserver/mainserver.cpp | 11 ++- 6 files changed, 107 insertions(+), 126 deletions(-) diff --git a/src/common/filterscript.cpp b/src/common/filterscript.cpp index 8dc31306ab..1f31d77843 100644 --- a/src/common/filterscript.cpp +++ b/src/common/filterscript.cpp @@ -35,93 +35,81 @@ using namespace vcg; -FilterScript::FilterScript() :QObject() +FilterScript::FilterScript() : QObject(), QList< FilterNameParameterValuesPair >() { - } FilterScript::~FilterScript() { - for(FilterScript::iterator it = filtparlist.begin();it != filtparlist.end();++it) - delete *it; - filtparlist.clear(); } -QDomDocument FilterScript::xmlDoc() +QDomDocument FilterScript::xmlDoc() const { - QDomDocument doc("FilterScript"); - QDomElement root = doc.createElement("FilterScript"); - doc.appendChild(root); + QDomDocument doc("FilterScript"); + QDomElement root = doc.createElement("FilterScript"); + doc.appendChild(root); - for(FilterScript::iterator ii=filtparlist.begin();ii!= filtparlist.end();++ii) - { - FilterNameParameterValuesPair* oldpv = reinterpret_cast(*ii); - QDomElement tag = doc.createElement("filter"); - QPair& pair = oldpv->pair; - tag.setAttribute(QString("name"),pair.first); - RichParameterList &par=pair.second; + for(const FilterNameParameterValuesPair& oldpv : *this) { + QDomElement tag = doc.createElement("filter"); + const QPair& pair = oldpv; + tag.setAttribute(QString("name"),pair.first); + const RichParameterList &par=pair.second; for(const RichParameter& rp : par) { tag.appendChild(rp.fillToXMLDocument(doc)); - } - root.appendChild(tag); - } - return doc; + } + root.appendChild(tag); + } + return doc; } -bool FilterScript::save(QString filename) +bool FilterScript::save(QString filename) const { - QDomDocument doc = xmlDoc(); - QFile file(filename); - file.open(QIODevice::WriteOnly); - QTextStream qstream(&file); - doc.save(qstream,1); - file.close(); - return true; + QDomDocument doc = xmlDoc(); + QFile file(filename); + file.open(QIODevice::WriteOnly); + QTextStream qstream(&file); + doc.save(qstream,1); + file.close(); + return true; } bool FilterScript::open(QString filename) { - QDomDocument doc; - filtparlist.clear(); - QFile file(filename); - if (!file.open(QIODevice::ReadOnly)) - { - qDebug("Failure in opening Script %s", qUtf8Printable(filename)); - qDebug("Current dir is %s", qUtf8Printable(QDir::currentPath())); - return false; - } - QString errorMsg; int errorLine,errorColumn; - if(!doc.setContent(&file,false,&errorMsg,&errorLine,&errorColumn)) - { - qDebug("Failure in setting Content line %i column %i \nError'%s'",errorLine,errorColumn, qUtf8Printable(errorMsg)); - return false; - } - file.close(); - QDomElement root = doc.documentElement(); - if(root.nodeName() != "FilterScript") - { - qDebug("Failure in parsing script %s\nNo root node with name FilterScript\n", qUtf8Printable(filename)); - qDebug("Current rootname is %s", qUtf8Printable(root.nodeName())); - return false; - } + QDomDocument doc; + clear(); + QFile file(filename); + if (!file.open(QIODevice::ReadOnly)) { + qDebug("Failure in opening Script %s", qUtf8Printable(filename)); + qDebug("Current dir is %s", qUtf8Printable(QDir::currentPath())); + return false; + } + QString errorMsg; int errorLine,errorColumn; + if(!doc.setContent(&file,false,&errorMsg,&errorLine,&errorColumn)) { + qDebug("Failure in setting Content line %i column %i \nError'%s'",errorLine,errorColumn, qUtf8Printable(errorMsg)); + return false; + } + file.close(); + QDomElement root = doc.documentElement(); + if(root.nodeName() != "FilterScript") { + qDebug("Failure in parsing script %s\nNo root node with name FilterScript\n", qUtf8Printable(filename)); + qDebug("Current rootname is %s", qUtf8Printable(root.nodeName())); + return false; + } - qDebug("FilterScript"); - for(QDomElement nf = root.firstChildElement(); !nf.isNull(); nf = nf.nextSiblingElement()) - { - if (nf.tagName() == QString("filter")) - { - RichParameterList par; - QString name=nf.attribute("name"); - qDebug("Reading filter with name %s", qUtf8Printable(name)); - for(QDomElement np = nf.firstChildElement("Param"); !np.isNull(); np = np.nextSiblingElement("Param")) - { - par.pushFromQDomElement(np); - } - FilterNameParameterValuesPair* tmp = new FilterNameParameterValuesPair(); - tmp->pair = qMakePair(name,par); - filtparlist.append(tmp); - } - } + qDebug("FilterScript"); + for(QDomElement nf = root.firstChildElement(); !nf.isNull(); nf = nf.nextSiblingElement()) { + if (nf.tagName() == QString("filter")) { + RichParameterList par; + QString name=nf.attribute("name"); + qDebug("Reading filter with name %s", qUtf8Printable(name)); + for(QDomElement np = nf.firstChildElement("Param"); !np.isNull(); np = np.nextSiblingElement("Param")) { + par.pushFromQDomElement(np); + } + FilterNameParameterValuesPair tmp; + tmp.first = name; tmp.second = par; + append(tmp); + } + } - return true; + return true; } diff --git a/src/common/filterscript.h b/src/common/filterscript.h index a874aef6a2..ccddac72f2 100644 --- a/src/common/filterscript.h +++ b/src/common/filterscript.h @@ -32,32 +32,27 @@ class QDomElement; -class FilterNameParameterValuesPair +class FilterNameParameterValuesPair : public QPair< QString, RichParameterList > { public: - virtual QString filterName() const { return pair.first; } + virtual QString filterName() const { return first; } virtual ~FilterNameParameterValuesPair() {} - QPair< QString, RichParameterList > pair; }; -/* -The filterscipt class abstract the concept of history of processing. -It is simply a list of all the performed actions -Each action is a pair -*/ - -class FilterScript : public QObject +/** + * The filterscipt class abstract the concept of history of processing. + * It is simply a list of all the performed actions + * Each action is a pair + */ +class FilterScript : public QObject, public QList< FilterNameParameterValuesPair > { Q_OBJECT public: FilterScript(); ~FilterScript(); bool open(QString filename); - bool save(QString filename); - QDomDocument xmlDoc(); - - QList< FilterNameParameterValuesPair* > filtparlist; - typedef QList< FilterNameParameterValuesPair* >::iterator iterator; + bool save(QString filename) const; + QDomDocument xmlDoc() const; }; #endif diff --git a/src/meshlab/filterScriptDialog.cpp b/src/meshlab/filterScriptDialog.cpp index 916868a584..fd4b3fbfd5 100644 --- a/src/meshlab/filterScriptDialog.cpp +++ b/src/meshlab/filterScriptDialog.cpp @@ -50,8 +50,8 @@ void FilterScriptDialog::setScript(FilterScript *scr) scriptPtr=scr; ui->scriptListWidget->clear(); - for( FilterScript::iterator li=scr->filtparlist.begin();li!=scr->filtparlist.end() ;++li) - ui->scriptListWidget->addItem((*li)->filterName()); + for (const FilterNameParameterValuesPair& pair : *scr) + ui->scriptListWidget->addItem(pair.filterName()); } void FilterScriptDialog::applyScript() @@ -68,7 +68,7 @@ void FilterScriptDialog::applyScript() void FilterScriptDialog::clearScript() { assert(scriptPtr); - scriptPtr->filtparlist.clear(); + scriptPtr->clear(); ui->scriptListWidget->clear(); } @@ -115,10 +115,10 @@ void FilterScriptDialog::moveSelectedFilterUp() return; //move item up in list - FilterNameParameterValuesPair* pair = scriptPtr->filtparlist.takeAt(currentRow); + FilterNameParameterValuesPair pair = scriptPtr->takeAt(currentRow); QString filtername = ui->scriptListWidget->currentItem()->text(); - if (pair->filterName() == filtername) - scriptPtr->filtparlist.insert(currentRow-1, pair); + if (pair.filterName() == filtername) + scriptPtr->insert(currentRow-1, pair); else throw MLException("Something bad happened: A filter item has been selected in filterScriptDialog being NOT a XML filter or old-fashioned c++ filter."); @@ -133,14 +133,14 @@ void FilterScriptDialog::moveSelectedFilterUp() void FilterScriptDialog::moveSelectedFilterDown() { int currentRow = ui->scriptListWidget->currentRow(); - if ((currentRow == -1) || (currentRow == scriptPtr->filtparlist.size() - 1)) + if ((currentRow == -1) || (currentRow == scriptPtr->size() - 1)) return; //move item up in list - FilterNameParameterValuesPair* pair = scriptPtr->filtparlist.takeAt(currentRow); + FilterNameParameterValuesPair pair = scriptPtr->takeAt(currentRow); QString filtername = ui->scriptListWidget->currentItem()->text(); - if (pair->filterName() == filtername) - scriptPtr->filtparlist.insert(currentRow+1, pair); + if (pair.filterName() == filtername) + scriptPtr->insert(currentRow+1, pair); else throw MLException("Something bad happened: A filter item has been selected in filterScriptDialog being NOT a XML filter or old-fashioned c++ filter."); @@ -158,12 +158,12 @@ void FilterScriptDialog::removeSelectedFilter() if(currentRow == -1) return; - FilterNameParameterValuesPair* pair = scriptPtr->filtparlist[currentRow]; + const FilterNameParameterValuesPair& pair = (*scriptPtr)[currentRow]; QString filtername = ui->scriptListWidget->currentItem()->text(); - if (pair->filterName() == filtername) + if (pair.filterName() == filtername) { ui->scriptListWidget->takeItem(currentRow); - scriptPtr->filtparlist.removeAt(currentRow); + scriptPtr->removeAt(currentRow); } else throw MLException("Something bad happened: A filter item has been selected in filterScriptDialog being NOT a XML filter or old-fashioned c++ filter."); @@ -172,20 +172,20 @@ void FilterScriptDialog::removeSelectedFilter() void FilterScriptDialog::editSelectedFilterParameters() { //get the selected item - int currentRow = ui->scriptListWidget->currentRow(); + int currentRow = ui->scriptListWidget->currentRow(); //return if no row was selected if(currentRow == -1) return; QString filtername = ui->scriptListWidget->currentItem()->text(); - FilterNameParameterValuesPair* pair = scriptPtr->filtparlist.at(currentRow); - if (pair->filterName() == filtername) { - editOldParameters(currentRow); - } - else { - throw MLException("Something bad happened: A filter item has been selected in filterScriptDialog being NOT a XML filter or old-fashioned c++ filter."); - } + const FilterNameParameterValuesPair& pair = scriptPtr->at(currentRow); + if (pair.filterName() == filtername) { + editOldParameters(currentRow); + } + else { + throw MLException("Something bad happened: A filter item has been selected in filterScriptDialog being NOT a XML filter or old-fashioned c++ filter."); + } } FilterScriptDialog::~FilterScriptDialog() @@ -199,8 +199,8 @@ void FilterScriptDialog::editOldParameters( const int row ) return; QString actionName = ui->scriptListWidget->currentItem()->text(); - FilterNameParameterValuesPair* old = reinterpret_cast(scriptPtr->filtparlist.at(row)); - RichParameterList oldParameterSet = old->pair.second; + FilterNameParameterValuesPair& old = (*scriptPtr)[row]; + RichParameterList oldParameterSet = old.second; //get the main window MainWindow *mainWindow = qobject_cast(parentWidget()); @@ -238,6 +238,6 @@ void FilterScriptDialog::editOldParameters( const int row ) int result = parameterDialog.exec(); if(result == QDialog::Accepted) { //keep the changes - old->pair.second = newParameterSet; + old.second = newParameterSet; } } diff --git a/src/meshlab/mainwindow_RunTime.cpp b/src/meshlab/mainwindow_RunTime.cpp index 9c9db9e2dd..784bcbf6ca 100644 --- a/src/meshlab/mainwindow_RunTime.cpp +++ b/src/meshlab/mainwindow_RunTime.cpp @@ -777,9 +777,9 @@ void MainWindow::runFilterScript() { if ((meshDoc() == nullptr) || (meshDoc()->filterHistory == nullptr)) return; - for(FilterScript::iterator ii= meshDoc()->filterHistory->filtparlist.begin();ii!= meshDoc()->filterHistory->filtparlist.end();++ii) + for (FilterNameParameterValuesPair& pair : *meshDoc()->filterHistory) { - QString filtnm = (*ii)->filterName(); + QString filtnm = pair.filterName(); int classes = 0; int postCondMask = 0; QAction *action = PM.actionFilterMap[ filtnm]; @@ -789,8 +789,7 @@ void MainWindow::runFilterScript() if (meshDoc()->mm() != NULL) meshDoc()->mm()->updateDataMask(req); iFilter->setLog(&meshDoc()->Log); - FilterNameParameterValuesPair* old = reinterpret_cast(*ii); - RichParameterList ¶meterSet = old->pair.second; + RichParameterList ¶meterSet = pair.second; for(RichParameter& parameter : parameterSet) { //if this is a mesh parameter and the index is valid @@ -854,7 +853,7 @@ void MainWindow::runFilterScript() meshDoc()->setBusy(true); //WARNING!!!!!!!!!!!! /* to be changed */ - iFilter->applyFilter( action, *meshDoc(), old->pair.second, QCallBack ); + iFilter->applyFilter( action, *meshDoc(), pair.second, QCallBack ); for (MeshModel* mm = meshDoc()->nextMesh(); mm != NULL; mm = meshDoc()->nextMesh(mm)) vcg::tri::Allocator::CompactEveryVector(mm->cm); meshDoc()->setBusy(false); @@ -893,7 +892,7 @@ void MainWindow::runFilterScript() qb->reset(); GLA()->update(); - GLA()->Logf(GLLogStream::SYSTEM,"Re-Applied filter %s",qUtf8Printable((*ii)->filterName())); + GLA()->Logf(GLLogStream::SYSTEM,"Re-Applied filter %s",qUtf8Printable(pair.filterName())); if (_currviewcontainer != NULL) _currviewcontainer->updateAllDecoratorsForAllViewers(); } @@ -969,9 +968,9 @@ void MainWindow::startFilter() executeFilter(action, dummyParSet, false); //Insert the filter to filterHistory - FilterNameParameterValuesPair* tmp = new FilterNameParameterValuesPair(); - tmp->pair = qMakePair(action->text(), dummyParSet); - meshDoc()->filterHistory->filtparlist.append(tmp); + FilterNameParameterValuesPair tmp; + tmp.first = action->text(); tmp.second = dummyParSet; + meshDoc()->filterHistory->append(tmp); } } diff --git a/src/meshlab/ml_std_par_dialog.cpp b/src/meshlab/ml_std_par_dialog.cpp index d19d8baf3a..1eb5ec2aa9 100644 --- a/src/meshlab/ml_std_par_dialog.cpp +++ b/src/meshlab/ml_std_par_dialog.cpp @@ -198,9 +198,9 @@ void MeshlabStdDialog::applyClick() //we don't need to reapply the filter to the mesh if ((q != nullptr) && (curMeshDoc != nullptr) && (curMeshDoc->filterHistory != nullptr)) { - FilterNameParameterValuesPair* oldpair = new FilterNameParameterValuesPair(); - oldpair->pair = qMakePair(q->text(), curParSet); - curMeshDoc->filterHistory->filtparlist.append(oldpair); + FilterNameParameterValuesPair oldpair; + oldpair.first = q->text(); oldpair.second = curParSet; + curMeshDoc->filterHistory->append(oldpair); } bool isEqual = (curParSet == prevParSet); diff --git a/src/meshlabserver/mainserver.cpp b/src/meshlabserver/mainserver.cpp index b0797cc313..90e70d98e9 100644 --- a/src/meshlabserver/mainserver.cpp +++ b/src/meshlabserver/mainserver.cpp @@ -570,13 +570,13 @@ class MeshLabServer printf("File %s was not found.\n", qUtf8Printable(scriptfile)); return false; } - fprintf(fp,"Starting Script of %i actions",scriptPtr.filtparlist.size()); + fprintf(fp,"Starting Script of %i actions",scriptPtr.size()); GLLogStream log; - for(FilterScript::iterator ii = scriptPtr.filtparlist.begin();ii!= scriptPtr.filtparlist.end();++ii) + for (FilterNameParameterValuesPair& pair : scriptPtr) { bool ret = false; //RichParameterSet &par = (*ii).second; - QString fname = (*ii)->filterName(); + QString fname = pair.filterName(); fprintf(fp,"filter: %s\n", qUtf8Printable(fname)); QAction *action = PM.actionFilterMap[ fname]; if (action == NULL) @@ -597,8 +597,7 @@ class MeshLabServer //defined in the script file. RichParameterList required; iFilter->initParameterSet(action,meshDocument,required); - FilterNameParameterValuesPair* pairold = reinterpret_cast(*ii); - RichParameterList ¶meterSet = pairold->pair.second; + RichParameterList ¶meterSet = pair.second; //The parameters in the script file are more than the required parameters of the filter. The script file is not correct. if (required.size() < parameterSet.size()) @@ -682,7 +681,7 @@ class MeshLabServer } } meshDocument.setBusy(true); - ret = iFilter->applyFilter( action, meshDocument, pairold->pair.second, filterCallBack); + ret = iFilter->applyFilter( action, meshDocument, pair.second, filterCallBack); meshDocument.setBusy(false); if (shared != NULL) delete iFilter->glContext;