Skip to content

Commit

Permalink
CreateViews clients : Don't violate ArrayPlug constraints
Browse files Browse the repository at this point in the history
  • Loading branch information
johnhaddon committed Aug 27, 2024
1 parent 24d6d93 commit 5904d35
Show file tree
Hide file tree
Showing 13 changed files with 71 additions and 35 deletions.
5 changes: 3 additions & 2 deletions python/GafferImageTest/AnaglyphTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"] )
Expand Down
5 changes: 3 additions & 2 deletions python/GafferImageTest/CatalogueTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -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] )
Expand Down
3 changes: 2 additions & 1 deletion python/GafferImageTest/ContactSheetCoreTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
5 changes: 3 additions & 2 deletions python/GafferImageTest/CopyViewsTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"] )
Expand Down
38 changes: 31 additions & 7 deletions python/GafferImageTest/CreateViewsTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import unittest
import imath
import inspect
import pathlib

import IECore

Expand All @@ -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 )
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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() )
Expand Down Expand Up @@ -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()
7 changes: 4 additions & 3 deletions python/GafferImageTest/DeleteViewsTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"] )
Expand Down
5 changes: 3 additions & 2 deletions python/GafferImageTest/FormatQueryTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"] )

Expand Down
5 changes: 3 additions & 2 deletions python/GafferImageTest/ImageSamplerTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"] )

Expand Down
5 changes: 3 additions & 2 deletions python/GafferImageTest/ImageStatsTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"] )

Expand Down
5 changes: 3 additions & 2 deletions python/GafferImageTest/ImageTestCase.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand Down
10 changes: 6 additions & 4 deletions python/GafferImageTest/MergeTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"] )

Expand Down
7 changes: 4 additions & 3 deletions python/GafferImageTest/SelectViewTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"] )
Expand Down
6 changes: 3 additions & 3 deletions python/GafferImageUI/CreateViewsUI.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(

Expand Down

0 comments on commit 5904d35

Please sign in to comment.