def __init__(self, name="", node_prefix="", graph_attr=dict(splines="true", #ordering="out", ranksep=0.25, nodesep=0.1, # size of margin depends on particular version of dot... #margin=-0.25 ), node_attr=dict(fontname="sans", fontsize="9", #style="bold", height=".1", shape="plaintext"), edge_attr=dict(fontname="sans", color="limegreen", fontsize="8", weight="0", constraint="false", #arrowhead="none", #style="dashed,bold" #headclip="false", #tailclip="false" ), from_graph_attr=dict(color="white", #ordering="out" ), from_node_attr=dict(fontcolor="blue"), from_edge_attr=dict(weight="100", style="solid", color="gray", arrowhead="none", constraint="true", #headclip="true", #tailclip="true", ), to_graph_attr=dict(color="white", #ordering="out" ), to_node_attr=dict(fontcolor="red"), to_edge_attr=dict(weight="100", style="solid", color="gray", arrowhead="none", constraint="true", #headclip="true", #tailclip="true", ), subgraph_class=AlpinoDotSubGraph): BasicDotGraphPair.__init__(self, name, node_prefix, graph_attr, node_attr, edge_attr, from_graph_attr, from_node_attr, from_edge_attr, to_graph_attr, to_node_attr, to_edge_attr, subgraph_class)
def initDotGraphPair(self): self.dotGraphPair = BasicDotGraphPair()
class BasicGraphView(GraphView): """ Basic class for viewing graphs """ def initDotGraphPair(self): self.dotGraphPair = BasicDotGraphPair() def initViewMenu(self): self.viewMenu = BasicViewMenu(self, self.aligner, self.algraephFrame) def subscribe_stage_1(self): GraphView.subscribe_stage_1(self) # newGraphPair subscribe(self.updateEdgeFocus, "newGraphPair.viz") subscribe(self.updateNodeFocus, "newGraphPair.viz") subscribe(self.unfoldAllNodes, "newGraphPair.viz") # newRelation subscribe(self.updateEdgeFocus, "newRelation.viz") # newNodeSelect subscribe(self.updateNodeFocus, "newNodeSelect.viz") subscribe(self.updateEdgeFocus, "newNodeSelect.viz") # newNodeSelect # ********* FIXME: following updates may be superfluous subscribe(self.updateAlignment, "newNodeSelect.viz") def subscribe_stage_3(self): GraphView.subscribe_stage_3(self) # newNodeSelect # ********* FIXME: following updates may be superfluous subscribe(self.updateImageFile, "newNodeSelect.gui") subscribe(self.updateHtmlPage, "newNodeSelect.gui") # foldNodeChanged subscribe(self.updateFromGraph, "foldNodeChanged") subscribe(self.updateToGraph, "foldNodeChanged") # hidden nodes may be focused or aligned, so we need to refresh # node focus, edge focus and aligment as well, which check themselves # if any nodes have now become hidden subscribe(self.updateNodeFocus, "foldNodeChanged") subscribe(self.updateEdgeFocus, "foldNodeChanged") subscribe(self.updateAlignment, "foldNodeChanged") subscribe(self.updateFolded, "foldNodeChanged") subscribe(self.updateImageFile, "foldNodeChanged") subscribe(self.updateImageMap, "foldNodeChanged") subscribe(self.updateHtmlPage, "foldNodeChanged") # unfoldAllNodes subscribe(self.unfoldAllNodes, "unfoldAllNodes") subscribe(self.updateFromGraph, "unfoldAllNodes") subscribe(self.updateToGraph, "unfoldAllNodes") subscribe(self.updateAlignment, "unfoldAllNodes") subscribe(self.updateImageFile, "unfoldAllNodes") subscribe(self.updateImageMap, "unfoldAllNodes") subscribe(self.updateHtmlPage, "unfoldAllNodes") # markSelectedNodesChanged subscribe(self.updateNodeFocus, "markSelectedNodesChanged") subscribe(self.updateFromGraph, "markSelectedNodesChanged") subscribe(self.updateToGraph, "markSelectedNodesChanged") subscribe(self.updateImageFile, "markSelectedNodesChanged") subscribe(self.updateHtmlPage, "markSelectedNodesChanged") # markAlignedNodesChanged subscribe(self.updateAlignment, "markAlignedNodesChanged") subscribe(self.updateImageFile, "markAlignedNodesChanged") subscribe(self.updateHtmlPage, "markAlignedNodesChanged") # labelEdgesChanged subscribe(self.updateFromGraph, "labelEdgesChanged") subscribe(self.updateToGraph, "labelEdgesChanged") subscribe(self.updateImageFile, "labelEdgesChanged") subscribe(self.updateImageMap, "labelEdgesChanged") subscribe(self.updateHtmlPage, "labelEdgesChanged") # markSelectedAlignmentsChanged subscribe(self.updateEdgeFocus ,"markSelectedAlignmentsChanged") subscribe(self.updateAlignment ,"markSelectedAlignmentsChanged") subscribe(self.updateImageFile ,"markSelectedAlignmentsChanged") subscribe(self.updateHtmlPage ,"markSelectedAlignmentsChanged") # hideAlignmentsChanged subscribe(self.updateAlignment, "hideAlignmentsChanged") subscribe(self.updateImageFile, "hideAlignmentsChanged") subscribe(self.updateImageMap, "hideAlignmentsChanged") subscribe(self.updateHtmlPage, "hideAlignmentsChanged") # coSelectAlignedNodeChanged subscribe(self.updateCoSelectedNode, "coSelectAlignedNodeChanged") # self.updateCoSelectedNode() will trigger a "newNodeSelect", # so there is no need to subscribe others def unsubscribe(self): GraphView.unsubscribe(self) unsubscribe(self.unfoldAllNodes) unsubscribe(self.updateNodeFocus) unsubscribe(self.updateEdgeFocus) unsubscribe(self.updateCoSelectedNode) unsubscribe(self.updateFolded) # ------------------------------------------------------------------------------ # Event handlers # ------------------------------------------------------------------------------ def OnCellClicked(self, cell, x, y, event): linkinfo = cell.GetLink(x, y) # store node for possible use by onToggleFold if linkinfo: self.node = linkinfo.GetHref() else: self.node = "" if event.ShiftDown(): self.onToggleFold() else: GraphView.OnCellClicked(self, cell, x, y, event) def onViewPopupMenu(self, linkinfo, event): self.setFoldNodeItem(linkinfo) GraphView.onViewPopupMenu(self, linkinfo, event) self.resetFoldNodeItem() def setFoldNodeItem(self, linkinfo): # enable and/or check the "Fold Node" menu item if self.node.startswith(self.from_node_prefix): node = self.node[len(self.from_node_prefix):] graph = self.aligner.get_from_graph() if graph.node_is_non_terminal(node): self.viewMenu.enableFoldNodeItem() if self.dotGraphPair.from_subgraph.is_folded(node): self.viewMenu.checkFoldNodeItem() elif self.node.startswith(self.to_node_prefix): node = self.node[len(self.to_node_prefix):] graph = self.aligner.get_to_graph() if graph.node_is_non_terminal(node): self.viewMenu.enableFoldNodeItem() if self.dotGraphPair.to_subgraph.is_folded(node): self.viewMenu.checkFoldNodeItem() def resetFoldNodeItem(self): # return to the default state, i.e. # disable and uncheck the "Fold Node" menu item self.viewMenu.disableFoldNodeItem() self.viewMenu.uncheckFoldNodeItem() def onToggleFold(self, evt=None): if self.node.startswith(self.from_node_prefix): node = self.node[len(self.from_node_prefix):] graph = self.aligner.get_from_graph() if graph.node_is_terminal(node): return self.dotGraphPair.from_subgraph.toggle_node_fold(graph, node) elif self.node.startswith(self.to_node_prefix): node = self.node[len(self.to_node_prefix):] graph = self.aligner.get_to_graph() if graph.node_is_terminal(node): return self.dotGraphPair.to_subgraph.toggle_node_fold(graph, node) else: # Mouse not on a node. Should not happen, because in that case the # "Fold Node" menu item is disabled. return send(self.onToggleFold, "foldNodeChanged") def onUnfoldAllNodes(self, evt): """ handler for the 'Unfold All Nodes' option in GraphmlViewMenu """ send(self.onUnfoldAllNodes, "unfoldAllNodes") # ------------------------------------------------------------------------------ # ViewMenu handlers # ------------------------------------------------------------------------------ def onMarkAlignedNodes(self, evt): """ handler for the 'Mark Aligned Nodes" in the View menu """ self.dotGraphPair.mark_aligned_nodes_option(evt.Checked()) send(self.onMarkAlignedNodes, "markAlignedNodesChanged") send(self.onMarkAlignedNodes, "statusDescription", "Mark Aligned Nodes option is %s" % evt.Checked()) def onMarkSelectedNodes(self, evt): """ handler for the 'Mark Selected Nodes" in the View menu """ self.dotGraphPair.from_subgraph.mark_selected_nodes_option(evt.Checked()) self.dotGraphPair.to_subgraph.mark_selected_nodes_option(evt.Checked()) send(self.onMarkSelectedNodes, "markSelectedNodesChanged") send(self.onMarkSelectedNodes, "statusDescription", "Mark Selected Nodes option is %s" % evt.Checked()) def onCoSelectAlignedNode(self, evt): """ handler for the 'Co-select Aligned Node' option in the View menu """ self.aligner.co_node_selection_mode(evt.Checked()) send(self.onCoSelectAlignedNode, "coSelectAlignedNodeChanged") send(self.onCoSelectAlignedNode, "statusDescription", "Co-select Aligned Node option is %s" % evt.Checked()) def onLabelEdges(self, evt): """ handler for the 'Label Edges' option in the View menu """ self.dotGraphPair.from_subgraph.label_edges_option(evt.Checked()) self.dotGraphPair.to_subgraph.label_edges_option(evt.Checked()) send(self.onLabelEdges, "labelEdgesChanged") send(self.onLabelEdges, "statusDescription", "Label Edges option is %s" % evt.Checked()) def onMarkSelectedAlignments(self, evt): """ handler for the 'Mark Selected Alignments' option in View menu """ self.dotGraphPair.mark_selected_alignments_option(evt.Checked()) send(self.onLabelEdges, "markSelectedAlignmentsChanged") send(self.onMarkSelectedAlignments, "statusDescription", "Mark Selected Alignments option is %s" % evt.Checked()) def onHideAlignments(self, evt): """ handler for the 'Hide Alignments' option in View menu """ self.dotGraphPair.hide_alignments_option(evt.Checked()) send(self.onHideAlignments, "hideAlignmentsChanged") send(self.onHideAlignments, "statusDescription", "Hide Alignments option is %s" % evt.Checked()) def onSaveImage(self, evt): """ handler for the 'Save Image' option in View menu """ formats = get_output_formats() if "png" in formats: formats.remove("png") formats = ["png"] + formats else: formats.remove("dot") formats = ["dot"] + formats wildcard = "" for s in formats: wildcard += s + " (*." + s + ")|" + "*." + s + "|" wildcard = wildcard[:-1] filename = self.aligner.get_corpus_filename() filename = splitext(basename(filename))[0] filename += "_%d" % self.aligner.get_graph_pair_counter()[0] filename += "." + formats[0] dlg = wx.FileDialog(self, "Save image...", defaultFile=filename, defaultDir=self.aligner.get_corpus_dir() or getcwd(), style=wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT, wildcard =wildcard) if dlg.ShowModal() == wx.ID_OK: file = dlg.GetPath() if " " in file: file = '"' + file + '"' form = formats[dlg.GetFilterIndex()] send(self.onSaveImage, "statusDescription", "Saving image to file %s ..." % file) draw(self.dotGraphPair.to_string(), img_file=file, img_format=form) send(self.onSaveImage, "statusDescription", "Saved image to file %s" % file) dlg.Destroy() ## Some experimental code to draw on the screen ##def OnCellMouseHover(self, cell, x, y): ##try: ##print cell.GetLink(x,y).GetHref() ##print cell.GetLink(x,y).GetTarget() ##dc = wx.ClientDC(self) ##dc.DrawCircle(100,100,25) ##except: ##pass # ------------------------------------------------------------------------------ # Dotgraph updates # ------------------------------------------------------------------------------ def unfoldAllNodes(self, msg=None): receive(self.unfoldAllNodes, msg) self.dotGraphPair.from_subgraph.unfold_all() self.dotGraphPair.to_subgraph.unfold_all() def updateFolded(self, msg): receive(self.updateFolded, msg) self.dotGraphPair.from_subgraph.update_folded() self.dotGraphPair.to_subgraph.update_folded() def updateCoSelectedNode(self, msg=None): receive(self.updateCoSelectedNode, msg) from_node = self.aligner.get_from_node() if from_node: self.aligner.set_from_node(from_node) else: to_node = self.aligner.get_to_node() if to_node: self.aligner.set_to_node(to_node) def updateNodeFocus(self, msg=None): receive(self.updateNodeFocus, msg) from_graph = self.aligner.get_from_graph() to_graph = self.aligner.get_to_graph() from_node = self.aligner.get_from_node() self.dotGraphPair.from_subgraph.update_node_focus(from_node) to_node = self.aligner.get_to_node() self.dotGraphPair.to_subgraph.update_node_focus(to_node) def updateEdgeFocus(self, msg=None): receive(self.updateEdgeFocus, msg) self.dotGraphPair.clear_edge_focus() from_node = self.aligner.get_from_node() to_node = self.aligner.get_aligned_to_node() self.dotGraphPair.update_edge_focus(from_node, to_node) to_node= self.aligner.get_to_node() from_node = self.aligner.get_aligned_from_node() self.dotGraphPair.update_edge_focus(from_node, to_node)
class BasicGraphView(GraphView): """ Basic class for viewing graphs """ def initDotGraphPair(self): self.dotGraphPair = BasicDotGraphPair() def initViewMenu(self): self.viewMenu = BasicViewMenu(self, self.aligner, self.algraephFrame) def subscribe_stage_1(self): GraphView.subscribe_stage_1(self) # newGraphPair subscribe(self.updateEdgeFocus, "newGraphPair.viz") subscribe(self.updateNodeFocus, "newGraphPair.viz") subscribe(self.unfoldAllNodes, "newGraphPair.viz") # newRelation subscribe(self.updateEdgeFocus, "newRelation.viz") # newNodeSelect subscribe(self.updateNodeFocus, "newNodeSelect.viz") subscribe(self.updateEdgeFocus, "newNodeSelect.viz") # newNodeSelect # ********* FIXME: following updates may be superfluous subscribe(self.updateAlignment, "newNodeSelect.viz") def subscribe_stage_3(self): GraphView.subscribe_stage_3(self) # newNodeSelect # ********* FIXME: following updates may be superfluous subscribe(self.updateImageFile, "newNodeSelect.gui") subscribe(self.updateHtmlPage, "newNodeSelect.gui") # foldNodeChanged subscribe(self.updateFromGraph, "foldNodeChanged") subscribe(self.updateToGraph, "foldNodeChanged") # hidden nodes may be focused or aligned, so we need to refresh # node focus, edge focus and aligment as well, which check themselves # if any nodes have now become hidden subscribe(self.updateNodeFocus, "foldNodeChanged") subscribe(self.updateEdgeFocus, "foldNodeChanged") subscribe(self.updateAlignment, "foldNodeChanged") subscribe(self.updateFolded, "foldNodeChanged") subscribe(self.updateImageFile, "foldNodeChanged") subscribe(self.updateImageMap, "foldNodeChanged") subscribe(self.updateHtmlPage, "foldNodeChanged") # unfoldAllNodes subscribe(self.unfoldAllNodes, "unfoldAllNodes") subscribe(self.updateFromGraph, "unfoldAllNodes") subscribe(self.updateToGraph, "unfoldAllNodes") subscribe(self.updateAlignment, "unfoldAllNodes") subscribe(self.updateImageFile, "unfoldAllNodes") subscribe(self.updateImageMap, "unfoldAllNodes") subscribe(self.updateHtmlPage, "unfoldAllNodes") # markSelectedNodesChanged subscribe(self.updateNodeFocus, "markSelectedNodesChanged") subscribe(self.updateFromGraph, "markSelectedNodesChanged") subscribe(self.updateToGraph, "markSelectedNodesChanged") subscribe(self.updateImageFile, "markSelectedNodesChanged") subscribe(self.updateHtmlPage, "markSelectedNodesChanged") # markAlignedNodesChanged subscribe(self.updateAlignment, "markAlignedNodesChanged") subscribe(self.updateImageFile, "markAlignedNodesChanged") subscribe(self.updateHtmlPage, "markAlignedNodesChanged") # labelEdgesChanged subscribe(self.updateFromGraph, "labelEdgesChanged") subscribe(self.updateToGraph, "labelEdgesChanged") subscribe(self.updateImageFile, "labelEdgesChanged") subscribe(self.updateImageMap, "labelEdgesChanged") subscribe(self.updateHtmlPage, "labelEdgesChanged") # markSelectedAlignmentsChanged subscribe(self.updateEdgeFocus, "markSelectedAlignmentsChanged") subscribe(self.updateAlignment, "markSelectedAlignmentsChanged") subscribe(self.updateImageFile, "markSelectedAlignmentsChanged") subscribe(self.updateHtmlPage, "markSelectedAlignmentsChanged") # hideAlignmentsChanged subscribe(self.updateAlignment, "hideAlignmentsChanged") subscribe(self.updateImageFile, "hideAlignmentsChanged") subscribe(self.updateImageMap, "hideAlignmentsChanged") subscribe(self.updateHtmlPage, "hideAlignmentsChanged") # coSelectAlignedNodeChanged subscribe(self.updateCoSelectedNode, "coSelectAlignedNodeChanged") # self.updateCoSelectedNode() will trigger a "newNodeSelect", # so there is no need to subscribe others def unsubscribe(self): GraphView.unsubscribe(self) unsubscribe(self.unfoldAllNodes) unsubscribe(self.updateNodeFocus) unsubscribe(self.updateEdgeFocus) unsubscribe(self.updateCoSelectedNode) unsubscribe(self.updateFolded) # ------------------------------------------------------------------------------ # Event handlers # ------------------------------------------------------------------------------ def OnCellClicked(self, cell, x, y, event): linkinfo = cell.GetLink(x, y) # store node for possible use by onToggleFold if linkinfo: self.node = linkinfo.GetHref() else: self.node = "" if event.ShiftDown(): self.onToggleFold() else: GraphView.OnCellClicked(self, cell, x, y, event) def onViewPopupMenu(self, linkinfo, event): self.setFoldNodeItem(linkinfo) GraphView.onViewPopupMenu(self, linkinfo, event) self.resetFoldNodeItem() def setFoldNodeItem(self, linkinfo): # enable and/or check the "Fold Node" menu item if self.node.startswith(self.from_node_prefix): node = self.node[len(self.from_node_prefix):] graph = self.aligner.get_from_graph() if graph.node_is_non_terminal(node): self.viewMenu.enableFoldNodeItem() if self.dotGraphPair.from_subgraph.is_folded(node): self.viewMenu.checkFoldNodeItem() elif self.node.startswith(self.to_node_prefix): node = self.node[len(self.to_node_prefix):] graph = self.aligner.get_to_graph() if graph.node_is_non_terminal(node): self.viewMenu.enableFoldNodeItem() if self.dotGraphPair.to_subgraph.is_folded(node): self.viewMenu.checkFoldNodeItem() def resetFoldNodeItem(self): # return to the default state, i.e. # disable and uncheck the "Fold Node" menu item self.viewMenu.disableFoldNodeItem() self.viewMenu.uncheckFoldNodeItem() def onToggleFold(self, evt=None): if self.node.startswith(self.from_node_prefix): node = self.node[len(self.from_node_prefix):] graph = self.aligner.get_from_graph() if graph.node_is_terminal(node): return self.dotGraphPair.from_subgraph.toggle_node_fold(graph, node) elif self.node.startswith(self.to_node_prefix): node = self.node[len(self.to_node_prefix):] graph = self.aligner.get_to_graph() if graph.node_is_terminal(node): return self.dotGraphPair.to_subgraph.toggle_node_fold(graph, node) else: # Mouse not on a node. Should not happen, because in that case the # "Fold Node" menu item is disabled. return send(self.onToggleFold, "foldNodeChanged") def onUnfoldAllNodes(self, evt): """ handler for the 'Unfold All Nodes' option in GraphmlViewMenu """ send(self.onUnfoldAllNodes, "unfoldAllNodes") # ------------------------------------------------------------------------------ # ViewMenu handlers # ------------------------------------------------------------------------------ def onMarkAlignedNodes(self, evt): """ handler for the 'Mark Aligned Nodes" in the View menu """ self.dotGraphPair.mark_aligned_nodes_option(evt.Checked()) send(self.onMarkAlignedNodes, "markAlignedNodesChanged") send(self.onMarkAlignedNodes, "statusDescription", "Mark Aligned Nodes option is %s" % evt.Checked()) def onMarkSelectedNodes(self, evt): """ handler for the 'Mark Selected Nodes" in the View menu """ self.dotGraphPair.from_subgraph.mark_selected_nodes_option( evt.Checked()) self.dotGraphPair.to_subgraph.mark_selected_nodes_option(evt.Checked()) send(self.onMarkSelectedNodes, "markSelectedNodesChanged") send(self.onMarkSelectedNodes, "statusDescription", "Mark Selected Nodes option is %s" % evt.Checked()) def onCoSelectAlignedNode(self, evt): """ handler for the 'Co-select Aligned Node' option in the View menu """ self.aligner.co_node_selection_mode(evt.Checked()) send(self.onCoSelectAlignedNode, "coSelectAlignedNodeChanged") send(self.onCoSelectAlignedNode, "statusDescription", "Co-select Aligned Node option is %s" % evt.Checked()) def onLabelEdges(self, evt): """ handler for the 'Label Edges' option in the View menu """ self.dotGraphPair.from_subgraph.label_edges_option(evt.Checked()) self.dotGraphPair.to_subgraph.label_edges_option(evt.Checked()) send(self.onLabelEdges, "labelEdgesChanged") send(self.onLabelEdges, "statusDescription", "Label Edges option is %s" % evt.Checked()) def onMarkSelectedAlignments(self, evt): """ handler for the 'Mark Selected Alignments' option in View menu """ self.dotGraphPair.mark_selected_alignments_option(evt.Checked()) send(self.onLabelEdges, "markSelectedAlignmentsChanged") send(self.onMarkSelectedAlignments, "statusDescription", "Mark Selected Alignments option is %s" % evt.Checked()) def onHideAlignments(self, evt): """ handler for the 'Hide Alignments' option in View menu """ self.dotGraphPair.hide_alignments_option(evt.Checked()) send(self.onHideAlignments, "hideAlignmentsChanged") send(self.onHideAlignments, "statusDescription", "Hide Alignments option is %s" % evt.Checked()) def onSaveImage(self, evt): """ handler for the 'Save Image' option in View menu """ formats = get_output_formats() if "png" in formats: formats.remove("png") formats = ["png"] + formats else: formats.remove("dot") formats = ["dot"] + formats wildcard = "" for s in formats: wildcard += s + " (*." + s + ")|" + "*." + s + "|" wildcard = wildcard[:-1] filename = self.aligner.get_corpus_filename() filename = splitext(basename(filename))[0] filename += "_%d" % self.aligner.get_graph_pair_counter()[0] filename += "." + formats[0] dlg = wx.FileDialog(self, "Save image...", defaultFile=filename, defaultDir=self.aligner.get_corpus_dir() or getcwd(), style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT, wildcard=wildcard) if dlg.ShowModal() == wx.ID_OK: file = dlg.GetPath() if " " in file: file = '"' + file + '"' form = formats[dlg.GetFilterIndex()] send(self.onSaveImage, "statusDescription", "Saving image to file %s ..." % file) draw(self.dotGraphPair.to_string(), img_file=file, img_format=form) send(self.onSaveImage, "statusDescription", "Saved image to file %s" % file) dlg.Destroy() ## Some experimental code to draw on the screen ##def OnCellMouseHover(self, cell, x, y): ##try: ##print cell.GetLink(x,y).GetHref() ##print cell.GetLink(x,y).GetTarget() ##dc = wx.ClientDC(self) ##dc.DrawCircle(100,100,25) ##except: ##pass # ------------------------------------------------------------------------------ # Dotgraph updates # ------------------------------------------------------------------------------ def unfoldAllNodes(self, msg=None): receive(self.unfoldAllNodes, msg) self.dotGraphPair.from_subgraph.unfold_all() self.dotGraphPair.to_subgraph.unfold_all() def updateFolded(self, msg): receive(self.updateFolded, msg) self.dotGraphPair.from_subgraph.update_folded() self.dotGraphPair.to_subgraph.update_folded() def updateCoSelectedNode(self, msg=None): receive(self.updateCoSelectedNode, msg) from_node = self.aligner.get_from_node() if from_node: self.aligner.set_from_node(from_node) else: to_node = self.aligner.get_to_node() if to_node: self.aligner.set_to_node(to_node) def updateNodeFocus(self, msg=None): receive(self.updateNodeFocus, msg) from_graph = self.aligner.get_from_graph() to_graph = self.aligner.get_to_graph() from_node = self.aligner.get_from_node() self.dotGraphPair.from_subgraph.update_node_focus(from_node) to_node = self.aligner.get_to_node() self.dotGraphPair.to_subgraph.update_node_focus(to_node) def updateEdgeFocus(self, msg=None): receive(self.updateEdgeFocus, msg) self.dotGraphPair.clear_edge_focus() from_node = self.aligner.get_from_node() to_node = self.aligner.get_aligned_to_node() self.dotGraphPair.update_edge_focus(from_node, to_node) to_node = self.aligner.get_to_node() from_node = self.aligner.get_aligned_from_node() self.dotGraphPair.update_edge_focus(from_node, to_node)
def __init__( self, name="", node_prefix="", graph_attr=dict( splines="true", #ordering="out", ranksep=0.25, nodesep=0.1, # size of margin depends on particular version of dot... #margin=-0.25 ), node_attr=dict( fontname="sans", fontsize="9", #style="bold", height=".1", shape="plaintext"), edge_attr=dict( fontname="sans", color="limegreen", fontsize="8", weight="0", constraint="false", #arrowhead="none", #style="dashed,bold" #headclip="false", #tailclip="false" ), from_graph_attr=dict(color="white", #ordering="out" ), from_node_attr=dict(fontcolor="blue"), from_edge_attr=dict( weight="100", style="solid", color="gray", arrowhead="none", constraint="true", #headclip="true", #tailclip="true", ), to_graph_attr=dict(color="white", #ordering="out" ), to_node_attr=dict(fontcolor="red"), to_edge_attr=dict( weight="100", style="solid", color="gray", arrowhead="none", constraint="true", #headclip="true", #tailclip="true", ), subgraph_class=AlpinoDotSubGraph): BasicDotGraphPair.__init__(self, name, node_prefix, graph_attr, node_attr, edge_attr, from_graph_attr, from_node_attr, from_edge_attr, to_graph_attr, to_node_attr, to_edge_attr, subgraph_class)