[Maya-Python] Can't read worldMatrix of custom Python API 2.0 node

260 views
Skip to first unread message

Marcus Ottosson

unread,
Dec 4, 2018, 1:33:49 AM12/4/18
to python_in...@googlegroups.com

Hi all,
I’ve been writing custom nodes in 1.0 and recently transitioned into 2.0, but found that one of the commands or methods of retrieving a matrix MPlug no longer works, returning a Unexpected Internal Failure, which isn’t very descriptive. I’m hoping you can help me spot what needs to change in order for this to work.

To reproduce:

  1. Save the below to myplugin.py
  2. Run the attached example

Any ideas?

Best,
Marcus

"""Can't read worldMatrix of custom node

Example:
    from maya import cmds
    from maya.api import OpenMaya as om

    cmds.loadPlugin(r"c:\path\to\myplugin.py")

    fn = om.MFnDagNode()
    parent = fn.create("transform", "myTransform")
    mobj = fn.create("myLocator", "myLoc", parent)
    plug = fn.findPlug("worldMatrix", False)
    plug = plug.elementByLogicalIndex(0)
    om.MFnMatrixData(plug.asMObject()).matrix()
    # RuntimeError: (kFailure): Unexpected Internal Failure

"""

from maya.api import OpenMaya as om, OpenMayaUI as omui

class MyLocator(omui.MPxLocatorNode):
    name = "myLocator"
    typeid = om.MTypeId(0x999999)
    classification = "drawdb/geometry/custom"

    @classmethod
    def creator(cls):
        return cls()

    @classmethod
    def init(cls):
        pass

maya_useNewAPI = True

def initializePlugin(obj):
    plugin = om.MFnPlugin(obj, "MyPlugin", "1.0", "Any")

    plugin.registerNode(MyLocator.name,
                        MyLocator.typeid,
                        MyLocator.creator,
                        MyLocator.init,
                        om.MPxNode.kLocatorNode,
                        MyLocator.classification)

def uninitializePlugin(obj):
    om.MFnPlugin(obj).deregisterNode(MyLocator.typeid)

Tim Fowler

unread,
Dec 4, 2018, 9:14:48 AM12/4/18
to python_in...@googlegroups.com
Not sure what you're hitting.  That last line gives me...

om.MFnMatrixData(plug.asMObject()).matrix()
# Result: maya.api.OpenMaya.MMatrix(((1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1))) # 

--
You received this message because you are subscribed to the Google Groups "Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email to python_inside_m...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/python_inside_maya/CAFRtmODD_ZfxdBAxxQcrV%3DqDdsUB8isoiL1opm6ubD7f7acv9w%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Marcus Ottosson

unread,
Dec 4, 2018, 9:26:52 AM12/4/18
to python_in...@googlegroups.com
Wuw! What version of Maya is that, and what OS? I'm on Windows, Maya 2018. Hadn't considered it might be a version or OS thing, will have a look at that.

Tim Fowler

unread,
Dec 4, 2018, 9:50:10 AM12/4/18
to python_in...@googlegroups.com
Hmm...looks like I tried that on an unreleased version of Maya (and a Debug version too).  Just tried again in Maya 2018 and got the same error as you.  I'll take a quick look and see if I can figure out what fixed it, but I should warn you that API fixes can sometimes be tricky to get into Updates since those typically have to remain binary compatible.

-Tim

Marcus Ottosson

unread,
Dec 4, 2018, 10:02:25 AM12/4/18
to python_in...@googlegroups.com
Mm, I'm looking to get a matrix out of Maya 2015 and above, so a patch would unfortunately not help me in this case. Do you know of another way of getting hold of that matrix?

--
You received this message because you are subscribed to the Google Groups "Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email to python_inside_m...@googlegroups.com.

Michael Boon

unread,
Dec 4, 2018, 4:25:43 PM12/4/18
to Python Programming for Autodesk Maya
Can you use fn.dagPath().inclusiveMatrix() ?

On Wednesday, 5 December 2018 02:02:25 UTC+11, Marcus Ottosson wrote:
Mm, I'm looking to get a matrix out of Maya 2015 and above, so a patch would unfortunately not help me in this case. Do you know of another way of getting hold of that matrix?

On Tue, 4 Dec 2018 at 14:50, Tim Fowler <tim.f...@gmail.com> wrote:
Hmm...looks like I tried that on an unreleased version of Maya (and a Debug version too).  Just tried again in Maya 2018 and got the same error as you.  I'll take a quick look and see if I can figure out what fixed it, but I should warn you that API fixes can sometimes be tricky to get into Updates since those typically have to remain binary compatible.

-Tim

On Tue, Dec 4, 2018 at 9:26 AM Marcus Ottosson <konstr...@gmail.com> wrote:
Wuw! What version of Maya is that, and what OS? I'm on Windows, Maya 2018. Hadn't considered it might be a version or OS thing, will have a look at that.

On Tue, 4 Dec 2018 at 14:14, Tim Fowler <tim.f...@gmail.com> wrote:
Not sure what you're hitting.  That last line gives me...

om.MFnMatrixData(plug.asMObject()).matrix()
# Result: maya.api.OpenMaya.MMatrix(((1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1))) # 

--
You received this message because you are subscribed to the Google Groups "Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email to python_inside_maya+unsub...@googlegroups.com.

Marcus Ottosson

unread,
Dec 7, 2018, 3:04:21 AM12/7/18
to python_in...@googlegroups.com
> Can you use fn.dagPath().inclusiveMatrix() ?

Yes! That looks very promising (for completeness, it was `getPath()` rather than `dagPath()`). I worked around it this time around, by getting the parent of any shape, and fetching it's matrix instead. Not as neat, so will experiment with your suggestion as well.

Thank you!

On Tue, 4 Dec 2018 at 21:25, Michael Boon <boon...@gmail.com> wrote:
Can you use fn.dagPath().inclusiveMatrix() ?

On Wednesday, 5 December 2018 02:02:25 UTC+11, Marcus Ottosson wrote:
Mm, I'm looking to get a matrix out of Maya 2015 and above, so a patch would unfortunately not help me in this case. Do you know of another way of getting hold of that matrix?

On Tue, 4 Dec 2018 at 14:50, Tim Fowler <tim.f...@gmail.com> wrote:
Hmm...looks like I tried that on an unreleased version of Maya (and a Debug version too).  Just tried again in Maya 2018 and got the same error as you.  I'll take a quick look and see if I can figure out what fixed it, but I should warn you that API fixes can sometimes be tricky to get into Updates since those typically have to remain binary compatible.

-Tim

On Tue, Dec 4, 2018 at 9:26 AM Marcus Ottosson <konstr...@gmail.com> wrote:
Wuw! What version of Maya is that, and what OS? I'm on Windows, Maya 2018. Hadn't considered it might be a version or OS thing, will have a look at that.

On Tue, 4 Dec 2018 at 14:14, Tim Fowler <tim.f...@gmail.com> wrote:
Not sure what you're hitting.  That last line gives me...

om.MFnMatrixData(plug.asMObject()).matrix()
# Result: maya.api.OpenMaya.MMatrix(((1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1))) # 

--
You received this message because you are subscribed to the Google Groups "Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email to python_inside_m...@googlegroups.com.

--
You received this message because you are subscribed to the Google Groups "Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email to python_inside_m...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/python_inside_maya/1100aff0-f149-4c2d-93e0-2c99af1e5912%40googlegroups.com.

Marcus Ottosson

unread,
Dec 27, 2018, 4:15:05 AM12/27/18
to python_in...@googlegroups.com
Back at this and, unlike an attribute query, turns out the `inclusiveMatrix` doesn't support being passed a `MDGContext`. That's a bummer, didn't realise I was so dependent on that.

The workaround has been working well. As it happens, it also enabled me to consolidate calls to matrices of each shape for a transform into a single call, saving on performance, which is particularly important in this case, as the calls I'm making are made each frame, in the range of 20-1,000 nodes, at all times on the timeline; not unlike a scene export.
Reply all
Reply to author
Forward
0 new messages