def test_vtkvol_pane_from_image_data(document, comm):
    image_data = make_image_data()
    pane = VTKVolume(image_data)
    from operator import eq
    # Create pane
    model = pane.get_root(document, comm=comm)
    assert isinstance(model, VTKVolumePlot)
    assert pane._models[model.ref['id']][0] is model
    assert all([
        eq(getattr(pane, k), getattr(model, k))
        for k in ['slice_i', 'slice_j', 'slice_k']
    ])
    # Cleanup
    pane._cleanup(model)
    assert pane._models == {}
def test_vtk_pane_volume_from_np_array(document, comm):
    pane = VTKVolume(np.ones((10, 10, 10)))
    from operator import eq
    # Create pane
    model = pane.get_root(document, comm=comm)
    assert isinstance(model, VTKVolumePlot)
    assert pane._models[model.ref['id']][0] is model
    assert np.all(
        np.frombuffer(base64.b64decode(model.data['buffer'].encode())) == 1)
    assert all([
        eq(getattr(pane, k), getattr(model, k))
        for k in ['slice_i', 'slice_j', 'slice_k']
    ])

    # Test update data
    pane.object = 2 * np.ones((10, 10, 10))
    assert np.all(
        np.frombuffer(base64.b64decode(model.data['buffer'].encode())) == 2)

    # Cleanup
    pane._cleanup(model)
    assert pane._models == {}
def test_vtkvol_serialization_coherence(document, comm):
    from vtk.util import numpy_support

    data_matrix = np.zeros([50, 75, 100], dtype=np.uint8)
    data_matrix[0:35, 0:35, 0:35] = 50
    data_matrix[25:50, 25:55, 25:55] = 100
    data_matrix[45:50, 45:74, 45:100] = 150

    origin = (0, 10, 20)
    spacing = (3, 2, 1)

    data_matrix_c = np.ascontiguousarray(data_matrix)
    data_matrix_f = np.asfortranarray(data_matrix)
    image_data = vtk.vtkImageData()
    image_data.SetDimensions(*data_matrix.shape)
    image_data.SetOrigin(*origin)
    image_data.SetSpacing(*spacing)
    vtk_arr = numpy_support.numpy_to_vtk(data_matrix.ravel(order='F'))
    image_data.GetPointData().SetScalars(vtk_arr)

    p_c = VTKVolume(data_matrix_c, origin=origin, spacing=spacing)
    p_f = VTKVolume(data_matrix_f, origin=origin, spacing=spacing)
    p_id = VTKVolume(image_data)
    assert p_c._sub_spacing == p_f._sub_spacing == p_id._sub_spacing == spacing
    vd_c = p_c._get_volume_data()
    vd_f = p_f._get_volume_data()
    vd_id = p_id._get_volume_data()
    data_decoded = np.frombuffer(base64.b64decode(vd_c["buffer"]),
                                 dtype=vd_c["dtype"]).reshape(vd_c["dims"],
                                                              order="F")
    assert np.alltrue(data_decoded == data_matrix)
    assert vd_id == vd_c == vd_f

    p_c_ds = VTKVolume(data_matrix_c,
                       origin=origin,
                       spacing=spacing,
                       max_data_size=0.1)
    p_f_ds = VTKVolume(data_matrix_f,
                       origin=origin,
                       spacing=spacing,
                       max_data_size=0.1)
    p_id_ds = VTKVolume(image_data, max_data_size=0.1)
    assert p_c_ds._sub_spacing == p_f_ds._sub_spacing == p_id_ds._sub_spacing != spacing
    vd_c_ds = p_c_ds._get_volume_data()
    vd_f_ds = p_f_ds._get_volume_data()
    vd_id_ds = p_id_ds._get_volume_data()
    assert vd_id_ds == vd_c_ds == vd_f_ds
def test_vtkvol_pane_from_np_array(document, comm):
    # Test empty initialisation
    pane = VTKVolume()
    model = pane.get_root(document, comm=comm)

    pane.object = np.ones((10, 10, 10))
    from operator import eq
    # Create pane
    assert isinstance(model, VTKVolumePlot)
    assert pane._models[model.ref['id']][0] is model
    assert np.all(
        np.frombuffer(base64.b64decode(model.data['buffer'].encode())) == 1)
    assert all([
        eq(getattr(pane, k), getattr(model, k))
        for k in ['slice_i', 'slice_j', 'slice_k']
    ])

    # Test update data
    pane.object = 2 * np.ones((10, 10, 10))
    assert np.all(
        np.frombuffer(base64.b64decode(model.data['buffer'].encode())) == 2)

    # Test size limitation of date sent
    pane.max_data_size = 0.1  # limit data size to 0.1MB
    # with uint8
    data = (255 * np.random.rand(50, 50, 50)).astype(np.uint8)
    assert data.nbytes / 1e6 > 0.1
    pane.object = data
    data_model = np.frombuffer(base64.b64decode(model.data['buffer'].encode()))
    assert data_model.nbytes / 1e6 <= 0.1
    # with float64
    data = np.random.rand(50, 50, 50)
    assert data.nbytes / 1e6 > 0.1
    pane.object = data
    data_model = np.frombuffer(base64.b64decode(model.data['buffer'].encode()),
                               dtype=np.float64)
    assert data_model.nbytes / 1e6 <= 0.1

    # Test conversion of the slice_i number with subsample array
    param = pane._process_property_change(
        {'slice_i': (np.cbrt(data_model.size) - 1) // 2})
    assert param == {'slice_i': (50 - 1) // 2}

    # Cleanup
    pane._cleanup(model)
    assert pane._models == {}