X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Displayer.cpp;h=736de32d2d7059deaafe0394e5b8e1d83f5cf0cd;hb=4fcd5da2d972334e887716499b0ea75d9d6c51c2;hp=840ade6713d7b7b0bc4d782e98141fed06be057e;hpb=20c269662fbdfeb45eaed671c7ab4de5da4d423e;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index 840ade671..736de32d2 100644 --- a/src/XGUI/XGUI_Displayer.cpp +++ b/src/XGUI/XGUI_Displayer.cpp @@ -12,6 +12,8 @@ #include #include +#include + #include #include @@ -21,6 +23,8 @@ #include #include #include +#include +#include #include @@ -35,7 +39,7 @@ XGUI_Displayer::~XGUI_Displayer() { } -bool XGUI_Displayer::isVisible(ObjectPtr theObject) +bool XGUI_Displayer::isVisible(ObjectPtr theObject) const { return myResult2AISObjectMap.find(theObject) != myResult2AISObjectMap.end(); } @@ -45,35 +49,41 @@ void XGUI_Displayer::display(ObjectPtr theObject, bool isUpdateViewer) if (isVisible(theObject)) { redisplay(theObject, isUpdateViewer); } else { - boost::shared_ptr anAIS; + AISObjectPtr anAIS; GeomPresentablePtr aPrs = boost::dynamic_pointer_cast(theObject); + bool isShading = false; if (aPrs) { - anAIS = aPrs->getAISObject(boost::shared_ptr()); + 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 = boost::shared_ptr(new GeomAPI_AISObject()); - anAIS->createShape(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, isUpdateViewer); + display(theObject, anAIS, isShading, isUpdateViewer); } } -void XGUI_Displayer::display(ObjectPtr theObject, boost::shared_ptr theAIS, - 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_InteractiveObject) anAISIO = theAIS->impl(); if (!anAISIO.IsNull()) { myResult2AISObjectMap[theObject] = theAIS; - aContext->Display(anAISIO, isUpdateViewer); + aContext->Display(anAISIO, false); + aContext->SetDisplayMode(anAISIO, isShading? Shading : Wireframe, isUpdateViewer); } } @@ -83,7 +93,9 @@ void XGUI_Displayer::erase(ObjectPtr theObject, const bool isUpdateViewer) return; Handle(AIS_InteractiveContext) aContext = AISContext(); - boost::shared_ptr anObject = myResult2AISObjectMap[theObject]; + if (aContext.IsNull()) + return; + AISObjectPtr anObject = myResult2AISObjectMap[theObject]; if (anObject) { Handle(AIS_InteractiveObject) anAIS = anObject->impl(); if (!anAIS.IsNull()) { @@ -93,136 +105,91 @@ void XGUI_Displayer::erase(ObjectPtr theObject, const bool isUpdateViewer) myResult2AISObjectMap.erase(theObject); } -/*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) { if (!isVisible(theObject)) return; - Handle(AIS_InteractiveObject) aAISIO; - boost::shared_ptr aAISObj = getAISObject(theObject); + AISObjectPtr aAISObj = getAISObject(theObject); + Handle(AIS_InteractiveObject) aAISIO = aAISObj->impl(); + GeomPresentablePtr aPrs = boost::dynamic_pointer_cast(theObject); if (aPrs) { - boost::shared_ptr aAIS_Obj = aPrs->getAISObject(aAISObj); - if (aAISObj && !aAIS_Obj) { + AISObjectPtr aAIS_Obj = aPrs->getAISObject(aAISObj); + if (!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; - } - } + 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); - //if (aContext->HasOpenedContext()) { - // aContext->Load(aAISIO, -1, true/*allow decomposition*/); - //} - } -} - -void XGUI_Displayer::activateInLocalContext(ObjectPtr theResult, const std::list& theModes, - const bool isUpdateViewer) -{ - 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*/); - aContext->OpenLocalContext(); - aContext->NotUseDisplayedObjects(); - } - // display or redisplay presentation - 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->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, (*anIt)); - } } - - if (isUpdateViewer) - updateViewer(); } void XGUI_Displayer::deactivate(ObjectPtr theObject) { if (isVisible(theObject)) { Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; - boost::shared_ptr anObj = myResult2AISObjectMap[theObject]; + AISObjectPtr anObj = myResult2AISObjectMap[theObject]; Handle(AIS_InteractiveObject) anAIS = anObj->impl(); aContext->Deactivate(anAIS); } } -void XGUI_Displayer::activate(ObjectPtr theObject) +void XGUI_Displayer::activate(ObjectPtr theObject, const QIntList& theModes) { if (isVisible(theObject)) { Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; - boost::shared_ptr anObj = myResult2AISObjectMap[theObject]; + AISObjectPtr anObj = myResult2AISObjectMap[theObject]; Handle(AIS_InteractiveObject) anAIS = anObj->impl(); - aContext->Activate(anAIS); + 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(); @@ -268,7 +235,7 @@ void XGUI_Displayer::setSelected(const QList& theResults, const bool if (myResult2AISObjectMap.find(aResult) == myResult2AISObjectMap.end()) continue; - boost::shared_ptr anObj = myResult2AISObjectMap[aResult]; + AISObjectPtr anObj = myResult2AISObjectMap[aResult]; if (anObj) { Handle(AIS_InteractiveObject) anAIS = anObj->impl(); if (!anAIS.IsNull()) @@ -279,14 +246,26 @@ void XGUI_Displayer::setSelected(const QList& theResults, const bool updateViewer(); } + +void XGUI_Displayer::clearSelected() +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext) { + aContext->UnhilightCurrents(false); + aContext->ClearSelected(); + } +} + void XGUI_Displayer::eraseAll(const bool isUpdateViewer) - { - Handle(AIS_InteractiveContext) ic = AISContext(); +{ + Handle(AIS_InteractiveContext) ic = AISContext(); + if (ic.IsNull()) + return; ResultToAISMap::iterator aIt; for (aIt = myResult2AISObjectMap.begin(); aIt != myResult2AISObjectMap.end(); aIt++) { // erase an object - boost::shared_ptr aAISObj = (*aIt).second; + AISObjectPtr aAISObj = (*aIt).second; Handle(AIS_InteractiveObject) anIO = aAISObj->impl(); if (!anIO.IsNull()) ic->Remove(anIO, false); @@ -299,6 +278,8 @@ void XGUI_Displayer::eraseAll(const bool isUpdateViewer) 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(); @@ -306,7 +287,7 @@ void XGUI_Displayer::eraseDeletedResults(const bool isUpdateViewer) for (; aFIt != aFLast; aFIt++) { ObjectPtr aFeature = (*aFIt).first; if (!aFeature || !aFeature->data() || !aFeature->data()->isValid()) { - boost::shared_ptr anObj = (*aFIt).second; + AISObjectPtr anObj = (*aFIt).second; if (!anObj) continue; Handle(AIS_InteractiveObject) anAIS = anObj->impl(); @@ -325,27 +306,47 @@ void XGUI_Displayer::eraseDeletedResults(const bool isUpdateViewer) 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); } -boost::shared_ptr XGUI_Displayer::getAISObject(ObjectPtr theObject) const +AISObjectPtr XGUI_Displayer::getAISObject(ObjectPtr theObject) const { - boost::shared_ptr anIO; + AISObjectPtr anIO; if (myResult2AISObjectMap.find(theObject) != myResult2AISObjectMap.end()) anIO = (myResult2AISObjectMap.find(theObject))->second; return anIO; } -ObjectPtr XGUI_Displayer::getObject(Handle(AIS_InteractiveObject) theIO) const +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++) { - boost::shared_ptr anObj = (*aFIt).second; + AISObjectPtr anObj = (*aFIt).second; if (!anObj) continue; Handle(AIS_InteractiveObject) anAIS = anObj->impl(); @@ -378,7 +379,7 @@ Handle(AIS_InteractiveContext) XGUI_Displayer::AISContext() const return myWorkshop->viewer()->AISContext(); } -void XGUI_Displayer::display(boost::shared_ptr theAIS, bool isUpdate) +void XGUI_Displayer::display(AISObjectPtr theAIS, bool isUpdate) { Handle(AIS_InteractiveContext) aContext = AISContext(); Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); @@ -386,7 +387,7 @@ void XGUI_Displayer::display(boost::shared_ptr theAIS, bool i aContext->Display(anAISIO, isUpdate); } -void XGUI_Displayer::erase(boost::shared_ptr theAIS, const bool isUpdate) +void XGUI_Displayer::erase(AISObjectPtr theAIS, const bool isUpdate) { Handle(AIS_InteractiveContext) aContext = AISContext(); Handle(AIS_InteractiveObject) anAISIO = theAIS->impl(); @@ -395,8 +396,7 @@ void XGUI_Displayer::erase(boost::shared_ptr theAIS, const bo } } -void XGUI_Displayer::activateObjectsOutOfContext(const std::list& theModes, - Handle(SelectMgr_Filter) theFilter) +void XGUI_Displayer::activateObjectsOutOfContext(const QIntList& theModes) { Handle(AIS_InteractiveContext) aContext = AISContext(); // Open local context if there is no one @@ -404,13 +404,19 @@ void XGUI_Displayer::activateObjectsOutOfContext(const std::list& theModes, return; aContext->UseDisplayedObjects(); - std::list::const_iterator anIt = theModes.begin(), aLast = theModes.end(); - for (; anIt != aLast; anIt++) { - aContext->ActivateStandardMode((TopAbs_ShapeEnum)(*anIt)); + 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); + } + } } - - if (!theFilter.IsNull()) - aContext->AddFilter(theFilter); } @@ -421,6 +427,75 @@ void XGUI_Displayer::deactivateObjectsOutOfContext() if (!aContext->HasOpenedContext()) return; - aContext->RemoveFilters(); aContext->NotUseDisplayedObjects(); -} \ No newline at end of file +} + + +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); +} + +void XGUI_Displayer::removeSelectionFilter(const Handle(SelectMgr_Filter)& theFilter) +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + if (aContext.IsNull()) + return; + aContext->RemoveFilter(theFilter); +}