diff --git a/src/QtComponents/QtMgx3DMainWindow.cpp b/src/QtComponents/QtMgx3DMainWindow.cpp index 8389ab8..6b88ed1 100644 --- a/src/QtComponents/QtMgx3DMainWindow.cpp +++ b/src/QtComponents/QtMgx3DMainWindow.cpp @@ -4299,8 +4299,7 @@ const SelectionManagerIfc& QtMgx3DMainWindow::getSelectionManager ( ) const // Traitement 1 : entités géométriques : // Optimisation : on transmet des listes d'entités uint i = 0; - vector < Geom::GeomEntity * > geomAddedShown, geomAddedHidden, - geomRemoved, geomModified; + vector < Geom::GeomEntity * > geomAddedShown, geomAddedHidden, geomRemoved, geomModified; for (i = 0; i < icmd.getNbGeomInfoEntity(); i++) { GeomEntity *ge = 0; @@ -4330,8 +4329,7 @@ const SelectionManagerIfc& QtMgx3DMainWindow::getSelectionManager ( ) const { // Mettre à jour toutes les représentations de l'entité, // qu'elles soient graphiques, textuelles ou autres. if (true == (*ge).getDisplayProperties().isDisplayed()) - getGraphicalWidget().getRenderingManager( - ).updateRepresentation(*ge); + getGraphicalWidget().getRenderingManager( ).updateRepresentation(*ge); doRender = true; } @@ -4346,14 +4344,10 @@ const SelectionManagerIfc& QtMgx3DMainWindow::getSelectionManager ( ) const getEntitiesPanel().removeCADEntities(geomRemoved); // Traitement 2 : entités topologiques : - vector < Topo::TopoEntity * > topoAddedShown, topoAddedHidden, - topoRemoved, topoModified; - std::vector topo_entities_info = - icmd.getSortedTopoInfoEntity(); + vector < Topo::TopoEntity * > topoAddedShown, topoAddedHidden, topoRemoved, topoModified; + std::vector topo_entities_info = icmd.getSortedTopoInfoEntity(); i = 0; - for (std::vector::iterator - iter_tei = topo_entities_info.begin(); - iter_tei != topo_entities_info.end(); ++iter_tei, i++) + for (std::vector::iterator iter_tei = topo_entities_info.begin(); iter_tei != topo_entities_info.end(); ++iter_tei, i++) { Topo::TopoEntity *te = (*iter_tei).m_topo_entity; t = (*iter_tei).m_type; @@ -4366,8 +4360,7 @@ const SelectionManagerIfc& QtMgx3DMainWindow::getSelectionManager ( ) const if (InfoCommand::CREATED == t) { - bool displayed = - te->getDisplayProperties().isDisplayed(); + bool displayed = te->getDisplayProperties().isDisplayed(); doRender = true == displayed ? true : doRender; if (true == displayed) topoAddedShown.push_back(te); @@ -4379,8 +4372,7 @@ const SelectionManagerIfc& QtMgx3DMainWindow::getSelectionManager ( ) const else if (InfoCommand::DISPMODIFIED == t) { - // Mettre à jour toutes les représentations de l'entité, - // qu'elles soient graphiques, textuelles ou autres. + // Mettre à jour toutes les représentations de l'entité, qu'elles soient graphiques, textuelles ou autres. //std::cout<<" changement de représentation pour "<getName()<getName()<( - te->getDisplayProperties().getGraphicalRepresentation()); + RenderedEntityRepresentation *rer = dynamic_cast(te->getDisplayProperties().getGraphicalRepresentation()); if ((0 != rer) && (0 == rer->getRenderingManager())) rer->setRenderingManager(&getGraphicalWidget().getRenderingManager()); const bool displayed = te->getDisplayProperties().isDisplayed(); - // Bug workaround : displayed déjà tagué alors que - // displayRepresentation l'évalue ... => on inverse : + // Bug workaround : displayed déjà tagué alors que displayRepresentation l'évalue ... => on inverse : te->getDisplayProperties().setDisplayed(!displayed); - // Puis on réaffecte => forcera l'actualisation de la - // représentation : + // Puis on réaffecte => forcera l'actualisation de la représentation : if (0 != rer) - getGraphicalWidget().getRenderingManager( - ).displayRepresentation(*te, displayed, - rer->getRepresentationMask()); + getGraphicalWidget().getRenderingManager( ).displayRepresentation(*te, displayed, rer->getRepresentationMask()); } if (0 == (i % Resources::instance()._updateRefreshRate.getValue())) @@ -4417,12 +4403,9 @@ const SelectionManagerIfc& QtMgx3DMainWindow::getSelectionManager ( ) const getEntitiesPanel().addTopologicEntities(topoAddedHidden, false); if (0 != topoRemoved.size()) getEntitiesPanel().removeTopologicEntities(topoRemoved); -// if (0 != shownEntities.size ( )) -// getRenderingManager ( ).displayRepresentations (shownEntities // Traitement 3 : entités de maillage : - vector < Mesh::MeshEntity * > meshAddedShown, meshAddedHidden, - meshRemoved, meshModified; + vector < Mesh::MeshEntity * > meshAddedShown, meshAddedHidden, meshRemoved, meshModified; for (i = 0; i < icmd.getNbMeshInfoEntity(); i++) { MeshEntity *me = 0; @@ -4436,8 +4419,7 @@ const SelectionManagerIfc& QtMgx3DMainWindow::getSelectionManager ( ) const if (InfoCommand::CREATED == t) { - bool displayed = - me->getDisplayProperties().isDisplayed(); + bool displayed = me->getDisplayProperties().isDisplayed(); doRender = true == displayed ? true : doRender; if (true == displayed) meshAddedShown.push_back(me); @@ -4450,8 +4432,7 @@ const SelectionManagerIfc& QtMgx3DMainWindow::getSelectionManager ( ) const if (InfoCommand::DISPMODIFIED == t) { if (true == (*me).getDisplayProperties().isDisplayed()) - getGraphicalWidget().getRenderingManager( - ).updateRepresentation(*me); + getGraphicalWidget().getRenderingManager( ).updateRepresentation(*me); doRender = true; } if (0 == (i % Resources::instance()._updateRefreshRate.getValue())) @@ -4466,10 +4447,8 @@ const SelectionManagerIfc& QtMgx3DMainWindow::getSelectionManager ( ) const // Traitement 4 : entités de type groupes : vector < Group::GroupEntity * > groupsAdded, groupsRemoved; - map < Group::GroupEntity * , InfoCommand::type > &groupsInfos = - icmd.getGroupInfoEntity(); - for (map::const_iterator - itg = groupsInfos.begin(); groupsInfos.end() != itg; itg++) + map < Group::GroupEntity * , InfoCommand::type > &groupsInfos = icmd.getGroupInfoEntity(); + for (map::const_iterator itg = groupsInfos.begin(); groupsInfos.end() != itg; itg++) { switch ((*itg).second) { @@ -4501,7 +4480,6 @@ const SelectionManagerIfc& QtMgx3DMainWindow::getSelectionManager ( ) const if (!rep->getDisplayProperties().isDisplayable()) continue; - if (InfoCommand::CREATED == t) { bool displayed = @@ -4548,8 +4526,7 @@ const SelectionManagerIfc& QtMgx3DMainWindow::getSelectionManager ( ) const // s'ils doivent être affichés ou non à la création. Le panneau QtEntitiesPanel n'a pas vocation à exister ... // On récupère l'info directement depuis le QtGroupsPanel : // bool displayed = sme->getDisplayProperties ( ).isDisplayed ( ); - bool displayed = 0 == (getGroupsPanel().getCheckedEntitiesTypes() & - FilterEntity::StructuredMesh) ? false : true; + bool displayed = 0 == (getGroupsPanel().getCheckedEntitiesTypes() & FilterEntity::StructuredMesh) ? false : true; doRender = true == displayed ? true : doRender; if (true == displayed) smeshAddedShown.push_back(sme); @@ -4578,9 +4555,7 @@ const SelectionManagerIfc& QtMgx3DMainWindow::getSelectionManager ( ) const getEntitiesPanel().removeStructuredMeshEntities(smeshRemoved); // Prévenir les panneaux additionnels de l'IHM (explorateur et qualité de maillage, ...) en vue d'une éventuelle actualisation : - for (vector::iterator itap = - _additionalPanels.begin(); - _additionalPanels.end() != itap; itap++) + for (vector::iterator itap = _additionalPanels.begin(); _additionalPanels.end() != itap; itap++) (*itap)->commandModifiedCallback(icmd); // Une commande vient de s'achever avec succès => afficher l'équivalent en Python en l'ajoutant à l'historique : @@ -4596,8 +4571,7 @@ const SelectionManagerIfc& QtMgx3DMainWindow::getSelectionManager ( ) const if (Command::DONE == command.getStatus()) { - // A t'on un évènement important justifiant d'une notification via - // boite de dialogue ? + // A t'on un évènement important justifiant d'une notification via boite de dialogue ? const string warn = commandInternal->getWarningToPopup(); if (false == warn.empty()) QtMessageBox::displayWarningMessage(this, getAppTitle().c_str(), warn); @@ -4610,9 +4584,11 @@ const SelectionManagerIfc& QtMgx3DMainWindow::getSelectionManager ( ) const else if ((COMMAND_STATE == event) && (Command::FAIL == command.getStatus())) { - if ((true == Resources::instance()._showDialogOnCommandError.getValue()) && - (false == command.isUserNotified())) + if ((true == Resources::instance()._showDialogOnCommandError.getValue()) && (false == command.isUserNotified())) + { + command.setUserNotified (true); QtMessageBox::displayErrorMessage(this, getAppTitle(), command.getErrorMessage()); + } // pour permettre de rejouer cette commande qui a échouée, elle est transmise avec le status en erreur, cela peut permettre de la corriger if (0 != _pythonPanel && commandInternal->isScriptable()) @@ -4625,7 +4601,6 @@ const SelectionManagerIfc& QtMgx3DMainWindow::getSelectionManager ( ) const // [EB] on ajoute un "#" au début de chacune des lignes UTF8String cmd2 = addCharAtBeginLines('#', cmd); - getContext ( ).getScriptingManager ( ).addCommand (cmd2); _pythonPanel->addToHistoric(commandInternal->getScriptCommand(), commandInternal->getScriptComments(), commandInternal->getErrorMessage(), true, true); } // if (0 != _pythonPanel && commandInternal->isScriptable()) @@ -4660,8 +4635,7 @@ const SelectionManagerIfc& QtMgx3DMainWindow::getSelectionManager ( ) const case CommandIfc::CANCELED : case CommandIfc::FAIL : // getCommandManager ( ).processQueuedCommands ( ); - if ((false == getCommandManager().hasRunningCommands()) && - (false == getCommandManager().hasQueuedCommands())) + if ((false == getCommandManager().hasRunningCommands()) && (false == getCommandManager().hasQueuedCommands())) updateActions(); break; case CommandIfc::INITED : @@ -4698,8 +4672,7 @@ const SelectionManagerIfc& QtMgx3DMainWindow::getSelectionManager ( ) const if (0 == action) { UTF8String message(Charset::UTF_8); - message << "Unité non référencée : " - << (unsigned long) getContext().getLengthUnit() << "."; + message << "Unité non référencée : " << (unsigned long) getContext().getLengthUnit() << "."; INTERNAL_ERROR(exc, message, "QtMgx3DMainWindow::lengthUnitModifiedEvent") throw exc; } // if (0 == action) diff --git a/src/QtComponents/QtMgx3DOperationsPanel.cpp b/src/QtComponents/QtMgx3DOperationsPanel.cpp index 2c5fe59..db16dd8 100644 --- a/src/QtComponents/QtMgx3DOperationsPanel.cpp +++ b/src/QtComponents/QtMgx3DOperationsPanel.cpp @@ -673,21 +673,24 @@ void QtMgx3DOperationPanel::discretisationModifiedCallback ( ) void QtMgx3DOperationPanel::applyCallback ( ) { CommandResultIfc* commandResult = 0; - + + bool userNotified = true; // CP NEW BEGIN_QT_TRY_CATCH_BLOCK CHECK_NULL_PTR_ERROR (getMgx3DOperationAction ( )) getMgx3DOperationAction ( )->executeOperation ( ); commandResult = getMgx3DOperationAction ( )->getCommandResult ( ); getMgx3DOperationAction ( )->setCommandResult (0); - + if (0 != commandResult) { if (CommandIfc::DONE == commandResult->getStatus ( )) hasError = false; else { - errorString = commandResult->getStrStatus ( ); + userNotified = commandResult->isUserNotified ( ); // CP NEW + hasError = true; // CP NEW + errorString = commandResult->getStrStatus ( ); commandResult->setUserNotified (true); } // else if (CommandIfc::DONE == commandResult->getStatus ( )) } // if (0 != commandResult) @@ -697,17 +700,12 @@ void QtMgx3DOperationPanel::applyCallback ( ) hasError = false; } - // On n'affiche pas nécessairement le message d'erreur, - // QtMgx3DMainWindow::commandModified l'a peut être déjà fait. + // On n'affiche pas nécessairement le message d'erreur, QtMgx3DMainWindow::commandModified l'a peut être déjà fait. COMPLETE_QT_TRY_CATCH_BLOCK ( -// On force à true car lors de pré-traitements (ex : liste d'entités vide, -// entité détruite) il n'y a pas création de commande donc -// QtMgx3DMainWindow::commandModified n'est pas appelée donc pas de message -// d'erreur. -// Le risque, avec true à la place de !QtMgx3DApplication::_showDialogOnCommandError.getValue( ), -// est que le message d'erreur soit affiché à 2 reprises. -true, -// !Resources::instance ( )._showDialogOnCommandError.getValue( ), +// On force à true car lors de pré-traitements (ex : liste d'entités vide, entité détruite) il n'y a pas création de commande donc +// QtMgx3DMainWindow::commandModified n'est pas appelée donc pas de message d'erreur. +// Le risque, avec true à la place de !QtMgx3DApplication::_showDialogOnCommandError.getValue( ), est que le message d'erreur soit affiché à 2 reprises. + (!userNotified && Resources::instance ( )._showDialogOnCommandError.getValue( )), // CP 07/24 this, "Magix 3D : exécution d'une opération") const bool succeeded = !hasError; diff --git a/src/QtComponents/QtMgx3DPythonConsole.cpp b/src/QtComponents/QtMgx3DPythonConsole.cpp index 5822f95..d9d7f04 100644 --- a/src/QtComponents/QtMgx3DPythonConsole.cpp +++ b/src/QtComponents/QtMgx3DPythonConsole.cpp @@ -65,11 +65,9 @@ namespace QtComponents // ============================================================================ -QtMgx3DPythonConsole::QtMgx3DPythonConsole ( - QWidget* parent, QtMgx3DMainWindow* mainWindow, const string& title) +QtMgx3DPythonConsole::QtMgx3DPythonConsole (QWidget* parent, QtMgx3DMainWindow* mainWindow, const string& title) : QtPythonConsole (parent, title), - _mgxUserScriptingManager (0), _mainWindow (mainWindow), - _graphicalWidget (0), _cmdMgrPolicy ((CommandManagerIfc::POLICY)-1) + _mgxUserScriptingManager (0), _mainWindow (mainWindow), _graphicalWidget (0), _cmdMgrPolicy ((CommandManagerIfc::POLICY)-1) { hideResult ("proxy of displayLocker ( - 0 == _graphicalWidget ? - 0 : new RenderingManager::DisplayLocker ( - _graphicalWidget->getRenderingManager ( ))); + unique_ptr displayLocker (0 == _graphicalWidget ? 0 : new RenderingManager::DisplayLocker (_graphicalWidget->getRenderingManager ( ))); CommandManagerIfc::POLICY cmdMgrPolicy = CommandManagerIfc::THREADED; -// Le PythonConsole reposant sur la QConsole ne supporte pas les instructions -// écrites sur plusieurs lignes ... => on passe par PythonSession : +// Le PythonConsole reposant sur la QConsole ne supporte pas les instructions écrites sur plusieurs lignes ... => on passe par PythonSession : CHECK_NULL_PTR_ERROR (getMainWindow ( )) try @@ -267,16 +258,18 @@ void QtMgx3DPythonConsole::executeFile (const std::string& fileName) } // QtMgx3DPythonConsole::executeFile -void QtMgx3DPythonConsole::addToHistoric ( - const UTF8String& command, const UTF8String& comments, - const UTF8String& commandOutput, bool statusErr, bool fromKernel) +void QtMgx3DPythonConsole::addToHistoric (const UTF8String& command, const UTF8String& comments, const UTF8String& commandOutput, bool statusErr, bool fromKernel) { #ifdef MULTITHREADED_APPLICATION AutoMutex mutex (&getMutex ( )); #endif // MULTITHREADED_APPLICATION - QtPythonConsole::addToHistoric ( - command, comments, commandOutput, statusErr, fromKernel); + LogOutputStream* logStream = getLogStream ( ); + if (true == fromKernel) + setLogStream (0); // CP 07/24 : éviter une double écriture dans la fenêtre "Historique" : + QtPythonConsole::addToHistoric (command, comments, commandOutput, statusErr, fromKernel); + if (true == fromKernel) + setLogStream (logStream); } // QtMgx3DPythonConsole::addToHistoric @@ -317,10 +310,8 @@ void QtMgx3DPythonConsole::setGraphicalWidget (Qt3DGraphicalWidget* widget) void QtMgx3DPythonConsole::storePolicy ( ) { - if ((0 != getMainWindow ( )) && - ((CommandManagerIfc::POLICY)-1 == _cmdMgrPolicy)) - _cmdMgrPolicy = getMainWindow ( )->getContext ( - ).getCommandManager( ).setPolicy(CommandManagerIfc::SEQUENTIAL); + if ((0 != getMainWindow ( )) && ((CommandManagerIfc::POLICY)-1 == _cmdMgrPolicy)) + _cmdMgrPolicy = getMainWindow ( )->getContext ( ).getCommandManager( ).setPolicy(CommandManagerIfc::SEQUENTIAL); } // QtMgx3DPythonConsole::storePolicy @@ -331,8 +322,7 @@ void QtMgx3DPythonConsole::restorePolicy ( ) try { if ((CommandManagerIfc::POLICY)-1 != _cmdMgrPolicy) - getMainWindow ( )->getContext ( - ).getCommandManager( ).setPolicy(_cmdMgrPolicy); + getMainWindow ( )->getContext ( ).getCommandManager( ).setPolicy(_cmdMgrPolicy); _cmdMgrPolicy = (CommandManagerIfc::POLICY)-1; } catch (...) diff --git a/src/Utils/Command.cpp b/src/Utils/Command.cpp index a9af601..ab45275 100644 --- a/src/Utils/Command.cpp +++ b/src/Utils/Command.cpp @@ -344,7 +344,10 @@ void Command::setStatus (Command::status status) // On prévient les observateurs avant l'appel à log () qui peut lever une exception ... if (changeStatus || _status == Command::PROCESSING) + { + setUserNotified (false); // CP 07/24 : une commande change plusieurs fois de status => autant de notifications à faire notifyObserversForModification (COMMAND_STATE); + } message << statusToString (status) << ", chronomètre = " << MgxNumeric::userRepresentation (getTimer ( )) << "."; MGX_TRACE_LOG_1 (trace1, message)