X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FPartSet%2FPartSet_WidgetFeaturePointSelector.cpp;h=983addb24a54b8b5faf1aa7b7d43aba02742b58c;hb=66d4846e1ce3c0e25ae0fba77ec0d628912b95a0;hp=f44ca020954120fcca6e350e97f48e3fe0d9514a;hpb=6e421e939851e0de46554ae45a3ca0e1f67cd91d;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_WidgetFeaturePointSelector.cpp b/src/PartSet/PartSet_WidgetFeaturePointSelector.cpp index f44ca0209..983addb24 100644 --- a/src/PartSet/PartSet_WidgetFeaturePointSelector.cpp +++ b/src/PartSet/PartSet_WidgetFeaturePointSelector.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2019 CEA/DEN, EDF R&D +// Copyright (C) 2014-2021 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 @@ -17,6 +17,10 @@ // 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 @@ -30,6 +34,7 @@ #include #include +#include #include #include #include @@ -39,9 +44,6 @@ #include #include -#include "PartSet_WidgetFeaturePointSelector.h" -#include "PartSet_Tools.h" - #include #include @@ -64,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; } //******************************************************************** @@ -84,37 +94,6 @@ bool PartSet_WidgetFeaturePointSelector::isValidSelection( //return true; } -//******************************************************************** -void PartSet_WidgetFeaturePointSelector::updateSelectionModesAndFilters(bool toActivate) -{ -#ifdef HIGHLIGHT_STAYS_PROBLEM - Handle(AIS_InteractiveContext) aContext = - XGUI_Tools::workshop(myWorkshop)->viewer()->AISContext(); - Quantity_Color aColor; - Handle(Prs3d_Drawer) aHStyle = aContext->HighlightStyle(); - Handle(Prs3d_Drawer) 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 - - ModuleBase_WidgetShapeSelector::updateSelectionModesAndFilters(toActivate); -} - //******************************************************************** void PartSet_WidgetFeaturePointSelector::activateCustom() { @@ -139,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)); + } } //******************************************************************** @@ -150,27 +138,60 @@ 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()); @@ -183,37 +204,47 @@ void PartSet_WidgetFeaturePointSelector::mouseReleased(ModuleBase_IViewWindow* t } //******************************************************************** -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; } //******************************************************************** @@ -223,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) { @@ -240,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(); +}