diff --git a/python/GafferTest/PlugAlgoTest.py b/python/GafferTest/PlugAlgoTest.py index db377f300a5..e3f2dd91fe2 100644 --- a/python/GafferTest/PlugAlgoTest.py +++ b/python/GafferTest/PlugAlgoTest.py @@ -1120,6 +1120,63 @@ def testSetTypedValueFromVectorData( self ) : self.assertFalse( Gaffer.PlugAlgo.setValueFromData( plug, data ) ) self.assertTrue( plug.isSetToDefault() ) + def testSetBoxValueFromVectorData( self ) : + + for plugType in [ + Gaffer.Box2fPlug, Gaffer.Box3fPlug, + Gaffer.Box2iPlug, Gaffer.Box3iPlug, + ] : + + with self.subTest( plugType = plugType ) : + + plug = plugType() + + minValue = plugType.PointType() + maxValue = plugType.PointType() + for i in range( 0, minValue.dimensions() ) : + minValue[i] = i + maxValue[i] = i + 1 + value = plugType.ValueType( minValue, maxValue ) + data = IECore.DataTraits.dataFromElement( [ value ] ) + + # Array length 1, can set + + self.assertTrue( Gaffer.PlugAlgo.canSetValueFromData( plug, data ) ) + self.assertTrue( plug.isSetToDefault() ) + self.assertTrue( Gaffer.PlugAlgo.setValueFromData( plug, data ) ) + self.assertEqual( plug.getValue(), value ) + self.assertFalse( plug.isSetToDefault() ) + + # And can set individual children + + plug.setToDefault() + for childPlug in plug : + for componentPlug in childPlug : + self.assertTrue( Gaffer.PlugAlgo.setValueFromData( plug, data ) ) + self.assertEqual( plug.getValue(), value ) + self.assertFalse( plug.isSetToDefault() ) + + # Array length 2, can't set + + data.append( data[0] ) + plug.setToDefault() + self.assertFalse( Gaffer.PlugAlgo.canSetValueFromData( plug, data ) ) + self.assertFalse( Gaffer.PlugAlgo.setValueFromData( plug, data ) ) + for childPlug in plug : + for componentPlug in childPlug : + self.assertFalse( Gaffer.PlugAlgo.setValueFromData( plug, data ) ) + self.assertTrue( plug.isSetToDefault() ) + + # Array length 0, can't set + + data.resize( 0 ) + self.assertFalse( Gaffer.PlugAlgo.canSetValueFromData( plug, data ) ) + self.assertFalse( Gaffer.PlugAlgo.setValueFromData( plug, data ) ) + for childPlug in plug : + for componentPlug in childPlug : + self.assertFalse( Gaffer.PlugAlgo.setValueFromData( plug, data ) ) + self.assertTrue( plug.isSetToDefault() ) + def testDependsOnCompute( self ) : add = GafferTest.AddNode() diff --git a/src/Gaffer/PlugAlgo.cpp b/src/Gaffer/PlugAlgo.cpp index c72cab9b31e..9bfc3ba3ebc 100644 --- a/src/Gaffer/PlugAlgo.cpp +++ b/src/Gaffer/PlugAlgo.cpp @@ -838,6 +838,16 @@ bool setBoxChildPlugValue( const PlugType *plug, typename PlugType::ChildType::C } } +template +bool setBoxChildPlugValueFromVectorData( const PlugType *plug, typename PlugType::ChildType::ChildType *child, const DataType *data ) +{ + if( data->readable().size() != 1 ) + { + return false; + } + return setBoxChildPlugValue( plug, child, data->readable()[0] ); +} + template bool setBoxPlugValue( const PlugType *plug, Gaffer::ValuePlug *leafPlug, const Data *value ) { @@ -852,6 +862,14 @@ bool setBoxPlugValue( const PlugType *plug, Gaffer::ValuePlug *leafPlug, const D return setBoxChildPlugValue( plug, typedPlug, static_cast( value )->readable() ); case Box2iDataTypeId : return setBoxChildPlugValue( plug, typedPlug, static_cast( value )->readable() ); + case Box3fVectorDataTypeId : + return setBoxChildPlugValueFromVectorData( plug, typedPlug, static_cast( value ) ); + case Box2fVectorDataTypeId : + return setBoxChildPlugValueFromVectorData( plug, typedPlug, static_cast( value ) ); + case Box3iVectorDataTypeId : + return setBoxChildPlugValueFromVectorData( plug, typedPlug, static_cast( value ) ); + case Box2iVectorDataTypeId : + return setBoxChildPlugValueFromVectorData( plug, typedPlug, static_cast( value ) ); default : return false; } @@ -1018,6 +1036,14 @@ bool canSetBoxPlugValue( const Data *value ) case Box3iDataTypeId : case Box2iDataTypeId : return true; + case Box3fVectorDataTypeId : + return static_cast( value )->readable().size() == 1; + case Box2fVectorDataTypeId : + return static_cast( value )->readable().size() == 1; + case Box3iVectorDataTypeId : + return static_cast( value )->readable().size() == 1; + case Box2iVectorDataTypeId : + return static_cast( value )->readable().size() == 1; default : return false; }