#!/usr/bin/env python3 # pylint: disable=C0103,C0114,C0115,C0116,C0209,C0301 ###################################################################### import argparse import re ###################################################################### Header = [] Vertexes = [] Edges = [] ####################################################################### def dotread(filename): with open(filename, "r", encoding="utf8") as fh: header = True vnum = 0 vertex_re = re.compile(r'^\t([a-zA-Z0-9_]+)\t(.*)$') edge_re = re.compile( r'^\t([a-zA-Z0-9_]+)\s+->\s+([a-zA-Z0-9_]+)\s*(.*)$') for line in fh: vertex_match = re.search(vertex_re, line) edge_match = re.search(edge_re, line) if vertex_match: if vertex_match.group(1) != 'nTITLE': header = False Vertexes.append({ 'num': vnum, 'line': line, 'name': vertex_match.group(1) }) vnum += 1 elif edge_match: fromv = edge_match.group(1) tov = edge_match.group(2) w = re.match(r'weight=(\d+)', line) weight = w.group(1) if w else 1 w = re.match(r'style=(\S+)', line) cutable = w.group(1) if w else None edge = { 'num': vnum, 'line': line, 'weight': weight, 'cutable': cutable, 'from': fromv, 'to': tov } vnum += 1 Edges.append(edge) elif header: Header.append(line) print("IGNORE: " + line) ####################################################################### def cwrite(filename): with open(filename, "w", encoding="utf8") as fh: fh.write("void V3GraphTestImport::dotImport() {\n") fh.write(" auto* gp = &m_graph;\n") for ver in sorted(Vertexes, key=lambda ver: ver['num']): fh.write( " auto* %s = new V3GraphTestVertex{gp, \"%s\"}; if (%s) {}\n" % (ver['name'], ver['name'], ver['name'])) fh.write("\n") for edge in Edges: fh.write(" new V3GraphEdge{gp, %s, %s, %s, %s};\n" % (edge['from'], edge['to'], edge['weight'], "true" if edge['cutable'] else "false")) fh.write("}\n") ###################################################################### # main parser = argparse.ArgumentParser( allow_abbrev=False, formatter_class=argparse.RawDescriptionHelpFormatter, description= """dot_importer takes a graphvis .dot file and converts into .cpp file. This x.cpp file is then manually included in V3GraphTest.cpp to verify various xsub-algorithms.""", epilog= """Copyright 2005-2023 by Wilson Snyder. This program is free software; you can redistribute it and/or modify it under the terms of either the GNU Lesser General Public License Version 3 or the Perl Artistic License Version 2.0. SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0""") parser.add_argument('--debug', action='store_const', const=9, help='enable debug') parser.add_argument('filename', help='input .dot filename to process') Args = parser.parse_args() dotread(Args.filename) cwrite("graph_export.cpp") ###################################################################### # Local Variables: # compile-command: "./dot_importer ../test_regress/obj_vlt/t_EXAMPLE/*orderg_o*.dot && cat graph_export.cpp" # End: