py3dmol improvements

Don't use the CDN minified URL (it is broken for surfaces).
Inspired by Issue #645 add print_to_console function prefix.
This commit is contained in:
David Koes
2023-02-10 14:40:00 -05:00
parent f460f727e7
commit 57bcb83e99
5 changed files with 716 additions and 541 deletions

File diff suppressed because one or more lines are too long

View File

@@ -33,23 +33,52 @@
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"/home/dkoes/git/3Dmol.js/py3Dmol/build/lib\n"
]
}
],
"source": [
"cd build/lib"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"application/3dmoljs_load.v0": "<div id=\"3dmolviewer_15219945140\" style=\"position: relative; width: 640px; height: 480px\">\n<script>\n\nvar loadScriptAsync = function(uri){\n return new Promise((resolve, reject) => {\n var tag = document.createElement('script');\n tag.src = uri;\n tag.async = true;\n tag.onload = () => {\n resolve();\n };\n var firstScriptTag = document.getElementsByTagName('script')[0];\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n});\n};\n\nif(typeof $3Dmolpromise === 'undefined') {\n$3Dmolpromise = null;\n $3Dmolpromise = loadScriptAsync('https://3dmol.csb.pitt.edu/build/3Dmol.js');\n}\n\nvar viewer_15219945140 = null;\n$3Dmolpromise.then(function() {\nviewer_15219945140 = $3Dmol.createViewer($(\"#3dmolviewer_15219945140\"),{backgroundColor:\"white\"});\n\tviewer_15219945140.addModel(\"\\n RDKit 3D\\n\\n 6 6 0 0 0 0 0 0 0 0999 V2000\\n -0.9517 0.7811 -0.6622 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.2847 1.3329 -0.3121 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.2365 0.5518 0.3512 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.9517 -0.7811 0.6644 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.2847 -1.3329 0.3144 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.2365 -0.5518 -0.3489 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 1 1 0\\nM END\\n$$$$\",\"sdf\");\n\tviewer_15219945140.setStyle({\"stick\": {}});\n\tviewer_15219945140.zoomTo();\nviewer_15219945140.render();\n});\n</script><script>$(\"#left\").append($(\"#3dmolviewer_15219945140\")); </script>",
"application/3dmoljs_load.v0": "<div id=\"3dmolviewer_1676050474639691\" style=\"position: relative; width: 640px; height: 480px\">\n <p id=\"3dmolwarning_1676050474639691\" style=\"background-color:#ffcccc;color:black\">You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension: <br>\n <tt>jupyter labextension install jupyterlab_3dmol</tt></p>\n </div>\n<script>\n\nvar loadScriptAsync = function(uri){\n return new Promise((resolve, reject) => {\n //this is to ignore the existence of requirejs amd\n var savedexports, savedmodule;\n if (typeof exports !== 'undefined') savedexports = exports;\n else exports = {}\n if (typeof module !== 'undefined') savedmodule = module;\n else module = {}\n\n var tag = document.createElement('script');\n tag.src = uri;\n tag.async = true;\n tag.onload = () => {\n exports = savedexports;\n module = savedmodule;\n resolve();\n };\n var firstScriptTag = document.getElementsByTagName('script')[0];\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n});\n};\n\nif(typeof $3Dmolpromise === 'undefined') {\n$3Dmolpromise = null;\n $3Dmolpromise = loadScriptAsync('https://cdnjs.cloudflare.com/ajax/libs/3Dmol/2.0.1/3Dmol-min.min.js');\n}\n\nvar viewer_1676050474639691 = null;\nvar warn = document.getElementById(\"3dmolwarning_1676050474639691\");\nif(warn) {\n warn.parentNode.removeChild(warn);\n}\n$3Dmolpromise.then(function() {\nviewer_1676050474639691 = $3Dmol.createViewer(document.getElementById(\"3dmolviewer_1676050474639691\"),{backgroundColor:\"white\"});\nviewer_1676050474639691.zoomTo();\n\tviewer_1676050474639691.addModel([\"\\n RDKit 3D\\n\\n 6 6 0 0 0 0 0 0 0 0999 V2000\\n -0.9517 0.7811 -0.6622 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.2847 1.3329 -0.3121 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.2365 0.5518 0.3512 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.9517 -0.7811 0.6644 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.2847 -1.3329 0.3144 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.2365 -0.5518 -0.3489 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 1 1 0\\nM END\\n$$$$\", \"sdf\"],{});\n\tviewer_1676050474639691.setStyle([{\"stick\": {}}],{});\n\tviewer_1676050474639691.zoomTo([],{});\nviewer_1676050474639691.render();\n});\n</script><script>document.getElementById(\"left\").append(document.getElementById(\"3dmolviewer_1676050474639691\")); </script>",
"text/html": [
"<div id=\"3dmolviewer_15219945140\" style=\"position: relative; width: 640px; height: 480px\">\n",
"<div id=\"3dmolviewer_1676050474639691\" style=\"position: relative; width: 640px; height: 480px\">\n",
" <p id=\"3dmolwarning_1676050474639691\" style=\"background-color:#ffcccc;color:black\">You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension: <br>\n",
" <tt>jupyter labextension install jupyterlab_3dmol</tt></p>\n",
" </div>\n",
"<script>\n",
"\n",
"var loadScriptAsync = function(uri){\n",
" return new Promise((resolve, reject) => {\n",
" //this is to ignore the existence of requirejs amd\n",
" var savedexports, savedmodule;\n",
" if (typeof exports !== 'undefined') savedexports = exports;\n",
" else exports = {}\n",
" if (typeof module !== 'undefined') savedmodule = module;\n",
" else module = {}\n",
"\n",
" var tag = document.createElement('script');\n",
" tag.src = uri;\n",
" tag.async = true;\n",
" tag.onload = () => {\n",
" resolve();\n",
" exports = savedexports;\n",
" module = savedmodule;\n",
" resolve();\n",
" };\n",
" var firstScriptTag = document.getElementsByTagName('script')[0];\n",
" firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n",
@@ -58,18 +87,23 @@
"\n",
"if(typeof $3Dmolpromise === 'undefined') {\n",
"$3Dmolpromise = null;\n",
" $3Dmolpromise = loadScriptAsync('https://3dmol.csb.pitt.edu/build/3Dmol.js');\n",
" $3Dmolpromise = loadScriptAsync('https://cdnjs.cloudflare.com/ajax/libs/3Dmol/2.0.1/3Dmol-min.min.js');\n",
"}\n",
"\n",
"var viewer_15219945140 = null;\n",
"var viewer_1676050474639691 = null;\n",
"var warn = document.getElementById(\"3dmolwarning_1676050474639691\");\n",
"if(warn) {\n",
" warn.parentNode.removeChild(warn);\n",
"}\n",
"$3Dmolpromise.then(function() {\n",
"viewer_15219945140 = $3Dmol.createViewer($(\"#3dmolviewer_15219945140\"),{backgroundColor:\"white\"});\n",
"\tviewer_15219945140.addModel(\"\\n RDKit 3D\\n\\n 6 6 0 0 0 0 0 0 0 0999 V2000\\n -0.9517 0.7811 -0.6622 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.2847 1.3329 -0.3121 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.2365 0.5518 0.3512 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.9517 -0.7811 0.6644 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.2847 -1.3329 0.3144 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.2365 -0.5518 -0.3489 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 1 1 0\\nM END\\n$$$$\",\"sdf\");\n",
"\tviewer_15219945140.setStyle({\"stick\": {}});\n",
"\tviewer_15219945140.zoomTo();\n",
"viewer_15219945140.render();\n",
"viewer_1676050474639691 = $3Dmol.createViewer(document.getElementById(\"3dmolviewer_1676050474639691\"),{backgroundColor:\"white\"});\n",
"viewer_1676050474639691.zoomTo();\n",
"\tviewer_1676050474639691.addModel([\"\\n RDKit 3D\\n\\n 6 6 0 0 0 0 0 0 0 0999 V2000\\n -0.9517 0.7811 -0.6622 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.2847 1.3329 -0.3121 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.2365 0.5518 0.3512 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.9517 -0.7811 0.6644 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.2847 -1.3329 0.3144 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.2365 -0.5518 -0.3489 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 1 1 0\\nM END\\n$$$$\", \"sdf\"],{});\n",
"\tviewer_1676050474639691.setStyle([{\"stick\": {}}],{});\n",
"\tviewer_1676050474639691.zoomTo([],{});\n",
"viewer_1676050474639691.render();\n",
"});\n",
"</script><script>$(\"#left\").append($(\"#3dmolviewer_15219945140\")); </script>"
"</script><script>document.getElementById(\"left\").append(document.getElementById(\"3dmolviewer_1676050474639691\")); </script>"
]
},
"metadata": {},
@@ -106,10 +140,32 @@
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": []
"source": [
"import py3Dmol\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"u'/home/dkoes/git/3Dmol.js/py3Dmol'"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pwd"
]
},
{
"cell_type": "code",
@@ -121,21 +177,21 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python2"
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.14"
"pygments_lexer": "ipython3",
"version": "3.10.6"
}
},
"nbformat": 4,

File diff suppressed because one or more lines are too long

View File

@@ -53,7 +53,7 @@ class view(object):
the exception that the functions all return None.
http://3dmol.org/doc/GLViewer.html
'''
def __init__(self,query='',width=640,height=480,viewergrid=None,data=None,style=None,linked=True,options=dict(),js='https://cdnjs.cloudflare.com/ajax/libs/3Dmol/2.0.1/3Dmol-min.min.js'):
def __init__(self,query='',width=640,height=480,viewergrid=None,data=None,style=None,linked=True,options=dict(),js='https://cdnjs.cloudflare.com/ajax/libs/3Dmol/2.0.1/3Dmol-min.js'):
'''Create a 3Dmol.js view.
width -- width in pixels of container
height -- height in pixels of container
@@ -281,35 +281,47 @@ if(warn) {
if name.startswith('_') or name == 'getdoc': #object to ipython canary functions
raise AttributeError("%r object has no attribute %r" % (self.__class__, name))
print_result = False
if name.startswith('print_to_console_'):
print_result = True
name = name[17:]
def makejs(*args,**kwargs):
def make_viewer_cmd(vname, name, *args, **kwargs):
cmd = '\t'
if print_result:
cmd += 'console.log('
cmd += f'{vname}.{name}('
for arg in args:
cmd += '%s,' % tostr(arg)
cmd = cmd.rstrip(',')
if print_result:
cmd += ')'
cmd += ');\n'
return cmd
if self.viewergrid:
if kwargs and 'viewer' in kwargs:
coords = kwargs['viewer']
if len(coords) != 2 or coords[0] >= self.viewergrid[0] or coords[1] >= self.viewergrid[1] or coords[0] < 0 or coords[1] < 0:
raise ValueError("Incorrectly formated viewer argument. Must specify row and column",self.viewergrid)
cmd = '\tviewergrid_UNIQUEID[%d][%d].%s(' % (coords[0],coords[1],name);
for arg in args:
cmd += '%s,' % tostr(arg)
cmd = cmd.rstrip(',')
cmd += ');\n';
cmd = make_viewer_cmd('viewergrid_UNIQUEID[%d][%d]'%(coords[0],coords[1]),name,*args,**kwargs)
else: #apply to every viewer
cmd = ''
for r in range(self.viewergrid[0]):
for c in range(self.viewergrid[1]):
cmd += '\tviewergrid_UNIQUEID[%d][%d].%s(' % (r,c,name);
for arg in args:
cmd += '%s,' % tostr(arg)
cmd = cmd.rstrip(',')
cmd += ');\n';
cmd += make_viewer_cmd('viewergrid_UNIQUEID[%d][%d]'%(r,c),name,*args,**kwargs)
else:
cmd = '\tviewer_UNIQUEID.%s(' % name;
for arg in args:
cmd += '%s,' % tostr(arg)
cmd = cmd.rstrip(',')
cmd += ');\n';
cmd = make_viewer_cmd('viewer_UNIQUEID',name,*args,**kwargs)
self.startjs += cmd
self.updatejs += cmd
return self
if print_result:
self.update()
return "Inspect the JavaScript console for your requested result."
else:
return self
return makejs