X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_CustomPrs.cpp;h=1780f0d44f6299d88775afb1130ad0c0aea10cf0;hb=ca925f26180f15699a77e76461679f11abd499ba;hp=aedc188b58d111159f80101a8a559d8b2c30fa82;hpb=6e73ccbe5ba45c2f6c1c7513ea20b502b245e2c8;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_CustomPrs.cpp b/src/PartSet/PartSet_CustomPrs.cpp index aedc188b5..1780f0d44 100755 --- a/src/PartSet/PartSet_CustomPrs.cpp +++ b/src/PartSet/PartSet_CustomPrs.cpp @@ -1,12 +1,27 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: PartSet_CustomPrs.cpp -// Created: 30 Jun 2015 -// Author: Natalia ERMOLAEVA +// Copyright (C) 2014-2017 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 @@ -14,102 +29,252 @@ #include #include - -#include - -#include -#include +#include #include +#include +#include #include #include #include -#define OPERATION_PARAMETER_COLOR "255, 255, 0" +//#define DO_NOT_VISUALIZE_CUSTOM_PRESENTATION PartSet_CustomPrs::PartSet_CustomPrs(ModuleBase_IWorkshop* theWorkshop) - : myWorkshop(theWorkshop) + : myWorkshop(theWorkshop), myFeature(FeaturePtr()), myPresentationIsEmpty(false) { - myOperationPrs = AISObjectPtr(new GeomAPI_AISObject()); - myOperationPrs->setImpl(new Handle(AIS_InteractiveObject)(new PartSet_OperationPrs(theWorkshop))); + Events_Loop* aLoop = Events_Loop::loop(); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_EMPTY_OPERATION_PRESENTATION)); - std::vector aColor = Config_PropManager::color("Visualization", "operation_parameter_color", - OPERATION_PARAMETER_COLOR); - myOperationPrs->setColor(aColor[0], aColor[1], aColor[2]); + initPresentation(ModuleBase_IModule::CustomizeArguments); + initPresentation(ModuleBase_IModule::CustomizeResults); + initPresentation(ModuleBase_IModule::CustomizeHighlightedObjects); - myOperationPrs->setPointMarker(5, 2.); - myOperationPrs->setWidth(1); + myIsActive[ModuleBase_IModule::CustomizeArguments] = false; + myIsActive[ModuleBase_IModule::CustomizeResults] = false; + myIsActive[ModuleBase_IModule::CustomizeHighlightedObjects] = false; } -bool PartSet_CustomPrs::isActive() const +bool PartSet_CustomPrs::isActive(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag) { - Handle(PartSet_OperationPrs) anOperationPrs = getPresentation(); - Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); - - return aContext->IsDisplayed(anOperationPrs); + return myIsActive[theFlag]; } -void PartSet_CustomPrs::activate(const FeaturePtr& theFeature) +bool PartSet_CustomPrs::activate(const FeaturePtr& theFeature, + const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag, + const bool theUpdateViewer) { - Handle(PartSet_OperationPrs) anOperationPrs = getPresentation(); +#ifdef DO_NOT_VISUALIZE_CUSTOM_PRESENTATION + return false; +#endif + + myIsActive[theFlag] = true; + myFeature = theFeature; - if (anOperationPrs->canActivate(theFeature)) { - anOperationPrs->setFeature(theFeature); - if (theFeature.get()) - displayPresentation(); + bool isModified = false; + if (theFeature.get()) { + displayPresentation(theFlag, theUpdateViewer); + isModified = true; } + return isModified; } -void PartSet_CustomPrs::deactivate() +bool PartSet_CustomPrs::deactivate(const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag, + const bool theUpdateViewer) { - Handle(PartSet_OperationPrs) anOperationPrs = getPresentation(); - anOperationPrs->setFeature(FeaturePtr()); + myIsActive[theFlag] = false; + erasePresentation(theFlag, theUpdateViewer); + return true; +} + +bool PartSet_CustomPrs::displayPresentation( + const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag, + const bool theUpdateViewer) +{ + bool isModified = false; + + // update the AIS objects content + 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()) + return isModified; - erasePresentation(); + QMap > aFeatureShapes; + switch (theFlag) { + case ModuleBase_IModule::CustomizeArguments: + PartSet_OperationPrs::getFeatureShapes(myFeature, myWorkshop, aFeatureShapes); + break; + case ModuleBase_IModule::CustomizeResults: + PartSet_OperationPrs::getResultShapes(myFeature, myWorkshop, aFeatureShapes); + PartSet_OperationPrs::getPresentationShapes(myFeature, myWorkshop, aFeatureShapes, false); + break; + case ModuleBase_IModule::CustomizeHighlightedObjects: + 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)) { + // 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(); + aRedisplayed = aWorkshop->displayer()->displayAIS(myPresentations[theFlag], + false/*load object in selection*/, false); + aContext->SetZLayer(anOperationPrs, aModule->getVisualLayerId()); + isModified = true; + } + } + else { + // 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; + aRedisplayed = true; + } + } + if (myPresentationIsEmpty) { + aRedisplayed = erasePresentation(theFlag, false); + } + if (aRedisplayed && theUpdateViewer) + workshop()->displayer()->updateViewer(); + + return isModified; } +bool PartSet_CustomPrs::erasePresentation( + const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag, + const bool theUpdateViewer) +{ + bool isErased = false; + XGUI_Workshop* aWorkshop = workshop(); + if (myPresentations.contains(theFlag)) + isErased = aWorkshop->displayer()->eraseAIS(myPresentations[theFlag], theUpdateViewer); + return isErased; +} -void PartSet_CustomPrs::displayPresentation() +void PartSet_CustomPrs::clearPresentation( + const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag) { - Handle(PartSet_OperationPrs) anOperationPrs = getPresentation(); + AISObjectPtr aPresentation = getPresentation(theFlag, false); + if (aPresentation.get()) { + Handle(AIS_InteractiveObject) anAISIO = aPresentation->impl(); + Handle(PartSet_OperationPrs) anOperationPrs = Handle(PartSet_OperationPrs)::DownCast(anAISIO); - Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); - if (!aContext->IsDisplayed(anOperationPrs)) { - PartSet_Module* aModule = dynamic_cast(myWorkshop->module()); - aContext->Display(anOperationPrs); - aContext->SetZLayer(anOperationPrs, aModule->getVisualLayerId()); + anOperationPrs->shapesMap().Clear(); + if (!anOperationPrs.IsNull()) + anOperationPrs.Nullify(); + myPresentations.remove(theFlag); } - else - anOperationPrs->Redisplay(); } -void PartSet_CustomPrs::erasePresentation() +AISObjectPtr PartSet_CustomPrs::getPresentation( + const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag, + const bool theToCreate) { - Handle(AIS_InteractiveObject) anOperationPrs = myOperationPrs->impl(); - Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); - if (aContext->IsDisplayed(anOperationPrs)) - aContext->Remove(anOperationPrs); + Handle(PartSet_OperationPrs) aPresentation; + + AISObjectPtr anOperationPrs; + if (myPresentations.contains(theFlag)) + anOperationPrs = myPresentations[theFlag]; + + if (!anOperationPrs.get() && theToCreate) { + initPresentation(theFlag); + anOperationPrs = myPresentations[theFlag]; + } + + return anOperationPrs; } -Handle(PartSet_OperationPrs) PartSet_CustomPrs::getPresentation() const +bool PartSet_CustomPrs::redisplay(const ObjectPtr& theObject, + const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag, + const bool theUpdateViewer) { - Handle(AIS_InteractiveObject) anAISIO = myOperationPrs->impl(); - return Handle(PartSet_OperationPrs)::DownCast(anAISIO); +#ifdef DO_NOT_VISUALIZE_CUSTOM_PRESENTATION + return false; +#endif + bool aRedisplayed = false; + if (myIsActive[theFlag]) + aRedisplayed = displayPresentation(theFlag, theUpdateViewer); + + return aRedisplayed; } -void PartSet_CustomPrs::customize(const ObjectPtr& theObject) +void PartSet_CustomPrs::clearPrs() { - // the presentation should be recomputed if the previous AIS depend on the result - // [it should be hiddend] or the new AIS depend on it [it should be visualized] - Handle(PartSet_OperationPrs) anOperationPrs = getPresentation(); - Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); - if (aContext->IsDisplayed(anOperationPrs)) { - // if there are performance poblems, to improve them, the necessity of redisplay can be checked - //bool aChanged = anOperationPrs->dependOn(theObject); - anOperationPrs->updateShapes(); - //aChanged = aChanged || anOperationPrs->dependOn(theObject); - //if (aChanged) - anOperationPrs->Redisplay(); + clearPresentation(ModuleBase_IModule::CustomizeArguments); + clearPresentation(ModuleBase_IModule::CustomizeResults); + clearPresentation(ModuleBase_IModule::CustomizeHighlightedObjects); +} + +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); + anOperationPrs->setImpl(new Handle(AIS_InteractiveObject)(anAISPrs)); + if (theFlag == ModuleBase_IModule::CustomizeArguments || + theFlag == ModuleBase_IModule::CustomizeResults) { + anOperationPrs->setPointMarker(5, 2.); + anOperationPrs->setWidth(1); + } + else if (theFlag == ModuleBase_IModule::CustomizeHighlightedObjects) + anAISPrs->useAISWidth(); + + if (anOperationPrs.get()) + myPresentations[theFlag] = anOperationPrs; +} + +Quantity_Color PartSet_CustomPrs::getShapeColor( + const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag) +{ + Quantity_Color aColor; + switch(theFlag) { + case ModuleBase_IModule::CustomizeArguments: + aColor = ModuleBase_Tools::color("Visualization", "operation_parameter_color"); + break; + case ModuleBase_IModule::CustomizeResults: + aColor = ModuleBase_Tools::color("Visualization", "operation_result_color"); + break; + case ModuleBase_IModule::CustomizeHighlightedObjects: + aColor = ModuleBase_Tools::color("Visualization", "operation_highlight_color"); + break; + default: + break; } + return aColor; +} + +XGUI_Workshop* PartSet_CustomPrs::workshop() const +{ + XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); + return aConnector->workshop(); }