X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Displayer.cpp;h=54f3728edb3e01d4f92a4fbe406efe06987d53de;hb=f581964034f8df715c46a07c5ecb762492d6b4cf;hp=73515eae779dc9ba8e501c4a2e8c13b9cbfddb40;hpb=41de4f29b4e60b4c733ebd5452296e9849b3e60b;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index 73515eae7..54f3728ed 100644 --- a/src/XGUI/XGUI_Displayer.cpp +++ b/src/XGUI/XGUI_Displayer.cpp @@ -12,13 +12,17 @@ #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) { myWorkshop = theWorkshop; @@ -28,17 +32,17 @@ XGUI_Displayer::~XGUI_Displayer() { } -bool XGUI_Displayer::IsVisible(boost::shared_ptr theFeature) +bool XGUI_Displayer::isVisible(FeaturePtr theFeature) { return myFeature2AISObjectMap.find(theFeature) != myFeature2AISObjectMap.end(); } -void XGUI_Displayer::Display(boost::shared_ptr theFeature, - const bool isUpdateViewer) -{ -} +//void XGUI_Displayer::Display(FeaturePtr theFeature, +// const bool isUpdateViewer) +//{ +//} -/*void XGUI_Displayer::Display(boost::shared_ptr theFeature, +/*void XGUI_Displayer::Display(FeaturePtr theFeature, const TopoDS_Shape& theShape, const bool isUpdateViewer) { Handle(AIS_InteractiveContext) aContext = AISContext(); @@ -48,13 +52,13 @@ void XGUI_Displayer::Display(boost::shared_ptr theFeature, aContext->Display(anAIS, Standard_False); if (isUpdateViewer) - aContext->UpdateCurrentViewer(); + updateViewer(); }*/ -std::list XGUI_Displayer::GetViewerPrs() +std::list XGUI_Displayer::getSelected(const int theShapeTypeToSkip) { - std::set > aPrsFeatures; + std::set aPrsFeatures; std::list aPresentations; Handle(AIS_InteractiveContext) aContext = AISContext(); @@ -62,25 +66,42 @@ std::list XGUI_Displayer::GetViewerPrs() Handle(AIS_InteractiveObject) anIO = aContext->SelectedInteractive(); TopoDS_Shape aShape = aContext->SelectedShape(); - boost::shared_ptr aFeature; - FeatureToAISMap::const_iterator aFIt = myFeature2AISObjectMap.begin(), - aFLast = myFeature2AISObjectMap.end(); - for (; aFIt != aFLast && !aFeature; aFIt++) { - Handle(AIS_InteractiveObject) anAIS = (*aFIt).second; - if (anAIS != anIO) - continue; - aFeature = (*aFIt).first; - } + if (theShapeTypeToSkip >= 0 && !aShape.IsNull() && aShape.ShapeType() == theShapeTypeToSkip) + continue; + + FeaturePtr aFeature = getFeature(anIO); + if (aPrsFeatures.find(aFeature) != aPrsFeatures.end()) + continue; + Handle(SelectMgr_EntityOwner) anOwner = aContext->SelectedOwner(); + aPresentations.push_back(XGUI_ViewerPrs(aFeature, aShape, anOwner)); + aPrsFeatures.insert(aFeature); + } + return aPresentations; +} + +std::list XGUI_Displayer::getHighlighted(const int theShapeTypeToSkip) +{ + 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; + + FeaturePtr aFeature = getFeature(anIO); if (aPrsFeatures.find(aFeature) != aPrsFeatures.end()) continue; - aPresentations.push_back(XGUI_ViewerPrs(aFeature, aShape)); + aPresentations.push_back(XGUI_ViewerPrs(aFeature, aShape, NULL)); aPrsFeatures.insert(aFeature); } return aPresentations; } -void XGUI_Displayer::Erase(boost::shared_ptr theFeature, +void XGUI_Displayer::erase(FeaturePtr theFeature, const bool isUpdateViewer) { if (myFeature2AISObjectMap.find(theFeature) == myFeature2AISObjectMap.end()) @@ -96,46 +117,47 @@ void XGUI_Displayer::Erase(boost::shared_ptr theFeature, myFeature2AISObjectMap.erase(theFeature); if (isUpdateViewer) - aContext->UpdateCurrentViewer(); + updateViewer(); } -void XGUI_Displayer::Redisplay(boost::shared_ptr theFeature, - const TopoDS_Shape& theShape, const bool isUpdateViewer) +bool XGUI_Displayer::redisplay(FeaturePtr theFeature, + Handle(AIS_InteractiveObject) theAIS, + const int theSelectionMode, + const 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(); - - /*if (aContext->IsSelected(anAIS)) { - aContext->AddOrRemoveSelected(anAIS, false); - aContext->AddOrRemoveSelected(anAIS, false); - //aContext->SetSelected(anAIS, false); - }*/ - } + if (isVisible(theFeature) && !myFeature2AISObjectMap[theFeature].IsNull()) { + aContext->RecomputeSelectionOnly(theAIS); } else { - anAIS = new AIS_Shape(theShape); - myFeature2AISObjectMap[theFeature] = anAIS; - aContext->Display(anAIS, false); + myFeature2AISObjectMap[theFeature] = theAIS; + if (theSelectionMode < 0) + { + aContext->Display(theAIS, false); + } + else + { + aContext->Display(theAIS, 0, theSelectionMode, false); + } + isCreated = true; } + if (isUpdateViewer) + updateViewer(); + + return isCreated; } -void XGUI_Displayer::ActivateInLocalContext(boost::shared_ptr theFeature, +void XGUI_Displayer::activateInLocalContext(FeaturePtr theFeature, const std::list& theModes, const bool isUpdateViewer) { Handle(AIS_InteractiveContext) aContext = AISContext(); @@ -146,7 +168,7 @@ void XGUI_Displayer::ActivateInLocalContext(boost::shared_ptr } // display or redisplay presentation Handle(AIS_Shape) anAIS; - if (IsVisible(theFeature)) + if (isVisible(theFeature)) anAIS = Handle(AIS_Shape)::DownCast(myFeature2AISObjectMap[theFeature]); // Activate selection of objects from prs @@ -162,20 +184,20 @@ void XGUI_Displayer::ActivateInLocalContext(boost::shared_ptr } if (isUpdateViewer) - aContext->UpdateCurrentViewer(); + updateViewer(); } -void XGUI_Displayer::StopSelection(const std::list& theFeatures, const bool isStop, +void XGUI_Displayer::stopSelection(const std::list& theFeatures, const bool isStop, const bool isUpdateViewer) { Handle(AIS_InteractiveContext) aContext = AISContext(); Handle(AIS_Shape) anAIS; std::list::const_iterator anIt = theFeatures.begin(), aLast = theFeatures.end(); - boost::shared_ptr aFeature; + FeaturePtr aFeature; for (; anIt != aLast; anIt++) { aFeature = (*anIt).feature(); - if (IsVisible(aFeature)) + if (isVisible(aFeature)) anAIS = Handle(AIS_Shape)::DownCast(myFeature2AISObjectMap[aFeature]); if (anAIS.IsNull()) continue; @@ -192,32 +214,38 @@ void XGUI_Displayer::StopSelection(const std::list& theFeatures, } } if (isUpdateViewer) - aContext->UpdateCurrentViewer(); + updateViewer(); } -void XGUI_Displayer::SetSelected(const std::list& theFeatures, const bool isUpdateViewer) +void XGUI_Displayer::setSelected(const std::list& theFeatures, const bool isUpdateViewer) { Handle(AIS_InteractiveContext) aContext = AISContext(); std::list::const_iterator anIt = theFeatures.begin(), aLast = theFeatures.end(); - boost::shared_ptr aFeature; + FeaturePtr aFeature; Handle(AIS_Shape) anAIS; - aContext->ClearSelected(); + // 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)) + if (isVisible(aFeature)) anAIS = Handle(AIS_Shape)::DownCast(myFeature2AISObjectMap[aFeature]); if (anAIS.IsNull()) continue; aContext->AddOrRemoveSelected(anAIS, false); } + if (isUpdateViewer) - aContext->UpdateCurrentViewer(); + updateViewer(); } -void XGUI_Displayer::EraseAll(const bool isUpdateViewer) +/*void XGUI_Displayer::EraseAll(const bool isUpdateViewer) { Handle(AIS_InteractiveContext) ic = AISContext(); @@ -234,20 +262,20 @@ void XGUI_Displayer::EraseAll(const bool isUpdateViewer) } myFeature2AISObjectMap.clear(); if (isUpdateViewer) - ic->UpdateCurrentViewer(); -} + updateViewer(); +}*/ -void XGUI_Displayer::EraseDeletedFeatures(const bool isUpdateViewer) +void XGUI_Displayer::eraseDeletedFeatures(const bool isUpdateViewer) { Handle(AIS_InteractiveContext) aContext = AISContext(); FeatureToAISMap::const_iterator aFIt = myFeature2AISObjectMap.begin(), aFLast = myFeature2AISObjectMap.end(); - std::list> aRemoved; + std::list aRemoved; for (; aFIt != aFLast; aFIt++) { - boost::shared_ptr aFeature = (*aFIt).first; - if (!aFeature || !aFeature->data()->isValid()) { + FeaturePtr aFeature = (*aFIt).first; + if (!aFeature || !aFeature->data() || !aFeature->data()->isValid()) { Handle(AIS_InteractiveObject) anAIS = (*aFIt).second; if (!anAIS.IsNull()) { aContext->Erase(anAIS, false); @@ -255,32 +283,55 @@ void XGUI_Displayer::EraseDeletedFeatures(const bool isUpdateViewer) } } } - std::list>::const_iterator anIt = aRemoved.begin(), + std::list::const_iterator anIt = aRemoved.begin(), aLast = aRemoved.end(); for (; anIt != aLast; anIt++) { myFeature2AISObjectMap.erase(myFeature2AISObjectMap.find(*anIt)); } if (isUpdateViewer) - aContext->UpdateCurrentViewer(); + updateViewer(); } -void XGUI_Displayer::CloseLocalContexts(const bool isUpdateViewer) +void XGUI_Displayer::closeLocalContexts(const bool isUpdateViewer) { closeAllContexts(true); } +Handle(AIS_InteractiveObject) XGUI_Displayer::getAISObject( + FeaturePtr theFeature) const +{ + Handle(AIS_InteractiveObject) anIO; + if (myFeature2AISObjectMap.find(theFeature) != myFeature2AISObjectMap.end()) + anIO = (myFeature2AISObjectMap.find(theFeature))->second; + return anIO; +} + +FeaturePtr XGUI_Displayer::getFeature(Handle(AIS_InteractiveObject) theIO) const +{ + FeaturePtr aFeature; + FeatureToAISMap::const_iterator aFIt = myFeature2AISObjectMap.begin(), + aFLast = myFeature2AISObjectMap.end(); + for (; aFIt != aFLast && !aFeature; aFIt++) { + Handle(AIS_InteractiveObject) anAIS = (*aFIt).second; + if (anAIS != theIO) + continue; + aFeature = (*aFIt).first; + } + return aFeature; +} + void XGUI_Displayer::closeAllContexts(const bool isUpdateViewer) { Handle(AIS_InteractiveContext) ic = AISContext(); if (!ic.IsNull()) { ic->CloseAllContexts(false); if (isUpdateViewer) - ic->UpdateCurrentViewer(); + updateViewer(); } } -void XGUI_Displayer::UpdateViewer() +void XGUI_Displayer::updateViewer() { Handle(AIS_InteractiveContext) ic = AISContext(); if (!ic.IsNull())