X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Displayer.cpp;h=7e5deb50ed54333a332d96c841dd1b68a05a78d0;hb=4ee6972a725f02500c2c543abeef2909180e09c1;hp=8e79d48fb93b9b0c7f64b8f65d1c2b4ec2f40767;hpb=8de33e2487eed6e3aded5c2b086bd2d8b6e36f55;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index 8e79d48fb..7e5deb50e 100644 --- a/src/XGUI/XGUI_Displayer.cpp +++ b/src/XGUI/XGUI_Displayer.cpp @@ -6,15 +6,22 @@ #include "XGUI_Viewer.h" #include "XGUI_Workshop.h" #include "XGUI_ViewerProxy.h" +#include "XGUI_Tools.h" #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; @@ -34,47 +41,61 @@ void XGUI_Displayer::Display(boost::shared_ptr theFeature, { } -void XGUI_Displayer::Display(boost::shared_ptr theFeature, +/*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); - std::vector aDispAIS; - if (myFeature2AISObjectMap.find(theFeature) != myFeature2AISObjectMap.end()) { - aDispAIS = myFeature2AISObjectMap[theFeature]; - } - aDispAIS.push_back(anAIS); - myFeature2AISObjectMap[theFeature] = aDispAIS; + myFeature2AISObjectMap[theFeature] = anAIS; aContext->Display(anAIS, Standard_False); - if (isUpdateViewer) aContext->UpdateCurrentViewer(); +}*/ + + +std::list XGUI_Displayer::GetSelected(const int theShapeTypeToSkip) +{ + 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); + } + return aPresentations; } -boost::shared_ptr XGUI_Displayer::GetFeature(const TopoDS_Shape& theShape) +std::list XGUI_Displayer::GetHighlighted(const int theShapeTypeToSkip) { - boost::shared_ptr aFeature; + std::set > aPrsFeatures; + std::list aPresentations; - FeatureToAISMap::const_iterator aFIt = myFeature2AISObjectMap.begin(), - aFLast = myFeature2AISObjectMap.end(); - for (; aFIt != aFLast && !aFeature; aFIt++) - { - std::vector aDispAIS = (*aFIt).second; - std::vector::const_iterator anIt = aDispAIS.begin(), - aLast = aDispAIS.end(); - Handle(AIS_InteractiveContext) aContext = AISContext(); - for (; anIt != aLast && !aFeature; anIt++) { - Handle(AIS_InteractiveObject) anAIS = *anIt; - Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast(anAIS); - if (!anAISShape.IsNull() && anAISShape->Shape() == theShape) { - aFeature = (*aFIt).first; - } - } + 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; + + boost::shared_ptr aFeature = GetFeature(anIO); + if (aPrsFeatures.find(aFeature) != aPrsFeatures.end()) + continue; + aPresentations.push_back(XGUI_ViewerPrs(aFeature, aShape)); + aPrsFeatures.insert(aFeature); } - return aFeature; + return aPresentations; } void XGUI_Displayer::Erase(boost::shared_ptr theFeature, @@ -83,16 +104,12 @@ void XGUI_Displayer::Erase(boost::shared_ptr theFeature, if (myFeature2AISObjectMap.find(theFeature) == myFeature2AISObjectMap.end()) return; - std::vector aDispAIS = myFeature2AISObjectMap[theFeature]; - std::vector::const_iterator anIt = aDispAIS.begin(), - aLast = aDispAIS.end(); Handle(AIS_InteractiveContext) aContext = AISContext(); - for (; anIt != aLast; anIt++) { - Handle(AIS_InteractiveObject) anAIS = *anIt; - Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast(anAIS); - if (anAISShape.IsNull()) - continue; - aContext->Erase(anAISShape); + Handle(AIS_InteractiveObject) anAIS = myFeature2AISObjectMap[theFeature]; + Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast(anAIS); + if (!anAISShape.IsNull()) + { + aContext->Erase(anAISShape); } myFeature2AISObjectMap.erase(theFeature); @@ -100,52 +117,201 @@ void XGUI_Displayer::Erase(boost::shared_ptr theFeature, aContext->UpdateCurrentViewer(); } -void XGUI_Displayer::RedisplayInLocalContext(boost::shared_ptr theFeature, - const TopoDS_Shape& theShape, - const std::list& theModes, const bool isUpdateViewer) +void XGUI_Displayer::Redisplay(boost::shared_ptr theFeature, + const TopoDS_Shape& theShape, const bool isUpdateViewer) { Handle(AIS_InteractiveContext) aContext = AISContext(); - - if (IsVisible(theFeature)) { - Erase(theFeature, false); + // 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(); - Handle(AIS_Shape) anAIS = new AIS_Shape(theShape); - std::vector aDispAIS; - if (myFeature2AISObjectMap.find(theFeature) != myFeature2AISObjectMap.end()) { - aDispAIS = myFeature2AISObjectMap[theFeature]; + /*if (aContext->IsSelected(anAIS)) { + aContext->AddOrRemoveSelected(anAIS, false); + aContext->AddOrRemoveSelected(anAIS, false); + //aContext->SetSelected(anAIS, false); + }*/ + } } - aDispAIS.push_back(anAIS); - myFeature2AISObjectMap[theFeature] = aDispAIS; - - Handle(AIS_InteractiveContext) ic = AISContext(); + else { + anAIS = new AIS_Shape(theShape); + myFeature2AISObjectMap[theFeature] = anAIS; + aContext->Display(anAIS, false); + } +} +void XGUI_Displayer::ActivateInLocalContext(boost::shared_ptr theFeature, + const std::list& theModes, const bool isUpdateViewer) +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); // Open local context if there is no one - if (!ic->HasOpenedContext()) { - ic->ClearCurrents(false); - ic->OpenLocalContext(false/*use displayed objects*/, /*true*/false/*use displayed objects*/, - true/*allow shape decomposition*/); + if (!aContext->HasOpenedContext()) { + aContext->ClearCurrents(false); + aContext->OpenLocalContext(false/*use displayed objects*/, true/*allow shape decomposition*/); } + // display or redisplay presentation + Handle(AIS_Shape) anAIS; + if (IsVisible(theFeature)) + anAIS = Handle(AIS_Shape)::DownCast(myFeature2AISObjectMap[theFeature]); + // Activate selection of objects from prs if (!anAIS.IsNull()) { - if (anAIS->IsKind(STANDARD_TYPE(AIS_Shape))) { - ic->Display(anAIS, false); - ic->Load(anAIS, -1, true/*allow decomposition*/); - std::list::const_iterator anIt = theModes.begin(), aLast = theModes.end(); - for (; anIt != aLast; anIt++) - ic->Activate(anAIS, AIS_Shape::SelectionMode((TopAbs_ShapeEnum)*anIt)); + 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)); + } + } + + if (isUpdateViewer) + aContext->UpdateCurrentViewer(); +} + +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; + for (; anIt != aLast; anIt++) { + aFeature = (*anIt).feature(); + if (IsVisible(aFeature)) + anAIS = Handle(AIS_Shape)::DownCast(myFeature2AISObjectMap[aFeature]); + 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->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(); +} + +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; + + 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()) + continue; + aContext->AddOrRemoveSelected(anAIS, false); } + + if (isUpdateViewer) + aContext->UpdateCurrentViewer(); +} + +void XGUI_Displayer::EraseAll(const bool isUpdateViewer) +{ + Handle(AIS_InteractiveContext) ic = AISContext(); + + 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) ic->UpdateCurrentViewer(); } +void XGUI_Displayer::EraseDeletedFeatures(const bool isUpdateViewer) +{ + Handle(AIS_InteractiveContext) aContext = AISContext(); + + FeatureToAISMap::const_iterator aFIt = myFeature2AISObjectMap.begin(), + aFLast = myFeature2AISObjectMap.end(); + std::list> aRemoved; + for (; aFIt != aFLast; aFIt++) + { + boost::shared_ptr aFeature = (*aFIt).first; + if (!aFeature || !aFeature->data() || !aFeature->data()->isValid()) { + Handle(AIS_InteractiveObject) anAIS = (*aFIt).second; + if (!anAIS.IsNull()) { + aContext->Erase(anAIS, false); + aRemoved.push_back(aFeature); + } + } + } + std::list>::const_iterator anIt = aRemoved.begin(), + aLast = aRemoved.end(); + for (; anIt != aLast; anIt++) { + myFeature2AISObjectMap.erase(myFeature2AISObjectMap.find(*anIt)); + } + + if (isUpdateViewer) + aContext->UpdateCurrentViewer(); +} + void XGUI_Displayer::CloseLocalContexts(const bool isUpdateViewer) { - closeAllContexts(true); + CloseAllContexts(true); } -void XGUI_Displayer::closeAllContexts(const bool isUpdateViewer) +boost::shared_ptr XGUI_Displayer::GetFeature(Handle(AIS_InteractiveObject) theIO) +{ + 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 != theIO) + continue; + aFeature = (*aFIt).first; + } + return aFeature; +} + +void XGUI_Displayer::CloseAllContexts(const bool isUpdateViewer) { Handle(AIS_InteractiveContext) ic = AISContext(); if (!ic.IsNull()) { @@ -155,6 +321,13 @@ void XGUI_Displayer::closeAllContexts(const bool isUpdateViewer) } } +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();