Exemplo n.º 1
0
class PrinterController(PrinterInterface):
    """This class implements the gui functionality for the configuring
    and operating a specific printer."""
    def __init__(self, printer_uuid):
        template = os.path.split(__file__)[0]
        template = os.path.join(template, "templates", "printer_control.glade")
        self.builder = Gtk.Builder()
        self.builder.add_from_file(template)
        self.builder.connect_signals(self)

        window = self.builder.get_object("window1")
        self.widget = window.get_child()
        window.remove(self.widget)

        self.controls = self.builder.get_object("control_widgets_box")
        self.crosshair = Crosshair(self)
        self.info = None
        self.gauges = {
            "b": None,
            "t": [],
        }
        self.update_controls()
        self.disable()
        self.set_printer_name("Unknown Printer")

        PrinterInterface.__init__(self, printer_uuid)

    def add_gauges(self):
        """Adds any necessary gaguges from a given temperature
        report."""

        self.info = self.get_class_info()
        assert self.info.printer_type == "FFF 3D Printer"

        dirty = False
        if self.info.heated_bed:
            if self.gauges["b"] is None:
                dirty = True
                self.gauges["b"] = BedGauge(self)

        while self.info.tools > len(self.gauges["t"]):
            tool_num = len(self.gauges["t"])
            self.gauges["t"].append(ExtruderGauge(self, tool_num))
            dirty = True

        if dirty:
            self.update_controls()

    def get_gauges(self):
        """Return a list of all gauge widgets without context."""

        gauges = []
        if self.gauges["b"] is not None:
            gauges.append(self.gauges["b"])
        if self.gauges["t"]:
            gauges += self.gauges["t"]
        return gauges

    def update_controls(self):
        """Clears out the controls packing box, and then populates it
        with a crosshair widget and some number of temperature
        controllers.
        """
        for child in self.controls.get_children():
            self.controls.remove(child)
        self.controls.add(self.crosshair.widget)

        for gauge in self.get_gauges():
            self.controls.add(gauge.widget)
            gauge.enable()

    def on_temp_request(self, gauge, target):
        """Called by a gauge when a user requests a temperature change."""

        # first determine if we're talking about a tool or the bed
        if self.gauges["b"] == gauge:
            # its the bed
            self.set_bed_temp(target)
        else:
            # which tool?
            try:
                tool = self.gauges["t"].index(gauge)
                self.set_tool_temp(tool, target)
            except ValueError:
                # never mind
                pass

    def refocus(self):
        """Called to reset the ui state.  Currently, this is only
        really used by the crosshair when the notebook page changes.
        """
        self.crosshair.refocus()

    def disable(self):
        """Disable the controls for this printer."""
        self.crosshair.disable()
        for gauge in self.get_gauges():
            gauge.disable()

        motors_off = self.builder.get_object("motors_off_button")
        motors_off.set_sensitive(False)

    def enable(self):
        """Enable this printer's controls."""
        self.crosshair.enable()
        for gauge in self.get_gauges():
            gauge.enable()

        motors_off = self.builder.get_object("motors_off_button")
        motors_off.set_sensitive(True)

    def on_state_change(self, state):
        """Signal handler for when the printer goes on or offline."""
        if state == "ready":
            self.add_gauges()
            self.enable()
        elif state == "offline":
            self.disable()

    def on_report(self, blob):
        packet = json.loads(blob)
        if packet.has_key("thermistors"):
            temps = packet['thermistors']
            if self.info.heated_bed:
                self.gauges["b"].set_label(temps["bed"][0])
            for gauge, temp in zip(self.gauges["t"], temps["tools"]):
                gauge.set_label(temp[0])

    def set_printer_name(self, name):
        """Sets the displayed name for this printer."""
        label = self.builder.get_object("dashboard_header")
        label.set_text("Dashboard for %s" % name)

    def on_focus_in(self, widget, event_info):
        self.crosshair.on_focus_in(widget, event_info)
        for gauge in self.get_gauges():
            gauge.on_focus_in(widget, event_info)

    def on_focus_out(self, widget, event_info):
        self.crosshair.on_focus_out(widget, event_info)
        for gauge in self.get_gauges():
            gauge.on_focus_out(widget, event_info)

    def on_motors_off(self, *args):
        self.motors_off()
Exemplo n.º 2
0
class PrinterController(PrinterInterface):
    """This class implements the gui functionality for the configuring
    and operating a specific printer."""

    def __init__(self, printer_uuid):
        template = os.path.split(__file__)[0]
        template = os.path.join(template, "templates", "printer_control.glade")
        self.builder = Gtk.Builder()
        self.builder.add_from_file(template)
        self.builder.connect_signals(self)

        window = self.builder.get_object("window1")
        self.widget = window.get_child()
        window.remove(self.widget)

        self.controls = self.builder.get_object("control_widgets_box")
        self.crosshair = Crosshair(self)
        self.info = None
        self.gauges = {
            "b" : None,
            "t" : [],
            }
        self.update_controls()
        self.disable()
        self.set_printer_name("Unknown Printer")

        PrinterInterface.__init__(self, printer_uuid)

    def add_gauges(self):
        """Adds any necessary gaguges from a given temperature
        report."""

        self.info = self.get_class_info()
        assert self.info.printer_type == "FFF 3D Printer"
        
        dirty = False
        if self.info.heated_bed:
            if self.gauges["b"] is None:
                dirty = True
                self.gauges["b"] = BedGauge(self)

        while self.info.tools > len(self.gauges["t"]):
            tool_num = len(self.gauges["t"])
            self.gauges["t"].append(ExtruderGauge(self, tool_num))
            dirty = True

        if dirty:
            self.update_controls()

    def get_gauges(self):
        """Return a list of all gauge widgets without context."""
        
        gauges = []
        if self.gauges["b"] is not None:
            gauges.append(self.gauges["b"])
        if self.gauges["t"]:
            gauges += self.gauges["t"]
        return gauges

    def update_controls(self):
        """Clears out the controls packing box, and then populates it
        with a crosshair widget and some number of temperature
        controllers.
        """
        for child in self.controls.get_children():
            self.controls.remove(child)
        self.controls.add(self.crosshair.widget)
    
        for gauge in self.get_gauges():
            self.controls.add(gauge.widget)
            gauge.enable()

    def on_temp_request(self, gauge, target):
        """Called by a gauge when a user requests a temperature change."""

        # first determine if we're talking about a tool or the bed
        if self.gauges["b"] == gauge:
            # its the bed
            self.set_bed_temp(target)
        else:
            # which tool?
            try:
                tool = self.gauges["t"].index(gauge)
                self.set_tool_temp(tool, target)
            except ValueError:
                # never mind
                pass
            
    def refocus(self):
        """Called to reset the ui state.  Currently, this is only
        really used by the crosshair when the notebook page changes.
        """
        self.crosshair.refocus()

    def disable(self):
        """Disable the controls for this printer."""
        self.crosshair.disable()
        for gauge in self.get_gauges():
            gauge.disable()

        motors_off = self.builder.get_object("motors_off_button")
        motors_off.set_sensitive(False)
        
    def enable(self):
        """Enable this printer's controls."""
        self.crosshair.enable()
        for gauge in self.get_gauges():
            gauge.enable()
        
        motors_off = self.builder.get_object("motors_off_button")
        motors_off.set_sensitive(True)

    def on_state_change(self, state):
        """Signal handler for when the printer goes on or offline."""
        if state == "ready":
            self.add_gauges()
            self.enable()
        elif state == "offline":
            self.disable()

    def on_report(self, blob):
        packet = json.loads(blob)
        if packet.has_key("thermistors"):
            temps = packet['thermistors']
            if self.info.heated_bed:
                self.gauges["b"].set_label(temps["bed"][0])
            for gauge, temp in zip(self.gauges["t"], temps["tools"]):
                gauge.set_label(temp[0])
        
    def set_printer_name(self, name):
        """Sets the displayed name for this printer."""
        label = self.builder.get_object("dashboard_header")
        label.set_text("Dashboard for %s" % name)

    def on_focus_in(self, widget, event_info):
        self.crosshair.on_focus_in(widget, event_info)
        for gauge in self.get_gauges():
            gauge.on_focus_in(widget, event_info)

    def on_focus_out(self, widget, event_info):
        self.crosshair.on_focus_out(widget, event_info)
        for gauge in self.get_gauges():
            gauge.on_focus_out(widget, event_info)

    def on_motors_off(self, *args):
        self.motors_off()