X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FXGUI%2FXGUI_Displayer.cpp;h=3f0846de18d86f9a4b894c193878ccf558bc29af;hb=dc158ea248a9bbd70675887f494388c93e1b3b4d;hp=a0fe6a50fcc1fb01432787b5f3037517c0d59f41;hpb=f1cd93fd02a54259f72e3191d037323a496b2bef;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index a0fe6a50f..3f0846de1 100644 --- a/src/XGUI/XGUI_Displayer.cpp +++ b/src/XGUI/XGUI_Displayer.cpp @@ -19,6 +19,7 @@ #include #include +#include #include #include @@ -31,12 +32,39 @@ #include #include +#include +#include + #include const int MOUSE_SENSITIVITY_IN_PIXEL = 10; ///< defines the local context mouse selection sensitivity + +// Workaround for bug #25637 +void displayedObjects(const Handle(AIS_InteractiveContext)& theAIS, AIS_ListOfInteractive& theList) +{ + // Get from null point + theAIS->DisplayedObjects(theList, true); + if (theAIS->HasOpenedContext()) { + // get from local context + const Handle(AIS_LocalContext)& aLC = theAIS->LocalContext(); + TColStd_MapOfTransient aMap; + int NbDisp = aLC->DisplayedObjects(aMap); + TColStd_MapIteratorOfMapOfTransient aIt(aMap); + + Handle(AIS_InteractiveObject) curIO; + Handle(Standard_Transient) Tr; + for(; aIt.More(); aIt.Next()){ + Tr = aIt.Key(); + curIO = *((Handle(AIS_InteractiveObject)*) &Tr); + theList.Append(curIO); + } + } +} + + XGUI_Displayer::XGUI_Displayer(XGUI_Workshop* theWorkshop) - : myUseExternalObjects(false), myWorkshop(theWorkshop) + : myWorkshop(theWorkshop) { } @@ -58,13 +86,13 @@ void XGUI_Displayer::display(ObjectPtr theObject, bool isUpdateViewer) GeomPresentablePtr aPrs = std::dynamic_pointer_cast(theObject); bool isShading = false; - if (aPrs) { + if (aPrs.get() != NULL) { anAIS = aPrs->getAISObject(AISObjectPtr()); } else { ResultPtr aResult = std::dynamic_pointer_cast(theObject); - if (aResult) { + if (aResult.get() != NULL) { std::shared_ptr aShapePtr = ModelAPI_Tools::shape(aResult); - if (aShapePtr) { + if (aShapePtr.get() != NULL) { anAIS = AISObjectPtr(new GeomAPI_AISObject()); anAIS->setImpl(new Handle(AIS_InteractiveObject)(new ModuleBase_ResultPrs(aResult))); //anAIS->createShape(aShapePtr); @@ -77,6 +105,20 @@ void XGUI_Displayer::display(ObjectPtr theObject, bool isUpdateViewer) } } +bool canBeShaded(Handle(AIS_InteractiveObject) theAIS) +{ + Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast(theAIS); + if (!aShapePrs.IsNull()) { + TopoDS_Shape aShape = aShapePrs->Shape(); + TopAbs_ShapeEnum aType = aShape.ShapeType(); + if ((aType == TopAbs_VERTEX) || (aType == TopAbs_EDGE) || (aType == TopAbs_WIRE)) + return false; + else + return true; + } + return false; +} + void XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS, bool isShading, bool isUpdateViewer) { @@ -87,20 +129,29 @@ void XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS, Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); if (!anAISIO.IsNull()) { myResult2AISObjectMap[theObject] = theAIS; + bool aCanBeShaded = canBeShaded(anAISIO); + // In order to avoid extra closing/opening context + if (aCanBeShaded) + closeLocalContexts(false); aContext->Display(anAISIO, false); - aContext->SetDisplayMode(anAISIO, isShading? Shading : Wireframe, isUpdateViewer); - if (aContext->HasOpenedContext()) { - if (myUseExternalObjects) { - if (myActiveSelectionModes.size() == 0) - aContext->Activate(anAISIO); - else { - foreach(int aMode, myActiveSelectionModes) { - aContext->Activate(anAISIO, aMode); - } - } - } + qDebug("### Display %i", (long)anAISIO.Access()); + + aContext->SetDisplayMode(anAISIO, isShading? Shading : Wireframe, false); + // Customization of presentation + FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); + if (aFeature.get() != NULL) { + GeomCustomPrsPtr aCustPrs = std::dynamic_pointer_cast(aFeature); + if (aCustPrs.get() != NULL) + aCustPrs->customisePresentation(theAIS); } + if (aCanBeShaded) + openLocalContext(); + + aContext->Load(anAISIO, -1, true); + activate(theObject); } + if (isUpdateViewer) + updateViewer(); } void XGUI_Displayer::erase(ObjectPtr theObject, const bool isUpdateViewer) @@ -160,13 +211,13 @@ void XGUI_Displayer::deactivate(ObjectPtr theObject) AISObjectPtr anObj = myResult2AISObjectMap[theObject]; Handle(AIS_InteractiveObject) anAIS = anObj->impl(); aContext->Deactivate(anAIS); + qDebug("### Deactivate obj %i", (long)anAIS.Access()); } } void XGUI_Displayer::activate(ObjectPtr theFeature) { - QIntList aModes; - activate(theFeature, aModes); + activate(theFeature, myActiveSelectionModes); } void XGUI_Displayer::activate(ObjectPtr theObject, const QIntList& theModes) @@ -178,15 +229,91 @@ void XGUI_Displayer::activate(ObjectPtr theObject, const QIntList& theModes) AISObjectPtr anObj = myResult2AISObjectMap[theObject]; Handle(AIS_InteractiveObject) anAIS = anObj->impl(); - if (aContext->HasOpenedContext()) { - aContext->Load(anAIS, -1, true); - } + aContext->Deactivate(anAIS); + //if (aContext->HasOpenedContext()) { + // aContext->Load(anAIS, -1, true); + //} + // In order to clear active modes list if (theModes.size() > 0) { foreach(int aMode, theModes) { aContext->Activate(anAIS, aMode); + qDebug("### 1. Activate obj %i, %i", (long)anAIS.Access(), aMode); } - } else + } else { aContext->Activate(anAIS); + qDebug("### 2. Activate obj %i", (long)anAIS.Access()); + } + } +} + +void XGUI_Displayer::activateObjects(const QIntList& theModes) +{ + // In order to avoid doblications of selection modes + myActiveSelectionModes.clear(); + foreach (int aMode, theModes) { + if (!myActiveSelectionModes.contains(aMode)) + myActiveSelectionModes.append(aMode); + } + Handle(AIS_InteractiveContext) aContext = AISContext(); + // Open local context if there is no one + if (!aContext->HasOpenedContext()) + return; + + //aContext->UseDisplayedObjects(); + //myUseExternalObjects = true; + + AIS_ListOfInteractive aPrsList; + displayedObjects(aContext, aPrsList); + + Handle(AIS_Trihedron) aTrihedron; + AIS_ListIteratorOfListOfInteractive aLIt(aPrsList); + Handle(AIS_InteractiveObject) anAISIO; + for(aLIt.Initialize(aPrsList); aLIt.More(); aLIt.Next()){ + anAISIO = aLIt.Value(); + aContext->Deactivate(anAISIO); + aTrihedron = Handle(AIS_Trihedron)::DownCast(anAISIO); + //Deactivate trihedron which can be activated in local selector + if (aTrihedron.IsNull()) { + //aContext->Load(anAISIO, -1, true); + // In order to clear active modes list + if (myActiveSelectionModes.size() == 0) { + aContext->Activate(anAISIO); + qDebug("### 2. Activate all %i", (long)anAISIO.Access()); + } else { + foreach(int aMode, myActiveSelectionModes) { + aContext->Activate(anAISIO, aMode); + qDebug("### 1. Activate all %i, %i", (long)anAISIO.Access(), aMode); + } + } + } + } +} + + +void XGUI_Displayer::deactivateObjects() +{ + myActiveSelectionModes.clear(); + Handle(AIS_InteractiveContext) aContext = AISContext(); + // Open local context if there is no one + if (!aContext->HasOpenedContext()) + return; + + //aContext->NotUseDisplayedObjects(); + AIS_ListOfInteractive aPrsList; + displayedObjects(aContext, aPrsList); + + AIS_ListIteratorOfListOfInteractive aLIt; + Handle(AIS_Trihedron) aTrihedron; + Handle(AIS_InteractiveObject) anAISIO; + for(aLIt.Initialize(aPrsList); aLIt.More(); aLIt.Next()){ + anAISIO = aLIt.Value(); + aContext->Deactivate(anAISIO); + aTrihedron = Handle(AIS_Trihedron)::DownCast(anAISIO); + if (aTrihedron.IsNull()) { + //aContext->Load(anAISIO, -1, true); + qDebug("### Deactivate all %i", (long)anAISIO.Access()); + //aContext->Activate(anAISIO); + } } } @@ -301,32 +428,32 @@ void XGUI_Displayer::eraseAll(const bool isUpdateViewer) updateViewer(); } -void XGUI_Displayer::eraseDeletedResults(const bool isUpdateViewer) -{ - Handle(AIS_InteractiveContext) aContext = AISContext(); - if (aContext.IsNull()) - return; - - QObjectPtrList aRemoved; - foreach (ObjectPtr aFeature, myResult2AISObjectMap.keys()) { - if (!aFeature || !aFeature->data() || !aFeature->data()->isValid()) { - AISObjectPtr anObj = myResult2AISObjectMap[aFeature]; - if (!anObj) - continue; - Handle(AIS_InteractiveObject) anAIS = anObj->impl(); - if (!anAIS.IsNull()) { - aContext->Remove(anAIS, false); - aRemoved.append(aFeature); - } - } - } - foreach(ObjectPtr aObj, aRemoved) { - myResult2AISObjectMap.remove(aObj); - } - - if (isUpdateViewer) - updateViewer(); -} +//void XGUI_Displayer::eraseDeletedResults(const bool isUpdateViewer) +//{ +// Handle(AIS_InteractiveContext) aContext = AISContext(); +// if (aContext.IsNull()) +// return; +// +// QObjectPtrList aRemoved; +// foreach (ObjectPtr aFeature, myResult2AISObjectMap.keys()) { +// if (!aFeature || !aFeature->data() || !aFeature->data()->isValid()) { +// AISObjectPtr anObj = myResult2AISObjectMap[aFeature]; +// if (!anObj) +// continue; +// Handle(AIS_InteractiveObject) anAIS = anObj->impl(); +// if (!anAIS.IsNull()) { +// aContext->Remove(anAIS, false); +// aRemoved.append(aFeature); +// } +// } +// } +// foreach(ObjectPtr aObj, aRemoved) { +// myResult2AISObjectMap.remove(aObj); +// } +// +// if (isUpdateViewer) +// updateViewer(); +//} void XGUI_Displayer::openLocalContext() { @@ -348,11 +475,12 @@ void XGUI_Displayer::openLocalContext() // in the closeLocalContex, which restore the global context filters aContext->RemoveFilters(); - aContext->ClearCurrents(); + //aContext->ClearCurrents(); aContext->OpenLocalContext(); - aContext->NotUseDisplayedObjects(); + qDebug("### Open context"); + //aContext->NotUseDisplayedObjects(); - myUseExternalObjects = false; + //myUseExternalObjects = false; myActiveSelectionModes.clear(); SelectMgr_ListIteratorOfListOfFilter aIt(aFilters); @@ -381,8 +509,9 @@ void XGUI_Displayer::closeLocalContexts(const bool isUpdateViewer) SelectMgr_ListOfFilter aFilters; aFilters.Assign(aContext->Filters()); - aContext->ClearSelected(); + //aContext->ClearSelected(); aContext->CloseAllContexts(false); + qDebug("### Close context"); // Redisplay all object if they were displayed in localContext Handle(AIS_InteractiveObject) aAISIO; @@ -403,7 +532,7 @@ void XGUI_Displayer::closeLocalContexts(const bool isUpdateViewer) if (isUpdateViewer) updateViewer(); - myUseExternalObjects = false; + //myUseExternalObjects = false; myActiveSelectionModes.clear(); // Restore selection @@ -450,7 +579,12 @@ void XGUI_Displayer::updateViewer() Handle(AIS_InteractiveContext) XGUI_Displayer::AISContext() const { - return myWorkshop->viewer()->AISContext(); + Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); + if ((!aContext.IsNull()) && (!aContext->HasOpenedContext())) { + aContext->OpenLocalContext(); + qDebug("### Open context"); + } + return aContext; } Handle(SelectMgr_AndFilter) XGUI_Displayer::GetFilter() @@ -470,7 +604,7 @@ void XGUI_Displayer::displayAIS(AISObjectPtr theAIS, bool isUpdate) if (!anAISIO.IsNull()) { aContext->Display(anAISIO, isUpdate); if (aContext->HasOpenedContext()) { - if (myUseExternalObjects) { + //if (myUseExternalObjects) { if (myActiveSelectionModes.size() == 0) aContext->Activate(anAISIO); else { @@ -478,7 +612,7 @@ void XGUI_Displayer::displayAIS(AISObjectPtr theAIS, bool isUpdate) aContext->Activate(anAISIO, aMode); } } - } + //} } } } @@ -492,65 +626,6 @@ void XGUI_Displayer::eraseAIS(AISObjectPtr theAIS, const bool isUpdate) } } -void XGUI_Displayer::activateObjects(const QIntList& theModes) -{ - Handle(AIS_InteractiveContext) aContext = AISContext(); - // Open local context if there is no one - if (!aContext->HasOpenedContext()) - return; - - aContext->UseDisplayedObjects(); - myUseExternalObjects = true; - myActiveSelectionModes = theModes; - - //Deactivate trihedron which can be activated in local selector - AIS_ListOfInteractive aPrsList; - aContext->DisplayedObjects(aPrsList, true); - - Handle(AIS_Trihedron) aTrihedron; - AIS_ListIteratorOfListOfInteractive aLIt(aPrsList); - for(; aLIt.More(); aLIt.Next()){ - aTrihedron = Handle(AIS_Trihedron)::DownCast(aLIt.Value()); - if (!aTrihedron.IsNull()) { - aContext->Deactivate(aTrihedron); - break; - } - } - - //Activate all displayed objects with the module modes - //AIS_ListOfInteractive aPrsList; - //aContext->DisplayedObjects(aPrsList, true); - - //AIS_ListIteratorOfListOfInteractive aLIt(aPrsList); - Handle(AIS_InteractiveObject) anAISIO; - for(aLIt.Initialize(aPrsList); aLIt.More(); aLIt.Next()){ - anAISIO = aLIt.Value(); - aTrihedron = Handle(AIS_Trihedron)::DownCast(anAISIO); - if (!aTrihedron.IsNull()) - continue; - - aContext->Load(anAISIO, -1, true); - if (theModes.size() == 0) - aContext->Activate(anAISIO); - else { - foreach(int aMode, theModes) { - aContext->Activate(anAISIO, aMode); - } - } - } -} - - -void XGUI_Displayer::deactivateObjects() -{ - Handle(AIS_InteractiveContext) aContext = AISContext(); - // Open local context if there is no one - if (!aContext->HasOpenedContext()) - return; - - aContext->NotUseDisplayedObjects(); -} - void XGUI_Displayer::setDisplayMode(ObjectPtr theObject, DisplayMode theMode, bool toUpdate) {