first version

This commit is contained in:
2024-09-07 09:12:14 +08:00
commit bc8cc22a9c
27 changed files with 2530 additions and 0 deletions

97
plugin/singleton.py Normal file
View File

@@ -0,0 +1,97 @@
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()
'''