= GraphViz =
Graphviz is open source graph visualization software. Graph visualization is a way of representing structural information as diagrams of abstract graphs and networks. It has important applications in networking, bioinformatics,  software engineering, database and web design, machine learning, and in visual interfaces for other technical domains. 

http://www.graphviz.org/

http://www.tonyballantyne.com/graphs.html

== Generate graph in png file ==

x.dot
{{{
digraph SomeGraph {
  A -> { B C }
  B -> C
}
}}}

{{{#!highlight sh
dot x.dot -T png -Ox.png
}}}

== Slackware64 14.1 install ==
{{{#!highlight sh
upgradepkg binutils-2.23.52.0.1-x86_64-2.txz
cd /tmp
wget http://graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.26.3.tar.gz
tar xvzf graphviz-2.26.3.tar.gz
cd graphviz-2.26.3
./configure --enable-php=no
make clean
make 
make install
}}}

== GraphViz for MoinMoin ==
http://moinmo.in/GraphVizForMoin
{{{#!highlight sh
# in Ubuntu/Raspbian/Debian box
sudo bash
apt install graphviz unzip
cd /tmp
wget "https://moinmo.in/GraphVizForMoin?action=AttachFile&do=get&target=MoinGraphViz-1.0rc4-brn-1.9.x.comp.zip"
unzip *MoinGraphViz-1.0rc4-brn-1.9.x.comp.zip 
cd /tmp/MoinGraphViz-1.0rc4-brn-1.9.x.comp/wiki/data/plugin
cp * -r /home/moin/moin-1.9.11/wiki/data/plugin/ 
cd /home/moin/moin-1.9.11/wiki/data/plugin/  && chown moin * -R && chgrp www-data * -R
cd /tmp/MoinGraphViz-1.0rc4-brn-1.9.x.comp/umoin
cp MoinLegacy /home/moin/moin-1.9.11/MoinMoin/support/
cd /home/moin/moin-1.9.11/MoinMoin/support/
chown moin * -R
chgrp www-data * -R
vim /home/moin/moin-1.9.11/wiki/data/plugin/parser/MoinGraphViz/main.py # GRAPHVIZ_TOOLS_DIR = r'/usr/bin'
service nginx restart
service apache2 restart
}}}

Note to configure the path of dot executable:
 * wiki/data/plugin/parser/MoinGraphViz/main.py:GRAPHVIZ_TOOLS_DIR = r'C:/timwe/tools/Graphviz2.38/bin'

== Windows configuration ==
On file <...>moin-1.9.7\wiki\data\plugin\parser\MoinGraphViz\main.py 
change in line 254 from close_fds=True to close_ds=False, due to error launched in Windows.
{{{#!highlight python
def oscmd(cmd):
    '''instead of simply calling os.system(cmd)
    capture stderr and raise GraphvizRenderError if exit code != 0
    '''
    p = Popen(cmd, stdout=PIPE, stderr=PIPE, shell=True, 
            bufsize=1024, close_fds=False)
    stdo, stde = p.communicate()

    if p.returncode != 0:
        raise GraphvizRenderError("%s\n%s" % (stdo, stde))
}}}

=== Test after installation ===
If all was installed correctly a graph should appear below
{{{#!GraphViz dot
digraph SomeGraph {
  A -> { B C }
  B -> C
}
}}}


== Sample 1 ==
{{{#!GraphViz dot
digraph G {
 main -> parse -> execute;
 main -> init;
 main -> cleanup;
 execute -> make_string;
 execute -> printf
 init -> make_string;
 main -> printf;
 execute -> compare;
}
}}}

== UML with GraphViz ==

=== UML Sample 1 ===
http://www.ffnn.nl/pages/articles/media/uml-diagrams-using-graphviz-dot.php

{{{#!GraphViz dot
digraph UMLTest {
  fontname = "Bitstream Vera Sans"
  fontsize = 8
  node [  fontname = "Bitstream Vera Sans"  fontsize = 8  shape = "record"  ]
  edge [ fontname = "Bitstream Vera Sans" fontsize = 8 ]

  Animal [ label = "{Animal|+ name : string\l+ age : int\l|+ die() : void\l}"  ]

  subgraph clusterAnimalImpl {
    label = "Package animal.impl"
    Dog [ label = "{Dog||+ bark() : void\l}"  ]
    Cat [ label = "{Cat||+ meow() : void\l}"  ]
  }

  edge [ arrowhead = "empty"  ]

  Dog -> Animal
  Cat -> Animal

  edge [  arrowhead = "none"  headlabel = "0..*"  taillabel = "0..*"  ]
  Dog -> Cat
}

}}}

=== UML Sample 2 ===
http://www.lornajane.net/posts/2011/uml-diagrams-with-graphviz

{{{#!GraphViz dot
digraph Couriers {
fontname = "Bitstream Vera Sans"
fontsize = 8

node [
fontname = "Bitstream Vera Sans"
fontsize = 8
shape = "record"
]

edge [ arrowtail = "empty" ]

Courier [ label = "{Courier|+ name : string\l+ home_country : string\l|+ calculateShipping() : float\l+ ship(): boolean\l}" ]

Monotype [ label = "{MonotypeDelivery|\l|+ ship(): boolean\l}" ]
Pigeon [ label = "{PigeonPost|\l|+ ship(): boolean\l}" ]
Courier -> Pigeon [dir=back]
Courier -> Monotype [dir=back]
}
}}}

=== UML Sample 3 ===
http://canvoki.net/coder/resources/DotUmlUseCases.html

http://canvoki.net/coder/DotUseCases/MarUseCases.dot

{{{#!GraphViz dot
digraph example {
        rankdir=LR;
        bgcolor="#eeeeff";
        node [fontname=Arial, fontsize=10];
        edge [color=red, style=bold, fontsize=9];

        // Actors
        {
                node [shape=custom, shapefile="Actor.png", 
                        width=.352, height=0.77, fixedsize=true, 
                        color="#ffffaa", label="\n\n\n\n\n\n\N"]
                Shark
                Submariner
                Pirate
                Merchant
        }

        // System Use Cases
        subgraph clusterSystem
        {
                label="Sea"; // Name your system here
                fillcolor="#ffffdd"; style=filled; color=black; // The system box
                node [shape=ellipse, style=filled, fillcolor="#ccffcc", color="#558855"]

                Batism
                Inmersion
                "Eat pirates" // You can name it with spaces
                // But is better to use a 'label' property to make easier the references
                Tresour [label="Find a tresour"] 
                Attack [label="Attack ships"]
                Escafandrarse [label="Put on the\nescafandre"] // Multiline
                Ron [label="Drink Ron"]
                SellGoods
                Navigate
                GaleonPiloting [label="Navigate in galeon"]
                BuyGoods [label="Buy Goods"]
        }

        // Uses
        Submariner -> Inmersion
        Submariner -> Batism
        Pirate -> Attack
        Pirate -> Ron
        Merchant -> SellGoods
        Shark -> "Eat pirates"

        // Extensions
        {
                edge [label="<<extends>>", dir=back]
                Inmersion -> Tresour
        }

        // Inclusions
        {
                edge [label="<<includes>>"]
                Inmersion -> Escafandrarse
                SellGoods -> Navigate
                SellGoods -> BuyGoods
                Attack -> GaleonPiloting
        }

        // Generalizations
        {
                edge [arrowsize=1.5, arrowtail=empty, dir=back, constraint=false]
                Inmersion -> Batism
                Navigate -> GaleonPiloting
        }
}

}}}

=== UML Sample 4 ===
http://fsteeg.wordpress.com/2006/11/16/uml-activity-diagrams-with-graphviz/

{{{#!GraphViz dot
digraph untitled {
rankdir=TD
size="4,4"
edge[fontsize="11" arrowhead=open]
start[shape=circle, label="", style=filled]
end[shape=doublecircle, label="", style=filled]
action1[shape=box,style=rounded, label="action"]
action2[shape=box,style=rounded, label="action"]
action3[shape=box,style=rounded, label="action"]
if1[shape=diamond, label="decision"]
if2[shape=diamond, label="decision"]

start -> action1
action1 -> if1[headport=n]
if1 -> action2[label="condition" tailport=w]
if1 -> action3[taillabel="condition" labeldistance=2.5 tailport=e]
action2 -> if2[headport=w]
action3 -> if2[headport=e]
if2 -> end[taillabel="condition"]
}
}}}

{{{
digraph untitled {
rankdir=TD
size="4,4"
edge[fontsize="11" arrowhead=open]
start[shape=circle, label="", style=filled]
end[shape=doublecircle, label="", style=filled]
action1[shape=box,style=rounded, label="action"]
action2[shape=box,style=rounded, label="action"]
action3[shape=box,style=rounded, label="action"]
if1[shape=diamond, label="decision"]
if2[shape=diamond, label="decision"]

start -> action1
action1 -> if1[headport=n]
if1 -> action2[label="condition" tailport=w]
if1 -> action3[taillabel="condition" labeldistance=2.5 tailport=e]
action2 -> if2[headport=w]
action3 -> if2[headport=e]
if2 -> end[taillabel="condition"]
}
}}}

{{{#!GraphViz dot
digraph untitled {
rankdir=TD

ClassA[shape=rectangle]
ClassB[shape=rectangle]

{ edge[label=" 1.method1() \l 2. method2()"]   ClassA->ClassB}
{ edge[label=" 4.method1() \l 3. method2()"]   ClassB->ClassA}

}
}}}

== Graphviz in MoinMoin 1.9.8 CentOS CentOS release 6.6 (Final) ==
{{{#!highlight bash
cd /tmp
wget "https://moinmo.in/GraphVizForMoin?action=AttachFile&do=get&target=MoinGraphViz-1.0rc4-brn-1.9.x.comp.zip"
unzip "GraphVizForMoin?action=AttachFile&do=get&target=MoinGraphViz-1.0rc4-brn-1.9.x.comp.zip"
cd MoinGraphViz-1.0rc4-brn-1.9.x.comp/wiki/data/plugin/
cp * -r /root/moin-1.9.8/wiki/data/plugin/
cd ../umoin/
cp MoinLegacy.py /root/moin-1.9.8/MoinMoin/support/
yum install graphviz
vim /root/moin-1.9.8/wiki/data/plugin/parser/MoinGraphViz/main.py
GRAPHVIZ_TOOLS_DIR = r'/usr/bin' 
cd /root/moin-1.9.8
chown root * -R
chgrp root * -R
service moinmoin stop
service moinmoin start
}}}