X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_ISelection.cpp;h=1669c2381cea636b871832c37c1d69505faf146b;hb=1490e92974d2c0bdcdbecd6fa9388e31dccfa363;hp=190447668ee13b384c103db32d28c4de004352d5;hpb=5352bbb1915f98d1f02b1cb953a2de19b286a28c;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_ISelection.cpp b/src/ModuleBase/ModuleBase_ISelection.cpp index 190447668..1669c2381 100644 --- a/src/ModuleBase/ModuleBase_ISelection.cpp +++ b/src/ModuleBase/ModuleBase_ISelection.cpp @@ -1,16 +1,143 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D #include "ModuleBase_ISelection.h" -QList ModuleBase_ISelection::getViewerPrs(const QObjectPtrList& theObjects) +#include "ModuleBase_ViewerPrs.h" + +#include +#include +#include +#include +#include + +//******************************************************************** +void ModuleBase_ISelection::appendSelected(const QList theValues, + QList& theValuesTo) +{ + // collect the objects from the viewer + QObjectPtrList anExistedObjects; + QList::const_iterator aPrsIt = theValuesTo.begin(), + aPrsLast = theValuesTo.end(); + for (; aPrsIt != aPrsLast; aPrsIt++) { + if ((*aPrsIt)->owner() && (*aPrsIt)->object()) + anExistedObjects.push_back((*aPrsIt)->object()); + } + + + QList::const_iterator anIt = theValues.begin(), + aLast = theValues.end(); + for (; anIt != aLast; anIt++) { + ObjectPtr anObject = (*anIt)->object(); + if (anObject.get() != NULL && !anExistedObjects.contains(anObject)) { + theValuesTo.append(std::shared_ptr( + new ModuleBase_ViewerPrs(anObject, GeomShapePtr(), NULL))); + } + } + +} + +//******************************************************************** +ResultPtr ModuleBase_ISelection::getResult(const ModuleBase_ViewerPrsPtr& thePrs) +{ + ResultPtr aResult; + + if (thePrs->object().get()) + aResult = std::dynamic_pointer_cast(thePrs->object()); + else if (!thePrs->owner().IsNull()) { + ObjectPtr anObject = getSelectableObject(thePrs->owner()); + aResult = std::dynamic_pointer_cast(anObject); + } + + return aResult; +} + +//******************************************************************** +GeomShapePtr ModuleBase_ISelection::getShape(const ModuleBase_ViewerPrsPtr& thePrs) { - QList aSelectedPrs; + GeomShapePtr aShape; + + const GeomShapePtr& aPrsShape = thePrs->shape(); + // if only result is selected, an empty shape is set to the model + if (!aPrsShape.get() || aPrsShape->isNull()) { + } + else { + aShape = aPrsShape; + // If the result object is built on the same shape, the result shape here is empty one + ResultPtr aResult = getResult(thePrs); + if (aResult.get() && aShape->isEqual(aResult->shape())) + aShape = GeomShapePtr(); + } + return aShape; +} + +//******************************************************************** +QList ModuleBase_ISelection::getViewerPrs(const QObjectPtrList& theObjects) +{ + QList aSelectedPrs; QObjectPtrList::const_iterator anIt = theObjects.begin(), aLast = theObjects.end(); for (; anIt != aLast; anIt++) { ObjectPtr anObject = *anIt; if (anObject.get() != NULL) { - aSelectedPrs.append(ModuleBase_ViewerPrs(anObject, TopoDS_Shape(), NULL)); + aSelectedPrs.append(std::shared_ptr( + new ModuleBase_ViewerPrs(anObject, GeomShapePtr(), NULL))); } } return aSelectedPrs; } + +//******************************************************************** +void ModuleBase_ISelection::filterSelectionOnEqualPoints + (QList& theSelected) +{ + QList aCandidatesToRemove; + QList::const_iterator anIt = theSelected.begin(), + aLast = theSelected.end(); + QList::const_iterator aSubIt; + for (; anIt != aLast; anIt++) { + aSubIt = anIt; + aSubIt++; + for (; aSubIt != aLast; aSubIt++) { + if (isEqualVertices(*anIt, *aSubIt)) { + aCandidatesToRemove.append(*aSubIt); + break; + } + } + } + QList::const_iterator aRemIt = aCandidatesToRemove.begin(), + aRemLast = aCandidatesToRemove.end(); + for (; aRemIt != aRemLast; aRemIt++) { + theSelected.removeAll(*aRemIt); + } +} + +bool ModuleBase_ISelection::isEqualVertices(const ModuleBase_ViewerPrsPtr thePrs1, + const ModuleBase_ViewerPrsPtr thePrs2) +{ + bool isEqual = false; + Handle(StdSelect_BRepOwner) anOwner1 = Handle(StdSelect_BRepOwner)::DownCast(thePrs1->owner()); + Handle(StdSelect_BRepOwner) anOwner2 = Handle(StdSelect_BRepOwner)::DownCast(thePrs2->owner()); + + if (!anOwner1.IsNull() && anOwner1->HasShape() && + !anOwner2.IsNull() && anOwner2->HasShape()) { + const TopoDS_Shape& aShape1 = anOwner1->Shape(); + const TopoDS_Shape& aShape2 = anOwner2->Shape(); + //TopAbs_ShapeEnum aShapeType = aShape.ShapeType(); + if (aShape1.ShapeType() == TopAbs_VERTEX && + aShape2.ShapeType() == TopAbs_VERTEX) { + const TopoDS_Vertex& aVertex1 = TopoDS::Vertex(aShape1); + const TopoDS_Vertex& aVertex2 = TopoDS::Vertex(aShape2); + if (!aVertex1.IsNull() && !aVertex2.IsNull()) { + gp_Pnt aPoint1 = BRep_Tool::Pnt(aVertex1); + gp_Pnt aPoint2 = BRep_Tool::Pnt(aVertex2); + + std::shared_ptr aPnt1 = std::shared_ptr + (new GeomAPI_Pnt(aPoint1.X(), aPoint1.Y(), aPoint1.Z())); + std::shared_ptr aPnt2 = std::shared_ptr + (new GeomAPI_Pnt(aPoint2.X(), aPoint2.Y(), aPoint2.Z())); + isEqual = aPnt1->isEqual(aPnt2); + } + } + } + + return isEqual; +}