[chimera-dev] _surface module

Thomas Goddard goddard at cgl.ucsf.edu
Thu Oct 12 10:58:48 PDT 2006


Hi Karin,

  Yes, I did change Chimera Surface_Model to only support triangulated
surfaces, eliminating the quadrilateral surfaces.  I'm amazed that you
found the quadrilateral capability.  The new code does allow displaying
quadrilaterals in a different way -- and in fact can display pentagons,
hexagons and other shapes with the additions made to Chimera 1.2255.
I eliminated the old quadrilateral support when I added these new features
because the code was too complex and I did not expect anyone was using it.

  The new Surface_Model only allows surface specifications with triangles.
If you have quadrilaterals it is easy to turn it into triangles.  For a
quadrilateral with vertices 1, 2, 3, 4 just make two triangles with vertices
1, 2, 3 and 1, 3, 4.  The new Surface_Model allows hiding any triangle
edges when displaying with mesh style.  When you divide the quadrilateral
into 2 triangles you can hide the introduced quadrilateral diagonal.

  Below is an example of making a cube with 6 faces in the old (1.2199)
and new (1.2255) ways.  At the end there is a routine to turn quadrilateral
lists into triangle lists and an edge mask.

  The new Surface_Model allows displaying meshes with pentagons or hexagons,
or any arbitrary set of triangle edges, for example

	http://www.cgl.ucsf.edu/chimera/experimental/hkcage/cage.html

Also I added a new "square mesh" option to the Chimera volume viewer
dialog that shows contour meshes where just the intersection of the
grid planes perpendicular to x, y and z axes with the contour surface
are shown.  This is the kind of mesh the program O uses.

  I hope the new Surface_Model interface is not too troublesome to use.
The new edge masking capability makes it more powerful, but also more
complex.

	Tom

-----
Python code quads.py follows:

# -----------------------------------------------------------------------------
# Create a cube surface model using quadrilaterals with Chimera 1.2199.
#
def cube_old_style():

  from _surface import Surface_Model
  s = Surface_Model()

  # Cube corner xyz positions.
  vlist = ((0,0,0), (0,0,1), (0,1,0), (0,1,1),
           (1,0,0), (1,0,1), (1,1,0), (1,1,1))

  # 4-tuples of vertex list indices.
  qlist = ((0,4,5,1), (0,2,6,4), (0,1,3,2), (7,3,1,5), (7,6,2,3), (7,5,4,6))

  from Numeric import array, Float32
  vlist_f32 = array(vlist, Float32)     # add_group() requires Float32 vertices

  rgba = (1,1,1,1)      # white
  
  g = s.add_group(vlist_f32, qlist, rgba)
  g.set_display_style(g.Mesh)

  from chimera import openModels
  openModels.add([s])   # Add model to list of open models.

# -----------------------------------------------------------------------------
# Create a cube surface model using triangles with Chimera 1.2255.
#
def cube_new_style():

  from _surface import Surface_Model
  s = Surface_Model()

  # Cube corner xyz positions.
  vlist = ((0,0,0), (0,0,1), (0,1,0), (0,1,1),
           (1,0,0), (1,0,1), (1,1,0), (1,1,1))

  # 3-tuples of vertex indices specify triangles, 2 for each of 6 cube faces.
  tlist = ((0,4,5), (5,1,0), (0,2,6), (6,4,0),
           (0,1,3), (3,2,0), (7,3,1), (1,5,7),
           (7,6,2), (2,3,7), (7,5,4), (4,6,7))
  
  # Bit mask: 8 = show triangle
  #           4 = show triangle edge from vertex 0 to vertex 1
  #           2 = show triangle edge from vertex 1 to vertex 2
  #           1 = show triangle edge from vertex 2 to vertex 0
  b = 8 + 2 + 1
  hide_diagonals = (b,b,b,b,b,b,b,b,b,b,b,b)

  from Numeric import array, Float32
  vlist_f32 = array(vlist, Float32)     # add_group() requires Float32 vertices

  rgba = (1,1,1,1)      # white

  g = s.add_group(vlist_f32, tlist, rgba)
  g.set_display_style(g.Mesh)
  g.set_triangle_and_edge_mask(hide_diagonals)

  from chimera import openModels
  openModels.add([s])   # Add model to list of open models.

# -----------------------------------------------------------------------------
# Convert quadrilaterals to triangles with appropriate edge mask.
#
def quadrilaterals_to_triangles(qlist):

  tlist = []
  for v0,v1,v2,v3 in qlist:
    tlist.append((v0,v1,v2))
    tlist.append((v2,v3,v0))

  emask = 8 + 2 + 1
  edge_mask = [emask] * len(tlist)

  return tlist, edge_mask



More information about the Chimera-dev mailing list