]> Pileus Git - ~andy/cs275-proj/blob - src/plant.lpy
Add PlantGL test code
[~andy/cs275-proj] / src / plant.lpy
1 from openalea.plantgl.all import *\r
2 from math import * \r
3 from random import *\r
4 \r
5 # Control of the surface details\r
6 sepal_nb_segment = 10\r
7 petal_nb_segment = 20\r
8 stamen_nb_segment = 20\r
9 carpel_nb_segment = 20\r
10 leaf_nb_segment = 20\r
11 \r
12 # General variables\r
13 \r
14 leaf_color = 5\r
15 phylangle = 137.5\r
16 Rmax = 10      # Maximum number of leaves before making a flower\r
17 indiam = 0.04  # Final internode diameter in cm\r
18 inlen = 1.    # Final size of an internode length in cm\r
19 \r
20 receptacleHeight = 0.3 # scaling factor in cm: \r
21                    # defines the height of the flower receptacle\r
22                    # from its basis to the top\r
23 receptacleWidth = 0.3  # scaling factor in cm:\r
24 Ssize = 2.  # scaling factor for the flower organs\r
25 \r
26 \r
27 T = 5.      # time for an apex to produce an internode\r
28 T_IN = 5.   # time for internode growth\r
29 T_F = 2.    # time to produce a flower internode\r
30 dt = 1.     # time resolution (eg. = 1 day)\r
31 eps = 0.0001   # time accuracy (time under eps is considered to be 0)\r
32 \r
33 # values of parameter thresholds that define the flower zones \r
34 # on the flower receptacle \r
35 pth=[0.0,.3,.8,.95,1.0] \r
36 nbwhorls = [1,1,1,1] # nb of whorls in each flower zone\r
37 dp = 0.01 # subdivision unit of the intervalle [0,1] for parameter p\r
38 \r
39 \r
40 # parameters for random noise\r
41 seed(0)\r
42 insert_sepal_mu = 0.    # mean variation of the sepal insertion angle in degrees\r
43 insert_sepal_sigma = 5. # std deviation\r
44 insert_petal_mu = 0. \r
45 insert_petal_sigma = 5. \r
46 \r
47 # Some quantities used for the ABC diagram\r
48 step=.1\r
49 diagrWidth= .1 # size param. for the ABC diagram\r
50 diagrLen=1.\r
51 \r
52 \r
53 # p is assumed to be comprised between 0 and 1\r
54 # dp is assumed to be constant increment between 0 and 1\r
55 # the normal is assumed to be orthogonal to p-dp,p+dp\r
56 def computeNormal(curve,p,dp):\r
57   if p-dp < 0:\r
58     p2 = p+dp\r
59     y2 = curve(p2)\r
60     y = curve(p)\r
61     tanalpha = (y2-y)/(p2-p)\r
62   elif p+dp > 1:\r
63     p1 = p-dp\r
64     y1 = curve(p1)\r
65     y = curve(p)\r
66     tanalpha = (y-y1)/(p-p1)\r
67   else:\r
68     p1 = p-dp\r
69     p2 = p+dp\r
70     y1 = curve(p1)\r
71     y2 = curve(p2)\r
72     tanalpha = (y2-y1)/(p2-p1)\r
73   alpha = degrees(atan(tanalpha)) # tangent angle wrt p axis\r
74   normal = alpha+90 # the reference line for this angle is the horizontal line\r
75   return normal\r
76 \r
77 def petal_scaled_section(p):\r
78   return petal_section(p)*10.0\r
79   \r
80 \r
81 # Conventional colors\r
82 ABCcolors= {'A': 9, 'B': 10,'C': 8, 'AB': 13, 'AC': 11, 'BC': 12, 'O': 2}\r
83 # A conversion function\r
84 def whorl2organ(whorlnumber):\r
85   if whorlnumber == 0 :\r
86     if GA: orgtype='A'\r
87     elif GC: orgtype='C'\r
88     else: orgtype='O'\r
89   elif whorlnumber == 1 :\r
90     if GA: \r
91       if GB:\r
92         orgtype='AB'\r
93       else:\r
94         orgtype='A'\r
95     elif GC:\r
96       if GB:\r
97         orgtype='BC'\r
98       else:\r
99         orgtype='C'\r
100     else: \r
101       orgtype='O'\r
102   elif whorlnumber ==2 :\r
103     if GB and GC: orgtype='BC'\r
104     elif GA and GB and (1-GC): orgtype='AB'\r
105     elif GC and (1-GB): orgtype='C'\r
106     elif GA and (1-GB) and (1-GC): orgtype='A'\r
107     else: orgtype='O'\r
108   elif whorlnumber == 3:\r
109     if GC: orgtype='C'\r
110     elif GA: orgtype='A'\r
111     else: orgtype='O'\r
112   \r
113   return orgtype\r
114 # Depending on genetic background, actual "colors", i.e. organ types\r
115 whorlcolors = [ABCcolors[i] for i in map(whorl2organ,range(4)) ]\r
116 \r
117 marker=0\r
118 deg2rad = 2*3.141592654/360\r
119 \r
120 \r
121 NB_steps = 250\r
122 \r
123 \r
124 def Start():\r
125     seed(0)\r
126 \r
127 module A, AL, I, I2, FA, FI\r
128 module Sepal, Petal, Stamen, Carpel, Leaf, LeafLet\r
129 module OrgV1, OrgV2, OrgV3, OrgV4\r
130 module diagr, Annulus\r
131 \r
132 ##################### AXIOM ###############################################\r
133 Axiom: SectionResolution(50) maybe_diagr \r
134 \r
135 derivation length: 250\r
136 production:\r
137 \r
138 # ABC diagram displayed above the flower\r
139 maybe_diagr:\r
140   if REPONSE:\r
141     produce f(5) diagr(0)\r
142   else : produce [SetGuide(AxisShape, Rmax*inlen)A(0,T)]\r
143 \r
144 \r
145 ## Diagrams \r
146 diagr(t):\r
147   global marker\r
148   if t > 4:\r
149     produce @M(0,0,0)[SetGuide(AxisShape, Rmax*inlen)A(0,T)]\r
150   elif t<=1:\r
151     produce [&(90)f(.001)^(90);(0)@o(diagrLen)];(whorlcolors[0])[@o(t*diagrLen)]diagr(t+step/4.)\r
152   elif t<=2:\r
153     nproduce ;(whorlcolors[3])[^(90)f(.002)&(90)@o((t-1.)*diagrLen/2.)]diagr(t+step/4.)\r
154   elif t<=4 and GB:\r
155     nproduce [^(90)f(.1)&(90) ;(14) Annulus(30,(t/2.-1.)*diagrLen/2.+diagrLen/4.,((t-step/2.)/2.-1.)*diagrLen/2.+diagrLen/4.)]f(.0001)diagr(t+step/4.)\r
156 \r
157 \r
158 Annulus(N,Radius,radius):\r
159   alp = 360./N\r
160   prop = radius/Radius\r
161   nproduce _(.01)f(radius)+(90-alp/2.) \r
162   for i in xrange(N):\r
163     nproduce +(alp)[{F(Radius*(alp*deg2rad))+(90.+alp/2.)F(Radius*(1.-prop))+(90-alp/2.)F(Radius*(alp*deg2rad)*prop+.001)+(90.-alp/2.)F(Radius*(1.-prop))}]f(Radius*(alp*deg2rad))\r
164 \r
165 \r
166 \r
167 # creates the main stem (leaves + flower)\r
168 A(r,t):  \r
169   # r = rank, t = time left before producing a new internode\r
170   # produces a flower apex in state 1 initially\r
171   if r ==  Rmax or not(stemflag): produce I(0)FA(T_F) \r
172   elif t < eps : produce I(0)[EndGuide()/(phylangle*r)AL(0)]A(r+1,T)\r
173   else: produce A(r,t-dt)\r
174 \r
175 # internode\r
176 I(t):\r
177   produce I(t+dt)\r
178 \r
179 # axillary leaf\r
180 AL(t):\r
181   produce AL(t+dt)\r
182 \r
183 FI(state,len,width,t):\r
184   produce FI(state,len,width,t+dt)\r
185 \r
186 \r
187 decomposition:\r
188 maximum depth: 1\r
189 \r
190 # floral apex = Receptacle internodes + lateral organs. \r
191 # p corresponds to relative height in the receptacle (flower profile): \r
192 # (p ranges from 0 to 1)\r
193 # State corresponds to zone (1=sepal,2=petal,3=stamen,4=carpel)\r
194 \r
195 FA(t): \r
196   p=0\r
197   for s in xrange(4): # loop on the states (=zones)\r
198     zone_size = pth[s+1]-pth[s] # height of the current zone\r
199     len = zone_size/nbwhorls[s] # length of an internode in this zone\r
200     for i in xrange(nbwhorls[s]):\r
201       p=p+len\r
202       w = receptacleProfile(p) # normalized width\r
203       len2 = len * receptacleHeight # scaling length\r
204       w2 = w * receptacleWidth  # and width\r
205       beta = computeNormal(receptacleProfile,p,dp)\r
206       #print "beta = ", beta\r
207       # FI is a receptacle internode\r
208       nproduce FI(s,len2,w2,0)[SetGuide()\r
209       if s == 0 and verticille_1 : # sepal only\r
210         for j in xrange(nb_sepal): \r
211           if noise : ran_insert = insert_sepal_mu + random()*insert_sepal_sigma # gauss(insert_sepal_mu,insert_sepal_sigma)\r
212           else: ran_insert = 0.\r
213           nproduce /(360/nb_sepal) [ ^(-90) f(w2) ^(90) ^(-beta+opening(p)*360+ran_insert) OrgV1] \r
214       if s == 1 and verticille_2: # petals only\r
215         for j in xrange(nb_petal): \r
216           if noise : ran_insert = insert_petal_mu + random()*insert_petal_sigma #gauss(insert_petal_mu,insert_petal_sigma)\r
217           else: ran_insert = 0.\r
218           nproduce /(360/nb_petal) [ ^(-90) f(w2) ^(90) ^(-beta+opening(p)*360+ran_insert) OrgV2] \r
219       if s == 2 and verticille_3: # stamen only\r
220         for j in xrange(nb_stamen): \r
221           nproduce /(360/nb_stamen) [ ^(-90) f(w2) ^(90) ^(-beta+opening(p)*360) OrgV3] \r
222       if s == 3 and verticille_4: # carpel only\r
223         for j in xrange(nb_carpel): \r
224           # print "j = ",j,"beta = ", beta, "p = ", p,"opening = ", opening(p)\r
225           nproduce /(360/nb_carpel) [ ^(-90) f(w2) ^(90) ^(beta-opening(p)*360) OrgV4]       \r
226       nproduce ] \r
227       if s == 0 and nb_sepal == 1 : nproduce /(phylangle)\r
228       elif s == 1 and nb_petal == 1 : nproduce /(phylangle)\r
229       elif s == 2 and nb_stamen == 1 : nproduce /(phylangle)\r
230       elif s == 3 and nb_carpel == 1 : nproduce /(phylangle)\r
231       # if a whorl (> 1 organ) shift by Pi/(2*N)\r
232       elif s == 0 : nproduce /(180/nb_sepal) \r
233       elif s == 1 : nproduce /(180/nb_petal) \r
234       elif s == 2 : nproduce /(180/nb_stamen) \r
235       elif s == 3 : nproduce /(180/nb_carpel) \r
236 \r
237 \r
238 interpretation:\r
239 maximum depth: 10\r
240 \r
241 # Internodes\r
242 I(t):\r
243   if t <= T_IN: \r
244     percent_growth = t/T_IN\r
245     if percent_growth != 0.0:\r
246       produce _(indiam*percent_growth);(leaf_color)F(inlen*percent_growth)\r
247   else:\r
248     tt = 1.*(NB_steps-t)/NB_steps\r
249     produce _(indiam);(leaf_color)F(inlen*internodelen(tt))\r
250 \r
251 AL(t):\r
252   nproduce SetGuide()\r
253   if t <= T_IN: \r
254     percent_growth = t/T_IN\r
255     if percent_growth != 0.0:\r
256       produce ;(leaf_color)-(90)f(indiam*percent_growth)+(90)/(-90)^(-60) Leaf\r
257   else: produce ;(leaf_color)-(90)f(indiam)+(90)/(-90)^(-60)Leaf\r
258 \r
259 # Internodes composing the receptacle\r
260 FI(state,len,width,t):\r
261   if show_ABC_colors:\r
262     orgtype = whorl2organ(state)\r
263     colo=ABCcolors[orgtype]\r
264   else :\r
265     colo = 2\r
266   produce ;(colo)F(len,width)\r
267 \r
268 # Organ definitions\r
269 Sepal:\r
270   if sepalflag: \r
271     produce ;(2) ParametricSurface(sepal_nerve,sepal_section,sepal_width,sepal_length/10.,sepal_nb_segment,Ssize)\r
272   \r
273 Petal:\r
274   if petalflag: \r
275     produce ,(3) ParametricSurface(petal_nerve,petal_section,petal_width,petal_length/10.,petal_nb_segment,Ssize)\r
276     \r
277 Stamen:\r
278   if stamenflag: \r
279     produce ;(4) ParametricSurface(stamen_nerve,None,stamen_width,stamen_length/10.,stamen_nb_segment,Ssize)\r
280     \r
281 Carpel:\r
282   if carpelflag: \r
283     nproduce ;(5) ParametricSurface(carpel_nerve,None,carpel_width,carpel_length/10.,carpel_nb_segment,Ssize)\r
284     for i in xrange(10): nproduce _(.001)[\(90)f(.01)]\r
285 \r
286 \r
287 OrgV1 :\r
288   if GA: produce Sepal\r
289   elif GC: produce Carpel\r
290   else: produce None\r
291 OrgV2 :\r
292   if GA: \r
293     if GB:\r
294       produce Petal\r
295     else:\r
296       produce Sepal\r
297   elif GC:\r
298     if GB:\r
299       produce Stamen\r
300     else:\r
301       produce Carpel\r
302   else: produce None\r
303 OrgV3 :\r
304   if GB and GC: produce Stamen\r
305   elif GA and GB and (1-GC): produce f(.5)Petal\r
306   elif GC and (1-GB): produce Carpel\r
307   elif GA and (1-GB) and (1-GC): produce Sepal\r
308   else: produce None\r
309 OrgV4 :\r
310   if GC: produce Carpel\r
311   elif GA: produce Sepal\r
312   else: produce None\r
313 \r
314 \r
315 Leaf:\r
316   if leafflag: \r
317     produce F(0.3,0.02)LeafLet\r
318     #produce F(0.3,0.02)[+(90)LeafLet][-(90)LeafLet]F(0.3,0.02)[+(90)LeafLet][-(90)LeafLet]F(0.3,0.02)LeafLet\r
319     \r
320 LeafLet --> ParametricSurface(leaf_nerve,leaf_section,leaf_width,leaf_length/10.,leaf_nb_segment,Ssize)\r
321 \r
322 ParametricSurface(axis,section,width,length,nb_segment,size):\r
323    dx = 1. / nb_segment\r
324    x = 0\r
325    nproduce [SetGuide(axis,length*size)  \r
326    if not section is None: nproduce SetContour(section) \r
327    nproduce _(width(0)) StartGC()\r
328    for i in xrange(nb_segment):\r
329      x = i*dx\r
330      nproduce F(size*dx*length,size*width(x+dx))\r
331    nproduce EndGC()]\r
332 \r
333 \r
334 endlsystem\r
335 ###### INITIALISATION ######\r
336 \r
337 __lpy_code_version__ = 1.1\r
338 \r
339 def __initialiseContext__(context):\r
340         import openalea.plantgl.all as pgl\r
341         Color_1 = pgl.Material("Color_1" ,              ambient = (28,19,6) , \r
342                 diffuse = 5.57143 , \r
343                 specular = (50,50,50) , \r
344                 emission = (9,9,9) , \r
345 )\r
346         Color_1.name = "Color_1"\r
347         context.turtle.setMaterial(1,Color_1)\r
348         Color_2 = pgl.Material("Color_2" ,              ambient = (18,37,5) , \r
349                 diffuse = 2.35135 , \r
350 )\r
351         Color_2.name = "Color_2"\r
352         context.turtle.setMaterial(2,Color_2)\r
353         Color_3 = pgl.Material("Color_3" ,              ambient = (105,105,105) , \r
354                 diffuse = 2.42857 , \r
355                 specular = (42,42,42) , \r
356 )\r
357         Color_3.name = "Color_3"\r
358         context.turtle.setMaterial(3,Color_3)\r
359         Color_4 = pgl.Material("Color_4" ,              ambient = (84,56,0) , \r
360                 diffuse = 2.44048 , \r
361                 specular = (32,32,32) , \r
362                 emission = (26,26,26) , \r
363 )\r
364         Color_4.name = "Color_4"\r
365         context.turtle.setMaterial(4,Color_4)\r
366         Color_5 = pgl.Material("Color_5" ,              ambient = (6,61,12) , \r
367                 diffuse = 0.885246 , \r
368                 specular = (124,124,124) , \r
369 )\r
370         Color_5.name = "Color_5"\r
371         context.turtle.setMaterial(5,Color_5)\r
372         Color_6 = pgl.Material("Color_6" ,              ambient = (41,0,0) , \r
373                 diffuse = 2.36585 , \r
374                 specular = (92,8,8) , \r
375                 emission = (45,0,0) , \r
376 )\r
377         Color_6.name = "Color_6"\r
378         context.turtle.setMaterial(6,Color_6)\r
379         Color_8 = pgl.Material("Color_8" ,              ambient = (254,0,0) , \r
380                 diffuse = 0.629921 , \r
381                 specular = (255,0,0) , \r
382                 emission = (255,0,0) , \r
383 )\r
384         Color_8.name = "Color_8"\r
385         context.turtle.setMaterial(8,Color_8)\r
386         Color_9 = pgl.Material("Color_9" ,              ambient = (255,255,0) , \r
387                 diffuse = 0.45098 , \r
388                 specular = (104,104,104) , \r
389                 emission = (255,255,0) , \r
390 )\r
391         Color_9.name = "Color_9"\r
392         context.turtle.setMaterial(9,Color_9)\r
393         Color_10 = pgl.Material("Color_10" ,            ambient = (0,0,255) , \r
394                 diffuse = 0.627451 , \r
395 )\r
396         Color_10.name = "Color_10"\r
397         context.turtle.setMaterial(10,Color_10)\r
398         Color_11 = pgl.Material("Color_11" ,            ambient = (255,185,7) , \r
399                 diffuse = 0 , \r
400                 specular = (0,0,0) , \r
401                 emission = (255,3,3) , \r
402 )\r
403         Color_11.name = "Color_11"\r
404         context.turtle.setMaterial(11,Color_11)\r
405         Color_12 = pgl.Material("Color_12" ,            ambient = (255,0,255) , \r
406                 diffuse = 0 , \r
407                 specular = (0,0,0) , \r
408 )\r
409         Color_12.name = "Color_12"\r
410         context.turtle.setMaterial(12,Color_12)\r
411         Color_13 = pgl.Material("Color_13" ,            ambient = (0,218,0) , \r
412                 diffuse = 0 , \r
413                 specular = (0,0,0) , \r
414 )\r
415         Color_13.name = "Color_13"\r
416         context.turtle.setMaterial(13,Color_13)\r
417         Color_14 = pgl.Material("Color_14" ,            ambient = (0,0,255) , \r
418                 diffuse = 0 , \r
419                 specular = (0,0,0) , \r
420                 transparency = 0.59 , \r
421 )\r
422         Color_14.name = "Color_14"\r
423         context.turtle.setMaterial(14,Color_14)\r
424         Color_15 = pgl.Material("Color_15" ,            ambient = (0,0,255) , \r
425                 diffuse = 0 , \r
426                 specular = (0,0,0) , \r
427                 emission = (0,0,255) , \r
428                 transparency = 0.57 , \r
429 )\r
430         Color_15.name = "Color_15"\r
431         context.turtle.setMaterial(15,Color_15)\r
432         context.options.setSelection('Warning with Turtle inconsistency',0)\r
433         scalars = [('nb_sepal', 4, 1, 20), ('nb_petal', 4, 1, 20), ('nb_stamen', 5, 1, 30), ('sepal_length', 5, 1, 30), ('petal_length', 7, 1, 30), ('stamen_length', 4, 1, 30), ('carpel_length', 4, 1, 30), ('leaf_length', 6, 1, 100), ('sepalflag', True, False, True), ('petalflag', True, False, True), ('stamenflag', True, False, True), ('carpelflag', True, False, True), ('leafflag', True, False, True), ('noise', True, False, True), ('nb_carpel', 1, 0, 100), ('GA', True, False, True), ('GB', True, False, True), ('GC', True, False, True), ('verticille_1', True, False, True), ('verticille_2', True, False, True), ('verticille_3', True, False, True), ('verticille_4', True, False, True), ('stemflag', True, False, True), ('REPONSE', False, False, True), ('show_ABC_colors', False, False, True)]\r
434         context["__scalars__"] = scalars\r
435         for n,v,mnv,mxv in scalars:\r
436                 context[n] = v\r
437         import openalea.plantgl.all as pgl\r
438         sepal_width = pgl.NurbsCurve2D( \r
439             ctrlPointList = pgl.Point3Array([(0, 0.0342648, 1),(0.0549666, 0.231318, 1),(0.510107, 0.163966, 1),(0.917895, 0.180944, 1),(1, 0.0268255, 1)]) , \r
440             )\r
441         sepal_width.name = "sepal_width"\r
442         petal_width = pgl.NurbsCurve2D( \r
443             ctrlPointList = pgl.Point3Array([(0, 0.0865445, 1),(0.231908, 0.208539, 1),(0.473697, 0.283924, 1),(0.709594, 0.349294, 1),(0.921729, 0.32141, 1),(1, 0.0588625, 1),(1, 0.0249496, 1)]) , \r
444             )\r
445         petal_width.name = "petal_width"\r
446         carpel_width = pgl.NurbsCurve2D(        \r
447             ctrlPointList = pgl.Point3Array([(0, 0.0148928, 1),(0.314935, 0.0195945, 1),(0.5573, 0.016741, 1),(0.738597, 0.0186869, 1),(0.864667, 0.00214352, 1),(1, 0.0150678, 1)]) , \r
448             )\r
449         carpel_width.name = "carpel_width"\r
450         stamen_width = pgl.NurbsCurve2D(        \r
451             ctrlPointList = pgl.Point3Array([(0, 0.00326303, 1),(0.353705, 0.00323103, 1),(0.675292, 0.00559957, 1),(0.76987, 0.00208676, 1),(0.803953, 0.0145622, 1),(0.995983, 0.0120889, 1),(1, 0.00026951, 1)]) , \r
452             )\r
453         stamen_width.name = "stamen_width"\r
454         receptacleProfile = pgl.NurbsCurve2D(   \r
455             ctrlPointList = pgl.Point3Array([(0, 0.0118772, 1),(0.0483995, 0.147983, 1),(0.163483, 0.334726, 1),(0.310778, 0.395063, 1),(0.609005, 0.399069, 1),(0.810031, 0.34849, 1),(1, 0.111638, 1),(1, 0.0125388, 1)]) , \r
456             )\r
457         receptacleProfile.name = "receptacleProfile"\r
458         leaf_width = pgl.NurbsCurve2D(  \r
459             ctrlPointList = pgl.Point3Array([(0, 0.0557769, 1),(0.165729, 0.301414, 1),(0.53533, 0.298777, 1),(0.805128, 0.302951, 1),(1, 0.0358566, 1)]) , \r
460             )\r
461         leaf_width.name = "leaf_width"\r
462         opening = pgl.NurbsCurve2D(     \r
463             ctrlPointList = pgl.Point3Array([(0, 0.0109171, 1),(0.0777129, 0.420641, 1),(0.245081, 0.208734, 1),(0.417176, 0.202829, 1),(0.624831, 0.101988, 1),(0.823187, 0.0238984, 1),(0.929457, 0.0296022, 1),(1, 0.0281283, 1)]) , \r
464             )\r
465         opening.name = "opening"\r
466         internodelen = pgl.NurbsCurve2D(        \r
467             ctrlPointList = pgl.Point3Array([(0, 0.00938666, 1),(0.166719, 0.00561404, 1),(0.166719, 0.0116702, 1),(0.189386, 0.0576949, 1),(0.195085, 1.00485, 1),(0.199993, 0.988534, 1),(0.800502, 0.989881, 1),(1, 0.989703, 1)]) , \r
468             )\r
469         internodelen.name = "internodelen"\r
470         panel_0 = ({'active': True, 'visible': True, 'name': 'Functions'},[('Function',sepal_width),('Function',petal_width),('Function',carpel_width),('Function',stamen_width),('Function',receptacleProfile),('Function',leaf_width),('Function',opening),('Function',internodelen)])\r
471         import openalea.plantgl.all as pgl\r
472         sepal_nerve = pgl.NurbsCurve2D( \r
473             ctrlPointList = pgl.Point3Array([(0.00267378, 0.0913267, 1),(0.0350336, 0.00690934, 1),(0.152417, 0.000153156, 1),(0.995128, -0.000720531, 1),(1.00415, 0.0994233, 1)]) , \r
474             )\r
475         sepal_nerve.name = "sepal_nerve"\r
476         sepal_section = pgl.NurbsCurve2D(       \r
477             ctrlPointList = pgl.Point3Array([(-0.582092, 0.169143, 1),(-0.501529, 0.0149526, 1),(-0.164558, 0.00217632, 1),(0.19334, -0.00491485, 1),(0.55411, 0.00959401, 1),(0.593674, 0.167853, 1)]) , \r
478             )\r
479         sepal_section.name = "sepal_section"\r
480         petal_section = pgl.NurbsCurve2D(       \r
481             ctrlPointList = pgl.Point3Array([(-0.41272, 0.0925189, 1),(-0.207731, -0.00665554, 1),(0.171749, -0.00758484, 1),(0.369546, 0.0855328, 1)]) , \r
482             )\r
483         petal_section.name = "petal_section"\r
484         petal_nerve = pgl.NurbsCurve2D( \r
485             ctrlPointList = pgl.Point3Array([(-0.000642917, 0.000642897, 1),(0.182381, -0.00558217, 1),(0.379294, 0.0534718, 1),(0.582615, 0.204976, 1),(0.820263, 0.0804393, 1),(0.992836, 0.0312321, 1)]) , \r
486             )\r
487         petal_nerve.name = "petal_nerve"\r
488         stamen_nerve = pgl.NurbsCurve2D(        \r
489             ctrlPointList = pgl.Point3Array([(0.00267378, -0.0026738, 1),(0.133094, 0.0109457, 1),(0.259897, 0.0179014, 1),(0.332213, 0.0409697, 1),(0.399848, 0.0745133, 1)]) , \r
490             )\r
491         stamen_nerve.name = "stamen_nerve"\r
492         carpel_nerve = pgl.NurbsCurve2D(        \r
493             ctrlPointList = pgl.Point3Array([(0.00267378, -0.0026738, 1),(0.0490853, 0.00302744, 1),(0.130466, 0.00251888, 1),(0.677461, 0.0196475, 1),(1.00546, 0.0234969, 1)]) , \r
494             )\r
495         carpel_nerve.name = "carpel_nerve"\r
496         leaf_section = pgl.NurbsCurve2D(        \r
497             ctrlPointList = pgl.Point3Array([(-0.354412, 0.0971154, 1),(-0.13766, -0.0598824, 1),(0.129801, -0.0536486, 1),(0.370212, 0.0925605, 1)]) , \r
498             )\r
499         leaf_section.name = "leaf_section"\r
500         leaf_nerve = pgl.NurbsCurve2D(  \r
501             ctrlPointList = pgl.Point3Array([(0.00267378, -0.0026738, 1),(0.132394, 0.01432, 1),(0.2452, 0.0352875, 1),(0.397249, 0.00479208, 1),(0.500326, -0.0518791, 1)]) , \r
502             )\r
503         leaf_nerve.name = "leaf_nerve"\r
504         AxisShape = pgl.NurbsCurve2D(   \r
505             ctrlPointList = pgl.Point3Array([(-0.489325, 0.0330066, 1),(-0.25937, 0.0839531, 1),(0.104972, 0.0174484, 1),(0.409996, 0.0255427, 1)]) , \r
506             )\r
507         AxisShape.name = "AxisShape"\r
508         panel_1 = ({'active': True, 'visible': True, 'name': 'Curve2D'},[('Curve2D',sepal_nerve),('Curve2D',sepal_section),('Curve2D',petal_section),('Curve2D',petal_nerve),('Curve2D',stamen_nerve),('Curve2D',carpel_nerve),('Curve2D',leaf_section),('Curve2D',leaf_nerve),('Curve2D',AxisShape)])\r
509         parameterset = [panel_0,panel_1,]\r
510         context["__functions__"] = [('sepal_width',sepal_width),('petal_width',petal_width),('carpel_width',carpel_width),('stamen_width',stamen_width),('receptacleProfile',receptacleProfile),('leaf_width',leaf_width),('opening',opening),('internodelen',internodelen),]\r
511         context["__curves__"] = [('sepal_nerve',sepal_nerve),('sepal_section',sepal_section),('petal_section',petal_section),('petal_nerve',petal_nerve),('stamen_nerve',stamen_nerve),('carpel_nerve',carpel_nerve),('leaf_section',leaf_section),('leaf_nerve',leaf_nerve),('AxisShape',AxisShape),]\r
512         context["__parameterset__"] = parameterset\r
513         context["sepal_width"] = pgl.QuantisedFunction(sepal_width)\r
514         context["petal_width"] = pgl.QuantisedFunction(petal_width)\r
515         context["carpel_width"] = pgl.QuantisedFunction(carpel_width)\r
516         context["stamen_width"] = pgl.QuantisedFunction(stamen_width)\r
517         context["receptacleProfile"] = pgl.QuantisedFunction(receptacleProfile)\r
518         context["leaf_width"] = pgl.QuantisedFunction(leaf_width)\r
519         context["opening"] = pgl.QuantisedFunction(opening)\r
520         context["internodelen"] = pgl.QuantisedFunction(internodelen)\r
521         context["sepal_nerve"] = sepal_nerve\r
522         context["sepal_section"] = sepal_section\r
523         context["petal_section"] = petal_section\r
524         context["petal_nerve"] = petal_nerve\r
525         context["stamen_nerve"] = stamen_nerve\r
526         context["carpel_nerve"] = carpel_nerve\r
527         context["leaf_section"] = leaf_section\r
528         context["leaf_nerve"] = leaf_nerve\r
529         context["AxisShape"] = AxisShape\r
530 __copyright__ = 'Virtual Plants Team'\r
531 __institutes__ = 'INRIA'\r
532 __authors__ = 'C. Godin\nF. Boudon'\r