]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Implement colored shape
authorvsv <vsv@opencascade.com>
Wed, 26 Jun 2019 13:55:36 +0000 (16:55 +0300)
committervsv <vsv@opencascade.com>
Wed, 26 Jun 2019 13:55:36 +0000 (16:55 +0300)
18 files changed:
src/GeomAPI/GeomAPI_AISObject.h
src/ModuleBase/CMakeLists.txt
src/ModuleBase/ModuleBase_IModule.cpp
src/ModuleBase/ModuleBase_IModule.h
src/ModuleBase/ModuleBase_IStepPrs.cpp [new file with mode: 0644]
src/ModuleBase/ModuleBase_IStepPrs.h [new file with mode: 0644]
src/ModuleBase/ModuleBase_ResultPrs.cpp
src/ModuleBase/ModuleBase_ResultPrs.h
src/PartSet/CMakeLists.txt
src/PartSet/PartSet_FieldStepPrs.cpp [new file with mode: 0644]
src/PartSet/PartSet_FieldStepPrs.h [new file with mode: 0644]
src/PartSet/PartSet_Module.cpp
src/PartSet/PartSet_Module.h
src/XGUI/XGUI_Displayer.cpp
src/XGUI/XGUI_Displayer.h
src/XGUI/XGUI_SelectionMgr.cpp
src/XGUI/XGUI_ViewerProxy.cpp
src/XGUI/XGUI_ViewerProxy.h

index 57bfa3922804244541a58a5d1249272f700fd1de..7e4ebc98b9ab91376d15e39d6965f2bfd5494423 100644 (file)
@@ -49,7 +49,7 @@ class GeomAPI_AISObject : public GeomAPI_Interface
   GEOMAPI_EXPORT
   void createShape(std::shared_ptr<GeomAPI_Shape> theShape);
 
-  /// Reyirns shape used for the presentation creation (can be NULL)
+  /// Returns shape used for the presentation creation (can be NULL)
   GEOMAPI_EXPORT std::shared_ptr<GeomAPI_Shape> getShape() const;
 
   /** \brief Creates AIS_LengthDimension object
index ba2d74969d98b9447aff8161b3ac26aed929d023..081f37b25c36c2cccdb87ca141a51b2d9b8ad82b 100644 (file)
@@ -103,6 +103,7 @@ SET(PROJECT_HEADERS
   ModuleBase_WidgetRadiobox.h
   ModuleBase_WidgetPointInput.h
   ModuleBase_ITreeNode.h
+  ModuleBase_IStepPrs.h
 )
 
 SET(PROJECT_MOC_HEADERS
@@ -220,6 +221,7 @@ SET(PROJECT_SOURCES
   ModuleBase_WidgetNameEdit.cpp
   ModuleBase_WidgetRadiobox.cpp
   ModuleBase_WidgetPointInput.cpp
+  ModuleBase_IStepPrs.cpp
 )
 
 SET(PROJECT_LIBRARIES
index ac8f98dd626ee3ab5b2e958617bccb7f586f7907..05d1f93ef2dbbcb1c0632000046c682d318135a0 100644 (file)
@@ -147,7 +147,7 @@ void ModuleBase_IModule::launchOperation(const QString& theCmdId,
   }
 }
 
-Handle(AIS_InteractiveObject) ModuleBase_IModule::createPresentation(const ResultPtr& theResult)
+Handle(AIS_InteractiveObject) ModuleBase_IModule::createPresentation(const ObjectPtr& theResult)
 {
   return Handle(AIS_InteractiveObject)();
 }
index 90d31cd1400ccbddc887909f0295b98edfe95f25..165828fd0806ce6bb2a7cebfedfe88eeb452f80d 100644 (file)
@@ -301,8 +301,7 @@ class MODULEBASE_EXPORT ModuleBase_IModule : public QObject
   /// Create specific for the module presentation
   /// \param theResult an object for presentation
   /// \return created presentation or NULL(default value)
-  virtual Handle(AIS_InteractiveObject) createPresentation(
-                           const std::shared_ptr<ModelAPI_Result>& theResult);
+  virtual Handle(AIS_InteractiveObject) createPresentation(const ObjectPtr& theResult);
 
   //! Returns data object by AIS
   virtual ObjectPtr findPresentedObject(const AISObjectPtr& theAIS) const = 0;
diff --git a/src/ModuleBase/ModuleBase_IStepPrs.cpp b/src/ModuleBase/ModuleBase_IStepPrs.cpp
new file mode 100644 (file)
index 0000000..b08b3b3
--- /dev/null
@@ -0,0 +1,24 @@
+// Copyright (C) 2014-2019  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 "ModuleBase_IStepPrs.h"
+
+ModuleBase_IStepPrs::ModuleBase_IStepPrs()
+{
+}
diff --git a/src/ModuleBase/ModuleBase_IStepPrs.h b/src/ModuleBase/ModuleBase_IStepPrs.h
new file mode 100644 (file)
index 0000000..445b4b7
--- /dev/null
@@ -0,0 +1,36 @@
+// Copyright (C) 2014-2019  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 ModuleBase_IStepPrs_H
+#define ModuleBase_IStepPrs_H
+
+#include "ModuleBase.h"
+#include <ModelAPI_AttributeTables.h>
+
+class MODULEBASE_EXPORT ModuleBase_IStepPrs
+{
+public:
+  ModuleBase_IStepPrs();
+
+  virtual ModelAPI_AttributeTables::ValueType dataType() const = 0;
+
+  virtual bool dataRange(double& theMin, double& theMax) const = 0;
+};
+
+#endif
\ No newline at end of file
index ff7a2b44bd6b66dddcdefb00464f82ec599b2a21..e2d35c87b2a8111facc8ebd31d15db737b151aee 100644 (file)
@@ -74,25 +74,6 @@ ModuleBase_ResultPrs::ModuleBase_ResultPrs(ResultPtr theResult)
   ResultBodyPtr aResOwner = ModelAPI_Tools::bodyOwner(myResult);
   SetAutoHilight(aResOwner.get() == NULL);
 
-  init();
-}
-
-//********************************************************************
-ModuleBase_ResultPrs::ModuleBase_ResultPrs(FieldStepPtr theStep)
-  : ViewerData_AISShape(TopoDS_Shape()), myStep(theStep), myAdditionalSelectionPriority(0),
-  myTransparency(1), myIsSubstituted(false)
-{
-  GeomShapePtr aShapePtr = theStep->field()->shape();
-  TopoDS_Shape aShape = aShapePtr->impl<TopoDS_Shape>();
-  Set(aShape);
-
-  init();
-}
-
-
-//********************************************************************
-void ModuleBase_ResultPrs::init()
-{
   // Set own free boundaries aspect in order to have free
   // and unfree boundaries with different colors
   Handle(Prs3d_Drawer) aDrawer = Attributes();
@@ -116,7 +97,6 @@ void ModuleBase_ResultPrs::init()
   setEdgesDefaultColor();
 }
 
-
 //********************************************************************
 void ModuleBase_ResultPrs::setAdditionalSelectionPriority(const int thePriority)
 {
@@ -261,21 +241,13 @@ bool ModuleBase_ResultPrs::setHiddenSubShapeTransparency(double theTransparency)
   return true;
 }
 
-//********************************************************************
-GeomShapePtr ModuleBase_ResultPrs::getOriginalShape() const
-{
-  if (myStep.get())
-    return myStep->field()->shape();
-  return myResult->shape();
-}
-
 //********************************************************************
 void ModuleBase_ResultPrs::Compute(
           const Handle(PrsMgr_PresentationManager3d)& thePresentationManager,
           const Handle(Prs3d_Presentation)& thePresentation,
           const Standard_Integer theMode)
 {
-  std::shared_ptr<GeomAPI_Shape> aShapePtr = getOriginalShape();
+  std::shared_ptr<GeomAPI_Shape> aShapePtr = myResult->shape();
   bool aReadyToDisplay = aShapePtr.get();
   if (aReadyToDisplay) {
     myOriginalShape = aShapePtr->impl<TopoDS_Shape>();
index df01f95c0a241afba04c0194dc1e6f2e6058b3ee..1868ad8dbb4c2ada4fe36872510f02f161f053f5 100644 (file)
@@ -57,10 +57,6 @@ public:
   /// \param theResult a result object
   Standard_EXPORT ModuleBase_ResultPrs(ResultPtr theResult);
 
-  /// Constructor
-  /// \param theResult a result object
-  Standard_EXPORT ModuleBase_ResultPrs(FieldStepPtr theStep);
-
   //! Method which draws selected owners ( for fast presentation draw )
   Standard_EXPORT virtual void HilightSelected(const Handle(PrsMgr_PresentationManager3d)& thePM,
                                                const SelectMgr_SequenceOfOwner& theOwners);
@@ -152,17 +148,10 @@ private:
 
   void setEdgesDefaultColor();
 
-  void init();
-
-  GeomShapePtr getOriginalShape() const;
-
 private:
   /// Reference to result object
   ResultPtr myResult;
 
-  /// Reference to step object (initialised is only or step or result)
-  FieldStepPtr myStep;
-
   /// Original shape of the result object
   TopoDS_Shape myOriginalShape;
 
index 178c0b8bf886c15a31f8423be1b6ffbe2f915729..47f29b01bc86c4494d235d84a3f76fe2856e6879 100644 (file)
@@ -58,6 +58,7 @@ SET(PROJECT_HEADERS
     PartSet_CenterPrs.h
     PartSet_ExternalPointsMgr.h
        PartSet_TreeNodes.h
+       PartSet_FieldStepPrs.h
 )
 
 SET(PROJECT_MOC_HEADERS
@@ -107,6 +108,7 @@ SET(PROJECT_SOURCES
     PartSet_CenterPrs.cpp
     PartSet_ExternalPointsMgr.cpp
        PartSet_TreeNodes.cpp
+       PartSet_FieldStepPrs.cpp
 )
 
 SET(PROJECT_RESOURCES
diff --git a/src/PartSet/PartSet_FieldStepPrs.cpp b/src/PartSet/PartSet_FieldStepPrs.cpp
new file mode 100644 (file)
index 0000000..c699c8e
--- /dev/null
@@ -0,0 +1,138 @@
+// Copyright (C) 2014-2019  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 "PartSet_FieldStepPrs.h"
+
+#include <CollectionPlugin_Field.h>
+
+#include <ModelAPI_AttributeSelectionList.h>
+#include <ModelAPI_AttributeIntArray.h>
+#include <ModelAPI_AttributeStringArray.h>
+
+#include <AIS_ColorScale.hxx>
+
+
+IMPLEMENT_STANDARD_RTTIEXT(PartSet_FieldStepPrs, ViewerData_AISShape);
+
+
+void emptyDeleter(ModelAPI_ResultField* theF)
+{
+  // Do nothing
+}
+
+PartSet_FieldStepPrs::PartSet_FieldStepPrs(FieldStepPtr theStep)
+: ViewerData_AISShape(TopoDS_Shape()), myStep(theStep)
+{
+  ModelAPI_ResultField* aField = theStep->field();
+  GeomShapePtr aShapePtr = aField->shape();
+  TopoDS_Shape aShape = aShapePtr->impl<TopoDS_Shape>();
+  Set(aShape);
+
+  // Get parameters of the Field
+  // Make shared_ptr which will not delete original pointer after exit
+  std::shared_ptr<ModelAPI_ResultField> aFieldPtr(aField, emptyDeleter);
+  myFeature = ModelAPI_Feature::feature(aFieldPtr);
+}
+
+
+ModelAPI_AttributeTables::ValueType PartSet_FieldStepPrs::dataType() const
+{
+  DataPtr aData = myFeature->data();
+  AttributeTablesPtr aTablesAttr = aData->tables(CollectionPlugin_Field::VALUES_ID());
+  return aTablesAttr->type();
+}
+
+bool PartSet_FieldStepPrs::dataRange(double& theMin, double& theMax) const
+{
+  ModelAPI_AttributeTables::ValueType aType = dataType();
+  if ((aType == ModelAPI_AttributeTables::DOUBLE) || (aType == ModelAPI_AttributeTables::INTEGER)) {
+    range(theMin, theMax);
+    return true;
+  }
+  return false;
+}
+
+QList<double> PartSet_FieldStepPrs::range(double& theMin, double& theMax) const
+{
+  ModelAPI_AttributeTables::ValueType aType = dataType();
+  DataPtr aData = myFeature->data();
+  int aStep = myStep->id();
+  AttributeTablesPtr aTablesAttr = aData->tables(CollectionPlugin_Field::VALUES_ID());
+  int aRows = aTablesAttr->rows();
+  int aCols = aTablesAttr->columns();
+
+  QList<double> aFieldStepData;
+  for (int j = 0; j < aCols; j++) {
+    for (int k = 1; k < aRows; k++) { // Do not use default values
+      ModelAPI_AttributeTables::Value aVal = aTablesAttr->value(k, j, aStep);
+      switch (aType) {
+      case ModelAPI_AttributeTables::DOUBLE:
+        aFieldStepData << aVal.myDouble;
+        break;
+      case ModelAPI_AttributeTables::INTEGER:
+        aFieldStepData << aVal.myInt;
+        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;
+    }
+    aNorm = pow(aNorm, 0.5);
+    aRangeMin = Min(aRangeMin, aNorm);
+    aRangeMax = Max(aRangeMax, aNorm);
+    aShapeData << aNorm;
+  }
+  theMin = aRangeMin;
+  theMax = aRangeMax;
+  return aShapeData;
+}
+
+
+void PartSet_FieldStepPrs::Compute(const Handle(PrsMgr_PresentationManager3d)& thePrsMgr,
+  const Handle(Prs3d_Presentation)& thePrs, const Standard_Integer theMode)
+{
+  ModelAPI_AttributeTables::ValueType aType = dataType();
+  if ((aType == ModelAPI_AttributeTables::DOUBLE) ||
+    (aType == ModelAPI_AttributeTables::INTEGER)) {
+    double aMin, aMax;
+    QList<double> aShapeData = range(aMin, aMax);
+    int aNbIntertvals = 20;
+
+    DataPtr aData = myFeature->data();
+    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);
+      Quantity_Color aColor;
+      if (AIS_ColorScale::FindColor(aValue, aMin, aMax, aNbIntertvals, aColor))
+        SetCustomColor(aShape, aColor);
+    }
+  }
+  ViewerData_AISShape::Compute(thePrsMgr, thePrs, theMode);
+}
diff --git a/src/PartSet/PartSet_FieldStepPrs.h b/src/PartSet/PartSet_FieldStepPrs.h
new file mode 100644 (file)
index 0000000..9aa671f
--- /dev/null
@@ -0,0 +1,65 @@
+// Copyright (C) 2014-2019  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 PartSet_FieldStepPrs_H
+#define PartSet_FieldStepPrs_H
+
+#include "PartSet.h"
+#include <ModuleBase_IStepPrs.h>
+
+#include <ModelAPI_ResultField.h>
+#include <ModelAPI_Feature.h>
+
+#include <ViewerData_AISShape.hxx>
+
+#include <QList>
+
+DEFINE_STANDARD_HANDLE(PartSet_FieldStepPrs, ViewerData_AISShape)
+
+/**
+* \ingroup GUI
+* A redefinition of standard AIS Interactive Object in order to provide specific behaviour
+* for wire presentations based in a one plane
+*/
+class PartSet_FieldStepPrs : public ViewerData_AISShape, public ModuleBase_IStepPrs
+{
+public:
+  /// Constructor
+  /// \param theResult a result object
+  Standard_EXPORT PartSet_FieldStepPrs(FieldStepPtr theStep);
+
+  ModelAPI_AttributeTables::ValueType dataType() const;
+
+  bool dataRange(double& theMin, double& theMax) const;
+
+  DEFINE_STANDARD_RTTIEXT(PartSet_FieldStepPrs, ViewerData_AISShape)
+
+protected:
+  //! Compute presentation considering sub-shape color map.
+  virtual void Compute(const Handle(PrsMgr_PresentationManager3d)& thePrsMgr,
+    const Handle(Prs3d_Presentation)& thePrs,  const Standard_Integer theMode);
+
+private:
+  QList<double> range(double& theMin, double& theMax) const;
+
+  FieldStepPtr myStep;
+  FeaturePtr myFeature;
+};
+
+#endif
index bbf82b6be2110c219c9afeb8ffc1fa1611278f50..62987b49715b11db131581a1f2eafe51a9ac5aac 100644 (file)
@@ -38,6 +38,7 @@
 #include "PartSet_IconFactory.h"
 #include "PartSet_OverconstraintListener.h"
 #include "PartSet_TreeNodes.h"
+#include "PartSet_FieldStepPrs.h"
 
 #include "PartSet_Filters.h"
 #include "PartSet_FilterInfinite.h"
@@ -62,6 +63,7 @@
 #include <ModuleBase_WidgetFactory.h>
 #include <ModuleBase_OperationDescription.h>
 #include <ModuleBase_ViewerPrs.h>
+#include <ModelAPI_ResultField.h>
 
 #include <ModelAPI_Object.h>
 #include <ModelAPI_Events.h>
@@ -1313,9 +1315,19 @@ void PartSet_Module::onActiveDocPopup(const QPoint& thePnt)
 }
 
 //******************************************************
-Handle(AIS_InteractiveObject) PartSet_Module::createPresentation(const ResultPtr& theResult)
+Handle(AIS_InteractiveObject) PartSet_Module::createPresentation(const ObjectPtr& theObject)
 {
-  return mySketchMgr->createPresentation(theResult);
+  ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
+  if (aResult.get())
+    return mySketchMgr->createPresentation(aResult);
+  else {
+    FieldStepPtr aStep =
+      std::dynamic_pointer_cast<ModelAPI_ResultField::ModelAPI_FieldStep>(theObject);
+    if (aStep.get()) {
+      return new PartSet_FieldStepPrs(aStep);
+    }
+  }
+  return Handle(AIS_InteractiveObject)();
 }
 
 //******************************************************
index 1f23bc733a28aabffe5de7686d71aacf4e7e2e29..25c269059e2712d098ed8c7182e0fe63fa16289f 100644 (file)
@@ -335,8 +335,7 @@ public:
   /// Create specific for the module presentation
   /// \param theResult an object for presentation
   /// \return created presentation or NULL(default value)
-  virtual Handle(AIS_InteractiveObject) createPresentation(
-                              const std::shared_ptr<ModelAPI_Result>& theResult);
+  virtual Handle(AIS_InteractiveObject) createPresentation(const ObjectPtr& theResult);
 
   //! Returns data object by AIS
   virtual ObjectPtr findPresentedObject(const AISObjectPtr& theAIS) const;
index 30f94ef70929ad744c19856f8bc2b01c9a579453..23753cf8ca2811567bb4dc9c5ceece3f3ab4d4af 100644 (file)
@@ -38,7 +38,6 @@
 #include <ModelAPI_AttributeIntArray.h>
 #include <ModelAPI_ResultBody.h>
 #include <ModelAPI_ResultConstruction.h>
-#include <ModelAPI_ResultField.h>
 
 #include <ModuleBase_BRepOwner.h>
 #include <ModuleBase_IModule.h>
@@ -158,24 +157,23 @@ bool XGUI_Displayer::display(ObjectPtr theObject, bool theUpdateViewer)
       }
       anAIS = aPrs->getAISObject(anAIS);
     } else {
-      ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
-      if (aResult.get() != NULL) {
-        anAIS = createPresentation(aResult);
-        isShading = true;
-      }
-      else {
-        FieldStepPtr aStep =
-          std::dynamic_pointer_cast<ModelAPI_ResultField::ModelAPI_FieldStep>(theObject);
-        if (aStep) {
-          GeomShapePtr aShapePtr = aStep->field()->shape();
+      Handle(AIS_InteractiveObject) anAISPrs =
+        myWorkshop->module()->createPresentation(theObject);
+      if (anAISPrs.IsNull()) {
+        ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
+        if (aResult.get() != NULL) {
+          std::shared_ptr<GeomAPI_Shape> aShapePtr = ModelAPI_Tools::shape(aResult);
           if (aShapePtr.get() != NULL) {
-            Handle(AIS_InteractiveObject) anAISPrs = new ModuleBase_ResultPrs(aStep);
-            anAIS = AISObjectPtr(new GeomAPI_AISObject());
-            anAIS->setImpl(new Handle(AIS_InteractiveObject)(anAISPrs));
-            isShading = true;
+             anAISPrs = new ModuleBase_ResultPrs(aResult);
           }
         }
       }
+      Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast(anAISPrs);
+      if (!aShapePrs.IsNull())
+        ModuleBase_Tools::setPointBallHighlighting((AIS_Shape*)aShapePrs.get());
+      anAIS = AISObjectPtr(new GeomAPI_AISObject());
+      anAIS->setImpl(new Handle(AIS_InteractiveObject)(anAISPrs));
+      isShading = true;
     }
     if (anAIS)
       aDisplayed = display(theObject, anAIS, isShading, theUpdateViewer);
@@ -184,30 +182,6 @@ bool XGUI_Displayer::display(ObjectPtr theObject, bool theUpdateViewer)
 }
 
 
-//**************************************************************
-AISObjectPtr XGUI_Displayer::createPresentation(const ResultPtr& theResult) const
-{
-  AISObjectPtr anAIS;
-  if (theResult.get() != NULL) {
-    std::shared_ptr<GeomAPI_Shape> aShapePtr = ModelAPI_Tools::shape(theResult);
-    if (aShapePtr.get() != NULL) {
-      anAIS = AISObjectPtr(new GeomAPI_AISObject());
-      Handle(AIS_InteractiveObject) anAISPrs =
-        myWorkshop->module()->createPresentation(theResult);
-      if (anAISPrs.IsNull())
-        anAISPrs = new ModuleBase_ResultPrs(theResult);
-      else {
-        Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast(anAISPrs);
-        if (!aShapePrs.IsNull())
-          ModuleBase_Tools::setPointBallHighlighting((AIS_Shape*)aShapePrs.get());
-      }
-      anAIS->setImpl(new Handle(AIS_InteractiveObject)(anAISPrs));
-    }
-  }
-  return anAIS;
-}
-
-
 //**************************************************************
 bool canBeShaded(Handle(AIS_InteractiveObject) theAIS, ModuleBase_IModule* theModule)
 {
index df1237c43087d75b2510b67e3a3b8a8e758a0e49..62362084acfc89d1c771c78a0dc228952cce1978 100644 (file)
@@ -443,8 +443,6 @@ private:
 private:
   XGUI_SelectionActivate* selectionActivate() const;
 
-  AISObjectPtr createPresentation(const ResultPtr& theResult) const;
-
 private:
   XGUI_Workshop* myWorkshop; ///< Reference to workshop
 #ifdef TINSPECTOR
index 78b20ee7d68cdf9a6d0dd07c4e0d2ccd9d076614..ba01295668be7a1b1edd2b212841a74da01255eb 100644 (file)
@@ -40,6 +40,8 @@
 #include <ModelAPI_Object.h>
 #include <ModelAPI_ResultBody.h>
 #include <ModelAPI_Tools.h>
+#include <ModelAPI_ResultField.h>
+#include <ModuleBase_IStepPrs.h>
 
 #include <GeomAPI_Shape.h>
 
@@ -130,6 +132,38 @@ void XGUI_SelectionMgr::onObjectBrowserSelection()
     }
   }
   aDisplayer->setSelected(aSelectedPrs);
+  myWorkshop->viewer()->setColorScaleShown(false);
+  if (aSelectedPrs.size() == 1) {
+    FieldStepPtr aStep =
+      std::dynamic_pointer_cast<ModelAPI_ResultField::ModelAPI_FieldStep>
+      (aSelectedPrs.first()->object());
+    XGUI_Displayer* aDisplayer = myWorkshop->displayer();
+    if (aStep.get() && aDisplayer->isVisible(aStep)) {
+      XGUI_ViewerProxy* aViewer = myWorkshop->viewer();
+      AISObjectPtr aAisPtr = aDisplayer->getAISObject(aStep);
+      Handle(AIS_InteractiveObject) aIO = aAisPtr->impl<Handle(AIS_InteractiveObject)>();
+      ModuleBase_IStepPrs* aPrs = dynamic_cast<ModuleBase_IStepPrs*>(aIO.get());
+      if (aPrs) {
+        ModelAPI_AttributeTables::ValueType aType = aPrs->dataType();
+        if ((aType == ModelAPI_AttributeTables::DOUBLE) ||
+          (aType == ModelAPI_AttributeTables::INTEGER) ||
+          (aType == ModelAPI_AttributeTables::BOOLEAN)) {
+          aViewer->setupColorScale();
+          if (aType == ModelAPI_AttributeTables::BOOLEAN) {
+            aViewer->setColorScaleIntervals(2);
+            aViewer->setColorScaleRange(0, 1);
+          }
+          else {
+            double aMin, aMax;
+            aPrs->dataRange(aMin, aMax);
+            aViewer->setColorScaleRange(aMin, aMax);
+          }
+          aViewer->setColorScaleTitle("Step");
+          aViewer->setColorScaleShown(true);
+        }
+      }
+    }
+  }
   emit selectionChanged();
 }
 
index 6a33fefb14548d7c92370101b149e305c662a50d..43890885baf0a38bb1fd9d84e0db5e989a95bd4c 100644 (file)
@@ -559,6 +559,99 @@ void XGUI_ViewerProxy::onKeyRelease(ModuleBase_IViewWindow* theWnd, QKeyEvent* t
 }
 #endif
 
+
+bool XGUI_ViewerProxy::isColorScaleVisible() const
+{
+#ifdef HAVE_SALOME
+  return myWorkshop->salomeConnector()->viewer()->isColorScaleVisible();
+#else
+  return myWorkshop->mainWindow()->viewer()->isColorScaleVisible();
+#endif
+}
+
+void XGUI_ViewerProxy::setColorScaleShown(bool on)
+{
+#ifdef HAVE_SALOME
+  myWorkshop->salomeConnector()->viewer()->setColorScaleShown(on);
+#else
+  myWorkshop->mainWindow()->viewer()->setColorScaleShown(on);
+#endif
+}
+
+void XGUI_ViewerProxy::setColorScalePosition(double theX, double theY)
+{
+  QWidget* aWindow = activeViewPort();
+#ifdef HAVE_SALOME
+  myWorkshop->salomeConnector()->viewer()->setColorScaleShown(on);
+#else
+  Handle(AIS_ColorScale) aColorScale = myWorkshop->mainWindow()->viewer()->colorScale();
+  aColorScale->SetPosition(aWindow->width() * theX, aWindow->height() * theY);
+#endif
+}
+
+void XGUI_ViewerProxy::setColorScaleSize(double theW, double theH)
+{
+  QWidget* aWindow = activeViewPort();
+#ifdef HAVE_SALOME
+  myWorkshop->salomeConnector()->viewer()->setColorScaleShown(on);
+#else
+  Handle(AIS_ColorScale) aColorScale = myWorkshop->mainWindow()->viewer()->colorScale();
+  aColorScale->SetWidth(aWindow->width() * theW);
+  aColorScale->SetHeight(aWindow->height() * theH);
+#endif
+}
+
+void XGUI_ViewerProxy::setColorScaleRange(double theMin, double theMax)
+{
+#ifdef HAVE_SALOME
+  myWorkshop->salomeConnector()->viewer()->setColorScaleShown(on);
+#else
+  Handle(AIS_ColorScale) aColorScale = myWorkshop->mainWindow()->viewer()->colorScale();
+  aColorScale->SetRange(theMin, theMax);
+#endif
+}
+
+void XGUI_ViewerProxy::setColorScaleIntervals(int theNb)
+{
+#ifdef HAVE_SALOME
+  myWorkshop->salomeConnector()->viewer()->setColorScaleShown(on);
+#else
+  Handle(AIS_ColorScale) aColorScale = myWorkshop->mainWindow()->viewer()->colorScale();
+  aColorScale->SetNumberOfIntervals(theNb);
+#endif
+}
+
+void XGUI_ViewerProxy::setColorScaleTextHeigth(int theH)
+{
+#ifdef HAVE_SALOME
+  myWorkshop->salomeConnector()->viewer()->setColorScaleShown(on);
+#else
+  Handle(AIS_ColorScale) aColorScale = myWorkshop->mainWindow()->viewer()->colorScale();
+  aColorScale->SetTextHeight(theH);
+#endif
+}
+
+void XGUI_ViewerProxy::setColorScaleTitle(const QString& theText)
+{
+#ifdef HAVE_SALOME
+  myWorkshop->salomeConnector()->viewer()->setColorScaleShown(on);
+#else
+  Handle(AIS_ColorScale) aColorScale = myWorkshop->mainWindow()->viewer()->colorScale();
+  aColorScale->SetTitle(theText.toStdString().c_str());
+#endif
+}
+
+
+//******************************************************
+void XGUI_ViewerProxy::setupColorScale()
+{
+  setColorScalePosition(0.03, 0.35);
+  setColorScaleSize(0.2, 0.5);
+  setColorScaleTextHeigth(14);
+  setColorScaleIntervals(20);
+}
+
+
 //***************************************
 //void XGUI_ViewerProxy::Zfitall()
 //{
index cf73432d85f13954f662c43405b331fc60242891..384372390d326e7956c66b1924c5b6d0befed289 100644 (file)
@@ -119,6 +119,44 @@ Q_OBJECT
 
   virtual void updateHighlight();
 
+  // Methods for color scale management
+
+  //! Returns True if ColorScale is visible
+  virtual bool isColorScaleVisible() const;
+
+  //! Show/Hide ColorScale object
+  virtual void setColorScaleShown(bool on);
+
+  //! Set position of color scale
+  // \param theX is X position relative to current view width
+  // \param theY is Y position relative to current view heigth
+  virtual void setColorScalePosition(double theX, double theY);
+
+  //! Set size of color scale
+  // \param theW is width relative to current view width
+  // \param theh is height relative to current view heigth
+  virtual void setColorScaleSize(double theW, double theH);
+
+  //! Set range of color scale
+  // \param theMin is a minimal value
+  // \param theMax is a maximal value
+  virtual void setColorScaleRange(double theMin, double theMax);
+
+  //! Set number of intervals of color scale
+  // \param theNb is number of intervals
+  virtual void setColorScaleIntervals(int theNb);
+
+  //! Set text heigth of color scale
+  // \param theH is number of intervals
+  virtual void setColorScaleTextHeigth(int theH);
+
+  //! Set title of color scale
+  // \param theText is a title
+  virtual void setColorScaleTitle(const QString& theText);
+
+  //! Set color scale parameters according to user preferences and window size
+  void setupColorScale();
+
   // Fit all along Z (perpendicular to display)
   //virtual void Zfitall();
 
@@ -163,6 +201,7 @@ private slots:
    void displayHighlight(FeaturePtr theFeature, const TopoDS_Shape& theIgnoreShape);
    void eraseHighlight();
 
+
   XGUI_Workshop* myWorkshop;
   ResultPtr myResult;
   AIS_ListOfInteractive myHighlights;