| ... | ... |
@@ -246,6 +246,25 @@ class PolygonShape(Shape): |
| 246 | 246 |
cr.stroke() |
| 247 | 247 |
|
| 248 | 248 |
|
| 249 |
+class LineShape(Shape): |
|
| 250 |
+ |
|
| 251 |
+ def __init__(self, pen, points): |
|
| 252 |
+ Shape.__init__(self) |
|
| 253 |
+ self.pen = pen.copy() |
|
| 254 |
+ self.points = points |
|
| 255 |
+ |
|
| 256 |
+ def draw(self, cr, highlight=False): |
|
| 257 |
+ x0, y0 = self.points[0] |
|
| 258 |
+ cr.move_to(x0, y0) |
|
| 259 |
+ for x1, y1 in self.points[1:]: |
|
| 260 |
+ cr.line_to(x1, y1) |
|
| 261 |
+ pen = self.select_pen(highlight) |
|
| 262 |
+ cr.set_dash(pen.dash) |
|
| 263 |
+ cr.set_line_width(pen.linewidth) |
|
| 264 |
+ cr.set_source_rgba(*pen.color) |
|
| 265 |
+ cr.stroke() |
|
| 266 |
+ |
|
| 267 |
+ |
|
| 249 | 268 |
class BezierShape(Shape): |
| 250 | 269 |
|
| 251 | 270 |
def __init__(self, pen, points): |
| ... | ... |
@@ -543,6 +562,9 @@ class XDotAttrParser: |
| 543 | 562 |
w = s.read_number() |
| 544 | 563 |
h = s.read_number() |
| 545 | 564 |
shapes.append(EllipseShape(pen, x0, y0, w, h)) |
| 565 |
+ elif op == "L": |
|
| 566 |
+ p = self.read_polygon() |
|
| 567 |
+ shapes.append(LineShape(pen, p)) |
|
| 546 | 568 |
elif op == "B": |
| 547 | 569 |
p = self.read_polygon() |
| 548 | 570 |
shapes.append(BezierShape(pen, p)) |
| ... | ... |
@@ -621,8 +643,18 @@ class XDotParser: |
| 621 | 643 |
parser = XDotAttrParser(self, getattr(edge, attr)) |
| 622 | 644 |
shapes.extend(parser.parse()) |
| 623 | 645 |
if shapes: |
| 624 |
- src = node_by_name[edge.get_source()] |
|
| 625 |
- dst = node_by_name[edge.get_destination()] |
|
| 646 |
+ src_name = edge.get_source() |
|
| 647 |
+ dst_name = edge.get_destination() |
|
| 648 |
+ try: |
|
| 649 |
+ src = node_by_name[src_name] |
|
| 650 |
+ except KeyError: |
|
| 651 |
+ src_name, src_port = src_name.rsplit(':', 1)
|
|
| 652 |
+ src = node_by_name[src_name] |
|
| 653 |
+ try: |
|
| 654 |
+ dst = node_by_name[dst_name] |
|
| 655 |
+ except KeyError: |
|
| 656 |
+ dst_name, dst_port = dst_name.rsplit(':', 1)
|
|
| 657 |
+ dst = node_by_name[dst_name] |
|
| 626 | 658 |
edges.append(Edge(src, dst, points, shapes)) |
| 627 | 659 |
|
| 628 | 660 |
return Graph(width, height, nodes, edges) |