]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
WIP [NOT COMPILING] ResultVolume
authorNicolas RECHATIN <nicolas.rechatin@cea.fr>
Mon, 19 Jul 2021 13:37:33 +0000 (15:37 +0200)
committerNicolas RECHATIN <nicolas.rechatin@cea.fr>
Mon, 19 Jul 2021 13:37:33 +0000 (15:37 +0200)
17 files changed:
src/Config/dataModel.xml
src/Model/CMakeLists.txt
src/Model/Model_BodyBuilder.h
src/Model/Model_Data.h
src/Model/Model_Document.cpp
src/Model/Model_Document.h
src/Model/Model_Objects.cpp
src/Model/Model_Objects.h
src/Model/Model_ResultVolume.cpp [new file with mode: 0644]
src/Model/Model_ResultVolume.h [new file with mode: 0644]
src/ModelAPI/CMakeLists.txt
src/ModelAPI/ModelAPI_Document.h
src/ModelAPI/ModelAPI_Events.cpp
src/ModelAPI/ModelAPI_Events.h
src/ModelAPI/ModelAPI_ResultVolume.h [new file with mode: 0644]
src/PartSet/PartSet_TreeNodes.cpp
src/PrimitivesPlugin/PrimitivesPlugin_Box.cpp

index 0d79b9be008cd83114e5cc61cededb05535f6b53..6dee0a7a3f4cebb90837e882dedb40013f12c141 100644 (file)
@@ -10,7 +10,8 @@
                 folder_features="ParametersMgr"/>
         <folder name="Constructions" group_type="Construction" icon=":pictures/constr_folder.png"/>
         <folder name="Results" group_type="Bodies" icon=":pictures/constr_folder.png"/>
+        <folder name="Volumes" group_type="Volumes" icon=":pictures/constr_folder.png"/>
         <folder name="Fields" group_type="Fields" icon=":pictures/constr_folder.png" show_empty="false"/>
         <folder name="Groups" group_type="Groups" icon=":pictures/constr_folder.png" show_empty="false"/>
     </sub_document>
-</data_model>
\ No newline at end of file
+</data_model>
index 2f349c1939b9c8b96ef5c7d63cc82bebda7a02ca..620650aa773fc782be4e49d55b64a71397198d72 100644 (file)
@@ -48,6 +48,9 @@ SET(PROJECT_HEADERS
     Model_FeatureValidator.h
     Model_FiltersFactory.h
     Model_ResultBody.h
+
+    Model_ResultVolume.h
+
     Model_ResultConstruction.h
     Model_ResultPart.h
     Model_ResultField.h
@@ -86,6 +89,9 @@ SET(PROJECT_SOURCES
     Model_FeatureValidator.cpp
     Model_FiltersFactory.cpp
     Model_ResultBody.cpp
+
+    Model_ResultVolume.cpp
+
     Model_ResultConstruction.cpp
     Model_ResultPart.cpp
     Model_ResultField.cpp
index 32983cd66e04d347e99b20d2b0adaa18159d0a07..d4c636fff1ece5282eedb431e6d436ac3306397a 100644 (file)
@@ -153,6 +153,9 @@ private:
 
 private:
   friend class Model_ResultBody;
+
+  friend class Model_ResultVolume;
+
   friend class Model_ResultCompSolid;
 };
 
index df833acc0398bf38b4d7b034c999f37988d02859..7cc31f7d26fd09fcca932b9774e7a34d6f0cb1fe 100644 (file)
@@ -96,6 +96,9 @@ class Model_Data : public ModelAPI_Data
   friend class Model_SelectionNaming;
   friend class Model_ResultConstruction;
   friend class Model_ResultBody;
+
+  friend class Model_ResultVolume;
+
   friend class Model_Tools;
 
  public:
index 94903c205b044a660676fc5b2cc9ae43219adca8..ab44f2686107269513c0930db97f5c982b61bb03 100644 (file)
@@ -1577,6 +1577,12 @@ std::shared_ptr<ModelAPI_ResultBody> Model_Document::createBody(
   return myObjs->createBody(theFeatureData, theIndex);
 }
 
+std::shared_ptr<ModelAPI_ResultVolume> Model_Document::createVolume(
+    const std::shared_ptr<ModelAPI_Data>& theFeatureData, const int theIndex)
+{
+  return myObjs->createVolume(theFeatureData, theIndex);
+}
+
 std::shared_ptr<ModelAPI_ResultPart> Model_Document::createPart(
     const std::shared_ptr<ModelAPI_Data>& theFeatureData, const int theIndex)
 {
index 122d4439eaff18b189a42c183e00b12b17f376ae..87026b2d3a74b8b1fb04bd4ce873196a2d0f5e3c 100644 (file)
@@ -203,6 +203,9 @@ class Model_Document : public ModelAPI_Document
   /// Creates a body results
   MODEL_EXPORT virtual std::shared_ptr<ModelAPI_ResultBody> createBody(
       const std::shared_ptr<ModelAPI_Data>& theFeatureData, const int theIndex = 0);
+  /// Creates a volume results
+  MODEL_EXPORT virtual std::shared_ptr<ModelAPI_ResultVolume> createVolume(
+      const std::shared_ptr<ModelAPI_Data>& theFeatureData, const int theIndex = 0);
   /// Creates a part results
   MODEL_EXPORT virtual std::shared_ptr<ModelAPI_ResultPart> createPart(
       const std::shared_ptr<ModelAPI_Data>& theFeatureData, const int theIndex = 0);
@@ -421,6 +424,9 @@ class Model_Document : public ModelAPI_Document
   friend class Model_AttributeSelectionList;
   friend class Model_ResultPart;
   friend class Model_ResultBody;
+
+  friend class Model_ResultVolume;
+
   friend class Model_ResultConstruction;
   friend class Model_SelectionNaming;
   friend class Model_BodyBuilder;
index ebb3d6be922a088ca19edd6d98ab5f1186577d0d..13af550ee09acd42449531f803db53f55759ccd9 100644 (file)
@@ -25,6 +25,9 @@
 #include <Model_ResultPart.h>
 #include <Model_ResultConstruction.h>
 #include <Model_ResultBody.h>
+
+#include <Model_ResultVolume.h>
+
 #include <Model_ResultGroup.h>
 #include <Model_ResultField.h>
 #include <Model_ResultParameter.h>
@@ -34,7 +37,6 @@
 #include <ModelAPI_Tools.h>
 #include <ModelAPI_Filter.h>
 
-
 #include <Events_Loop.h>
 #include <Events_InfoMessage.h>
 
@@ -1292,6 +1294,25 @@ std::shared_ptr<ModelAPI_ResultBody> Model_Objects::createBody(
   return aResult;
 }
 
+std::shared_ptr<ModelAPI_ResultVolume> Model_Objects::createVolume(
+    const std::shared_ptr<ModelAPI_Data>& theFeatureData,
+    const int theIndex,
+    const std::wstring& theNameShape)
+{
+  TDF_Label aLab = resultLabel(theFeatureData, theIndex);
+  TDataStd_Comment::Set(aLab, ModelAPI_ResultVolume::group().c_str());
+  ObjectPtr anOldObject = object(aLab);
+  std::shared_ptr<ModelAPI_ResultVolume> aResult;
+  if (anOldObject.get()) {
+    aResult = std::dynamic_pointer_cast<ModelAPI_ResultVolume>(anOldObject);
+  }
+  if (!aResult.get()) {
+    aResult = std::shared_ptr<ModelAPI_ResultVolume>(new Model_ResultVolume);
+    storeResult(theFeatureData, aResult, theIndex, theNameShape);
+  }
+  return aResult;
+}
+
 std::shared_ptr<ModelAPI_ResultPart> Model_Objects::createPart(
     const std::shared_ptr<ModelAPI_Data>& theFeatureData, const int theIndex)
 {
index a598b303347daf3e945572fc6f4554cde083de97..d644560606ce24faae1867734204382174311b10 100644 (file)
@@ -125,6 +125,10 @@ class Model_Objects
   std::shared_ptr<ModelAPI_ResultBody> createBody(
       const std::shared_ptr<ModelAPI_Data>& theFeatureData, const int theIndex = 0,
       const std::wstring& theNameShape = L"");
+  /// Creates a body result
+  std::shared_ptr<ModelAPI_ResultVolume> createVolume(
+      const std::shared_ptr<ModelAPI_Data>& theFeatureData, const int theIndex = 0,
+      const std::wstring& theNameShape = L"");
   /// Creates a part result
   std::shared_ptr<ModelAPI_ResultPart> createPart(
       const std::shared_ptr<ModelAPI_Data>& theFeatureData, const int theIndex = 0);
diff --git a/src/Model/Model_ResultVolume.cpp b/src/Model/Model_ResultVolume.cpp
new file mode 100644 (file)
index 0000000..3145ebe
--- /dev/null
@@ -0,0 +1,57 @@
+// 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
+//
+
+#include <Model_ResultVolume.h>
+
+#include <Model_Document.h>
+#include <Model_Objects.h>
+#include <Model_BodyBuilder.h>
+#include <Model_Document.h>
+#include <ModelAPI_Object.h>
+#include <ModelAPI_Events.h>
+#include <ModelAPI_Tools.h>
+#include <Model_Data.h>
+#include <Events_Loop.h>
+#include <GeomAPI_ShapeIterator.h>
+#include <GeomAPI_ShapeExplorer.h>
+#include <GeomAPI_Face.h>
+#include <GeomAPI_Pnt.h>
+
+#include <TopoDS_Shape.hxx>
+#include <TopExp_Explorer.hxx>
+#include <TopTools_MapOfShape.hxx>
+#include <TDataStd_UAttribute.hxx>
+
+// if this attribute exists, the shape is connected topology
+Standard_GUID kIsConnectedTopology("e51392e0-3a4d-405d-8e36-bbfe19858ef5");
+// if this attribute exists, the connected topology flag must be recomputed
+Standard_GUID kUpdateConnectedTopology("01ef7a45-0bec-4266-b0b4-4aa570921818");
+
+Model_ResultVolume::Model_ResultVolume() : Model_ResultVolume()
+{
+  myBuilder = new Model_BodyBuilder(this);
+  // myLastConcealed = false;
+  // updateSubs(shape()); // in case of open, etc.
+}
+
+Model_ResultVolume::~Model_ResultVolume()
+{
+  // updateSubs(std::shared_ptr<GeomAPI_Shape>()); // erase sub-results
+  delete myBuilder;
+}
diff --git a/src/Model/Model_ResultVolume.h b/src/Model/Model_ResultVolume.h
new file mode 100644 (file)
index 0000000..63e5684
--- /dev/null
@@ -0,0 +1,51 @@
+// 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
+//
+
+#ifndef Model_ResultVolume_H_
+#define Model_ResultVolume_H_
+
+#include "Model.h"
+#include <ModelAPI_ResultVolume.h>
+#include <vector>
+#include <map>
+
+#include <TopTools_DataMapOfShapeListOfShape.hxx>
+
+/**\class Model_ResultVolume
+* \ingroup DataModel
+* \brief The body (shape) result of a feature.
+*
+* Provides a shape that may be displayed in the viewer.
+* May provide really huge results, so, working with this kind
+* of result must be optimized.
+* Also provides a container of sub-body result in case it is compound or compsolid.
+*/
+class Model_ResultVolume : public ModelAPI_ResultVolume
+{
+
+  public:
+    /// Removes the stored builders
+    MODEL_EXPORT virtual ~Model_ResultVolume();
+
+  protected:
+    /// Makes a body on the given feature
+    Model_ResultVolume();
+};
+
+#endif
index c6a298461b7dcd1b40c05f563a50ef25f1c8ec99..5a8668f2a0602a47b7b6c8f7c87c6a21ad73dbc7 100644 (file)
@@ -61,6 +61,9 @@ SET(PROJECT_HEADERS
     ModelAPI_Plugin.h
     ModelAPI_Result.h
     ModelAPI_ResultBody.h
+
+    ModelAPI_ResultVolume.h
+
     ModelAPI_ResultConstruction.h
     ModelAPI_ResultField.h
     ModelAPI_ResultGroup.h
@@ -172,16 +175,16 @@ ADD_UNIT_TESTS(${TEST_NAMES})
 if(${HAVE_SALOME})
   enable_testing()
   set(TEST_INSTALL_DIRECTORY "${SALOME_SHAPER_INSTALL_TESTS}/ModelAPI")
-  
+
   install(FILES CTestTestfileInstall.cmake
   DESTINATION ${TEST_INSTALL_DIRECTORY}
   RENAME CTestTestfile.cmake)
   install(FILES tests.set DESTINATION ${TEST_INSTALL_DIRECTORY})
-  
+
   set(TMP_TESTS_NAMES)
   foreach(tfile ${TEST_NAMES})
     list(APPEND TMP_TESTS_NAMES "Test/${tfile}")
   endforeach(tfile ${TEST_NAMES})
-  
+
   install(FILES ${TMP_TESTS_NAMES} DESTINATION ${TEST_INSTALL_DIRECTORY})
 endif(${HAVE_SALOME})
index 7aa75c92dab117055c4fd4b126a01326c87a7d44..95e1d6d47f7d894c2ddaae11536c8a8636ee2905 100644 (file)
@@ -35,6 +35,7 @@ class ModelAPI_Object;
 class ModelAPI_Result;
 class ModelAPI_ResultConstruction;
 class ModelAPI_ResultBody;
+class ModelAPI_ResultVolume;
 class ModelAPI_ResultPart;
 class ModelAPI_ResultGroup;
 class ModelAPI_ResultField;
@@ -154,6 +155,9 @@ public:
   //! Creates a body result
   virtual std::shared_ptr<ModelAPI_ResultBody> createBody(
       const std::shared_ptr<ModelAPI_Data>& theFeatureData, const int theIndex = 0) = 0;
+  //! Creates a volume result
+  virtual std::shared_ptr<ModelAPI_ResultVolume> createVolume(
+      const std::shared_ptr<ModelAPI_Data>& theFeatureData, const int theIndex = 0) = 0;
   //! Creates a part result
   virtual std::shared_ptr<ModelAPI_ResultPart> createPart(
       const std::shared_ptr<ModelAPI_Data>& theFeatureData, const int theIndex = 0) = 0;
index 22b8aa12d313838ebe2e28ca76c627e009f900a9..87900fcf8d7cb077338dccea152f2bf08b570d4c 100644 (file)
@@ -169,10 +169,10 @@ void ModelAPI_ParameterEvalMessage::setResults(
 
 void ModelAPI_ParameterEvalMessage::setVolumes(
     const std::list<std::shared_ptr<ModelAPI_ResultParameter> >& theParamsList,
-    const double theResult, const std::string& theError)
+    const double theVolume, const std::string& theError)
 {
   myParamsList = theParamsList;
-  myResult = theResult;
+  myResult = theVolume;
   myError = theError;
   myIsProcessed = true;
 }
index c8d77349c3d509f1dbd084f8fbdc57e175d4a2dd..57e2c70eb3d7432c0d70742ea0a52f911724505e 100644 (file)
@@ -344,7 +344,7 @@ class ModelAPI_ParameterEvalMessage : public Events_Message
     const double theResult, const std::string& theError);
   MODELAPI_EXPORT void setVolumes(
     const std::list<std::shared_ptr<ModelAPI_ResultParameter> >& theParamsList,
-    const double theResult, const std::string& theError);
+    const double theVolume, const std::string& theError);
   /// Returns true if the expression is processed
   MODELAPI_EXPORT bool isProcessed();
   /// Returns the results of processing: list of parameters found in the expression
@@ -398,7 +398,7 @@ class ModelAPI_BuildEvalMessage : public Events_Message
   MODELAPI_EXPORT void setResults(
                        const std::list<std::shared_ptr<ModelAPI_ResultParameter> >& theParamsList,
                        const std::string& theError);
-  /// Sets the results of processing
+  /// Sets the volumes of processing
   MODELAPI_EXPORT void setVolumes(
                        const std::list<std::shared_ptr<ModelAPI_ResultParameter> >& theParamsList,
                        const std::string& theError);
diff --git a/src/ModelAPI/ModelAPI_ResultVolume.h b/src/ModelAPI/ModelAPI_ResultVolume.h
new file mode 100644 (file)
index 0000000..ad15c19
--- /dev/null
@@ -0,0 +1,55 @@
+// 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
+//
+
+#ifndef ModelAPI_ResultVolume_H_
+#define ModelAPI_ResultVolume_H_
+
+#include "ModelAPI_ResultBody.h"
+
+class ModelAPI_BodyBuilder;
+class GeomAlgoAPI_MakeShape;
+
+/**\class ModelAPI_ResultVolume
+* \ingroup DataModel
+* \brief The body (shape) result of a feature.
+*
+* Provides a shape that may be displayed in the viewer.
+* May provide really huge results, so, working with this kind
+* of result must be optimized.
+* Also provides a container of sub-body result in case it is compound or compsolid.
+*/
+class ModelAPI_ResultVolume : public ModelAPI_ResultBody
+{
+       public:
+
+               inline static std::string group()
+               {
+                       static std::string MY_GROUP = "Volumes";
+                       return MY_GROUP;
+               }
+
+       protected:
+               ModelAPI_BodyBuilder* myBuilder; ///< provides the body processing in naming shape
+
+};
+
+//! Pointer on feature object
+typedef std::shared_ptr<ModelAPI_ResultVolume> ResultVolumePtr;
+
+#endif
index aea786b9daa0705cf0cb34a1a5379dd3510ef41a..4fdb4767d3de65d6a56e51769d3ceb05e8d62a81 100644 (file)
@@ -33,6 +33,9 @@
 #include <ModelAPI_ResultConstruction.h>
 #include <ModelAPI_ResultPart.h>
 #include <ModelAPI_ResultBody.h>
+
+#include <ModelAPI_ResultVolume.h>
+
 #include <ModelAPI_Tools.h>
 #include <ModelAPI_ResultBody.h>
 #include <ModelAPI_CompositeFeature.h>
@@ -576,7 +579,7 @@ std::string PartSet_FolderNode::groupName() const
   case GroupsFolder:
     return ModelAPI_ResultGroup::group();
   case VolumesFolder:
-    return ModelAPI_ResultBody::group();
+    return ModelAPI_ResultVolume::group();
   }
   return "";
 }
index feea6763d29bb0f9d8b8daabda8cd42279bc1340..ccddc413d2e6e806fe79f3251afaba8c11ce2cd4 100644 (file)
@@ -21,6 +21,9 @@
 
 #include <ModelAPI_Data.h>
 #include <ModelAPI_ResultBody.h>
+
+#include <ModelAPI_ResultVolume.h>
+
 #include <ModelAPI_AttributeDouble.h>
 #include <ModelAPI_AttributeSelection.h>
 #include <ModelAPI_AttributeString.h>
@@ -161,6 +164,27 @@ void PrimitivesPlugin_Box::createBoxByTwoPoints()
   setResult(aResultBox, aResultIndex);
 }
 
+//=================================================================================================
+static void toto(std::shared_ptr<GeomAlgoAPI_Box> theBoxAlgo,
+                                        std::shared_ptr<ModelAPI_ResultVolume> theResultBox)
+{
+  // Load the result
+  theResultBox->store(theBoxAlgo->shape());
+
+  // Prepare the naming
+  theBoxAlgo->prepareNamingFaces();
+
+  // Insert to faces
+  std::map< std::string, std::shared_ptr<GeomAPI_Shape> > listOfFaces =
+    theBoxAlgo->getCreatedFaces();
+  for (std::map< std::string, std::shared_ptr<GeomAPI_Shape> >::iterator it = listOfFaces.begin();
+       it != listOfFaces.end();
+       ++it)
+  {
+    theResultBox->generated((*it).second, (*it).first);
+  }
+}
+
 //=================================================================================================
 void PrimitivesPlugin_Box::createBoxByOnePointAndDims()
 {
@@ -200,9 +224,9 @@ void PrimitivesPlugin_Box::createBoxByOnePointAndDims()
   }
 
   int aResultIndex = 0;
-  ResultBodyPtr aResultBox = document()->createBody(data(), aResultIndex);
-  loadNamingDS(aBoxAlgo, aResultBox);
-  setResult(aResultBox, aResultIndex);
+  ResultVolumePtr aResultBox = document()->createVolume(data(), aResultIndex);
+  toto(aBoxAlgo, aResultBox);
+  setVolume(aResultBox, aResultIndex);
 }
 
 //=================================================================================================