X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Displayer.cpp;h=736de32d2d7059deaafe0394e5b8e1d83f5cf0cd;hb=4fcd5da2d972334e887716499b0ea75d9d6c51c2;hp=dcfe8385d5091aa11ab59381cb771327fc27a439;hpb=7c008126286a78ecb31e217b97070f8dcfa56e7c;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index dcfe8385d..736de32d2 100644 --- a/src/XGUI/XGUI_Displayer.cpp +++ b/src/XGUI/XGUI_Displayer.cpp @@ -8,12 +8,27 @@ #include "XGUI_ViewerProxy.h" #include +#include +#include +#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 XGUI_Displayer::XGUI_Displayer(XGUI_Workshop* theWorkshop) { @@ -24,115 +39,322 @@ XGUI_Displayer::~XGUI_Displayer() { } -bool XGUI_Displayer::IsVisible(boost::shared_ptr theFeature) +bool XGUI_Displayer::isVisible(ObjectPtr theObject) const { - 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(ObjectPtr theObject, bool isUpdateViewer) { + if (isVisible(theObject)) { + redisplay(theObject, isUpdateViewer); + } else { + AISObjectPtr anAIS; + + GeomPresentablePtr aPrs = boost::dynamic_pointer_cast(theObject); + bool isShading = false; + if (aPrs) { + anAIS = aPrs->getAISObject(AISObjectPtr()); + } else { + ResultPtr aResult = boost::dynamic_pointer_cast(theObject); + if (aResult) { + boost::shared_ptr aShapePtr = ModelAPI_Tools::shape(aResult); + if (aShapePtr) { + anAIS = AISObjectPtr(new GeomAPI_AISObject()); + anAIS->setImpl(new Handle(AIS_InteractiveObject)(new ModuleBase_ResultPrs(aResult))); + //anAIS->createShape(aShapePtr); + isShading = true; + } + } + } + if (anAIS) + display(theObject, anAIS, isShading, isUpdateViewer); + } } -void XGUI_Displayer::Display(boost::shared_ptr theFeature, - const TopoDS_Shape& theShape, const bool isUpdateViewer) +void XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS, + bool isShading, bool isUpdateViewer) { Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; - Handle(AIS_Shape) anAIS = new AIS_Shape(theShape); - std::vector aDispAIS; - if (myFeature2AISObjectMap.find(theFeature) != myFeature2AISObjectMap.end()) { - aDispAIS = myFeature2AISObjectMap[theFeature]; + Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); + if (!anAISIO.IsNull()) { + myResult2AISObjectMap[theObject] = theAIS; + aContext->Display(anAISIO, false); + aContext->SetDisplayMode(anAISIO, isShading? Shading : Wireframe, isUpdateViewer); } - aDispAIS.push_back(anAIS); - myFeature2AISObjectMap[theFeature] = aDispAIS; +} - aContext->Display(anAIS, Standard_False); +void XGUI_Displayer::erase(ObjectPtr theObject, const bool isUpdateViewer) +{ + if (!isVisible(theObject)) + return; - if (isUpdateViewer) - aContext->UpdateCurrentViewer(); + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + AISObjectPtr anObject = myResult2AISObjectMap[theObject]; + if (anObject) { + Handle(AIS_InteractiveObject) anAIS = anObject->impl(); + if (!anAIS.IsNull()) { + aContext->Remove(anAIS, isUpdateViewer); + } + } + myResult2AISObjectMap.erase(theObject); } -void XGUI_Displayer::Erase(boost::shared_ptr theFeature, - const bool isUpdateViewer) +void XGUI_Displayer::redisplay(ObjectPtr theObject, bool isUpdateViewer) { - if (myFeature2AISObjectMap.find(theFeature) == myFeature2AISObjectMap.end()) + if (!isVisible(theObject)) return; - std::vector aDispAIS = myFeature2AISObjectMap[theFeature]; - std::vector::const_iterator anIt = aDispAIS.begin(), - aLast = aDispAIS.end(); + AISObjectPtr aAISObj = getAISObject(theObject); + Handle(AIS_InteractiveObject) aAISIO = aAISObj->impl(); + + GeomPresentablePtr aPrs = boost::dynamic_pointer_cast(theObject); + if (aPrs) { + AISObjectPtr aAIS_Obj = aPrs->getAISObject(aAISObj); + if (!aAIS_Obj) { + erase(theObject, isUpdateViewer); + return; + } + if (aAIS_Obj != aAISObj) { + myResult2AISObjectMap[theObject] = aAIS_Obj; + } + aAISIO = aAIS_Obj->impl(); + } + + if (!aAISIO.IsNull()) { + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + aContext->Redisplay(aAISIO, isUpdateViewer); + } +} + +void XGUI_Displayer::deactivate(ObjectPtr theObject) +{ + if (isVisible(theObject)) { + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + + AISObjectPtr anObj = myResult2AISObjectMap[theObject]; + Handle(AIS_InteractiveObject) anAIS = anObj->impl(); + aContext->Deactivate(anAIS); + } +} + +void XGUI_Displayer::activate(ObjectPtr theObject, const QIntList& theModes) +{ + if (isVisible(theObject)) { + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + + AISObjectPtr anObj = myResult2AISObjectMap[theObject]; + Handle(AIS_InteractiveObject) anAIS = anObj->impl(); + if (aContext->HasOpenedContext()) { + aContext->Load(anAIS, -1, true); + } + if (theModes.size() > 0) { + foreach(int aMode, theModes) { + aContext->Activate(anAIS, aMode); + } + } else + aContext->Activate(anAIS); + } +} + +bool XGUI_Displayer::isActive(ObjectPtr theObject) const +{ Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return false; + if (!isVisible(theObject)) + return false; + + AISObjectPtr anObj = myResult2AISObjectMap.at(theObject); + Handle(AIS_InteractiveObject) anAIS = anObj->impl(); + + TColStd_ListOfInteger aModes; + aContext->ActivatedModes(anAIS, aModes); + return aModes.Extent() > 0; +} + +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; + QList::const_iterator anIt = theResults.begin(), aLast = theResults.end(); + ObjectPtr aFeature; for (; anIt != aLast; anIt++) { - Handle(AIS_InteractiveObject) anAIS = *anIt; - Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast(anAIS); - if (anAISShape.IsNull()) + aFeature = *anIt; + if (isVisible(aFeature)) + anAIS = Handle(AIS_Shape)::DownCast( + myResult2AISObjectMap[aFeature]->impl()); + if (anAIS.IsNull()) continue; - aContext->Erase(anAISShape); - } + if (isStop) { + QColor aColor(Qt::white); + anAIS->SetColor( + Quantity_Color(aColor.red() / 255., aColor.green() / 255., aColor.blue() / 255., + Quantity_TOC_RGB)); + anAIS->Redisplay(); + } else { + QColor aColor(Qt::red); + anAIS->SetColor( + Quantity_Color(aColor.red() / 255., aColor.green() / 255., aColor.blue() / 255., + Quantity_TOC_RGB)); + anAIS->Redisplay(); + } + } if (isUpdateViewer) - aContext->UpdateCurrentViewer(); + updateViewer(); } -void XGUI_Displayer::DisplayInLocalContext(boost::shared_ptr theFeature, - const TopoDS_Shape& theShape, - const int theMode, const bool isUpdateViewer) +void XGUI_Displayer::setSelected(const QList& theResults, const bool isUpdateViewer) { Handle(AIS_InteractiveContext) aContext = AISContext(); - - if (IsVisible(theFeature)) { - Erase(theFeature, false); - } + // 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()); - Handle(AIS_Shape) anAIS = new AIS_Shape(theShape); - std::vector aDispAIS; - if (myFeature2AISObjectMap.find(theFeature) != myFeature2AISObjectMap.end()) { - aDispAIS = myFeature2AISObjectMap[theFeature]; - } - aDispAIS.push_back(anAIS); - myFeature2AISObjectMap[theFeature] = aDispAIS; - aContext->Display(anAIS, Standard_False); + aContext->ClearSelected(); + foreach(ObjectPtr aResult, theResults) + { + if (myResult2AISObjectMap.find(aResult) == myResult2AISObjectMap.end()) + continue; - AIS_ListOfInteractive anAISList; - anAISList.Append(anAIS); - activateInLocalContext(anAISList, theMode, true); + AISObjectPtr anObj = myResult2AISObjectMap[aResult]; + if (anObj) { + Handle(AIS_InteractiveObject) anAIS = anObj->impl(); + if (!anAIS.IsNull()) + aContext->AddOrRemoveSelected(anAIS, false); + } + } + if (isUpdateViewer) + updateViewer(); } -void XGUI_Displayer::CloseLocalContexts(const bool isUpdateViewer) + +void XGUI_Displayer::clearSelected() { - closeAllContexts(true); + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext) { + aContext->UnhilightCurrents(false); + aContext->ClearSelected(); + } } -void XGUI_Displayer::activateInLocalContext(const AIS_ListOfInteractive& theAISObjects, const int theMode, - const bool isUpdateViewer) +void XGUI_Displayer::eraseAll(const bool isUpdateViewer) { Handle(AIS_InteractiveContext) ic = AISContext(); + if (ic.IsNull()) + return; - // Open local context if there is no one - bool allObjects = false; // calculate by AIS shape - if (!ic->HasOpenedContext()) { - ic->ClearCurrents(false); - ic->OpenLocalContext(allObjects, true, true); - } + ResultToAISMap::iterator aIt; + for (aIt = myResult2AISObjectMap.begin(); aIt != myResult2AISObjectMap.end(); aIt++) { + // erase an object + AISObjectPtr aAISObj = (*aIt).second; + Handle(AIS_InteractiveObject) anIO = aAISObj->impl(); + if (!anIO.IsNull()) + ic->Remove(anIO, false); + } + myResult2AISObjectMap.clear(); + if (isUpdateViewer) + updateViewer(); + } - // Activate selection of objects from prs - AIS_ListIteratorOfListOfInteractive aIter(theAISObjects); - for (; aIter.More(); aIter.Next()) { - Handle(AIS_InteractiveObject) anAIS = aIter.Value(); - if (!anAIS.IsNull()) { - if (anAIS->IsKind(STANDARD_TYPE(AIS_Shape))) { - ic->Load(anAIS, -1, false); - ic->Activate(anAIS, AIS_Shape::SelectionMode((TopAbs_ShapeEnum)theMode)); - } - else if (anAIS->DynamicType() != STANDARD_TYPE(AIS_Trihedron)) { - ic->Load(anAIS, -1, false); - ic->Activate(anAIS, theMode); +void XGUI_Displayer::eraseDeletedResults(const bool isUpdateViewer) +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + + 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()) { + AISObjectPtr anObj = (*aFIt).second; + if (!anObj) + continue; + Handle(AIS_InteractiveObject) anAIS = anObj->impl(); + if (!anAIS.IsNull()) { + aContext->Remove(anAIS, false); + aRemoved.push_back(aFeature); } } } + std::list::const_iterator anIt = aRemoved.begin(), aLast = aRemoved.end(); + for (; anIt != aLast; anIt++) { + myResult2AISObjectMap.erase(myResult2AISObjectMap.find(*anIt)); + } + if (isUpdateViewer) - ic->UpdateCurrentViewer(); + updateViewer(); +} + +void XGUI_Displayer::openLocalContext() +{ + 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(); + aContext->NotUseDisplayedObjects(); + } +} + +void XGUI_Displayer::closeLocalContexts(const bool isUpdateViewer) +{ + AISContext()->ClearSelected(false); + closeAllContexts(true); +} + +AISObjectPtr XGUI_Displayer::getAISObject(ObjectPtr theObject) const +{ + AISObjectPtr anIO; + if (myResult2AISObjectMap.find(theObject) != myResult2AISObjectMap.end()) + anIO = (myResult2AISObjectMap.find(theObject))->second; + return anIO; +} + +ObjectPtr XGUI_Displayer::getObject(const AISObjectPtr& theIO) const +{ + Handle(AIS_InteractiveObject) aRefAIS = theIO->impl(); + return getObject(aRefAIS); +} + +ObjectPtr XGUI_Displayer::getObject(const Handle(AIS_InteractiveObject)& theIO) const +{ + ObjectPtr aFeature; + ResultToAISMap::const_iterator aFIt = myResult2AISObjectMap.begin(), aFLast = + myResult2AISObjectMap.end(); + for (; aFIt != aFLast && !aFeature; aFIt++) { + AISObjectPtr anObj = (*aFIt).second; + if (!anObj) + continue; + Handle(AIS_InteractiveObject) anAIS = anObj->impl(); + if (anAIS != theIO) + continue; + aFeature = (*aFIt).first; + } + return aFeature; } void XGUI_Displayer::closeAllContexts(const bool isUpdateViewer) @@ -141,11 +363,139 @@ void XGUI_Displayer::closeAllContexts(const bool isUpdateViewer) if (!ic.IsNull()) { ic->CloseAllContexts(false); if (isUpdateViewer) - ic->UpdateCurrentViewer(); + 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(); +} + +void XGUI_Displayer::display(AISObjectPtr 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(AISObjectPtr 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 QIntList& theModes) +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + // Open local context if there is no one + if (!aContext->HasOpenedContext()) + return; + + aContext->UseDisplayedObjects(); + ResultToAISMap::iterator aIt; + Handle(AIS_InteractiveObject) anAISIO; + for (aIt = myResult2AISObjectMap.begin(); aIt != myResult2AISObjectMap.end(); aIt++) { + anAISIO = (*aIt).second->impl(); + aContext->Load(anAISIO, -1, true); + if (theModes.size() == 0) + aContext->Activate(anAISIO); + else { + foreach(int aMode, theModes) { + aContext->Activate(anAISIO, aMode); + } + } + } +} + + +void XGUI_Displayer::deactivateObjectsOutOfContext() +{ + 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) +{ + if (theMode == NoMode) + return; + + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + + AISObjectPtr aAISObj = getAISObject(theObject); + if (!aAISObj) + return; + + Handle(AIS_InteractiveObject) aAISIO = aAISObj->impl(); + aContext->SetDisplayMode(aAISIO, theMode, toUpdate); +} + +void XGUI_Displayer::setSelectionModes(const QIntList& theModes) +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + if (!aContext->HasOpenedContext()) + return; + // Clear previous mode + const TColStd_ListOfInteger& aModes = aContext->ActivatedStandardModes(); + if (!aModes.IsEmpty()) { + TColStd_ListOfInteger aMModes; + aMModes.Assign(aModes); + TColStd_ListIteratorOfListOfInteger it(aMModes); + for(; it.More(); it.Next()) { + aContext->DeactivateStandardMode((TopAbs_ShapeEnum)it.Value()); + } } + foreach(int aMode, theModes) { + aContext->ActivateStandardMode((TopAbs_ShapeEnum)aMode); + } +} + +XGUI_Displayer::DisplayMode XGUI_Displayer::displayMode(ObjectPtr theObject) const +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return NoMode; + + AISObjectPtr aAISObj = getAISObject(theObject); + if (!aAISObj) + return NoMode; + + Handle(AIS_InteractiveObject) aAISIO = aAISObj->impl(); + return (XGUI_Displayer::DisplayMode) aAISIO->DisplayMode(); +} + +void XGUI_Displayer::addSelectionFilter(const Handle(SelectMgr_Filter)& theFilter) +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + aContext->AddFilter(theFilter); } -Handle(AIS_InteractiveContext) XGUI_Displayer::AISContext() const -{ - return myWorkshop->viewer()->AISContext(); +void XGUI_Displayer::removeSelectionFilter(const Handle(SelectMgr_Filter)& theFilter) +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + aContext->RemoveFilter(theFilter); }