Salome HOME
Issue #1664: In the Sketcher, add the function Split a segment. AttrRefAttribute...
[modules/shaper.git] / src / PartSet / PartSet_OperationPrs.cpp
index 3573cb3998910274837eb4816d803ebe69a1ad49..d5e81272352a1ff9f17727c7227f32e4b31a9869 100755 (executable)
@@ -29,8 +29,9 @@
 #include <ModelAPI_Validator.h>
 #include <ModelAPI_Session.h>
 #include <ModelAPI_ResultCompSolid.h>
+#include <ModelAPI_Tools.h>
 
-#include <Events_Error.h>
+#include <Events_InfoMessage.h>
 #include <Events_Loop.h>
 
 #include <GeomAPI_IPresentable.h>
 
 #include <QList>
 
+#include <gp_Pnt.hxx>
+#include <TopoDS_Vertex.hxx>
+#include <BRepBuilderAPI_MakeVertex.hxx>
+#include <BRep_Builder.hxx>
+#include <TopoDS_Compound.hxx>
+
 //#define DEBUG_EMPTY_SHAPE
+//#define DEBUG_OPERATION_PRS
 
 // multi-rotation/translation operation
 //#define DEBUG_HIDE_COPY_ATTRIBUTE
@@ -54,12 +62,21 @@ IMPLEMENT_STANDARD_RTTIEXT(PartSet_OperationPrs, ViewerData_AISShape);
 PartSet_OperationPrs::PartSet_OperationPrs(ModuleBase_IWorkshop* theWorkshop)
 : ViewerData_AISShape(TopoDS_Shape()), myWorkshop(theWorkshop), myUseAISWidth(false)
 {
+#ifdef DEBUG_OPERATION_PRS
+  qDebug("PartSet_OperationPrs::PartSet_OperationPrs");
+#endif
   myShapeColor = Quantity_Color(1, 1, 1, Quantity_TOC_RGB);
+
+  // first presentation for having correct Compute until presentation with shapes are set
+  gp_Pnt aPnt(0.0, 0.0, 0.0);
+  BRepBuilderAPI_MakeVertex aMaker(aPnt);
+  TopoDS_Vertex aVertex = aMaker.Vertex();
+  myShapeToPrsMap.Bind(aVertex, NULL);
 }
 
 bool PartSet_OperationPrs::hasShapes()
 {
-  return !myFeatureShapes.empty();
+  return !myShapeToPrsMap.IsEmpty();
 }
 
 void PartSet_OperationPrs::setShapeColor(const Quantity_Color& theColor)
@@ -76,25 +93,26 @@ void PartSet_OperationPrs::Compute(const Handle(PrsMgr_PresentationManager3d)& t
                                    const Handle(Prs3d_Presentation)& thePresentation, 
                                    const Standard_Integer theMode)
 {
+#ifdef DEBUG_OPERATION_PRS
+  qDebug("PartSet_OperationPrs::Compute -- begin");
+#endif
+
   SetColor(myShapeColor);
   thePresentation->Clear();
-
-  NCollection_DataMap<TopoDS_Shape, Handle(AIS_InteractiveObject)> aShapeToPrsMap;
-  fillShapeList(myFeatureShapes, aShapeToPrsMap);
-
   bool aReadyToDisplay = !myShapeToPrsMap.IsEmpty();
-  if (aReadyToDisplay) {
-    myShapeToPrsMap.Clear();
-    myShapeToPrsMap.Assign(aShapeToPrsMap);
-  }
 
   XGUI_Displayer* aDisplayer = XGUI_Tools::workshop(myWorkshop)->displayer();
   Handle(Prs3d_Drawer) aDrawer = Attributes();
   // create presentations on the base of the shapes
+  BRep_Builder aBuilder;
+  TopoDS_Compound aComp;
+  aBuilder.MakeCompound(aComp);
   for(NCollection_DataMap<TopoDS_Shape, Handle(AIS_InteractiveObject)>::Iterator anIter(myShapeToPrsMap);
       anIter.More(); anIter.Next()) {
     const TopoDS_Shape& aShape = anIter.Key();
+    aBuilder.Add(aComp, aShape);
     // change deviation coefficient to provide more precise circle
+    // as there is no result, the shape is processed to correct deviation. To be unified
     ModuleBase_Tools::setDefaultDeviationCoefficient(aShape, aDrawer);
 
     if (myUseAISWidth) {
@@ -111,13 +129,17 @@ void PartSet_OperationPrs::Compute(const Handle(PrsMgr_PresentationManager3d)& t
     }
     StdPrs_WFDeflectionShape::Add(thePresentation, aShape, aDrawer);
   }
-
+  Set(aComp);
   if (!aReadyToDisplay) {
-    //Events_Error::throwException("An empty AIS presentation: PartSet_OperationPrs");
-    //std::shared_ptr<Events_Message> aMsg = std::shared_ptr<Events_Message>(
-    //            new Events_Message(Events_Loop::eventByName(EVENT_EMPTY_OPERATION_PRESENTATION)));
-    //Events_Loop::loop()->send(aMsg);
+    Events_InfoMessage("PartSet_OperationPrs", 
+      "An empty AIS presentation: PartSet_OperationPrs").send();
+    std::shared_ptr<Events_Message> aMsg = std::shared_ptr<Events_Message>(
+                new Events_Message(Events_Loop::eventByName(EVENT_EMPTY_OPERATION_PRESENTATION)));
+    Events_Loop::loop()->send(aMsg);
   }
+#ifdef DEBUG_OPERATION_PRS
+  qDebug("PartSet_OperationPrs::Compute -- end");
+#endif
 }
 
 void PartSet_OperationPrs::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection,
@@ -126,6 +148,11 @@ void PartSet_OperationPrs::ComputeSelection(const Handle(SelectMgr_Selection)& a
   // the presentation is not used in the selection
 }
 
+NCollection_DataMap<TopoDS_Shape, Handle(AIS_InteractiveObject)>& PartSet_OperationPrs::shapesMap()
+{
+  return myShapeToPrsMap;
+}
+
 bool isSubObject(const ObjectPtr& theObject, const FeaturePtr& theFeature)
 {
   bool isSub = false;
@@ -305,9 +332,10 @@ void PartSet_OperationPrs::getResultShapes(const FeaturePtr& theFeature,
 
   XGUI_Displayer* aDisplayer = XGUI_Tools::workshop(theWorkshop)->displayer();
 
-  std::list<ResultPtr> aFeatureResults = theFeature->results();
-  std::list<ResultPtr>::const_iterator aRIt = aFeatureResults.begin(),
-                                       aRLast = aFeatureResults.end();
+  std::list<ResultPtr> aResults;
+  ModelAPI_Tools::allResults(theFeature, aResults);
+  std::list<ResultPtr>::const_iterator aRIt = aResults.begin(),
+                                       aRLast = aResults.end();
   for (; aRIt != aRLast; aRIt++) {
     ResultPtr aResult = *aRIt;
     GeomShapePtr aGeomShape = aResult->shape();
@@ -360,16 +388,16 @@ bool PartSet_OperationPrs::isSelectionAttribute(const AttributePtr& theAttribute
 }
 
 void PartSet_OperationPrs::fillShapeList(const QMap<ObjectPtr, QList<GeomShapePtr> >& theFeatureShapes,
+                            ModuleBase_IWorkshop* theWorkshop,
                             NCollection_DataMap<TopoDS_Shape, Handle(AIS_InteractiveObject)>& theShapeToPrsMap)
 {
   theShapeToPrsMap.Clear();
 
-  XGUI_Displayer* aDisplayer = XGUI_Tools::workshop(myWorkshop)->displayer();
-  Handle(Prs3d_Drawer) aDrawer = Attributes();
+  XGUI_Displayer* aDisplayer = XGUI_Tools::workshop(theWorkshop)->displayer();
 
   // create presentations on the base of the shapes
-  QMap<ObjectPtr, QList<GeomShapePtr> >::const_iterator anIt = myFeatureShapes.begin(),
-                                                        aLast = myFeatureShapes.end();
+  QMap<ObjectPtr, QList<GeomShapePtr> >::const_iterator anIt = theFeatureShapes.begin(),
+                                                        aLast = theFeatureShapes.end();
   for (; anIt != aLast; anIt++) {
     ObjectPtr anObject = anIt.key();
     QList<GeomShapePtr> aShapes = anIt.value();
@@ -377,17 +405,18 @@ void PartSet_OperationPrs::fillShapeList(const QMap<ObjectPtr, QList<GeomShapePt
     for (; aShIt != aShLast; aShIt++) {
       GeomShapePtr aGeomShape = *aShIt;
       // the shape should not be checked here on empty value because it should be checked in
-      // appendShapeIfVisible() on the step of filling myFeatureShapes list
+      // appendShapeIfVisible() on the step of filling theFeatureShapes list
       // the reason is to avoid empty AIS object visualized in the viewer
       //if (!aGeomShape.get()) continue;
       TopoDS_Shape aShape = aGeomShape.get() ? aGeomShape->impl<TopoDS_Shape>() : TopoDS_Shape();
+      if (aShape.IsNull())
+        continue;
+
       // change deviation coefficient to provide more precise circle
       Handle(AIS_InteractiveObject) anIO;
-      if (myUseAISWidth) {
-        AISObjectPtr anAISPtr = aDisplayer->getAISObject(anObject);
-        if (anAISPtr.get())
-          anIO = anAISPtr->impl<Handle(AIS_InteractiveObject)>();
-      }
+      AISObjectPtr anAISPtr = aDisplayer->getAISObject(anObject);
+      if (anAISPtr.get())
+        anIO = anAISPtr->impl<Handle(AIS_InteractiveObject)>();
       theShapeToPrsMap.Bind(aShape, anIO);
     }
   }