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()
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()
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()
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()
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]))