X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_WorkshopListener.cpp;h=11e1d9866b551d8d32ed0f39f02d9acfc4708f84;hb=b24899c5ff113144ea6498484e6f20da8d6f773e;hp=e4d13e93b7e2fd1fdca47abea431acaff7516706;hpb=88e8b404bd38608fe57b1720e94173b677612976;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_WorkshopListener.cpp b/src/XGUI/XGUI_WorkshopListener.cpp index e4d13e93b..11e1d9866 100755 --- a/src/XGUI/XGUI_WorkshopListener.cpp +++ b/src/XGUI/XGUI_WorkshopListener.cpp @@ -16,6 +16,7 @@ #endif #include +#include #include #include @@ -29,7 +30,6 @@ #include #include -#include #include #include @@ -39,12 +39,12 @@ #include #include #include -#include +#include #include #include -#include #include +#include #include #include @@ -62,7 +62,7 @@ //#define DEBUG_RESULT_COMPSOLID #ifdef DEBUG_FEATURE_REDISPLAY -const std::string DebugFeatureKind = "Extrusion"; +const std::string DebugFeatureKind = "";//"Extrusion"; #endif XGUI_WorkshopListener::XGUI_WorkshopListener(ModuleBase_IWorkshop* theWorkshop) @@ -82,18 +82,17 @@ void XGUI_WorkshopListener::initializeEventListening() { //Initialize event listening Events_Loop* aLoop = Events_Loop::loop(); - aLoop->registerListener(this, Events_Error::errorID()); //!< Listening application errors. - aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OPERATION_LAUNCHED)); + aLoop->registerListener(this, Events_InfoMessage::errorID()); //!< Listening application errors. 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_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_OBJECT_ERROR_CHANGED)); 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)); } //****************************************************** @@ -129,7 +128,20 @@ void XGUI_WorkshopListener::processEvent(const std::shared_ptr& std::shared_ptr aUpdMsg = std::dynamic_pointer_cast(theMessage); onFeatureRedisplayMsg(aUpdMsg); + } else if (theMessage->eventID() == Events_Loop::eventByName(EVENT_EMPTY_AIS_PRESENTATION)) { + std::shared_ptr aUpdMsg = + std::dynamic_pointer_cast(theMessage); + onFeatureEmptyPresentationMsg(aUpdMsg); + } else if (theMessage->eventID() == Events_Loop::eventByName(EVENT_UPDATE_BY_WIDGET_SELECTION)) { + ModuleBase_ModelWidget* aWidget = workshop()->propertyPanel()->activeWidget(); + if (aWidget) { + ModuleBase_WidgetSelector* aWidgetSelector = + dynamic_cast(aWidget); + if (aWidgetSelector) + myWorkshop->setSelected(aWidgetSelector->getAttributeSelection()); + } } + //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)) { @@ -142,37 +154,6 @@ void XGUI_WorkshopListener::processEvent(const std::shared_ptr& } else { QApplication::restoreOverrideCursor(); } - } - //An operation passed by message. Start it, process and commit. - else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OPERATION_LAUNCHED)) { - std::shared_ptr aPartSetMsg = - std::dynamic_pointer_cast(theMessage); - //myPropertyPanel->cleanContent(); - ModuleBase_Operation* anOperation = (ModuleBase_Operation*) aPartSetMsg->pointer(); - XGUI_OperationMgr* anOperationMgr = workshop()->operationMgr(); - - if (anOperationMgr->startOperation(anOperation)) { - ModuleBase_OperationFeature* aFOperation = dynamic_cast(anOperation); - if (aFOperation) { - workshop()->propertyPanel()->updateContentWidget(aFOperation->feature()); - workshop()->propertyPanel()->createContentPanel(aFOperation->feature()); - } - if (!anOperation->getDescription()->hasXmlRepresentation()) { - if (anOperation->commit()) - workshop()->updateCommandStatus(); - } - } - } - 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); @@ -180,30 +161,12 @@ 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_OBJECT_ERROR_CHANGED)) { - std::shared_ptr aUpdMsg = - std::dynamic_pointer_cast(theMessage); - std::set anObjects = aUpdMsg->objects(); - - ModuleBase_OperationFeature* aFOperation = dynamic_cast - (workshop()->operationMgr()->currentOperation()); - bool aFeatureChanged = false; - if(aFOperation ) { - FeaturePtr aFeature = aFOperation->feature(); - if (aFeature.get()) { - std::set::const_iterator aIt; - for (aIt = anObjects.begin(); aIt != anObjects.end() && !aFeatureChanged; ++aIt) { - aFeatureChanged = ModelAPI_Feature::feature(*aIt) == aFeature; - } - } - if (aFeatureChanged) - workshop()->operationMgr()->onValidateOperation(); - } } else { //Show error dialog if error message received. - std::shared_ptr anAppError = std::dynamic_pointer_cast(theMessage); - if (anAppError) { - emit errorOccurred(QString::fromLatin1(anAppError->description())); + std::shared_ptr anIngfoMsg = + std::dynamic_pointer_cast(theMessage); + if (anIngfoMsg) { + emit errorOccurred(anIngfoMsg); } return; } @@ -227,7 +190,8 @@ void XGUI_WorkshopListener::onFeatureUpdatedMsg( anInfo.append(ModuleBase_Tools::objectInfo((*aIt))); } QString anInfoStr = anInfo.join(";\t"); - qDebug(QString("onFeatureUpdatedMsg: %1, %2").arg(anObjects.size()).arg(anInfoStr).toStdString().c_str()); + qDebug(QString("onFeatureUpdatedMsg: %1, %2") + .arg(anObjects.size()).arg(anInfoStr).toStdString().c_str()); #endif std::set aFeatures = theMsg->objects(); XGUI_OperationMgr* anOperationMgr = workshop()->operationMgr(); @@ -253,7 +217,8 @@ void XGUI_WorkshopListener::onFeatureUpdatedMsg( } //****************************************************** -void XGUI_WorkshopListener::onFeatureRedisplayMsg(const std::shared_ptr& theMsg) +void XGUI_WorkshopListener:: + onFeatureRedisplayMsg(const std::shared_ptr& theMsg) { std::set anObjects = theMsg->objects(); std::set::const_iterator aIt; @@ -264,20 +229,22 @@ void XGUI_WorkshopListener::onFeatureRedisplayMsg(const std::shared_ptrdisplayer(); - bool aFirstVisualizedBody = false; - + //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) { ObjectPtr aObj = (*aIt); // Hide the object if it is invalid or concealed one - bool aHide = !aObj->data() || !aObj->data()->isValid() || + 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); @@ -294,7 +261,8 @@ void XGUI_WorkshopListener::onFeatureRedisplayMsg(const std::shared_ptr(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"); @@ -305,23 +273,23 @@ void XGUI_WorkshopListener::onFeatureRedisplayMsg(const std::shared_ptrgetKind(); - if (aKind == DebugFeatureKind) { + if (aKind == DebugFeatureKind || DebugFeatureKind.empty()) { qDebug(QString("visible=%1, hide=%2 : display= %2").arg(aDisplayer->isVisible(aObj)) .arg(aHide).arg(anObjInfo).toStdString().c_str()); } } #endif if (aHide) { - //we should provide objects which are hidden in the viewer, e.g. sketch always should visualizes - // all sub-features, if some features are to be hidden, sould be proposed may be to removed #1223 - //aHiddenObjects.push_back(aObj); + //we should provide objects which are hidden in the viewer, e.g. sketch always should + // visualizes all sub-features, if some features are to be hidden, sould be proposed may + // be to removed #1223 + // aHiddenObjects.push_back(aObj); aRedisplayed = aDisplayer->erase(aObj, false) || aRedisplayed; #ifdef DEBUG_FEATURE_REDISPLAY // Redisplay the visible object or the object of the current operation bool isVisibleObject = aDisplayer->isVisible(aObj); QString anObjInfo = ModuleBase_Tools::objectInfo((aObj)); - //qDebug(QString("visible=%1 : erase = %2").arg(isVisibleObject).arg(anObjInfo).toStdString().c_str()); #endif } else { @@ -329,7 +297,6 @@ void XGUI_WorkshopListener::onFeatureRedisplayMsg(const std::shared_ptrisVisible(aObj); #ifdef DEBUG_FEATURE_REDISPLAY QString anObjInfo = ModuleBase_Tools::objectInfo((aObj)); - //qDebug(QString("visible=%1 : display= %2").arg(isVisibleObject).arg(anObjInfo).toStdString().c_str()); #endif if (isVisibleObject) { // redisplay visible object @@ -346,7 +313,9 @@ void XGUI_WorkshopListener::onFeatureRedisplayMsg(const std::shared_ptrdeactivateActiveObject(aObj, false); } } else { // display object if the current operation has it - if (displayObject(aObj, aFirstVisualizedBody)) { + if (displayObject(aObj)) { + aDoFitAll = aDoFitAll || neededFitAll(aObj, aNbOfShownObjects); + aRedisplayed = true; // Deactivate object of current operation from selection aWorkshop->deactivateActiveObject(aObj, false); @@ -361,15 +330,19 @@ void XGUI_WorkshopListener::onFeatureRedisplayMsg(const std::shared_ptrflush(Events_Loop::eventByName(EVENT_EMPTY_AIS_PRESENTATION)); + + //VSV FitAll updated viewer by itself + if (aDoFitAll) myWorkshop->viewer()->fitAll(); - else + else aDisplayer->updateViewer(); } } + //****************************************************** -void XGUI_WorkshopListener::onFeatureCreatedMsg(const std::shared_ptr& theMsg) +void XGUI_WorkshopListener:: + onFeatureCreatedMsg(const std::shared_ptr& theMsg) { std::set anObjects = theMsg->objects(); std::set::const_iterator aIt; @@ -379,10 +352,12 @@ void XGUI_WorkshopListener::onFeatureCreatedMsg(const std::shared_ptrdisplayer()->objectsCount(); //bool aHasPart = false; bool aDisplayed = false; @@ -394,7 +369,8 @@ void XGUI_WorkshopListener::onFeatureCreatedMsg(const std::shared_ptr(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"); @@ -403,7 +379,7 @@ void XGUI_WorkshopListener::onFeatureCreatedMsg(const std::shared_ptrdata()->isValid() || + bool aHide = !anObject->data()->isValid() || anObject->isDisabled() || !anObject->isDisplayed(); if (!aHide) { // check that this is not hidden result @@ -416,12 +392,14 @@ void XGUI_WorkshopListener::onFeatureCreatedMsg(const std::shared_ptrshape().get() || aRes->shape()->isNull(); } if (!aHide) { - // setDisplayed has to be called in order to synchronize internal state of the object + // 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(*aIt, aFirstVisualizedBody); - } else + aDisplayed = displayObject(anObject); + if (aDisplayed) + aDoFitAll = aDoFitAll || neededFitAll(anObject, aNbOfShownObjects); + } else anObject->setDisplayed(false); } } @@ -431,8 +409,9 @@ void XGUI_WorkshopListener::onFeatureCreatedMsg(const std::shared_ptrprocessEvent(theMsg); if (aDisplayed) { - //VSV FitAll updated viewer by it self - if (aFirstVisualizedBody) + 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(); @@ -442,6 +421,35 @@ void XGUI_WorkshopListener::onFeatureCreatedMsg(const std::shared_ptr& theMsg) +{ + std::set anObjects = theMsg->objects(); + std::set::const_iterator aIt; +#ifdef DEBUG_FEATURE_CREATED + QStringList anInfo; + for (aIt = anObjects.begin(); aIt != anObjects.end(); ++aIt) { + anInfo.append(ModuleBase_Tools::objectInfo((*aIt))); + } + QString anInfoStr = anInfo.join(";\t"); + qDebug(QString("onFeatureEmptyPresentationMsg: %1, %2") + .arg(anObjects.size()).arg(anInfoStr).toStdString().c_str()); +#endif + + XGUI_Workshop* aWorkshop = workshop(); + XGUI_Displayer* aDisplayer = aWorkshop->displayer(); + + bool aRedisplayed = false; + for (aIt = anObjects.begin(); aIt != anObjects.end(); ++aIt) { + ObjectPtr anObject = *aIt; + aRedisplayed = aDisplayer->erase(anObject, false) || aRedisplayed; + } + + if (aRedisplayed) + aDisplayer->updateViewer(); +} + bool XGUI_WorkshopListener::event(QEvent * theEvent) { PostponeMessageQtEvent* aPostponedEv = dynamic_cast(theEvent); @@ -454,7 +462,7 @@ bool XGUI_WorkshopListener::event(QEvent * theEvent) } //************************************************************** -bool XGUI_WorkshopListener::displayObject(ObjectPtr theObj, bool& theFirstVisualizedBody) +bool XGUI_WorkshopListener::displayObject(ObjectPtr theObj) { #ifdef DEBUG_RESULT_COMPSOLID ResultPtr aRes = std::dynamic_pointer_cast(theObj); @@ -475,18 +483,26 @@ bool XGUI_WorkshopListener::displayObject(ObjectPtr theObj, bool& theFirstVisual XGUI_Displayer* aDisplayer = aWorkshop->displayer(); int aNb = aDisplayer->objectsCount(); - aDisplayed = aDisplayer->display(theObj, false); - - ResultPtr aResult = std::dynamic_pointer_cast(theObj); - if (aNb == 0 && aResult.get()) { - std::string aResultGroupName = aResult->groupName(); - if (aResultGroupName == ModelAPI_ResultBody::group() || - aResultGroupName == ModelAPI_ResultGroup::group()) { - std::shared_ptr aShapePtr = ModelAPI_Tools::shape(aResult); - theFirstVisualizedBody = aShapePtr.get() != NULL; + 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 aDisplayed; + return aFirstVisualizedBody; } bool XGUI_WorkshopListener::customizeCurrentObject(const std::set& theObjects, @@ -510,11 +526,11 @@ bool XGUI_WorkshopListener::customizeCurrentObject(const std::set& th // e.g. extrusion is hidden(h=0) but sketch is chosen if (theForceRedisplay || theObjects.find(aCurrentFeature) != theObjects.end()) { aCustomized = myWorkshop->module()->customizeObject(aCurrentFeature, - ModuleBase_IModule::CustomizeArguments, false); + ModuleBase_IModule::CustomizeArguments, false) || aCustomized; aCustomized = myWorkshop->module()->customizeObject(aCurrentFeature, - ModuleBase_IModule::CustomizeResults, false); + ModuleBase_IModule::CustomizeResults, false) || aCustomized; aCustomized = myWorkshop->module()->customizeObject(aCurrentFeature, - ModuleBase_IModule::CustomizeHighlightedObjects, false); + ModuleBase_IModule::CustomizeHighlightedObjects, false) || aCustomized; } } return aCustomized;