Files
PlantAI-dev/tools/pymol-open-source/modules/pymol2/__init__.py
T
2026-08-03 18:42:47 +08:00

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)