コード例 #1
0
def AddWalls () :

    m = _surface.Surface_Model()
    v = numpy.array( (
        (-1,-1,-1), (-1,1,-1), (1,1,-1), (1,-1,-1),
        (-1,-1,1), (-1,1,1), (1,1,1), (1,-1,1)
        ), numpy.float32 )
    #for i in range ( len(v) ) :
    #    v[i] = v[i] * .1
    v = v * WD
    v = v.astype(numpy.float32)

    vi_floor = (
        (0,1,2), (0,2,3)
        )

    vi_walls = (
        (0,4,1), (1,4,5), (1,5,2), (2,5,6)
        )

    #vi_walls_mesh = (
    #    (2,6,3), (6,7,3), (3,4,0), (3,7,4)
    #    )

    # q = (2,3,7,6)
    # vi_walls_mesh = Quad2Tri ( q )
    # v, q2 = SubdivideQuad (v, q)

    qt = ( (2,6,7,3), )
    v_wall_1, qt = SubdivideQuadRec ( v, qt, 5 )
    vi_wall_1_mesh = ()
    for q in qt :
        vi_wall_1_mesh = vi_wall_1_mesh + Quad2Tri (q)

    qt = ( (3,7,4,0), )
    v_wall_2, qt = SubdivideQuadRec ( v, qt, 5 )
    vi_wall_2_mesh = ()
    for q in qt :
        vi_wall_2_mesh = vi_wall_2_mesh + Quad2Tri (q)

    red = (1,0,0,1)
    grey = (.7,.7,.7,1)

    g_floor = m.add_group(v, vi_floor, red)
    g_walls = m.add_group(v, vi_walls, red)
    g_wall_1_mesh = m.add_group(v_wall_1, vi_wall_1_mesh, grey)
    g_wall_2_mesh = m.add_group(v_wall_2, vi_wall_2_mesh, grey)

    g_wall_1_mesh.set_display_style(g_wall_1_mesh.Mesh)
    g_wall_2_mesh.set_display_style(g_wall_2_mesh.Mesh)

    chimera.openModels.add([m])

    return m
コード例 #2
0
def AddWireWalls ( dim, ctr ) :

    dim[0] = dim[0]/2.0; dim[1] = dim[1]/2.0; dim[2] = dim[2]/2.0

    m = _surface.Surface_Model()
    v = numpy.array( (
        (ctr[0]-dim[0],ctr[1]-dim[1],ctr[2]-dim[2]),
        (ctr[0]-dim[0],ctr[1]+dim[1],ctr[2]-dim[2]),
        (ctr[0]+dim[0],ctr[1]+dim[1],ctr[2]-dim[2]),
        (ctr[0]+dim[0],ctr[1]-dim[1],ctr[2]-dim[2]),
        (ctr[0]-dim[0],ctr[1]-dim[1],ctr[2]+dim[2]),
        (ctr[0]-dim[0],ctr[1]+dim[1],ctr[2]+dim[2]),
        (ctr[0]+dim[0],ctr[1]+dim[1],ctr[2]+dim[2]),
        (ctr[0]+dim[0],ctr[1]-dim[1],ctr[2]+dim[2])
        ), numpy.float32 )

    # v = v * lengthX2
    # v = v.astype(numpy.float32)

    qt = ( (2,6,7,3), )
    qt = ( (3,7,4,0), )

    vi_floor = ((0,1,2), (0,2,3))
    vi_walls = ((0,4,1), (1,4,5), (1,5,2), (2,5,6),
                (2,6,7), (2,7,3), (3,7,4), (3,4,0) )

    red = (1,0,0,0.1)
    grey = (.2,.2,.2,0.0)

    g_floor = m.add_group(v, vi_floor, grey)
    g_walls = m.add_group(v, vi_walls, grey)

    g_floor.set_display_style(g_floor.Mesh)
    g_walls.set_display_style(g_walls.Mesh)

    chimera.openModels.add([m])

    return m
コード例 #3
0
def ReadMesh (patchpts = None, pos=Vector(0,0,0)) :

    m = _surface.Surface_Model()

    com = Vector (0,0,0)
    rad = Vector (0,0,0)
    numv = 0

    aV = []
    fp = open ( "C:\\greg\\chimera\\Blob\\psu_points.txt", 'r' )
    for line in fp :
        n = line.split(',')
        for i in range( len(n) ) :
            c = n[i].split()
            if len(c) == 3 :
                #v = numpy.array([[float(c[0]),float(c[1]),float(c[2])]], 'f' )
                aV = aV + [ [float(c[0]), float(c[1]), float(c[2])], ]
                numv = numv + 1
                v = Vector ( float(c[0]), float(c[1]), float(c[2]) )
                com = com + v
                if v.length > rad.length :
                    rad = v
    fp.close()

    v = numpy.array( aV, 'f' )
    print "COM:", com/float(numv)
    print "Rad:", rad.length
    scale = 1.0/rad.length

    xf = chimera.Xform.rotation ( Vector(0,0,1), 180 )
    xf.multiply ( chimera.Xform.rotation ( Vector(1,0,0), -90 ) )
    for i in range (numv) :
        vec = xf.apply ( Vector ( v[i][0], v[i][1], v[i][2] ) * scale )
        v[i][0] = vec.x
        v[i][1] = vec.y
        v[i][2] = vec.z


    vi = []
    vs = []
    fp = open ( "C:\\greg\\chimera\\Blob\\psu_tris.txt", 'r' )
    for line in fp :
        n = line.split(',')
        for t in n :
            try :
                ivi = int(t)
                if ivi == -1 :
                    #print 'tri', vs
                    vi = vi + [vs]
                    vs = []
                else :
                    vs = vs + [ivi]
            except:
                #print "bad token:", t
                continue
    fp.close()

    color = (0.6039, 0.8431, 0.898, 1.0)
    sph = m.add_group( v, vi, color )
    #sph.set_display_style(sph.Mesh)


    if patchpts :
        vcolors = ()

        for i in range ( len(v) ) :
            vp = chimera.Vector (  v[i][0], v[i][1], v[i][2] ) - pos
            inP = None
            for pt in patchpts:
                if (pt[0] - vp).length < (1.0/2.5) :
                    inP = pt[1]
                    break
            if inP :
                if inP < 0.0 :
                    vcolors = vcolors + ( (-inP*.6+.4, .4, .4, 1), )
                else :
                    vcolors = vcolors + ( (.4, .4, inP*.6+.4, 1), )
            else :
                vcolors = vcolors + ( (color), )

        print len ( vcolors ), len ( v )

        sph.set_vertex_colors( vcolors )


    chimera.openModels.add([m])
    return m
コード例 #4
0
def CylinderMesh (r1, r2, Length, div, color) :

    m = _surface.Surface_Model()
    chimera.openModels.add([m])

    v = None
    vi = ()

    # print "CylinderMesh:", div

    at = 0
    for psi_i in range(div) :

        psi = float(psi_i) * 360.0/float(div)

        #print "%.0f(%d)(%d)" % (psi, at, at-l),
        x1 = r1 * numpy.sin(psi * numpy.pi/180)
        y1 = r1 * numpy.cos(psi * numpy.pi/180)

        x2 = r2 * numpy.sin(psi * numpy.pi/180)
        y2 = r2 * numpy.cos(psi * numpy.pi/180)

        if psi_i == 0 :
            v = numpy.array( [ [x1,y1,0], ], numpy.float32 )
        else :
            pt1 = numpy.array( [ [x1,y1,0], ], numpy.float32 )
            v = numpy.concatenate ( [v, pt1] )

        pt2 = numpy.array( [ [x2,y2,Length], ], numpy.float32 )
        v = numpy.concatenate ( [v, pt2] )

        at = at + 2

        if psi_i == 0 :
            pass
        else :
            tris = Quad2Tri ( [at-4, at-2, at-1, at-3] )
            vi = vi + tris

        if psi_i == div-1 :
            tris = Quad2Tri ( [at-2, 0, 1, at-1] )
            vi = vi + tris


    pt1 = numpy.array( [ [0,0,0], ], numpy.float32 )
    v = numpy.concatenate ( [v, pt1] )

    pt1 = numpy.array( [ [0,0,Length], ], numpy.float32 )
    v = numpy.concatenate ( [v, pt1] )

    if 0 and r1 > .01 :
        print "capping 1"
        vi = vi + ( (at, 0, at-2), )
        for i in range ( (at-2)/2 ) :
            vi = vi + ( (at, (i+1)*2, (i+0)*2), )

    if 0 and r2 > .01 :
        print "capping 2"
        vi = vi + ( (at+1, at-1, 1), )
        for i in range ( (at-2)/2 ) :
            vi = vi + ( (at+1, (i+0)*2+1, (i+1)*2+1), )


    sph = m.add_group( v, vi, color )
    return m
コード例 #5
0
def SphereMesh (r, div, color, patchpts, pos = Vector(0,0,0)) :

    m = _surface.Surface_Model()

    v = numpy.array( [ [0+pos.x,0+pos.y,r+pos.z], ], numpy.float32 )
    vi = ()

    at = 1
    l = int ( numpy.ceil (float(div)*3.0/2.0) )
    if div < 10 : l = div*2
    print "SphereMesh:", div, 'x', l
    lat = 0

    for phi_i in range(div) :

        phi = 90.0 - ( float(phi_i+1) * 180.0/float(div+1) )
        #print "%.2f: " % phi,
        z = r * numpy.sin(phi * numpy.pi/180)
        s = r * numpy.cos(phi * numpy.pi/180)

        for psi_i in range (l) :
            psi = float(psi_i) * 360.0/float(l)

            #print "%.0f(%d)(%d)" % (psi, at, at-l),
            x = s * numpy.sin(psi * numpy.pi/180)
            y = s * numpy.cos(psi * numpy.pi/180)

            pt = numpy.array( [ [x+pos.x,y+pos.y,z+pos.z], ], numpy.float32 )
            v = numpy.concatenate ( [v, pt] )

            if phi_i == 0 :
                if psi_i > 0 :
                    vi = vi + ( (at-1, at, 0), )
                if psi_i == l-1 :
                    vi = vi + ( (at, 1, 0), )
            else :
                if psi_i > 0 :
                    tris = Quad2Tri ( [at-1, at, at-l, at-l-1] )
                    vi = vi + tris
                if psi_i == l-1 :
                    tris = Quad2Tri ( [at, at-l+1, at-l*2+1, at-l] )
                    vi = vi + tris

            if phi_i == div-1 :
                if psi_i > 0 :
                    vi = vi + ( (at, at-1, lat+l), )
                if psi_i == l-1 :
                    vi = vi + ( (at-l+1, at, lat+l), )

            at = at + 1


        lat = len ( v )

    pt = numpy.array( [ [0+pos.x,0+pos.y,-r+pos.z], ], numpy.float32 )
    v = numpy.concatenate ( [v, pt] )


    sph = m.add_group( v, vi, color )
    #sph.set_display_style(sph.Mesh)


    if patchpts :
        vcolors = ()

        for i in range ( len(v) ) :
            vp = chimera.Vector (  v[i][0], v[i][1], v[i][2] ) - pos
            inP = None
            for pt in patchpts:
                if (pt[0] - vp).length < (r/3) :
                    inP = pt[1]
                    break
            if inP :
                if inP < 0.0 :
                    vcolors = vcolors + ( (-inP*.6+.4, .4, .4, 1), )
                else :
                    vcolors = vcolors + ( (.4, .4, inP*.6+.4, 1), )
            else :
                vcolors = vcolors + ( (color), )

        print len ( vcolors ), len ( v )

        sph.set_vertex_colors( vcolors )


    chimera.openModels.add([m])

    return m