#include <ModelAPI_Object.h>
#include <ModelAPI_Tools.h>
#include <ModelAPI_AttributeIntArray.h>
+#include <ModelAPI_ResultCompSolid.h>
#include <ModuleBase_ResultPrs.h>
#include <ModuleBase_Tools.h>
+#include <ModuleBase_IModule.h>
#include <GeomAPI_Shape.h>
#include <GeomAPI_IPresentable.h>
#include <TColStd_ListIteratorOfListOfInteger.hxx>
#include <SelectMgr_ListOfFilter.hxx>
#include <SelectMgr_ListIteratorOfListOfFilter.hxx>
+#include <Prs3d_Drawer.hxx>
+#include <Prs3d_IsoAspect.hxx>
#include <StdSelect_ViewerSelector3d.hxx>
const int MOUSE_SENSITIVITY_IN_PIXEL = 10; ///< defines the local context mouse selection sensitivity
-#define DEBUG_CRASH_RESTORE_SELECTION
-
//#define DEBUG_ACTIVATE_OBJECTS
//#define DEBUG_DEACTIVATE
//#define DEBUG_ACTIVATE_AIS
//#define DEBUG_FEATURE_REDISPLAY
//#define DEBUG_SELECTION_FILTERS
+//#define DEBUG_COMPOSILID_DISPLAY
// Workaround for bug #25637
void displayedObjects(const Handle(AIS_InteractiveContext)& theAIS, AIS_ListOfInteractive& theList)
{
void XGUI_Displayer::display(ObjectPtr theObject, bool theUpdateViewer)
{
if (isVisible(theObject)) {
- redisplay(theObject, theUpdateViewer);
+#ifdef DEBUG_COMPOSILID_DISPLAY
+ ResultCompSolidPtr aCompsolidResult = std::dynamic_pointer_cast<ModelAPI_ResultCompSolid>(theObject);
+ if (aCompsolidResult.get()) {
+ for(int i = 0; i < aCompsolidResult->numberOfSubs(); i++) {
+ ResultPtr aSubResult = aCompsolidResult->subResult(i);
+ if (aSubResult.get())
+ redisplay(aSubResult, false);
+ }
+ if (theUpdateViewer)
+ updateViewer();
+ }
+ else
+#endif
+ redisplay(theObject, theUpdateViewer);
} else {
AISObjectPtr anAIS;
} else {
ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
if (aResult.get() != NULL) {
+#ifdef DEBUG_COMPOSILID_DISPLAY
+ ResultCompSolidPtr aCompsolidResult = std::dynamic_pointer_cast<ModelAPI_ResultCompSolid>(theObject);
+ if (aCompsolidResult.get()) {
+ for(int i = 0; i < aCompsolidResult->numberOfSubs(); i++) {
+ ResultPtr aSubResult = aCompsolidResult->subResult(i);
+ if (aSubResult.get())
+ display(aSubResult, false);
+ }
+ if (theUpdateViewer)
+ updateViewer();
+ }
+ else {
+#endif
std::shared_ptr<GeomAPI_Shape> aShapePtr = ModelAPI_Tools::shape(aResult);
if (aShapePtr.get() != NULL) {
anAIS = AISObjectPtr(new GeomAPI_AISObject());
//anAIS->createShape(aShapePtr);
isShading = true;
}
+#ifdef DEBUG_COMPOSILID_DISPLAY
+ } // close else
+#endif
}
}
if (anAIS)
Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast(theAIS);
if (!aShapePrs.IsNull()) {
TopoDS_Shape aShape = aShapePrs->Shape();
+ if (aShape.IsNull())
+ return false;
TopAbs_ShapeEnum aType = aShape.ShapeType();
if ((aType == TopAbs_VERTEX) || (aType == TopAbs_EDGE) || (aType == TopAbs_WIRE))
return false;
}
}
myResult2AISObjectMap.remove(theObject);
+
+#ifdef DEBUG_DISPLAY
+ std::ostringstream aPtrStr;
+ aPtrStr << theObject.get();
+ qDebug(QString("erase object: %1").arg(aPtrStr.str().c_str()).toStdString().c_str());
+ qDebug(getResult2AISObjectMapInfo().c_str());
+#endif
}
void XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer)
std::shared_ptr<GeomAPI_Shape> aShapePtr = ModelAPI_Tools::shape(aResult);
if (aShapePtr.get()) {
const TopoDS_Shape& aOldShape = aShapePrs->Shape();
- isEqualShapes = aOldShape.IsEqual(aShapePtr->impl<TopoDS_Shape>());
+ if (!aOldShape.IsNull())
+ isEqualShapes = aOldShape.IsEqual(aShapePtr->impl<TopoDS_Shape>());
}
}
}
AIS_ListIteratorOfListOfInteractive aLIt(aPrsList);
for(aLIt.Initialize(aPrsList); aLIt.More(); aLIt.Next()){
anAISIO = aLIt.Value();
- activate(anAISIO, myActiveSelectionModes, theUpdateViewer);
+ activate(anAISIO, myActiveSelectionModes, false);
}
+ if (theUpdateViewer)
+ updateViewer();
}
bool XGUI_Displayer::isActive(ObjectPtr theObject) const
foreach (ModuleBase_ViewerPrs aPrs, theValues) {
const TopoDS_Shape& aShape = aPrs.shape();
if (!aShape.IsNull()) {
-#ifdef DEBUG_CRASH_RESTORE_SELECTION
-#else
aContext->AddOrRemoveSelected(aShape, false);
-#endif
} else {
ObjectPtr anObject = aPrs.object();
ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(anObject);
updateViewer();
}
myResult2AISObjectMap.clear();
+#ifdef DEBUG_DISPLAY
+ qDebug("eraseAll");
+ qDebug(getResult2AISObjectMapInfo().c_str());
+#endif
}
void XGUI_Displayer::deactivateTrihedron() const
ObjectPtr XGUI_Displayer::getObject(const Handle(AIS_InteractiveObject)& theIO) const
{
- ObjectPtr aFeature;
+ ObjectPtr anObject;
foreach (ObjectPtr anObj, myResult2AISObjectMap.keys()) {
AISObjectPtr aAIS = myResult2AISObjectMap[anObj];
Handle(AIS_InteractiveObject) anAIS = aAIS->impl<Handle(AIS_InteractiveObject)>();
if (anAIS == theIO)
- return anObj;
+ anObject = anObj;
+ if (anObject.get())
+ break;
+ }
+ if (!anObject.get()) {
+ std::shared_ptr<GeomAPI_AISObject> anAISObj = AISObjectPtr(new GeomAPI_AISObject());
+ if (!theIO.IsNull()) {
+ anAISObj->setImpl(new Handle(AIS_InteractiveObject)(theIO));
+ }
+ anObject = myWorkshop->module()->findPresentedObject(anAISObj);
}
- return aFeature;
+ return anObject;
}
bool XGUI_Displayer::enableUpdateViewer(const bool isEnabled)
void XGUI_Displayer::updateViewer() const
{
Handle(AIS_InteractiveContext) aContext = AISContext();
- if (!aContext.IsNull() && myEnableUpdateViewer)
+ if (!aContext.IsNull() && myEnableUpdateViewer) {
+ myWorkshop->viewer()->Zfitall();
aContext->UpdateCurrentViewer();
+ }
}
void XGUI_Displayer::activateAIS(const Handle(AIS_InteractiveObject)& theIO,
if ((!aContext.IsNull()) && (!aContext->HasOpenedContext())) {
aContext->OpenLocalContext();
deactivateTrihedron();
+ aContext->DefaultDrawer()->VIsoAspect()->SetNumber(0);
+ aContext->DefaultDrawer()->UIsoAspect()->SetNumber(0);
}
return aContext;
}
void XGUI_Displayer::addSelectionFilter(const Handle(SelectMgr_Filter)& theFilter)
{
Handle(AIS_InteractiveContext) aContext = AISContext();
- if (aContext.IsNull())
+ if (aContext.IsNull() || hasSelectionFilter(theFilter))
return;
- const SelectMgr_ListOfFilter& aFilters = aContext->Filters();
- SelectMgr_ListIteratorOfListOfFilter aIt(aFilters);
- for (; aIt.More(); aIt.Next()) {
- if (theFilter.Access() == aIt.Value().Access())
- return;
- }
+
Handle(SelectMgr_CompositionFilter) aCompFilter = GetFilter();
- const SelectMgr_ListOfFilter& aStoredFilters = aCompFilter->StoredFilters();
- for (aIt.Initialize(aStoredFilters); aIt.More(); aIt.Next()) {
- if (theFilter.Access() == aIt.Value().Access())
- return;
- }
aCompFilter->Add(theFilter);
#ifdef DEBUG_SELECTION_FILTERS
int aCount = GetFilter()->StoredFilters().Extent();
#endif
}
+bool XGUI_Displayer::hasSelectionFilter(const Handle(SelectMgr_Filter)& theFilter)
+{
+ bool aFilterFound = false;
+
+ Handle(AIS_InteractiveContext) aContext = AISContext();
+ if (aContext.IsNull())
+ return aFilterFound;
+ const SelectMgr_ListOfFilter& aFilters = aContext->Filters();
+ SelectMgr_ListIteratorOfListOfFilter aIt(aFilters);
+ for (; aIt.More() && !aFilterFound; aIt.Next()) {
+ if (theFilter.Access() == aIt.Value().Access())
+ aFilterFound = true;
+ }
+ Handle(SelectMgr_CompositionFilter) aCompFilter = GetFilter();
+ const SelectMgr_ListOfFilter& aStoredFilters = aCompFilter->StoredFilters();
+ for (aIt.Initialize(aStoredFilters); aIt.More() && !aFilterFound; aIt.Next()) {
+ if (theFilter.Access() == aIt.Value().Access())
+ aFilterFound = true;
+ }
+ return aFilterFound;
+}
+
void XGUI_Displayer::removeFilters()
{
Handle(AIS_InteractiveContext) aContext = AISContext();
aCustomPrs = aCustPrs;
}
if (aCustomPrs.get() == NULL) {
- // we ignore presentable not customized objects
GeomPresentablePtr aPrs = std::dynamic_pointer_cast<GeomAPI_IPresentable>(theObject);
- if (aPrs.get() != NULL)
- return false;
- aCustomPrs = myCustomPrs;
+ // we ignore presentable not customized objects
+ if (aPrs.get() == NULL)
+ aCustomPrs = myCustomPrs;
}
- return aCustomPrs->customisePresentation(aResult, anAISObj, myCustomPrs);
+ bool isCustomized = aCustomPrs.get() &&
+ aCustomPrs->customisePresentation(aResult, anAISObj, myCustomPrs);
+ myWorkshop->module()->customizeObject(theObject);
+ return isCustomized;
}