Home My Page Projects OpenAlea
Summary Activity Forums Tracker Lists Tasks Docs News SCM Files

Forum: lpy

Monitor Forum | Start New Thread Start New Thread
RE: Combine Lpy and MTG [ Reply ]
By: Frederic Boudon on 2012-10-02 12:14
[forum:110090]
Indeed, you do not have access to a position since the shape can be a complex object (and thus several position are used).

A pure lsystem approach would used ?P that query the current position of the turtle and the consider statement that make it possible to skip
module of the string.

Axiom: Pointe ?P
consider: Pointe
production:
Site ?P(possite) > Pointe ?P(posp) :
if norm(possite-posp) > DISTANCE:
produce [Segment Site ?P Segment Pointe ?P ]

The only pb is that in your version of lpy, 'consider' is global to the entire lsystem and thus all contexts of all rules consider only the same set of modules (here Pointe). This will be changed in a very close future.

If you just use the F command to draw your segments, the shapes of the plantgl scene would be of the form
t = Shape(Translated(t,Oriented(i,j,Cylinder(r,l))),Material())
Thus code like this would retrieve the position

def retrieve_length_position(sh):
t = sh.geometry
try:
position = t.translation # if sh is at (0,0,0), there is no translation
t = t.geometry
except:
position = (0,0,0)
while not isinstance(t,Cylinder): t = t.geometry
length = t.height
return position, length

allinfos = dict([(sh.id, retrieve_length_position(sh)) for sh in lscene])

You can also use BoundingBox to have an idea of the location and size of your object in case of complex geometry.
bbx = BoundingBox(sh)
position = bbx.getCenter()
length = norm(bbx.getSize())


RE: Combine Lpy and MTG [ Reply ]
By: Vincent Migault on 2012-09-27 13:16
[forum:110073]
Dans mon modèle Lpy, lors de la croissance des racines, des sites sont créés. De ces sites vont apparaitre les racines latérales.
Une racine latérale apparait lorsque le site est éloigné d'une certaine distance de la pointe. En utilisant Lpy, il est difficile de faire un lien entre l’ensemble d’un axe et sa pointe afin de déterminé lesquels se déclenche. J’ai essayé de le réaliser en utilisant le « successeur » (Pointe<Site) mais la pointe est trop éloigné des sites. Le formalisme MTG permet de retrouver très rapidement l’ensemble des sites d’un même axe racinaire ainsi que la pointe associée. Cependant j’ai des difficultés pour calculé les distances entre ces sites et la pointe.
J'aurai donc besoin de la somme des longueurs des segments racinaire entre les sites et la pointe de l’axe.
En utilisant la commande mtg.property('geometry')[vtx], j’obtient un objet Shape [<openalea.plantgl.scenegraph._pglsg.Shape object at 0x0A80C998>] que j’arrive à affiché graphiquement dans le viewer PlantGL. Cependant, je n’arrive pas à obtenir les informations sur l’objet telles que la longueur ou les coordonnées du vertex.
Comment faire pour obtenir les informations ?

RE: Combine Lpy and MTG [ Reply ]
By: Frederic Boudon on 2012-09-26 13:22
[forum:110071]
Le concurrent access error vient du fait que tu essaye de faire tourner le lsystem a l’intérieur de lui même.
Pour éviter cela, il faut passer la lscene aussi au lpy2mtg

generate_mtg = True

def EndEach(lstring,lscene):
if generate_mtg:
mtg = lpy2mtg(lstring,__lsystem__,lscene)

Pour être sur que la lscene soit générée tu peux utiliser la commande frameDisplay (qui dit a lpy de calculer la lscene. ne pas modifier tout de même si tu n'as pas besoin de la scene, ca évite des calculs)

def StartEach():
if generate_mtg:
frameDisplay(True)


Si la commande lpy2mtg ne marche pas mieux (il y avait des bugs dans des anciennes versions),
alors tu peux utiliser la commande plus bas niveau axialtree2mtg
Dans ce cas, il faut remplir de la manière suivante:

def EndEach(lstring,lscene):
if generate_mtg:
modules = ['A', 'B', ...]
scales = {'A' : 1, 'B' : 1, ...} # to define the scale of your modules
parameters = { 'A' : ['length', 'radius'], ... } # to define the parameters of your modules
mtg = axialtree2mtg(lstring, scales, parameters, lscene)

Pour récupérer la géométrie des nœuds, tu peux utiliser la propriété geometry
geometrydict = mtg.property('geometry')

Combine Lpy and MTG [ Reply ]
By: Vincent Migault on 2012-09-25 09:47
[forum:110063]
Dear all,

I try to model the development of the root system using L-py.
I think that the MTG method can simplify the model but I have some difficulties to combine both L-py and MTG. In the command EndEach, the model translates the lstring on mtg (using the function lpy2mtg) which is saved in a global variable. Then, during the production of L-py, I want to use information about the mtg. However I have two problems :

1) Sometimes, the software prints the error message when it translate lstring to mtg:
ValueError: Concurrent Access of the Lsystem
<type 'exceptions.ValueError'> Concurrent Access of the Lsystem

2) When there is no error message, I want to use the distance between two vertices. However, I don’t find the command to obtain the geometry of vertices in a mtg.

Thank you for your help
Vincent