def __init__(self, ui, label: str, object, xy_property, unit="nm", multiplier=1E9): super().__init__(ui.create_row_widget()) stage_x_field = ui.create_line_edit_widget() stage_x_field.bind_text( Control2DBinding( object, xy_property, "x", Converter.PhysicalValueToStringConverter(unit, multiplier))) stage_y_field = ui.create_line_edit_widget() stage_y_field.bind_text( Control2DBinding( object, xy_property, "y", Converter.PhysicalValueToStringConverter(unit, multiplier))) row = self.content_widget row.add_spacing(8) row.add(ui.create_label_widget(label)) row.add_spacing(8) row.add(ui.create_label_widget(_("X"))) row.add_spacing(8) row.add(stage_x_field) row.add_spacing(8) row.add(ui.create_label_widget(_("Y"))) row.add_spacing(8) row.add(stage_y_field) row.add_spacing(8)
def __init__(self, source=None, source_property=None, target=None, target_property=None, *, parent=None): super().__init__("property-connection", parent=parent) self.define_property("source_uuid", converter=Converter.UuidToStringConverter()) self.define_property("source_property") self.define_property("target_uuid", converter=Converter.UuidToStringConverter()) self.define_property("target_property") # these are only set in persistent object context changed self.__source = None self.__target = None self.__binding = None self.__target_property_changed_listener = None self.__registration_listener = None # suppress messages while we're setting source or target self.__suppress = False # but setup if we were passed objects if source is not None: self.source_uuid = source.uuid if source_property: self.source_property = source_property if target is not None: self.target_uuid = target.uuid if target_property: self.target_property = target_property
def __init__(self, storage_system=None, storage_cache=None, *, auto_project: bool = True): super().__init__() self.define_root_context() self.define_type("profile") self.define_relationship("workspaces", WorkspaceLayout.factory) self.define_relationship("data_groups", DataGroup.data_group_factory) self.define_relationship("project_references", project_reference_factory, insert=self.__insert_project_reference, remove=self.__remove_project_reference) self.define_property("workspace_uuid", converter=Converter.UuidToStringConverter()) self.define_property( "data_item_references", dict(), hidden=True ) # map string key to data item, used for data acquisition channels self.define_property( "data_item_variables", dict(), hidden=True ) # map string key to data item, used for reference in scripts self.define_property("target_project_reference_uuid", converter=Converter.UuidToStringConverter(), changed=self.__property_changed) self.define_property("work_project_reference_uuid", converter=Converter.UuidToStringConverter(), changed=self.__property_changed) self.define_property("closed_items", list()) self.storage_system = storage_system or FileStorageSystem.MemoryPersistentStorageSystem( ) self.storage_system.load_properties() self.__work_project_reference: typing.Optional[ProjectReference] = None self.__target_project_reference: typing.Optional[ ProjectReference] = None self.storage_cache = storage_cache or Cache.DictStorageCache( ) # need to deallocate self.set_storage_system(self.storage_system) self.__document_model = None self.profile_context = None # helper object to produce the projects sequence oo = Observer.ObserverBuilder() oo.source(self).ordered_sequence_from_array("project_references").map( oo.x.prop("project")).filter(lambda x: x is not None).trampoline( self, "projects") self.__projects_observer = oo.make_observable() self.__is_read = False if auto_project: self.profile_context = MemoryProfileContext() project_reference = self.add_project_memory() self.work_project_reference_uuid = project_reference.uuid self.target_project_reference_uuid = project_reference.uuid
def __init__(self, ui: UserInterface.UserInterface, label: str, instrument: InstrumentDevice.Instrument, xy_property: str, unit: str = "nm", multiplier: float = 1E9) -> None: row_widget = ui.create_row_widget() super().__init__(row_widget) stage_x_field = ui.create_line_edit_widget() stage_x_field.bind_text( Control2DBinding( instrument, xy_property, "x", Converter.PhysicalValueToStringConverter(unit, multiplier))) stage_y_field = ui.create_line_edit_widget() stage_y_field.bind_text( Control2DBinding( instrument, xy_property, "y", Converter.PhysicalValueToStringConverter(unit, multiplier))) row_widget.add_spacing(8) row_widget.add(ui.create_label_widget(label)) row_widget.add_spacing(8) row_widget.add(ui.create_label_widget(_("X"))) row_widget.add_spacing(8) row_widget.add(stage_x_field) row_widget.add_spacing(8) row_widget.add(ui.create_label_widget(_("Y"))) row_widget.add_spacing(8) row_widget.add(stage_y_field) row_widget.add_spacing(8)
def __init__( self, storage_system: typing.Optional[ FileStorageSystem.PersistentStorageSystem] = None, storage_cache: typing.Optional[Cache.CacheLike] = None, *, profile_context: typing.Optional[ProfileContext] = None) -> None: super().__init__() self.__class__.count += 1 self.define_root_context() self.define_type("profile") self.define_property("last_project_reference", converter=Converter.UuidToStringConverter(), hidden=True) self.define_property("work_project_reference_uuid", converter=Converter.UuidToStringConverter(), hidden=True) self.define_property("closed_items", list(), hidden=True) self.define_property("script_items_updated", False, changed=self.__property_changed, hidden=True) self.define_relationship("project_references", project_reference_factory, insert=self.__insert_project_reference, remove=self.__remove_project_reference, hidden=True) self.define_relationship( "script_items", typing.cast( typing.Callable[[typing.Callable[[str], str]], typing.Optional[Persistence.PersistentObject]], script_item_factory), hidden=True) self.storage_system = storage_system or FileStorageSystem.MemoryPersistentStorageSystem( ) self.storage_system.load_properties() self.storage_cache: typing.Any = storage_cache or Cache.DictStorageCache( ) # need to deallocate self.set_storage_system(self.storage_system) self.profile_context = None # helper object to produce the projects sequence oo = Observer.ObserverBuilder() oo.source(typing.cast( Observer.ItemValue, self)).ordered_sequence_from_array("project_references").map( oo.x.prop("project")).filter( lambda x: x is not None).trampoline(self, "projects") self.__projects_observer = oo.make_observable() if profile_context: self.profile_context = profile_context self.add_project_memory()
def __init__(self, type: str): super().__init__() self.define_type(type) self.define_property("project_uuid", converter=Converter.UuidToStringConverter()) self.define_property("last_used", None, converter=Converter.DatetimeToStringConverter()) self.__has_project_info_been_read = False self.__project_version = None self.__project_state = "invalid" self.__document_model: typing.Optional[ DocumentModel.DocumentModel] = None self.__document_model_about_to_close_listener = None self.storage_cache = None
def __init__(self, type: str) -> None: super().__init__() self.define_type(type) self.define_property("project_uuid", converter=Converter.UuidToStringConverter(), hidden=True) self.define_property("last_used", None, converter=Converter.DatetimeToStringConverter(), hidden=True) self.__has_project_info_been_read = False self.__project_version: typing.Optional[int] = None self.__project_state = "invalid" self.__document_model: typing.Optional[ DocumentModel.DocumentModel] = None self.storage_cache: typing.Optional[Cache.CacheLike] = None
def scan_width_changed(text: str) -> None: scan_width = Converter.IntegerToStringConverter().convert_back(text) if text else 1 scan_width = max(scan_width, 1) if scan_width != self.__scan_width: self.__scan_width = scan_width update_context() self.__scan_width_widget.request_refocus()
def get_float(self, prompt: str, default_value: float = 0, format_str: str = None) -> float: converter = Converter.FloatToStringConverter(format_str) result = self.get_string(prompt, converter.convert(default_value)) return converter.convert_back(result)
def __init__(self, expression: str = None): super().__init__() self.__container_weak_ref = None self.about_to_be_removed_event = Event.Event() self.about_to_cascade_delete_event = Event.Event() self._about_to_be_removed = False self._closed = False self.define_type("computation") self.define_property("source_uuid", converter=Converter.UuidToStringConverter()) self.define_property("original_expression", expression) self.define_property("error_text", hidden=True, changed=self.__error_changed) self.define_property("label", changed=self.__label_changed) self.define_property("processing_id") # see note above self.define_relationship("variables", variable_factory) self.define_relationship("results", result_factory) self.__source = None self.__variable_changed_event_listeners = dict() self.__variable_needs_rebind_event_listeners = dict() self.__result_needs_rebind_event_listeners = dict() self.last_evaluate_data_time = 0 self.needs_update = expression is not None self.computation_mutated_event = Event.Event() self.computation_output_changed_event = Event.Event() self.variable_inserted_event = Event.Event() self.variable_removed_event = Event.Event() self.is_initial_computation_complete = threading.Event( ) # helpful for waiting for initial computation self._evaluation_count_for_test = 0 self.target_output = None self._inputs = set( ) # used by document model for tracking dependencies self._outputs = set()
def __init__(self, container: typing.Any, mode: Mode) -> None: super().__init__() self.__model = container self.mode = mode self.title_label_widget: typing.Optional[UserInterface.LabelWidget] = None self.count_label_widget: typing.Optional[UserInterface.LabelWidget] = None self.balance_converter = Converter.IntegerToStringConverter()
def connect_scan_hardware_source(self, scan_hardware_source): self.__scan_width_model = Model.PropertyModel() self.__scan_height_model = Model.PropertyModel() scan_width_binding = Binding.PropertyBinding( self.__scan_width_model, "value", converter=Converter.IntegerToStringConverter()) scan_height_binding = Binding.PropertyBinding( self.__scan_height_model, "value", converter=Converter.IntegerToStringConverter()) def scan_profile_parameters_changed(profile_index, frame_parameters): if profile_index == 2: self.__scan_width_model.value = frame_parameters.size[1] self.__scan_height_model.value = frame_parameters.size[0] self.__scan_frame_parameters_changed_event_listener = scan_hardware_source.frame_parameters_changed_event.listen( scan_profile_parameters_changed) scan_profile_parameters_changed( 2, scan_hardware_source.get_frame_parameters(2)) def update_scan_width(scan_width): if scan_width > 0: frame_parameters = scan_hardware_source.get_frame_parameters(2) frame_parameters.size = frame_parameters.size[0], scan_width scan_hardware_source.set_frame_parameters(2, frame_parameters) self.__update_estimate() def update_scan_height(scan_height): if scan_height > 0: frame_parameters = scan_hardware_source.get_frame_parameters(2) frame_parameters.size = scan_height, frame_parameters.size[1] scan_hardware_source.set_frame_parameters(2, frame_parameters) self.__update_estimate() # only connect model to update hardware source after it has been initialized. self.__scan_width_model.on_value_changed = update_scan_width self.__scan_height_model.on_value_changed = update_scan_height self.__scan_width_widget._widget.bind_text( scan_width_binding) # the widget will close the binding self.__scan_height_widget._widget.bind_text( scan_height_binding) # the widget will close the binding
def __init__(self, display_item=None, line_profile=None, *, parent=None): super().__init__("interval-list-connection", parent=parent) self.define_property("source_uuid", converter=Converter.UuidToStringConverter()) self.define_property("target_uuid", converter=Converter.UuidToStringConverter()) # these are only set in persistent object context changed self.__source = display_item self.__target = line_profile self.__item_inserted_event_listener = None self.__item_removed_event_listener = None self.__interval_mutated_listeners = list() # but setup if we were passed objects if display_item is not None: self.source_uuid = display_item.uuid if line_profile is not None: self.target_uuid = line_profile.uuid
def test_float_to_scaled_integer_with_negative_min(self) -> None: converter = Converter.FloatToScaledIntegerConverter(1000, -100, 100) self.assertAlmostEqual(converter.convert(0) or 0, 500) self.assertAlmostEqual(converter.convert(-100) or 0, 0) self.assertAlmostEqual(converter.convert(100) or 0, 1000) self.assertAlmostEqual(converter.convert_back(converter.convert(0)) or 0.0, 0) self.assertAlmostEqual(converter.convert_back(converter.convert(-100)) or 0.0, -100) self.assertAlmostEqual(converter.convert_back(converter.convert(100)) or 0.0, 100)
def scan_count_changed(text: str) -> None: scan_count = Converter.IntegerToStringConverter().convert_back( text) or 1 scan_count = max(scan_count, 1) if scan_count != self.__scan_count: self.__scan_count = scan_count update_context() self.__scan_count_widget.request_refocus()
def __init__(self, ui, app=None): super().__init__(ui, app) # a text model to hold the label widget text text_model = Model.PropertyModel(0) # make bitmap_data (random static) for icon push button bitmap = numpy.zeros((32, 32, 4), numpy.uint8) bitmap[..., 0] = (numpy.random.randn(32, 32) * 255).astype( numpy.uint8) # blue bitmap[..., 1] = (numpy.random.randn(32, 32) * 255).astype( numpy.uint8) # green bitmap[..., 2] = (numpy.random.randn(32, 32) * 255).astype( numpy.uint8) # red bitmap[..., 3] = 255 bitmap_data = bitmap.view(numpy.uint32).reshape(bitmap.shape[:-1]) # create the widgets for the window label_widget = self.ui.create_label_widget() push_button_widget = self.ui.create_push_button_widget("Push Me") icon_button_widget = self.ui.create_push_button_widget() icon_button_widget.icon = bitmap_data # create a row for the buttons button_row = self.ui.create_row_widget() button_row.add_spacing(13) button_row.add(push_button_widget) button_row.add_spacing(13) button_row.add(icon_button_widget) button_row.add_stretch() # create a row for the label label_row = self.ui.create_row_widget() label_row.add_spacing(13) label_row.add(label_widget) label_row.add_stretch() # create a column to hold the two rows and attach it to the window content = self.ui.create_column_widget() content.add(button_row) content.add(label_row) self.attach_widget(content) # when either button is clicked, this will be called def button_clicked(): text_model.value = text_model.value + 1 # connect the buttons to the button_clicked function push_button_widget.on_clicked = button_clicked icon_button_widget.on_clicked = button_clicked # and bind the label txt to the 'value' property of the text_model, but attach an integer-to-string converter to it. label_widget.bind_text( Binding.PropertyBinding( text_model, "value", converter=Converter.IntegerToStringConverter( format="You have clicked {:d} times.")))
def build_value(type: str, value: typing.Any) -> typing.Any: if value is None: return None if type in (SET, ): return set(value) if type in (BOOLEAN, ): return bool(value) if type in (INT, ): return int(value) if type in (FLOAT, ): return float(value) if type in (TIMESTAMP, ): return Converter.DatetimeToStringConverter().convert_back(value) if type in (UUID, ): return Converter.UuidToStringConverter().convert_back(value) if type in (PATH, ): return Converter.PathToStringConverter().convert_back(value) return value
def __init__(self, type: str): super().__init__() self.define_type(type) self.define_property("project_uuid", converter=Converter.UuidToStringConverter()) self.define_property("is_active", False, changed=self.__property_changed) self.__project: typing.Optional[Project.Project] = None
def dict_value(type: str, value): if value is None: return None if type in (SET, ): return list(value) if type in (BOOLEAN, ): return bool(value) if type in (INT, ): return int(value) if type in (FLOAT, ): return float(value) if type in (TIMESTAMP): return Converter.DatetimeToStringConverter().convert(value) if type in (UUID): return Converter.UuidToStringConverter().convert(value) if type in (PATH): return Converter.PathToStringConverter().convert(value) return value
def dict_value(type: str, value: typing.Any) -> DictValue: if value is None: return None if type in (SET, ): return list(value) if type in (BOOLEAN, ): return bool(value) if type in (INT, ): return int(value) if type in (FLOAT, ): return float(value) if type in (TIMESTAMP, ): return Converter.DatetimeToStringConverter().convert(value) if type in (UUID, ): return Converter.UuidToStringConverter().convert(value) if type in (PATH, ): return Converter.PathToStringConverter().convert(value) return typing.cast(DictValue, value)
def secondary_specifier_uuid_str(self, value): converter = Converter.UuidToStringConverter() value = converter.convert(converter.convert_back(value)) if self.secondary_specifier_uuid_str != value and self.secondary_specifier: secondary_specifier = self.secondary_specifier if value: secondary_specifier["uuid"] = value else: secondary_specifier.pop("uuid", None) self.secondary_specifier = secondary_specifier
def __init__(self, storage_system: FileStorageSystem.ProjectStorageSystem): super().__init__() self.define_type("project") self.define_property("title", str()) self.define_relationship("data_items", data_item_factory, insert=self.__data_item_inserted, remove=self.__data_item_removed) self.define_relationship("display_items", display_item_factory, insert=self.__display_item_inserted, remove=self.__display_item_removed) self.define_relationship("computations", computation_factory, insert=self.__computation_inserted, remove=self.__computation_removed) self.define_relationship("data_structures", data_structure_factory, insert=self.__data_structure_inserted, remove=self.__data_structure_removed) self.define_relationship("connections", Connection.connection_factory, insert=self.__connection_inserted, remove=self.__connection_removed) self.define_relationship("data_groups", DataGroup.data_group_factory, insert=self.__data_group_inserted, remove=self.__data_group_removed) self.define_relationship("workspaces", WorkspaceLayout.factory) self.define_property("workspace_uuid", converter=Converter.UuidToStringConverter()) self.define_property( "data_item_references", dict(), hidden=True, changed=self.__property_changed ) # map string key to data item, used for data acquisition channels self.define_property( "mapped_items", list(), changed=self.__property_changed ) # list of item references, used for shortcut variables in scripts self.handle_start_read = None self.handle_insert_model_item = None self.handle_remove_model_item = None self.handle_finish_read = None self.__has_been_read = False self._raw_properties = None # debugging self.__storage_system = storage_system self.set_storage_system(self.__storage_system)
def scan_width_changed(text): displayed_width = Converter.IntegerToStringConverter( ).convert_back(text) if text else 1 spacing = self.__graphic_width / displayed_width if self.__graphic_width and self.__graphic_width > 0 else 0 if spacing > 0 and self.__calibration: if self.__scan_spacing_px != spacing: self.__scan_spacing_px = spacing update_context() self.__scan_width_widget.select_all() else: self.__scan_spacing_px = None
def resolve_variable( self, object_specifier: dict) -> typing.Optional[ComputationVariable]: if object_specifier: uuid_str = object_specifier.get("uuid") uuid_ = Converter.UuidToStringConverter().convert_back( uuid_str) if uuid_str else None if uuid_: for variable in self.variables: if variable.uuid == uuid_: return variable return None
def __init__(self, data_item: API_1_0.DataItem, src_data_item: API_1_0.DataItem, offset_graphic: API_1_0.Graphic, second_graphic: API_1_0.Graphic, units='eV'): self.ev_converter = Converter.PhysicalValueToStringConverter(units) self.property_changed_event = Event.Event() self.__data_item = data_item self.__src_data_item = src_data_item self.__offset_graphic = offset_graphic self.__second_graphic = second_graphic self.__offset_energy = 0 self.__graphic_updating = False self.__second_point = data_item.display_xdata.dimensional_calibrations[0].convert_to_calibrated_value(second_graphic.position * len(data_item.display_xdata.data)) self.__offset_changed_listener = offset_graphic._graphic.property_changed_event.listen(self.__offset_graphic_changed) self.__second_changed_listener = second_graphic._graphic.property_changed_event.listen(self.__second_graphic_changed)
def __init__(self, storage_system=None, storage_cache=None, *, profile_context: typing.Optional[ProfileContext] = None): super().__init__() self.__class__.count += 1 self.define_root_context() self.define_type("profile") self.define_relationship("project_references", project_reference_factory, insert=self.__insert_project_reference, remove=self.__remove_project_reference) self.define_property("last_project_reference", converter=Converter.UuidToStringConverter()) self.define_property("work_project_reference_uuid", converter=Converter.UuidToStringConverter()) self.define_property("closed_items", list()) self.storage_system = storage_system or FileStorageSystem.MemoryPersistentStorageSystem( ) self.storage_system.load_properties() self.storage_cache = storage_cache or Cache.DictStorageCache( ) # need to deallocate self.set_storage_system(self.storage_system) self.profile_context = None # helper object to produce the projects sequence oo = Observer.ObserverBuilder() oo.source(self).ordered_sequence_from_array("project_references").map( oo.x.prop("project")).filter(lambda x: x is not None).trampoline( self, "projects") self.__projects_observer = oo.make_observable() if profile_context: self.profile_context = profile_context self.add_project_memory()
def __init__(self, type, *, parent=None): super().__init__() self.__container_weak_ref = None self.about_to_be_removed_event = Event.Event() self.about_to_cascade_delete_event = Event.Event() self._about_to_be_removed = False self._closed = False self.__registration_listener = None self.define_type(type) self.define_property("parent_uuid", converter=Converter.UuidToStringConverter()) self.__parent = parent if parent is not None: self.parent_uuid = parent.uuid
def connect_camera_hardware_source( self, camera_hardware_source: HardwareSource.HardwareSource) -> None: assert isinstance(camera_hardware_source, camera_base.CameraHardwareSource) self.__exposure_time_ms_value_model = Model.PropertyModel[float]() def update_exposure_time_ms( exposure_time_ms: typing.Optional[float]) -> None: if exposure_time_ms is not None and exposure_time_ms > 0 and isinstance( camera_hardware_source, camera_base.CameraHardwareSource): frame_parameters = camera_hardware_source.get_frame_parameters( 0) frame_parameters.exposure_ms = exposure_time_ms camera_hardware_source.set_frame_parameters( 0, frame_parameters) self.__update_estimate() self.__exposure_time_ms_value_model.on_value_changed = update_exposure_time_ms exposure_time_ms_value_binding = Binding.PropertyBinding( self.__exposure_time_ms_value_model, "value", converter=Converter.FloatToStringConverter("{0:.1f}")) def eels_profile_parameters_changed( profile_index: int, frame_parameters: camera_base.CameraFrameParameters) -> None: if profile_index == 0 and isinstance( camera_hardware_source, camera_base.CameraHardwareSource): expected_dimensions = camera_hardware_source.get_expected_dimensions( frame_parameters.binning) self.__camera_width = expected_dimensions[1] self.__camera_height = expected_dimensions[0] if self.__exposure_time_ms_value_model: self.__exposure_time_ms_value_model.value = frame_parameters.exposure_ms self.__update_estimate() self.__eels_frame_parameters_changed_event_listener = camera_hardware_source.frame_parameters_changed_event.listen( eels_profile_parameters_changed) eels_profile_parameters_changed( 0, camera_hardware_source.get_frame_parameters(0)) typing.cast(UserInterfaceModule.LineEditWidget, self.__exposure_time_widget._widget).bind_text( exposure_time_ms_value_binding ) # the widget will close the binding
def __init__(self, *, structure_type: str = None, source=None): super().__init__() self.__container_weak_ref = None self.about_to_be_removed_event = Event.Event() self.about_to_cascade_delete_event = Event.Event() self._about_to_be_removed = False self._closed = False self.__properties = dict() self.__referenced_objects = dict() self.define_type("data_structure") self.define_property("structure_type", structure_type) self.define_property("source_uuid", converter=Converter.UuidToStringConverter()) # properties is handled explicitly self.data_structure_changed_event = Event.Event() self.referenced_objects_changed_event = Event.Event() self.__source = source if source is not None: self.source_uuid = source.uuid
def connect_camera_hardware_source(self, camera_hardware_source): self.__exposure_time_ms_value_model = Model.PropertyModel() def update_exposure_time_ms(exposure_time_ms): if exposure_time_ms > 0: frame_parameters = camera_hardware_source.get_frame_parameters( 0) frame_parameters.exposure_ms = exposure_time_ms camera_hardware_source.set_frame_parameters( 0, frame_parameters) self.__update_estimate() self.__exposure_time_ms_value_model.on_value_changed = update_exposure_time_ms exposure_time_ms_value_binding = Binding.PropertyBinding( self.__exposure_time_ms_value_model, "value", converter=Converter.FloatToStringConverter("{0:.1f}")) def eels_profile_parameters_changed(profile_index, frame_parameters): if profile_index == 0: expected_dimensions = camera_hardware_source.get_expected_dimensions( frame_parameters.binning) self.__camera_width = expected_dimensions[1] self.__camera_height = expected_dimensions[0] self.__exposure_time_ms_value_model.value = frame_parameters.exposure_ms self.__update_estimate() self.__eels_frame_parameters_changed_event_listener = camera_hardware_source.frame_parameters_changed_event.listen( eels_profile_parameters_changed) eels_profile_parameters_changed( 0, camera_hardware_source.get_frame_parameters(0)) self.__exposure_time_widget._widget.bind_text( exposure_time_ms_value_binding ) # the widget will close the binding