Skip to content

Commit

Permalink
fixes concerning the management of erroneous commands (display of a d…
Browse files Browse the repository at this point in the history
…ialog box notifying the error, avoid redundancies in the history tab).
  • Loading branch information
Charles PIGNEROL committed Jul 24, 2024
1 parent 23bb33a commit 3c85c2b
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 93 deletions.
77 changes: 25 additions & 52 deletions src/QtComponents/QtMgx3DMainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}

Expand All @@ -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 <InfoCommand::TopoEntityInfo> topo_entities_info =
icmd.getSortedTopoInfoEntity();
vector < Topo::TopoEntity * > topoAddedShown, topoAddedHidden, topoRemoved, topoModified;
std::vector <InfoCommand::TopoEntityInfo> topo_entities_info = icmd.getSortedTopoInfoEntity();
i = 0;
for (std::vector<InfoCommand::TopoEntityInfo>::iterator
iter_tei = topo_entities_info.begin();
iter_tei != topo_entities_info.end(); ++iter_tei, i++)
for (std::vector<InfoCommand::TopoEntityInfo>::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;
Expand All @@ -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);
Expand All @@ -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 "<<te->getName()<<std::endl;
if (true == (*te).getDisplayProperties().isDisplayed())
getGraphicalWidget().getRenderingManager ( ).updateRepresentation(*te);
Expand All @@ -4391,21 +4383,15 @@ const SelectionManagerIfc& QtMgx3DMainWindow::getSelectionManager ( ) const
// les entités déjà avec une représentation mais qui ont un changement de visibilité

//std::cout<<" changement de visibilité pour "<<te->getName()<<std::endl;
RenderedEntityRepresentation *rer =
dynamic_cast<RenderedEntityRepresentation *>(
te->getDisplayProperties().getGraphicalRepresentation());
RenderedEntityRepresentation *rer = dynamic_cast<RenderedEntityRepresentation *>(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()))
Expand All @@ -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;
Expand All @@ -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);
Expand All @@ -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()))
Expand All @@ -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<Group::GroupEntity *, InfoCommand::type>::const_iterator
itg = groupsInfos.begin(); groupsInfos.end() != itg; itg++)
map < Group::GroupEntity * , InfoCommand::type > &groupsInfos = icmd.getGroupInfoEntity();
for (map<Group::GroupEntity *, InfoCommand::type>::const_iterator itg = groupsInfos.begin(); groupsInfos.end() != itg; itg++)
{
switch ((*itg).second)
{
Expand Down Expand Up @@ -4501,7 +4480,6 @@ const SelectionManagerIfc& QtMgx3DMainWindow::getSelectionManager ( ) const
if (!rep->getDisplayProperties().isDisplayable())
continue;


if (InfoCommand::CREATED == t)
{
bool displayed =
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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<QtMgx3DOperationPanel *>::iterator itap =
_additionalPanels.begin();
_additionalPanels.end() != itap; itap++)
for (vector<QtMgx3DOperationPanel *>::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 :
Expand All @@ -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);
Expand All @@ -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())
Expand All @@ -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())
Expand Down Expand Up @@ -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 :
Expand Down Expand Up @@ -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)
Expand Down
24 changes: 11 additions & 13 deletions src/QtComponents/QtMgx3DOperationsPanel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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;
Expand Down
46 changes: 18 additions & 28 deletions src/QtComponents/QtMgx3DPythonConsole.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,27 +65,23 @@ 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 <Swig Object of type");
} // QtMgx3DPythonConsole::QtMgx3DPythonConsole


QtMgx3DPythonConsole::QtMgx3DPythonConsole (const QtMgx3DPythonConsole&)
: QtPythonConsole (0, ""),
_mgxUserScriptingManager (0), _mainWindow (0), _graphicalWidget (0),
_cmdMgrPolicy ((CommandManagerIfc::POLICY)-1)
_mgxUserScriptingManager (0), _mainWindow (0), _graphicalWidget (0), _cmdMgrPolicy ((CommandManagerIfc::POLICY)-1)
{
assert (0 && "QtMgx3DPythonConsole copy constructor is forbidden.");
} // QtMgx3DPythonConsole::QtMgx3DPythonConsole (const QtMgx3DPythonConsole&)


QtMgx3DPythonConsole& QtMgx3DPythonConsole::operator = (
const QtMgx3DPythonConsole&)
QtMgx3DPythonConsole& QtMgx3DPythonConsole::operator = (const QtMgx3DPythonConsole&)
{
assert (0 && "QtMgx3DPythonConsole assignment operator is forbidden.");
return *this;
Expand All @@ -96,8 +92,7 @@ QtMgx3DPythonConsole::~QtMgx3DPythonConsole ( )
{
_graphicalWidget = 0;

// Contrairement au scripting manager, le user scripting manager relève de
// la responsabilité de ce panneau :
// Contrairement au scripting manager, le user scripting manager relève de la responsabilité de ce panneau :
delete _mgxUserScriptingManager; _mgxUserScriptingManager = 0;
} // QtMgx3DPythonConsole::~QtMgx3DPythonConsole

Expand All @@ -121,7 +116,7 @@ void QtMgx3DPythonConsole::setRunningMode (QtPythonConsole::RUNNING_MODE mode)
{
case QtPythonConsole::RM_DEBUG : enableActions = false;
break;
default : enableActions = true;
default : enableActions = true;
} // switch (getRunningMode ( ))

if ((true == modified) && (QtPythonConsole::RM_DEBUG != mode))
Expand Down Expand Up @@ -229,14 +224,10 @@ void QtMgx3DPythonConsole::executeFile (const std::string& fileName)

storePolicy ( );

unique_ptr<RenderingManager::DisplayLocker> displayLocker (
0 == _graphicalWidget ?
0 : new RenderingManager::DisplayLocker (
_graphicalWidget->getRenderingManager ( )));
unique_ptr<RenderingManager::DisplayLocker> 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
Expand Down Expand Up @@ -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


Expand Down Expand Up @@ -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


Expand All @@ -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 (...)
Expand Down
3 changes: 3 additions & 0 deletions src/Utils/Command.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 3c85c2b

Please sign in to comment.