Exemple #1
0
 def init_view(self):
     self.center_widget = CrosshairWidget(self.canvas,
                                          self.scene.center(),
                                          "Center",
                                          callback=self.on_center_moved)
     self.load_backdrop()
     self.update_canvas()
 def init_view(self):
     self.center_widget = CrosshairWidget(self.canvas, self.scene.center(), "Center", callback=self.on_center_moved)
     self.load_backdrop()
     self.update_canvas()
class SceneController(QtCore.QObject):

    new_frame = QtCore.Signal()

    def __init__(self, app=None, canvas=None, scene=None):
        super(SceneController, self).__init__()
        self.canvas = canvas
        self.scene = scene
        self.app = app
        self.fixtures = []
        self._max_pixels = 0
        self._output_buffer = None
        self.show_center = False
        self._strand_keys = list()
        self._color_mode = self.app.config.get("color_mode")
        self._frame_data = {}
        self.strand_data = {}
        self.times = []
        self.frame_start_time = 0.0
        if self.canvas is not None:
            self.init_view()

        self._fixture_lookup_cache = self.scene.fixture_hierarchy()
        fixture_data = self.scene.get("fixtures", [])
        for fixture_data_item in fixture_data:
            f = Fixture(fixture_data_item, controller=self)
            self._fixture_lookup_cache[f.strand()][f.address()] = f
            self.fixtures.append(f)

        self.create_pixel_array()

    def init_view(self):
        self.center_widget = CrosshairWidget(self.canvas, self.scene.center(), "Center", callback=self.on_center_moved)
        self.load_backdrop()
        self.update_canvas()

    def load_backdrop(self):
        if self.canvas is not None:
            if self.scene.get("backdrop_enable", False):
                image_filename = os.path.abspath(self.scene.get("backdrop_filename"))
                log.info("Loading backdrop from " + image_filename)
                img = QtGui.QImage(image_filename)
                if img.isNull():
                    log.error("Could not load background image: %s", image_filename)
                else:
                    self.canvas.set_background_image(img)
            else:
                self.canvas.set_background_image(None)
            self.canvas.update()

    def set_canvas(self, canvas):
        self.canvas = canvas
        canvas.controller = self
        self.init_view()

    def get_canvas(self):
        return self.canvas

    def update_canvas(self):
        if self.canvas is not None:
            fl = [f.get_widget() for f in self.fixtures]
            self.canvas.update_fixtures(fl)

    def on_center_moved(self, pos):
        print pos
        ipos = (int(pos.x()), int(pos.y()))
        self.scene.set_center(ipos)

    def add_fixture(self):
        self.fixtures.append(Fixture(controller=self))
        self.update_canvas()
        self.update_scene()
        self.create_pixel_array()

    def delete_fixture(self, fixture):
        self.fixtures = [f for f in self.fixtures if f is not fixture]
        log.info("Destroying fixture %s" % fixture)
        fixture.destroy()
        self.update_scene()
        self.update_canvas()
        self.create_pixel_array()

    def clear_fixtures(self):
        while len(self.fixtures) > 0:
            fixture = self.fixtures.pop()
            fixture.destroy()
            del fixture
        self.update_scene()
        self.create_pixel_array()

    def widget_selected(self, selected, fixture, multi):
        if multi:
            pass
        else:
            for f in self.fixtures:
                if f is not fixture:
                    f.get_widget().select(False)
        self.app.widget_selected(selected, fixture, multi)

    def update_scene(self):
        fd = []
        for fixture in self.fixtures:
            fd.append(fixture.pack())
        self.scene.set_fixture_data(fd)

    def save_scene(self):
        self.update_scene()
        self.scene.save()

    def get_fixture(self, id):
        for f in self.fixtures:
            if f.id == id:
                return f

    def get_fixtures(self):
        return self.fixtures

    def update_all(self):
        for f in self.fixtures:
            f.get_widget().update()
        self.center_widget.update()
        self.canvas.update()

    def toggle_background_enable(self):
        if self.scene.get("backdrop_enable", False):
            self.scene.set("backdrop_enable", False)
            self.load_backdrop()
            return False
        else:
            self.scene.set("backdrop_enable", True)
            self.load_backdrop()
            return True

    def toggle_labels_enable(self):
        enabled = not self.scene.get("labels_enable", False)
        self.scene.set("labels_enable", enabled)
        self.update_all()
        return enabled

    def toggle_locked(self):
        locked = not self.scene.get("locked", False)
        self.scene.set("locked", locked)
        if locked:
            self.canvas.deselect_all()
        self.update_all()
        return locked

    def toggle_show_center(self):
        self.show_center = not self.show_center
        self.center_widget.hidden = not self.show_center
        self.update_all()
        return self.show_center

    def update_address_cache(self, fixture, strand, address):
        for f in self.fixtures:
            if fixture == f:
                self._fixture_lookup_cache[strand][address] = f

    def create_pixel_array(self):
        """
        Initializes the array of colors used for displaying incoming data from the network.
        Needs to be called when the shape of the scene has changed
        (fixtures added/removed, addresses changed, pixels per fixture changed)
        """
        fh = self.scene.fixture_hierarchy()
        self._strand_keys = list()
        for strand in fh:

            self._strand_keys.append(strand)
            strand_len = 0
            for fixture in fh[strand]:
                self._fixture_lookup_cache[strand][fixture].update_offset(strand_len)
                strand_len += fh[strand][fixture].pixels()

            self.strand_data[strand] = [(0, 0, 0)] * strand_len
            if strand_len > self._max_pixels:
                self._max_pixels = strand_len

        log.info("Scene has %d strands, %d pixels." % (len(self._strand_keys), self._max_pixels))
        self._output_buffer = np.zeros((len(self._strand_keys), self._max_pixels, 3))

    @QtCore.Slot(list)
    def process_command(self, packet):
        cmd = chr(packet[0])
        datalen = 0

        # begin frame
        if cmd == 'B':
            self.frame_start_time = time.time()
            self.app.netcontroller.frame_started()

        # Unpack strand pixel data
        elif cmd == 'S':
            strand = packet[1]
            datalen = (packet[3] << 8) + packet[2]
            data = [c for c in packet[4:]]
            self._frame_data[strand] = data

        # end frame
        elif cmd == 'E':
            for strand, data in self._frame_data.iteritems():
                data = [data[i:i+3] for i in xrange(0, len(data), 3)]
                self.strand_data[strand] = data
            self.times.append((time.time() - self.frame_start_time))
            if len(self.times) > 100:
                self.times.pop(0)
            self.new_frame.emit()

        else:
            log.error("Malformed packet of length %d!" % len(packet))
Exemple #4
0
class SceneController(QtCore.QObject):

    new_frame = QtCore.Signal()

    def __init__(self, app, scene):
        super(SceneController, self).__init__()
        self.canvas = None
        self.scene = scene
        self.app = app
        self._output_buffer = None
        self.show_center = False
        self._color_mode = self.app.config.get("color_mode")
        self._frame_data = {}
        self.strand_data = {}
        self.times = []
        self.frame_start_time = 0.0
        if self.canvas is not None:
            self.init_view()

        self.scene.set_controller(self)
        self.create_pixel_array()

    def init_view(self):
        self.center_widget = CrosshairWidget(self.canvas,
                                             self.scene.center(),
                                             "Center",
                                             callback=self.on_center_moved)
        self.load_backdrop()
        self.update_canvas()

    def load_backdrop(self):
        if self.canvas is not None:
            if self.scene.get("backdrop_enable", False):
                image_filename = os.path.abspath(
                    self.scene.get("backdrop_filename"))
                log.info("Loading backdrop from " + image_filename)
                img = QtGui.QImage(image_filename)
                if img.isNull():
                    log.error("Could not load background image: %s",
                              image_filename)
                else:
                    self.canvas.set_background_image(img)
            else:
                self.canvas.set_background_image(None)
            self.canvas.update()

    def set_canvas(self, canvas):
        self.canvas = canvas
        canvas.controller = self
        self.init_view()

    def get_canvas(self):
        return self.canvas

    def update_canvas(self):
        if self.canvas is not None:
            fl = [f.get_widget() for f in self.scene.fixtures()]
            self.canvas.update_fixtures(fl)

    def on_center_moved(self, pos):
        print pos
        ipos = (int(pos.x()), int(pos.y()))
        self.scene.set_center(ipos)

    def add_fixture(self):
        fh = self.scene.fixture_hierarchy()
        if fh:
            new_strand = max(fh.keys())
            new_address = max(fh[new_strand].keys()) + 1
        else:
            new_strand = 0
            new_address = 0
        fixture = Fixture(controller=self,
                          strand=new_strand,
                          address=new_address)
        self.scene.add_fixture(fixture)
        self.update_canvas()
        self.create_pixel_array()

    def delete_fixture(self, fixture):
        self.scene.delete_fixture(fixture)
        self.update_canvas()
        self.create_pixel_array()

    def clear_fixtures(self):
        self.scene.clear_fixtures()
        self.create_pixel_array()

    def widget_selected(self, selected, fixture, multi):
        if multi:
            pass
        else:
            for f in self.scene.fixtures():
                if f is not fixture:
                    f.get_widget().select(False)
        self.app.widget_selected(selected, fixture, multi)

    def save_scene(self):
        self.scene.save()

    def update_all(self):
        for f in self.scene.fixtures():
            f.get_widget().update()
        self.center_widget.update()
        self.canvas.update()

    def toggle_background_enable(self):
        if self.scene.get("backdrop_enable", False):
            self.scene.set("backdrop_enable", False)
            self.load_backdrop()
            return False
        else:
            self.scene.set("backdrop_enable", True)
            self.load_backdrop()
            return True

    def toggle_labels_enable(self):
        enabled = not self.scene.get("labels_enable", False)
        self.scene.set("labels_enable", enabled)
        self.update_all()
        return enabled

    def toggle_locked(self):
        locked = not self.scene.get("locked", False)
        self.scene.set("locked", locked)
        if locked:
            self.canvas.deselect_all()
        self.update_all()
        return locked

    def toggle_show_center(self):
        self.show_center = not self.show_center
        self.center_widget.hidden = not self.show_center
        self.update_all()
        return self.show_center

    def update_fixture(self, fixture, new_strand, new_address):
        self.scene.update_fixture(fixture, new_strand, new_address)
        self.create_pixel_array()

    def create_pixel_array(self):
        """
        Initializes the array of colors used for displaying incoming data from the network.
        Needs to be called when the shape of the scene has changed
        (fixtures added/removed, addresses changed, pixels per fixture changed)
        """
        max_pixels = 0
        fh = self.scene.fixture_hierarchy()

        for strand in fh:
            strand_len = 0
            for address in fh[strand]:
                fixture = self.scene.fixture(strand, address)
                fixture.update_offset(strand_len)
                strand_len += fixture.pixels()

            self.strand_data[strand] = [(0, 0, 0)] * strand_len
            max_pixels = max(max_pixels, strand_len)

        log.info("Scene has %d strands, %d pixels." % (len(fh), max_pixels))
        self._output_buffer = np.zeros((len(fh), max_pixels, 3))

    @QtCore.Slot(list)
    def process_command(self, packet):
        cmd = chr(packet[0])
        datalen = 0

        # begin frame
        if cmd == 'B':
            self.frame_start_time = time.time()
            self.app.netcontroller.frame_started()

        # Unpack strand pixel data
        elif cmd == 'S':
            strand = packet[1]
            datalen = (packet[3] << 8) + packet[2]
            data = [c for c in packet[4:]]
            self._frame_data[strand] = data

        # end frame
        elif cmd == 'E':
            for strand, data in self._frame_data.iteritems():
                data = [data[i:i + 3] for i in xrange(0, len(data), 3)]
                self.strand_data[strand] = data
            self.times.append((time.time() - self.frame_start_time))
            if len(self.times) > 100:
                self.times.pop(0)
            self.new_frame.emit()

        else:
            log.error("Malformed packet of length %d!" % len(packet))