Thanks!

Apparently I'd forgotten that fetch defaults to doing a zoom (which it obviously has to do to make things look reasonable), so I thought I didn't need to play with the view. Too much non-PyMOL work rots the brain, it seems.

Cheers,
-Michael

On Sun, Jul 15, 2012 at 5:35 AM, Thomas Holder <speleo3@users.sourceforge.net> wrote:
Hi Michael,

you need to reset the camera view.

def writeSurfaceValue(objname, wrlname='/tmp/tmp.wrl',
        ptsname='/tmp/tmp.pts', pdbname='/tmp/tmp.pdb'):

    cmd.hide('everything')
    cmd.show('surface',objname)
    view = cmd.get_view()
    cmd.set_view([1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0,
        0.0, 0.0, -50.0, 0.0, 0.0, 0.0, 40.0, 100.0, -20.0])

    cmd.save(wrlname)
    points = getIndexedFaceSet(wrlname)
    f = file(ptsname,'w')
    f.writelines(points)
    f.close()
    pts2pdb(ptsname,pdbname)
    cmd.set_view(view)

Cheers,
  Thomas

Michael Lerner wrote, On 07/15/12 04:05:
I finally got back to this, and I'm still having some trouble. The surface I write out seems to be offset from what I'm viewing in PyMOL. I define the following functions:

def getIndexedFaceSet(wrlname):
    f = file(wrlname)
    for line in f:
        if 'geometry IndexedFaceSet {' in line:
            break
    else:
        print "Could not find IndexedFaceSet"
        return None
    assert 'coord Coordinate' in f.next()
    assert 'point' in f.next()
    points = []
    for line in f:
        if not line.strip(): continue
        line = line.strip()
        if ']' in line:
            break
        if line.endswith(','):
            line = line[:-1]
        points.append(','.join(line.split()) + '\n')
    return points

def pts2pdb(ptsname,pdbname):
    f = file(pdbname,'w')
    atomid,resi = 1,1
    for line in open(ptsname):
        line = line.strip()
        if not line: continue
        c = [float(x) for x in line.split(',')]
        f.write('ATOM %06s %4s PHO  %04s    %8.3f%8.3f%8.3f\n'%(atomid,resi,'C',c[0],c[1],c[2]))
        atomid += 1
    f.close()
        def writeSurfaceValue(objname,wrlname='/tmp/tmp.wrl',ptsname='/tmp/tmp.pts',pdbname='/tmp/tmp.pdb'):
    cmd.hide('everything')
    cmd.show('surface',objname)
    cmd.save(wrlname)
    points = getIndexedFaceSet(wrlname)
    f = file(ptsname,'w')
    f.writelines(points)
    f.close()
    pts2pdb(ptsname,pdbname)
cmd.extend('write_surface_value',writeSurfaceValue)

and then do

fetch 1rx1
set surface_solvent, 1
show surface
run <whatever file defines the above functions>
write_surface_value 1rx1
load /tmp/tmp.pdb
show spheres, tmp

and the tmp object looks like it has the right shape, but is clearly offset from 1rx1.

I have a feeling I'm doing something simple and obvious wrong, but I'm not sure what.

Thanks,

-Michael

On Mon, Jun 11, 2012 at 10:47 PM, Michael Lerner <mglerner@gmail.com <mailto:mglerner@gmail.com>> wrote:

    Hi all,

    Tsjerk- Thanks. I'm not sure how I missed that, given that it's even
    mentioned on the wiki on the surface page under the clear heading
    "Exporting Surface/Mesh Coordinates to File" :-|.
    (http://www.pymolwiki.org/index.php/Surface#Exporting_Surface.2FMesh_Coordinates_to_File).
    I don't know anything about VRML, but I found some documentation
    online at http://www.c3.hu/cryptogram/vrmltut/part5.html and it
    looks really straightforward. The surface will show up in the VRML
    file as an IndexedFaceSet, and the points are just XYZ triples, and
    I can safely ignore everything else.

    Darrell- Thanks. I'll build that in as an option.

    Takanori- Thanks. That's really cool. I happen to want solvent
    accessible surfaces rather than isosurfaces, but "dump" is
    definitely going into my bag of tricks.

    Cheers,
    -Michael

    On Mon, Jun 11, 2012 at 8:57 PM, Takanori Nakane
    <t.nakane@mail.mfour.med.kyoto-u.ac.jp
    <mailto:t.nakane@mail.mfour.med.kyoto-u.ac.jp>> wrote:

        Hi,

        Another way:
        There is an undocumented API called 'dump', which can
        dump coordinates of isomesh/isosurface to a file.

        For mesh, it dumps a list of vertex coordinates, which
        can be rendered as GL_LINE_STRIP.
        For surface, it dumps a list of pairs of a vertex coordinate
        and its vertex normal vector, which can be rendered as GL_TRIANGLES.

        Please examine my old post for a script example.
        http://www.mail-archive.com/pymol-users@lists.sourceforge.net/msg10012.html

        Best regards,

        Takanori Nakane

--
Thomas Holder
MPI for Developmental Biology
Spemannstr. 35
D-72076 Tübingen



--
Michael Lerner
Department of Physics and Astronomy
Earlham College - Drawer 111
801 National Road West
Richmond, IN   47374-4095