Salome HOME
Renaming Fill in Split : Help (General index)
[modules/shaper.git] / src / ModuleBase / ModuleBase_ResultPrs.cpp
old mode 100755 (executable)
new mode 100644 (file)
index 7c855b3..11ab42d
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2017  CEA/DEN, EDF R&D
+// 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
 //
 // 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 "ModuleBase_ResultPrs.h"
@@ -25,7 +24,8 @@
 #include <ModelAPI_Events.h>
 #include <ModelAPI_Tools.h>
 #include <ModelAPI_ResultConstruction.h>
-#include <ModelAPI_ResultCompSolid.h>
+#include <ModelAPI_ResultBody.h>
+#include <ModelAPI_AttributeIntArray.h>
 
 #include "ModuleBase_Tools.h"
 #include "ModuleBase_BRepOwner.h"
@@ -69,15 +69,22 @@ ModuleBase_ResultPrs::ModuleBase_ResultPrs(ResultPtr theResult)
   std::shared_ptr<GeomAPI_Shape> aShapePtr = ModelAPI_Tools::shape(theResult);
   TopoDS_Shape aShape = aShapePtr->impl<TopoDS_Shape>();
   Set(aShape);
+
+  // Set own free boundaries aspect in order to have free
+  // and unfree boundaries with different colors
   Handle(Prs3d_Drawer) aDrawer = Attributes();
+  Handle(Prs3d_LineAspect) aFreeBndAspect =
+    new Prs3d_LineAspect(Quantity_NOC_GREEN, Aspect_TOL_SOLID, 1);
+  aDrawer->SetFreeBoundaryAspect(aFreeBndAspect);
+
   if (aDrawer->HasOwnPointAspect())
     aDrawer->PointAspect()->SetTypeOfMarker(Aspect_TOM_PLUS);
   else
     aDrawer->SetPointAspect(new Prs3d_PointAspect(Aspect_TOM_PLUS, Quantity_NOC_YELLOW, 1.));
 
   // Activate individual repaintng if this is a part of compsolid
-  ResultCompSolidPtr aCompSolid = ModelAPI_Tools::compSolidOwner(myResult);
-  SetAutoHilight(aCompSolid.get() == NULL);
+  ResultBodyPtr aResOwner = ModelAPI_Tools::bodyOwner(myResult);
+  SetAutoHilight(aResOwner.get() == NULL);
 
   myHiddenSubShapesDrawer = new AIS_ColoredDrawer (myDrawer);
   Handle(Prs3d_ShadingAspect) aShadingAspect = new Prs3d_ShadingAspect();
@@ -85,6 +92,9 @@ ModuleBase_ResultPrs::ModuleBase_ResultPrs(ResultPtr theResult)
   myHiddenSubShapesDrawer->SetShadingAspect(aShadingAspect);
 
   ModuleBase_Tools::setPointBallHighlighting(this);
+
+  // Define colors for wireframe mode
+  setEdgesDefaultColor();
 }
 
 //********************************************************************
@@ -98,8 +108,40 @@ void ModuleBase_ResultPrs::SetColor (const Quantity_Color& theColor)
 {
   ViewerData_AISShape::SetColor(theColor);
   myHiddenSubShapesDrawer->ShadingAspect()->SetColor (theColor, myCurrentFacingModel);
+  setEdgesDefaultColor();
+}
+
+void ModuleBase_ResultPrs::setEdgesDefaultColor()
+{
+  AttributeIntArrayPtr aColorAttr = myResult->data()->intArray(ModelAPI_Result::COLOR_ID());
+  bool aHasColor = aColorAttr.get() && aColorAttr->isInitialized();
+
+  if (!aHasColor) {
+    Handle(Prs3d_Drawer) aDrawer = Attributes();
+    Handle(Prs3d_LineAspect) anAspect; // = aDrawer->LineAspect();
+    //anAspect->SetColor(Quantity_NOC_YELLOW);
+    //aDrawer->SetLineAspect(anAspect);
+
+    // - unfree boundaries color
+    anAspect = aDrawer->UnFreeBoundaryAspect();
+    anAspect->SetColor(Quantity_NOC_YELLOW);
+    aDrawer->SetUnFreeBoundaryAspect(anAspect);
+    aDrawer->SetUnFreeBoundaryDraw(true);
+
+    // - free boundaries color
+    anAspect = aDrawer->FreeBoundaryAspect();
+    anAspect->SetColor(Quantity_NOC_GREEN);
+    aDrawer->SetFreeBoundaryAspect(anAspect);
+    aDrawer->SetFreeBoundaryDraw(true);
+
+    // - standalone edges color
+    anAspect = aDrawer->WireAspect();
+    anAspect->SetColor(Quantity_NOC_RED);
+    aDrawer->SetWireAspect(anAspect);
+  }
 }
 
+
 //********************************************************************
 bool ModuleBase_ResultPrs::setSubShapeHidden(const NCollection_List<TopoDS_Shape>& theShapes)
 {
@@ -210,7 +252,12 @@ void ModuleBase_ResultPrs::Compute(
   }
   // change deviation coefficient to provide more precise circle
   //ModuleBase_Tools::setDefaultDeviationCoefficient(myResult, Attributes());
-  AIS_Shape::Compute(thePresentationManager, thePresentation, theMode);
+  try {
+    AIS_Shape::Compute(thePresentationManager, thePresentation, theMode);
+  }
+  catch (...) {
+    return;
+  }
 
   // visualize hidden sub-shapes transparent
   if (myTransparency < 1 && !myHiddenSubShapes.IsEmpty())
@@ -233,6 +280,7 @@ void ModuleBase_ResultPrs::collectSubShapes(BRep_Builder& theBuilder,
   const NCollection_List<TopoDS_Shape>& theHiddenSubShapes)
 {
   switch (theShape.ShapeType()) {
+    case TopAbs_COMPSOLID:
     case TopAbs_COMPOUND: {
       for (TopoDS_Iterator aChildIter (theShape); aChildIter.More(); aChildIter.Next())
         collectSubShapes(theBuilder, theCompound, aChildIter.Value(), theHiddenSubShapes);
@@ -322,9 +370,12 @@ void ModuleBase_ResultPrs::ComputeSelection(const Handle(SelectMgr_Selection)& a
   AIS_Shape::ComputeSelection(aSelection, theMode);
 
   if (myAdditionalSelectionPriority > 0) {
-    for (aSelection->Init(); aSelection->More(); aSelection->Next()) {
-      Handle(SelectBasics_EntityOwner) aBasicsOwner =
-        aSelection->Sensitive()->BaseSensitive()->OwnerId();
+    NCollection_Vector<Handle(SelectMgr_SensitiveEntity)> anEntities = aSelection->Entities();
+    for (NCollection_Vector<Handle(SelectMgr_SensitiveEntity)>::Iterator anIt(anEntities);
+        anIt.More();
+        anIt.Next()) {
+      Handle(SelectMgr_SensitiveEntity) anEntity = anIt.Value();
+      Handle(SelectBasics_EntityOwner) aBasicsOwner = anEntity->BaseSensitive()->OwnerId();
       if (!aBasicsOwner.IsNull())
         aBasicsOwner->Set(aBasicsOwner->Priority() + myAdditionalSelectionPriority);
     }
@@ -348,12 +399,18 @@ bool ModuleBase_ResultPrs::appendVertexSelection(const Handle(SelectMgr_Selectio
     StdSelect_BRepSelectionTool::ComputeSensitive(aShape, aOwner, aSelection,
                                                   aDeflection, myDrawer->HLRAngle(), 9, 500);
 
-    for (aSelection->Init(); aSelection->More(); aSelection->Next()) {
+
+    NCollection_Vector<Handle(SelectMgr_SensitiveEntity)> anEntities = aSelection->Entities();
+    for (NCollection_Vector<Handle(SelectMgr_SensitiveEntity)>::Iterator anIt(anEntities);
+        anIt.More();
+        anIt.Next()) {
+      Handle(SelectMgr_SensitiveEntity) anEntity = anIt.Value();
       Handle(SelectMgr_EntityOwner) anOwner =
         Handle(SelectMgr_EntityOwner)
-        ::DownCast(aSelection->Sensitive()->BaseSensitive()->OwnerId());
+        ::DownCast(anEntity->BaseSensitive()->OwnerId());
       anOwner->Set(this);
     }
+
     return true;
   }
   return false;