]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
[bos #26444] [EDF] (2021) SHAPER: Improve treatment of parameters
authorAlexey Kondratyev <alexey.kondratyev@opencascade.com>
Thu, 14 Oct 2021 09:56:51 +0000 (12:56 +0300)
committerAlexey Kondratyev <alexey.kondratyev@opencascade.com>
Fri, 29 Oct 2021 06:46:01 +0000 (09:46 +0300)
Add fixes.

12 files changed:
src/InitializationPlugin/InitializationPlugin_EvalListener.cpp
src/ModelAPI/ModelAPI_Events.cpp
src/ModelAPI/ModelAPI_Events.h
src/ParametersPlugin/CMakeLists.txt
src/ParametersPlugin/ParametersPlugin_WidgetParamsMgr.cpp
src/ParametersPlugin/Test/TestImportParameters.py [new file with mode: 0644]
src/ParametersPlugin/Test/TestParameterCreationError.py
src/ParametersPlugin/data/parameters.txt [new file with mode: 0644]
src/ParametersPlugin/doc/TUI_parameterFeature.rst
src/ParametersPlugin/doc/examples/File.txt
src/PythonAPI/Test/TestInsertParameter.py [deleted file]
src/PythonAPI/model/parameter/import_parameter.py

index 57c216f1705895e8b6cd2c0ae0904f92422167c3..26126b8f53c6f7f174bd07f079f5b35457f0baf0 100644 (file)
@@ -78,7 +78,7 @@ InitializationPlugin_EvalListener::InitializationPlugin_EvalListener()
   aLoop->registerListener(this, ModelAPI_ParameterEvalMessage::eventId(), NULL, true);
   aLoop->registerListener(this, ModelAPI_BuildEvalMessage::eventId(), NULL, true);
   aLoop->registerListener(this, ModelAPI_ComputePositionsMessage::eventId(), NULL, true);
-  aLoop->registerListener(this, ModelAPI_PathEvalMessage::eventId(), NULL, true);
+  aLoop->registerListener(this, ModelAPI_ImportParametersMessage::eventId(), NULL, true);
 
   myInterp = std::shared_ptr<InitializationPlugin_PyInterp>(new InitializationPlugin_PyInterp());
   myInterp->initialize();
@@ -180,12 +180,15 @@ void InitializationPlugin_EvalListener::processEvent(
     }
     aMsg->setResults(aParamsList, anError);
   }
-  else if (theMessage->eventID() == ModelAPI_PathEvalMessage::eventId())
+  else if (theMessage->eventID() == ModelAPI_ImportParametersMessage::eventId())
   {
-    std::shared_ptr<ModelAPI_PathEvalMessage> aMsg =
-      std::dynamic_pointer_cast<ModelAPI_PathEvalMessage>(theMessage);
-    std::string aPath = aMsg->parameter();
-    myInterp->runString("from salome.shaper import model; doc = model.activeDocument(); model.importParameters(doc, \"" + aPath + "\")");
+    std::shared_ptr<ModelAPI_ImportParametersMessage> aMsg =
+      std::dynamic_pointer_cast<ModelAPI_ImportParametersMessage>(theMessage);
+    std::string anImportScript("from salome.shaper import model;");
+    std::string aDocScript("doc = model.activeDocument();");
+    std::string anParamImpScript("model.importParameters(doc, \"");
+    std::string aPath = aMsg->filename();
+    myInterp->runString(anImportScript + aDocScript + anParamImpScript + aPath + "\")");
   }
 }
 
index 4688732d86b10d85f28c66cd4d6f58ec092063b4..506b261893205208fa443108f8f31811df5be0df 100644 (file)
@@ -189,24 +189,24 @@ const std::string& ModelAPI_ParameterEvalMessage::error() const
 }
 
 /// Creates an empty message
-ModelAPI_PathEvalMessage::ModelAPI_PathEvalMessage(const Events_ID theID, const void* theSender)
+ModelAPI_ImportParametersMessage::ModelAPI_ImportParametersMessage(const Events_ID theID, const void* theSender)
   :Events_Message(theID, theSender)
 {
 
 }
 
-ModelAPI_PathEvalMessage::~ModelAPI_PathEvalMessage()
+ModelAPI_ImportParametersMessage::~ModelAPI_ImportParametersMessage()
 {
 }
 
-std::string ModelAPI_PathEvalMessage::parameter() const
+std::string ModelAPI_ImportParametersMessage::filename() const
 {
-  return myParam;
+  return myFilename;
 }
 
-void ModelAPI_PathEvalMessage::setParameter(std::string theParam)
+void ModelAPI_ImportParametersMessage::setFilename(std::string theFilename)
 {
-  myParam = theParam;
+  myFilename = theFilename;
 }
 
 ModelAPI_BuildEvalMessage::ModelAPI_BuildEvalMessage(
index 3d04cae1838c8091817bf05714f2714baa9e62b9..2ebd25b0f37d1f7f6f9ab529d1152ea87d86692b 100644 (file)
@@ -352,42 +352,42 @@ class ModelAPI_ParameterEvalMessage : public Events_Message
   MODELAPI_EXPORT const std::string& error() const;
 };
 
-class ModelAPI_PathEvalMessage : public Events_Message
+class ModelAPI_ImportParametersMessage : public Events_Message
 {
-  std::string myParam; ///< parameters that should be evaluated
+  std::string myFilename; ///< filename where where parameters are stored
   std::string myError; ///< error of processing, empty if there is no error
 
 public:
   /// Static. Returns EventID of the message.
   MODELAPI_EXPORT static Events_ID& eventId()
   {
-    static const char* MY_PARAMETER_EVALUATION_EVENT_ID("PathEvalMessage");
+    static const char* MY_PARAMETER_EVALUATION_EVENT_ID("ImportParametersMessage");
     static Events_ID anId = Events_Loop::eventByName(MY_PARAMETER_EVALUATION_EVENT_ID);
     return anId;
   }
 
   /// Useful method that creates and sends the event.
   /// Returns the message, processed, with the resulting fields filled.
-  MODELAPI_EXPORT static std::shared_ptr<ModelAPI_PathEvalMessage>
+  MODELAPI_EXPORT static std::shared_ptr<ModelAPI_ImportParametersMessage>
     send(std::string theParameter, const void* theSender)
   {
-    std::shared_ptr<ModelAPI_PathEvalMessage> aMessage =
-      std::shared_ptr<ModelAPI_PathEvalMessage>(
-        new ModelAPI_PathEvalMessage(eventId(), theSender));
-    aMessage->setParameter(theParameter);
+    std::shared_ptr<ModelAPI_ImportParametersMessage> aMessage =
+      std::shared_ptr<ModelAPI_ImportParametersMessage>(
+        new ModelAPI_ImportParametersMessage(eventId(), theSender));
+    aMessage->setFilename(theParameter);
     Events_Loop::loop()->send(aMessage);
     return aMessage;
   }
 
   /// Creates an empty message
-  MODELAPI_EXPORT ModelAPI_PathEvalMessage(const Events_ID theID, const void* theSender = 0);
+  MODELAPI_EXPORT ModelAPI_ImportParametersMessage(const Events_ID theID, const void* theSender = 0);
   /// The virtual destructor
-  MODELAPI_EXPORT virtual ~ModelAPI_PathEvalMessage();
+  MODELAPI_EXPORT virtual ~ModelAPI_ImportParametersMessage();
 
-  /// Returns a parameter stored in the message
-  MODELAPI_EXPORT std::string parameter() const;
-  /// Sets a parameter to the message
-  MODELAPI_EXPORT void setParameter(std::string theParam);
+  /// Returns a filename stored in the message
+  MODELAPI_EXPORT std::string filename() const;
+  /// Sets a filename to the message
+  MODELAPI_EXPORT void setFilename(std::string theFilename);
 };
 
 class ModelAPI_BuildEvalMessage : public Events_Message
index 9f1140baa77df1f6d3ded84059b632f87af81ee2..4244e870b59aabb8c2dbcf3160db4ba190c7a745 100644 (file)
@@ -137,4 +137,5 @@ if(${HAVE_SALOME})
   endforeach(tfile ${TEST_NAMES})
   
   install(FILES ${TMP_TESTS_NAMES} DESTINATION ${TEST_INSTALL_DIRECTORY})
+  install(DIRECTORY data DESTINATION ${TEST_INSTALL_DIRECTORY})
 endif(${HAVE_SALOME})
index 3f3385ec927f45c053b8a91c679b55ad9adbd552..ac367dfacf7e102e684e515ec8717f6257e304c7 100644 (file)
@@ -698,21 +698,24 @@ void ParametersPlugin_WidgetParamsMgr::onRemove()
 
 void ParametersPlugin_WidgetParamsMgr::onImport()
 {
-  QStringList aPathes = QFileDialog::getOpenFileNames(nullptr, "Select txt file", "", "Text files (*.txt)", nullptr, {QFileDialog::ExistingFiles});
-  if (aPathes.empty())
+  std::string aWinText("Select txt file");
+  std::string aFileType("Text files (*.txt);;All files (*.*)");
+  QFlags<QFileDialog::Option> aOption = {QFileDialog::ExistingFile};
+  QString aQPath = QFileDialog::getOpenFileName(nullptr,
+                                                aWinText.c_str(), "",
+                                                aFileType.c_str(), nullptr,
+                                                aOption);
+  if (aQPath.size() == 0)
     return;
 
-  for (auto aPathIter = aPathes.begin(); aPathIter != aPathes.end(); ++aPathIter)
-  {
-    std::string aPath(aPathIter->toStdString());
-    std::shared_ptr<ModelAPI_PathEvalMessage> aMessage =
-      std::shared_ptr<ModelAPI_PathEvalMessage>(
-        new ModelAPI_PathEvalMessage(ModelAPI_PathEvalMessage::eventId()));
-    aMessage->setParameter(aPath);
-    Events_Loop::loop()->send(aMessage);
-  }
+  std::string aPath(aQPath.toStdString());
+  std::shared_ptr<ModelAPI_ImportParametersMessage> aMessage =
+    std::shared_ptr<ModelAPI_ImportParametersMessage>(
+      new ModelAPI_ImportParametersMessage(ModelAPI_ImportParametersMessage::eventId()));
+  aMessage->setFilename(aPath);
+  Events_Loop::loop()->send(aMessage);
+
   updateParametersFeatures();
-  /*updateFeaturesPart();*/
   updateParametersPart();
 }
 
diff --git a/src/ParametersPlugin/Test/TestImportParameters.py b/src/ParametersPlugin/Test/TestImportParameters.py
new file mode 100644 (file)
index 0000000..25750d0
--- /dev/null
@@ -0,0 +1,49 @@
+# Copyright (C) 2014-2021  CEA/DEN, EDF R&D
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+
+from salome.shaper import model
+import os
+
+from PyQt5.Qt import QApplication
+
+import salome
+salome.salome_init_without_session()
+salome.salome_init(1)
+if QApplication.instance() is None:
+  app = QApplication([])
+
+data_dir = os.path.join(os.path.dirname(inspect.getfile(lambda: None)), "data")
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+
+nameFile = "parameters.txt"
+
+aDir = os.path.join(data_dir, nameFile)
+
+aListOfParameters = model.importParameters(Part_1_doc, aDir)
+
+Box_1 = model.addBox(Part_1_doc, "Longueur", "Largeur", "Hauteur")
+
+assert(len(Box_1.feature().error()) == 0)
+assert(len(aListOfParameters) > 0)
+assert(len(aListOfParameters) == 5)
+assert(model.checkPythonDump())
index 08b2746e3fff1fb279dbc604070ada9978dec57f..45da43336041d60e48a10d0ed9d64f930a56c6e8 100644 (file)
@@ -1,6 +1,21 @@
-###
-### SHAPER component
-###
+# Copyright (C) 2014-2021  CEA/DEN, EDF R&D
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
 
 from salome.shaper import model
 
diff --git a/src/ParametersPlugin/data/parameters.txt b/src/ParametersPlugin/data/parameters.txt
new file mode 100644 (file)
index 0000000..f053871
--- /dev/null
@@ -0,0 +1,11 @@
+Longueur  36. # "Longueur de la pièce"
+Largeur  24.  # Largeur de la pièce
+Hauteur  Longueur*Largeur
+
+Largeur2
+Largeur3 #Comment
+A12  5. * 5.
+# Comment
+Name#Comment
+ # Comm
+Longueur2 36. #\"Comment\" #Comm  #Comm
\ No newline at end of file
index ae2b0cb143fb507ea9ae354d06c87b5379b545e3..04480ce43cec9d4d282b58fcc43056379a9652c5 100644 (file)
@@ -9,5 +9,5 @@ Create Parameter
     :language: python
 
 :download:`Download this script <examples/parameter.py>` 
-:download:`Download file for script <examples/File.txt>`
+:download:`Download parameters file sample <examples/File.txt>`
    
index 5f5a7bc97ccca063125f98bd34dc408ae4bff71f..5ab7e7825996186f924067c82ea6d50ad409d8c0 100644 (file)
@@ -1,3 +1,3 @@
-ax 10.0
-bx 15.0
-cx ax+bx
\ No newline at end of file
+Width 10.0 #Width of square
+Height 15.0 # Height of square
+Area Width*Height # Area of square
\ No newline at end of file
diff --git a/src/PythonAPI/Test/TestInsertParameter.py b/src/PythonAPI/Test/TestInsertParameter.py
deleted file mode 100644 (file)
index 739206e..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright (C) 2014-2020  CEA/DEN, EDF R&D
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-#
-# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-#
-
-from salome.shaper import model
-import os
-
-model.begin()
-partSet = model.moduleDocument()
-Part_1 = model.addPart(partSet)
-Part_1_doc = Part_1.document()
-
-data_dir = os.path.join(os.path.dirname(sys.argv[0]), "Test_data")
-
-nameFile = "PythonAPI_test_parametres1.txt"
-
-aDir = os.path.join(data_dir, nameFile)
-
-aFile = open(nameFile, 'w', encoding = "utf_8")
-
-aFile.write("Longueur  36. # \"Longueur de la pièce\"\n")
-aFile.write("Largeur  24.  # Largeur de la pièce\n")
-aFile.write("Hauteur  Longueur*Largeur\n")
-aFile.write("\n")
-aFile.write(" \n")
-aFile.write("Largeur2\n")
-aFile.write("Largeur3 #Comment\n")
-aFile.write("A12  5. * 5.\n")
-aFile.write("# Comment\n")
-aFile.write("Name#Comment\n")
-aFile.write(" # Comm\n")
-aFile.write("Longueur2 36. #\"Comment\" #Comm  #Comm\n")
-
-aFile.close()
-
-aListOfParameters = model.importParameters(Part_1_doc, nameFile)
-
-Box_1 = model.addBox(Part_1_doc, "Longueur", "Largeur", "Hauteur")
-
-assert(len(Box_1.feature().error()) == 0)
-assert(len(aListOfParameters) > 0)
-assert(len(aListOfParameters) == 5)
index d844f788077bce1c5cb7c2c93e67e94de2d18def..0c3bb31bd2599278135b90615bce2a7a86521434 100644 (file)
 from salome.shaper import model
 import codecs
 
+def changeTab(theLine):
+    aResult = theLine.split("#")[0].replace("\t"," ")
+    aResult += theLine[len(aResult):]
+    return aResult
+
 def importParameters(theDocument, theFileName):
 
     aResult = []
@@ -30,11 +35,12 @@ def importParameters(theDocument, theFileName):
 
     for aLine in aFile:
         aLine = aLine.rstrip("\n")
+        aLine = changeTab(aLine)
+
         aName = ""
         aParameter = ""
         aComment = ""
-        isOK = True
-        isComment = False
+
         aFirstText = aLine.split(" ")[0]
 
         aName = aFirstText.split("#")[0].strip()
@@ -52,7 +58,7 @@ def importParameters(theDocument, theFileName):
             try:
                 aResult.append(model.addParameter(theDocument, aName, aParameter.strip(), aComment.strip()))
             except SyntaxError as anError:
-                anError
+                print(anError)
 
     aFile.close()
     return aResult