Skip to content

Commit

Permalink
Better management of filterscript, removed unuseful pointers
Browse files Browse the repository at this point in the history
  • Loading branch information
alemuntoni committed Aug 27, 2020
1 parent 59e1a52 commit 3d98ec3
Show file tree
Hide file tree
Showing 6 changed files with 107 additions and 126 deletions.
126 changes: 57 additions & 69 deletions src/common/filterscript.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<FilterNameParameterValuesPair*>(*ii);
QDomElement tag = doc.createElement("filter");
QPair<QString,RichParameterList>& 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<QString,RichParameterList>& 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;
}
25 changes: 10 additions & 15 deletions src/common/filterscript.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 <filtername, parameters>
*/

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 <filtername, parameters>
*/
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
48 changes: 24 additions & 24 deletions src/meshlab/filterScriptDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -68,7 +68,7 @@ void FilterScriptDialog::applyScript()
void FilterScriptDialog::clearScript()
{
assert(scriptPtr);
scriptPtr->filtparlist.clear();
scriptPtr->clear();
ui->scriptListWidget->clear();
}

Expand Down Expand Up @@ -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.");

Expand All @@ -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.");

Expand All @@ -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.");
Expand All @@ -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()
Expand All @@ -199,8 +199,8 @@ void FilterScriptDialog::editOldParameters( const int row )
return;
QString actionName = ui->scriptListWidget->currentItem()->text();

FilterNameParameterValuesPair* old = reinterpret_cast<FilterNameParameterValuesPair*>(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<MainWindow*>(parentWidget());

Expand Down Expand Up @@ -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;
}
}
17 changes: 8 additions & 9 deletions src/meshlab/mainwindow_RunTime.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand All @@ -789,8 +789,7 @@ void MainWindow::runFilterScript()
if (meshDoc()->mm() != NULL)
meshDoc()->mm()->updateDataMask(req);
iFilter->setLog(&meshDoc()->Log);
FilterNameParameterValuesPair* old = reinterpret_cast<FilterNameParameterValuesPair*>(*ii);
RichParameterList &parameterSet = old->pair.second;
RichParameterList &parameterSet = pair.second;

for(RichParameter& parameter : parameterSet) {
//if this is a mesh parameter and the index is valid
Expand Down Expand Up @@ -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<CMeshO>::CompactEveryVector(mm->cm);
meshDoc()->setBusy(false);
Expand Down Expand Up @@ -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();
}
Expand Down Expand Up @@ -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);
}
}

Expand Down
6 changes: 3 additions & 3 deletions src/meshlab/ml_std_par_dialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Loading

0 comments on commit 3d98ec3

Please sign in to comment.