1717
1818import codecs
1919import logging
20+ import os
2021import pickle
2122
2223from opencolorio_config_aces .config .reference .discover .classify import (
@@ -299,11 +300,11 @@ def conversion_path(graph, source, target):
299300
300301
301302@required ("NetworkX" )
302- def plot_aces_conversion_graph (graph , filename , prog = "dot" , args = "" ):
303+ def plot_aces_conversion_graph (graph , filename , prog = "dot" ):
303304 """
304305 Plot given *aces-dev* conversion graph using
305306 `Graphviz <https://www.graphviz.org/>`__ and
306- `pyraphviz <https://pygraphviz.github.io >`__.
307+ `Pydot <https://pypi.org/project/pydot/ >`__.
307308
308309 Parameters
309310 ----------
@@ -314,72 +315,96 @@ def plot_aces_conversion_graph(graph, filename, prog="dot", args=""):
314315 prog : unicode, optional
315316 {'neato', 'dot', 'twopi', 'circo', 'fdp', 'nop'},
316317 *Graphviz* layout method.
317- args : unicode, optional
318- Additional arguments for *Graphviz*.
319318
320319 Returns
321320 -------
322- AGraph
323- *PyGraphviz * graph.
321+ Dot
322+ *Pydot * graph.
324323 """
325324
326325 import networkx as nx
326+ from pydot import Subgraph
327327
328- agraph = nx .nx_agraph .to_agraph (graph )
329-
330- agraph .node_attr .update (
331- style = "filled" , shape = "circle" , fontname = "Helvetica" , fontsize = 20
332- )
328+ dot = nx .drawing .nx_pydot .to_pydot (graph )
333329
334330 ctl_transforms_csc = []
335331 ctl_transforms_idt = []
336332 ctl_transforms_odt = []
337333 ctl_transforms_output_transform = []
338334 ctl_transforms_lmt = []
339335
340- for node in agraph .nodes ():
336+ for node in dot .get_nodes ():
337+ node .set_style ("filled" )
338+ node .set_shape ("circle" )
339+ node .set_fontname ("Helvetica" )
340+ node .set_fontsize (20 )
341+
341342 unserialized = pickle .loads ( # noqa: S301
342- codecs .decode (node .attr ["serialized" ].encode (), "base64" )
343+ codecs .decode (node .get_attributes () ["serialized" ].encode (), "base64" )
343344 )
344345
345346 ctl_transform_type = unserialized .type
346347 if node in ("ACES2065-1" , "OCES" ):
347- node .attr .update (
348- shape = "doublecircle" ,
349- color = "#673AB7FF" ,
350- fillcolor = "#673AB770" ,
351- fontsize = 30 ,
352- )
348+ node .set_shape ("doublecircle" )
349+ node .set_color ("#673AB7FF" )
350+ node .set_fillcolor ("#673AB7FF" )
351+ node .set_fontsize (30 )
353352 elif ctl_transform_type == "ACEScsc" :
354- node .attr .update (color = "#00BCD4FF" , fillcolor = "#00BCD470" )
353+ node .set_color ("#00BCD4FF" )
354+ node .set_fillcolor ("#00BCD470" )
355355 ctl_transforms_csc .append (node )
356356 elif ctl_transform_type == "IDT" :
357- node .attr .update (color = "#B3BC6D" , fillcolor = "#E6EE9C" )
357+ node .set_color ("#B3BC6D" )
358+ node .set_fillcolor ("#E6EE9C" )
358359 ctl_transforms_idt .append (node )
359360 elif ctl_transform_type in ("ODT" , "InvODT" ):
360- node .attr .update (color = "#CA9B52" , fillcolor = "#FFCC80" )
361+ node .set_color ("#CA9B52" )
362+ node .set_fillcolor ("#FFCC80" )
361363 ctl_transforms_odt .append (node )
362364 elif ctl_transform_type in ("RRTODT" , "InvRRTODT" ):
363- node .attr .update (color = "#C88719" , fillcolor = "#FFB74D" )
365+ node .set_color ("#C88719" )
366+ node .set_fillcolor ("#FFB74D" )
364367 ctl_transforms_output_transform .append (node )
365368 elif ctl_transform_type == "LMT" :
366- node .attr .update (color = "#4BA3C7" , fillcolor = "#81D4FA" )
369+ node .set_color ("#4BA3C7" )
370+ node .set_fillcolor ("#81D4FA" )
367371 ctl_transforms_lmt .append (node )
368372
369- agraph .add_subgraph (ctl_transforms_csc , name = "cluster_ACEScsc" , color = "#00BCD4FF" )
370- agraph .add_subgraph (ctl_transforms_idt , name = "cluster_IDT" , color = "#B3BC6D" )
371- agraph .add_subgraph (ctl_transforms_odt , name = "cluster_ODT" , color = "#CA9B52" )
372- agraph .add_subgraph (
373- ctl_transforms_output_transform ,
374- name = "cluster_OutputTransform" ,
375- color = "#C88719" ,
373+ ctl_transforms_csc_subgraph = Subgraph (name = "cluster_ACEScsc" , color = "#00BCD4FF" )
374+ for node in ctl_transforms_csc :
375+ ctl_transforms_csc_subgraph .add_node (node )
376+ dot .add_subgraph (ctl_transforms_csc_subgraph )
377+
378+ ctl_transforms_idt_subgraph = Subgraph (name = "cluster_IDT" , color = "#B3BC6D" )
379+ for node in ctl_transforms_idt :
380+ ctl_transforms_idt_subgraph .add_node (node )
381+ dot .add_subgraph (ctl_transforms_idt_subgraph )
382+
383+ ctl_transforms_odt_subgraph = Subgraph (name = "cluster_ODT" , color = "#CA9B52" )
384+ for node in ctl_transforms_odt :
385+ ctl_transforms_odt_subgraph .add_node (node )
386+ dot .add_subgraph (ctl_transforms_odt_subgraph )
387+
388+ ctl_transforms_output_transform_subgraph = Subgraph (
389+ name = "cluster_OutputTransform" , color = "#C88719"
376390 )
377- agraph .add_subgraph (ctl_transforms_lmt , name = "cluster_LMT" , color = "#4BA3C7" )
391+ for node in ctl_transforms_output_transform :
392+ ctl_transforms_output_transform_subgraph .add_node (node )
393+ dot .add_subgraph (ctl_transforms_output_transform_subgraph )
394+
395+ ctl_transforms_lmt_subgraph = Subgraph (name = "cluster_LMT" , color = "#4BA3C7" )
396+ for node in ctl_transforms_lmt :
397+ ctl_transforms_lmt_subgraph .add_node (node )
398+ dot .add_subgraph (ctl_transforms_lmt_subgraph )
399+
400+ for edge in dot .get_edges ():
401+ edge .set_color ("#26323870" )
378402
379- agraph .edge_attr .update (color = "#26323870" )
380- agraph .draw (filename , prog = prog , args = args )
403+ file_format = os .path .splitext (filename )[- 1 ][1 :]
404+ write_method = getattr (dot , f"write_{ file_format } " )
405+ write_method (filename , prog = prog , f = file_format )
381406
382- return agraph
407+ return dot
383408
384409
385410if __name__ == "__main__" :
0 commit comments