X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_WidgetFeaturePointSelector.cpp;h=6cb8516c4431c010d5cd23739a2aa6a6bbdd96bc;hb=08a991619fbd4f803d52e698dd48f0f7f46d118e;hp=2ee93fbb4ffbde724f2a9ff624178ccf2b22f62f;hpb=7074394f8f08413d885f63be01df6bd5007b868c;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_WidgetFeaturePointSelector.cpp b/src/PartSet/PartSet_WidgetFeaturePointSelector.cpp index 2ee93fbb4..6cb8516c4 100644 --- a/src/PartSet/PartSet_WidgetFeaturePointSelector.cpp +++ b/src/PartSet/PartSet_WidgetFeaturePointSelector.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2019 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -12,12 +12,15 @@ // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or -// email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // +#include "PartSet_WidgetFeaturePointSelector.h" +#include "PartSet_Tools.h" +#include "PartSet_ExternalObjectsMgr.h" + #include #include @@ -31,6 +34,7 @@ #include #include +#include #include #include #include @@ -40,9 +44,6 @@ #include #include -#include "PartSet_WidgetFeaturePointSelector.h" -#include "PartSet_Tools.h" - #include #include @@ -65,16 +66,24 @@ PartSet_WidgetFeaturePointSelector::PartSet_WidgetFeaturePointSelector(QWidget* : ModuleBase_WidgetShapeSelector(theParent, theWorkshop, theData) { std::string anAttributes = theData->getProperty("selection_attributes"); - QStringList anAttributesList = QString(anAttributes.c_str()).split(' ', QString::SkipEmptyParts); + QStringList anAttributesList = + QString(anAttributes.c_str()).split(' ', QString::SkipEmptyParts); + + myHasPreview = anAttributesList.size() >= 4; mySelectedObjectAttribute = anAttributesList[0].toStdString(); mySelectedPointAttribute = anAttributesList[1].toStdString(); - myPreviewObjectAttribute = anAttributesList[2].toStdString(); - myPreviewPointAttribute = anAttributesList[3].toStdString(); + if (myHasPreview) { + myPreviewObjectAttribute = anAttributesList[2].toStdString(); + myPreviewPointAttribute = anAttributesList[3].toStdString(); + } + myExternalObjectMgr = new PartSet_ExternalObjectsMgr(theData->getProperty("use_external"), + theData->getProperty("can_create_external"), true); } PartSet_WidgetFeaturePointSelector::~PartSet_WidgetFeaturePointSelector() { + delete myExternalObjectMgr; } //******************************************************************** @@ -85,37 +94,6 @@ bool PartSet_WidgetFeaturePointSelector::isValidSelection( //return true; } -//******************************************************************** -bool PartSet_WidgetFeaturePointSelector::activateSelectionAndFilters(bool toActivate) -{ -#ifdef HIGHLIGHT_STAYS_PROBLEM - Handle(AIS_InteractiveContext) aContext = - XGUI_Tools::workshop(myWorkshop)->viewer()->AISContext(); - Quantity_Color aColor; - Handle(Graphic3d_HighlightStyle) aHStyle = aContext->HighlightStyle(); - Handle(Graphic3d_HighlightStyle) aSStyle = aContext->SelectionStyle(); - if (toActivate) { - std::vector aColors; - aColors = Config_PropManager::color("Visualization", "sketch_entity_color"); - aColor = Quantity_Color(aColors[0] / 255., aColors[1] / 255., aColors[2] / 255., - Quantity_TOC_RGB); - myHighlightColor = aHStyle->Color(); - mySelectionColor = aSStyle->Color(); - } - else { - aColor = myHighlightColor; - } - aHStyle->SetColor(aColor); - aContext->SetHighlightStyle(aHStyle); - - aSStyle->SetColor(aColor); - aContext->SetSelectionStyle(aSStyle); - -#endif - - return ModuleBase_WidgetShapeSelector::activateSelectionAndFilters(toActivate); -} - //******************************************************************** void PartSet_WidgetFeaturePointSelector::activateCustom() { @@ -140,7 +118,16 @@ void PartSet_WidgetFeaturePointSelector::mouseMoved(ModuleBase_IViewWindow* theW ModuleBase_ViewerPrsPtr aPrs = !aHighlighted.empty() ? aHighlighted.first() : ModuleBase_ViewerPrsPtr(); - fillFeature(aPrs, theWindow, theEvent); + myPreviewPoint = PartSet_Tools::getPnt2d(theEvent, theWindow, mySketch); + if (myHasPreview) { + if (aPrs.get() && aPrs->object().get()) + myPreviewObject = aPrs->object(); + else + myPreviewObject = ObjectPtr(); + fillFeature(); + updateObject(feature()); + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); + } } //******************************************************************** @@ -151,67 +138,113 @@ void PartSet_WidgetFeaturePointSelector::mouseReleased(ModuleBase_IViewWindow* t if (theEvent->button() != Qt::LeftButton) return; - std::shared_ptr aRefPreviewAttr = - std::dynamic_pointer_cast( - feature()->data()->attribute(myPreviewObjectAttribute)); - ObjectPtr aPreviewObject = aRefPreviewAttr->value(); + ModuleBase_ISelection* aSelection = myWorkshop->selection(); + QList aSelected = + aSelection->getSelected(ModuleBase_ISelection::Viewer); + + ModuleBase_ViewerPrsPtr aPrs = + !aSelected.empty() ? aSelected.first() : ModuleBase_ViewerPrsPtr(); + if (aPrs.get() && aPrs->object().get()) { + myPreviewObject = aSelection->getResult(aPrs); + GeomShapePtr aShape = aSelection->getShape(aPrs); + myExternalObjectMgr->getGeomSelection(aPrs, myPreviewObject, aShape, + myWorkshop, sketch(), true); + } + myPreviewPoint = PartSet_Tools::getPnt2d(theEvent, theWindow, mySketch); + + ObjectPtr aPreviewObject; + GeomPnt2dPtr aPreviewPoint; + if (myHasPreview) { + std::shared_ptr aRefPreviewAttr = + std::dynamic_pointer_cast( + feature()->data()->attribute(myPreviewObjectAttribute)); + aPreviewObject = aRefPreviewAttr->value(); + + std::shared_ptr aPointPreviewAttr = + std::dynamic_pointer_cast( + feature()->data()->attribute(myPreviewPointAttribute)); + aPreviewPoint = aPointPreviewAttr->pnt(); + } + else { + aPreviewObject = myPreviewObject; + aPreviewPoint = myPreviewPoint; + } + // do not move focus from the current widget if the object is not highlighted/selected if (!aPreviewObject.get()) return; - // set parameters of preview into parameters of selection in the feature - std::shared_ptr aRefSelectedAttr = - std::dynamic_pointer_cast( - feature()->data()->attribute(mySelectedObjectAttribute)); - aRefSelectedAttr->setValue(aRefPreviewAttr->value()); + // Do not use non-sketcher objects + if (!sketch()->isSub(aPreviewObject)) + return; + // set parameters of preview into parameters of selection in the feature std::shared_ptr aPointSelectedAttr = std::dynamic_pointer_cast( feature()->data()->attribute(mySelectedPointAttribute)); - std::shared_ptr aPointPreviewAttr = - std::dynamic_pointer_cast( - feature()->data()->attribute(myPreviewPointAttribute)); - aPointSelectedAttr->setValue(aPointPreviewAttr->x(), aPointPreviewAttr->y()); + aPointSelectedAttr->setValue(aPreviewPoint); + + AttributeReferencePtr aRefSelectedAttr = feature()->reference(mySelectedObjectAttribute); + if (aRefSelectedAttr) + aRefSelectedAttr->setValue(aPreviewObject); + else { + AttributeRefAttrPtr aRefAttrSelectedAttr = feature()->refattr(mySelectedObjectAttribute); + if (aRefAttrSelectedAttr) + aRefAttrSelectedAttr->setObject(aPreviewObject); + } updateObject(feature()); - emit focusOutWidget(this); // we need to deselect base feature for better visibility of selected feature XGUI_Tools::workshop(myWorkshop)->displayer()->clearSelected(false); + + // focusOutWidget should be the last functionality in the method because after this emit, + // the widget may be deleted and members of this class are deleted (e.g. myWorkshop) + emit focusOutWidget(this); } //******************************************************************** -bool PartSet_WidgetFeaturePointSelector::fillFeature( - const std::shared_ptr& theSelectedPrs, - ModuleBase_IViewWindow* theWindow, - QMouseEvent* theEvent) +bool PartSet_WidgetFeaturePointSelector::fillFeature() { - bool aFilled = false; - ObjectPtr anObject; - if (theSelectedPrs.get() && theSelectedPrs->object().get()) - anObject = theSelectedPrs->object(); - - std::shared_ptr aRef = - std::dynamic_pointer_cast( - feature()->data()->attribute(myPreviewObjectAttribute)); - aRef->setValue(anObject); - - std::shared_ptr anAttributePoint = - std::dynamic_pointer_cast( - feature()->data()->attribute(myPreviewPointAttribute)); - std::shared_ptr aPoint = PartSet_Tools::getPnt2d(theEvent, theWindow, mySketch); - anAttributePoint->setValue(aPoint); + if (myHasPreview) { + std::shared_ptr aRef = + std::dynamic_pointer_cast( + feature()->data()->attribute(myPreviewObjectAttribute)); + aRef->setValue(myPreviewObject); + if (myPreviewPoint.get()) { + std::shared_ptr anAttributePoint = + std::dynamic_pointer_cast( + feature()->data()->attribute(myPreviewPointAttribute)); + anAttributePoint->setValue(myPreviewPoint); + } + } + else { + // Do not use non-sketcher objects + if (!sketch()->isSub(myPreviewObject)) + return false; + + // set parameters of preview into parameters of selection in the feature + if (myPreviewPoint.get()) { + std::shared_ptr aPointSelectedAttr = + std::dynamic_pointer_cast( + feature()->data()->attribute(mySelectedPointAttribute)); + aPointSelectedAttr->setValue(myPreviewPoint); + } + AttributeReferencePtr aRefSelectedAttr = feature()->reference(mySelectedObjectAttribute); + if (aRefSelectedAttr) + aRefSelectedAttr->setValue(myPreviewObject); + else { + AttributeRefAttrPtr aRefAttrSelectedAttr = feature()->refattr(mySelectedObjectAttribute); + if (aRefAttrSelectedAttr) + aRefAttrSelectedAttr->setObject(myPreviewObject); + } + } // redisplay AIS presentation in viewer #ifndef HIGHLIGHT_STAYS_PROBLEM // an attempt to clear highlighted item in the viewer: but of OCCT XGUI_Tools::workshop(myWorkshop)->displayer()->clearSelected(true); #endif - updateObject(feature()); - Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); - - aFilled = true; - - return aFilled; + return true; } //******************************************************************** @@ -221,16 +254,22 @@ QList PartSet_WidgetFeaturePointSelector::getAttributeS } //******************************************************************** -bool PartSet_WidgetFeaturePointSelector::setSelection( - QList>& theValues, - const bool theToValidate) +bool PartSet_WidgetFeaturePointSelector::setSelectionCustom(const ModuleBase_ViewerPrsPtr& thePrs) { - // false is returned to do not emit focus out widget by selected sub-shape - return false; + if (!thePrs.get() || !thePrs->object().get()) + return false; + + ModuleBase_ISelection* aSelection = myWorkshop->selection(); + myPreviewObject = aSelection->getResult(thePrs); + GeomShapePtr aShape = aSelection->getShape(thePrs); + myExternalObjectMgr->getGeomSelection(thePrs, myPreviewObject, aShape, myWorkshop, + sketch(), true); + return fillFeature(); } +//******************************************************************** void PartSet_WidgetFeaturePointSelector::setPreSelection( - const std::shared_ptr& thePreSelected, + const ModuleBase_ViewerPrsPtr& thePreSelected, ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) { @@ -238,3 +277,23 @@ void PartSet_WidgetFeaturePointSelector::setPreSelection( // sub-segments in the viewer, secondly preselection of restart operation is processed by // special reentrant message sent by the feature } + +//******************************************************************** +void PartSet_WidgetFeaturePointSelector::getGeomSelection(const ModuleBase_ViewerPrsPtr& thePrs, + ObjectPtr& theObject, GeomShapePtr& theShape) +{ + ModuleBase_WidgetShapeSelector::getGeomSelection(thePrs, theObject, theShape); + + myExternalObjectMgr->getGeomSelection(thePrs, theObject, theShape, + myWorkshop, sketch(), myIsInValidate); + myPreviewObject = theObject; +} + +//******************************************************************** +void PartSet_WidgetFeaturePointSelector::restoreAttributeValue(const AttributePtr& theAttribute, + const bool theValid) +{ + ModuleBase_WidgetShapeSelector::restoreAttributeValue(theAttribute, theValid); + myExternalObjectMgr->removeExternal(sketch(), myFeature, myWorkshop, true); + myPreviewObject = ObjectPtr(); +}