[cgkit-commits] SF.net SVN: cgkit: [140] maya/trunk/maya_wrapper
Brought to you by:
mbaas
From: <mb...@us...> - 2006-10-19 15:35:02
|
Revision: 140 http://svn.sourceforge.net/cgkit/?rev=140&view=rev Author: mbaas Date: 2006-10-19 08:34:46 -0700 (Thu, 19 Oct 2006) Log Message: ----------- Capture the error message of a MEL command and insert it into the Python exception. Modified Paths: -------------- maya/trunk/maya_wrapper/changelog.txt maya/trunk/maya_wrapper/src_aux/mglobal.cpp Modified: maya/trunk/maya_wrapper/changelog.txt =================================================================== --- maya/trunk/maya_wrapper/changelog.txt 2006-10-18 19:23:55 UTC (rev 139) +++ maya/trunk/maya_wrapper/changelog.txt 2006-10-19 15:34:46 UTC (rev 140) @@ -19,6 +19,11 @@ the Maya package. This uses a CObject data type which cannot be accidentally modified by a Python script. +- When a MEL command from the mel or remote.mel module fails, its error + message is captured and added to the corresponding Python exception. So + it's not necessary anymore to consult the script editor to find out why + a MEL command has failed. + - Added a C++ ERuntimeError exception that gets translated to a Python RuntimeError exception. Modified: maya/trunk/maya_wrapper/src_aux/mglobal.cpp =================================================================== --- maya/trunk/maya_wrapper/src_aux/mglobal.cpp 2006-10-18 19:23:55 UTC (rev 139) +++ maya/trunk/maya_wrapper/src_aux/mglobal.cpp 2006-10-19 15:34:46 UTC (rev 140) @@ -24,7 +24,9 @@ Additional methods for the MGlobal class. */ +#include <maya/MCommandMessage.h> #include "mglobal.h" +#include <iostream> namespace pyMGlobal { @@ -32,6 +34,35 @@ using boost::python::list; using boost::python::make_tuple; +/** + Callback for the "command output" event. + + The clientData must be a pointer to a MString object that contains + the current error message. The new message will be appended to that + string. + + This function is used in the executeCommandPy() wrapper function. + + \param msg MEL message + \param msgType The type of the message + \param clientdata A pointer to the MString instance that stores the final error message + */ +void commandOutputCallback(const MString& msg, MCommandMessage::MessageType msgType, void* clientdata) +{ + // Ignore everything but error messages... + if (msgType!=MCommandMessage::kError) + return; + + // Append the error message to the error string + MString& errmsg = *((MString*)clientdata); + if (errmsg!="") + errmsg += "\n"; + errmsg += msg; +} + +/** + A more "Pythonic" executeCommand() wrapper +*/ object executeCommandPy(const char* command, bool displayEnabled, bool undoEnabled) { MCommandResult result; @@ -46,11 +77,19 @@ MStringArray sa; MVectorArray va; - // Execute the MEL command + // Execute the MEL command and capture any error message + MString errmsg; + MCallbackId cbid = MCommandMessage::addCommandOutputCallback(commandOutputCallback, &errmsg, NULL); MStatus stat = MGlobal::executeCommand(MString(command), result, displayEnabled, undoEnabled); + MCommandMessage::removeCallback(cbid); if (!stat) { - MString msg("An error has occurred while executing the following MEL command:\n\n "+MString(command)+"\n\n(see the script editor for details).\nError string: \""+stat.errorString()+"\"."); + MString msg("An error has occurred while executing the following MEL command:\n\n "); + msg += command; + msg += "\n\nMEL error message:\n\n"; + msg += errmsg; + msg += "\n\nC++ error status: \""+stat.errorString()+"\"\n"; + msg += "(check the script editor for more details)."; throw EMELError(std::string(msg.asChar())); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |