X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_WorkshopListener.cpp;h=6ec62aba90d20ed11338b7a168406cf857fea6d3;hb=1035d41ad342fb22f5ea2552a8fc135aed95f3b8;hp=72cf265935f66f6b230d7fc618b95665b8d21805;hpb=44db5b97e8d5e94a05dd5c844898af23f8e987e9;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_WorkshopListener.cpp b/src/XGUI/XGUI_WorkshopListener.cpp old mode 100755 new mode 100644 index 72cf26593..6ec62aba9 --- a/src/XGUI/XGUI_WorkshopListener.cpp +++ b/src/XGUI/XGUI_WorkshopListener.cpp @@ -1,22 +1,35 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> +// 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 "XGUI_WorkshopListener.h" -#include "XGUI_Workshop.h" -#include "XGUI_Displayer.h" -#include "XGUI_ErrorMgr.h" -#include "XGUI_OperationMgr.h" -#include "XGUI_SalomeConnector.h" -#include "XGUI_ActionsMgr.h" -#include "XGUI_PropertyPanel.h" -#include "XGUI_ModuleConnector.h" -#include "XGUI_QtEvents.h" #ifndef HAVE_SALOME #include #endif -#include -#include +#include +#include +#include + +#include +#include +#include #include #include @@ -24,34 +37,36 @@ #include #include #include -#include -#include -#include #include +#include -#include -#include - +#include +#include +#include #include - #include #include #include #include -#include -#include #include -#include -#include -#include -#include -#include +#include "XGUI_ActionsMgr.h" +#include "XGUI_Displayer.h" +#include "XGUI_ErrorMgr.h" +#include "XGUI_FacesPanel.h" +#include "XGUI_OperationMgr.h" +#include "XGUI_ModuleConnector.h" +#include "XGUI_PropertyPanel.h" + +#include "XGUI_QtEvents.h" +#include "XGUI_SalomeConnector.h" +#include "XGUI_SelectionMgr.h" +#include "XGUI_Workshop.h" +#include #include #include #include -#include #ifdef _DEBUG #include @@ -67,7 +82,7 @@ const std::string DebugFeatureKind = "";//"Extrusion"; #endif -XGUI_WorkshopListener::XGUI_WorkshopListener(ModuleBase_IWorkshop* theWorkshop) +XGUI_WorkshopListener::XGUI_WorkshopListener(XGUI_Workshop* theWorkshop) : myWorkshop(theWorkshop), myUpdatePrefs(false) { @@ -88,20 +103,26 @@ void XGUI_WorkshopListener::initializeEventListening() aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_CREATED)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_VISUAL_ATTRIBUTES)); aLoop->registerListener(this, Events_LongOp::eventID()); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_PLUGIN_LOADED)); - aLoop->registerListener(this, Events_Loop::eventByName(EVENT_SELFILTER_LOADED)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_UPDATE_VIEWER_BLOCKED)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_UPDATE_VIEWER_UNBLOCKED)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_EMPTY_AIS_PRESENTATION)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_UPDATE_BY_WIDGET_SELECTION)); + + aLoop->registerListener(this, Events_Loop::eventByName("FinishOperation")); + aLoop->registerListener(this, Events_Loop::eventByName("AbortOperation")); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_AUTOMATIC_RECOMPUTATION_ENABLE)); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_AUTOMATIC_RECOMPUTATION_DISABLE)); } //****************************************************** void XGUI_WorkshopListener::processEvent(const std::shared_ptr& theMessage) { - if (QApplication::instance()->thread() != QThread::currentThread()) { + if (QApplication::instance() && + QApplication::instance()->thread() != QThread::currentThread()) { #ifdef _DEBUG std::cout << "XGUI_Workshop::processEvent: " << "Working in another thread." << std::endl; #endif @@ -129,8 +150,32 @@ void XGUI_WorkshopListener::processEvent(const std::shared_ptr& // Redisplay feature else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY)) { std::shared_ptr aUpdMsg = - std::dynamic_pointer_cast(theMessage); + std::dynamic_pointer_cast(theMessage); onFeatureRedisplayMsg(aUpdMsg); + } + else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_VISUAL_ATTRIBUTES)) { + std::shared_ptr aUpdMsg = + std::dynamic_pointer_cast(theMessage); + std::set aObjList = aUpdMsg->objects(); + std::set::const_iterator aIt; + std::list::const_iterator aResIt; + XGUI_Displayer* aDisplayer = workshop()->displayer(); + AISObjectPtr aAIS; + for (aIt = aObjList.begin(); aIt != aObjList.end(); ++aIt) { + FeaturePtr aFeature = std::dynamic_pointer_cast(*aIt); + if (aFeature) { + aAIS = aDisplayer->getAISObject(aFeature); + if (aAIS.get()) + workshop()->module()->customizePresentation(aFeature, aAIS); + + std::list aResults = aFeature->results(); + for (aResIt = aResults.begin(); aResIt != aResults.end(); ++aResIt) { + aAIS = aDisplayer->getAISObject(*aResIt); + if (aAIS.get()) + workshop()->module()->customizePresentation(*aResIt, aAIS); + } + } + } } else if (theMessage->eventID() == Events_Loop::eventByName(EVENT_EMPTY_AIS_PRESENTATION)) { std::shared_ptr aUpdMsg = std::dynamic_pointer_cast(theMessage); @@ -141,9 +186,11 @@ void XGUI_WorkshopListener::processEvent(const std::shared_ptr& ModuleBase_WidgetSelector* aWidgetSelector = dynamic_cast(aWidget); if (aWidgetSelector) - myWorkshop->setSelected(aWidgetSelector->getAttributeSelection()); + workshop()->selector()->setSelected(aWidgetSelector->getAttributeSelection()); } - } + } else if (theMessage->eventID() == Events_Loop::eventByName("FinishOperation")/* || + theMessage->eventID() == Events_Loop::eventByName("AbortOperation")*/) + workshop()->facesPanel()->reset(false); // do not flush redisplay, it is flushed after event //Update property panel on corresponding message. If there is no current operation (no //property panel), or received message has different feature to the current - do nothing. @@ -157,17 +204,6 @@ void XGUI_WorkshopListener::processEvent(const std::shared_ptr& } else { QApplication::restoreOverrideCursor(); } - } - else if (theMessage->eventID() == Events_Loop::eventByName(EVENT_SELFILTER_LOADED)) { - std::shared_ptr aMsg = - std::dynamic_pointer_cast(theMessage); - if (aMsg) { - ModuleBase_FilterFactory* aFactory = myWorkshop->selectionFilters(); - if (!aMsg->attributeId().empty()) { - aFactory->assignFilter(aMsg->selectionFilterId(), aMsg->featureId(), aMsg->attributeId(), - aMsg->parameters()); - } - } } else if (theMessage->eventID() == Events_Loop::eventByName(EVENT_UPDATE_VIEWER_BLOCKED)) { // the viewer's update context will not happens until viewer updated is emitted workshop()->displayer()->enableUpdateViewer(false); @@ -175,6 +211,11 @@ void XGUI_WorkshopListener::processEvent(const std::shared_ptr& // the viewer's update context is unblocked, the viewer's update works XGUI_Displayer* aDisplayer = workshop()->displayer(); aDisplayer->enableUpdateViewer(true); + } else if ((theMessage->eventID() == + Events_Loop::eventByName(EVENT_AUTOMATIC_RECOMPUTATION_ENABLE)) || + (theMessage->eventID() == + Events_Loop::eventByName(EVENT_AUTOMATIC_RECOMPUTATION_DISABLE))) { + myWorkshop->updateAutoComputeState(); } else { //Show error dialog if error message received. std::shared_ptr anIngfoMsg = @@ -249,9 +290,6 @@ void XGUI_WorkshopListener:: XGUI_Workshop* aWorkshop = workshop(); XGUI_Displayer* aDisplayer = aWorkshop->displayer(); - //bool aFirstVisualizedBody = false; - bool aDoFitAll = false; - int aNbOfShownObjects = workshop()->displayer()->objectsCount(); bool aRedisplayed = false; //std::list aHiddenObjects; for (aIt = anObjects.begin(); aIt != anObjects.end(); ++aIt) { @@ -260,6 +298,7 @@ void XGUI_WorkshopListener:: // Hide the object if it is invalid or concealed one bool aHide = !aObj->data() || !aObj->data()->isValid() || aObj->isDisabled() || (!aObj->isDisplayed()); + if (!aHide) { // check that this is not hidden result ResultPtr aRes = std::dynamic_pointer_cast(aObj); aHide = aRes && aRes->isConcealed(); @@ -328,8 +367,6 @@ void XGUI_WorkshopListener:: } } else { // display object if the current operation has it if (displayObject(aObj)) { - aDoFitAll = aDoFitAll || neededFitAll(aObj, aNbOfShownObjects); - aRedisplayed = true; // Deactivate object of current operation from selection aWorkshop->deactivateActiveObject(aObj, false); @@ -342,15 +379,13 @@ void XGUI_WorkshopListener:: //if (aHiddenObjects.size() > 0) // myWorkshop->module()->processHiddenObject(aHiddenObjects); - bool isCustomized = customizeCurrentObject(anObjects, aRedisplayed); + bool isCustomized = customizeFeature(anObjects, aRedisplayed); if (aRedisplayed || isCustomized) { Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_EMPTY_AIS_PRESENTATION)); - //VSV FitAll updated viewer by itself - if (aDoFitAll) - myWorkshop->viewer()->fitAll(); - else - aDisplayer->updateViewer(); + // Do not update viewer here because it can be called in a loop + // In this case Update has to be called after redisplay event + //aDisplayer->updateViewer(); } } @@ -370,9 +405,6 @@ void XGUI_WorkshopListener:: .arg(anObjects.size()).arg(anInfoStr).toStdString().c_str()); #endif - bool aDoFitAll = false; - int aNbOfShownObjects = workshop()->displayer()->objectsCount(); - //bool aHasPart = false; bool aDisplayed = false; for (aIt = anObjects.begin(); aIt != anObjects.end(); ++aIt) { @@ -411,46 +443,18 @@ void XGUI_WorkshopListener:: if (myWorkshop->module()->canDisplayObject(anObject)) { anObject->setDisplayed(true); aDisplayed = displayObject(anObject); - if (aDisplayed) - aDoFitAll = aDoFitAll || neededFitAll(anObject, aNbOfShownObjects); - - // workaround for #1750: sub results should be sent here to be displayed - FeaturePtr anObjectFeature = ModelAPI_Feature::feature(anObject); - if (anObjectFeature.get() && anObjectFeature->getKind() == "Partition") { - XGUI_OperationMgr* anOperationMgr = workshop()->operationMgr(); - if (anOperationMgr->hasOperation()) { - ModuleBase_OperationFeature* aFOperation = dynamic_cast - (anOperationMgr->currentOperation()); - if (aFOperation && aFOperation->isEditOperation() && aFOperation->id() == "Remove_SubShapes") { - ResultCompSolidPtr aCompsolidResult = std::dynamic_pointer_cast(anObject); - if (aCompsolidResult.get() != NULL) { // display all sub results - for(int i = 0; i < aCompsolidResult->numberOfSubs(); i++) { - ObjectPtr aSubObject = aCompsolidResult->subResult(i); - aSubObject->setDisplayed(true); - aDisplayed = displayObject(aSubObject); - if (aDisplayed) - aDoFitAll = aDoFitAll || neededFitAll(aSubObject, aNbOfShownObjects); - } - } - } - } - } } else anObject->setDisplayed(false); } } - bool isCustomized = customizeCurrentObject(anObjects, aDisplayed); + bool isCustomized = customizeFeature(anObjects, aDisplayed); //if (myObjectBrowser) // myObjectBrowser->processEvent(theMsg); if (aDisplayed) { Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_EMPTY_AIS_PRESENTATION)); - //VSV FitAll updated viewer by itself - if (aDoFitAll) - myWorkshop->viewer()->fitAll(); - else - workshop()->displayer()->updateViewer(); + workshop()->displayer()->updateViewer(); } //if (aHasPart) { // TODO: Avoid activate last part on loading of document // activateLastPart(); @@ -522,26 +526,7 @@ bool XGUI_WorkshopListener::displayObject(ObjectPtr theObj) return aDisplayer->display(theObj, false); } -//************************************************************** -bool XGUI_WorkshopListener::neededFitAll(ObjectPtr theObj, const int theNbOfShownObjects) -{ - bool aFirstVisualizedBody = false; - - if (theNbOfShownObjects == 0) { - ResultPtr aResult = std::dynamic_pointer_cast(theObj); - if (aResult.get()) { - std::string aResultGroupName = aResult->groupName(); - if (aResultGroupName == ModelAPI_ResultBody::group() || - aResultGroupName == ModelAPI_ResultGroup::group()) { - std::shared_ptr aShapePtr = ModelAPI_Tools::shape(aResult); - aFirstVisualizedBody = aShapePtr.get() != NULL; - } - } - } - return aFirstVisualizedBody; -} - -bool XGUI_WorkshopListener::customizeCurrentObject(const std::set& theObjects, +bool XGUI_WorkshopListener::customizeFeature(const std::set& theObjects, bool theForceRedisplay) { XGUI_OperationMgr* anOperationMgr = workshop()->operationMgr(); @@ -561,11 +546,11 @@ bool XGUI_WorkshopListener::customizeCurrentObject(const std::set& th // the feature is hidden, but arguments of the feature are modified // e.g. extrusion is hidden(h=0) but sketch is chosen if (theForceRedisplay || theObjects.find(aCurrentFeature) != theObjects.end()) { - aCustomized = myWorkshop->module()->customizeObject(aCurrentFeature, + aCustomized = myWorkshop->module()->customizeFeature(aCurrentFeature, ModuleBase_IModule::CustomizeArguments, false) || aCustomized; - aCustomized = myWorkshop->module()->customizeObject(aCurrentFeature, + aCustomized = myWorkshop->module()->customizeFeature(aCurrentFeature, ModuleBase_IModule::CustomizeResults, false) || aCustomized; - aCustomized = myWorkshop->module()->customizeObject(aCurrentFeature, + aCustomized = myWorkshop->module()->customizeFeature(aCurrentFeature, ModuleBase_IModule::CustomizeHighlightedObjects, false) || aCustomized; } } @@ -574,6 +559,5 @@ bool XGUI_WorkshopListener::customizeCurrentObject(const std::set& th XGUI_Workshop* XGUI_WorkshopListener::workshop() const { - XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); - return aConnector->workshop(); + return myWorkshop; }