Source code for openalea.oalab.fspm.mtgimport
from openalea.mtg.io import *
import openalea.mtg.plantframe as plantframe
import openalea.mtg.algo as algo
from openalea.mtg import aml, dresser
from openalea.plantgl.all import norm,Vector3
from numpy import mean
import os
[docs]def flatten(g):
microroot = g.component_roots_at_scale_iter(g.root,g.max_scale()).next()
g = g.sub_tree(microroot,True)
g, props = colored_tree(g,colors={1:list(g.vertices(scale=g.max_scale()))})
#f = file('debug.txt','w')
#f.write(str(g))
#f.close()
return g
[docs]def read_mtg(fn = 'walnut.mtg' ,drf = 'walnut.drf'):
fileName = ('/').join(os.path.abspath(__file__).split('/')[:-1])
fn = str(fileName)+"/"+fn
drf = str(fileName)+"/"+drf
g = read_mtg_file(fn)
topdia = lambda x: g.property('TopDia').get(x)
dressing_data = dresser.dressing_data_from_file(drf)
pf = plantframe.PlantFrame(g, TopDiameter=topdia,
DressingData = dressing_data)
pf.propagate_constraints()
diameters = pf.algo_diameter()
toppositions = pf.points
g.properties()['TopDiameter']=diameters
g.properties()['TopPosition']= dict([ (k,Vector3(v)) for k,v in toppositions.iteritems()])
g = flatten(g)
return g
[docs]def color_last_year_node(g):
def year_ancestors(i):
ancestors = [i]
assert g.label(i)[0] == 'U'
while g.label(g.parent(i))[0] == 'U' :
i = g.parent(i)
ancestors.append(i)
return ancestors
leaves = [vtx for vtx in g.vertices(scale=1) if g.nb_children(vtx) == 0 and g.label(vtx)[0] == 'U']
gu = [year_ancestors(leaf) for leaf in leaves]
toppos = g.property('TopPosition')
def nodepos(i):
try:
return toppos[i]
except:
return toppos[g.parent(i)]
def nodelength(i):
try:
return norm(toppos[i]-nodepos(g.parent(i)))
except:
return 0
gul = [sum([nodelength(i) for i in ui]) for ui in gu]
avg_length_gu = mean(gul)
#print '**', avg_length_gu, min(gul), max(gul)
leavesly = [g.parent(i[-1]) for i in gu]
def last_year_ancestors(i):
ancestors = [i]
l = 0
p = nodepos(i)
while l < avg_length_gu:
i = g.parent(i)
if i:
ancestors.append(i)
try:
np = toppos[i]
l += norm(p-np)
p = np
except:
pass
else:
break
return ancestors
lygus = [last_year_ancestors(i) for i in leavesly]
labels = g.property('label')
for lygu in reversed(lygus):
for i in lygu:
if len([j for j in g.children(i) if labels[j][0] in 'S']) == 0:
assert labels[i][0] in 'SV'
labels[i] = 'V'+labels[i][1:]
[docs]def construct_lstring(g):
idp = dict([(i,i) for i in g.property('TopPosition').iterkeys()])
g.properties()['mtgid'] = idp
paramnames = ['TopPosition','TopDiameter']
params = { 'S': paramnames+['mtgid'], 'U' : paramnames, 'V' : paramnames }
lstring = mtg2axialtree(g, params)
return lstring
[docs]def construct_walnut_lstring():
g = read_mtg()
color_last_year_node(g)
return construct_lstring(g)
if __name__ == '__m_ain__':
g = read_mtg()
color_last_year_node(g)
lstring = construct_lstring(g)
# print len(lstring)
# print len([0 for i in lstring if not i.name in '[]'])
# print lstring[0:10]
# print lstring[5]
# print len(lstring[5])