Salome HOME
updated copyright message
[modules/shaper.git] / src / PartSet / PartSet_FieldStepPrs.cpp
index 04c38b959cc0642109abcb3cf06b88ca93ead004..3fb0a1fc672bba0da7d1acbdc6b012e6dc2e419a 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2019  CEA/DEN, EDF R&D
+// Copyright (C) 2014-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
 #include <TopoDS.hxx>
 #include <TopoDS_Vertex.hxx>
 #include <TopExp_Explorer.hxx>
-#include <Prs3d_Root.hxx>
-
+#include <Graphic3d_Text.hxx>
+#include <Graphic3d_AspectText3d.hxx>
 
 IMPLEMENT_STANDARD_RTTIEXT(PartSet_FieldStepPrs, ViewerData_AISShape);
 
 #define POINT_SIZE 8
 
 
-void emptyDeleter(ModelAPI_ResultField* theF)
+void emptyDeleter(ModelAPI_ResultField* /*theF*/)
 {
   // Do nothing
 }
@@ -118,23 +118,35 @@ QList<double> PartSet_FieldStepPrs::range(double& theMin, double& theMax) const
       case ModelAPI_AttributeTables::INTEGER:
         aFieldStepData << aVal.myInt;
         break;
+      default: // [to avoid compilation warning]
+        break;
       }
     }
   }
   QList<double> aShapeData;
   double aRangeMin = aFieldStepData.first(), aRangeMax = aFieldStepData.last();
-  for (int aRow = 0; aRow < aRows - 1; aRow++) {
-    double aNorm = 0;
-    int aBaseIndex = aRow * aCols;
-    for (int aCol = 0; aCol < aCols; aCol++) {
-      int anIndex = aCol + aBaseIndex;
-      double aValue = aFieldStepData.at(anIndex);
-      aNorm += aValue * aValue;
+  if (aCols == 1) {
+    for (int aRow = 0; aRow < aRows - aStart; aRow++) {
+      double aValue = aFieldStepData.at(aRow);
+      aRangeMin = Min(aRangeMin, aValue);
+      aRangeMax = Max(aRangeMax, aValue);
+      aShapeData << aValue;
+    }
+  }
+  else {
+    for (int aRow = 0; aRow < aRows - aStart; aRow++) {
+      double aNorm = 0;
+      int aBaseIndex = aRow * aCols;
+      for (int aCol = 0; aCol < aCols; aCol++) {
+        int anIndex = aCol + aBaseIndex;
+        double aValue = aFieldStepData.at(anIndex);
+        aNorm += aValue * aValue;
+      }
+      aNorm = pow(aNorm, 0.5);
+      aRangeMin = Min(aRangeMin, aNorm);
+      aRangeMax = Max(aRangeMax, aNorm);
+      aShapeData << aNorm;
     }
-    aNorm = pow(aNorm, 0.5);
-    aRangeMin = Min(aRangeMin, aNorm);
-    aRangeMax = Max(aRangeMax, aNorm);
-    aShapeData << aNorm;
   }
   theMin = aRangeMin;
   theMax = aRangeMax;
@@ -158,18 +170,27 @@ void PartSet_FieldStepPrs::Compute(const Handle(PrsMgr_PresentationManager3d)& t
   {
     double aMin, aMax;
     QList<double> aShapeData = range(aMin, aMax);
-    int aNbIntertvals = aResMgr->integerValue("Viewer", "scalar_bar_nb_intervals", 20);
 
     AttributeSelectionListPtr aSelList =
       aData->selectionList(CollectionPlugin_Field::SELECTED_ID());
-    for (int i = 0; i < aSelList->size(); i++) {
-      AttributeSelectionPtr aSelection = aSelList->value(i);
-      GeomShapePtr aShapePtr = aSelection->value();
-      TopoDS_Shape aShape = aShapePtr->impl<TopoDS_Shape>();
-      double aValue = aShapeData.at(i);
+    std::string aTypeStr = aSelList->selectionType();
+    if (aTypeStr == "part") {
       Quantity_Color aColor;
-      if (AIS_ColorScale::FindColor(aValue, aMin, aMax, aNbIntertvals, aColor))
-        SetCustomColor(aShape, aColor);
+      if (AIS_ColorScale::FindColor(aMin, aMin, aMax, 1, aColor)) {
+        SetColor(aColor);
+      }
+    }
+    else {
+      int aNbIntertvals = aResMgr->integerValue("Viewer", "scalar_bar_nb_intervals", 20);
+      for (int i = 0; i < aSelList->size(); i++) {
+        AttributeSelectionPtr aSelection = aSelList->value(i);
+        GeomShapePtr aShapePtr = aSelection->value();
+        TopoDS_Shape aShape = aShapePtr->impl<TopoDS_Shape>();
+        double aValue = aShapeData.at(i);
+        Quantity_Color aColor;
+        if (AIS_ColorScale::FindColor(aValue, aMin, aMax, aNbIntertvals, aColor))
+          SetCustomColor(aShape, aColor);
+      }
     }
   }
   break;
@@ -195,15 +216,13 @@ void PartSet_FieldStepPrs::Compute(const Handle(PrsMgr_PresentationManager3d)& t
     QStringList aValues = strings();
     AttributeSelectionListPtr aSelList =
       aData->selectionList(CollectionPlugin_Field::SELECTED_ID());
-    Handle(Graphic3d_Group) aGroup = Prs3d_Root::NewGroup(thePrs);
+    Handle(Graphic3d_Group) aGroup = thePrs->NewGroup();
     for (int i = 0; i < aSelList->size(); i++) {
       AttributeSelectionPtr aSelection = aSelList->value(i);
       GeomShapePtr aShapePtr = aSelection->value();
       TopoDS_Shape aShape = aShapePtr->impl<TopoDS_Shape>();
       gp_Pnt aCenter;
       if (computeMassCenter(aShape, aCenter)) {
-        Graphic3d_Vertex aVertex(aCenter.X(), aCenter.Y(), aCenter.Z());
-
         Handle(Graphic3d_AspectText3d) anAspectText3d = new Graphic3d_AspectText3d();
         anAspectText3d->SetStyle(Aspect_TOST_ANNOTATION);
         anAspectText3d->SetColor(aLabelColor);
@@ -211,7 +230,10 @@ void PartSet_FieldStepPrs::Compute(const Handle(PrsMgr_PresentationManager3d)& t
 
         int aT = aResMgr->integerValue("Viewer", "scalar_bar_text_height", 14);
         QString aString = aValues.at(i);
-        aGroup->Text(aString.toUtf8().constData(), aVertex, aT);
+        Handle(Graphic3d_Text) aText = new Graphic3d_Text(aT);
+        aText->SetText(aString.toUtf8().constData());
+        aText->SetPosition(aCenter);
+        aGroup->AddText(aText);
       }
     }
   }
@@ -235,7 +257,6 @@ QList<double> PartSet_FieldStepPrs::booleanValues() const
     }
   }
   QList<double> aShapeData;
-  double aRangeMin = aFieldStepData.first(), aRangeMax = aFieldStepData.last();
   for (int aRow = 0; aRow < aRows - 1; aRow++) {
     double aNorm = 0;
     int aBaseIndex = aRow * aCols;
@@ -297,14 +318,12 @@ bool PartSet_FieldStepPrs::computeMassCenter(const TopoDS_Shape& theShape, gp_Pn
     if (!triangulation.IsNull() && triangulation->HasUVNodes()) {
       gp_XY C(0, 0);
       double A = 0;
-      const TColgp_Array1OfPnt2d& uvArray = triangulation->UVNodes();
-      const Poly_Array1OfTriangle&  trias = triangulation->Triangles();
       int n1, n2, n3;
-      for (int iT = trias.Lower(); iT <= trias.Upper(); ++iT) {
-        trias(iT).Get(n1, n2, n3);
-        const gp_Pnt2d& uv1 = uvArray(n1);
-        const gp_Pnt2d& uv2 = uvArray(n2);
-        const gp_Pnt2d& uv3 = uvArray(n3);
+      for (int iT = 1; iT <= triangulation->NbTriangles(); ++iT) {
+        triangulation->Triangle(iT).Get(n1, n2, n3);
+        const gp_Pnt2d& uv1 = triangulation->UVNode(n1);
+        const gp_Pnt2d& uv2 = triangulation->UVNode(n2);
+        const gp_Pnt2d& uv3 = triangulation->UVNode(n3);
         double a = 0.5 * sqrt((uv1.X() - uv3.X()) * (uv2.Y() - uv1.Y()) -
           (uv1.X() - uv2.X()) * (uv3.Y() - uv1.Y()));
         C += (uv1.XY() + uv2.XY() + uv3.XY()) / 3. * a;