X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_WidgetShapeSelector.cpp;h=472b122e829813972c40327f8bc6bb3ccef2099b;hb=1afb1f4e9ab99eb85c18599e9ba6070b62e49e21;hp=fe34cc85911daf828a8dd1d363ce3bac859eb043;hpb=f1cd93fd02a54259f72e3191d037323a496b2bef;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_WidgetShapeSelector.cpp b/src/PartSet/PartSet_WidgetShapeSelector.cpp old mode 100644 new mode 100755 index fe34cc859..472b122e8 --- a/src/PartSet/PartSet_WidgetShapeSelector.cpp +++ b/src/PartSet/PartSet_WidgetShapeSelector.cpp @@ -5,57 +5,113 @@ // Author: Vitaly Smetannikov #include "PartSet_WidgetShapeSelector.h" +#include "PartSet_Module.h" +#include "PartSet_SketcherMgr.h" #include -#include +#include +#include + +#include +#include + +#include + +#include #include +#include -bool PartSet_WidgetShapeSelector::storeValue() const +#include +#include +#include +#include +#include + +PartSet_WidgetShapeSelector::PartSet_WidgetShapeSelector(QWidget* theParent, + ModuleBase_IWorkshop* theWorkshop, + const Config_WidgetAPI* theData) +: ModuleBase_WidgetShapeSelector(theParent, theWorkshop, theData) { - if (!mySelectedObject) - return false; - - FeaturePtr aSelectedFeature = ModelAPI_Feature::feature(mySelectedObject); - if (aSelectedFeature == myFeature) // In order to avoid selection of the same object - return false; - - DataPtr aData = myFeature->data(); - if (myUseSubShapes && myShape) { - AttributePtr aAttr = aData->attribute(attributeID()); - AttributeRefAttrPtr aRefAttr = - std::dynamic_pointer_cast(aAttr); - if (aRefAttr) { - TopoDS_Shape aShape = myShape->impl(); - AttributePtr aPntAttr = PartSet_Tools::findAttributeBy2dPoint(mySelectedObject, aShape, mySketch); - if (mySelectedObject) - aRefAttr->setObject(mySelectedObject); - if (aPntAttr) - aRefAttr->setAttr(aPntAttr); - - updateObject(myFeature); - return true; - } + myUseSketchPlane = theData->getBooleanAttribute("use_sketch_plane", true); + myExternalObjectMgr = new PartSet_ExternalObjectsMgr(theData->getProperty("use_external"), + theData->getProperty("can_create_external"), true); +} + +PartSet_WidgetShapeSelector::~PartSet_WidgetShapeSelector() +{ + delete myExternalObjectMgr; +} + +//******************************************************************** +bool PartSet_WidgetShapeSelector::activateSelectionAndFilters(bool toActivate) +{ + bool aHasSelectionFilter = ModuleBase_WidgetShapeSelector::activateSelectionAndFilters + (toActivate); + if (!myUseSketchPlane) { + XGUI_Workshop* aWorkshop = XGUI_Tools::workshop(myWorkshop); + PartSet_Module* aModule = dynamic_cast(aWorkshop->module()); + bool isUsePlaneFilterOnly = !toActivate; + aModule->sketchMgr()->activatePlaneFilter(isUsePlaneFilterOnly); + } + return aHasSelectionFilter; +} + +//******************************************************************** +bool PartSet_WidgetShapeSelector::isValidSelectionCustom(const ModuleBase_ViewerPrsPtr& thePrs) +{ + bool aValid = ModuleBase_WidgetShapeSelector::isValidSelectionCustom(thePrs); + if (aValid) { + ObjectPtr anObject = myWorkshop->selection()->getResult(thePrs); + aValid = myExternalObjectMgr->isValidObject(anObject); } - return ModuleBase_WidgetShapeSelector::storeValue(); + return aValid; } -//********************************************* -bool PartSet_WidgetConstraintShapeSelector::storeValue() const +void PartSet_WidgetShapeSelector::getGeomSelection(const ModuleBase_ViewerPrsPtr& thePrs, + ObjectPtr& theObject, + GeomShapePtr& theShape) { - FeaturePtr aFeature = ModelAPI_Feature::feature(mySelectedObject); - if (aFeature) { - std::shared_ptr aSPFeature = - std::dynamic_pointer_cast(aFeature); - if ((!aSPFeature) && (!myShape->isNull())) { - ObjectPtr aObj = PartSet_Tools::createFixedObjectByEdge(myShape->impl(), - mySelectedObject, mySketch); - if (aObj) { - PartSet_WidgetConstraintShapeSelector* that = (PartSet_WidgetConstraintShapeSelector*) this; - that->mySelectedObject = aObj; + ModuleBase_WidgetShapeSelector::getGeomSelection(thePrs, theObject, theShape); + + FeaturePtr aSelectedFeature = ModelAPI_Feature::feature(theObject); + std::shared_ptr aSPFeature = + std::dynamic_pointer_cast(aSelectedFeature); + // there is no a sketch feature is selected, but the shape exists, + // try to create an exernal object + // TODO: unite with the same functionality in PartSet_WidgetShapeSelector + if (aSPFeature.get() == NULL) { + ObjectPtr anExternalObject = ObjectPtr(); + GeomShapePtr anExternalShape = GeomShapePtr(); + if (myExternalObjectMgr->useExternal()) { + if (myExternalObjectMgr->canCreateExternal()) { + GeomShapePtr aShape = theShape; + if (!aShape.get()) { + ResultPtr aResult = myWorkshop->selection()->getResult(thePrs); + if (aResult.get()) + aShape = aResult->shape(); + } + if (aShape.get() != NULL && !aShape->isNull()) + anExternalObject = + myExternalObjectMgr->externalObject(theObject, aShape, sketch(), myIsInValidate); + } + else { /// use objects of found selection + anExternalObject = theObject; + anExternalShape = theShape; } } + /// the object is null if the selected feature is "external"(not sketch entity feature of the + /// current sketch) and it is not created by object manager + theObject = anExternalObject; + theShape = anExternalShape; } - return ModuleBase_WidgetShapeSelector::storeValue(); +} + +//******************************************************************** +void PartSet_WidgetShapeSelector::restoreAttributeValue(const AttributePtr& theAttribute, + const bool theValid) +{ + ModuleBase_WidgetShapeSelector::restoreAttributeValue(theAttribute, theValid); + myExternalObjectMgr->removeExternal(sketch(), myFeature, myWorkshop, true); }