コード例 #1
0
ファイル: molecule.py プロジェクト: yuhangwang/zeobuilder
class NeighborShellsDialog(FieldsDialogSimple):
    def __init__(self):
        self.atom_expression = Expression()
        FieldsDialogSimple.__init__(
            self, "Neighbor shells",
            fields.faulty.Expression(
                label_text="Atom expression (atom, graph)",
                attribute_name="atom_expression",
                history_name="atom_expression",
                width=250,
                height=150,
            ), (("Evaluate", RESPONSE_EVALUATE), ("Select", RESPONSE_SELECT),
                (gtk.STOCK_SAVE, RESPONSE_SAVE),
                (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)))

    def create_dialog(self):
        FieldsDialogSimple.create_dialog(self)

        self.list_view = gtk.TreeView(self.list_store)

        column = gtk.TreeViewColumn("Index", gtk.CellRendererText(), text=0)
        column.set_sort_column_id(0)
        self.list_view.append_column(column)

        column = gtk.TreeViewColumn("Number", gtk.CellRendererText(), text=1)
        column.set_sort_column_id(1)
        self.list_view.append_column(column)

        column = gtk.TreeViewColumn("Atom", gtk.CellRendererText(), text=2)
        column.set_sort_column_id(2)
        self.list_view.append_column(column)

        column = gtk.TreeViewColumn("Value", gtk.CellRendererText(), markup=3)
        column.set_sort_column_id(3)
        self.list_view.append_column(column)

        for index in xrange(1, self.max_shell_size + 1):
            column = gtk.TreeViewColumn("Shell %i" % index,
                                        gtk.CellRendererText(),
                                        markup=index + 3)
            column.set_sort_column_id(index + 3)
            self.list_view.append_column(column)

        selection = self.list_view.get_selection()
        selection.set_mode(gtk.SELECTION_MULTIPLE)
        selection.connect("changed", self.on_selection_changed)

        self.scrolled_window = gtk.ScrolledWindow()
        self.scrolled_window.set_shadow_type(gtk.SHADOW_IN)
        self.scrolled_window.set_shadow_type(gtk.SHADOW_IN)
        self.scrolled_window.set_policy(gtk.POLICY_AUTOMATIC,
                                        gtk.POLICY_AUTOMATIC)
        self.scrolled_window.set_border_width(6)
        self.scrolled_window.add(self.list_view)
        self.scrolled_window.set_size_request(400, 300)
        self.scrolled_window.show_all()

        self.dialog.vbox.pack_start(self.scrolled_window)

    def run(self, max_shell_size, rows, graph):
        self.graph = graph
        self.max_shell_size = max_shell_size

        self.list_store = gtk.ListStore(int, int,
                                        *([str] * (max_shell_size + 2)))
        for index, row in enumerate(rows):
            row += [""] * (max_shell_size - (len(row) - 4))
            self.list_store.append(row)

        response = FieldsDialogSimple.run(self, self)

        self.list_view.set_model(None)
        for column in self.list_view.get_columns():
            self.list_view.remove_column(column)
        del self.graph
        del self.max_shell_size

        return response

    def on_selection_changed(self, selection):
        model, paths = selection.get_selected_rows()
        to_select = []
        for path in paths:
            iter = model.get_iter(path)
            to_select.append(self.graph.nodes[model.get_value(iter, 0) - 1])
        context.application.main.select_nodes(to_select)

    def on_dialog_response(self, dialog, response_id):
        FieldsDialogSimple.on_dialog_response(self, dialog, response_id)
        if self.valid:
            self.atom_expression.variables = ("atom", "graph")
            self.atom_expression.compile_as("<atom_expression>")
            if response_id == RESPONSE_EVALUATE:
                self.evaluate()
                self.hide = False
            if response_id == RESPONSE_SELECT:
                self.select()
                self.hide = True
            elif response_id == RESPONSE_SAVE:
                self.save()
                self.hide = False

    def do_expressions(self):
        atom_values = []
        try:
            for atom in self.graph.nodes:
                atom_values.append(self.atom_expression(atom, self.graph))
        except:
            exc_type, exc_value, tb = sys.exc_info()
            err_msg = "".join(
                traceback.format_exception(exc_type, exc_value, tb))
            ok_error(
                "An error occured while evaluating the shell and atom expressions.",
                err_msg,
                line_wrap=False)
            self.hide = False
            return None
        return atom_values

    def evaluate(self):
        atom_values = self.do_expressions()
        if atom_values is not None:
            for index, value in enumerate(atom_values):
                self.list_store[index][3] = value

    def select(self):
        atom_values = self.do_expressions()
        if atom_values is not None:
            to_select = [
                atom for atom, value in zip(self.graph.nodes, atom_values)
                if value
            ]
            context.application.main.select_nodes(to_select)

    def save(self):
        atom_values = self.do_expressions()
        if atom_values is not None:
            filename = context.application.model.filename
            if filename is None:
                filename = ""
            else:
                filename = filename[:filename.rfind(".")]
            filename = ask_save_filename("Save shell data", filename)
            if filename is not None:
                if not filename.endswith(".txt"):
                    filename += ".txt"
                f = file(filename, "w")
                for atom, value in zip(self.graph.nodes, atom_values):
                    print >> f, atom.get_name(), value
                f.close()
コード例 #2
0
ファイル: molecule.py プロジェクト: woutersmet/Zeo_thesis
class NeighborShellsDialog(FieldsDialogSimple):
    def __init__(self):
        self.atom_expression = Expression()
        FieldsDialogSimple.__init__(
            self,
            "Neighbor shells",
            fields.faulty.Expression(
                label_text="Atom expression (atom, graph)",
                attribute_name="atom_expression",
                history_name="atom_expression",
                width=250,
                height=150,
            ), (
                ("Evaluate", RESPONSE_EVALUATE),
                ("Select", RESPONSE_SELECT),
                (gtk.STOCK_SAVE, RESPONSE_SAVE),
                (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)
            )
        )

    def create_dialog(self):
        FieldsDialogSimple.create_dialog(self)

        self.list_view = gtk.TreeView(self.list_store)

        column = gtk.TreeViewColumn("Index", gtk.CellRendererText(), text=0)
        column.set_sort_column_id(0)
        self.list_view.append_column(column)

        column = gtk.TreeViewColumn("Number", gtk.CellRendererText(), text=1)
        column.set_sort_column_id(1)
        self.list_view.append_column(column)

        column = gtk.TreeViewColumn("Atom", gtk.CellRendererText(), text=2)
        column.set_sort_column_id(2)
        self.list_view.append_column(column)

        column = gtk.TreeViewColumn("Value", gtk.CellRendererText(), markup=3)
        column.set_sort_column_id(3)
        self.list_view.append_column(column)

        for index in xrange(1, self.max_shell_size+1):
            column = gtk.TreeViewColumn("Shell %i" % index, gtk.CellRendererText(), markup=index+3)
            column.set_sort_column_id(index+3)
            self.list_view.append_column(column)

        selection = self.list_view.get_selection()
        selection.set_mode(gtk.SELECTION_MULTIPLE)
        selection.connect("changed", self.on_selection_changed)

        self.scrolled_window = gtk.ScrolledWindow()
        self.scrolled_window.set_shadow_type(gtk.SHADOW_IN)
        self.scrolled_window.set_shadow_type(gtk.SHADOW_IN)
        self.scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        self.scrolled_window.set_border_width(6)
        self.scrolled_window.add(self.list_view)
        self.scrolled_window.set_size_request(400, 300)
        self.scrolled_window.show_all()

        self.dialog.vbox.pack_start(self.scrolled_window)

    def run(self, max_shell_size, rows, graph):
        self.graph = graph
        self.max_shell_size = max_shell_size

        self.list_store = gtk.ListStore(int, int, *([str]*(max_shell_size+2)))
        for index, row in enumerate(rows):
            row += [""]*(max_shell_size-(len(row)-4))
            self.list_store.append(row)

        response = FieldsDialogSimple.run(self, self)

        self.list_view.set_model(None)
        for column in self.list_view.get_columns():
            self.list_view.remove_column(column)
        del self.graph
        del self.max_shell_size

        return response

    def on_selection_changed(self, selection):
        model, paths = selection.get_selected_rows()
        to_select = []
        for path in paths:
            iter = model.get_iter(path)
            to_select.append(self.graph.nodes[model.get_value(iter, 0)-1])
        context.application.main.select_nodes(to_select)

    def on_dialog_response(self, dialog, response_id):
        FieldsDialogSimple.on_dialog_response(self, dialog, response_id)
        if self.valid:
            self.atom_expression.variables = ("atom", "graph")
            self.atom_expression.compile_as("<atom_expression>")
            if response_id == RESPONSE_EVALUATE:
                self.evaluate()
                self.hide = False
            if response_id == RESPONSE_SELECT:
                self.select()
                self.hide = True
            elif response_id == RESPONSE_SAVE:
                self.save()
                self.hide = False

    def do_expressions(self):
        atom_values = []
        try:
            for atom in self.graph.nodes:
                atom_values.append(self.atom_expression(atom, self.graph))
        except:
            exc_type, exc_value, tb = sys.exc_info()
            err_msg = "".join(traceback.format_exception(exc_type, exc_value, tb))
            ok_error(
                "An error occured while evaluating the shell and atom expressions.",
                err_msg, line_wrap=False
            )
            self.hide = False
            return None
        return atom_values

    def evaluate(self):
        atom_values = self.do_expressions()
        if atom_values is not None:
            for index, value in enumerate(atom_values):
                self.list_store[index][3] = value

    def select(self):
        atom_values = self.do_expressions()
        if atom_values is not None:
            to_select = [atom for atom, value in zip(self.graph.nodes, atom_values) if value]
            context.application.main.select_nodes(to_select)

    def save(self):
        atom_values = self.do_expressions()
        if atom_values is not None:
            filename = context.application.model.filename
            if filename is None:
                filename = ""
            else:
                filename = filename[:filename.rfind(".")]
            filename = ask_save_filename("Save shell data", filename)
            if filename is not None:
                if not filename.endswith(".txt"):
                    filename += ".txt"
                f = file(filename, "w")
                for atom, value in zip(self.graph.nodes, atom_values):
                    print >> f, atom.get_name(), value
                f.close()