From b0cc821d7f970bbbf47b30a2fddbebcbf76e5dd1 Mon Sep 17 00:00:00 2001 From: nds Date: Tue, 24 Mar 2015 17:10:28 +0300 Subject: [PATCH] Union of validator and filter functionalities. Widget sketch label is improved to use the planar face validator. --- src/GeomValidators/GeomValidators_Face.cpp | 4 +- src/Model/Model_AttributeSelection.cpp | 7 ++ src/ModuleBase/ModuleBase_WidgetValidated.cpp | 7 ++ src/PartSet/PartSet_WidgetSketchLabel.cpp | 105 +++++++++++++----- src/PartSet/PartSet_WidgetSketchLabel.h | 18 ++- src/SketchPlugin/plugin-Sketch.xml | 4 +- 6 files changed, 110 insertions(+), 35 deletions(-) diff --git a/src/GeomValidators/GeomValidators_Face.cpp b/src/GeomValidators/GeomValidators_Face.cpp index 6f2608618..821b45cb0 100644 --- a/src/GeomValidators/GeomValidators_Face.cpp +++ b/src/GeomValidators/GeomValidators_Face.cpp @@ -31,7 +31,7 @@ GeomAbs_SurfaceType GeomValidators_Face::faceType(const std::string& theType) } bool GeomValidators_Face::isValid(const AttributePtr& theAttribute, - const std::list& theArguments) const + const std::list& theArguments) const { bool aValid = false; @@ -59,5 +59,7 @@ bool GeomValidators_Face::isValid(const AttributePtr& theAttribute, } } } + else + aValid = true; // an empty face selected is valid. return aValid; } diff --git a/src/Model/Model_AttributeSelection.cpp b/src/Model/Model_AttributeSelection.cpp index 03ccb8984..4e1f21b91 100644 --- a/src/Model/Model_AttributeSelection.cpp +++ b/src/Model/Model_AttributeSelection.cpp @@ -86,6 +86,13 @@ void Model_AttributeSelection::setValue(const ResultPtr& theContext, TDF_Label aSelLab = selectionLabel(); aSelLab.ForgetAttribute(kSIMPLE_REF_ID); aSelLab.ForgetAttribute(kCONSTUCTION_SIMPLE_REF_ID); + if (!theContext.get()) { + // to keep the reference attribute label + TDF_Label aRefLab = myRef.myRef->Label(); + aSelLab.ForgetAllAttributes(true); + myRef.myRef = TDF_Reference::Set(aSelLab, aSelLab); + return; + } if (theContext->groupName() == ModelAPI_ResultBody::group()) { // do not select the whole shape for body:it is already must be in the data framework if (theContext->shape().get() && theContext->shape()->isEqual(theSubShape)) { diff --git a/src/ModuleBase/ModuleBase_WidgetValidated.cpp b/src/ModuleBase/ModuleBase_WidgetValidated.cpp index 97723530b..506eeca2a 100644 --- a/src/ModuleBase/ModuleBase_WidgetValidated.cpp +++ b/src/ModuleBase/ModuleBase_WidgetValidated.cpp @@ -24,6 +24,7 @@ ModuleBase_WidgetValidated::~ModuleBase_WidgetValidated() { } +//******************************************************************** bool ModuleBase_WidgetValidated::setSelection(ModuleBase_ViewerPrs theValue) { bool isDone = false; @@ -37,13 +38,19 @@ bool ModuleBase_WidgetValidated::setSelection(ModuleBase_ViewerPrs theValue) return isDone; } +//******************************************************************** bool ModuleBase_WidgetValidated::isValid(const Handle_SelectMgr_EntityOwner& theOwner) { + // stores the current values of the widget attribute backupAttributeValue(true); + // saves the owner value to the widget attribute setSelection(theOwner); + + // checks the attribute validity bool aValid = isValidAttribute(); + // restores the current values of the widget attribute backupAttributeValue(false); return aValid; diff --git a/src/PartSet/PartSet_WidgetSketchLabel.cpp b/src/PartSet/PartSet_WidgetSketchLabel.cpp index 96435f627..636a0ff5b 100644 --- a/src/PartSet/PartSet_WidgetSketchLabel.cpp +++ b/src/PartSet/PartSet_WidgetSketchLabel.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -46,7 +47,7 @@ PartSet_WidgetSketchLabel::PartSet_WidgetSketchLabel(QWidget* theParent, const Config_WidgetAPI* theData, const std::string& theParentId) - : ModuleBase_ModelWidget(theParent, theData, theParentId), + : ModuleBase_WidgetValidated(theParent, theData, theParentId), myPreviewDisplayed(false), myWorkshop(NULL) { @@ -81,41 +82,43 @@ QList PartSet_WidgetSketchLabel::getControls() const void PartSet_WidgetSketchLabel::onPlaneSelected() { + XGUI_Selection* aSelection = myWorkshop->selector()->selection(); QList aSelected = aSelection->getSelected(); if (!aSelected.empty()) { ModuleBase_ViewerPrs aPrs = aSelected.first(); - TopoDS_Shape aShape = aPrs.shape(); - if (!aShape.IsNull()) { - std::shared_ptr aDir = setSketchPlane(aShape); - if (aDir) { - erasePreviewPlanes(); + Handle(SelectMgr_EntityOwner) anOwner = aSelected.first().owner(); + if (isValid(anOwner)) { + setSelection(anOwner); - if (aPrs.object() && (feature() != aPrs.object())) { - DataPtr aData = feature()->data(); - AttributeSelectionPtr aSelAttr = - std::dynamic_pointer_cast - (aData->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID())); - if (aSelAttr) { - ResultPtr aRes = std::dynamic_pointer_cast(aPrs.object()); - if (aRes) { - GeomShapePtr aShapePtr(new GeomAPI_Shape()); - aShapePtr->setImpl(new TopoDS_Shape(aShape)); - aSelAttr->setValue(aRes, aShapePtr); - } + TopoDS_Shape aShape = aPrs.shape(); + if (!aShape.IsNull()) { + erasePreviewPlanes(); + DataPtr aData = feature()->data(); + AttributeSelectionPtr aSelAttr = std::dynamic_pointer_cast + (aData->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID())); + if (aSelAttr) { + GeomShapePtr aShapePtr = aSelAttr->value(); + if (aShapePtr.get() == NULL || aShapePtr->isNull()) { + std::shared_ptr aGShape(new GeomAPI_Shape); + aGShape->setImpl(new TopoDS_Shape(aShape)); + // get plane parameters + std::shared_ptr aPlane = GeomAlgoAPI_FaceBuilder::plane(aGShape); + std::shared_ptr aDir = aPlane->direction(); + + myWorkshop->viewer()->setViewProjection(aDir->x(), aDir->y(), aDir->z()); } - } else - myWorkshop->viewer()->setViewProjection(aDir->x(), aDir->y(), aDir->z()); + } // Clear text in the label myLabel->setText(""); myLabel->setToolTip(""); disconnect(myWorkshop->selector(), SIGNAL(selectionChanged()), this, SLOT(onPlaneSelected())); + activateFilters(myWorkshop->module()->workshop(), false); // Clear selection mode and define sketching mode - XGUI_Displayer* aDisp = myWorkshop->displayer(); - aDisp->removeSelectionFilter(myFaceFilter); + //XGUI_Displayer* aDisp = myWorkshop->displayer(); //aDisp->closeLocalContexts(); emit planeSelected(plane()); setSketchingMode(); @@ -147,12 +150,61 @@ void PartSet_WidgetSketchLabel::enableFocusProcessing() myLabel->installEventFilter(this); } +void PartSet_WidgetSketchLabel::backupAttributeValue(const bool isBackup) +{ + // it is not necessary to save the previous plane value because the plane is chosen once + if (!isBackup) { + DataPtr aData = feature()->data(); + AttributeSelectionPtr aSelAttr = std::dynamic_pointer_cast + (aData->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID())); + if (aSelAttr) { + ResultPtr anEmptyResult; + GeomShapePtr anEmptyShape; + aSelAttr->setValue(anEmptyResult, anEmptyShape); + } + } +} + +bool PartSet_WidgetSketchLabel::setSelection(const Handle_SelectMgr_EntityOwner& theOwner) +{ + bool isOwnerSet = false; + + ModuleBase_ViewerPrs aPrs; + myWorkshop->selector()->selection()->fillPresentation(aPrs, theOwner); + + const TopoDS_Shape& aShape = aPrs.shape(); + std::shared_ptr aDir; + + if (aPrs.object() && (feature() != aPrs.object())) { + DataPtr aData = feature()->data(); + AttributeSelectionPtr aSelAttr = + std::dynamic_pointer_cast + (aData->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID())); + if (aSelAttr) { + ResultPtr aRes = std::dynamic_pointer_cast(aPrs.object()); + if (aRes) { + GeomShapePtr aShapePtr(new GeomAPI_Shape()); + aShapePtr->setImpl(new TopoDS_Shape(aShape)); + aSelAttr->setValue(aRes, aShapePtr); + isOwnerSet = true; + } + } + } + else if (!aShape.IsNull()) { + aDir = setSketchPlane(aShape); + isOwnerSet = aDir; + } + return isOwnerSet; +} + void PartSet_WidgetSketchLabel::activateCustom() { std::shared_ptr aPlane = plane(); if (aPlane) { //setSketchingMode(); // In order to avoid Opening/Closing of context too often + // it can be useful for a delay on the property panel filling + // it is possible that it is not necessary anymore, but it requires a check mySelectionTimer->start(20); } else { // We have to select a plane before any operation @@ -161,9 +213,6 @@ void PartSet_WidgetSketchLabel::activateCustom() XGUI_Displayer* aDisp = myWorkshop->displayer(); //aDisp->openLocalContext(); //aDisp->activateObjects(QIntList()); - if (myFaceFilter.IsNull()) - myFaceFilter = new StdSelect_FaceFilter(StdSelect_Plane); - aDisp->addSelectionFilter(myFaceFilter); QIntList aModes; aModes << TopAbs_FACE; aDisp->activateObjects(aModes); @@ -172,6 +221,8 @@ void PartSet_WidgetSketchLabel::activateCustom() myLabel->setToolTip(myTooltip); connect(myWorkshop->selector(), SIGNAL(selectionChanged()), this, SLOT(onPlaneSelected())); + activateFilters(myWorkshop->module()->workshop(), true); + aDisp->updateViewer(); } } @@ -180,9 +231,7 @@ void PartSet_WidgetSketchLabel::deactivate() { // Do not set selection mode if the widget was activated for a small moment mySelectionTimer->stop(); - XGUI_Displayer* aDisp = myWorkshop->displayer(); - aDisp->removeSelectionFilter(myFaceFilter); - //aDisp->removeSelectionFilter(mySketchFilter); + //XGUI_Displayer* aDisp = myWorkshop->displayer(); //aDisp->closeLocalContexts(); erasePreviewPlanes(); } diff --git a/src/PartSet/PartSet_WidgetSketchLabel.h b/src/PartSet/PartSet_WidgetSketchLabel.h index 9da513f5d..3e277c68d 100644 --- a/src/PartSet/PartSet_WidgetSketchLabel.h +++ b/src/PartSet/PartSet_WidgetSketchLabel.h @@ -9,14 +9,13 @@ #include "PartSet.h" -#include +#include #include #include #include #include -#include #include class QLabel; @@ -35,7 +34,7 @@ class XGUI_Workshop; * A model widget implementation for a label which provides specific behaviour * for sketcher starting and launching operations */ -class PARTSET_EXPORT PartSet_WidgetSketchLabel : public ModuleBase_ModelWidget +class PARTSET_EXPORT PartSet_WidgetSketchLabel : public ModuleBase_WidgetValidated { Q_OBJECT public: @@ -80,6 +79,17 @@ signals: void planeSelected(const std::shared_ptr& thePln); protected: + /// Creates a backup of the current values of the attribute + /// It should be realized in the specific widget because of different + /// parameters of the current attribute + /// \param isBackup a boolean flag, if true, store values from the attribute + /// to backup, otherwise set the backed up values to the attribute + virtual void backupAttributeValue(const bool isBackup); + + /// Fills the attribute with the value of the selected owner + /// \param theOwner a selected owner + virtual bool setSelection(const Handle_SelectMgr_EntityOwner& theOwner); + /// Saves the internal parameters to the given feature /// \return True in success virtual bool storeValueCustom() const @@ -128,8 +138,6 @@ protected: AISObjectPtr myXYPlane; bool myPreviewDisplayed; - Handle(StdSelect_FaceFilter) myFaceFilter; - QTimer* mySelectionTimer; }; diff --git a/src/SketchPlugin/plugin-Sketch.xml b/src/SketchPlugin/plugin-Sketch.xml index 1c7974d6d..4abd354b0 100644 --- a/src/SketchPlugin/plugin-Sketch.xml +++ b/src/SketchPlugin/plugin-Sketch.xml @@ -10,7 +10,9 @@ title="Sketch" tooltip="Create a new sketch" icon=":icons/sketch.png"> - + + + -- 2.39.2