#include <ModelAPI_Session.h>
#include <ModelAPI_ResultCompSolid.h>
-#include <Events_Error.h>
+#include <Events_InfoMessage.h>
#include <Events_Loop.h>
#include <GeomAPI_IPresentable.h>
#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
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
bool PartSet_OperationPrs::hasShapes()
{
- return !myFeatureShapes.empty();
+ return !myShapeToPrsMap.IsEmpty();
}
void PartSet_OperationPrs::setShapeColor(const Quantity_Color& theColor)
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
+ // as there is no result, the shape is processed to correct deviation. To be unified
ModuleBase_Tools::setDefaultDeviationCoefficient(aShape, aDrawer);
if (myUseAISWidth) {
}
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,
// 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;
}
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();
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);
}
}