From 5904d3540dc9daa9d9235089037a8f7378097554 Mon Sep 17 00:00:00 2001 From: John Haddon Date: Fri, 23 Aug 2024 17:00:27 +0100 Subject: [PATCH] CreateViews clients : Don't violate ArrayPlug constraints --- python/GafferImageTest/AnaglyphTest.py | 5 ++- python/GafferImageTest/CatalogueTest.py | 5 ++- .../GafferImageTest/ContactSheetCoreTest.py | 3 +- python/GafferImageTest/CopyViewsTest.py | 5 ++- python/GafferImageTest/CreateViewsTest.py | 38 +++++++++++++++---- python/GafferImageTest/DeleteViewsTest.py | 7 ++-- python/GafferImageTest/FormatQueryTest.py | 5 ++- python/GafferImageTest/ImageSamplerTest.py | 5 ++- python/GafferImageTest/ImageStatsTest.py | 5 ++- python/GafferImageTest/ImageTestCase.py | 5 ++- python/GafferImageTest/MergeTest.py | 10 +++-- python/GafferImageTest/SelectViewTest.py | 7 ++-- python/GafferImageUI/CreateViewsUI.py | 6 +-- 13 files changed, 71 insertions(+), 35 deletions(-) diff --git a/python/GafferImageTest/AnaglyphTest.py b/python/GafferImageTest/AnaglyphTest.py index 7421460328a..f001c76addb 100644 --- a/python/GafferImageTest/AnaglyphTest.py +++ b/python/GafferImageTest/AnaglyphTest.py @@ -67,10 +67,11 @@ def test( self ) : right['transform']['translate'].setValue( imath.V2f( 10, 0 ) ) createViews = GafferImage.CreateViews() - createViews["views"].addChild( Gaffer.NameValuePlug( "left", GafferImage.ImagePlug(), True, "view0", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) - createViews["views"].addChild( Gaffer.NameValuePlug( "right", GafferImage.ImagePlug(), True, "view1", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) + createViews["views"].resize( 2 ) createViews["views"][0]["value"].setInput( left["out"] ) + createViews["views"][0]["name"].setValue( "left" ) createViews["views"][1]["value"].setInput( right["out"] ) + createViews["views"][1]["name"].setValue( "right" ) anaglyph = GafferImage.Anaglyph() anaglyph["in"].setInput( createViews["out"] ) diff --git a/python/GafferImageTest/CatalogueTest.py b/python/GafferImageTest/CatalogueTest.py index 01c791d0ac2..d71b5151237 100644 --- a/python/GafferImageTest/CatalogueTest.py +++ b/python/GafferImageTest/CatalogueTest.py @@ -917,10 +917,11 @@ def testGenerateFileName( self ): # Check that two multi-view images match only if all views are identical createViews = GafferImage.CreateViews() - createViews["views"].addChild( Gaffer.NameValuePlug( "left", GafferImage.ImagePlug(), True, "view0", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) - createViews["views"].addChild( Gaffer.NameValuePlug( "right", GafferImage.ImagePlug(), True, "view1", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) + createViews["views"].resize( 2 ) createViews["views"][0]["value"].setInput( constant1["out"] ) + createViews["views"][0]["name"].setValue( "left" ) createViews["views"][1]["value"].setInput( constant2["out"] ) + createViews["views"][1]["name"].setValue( "right" ) f3 = catalogue.generateFileName( createViews["out"] ) self.assertNotIn( f3, [f1, f2] ) diff --git a/python/GafferImageTest/ContactSheetCoreTest.py b/python/GafferImageTest/ContactSheetCoreTest.py index 479ba9f81ce..80d889f4863 100644 --- a/python/GafferImageTest/ContactSheetCoreTest.py +++ b/python/GafferImageTest/ContactSheetCoreTest.py @@ -124,8 +124,9 @@ def testNoInvalidViewAccesses( self ) : checker = GafferImage.Checkerboard() createViews = GafferImage.CreateViews() - createViews["views"].addChild( Gaffer.NameValuePlug( "left", GafferImage.ImagePlug(), True, "left", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) + createViews["views"].resize( 1 ) createViews["views"][0]["value"].setInput( checker["out"] ) + createViews["views"][0]["name"].setValue( "left" ) self.assertEqual( createViews["out"].viewNames(), IECore.StringVectorData( [ "left" ] ) ) contactSheet = GafferImage.ContactSheetCore() diff --git a/python/GafferImageTest/CopyViewsTest.py b/python/GafferImageTest/CopyViewsTest.py index f48ceecf9bf..78e518a4103 100644 --- a/python/GafferImageTest/CopyViewsTest.py +++ b/python/GafferImageTest/CopyViewsTest.py @@ -66,8 +66,9 @@ def test( self ) : name = "source%iview%i" % ( i, j ) createViews[i].addChild( constant ) - createViews[i]["views"].addChild( Gaffer.NameValuePlug( name, GafferImage.ImagePlug(), True, "view0", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) - createViews[i]["views"][-1]["value"].setInput( constant["out"] ) + view = createViews[i]["views"].next() + view["name"].setValue( name ) + view["value"].setInput( constant["out"] ) copyViews = GafferImage.CopyViews() copyViews["in"][0].setInput( createViews[0]["out"] ) diff --git a/python/GafferImageTest/CreateViewsTest.py b/python/GafferImageTest/CreateViewsTest.py index 820f0a4173c..d6db37a61fc 100644 --- a/python/GafferImageTest/CreateViewsTest.py +++ b/python/GafferImageTest/CreateViewsTest.py @@ -37,6 +37,7 @@ import unittest import imath import inspect +import pathlib import IECore @@ -56,8 +57,9 @@ def test( self ) : script.addChild( createViews ) # Default views added by the UI - createViews["views"].addChild( Gaffer.NameValuePlug( "left", GafferImage.ImagePlug(), True, "view0", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) - createViews["views"].addChild( Gaffer.NameValuePlug( "right", GafferImage.ImagePlug(), True, "view1", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) + createViews["views"].resize( 2 ) + createViews["views"][0]["name"].setValue( "left" ) + createViews["views"][1]["name"].setValue( "right" ) reader = GafferImage.ImageReader() script.addChild( reader ) @@ -91,9 +93,9 @@ def test( self ) : self.assertImagesEqual( createViews["out"], deserialise["CreateViews"]["out"] ) - createViews["views"].addChild( Gaffer.NameValuePlug( "custom", GafferImage.ImagePlug(), True, "view1", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) - createViews["views"]["view2"]["name"].setValue( "blah" ) - createViews["views"]["view2"]["value"].setInput( constant2["out"] ) + createViews["views"].resize( 3 ) + createViews["views"][2]["name"].setValue( "blah" ) + createViews["views"][2]["value"].setInput( constant2["out"] ) self.assertEqual( createViews["out"].viewNames(), IECore.StringVectorData( [ "left", "right", "blah" ] ) ) self.assertEqual( @@ -192,8 +194,9 @@ def testInputToExpressionDrivingEnabledPlug( self ) : # `default` view with RGBA channels, and `notDefault` view with no channels script["createViews"] = GafferImage.CreateViews() - script["createViews"]["views"].addChild( Gaffer.NameValuePlug( "default", GafferImage.ImagePlug(), True, "view0", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) - script["createViews"]["views"].addChild( Gaffer.NameValuePlug( "notDefault", GafferImage.ImagePlug(), True, "view1", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) + script["createViews"]["views"].resize( 2 ) + script["createViews"]["views"][0]["name"].setValue( "default" ) + script["createViews"]["views"][1]["name"].setValue( "notDefault" ) script["createViews"]["views"][0]["value"].setInput( script["checkerboard"]["out"] ) self.assertEqual( script["createViews"]["out"].channelNames( "default" ), IECore.StringVectorData( [ "R", "G", "B", "A" ] ) ) self.assertEqual( script["createViews"]["out"].channelNames( "notDefault" ), IECore.StringVectorData() ) @@ -228,5 +231,26 @@ def testNoRedundantSerialisation( self ) : script["createViews"] = GafferImage.CreateViews() self.assertNotIn( "setInput", script.serialise() ) + def testLoadFromVersion1_4( self ) : + + script = Gaffer.ScriptNode() + script["fileName"].setValue( pathlib.Path( __file__ ).parent / "scripts" / "createViews-1.4.10.0.gfr" ) + script.load() + + def assertLoadedOK( script ) : + + self.assertEqual( len( script["CreateViews"]["views"] ), 2 ) + self.assertEqual( script["CreateViews"]["views"][0]["name"].getValue(), "left" ) + self.assertEqual( script["CreateViews"]["views"][1]["name"].getValue(), "right" ) + self.assertEqual( script["CreateViews"]["views"][0]["value"].getInput(), script["CheckerboardLeft"]["out"] ) + self.assertEqual( script["CreateViews"]["views"][1]["value"].getInput(), script["CheckerboardRight"]["out"] ) + + assertLoadedOK( script ) + + script2 = Gaffer.ScriptNode() + script2.execute( script.serialise() ) + + assertLoadedOK( script2 ) + if __name__ == "__main__": unittest.main() diff --git a/python/GafferImageTest/DeleteViewsTest.py b/python/GafferImageTest/DeleteViewsTest.py index 45b69ff975e..db9fd39f7a8 100644 --- a/python/GafferImageTest/DeleteViewsTest.py +++ b/python/GafferImageTest/DeleteViewsTest.py @@ -63,9 +63,10 @@ def test( self ) : createViews = GafferImage.CreateViews() - createViews["views"].addChild( Gaffer.NameValuePlug( "left", GafferImage.ImagePlug(), True, "view0", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) - createViews["views"].addChild( Gaffer.NameValuePlug( "right", GafferImage.ImagePlug(), True, "view1", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) - createViews["views"].addChild( Gaffer.NameValuePlug( "default", GafferImage.ImagePlug(), True, "view2", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) + createViews["views"].resize( 3 ) + createViews["views"][0]["name"].setValue( "left" ) + createViews["views"][1]["name"].setValue( "right" ) + createViews["views"][2]["name"].setValue( "default" ) createViews["views"]["view0"]["value"].setInput( reader["out"] ) createViews["views"]["view1"]["value"].setInput( constant1["out"] ) diff --git a/python/GafferImageTest/FormatQueryTest.py b/python/GafferImageTest/FormatQueryTest.py index 074ea7710c6..c64a0e96c47 100644 --- a/python/GafferImageTest/FormatQueryTest.py +++ b/python/GafferImageTest/FormatQueryTest.py @@ -99,8 +99,9 @@ def testView( self ) : reader["fileName"].setValue( self.imagesPath() / "checkerboard.100x100.exr" ) views = GafferImage.CreateViews() - views["views"].addChild( Gaffer.NameValuePlug( "left", GafferImage.ImagePlug(), True ) ) - views["views"].addChild( Gaffer.NameValuePlug( "right", GafferImage.ImagePlug(), True ) ) + views["views"].resize( 2 ) + views["views"][0]["name"].setValue( "left" ) + views["views"][1]["name"].setValue( "right" ) views["views"][0]["value"].setInput( constantSource["out"] ) views["views"][1]["value"].setInput( reader["out"] ) diff --git a/python/GafferImageTest/ImageSamplerTest.py b/python/GafferImageTest/ImageSamplerTest.py index fe987ffef71..9a2dd71c8f6 100644 --- a/python/GafferImageTest/ImageSamplerTest.py +++ b/python/GafferImageTest/ImageSamplerTest.py @@ -132,8 +132,9 @@ def testView( self ) : reader["fileName"].setValue( self.imagesPath() / "blueWithDataWindow.100x100.exr" ) views = GafferImage.CreateViews() - views["views"].addChild( Gaffer.NameValuePlug( "left", GafferImage.ImagePlug(), True ) ) - views["views"].addChild( Gaffer.NameValuePlug( "right", GafferImage.ImagePlug(), True ) ) + views["views"].resize( 2 ) + views["views"][0]["name"].setValue( "left" ) + views["views"][1]["name"].setValue( "right" ) views["views"][0]["value"].setInput( constantSource["out"] ) views["views"][1]["value"].setInput( reader["out"] ) diff --git a/python/GafferImageTest/ImageStatsTest.py b/python/GafferImageTest/ImageStatsTest.py index cf5b105e569..68b618b15e1 100644 --- a/python/GafferImageTest/ImageStatsTest.py +++ b/python/GafferImageTest/ImageStatsTest.py @@ -310,8 +310,9 @@ def testView( self ) : reader["fileName"].setValue( self.__rgbFilePath ) views = GafferImage.CreateViews() - views["views"].addChild( Gaffer.NameValuePlug( "left", GafferImage.ImagePlug(), True ) ) - views["views"].addChild( Gaffer.NameValuePlug( "right", GafferImage.ImagePlug(), True ) ) + views["views"].resize( 2 ) + views["views"][0]["name"].setValue( "left" ) + views["views"][1]["name"].setValue( "right" ) views["views"][0]["value"].setInput( constantSource["out"] ) views["views"][1]["value"].setInput( reader["out"] ) diff --git a/python/GafferImageTest/ImageTestCase.py b/python/GafferImageTest/ImageTestCase.py index 84ffb91bb53..d5018a110fb 100644 --- a/python/GafferImageTest/ImageTestCase.py +++ b/python/GafferImageTest/ImageTestCase.py @@ -240,8 +240,9 @@ def channelTestImage( self ) : def channelTestImageMultiView( self ) : channelTestImageMultiView = GafferImage.CreateViews() - channelTestImageMultiView["views"].addChild( Gaffer.NameValuePlug( "left", GafferImage.ImagePlug(), True, "view0", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) - channelTestImageMultiView["views"].addChild( Gaffer.NameValuePlug( "right", GafferImage.ImagePlug(), True, "view1", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) + channelTestImageMultiView["views"].resize( 2 ) + channelTestImageMultiView["views"][0]["name"].setValue( "left" ) + channelTestImageMultiView["views"][1]["name"].setValue( "right" ) channelTestImageMultiView["TestImage"] = self.channelTestImage() diff --git a/python/GafferImageTest/MergeTest.py b/python/GafferImageTest/MergeTest.py index 92d84e19f07..317318872ee 100644 --- a/python/GafferImageTest/MergeTest.py +++ b/python/GafferImageTest/MergeTest.py @@ -859,14 +859,16 @@ def testMultiView( self ) : c4["format"]["displayWindow"].setValue( imath.Box2i( imath.V2i( 0 ), imath.V2i( 64 ) ) ) createViews1 = GafferImage.CreateViews() - createViews1["views"].addChild( Gaffer.NameValuePlug( "left", GafferImage.ImagePlug(), True, "view0", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) - createViews1["views"].addChild( Gaffer.NameValuePlug( "right", GafferImage.ImagePlug(), True, "view1", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) + createViews1["views"].resize( 2 ) + createViews1["views"][0]["name"].setValue( "left" ) + createViews1["views"][1]["name"].setValue( "right" ) createViews1["views"][0]["value"].setInput( c1["out"] ) createViews1["views"][1]["value"].setInput( c2["out"] ) createViews2 = GafferImage.CreateViews() - createViews2["views"].addChild( Gaffer.NameValuePlug( "left", GafferImage.ImagePlug(), True, "view0", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) - createViews2["views"].addChild( Gaffer.NameValuePlug( "right", GafferImage.ImagePlug(), True, "view1", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) + createViews2["views"].resize( 2 ) + createViews2["views"][0]["name"].setValue( "left" ) + createViews2["views"][1]["name"].setValue( "right" ) createViews2["views"][0]["value"].setInput( c3["out"] ) createViews2["views"][1]["value"].setInput( c4["out"] ) diff --git a/python/GafferImageTest/SelectViewTest.py b/python/GafferImageTest/SelectViewTest.py index f9eeda69836..575a1e183c9 100644 --- a/python/GafferImageTest/SelectViewTest.py +++ b/python/GafferImageTest/SelectViewTest.py @@ -63,9 +63,10 @@ def test( self ) : createViews = GafferImage.CreateViews() - createViews["views"].addChild( Gaffer.NameValuePlug( "left", GafferImage.ImagePlug(), True, "view0", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) - createViews["views"].addChild( Gaffer.NameValuePlug( "right", GafferImage.ImagePlug(), True, "view1", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) - createViews["views"].addChild( Gaffer.NameValuePlug( "default", GafferImage.ImagePlug(), True, "view2", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) + createViews["views"].resize( 3 ) + createViews["views"][0]["name"].setValue( "left" ) + createViews["views"][1]["name"].setValue( "right" ) + createViews["views"][2]["name"].setValue( "default" ) createViews["views"]["view0"]["value"].setInput( reader["out"] ) createViews["views"]["view1"]["value"].setInput( constant1["out"] ) diff --git a/python/GafferImageUI/CreateViewsUI.py b/python/GafferImageUI/CreateViewsUI.py index e611641e0cc..96b53d309db 100644 --- a/python/GafferImageUI/CreateViewsUI.py +++ b/python/GafferImageUI/CreateViewsUI.py @@ -43,9 +43,9 @@ # sets up the default "left" and "right" views def postCreate( node, menu ) : - node["views"].addChild( Gaffer.NameValuePlug( "left", GafferImage.ImagePlug(), True, "view0", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) - node["views"].addChild( Gaffer.NameValuePlug( "right", GafferImage.ImagePlug(), True, "view1", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) - + node["views"].resize( 2 ) + node["views"][0]["name"].setValue( "left" ) + node["views"][1]["name"].setValue( "right" ) Gaffer.Metadata.registerNode(