ID 422859 - Nuke crashes when exporting Transform (stabilize) and Transform (match-move) Transform nodes from a Tracker node

Follow

Problem summary
Nuke crashes when exporting Transform (stabilize) and Transform (match-move) Transform nodes from a Tracker4 node


All other exports don't crash Nuke


Customer reported version
nuke.12.0v4


Customer reported platform
centos8


Steps to reproduce


1) Open Nuke 12.0v4

2) Create a Tracker node

3) In the export options, select Transform (stabilize) or Transform (match-move), and press Export, Nuke crashes


Expected behaviour
For the expression linked transform 


Actual behaviour
Nuke Crashed 


Workaround
Create the Transform node and add the equivalent expressions into the knobs. This can be done manually, or by using the basic example code below:

Select the Tracker node, the run the below code to create a Transform (stabilize):

n = nuke.selectedNode()


if n.Class() == "Tracker4":

    t = nuke.nodes.Transform()

    t.setName("Transform_Stabilize1")

    t["translate"].setExpression("(!invert) ? Tracker1.translate.x : -Tracker1.translate.x".replace("Tracker1", n.name()), 0)

    t["translate"].setExpression("(!invert) ? Tracker1.translate.y : -Tracker1.translate.y".replace("Tracker1", n.name()), 1)

    t["rotate"].setExpression("(!invert) ? Tracker1.rotate : -Tracker1.rotate".replace("Tracker1", n.name()))

    t["scale"].setSingleValue(False)

    t["scale"].setExpression("(!invert) ? Tracker1.scale.w : 1/Tracker1.scale.w".replace("Tracker1", n.name()), 0)

    t["scale"].setExpression("(!invert) ? Tracker1.scale.h : 1/Tracker1.scale.h".replace("Tracker1", n.name()), 1)

    t["center"].setExpression("(!invert) ? Tracker1.center.x : Tracker1.center.x + Tracker1.translate.x".replace("Tracker1", n.name()), 0)

    t["center"].setExpression("(!invert) ? Tracker1.center.y : Tracker1.center.y + Tracker1.translate.y".replace("Tracker1", n.name()), 1)

    t["filter"].setExpression("Tracker1.filter".replace("Tracker1", n.name()))

    t.addKnob(nuke.Enumeration_Knob("transform", "transform", ["stabilize", "match-move"]))

    t.addKnob(nuke.Enumeration_Knob("src_transform", "src transform", ["none", "stabilize", "stabilize 1-pt", "match-move", "match-move 1-pt", "remove jitter"]))

    t["src_transform"].setExpression("Tracker1.transform".replace("Tracker1", n.name()))

    t.addKnob(nuke.Boolean_Knob("invert", "invert"))

    t["invert"].setFlag(nuke.ENDLINE)

    t["invert"].setExpression("[python -execlocal srcTransformKnob\\ =\\ nuke.thisNode()\\['src\\_transform'\\]\\nsrcTransformName\\ =\\ srcTransformKnob.enumName(int(srcTransformKnob.getValue()))\\ndestTransform\\ =\\ nuke.thisNode()\\['transform'\\].getValue()\\nsrcTransformIsStabilize\\ =\\ (srcTransformName.find('stabilize')==0\\ or\\ srcTransformName.find('remove\\ jitter')==0)\\ninvertDueToDestStabilize\\ =\\ (destTransform\\ ==\\ 0\\ and\\ not\\ srcTransformIsStabilize)\\ninvertDueToSrcStabilize\\ =\\ (destTransform\\ ==\\ 1\\ and\\ srcTransformIsStabilize)\\nret\\ =\\ (invertDueToDestStabilize\\ or\\ invertDueToSrcStabilize)]")


Select the Tracker node, the run the below code to create a Transform (match-move):

n = nuke.selectedNode()


if n.Class() == "Tracker4":

    t = nuke.nodes.Transform()

    t.setName("Transform_MatchMove1")

    t["translate"].setExpression("(!invert) ? Tracker1.translate.x : -Tracker1.translate.x".replace("Tracker1", n.name()), 0)

    t["translate"].setExpression("(!invert) ? Tracker1.translate.y : -Tracker1.translate.y".replace("Tracker1", n.name()), 1)

    t["rotate"].setExpression("(!invert) ? Tracker1.rotate : -Tracker1.rotate".replace("Tracker1", n.name()))

    t["scale"].setSingleValue(False)

    t["scale"].setExpression("(!invert) ? Tracker1.scale.w : 1/Tracker1.scale.w".replace("Tracker1", n.name()), 0)

    t["scale"].setExpression("(!invert) ? Tracker1.scale.h : 1/Tracker1.scale.h".replace("Tracker1", n.name()), 1)

    t["center"].setExpression("(!invert) ? Tracker1.center.x : Tracker1.center.x + Tracker1.translate.x".replace("Tracker1", n.name()), 0)

    t["center"].setExpression("(!invert) ? Tracker1.center.y : Tracker1.center.y + Tracker1.translate.y".replace("Tracker1", n.name()), 1)

    t["filter"].setExpression("Tracker1.filter".replace("Tracker1", n.name()))

    t.addKnob(nuke.Enumeration_Knob("transform", "transform", ["stabilize", "match-move"]))

    t["transform"].setValue("match-move")

    t.addKnob(nuke.Enumeration_Knob("src_transform", "src transform", ["none", "stabilize", "stabilize 1-pt", "match-move", "match-move 1-pt", "remove jitter"]))

    t["src_transform"].setExpression("Tracker1.transform".replace("Tracker1", n.name()))

    t.addKnob(nuke.Boolean_Knob("invert", "invert"))

    t["invert"].setFlag(nuke.ENDLINE)

    t["invert"].setExpression("[python -execlocal srcTransformKnob\\ =\\ nuke.thisNode()\\['src\\_transform'\\]\\nsrcTransformName\\ =\\ srcTransformKnob.enumName(int(srcTransformKnob.getValue()))\\ndestTransform\\ =\\ nuke.thisNode()\\['transform'\\].getValue()\\nsrcTransformIsStabilize\\ =\\ (srcTransformName.find('stabilize')==0\\ or\\ srcTransformName.find('remove\\ jitter')==0)\\ninvertDueToDestStabilize\\ =\\ (destTransform\\ ==\\ 0\\ and\\ not\\ srcTransformIsStabilize)\\ninvertDueToSrcStabilize\\ =\\ (destTransform\\ ==\\ 1\\ and\\ srcTransformIsStabilize)\\nret\\ =\\ (invertDueToDestStabilize\\ or\\ invertDueToSrcStabilize)]")



Reproduced by support
This bug has been reproduced in:

Nuke 12.0v4 - Windows 10, CentOS 7.7, macOS 10.13 - regression


Unable to reproduce bug in:
Nuke 12.0v3 - Windows 10, CentOS 7.7, macOS 10.13


Earliest version tested
Nuke 12.0v3 - This issue doesn't appear in this version and has regressed

    We're sorry to hear that

    Please tell us why