def remove_component(self, component_id): """ Remove a component from a data set :param component_id: the component to remove :type component_id: :class:`~glue.core.component_id.ComponentID` """ if component_id in self._components: self._components.pop(component_id) if self.hub: msg = DataRemoveComponentMessage(self, component_id) self.hub.broadcast(msg) msg = ComponentsChangedMessage(self) self.hub.broadcast(msg)
def remove_component(self, component_id): """ Remove a component from a data set :param component_id: the component to remove :type component_id: :class:`~glue.core.component_id.ComponentID` """ # TODO: avoid too many messages when removing a component triggers # the removal of derived components. if component_id in self._components: self._components.pop(component_id) self._removed_derived_that_depend_on(component_id) if self.hub: msg = DataRemoveComponentMessage(self, component_id) self.hub.broadcast(msg) msg = ComponentsChangedMessage(self) self.hub.broadcast(msg)
def add_component(self, component, label): """ Add a new component to this data set. :param component: object to add. Can be a Component, array-like object, or ComponentLink :param label: The label. If this is a string, a new :class:`glue.core.component_id.ComponentID` with this label will be created and associated with the Component :type component: :class:`~glue.core.component.Component` or array-like :type label: :class:`str` or :class:`~glue.core.component_id.ComponentID` :raises: TypeError, if label is invalid ValueError if the component has an incompatible shape :returns: The ComponentID associated with the newly-added component """ if isinstance(component, ComponentLink): return self.add_component_link(component, label=label) if not isinstance(component, Component): component = Component.autotyped(component) if isinstance(component, DerivedComponent): if len(self._components) == 0: raise TypeError( "Cannot add a derived component as a first component") component.set_parent(self) if not (self._check_can_add(component)): raise ValueError("The dimensions of component %s are " "incompatible with the dimensions of this data: " "%r vs %r" % (label, component.shape, self.shape)) if isinstance(label, ComponentID): component_id = label if component_id.parent is None: component_id.parent = self else: component_id = ComponentID(label, parent=self) if len(self._components) == 0: # TODO: make sure the following doesn't raise a componentsraised message self._create_pixel_and_world_components(ndim=component.ndim) # In some cases, such as when loading a session, we actually disable the # auto-creation of pixel and world coordinates, so the first component # may be a coordinate component with no shape. Therefore we only set the # shape once a component has a valid shape rather than strictly on the # first component. if self._shape == () and component.shape != (): self._shape = component.shape is_present = component_id in self._components self._components[component_id] = component if self.hub and not is_present: msg = DataAddComponentMessage(self, component_id) self.hub.broadcast(msg) msg = ComponentsChangedMessage(self) self.hub.broadcast(msg) return component_id
def add_component(self, component, label, hidden=False): """ Add a new component to this data set. :param component: object to add. Can be a Component, array-like object, or ComponentLink :param label: The label. If this is a string, a new :class:`glue.core.component_id.ComponentID` with this label will be created and associated with the Component :type component: :class:`~glue.core.component.Component` or array-like :type label: :class:`str` or :class:`~glue.core.component_id.ComponentID` :raises: TypeError, if label is invalid ValueError if the component has an incompatible shape :returns: The ComponentID associated with the newly-added component """ if isinstance(component, ComponentLink): component = DerivedComponent(self, component) if not isinstance(component, Component): component = Component.autotyped(component) if isinstance(component, DerivedComponent): component.set_parent(self) if not (self._check_can_add(component)): raise ValueError("The dimensions of component %s are " "incompatible with the dimensions of this data: " "%r vs %r" % (label, component.shape, self.shape)) if isinstance(label, ComponentID): component_id = label else: component_id = ComponentID(label, hidden=hidden) is_present = component_id in self._components self._components[component_id] = component first_component = len(self._components) == 1 if first_component: if isinstance(component, DerivedComponent): raise TypeError("Cannot add a derived component as " "first component") self._shape = component.shape self._create_pixel_and_world_components() if self.hub and (not is_present): msg = DataAddComponentMessage(self, component_id) self.hub.broadcast(msg) msg = ComponentsChangedMessage(self) self.hub.broadcast(msg) return component_id