Salome HOME
Issue #1535 crash when mirror: debug information
[modules/shaper.git] / src / PartSet / PartSet_OperationPrs.cpp
index 7c0de6f9060688abfaf6136a1082482f27cec709..3ede14b4d2db5ddba9b0ec7ab4d55f1c7a5af37a 100755 (executable)
 #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
@@ -58,6 +61,9 @@ 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
@@ -69,7 +75,7 @@ PartSet_OperationPrs::PartSet_OperationPrs(ModuleBase_IWorkshop* theWorkshop)
 
 bool PartSet_OperationPrs::hasShapes()
 {
-  return !myFeatureShapes.empty();
+  return !myShapeToPrsMap.IsEmpty();
 }
 
 void PartSet_OperationPrs::setShapeColor(const Quantity_Color& theColor)
@@ -86,24 +92,24 @@ 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 = !aShapeToPrsMap.IsEmpty();
-  if (aReadyToDisplay) {
-    myShapeToPrsMap.Clear();
-    myShapeToPrsMap.Assign(aShapeToPrsMap);
-  }
+  bool aReadyToDisplay = !myShapeToPrsMap.IsEmpty();
 
   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
     ModuleBase_Tools::setDefaultDeviationCoefficient(aShape, aDrawer);
 
@@ -121,13 +127,16 @@ 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);
   }
+#ifdef DEBUG_OPERATION_PRS
+  qDebug("PartSet_OperationPrs::Compute -- end");
+#endif
 }
 
 void PartSet_OperationPrs::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection,
@@ -136,6 +145,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;
@@ -370,16 +384,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();
@@ -387,17 +401,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);
     }
   }