Files
create/src/App/ExpressionVisitors.h

129 lines
4.9 KiB
C++

/***************************************************************************
* Copyright (c) Eivind Kvedalen (eivind@kvedalen.name) 2016 *
* *
* This file is part of the FreeCAD CAx development system. *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; see the file COPYING.LIB. If not, *
* write to the Free Software Foundation, Inc., 59 Temple Place, *
* Suite 330, Boston, MA 02111-1307, USA *
* *
***************************************************************************/
#ifndef RENAMEOBJECTIDENTIFIEREXPRESSIONVISITOR_H
#define RENAMEOBJECTIDENTIFIEREXPRESSIONVISITOR_H
#include <Base/BaseClass.h>
#include "Expression.h"
namespace App {
/**
* @brief The RenameObjectIdentifierExpressionVisitor class is a functor used to visit each node of an expression, and
* possibly rename VariableExpression nodes.
*/
template<class P> class RenameObjectIdentifierExpressionVisitor : public ExpressionModifier<P> {
public:
RenameObjectIdentifierExpressionVisitor(P & _prop,
const std::map<ObjectIdentifier, ObjectIdentifier> &_paths, const ObjectIdentifier & _owner)
: ExpressionModifier<P>(_prop)
, paths(_paths)
, owner(_owner)
{
}
void visit(Expression *node) {
VariableExpression *expr = Base::freecad_dynamic_cast<VariableExpression>(node);
if (expr) {
const App::ObjectIdentifier & oldPath = expr->getPath().canonicalPath();
const std::map<ObjectIdentifier, ObjectIdentifier>::const_iterator it = paths.find(oldPath);
if (it != paths.end()) {
ExpressionModifier<P>::setExpressionChanged();
expr->setPath(it->second.relativeTo(owner));
}
}
}
private:
const std::map<ObjectIdentifier, ObjectIdentifier> &paths; /**< Map with current and new object identifiers */
const ObjectIdentifier owner; /**< Owner of expression */
};
/**
* @brief The RelabelDocumentObjectExpressionVisitor class is a functor class used to rename variables in an expression.
*/
template<class P> class RelabelDocumentObjectExpressionVisitor : public ExpressionModifier<P> {
public:
RelabelDocumentObjectExpressionVisitor(P & _prop, const std::string & _oldName, const std::string & _newName)
: ExpressionModifier<P>(_prop)
, oldName(_oldName)
, newName(_newName)
{
}
~RelabelDocumentObjectExpressionVisitor() {
}
/**
* @brief Visit each node in the expression, and if it is a VariableExpression object, incoke renameDocumentObject in it.
* @param node Node to visit
*/
void visit(Expression * node) {
VariableExpression *expr = Base::freecad_dynamic_cast<VariableExpression>(node);
if (expr && expr->validDocumentObjectRename(oldName, newName)) {
ExpressionModifier<P>::setExpressionChanged();
expr->renameDocumentObject(oldName, newName);
}
}
private:
std::string oldName; /**< Document object name to replace */
std::string newName; /**< New document object name */
};
template<class P> class RelabelDocumentExpressionVisitor : public ExpressionModifier<P> {
public:
RelabelDocumentExpressionVisitor(P & prop, const std::string & _oldName, const std::string & _newName)
: ExpressionModifier<P>(prop)
, oldName(_oldName)
, newName(_newName)
{
}
void visit(Expression * node) {
VariableExpression *expr = Base::freecad_dynamic_cast<VariableExpression>(node);
if (expr && expr->validDocumentRename(oldName, newName)) {
ExpressionModifier<P>::setExpressionChanged();
expr->renameDocument(oldName, newName);
}
}
private:
std::string oldName;
std::string newName;
};
}
#endif // RENAMEOBJECTIDENTIFIEREXPRESSIONVISITOR_H