17
17
18
18
import codecs
19
19
import logging
20
+ import os
20
21
import pickle
21
22
22
23
from opencolorio_config_aces .config .reference .discover .classify import (
@@ -299,11 +300,11 @@ def conversion_path(graph, source, target):
299
300
300
301
301
302
@required ("NetworkX" )
302
- def plot_aces_conversion_graph (graph , filename , prog = "dot" , args = "" ):
303
+ def plot_aces_conversion_graph (graph , filename , prog = "dot" ):
303
304
"""
304
305
Plot given *aces-dev* conversion graph using
305
306
`Graphviz <https://www.graphviz.org/>`__ and
306
- `pyraphviz <https://pygraphviz.github.io >`__.
307
+ `Pydot <https://pypi.org/project/pydot/ >`__.
307
308
308
309
Parameters
309
310
----------
@@ -314,72 +315,96 @@ def plot_aces_conversion_graph(graph, filename, prog="dot", args=""):
314
315
prog : unicode, optional
315
316
{'neato', 'dot', 'twopi', 'circo', 'fdp', 'nop'},
316
317
*Graphviz* layout method.
317
- args : unicode, optional
318
- Additional arguments for *Graphviz*.
319
318
320
319
Returns
321
320
-------
322
- AGraph
323
- *PyGraphviz * graph.
321
+ Dot
322
+ *Pydot * graph.
324
323
"""
325
324
326
325
import networkx as nx
326
+ from pydot import Subgraph
327
327
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 )
333
329
334
330
ctl_transforms_csc = []
335
331
ctl_transforms_idt = []
336
332
ctl_transforms_odt = []
337
333
ctl_transforms_output_transform = []
338
334
ctl_transforms_lmt = []
339
335
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
+
341
342
unserialized = pickle .loads ( # noqa: S301
342
- codecs .decode (node .attr ["serialized" ].encode (), "base64" )
343
+ codecs .decode (node .get_attributes () ["serialized" ].encode (), "base64" )
343
344
)
344
345
345
346
ctl_transform_type = unserialized .type
346
347
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 )
353
352
elif ctl_transform_type == "ACEScsc" :
354
- node .attr .update (color = "#00BCD4FF" , fillcolor = "#00BCD470" )
353
+ node .set_color ("#00BCD4FF" )
354
+ node .set_fillcolor ("#00BCD470" )
355
355
ctl_transforms_csc .append (node )
356
356
elif ctl_transform_type == "IDT" :
357
- node .attr .update (color = "#B3BC6D" , fillcolor = "#E6EE9C" )
357
+ node .set_color ("#B3BC6D" )
358
+ node .set_fillcolor ("#E6EE9C" )
358
359
ctl_transforms_idt .append (node )
359
360
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" )
361
363
ctl_transforms_odt .append (node )
362
364
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" )
364
367
ctl_transforms_output_transform .append (node )
365
368
elif ctl_transform_type == "LMT" :
366
- node .attr .update (color = "#4BA3C7" , fillcolor = "#81D4FA" )
369
+ node .set_color ("#4BA3C7" )
370
+ node .set_fillcolor ("#81D4FA" )
367
371
ctl_transforms_lmt .append (node )
368
372
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"
376
390
)
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" )
378
402
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 )
381
406
382
- return agraph
407
+ return dot
383
408
384
409
385
410
if __name__ == "__main__" :
0 commit comments