Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fixes concerning the management of erroneous commands (display of a d… #13

Merged
merged 1 commit into from
Jul 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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