From b69e6f54abf04fe34d63f3c09c173ec798e60df9 Mon Sep 17 00:00:00 2001 From: Juan Pablo Caram Date: Wed, 29 Jan 2014 21:00:16 -0500 Subject: [PATCH] App defaults saving. Option transfers. Documentation updates. --- cirkuix.py | 825 +++++++++++--- cirkuix.ui | 1445 ++++++++++++++++++++++-- defaults.json | 4 +- doc/build/.doctrees/environment.pickle | Bin 12462 -> 16927 bytes doc/build/.doctrees/index.doctree | Bin 139805 -> 274158 bytes doc/build/genindex.html | 167 ++- doc/build/index.html | 1031 +++++++++++++++-- doc/build/objects.inv | Bin 807 -> 1074 bytes doc/build/searchindex.js | 2 +- 9 files changed, 3166 insertions(+), 308 deletions(-) diff --git a/cirkuix.py b/cirkuix.py index 62bac4a9..c6914116 100644 --- a/cirkuix.py +++ b/cirkuix.py @@ -9,6 +9,7 @@ from matplotlib.backends.backend_gtk3agg import FigureCanvasGTK3Agg as FigureCan #from matplotlib.backends.backend_cairo import FigureCanvasCairo as FigureCanvas from camlib import * +import sys ######################################## @@ -189,7 +190,7 @@ class CirkuixGerber(CirkuixObj, Gerber): "mergepolys": True, "multicolored": False, "solid": False, - "isotooldia": 0.4/25.4, + "isotooldia": 0.4 / 25.4, "cutoutmargin": 0.2, "cutoutgapsize": 0.15, "gaps": "tb", @@ -320,7 +321,7 @@ class CirkuixExcellon(CirkuixObj, Excellon): box.set_orientation(Gtk.Orientation(1)) win.add(box) for tool in self.tools: - self.tool_cbs[tool] = Gtk.CheckButton(label=tool+": "+self.tools[tool]) + self.tool_cbs[tool] = Gtk.CheckButton(label=tool + ": " + self.tools[tool]) box.pack_start(self.tool_cbs[tool], False, False, 1) button = Gtk.Button(label="Accept") box.pack_start(button, False, False, 1) @@ -338,15 +339,16 @@ class CirkuixExcellon(CirkuixObj, Excellon): button.connect("activate", on_accept) button.connect("clicked", on_accept) - # def parse_lines(self, elines): - # Excellon.parse_lines(self, elines) - # self.options["units"] = self.units + # def parse_lines(self, elines): + # Excellon.parse_lines(self, elines) + # self.options["units"] = self.units class CirkuixCNCjob(CirkuixObj, CNCjob): """ Represents G-Code. """ + def __init__(self, name, units="in", kind="generic", z_move=0.1, feedrate=3.0, z_cut=-0.002, tooldia=0.0): CNCjob.__init__(self, units=units, kind=kind, z_move=z_move, @@ -359,7 +361,7 @@ class CirkuixCNCjob(CirkuixObj, CNCjob): "plot": True, "solid": False, "multicolored": False, - "tooldia": 0.4/25.4 # 0.4mm in inches + "tooldia": 0.4 / 25.4 # 0.4mm in inches }) self.form_kinds.update({ @@ -396,7 +398,7 @@ class CirkuixGeometry(CirkuixObj, Geometry): "cutz": -0.002, "travelz": 0.1, "feedrate": 5.0, - "cnctooldia": 0.4/25.4, + "cnctooldia": 0.4 / 25.4, "painttooldia": 0.0625, "paintoverlap": 0.15, "paintmargin": 0.01 @@ -415,9 +417,6 @@ class CirkuixGeometry(CirkuixObj, Geometry): "paintmargin": "entry_eval" }) - # def convert_units(self, units): - # factor = Geometry.convert_units(self, units) - def scale(self, factor): if type(self.solid_geometry) == list: self.solid_geometry = [affinity.scale(g, factor, factor, origin=(0, 0)) @@ -488,6 +487,7 @@ class App: def __init__(self): """ Starts the application and the Gtk.main(). + @return: app @rtype: App """ @@ -509,42 +509,76 @@ class App: self.progress_bar.set_show_text(True) self.units_label = self.builder.get_object("label_units") + # White (transparent) background on the "Options" tab. + self.builder.get_object("vp_options").override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(1, 1, 1, 1)) + + # Combo box to choose between project and application options. + self.combo_options = self.builder.get_object("combo_options") + self.combo_options.set_active(1) + ## Event handling ## self.builder.connect_signals(self) - + ## Make plot area ## self.figure = None self.axes = None self.canvas = None self.setup_plot() - - self.setup_component_viewer() + + self.setup_project_list() self.setup_component_editor() - + ## DATA ## self.setup_obj_classes() self.stuff = {} # CirkuixObj's by name self.mouse = None # Mouse coordinates over plot - + # What is selected by the user. It is # a key if self.stuff self.selected_item_name = None + # Used to inhibit the on_options_update callback when + # the options are being changed by the program and not the user. + self.options_update_ignore = False + self.defaults = { "units": "in" } # Application defaults self.options = {} # Project options + self.form_kinds = { + "units": "radio" + } + + self.radios = {"units": {"rb_inch": "IN", "rb_mm": "MM"}, + "gerber_gaps": {"rb_app_2tb": "tb", "rb_app_2lr": "lr", "rb_app_4": "4"}} + self.radios_inv = {"units": {"IN": "rb_inch", "MM": "rb_mm"}, + "gerber_gaps": {"tb": "rb_app_2tb", "lr": "rb_app_2lr", "4": "rb_app_4"}} + + # self.combos = [] + + # Options for each kind of CirkuixObj. + # Example: 'gerber_plot': 'cb'. The widget name would be: 'cb_app_gerber_plot' + for CirkuixClass in [CirkuixExcellon, CirkuixGeometry, CirkuixGerber, CirkuixCNCjob]: + obj = CirkuixClass("no_name") + for option in obj.form_kinds: + self.form_kinds[obj.kind + "_" + option] = obj.form_kinds[option] + # if obj.form_kinds[option] == "radio": + # self.radios.update({obj.kind + "_" + option: obj.radios[option]}) + # self.radios_inv.update({obj.kind + "_" + option: obj.radios_inv[option]}) + self.plot_click_subscribers = {} # Initialization self.load_defaults() - self.options.update(self.defaults) + self.options.update(self.defaults) # Copy app defaults to project options + self.options2form() # Populate the app defaults form self.units_label.set_text("[" + self.options["units"] + "]") # For debugging only def someThreadFunc(self): print "Hello World!" + t = threading.Thread(target=someThreadFunc, args=(self,)) t.start() @@ -553,14 +587,16 @@ class App: ######################################## self.window.set_default_size(900, 600) self.window.show_all() - + def setup_plot(self): """ - Sets up the main plotting area by creating a matplotlib + Sets up the main plotting area by creating a Matplotlib figure in self.canvas, adding axes and configuring them. These axes should not be ploted on and are just there to display the axes ticks and grid. - @return: None + + :return: None + :rtype: None """ self.figure = Figure(dpi=50) @@ -571,7 +607,7 @@ class App: #self.axes.plot(t,s) self.axes.grid(True) self.figure.patch.set_visible(False) - + self.canvas = FigureCanvas(self.figure) # a Gtk.DrawingArea self.canvas.set_hexpand(1) self.canvas.set_vexpand(1) @@ -583,36 +619,43 @@ class App: self.canvas.mpl_connect('key_press_event', self.on_key_over_plot) #self.canvas.mpl_connect('scroll_event', self.on_scroll_over_plot) self.canvas.connect("configure-event", self.on_canvas_configure) - + self.grid.attach(self.canvas, 0, 0, 600, 400) def setup_obj_classes(self): + """ + Sets up application specifics on the CirkuixObj class. + + :return: None + """ CirkuixObj.app = self - def setup_component_viewer(self): + def setup_project_list(self): """ Sets up list or Tree where whatever has been loaded or created is displayed. - @return: None + + :return: None """ self.store = Gtk.ListStore(str) self.tree = Gtk.TreeView(self.store) #self.list = Gtk.ListBox() self.tree.connect("row_activated", self.on_row_activated) - self.tree_select = self.tree.get_selection() + self.tree_select = self.tree.get_selection() self.signal_id = self.tree_select.connect("changed", self.on_tree_selection_changed) renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn("Title", renderer, text=0) self.tree.append_column(column) self.builder.get_object("box_project").pack_start(self.tree, False, False, 1) - + def setup_component_editor(self): """ Initial configuration of the component editor. Creates a page titled "Selection" on the notebook on the left side of the main window. - @return: None + + :return: None """ box_selected = self.builder.get_object("box_selected") @@ -633,36 +676,43 @@ class App: def info(self, text): """ Show text on the status bar. - @return: None - """ + :param text: Text to display. + :type text: str + :return: None + """ self.info_label.set_text(text) def zoom(self, factor, center=None): """ Zooms the plot by factor around a given center point. Takes care of re-drawing. - @return: None + + :param factor: Number by which to scale the plot. + :type factor: float + :param center: Coordinates [x, y] of the point around which to scale the plot. + :type center: list + :return: None """ xmin, xmax = self.axes.get_xlim() ymin, ymax = self.axes.get_ylim() - width = xmax-xmin - height = ymax-ymin + width = xmax - xmin + height = ymax - ymin if center is None: - center = [(xmin+xmax)/2.0, (ymin+ymax)/2.0] + center = [(xmin + xmax) / 2.0, (ymin + ymax) / 2.0] # For keeping the point at the pointer location - relx = (xmax-center[0])/width - rely = (ymax-center[1])/height + relx = (xmax - center[0]) / width + rely = (ymax - center[1]) / height - new_width = width/factor - new_height = height/factor + new_width = width / factor + new_height = height / factor - xmin = center[0]-new_width*(1-relx) - xmax = center[0]+new_width*relx - ymin = center[1]-new_height*(1-rely) - ymax = center[1]+new_height*rely + xmin = center[0] - new_width * (1 - relx) + xmax = center[0] + new_width * relx + ymin = center[1] - new_height * (1 - rely) + ymax = center[1] + new_height * rely for name in self.stuff: self.stuff[name].axes.set_xlim((xmin, xmax)) @@ -676,7 +726,8 @@ class App: """ Clears and re-populates the list of objects in currently in the project. - @return: None + + :return: None """ print "build_list(): clearing" self.tree_select.unselect_all() @@ -689,9 +740,12 @@ class App: def get_radio_value(self, radio_set): """ - Returns the radio_set[key] if the radiobutton + Returns the radio_set[key] of the radiobutton whose name is key is active. - @return: radio_set[key] + + :param radio_set: A dictionary containing widget_name: value pairs. + :type radio_set: dict + :return: radio_set[key] """ for name in radio_set: @@ -701,7 +755,8 @@ class App: def plot_all(self): """ Re-generates all plots from all objects. - @return: None + + :return: None """ self.clear_plots() self.set_progress_bar(0.1, "Re-plotting...") @@ -709,7 +764,7 @@ class App: def thread_func(app_obj): percentage = 0.1 try: - delta = 0.9/len(self.stuff) + delta = 0.9 / len(self.stuff) except ZeroDivisionError: GLib.timeout_add(300, lambda: app_obj.set_progress_bar(0.0, "")) return @@ -726,11 +781,12 @@ class App: t = threading.Thread(target=thread_func, args=(self,)) t.daemon = True t.start() - + def clear_plots(self): """ Clears self.axes and self.figure. - @return: None + + :return: None """ # TODO: Create a setup_axes method that gets called here and in setup_plot? @@ -745,8 +801,10 @@ class App: """ Runs eval() on the on the text entry of name 'widget_name' and returns the results. - @param widget_name: Name of Gtk.Entry - @return: Depends on contents of the entry text. + + :param widget_name: Name of Gtk.Entry + :type widget_name: str + :return: Depends on contents of the entry text. """ value = self.builder.get_object(widget_name).get_text() @@ -756,9 +814,11 @@ class App: """ Marks a given object as selected in the list ob objects in the GUI. This selection will in turn trigger - self.on_tree_selection_changed(). - @param name: Name of the object. - @return: None + ``self.on_tree_selection_changed()``. + + :param name: Name of the object. + :type name: str + :return: None """ iter = self.store.get_iter_first() @@ -814,6 +874,12 @@ class App: GLib.idle_add(lambda: self.info("Converting units to " + self.options["units"] + ".")) obj.convert_units(self.options["units"]) + # Set default options from self.options + for option in self.options: + if option.find(kind + "_") == 0: + oname = option[len(kind)+1:] + obj.options[oname] = self.options[option] + # Add to our records self.stuff[name] = obj @@ -834,6 +900,15 @@ class App: return obj def set_progress_bar(self, percentage, text=""): + """ + Sets the application's progress bar to a given fraction and text. + + :param percentage: The fraction (0.0-1.0) of the progress. + :type percentage: float + :param text: Text to display on the progress bar. + :type text: str + :return: + """ self.progress_bar.set_text(text) self.progress_bar.set_fraction(percentage) return False @@ -844,8 +919,9 @@ class App: def get_current(self): """ Returns the currently selected CirkuixObj in the application. - @return: Currently selected CirkuixObj in the application. - @rtype: CirkuixObj + + :return: Currently selected CirkuixObj in the application. + :rtype: CirkuixObj or None """ try: return self.stuff[self.selected_item_name] @@ -853,26 +929,41 @@ class App: return None def adjust_axes(self, xmin, ymin, xmax, ymax): + """ + Adjusts axes of all plots while maintaining the use of the whole canvas + and an aspect ratio to 1:1 between x and y axes. The parameters are an original + request that will be modified to fit these restrictions. + + :param xmin: Requested minimum value for the X axis. + :type xmin: float + :param ymin: Requested minimum value for the Y axis. + :type ymin: float + :param xmax: Requested maximum value for the X axis. + :type xmax: float + :param ymax: Requested maximum value for the Y axis. + :type ymax: float + :return: None + """ m_x = 15 # pixels m_y = 25 # pixels - width = xmax-xmin - height = ymax-ymin - r = width/height + width = xmax - xmin + height = ymax - ymin + r = width / height Fw, Fh = self.canvas.get_width_height() - Fr = float(Fw)/Fh - x_ratio = float(m_x)/Fw - y_ratio = float(m_y)/Fh + Fr = float(Fw) / Fh + x_ratio = float(m_x) / Fw + y_ratio = float(m_y) / Fh if r > Fr: - ycenter = (ymin+ymax)/2.0 - newheight = height*r/Fr - ymin = ycenter-newheight/2.0 - ymax = ycenter+newheight/2.0 + ycenter = (ymin + ymax) / 2.0 + newheight = height * r / Fr + ymin = ycenter - newheight / 2.0 + ymax = ycenter + newheight / 2.0 else: - xcenter = (xmax+ymin)/2.0 - newwidth = width*Fr/r - xmin = xcenter-newwidth/2.0 - xmax = xcenter+newwidth/2.0 + xcenter = (xmax + ymin) / 2.0 + newwidth = width * Fr / r + xmin = xcenter - newwidth / 2.0 + xmax = xcenter + newwidth / 2.0 for name in self.stuff: if self.stuff[name].axes is None: @@ -880,15 +971,21 @@ class App: self.stuff[name].axes.set_xlim((xmin, xmax)) self.stuff[name].axes.set_ylim((ymin, ymax)) self.stuff[name].axes.set_position([x_ratio, y_ratio, - 1-2*x_ratio, 1-2*y_ratio]) + 1 - 2 * x_ratio, 1 - 2 * y_ratio]) self.axes.set_xlim((xmin, xmax)) self.axes.set_ylim((ymin, ymax)) self.axes.set_position([x_ratio, y_ratio, - 1-2*x_ratio, 1-2*y_ratio]) + 1 - 2 * x_ratio, 1 - 2 * y_ratio]) self.canvas.queue_draw() def load_defaults(self): + """ + Loads the aplication's default settings from defaults.json into + ``self.defaults``. + + :return: None + """ try: f = open("defaults.json") options = f.read() @@ -900,22 +997,295 @@ class App: try: defaults = json.loads(options) except: + e = sys.exc_info()[0] + print e self.info("ERROR: Failed to parse defaults file.") return self.defaults.update(defaults) + def read_form(self): + """ + Reads the options form into self.defaults/self.options. + + :return: None + :rtype: None + """ + combo_sel = self.combo_options.get_active() + options_set = [self.options, self.defaults][combo_sel] + for option in options_set: + self.read_form_item(option, options_set) + + def read_form_item(self, name, dest): + """ + Reads the value of a form item in the defaults/options form and + saves it to the corresponding dictionary. + + :param name: Name of the form item. A key in ``self.defaults`` or + ``self.options``. + :type name: str + :param dest: Dictionary to which to save the value. + :type dest: dict + :return: None + """ + fkind = self.form_kinds[name] + fname = fkind + "_" + "app" + "_" + name + + if fkind == 'entry_text': + dest[name] = self.builder.get_object(fname).get_text() + return + if fkind == 'entry_eval': + dest[name] = self.get_eval(fname) + return + if fkind == 'cb': + dest[name] = self.builder.get_object(fname).get_active() + return + if fkind == 'radio': + dest[name] = self.get_radio_value(self.radios[name]) + return + print "Unknown kind of form item:", fkind + + def options2form(self): + """ + Sets the 'Project Options' or 'Application Defaults' form with values from + ``self.options``or ``self.defaults``. + :return : None + :rtype : None + """ + + # Set the on-change callback to do nothing while we do the changes. + self.options_update_ignore = True + + combo_sel = self.combo_options.get_active() + options_set = [self.options, self.defaults][combo_sel] + for option in options_set: + self.set_form_item(option, options_set[option]) + + self.options_update_ignore = False + + def set_form_item(self, name, value): + """ + Sets a form item 'name' in the GUI with the given 'value'. The syntax of + form names in the GUI is _app_, where kind is one of: rb (radio button), + cb (check button), entry_eval or entry_text (entry), combo (combo box). name is + whatever name it's been given. For self.defaults, name is a key in the dictionary. + + :param name: Name of the form field. + :type name: str + :param value: The value to set the form field to. + :type value: Depends on field kind. + :return: None + """ + if name not in self.form_kinds: + print "WARNING: Tried to set unknown option/form item:", name + return + fkind = self.form_kinds[name] + fname = fkind + "_" + "app" + "_" + name + if fkind == 'entry_eval' or fkind == 'entry_text': + try: + self.builder.get_object(fname).set_text(str(value)) + except: + print "ERROR: Failed to set value of %s to %s" % (fname, str(value)) + return + if fkind == 'cb': + try: + self.builder.get_object(fname).set_active(value) + except: + print "ERROR: Failed to set value of %s to %s" % (fname, str(value)) + return + if fkind == 'radio': + try: + self.builder.get_object(self.radios_inv[name][value]).set_active(True) + except: + print "ERROR: Failed to set value of %s to %s" % (fname, str(value)) + return + print "Unknown kind of form item:", fkind + ######################################## ## EVENT HANDLERS ## ######################################## + def on_options_app2project(self, param): + """ + Callback for Options->Transfer Options->App=>Project. Copies options + from application defaults to project defaults. + + :param param: Ignored. + :return: None + """ + self.options.update(self.defaults) + self.options2form() # Update UI + + def on_options_project2app(self, param): + """ + Callback for Options->Transfer Options->Project=>App. Copies options + from project defaults to application defaults. + + :param param: Ignored. + :return: None + """ + self.defaults.update(self.options) + self.options2form() # Update UI + + def on_options_project2object(self, param): + """ + Callback for Options->Transfer Options->Project=>Object. Copies options + from project defaults to the currently selected object. + + :param param: Ignored. + :return: None + """ + obj = self.get_current() + if obj is None: + print "WARNING: No object selected." + return + for option in self.options: + if option.find(obj.kind + "_") == 0: + oname = option[len(obj.kind)+1:] + obj.options[oname] = self.options[option] + obj.to_form() # Update UI + + def on_options_object2project(self, param): + """ + Callback for Options->Transfer Options->Object=>Project. Copies options + from the currently selected object to project defaults. + + :param param: Ignored. + :return: None + """ + obj = self.get_current() + if obj is None: + print "WARNING: No object selected." + return + obj.read_form() + for option in obj.options: + if option in ['name']: # TODO: Handle this better... + continue + self.options[obj.kind + "_" + option] = obj.options[option] + self.options2form() # Update UI + + def on_options_object2app(self, param): + """ + Callback for Options->Transfer Options->Object=>App. Copies options + from the currently selected object to application defaults. + + :param param: Ignored. + :return: None + """ + obj = self.get_current() + if obj is None: + print "WARNING: No object selected." + return + obj.read_form() + for option in obj.options: + if option in ['name']: # TODO: Handle this better... + continue + self.defaults[obj.kind + "_" + option] = obj.options[option] + self.options2form() # Update UI + + def on_options_app2object(self, param): + """ + Callback for Options->Transfer Options->App=>Object. Copies options + from application defaults to the currently selected object. + + :param param: Ignored. + :return: None + """ + obj = self.get_current() + if obj is None: + print "WARNING: No object selected." + return + for option in self.defaults: + if option.find(obj.kind + "_") == 0: + oname = option[len(obj.kind)+1:] + obj.options[oname] = self.defaults[option] + obj.to_form() # Update UI + + def on_file_savedefaults(self, param): + """ + Callback for menu item File->Save Defaults. Saves application default options + (``self.defaults``) to defaults.json. + + :param param: Ignored. + :return: None + """ + try: + f = open("defaults.json") + options = f.read() + f.close() + except: + self.info("ERROR: Could not load defaults file.") + return + + try: + defaults = json.loads(options) + except: + e = sys.exc_info()[0] + print e + self.info("ERROR: Failed to parse defaults file.") + return + + assert isinstance(defaults, dict) + defaults.update(self.defaults) + + try: + f = open("defaults.json", "w") + json.dump(defaults, f) + f.close() + except: + self.info("ERROR: Failed to write defaults to file.") + return + + self.info("Defaults saved.") + + def on_options_combo_change(self, widget): + """ + Called when the combo box to choose between application defaults and + project option changes value. The corresponding variables are + copied to the UI. + + :param widget: The widget from which this was called. Ignore. + :return: None + """ + combo_sel = self.combo_options.get_active() + print "Options --> ", combo_sel + self.options2form() + + def on_options_update(self, widget): + """ + Called whenever a value in the options/defaults form changes. + All values are updated. Can be inhibited by setting ``self.options_update_ignore = True``, + which may be necessary when updating the UI from code and not by the user. + + :param widget: The widget from which this was called. Ignore. + :return: None + """ + if self.options_update_ignore: + return + self.read_form() def on_scale_object(self, widget): + """ + Callback for request to change an objects geometry scale. The object + is re-scaled and replotted. + + :param widget: Ignored. + :return: None + """ obj = self.get_current() + assert isinstance(obj, CirkuixObj) factor = self.get_eval("entry_eval_" + obj.kind + "_scalefactor") obj.scale(factor) obj.to_form() self.on_update_plot(None) def on_canvas_configure(self, widget, event): + """ + Called whenever the canvas changes size. The axes are updated such + as to use the whole canvas. + + :param widget: Ignored. + :param event: Ignored. + :return: None + """ print "on_canvas_configure()" xmin, xmax = self.axes.get_xlim() @@ -923,9 +1293,26 @@ class App: self.adjust_axes(xmin, ymin, xmax, ymax) def on_row_activated(self, widget, path, col): + """ + Callback for selection activation (Enter or double-click) on the Project list. + Switches the notebook page to the object properties form. Calls + ``self.notebook.set_current_page(1)``. + + :param widget: Ignored. + :param path: Ignored. + :param col: Ignored. + :return: None + """ self.notebook.set_current_page(1) def on_generate_gerber_bounding_box(self, widget): + """ + Callback for request from the Gerber form to generate a bounding box for the + geometry in the object. Creates a CirkuixGeometry with the bounding box. + + :param widget: Ignored. + :return: None + """ gerber = self.get_current() gerber.read_form() name = self.selected_item_name + "_bbox" @@ -942,9 +1329,10 @@ class App: def on_update_plot(self, widget): """ Callback for button on form for all kinds of objects. - Re-plot the current object only. - @param widget: The widget from which this was called. - @return: None + Re-plots the current object only. + + :param widget: The widget from which this was called. + :return: None """ print "Re-plotting" @@ -968,8 +1356,9 @@ class App: """ Callback for button active/click on Excellon form to create a CNC Job for the Excellon file. - @param widget: The widget from which this was called. - @return: None + + :param widget: The widget from which this was called. + :return: None """ job_name = self.selected_item_name + "_cnc" @@ -1015,14 +1404,23 @@ class App: """ Callback for button on Excellon form to open up a window for selecting tools. - @param widget: The widget from which this was called. - @return: None + + :param widget: The widget from which this was called. + :return: None """ excellon = self.get_current() assert isinstance(excellon, CirkuixExcellon) excellon.show_tool_chooser() def on_entry_eval_activate(self, widget): + """ + Called when an entry is activated (eg. by hitting enter) if + set to do so. Its text is eval()'d and set to the returned value. + The current object is updated. + + :param widget: + :return: + """ self.on_eval_update(widget) obj = self.get_current() assert isinstance(obj, CirkuixObj) @@ -1033,8 +1431,9 @@ class App: Callback for button on Gerber form to create a geometry object with polygons covering the area without copper or negative of the Gerber. - @param widget: The widget from which this was called. - @return: None + + :param widget: The widget from which this was called. + :return: None """ name = self.selected_item_name + "_noncopper" @@ -1054,8 +1453,9 @@ class App: """ Callback for button on Gerber form to create geometry with lines for cutting off the board. - @param widget: The widget from which this was called. - @return: None + + :param widget: The widget from which this was called. + :return: None """ name = self.selected_item_name + "_cutout" @@ -1072,18 +1472,18 @@ class App: midx = 0.5 * (minx + maxx) midy = 0.5 * (miny + maxy) hgap = 0.5 * gap_size - pts = [[midx-hgap, maxy], + pts = [[midx - hgap, maxy], [minx, maxy], - [minx, midy+hgap], - [minx, midy-hgap], + [minx, midy + hgap], + [minx, midy - hgap], [minx, miny], - [midx-hgap, miny], - [midx+hgap, miny], + [midx - hgap, miny], + [midx + hgap, miny], [maxx, miny], - [maxx, midy-hgap], - [maxx, midy+hgap], + [maxx, midy - hgap], + [maxx, midy + hgap], [maxx, maxy], - [midx+hgap, maxy]] + [midx + hgap, maxy]] cases = {"tb": [[pts[0], pts[1], pts[4], pts[5]], [pts[6], pts[7], pts[10], pts[11]]], "lr": [[pts[9], pts[10], pts[1], pts[2]], @@ -1103,8 +1503,9 @@ class App: Modifies the content of a Gtk.Entry by running eval() on its contents and puting it back as a string. - @param widget: The widget from which this was called. - @return: None + + :param widget: The widget from which this was called. + :return: None """ # TODO: error handling here widget.set_text(str(eval(widget.get_text()))) @@ -1112,8 +1513,9 @@ class App: def on_generate_isolation(self, widget): """ Callback for button on Gerber form to create isolation routing geometry. - @param widget: The widget from which this was called. - @return: None + + :param widget: The widget from which this was called. + :return: None """ print "Generating Isolation Geometry:" iso_name = self.selected_item_name + "_iso" @@ -1122,7 +1524,7 @@ class App: # TODO: Object must be updated on form change and the options # TODO: read from the object. tooldia = app_obj.get_eval("entry_eval_gerber_isotooldia") - geo_obj.solid_geometry = self.get_current().isolation_geometry(tooldia/2.0) + geo_obj.solid_geometry = self.get_current().isolation_geometry(tooldia / 2.0) # TODO: Do something if this is None. Offer changing name? self.new_object("geometry", iso_name, iso_init) @@ -1130,8 +1532,9 @@ class App: def on_generate_cncjob(self, widget): """ Callback for button on geometry form to generate CNC job. - @param widget: The widget from which this was called. - @return: None + + :param widget: The widget from which this was called. + :return: None """ print "Generating CNC job" job_name = self.selected_item_name + "_cnc" @@ -1178,6 +1581,9 @@ class App: after the click. Finds the polygon containing the clicked point and runs clear_poly() on it, resulting in a new CirkuixGeometry object. + + :param widget: The widget from which this was called. + :return: None """ self.info("Click inside the desired polygon.") geo = self.get_current() @@ -1205,19 +1611,27 @@ class App: self.plot_click_subscribers["generate_paintarea"] = doit def on_cncjob_exportgcode(self, widget): + """ + Called from button on CNCjob form to save the G-Code from the object. + + :param widget: The widget from which this was called. + :return: None + """ def on_success(self, filename): cncjob = self.get_current() f = open(filename, 'w') f.write(cncjob.gcode) f.close() print "Saved to:", filename + self.file_chooser_save_action(on_success) def on_delete(self, widget): """ Delete the currently selected CirkuixObj. - @param widget: The widget from which this was called. - @return: + + :param widget: The widget from which this was called. + :return: None """ print "on_delete():", self.selected_item_name @@ -1230,17 +1644,32 @@ class App: # Update UI self.build_list() # Update the items list - + def on_replot(self, widget): + """ + Callback for toolbar button. Re-plots all objects. + + :param widget: The widget from which this was called. + :return: None + """ self.plot_all() - + def on_clear_plots(self, widget): + """ + Callback for toolbar button. Clears all plots. + + :param widget: The widget from which this was called. + :return: None + """ self.clear_plots() - + def on_activate_name(self, entry): """ Hitting 'Enter' after changing the name of an item updates the item dictionary and re-builds the item list. + + :param entry: The widget from which this was called. + :return: None """ # Disconnect event listener @@ -1256,15 +1685,16 @@ class App: # Reconnect event listener self.signal_id = self.tree.get_selection().connect( - "changed", self.on_tree_selection_changed) + "changed", self.on_tree_selection_changed) def on_tree_selection_changed(self, selection): """ Callback for selection change in the project list. This changes the currently selected CirkuixObj. - @param selection: Selection associated to the project tree or list - @type selection: Gtk.TreeSelection - @return: None + + :param selection: Selection associated to the project tree or list + :type selection: Gtk.TreeSelection + :return: None """ print "on_tree_selection_change(): ", model, treeiter = selection.get_selected() @@ -1284,6 +1714,13 @@ class App: self.setup_component_editor() def on_file_new(self, param): + """ + Callback for menu item File->New. Returns the application to its + startup state. + + :param param: Whatever is passed by the event. Ignore. + :return: None + """ # Remove everythong from memory # Clear plot self.clear_plots() @@ -1301,24 +1738,43 @@ class App: #print "File->New not implemented yet." def on_filequit(self, param): + """ + Callback for menu item File->Quit. Closes the application. + + :param param: Whatever is passed by the event. Ignore. + :return: None + """ print "quit from menu" self.window.destroy() Gtk.main_quit() - + def on_closewindow(self, param): + """ + Callback for closing the main window. + + :param param: Whatever is passed by the event. Ignore. + :return: None + """ print "quit from X" self.window.destroy() Gtk.main_quit() - + def file_chooser_action(self, on_success): """ Opens the file chooser and runs on_success on a separate thread upon completion of valid file choice. + + :param on_success: A function to run upon completion of a valid file + selection. Takes 2 parameters: The app instance and the filename. + Note that it is run on a separate thread, therefore it must take the + appropriate precautions when accessing shared resources. + :type on_success: func + :return: None """ dialog = Gtk.FileChooserDialog("Please choose a file", self.window, - Gtk.FileChooserAction.OPEN, - (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, - Gtk.STOCK_OPEN, Gtk.ResponseType.OK)) + Gtk.FileChooserAction.OPEN, + (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_OPEN, Gtk.ResponseType.OK)) response = dialog.run() if response == Gtk.ResponseType.OK: filename = dialog.get_filename() @@ -1329,17 +1785,21 @@ class App: #on_success(self, filename) elif response == Gtk.ResponseType.CANCEL: print("Cancel clicked") - dialog.destroy() - + dialog.destroy() + def file_chooser_save_action(self, on_success): """ - Opens the file chooser and runs on_success - upon completion of valid file choice. + Opens the file chooser and runs on_success upon completion of valid file choice. + + :param on_success: A function to run upon selection of a filename. Takes 2 + parameters: The instance of the application (App) and the chosen filename. This + gets run immediately in the same thread. + :return: None """ dialog = Gtk.FileChooserDialog("Save file", self.window, - Gtk.FileChooserAction.SAVE, - (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, - Gtk.STOCK_SAVE, Gtk.ResponseType.OK)) + Gtk.FileChooserAction.SAVE, + (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_SAVE, Gtk.ResponseType.OK)) dialog.set_current_name("Untitled") response = dialog.run() if response == Gtk.ResponseType.OK: @@ -1349,9 +1809,16 @@ class App: elif response == Gtk.ResponseType.CANCEL: print("Cancel clicked") dialog.destroy() - - def on_fileopengerber(self, param): + def on_fileopengerber(self, param): + """ + Callback for menu item File->Open Gerber. Defines a function that is then passed + to ``self.file_chooser_action()``. It requests the creation of a CirkuixGerber object + and updates the progress bar throughout the process. + + :param param: Ignore + :return: None + """ # IMPORTANT: on_success will run on a separate thread. Use # GLib.idle_add(function, **kwargs) to launch actions that will # updata the GUI. @@ -1372,9 +1839,16 @@ class App: # on_success gets run on a separate thread self.file_chooser_action(on_success) - - def on_fileopenexcellon(self, param): + def on_fileopenexcellon(self, param): + """ + Callback for menu item File->Open Excellon. Defines a function that is then passed + to ``self.file_chooser_action()``. It requests the creation of a CirkuixExcellon object + and updates the progress bar throughout the process. + + :param param: Ignore + :return: None + """ # IMPORTANT: on_success will run on a separate thread. Use # GLib.idle_add(function, **kwargs) to launch actions that will # updata the GUI. @@ -1395,9 +1869,16 @@ class App: # on_success gets run on a separate thread self.file_chooser_action(on_success) - - def on_fileopengcode(self, param): + def on_fileopengcode(self, param): + """ + Callback for menu item File->Open G-Code. Defines a function that is then passed + to ``self.file_chooser_action()``. It requests the creation of a CirkuixCNCjob object + and updates the progress bar throughout the process. + + :param param: Ignore + :return: None + """ # IMPORTANT: on_success will run on a separate thread. Use # GLib.idle_add(function, **kwargs) to launch actions that will # updata the GUI. @@ -1430,44 +1911,82 @@ class App: # on_success gets run on a separate thread self.file_chooser_action(on_success) - + def on_mouse_move_over_plot(self, event): - try: # May fail in case mouse not within axes - self.position_label.set_label("X: %.4f Y: %.4f"%( - event.xdata, event.ydata)) + """ + Callback for the mouse motion event over the plot. This event is generated + by the Matplotlib backend and has been registered in ``self.__init__()``. + For details, see: http://matplotlib.org/users/event_handling.html + + :param event: Contains information about the event. + :return: None + """ + try: # May fail in case mouse not within axes + self.position_label.set_label("X: %.4f Y: %.4f" % ( + event.xdata, event.ydata)) self.mouse = [event.xdata, event.ydata] except: self.position_label.set_label("") self.mouse = None - + def on_click_over_plot(self, event): + """ + Callback for the mouse click event over the plot. This event is generated + by the Matplotlib backend and has been registered in ``self.__init__()``. + For details, see: http://matplotlib.org/users/event_handling.html + + :param event: + :return: + """ # For key presses self.canvas.grab_focus() try: - print 'button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%( - event.button, event.x, event.y, event.xdata, event.ydata) + print 'button=%d, x=%d, y=%d, xdata=%f, ydata=%f' % ( + event.button, event.x, event.y, event.xdata, event.ydata) for subscriber in self.plot_click_subscribers: self.plot_click_subscribers[subscriber](event) except Exception, e: print "Outside plot!" - + def on_zoom_in(self, event): + """ + Callback for zoom-in request. This can be either from the corresponding + toolbar button or the '3' key when the canvas is focused. Calls ``self.zoom()``. + + :param event: Ignored. + :return: None + """ self.zoom(1.5) return - + def on_zoom_out(self, event): - self.zoom(1/1.5) - + """ + Callback for zoom-out request. This can be either from the corresponding + toolbar button or the '2' key when the canvas is focused. Calls ``self.zoom()``. + + :param event: Ignored. + :return: None + """ + self.zoom(1 / 1.5) + def on_zoom_fit(self, event): + """ + Callback for zoom-out request. This can be either from the corresponding + toolbar button or the '1' key when the canvas is focused. Calls ``self.adjust_axes()`` + with axes limits from the geometry bounds of all objects. + + :param event: Ignored. + :return: None + """ xmin, ymin, xmax, ymax = get_bounds(self.stuff) - width = xmax-xmin - height = ymax-ymin - xmin -= 0.05*width - xmax += 0.05*width - ymin -= 0.05*height - ymax += 0.05*height + width = xmax - xmin + height = ymax - ymin + xmin -= 0.05 * width + xmax += 0.05 * width + ymin -= 0.05 * height + ymax += 0.05 * height self.adjust_axes(xmin, ymin, xmax, ymax) # def on_scroll_over_plot(self, event): @@ -1480,21 +1999,37 @@ class App: # # def on_window_scroll(self, event): # print "Scroll" - + def on_key_over_plot(self, event): + """ + Callback for the key pressed event when the canvas is focused. Keyboard + shortcuts are handled here. So far, these are the shortcuts: + + ========== ============================================ + Key Action + ========== ============================================ + '1' Zoom-fit. Fits the axes limits to the data. + '2' Zoom-out. + '3' Zoom-in. + ========== ============================================ + + :param event: Ignored. + :return: None + """ print 'you pressed', event.key, event.xdata, event.ydata - + if event.key == '1': # 1 self.on_zoom_fit(None) return - + if event.key == '2': # 2 - self.zoom(1/1.5, self.mouse) + self.zoom(1 / 1.5, self.mouse) return - + if event.key == '3': # 3 self.zoom(1.5, self.mouse) return + app = App() Gtk.main() diff --git a/cirkuix.ui b/cirkuix.ui index 6f4e4238..cd2651a2 100644 --- a/cirkuix.ui +++ b/cirkuix.ui @@ -16,6 +16,16 @@ False gtk-open + + True + False + gtk-save + + + True + False + gtk-jump-to + False @@ -2036,6 +2046,23 @@ False + + + Save defaults + True + False + Saves the application's default options to file. + image4 + False + + + + + + True + False + + gtk-quit @@ -2077,8 +2104,95 @@ True False - _Tools + _Options True + + + True + False + + + Transfer options + True + False + image5 + False + + + True + False + + + True + False + Make the application's default options +equal to the current project's default options. + Project => App + True + + + + + + True + False + Make the project's options equal to the +application's default options. + App => Project + True + + + + + + True + False + Make the current object's +options be project defaults. + Object => Project + True + + + + + + True + False + Make the current object's +options be application defaults. + Object => App + True + + + + + + True + False + Set the current object's options +to project defaults. + Project => Object + True + + + + + + True + False + Set the current object's options +to application defaults. + App => Object + True + + + + + + + + + @@ -2274,108 +2388,1259 @@ + 400 True False True True vertical - + True - False - vertical + True + True + never + in - - True - False - 5 - 3 - PROJECT - - - - - - False - True - 0 - - - - + True False - - - - - - - - - - - - - - - - - - - - - - - - - + + True + False + 5 + 5 + 5 + True + vertical + + + True + False + 10 + 10 + 5 + 10 + 0 + 1 + + PROJECT OPTIONS + APPLICATION DEFAULTS + + + + + False + True + 0 + + + + + + + + + + + True + False + 5 + + + True + False + 1 + Units: + + + False + True + 0 + + + + + True + False + 8 + + + inch + True + True + False + 0 + True + True + + + False + True + 0 + + + + + mm + True + True + False + 0 + True + rb_inch + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 3 + + + + + True + False + 3 + Gerber Object + + + + + + False + True + 4 + + + + + True + False + 5 + 0 + 3 + Plot Options: + + + + + + False + True + 5 + + + + + Plot + True + True + False + 0 + True + True + + + + False + True + 6 + + + + + Merge Polygons + True + True + False + 0 + True + True + + + + False + True + 7 + + + + + Solid + True + True + False + 0 + True + + + + False + True + 8 + + + + + Multi-colored + True + True + False + 0 + True + + + + False + True + 9 + + + + + True + False + 5 + 0 + 3 + Isolation Routing: + + + + + + False + True + 10 + + + + + True + False + 3 + 2 + + + True + False + 1 + 3 + Tool diam: + + + 0 + 0 + 1 + 1 + + + + + True + True + 2 + 2 + + 16 + True + + + + 1 + 0 + 1 + 1 + + + + + False + True + 11 + + + + + True + False + 5 + 0 + 3 + Board cutout: + + + + + + False + True + 12 + + + + + True + False + 3 + + + True + False + 1 + Margin: + + + 0 + 0 + 1 + 1 + + + + + True + True + + 12 + True + + + + 1 + 0 + 1 + 1 + + + + + True + True + + 12 + True + + + + 1 + 1 + 1 + 1 + + + + + True + False + 1 + Gap size: + + + 0 + 1 + 1 + 1 + + + + + True + False + 1 + Gaps: + + + 0 + 2 + 1 + 1 + + + + + True + False + + + 2 (T/B) + True + True + False + 8 + 0 + True + + + + False + True + 0 + + + + + 2 (L/R) + True + True + False + 8 + 0 + True + True + rb_app_2tb + + + + False + True + 1 + + + + + 4 + True + True + False + 0 + True + rb_app_2tb + + + False + True + 2 + + + + + 1 + 2 + 1 + 1 + + + + + False + True + 13 + + + + + True + False + 5 + 0 + 3 + Non-copper regions: + + + + + + False + True + 14 + + + + + True + False + 4 + 4 + 1 + + + True + False + 1 + Boundary margin: + + + False + True + 0 + + + + + True + True + + 14 + True + + + + False + True + 1 + + + + + False + True + 15 + + + + + True + False + 5 + 0 + 3 + Bounding box: + + + + + + False + True + 16 + + + + + True + False + 4 + 4 + 1 + + + True + False + 1 + Boundary margin: + + + False + True + 0 + + + + + True + True + + 14 + True + + + + False + True + 1 + + + + + False + True + 17 + + + + + Rounded corners + True + True + False + 0 + True + + + + False + True + 18 + + + + + True + False + 3 + Excellon Object + + + + + + False + True + 19 + + + + + True + False + 0 + 3 + Plot Options: + + + + + + False + True + 20 + + + + + Plot + True + True + False + 0 + True + True + + + + False + True + 21 + + + + + Solid + True + True + False + 0 + True + + + + False + True + 22 + + + + + Multi-colored + True + True + False + 0 + True + + + + False + True + 23 + + + + + True + False + 5 + 0 + 3 + Create CNC Job: + + + + + + False + True + 24 + + + + + True + False + 2 + 4 + + + True + True + + True + + + + 1 + 0 + 1 + 1 + + + + + True + True + + True + + + + 1 + 1 + 1 + 1 + + + + + True + True + + True + + + + 1 + 2 + 1 + 1 + + + + + True + False + 1 + Drill Z: + + + 0 + 0 + 1 + 1 + + + + + True + False + 1 + Travel Z: + + + 0 + 1 + 1 + 1 + + + + + True + False + 1 + Feed rate: + + + 0 + 2 + 1 + 1 + + + + + False + True + 25 + + + + + True + False + 3 + Geometry Object + + + + + + False + True + 26 + + + + + True + False + 0 + 3 + Plot Options: + + + + + + False + True + 27 + + + + + Plot + True + True + False + 0 + True + True + + + + False + True + 28 + + + + + Solid + True + True + False + 0 + True + + + + False + True + 29 + + + + + Multi-colored + True + True + False + 0 + True + + + + False + True + 30 + + + + + True + False + 5 + 0 + 3 + Create CNC Job: + + + + + + False + True + 31 + + + + + True + False + 2 + 4 + + + True + True + + True + + + + 1 + 0 + 1 + 1 + + + + + True + True + + True + + + + 1 + 1 + 1 + 1 + + + + + True + True + + True + + + + 1 + 2 + 1 + 1 + + + + + True + False + 1 + Cut Z: + + + 0 + 0 + 1 + 1 + + + + + True + False + 1 + Travel Z: + + + 0 + 1 + 1 + 1 + + + + + True + False + 1 + Feed rate: + + + 0 + 2 + 1 + 1 + + + + + True + False + 1 + Tool diam: + + + 0 + 3 + 1 + 1 + + + + + True + True + + True + + + + 1 + 3 + 1 + 1 + + + + + False + True + 32 + + + + + True + False + 5 + 0 + 3 + Paint Area: + + + + + + False + True + 33 + + + + + True + False + 2 + 5 + + + True + False + 1 + Tool diam: + + + 0 + 0 + 1 + 1 + + + + + True + True + + True + + + + 1 + 0 + 1 + 1 + + + + + True + False + 1 + Overlap: + + + 0 + 1 + 1 + 1 + + + + + True + True + + True + + + + 1 + 1 + 1 + 1 + + + + + True + False + 1 + Margin: + + + 0 + 2 + 1 + 1 + + + + + True + True + + True + + + + 1 + 2 + 1 + 1 + + + + + False + True + 34 + + + + + True + False + 3 + CNC Job Object + + + + + + False + True + 35 + + + + + Plot + True + True + False + 0 + True + True + + + + False + True + 36 + + + + + Solid + True + True + False + 0 + True + + + + False + True + 37 + + + + + Multi-colored + True + True + False + 0 + True + + + + False + True + 38 + + + + + True + False + 3 + 3 + 3 + + + True + False + 1 + Tool diam: + + + False + True + 0 + + + + + True + True + + True + + + + False + True + 1 + + + + + False + True + 39 + + + + + + + + + - - False - True - 1 - - - - - True - False - 5 - 3 - APLICATION - - - - - - False - True - 2 - - - - - - - - - - - - - - - - - - - - - - diff --git a/defaults.json b/defaults.json index 651d7ce4..bcc117a8 100644 --- a/defaults.json +++ b/defaults.json @@ -1,3 +1 @@ -{ -"units": "in" -} \ No newline at end of file +{"cncjob_multicolored": false, "geometry_paintoverlap": 0.15, "geometry_plot": true, "cncjob_solid": false, "gerber_isotooldia": 0.16, "gerber_plot": true, "gerber_mergepolys": true, "gerber_cutoutgapsize": 0.15, "geometry_feedrate": 5.0, "units": "IN", "excellon_travelz": 0.1, "gerber_multicolored": false, "gerber_solid": false, "excellon_plot": true, "excellon_feedrate": 5.0, "cncjob_tooldia": 0.16, "geometry_travelz": 0.1, "gerber_cutoutmargin": 0.2, "excellon_solid": false, "geometry_paintmargin": 0.01, "geometry_cutz": -0.002, "gerber_noncoppermargin": 0.0, "gerber_gaps": "4", "excellon_multicolored": false, "gerber_bboxmargin": 0.0, "cncjob_plot": true, "excellon_drillz": -0.1, "gerber_bboxrounded": false, "geometry_multicolored": false, "geometry_cnctooldia": 0.16, "geometry_solid": false, "geometry_painttooldia": 0.0625} \ No newline at end of file diff --git a/doc/build/.doctrees/environment.pickle b/doc/build/.doctrees/environment.pickle index 14c24053061288a50b6359e2fce973656f5482a1..7ef2d2a03432e62c1e9a20ddcb66e5b07720eedb 100644 GIT binary patch literal 16927 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 K9k@mvi~k39Kn#!o literal 12462 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 diff --git a/doc/build/.doctrees/index.doctree b/doc/build/.doctrees/index.doctree index b7289c2232f1d60f3d67f9a367db767b6aa5ec4d..77e7772ed9bb3d4b6970f39fa3c3970d394420b9 100644 GIT binary patch literal 274158 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

k0>u&aoxn;u@m|8{!F-BpzQ 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

}SXLP4sVRZjU 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 diff --git a/doc/build/genindex.html b/doc/build/genindex.html index ae859bc1..9adc9189 100644 --- a/doc/build/genindex.html +++ b/doc/build/genindex.html @@ -124,6 +124,7 @@ | F | G | I + | L | N | O | P @@ -136,6 +137,10 @@
+
adjust_axes() (cirkuix.App method) +
+ +
aperture_parse() (cirkuix.Gerber method)
@@ -338,6 +343,16 @@
+

L

+ + +
+ +
load_defaults() (cirkuix.App method) +
+ +
+

N

- +
@@ -356,10 +371,34 @@ +
on_canvas_configure() (cirkuix.App method) +
+ + +
on_clear_plots() (cirkuix.App method) +
+ + +
on_click_over_plot() (cirkuix.App method) +
+ + +
on_closewindow() (cirkuix.App method) +
+ + +
on_cncjob_exportgcode() (cirkuix.App method) +
+ +
on_delete() (cirkuix.App method)
+
on_entry_eval_activate() (cirkuix.App method) +
+ +
on_eval_update() (cirkuix.App method)
@@ -368,6 +407,30 @@ +
on_file_new() (cirkuix.App method) +
+ + +
on_file_savedefaults() (cirkuix.App method) +
+ + +
on_fileopenexcellon() (cirkuix.App method) +
+ + +
on_fileopengcode() (cirkuix.App method) +
+ + +
on_fileopengerber() (cirkuix.App method) +
+ + +
on_filequit() (cirkuix.App method) +
+ +
on_generate_cncjob() (cirkuix.App method)
@@ -375,8 +438,10 @@
on_generate_excellon_cncjob() (cirkuix.App method)
-
+ +
on_generate_gerber_bounding_box() (cirkuix.App method) +
+
on_generate_isolation() (cirkuix.App method)
@@ -385,6 +450,8 @@
on_generate_paintarea() (cirkuix.App method)
+
on_gerber_generate_cutout() (cirkuix.App method)
@@ -394,6 +461,58 @@ +
on_key_over_plot() (cirkuix.App method) +
+ + +
on_mouse_move_over_plot() (cirkuix.App method) +
+ + +
on_options_app2object() (cirkuix.App method) +
+ + +
on_options_app2project() (cirkuix.App method) +
+ + +
on_options_combo_change() (cirkuix.App method) +
+ + +
on_options_object2app() (cirkuix.App method) +
+ + +
on_options_object2project() (cirkuix.App method) +
+ + +
on_options_project2app() (cirkuix.App method) +
+ + +
on_options_project2object() (cirkuix.App method) +
+ + +
on_options_update() (cirkuix.App method) +
+ + +
on_replot() (cirkuix.App method) +
+ + +
on_row_activated() (cirkuix.App method) +
+ + +
on_scale_object() (cirkuix.App method) +
+ +
on_tree_selection_changed() (cirkuix.App method)
@@ -401,6 +520,22 @@
on_update_plot() (cirkuix.App method)
+ +
on_zoom_fit() (cirkuix.App method) +
+ + +
on_zoom_in() (cirkuix.App method) +
+ + +
on_zoom_out() (cirkuix.App method) +
+ + +
options2form() (cirkuix.App method) +
+
@@ -456,7 +591,19 @@ + @@ -488,10 +635,18 @@ +
set_form_item() (cirkuix.App method) +
+ +
set_list_selection() (cirkuix.App method)
+
set_progress_bar() (cirkuix.App method) +
+ +
setup_axes() (cirkuix.CirkuixObj method)
@@ -502,7 +657,7 @@ -
setup_component_viewer() (cirkuix.App method) +
setup_obj_classes() (cirkuix.App method)
@@ -510,6 +665,10 @@ +
setup_project_list() (cirkuix.App method) +
+ +
size() (cirkuix.Geometry method)
diff --git a/doc/build/index.html b/doc/build/index.html index c8a38d69..a554a2b2 100644 --- a/doc/build/index.html +++ b/doc/build/index.html @@ -124,19 +124,58 @@
class cirkuix.App

The main application class. The constructor starts the GUI.

+
+
+adjust_axes(xmin, ymin, xmax, ymax)
+

Adjusts axes of all plots while maintaining the use of the whole canvas +and an aspect ratio to 1:1 between x and y axes. The parameters are an original +request that will be modified to fit these restrictions.

+
-
read_form() (cirkuix.CirkuixObj method) +
read_form() (cirkuix.App method) +
+ +
+ +
(cirkuix.CirkuixObj method) +
+ +
+
+ +
read_form_item() (cirkuix.App method)
+++ + + + + + +
Parameters:
    +
  • xmin (float) – Requested minimum value for the X axis.
  • +
  • ymin (float) – Requested minimum value for the Y axis.
  • +
  • xmax (float) – Requested maximum value for the X axis.
  • +
  • ymax (float) – Requested maximum value for the Y axis.
  • +
+
Returns:

None

+
+ +
build_list()

Clears and re-populates the list of objects in currently -in the project. -@return: None

+in the project.

+ +++ + + + +
Returns:None
clear_plots()
-

Clears self.axes and self.figure. -@return: None

+

Clears self.axes and self.figure.

+ +++ + + + +
Returns:None
@@ -144,45 +183,118 @@ in the project. file_chooser_action(on_success)

Opens the file chooser and runs on_success on a separate thread upon completion of valid file choice.

+ +++ + + + + + +
Parameters:on_success (func) – A function to run upon completion of a valid file +selection. Takes 2 parameters: The app instance and the filename. +Note that it is run on a separate thread, therefore it must take the +appropriate precautions when accessing shared resources.
Returns:None
file_chooser_save_action(on_success)
-

Opens the file chooser and runs on_success -upon completion of valid file choice.

+

Opens the file chooser and runs on_success upon completion of valid file choice.

+ +++ + + + + + +
Parameters:on_success – A function to run upon selection of a filename. Takes 2 +parameters: The instance of the application (App) and the chosen filename. This +gets run immediately in the same thread.
Returns:None
get_current()
-

Returns the currently selected CirkuixObj in the application. -@return: Currently selected CirkuixObj in the application. -@rtype: CirkuixObj

+

Returns the currently selected CirkuixObj in the application.

+ +++ + + + + + +
Returns:Currently selected CirkuixObj in the application.
Return type:CirkuixObj or None
get_eval(widget_name)

Runs eval() on the on the text entry of name ‘widget_name’ -and returns the results. -@param widget_name: Name of Gtk.Entry -@return: Depends on contents of the entry text.

+and returns the results.

+ +++ + + + + + +
Parameters:widget_name (str) – Name of Gtk.Entry
Returns:Depends on contents of the entry text.
get_radio_value(radio_set)
-

Returns the radio_set[key] if the radiobutton -whose name is key is active. -@return: radio_set[key]

+

Returns the radio_set[key] of the radiobutton +whose name is key is active.

+ +++ + + + + + +
Parameters:radio_set (dict) – A dictionary containing widget_name: value pairs.
Returns:radio_set[key]
info(text)
-

Show text on the status bar. -@return: None

+

Show text on the status bar.

+ +++ + + + + + +
Parameters:text (str) – Text to display.
Returns:None
+
+ +
+
+load_defaults()
+

Loads the aplication’s default settings from defaults.json into +self.defaults.

+ +++ + + + +
Returns:None
@@ -219,14 +331,138 @@ called with 2 parameters: the new object and the App instance. on_activate_name(entry)

Hitting ‘Enter’ after changing the name of an item updates the item dictionary and re-builds the item list.

+ +++ + + + + + +
Parameters:entry – The widget from which this was called.
Returns:None
+
+ +
+
+on_canvas_configure(widget, event)
+

Called whenever the canvas changes size. The axes are updated such +as to use the whole canvas.

+ +++ + + + + + +
Parameters:
    +
  • widget – Ignored.
  • +
  • event – Ignored.
  • +
+
Returns:

None

+
+
+ +
+
+on_clear_plots(widget)
+

Callback for toolbar button. Clears all plots.

+ +++ + + + + + +
Parameters:widget – The widget from which this was called.
Returns:None
+
+ +
+
+on_click_over_plot(event)
+

Callback for the mouse click event over the plot. This event is generated +by the Matplotlib backend and has been registered in self.__init__(). +For details, see: http://matplotlib.org/users/event_handling.html

+ +++ + + + + + +
Parameters:event
Returns:
+
+ +
+
+on_closewindow(param)
+

Callback for closing the main window.

+ +++ + + + + + +
Parameters:param – Whatever is passed by the event. Ignore.
Returns:None
+
+ +
+
+on_cncjob_exportgcode(widget)
+

Called from button on CNCjob form to save the G-Code from the object.

+ +++ + + + + + +
Parameters:widget – The widget from which this was called.
Returns:None
on_delete(widget)
-

Delete the currently selected CirkuixObj. -@param widget: The widget from which this was called. -@return:

+

Delete the currently selected CirkuixObj.

+ +++ + + + + + +
Parameters:widget – The widget from which this was called.
Returns:None
+
+ +
+
+on_entry_eval_activate(widget)
+

Called when an entry is activated (eg. by hitting enter) if +set to do so. Its text is eval()’d and set to the returned value. +The current object is updated.

+ +++ + + + + + +
Parameters:widget
Returns:
@@ -234,43 +470,204 @@ updates the item dictionary and re-builds the item list.

on_eval_update(widget)

Modifies the content of a Gtk.Entry by running eval() on its contents and puting it back as a -string. -@param widget: The widget from which this was called. -@return: None

+string.

+ +++ + + + + + +
Parameters:widget – The widget from which this was called.
Returns:None
on_excellon_tool_choose(widget)

Callback for button on Excellon form to open up a window for -selecting tools. -@param widget: The widget from which this was called. -@return: None

+selecting tools.

+ +++ + + + + + +
Parameters:widget – The widget from which this was called.
Returns:None
+
+ +
+
+on_file_new(param)
+

Callback for menu item File->New. Returns the application to its +startup state.

+ +++ + + + + + +
Parameters:param – Whatever is passed by the event. Ignore.
Returns:None
+
+ +
+
+on_file_savedefaults(param)
+

Callback for menu item File->Save Defaults. Saves application default options +(self.defaults) to defaults.json.

+ +++ + + + + + +
Parameters:param – Ignored.
Returns:None
+
+ +
+
+on_fileopenexcellon(param)
+

Callback for menu item File->Open Excellon. Defines a function that is then passed +to self.file_chooser_action(). It requests the creation of a CirkuixExcellon object +and updates the progress bar throughout the process.

+ +++ + + + + + +
Parameters:param – Ignore
Returns:None
+
+ +
+
+on_fileopengcode(param)
+

Callback for menu item File->Open G-Code. Defines a function that is then passed +to self.file_chooser_action(). It requests the creation of a CirkuixCNCjob object +and updates the progress bar throughout the process.

+ +++ + + + + + +
Parameters:param – Ignore
Returns:None
+
+ +
+
+on_fileopengerber(param)
+

Callback for menu item File->Open Gerber. Defines a function that is then passed +to self.file_chooser_action(). It requests the creation of a CirkuixGerber object +and updates the progress bar throughout the process.

+ +++ + + + + + +
Parameters:param – Ignore
Returns:None
+
+ +
+
+on_filequit(param)
+

Callback for menu item File->Quit. Closes the application.

+ +++ + + + + + +
Parameters:param – Whatever is passed by the event. Ignore.
Returns:None
on_generate_cncjob(widget)
-

Callback for button on geometry form to generate CNC job. -@param widget: The widget from which this was called. -@return: None

+

Callback for button on geometry form to generate CNC job.

+ +++ + + + + + +
Parameters:widget – The widget from which this was called.
Returns:None
on_generate_excellon_cncjob(widget)

Callback for button active/click on Excellon form to -create a CNC Job for the Excellon file. -@param widget: The widget from which this was called. -@return: None

+create a CNC Job for the Excellon file.

+ +++ + + + + + +
Parameters:widget – The widget from which this was called.
Returns:None
+
+ +
+
+on_generate_gerber_bounding_box(widget)
+

Callback for request from the Gerber form to generate a bounding box for the +geometry in the object. Creates a CirkuixGeometry with the bounding box.

+ +++ + + + + + +
Parameters:widget – Ignored.
Returns:None
on_generate_isolation(widget)
-

Callback for button on Gerber form to create isolation routing geometry. -@param widget: The widget from which this was called. -@return: None

+

Callback for button on Gerber form to create isolation routing geometry.

+ +++ + + + + + +
Parameters:widget – The widget from which this was called.
Returns:None
@@ -281,15 +678,33 @@ Subscribes to the “Click on plot” event and continues after the click. Finds the polygon containing the clicked point and runs clear_poly() on it, resulting in a new CirkuixGeometry object.

+ +++ + + + + + +
Parameters:widget – The widget from which this was called.
Returns:None
on_gerber_generate_cutout(widget)

Callback for button on Gerber form to create geometry with lines -for cutting off the board. -@param widget: The widget from which this was called. -@return: None

+for cutting off the board.

+ +++ + + + + + +
Parameters:widget – The widget from which this was called.
Returns:None
@@ -297,35 +712,441 @@ for cutting off the board. on_gerber_generate_noncopper(widget)

Callback for button on Gerber form to create a geometry object with polygons covering the area without copper or negative of the -Gerber. -@param widget: The widget from which this was called. -@return: None

+Gerber.

+ +++ + + + + + +
Parameters:widget – The widget from which this was called.
Returns:None
+
+ +
+
+on_key_over_plot(event)
+

Callback for the key pressed event when the canvas is focused. Keyboard +shortcuts are handled here. So far, these are the shortcuts:

+ ++++ + + + + + + + + + + + + + + + + +
KeyAction
‘1’Zoom-fit. Fits the axes limits to the data.
‘2’Zoom-out.
‘3’Zoom-in.
+ +++ + + + + + +
Parameters:event – Ignored.
Returns:None
+
+ +
+
+on_mouse_move_over_plot(event)
+

Callback for the mouse motion event over the plot. This event is generated +by the Matplotlib backend and has been registered in self.__init__(). +For details, see: http://matplotlib.org/users/event_handling.html

+ +++ + + + + + +
Parameters:event – Contains information about the event.
Returns:None
+
+ +
+
+on_options_app2object(param)
+

Callback for Options->Transfer Options->App=>Object. Copies options +from application defaults to the currently selected object.

+ +++ + + + + + +
Parameters:param – Ignored.
Returns:None
+
+ +
+
+on_options_app2project(param)
+

Callback for Options->Transfer Options->App=>Project. Copies options +from application defaults to project defaults.

+ +++ + + + + + +
Parameters:param – Ignored.
Returns:None
+
+ +
+
+on_options_combo_change(widget)
+

Called when the combo box to choose between application defaults and +project option changes value. The corresponding variables are +copied to the UI.

+ +++ + + + + + +
Parameters:widget – The widget from which this was called. Ignore.
Returns:None
+
+ +
+
+on_options_object2app(param)
+

Callback for Options->Transfer Options->Object=>App. Copies options +from the currently selected object to application defaults.

+ +++ + + + + + +
Parameters:param – Ignored.
Returns:None
+
+ +
+
+on_options_object2project(param)
+

Callback for Options->Transfer Options->Object=>Project. Copies options +from the currently selected object to project defaults.

+ +++ + + + + + +
Parameters:param – Ignored.
Returns:None
+
+ +
+
+on_options_project2app(param)
+

Callback for Options->Transfer Options->Project=>App. Copies options +from project defaults to application defaults.

+ +++ + + + + + +
Parameters:param – Ignored.
Returns:None
+
+ +
+
+on_options_project2object(param)
+

Callback for Options->Transfer Options->Project=>Object. Copies options +from project defaults to the currently selected object.

+ +++ + + + + + +
Parameters:param – Ignored.
Returns:None
+
+ +
+
+on_options_update(widget)
+

Called whenever a value in the options/defaults form changes. +All values are updated. Can be inhibited by setting self.options_update_ignore = True, +which may be necessary when updating the UI from code and not by the user.

+ +++ + + + + + +
Parameters:widget – The widget from which this was called. Ignore.
Returns:None
+
+ +
+
+on_replot(widget)
+

Callback for toolbar button. Re-plots all objects.

+ +++ + + + + + +
Parameters:widget – The widget from which this was called.
Returns:None
+
+ +
+
+on_row_activated(widget, path, col)
+

Callback for selection activation (Enter or double-click) on the Project list. +Switches the notebook page to the object properties form. Calls +self.notebook.set_current_page(1).

+ +++ + + + + + +
Parameters:
    +
  • widget – Ignored.
  • +
  • path – Ignored.
  • +
  • col – Ignored.
  • +
+
Returns:

None

+
+
+ +
+
+on_scale_object(widget)
+

Callback for request to change an objects geometry scale. The object +is re-scaled and replotted.

+ +++ + + + + + +
Parameters:widget – Ignored.
Returns:None
on_tree_selection_changed(selection)

Callback for selection change in the project list. This changes -the currently selected CirkuixObj. -@param selection: Selection associated to the project tree or list -@type selection: Gtk.TreeSelection -@return: None

+the currently selected CirkuixObj.

+ +++ + + + + + +
Parameters:selection (Gtk.TreeSelection) – Selection associated to the project tree or list
Returns:None
on_update_plot(widget)

Callback for button on form for all kinds of objects. -Re-plot the current object only. -@param widget: The widget from which this was called. -@return: None

+Re-plots the current object only.

+ +++ + + + + + +
Parameters:widget – The widget from which this was called.
Returns:None
+
+ +
+
+on_zoom_fit(event)
+

Callback for zoom-out request. This can be either from the corresponding +toolbar button or the ‘1’ key when the canvas is focused. Calls self.adjust_axes() +with axes limits from the geometry bounds of all objects.

+ +++ + + + + + +
Parameters:event – Ignored.
Returns:None
+
+ +
+
+on_zoom_in(event)
+

Callback for zoom-in request. This can be either from the corresponding +toolbar button or the ‘3’ key when the canvas is focused. Calls self.zoom().

+ +++ + + + + + +
Parameters:event – Ignored.
Returns:None
+
+ +
+
+on_zoom_out(event)
+

Callback for zoom-out request. This can be either from the corresponding +toolbar button or the ‘2’ key when the canvas is focused. Calls self.zoom().

+ +++ + + + + + +
Parameters:event – Ignored.
Returns:None
+
+ +
+
+options2form()
+

Sets the ‘Project Options’ or ‘Application Defaults’ form with values from +self.options``or ``self.defaults. +:return : None +:rtype : None

plot_all()
-

Re-generates all plots from all objects. -@return: None

+

Re-generates all plots from all objects.

+ +++ + + + +
Returns:None
+
+ +
+
+read_form()
+

Reads the options form into self.defaults/self.options.

+ +++ + + + + + +
Returns:None
Return type:None
+
+ +
+
+read_form_item(name, dest)
+

Reads the value of a form item in the defaults/options form and +saves it to the corresponding dictionary.

+ +++ + + + + + +
Parameters:
    +
  • name (str) – Name of the form item. A key in self.defaults or +self.options.
  • +
  • dest (dict) – Dictionary to which to save the value.
  • +
+
Returns:

None

+
+
+ +
+
+set_form_item(name, value)
+

Sets a form item ‘name’ in the GUI with the given ‘value’. The syntax of +form names in the GUI is <kind>_app_<name>, where kind is one of: rb (radio button), +cb (check button), entry_eval or entry_text (entry), combo (combo box). name is +whatever name it’s been given. For self.defaults, name is a key in the dictionary.

+ +++ + + + + + +
Parameters:
    +
  • name (str) – Name of the form field.
  • +
  • value (Depends on field kind.) – The value to set the form field to.
  • +
+
Returns:

None

+
@@ -333,9 +1154,38 @@ Re-plot the current object only. set_list_selection(name)

Marks a given object as selected in the list ob objects in the GUI. This selection will in turn trigger -self.on_tree_selection_changed(). -@param name: Name of the object. -@return: None

+self.on_tree_selection_changed().

+ +++ + + + + + +
Parameters:name (str) – Name of the object.
Returns:None
+
+ +
+
+set_progress_bar(percentage, text='')
+

Sets the application’s progress bar to a given fraction and text.

+ +++ + + + + + +
Parameters:
    +
  • percentage (float) – The fraction (0.0-1.0) of the progress.
  • +
  • text (str) – Text to display on the progress bar.
  • +
+
Returns:

+
@@ -343,34 +1193,85 @@ self.on_tree_selection_changed(). setup_component_editor()

Initial configuration of the component editor. Creates a page titled “Selection” on the notebook on the left -side of the main window. -@return: None

+side of the main window.

+ +++ + + + +
Returns:None
-
-setup_component_viewer()
-

Sets up list or Tree where whatever has been loaded or created is -displayed. -@return: None

+
+setup_obj_classes()
+

Sets up application specifics on the CirkuixObj class.

+ +++ + + + +
Returns:None
setup_plot()
-

Sets up the main plotting area by creating a matplotlib +

Sets up the main plotting area by creating a Matplotlib figure in self.canvas, adding axes and configuring them. These axes should not be ploted on and are just there to -display the axes ticks and grid. -@return: None

+display the axes ticks and grid.

+ +++ + + + + + +
Returns:None
Return type:None
+
+ +
+
+setup_project_list()
+

Sets up list or Tree where whatever has been loaded or created is +displayed.

+ +++ + + + +
Returns:None
zoom(factor, center=None)

Zooms the plot by factor around a given -center point. Takes care of re-drawing. -@return: None

+center point. Takes care of re-drawing.

+ +++ + + + + + +
Parameters:
    +
  • factor (float) – Number by which to scale the plot.
  • +
  • center (list) – Coordinates [x, y] of the point around which to scale the plot.
  • +
+
Returns:

None

+
diff --git a/doc/build/objects.inv b/doc/build/objects.inv index 9f7e2e1d385a02d55c8715f18ec7bbc821407a2c..c1eb0d9b2b9755379775c788d94644ed61b6ec0a 100644 GIT binary patch delta 967 zcmV;&133Jr2C@i{d4E_ivCi%CCPIe^_gyx;lD!`yz@AJc6A*nLKwE$sd- zkKRq-eqyvfZ5DND1R2!v`-SycTlQaF@I_AWPMPqM&6(Uk&VSY4U%Q)E)@KiY?jF{a z`w!mlElMpkj56C47h6b2)Vue$wm%x76Da_Q2o_W_^i>_Dn?U!zz_<|^&Z3eQ1P;&S zjbWxKyaWsbWii4lt-;qGtEc+;@9?~j5RA0ut;^ffKTpp%?0o>?Wr&;zM`Ph@Hk>TL zNm`M;maJ5uFMoB7Lg74MD{r@XwLOd&W`@fN!T^Cj90UqhsGKl&?^Idp1>r6B!T8hS zY_9?oR}&x^gbO3u8FK{sdm><-pnB#MpOzn(g%=K9S@~>#G-z+$5x(XvILoNAT1vw4V( z+TFP3%*ZVv-8gGCcti3u8eZ17`F777570fiuM9P0W3|YJg-UKNw)8h%9WXmOR!sEI znKOY@4uRN_vBi%!P1gakMVr)76&CXCL)jH1ynjixQp2?MOpjqLS?Ps4D4|lpp)o`6 z3rMc<4lSMerodj{!jzp?@NyK)ccqPz#BP6mnJ8MjpP~6n`{L_1@4JtmQa@+nM2^C! znxp}s8%Eu<{&T#^3JE4y*=M~qf5OR`bAX)`YQ_=v3c>DU0gp2ae12ozGqPRAYB_%h zlYd}lLa4L*Hg;TS{~jGf`{6RycCcb?jCCAar&5sGpdh)P;m*CW?}MsJCV}oTqy@YT z*mj>&x4R^xUU(ecw6;bul8Ylmwm>g*&4VK)Q7jwk_0~{Hnx3|nM0SRCZ@3JUGDtXg zj%|;lIg?zQ3IMp0(m2*NAnPh=B?RiVDL_DsVvvEcD@h0BlsR{S*CNzF(OxE&u;(a% pTfx=cGR;j5?9gquHh`HLsANjP44J0cFR>A>!sLIfz5zpDW)$z{-q!#C delta 698 zcmV;r0!96@2&V>+d4E^SZW}QSyyq(xXsw?D++ozcD}yS zO0hR>5RlC&h)gcU;c!UJsEyNb9AeV9R*qnY&Gq06W{V_gly~RXvsgcl$6aYj73o4oNui8sDfo8+acAq;;C{7;7GvSLl_}!HHuwH zXb+L$xkRg2g19 zw$VJ%c-%PRL(Q!~Nxk2gjn%@M$f>aO5K`ubTH~*r>f9$Iq0k*lSdpDck>zP3TDdgo z)Q=d5MkOsrNg70iuC9bSHAt^4Iop4@9pwQS1h4*8 zaD}v%!*8NS_jGpVC<097P9(;B>6%JJIYP=_D4adIB9Y=?;IWmS+z$1YtFFiiGkFFn zTLz}6h_I6DQfrN)3G^jXI{3Zu>imG&r<0&cExCJEn%pET8x{yGqQ6oqhfbmQ^l}#n z7n!}R41Y}8-!N`l`|z+_Q_h_6@p8rBsO4o~k@d2NRH)xENY2{M9OOl^jI`9@diMKI zWdLmw2KE)}N92*-rca17XHhd#AEh#-V8&cV1#M3wi^pYpH?cx{npm}BNHTe!zF+bB zJ*zjfo*G!B>r8JWTyP#Ii|m&1&xmq