Salome HOME
updated copyright message
[modules/shaper.git] / src / PrimitivesPlugin / PrimitivesPlugin_Sphere.cpp
index 9e63047df90e31419cf531780fdb03c349950da2..0c4b38f4078d9b07c45cf7cef5b8c718f00ab3fc 100644 (file)
@@ -1,19 +1,41 @@
-// Copyright (C) 2014-201x CEA/DEN, EDF R&D
-
-// File:        PrimitivesPlugin_Sphere.h
+// Copyright (C) 2017-2023  CEA, EDF
+//
+// 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
+//
+
+// File:        PrimitivesPlugin_Sphere.cpp
 // Created:     15 Mar 2017
 // Author:      Clarisse Genrault (CEA)
 
 #include <PrimitivesPlugin_Sphere.h>
 
+#include <GeomAPI_ShapeExplorer.h>
+
 #include <GeomAlgoAPI_PointBuilder.h>
 
 #include <ModelAPI_AttributeDouble.h>
 #include <ModelAPI_AttributeSelection.h>
+#include <ModelAPI_AttributeString.h>
 #include <ModelAPI_ResultBody.h>
 #include <ModelAPI_ResultConstruction.h>
 #include <ModelAPI_Session.h>
 
+#include <sstream>
+
 //=================================================================================================
 PrimitivesPlugin_Sphere::PrimitivesPlugin_Sphere()
 {
@@ -22,6 +44,10 @@ PrimitivesPlugin_Sphere::PrimitivesPlugin_Sphere()
 //=================================================================================================
 void PrimitivesPlugin_Sphere::initAttributes()
 {
+  data()->addAttribute(PrimitivesPlugin_Sphere::CREATION_METHOD(),
+                       ModelAPI_AttributeString::typeId());
+
+  // data for the first mode : by a point and a radius
   data()->addAttribute(PrimitivesPlugin_Sphere::CENTER_POINT_ID(),
                        ModelAPI_AttributeSelection::typeId());
 
@@ -33,16 +59,38 @@ void PrimitivesPlugin_Sphere::initAttributes()
     data()->selection(PrimitivesPlugin_Sphere::CENTER_POINT_ID());
   if (!aCenterPoint->isInitialized()) {
     ObjectPtr aPointObj = ModelAPI_Session::get()->moduleDocument()
-      ->objectByName(ModelAPI_ResultConstruction::group(), "Origin");
+      ->objectByName(ModelAPI_ResultConstruction::group(), L"Origin");
     if (aPointObj.get()) {
       ResultPtr aPointRes = std::dynamic_pointer_cast<ModelAPI_Result>(aPointObj);
       aCenterPoint->setValue(aPointRes, std::shared_ptr<GeomAPI_Shape>());
     }
   }
+
+  // data for the second mode : by dimensions
+  data()->addAttribute(PrimitivesPlugin_Sphere::RMIN_ID(), ModelAPI_AttributeDouble::typeId());
+  data()->addAttribute(PrimitivesPlugin_Sphere::RMAX_ID(), ModelAPI_AttributeDouble::typeId());
+  data()->addAttribute(PrimitivesPlugin_Sphere::PHIMIN_ID(), ModelAPI_AttributeDouble::typeId());
+  data()->addAttribute(PrimitivesPlugin_Sphere::PHIMAX_ID(), ModelAPI_AttributeDouble::typeId());
+  data()->addAttribute(PrimitivesPlugin_Sphere::THETAMIN_ID(), ModelAPI_AttributeDouble::typeId());
+  data()->addAttribute(PrimitivesPlugin_Sphere::THETAMAX_ID(), ModelAPI_AttributeDouble::typeId());
 }
 
 //=================================================================================================
 void PrimitivesPlugin_Sphere::execute()
+{
+  AttributeStringPtr aMethodTypeAttr = string(PrimitivesPlugin_Sphere::CREATION_METHOD());
+  std::string aMethodType = aMethodTypeAttr->value();
+
+  if (aMethodType == CREATION_METHOD_BY_PT_RADIUS())
+    createSphereByPtRadius();
+
+  if (aMethodType == CREATION_METHOD_BY_DIMENSIONS())
+    createShereByDimensions();
+}
+
+
+//=================================================================================================
+void PrimitivesPlugin_Sphere::createSphereByPtRadius()
 {
   // Getting point.
   std::shared_ptr<GeomAPI_Pnt> aCenterPoint;
@@ -74,7 +122,7 @@ void PrimitivesPlugin_Sphere::execute()
   // Build the sphere
   aSphereAlgo->build();
 
-  // Check if the creation of the cylinder
+  // Check if the creation of the sphere is OK
   if(!aSphereAlgo->isDone()) {
     setError(aSphereAlgo->getError());
     return;
@@ -90,6 +138,48 @@ void PrimitivesPlugin_Sphere::execute()
   setResult(aResultBox, aResultIndex);
 }
 
+//=================================================================================================
+void PrimitivesPlugin_Sphere::createShereByDimensions()
+{
+  // Getting rmin, rmax, phimin, phimax, thetamin et thetamax
+  double aRMin = real(PrimitivesPlugin_Sphere::RMIN_ID())->value();
+  double aRMax = real(PrimitivesPlugin_Sphere::RMAX_ID())->value();
+  double aPhiMin = real(PrimitivesPlugin_Sphere::PHIMIN_ID())->value();
+  double aPhiMax = real(PrimitivesPlugin_Sphere::PHIMAX_ID())->value();
+  double aThetaMin = real(PrimitivesPlugin_Sphere::THETAMIN_ID())->value();
+  double aThetaMax = real(PrimitivesPlugin_Sphere::THETAMAX_ID())->value();
+
+  std::shared_ptr<GeomAlgoAPI_Sphere> aSphereAlgo = std::shared_ptr<GeomAlgoAPI_Sphere>(
+      new GeomAlgoAPI_Sphere(aRMin, aRMax, aPhiMin, aPhiMax, aThetaMin, aThetaMax));
+
+  // These checks should be made to the GUI for the feature but
+  // the corresponding validator does not exist yet.
+  if (!aSphereAlgo->check()) {
+    setError(aSphereAlgo->getError());
+    return;
+  }
+
+  // Build the sphere
+  aSphereAlgo->build();
+
+  // Check if the creation of the sphere is OK
+  if(!aSphereAlgo->isDone()) {
+    // The error is not displayed in a popup window. It must be in the message console.
+    setError(aSphereAlgo->getError());
+    return;
+  }
+  if(!aSphereAlgo->checkValid("Sphere Builder")) {
+    // The error is not displayed in a popup window. It must be in the message console.
+    setError(aSphereAlgo->getError());
+    return;
+  }
+
+  int aResultIndex = 0;
+  ResultBodyPtr aResultBox = document()->createBody(data(), aResultIndex);
+  loadNamingDS(aSphereAlgo, aResultBox);
+  setResult(aResultBox, aResultIndex);
+}
+
 //=================================================================================================
 void PrimitivesPlugin_Sphere::loadNamingDS(std::shared_ptr<GeomAlgoAPI_Sphere> theSphereAlgo,
                                            std::shared_ptr<ModelAPI_ResultBody> theResultSphere)
@@ -101,12 +191,28 @@ void PrimitivesPlugin_Sphere::loadNamingDS(std::shared_ptr<GeomAlgoAPI_Sphere> t
   theSphereAlgo->prepareNamingFaces();
 
   // Insert to faces
-  int num = 1;
+  // Naming for faces and edges
   std::map< std::string, std::shared_ptr<GeomAPI_Shape> > listOfFaces =
       theSphereAlgo->getCreatedFaces();
-  for (std::map< std::string, std::shared_ptr<GeomAPI_Shape> >::iterator
-       it=listOfFaces.begin(); it!=listOfFaces.end(); ++it) {
-    std::shared_ptr<GeomAPI_Shape> aFace = (*it).second;
-    theResultSphere->generated(aFace, (*it).first, num++);
+  for (std::map< std::string, std::shared_ptr<GeomAPI_Shape> >::iterator it = listOfFaces.begin();
+       it != listOfFaces.end();
+       ++it)
+  {
+    theResultSphere->generated((*it).second, (*it).first);
+  }
+
+  // Naming vertices
+  GeomAPI_DataMapOfShapeShape aVertices;
+  int anIndex = 1;
+  for (GeomAPI_ShapeExplorer aVertExp(theSphereAlgo->shape(), GeomAPI_Shape::VERTEX);
+       aVertExp.more();
+       aVertExp.next())
+  {
+    if (!aVertices.isBound(aVertExp.current())) {
+      std::ostringstream aStream;
+      aStream<<"Vertex_"<<anIndex++;
+      theResultSphere->generated(aVertExp.current(), aStream.str());
+      aVertices.bind(aVertExp.current(), aVertExp.current());
+    }
   }
 }