X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_WidgetSketchLabel.cpp;h=c2ca8a4d2d863cefb118caf7f7dd05e92a5cb639;hb=4b1f76b455140cae5d18319b62627af3ba28f226;hp=af8e9d56af5061f563fe2ca5a854b61e09b39307;hpb=60855dd590f9054e50dd1bd36aa0b984ee97b02a;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_WidgetSketchLabel.cpp b/src/PartSet/PartSet_WidgetSketchLabel.cpp index af8e9d56a..c2ca8a4d2 100644 --- a/src/PartSet/PartSet_WidgetSketchLabel.cpp +++ b/src/PartSet/PartSet_WidgetSketchLabel.cpp @@ -21,6 +21,9 @@ #include #include +#include +#include + #include #include #include @@ -40,7 +43,7 @@ #include #include -#include +//#include #include #include #include @@ -61,9 +64,9 @@ PartSet_WidgetSketchLabel::PartSet_WidgetSketchLabel(QWidget* theParent, myLabel->setToolTip(""); myLabel->setIndent(5); - mySelectionTimer = new QTimer(this); - connect(mySelectionTimer, SIGNAL(timeout()), SLOT(setSketchingMode())); - mySelectionTimer->setSingleShot(true); + //mySelectionTimer = new QTimer(this); + //connect(mySelectionTimer, SIGNAL(timeout()), SLOT(setSketchingMode())); + //mySelectionTimer->setSingleShot(true); QVBoxLayout* aLayout = new QVBoxLayout(this); ModuleBase_Tools::zeroMargins(aLayout); @@ -82,6 +85,17 @@ PartSet_WidgetSketchLabel::~PartSet_WidgetSketchLabel() erasePreviewPlanes(); } +bool PartSet_WidgetSketchLabel::setSelection(const QList& theValues, int& thePosition) +{ + // do not use the given selection if the plane of the sketch has been already set. + // If this check is absent, a selected plane in the viewer can be set in the sketch + // even if the sketch is built on another plane. + if (plane().get()) + return true; + + return ModuleBase_WidgetValidated::setSelection(theValues, thePosition); +} + QList PartSet_WidgetSketchLabel::getControls() const { QList aResult; @@ -89,56 +103,61 @@ QList PartSet_WidgetSketchLabel::getControls() const return aResult; } -void PartSet_WidgetSketchLabel::onPlaneSelected() +void PartSet_WidgetSketchLabel::onSelectionChanged() { + QList aSelectedPrs = getSelectedEntitiesOrObjects( + myWorkshop->selector()->selection()); + if (aSelectedPrs.empty()) + return; + ModuleBase_ViewerPrs aPrs = aSelectedPrs.first(); + if (aPrs.isEmpty() || !isValidSelection(aPrs)) + return; - XGUI_Selection* aSelection = myWorkshop->selector()->selection(); - QList aSelected = aSelection->getSelected(); - if (!aSelected.empty()) { - ModuleBase_ViewerPrs aPrs = aSelected.first(); - Handle(SelectMgr_EntityOwner) anOwner = aSelected.first().owner(); - if (isValid(anOwner)) { - setSelection(anOwner); - - 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()); - } - } - - // 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->closeLocalContexts(); - emit planeSelected(plane()); - setSketchingMode(); - - // Update sketcher actions - XGUI_ActionsMgr* anActMgr = myWorkshop->actionsMgr(); - anActMgr->update(); - myWorkshop->viewer()->update(); - } + // 2. set the selection to sketch + setSelectionCustom(aPrs); + // 3. hide main planes if they have been displayed + erasePreviewPlanes(); + // 4. if the planes were displayed, change the view projection + TopoDS_Shape aShape = aPrs.shape(); + std::shared_ptr aGShape; + // selection happens in OCC viewer + if (!aShape.IsNull()) { + aGShape = std::shared_ptr(new GeomAPI_Shape); + aGShape->setImpl(new TopoDS_Shape(aShape)); + } + else { // selection happens in OCC viewer(on body) of in the OB browser + DataPtr aData = feature()->data(); + AttributeSelectionPtr aSelAttr = std::dynamic_pointer_cast + (aData->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID())); + if (aSelAttr) { + aGShape = aSelAttr->value(); } } + if (aGShape.get() != NULL) { + // 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()); + } + // 5. Clear text in the label + myLabel->setText(""); + myLabel->setToolTip(""); + disconnect(myWorkshop->selector(), SIGNAL(selectionChanged()), + this, SLOT(onSelectionChanged())); + // 6. deactivate face selection filter + activateFilters(myWorkshop->module()->workshop(), false); + + // 7. Clear selection mode and define sketching mode + //XGUI_Displayer* aDisp = myWorkshop->displayer(); + //aDisp->closeLocalContexts(); + emit planeSelected(plane()); + //setSketchingMode(); + + // 8. Update sketcher actions + XGUI_ActionsMgr* anActMgr = myWorkshop->actionsMgr(); + anActMgr->update(); + myWorkshop->viewer()->update(); } std::shared_ptr PartSet_WidgetSketchLabel::plane() const @@ -176,28 +195,32 @@ void PartSet_WidgetSketchLabel::restoreAttributeValue(const bool theValid) } } -bool PartSet_WidgetSketchLabel::setSelection(const Handle_SelectMgr_EntityOwner& theOwner) +bool PartSet_WidgetSketchLabel::setSelectionCustom(const ModuleBase_ViewerPrs& thePrs) { bool isOwnerSet = false; - ModuleBase_ViewerPrs aPrs; - myWorkshop->selector()->selection()->fillPresentation(aPrs, theOwner); - - const TopoDS_Shape& aShape = aPrs.shape(); + const TopoDS_Shape& aShape = thePrs.shape(); std::shared_ptr aDir; - if (aPrs.object() && (feature() != aPrs.object())) { + if (thePrs.object() && (feature() != thePrs.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()); + ResultPtr aRes = std::dynamic_pointer_cast(thePrs.object()); if (aRes) { GeomShapePtr aShapePtr(new GeomAPI_Shape()); - aShapePtr->setImpl(new TopoDS_Shape(aShape)); - aSelAttr->setValue(aRes, aShapePtr); - isOwnerSet = true; + if (aShape.IsNull()) { // selection happens in the OCC viewer + aShapePtr = ModelAPI_Tools::shape(aRes); + } + else { // selection happens in OB browser + aShapePtr->setImpl(new TopoDS_Shape(aShape)); + } + if (aShapePtr.get() != NULL) { + aSelAttr->setValue(aRes, aShapePtr); + isOwnerSet = true; + } } } } @@ -211,37 +234,42 @@ bool PartSet_WidgetSketchLabel::setSelection(const Handle_SelectMgr_EntityOwner& 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 { + if (aPlane.get()) + return; + + bool aBodyIsVisualized = false; + XGUI_Displayer* aDisp = myWorkshop->displayer(); + QObjectPtrList aDisplayed = aDisp->displayedObjects(); + foreach (ObjectPtr anObj, aDisplayed) { + ResultPtr aResult = std::dynamic_pointer_cast(anObj); + if (aResult.get() != NULL) { + aBodyIsVisualized = aResult->groupName() == ModelAPI_ResultBody::group(); + if (aBodyIsVisualized) + break; + } + } + + if (!aBodyIsVisualized) { // We have to select a plane before any operation showPreviewPlanes(); + } + QIntList aModes; + aModes << TopAbs_FACE; + aDisp->activateObjects(aModes); - XGUI_Displayer* aDisp = myWorkshop->displayer(); - //aDisp->openLocalContext(); - //aDisp->activateObjects(QIntList()); - QIntList aModes; - aModes << TopAbs_FACE; - aDisp->activateObjects(aModes); - - myLabel->setText(myText); - myLabel->setToolTip(myTooltip); + myLabel->setText(myText); + myLabel->setToolTip(myTooltip); - connect(myWorkshop->selector(), SIGNAL(selectionChanged()), this, SLOT(onPlaneSelected())); - activateFilters(myWorkshop->module()->workshop(), true); + connect(myWorkshop->selector(), SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged())); + activateFilters(myWorkshop->module()->workshop(), true); - aDisp->updateViewer(); - } + aDisp->updateViewer(); } void PartSet_WidgetSketchLabel::deactivate() { // Do not set selection mode if the widget was activated for a small moment - mySelectionTimer->stop(); + //mySelectionTimer->stop(); //XGUI_Displayer* aDisp = myWorkshop->displayer(); //aDisp->closeLocalContexts(); erasePreviewPlanes(); @@ -353,7 +381,7 @@ std::shared_ptr PartSet_WidgetSketchLabel::setSketchPlane(const Top } -void PartSet_WidgetSketchLabel::setSketchingMode() +/*void PartSet_WidgetSketchLabel::setSketchingMode() { XGUI_Displayer* aDisp = myWorkshop->displayer(); // Clear standard selection modes if they are defined @@ -361,6 +389,7 @@ void PartSet_WidgetSketchLabel::setSketchingMode() //aDisp->openLocalContext(); // Get default selection modes + QIntList aModes; aModes.append(SketcherPrs_Tools::Sel_Dimension_Text); aModes.append(SketcherPrs_Tools::Sel_Dimension_Line); @@ -369,7 +398,7 @@ void PartSet_WidgetSketchLabel::setSketchingMode() aModes.append(AIS_Shape::SelectionMode((TopAbs_ShapeEnum) TopAbs_EDGE)); aDisp->activateObjects(aModes); -} +}*/ void PartSet_WidgetSketchLabel::showConstraints(bool theOn) {