X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Displayer.cpp;h=7f1627c28eb9f0f0c2cd3bb87ad1989d15304788;hb=b2a34ee4bab2fe2d97f900cbdafcaf122344c46c;hp=dd763359d7883e4098b9963236dd2edf8e574648;hpb=e5b85749a0da284a2aa797576a5f65488aea0b3f;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index dd763359d..7f1627c28 100644 --- a/src/XGUI/XGUI_Displayer.cpp +++ b/src/XGUI/XGUI_Displayer.cpp @@ -6,21 +6,25 @@ #include "XGUI_Viewer.h" #include "XGUI_Workshop.h" #include "XGUI_ViewerProxy.h" -#include "XGUI_Tools.h" #include #include +#include +#include + +#include +#include #include #include #include #include - +#include #include #include -const int MOUSE_SENSITIVITY_IN_PIXEL = 10; ///< defines the local context mouse selection sensitivity +const int MOUSE_SENSITIVITY_IN_PIXEL = 10; ///< defines the local context mouse selection sensitivity XGUI_Displayer::XGUI_Displayer(XGUI_Workshop* theWorkshop) { @@ -31,289 +35,338 @@ XGUI_Displayer::~XGUI_Displayer() { } -bool XGUI_Displayer::IsVisible(boost::shared_ptr theFeature) +bool XGUI_Displayer::isVisible(ObjectPtr theObject) { - return myFeature2AISObjectMap.find(theFeature) != myFeature2AISObjectMap.end(); + return myResult2AISObjectMap.find(theObject) != myResult2AISObjectMap.end(); } -void XGUI_Displayer::Display(boost::shared_ptr theFeature, - const bool isUpdateViewer) -{ -} - -/*void XGUI_Displayer::Display(boost::shared_ptr theFeature, - const TopoDS_Shape& theShape, const bool isUpdateViewer) -{ - Handle(AIS_InteractiveContext) aContext = AISContext(); - - Handle(AIS_Shape) anAIS = new AIS_Shape(theShape); - myFeature2AISObjectMap[theFeature] = anAIS; - - aContext->Display(anAIS, Standard_False); - if (isUpdateViewer) - UpdateViewer(); -}*/ - - -std::list XGUI_Displayer::GetSelected(const int theShapeTypeToSkip) +void XGUI_Displayer::display(ObjectPtr theObject, bool isUpdateViewer) { - std::set > aPrsFeatures; - std::list aPresentations; - - Handle(AIS_InteractiveContext) aContext = AISContext(); - for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) { - Handle(AIS_InteractiveObject) anIO = aContext->SelectedInteractive(); - TopoDS_Shape aShape = aContext->SelectedShape(); - if (theShapeTypeToSkip >= 0 && !aShape.IsNull() && aShape.ShapeType() == theShapeTypeToSkip) - continue; - - boost::shared_ptr aFeature = GetFeature(anIO); - if (aPrsFeatures.find(aFeature) != aPrsFeatures.end()) - continue; - aPresentations.push_back(XGUI_ViewerPrs(aFeature, aShape)); - aPrsFeatures.insert(aFeature); + if (isVisible(theObject)) { + redisplay(theObject, isUpdateViewer); + } else { + boost::shared_ptr anAIS; + + GeomPresentablePtr aPrs = boost::dynamic_pointer_cast(theObject); + if (aPrs) { + anAIS = aPrs->getAISObject(boost::shared_ptr()); + } else { + ResultPtr aResult = boost::dynamic_pointer_cast(theObject); + if (aResult) { + boost::shared_ptr aShapePtr = ModelAPI_Tools::shape(aResult); + if (aShapePtr) { + anAIS = boost::shared_ptr(new GeomAPI_AISObject()); + anAIS->createShape(aShapePtr); + } + } + } + if (anAIS) + display(theObject, anAIS, isUpdateViewer); } - return aPresentations; } -std::list XGUI_Displayer::GetHighlighted(const int theShapeTypeToSkip) +void XGUI_Displayer::display(ObjectPtr theObject, boost::shared_ptr theAIS, + bool isUpdateViewer) { - std::set > aPrsFeatures; - std::list aPresentations; - Handle(AIS_InteractiveContext) aContext = AISContext(); - for (aContext->InitDetected(); aContext->MoreDetected(); aContext->NextDetected()) { - Handle(AIS_InteractiveObject) anIO = aContext->DetectedInteractive(); - TopoDS_Shape aShape = aContext->DetectedShape(); - if (theShapeTypeToSkip >= 0 && !aShape.IsNull() && aShape.ShapeType() == theShapeTypeToSkip) - continue; + if (aContext.IsNull()) + return; - boost::shared_ptr aFeature = GetFeature(anIO); - if (aPrsFeatures.find(aFeature) != aPrsFeatures.end()) - continue; - aPresentations.push_back(XGUI_ViewerPrs(aFeature, aShape)); - aPrsFeatures.insert(aFeature); + Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); + if (!anAISIO.IsNull()) { + myResult2AISObjectMap[theObject] = theAIS; + aContext->Display(anAISIO, isUpdateViewer); } - - return aPresentations; } -void XGUI_Displayer::Erase(boost::shared_ptr theFeature, - const bool isUpdateViewer) +void XGUI_Displayer::erase(ObjectPtr theObject, const bool isUpdateViewer) { - if (myFeature2AISObjectMap.find(theFeature) == myFeature2AISObjectMap.end()) + if (!isVisible(theObject)) return; Handle(AIS_InteractiveContext) aContext = AISContext(); - Handle(AIS_InteractiveObject) anAIS = myFeature2AISObjectMap[theFeature]; - Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast(anAIS); - if (!anAISShape.IsNull()) - { - aContext->Erase(anAISShape); + if (aContext.IsNull()) + return; + boost::shared_ptr anObject = myResult2AISObjectMap[theObject]; + if (anObject) { + Handle(AIS_InteractiveObject) anAIS = anObject->impl(); + if (!anAIS.IsNull()) { + aContext->Remove(anAIS, isUpdateViewer); + } } - myFeature2AISObjectMap.erase(theFeature); - - if (isUpdateViewer) - UpdateViewer(); + myResult2AISObjectMap.erase(theObject); } -bool XGUI_Displayer::Redisplay(boost::shared_ptr theFeature, - const TopoDS_Shape& theShape, const bool isUpdateViewer) +/*bool XGUI_Displayer::redisplay(ObjectPtr theObject, + boost::shared_ptr theAIS, + const bool isUpdateViewer) + { + bool isCreated = false; + Handle(AIS_InteractiveObject) anAIS = + theAIS ? theAIS->impl() : Handle(AIS_InteractiveObject)(); + Handle(AIS_InteractiveContext) aContext = AISContext(); + // Open local context if there is no one + if (!aContext->HasOpenedContext()) { + aContext->ClearCurrents(false); + aContext->OpenLocalContext(false /use displayed objects/, true /allow shape decomposition/); + // set mouse sensitivity + //aContext->SetSensitivityMode(StdSelect_SM_WINDOW); + //aContext->SetPixelTolerance(MOUSE_SENSITIVITY_IN_PIXEL); + } + // display or redisplay presentation + boost::shared_ptr anObj = myResult2AISObjectMap[theObject]; + if (isVisible(theObject) && anObj && !anObj->empty()) { + aContext->Redisplay(anAIS, isUpdateViewer); + //aContext->RecomputeSelectionOnly(anAIS); + } + else { + myResult2AISObjectMap[theObject] = theAIS; + aContext->Display(anAIS, isUpdateViewer); + isCreated = true; + } + return isCreated; + }*/ + +void XGUI_Displayer::redisplay(ObjectPtr theObject, bool isUpdateViewer) { - bool isCreated = false; - Handle(AIS_InteractiveContext) aContext = AISContext(); - // Open local context if there is no one - if (!aContext->HasOpenedContext()) { - aContext->ClearCurrents(false); - aContext->OpenLocalContext(false/*use displayed objects*/, true/*allow shape decomposition*/); - // set mouse sensitivity - //aContext->SetSensitivityMode(StdSelect_SM_WINDOW); - //aContext->SetPixelTolerance(MOUSE_SENSITIVITY_IN_PIXEL); - } - // display or redisplay presentation - Handle(AIS_Shape) anAIS; - if (IsVisible(theFeature)) { - anAIS = Handle(AIS_Shape)::DownCast(myFeature2AISObjectMap[theFeature]); - if (!anAIS.IsNull()) { - // if the AIS object is displayed in the opened local context in some mode, additional - // AIS sub objects are created there. They should be rebuild for correct selecting. - // It is possible to correct it by closing local context before the shape set and opening - // after. Another workaround to thrown down the selection and reselecting the AIS. - // If there was a problem here, try the first solution with close/open local context. - anAIS->Set(theShape); - anAIS->Redisplay(Standard_True); - aContext->RecomputeSelectionOnly(anAIS); + if (!isVisible(theObject)) + return; + + Handle(AIS_InteractiveObject) aAISIO; + boost::shared_ptr aAISObj = getAISObject(theObject); + GeomPresentablePtr aPrs = boost::dynamic_pointer_cast(theObject); + if (aPrs) { + boost::shared_ptr aAIS_Obj = aPrs->getAISObject(aAISObj); + if (aAISObj && !aAIS_Obj) { + erase(theObject, isUpdateViewer); + return; + } + aAISIO = aAIS_Obj->impl(); + } else { + ResultPtr aResult = boost::dynamic_pointer_cast(theObject); + if (aResult) { + boost::shared_ptr aShapePtr = ModelAPI_Tools::shape(aResult); + if (aShapePtr) { + Handle(AIS_Shape) aAISShape = Handle(AIS_Shape)::DownCast( + aAISObj->impl()); + if (!aAISShape.IsNull()) { + aAISShape->Set(aShapePtr->impl()); + aAISIO = aAISShape; + } + } } } - else { - anAIS = new AIS_Shape(theShape); - myFeature2AISObjectMap[theFeature] = anAIS; - aContext->Display(anAIS, false); - isCreated = true; + if (!aAISIO.IsNull()) { + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + aContext->Redisplay(aAISIO, isUpdateViewer); + //if (aContext->HasOpenedContext()) { + // aContext->Load(aAISIO, -1, true/*allow decomposition*/); + //} } - if (isUpdateViewer) - UpdateViewer(); - - return isCreated; } -void XGUI_Displayer::ActivateInLocalContext(boost::shared_ptr theFeature, - const std::list& theModes, const bool isUpdateViewer) +void XGUI_Displayer::activateInLocalContext(ObjectPtr theResult, const std::list& theModes, + const bool isUpdateViewer) { Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; // Open local context if there is no one if (!aContext->HasOpenedContext()) { aContext->ClearCurrents(false); - aContext->OpenLocalContext(false/*use displayed objects*/, true/*allow shape decomposition*/); + //aContext->OpenLocalContext(false/*use displayed objects*/, true/*allow shape decomposition*/); + aContext->OpenLocalContext(); + aContext->NotUseDisplayedObjects(); } // display or redisplay presentation - Handle(AIS_Shape) anAIS; - if (IsVisible(theFeature)) - anAIS = Handle(AIS_Shape)::DownCast(myFeature2AISObjectMap[theFeature]); + Handle(AIS_InteractiveObject) anAIS; + if (isVisible(theResult)) { + boost::shared_ptr anObj = myResult2AISObjectMap[theResult]; + if (anObj) + anAIS = anObj->impl(); + } // Activate selection of objects from prs if (!anAIS.IsNull()) { - aContext->Load(anAIS, -1, true/*allow decomposition*/); + aContext->ClearSelected(false); // ToCheck + //aContext->upClearSelected(false); // ToCheck + aContext->Load(anAIS, -1, true/*allow decomposition*/); aContext->Deactivate(anAIS); std::list::const_iterator anIt = theModes.begin(), aLast = theModes.end(); - for (; anIt != aLast; anIt++) - { - aContext->Activate(anAIS, AIS_Shape::SelectionMode((TopAbs_ShapeEnum)*anIt)); - } + for (; anIt != aLast; anIt++) { + aContext->Activate(anAIS, (*anIt)); + } } if (isUpdateViewer) - UpdateViewer(); + updateViewer(); } -void XGUI_Displayer::StopSelection(const std::list& theFeatures, const bool isStop, +void XGUI_Displayer::deactivate(ObjectPtr theObject) +{ + if (isVisible(theObject)) { + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + + boost::shared_ptr anObj = myResult2AISObjectMap[theObject]; + Handle(AIS_InteractiveObject) anAIS = anObj->impl(); + aContext->Deactivate(anAIS); + } +} + +void XGUI_Displayer::activate(ObjectPtr theObject) +{ + if (isVisible(theObject)) { + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + + boost::shared_ptr anObj = myResult2AISObjectMap[theObject]; + Handle(AIS_InteractiveObject) anAIS = anObj->impl(); + aContext->Activate(anAIS); + } +} + +void XGUI_Displayer::stopSelection(const QList& theResults, const bool isStop, const bool isUpdateViewer) { Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; Handle(AIS_Shape) anAIS; - std::list::const_iterator anIt = theFeatures.begin(), aLast = theFeatures.end(); - boost::shared_ptr aFeature; + QList::const_iterator anIt = theResults.begin(), aLast = theResults.end(); + ObjectPtr aFeature; for (; anIt != aLast; anIt++) { - aFeature = (*anIt).feature(); - if (IsVisible(aFeature)) - anAIS = Handle(AIS_Shape)::DownCast(myFeature2AISObjectMap[aFeature]); + aFeature = *anIt; + if (isVisible(aFeature)) + anAIS = Handle(AIS_Shape)::DownCast( + myResult2AISObjectMap[aFeature]->impl()); if (anAIS.IsNull()) continue; if (isStop) { QColor aColor(Qt::white); - anAIS->SetColor(Quantity_Color(aColor.red()/255., aColor.green()/255., aColor.blue()/255., Quantity_TOC_RGB)); + anAIS->SetColor( + Quantity_Color(aColor.red() / 255., aColor.green() / 255., aColor.blue() / 255., + Quantity_TOC_RGB)); anAIS->Redisplay(); - } - else { + } else { QColor aColor(Qt::red); - anAIS->SetColor(Quantity_Color(aColor.red()/255., aColor.green()/255., aColor.blue()/255., Quantity_TOC_RGB)); + anAIS->SetColor( + Quantity_Color(aColor.red() / 255., aColor.green() / 255., aColor.blue() / 255., + Quantity_TOC_RGB)); anAIS->Redisplay(); } } if (isUpdateViewer) - UpdateViewer(); + updateViewer(); } -void XGUI_Displayer::SetSelected(const std::list& theFeatures, const bool isUpdateViewer) +void XGUI_Displayer::setSelected(const QList& theResults, const bool isUpdateViewer) { Handle(AIS_InteractiveContext) aContext = AISContext(); - - std::list::const_iterator anIt = theFeatures.begin(), aLast = theFeatures.end(); - boost::shared_ptr aFeature; - - Handle(AIS_Shape) anAIS; // we need to unhighligth objects manually in the current local context // in couple with the selection clear (TODO) Handle(AIS_LocalContext) aLocalContext = aContext->LocalContext(); if (!aLocalContext.IsNull()) aLocalContext->UnhilightLastDetected(myWorkshop->viewer()->activeView()); - aContext->ClearSelected(false); - for (; anIt != aLast; anIt++) { - aFeature = (*anIt).feature(); - if (IsVisible(aFeature)) - anAIS = Handle(AIS_Shape)::DownCast(myFeature2AISObjectMap[aFeature]); - if (anAIS.IsNull()) + aContext->ClearSelected(); + foreach(ObjectPtr aResult, theResults) + { + if (myResult2AISObjectMap.find(aResult) == myResult2AISObjectMap.end()) continue; - aContext->AddOrRemoveSelected(anAIS, false); + + boost::shared_ptr anObj = myResult2AISObjectMap[aResult]; + if (anObj) { + Handle(AIS_InteractiveObject) anAIS = anObj->impl(); + if (!anAIS.IsNull()) + aContext->AddOrRemoveSelected(anAIS, false); + } } - if (isUpdateViewer) - UpdateViewer(); + updateViewer(); } -void XGUI_Displayer::EraseAll(const bool isUpdateViewer) +void XGUI_Displayer::eraseAll(const bool isUpdateViewer) { Handle(AIS_InteractiveContext) ic = AISContext(); + if (ic.IsNull()) + return; - AIS_ListOfInteractive aList; - ic->DisplayedObjects(aList); - AIS_ListIteratorOfListOfInteractive anIter(aList); - for (; anIter.More(); anIter.Next()) { - if ((anIter.Value()->DynamicType() == STANDARD_TYPE(AIS_Trihedron))) - continue; - - // erase an object - Handle(AIS_InteractiveObject) anIO = anIter.Value(); - ic->Erase(anIO, false); - } - myFeature2AISObjectMap.clear(); - if (isUpdateViewer) - UpdateViewer(); -} - -void XGUI_Displayer::EraseDeletedFeatures(const bool isUpdateViewer) + ResultToAISMap::iterator aIt; + for (aIt = myResult2AISObjectMap.begin(); aIt != myResult2AISObjectMap.end(); aIt++) { + // erase an object + boost::shared_ptr aAISObj = (*aIt).second; + Handle(AIS_InteractiveObject) anIO = aAISObj->impl(); + if (!anIO.IsNull()) + ic->Remove(anIO, false); + } + myResult2AISObjectMap.clear(); + if (isUpdateViewer) + updateViewer(); + } + +void XGUI_Displayer::eraseDeletedResults(const bool isUpdateViewer) { Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; - FeatureToAISMap::const_iterator aFIt = myFeature2AISObjectMap.begin(), - aFLast = myFeature2AISObjectMap.end(); - std::list> aRemoved; - for (; aFIt != aFLast; aFIt++) - { - boost::shared_ptr aFeature = (*aFIt).first; + ResultToAISMap::const_iterator aFIt = myResult2AISObjectMap.begin(), aFLast = + myResult2AISObjectMap.end(); + std::list aRemoved; + for (; aFIt != aFLast; aFIt++) { + ObjectPtr aFeature = (*aFIt).first; if (!aFeature || !aFeature->data() || !aFeature->data()->isValid()) { - Handle(AIS_InteractiveObject) anAIS = (*aFIt).second; + boost::shared_ptr anObj = (*aFIt).second; + if (!anObj) + continue; + Handle(AIS_InteractiveObject) anAIS = anObj->impl(); if (!anAIS.IsNull()) { - aContext->Erase(anAIS, false); + aContext->Remove(anAIS, false); aRemoved.push_back(aFeature); } } } - std::list>::const_iterator anIt = aRemoved.begin(), - aLast = aRemoved.end(); + std::list::const_iterator anIt = aRemoved.begin(), aLast = aRemoved.end(); for (; anIt != aLast; anIt++) { - myFeature2AISObjectMap.erase(myFeature2AISObjectMap.find(*anIt)); + myResult2AISObjectMap.erase(myResult2AISObjectMap.find(*anIt)); } if (isUpdateViewer) - UpdateViewer(); + updateViewer(); } -void XGUI_Displayer::CloseLocalContexts(const bool isUpdateViewer) +void XGUI_Displayer::closeLocalContexts(const bool isUpdateViewer) { - CloseAllContexts(true); + AISContext()->ClearSelected(false); + closeAllContexts(true); } -Handle(AIS_InteractiveObject) XGUI_Displayer::GetAISObject( - boost::shared_ptr theFeature) const +boost::shared_ptr XGUI_Displayer::getAISObject(ObjectPtr theObject) const { - Handle(AIS_InteractiveObject) anIO; - if (myFeature2AISObjectMap.find(theFeature) != myFeature2AISObjectMap.end()) - anIO = (myFeature2AISObjectMap.find(theFeature))->second; + boost::shared_ptr anIO; + if (myResult2AISObjectMap.find(theObject) != myResult2AISObjectMap.end()) + anIO = (myResult2AISObjectMap.find(theObject))->second; return anIO; } -boost::shared_ptr XGUI_Displayer::GetFeature(Handle(AIS_InteractiveObject) theIO) const +ObjectPtr XGUI_Displayer::getObject(Handle(AIS_InteractiveObject) theIO) const { - boost::shared_ptr aFeature; - FeatureToAISMap::const_iterator aFIt = myFeature2AISObjectMap.begin(), - aFLast = myFeature2AISObjectMap.end(); + ObjectPtr aFeature; + ResultToAISMap::const_iterator aFIt = myResult2AISObjectMap.begin(), aFLast = + myResult2AISObjectMap.end(); for (; aFIt != aFLast && !aFeature; aFIt++) { - Handle(AIS_InteractiveObject) anAIS = (*aFIt).second; + boost::shared_ptr anObj = (*aFIt).second; + if (!anObj) + continue; + Handle(AIS_InteractiveObject) anAIS = anObj->impl(); if (anAIS != theIO) continue; aFeature = (*aFIt).first; @@ -321,24 +374,71 @@ boost::shared_ptr XGUI_Displayer::GetFeature(Handle(AIS_Intera return aFeature; } -void XGUI_Displayer::CloseAllContexts(const bool isUpdateViewer) +void XGUI_Displayer::closeAllContexts(const bool isUpdateViewer) { Handle(AIS_InteractiveContext) ic = AISContext(); if (!ic.IsNull()) { ic->CloseAllContexts(false); if (isUpdateViewer) - UpdateViewer(); + updateViewer(); } } -void XGUI_Displayer::UpdateViewer() +void XGUI_Displayer::updateViewer() { Handle(AIS_InteractiveContext) ic = AISContext(); if (!ic.IsNull()) ic->UpdateCurrentViewer(); } -Handle(AIS_InteractiveContext) XGUI_Displayer::AISContext() const -{ - return myWorkshop->viewer()->AISContext(); +Handle(AIS_InteractiveContext) XGUI_Displayer::AISContext() const +{ + return myWorkshop->viewer()->AISContext(); +} + +void XGUI_Displayer::display(boost::shared_ptr theAIS, bool isUpdate) +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); + if (!anAISIO.IsNull()) + aContext->Display(anAISIO, isUpdate); +} + +void XGUI_Displayer::erase(boost::shared_ptr theAIS, const bool isUpdate) +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); + if (!anAISIO.IsNull()) { + aContext->Remove(anAISIO, isUpdate); + } +} + +void XGUI_Displayer::activateObjectsOutOfContext(const std::list& theModes, + Handle(SelectMgr_Filter) theFilter) +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + // Open local context if there is no one + if (!aContext->HasOpenedContext()) + return; + + aContext->UseDisplayedObjects(); + std::list::const_iterator anIt = theModes.begin(), aLast = theModes.end(); + for (; anIt != aLast; anIt++) { + aContext->ActivateStandardMode((TopAbs_ShapeEnum)(*anIt)); + } + + if (!theFilter.IsNull()) + aContext->AddFilter(theFilter); } + + +void XGUI_Displayer::deactivateObjectsOutOfContext() +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + // Open local context if there is no one + if (!aContext->HasOpenedContext()) + return; + + aContext->RemoveFilters(); + aContext->NotUseDisplayedObjects(); +} \ No newline at end of file