Source code for openalea.mtg.util
# -*- python -*-
#
# OpenAlea.mtg
#
# Copyright 2008-2009 INRIA - CIRAD - INRA
#
# File author(s): Christophe Pradal <christophe.pradal.at.cirad.fr>
#
# Distributed under the Cecill-C License.
# See accompanying file LICENSE.txt or copy at
# http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html
#
# OpenAlea WebSite : http://openalea.gforge.inria.fr
#
################################################################################
'''
Different utilities such as plot2D, plot3D, and so on...
'''
from openalea.mtg import *
from openalea.mtg.traversal import *
[docs]
def mtg_plot(g, scales=1):
import pydot
uniq_scales = set(g._scale.values())
#cluster2.set_bgcolor('#000fff')
#pydot_graph = pydot.graph_from_edges(((f(x), f(y)) for x, y in g.iteredges(scale=scale)))
callgraph = pydot.Dot(graph_type='digraph',fontname="Verdana")
label = g.property('label')
scale = g._scale
for s in uniq_scales:
print(s)
#cluster2 = pydot.Cluster('U2')
#cluster2.add_edge(pydot.Edge('I4', 'I5'))
#callgraph.add_subgraph(cluster2)
#callgraph.write_png('cluster.png')
#if label:
# f = lambda id: label.get(id, str(id))
#else:
# f = str
callgraph.write_png('cluster.png')
[docs]
def plot2d(g, image_name, scale=None, orientation=90 ):
"""Compute an image of the tree via graphviz.
:Parameters:
- `g` (int) : an MTG object
- `image_name` (str) : output filename e.g. test.png
:Optional parameters:
- `scale` (int): represents the MTG's scale to look at (default max)
- `orientation` (int): orientation angle (default 90)
"""
import pydot
if scale is None:
scale = max(g.scales_iter())
label = g.property('label')
edges = g.iteredges(scale=scale)
if label:
f = lambda id: label.get(id, str(id))
else:
f = str
pydot_graph = pydot.graph_from_edges(((f(x), f(y)) for x, y in g.iteredges(scale=scale)))
# Attributes
pydot_graph.set('orientation', orientation)
ext = os.path.splitext(image_name)[1].strip('.')
return pydot_graph.write(image_name, prog='dot',format=ext)
[docs]
def plot3d( g, scale=None ):
"""
Compute a 3d view of the MTG in a simple way:
* sphere for the nodes and thin cylinder for the edges.
"""
import openalea.plantgl.all as pgl
if scale is None:
scale = max(g.scales())
# Vertex are sphere of radius 1/2
# edge are cylinder of radius 1/6 and length 3
points = {}
edges = {}
edge_type = g.property('edge_type')
root_id = next(g.roots_iter(scale=scale))
for vid in pre_order(g, root_id):
parent = g.parent(vid)
if parent is None:
points[vid] = (0,0,0)
edges = (0,0,3)
else:
et = edge_type[vid]
[docs]
def plot_nx(g, *args, **kwds):
import plot_statistic as ps