# -*- coding: utf-8 -*- # # Display the "habitable-zone" (i.e. the range of distances in which you might find an Earth-Like World) # import sys import Tkinter as tk import myNotebook as nb if __debug__: from traceback import print_exc from config import config from l10n import Locale VERSION = '1.00' SETTING_DEFAULT = 2 # Earth-like SETTING_NONE = 0xffff WORLDS = [ # Type Black-body temp range ('Metal-Rich', 0, 1103.0), ('Earth-Like', 278.0, 227.0), ('Water', 307.0, 156.0), ('Ammonia', 193.0, 117.0), ] LS = 300000000.0 # 1 ls in m (approx) this = sys.modules[__name__] # For holding module globals def plugin_start(): return 'HabZone' def plugin_app(parent): frame = tk.Frame(parent) frame.columnconfigure(3, weight=1) this.worlds = [] for (name, high, low) in WORLDS: this.worlds.append((tk.Label(frame, text = name + ':'), tk.Label(frame), tk.Label(frame), tk.Label(frame), tk.Label(frame), )) this.spacer = tk.Frame(frame) # Main frame can't be empty or it doesn't resize update_visibility() return frame def plugin_prefs(parent): frame = nb.Frame(parent) nb.Label(frame, text = 'Display:').grid(row = 0, padx = 10, pady = (10,0), sticky=tk.W) setting = get_setting() this.settings = [] row = 1 for (name, high, low) in WORLDS: var = tk.IntVar(value = (setting & row) and 1) nb.Checkbutton(frame, text = name, variable = var).grid(row = row, padx = 10, pady = 2, sticky=tk.W) this.settings.append(var) row *= 2 nb.Label(frame, text = 'Version %s' % VERSION).grid(padx = 10, pady = 10, sticky=tk.W) return frame def prefs_changed(): row = 1 setting = 0 for var in this.settings: setting += var.get() and row row *= 2 config.set('habzone', setting or SETTING_NONE) this.settings = None update_visibility() def journal_entry(cmdr, system, station, entry, state): if entry['event'] == 'Scan': try: if not float(entry['DistanceFromArrivalLS']): # Only calculate for arrival star r = float(entry['Radius']) t = float(entry['SurfaceTemperature']) for i in range(len(WORLDS)): (name, high, low) = WORLDS[i] (label, near, dash, far, ls) = this.worlds[i] far_dist = int(0.5 + dfort(r, t, low)) radius = int(0.5 + r / LS) if far_dist <= radius: near['text'] = '' dash['text'] = u'×' far['text'] = '' ls['text'] = '' else: if not high: near['text'] = Locale.stringFromNumber(radius) else: near['text'] = Locale.stringFromNumber(int(0.5 + dfort(r, t, high))) dash['text'] = '-' far['text'] = Locale.stringFromNumber(far_dist) ls['text'] = 'ls' except: for (label, near, dash, far, ls) in this.worlds: near['text'] = '' dash['text'] = '' far['text'] = '' ls['text'] = '?' elif entry['event'] == 'FSDJump': for (label, near, dash, far, ls) in this.worlds: near['text'] = '' dash['text'] = '' far['text'] = '' ls['text'] = '' # Distance for target black-body temperature def dfort(r, t, target): return (((r ** 2) * (t ** 4) / (4 * (target ** 4))) ** 0.5) / LS def get_setting(): setting = config.getint('habzone') if setting == 0: return DEFAULT_SETTING # Default to Earth-Like elif setting == SETTING_NONE: return 0 # Explicitly set by the user to display nothing else: return setting def update_visibility(): setting = get_setting() row = 1 for (label, near, dash, far, ls) in this.worlds: if setting & row: label.grid(row = row, column = 0, sticky=tk.W) near.grid(row = row, column = 1, sticky=tk.E) dash.grid(row = row, column = 2, sticky=tk.E) far.grid(row = row, column = 3, sticky=tk.E) ls.grid(row = row, column = 4, sticky=tk.W) else: label.grid_remove() near.grid_remove() dash.grid_remove() far.grid_remove() ls.grid_remove() row *= 2 if setting: this.spacer.grid_remove() else: this.spacer.grid(row = 0)