X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_WidgetShapeSelector.cpp;h=a4dbf44f6f70884839b7e4e019812914989f153b;hb=1834431e0e067cbb4616f42679562d56af528f5e;hp=bdd7bba7a1323f37e7fd169f0818493abf2a0019;hpb=fccb11b890bf75fde316cd0dbc911fa001368062;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_WidgetShapeSelector.cpp b/src/PartSet/PartSet_WidgetShapeSelector.cpp index bdd7bba7a..a4dbf44f6 100644 --- a/src/PartSet/PartSet_WidgetShapeSelector.cpp +++ b/src/PartSet/PartSet_WidgetShapeSelector.cpp @@ -21,6 +21,13 @@ #include +#include +#include +#include +#include +#include +#include + PartSet_WidgetShapeSelector::PartSet_WidgetShapeSelector(QWidget* theParent, ModuleBase_IWorkshop* theWorkshop, const Config_WidgetAPI* theData, @@ -63,6 +70,67 @@ bool PartSet_WidgetShapeSelector::setObject(ObjectPtr theSelectedObject, GeomSha return ModuleBase_WidgetShapeSelector::setObject(aSelectedObject, theShape); } +//******************************************************************** +GeomShapePtr PartSet_WidgetShapeSelector::getShape() const +{ + // an empty shape by default + GeomShapePtr aShape; + + // 1. find an attribute value in attribute reference attribute value + DataPtr aData = myFeature->data(); + AttributePtr aAttr = aData->attribute(attributeID()); + AttributeRefAttrPtr aRefAttr = + std::dynamic_pointer_cast(aAttr); + if (aRefAttr) { + if (!aRefAttr->isObject()) { + AttributePtr anAttribute = aRefAttr->attr(); + if (anAttribute.get()) { + XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); + XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer(); + + // 2. find visualized vertices of the attribute and if the attribute of the vertex is + // the same, return it + FeaturePtr anAttributeFeature = ModelAPI_Feature::feature(anAttribute->owner()); + // 2.1 get visualized results of the feature + const std::list& aResList = anAttributeFeature->results(); + std::list::const_iterator anIt = aResList.begin(), aLast = aResList.end(); + for (; anIt != aLast; anIt++) { + AISObjectPtr aAISObj = aDisplayer->getAISObject(*anIt); + if (aAISObj.get() != NULL) { + Handle(AIS_InteractiveObject) anAISIO = aAISObj->impl(); + // 2.2 find selected owners of a visualizedd object + SelectMgr_IndexedMapOfOwner aSelectedOwners; + aConnector->workshop()->selector()->selection()->entityOwners(anAISIO, aSelectedOwners); + for (Standard_Integer i = 1, n = aSelectedOwners.Extent(); i <= n; i++) { + Handle(SelectMgr_EntityOwner) anOwner = aSelectedOwners(i); + if (!anOwner.IsNull()) { + Handle(StdSelect_BRepOwner) aBRepOwner = Handle(StdSelect_BRepOwner)::DownCast(anOwner); + if (!aBRepOwner.IsNull() && aBRepOwner->HasShape()) { + const TopoDS_Shape& aBRepShape = aBRepOwner->Shape(); + if (aBRepShape.ShapeType() == TopAbs_VERTEX) { + // 2.3 if the owner is vertex and an attribute of the vertex is equal to the initial + // attribute, returns the shape + AttributePtr aPntAttr = PartSet_Tools::findAttributeBy2dPoint(anAttributeFeature, + aBRepShape, sketch()); + if (aPntAttr.get() != NULL && aPntAttr == anAttribute) { + aShape = std::shared_ptr(new GeomAPI_Shape); + aShape->setImpl(new TopoDS_Shape(aBRepShape)); + break; + } + } + } + } + } + } + } + } + } + } + if (!aShape.get()) + aShape = ModuleBase_WidgetShapeSelector::getShape(); + return aShape; +} + //******************************************************************** void PartSet_WidgetShapeSelector::restoreAttributeValue(const bool theValid) { @@ -102,7 +170,7 @@ void PartSet_WidgetShapeSelector::setPointAttribute(ObjectPtr theSelectedObject, // test case is - preselection for distance operation, which contains two points selected on lines if (aPntAttr) aRefAttr->setAttr(aPntAttr); - else if (theSelectedObject) + else aRefAttr->setObject(theSelectedObject); } }