176 lines
5.6 KiB
Python
176 lines
5.6 KiB
Python
import sys
|
|
cmd = __import__("sys").modules["pymol.cmd"]
|
|
from .cmd import Shortcut, is_string, QuietException
|
|
from .cmd import fb_module, fb_mask, fb_action,_raising
|
|
import copy
|
|
|
|
from pymol import _cmd
|
|
import string
|
|
|
|
def _feedback(module,mask,_self=cmd): # feedback query routine
|
|
# WARNING: internal routine, subject to change
|
|
if not hasattr(_self,'_fb_dict'):
|
|
_self._fb_dict = copy.deepcopy(_fb_dict)
|
|
r = 0
|
|
module = int(module)
|
|
mask = int(mask)
|
|
if module>0:
|
|
try:
|
|
_self.lock(_self)
|
|
r = _cmd.feedback(_self._COb,module,mask)
|
|
finally:
|
|
_self.unlock(-1,_self)
|
|
else:
|
|
r = _self._fb_dict.get(module,0)&mask
|
|
return r
|
|
|
|
fb_action_sc = Shortcut(fb_action.__dict__.keys())
|
|
|
|
fb_module_sc = Shortcut(fb_module.__dict__.keys())
|
|
|
|
fb_mask_sc = Shortcut(fb_mask.__dict__.keys())
|
|
|
|
_fb_dict = {}
|
|
|
|
for _a, _vl in fb_module.__dict__.items():
|
|
if _a.startswith('_'):
|
|
continue
|
|
if _vl<0:
|
|
_fb_dict[_vl] = 0x1F # default mask
|
|
|
|
def feedback(action="?", module="?", mask="?", _self=cmd):
|
|
'''
|
|
DESCRIPTION
|
|
|
|
"feedback" changes the amount of information output by pymol.
|
|
|
|
USAGE
|
|
|
|
feedback action, module, mask
|
|
|
|
ARGUMENTS
|
|
|
|
action = set, enable, or disable
|
|
|
|
module = string: a space-separated list of modules or simply "all"
|
|
|
|
mask = string: a space-separated list of output categories or simply "everything"
|
|
|
|
NOTES
|
|
|
|
"feedback" alone will print a list of the available module choices
|
|
|
|
PYMOL API
|
|
|
|
cmd.feedback(string action,string module,string mask)
|
|
|
|
EXAMPLES
|
|
|
|
feedback enable, all , debugging
|
|
feedback disable, selector, warnings actions
|
|
feedback enable, main, blather
|
|
|
|
'''
|
|
|
|
r = None
|
|
|
|
# validate action
|
|
if not hasattr(_self,'_fb_dict'):
|
|
_self._fb_dict = copy.deepcopy(_fb_dict)
|
|
if action=="?":
|
|
print(" feedback: possible actions: \nset, enable, disable")
|
|
act_int = 0
|
|
else:
|
|
act_kee = fb_action_sc.interpret(action)
|
|
if act_kee is None:
|
|
print("Error: invalid feedback action '%s'."%action)
|
|
if _raising(_self=_self):
|
|
raise QuietException
|
|
else:
|
|
return None
|
|
elif not is_string(act_kee):
|
|
print("Error: ambiguous feedback action '%s'."%action)
|
|
print(action_amb)
|
|
if _raising(_self=_self):
|
|
raise QuietException
|
|
else:
|
|
return None
|
|
act_int = int(getattr(fb_action,act_kee))
|
|
|
|
if (act_int<3) and ("?" in [action,module,mask]):
|
|
if module=="?":
|
|
print(" feedback: Please specify module names:")
|
|
lst = list(fb_module.__dict__.keys())
|
|
lst.sort()
|
|
for a in lst:
|
|
if a[0]!='_':
|
|
print(" ",a)
|
|
if mask=="?":
|
|
print(" feedback: Please specify masks:")
|
|
lst = list(fb_mask.__dict__.keys())
|
|
lst.sort()
|
|
for a in lst:
|
|
if a[0]!='_':
|
|
print(" ",a)
|
|
else:
|
|
if (act_int>=3):
|
|
module='all'
|
|
mask='everything'
|
|
|
|
# validate and combine masks
|
|
|
|
mask_int = 0
|
|
mask_lst = mask.split()
|
|
for mask in mask_lst:
|
|
mask_kee = fb_mask_sc.interpret(mask)
|
|
if mask_kee is None:
|
|
print("Error: invalid feedback mask '%s'."%mask)
|
|
if _raising(_self=_self): raise QuietException
|
|
else: return None
|
|
elif not is_string(mask_kee):
|
|
print("Error: ambiguous feedback mask '%s'."%mask)
|
|
if _raising(_self=_self): raise QuietException
|
|
else: return None
|
|
mask_int |= int(getattr(fb_mask,mask_kee))
|
|
|
|
# validate and iterate modules
|
|
|
|
mod_lst = module.split()
|
|
for module in mod_lst:
|
|
mod_kee = fb_module_sc.interpret(module)
|
|
if mod_kee is None:
|
|
print("Error: invalid feedback module '%s'."%module)
|
|
if _raising(_self=_self): raise QuietException
|
|
else: return None
|
|
elif not is_string(mod_kee):
|
|
print("Error: ambiguous feedback module '%s'."%module)
|
|
if _raising(_self=_self): raise QuietException
|
|
else: return None
|
|
mod_int = int(getattr(fb_module,mod_kee))
|
|
if mod_int>=0:
|
|
try:
|
|
_self.lock(_self)
|
|
r = _cmd.set_feedback(_self._COb,act_int,mod_int,mask_int)
|
|
finally:
|
|
_self.unlock(r,_self)
|
|
if mod_int<=0:
|
|
if mod_int:
|
|
if act_int==0:
|
|
_self._fb_dict[mod_int] = mask_int
|
|
elif act_int==1:
|
|
_self._fb_dict[mod_int] = _self._fb_dict[mod_int] | mask_int
|
|
elif act_int==2:
|
|
_self._fb_dict[mod_int] = _self._fb_dict[mod_int] & ( 0xFF - mask_int )
|
|
else:
|
|
for mod_int in list(_self._fb_dict.keys()):
|
|
if act_int==0:
|
|
_self._fb_dict[mod_int] = mask_int
|
|
elif act_int==1:
|
|
_self._fb_dict[mod_int] = _self._fb_dict[mod_int] | mask_int
|
|
elif act_int==2:
|
|
_self._fb_dict[mod_int] = _self._fb_dict[mod_int] & ( 0xFF - mask_int )
|
|
if _feedback(fb_module.feedback,fb_mask.debugging,_self):
|
|
sys.stderr.write(" feedback: mode %d on %d mask %d\n"%(
|
|
act_int,mod_int,mask_int))
|
|
return r
|