Files
pymol/plugin/singleton.py
2024-09-07 09:12:14 +08:00

97 lines
2.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 __init__(self, options=None):
if options is None:
self.options = pymol.invocation.options
else:
self.options = options
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, self.options, True) #! 此处对pymol-open-source源码进行修改方便启动的时候修改参数具体参考options
_cmd._start(cmd._COb, cmd)
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()
@classmethod
def start_with_options(cls, options): # new add
instance = cls(options)
instance.start()
return instance
'''
# 使用示例
if __name__ == '__main__':
from pymol.invocation import options
options.rpcServer = 1
# 使用类方法创建并启动实例
pymol_instance1 = SingletonPyMOL.start_with_options(options)
# 使用上下文管理器
with SingletonPyMOL() as pymol_instance2:
# pymol_instance2 使用默认的 options
pass
# 先创建实例,然后单独启动
pymol_instance3 = SingletonPyMOL()
pymol_instance3.start() # 使用默认的 options
# 启动pymol GUI可以在一个新的进程中启动通过rpcServer 默认端口是9123 localhost
# 或者在一个新的线程中启动界面,不堵塞主线程
from pmg_qt import pymol_qt_gui
pymol_qt_gui.execapp()
'''