X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_CustomPrs.cpp;h=21465eb1cb133887e2a96caf458beb7fe9b87fd6;hb=f421ab3932a5e09ae8082215c3eaaa8cc4944e02;hp=373ee633236663184bfd3b7f31767520d51939a6;hpb=54b08d00ae547e27c084d6df5d58d7588ec81090;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_CustomPrs.cpp b/src/PartSet/PartSet_CustomPrs.cpp old mode 100755 new mode 100644 index 373ee6332..21465eb1c --- a/src/PartSet/PartSet_CustomPrs.cpp +++ b/src/PartSet/PartSet_CustomPrs.cpp @@ -1,12 +1,26 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: PartSet_CustomPrs.cpp -// Created: 30 Jun 2015 -// Author: Natalia ERMOLAEVA +// 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 +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// 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 +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include #include #include "PartSet_OperationPrs.h" +#include "PartSet_OverconstraintListener.h" #include #include @@ -17,6 +31,8 @@ #include #include +#include +#include #include #include @@ -25,8 +41,12 @@ //#define DO_NOT_VISUALIZE_CUSTOM_PRESENTATION PartSet_CustomPrs::PartSet_CustomPrs(ModuleBase_IWorkshop* theWorkshop) - : myWorkshop(theWorkshop), myFeature(FeaturePtr()) + : myWorkshop(theWorkshop), myFeature(FeaturePtr()), myPresentationIsEmpty(false), + myDisabledMode(-1) { + Events_Loop* aLoop = Events_Loop::loop(); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_EMPTY_OPERATION_PRESENTATION)); + initPresentation(ModuleBase_IModule::CustomizeArguments); initPresentation(ModuleBase_IModule::CustomizeResults); initPresentation(ModuleBase_IModule::CustomizeHighlightedObjects); @@ -54,9 +74,7 @@ bool PartSet_CustomPrs::activate(const FeaturePtr& theFeature, bool isModified = false; if (theFeature.get()) { - displayPresentation(ModuleBase_IModule::CustomizeArguments, theUpdateViewer); - displayPresentation(ModuleBase_IModule::CustomizeResults, theUpdateViewer); - displayPresentation(ModuleBase_IModule::CustomizeHighlightedObjects, theUpdateViewer); + displayPresentation(theFlag, theUpdateViewer); isModified = true; } return isModified; @@ -66,14 +84,8 @@ bool PartSet_CustomPrs::deactivate(const ModuleBase_IModule::ModuleBase_Customiz const bool theUpdateViewer) { myIsActive[theFlag] = false; - bool isModified = false; - - erasePresentation(ModuleBase_IModule::CustomizeArguments, theUpdateViewer); - erasePresentation(ModuleBase_IModule::CustomizeResults, theUpdateViewer); - erasePresentation(ModuleBase_IModule::CustomizeHighlightedObjects, theUpdateViewer); - isModified = true; - - return isModified; + erasePresentation(theFlag, theUpdateViewer); + return true; } bool PartSet_CustomPrs::displayPresentation( @@ -82,84 +94,121 @@ bool PartSet_CustomPrs::displayPresentation( { bool isModified = false; + if (myDisabledMode == theFlag) + return isModified; + // update the AIS objects content - Handle(PartSet_OperationPrs) anOperationPrs = getPresentation(theFlag); + AISObjectPtr aPresentation = getPresentation(theFlag, true); + Handle(AIS_InteractiveObject) anAISIO = aPresentation->impl(); + Handle(PartSet_OperationPrs) anOperationPrs = Handle(PartSet_OperationPrs)::DownCast(anAISIO); + // do nothing if the feature can not be displayed [is moved from presentation, to be checked] - if (!myFeature.get() || !myWorkshop->module()->canDisplayObject(myFeature)) + if (!myFeature.get()) return isModified; + QMap > aFeatureShapes; switch (theFlag) { case ModuleBase_IModule::CustomizeArguments: - PartSet_OperationPrs::getFeatureShapes(myFeature, myWorkshop, anOperationPrs->featureShapes()); + PartSet_OperationPrs::getFeatureShapes(myFeature, myWorkshop, aFeatureShapes); break; case ModuleBase_IModule::CustomizeResults: - PartSet_OperationPrs::getResultShapes(myFeature, myWorkshop, anOperationPrs->featureShapes()); + PartSet_OperationPrs::getResultShapes(myFeature, myWorkshop, aFeatureShapes); + PartSet_OperationPrs::getPresentationShapes(myFeature, myWorkshop, aFeatureShapes, false); break; case ModuleBase_IModule::CustomizeHighlightedObjects: - PartSet_OperationPrs::getHighlightedShapes(myWorkshop, anOperationPrs->featureShapes()); + PartSet_OperationPrs::getHighlightedShapes(myWorkshop, aFeatureShapes); break; default: return isModified; } + NCollection_DataMap& aShapeMap = + anOperationPrs->shapesMap(); + PartSet_OperationPrs::fillShapeList(aFeatureShapes, myWorkshop, aShapeMap); + myPresentationIsEmpty = false; // redisplay AIS objects + bool aRedisplayed = false; Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); if (!aContext.IsNull() && !aContext->IsDisplayed(anOperationPrs)) { - if (anOperationPrs->hasShapes()) { + // when the feature can not be visualized in the module, the operation preview should not + // be visualized also + if (anOperationPrs->hasShapes() && myWorkshop->module()->canDisplayObject(myFeature)) { // set color here because it can be changed in preferences Quantity_Color aShapeColor = getShapeColor(theFlag); anOperationPrs->setShapeColor(aShapeColor); PartSet_Module* aModule = dynamic_cast(myWorkshop->module()); XGUI_Workshop* aWorkshop = workshop(); - aWorkshop->displayer()->displayAIS(myPresentations[theFlag], false/*load object in selection*/, - theUpdateViewer); + aRedisplayed = aWorkshop->displayer()->displayAIS(myPresentations[theFlag], + false/*load object in selection*/, 0, false); aContext->SetZLayer(anOperationPrs, aModule->getVisualLayerId()); isModified = true; } } else { - if (!anOperationPrs->hasShapes()) { - erasePresentation(theFlag, theUpdateViewer); + // when the feature can not be visualized in the module, the operation preview should not + // be visualized also + if (!anOperationPrs->hasShapes() || !myWorkshop->module()->canDisplayObject(myFeature)) { + aRedisplayed = erasePresentation(theFlag, false); isModified = true; } else { anOperationPrs->Redisplay(); isModified = true; - if (theUpdateViewer) - workshop()->displayer()->updateViewer(); + aRedisplayed = true; } } + if (myPresentationIsEmpty) { + aRedisplayed = erasePresentation(theFlag, false); + } + if (aRedisplayed && theUpdateViewer) + workshop()->displayer()->updateViewer(); + return isModified; } -void PartSet_CustomPrs::erasePresentation(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag, - const bool theUpdateViewer) +bool PartSet_CustomPrs::erasePresentation( + const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag, + const bool theUpdateViewer) { + bool isErased = false; XGUI_Workshop* aWorkshop = workshop(); - aWorkshop->displayer()->eraseAIS(myPresentations[theFlag], theUpdateViewer); + if (myPresentations.contains(theFlag)) + isErased = aWorkshop->displayer()->eraseAIS(myPresentations[theFlag], theUpdateViewer); + return isErased; } -void PartSet_CustomPrs::clearPresentation(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag) +void PartSet_CustomPrs::clearPresentation( + const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag) { - Handle(PartSet_OperationPrs) anOperationPrs = getPresentation(theFlag); - if (!anOperationPrs.IsNull()) - anOperationPrs.Nullify(); + AISObjectPtr aPresentation = getPresentation(theFlag, false); + if (aPresentation.get()) { + Handle(AIS_InteractiveObject) anAISIO = aPresentation->impl(); + Handle(PartSet_OperationPrs) anOperationPrs = Handle(PartSet_OperationPrs)::DownCast(anAISIO); + + anOperationPrs->shapesMap().Clear(); + if (!anOperationPrs.IsNull()) + anOperationPrs.Nullify(); + myPresentations.remove(theFlag); + } } -Handle(PartSet_OperationPrs) PartSet_CustomPrs::getPresentation( - const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag) +AISObjectPtr PartSet_CustomPrs::getPresentation( + const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag, + const bool theToCreate) { Handle(PartSet_OperationPrs) aPresentation; - if (myPresentations.contains(theFlag)) { - AISObjectPtr anOperationPrs = myPresentations[theFlag]; - if (!anOperationPrs.get()) - initPresentation(theFlag); - Handle(AIS_InteractiveObject) anAISIO = anOperationPrs->impl(); - aPresentation = Handle(PartSet_OperationPrs)::DownCast(anAISIO); + AISObjectPtr anOperationPrs; + if (myPresentations.contains(theFlag)) + anOperationPrs = myPresentations[theFlag]; + + if (!anOperationPrs.get() && theToCreate) { + initPresentation(theFlag); + anOperationPrs = myPresentations[theFlag]; } - return aPresentation; + + return anOperationPrs; } bool PartSet_CustomPrs::redisplay(const ObjectPtr& theObject, @@ -169,7 +218,11 @@ bool PartSet_CustomPrs::redisplay(const ObjectPtr& theObject, #ifdef DO_NOT_VISUALIZE_CUSTOM_PRESENTATION return false; #endif - return displayPresentation(theFlag, theUpdateViewer); + bool aRedisplayed = false; + if (myIsActive[theFlag]) + aRedisplayed = displayPresentation(theFlag, theUpdateViewer); + + return aRedisplayed; } void PartSet_CustomPrs::clearPrs() @@ -179,7 +232,14 @@ void PartSet_CustomPrs::clearPrs() clearPresentation(ModuleBase_IModule::CustomizeHighlightedObjects); } -void PartSet_CustomPrs::initPresentation(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag) +void PartSet_CustomPrs::processEvent(const std::shared_ptr& theMessage) +{ + if (theMessage->eventID() == Events_Loop::eventByName(EVENT_EMPTY_OPERATION_PRESENTATION)) + myPresentationIsEmpty = true; /// store state to analize it after display/erase is finished +} + +void PartSet_CustomPrs::initPresentation( + const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag) { AISObjectPtr anOperationPrs = AISObjectPtr(new GeomAPI_AISObject()); Handle(PartSet_OperationPrs) anAISPrs = new PartSet_OperationPrs(myWorkshop); @@ -187,7 +247,7 @@ void PartSet_CustomPrs::initPresentation(const ModuleBase_IModule::ModuleBase_Cu if (theFlag == ModuleBase_IModule::CustomizeArguments || theFlag == ModuleBase_IModule::CustomizeResults) { anOperationPrs->setPointMarker(5, 2.); - anOperationPrs->setWidth(1); + anOperationPrs->setWidth((theFlag == ModuleBase_IModule::CustomizeHighlightedObjects)? 2 : 1); } else if (theFlag == ModuleBase_IModule::CustomizeHighlightedObjects) anAISPrs->useAISWidth(); @@ -202,16 +262,13 @@ Quantity_Color PartSet_CustomPrs::getShapeColor( Quantity_Color aColor; switch(theFlag) { case ModuleBase_IModule::CustomizeArguments: - aColor = ModuleBase_Tools::color("Visualization", "operation_parameter_color", - OPERATION_PARAMETER_COLOR()); + aColor = ModuleBase_Tools::color("Visualization", "operation_parameter_color"); break; case ModuleBase_IModule::CustomizeResults: - aColor = ModuleBase_Tools::color("Visualization", "operation_result_color", - OPERATION_RESULT_COLOR()); + aColor = ModuleBase_Tools::color("Visualization", "operation_result_color"); break; case ModuleBase_IModule::CustomizeHighlightedObjects: - aColor = ModuleBase_Tools::color("Visualization", "operation_highlight_color", - OPERATION_HIGHLIGHT_COLOR()); + aColor = ModuleBase_Tools::color("Visualization", "operation_highlight_color"); break; default: break;