def create_new_component(
        self,
        component_name: str,
        description: str,
        nx_class: str,
        pixel_data: PixelData,
    ):
        """
        Creates a new component.
        :param component_name: The name of the component.
        :param description: The component description.
        :param nx_class: The component class.
        :param pixel_data: The PixelData for the component. Will be None if it was not given of if the component type
            doesn't have pixel-related fields.
        :return: The geometry object.
        """
        component = self.instrument.create_component(
            component_name, nx_class, description
        )
        self.generate_geometry_model(component, pixel_data)

        self.write_pixel_data_to_component(component, nx_class, pixel_data)

        add_fields_to_component(component, self.fieldsListWidget)
        self.component_model.add_component(component)

        component_with_geometry = create_component(
            self.instrument.nexus, component.group
        )
        return component_with_geometry.shape
def test_GIVEN_single_scalar_field_and_string_WHEN_adding_fields_to_component_THEN_field_appears_in_component_fields_with_correct_name_and_value():
    file = NexusWrapper("test_fields_2")

    component_group = file.nexus_file.create_group("test_component")
    component = Component(file, component_group)

    field_name = "test_field"
    field_value = np.string_(b"some_value")
    field = DummyField(field_name, field_value, field_value.dtype)

    list_widget = DummyListWidget()
    list_widget.addItem(field)

    add_fields_to_component(component, list_widget)

    assert component.get_field(field_name)
    assert bytes(component.get_field(field_name), encoding="ASCII") == field_value
def test_GIVEN_single_scalar_field_and_float_WHEN_adding_fields_to_component_THEN_field_appears_in_component_fields_with_correct_name_and_value(
    nexus_wrapper, ):

    component_group = nexus_wrapper.nexus_file.create_group("test_component")
    component = Component(nexus_wrapper, component_group)

    field_name = "test_field"
    field_dtype = np.float32
    field_value = field_dtype(32.123)

    field = DummyField(field_name, field_value, field_dtype)

    list_widget = DummyListWidget()
    list_widget.addItem(field)

    add_fields_to_component(component, list_widget)

    assert component.get_field(field_name)
    assert component.get_field(field_name).dtype == field_dtype
    assert component.get_field(field_name)[...] == field_value
    def edit_existing_component(
        self,
        component_name: str,
        description: str,
        nx_class: str,
        pixel_data: PixelData,
    ):
        """
        Edits an existing component.
        :param component_name: The component name.
        :param description: The component description.
        :param nx_class: The component class.
        :param pixel_data: The component PixelData. Can be None.
        :return: The geometry object.
        """
        # remove the previous object from the qt3d view
        if not isinstance(self.component_to_edit.shape[0], NoShapeGeometry):
            self.parent().sceneWidget.delete_component(self.component_to_edit.name)

        # remove previous fields
        for field_group in self.component_to_edit.group.values():
            if get_name_of_node(field_group) not in INVALID_FIELD_NAMES:
                del self.instrument.nexus.nexus_file[field_group.name]

        self.component_to_edit.name = component_name
        self.component_to_edit.nx_class = nx_class
        self.component_to_edit.description = description

        self.write_pixel_data_to_component(self.component_to_edit, nx_class, pixel_data)

        add_fields_to_component(self.component_to_edit, self.fieldsListWidget)
        self.generate_geometry_model(self.component_to_edit, pixel_data)
        component_with_geometry = create_component(
            self.instrument.nexus, self.component_to_edit.group
        )
        return component_with_geometry.shape