def put_image( self, pvname, image_array: np.ndarray = None, x_min: float = None, x_max: float = None, y_min: float = None, y_max: float = None, timeout: float = 1.0, ) -> None: """Assign the value of a image process variable. Allows updates to individual attributes. Args: pvname (str): Name of the process variable image_array (np.ndarray): Value to assing to process variable. x_min (float): Minimum x value x_max (float): Maximum x value y_min (float): Minimum y value y_max (float): Maximum y value timeout (float): Operation timeout in seconds """ self._set_up_pv_monitor(pvname) # allow no puts before a value has been collected registered = self.get_image(pvname) # if the value is registered if registered is not None: if self._protocol == "ca": if image_array is not None: self._pv_registry[f"{pvname}:ArrayData_RBV"]["pv"].put( image_array.flatten(), timeout=timeout) if x_min: self._pv_registry[f"{pvname}:MinX_RBV"]["pv"].put( x_min, timeout=timeout) if x_max: self._pv_registry[f"{pvname}:MaxX_RBV"]["pv"].put( x_max, timeout=timeout) if y_min: self._pv_registry[f"{pvname}:MinY_RBV"]["pv"].put( y_min, timeout=timeout) if y_max: self._pv_registry[f"{pvname}:MaxY_RBV"]["pv"].put( y_max, timeout=timeout) elif self._protocol == "pva": # compose normative type pv = self._pv_registry[pvname] pv_array = pv["value"] if image_array: image_array.attrib = pv_array.attrib else: image_array = pv_array if x_min: image_array.attrib.x_min = x_min if x_max: image_array.attrib.x_max = x_max if y_min: image_array.attrib.y_min = y_min if y_max: image_array.attrib.y_max = y_max self._context.put(pvname, image_array, throw=False, timeout=timeout) else: logger.debug(f"No initial value set for {pvname}.")