예제 #1
0
def stolon2d(g, v, turtle):
    scale= 1./5
    cyl = pgl.Cylinder(0.01,0.5)
    cyl2 = pgl.Cylinder(0.01,0.2)
    cyl3 = pgl.Cylinder(0.01,0.2)
    cyl = pgl.AxisRotated(axis=(0,1,0), angle= radians(30.), geometry= cyl)
    cyl2 = pgl.AxisRotated(axis=(0,1,0), angle= -radians(120.), geometry= cyl2)
    cyl3 = pgl.AxisRotated(axis=(0,1,0), angle= -radians(180.), geometry= cyl3)
    cyl2= pgl.Translated((0.26,0,0.45),cyl2)
    cyl3= pgl.Translated((0.26,0,0.45),cyl3)
    sto= pgl.Group([cyl,cyl2,cyl3])

    turtle.customGeometry(sto)
예제 #2
0
def cones(obj, **kwds):
    X_attr = kwds.get('X_attr', 'X')
    Y_attr = kwds.get('Y_attr', 'Y')
    pos_dist = kwds.get('dist', 'Distance')
    pos_az = kwds.get('az', 'Azimuth')
    circ_attr = kwds.get('circ_attr', 'Circonference')
    height_attr = kwds.get('height_attr', 'Haut')
    botHoup_attr = kwds.get('botHoup', 'BaseHoup')
    radiusHoup_prefix = kwds.get('radiusHoup_prefix', 'r_houp')
    radiusHoup = kwds.get('radiusHoup', None)
    wood = kwds.get('wood', True)
    rgb = kwds.get('rgb', None)
    spec_name = kwds.get('spec_name', 'houppier_mat')

    if not obj.__dict__.has_key("posX") and not obj.__dict__.has_key("posY"):
        try:
            r = obj.__dict__[pos_dist]
            a = obj.__dict__[pos_az]
            obj.posX = r * cos(radians(forest2geomAZ(a)))
            obj.posY = r * sin(radians(forest2geomAZ(a)))
        except KeyError:
            obj.posX = obj.__dict__[X_attr]
            obj.posY = obj.__dict__[Y_attr]

    ht = 100 * (obj.__dict__[height_attr] - obj.__dict__[botHoup_attr])

    rd_kz = [k for k in obj.__dict__.keys() if radiusHoup_prefix in k]
    radii = [obj.__dict__[k] for k in rd_kz]

    if radiusHoup:
        if radiusHoup == 'Max':
            cone_radius = 1.0 * max(radii)
        else:
            cone_radius = obj.__dict__[radiusHoup]
    else:
        cone_radius = 1.0 * sum(radii) / len(radii)
        #cone_radius = ht/2.
    h = pgl.Translated(
        pgl.Vector3(obj.posX, obj.posY, obj.__dict__[botHoup_attr] * 100),
        pgl.Cone(cone_radius, ht, 1, 12))
    tr = pgl.Translated(
        pgl.Vector3(obj.posX, obj.posY, 0),
        pgl.Cylinder(obj.__dict__[circ_attr] / (2 * pi),
                     obj.__dict__[botHoup_attr] * 100 + ht * 0.1))

    if rgb == None:
        s_h = pgl.Shape(h, stand_material(spec_name=spec_name))
    else:
        r, g, b = rgb
        s_h = pgl.Shape(h, stand_material(r, g, b, spec_name))

    s_tr = pgl.Shape(
        tr,
        stand_material(spec_name="trunk_mat"),
    )  # s_h.id*10 )

    if wood:
        return (s_h, s_tr)
    else:
        return (s_h, )
예제 #3
0
def frame(matrix, scene, color=1):
    """ Add a frame to the scene.
    The frame is represented by the matrix.
    :param color: allow to distinguish between to identical frames.
    """
    if color == 1:
        r = pgl.Material(pgl.Color3(*(255, 0, 0)))
        g = pgl.Material(pgl.Color3(*(0, 255, 0)))
        b = pgl.Material(pgl.Color3(*(0, 0, 255)))
    else:
        r = pgl.Material(pgl.Color3(*(255, 0, 255)))
        g = pgl.Material(pgl.Color3(*(255, 255, 0)))
        b = pgl.Material(pgl.Color3(*(0, 0, 0)))

    cylinder = pgl.Cylinder(radius=0.005, height=1)
    #x = pgl.AxisRotated(Vector3(0,1,0), radians(90), cylinder)
    #y = pgl.AxisRotated(Vector3(1,0,0), radians(-90), cylinder)
    z = cylinder

    #geom_x = transform4(matrix, x)
    #scene.add(pgl.Shape(geom_x, r))
    #geom_y = transform4(matrix, y)
    #scene.add(pgl.Shape(geom_y, g))
    geom_z = transform4(matrix, z)
    scene.add(pgl.Shape(geom_z, b))
예제 #4
0
 def Cylinder(self, radius=1., height=1., bottom_open=False, top_open=False, color=None, **kwds):
     if color:
         self._current_turtle.color = self.color(color)
     # radius, height = float(radius)*10, float(height)*10
     radius, height = float(radius), float(height)
     solid = not(bool(bottom_open) and bool(top_open))
     return (pgl.Cylinder(radius=radius, height=height, solid=solid),
             pgl.Matrix4.translation(Vector3(0, 0, height)))
예제 #5
0
 def Cylinder(self,
              radius=1.,
              length=1.,
              base_open=False,
              top_open=False,
              **kwds):
     # radius, height = float(radius)*10, float(height)*10
     radius, length = float(radius), float(length)
     solid = not (bool(base_open) and bool(top_open))
     return (pgl.Cylinder(radius, length, solid),
             pgl.Matrix4.translation(Vector3(0, 0, length)))
예제 #6
0
def arrow(x,y,z,length,az=0, el=0, radius=None, color=color(255,255,255),id=0):
  if radius==None:
    radius=length*0.05
  rad_az = math.radians(az)
  rad_el = math.pi/2 - math.radians(el)
  v = pgl.Vector3( x, y, z )
  c = pgl.Cylinder(radius, length*0.8, 10)
  con =pgl.Translated(pgl.Vector3(0,0,length*0.7), pgl.Cone(2*radius, length*0.3))
  arr = pgl.Group([c,con])
  dir_arr = pgl.EulerRotated(rad_az,rad_el,0,arr)
  tr_dir_arr = pgl.Translated(v,dir_arr)
  return pgl.Shape(tr_dir_arr, color, id)
예제 #7
0
파일: symbol.py 프로젝트: rbarillot/adel
    def _mesh(self, length, diameter_base, diameter_top):
        if self.seed is not None or classic:
            solid = True
            slices = 3
            diameter = diameter_base
            stem = pgl.Tapered(diameter_base / 2., diameter_top / 2.,
                               pgl.Cylinder(1., length, solid, slices))
            stem.apply(self.tessel)
            mesh = self.tessel.triangulation
        else:
            mesh = slim_cylinder(length, diameter_base / 2., diameter_top / 2.)

        return mesh
예제 #8
0
def StemElement_mesh(length, diameter_base, diameter_top, classic=False):
    """ Compute mesh for a stem element
        - classic indicates
    """
    if classic:
        solid = True
        diameter = diameter_base
        slices = 6  # 6 is the minimal number of slices for a correct computation of star (percentage error lower than 5)
        stem = pgl.Tapered(diameter_base / 2., diameter_top / 2.,
                           pgl.Cylinder(1., length, solid, slices))
        tessel = pgl.Tesselator()
        stem.apply(tessel)
        mesh = tessel.triangulation
    else:
        mesh = slim_cylinder(length, diameter_base / 2., diameter_top / 2.)

    return mesh
예제 #9
0
def simple_tree(height=2,
                crown_radius=1,
                n_leaves=500,
                leaf_area=0.1,
                inner=True):
    """return a simple tree scene"""
    leaves = random_leaves(n_leaves=n_leaves,
                           leaf_area=leaf_area,
                           crown_radius=crown_radius,
                           crown_center=(0, 0, height),
                           inner=inner)
    trunk = pgl.Cylinder(0.1, height)
    green = pgl.Material(pgl.Color3(0, 150, 0))
    brown = pgl.Material(pgl.Color3(100, 60, 10))
    scene = pgl.Scene()
    scene.add(pgl.Shape(trunk, brown))
    for leaf in leaves:
        scene.add(pgl.Shape(leaf, green))
    return scene
예제 #10
0
def tapCyl(x,y,z,radius,height, color=color(46,27,21)):
  v = pgl.Vector3( x, y, z )
  c = pgl.Cylinder(radius, height, 10)
  tc = pgl.Tapered(1.0,0.7,c)
  tr = pgl.Translated(v,tc)
  return pgl.Shape(tr,color)
예제 #11
0
 def f(turtle):
     height = turtle.length
     radius = turtle.diameter /2.
     color = turtle.color
     return (pgl.Cylinder(radius=radius, height=height),
             pgl.Matrix4.translation(Vector3(0, 0, height)))
예제 #12
0
 def Cylinder(self, radius=1., height=1., bottom_open=False, top_open=False, **kwds):
     # radius, height = float(radius)*10, float(height)*10
     radius, height = float(radius), float(height)
     solid = not(bool(bottom_open) and bool(top_open))
     return (pgl.Cylinder(radius=radius, height=height, solid=solid),
             pgl.Matrix4.translation(Vector3(0, 0, height)))
예제 #13
0
def asymetric_swung(obj, **kwds):
    X_attr = kwds.get('X_attr', 'X')
    Y_attr = kwds.get('Y_attr', 'Y')
    Z_attr = kwds.get('Z_attr', None)
    pos_dist = kwds.get('dist', 'Distance')
    pos_az = kwds.get('az', 'Azimuth')
    circ_attr = kwds.get('circ_attr', 'Circonference')
    height_attr = kwds.get('height_attr', 'Haut')
    botHoup_attr = kwds.get('botHoup', 'BaseHoup')
    radiusHoup_prefix = kwds.get('radiusHoup_prefix', 'r_houp')
    azimuthHoup_prefix = kwds.get('azimuthHoup_prefix', 'a_houp')
    midCrown = kwds.get('midCrown', 0.8)
    wood = kwds.get('wood', True)
    rgb = kwds.get('rgb', None)
    spec_name = kwds.get('spec_name', 'houppier_mat')

    rd_kz = [k for k in obj.__dict__.keys() if radiusHoup_prefix in k]
    rd_kz.sort()
    az_kz = [k for k in obj.__dict__.keys() if azimuthHoup_prefix in k]
    az_kz.sort()
    if len(rd_kz) != len(az_kz):
        print obj.__dict__[X_attr], obj.__dict__[Y_attr]
    assert (len(rd_kz) == len(az_kz)
            and "directional canopy length and azimuth are not the same size")

    houppier = [(obj.__dict__[rd_kz[i]],
                 houppier2geomAZ(obj.__dict__[az_kz[i]]))
                for i in range(len(rd_kz))]
    houppier.sort(cmp=lambda x, y: cmp(x[1], y[1]))

    if not obj.__dict__.has_key("posX") and not obj.__dict__.has_key("posY"):
        try:
            r = obj.__dict__[pos_dist]
            a = obj.__dict__[pos_az]
            obj.posX = r * cos(radians(forest2geomAZ(a)))
            obj.posY = r * sin(radians(forest2geomAZ(a)))
        except KeyError:
            obj.posX = obj.__dict__[X_attr]
            obj.posY = obj.__dict__[Y_attr]

    if Z_attr == None:
        obj.posZ = 0
    else:
        obj.posZ = obj.__dict__[Z_attr]

    mc = float(midCrown)
    radii = list(houppier)
    ht = 100 * (obj.__dict__[height_attr] - obj.__dict__[botHoup_attr])
    h = pgl.Translated(
        pgl.Vector3(obj.posX, obj.posY,
                    obj.__dict__[botHoup_attr] * 100 + obj.posZ),
        createSwung(ht * mc, ht, radii))
    tr = pgl.Translated(
        pgl.Vector3(obj.posX, obj.posY, obj.posZ),
        pgl.Cylinder(obj.__dict__[circ_attr] / (2 * pi),
                     obj.__dict__[botHoup_attr] * 100 + ht * 0.1))

    if rgb == None:
        s_h = pgl.Shape(h, stand_material(spec_name=spec_name))
    else:
        r, g, b = rgb
        s_h = pgl.Shape(h, stand_material(r, g, b, spec_name))

    s_tr = pgl.Shape(
        tr,
        stand_material(spec_name="trunk_mat"),
    )  # s_h.id*10 )

    if wood:
        return (s_h, s_tr)
    else:
        return (s_h, )
예제 #14
0
:author:  szymon stoma, frederic boudon, david da silva
"""

import openalea.plantgl.all as pgl
import material

__docformat__ = "restructuredtext en"

ASHAPE3D_STANDARD_AXIS = pgl.Vector3.OZ
ASHAPE3D_STANDARD_ROLL = 0.
ASHAPE3D_STANDARD_POS = pgl.Vector3.ORIGIN
ASHAPE3D_STANDARD_MATERIAL = material.white
ASHAPE3D_STANDARD_SCALE = pgl.Vector3(1, 1, 1)

# save memory with primitive types related
ACYLINDER_PRIMITIVE = pgl.Cylinder()
ACYLINDER_PRIMITIVE.name = "ACylinderPrimitive"
ACYLINDER_STANDARD_RADIUS = 1.
ACYLINDER_STANDARD_HEIGHT = 1.
ACYLINDER_STANDARD_AXIS = ASHAPE3D_STANDARD_AXIS

ASPHERE_PRIMITIVE = pgl.Sphere()
ASPHERE_PRIMITIVE.name = "ASpherePrimitive"
ASPHERE_STANDARD_RADIUS = 1.

AARROW_STANDARD_AXIS = ASHAPE3D_STANDARD_AXIS
AARROW_STANDARD_RADIUS = 1.
AARROW_STANDARD_HEIGHT = 1.
AARROW_SHAFT_PROPORTION = 0.7
AARROW_HEAD_PROPORTION = 1.5
예제 #15
0
def test_texture():
    fname = '../share/plantgl/pixmap/geomviewer.png'
    t = pgl.ImageTexture(fname)
    t.baseColor = (255, 0, 0, 0)
    sh = pgl.Shape(pgl.Cylinder(), t, 2)
    jsonconversion(sh)