Esempio n. 1
0
    def plot(self):

        g = self.g
        frames = self.frame
        edge_type = g.property('edge_type')

        p = PglTurtle()
        # p.startGC()

        root = g.roots_iter(scale=2).next()

        min_length = min([
            f.length for f in frames.itervalues() if f.length and f.length > 0
        ])
        for vid in pre_order_turtle(g, root, p):
            down = frames[vid].down
            down = 0 if down is None else down
            l = max(frames[vid].length, min_length)

            if edge_type.get(vid) == '+':
                # 1. phi /
                # 2. insertion angle (+, -)
                # 3. F
                pid = g.parent(vid)
                radius = frames[vid].radius
                phi = frames[pid].rotate
                phi = 0 if phi is None else phi
                roll = frames[vid].roll
                roll = 0 if roll is None else roll

                p.push()
                p.scale(radius)
                p.rollL(phi)
                p.rollL(roll)
                p.down(down)
                p.F(l)
            else:
                radius = frames[vid].radius
                p.scale(radius)
                p.down(down)
                p.F(l)

        # p.stopGC()
        # Viewer.display(p.getScene())
        return p.getScene()
Esempio n. 2
0
    def interpret(self,
                  instanciation=True,
                  colorproperty=None,
                  bounds=None,
                  colormap='jet'):
        import openalea.lpy as lpy
        from openalea.plantgl.all import PglTurtle, Scene, Group, Shape
        print 'Instanciation :', instanciation

        def smb_interpret(cmd, turtle):
            ls = lpy.Lstring(cmd)
            lpy.turtle_interpretation(ls, turtle)

        def transf_interpret(cmd, smb, turtle):
            ls = lpy.Lstring(cmd)
            #print 'interpret', ls, cmd

            turtle.push()
            sc = lpy.turtle_partial_interpretation(ls, turtle)
            turtle.customGeometry(smb)
            turtle.pop()

        def sc2group(sc):
            if len(sc) == 1: return sc[0].geometry
            return Group([sh.geometry for sh in sc])

        def color_scene(sc, color):
            from openalea.plantgl.all import Discretizer, Scene
            d = Discretizer()
            for sh in sc:
                sh.geometry.apply(d)
                tr = d.result
                tr.colorList = [color for i in xrange(len(tr.indexList))]
                tr.colorPerVertex = False
                sh.geometry = tr

        geommap = dict()
        invorderednodes = []
        if colorproperty:
            from openalea.plantgl.scenegraph.colormap import PglColorMap
            if type(colorproperty) == str:
                cproperty = self.node_property(colorproperty)
            else:
                cproperty = colorproperty
            if bounds:
                cmap = PglColorMap(bounds[0], bounds[1], colormap)
            else:
                cmap = PglColorMap(min(cproperty.values()),
                                   max(cproperty.values()), colormap)
        for node in self.postorder_node_traversal():
            t = PglTurtle()
            #print node
            smb_interpret(self.geom(node), t)
            if colorproperty:
                color_scene(t.getScene(), cmap(cproperty[node]))

            if self.nb_children(node) > 0:
                for cchild, edgecmds in self.geomcommands[node][1].items():
                    for edgecmd in edgecmds:
                        transf_interpret(
                            edgecmd, geommap[cchild] if instanciation else
                            geommap[cchild].deepcopy(), t)
            smb = sc2group(t.getScene())
            smb.name = 'Shape_' + str(node)
            geommap[node] = smb

        t = PglTurtle()
        if colorproperty:
            return Scene([Shape(geommap[self.root],
                                t.getColorList()[1])]) + cmap.pglrepr()
        else:
            return Scene([Shape(geommap[self.root], t.getColorList()[1])])