Visualization
A meta-model, model and parse-tree can be exported to dot files (GraphViz) for
visualization. Module textx.export
contains functions metamodel_export
and
model_export
that can export meta-model and model to dot files respectively.
But, it is usually more convenient to produce visualization using the textx
command.
If debugging is enabled, meta-model, model and parse trees will automatically get exported to dot.
Dot files can be viewed by dot viewers. There are quite a few dot viewers freely available (e.g. xdot, ZGRViewer).
Alternatively, dot files can be converted to image formats using dot
command.
For more info see this SO
thread.
In addition to GraphViz we also support PlantUML as target for our exports
(see textx command/tool). You can copy-paste the exported
file content online on the PlantUML website to visualize it. The PlantUML Tool
is a JAR file (Java) which runs on various platforms. Many Linux distributions
have this tool included (e.g. Ubuntu: apt install platuml
).
Producing (meta)model visualizations using the textx
command
This section describes how to use textx
command and registered
generators to produce model and meta-model visualizations.
Visualizations of models and meta-models are implemented by registering
generators from textX
(for meta-models) or any
(for all models) to dot
or
PlantUML
file format. Several of these generators are provided by textX. You
can list them by list-generators command:
$ textx list-generators
textX -> dot textX Generating dot visualizations from textX grammars
textX -> PlantUML textX Generating PlantUML visualizations from textX grammars
any -> dot textX Generating dot visualizations from arbitrary models
flow-dsl -> PlantUML flow-codegen Generating PlantUML visualization from flow-dsl
You see that we have two generators from textX
language (i.e. textX grammar
language) registered by the textX
project. The first as a target uses dot
and the second uses PlantUML
. These generators will produce dot
(part of
GraphViz) or pu
(PlantUML) file respectively.
Also, you can see that there is any
-> dot
generator. This generator can be
applied to any model and will produce dot
output.
You can also see in this example that we have a specific visualization for
language flow-dsl
that produces PlantUML
code. You can register visualizers
for your own language by registering a generator from your language to some
output that represents visual rendering. Also, you could provide rendering to
some different format for all models (any
) or for textX grammars. See the
registration/discovery feature on how to do that.
Generators that produce visualization are by no means different from any other generators (e.g. those that would produce Java or Python code).
Here is an example on how to produce the same visualization described in section Visualization (see the robot example).
$ textx generate robot.tx --target dot
Generating dot target from models:
/home/igor/repos/textX/textX/examples/robot/robot.tx
-> /home/igor/repos/textX/textX/examples/robot/robot.dot
To convert to png run "dot -Tpng -O robot.dot"
Now you can view dot
file using some of available viewers. For example, if you
install xdot:
$ xdot robot.dot
or convert it to some other graphical format (GraphViz is needed):
$ dot -Tpng -O robot.dot
and you will get robot.dot.png
that looks like this:
You can also generate PlantUML output from the grammar files:
$ textx generate robot.tx --target plantuml
Generating plantuml target from models:
/home/igor/repos/textX/textX/examples/robot/robot.tx
-> /home/igor/repos/textX/textX/examples/robot/robot.pu
To convert to png run 'plantuml /home/igor/repos/textX/textX/examples/robot/robot.pu'
This will produce file robot.pu
. Now convert it to robot.png
by (PlantUML
must be installed and accessible on path):
$ plantuml robot.pu
The produced robot.png
image will look like this:
PlantUML generator accepts additional parameter linetype
which controls
the style of lines in the diagram. Possible values are ortho
and
polyline
. For example:
$ textx generate robot.tx --target plantuml --linetype ortho
Similarly you can generate output from any model. For example:
$ textx generate program.rbt --grammar robot.tx --target dot
Generating dot target from models:
/home/igor/repos/textX/textX/examples/robot/program.rbt
-> /home/igor/repos/textX/textX/examples/robot/program.dot
To convert to png run "dot -Tpng -O program.dot"
In this example we had to supply --grammar
option to generate
command as the
robot
language is not registered by the registration API.
If we had the robot language registered, meta-model could be discovered by the
file extension.
We could as usual visualize the dot
file by some of the available viewers or
transform it to png
format. The produced image will look like this:
PlantUML output is not yet available for model files.
Visualize meta-models programmatically
To visualize a meta-model programmatically do (see Entity example):
from textx import metamodel_from_file
from textx.export import metamodel_export
entity_mm = metamodel_from_file('entity.tx')
metamodel_export(entity_mm, 'entity.dot')
entity.dot
file will be created. You can visualize this file by using various
dot viewers or convert it to various image formats using the dot
tool.
$ dot -Tpng -O entity.dot
The following image is generated:
Alternatively, you can also specify an alternative renderer to export your meta model for the PlantUML tool.
from textx import metamodel_from_file
from textx.export import metamodel_export, PlantUmlRenderer
entity_mm = metamodel_from_file('entity.tx')
metamodel_export(entity_mm, 'entity.pu',renderer=PlantUmlRenderer())
entity.pu
file will be created. You can convert it to various image formats
using the plantuml
tool.
$ plantuml -Tpng entity.pu
The following image is generated:
Visualize models programmatically
Similarly to meta-model visualization, you can also visualize your models (see Entity example).
from textx.export import model_export
person_model = entity_mm.model_from_file('person.ent')
model_export(person_model, 'person.dot')
Convert this dot
file to png
with:
$ dot -Tpng -O person.dot
The following image is generated: