Salome HOME
bos #26450 Random color
[modules/shaper.git] / src / ModelHighAPI / ModelHighAPI_Selection.cpp
index c87b99fe9a078dd0e9c81a09ef52869521e35872..3b45898cdc9cbef594502ea371f7e3193bff3abd 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2017  CEA/DEN, EDF R&D
+// 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
 //
 // 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
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
-// See http://www.salome-platform.org/ or
-// email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 
 #include "ModelHighAPI_Selection.h"
@@ -26,7 +25,9 @@
 #include <ModelAPI_AttributeSelectionList.h>
 #include <ModelAPI_Feature.h>
 #include <ModelAPI_ResultBody.h>
+#include <ModelAPI_Tools.h>
 
+#include <GeomAPI_Pnt.h>
 //--------------------------------------------------------------------------------------
 
 //--------------------------------------------------------------------------------------
@@ -43,12 +44,41 @@ ModelHighAPI_Selection::ModelHighAPI_Selection(const std::shared_ptr<ModelAPI_Re
 }
 
 ModelHighAPI_Selection::ModelHighAPI_Selection(const std::string& theType,
-                                               const std::string& theSubShapeName)
+                                               const std::wstring& theSubShapeName)
 : myVariantType(VT_TypeSubShapeNamePair)
 , myTypeSubShapeNamePair(theType, theSubShapeName)
 {
 }
 
+ModelHighAPI_Selection::ModelHighAPI_Selection(const std::string& theType,
+                                               const GeomPointPtr& theSubShapeInnerPoint)
+: myVariantType(VT_TypeInnerPointPair)
+, myTypeInnerPointPair(theType, theSubShapeInnerPoint)
+{
+}
+
+ModelHighAPI_Selection::ModelHighAPI_Selection(const std::string& theType,
+                                               const std::list<double>& theSubShapeInnerPoint)
+: myVariantType(VT_TypeInnerPointPair)
+{
+  double aCoordinates[3] = { 0.0, 0.0, 0.0 };
+  double* aCIt = aCoordinates;
+  std::list<double>::const_iterator aPIt = theSubShapeInnerPoint.begin();
+  for (; aPIt != theSubShapeInnerPoint.end(); ++aPIt, ++aCIt)
+    *aCIt = *aPIt;
+
+  GeomPointPtr anInnerPoint(new GeomAPI_Pnt(aCoordinates[0], aCoordinates[1], aCoordinates[2]));
+  myTypeInnerPointPair = std::pair<std::string, GeomPointPtr>(theType, anInnerPoint);
+}
+
+ModelHighAPI_Selection::ModelHighAPI_Selection(const std::string& theType,
+  const std::wstring& theContextName, const int theIndex)
+  : myVariantType(VT_WeakNamingPair),
+  myWeakNamingPair(theType, std::pair<std::wstring, int>(theContextName, theIndex))
+{
+}
+
+
 ModelHighAPI_Selection::~ModelHighAPI_Selection()
 {
 }
@@ -64,12 +94,22 @@ void ModelHighAPI_Selection::fillAttribute(
       return;
     case VT_TypeSubShapeNamePair:
       theAttribute->selectSubShape(myTypeSubShapeNamePair.first, myTypeSubShapeNamePair.second);
-      if(theAttribute->isInvalid()) {
-        FeaturePtr aFeature = ModelAPI_Feature::feature(theAttribute->owner());
-        aFeature->setError(
-          std::string("Error: attribute \"") + theAttribute->id() + std::string("\" is invalid."));
-      }
+      break;
+    case VT_TypeInnerPointPair:
+      theAttribute->selectSubShape(myTypeInnerPointPair.first, myTypeInnerPointPair.second);
       return;
+    case VT_WeakNamingPair:
+      theAttribute->selectSubShape(
+        myWeakNamingPair.first, myWeakNamingPair.second.first, myWeakNamingPair.second.second);
+      break;
+    case VT_Filtering:
+      break; // do nothing [to avoid compilation warning]
+  }
+
+  if (theAttribute->isInvalid()) {
+    FeaturePtr aFeature = ModelAPI_Feature::feature(theAttribute->owner());
+    aFeature->setError(
+      std::string("Error: attribute \"") + theAttribute->id() + std::string("\" is invalid."));
   }
 }
 
@@ -86,6 +126,18 @@ void ModelHighAPI_Selection::appendToList(
       // Note: the reverse order (first - type, second - sub-shape name)
       theAttribute->append(myTypeSubShapeNamePair.second, myTypeSubShapeNamePair.first);
       return;
+    case VT_TypeInnerPointPair:
+      // Note: the reverse order (first - type, second - selected point)
+      theAttribute->append(myTypeInnerPointPair.second, myTypeInnerPointPair.first);
+      return;
+    case VT_WeakNamingPair:
+      // Note: the reverse order (first - type, second - selected point)
+      theAttribute->append(
+        myWeakNamingPair.first, myWeakNamingPair.second.first, myWeakNamingPair.second.second);
+      return;
+    case VT_Filtering:
+      theAttribute->setFilters(myFilterFeature);
+      return;
   }
 }
 
@@ -107,6 +159,18 @@ TypeSubShapeNamePair ModelHighAPI_Selection::typeSubShapeNamePair() const
   return myTypeSubShapeNamePair;
 }
 
+//==================================================================================================
+TypeInnerPointPair ModelHighAPI_Selection::typeInnerPointPair() const
+{
+  return myTypeInnerPointPair;
+}
+
+//==================================================================================================
+TypeWeakNamingPair ModelHighAPI_Selection::typeWeakNamingPair() const
+{
+  return myWeakNamingPair;
+}
+
 //==================================================================================================
 std::string ModelHighAPI_Selection::shapeType() const
 {
@@ -115,13 +179,16 @@ std::string ModelHighAPI_Selection::shapeType() const
     return myResultSubShapePair.second.get() ? myResultSubShapePair.second->shapeTypeStr() :
                                                myResultSubShapePair.first->shape()->shapeTypeStr();
   case VT_TypeSubShapeNamePair: return myTypeSubShapeNamePair.first;
+  case VT_TypeInnerPointPair: return myTypeInnerPointPair.first;
+  default:
+    break; // do nothing [to avoid compilation warning]
   }
 
   return "SHAPE";
 }
 
 //==================================================================================================
-void ModelHighAPI_Selection::setName(const std::string& theName)
+void ModelHighAPI_Selection::setName(const std::wstring& theName)
 {
   if (myVariantType == VT_ResultSubShapePair) {
     std::shared_ptr<ModelAPI_Result> aResult = myResultSubShapePair.first;
@@ -132,17 +199,17 @@ void ModelHighAPI_Selection::setName(const std::string& theName)
   }
 }
 
-std::string ModelHighAPI_Selection::name() const
+std::wstring ModelHighAPI_Selection::name() const
 {
   if (myVariantType == VT_ResultSubShapePair) {
     std::shared_ptr<ModelAPI_Result> aResult = myResultSubShapePair.first;
     if (aResult.get())
       return aResult->data()->name();
   }
-  return std::string();
+  return std::wstring();
 }
 
-void ModelHighAPI_Selection::setColor(int theRed, int theGreen, int theBlue)
+void ModelHighAPI_Selection::setColor(int theRed, int theGreen, int theBlue, bool random)
 {
   if (myVariantType != VT_ResultSubShapePair || !myResultSubShapePair.first.get())
     return;
@@ -150,9 +217,20 @@ void ModelHighAPI_Selection::setColor(int theRed, int theGreen, int theBlue)
   AttributeIntArrayPtr aColor =
       myResultSubShapePair.first->data()->intArray(ModelAPI_Result::COLOR_ID());
   aColor->setSize(3);
-  aColor->setValue(0, theRed);
-  aColor->setValue(1, theGreen);
-  aColor->setValue(2, theBlue);
+
+  if (random)
+  {
+    std::vector<int> aValues;
+    ModelAPI_Tools::findRandomColor(aValues);
+    for (int anIndex = 0; anIndex < 3; ++anIndex)
+      aColor->setValue(anIndex, aValues[anIndex]);
+  }
+  else
+  {
+    aColor->setValue(0, theRed);
+    aColor->setValue(1, theGreen);
+    aColor->setValue(2, theBlue);
+  }
 }
 
 void ModelHighAPI_Selection::setDeflection(double theValue)
@@ -166,6 +244,7 @@ void ModelHighAPI_Selection::setDeflection(double theValue)
   aDeflectionAttr->setValue(theValue);
 }
 
+// LCOV_EXCL_START
 void ModelHighAPI_Selection::setTransparency(double theValue)
 {
   if (myVariantType != VT_ResultSubShapePair)
@@ -176,6 +255,7 @@ void ModelHighAPI_Selection::setTransparency(double theValue)
 
   aTransparencyAttr->setValue(theValue);
 }
+// LCOV_EXCL_STOP
 
 int ModelHighAPI_Selection::numberOfSubs() const
 {