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
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
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
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
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