def _draw_poly(xy, color, alpha, ax): poly = Polygon(xy, closed=True, fc=color, alpha=alpha) poly.set_fc(color) ax.add_patch(poly)
class PolyRegionEditor(uiutils.UI): def __init__(self, img, prj=None, max_ds=10, current_folder=None): self.max_ds = max_ds self.showverts = True self.current_folder = current_folder uiutils.UI.__init__(self, 750, 600, "PolyRegion Editor") vbox = QtGui.QVBoxLayout() self.setLayout(vbox) canva_box = QtGui.QHBoxLayout() vbox.addLayout(canva_box) self.canvas = plotutils.BaseCustomCanvas() canva_box.addWidget(self.canvas) ctl = QtGui.QHBoxLayout() vbox.addLayout(ctl) ctl.addWidget(plotutils.NavigationToolbar(self.canvas, self)) self.title_entry = uiutils.EntryDescription("Title") ctl.addWidget(self.title_entry) self.color_entry = uiutils.EntryDescription("Color") ctl.addWidget(self.color_entry) save_bn = QtGui.QPushButton("Save") save_bn.clicked.connect(self.on_save_clicked) ctl.addWidget(save_bn) load_bn = QtGui.QPushButton("Load") load_bn.clicked.connect(self.on_load_clicked) ctl.addWidget(load_bn) save_bn = QtGui.QPushButton("New") save_bn.clicked.connect(self.on_new_clicked) ctl.addWidget(save_bn) self.ax = self.canvas.figure.subplots() if prj is None: prj = img.get_projection() self.prj = prj self.img = img plotutils.imshow_image(self.ax, self.img, projection=self.prj, title=False) self.poly = Polygon([[0, 0]], animated=True, fc='b', ec='none', alpha=0.4) self.ax.add_patch(self.poly) self.ax.set_clip_on(False) self.ax.set_title("Click and drag a point to move it; " "'i' to insert; 'd' to delete.") x, y = zip(*self.poly.xy) self.line = plt.Line2D(x, y, color='none', marker='o', mfc='r', alpha=0.8, animated=True, lw=2, markersize=self.max_ds) self._update_line() self.ax.add_line(self.line) self.poly.add_callback(self.poly_changed) self._ind = None # the active vert canvas = self.poly.figure.canvas canvas.mpl_connect('draw_event', self.draw_callback) canvas.mpl_connect('button_press_event', self.button_press_callback) canvas.mpl_connect('button_release_event', self.button_release_callback) canvas.mpl_connect('key_press_event', self.key_press_callback) canvas.mpl_connect('motion_notify_event', self.motion_notify_callback) self.canvas = canvas self.load_default() self.canvas.setFocus() def get_axes(self): return self.ax def load_poly_region(self, poly_region): self.title_entry.set_text(poly_region.title) self.color_entry.set_text(poly_region.color) self.poly.set_fc(poly_region.color) vertices = list(poly_region.vertices) vertices.append(vertices[0]) self.poly.xy = vertices self._update_line() self.canvas.draw() def load_default(self): default_poly_region = imgutils.PolyRegion.default_from_ax(self.ax) self.load_poly_region(default_poly_region) def on_load_clicked(self, bn): filename = uiutils.open_file(parent=self, current_folder=self.current_folder) if filename is not None: try: poly_region = imgutils.PolyRegion.from_file(filename, self.img.get_coordinate_system()) self.load_poly_region(poly_region) except Exception, e: msg = "Failed to load region %s\n%s" % (filename, e) print msg uiutils.error_msg(msg, self)