135 lines
3.9 KiB
Python
135 lines
3.9 KiB
Python
#A* -------------------------------------------------------------------
|
|||
|
|
#B* This file contains source code for the PyMOL computer program
|
||
|
|
#C* copyright 1998-2007 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 pymol
|
||
|
|
|
||
|
|
from pymol import _cmd
|
||
|
|
|
||
|
|
import threading
|
||
|
|
import sys
|
||
|
|
|
||
|
|
pymol2_lock = threading.RLock()
|
||
|
|
|
||
|
|
##
|
||
|
|
## FIXME: The PyMOL and SingletonPyMOL classes are partly redundant with the
|
||
|
|
## instance tracking of the "cmd" module (and the pymol2.cmd2.Cmd class),
|
||
|
|
## which also holds the _COb pointer.
|
||
|
|
##
|
||
|
|
|
||
|
|
class SingletonPyMOL:
|
||
|
|
'''
|
||
|
|
Start an exclusive PyMOL instance, only one instance allowed
|
||
|
|
'''
|
||
|
|
def idle(self):
|
||
|
|
return _cmd._idle(self._COb)
|
||
|
|
|
||
|
|
def getRedisplay(self, reset=True):
|
||
|
|
return _cmd._getRedisplay(self._COb, reset)
|
||
|
|
|
||
|
|
def reshape(self, width, height, force=0):
|
||
|
|
_cmd._reshape(self._COb, width, height, force)
|
||
|
|
|
||
|
|
def draw(self):
|
||
|
|
_cmd._draw(self._COb)
|
||
|
|
|
||
|
|
def button(self, button, state, x, y, modifiers):
|
||
|
|
_cmd._button(self._COb, button, state, x, y, modifiers)
|
||
|
|
|
||
|
|
def drag(self, x, y, modifiers):
|
||
|
|
_cmd._drag(self._COb, x, y, modifiers)
|
||
|
|
|
||
|
|
def start(self):
|
||
|
|
cmd = pymol.cmd
|
||
|
|
if cmd._COb is not None:
|
||
|
|
raise RuntimeError('can only start SingletonPyMOL once')
|
||
|
|
|
||
|
|
with pymol2_lock:
|
||
|
|
cmd._COb = _cmd._new(pymol, pymol.invocation.options, True)
|
||
|
|
_cmd._start(cmd._COb, cmd)
|
||
|
|
|
||
|
|
# this instance tracking is redundant with the "cmd" module itself
|
||
|
|
self._COb = cmd._COb
|
||
|
|
self.cmd = cmd
|
||
|
|
|
||
|
|
def stop(self):
|
||
|
|
with pymol2_lock:
|
||
|
|
_cmd._stop(self._COb)
|
||
|
|
|
||
|
|
pymol.cmd._COb = None
|
||
|
|
|
||
|
|
def __enter__(self):
|
||
|
|
self.start()
|
||
|
|
return self
|
||
|
|
|
||
|
|
def __exit__(self, exc_type, exc_value, tb):
|
||
|
|
self.stop()
|
||
|
|
|
||
|
|
|
||
|
|
class PyMOL(SingletonPyMOL):
|
||
|
|
'''
|
||
|
|
Start a non-exclusive PyMOL instance, multiple instances are possible
|
||
|
|
'''
|
||
|
|
|
||
|
|
def __getattr__(self, key):
|
||
|
|
# Make this a proxy to the "pymol" module.
|
||
|
|
return getattr(pymol, key)
|
||
|
|
|
||
|
|
def __init__(self,scheme=None): # initialize a PyMOL instance
|
||
|
|
from .cmd2 import Cmd
|
||
|
|
|
||
|
|
with pymol2_lock:
|
||
|
|
pymol._init_internals(self)
|
||
|
|
|
||
|
|
self.invocation = self._invocation
|
||
|
|
|
||
|
|
options = self.invocation.options
|
||
|
|
|
||
|
|
if scheme is not None: #
|
||
|
|
if scheme == 'presentation':
|
||
|
|
options.quiet = 0
|
||
|
|
options.show_splash = 0
|
||
|
|
options.external_gui = 0
|
||
|
|
options.internal_feedback = 0
|
||
|
|
options.no_quit = 1
|
||
|
|
options.internal_gui = 0
|
||
|
|
options.presentation = 1
|
||
|
|
elif scheme == 'widget': # An embedded widget of some type
|
||
|
|
options.quiet = 0
|
||
|
|
options.show_splash = 0
|
||
|
|
options.external_gui = 0
|
||
|
|
options.internal_feedback = 1
|
||
|
|
options.no_quit = 1
|
||
|
|
else:
|
||
|
|
options.show_splash = 0 # suppress this annoyance by default
|
||
|
|
|
||
|
|
self._COb = _cmd._new(self,self.invocation.options)
|
||
|
|
|
||
|
|
# initialize the cmd API
|
||
|
|
|
||
|
|
self.cmd = Cmd(self,self._COb)
|
||
|
|
|
||
|
|
# begin assembling the instance member by member
|
||
|
|
|
||
|
|
self.glutThread = None
|
||
|
|
|
||
|
|
def __del__(self):
|
||
|
|
self.cmd.__dict__.clear()
|
||
|
|
|
||
|
|
def start(self):
|
||
|
|
with pymol2_lock:
|
||
|
|
_cmd._start(self._COb, self.cmd)
|
||
|
|
|
||
|
|
def stop(self):
|
||
|
|
_cmd._stop(self._COb)
|