| ... | ... |
@@ -397,11 +397,12 @@ class Edge(Element): |
| 397 | 397 |
|
| 398 | 398 |
class Graph(Shape): |
| 399 | 399 |
|
| 400 |
- def __init__(self, width=1, height=1, nodes=(), edges=()): |
|
| 400 |
+ def __init__(self, width=1, height=1, shapes=(), nodes=(), edges=()): |
|
| 401 | 401 |
Shape.__init__(self) |
| 402 | 402 |
|
| 403 | 403 |
self.width = width |
| 404 | 404 |
self.height = height |
| 405 |
+ self.shapes = shapes |
|
| 405 | 406 |
self.nodes = nodes |
| 406 | 407 |
self.edges = edges |
| 407 | 408 |
|
| ... | ... |
@@ -416,6 +417,8 @@ class Graph(Shape): |
| 416 | 417 |
cr.set_line_cap(cairo.LINE_CAP_BUTT) |
| 417 | 418 |
cr.set_line_join(cairo.LINE_JOIN_MITER) |
| 418 | 419 |
|
| 420 |
+ for shape in self.shapes: |
|
| 421 |
+ shape.draw(cr) |
|
| 419 | 422 |
for edge in self.edges: |
| 420 | 423 |
edge.draw(cr, highlight=(edge in highlight_items)) |
| 421 | 424 |
for node in self.nodes: |
| ... | ... |
@@ -1046,27 +1049,37 @@ class XDotParser(DotParser): |
| 1046 | 1049 |
|
| 1047 | 1050 |
self.nodes = [] |
| 1048 | 1051 |
self.edges = [] |
| 1052 |
+ self.shapes = [] |
|
| 1049 | 1053 |
self.node_by_name = {}
|
| 1054 |
+ self.top_graph = True |
|
| 1050 | 1055 |
|
| 1051 | 1056 |
def handle_graph(self, attrs): |
| 1052 |
- try: |
|
| 1053 |
- bb = attrs['bb'] |
|
| 1054 |
- except KeyError: |
|
| 1055 |
- return |
|
| 1057 |
+ if self.top_graph: |
|
| 1058 |
+ try: |
|
| 1059 |
+ bb = attrs['bb'] |
|
| 1060 |
+ except KeyError: |
|
| 1061 |
+ return |
|
| 1056 | 1062 |
|
| 1057 |
- if not bb: |
|
| 1058 |
- return |
|
| 1063 |
+ if not bb: |
|
| 1064 |
+ return |
|
| 1065 |
+ |
|
| 1066 |
+ xmin, ymin, xmax, ymax = map(int, bb.split(","))
|
|
| 1059 | 1067 |
|
| 1060 |
- xmin, ymin, xmax, ymax = map(int, bb.split(","))
|
|
| 1068 |
+ self.xoffset = -xmin |
|
| 1069 |
+ self.yoffset = -ymax |
|
| 1070 |
+ self.xscale = 1.0 |
|
| 1071 |
+ self.yscale = -1.0 |
|
| 1072 |
+ # FIXME: scale from points to pixels |
|
| 1061 | 1073 |
|
| 1062 |
- self.xoffset = -xmin |
|
| 1063 |
- self.yoffset = -ymax |
|
| 1064 |
- self.xscale = 1.0 |
|
| 1065 |
- self.yscale = -1.0 |
|
| 1066 |
- # FIXME: scale from points to pixels |
|
| 1074 |
+ self.width = xmax - xmin |
|
| 1075 |
+ self.height = ymax - ymin |
|
| 1067 | 1076 |
|
| 1068 |
- self.width = xmax - xmin |
|
| 1069 |
- self.height = ymax - ymin |
|
| 1077 |
+ self.top_graph = False |
|
| 1078 |
+ |
|
| 1079 |
+ for attr in ("_draw_", "_ldraw_", "_hdraw_", "_tdraw_", "_hldraw_", "_tldraw_"):
|
|
| 1080 |
+ if attr in attrs: |
|
| 1081 |
+ parser = XDotAttrParser(self, attrs[attr]) |
|
| 1082 |
+ self.shapes.extend(parser.parse()) |
|
| 1070 | 1083 |
|
| 1071 | 1084 |
def handle_node(self, id, attrs): |
| 1072 | 1085 |
try: |
| ... | ... |
@@ -1108,7 +1121,7 @@ class XDotParser(DotParser): |
| 1108 | 1121 |
def parse(self): |
| 1109 | 1122 |
DotParser.parse(self) |
| 1110 | 1123 |
|
| 1111 |
- return Graph(self.width, self.height, self.nodes, self.edges) |
|
| 1124 |
+ return Graph(self.width, self.height, self.shapes, self.nodes, self.edges) |
|
| 1112 | 1125 |
|
| 1113 | 1126 |
def parse_node_pos(self, pos): |
| 1114 | 1127 |
x, y = pos.split(",")
|