pydot / pydot-ng

Python interface to Graphviz's Dot language compatible with Python 2 nad Python 3
MIT License
22 stars 10 forks source link

[92] Simplify throws NameError, and, as implemented, doesn't work #29

Open prmtl opened 9 years ago

prmtl commented 9 years ago

Reported by TheSoup...@gmail.com, 2014-06-12T04:30:48Z

What steps will reproduce the problem?
  1. invoke set_simplify(true) on a graph
  2. invoke method to_string()
  3. profit
    What is the expected output? What do you see instead?

Extraneous edges removed from dot output

What version of the product are you using? On what operating system?

1.0.2

Please provide any additional information below.

This is a patch which both resolves the NameError and enables the desired behavior:

--- /usr/lib/python2.6/site-packages/pydot.py   2014-06-12 06:22:57.000000000 +0400
+++ virtenv/lib/python2.6/site-packages/pydot.py    2014-06-12 06:28:42.515864719 +0400
@@ -1455,11 +1455,11 @@

                 edge = Edge(obj_dict=obj)

-                if self.obj_dict.get('simplify', False) and elm in edges_done:
+                if self.obj_dict.get('simplify', False) and edge.obj_dict['points'] in edges_done:
                     continue
-
+
                 graph.append( edge.to_string() + '\n' )
-                edges_done.add(edge)
+                edges_done.add(edge.obj_dict['points'])

             else:

Attached pydot_simplify.patch (view on Gist) From: https://code.google.com/p/pydot/issues/detail?id=92

prmtl commented 9 years ago

Comment by TheSoup...@gmail.com, 2014-06-11T20:00:14Z

Or if you prefer to retain encapsulation:

--- /usr/lib/python2.6/site-packages/pydot.py   2014-06-12 06:22:57.000000000 +0400
+++ virtenv/lib/python2.6/site-packages/pydot.py    2014-06-12 06:58:20.478835432 +0400
@@ -834,6 +834,11 @@

         return False

+    def __hash__(self):
+        if self.get_parent_graph().get_top_graph_type() == 'graph':
+            return hash(min(self.get_source(), self.get_destination())
+                    + max(self.get_source(), self.get_destination()))
+        return hash(self.get_source() + self.get_destination())

     def parse_node_ref(self, node_str):
@@ -1455,7 +1460,7 @@

                 edge = Edge(obj_dict=obj)

-                if self.obj_dict.get('simplify', False) and elm in edges_done:
+                if self.obj_dict.get('simplify', False) and edge in edges_done:
                     continue

                 graph.append( edge.to_string() + '\n' )

Attached pydot_simplify_encpsulated.patch (view on Gist)