return false;
}
+bool findVariable(const DocumentPtr& theDocument, const std::string& theName,
+ double& outValue, ResultParameterPtr& theParam)
+{
+ ObjectPtr aParamObj = theDocument->objectByName(ModelAPI_ResultParameter::group(), theName);
+ theParam = std::dynamic_pointer_cast<ModelAPI_ResultParameter>(aParamObj);
+ if (!theParam.get())
+ return false;
+ AttributeDoublePtr aValueAttribute = theParam->data()->real(ModelAPI_ResultParameter::VALUE());
+ outValue = aValueAttribute->value();
+ return true;
+}
+
static std::map<int, std::vector<int> > myColorMap;
void appendValues(std::vector<int>& theRGB, const int theRed, const int theGreen, const int theBlue)
MODELAPI_EXPORT bool findVariable(const std::string& theName, double& outValue,
ResultParameterPtr& theParam);
+/*!
+ * Searches for variable with name \param theName in the document.
+ * If found, set it value in the \param outValue and returns true.
+ */
+MODELAPI_EXPORT bool findVariable(const DocumentPtr& theDocument, const std::string& theName,
+ double& outValue, ResultParameterPtr& theParam);
+
/*!
* Returns the values of the next random color. The values are in range [0, 255]
* \param theValues a container of component of RGB value: red, green, blue
void ParametersPlugin_Parameter::attributeChanged(const std::string& theID)
{
- if (theID == EXPRESSION_ID()) { // recompute only on change of the expression
- ResultParameterPtr aParam = document()->createParameter(data());
-
- std::string anExpression = string(EXPRESSION_ID())->value();
- if(anExpression.empty()) {
- // clear error/result if the expression is empty
- setError("", false);
- return;
- }
- std::string outErrorMessage;
- double aValue = evaluate(anExpression, outErrorMessage);
- // Name
- std::string aName = string(VARIABLE_ID())->value();
- std::ostringstream sstream;
- sstream << aValue;
- std::string aParamValue = sstream.str();
- data()->setName(aName);
- aParam->data()->setName(aName);
- // Error
- if (!outErrorMessage.empty()) {
- std::string aStateMsg("Error: " + outErrorMessage);
- data()->execState(ModelAPI_StateExecFailed);
- setError(aStateMsg, false);
- } else {
- static const std::string anEmptyMsg(""); // it is checked in the validator by the empty message
- setError(anEmptyMsg, false);
- data()->execState(ModelAPI_StateDone);
- }
- // Value
- AttributeDoublePtr aValueAttribute = aParam->data()->real(ModelAPI_ResultParameter::VALUE());
- aValueAttribute->setValue(aValue);
- setResult(aParam);
+ if (theID == EXPRESSION_ID())
+ updateExpression();
+}
+
+void ParametersPlugin_Parameter::updateName()
+{
+ std::string aName = string(VARIABLE_ID())->value();
+ data()->setName(aName);
+
+ ResultParameterPtr aParam = document()->createParameter(data());
+ aParam->data()->setName(aName);
+ setResult(aParam);
+}
+
+void ParametersPlugin_Parameter::updateExpression()
+{
+ std::string anExpression = string(EXPRESSION_ID())->value();
+ if(anExpression.empty()) {
+ // clear error/result if the expression is empty
+ setError("", false);
+ return;
}
+ std::string outErrorMessage;
+ double aValue = evaluate(anExpression, outErrorMessage);
+ std::ostringstream sstream;
+ sstream << aValue;
+ std::string aParamValue = sstream.str();
+ // Error
+ if (!outErrorMessage.empty()) {
+ std::string aStateMsg("Error: " + outErrorMessage);
+ data()->execState(ModelAPI_StateExecFailed);
+ setError(aStateMsg, false);
+ } else {
+ static const std::string anEmptyMsg(""); // it is checked in the validator by the empty message
+ setError(anEmptyMsg, false);
+ data()->execState(ModelAPI_StateDone);
+ }
+
+ ResultParameterPtr aParam = document()->createParameter(data());
+ AttributeDoublePtr aValueAttribute = aParam->data()->real(ModelAPI_ResultParameter::VALUE());
+ aValueAttribute->setValue(aValue);
+ setResult(aParam);
}
void ParametersPlugin_Parameter::execute()
{
- // just call recompute
- attributeChanged(EXPRESSION_ID());
+ updateName();
+ updateExpression();
}
double ParametersPlugin_Parameter::evaluate(const std::string& theExpression, std::string& theError)
{
-
std::list<std::string> anExprParams = myInterp->compile(theExpression);
// find expression's params in the model
std::list<std::string> aContext;
protected:
double evaluate(const std::string& theExpression, std::string& theError);
+ void updateName();
+ void updateExpression();
private:
std::shared_ptr<ParametersPlugin_PyInterp> myInterp;
#include <ModelAPI_Data.h>
#include <ModelAPI_Session.h>
#include <ModelAPI_Document.h>
+#include <ModelAPI_Tools.h>
#include <ModuleBase_Tools.h>
#include <ModuleBase_IDocumentDataModel.h>
#include <QMouseEvent>
#include <QAction>
#include <QStyledItemDelegate>
-
+#include <QMessageBox>
/// Width of second column (minimum acceptable = 27)
#define SECOND_COL_WIDTH 30
{
QLineEdit* aEditor = dynamic_cast<QLineEdit*>(theEditor);
if (aEditor) {
- QString aRes = aEditor->text();
+ QString aName = aEditor->text();
QModelIndexList aIndexList = selectionModel()->selectedIndexes();
ModuleBase_IDocumentDataModel* aModel = dataModel();
ObjectPtr aObj = aModel->object(aIndexList.first());
SessionPtr aMgr = ModelAPI_Session::get();
aMgr->startOperation("Rename");
- aObj->data()->setName(qPrintable(aRes));
+
+ if (!canRename(aObj, aName)) {
+ aMgr->abortOperation();
+ return;
+ }
+
+ aObj->data()->setName(qPrintable(aName));
aMgr->finishOperation();
}
}
+bool XGUI_DataTree::canRename(const ObjectPtr& theObject, const QString& theName)
+{
+ double aValue;
+ ResultParameterPtr aParam;
+
+ bool isVariableFound = ModelAPI_Tools::findVariable(theObject->document(), qPrintable(theName), aValue, aParam);
+
+ if (isVariableFound)
+ QMessageBox::information(this, tr("Rename parameter"),
+ QString(tr("Selected parameter can not be renamed to: %1. \
+There is a parameter with the same name. Its value is: %2.")).arg(qPrintable(theName)).arg(aValue));
+
+ return !isVariableFound;
+}
+
void XGUI_DataTree::clear()
{
ModuleBase_IDocumentDataModel* aModel = dataModel();
/// Commit modified data (used for renaming of objects)
virtual void commitData(QWidget* theEditor);
+ /// Returns true if theObject can be renamed in theName
+ bool canRename(const ObjectPtr& theObject, const QString& theName);
+
protected:
/// Redefinition of virtual method
virtual void contextMenuEvent(QContextMenuEvent* theEvent);