root/gaphor/tags/gaphor-0.9.2/bin/gaphorconvert

Revision 720, 3.5 kB (checked in by wrobell, 3 years ago)

- merged from COMPOSITE_STRUCTURES branch

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
Line 
1 #!/usr/bin/python
2
3 import gaphor
4 import gaphor.storage as storage
5 import gaphor.UML as UML
6 import diacanvas
7
8 import cairo
9 import cairo.svg
10
11 import optparse
12 import os
13 import re
14 import sys
15 import tempfile
16
17 def pkg2dir(package):
18     """
19     Return directory path from UML package class.
20     """
21     name = []
22     while package:
23         name.insert(0, package.name)
24         package = package.package
25     return '/'.join(name)
26
27
28 def message(msg):
29     """
30     Print message if user set verbose mode.
31     """
32     global options
33     if options.verbose:
34         print >> sys.stderr, msg
35
36
37 usage = 'usage: %prog [options] file1 file2...'
38
39 parser = optparse.OptionParser(usage = usage)
40
41 parser.add_option('-v', '--verbose', dest = 'verbose', action = 'store_true',
42     help = 'verbose output')
43 parser.add_option('-u', '--use-underscores', dest = 'underscores', action = 'store_true',
44     help = 'use underscores instead of spaces for output filenames')
45 parser.add_option('-d', '--dir', dest = 'dir', metavar = 'directory',
46     help = 'output to directory')
47 parser.add_option('-f', '--format', dest = 'format', metavar = 'format',
48     help = 'output file format, default pdf', default = 'pdf',
49     choices = ['pdf', 'svg'])
50 parser.add_option('-r', '--regex', dest = 'regex', metavar = 'regex',
51     help = 'process diagrams which name matches given regular expresion;' \
52     ' name includes package name; regular expressions are case insensitive')
53
54 (options, args) = parser.parse_args()
55
56 if not args:
57     parser.print_help()
58     sys.exit(1)
59
60
61 factory = UML.ElementFactory()
62
63
64 name_re = None
65 if options.regex:
66     name_re = re.compile(options.regex, re.I)
67
68 # we should have some gaphor files to be processed at this point
69 for model in args:
70     message('loading model %s' % model)
71     storage.load(model, factory)
72     message('\nready for rendering\n')
73
74     for diagram in factory.select(lambda e: e.isKindOf(UML.Diagram)):
75         dir = pkg2dir(diagram.package)
76
77         pname = dir + '/' + diagram.name # plain name, no extension
78                                          # or additional directories
79         if options.underscores:
80             dir = dir.replace(' ', '_')
81             pname = pname.replace(' ', '_')
82
83         if name_re and not name_re.search(pname):
84             message('skipping %s' % pname)
85             continue
86
87         if options.dir:
88             dir = '%s/%s' % (options.dir, dir)
89
90         pdf_name = '%s/%s.pdf' % (dir, diagram.name)
91
92         # in case of pdf format we create temporary svg file; see comment below
93         if options.format == 'svg':
94             svg_name = '%s/%s.svg' % (dir, diagram.name)
95             out_name = svg_name
96         else:
97             fd, svg_name = tempfile.mkstemp()
98             del fd # we do not use it anymore
99             out_name = pdf_name
100
101         if not os.path.exists(dir):
102             message('creating dir %s' % dir)
103             os.makedirs(dir)
104
105         message('rendering: %s -> %s...' % (pname, out_name))
106
107         # we use always svg as midstep for conversion between gaphor file
108         # and pdf; it should be changed in the future, when diacanvas
109         # uses canvas which supports pdf as output format...
110         svg = diacanvas.ExportSVG()
111         svg.render(diagram.canvas)
112         svg.save(svg_name)
113
114         if options.format == 'pdf':
115             svg = cairo.svg.Context()
116             svg.parse(svg_name)
117             width, height = svg.get_size()
118
119             ctx = cairo.Context(cairo.PDFSurface(pdf_name, width, height))
120             svg.render(ctx)
121             ctx.show_page()
122
123             # svg file is no longer necessary
124             os.unlink(svg_name)
Note: See TracBrowser for help on using the browser.