X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Selection.cpp;h=6091e71f40f739945710091312cc5aab0a7aaa2a;hb=bcc630bf2fafca72ff0e41ab9e6d6f6b9da30467;hp=1b6f86542f9b2dfa79f6576a6741846e1a61b0df;hpb=92032c15f93f9cb6a0477de161ea932a5df01cd3;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Selection.cpp b/src/XGUI/XGUI_Selection.cpp index 1b6f86542..6091e71f4 100644 --- a/src/XGUI/XGUI_Selection.cpp +++ b/src/XGUI/XGUI_Selection.cpp @@ -10,7 +10,11 @@ #include "XGUI_ViewerProxy.h" #include "XGUI_ObjectsBrowser.h" +#include "ModuleBase_ResultPrs.h" +#include + #include +#include #include #include @@ -34,9 +38,9 @@ XGUI_Selection::XGUI_Selection(XGUI_Workshop* theWorkshop) { } -QList XGUI_Selection::getSelected(const SelectionPlace& thePlace) const +QList XGUI_Selection::getSelected(const SelectionPlace& thePlace) const { - QList aPresentations; + QList aPresentations; switch (thePlace) { case Browser: @@ -53,17 +57,17 @@ QList XGUI_Selection::getSelected(const SelectionPlace& th return aPresentations; } -Handle(AIS_InteractiveObject) XGUI_Selection::getIO(const ModuleBase_ViewerPrs& thePrs) +Handle(AIS_InteractiveObject) XGUI_Selection::getIO(const ModuleBase_ViewerPrsPtr& thePrs) { - Handle(AIS_InteractiveObject) anIO = thePrs.interactive(); + Handle(AIS_InteractiveObject) anIO = thePrs->interactive(); if (anIO.IsNull()) { - Handle(SelectMgr_EntityOwner) anOwner = thePrs.owner(); + Handle(SelectMgr_EntityOwner) anOwner = thePrs->owner(); if (!anOwner.IsNull()) anIO = Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable()); - if (anIO.IsNull() && thePrs.object()) { + if (anIO.IsNull() && thePrs->object()) { XGUI_Displayer* aDisplayer = myWorkshop->displayer(); - AISObjectPtr anAISObject = aDisplayer->getAISObject(thePrs.object()); + AISObjectPtr anAISObject = aDisplayer->getAISObject(thePrs->object()); if (anAISObject.get()) anIO = anAISObject->impl(); } @@ -71,13 +75,13 @@ Handle(AIS_InteractiveObject) XGUI_Selection::getIO(const ModuleBase_ViewerPrs& return anIO; } -void XGUI_Selection::getSelectedInViewer(QList& thePresentations) const +void XGUI_Selection::getSelectedInViewer(QList& thePresentations) const { Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); if (!aContext.IsNull() && aContext->HasOpenedContext()) { QList aSelectedIds; // Remember of selected address in order to avoid duplicates for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) { - ModuleBase_ViewerPrs aPrs; + ModuleBase_ViewerPrsPtr aPrs(new ModuleBase_ViewerPrs()); Handle(SelectMgr_EntityOwner) anOwner = aContext->SelectedOwner(); if (aSelectedIds.contains((long)anOwner.Access())) @@ -92,14 +96,14 @@ void XGUI_Selection::getSelectedInViewer(QList& thePresent } } -void XGUI_Selection::getSelectedInBrowser(QList& thePresentations) const +void XGUI_Selection::getSelectedInBrowser(QList& thePresentations) const { // collect the objects of the parameter presentation to avoid a repeted objects in the result QObjectPtrList aPresentationObjects; - QList::const_iterator aPrsIt = thePresentations.begin(), + QList::const_iterator aPrsIt = thePresentations.begin(), aPrsLast = thePresentations.end(); for (; aPrsIt != aPrsLast; aPrsIt++) { - aPresentationObjects.push_back((*aPrsIt).object()); + aPresentationObjects.push_back((*aPrsIt)->object()); } QObjectPtrList anObjects = selectedObjects(); @@ -107,19 +111,20 @@ void XGUI_Selection::getSelectedInBrowser(QList& thePresen for (; anIt != aLast; anIt++) { ObjectPtr anObject = *anIt; if (anObject.get() != NULL && !aPresentationObjects.contains(anObject)) { - thePresentations.append(ModuleBase_ViewerPrs(anObject, TopoDS_Shape(), NULL)); + thePresentations.append(std::shared_ptr( + new ModuleBase_ViewerPrs(anObject, GeomShapePtr(), NULL))); } } } -void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrs& thePrs, +void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrsPtr& thePrs, const Handle(SelectMgr_EntityOwner)& theOwner) const { - thePrs.setOwner(theOwner); + thePrs->setOwner(theOwner); Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast(theOwner->Selectable()); - thePrs.setInteractive(anIO); + thePrs->setInteractive(anIO); // we should not check the appearance of this feature because there can be some selected shapes // for one feature @@ -132,8 +137,11 @@ void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrs& thePrs, if (aShape.IsNull()) aShape = findAxisShape(anIO); #endif - if (!aShape.IsNull()) - thePrs.setShape(aShape); + if (!aShape.IsNull()) { + std::shared_ptr aGeomShape = std::shared_ptr(new GeomAPI_Shape()); + aGeomShape->setImpl(new TopoDS_Shape(aShape)); + thePrs->setShape(aGeomShape); + } } else { #ifdef DEBUG_DELIVERY // Fill by trihedron shapes @@ -147,8 +155,11 @@ void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrs& thePrs, BRep_Builder aBuilder; TopoDS_Edge aEdge; aBuilder.MakeEdge(aEdge, aTLine, Precision::Confusion()); - if (!aEdge.IsNull()) - thePrs.setShape(aEdge); + if (!aEdge.IsNull()) { + std::shared_ptr aGeomShape = std::shared_ptr(new GeomAPI_Shape()); + aGeomShape->setImpl(new TopoDS_Shape(aEdge)); + thePrs->setShape(aGeomShape); + } } else { Handle(AIS_Point) aPoint = Handle(AIS_Point)::DownCast(anIO); if (!aPoint.IsNull()) { @@ -157,8 +168,11 @@ void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrs& thePrs, BRep_Builder aBuilder; TopoDS_Vertex aVertex; aBuilder.MakeVertex(aVertex, aPnt->Pnt(), Precision::Confusion()); - if (!aVertex.IsNull()) - thePrs.setShape(aVertex); + if (!aVertex.IsNull()) { + std::shared_ptr aGeomShape = std::shared_ptr(new GeomAPI_Shape()); + aGeomShape->setImpl(new TopoDS_Shape(aVertex)); + thePrs->setShape(aGeomShape); + } } } #endif @@ -166,12 +180,29 @@ void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrs& thePrs, XGUI_Displayer* aDisplayer = myWorkshop->displayer(); ObjectPtr aFeature = aDisplayer->getObject(anIO); - thePrs.setObject(aFeature); + + Handle(ModuleBase_BRepOwner) aCompSolidBRO = Handle(ModuleBase_BRepOwner)::DownCast(theOwner); + if (!aCompSolidBRO.IsNull()) { + // If ModuleBase_BRepOwner object is created then it means that TopAbs_COMPSOLID selection mode + // is On and we have to use parent result which corresponds to the CompSolid shape + ResultPtr aResult = std::dynamic_pointer_cast(aFeature); + if (aResult.get()) { + ResultCompSolidPtr aCompSolid = ModelAPI_Tools::compSolidOwner(aResult); + if (aCompSolid.get()) { + GeomShapePtr aShape = aCompSolid->shape(); + if (aShape.get() && aShape->isEqual(thePrs->shape())) { + thePrs->setObject(aCompSolid); + return; + } + } + } + } + thePrs->setObject(aFeature); } -QList XGUI_Selection::getHighlighted() const +QList XGUI_Selection::getHighlighted() const { - QList aPresentations; + QList aPresentations; Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); if (aContext.IsNull()) return aPresentations; @@ -179,22 +210,25 @@ QList XGUI_Selection::getHighlighted() const QList aSelectedIds; // Remember of selected address in order to avoid duplicates XGUI_Displayer* aDisplayer = myWorkshop->displayer(); for (aContext->InitDetected(); aContext->MoreDetected(); aContext->NextDetected()) { - ModuleBase_ViewerPrs aPrs; + ModuleBase_ViewerPrsPtr aPrs(new ModuleBase_ViewerPrs()); Handle(AIS_InteractiveObject) anIO = aContext->DetectedInteractive(); if (aSelectedIds.contains((long)anIO.Access())) continue; aSelectedIds.append((long)anIO.Access()); - aPrs.setInteractive(anIO); + aPrs->setInteractive(anIO); ObjectPtr aResult = aDisplayer->getObject(anIO); // we should not check the appearance of this feature because there can be some selected shapes // for one feature - aPrs.setObject(aResult); + aPrs->setObject(aResult); if (aContext->HasOpenedContext()) { TopoDS_Shape aShape = aContext->DetectedShape(); - if (!aShape.IsNull()) - aPrs.setShape(aShape); + if (!aShape.IsNull()) { + std::shared_ptr aGeomShape = std::shared_ptr(new GeomAPI_Shape()); + aGeomShape->setImpl(new TopoDS_Shape(aShape)); + aPrs->setShape(aGeomShape); + } } aPresentations.push_back(aPrs); } @@ -259,33 +293,6 @@ ObjectPtr XGUI_Selection::getSelectableObject(const Handle(SelectMgr_EntityOwner return anObject; } -//************************************************************** -void XGUI_Selection::selectedShapes(NCollection_List& theList, - std::list& theOwners) const -{ - theList.Clear(); - Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); - if (aContext.IsNull()) - return; - - for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) { - TopoDS_Shape aShape = aContext->SelectedShape(); - if (aShape.IsNull()) { - aShape = findAxisShape(aContext->SelectedInteractive()); - } - if (!aShape.IsNull()) { - theList.Append(aShape); - Handle(SelectMgr_EntityOwner) aEO = aContext->SelectedOwner(); - if (!aEO.IsNull()) { - Handle(AIS_InteractiveObject) anObj = - Handle(AIS_InteractiveObject)::DownCast(aEO->Selectable()); - ObjectPtr anObject = myWorkshop->displayer()->getObject(anObj); - theOwners.push_back(anObject); - } - } - } -} - //************************************************************** void XGUI_Selection::selectedOwners(SelectMgr_IndexedMapOfOwner& theSelectedOwners) const {