X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Selection.cpp;h=079c30cba599938890356ce430a0cb9d2c1727d2;hb=d4ec34025812615d1aa16679db0c5a151b2a2abe;hp=05b4e0ea6d95cf5b8886669138589ef70a0b2339;hpb=141af0409801857d641e2bf61cd414b373e65b0b;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Selection.cpp b/src/XGUI/XGUI_Selection.cpp index 05b4e0ea6..079c30cba 100644 --- a/src/XGUI/XGUI_Selection.cpp +++ b/src/XGUI/XGUI_Selection.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> + // File: XGUI_Selection.cpp // Created: 8 July 2014 // Author: Vitaly SMETANNIKOV @@ -8,106 +10,374 @@ #include "XGUI_ViewerProxy.h" #include "XGUI_ObjectsBrowser.h" +#include "ModuleBase_ResultPrs.h" + #include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include #include +#define DEBUG_DELIVERY XGUI_Selection::XGUI_Selection(XGUI_Workshop* theWorkshop) -: myWorkshop(theWorkshop) + : myWorkshop(theWorkshop) +{ +} + +QList XGUI_Selection::getSelected(const SelectionPlace& thePlace) const { + QList aPresentations; + + switch (thePlace) { + case Browser: + getSelectedInBrowser(aPresentations); + break; + case Viewer: + getSelectedInViewer(aPresentations); + break; + case AllControls: + getSelectedInViewer(aPresentations); + getSelectedInBrowser(aPresentations); + break; + } + return aPresentations; } -std::list XGUI_Selection::getSelected(int theShapeTypeToSkip) const +Handle(AIS_InteractiveObject) XGUI_Selection::getIO(const ModuleBase_ViewerPrs& thePrs) { - std::set aPrsFeatures; - std::list aPresentations; + Handle(AIS_InteractiveObject) anIO = thePrs.interactive(); + if (anIO.IsNull()) { + Handle(SelectMgr_EntityOwner) anOwner = thePrs.owner(); + if (!anOwner.IsNull()) + anIO = Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable()); + + if (anIO.IsNull() && thePrs.object()) { + XGUI_Displayer* aDisplayer = myWorkshop->displayer(); + AISObjectPtr anAISObject = aDisplayer->getAISObject(thePrs.object()); + if (anAISObject.get()) + anIO = anAISObject->impl(); + } + } + return anIO; +} +void XGUI_Selection::getSelectedInViewer(QList& thePresentations) const +{ Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); - for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) { - Handle(AIS_InteractiveObject) anIO = aContext->SelectedInteractive(); - TopoDS_Shape aShape = aContext->SelectedShape(); + 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; + Handle(SelectMgr_EntityOwner) anOwner = aContext->SelectedOwner(); - if (theShapeTypeToSkip >= 0 && !aShape.IsNull() && aShape.ShapeType() == theShapeTypeToSkip) - continue; + if (aSelectedIds.contains((long)anOwner.Access())) + continue; + aSelectedIds.append((long)anOwner.Access()); - ResultPtr aFeature = myWorkshop->displayer()->getResult(anIO); - if (aPrsFeatures.find(aFeature) != aPrsFeatures.end()) - continue; - Handle(SelectMgr_EntityOwner) anOwner = aContext->SelectedOwner(); - aPresentations.push_back(ModuleBase_ViewerPrs(aFeature, aShape, anOwner)); - aPrsFeatures.insert(aFeature); + fillPresentation(aPrs, anOwner); + + if (!thePresentations.contains(aPrs)) // TODO: check whether the presentation in a list + thePresentations.append(aPrs); + } } - return aPresentations; } -std::list XGUI_Selection::getHighlighted(int theShapeTypeToSkip) const +void XGUI_Selection::getSelectedInBrowser(QList& thePresentations) const { - std::set aPrsFeatures; - std::list aPresentations; + // collect the objects of the parameter presentation to avoid a repeted objects in the result + QObjectPtrList aPresentationObjects; + QList::const_iterator aPrsIt = thePresentations.begin(), + aPrsLast = thePresentations.end(); + for (; aPrsIt != aPrsLast; aPrsIt++) { + aPresentationObjects.push_back((*aPrsIt).object()); + } + QObjectPtrList anObjects = selectedObjects(); + QObjectPtrList::const_iterator anIt = anObjects.begin(), aLast = anObjects.end(); + for (; anIt != aLast; anIt++) { + ObjectPtr anObject = *anIt; + if (anObject.get() != NULL && !aPresentationObjects.contains(anObject)) { + thePresentations.append(ModuleBase_ViewerPrs(anObject, TopoDS_Shape(), NULL)); + } + } +} + +void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrs& thePrs, + const Handle(SelectMgr_EntityOwner)& theOwner) const +{ + thePrs.setOwner(theOwner); + + Handle(AIS_InteractiveObject) anIO = + Handle(AIS_InteractiveObject)::DownCast(theOwner->Selectable()); + thePrs.setInteractive(anIO); + + // we should not check the appearance of this feature because there can be some selected shapes + // for one feature + Handle(StdSelect_BRepOwner) aBRO = Handle(StdSelect_BRepOwner)::DownCast(theOwner); + if( !aBRO.IsNull() && aBRO->HasShape() ) { + // the located method is called in the context to obtain the shape by the SelectedShape() method, + // so the shape is located by the same rules + TopoDS_Shape aShape = aBRO->Shape().Located (aBRO->Location() * aBRO->Shape().Location()); +#ifndef DEBUG_DELIVERY + if (aShape.IsNull()) + aShape = findAxisShape(anIO); +#endif + if (!aShape.IsNull()) + thePrs.setShape(aShape); + } else { +#ifdef DEBUG_DELIVERY + // Fill by trihedron shapes + Handle(AIS_Axis) aAxis = Handle(AIS_Axis)::DownCast(anIO); + if (!aAxis.IsNull()) { + // an Axis from Trihedron + Handle(Geom_Line) aLine = aAxis->Component(); + Handle(Prs3d_DatumAspect) DA = aAxis->Attributes()->DatumAspect(); + Handle(Geom_TrimmedCurve) aTLine = new Geom_TrimmedCurve(aLine, 0, DA->FirstAxisLength()); + + BRep_Builder aBuilder; + TopoDS_Edge aEdge; + aBuilder.MakeEdge(aEdge, aTLine, Precision::Confusion()); + if (!aEdge.IsNull()) + thePrs.setShape(aEdge); + } else { + Handle(AIS_Point) aPoint = Handle(AIS_Point)::DownCast(anIO); + if (!aPoint.IsNull()) { + // A point from trihedron + Handle(Geom_Point) aPnt = aPoint->Component(); + BRep_Builder aBuilder; + TopoDS_Vertex aVertex; + aBuilder.MakeVertex(aVertex, aPnt->Pnt(), Precision::Confusion()); + if (!aVertex.IsNull()) + thePrs.setShape(aVertex); + } + } +#endif + } + + XGUI_Displayer* aDisplayer = myWorkshop->displayer(); + ObjectPtr aFeature = aDisplayer->getObject(anIO); + + 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 aShapePtr = aCompSolid->shape(); + if (aShapePtr.get()) { + TopoDS_Shape aShape = aShapePtr->impl(); + if (aShape.IsEqual(thePrs.shape())) { + thePrs.setObject(aCompSolid); + return; + } + } + } + } + } + thePrs.setObject(aFeature); +} + +QList XGUI_Selection::getHighlighted() const +{ + QList aPresentations; Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); + if (aContext.IsNull()) + return aPresentations; + + 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; Handle(AIS_InteractiveObject) anIO = aContext->DetectedInteractive(); - TopoDS_Shape aShape = aContext->DetectedShape(); - if (theShapeTypeToSkip >= 0 && !aShape.IsNull() && aShape.ShapeType() == theShapeTypeToSkip) + if (aSelectedIds.contains((long)anIO.Access())) continue; + + aSelectedIds.append((long)anIO.Access()); + aPrs.setInteractive(anIO); - ResultPtr aResult = myWorkshop->displayer()->getResult(anIO); - if (aPrsFeatures.find(aResult) != aPrsFeatures.end()) - continue; - aPresentations.push_back(ModuleBase_ViewerPrs(aResult, aShape, NULL)); - aPrsFeatures.insert(aResult); + 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); + if (aContext->HasOpenedContext()) { + TopoDS_Shape aShape = aContext->DetectedShape(); + if (!aShape.IsNull()) + aPrs.setShape(aShape); + } + aPresentations.push_back(aPrs); } - return aPresentations; } -QList XGUI_Selection::selectedObjects() const +QObjectPtrList XGUI_Selection::selectedObjects() const { return myWorkshop->objectBrowser()->selectedObjects(); } - -QResultList XGUI_Selection::selectedResults() const + +void XGUI_Selection::setSelectedObjects( const QObjectPtrList& theObjects ) const +{ + return myWorkshop->objectBrowser()->setObjectsSelected( theObjects ); +} + +QObjectPtrList XGUI_Selection::selectedPresentations() const { - QResultList aSelectedList; + QObjectPtrList aSelectedList; Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); - for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) { - Handle(AIS_InteractiveObject) anIO = aContext->SelectedInteractive(); - ResultPtr aResult = myWorkshop->displayer()->getResult(anIO); - if (aResult) - aSelectedList.append(aResult); + if (!aContext.IsNull()) { + for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) { + Handle(AIS_InteractiveObject) anIO = aContext->SelectedInteractive(); + ObjectPtr aResult = myWorkshop->displayer()->getObject(anIO); + if (aResult) + aSelectedList.append(aResult); + } } return aSelectedList; } - //************************************************************** -QModelIndexList XGUI_Selection::selectedIndexes() const -{ +QModelIndexList XGUI_Selection::selectedIndexes() const +{ return myWorkshop->objectBrowser()->selectedIndexes(); } //************************************************************** void XGUI_Selection::selectedAISObjects(AIS_ListOfInteractive& theList) const { - Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); theList.Clear(); - for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) - theList.Append(aContext->SelectedInteractive()); + + Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); + if (!aContext.IsNull()) { + for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) + theList.Append(aContext->SelectedInteractive()); + } +} + +//************************************************************** +ObjectPtr XGUI_Selection::getSelectableObject(const Handle(SelectMgr_EntityOwner)& theOwner) const +{ + ObjectPtr anObject; + + Handle(SelectMgr_EntityOwner) aEO = theOwner; + if (!aEO.IsNull()) { + Handle(AIS_InteractiveObject) anObj = + Handle(AIS_InteractiveObject)::DownCast(aEO->Selectable()); + anObject = myWorkshop->displayer()->getObject(anObj); + } + return anObject; } //************************************************************** -void XGUI_Selection::selectedShapes(NCollection_List& theList) const +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()) + 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 +{ + Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); + if (!aContext.IsNull()) { + for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) { + theSelectedOwners.Add(aContext->SelectedOwner()); + } + } +} + +//************************************************************** +void XGUI_Selection::entityOwners(const Handle(AIS_InteractiveObject)& theObject, + SelectMgr_IndexedMapOfOwner& theOwners) const +{ + Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); + if (aContext.IsNull() || theObject.IsNull()) + return; + + TColStd_ListOfInteger aModes; + aContext->ActivatedModes(theObject, aModes); + + TColStd_ListIteratorOfListOfInteger anIt(aModes); + for (; anIt.More(); anIt.Next()) { + int aMode = anIt.Value(); + if (!theObject->HasSelection(aMode)) + continue; + + Handle(SelectMgr_Selection) aSelection = theObject->Selection(aMode); + for (aSelection->Init(); aSelection->More(); aSelection->Next()) { + Handle(SelectMgr_SensitiveEntity) anEntity = aSelection->Sensitive(); + if (anEntity.IsNull()) + continue; + Handle(SelectMgr_EntityOwner) anOwner = + Handle(SelectMgr_EntityOwner)::DownCast(anEntity->BaseSensitive()->OwnerId()); + if (!anOwner.IsNull()) + theOwners.Add(anOwner); + } + } +} + +//************************************************************** +TopoDS_Shape XGUI_Selection::findAxisShape(Handle(AIS_InteractiveObject) theIO) const +{ + TopoDS_Shape aShape; + // Fill by trihedron shapes + Handle(AIS_Axis) aAxis = Handle(AIS_Axis)::DownCast(theIO); + if (!aAxis.IsNull()) { + // an Axis from Trihedron + Handle(Geom_Line) aLine = aAxis->Component(); + Handle(Prs3d_DatumAspect) DA = aAxis->Attributes()->DatumAspect(); + Handle(Geom_TrimmedCurve) aTLine = new Geom_TrimmedCurve(aLine, 0, DA->FirstAxisLength()); + + BRep_Builder aBuilder; + TopoDS_Edge aEdge; + aBuilder.MakeEdge(aEdge, aTLine, Precision::Confusion()); + if (!aEdge.IsNull()) + aShape = aEdge; + } else { + Handle(AIS_Point) aPoint = Handle(AIS_Point)::DownCast(theIO); + if (!aPoint.IsNull()) { + // A point from trihedron + Handle(Geom_Point) aPnt = aPoint->Component(); + BRep_Builder aBuilder; + TopoDS_Vertex aVertex; + aBuilder.MakeVertex(aVertex, aPnt->Pnt(), Precision::Confusion()); + if (!aVertex.IsNull()) + aShape = aVertex; + } } + return aShape; }