def show_RGB(self, clear_XYZ=True, mark_current_row=True):
     row = self.cgats[0].DATA[self.index]
     self.label_RGB.SetLabel(
         "RGB %i %i %i" % (round(
             row["RGB_R"] / 100.0 * 255), round(row["RGB_G"] / 100.0 * 255),
                           round(row["RGB_B"] / 100.0 * 255)))
     color = [
         int(round(v / 100.0 * 255))
         for v in (row["RGB_R"], row["RGB_G"], row["RGB_B"])
     ]
     self.panel_RGB.SetBackgroundColour(wx.Colour(*color))
     self.panel_RGB.SetBitmap(None)
     self.panel_RGB.Refresh()
     self.panel_RGB.Update()
     if clear_XYZ:
         self.label_XYZ.SetLabel(" ")
         self.panel_XYZ.SetBackgroundColour(BGCOLOUR)
         self.panel_XYZ.SetBitmap(
             getbitmap("theme/checkerboard-32x32x5-333-444"))
         self.panel_XYZ.Refresh()
         self.panel_XYZ.Update()
     if mark_current_row:
         self.grid.SetRowLabelValue(self.index,
                                    "\u25ba %i" % (self.index + 1))
         self.grid.MakeCellVisible(self.index, 0)
     if self.index not in self.grid.GetSelectedRows():
         self.grid.SelectRow(self.index)
         self.grid.SetGridCursor(self.index, 0)
     self.label_index.SetLabel("%i/%i" %
                               (self.index + 1, len(self.cgats[0].DATA)))
     self.label_index.GetContainingSizer().Layout()
Esempio n. 2
0
 def reset(self):
     self._setup()
     for panel in self.panels:
         panel.SetBackgroundColour(BGCOLOUR)
     for button in self.buttons:
         button.SetBitmap(getbitmap("theme/icons/10x10/record"))
         button.Show()
     for index in self.labels:
         self.labels[index].SetLabel("")
         self.labels[index].GetContainingSizer().Layout()
     self.show_cursor()
Esempio n. 3
0
    def DoCreateResource(self):
        name = os.path.splitext(self.GetText('bitmap'))[0]
        if name.startswith('../'):
            name = name[3:]
        bitmap = getbitmap(name)
        w = wx.StaticBitmap(self.GetParentAsWindow(),
                            self.GetID(),
                            bitmap,
                            pos=self.GetPosition(),
                            size=self.GetSize(),
                            style=self.GetStyle(),
                            name=self.GetName())

        self.SetupWindow(w)
        return w
    def __init__(self,
                 parent=None,
                 handler=None,
                 keyhandler=None,
                 start_timer=True):
        BaseFrame.__init__(self,
                           parent,
                           wx.ID_ANY,
                           lang.getstr("measurement.untethered"),
                           style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL,
                           name="untetheredframe")
        self.SetIcons(get_icon_bundle([256, 48, 32, 16], appname))
        self.sizer = wx.FlexGridSizer(2, 1, 0, 0)
        self.sizer.AddGrowableCol(0)
        self.sizer.AddGrowableRow(0)
        self.sizer.AddGrowableRow(1)
        self.panel = wx_Panel(self)
        self.SetSizer(self.sizer)
        self.sizer.Add(self.panel, 1, wx.EXPAND)
        self.panel.SetBackgroundColour(BGCOLOUR)
        panelsizer = wx.FlexGridSizer(3, 2, 8, 8)
        panelsizer.AddGrowableCol(0)
        panelsizer.AddGrowableCol(1)
        panelsizer.AddGrowableRow(1)
        self.panel.SetSizer(panelsizer)
        self.label_RGB = wx.StaticText(self.panel, wx.ID_ANY, " ")
        self.label_RGB.SetForegroundColour(FGCOLOUR)
        panelsizer.Add(self.label_RGB,
                       0,
                       wx.TOP | wx.LEFT | wx.EXPAND,
                       border=8)
        self.label_XYZ = wx.StaticText(self.panel, wx.ID_ANY, " ")
        self.label_XYZ.SetForegroundColour(FGCOLOUR)
        panelsizer.Add(self.label_XYZ,
                       0,
                       wx.TOP | wx.RIGHT | wx.EXPAND,
                       border=8)
        if sys.platform == "darwin":
            style = wx.BORDER_THEME
        else:
            style = wx.BORDER_SIMPLE
        self.panel_RGB = BitmapBackgroundPanel(self.panel,
                                               size=(256, 256),
                                               style=style)
        self.panel_RGB.scalebitmap = (True, True)
        self.panel_RGB.SetBitmap(
            getbitmap("theme/checkerboard-32x32x5-333-444"))
        panelsizer.Add(self.panel_RGB, 1, wx.LEFT | wx.EXPAND, border=8)
        self.panel_XYZ = BitmapBackgroundPanel(self.panel,
                                               size=(256, 256),
                                               style=style)
        self.panel_XYZ.scalebitmap = (True, True)
        self.panel_XYZ.SetBitmap(
            getbitmap("theme/checkerboard-32x32x5-333-444"))
        panelsizer.Add(self.panel_XYZ, 1, wx.RIGHT | wx.EXPAND, border=8)
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        self.back_btn = FlatShadedButton(self.panel,
                                         bitmap=geticon(10, "back"),
                                         label="",
                                         fgcolour=FGCOLOUR)
        self.back_btn.Bind(wx.EVT_BUTTON, self.back_btn_handler)
        sizer.Add(self.back_btn, 0, wx.LEFT | wx.RIGHT, border=8)
        self.label_index = wx.StaticText(self.panel, wx.ID_ANY, " ")
        self.label_index.SetForegroundColour(FGCOLOUR)
        sizer.Add(self.label_index, 0, wx.ALIGN_CENTER_VERTICAL)
        self.next_btn = FlatShadedButton(self.panel,
                                         bitmap=geticon(10, "play"),
                                         label="",
                                         fgcolour=FGCOLOUR)
        self.next_btn.Bind(wx.EVT_BUTTON, self.next_btn_handler)
        sizer.Add(self.next_btn, 0, wx.LEFT, border=8)
        sizer.Add((12, 1), 1)
        self.measure_auto_cb = CustomCheckBox(self.panel, wx.ID_ANY,
                                              lang.getstr("auto"))
        self.measure_auto_cb.SetForegroundColour(FGCOLOUR)
        self.measure_auto_cb.Bind(wx.EVT_CHECKBOX,
                                  self.measure_auto_ctrl_handler)
        sizer.Add(self.measure_auto_cb, 0,
                  wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
        panelsizer.Add(sizer, 0, wx.BOTTOM | wx.EXPAND, border=8)
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        self.measure_btn = FlatShadedButton(self.panel,
                                            bitmap=geticon(10, "play"),
                                            label=lang.getstr("measure"),
                                            fgcolour=FGCOLOUR)
        self.measure_btn.Bind(wx.EVT_BUTTON, self.measure_btn_handler)
        sizer.Add(self.measure_btn, 0, wx.RIGHT, border=6)
        # Sound when measuring
        # Needs to be stereo!
        self.measurement_sound = audio.Sound(get_data_path("beep.wav"))
        self.commit_sound = audio.Sound(get_data_path("camera_shutter.wav"))
        bitmap = self.get_sound_on_off_btn_bitmap()
        self.sound_on_off_btn = FlatShadedButton(self.panel,
                                                 bitmap=bitmap,
                                                 fgcolour=FGCOLOUR)
        self.sound_on_off_btn.SetToolTipString(
            lang.getstr("measurement.play_sound"))
        self.sound_on_off_btn.Bind(wx.EVT_BUTTON,
                                   self.measurement_play_sound_handler)
        sizer.Add(self.sound_on_off_btn, 0)
        sizer.Add((12, 1), 1)
        self.finish_btn = FlatShadedButton(self.panel,
                                           label=lang.getstr("finish"),
                                           fgcolour=FGCOLOUR)
        self.finish_btn.Bind(wx.EVT_BUTTON, self.finish_btn_handler)
        sizer.Add(self.finish_btn, 0, wx.RIGHT, border=8)
        panelsizer.Add(sizer, 0, wx.BOTTOM | wx.EXPAND, border=8)

        self.grid = CustomGrid(self, -1, size=(536, 256))
        self.grid.DisableDragColSize()
        self.grid.DisableDragRowSize()
        self.grid.SetScrollRate(0, 5)
        self.grid.SetCellHighlightROPenWidth(0)
        self.grid.SetColLabelSize(self.grid.GetDefaultRowSize())
        self.grid.SetDefaultCellAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER)
        self.grid.SetRowLabelAlignment(wx.ALIGN_RIGHT, wx.ALIGN_CENTER)
        self.grid.draw_horizontal_grid_lines = False
        self.grid.draw_vertical_grid_lines = False
        self.grid.style = ""
        self.grid.CreateGrid(0, 9)
        self.grid.SetRowLabelSize(62)
        for i in range(9):
            if i in (3, 4):
                size = self.grid.GetDefaultRowSize()
                if i == 4:
                    attr = wx.grid.GridCellAttr()
                    attr.SetBackgroundColour(wx.Colour(0, 0, 0, 0))
                    self.grid.SetColAttr(i, attr)
            else:
                size = 62
            self.grid.SetColSize(i, size)
        for i, label in enumerate(
            ["R", "G", "B", "", "", "L*", "a*", "b*", ""]):
            self.grid.SetColLabelValue(i, label)
        self.grid.SetCellHighlightPenWidth(0)
        self.grid.SetDefaultCellBackgroundColour(
            self.grid.GetLabelBackgroundColour())
        font = self.grid.GetDefaultCellFont()
        if font.PointSize > 11:
            font.PointSize = 11
            self.grid.SetDefaultCellFont(font)
        self.grid.SetSelectionMode(wx.grid.Grid.wxGridSelectRows)
        self.grid.EnableEditing(False)
        self.grid.EnableGridLines(False)
        self.grid.Bind(wx.grid.EVT_GRID_LABEL_LEFT_CLICK,
                       self.grid_left_click_handler)
        self.grid.Bind(wx.grid.EVT_GRID_SELECT_CELL,
                       self.grid_left_click_handler)
        self.sizer.Add(self.grid, 1, wx.EXPAND)

        self.Fit()
        self.SetMinSize(self.GetSize())

        self.keyhandler = keyhandler
        self.id_to_keycode = {}
        if sys.platform == "darwin":
            # Use an accelerator table for tab, space, 0-9, A-Z, numpad,
            # navigation keys and processing keys
            keycodes = [wx.WXK_TAB, wx.WXK_SPACE]
            keycodes.extend(list(range(ord("0"), ord("9"))))
            keycodes.extend(list(range(ord("A"), ord("Z"))))
            keycodes.extend(numpad_keycodes)
            keycodes.extend(nav_keycodes)
            keycodes.extend(processing_keycodes)
            for keycode in keycodes:
                self.id_to_keycode[wx.Window.NewControlId()] = keycode
            accels = []
            for id, keycode in self.id_to_keycode.items():
                self.Bind(wx.EVT_MENU, self.key_handler, id=id)
                accels.append((wx.ACCEL_NORMAL, keycode, id))
                if keycode == wx.WXK_TAB:
                    accels.append((wx.ACCEL_SHIFT, keycode, id))
            self.SetAcceleratorTable(wx.AcceleratorTable(accels))
        else:
            self.Bind(wx.EVT_CHAR_HOOK, self.key_handler)

        self.Bind(wx.EVT_KEY_DOWN, self.key_handler)

        # Event handlers
        self.Bind(wx.EVT_CLOSE, self.OnClose, self)
        self.Bind(wx.EVT_MOVE, self.OnMove, self)
        self.Bind(wx.EVT_SIZE, self.OnResize, self)
        self.timer = wx.Timer(self)
        if handler:
            self.Bind(wx.EVT_TIMER, handler, self.timer)
        self.Bind(wx.EVT_WINDOW_DESTROY, self.OnDestroy, self)

        # Final initialization steps
        for child in self.GetAllChildren():
            if (sys.platform == "win32" and sys.getwindowsversion() >= (6, )
                    and isinstance(child, wx.Panel)):
                # No need to enable double buffering under Linux and Mac OS X.
                # Under Windows, enabling double buffering on the panel seems
                # to work best to reduce flicker.
                child.SetDoubleBuffered(True)
        self.logger = get_file_logger("untethered")
        self._setup()

        self.Show()

        if start_timer:
            self.start_timer()
Esempio n. 5
0
    def __init__(self,
                 parent=None,
                 handler=None,
                 keyhandler=None,
                 start_timer=True,
                 rows=None,
                 cols=None):
        if not rows:
            rows = getcfg("uniformity.rows")
        if not cols:
            cols = getcfg("uniformity.cols")
        BaseFrame.__init__(self,
                           parent,
                           wx.ID_ANY,
                           lang.getstr("report.uniformity"),
                           style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL,
                           name="displayuniformityframe")
        self.SetIcons(get_icon_bundle([256, 48, 32, 16], appname))
        self.SetBackgroundColour(BGCOLOUR)
        self.sizer = wx.GridSizer(rows, cols, 0, 0)
        self.SetSizer(self.sizer)

        self.rows = rows
        self.cols = cols
        self.colors = (wx.WHITE, wx.Colour(192, 192, 192),
                       wx.Colour(128, 128, 128), wx.Colour(64, 64, 64))
        self.labels = {}
        self.panels = []
        self.buttons = []
        for index in range(rows * cols):
            panel = wx_Panel(self, style=wx.BORDER_SIMPLE)
            panel.SetBackgroundColour(BGCOLOUR)
            sizer = wx.BoxSizer(wx.VERTICAL)
            panel.SetSizer(sizer)
            self.panels.append(panel)
            button = FlatShadedNumberedButton(
                panel,
                label=lang.getstr("measure"),
                bitmap=getbitmap("theme/icons/10x10/record"),
                index=index)
            button.Bind(wx.EVT_BUTTON, self.measure)
            self.buttons.append(button)
            label = wx.StaticText(panel)
            label.SetForegroundColour(wx.WHITE)
            self.labels[index] = label
            sizer.Add(label, 1, wx.ALIGN_CENTER)
            sizer.Add(button,
                      0,
                      wx.ALIGN_BOTTOM | wx.ALIGN_CENTER | wx.BOTTOM | wx.LEFT
                      | wx.RIGHT,
                      border=8)
            self.sizer.Add(panel, 1, wx.EXPAND)
        self.disable_buttons()

        self.keyhandler = keyhandler
        self.id_to_keycode = {}
        if sys.platform == "darwin":
            # Use an accelerator table for tab, space, 0-9, A-Z, numpad,
            # navigation keys and processing keys
            keycodes = [wx.WXK_TAB, wx.WXK_SPACE]
            keycodes.extend(list(range(ord("0"), ord("9"))))
            keycodes.extend(list(range(ord("A"), ord("Z"))))
            keycodes.extend(numpad_keycodes)
            keycodes.extend(nav_keycodes)
            keycodes.extend(processing_keycodes)
            for keycode in keycodes:
                self.id_to_keycode[wx.Window.NewControlId()] = keycode
            accels = []
            for id, keycode in self.id_to_keycode.items():
                self.Bind(wx.EVT_MENU, self.key_handler, id=id)
                accels.append((wx.ACCEL_NORMAL, keycode, id))
                if keycode == wx.WXK_TAB:
                    accels.append((wx.ACCEL_SHIFT, keycode, id))
            self.SetAcceleratorTable(wx.AcceleratorTable(accels))
        else:
            self.Bind(wx.EVT_CHAR_HOOK, self.key_handler)

        # Event handlers
        self.Bind(wx.EVT_CLOSE, self.OnClose, self)
        self.Bind(wx.EVT_MOVE, self.OnMove, self)
        self.timer = wx.Timer(self)
        if handler:
            self.Bind(wx.EVT_TIMER, handler, self.timer)
        self.Bind(wx.EVT_WINDOW_DESTROY, self.OnDestroy, self)

        # Final initialization steps
        self.logger = get_file_logger("uniformity")
        self._setup()

        self.Show()

        if start_timer:
            self.start_timer()
Esempio n. 6
0
 def parse_txt(self, txt):
     if not txt:
         return
     self.logger.info("%r" % txt)
     if "Setting up the instrument" in txt:
         self.Pulse(lang.getstr("instrument.initializing"))
     if "Spot read failed" in txt:
         self.last_error = txt
     if "Result is XYZ:" in txt:
         # Result is XYZ: d.dddddd d.dddddd d.dddddd, D50 Lab: d.dddddd d.dddddd d.dddddd
         #							CCT = ddddK (Delta E d.dddddd)
         # Closest Planckian temperature = ddddK (Delta E d.dddddd)
         # Closest Daylight temperature  = ddddK (Delta E d.dddddd)
         XYZ = re.search("XYZ:\s+(\d+\.\d+)\s+(\d+\.\d+)\s+(\d+\.\d+)", txt)
         self.results[self.index].append(
             {"XYZ": [float(value) for value in XYZ.groups()]})
         self.last_error = None
     loci = {"t": "Daylight", "T": "Planckian"}
     for locus in list(loci.values()):
         if locus in txt:
             CT = re.search(
                 "Closest\s+%s\s+temperature\s+=\s+(\d+)K" % locus, txt,
                 re.I)
             self.results[self.index][-1]["C%sT" % locus[0]] = int(
                 CT.groups()[0])
     if "key to take a reading" in txt and not self.last_error:
         safe_print("%s: Got 'key to take a reading'" % appname)
         if not self.is_measuring:
             self.enable_buttons()
             return
         if len(self.results[self.index]) < len(self.colors):
             # Take readings at 5 different brightness levels per swatch
             safe_print("%s: About to take next reading" % appname)
             self.measure()
         else:
             self.is_measuring = False
             self.show_cursor()
             self.enable_buttons()
             self.buttons[self.index].Show()
             self.buttons[self.index].SetFocus()
             self.buttons[self.index].SetBitmap(
                 getbitmap("theme/icons/16x16/checkmark"))
             self.panels[self.index].SetBackgroundColour(BGCOLOUR)
             self.panels[self.index].Refresh()
             self.panels[self.index].Update()
             if len(self.results) == self.rows * self.cols:
                 # All swatches have been measured, show results
                 # Let the user choose a location for the results html
                 display_no, geometry, client_area = self.get_display()
                 # Translate from wx display index to Argyll display index
                 geometry = "%i, %i, %ix%i" % tuple(geometry)
                 for i, display in enumerate(getcfg("displays")):
                     if display.find("@ " + geometry) > -1:
                         safe_print("Found display %s at index %i" %
                                    (display, i))
                         break
                 display = display.replace(" [PRIMARY]", "")
                 defaultFile = "Uniformity Check %s — %s — %s" % (
                     appversion, re.sub(r"[\\/:*?\"<>|]+", "_", display),
                     strftime("%Y-%m-%d %H-%M.html"))
                 defaultDir = get_verified_path(
                     None,
                     os.path.join(getcfg("profile.save_path"),
                                  defaultFile))[0]
                 dlg = wx.FileDialog(self,
                                     lang.getstr("save_as"),
                                     defaultDir,
                                     defaultFile,
                                     wildcard=lang.getstr("filetype.html") +
                                     "|*.html;*.htm",
                                     style=wx.SAVE | wx.FD_OVERWRITE_PROMPT)
                 dlg.Center(wx.BOTH)
                 result = dlg.ShowModal()
                 if result == wx.ID_OK:
                     path = dlg.GetPath()
                     if not waccess(path, os.W_OK):
                         from worker import show_result_dialog
                         show_result_dialog(
                             Error(
                                 lang.getstr("error.access_denied.write",
                                             path)), self)
                         return
                     save_path = os.path.splitext(path)[0] + ".html"
                     setcfg("last_filedialog_path", save_path)
                 dlg.Destroy()
                 if result != wx.ID_OK:
                     return
                 locus = loci.get(getcfg("whitepoint.colortemp.locus"))
                 try:
                     report.create(
                         save_path, {
                             "${REPORT_VERSION}": appversion,
                             "${DISPLAY}": display,
                             "${DATETIME}": strftime("%Y-%m-%d %H:%M:%S"),
                             "${ROWS}": str(self.rows),
                             "${COLS}": str(self.cols),
                             "${RESULTS}": str(self.results),
                             "${LOCUS}": locus
                         }, getcfg("report.pack_js"), "uniformity")
                 except (IOError, OSError) as exception:
                     from worker import show_result_dialog
                     show_result_dialog(exception, self)
                 else:
                     launch_file(save_path)
             if getcfg("uniformity.measure.continuous"):
                 self.measure(event=Event(self.buttons[self.index]))