Salome HOME
Make same planes cannot be used twice in partition tool
[modules/shaper.git] / src / XGUI / XGUI_Selection.cpp
index a8cd9cc3b35e678388857a52ee9eafbbada053ef..079c30cba599938890356ce430a0cb9d2c1727d2 100644 (file)
 #include "XGUI_ViewerProxy.h"
 #include "XGUI_ObjectsBrowser.h"
 
+#include "ModuleBase_ResultPrs.h"
+
 #include <ModelAPI_Feature.h>
+#include <ModelAPI_Tools.h>
 
 #include <AIS_InteractiveContext.hxx>
+#include <AIS_Axis.hxx>
+#include <AIS_Point.hxx>
+#include <Geom_Line.hxx>
+#include <BRep_Builder.hxx>
+#include <TopoDS_Edge.hxx>
+#include <Geom_Point.hxx>
+#include <Geom_TrimmedCurve.hxx>
+#include <Prs3d_DatumAspect.hxx>
 
 #include <TColStd_ListIteratorOfListOfInteger.hxx>
 #include <StdSelect_BRepOwner.hxx>
 
 #include <set>
 
+#define DEBUG_DELIVERY
+
 XGUI_Selection::XGUI_Selection(XGUI_Workshop* theWorkshop)
     : myWorkshop(theWorkshop)
 {
@@ -64,10 +77,7 @@ Handle(AIS_InteractiveObject) XGUI_Selection::getIO(const ModuleBase_ViewerPrs&
 void XGUI_Selection::getSelectedInViewer(QList<ModuleBase_ViewerPrs>& thePresentations) const
 {
   Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
-  if (aContext.IsNull())
-    return;
-
-  if (aContext->HasOpenedContext()) {
+  if (!aContext.IsNull() && aContext->HasOpenedContext()) {
     QList<long> aSelectedIds; // Remember of selected address in order to avoid duplicates
     for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) {
       ModuleBase_ViewerPrs aPrs;
@@ -121,22 +131,76 @@ void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrs& thePrs,
     // the located method is called in the context to obtain the shape by the SelectedShape() method,
     // so the shape is located by the same rules
     TopoDS_Shape aShape = aBRO->Shape().Located (aBRO->Location() * aBRO->Shape().Location());
+#ifndef DEBUG_DELIVERY
+    if (aShape.IsNull())
+      aShape = findAxisShape(anIO);
+#endif
     if (!aShape.IsNull())
       thePrs.setShape(aShape);
-  }      
+  } else {
+#ifdef DEBUG_DELIVERY
+    // Fill by trihedron shapes
+    Handle(AIS_Axis) aAxis = Handle(AIS_Axis)::DownCast(anIO);
+    if (!aAxis.IsNull()) {
+      // an Axis from Trihedron
+      Handle(Geom_Line) aLine = aAxis->Component();
+      Handle(Prs3d_DatumAspect) DA = aAxis->Attributes()->DatumAspect();
+      Handle(Geom_TrimmedCurve) aTLine = new Geom_TrimmedCurve(aLine, 0, DA->FirstAxisLength());
+
+      BRep_Builder aBuilder;      
+      TopoDS_Edge aEdge;
+      aBuilder.MakeEdge(aEdge, aTLine, Precision::Confusion());
+      if (!aEdge.IsNull())
+        thePrs.setShape(aEdge);
+    } else {
+      Handle(AIS_Point) aPoint = Handle(AIS_Point)::DownCast(anIO);
+      if (!aPoint.IsNull()) {
+        // A point from trihedron
+        Handle(Geom_Point) aPnt = aPoint->Component();
+        BRep_Builder aBuilder;
+        TopoDS_Vertex aVertex;
+        aBuilder.MakeVertex(aVertex, aPnt->Pnt(), Precision::Confusion());
+        if (!aVertex.IsNull())
+          thePrs.setShape(aVertex);
+      }
+    }
+#endif
+  }
      
   XGUI_Displayer* aDisplayer = myWorkshop->displayer();
   ObjectPtr aFeature = aDisplayer->getObject(anIO);
+
+  Handle(ModuleBase_BRepOwner) aCompSolidBRO = Handle(ModuleBase_BRepOwner)::DownCast(theOwner);
+  if (!aCompSolidBRO.IsNull()) {
+    // If ModuleBase_BRepOwner object is created then it means that TopAbs_COMPSOLID selection mode
+    // is On and we have to use parent result which corresponds to the CompSolid shape
+    ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(aFeature);
+    if (aResult.get()) {
+      ResultCompSolidPtr aCompSolid = ModelAPI_Tools::compSolidOwner(aResult);
+      if (aCompSolid.get()) {
+        GeomShapePtr aShapePtr = aCompSolid->shape();
+        if (aShapePtr.get()) {
+          TopoDS_Shape aShape = aShapePtr->impl<TopoDS_Shape>();
+          if (aShape.IsEqual(thePrs.shape())) {
+            thePrs.setObject(aCompSolid);
+            return;
+          }
+        }
+      }
+    }
+  }
   thePrs.setObject(aFeature);
 }
 
 QList<ModuleBase_ViewerPrs> XGUI_Selection::getHighlighted() const
 {
-  QList<long> aSelectedIds; // Remember of selected address in order to avoid duplicates
   QList<ModuleBase_ViewerPrs> aPresentations;
-  XGUI_Displayer* aDisplayer = myWorkshop->displayer();
-
   Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
+  if (aContext.IsNull())
+    return aPresentations;
+
+  QList<long> aSelectedIds; // Remember of selected address in order to avoid duplicates
+  XGUI_Displayer* aDisplayer = myWorkshop->displayer();
   for (aContext->InitDetected(); aContext->MoreDetected(); aContext->NextDetected()) {
     ModuleBase_ViewerPrs aPrs;
     Handle(AIS_InteractiveObject) anIO = aContext->DetectedInteractive();
@@ -195,10 +259,13 @@ QModelIndexList XGUI_Selection::selectedIndexes() const
 //**************************************************************
 void XGUI_Selection::selectedAISObjects(AIS_ListOfInteractive& theList) const
 {
-  Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
   theList.Clear();
-  for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected())
-    theList.Append(aContext->SelectedInteractive());
+
+  Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
+  if (!aContext.IsNull()) {
+    for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected())
+      theList.Append(aContext->SelectedInteractive());
+  }
 }
 
 //**************************************************************
@@ -221,8 +288,14 @@ void XGUI_Selection::selectedShapes(NCollection_List<TopoDS_Shape>& theList,
 {
   theList.Clear();
   Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
+  if (aContext.IsNull())
+    return;
+
   for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) {
     TopoDS_Shape aShape = aContext->SelectedShape();
+    if (aShape.IsNull()) {
+      aShape = findAxisShape(aContext->SelectedInteractive());
+    }
     if (!aShape.IsNull()) {
       theList.Append(aShape);
       Handle(SelectMgr_EntityOwner) aEO = aContext->SelectedOwner();
@@ -240,9 +313,10 @@ void XGUI_Selection::selectedShapes(NCollection_List<TopoDS_Shape>& theList,
 void XGUI_Selection::selectedOwners(SelectMgr_IndexedMapOfOwner& theSelectedOwners) const
 {
   Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
-
-  for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) {
-    theSelectedOwners.Add(aContext->SelectedOwner());
+  if (!aContext.IsNull()) {
+    for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) {
+      theSelectedOwners.Add(aContext->SelectedOwner());
+    }
   }
 }
 
@@ -251,8 +325,7 @@ void XGUI_Selection::entityOwners(const Handle(AIS_InteractiveObject)& theObject
                                   SelectMgr_IndexedMapOfOwner& theOwners) const
 {
   Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
-
-  if (theObject.IsNull() || aContext.IsNull())
+  if (aContext.IsNull() || theObject.IsNull())
     return;
 
   TColStd_ListOfInteger aModes;
@@ -276,3 +349,35 @@ void XGUI_Selection::entityOwners(const Handle(AIS_InteractiveObject)& theObject
     }
   }
 }
+
+//**************************************************************
+TopoDS_Shape XGUI_Selection::findAxisShape(Handle(AIS_InteractiveObject) theIO) const
+{
+  TopoDS_Shape aShape;
+  // Fill by trihedron shapes
+  Handle(AIS_Axis) aAxis = Handle(AIS_Axis)::DownCast(theIO);
+  if (!aAxis.IsNull()) {
+    // an Axis from Trihedron
+    Handle(Geom_Line) aLine = aAxis->Component();
+    Handle(Prs3d_DatumAspect) DA = aAxis->Attributes()->DatumAspect();
+    Handle(Geom_TrimmedCurve) aTLine = new Geom_TrimmedCurve(aLine, 0, DA->FirstAxisLength());
+
+    BRep_Builder aBuilder;      
+    TopoDS_Edge aEdge;
+    aBuilder.MakeEdge(aEdge, aTLine, Precision::Confusion());
+    if (!aEdge.IsNull())
+      aShape = aEdge;
+  } else {
+    Handle(AIS_Point) aPoint = Handle(AIS_Point)::DownCast(theIO);
+    if (!aPoint.IsNull()) {
+      // A point from trihedron
+      Handle(Geom_Point) aPnt = aPoint->Component();
+      BRep_Builder aBuilder;
+      TopoDS_Vertex aVertex;
+      aBuilder.MakeVertex(aVertex, aPnt->Pnt(), Precision::Confusion());
+      if (!aVertex.IsNull())
+        aShape = aVertex;
+    }
+  }
+  return aShape;
+}