-// Copyright (C) 2014-2017 CEA/DEN, EDF R&D
+// Copyright (C) 2014-2023 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
//
// 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
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
-// See http://www.salome-platform.org/ or
-// email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
#include "XGUI_WorkshopListener.h"
#include <ModelAPI_Feature.h>
#include <ModelAPI_Data.h>
#include <ModelAPI_Tools.h>
+#include <ModelAPI_ResultField.h>
#include <ModuleBase_Events.h>
#include <ModuleBase_IModule.h>
#include <ModuleBase_Tools.h>
#include <ModuleBase_WidgetSelector.h>
+#include <SUIT_Application.h>
+#include <SUIT_Session.h>
+
#include "XGUI_ActionsMgr.h"
#include "XGUI_Displayer.h"
#include "XGUI_ErrorMgr.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 <iostream>
#endif
+#ifdef WIN32
+#pragma warning(disable : 4189) // for declaration of unused variables (MAYBE_UNUSED)
+#endif
+
//#define DEBUG_FEATURE_CREATED
//#define DEBUG_FEATURE_REDISPLAY
//#define DEBUG_FEATURE_UPDATED
: myWorkshop(theWorkshop),
myUpdatePrefs(false)
{
- XGUI_OperationMgr* anOperationMgr = workshop()->operationMgr();
}
//******************************************************
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("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));
+ aLoop->registerListener(this, Events_Loop::eventByName(EVENT_AUTOMATIC_RECOMPUTATION_ENABLE));
+ aLoop->registerListener(this, Events_Loop::eventByName(EVENT_AUTOMATIC_RECOMPUTATION_DISABLE));
+ aLoop->registerListener(this, ModelAPI_ObjectRenamedMessage::eventId());
}
//******************************************************
// Redisplay feature
else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY)) {
std::shared_ptr<ModelAPI_ObjectUpdatedMessage> aUpdMsg =
- std::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
+ std::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
onFeatureRedisplayMsg(aUpdMsg);
+ }
+ else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_VISUAL_ATTRIBUTES)) {
+ std::shared_ptr<ModelAPI_ObjectUpdatedMessage> aUpdMsg =
+ std::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
+ std::set<ObjectPtr> aObjList = aUpdMsg->objects();
+ std::set<ObjectPtr>::const_iterator aIt;
+ std::list<ResultPtr>::const_iterator aResIt;
+ XGUI_Displayer* aDisplayer = workshop()->displayer();
+ AISObjectPtr aAIS;
+ for (aIt = aObjList.begin(); aIt != aObjList.end(); ++aIt) {
+ FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(*aIt);
+ if (aFeature) {
+ aAIS = aDisplayer->getAISObject(aFeature);
+ if (aAIS.get())
+ workshop()->module()->customizePresentation(aFeature, aAIS);
+
+ std::list<ResultPtr> 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<ModelAPI_ObjectUpdatedMessage> aUpdMsg =
std::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
if (aWidgetSelector)
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
-
+ }
+ else if (theMessage->eventID() == Events_Loop::eventByName("FinishOperation")/* ||
+ theMessage->eventID() == Events_Loop::eventByName("AbortOperation")*/)
+ {
+ XGUI_FacesPanel* aFacesPanel = workshop()->facesPanel();
+ if (aFacesPanel)
+ aFacesPanel->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.
else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED)) {
// 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 if ((theMessage->eventID() ==
+ Events_Loop::eventByName(EVENT_AUTOMATIC_RECOMPUTATION_ENABLE)) ||
+ (theMessage->eventID() ==
+ Events_Loop::eventByName(EVENT_AUTOMATIC_RECOMPUTATION_DISABLE))) {
+ myWorkshop->updateAutoComputeState();
+ }
+ else if (theMessage->eventID() == ModelAPI_ObjectRenamedMessage::eventId()) {
+ myWorkshop->updateGroupsText();
+ myWorkshop->displayer()->updateViewer();
} else {
//Show error dialog if error message received.
std::shared_ptr<Events_InfoMessage> anIngfoMsg =
// 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<ModelAPI_Result>(aObj);
aHide = aRes && aRes->isConcealed();
}
}
}
+
// this processing should be moved in another place in order to do not cause problems in
// flush messages chain
//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));
- 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();
}
}
void XGUI_WorkshopListener::
onFeatureCreatedMsg(const std::shared_ptr<ModelAPI_ObjectUpdatedMessage>& theMsg)
{
+ bool isLoadedScript = false;
+ SUIT_Session* aSession = SUIT_Session::session();
+ if (aSession)
+ {
+ QVariant aVar = aSession->activeApplication()->property("IsLoadedScript");
+ isLoadedScript = !aVar.isNull() && aVar.toBool();
+ }
+
std::set<ObjectPtr> anObjects = theMsg->objects();
std::set<ObjectPtr>::const_iterator aIt;
#ifdef DEBUG_FEATURE_CREATED
#ifdef DEBUG_RESULT_COMPSOLID
ResultPtr aRes = std::dynamic_pointer_cast<ModelAPI_Result>(anObject);
if (aRes.get()) {
- ResultCompSolidPtr aCompSolidRes = std::dynamic_pointer_cast<ModelAPI_ResultCompSolid>(aRes);
+ ResultCompSolidPtr aCompSolidRes =
+ std::dynamic_pointer_cast<ModelAPI_ResultCompSolid>(aRes);
if (aCompSolidRes.get()) {
- qDebug(QString("COMPSOLID, numberOfSubs = %1")
- .arg(aCompSolidRes->numberOfSubs()).toStdString().c_str());
+ qDebug(QString("COMPSOLID, numberOfSubs = %1")
+ .arg(aCompSolidRes->numberOfSubs()).toStdString().c_str());
}
if (ModelAPI_Tools::compSolidOwner(aRes))
qDebug("COMPSOLID sub-object");
}
#endif
- // the validity of the data should be checked here in order to avoid display of the objects,
- // which were created, then deleted, but flush for the creation event happens after that
- // we should not display disabled objects
- bool aHide = !anObject->data()->isValid() ||
- anObject->isDisabled() ||
- !anObject->isDisplayed();
- if (!aHide) { // check that this is not hidden result
- ResultPtr aRes = std::dynamic_pointer_cast<ModelAPI_Result>(anObject);
- bool isConcealed = aRes && aRes->isConcealed();
- aHide = aRes && aRes->isConcealed();
- // Hide the presentation with an empty shape. But isDisplayed state of the object should not
- // be changed to the object becomes visible when the shape becomes not empty
- if (!aHide && aRes.get())
- aHide = !aRes->shape().get() || aRes->shape()->isNull();
- }
- if (!aHide) {
- // setDisplayed has to be called in order to synchronize internal state of the object
- // with list of displayed objects
- if (myWorkshop->module()->canDisplayObject(anObject)) {
- anObject->setDisplayed(true);
- aDisplayed = displayObject(anObject);
- } else
- anObject->setDisplayed(false);
- }
+
+ ResultBodyPtr aRes = std::dynamic_pointer_cast<ModelAPI_ResultBody>(anObject);
+ if (aRes.get() && aRes->numberOfSubs() > 0)
+ for (int anIndex = 0; anIndex < aRes->numberOfSubs(); ++anIndex)
+ setDisplayed(aRes->subResult(anIndex), isLoadedScript, aDisplayed);
+ else
+ setDisplayed(anObject, isLoadedScript, aDisplayed);
}
- bool isCustomized = customizeCurrentObject(anObjects, aDisplayed);
+ MAYBE_UNUSED bool isCustomized = customizeFeature(anObjects, aDisplayed);
//if (myObjectBrowser)
// myObjectBrowser->processEvent(theMsg);
return aDisplayed;
XGUI_Displayer* aDisplayer = aWorkshop->displayer();
- int aNb = aDisplayer->objectsCount();
return aDisplayer->display(theObj, false);
}
-bool XGUI_WorkshopListener::customizeCurrentObject(const std::set<ObjectPtr>& theObjects,
+bool XGUI_WorkshopListener::customizeFeature(const std::set<ObjectPtr>& theObjects,
bool theForceRedisplay)
{
XGUI_OperationMgr* anOperationMgr = workshop()->operationMgr();
// 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;
}
}
{
return myWorkshop;
}
+
+
+void XGUI_WorkshopListener::setDisplayed(
+ ObjectPtr theObject, const bool theIsLoadedScript, bool& theDisplayed)
+{
+ if (theIsLoadedScript) {
+ theObject->setDisplayed(theDisplayed);
+ return;
+ }
+ // the validity of the data should be checked here in order to avoid display of the objects,
+ // which were created, then deleted, but flush for the creation event happens after that
+ // we should not display disabled objects
+ bool aHide = !theObject->data()->isValid() ||
+ theObject->isDisabled() ||
+ !theObject->isDisplayed();
+ if (!aHide) { // check that this is not hidden result
+ ResultPtr aRes = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
+ aHide = aRes && aRes->isConcealed();
+ // Hide the presentation with an empty shape. But isDisplayed state of the object should not
+ // be changed to the object becomes visible when the shape becomes not empty
+ if (!aHide && aRes.get())
+ aHide = !aRes->shape().get() || aRes->shape()->isNull();
+ }
+ if (!aHide) {
+ // setDisplayed has to be called in order to synchronize internal state of the object
+ // with list of displayed objects
+ if (myWorkshop->module()->canDisplayObject(theObject)) {
+ theObject->setDisplayed(true);
+ theDisplayed = displayObject(theObject);
+ }
+ else
+ theObject->setDisplayed(false);
+ }
+}