Hello!

As there is no way to read in r3d colors for each point of a triangle
(for R3D it is the 15 before the colour line which specifies the colours for each triangle - point) to get smooth colored triangles, I changed slightely the cgo.py file to get this feature. (%pymol/modules/pymol/cgo.py)


It would be delighted, if this (or kind of this) change would be integrated in next versions of pymols cgo.py file.
regards,
J.
#-----------------------
Part of cgo.py:
#-----------------------
Changes were made in class RenderReader,
where a new def tri_color(self,f) was added to read additional r3d colors
specified as 15 in the r3d file.
The dispatch list was also changed to get the 15 feature.
If there is none the usual color (specified after the triangle-vertices input) will be used.
You can easy get the changed parts by searching "XXX" in the code.
.
.
.
  # Modification added XXX
  # add colour input for each point read from r3d files:
  # 15
  # r g b r g b r g b
  #
  def tri_color (self,f):
     l = f.readline()
     if  l:
        s = string.split(l)
        self.t_colr = [[float(s[0]),float(s[1]),float(s[2])],
                 [float(s[3]),float(s[4]),float(s[5])],
                 [float(s[6]),float(s[7]),float(s[8])]]
  # end add colour input for each point XXX
.
.
.

     dispatch = [
        None,
        self.tri,
        self.sphere,
        self.cyl,
        None,
        self.cyl,
        None,
        self.tri_normal,
        None,            # Modification added XXX
        None,
        None,
        None,
        None,
        None,
        None,
        None,
        None,
        self.tri_color,       # end Modification (15) XXX
        ]

#A* -------------------------------------------------------------------
#B* This file contains source code for the PyMOL computer program
#C* copyright 1998-2000 by Warren Lyford Delano of DeLano Scientific. 
#D* -------------------------------------------------------------------
#E* It is unlawful to modify or remove this copyright notice.
#F* -------------------------------------------------------------------
#G* Please see the accompanying LICENSE file for further information. 
#H* -------------------------------------------------------------------
#I* Additional authors of this source file include:
#-* 
#-* 
#-*
#Z* -------------------------------------------------------------------

import string
from chempy import cpv
#import popen2
import os
from pymol import cmd

POINTS             = 0.0
LINES              = 1.0
LINE_LOOP          = 2.0
LINE_STRIP         = 3.0
TRIANGLES          = 4.0
TRIANGLE_STRIP     = 5.0
TRIANGLE_FAN       = 6.0
#QUADS              = 7.0
#QUAD_STRIP         = 8.0
#POLYGON            = 9.0                                                       
     

STOP               =  0.0
NULL               =  1.0
BEGIN              =  2.0
END                =  3.0
VERTEX             =  4.0
NORMAL             =  5.0
COLOR              =  6.0
SPHERE             =  7.0
TRIANGLE           =  8.0
CYLINDER           =  9.0
LINEWIDTH          = 10.0
WIDTHSCALE         = 11.0
ENABLE             = 12.0
DISABLE            = 13.0
SAUSAGE            = 14.0
CUSTOM_CYLINDER    = 15.0

SHAPE_VERTEX       = 16.0
SHAPE_COLOR        = 17.0
SHAPE_NORMAL       = 18.0

FONT               = 19.0
FONT_SCALE         = 20.0
FONT_VERTEX        = 21.0
FONT_AXES          = 22.0

CHAR               = 23.0

ALPHA              = 25.0

LIGHTING           = float(0x0B50)

def molauto(*arg):
   name = "mols"
   sele = "(all)"
   marg = "-nice"
   la = len(arg)
   if la:
      name = arg[0]
   if la>1:
      sele = arg[1]
   if la>2:
      marg = arg[2]
   cmd.save("molauto.pdb",sele)
   print "molauto %s -nocentre molauto.pdb | molscript -r > molauto.r3d"%marg
   os.system("molauto %s -nocentre molauto.pdb | molscript -r > 
molauto.r3d"%marg)
   f = open("molauto.r3d")
   rr = RenderReader(f)
   f.close()
   cmd.load_cgo(rr.obj,name)

# the following implementation causes full-blown system crashes on some 
machines.
#   (stdout,stdin) = popen2.popen2("molauto %s -nocentre molauto.pdb | 
molscript -r > molauto.r3d"%marg)
#
#   if stdin:
#      stdin.close()
#      rr = RenderReader(stdout)
#      cmd.load_cgo(rr.obj,name)

def measure_text(font,text,
                 axes=[[1.0,0.0,0.0],[0.0,1.0,0.0],[0.0,0.0,1.0]]):
   w = 0
   x = axes[0]
   for char in text:
      if font.has_key(char):
         w = w + font[char][0]*x[0]
   return w

def wire_text(cgo,font,pos,text,
              axes = [[1.0,0.0,0.0],[0.0,1.0,0.0],[0.0,0.0,1.0]]): # modifies 
pos
   x = axes[0]
   y = axes[1]
   for char in text:
      if font.has_key(char):
         fc = font[char]
         stroke = 0
         w = fc[0]
         f = fc[1]
         c = 0
         l = len(f)-2
         while c<l:
            if not f[c]:
               if stroke: cgo.append(END)
               cgo.append(BEGIN)
               cgo.append(LINE_STRIP)
               stroke = 1
            ax = f[c+1]
            ay = f[c+2]
            cgo.append(VERTEX)
            cgo.append(pos[0]+x[0]*ax+y[0]*ay)
            cgo.append(pos[1]+x[1]*ax+y[1]*ay)
            cgo.append(pos[2]+x[2]*ax+y[2]*ay)         
            c = c + 3
         pos[0] = pos[0] + w*x[0]
         pos[1] = pos[1] + w*x[1]
         pos[2] = pos[2] + w*x[2]
         if stroke: cgo.append(END)

def cyl_text(cgo,font,pos,text,radius=0.1,color=[1.0,1.0,1.0],
              axes = [[1.0,0.0,0.0],[0.0,1.0,0.0],[0.0,0.0,1.0]]): # modifies 
pos
   x = axes[0]
   y = axes[1]
   for char in text:
      if font.has_key(char):
         fc = font[char]
         stroke = 0
         w = fc[0]
         f = fc[1]
         c = 0
         l = len(f)-2
         while c<l:
            ax = f[c+1]
            ay = f[c+2]
            next = [(pos[0]+x[0]*ax+y[0]*ay),
                    (pos[1]+x[1]*ax+y[1]*ay),
                    (pos[2]+x[2]*ax+y[2]*ay)]
            if f[c]:
               if stroke:
                  cgo.append(SAUSAGE)
                  cgo.extend(last)
                  cgo.extend(next)
                  cgo.append(radius)
                  cgo.extend(color)
                  cgo.extend(color)
            else:
               stroke = 1
            last = next
            c = c + 3
         pos[0] = pos[0] + w*x[0]
         pos[1] = pos[1] + w*x[1]
         pos[2] = pos[2] + w*x[2]


def from_r3d(fname):
   result = None
   input = open(fname)
   if input:
      rr = RenderReader(input)
      result = rr.obj
   return result

class RenderReader:

   def append_last(self):
      if self.app_fn:
         apply(self.app_fn)
         self.app_fn=None
      
   def append_tri(self):
      if self.l_vert and not self.l_norm:
         d0 = cpv.sub(self.l_vert[0],self.l_vert[1])
         d1 = cpv.sub(self.l_vert[0],self.l_vert[2])
         n0 = cpv.cross_product(d0,d1)
         n0 = cpv.normalize_failsafe(n0)
         n1 = [-n0[0],-n0[1],-n0[2]]
         ns = cpv.scale(n0,0.002)
         if not self.tri_flag:
            self.obj.append(BEGIN)
            self.obj.append(TRIANGLES)
            self.tri_flag = 1
         self.obj.append(COLOR)  # assuming unicolor
         self.obj.extend(self.t_colr[0])
         self.obj.append(NORMAL)
         self.obj.extend(n0)
         self.obj.append(VERTEX)
         self.obj.extend(cpv.add(self.l_vert[0],ns))
         self.obj.append(COLOR)  # assuming unicolor
         self.obj.extend(self.t_colr[1])
         self.obj.append(NORMAL)
         self.obj.extend(n0)
         self.obj.append(VERTEX)
         self.obj.extend(cpv.add(self.l_vert[1],ns))
         self.obj.append(COLOR)  # assuming unicolor
         self.obj.extend(self.t_colr[2])
         self.obj.append(NORMAL)
         self.obj.extend(n0)
         self.obj.append(VERTEX)
         self.obj.extend(cpv.add(self.l_vert[2],ns))
         self.obj.append(COLOR)  # assuming unicolor
         self.obj.extend(self.t_colr[0])
         self.obj.append(NORMAL)
         self.obj.extend(n1)
         self.obj.append(VERTEX)
         self.obj.extend(cpv.sub(self.l_vert[0],ns))
         self.obj.append(COLOR)  # assuming unicolor
         self.obj.extend(self.t_colr[1])
         self.obj.append(NORMAL)
         self.obj.extend(n1)
         self.obj.append(VERTEX)
         self.obj.extend(cpv.sub(self.l_vert[1],ns))
         self.obj.append(COLOR)  # assuming unicolor
         self.obj.extend(self.t_colr[2])
         self.obj.append(NORMAL)
         self.obj.extend(n1)
         self.obj.append(VERTEX)
         self.obj.extend(cpv.sub(self.l_vert[2],ns))

      elif self.l_vert and self.t_colr and self.l_norm:
         if not self.tri_flag:
            self.obj.append(BEGIN)
            self.obj.append(TRIANGLES)
            self.tri_flag = 1
         self.obj.append(COLOR) # assuming unicolor
         self.obj.extend(self.t_colr[0])
         self.obj.append(NORMAL)
         self.obj.extend(self.l_norm[0])
         self.obj.append(VERTEX)
         self.obj.extend(self.l_vert[0])
         self.obj.append(COLOR) # assuming unicolor
         self.obj.extend(self.t_colr[1])
         self.obj.append(NORMAL)
         self.obj.extend(self.l_norm[1])
         self.obj.append(VERTEX)
         self.obj.extend(self.l_vert[1])
         self.obj.append(COLOR) # assuming unicolor
         self.obj.extend(self.t_colr[2])
         self.obj.append(NORMAL)
         self.obj.extend(self.l_norm[2])
         self.obj.append(VERTEX)
         self.obj.extend(self.l_vert[2])
      self.l_vert=None
      self.t_colr=None
      self.l_norm=None

   def append_cyl(self):
      if self.l_vert and self.c_colr and self.l_radi:
         if self.tri_flag:
            self.tri_flag=0
            self.obj.append(END)
         self.obj.append(SAUSAGE)
         d = cpv.sub(self.l_vert[1],self.l_vert[0])
         d = cpv.normalize_failsafe(d)
         d0 = cpv.scale(d,self.l_radi/4.0)
         self.obj.extend(cpv.add(self.l_vert[0],d0))
         self.obj.extend(cpv.sub(self.l_vert[1],d0))
         self.obj.append(self.l_radi)
         self.obj.extend(self.c_colr[0])
         self.obj.extend(self.c_colr[1])
      self.l_vert=None
      self.c_colr=None
      self.l_radi=None
   # Modification added XXX
   # add colour input for each point read from r3d files:
   # 15
   # r g b r g b r g b
   #
   def tri_color (self,f):
      l = f.readline()
      if l:
         s = string.split(l)
         self.t_colr = [[float(s[0]),float(s[1]),float(s[2])],
                  [float(s[3]),float(s[4]),float(s[5])],
                  [float(s[6]),float(s[7]),float(s[8])]]
   # end add colour input for each point XXX
   def tri(self,f):
      self.append_last()
      l = f.readline()
      if l:
         self.app_fn=self.append_tri
         s = string.split(l)
         self.l_vert = [[float(s[0]),float(s[1]),float(s[2])],
                  [float(s[3]),float(s[4]),float(s[5])],
                  [float(s[6]),float(s[7]),float(s[8])]]
        
         self.t_colr_t = [float(s[9]),float(s[10]),float(s[11])]
         self.t_colr = [self.t_colr_t,self.t_colr_t,self.t_colr_t]
                

         
         
              

   def tri_normal(self,f):
      l = f.readline()
      if l:
         s = string.split(l)
         self.l_norm = [[float(s[0]),float(s[1]),float(s[2])],
                  [float(s[3]),float(s[4]),float(s[5])],
                  [float(s[6]),float(s[7]),float(s[8])]]

   def cyl(self,f):
      self.append_last()
      l = f.readline()
      if l:
         self.app_fn = self.append_cyl
         s = string.split(l)
         self.l_vert = [[float(s[0]),float(s[1]),float(s[2])],
                  [float(s[4]),float(s[5]),float(s[6])]]
         self.l_radi = float(s[3])
         self.c_colr_t = [float(s[8]),float(s[9]),float(s[10])]
         self.c_colr = [self.c_colr_t,self.c_colr_t]

   def sphere(self,f):
      self.append_last()
      l = f.readline()
      if l:
         s = string.split(l)
         self.obj.append(COLOR)
         self.obj.extend([float(s[4]),float(s[5]),float(s[6])])
         self.obj.append(SPHERE)
         self.obj.extend([float(s[0]),float(s[1]),float(s[2]),float(s[3])])


   def __init__(self,input):
      # Author: Warren DeLano
      # Modifications: Robert Campbell
      self.app_fn = None
      self.l_vert = None
      self.t_colr = None
      self.c_colr = None
      self.l_radi = None
      self.l_norm = None
      self.o_vert = None
      self.tri_flag = 0
      self.cc = 0
      self.obj = []
      for a in range(20):
         input.readline()
      dispatch = [
         None,
         self.tri,
         self.sphere,
         self.cyl,
         None,
         self.cyl,
         None,
         self.tri_normal,
         None,                  # Modification added XXX
         None,
         None,
         None,
         None,
         None,
         None,
         None,
         None,
         self.tri_color,       # end Modification (15) XXX
         ]
      ld = len(dispatch)
      while 1:
         l = input.readline()
         if not l:
            break
         if l[0] != '#':
            v = string.split(l)
            n=int(v[0])
            if(n<ld):
               dd = dispatch[n]
               if dd:
                  apply(dd,(input,))
               else:
                  # skip over lines that don't match desired object type
                  input.readline()
            elif ( n != 9 ):
               # don't read another line if render object type 0
               input.readline()
      self.append_last()
      if self.tri_flag:
         self.obj.append(END)
      input.close()

Reply via email to