""" 3D Visualisation function for strawberry on MTG. """
from __future__ import absolute_import
from __future__ import print_function
from collections import OrderedDict
from math import radians
from openalea.strawberry import geometry
from openalea.mtg import *
from openalea.mtg.turtle import *
from openalea.plantgl import all as pgl
from openalea.plantgl.all import *
from six.moves import range
[docs]def strawberry_visitor(g, v, turtle, time=0):
""" Function that draw geometry for a given vertex. """
geoms = geometry.get_symbols()
turtle.setWidth(0.01)
nid = g.node(v)
label = g.label(v)
if g.edge_type(v) == '+':
turtle.down(30)
elif label in ('F','f', 'Cotyledon', 'Unifoliate', 'Trifoliate', 'LeafPrimordia'):
turtle.rollL(geometry.roll_angle)
turtle.setId(v)
geoms.get(label)(g, v, turtle)
#Vizalisation by genotype and by date
[docs]def visualise_plants(g, vids=[], positions=[], no_plant=[], hide_leaves=False):
geometry.WITHOUT_LEAF = hide_leaves
max_scale = g.max_scale()
t = pgl.PglTurtle()
if not vids:
vids = g.component_roots_at_scale(g.root, scale=max_scale)
x = -no_plant
y = -12
dx = 2.
dy = 4.
positions = [(x+(count%no_plant)*dx,y+(count/no_plant)*dy,0) for count in range(len(vids))]
else:
#vids = [cid for vid in vids for cid in g.component_roots_at_scale_iter(vid, scale=max_scale)]
vids = vids
#assert len(vids) == len(positions)
n= len(vids)
scenes = pgl.Scene()
for i, vid in enumerate(vids):
#position = (x+(count%9)*dx,y+(count/9)*dy,0)
position = positions[i]
t = pgl.PglTurtle()
#t.move(position)
scene = turtle.traverse_with_turtle(g, vid, visitor=strawberry_visitor, turtle=t, gc=False)
ds = scene.todict()
for shid in ds:
for sh in ds[shid]:
sh.geometry = pgl.Translated(position, sh.geometry)
scenes.add(sh)
return scenes
[docs]def plant_positions(g, by=['Genotype'], vids=[]):
prop = by[0]
nb_by = 1
if len(by) > 1:
nb_by = len(by)
if len(by) > 2:
# print("Not implemented for more than 2 properties ", by)
pass
# TODO: Check if the property is in the MTG
mod = g.property(prop)
if nb_by > 1:
mod2 = g.property(by[1])
my_property = OrderedDict()
for k, v in mod.items():
if vids and (k not in vids):
continue
if nb_by == 1:
my_property.setdefault(v, []).append(k)
else:
my_property.setdefault(v, OrderedDict()).setdefault(mod2[k], []).append(k)
my_property = OrderedDict(sorted(my_property.items(), key=lambda x: x[0]))
for k in my_property:
if nb_by == 1:
my_property[k].sort()
else:
old_dict = my_property[k]
new_dict = OrderedDict(sorted(old_dict.items(), key=lambda x: x[0]))
my_property[k] = new_dict
for k2, v2 in new_dict.items():
v2.sort()
max_scale = g.max_scale()
dx = 4.
dy = 4.
nb_col = len(my_property)
max_plants = max(len(x) for x in my_property.values())
x0 = -max_plants * dx // 2
y0 = - nb_col * dy // 2
x0, y0 = 0,0
if nb_by == 1:
vids = [next(g.component_roots_at_scale_iter(vid, scale=max_scale)) for k, v in my_property.items() for vid in v]
else:
vids = [next(g.component_roots_at_scale_iter(vid, scale=max_scale)) for k, d in my_property.items() for k2, v in d.items() for vid in v]
positions = []
x, y = x0, y0
for genotype in my_property:
if nb_by == 1:
for vid in my_property[genotype]:
position = x, y, 0.
y += dy
positions.append(position)
x += dx
y = y0
else:
for name2 in my_property[genotype]:
for vid in my_property[genotype][name2]:
position = x, y, 0.
y += dy
positions.append(position)
x += dx
y = y0
x += dx
return vids, positions
[docs]def plot3d(g, by=['Genotype'], hide_leaves=False,display=True, vids=[]):
if not vids:
vids = g.vertices(scale=1)
vids, positions = plant_positions(g, by=by, vids=vids)
color_code(g)
scene = visualise_plants(g, vids=vids, positions=positions, hide_leaves=hide_leaves)
if display:
pgl.Viewer.display(scene)
else:
return scene
## Colors rules
[docs]def color_code(g):
"""The color code of the 3d visualization
return Colloration rule of each object phytomer, inflorescence, bud, phytomer_primordia, inflo_primordia,stolon
according to orders and stage
:param g: a current MTG
:type g: MTG
"""
cleaf = (0,125,0)
cfleaf = (255, 0, 255)
cstolon= (0,20,0)
labels = g.property('label')
for v in g.vertices(scale=g.max_scale()):
nid = g.node(v)
if nid.label == 'F':
nid.color = cleaf
if nid.order == 1:
nid.color=(255,0,0)
elif nid.order == 2:
nid.color=(0,0,255)
elif nid.order == 3:
nid.color=(255,255,0)
elif nid.order == 4:
nid.color=(255,0,255)
elif nid.order == 5:
nid.color=(0,255,255)
elif nid.order == 6:
nid.color=(255,255,255)
elif nid.order >6:
nid.color=(0, 0, 0)
if nid.label =='f':
nid.color = cfleaf
elif nid.label == 's':
nid.color = cstolon
elif nid.label == 'bt':
stade = nid.Stade
if stade is None:
nid.color = (155, 155, 155)
elif stade in ('17', '18', '19'):
nid.color=(0, 255,0)
elif stade == 'A':
nid.color = (255,0,0)
elif stade in ['B','C','D','E','F','G','H']:
d = dict(zip('BCDEFGH', list(range(1, len('BCDEFGH')+1))))
i = d[stade]
nid.color = (255, int(127+127/7*(i-1)),0)
else:
nid.color = (153, 102, 51)
elif nid.label == 'ht':
stade = nid.Stade
if stade is None:
nid.color = (155, 155, 155)
elif stade in ('17', '18', '19'):
nid.color= (0, 255,0)
elif stade == 'A':
nid.color = (255,0,0)
elif stade in 'BCDEFGH':
d = dict(zip('BCDEFGH', list(range(1, len('BCDEFGH')+1))))
i = d[stade]
nid.color = (255, int(127+127/7*(i-1)),0)
else:
nid.color = (153, 102, 51)
elif nid.label == 'HT':
stade = nid.Stade
if stade is None:
nid.color = (155, 155, 155)
elif stade in ('17', '18', '19'):
nid.color=(0,0,255)
elif stade == 'I':
nid.color = (255,0,0)
else:
stades = list(map(str, list(range(55,88))))
if stade in stades:
d = dict(zip(stades, list(range(len(stades)))))
i = d[stade]
nid.color = (0, int(127+127/(len(stades)-1)*(i)),255)
else:
nid.color = (153, 102, 51)