107 lines
3.3 KiB
Python
107 lines
3.3 KiB
Python
from pymol.wizard import Wizard
|
|
from pymol import cmd
|
|
import pymol
|
|
import types
|
|
import threading
|
|
|
|
drag_sele = "_drag"
|
|
|
|
#def delayed_disable(name,delay=1.0):
|
|
# import time
|
|
# time.sleep(delay)
|
|
# from pymol import cmd
|
|
# cmd.disable(name)
|
|
|
|
class Dragging(Wizard):
|
|
|
|
def __init__(self, *arg, _self=cmd):
|
|
self.valid = 1
|
|
Wizard.__init__(self,_self)
|
|
if len(arg):
|
|
self.old_button_mode = int(arg[0])
|
|
self.check_valid()
|
|
if self.valid:
|
|
self.recount()
|
|
|
|
def recount(self):
|
|
if self.check_valid():
|
|
self.atom_count = self.cmd.count_atoms(drag_sele)
|
|
if self.atom_count:
|
|
obj_list = self.cmd.get_object_list(drag_sele)
|
|
self.obj = obj_list[0]
|
|
print(' Dragging %s atoms in object "%s".'%(self.atom_count,self.obj))
|
|
else:
|
|
self.obj = self.cmd.get_drag_object_name();
|
|
print(' Dragging whole object "%s".'%self.obj)
|
|
self.cmd.refresh_wizard()
|
|
# self.cmd.enable(drag_sele)
|
|
# t = threading.Thread(target=delayed_disable,args=(drag_sele,0.5))
|
|
# t.setDaemon(1)
|
|
# t.start()
|
|
|
|
def do_dirty(self):
|
|
if self.valid:
|
|
self.check_valid()
|
|
|
|
def check_valid(self):
|
|
if (not hasattr(self,"cmd")) or self.cmd is None:
|
|
return 0
|
|
elif self.cmd.get_editor_scheme()!=3:
|
|
if self.valid:
|
|
self.valid = 0
|
|
self.cmd.do("_ cmd.set_wizard()")
|
|
self.cmd.refresh_wizard()
|
|
return 0
|
|
else:
|
|
return 1
|
|
|
|
def get_event_mask(self):
|
|
return Wizard.event_mask_pick + Wizard.event_mask_dirty
|
|
|
|
def set_old_button_mode(self,button_mode):
|
|
self.old_button_mode = button_mode
|
|
|
|
def indicate(self):
|
|
if self.check_valid():
|
|
if drag_sele in self.cmd.get_names("all",enabled_only=1):
|
|
self.cmd.disable(drag_sele)
|
|
else:
|
|
self.cmd.enable(drag_sele)
|
|
self.cmd.refresh_wizard()
|
|
|
|
def cleanup(self):
|
|
if (not hasattr(self,"cmd")) or self.cmd is None:
|
|
return
|
|
self.cmd.drag()
|
|
if drag_sele in self.cmd.get_names("all",enabled_only=1):
|
|
self.cmd.disable(drag_sele)
|
|
if self.old_button_mode is not None:
|
|
self.cmd.set("button_mode",self.old_button_mode,quiet=1)
|
|
self.cmd.mouse()
|
|
|
|
def get_panel(self):
|
|
if self.check_valid():
|
|
if self.atom_count:
|
|
panel = [
|
|
[ 1, 'Dragging %d atoms in'%self.atom_count, ''],
|
|
[ 1, 'object "'+self.obj+'"', ''],
|
|
[ 2, 'Undo (CTRL-Z)',
|
|
'cmd.undo()'],
|
|
[ 2, 'Redo (CTRL-A)',
|
|
'cmd.redo()'],
|
|
[ 2, 'Indicate',
|
|
'cmd.get_wizard().indicate()'],
|
|
[ 2, 'Done', 'cmd.set_wizard()' ]
|
|
]
|
|
else:
|
|
panel = [
|
|
[ 1, 'Dragging matrix for',''],
|
|
[ 1, 'object "'+self.obj+'"', ''],
|
|
[ 2, 'Reset', 'cmd.reset(object="%s")'%self.obj],
|
|
[ 2, 'Done', 'cmd.set_wizard()' ]
|
|
]
|
|
|
|
else:
|
|
panel = None
|
|
return panel
|