backend_graphviz.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. from nodeset import *
  2. def NodePrintDot(self):
  3. cleanname = "node_" + str(self.id).replace(";","").replace("=","")
  4. dot = cleanname + " [label = \"{" + str(self.id) + "|" + str(self.browseName) + \
  5. "}\", shape=\"record\"]"
  6. for r in self.references:
  7. if isinstance(r.target, Node):
  8. tgtname = "node_" + str(r.target.id).replace(";","").replace("=","")
  9. dot = dot + "\n"
  10. if r.isForward == True:
  11. dot = dot + cleanname + " -> " + tgtname + " [label=\"" + \
  12. str(r.referenceType.browseName) + "\"]\n"
  13. else:
  14. if len(r.referenceType.inverseName) == 0:
  15. logger.warn("Inverse name of reference is null " + str(r.referenceType.id))
  16. dot = dot + cleanname + " -> " + tgtname + \
  17. " [label=\"" + str(r.referenceType.inverseName) + "\"]\n"
  18. return dot
  19. def printDotGraphWalk(nodeset, depth=1, filename="out.dot", rootNode=None,
  20. followInverse = False, excludeNodeIds=[]):
  21. """ Outputs a graphiz/dot description the nodes centered around rootNode.
  22. References beginning from rootNode will be followed for depth steps. If
  23. "followInverse = True" is passed, then inverse (not Forward) references
  24. will also be followed.
  25. Nodes can be excluded from the graph by passing a list of NodeIds as
  26. string representation using excludeNodeIds (ex ["i=53", "ns=2;i=453"]).
  27. Output is written into filename to be parsed by dot/neato/srfp...
  28. """
  29. iter = depth
  30. processed = []
  31. if rootNode == None or not isinstance(rootNode, Node) or not rootNode in nodeset.nodes:
  32. root = nodeset.getRoot()
  33. else:
  34. root = rootNode
  35. file=open(filename, 'w+')
  36. if root == None:
  37. return
  38. file.write("digraph ns {\n")
  39. file.write(root.NodePrintDot())
  40. refs=[]
  41. if followInverse == True:
  42. refs = root.references; # + root.getInverseReferences()
  43. else:
  44. for ref in root.references:
  45. if ref.isForward:
  46. refs.append(ref)
  47. while iter > 0:
  48. tmp = []
  49. for ref in refs:
  50. if isinstance(ref.target, Node):
  51. tgt = ref.target
  52. if not str(tgt.id) in excludeNodeIds:
  53. if not tgt in processed:
  54. file.write(tgt.NodePrintDot())
  55. processed.append(tgt)
  56. if ref.isForward == False and followInverse == True:
  57. tmp = tmp + tgt.references; # + tgt.getInverseReferences()
  58. elif ref.isForward == True :
  59. tmp = tmp + tgt.references;
  60. refs = tmp
  61. iter = iter - 1
  62. file.write("}\n")
  63. file.close()