diff --git a/demo.ipynb b/demo.ipynb index 7ac0804..f7d2194 100644 --- a/demo.ipynb +++ b/demo.ipynb @@ -183,9 +183,7 @@ "outputs": [ { "data": { - "image/png": [ - "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" - ] + "image/png": "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" }, "metadata": {}, "output_type": "display_data" @@ -213,12 +211,52 @@ "collapsed": false }, "outputs": [], + "source": [ + "!inline=1\n", + "n = 101\n", + "x = 10*DINDGEN(n)/(n-1) - 5\n", + "y = 10*DINDGEN(n)/(n-1) - 5\n", + "xx = REBIN(x, n, n)\n", + "yy = REBIN(TRANSPOSE(y), n, n)\n", + "mu = 1\n", + "xdot = mu*(xx - xx^3/3 - yy)\n", + "ydot = xx/mu\n", + " \n", + "s = JSTREAMLINE(xdot, ydot, x, y, $\n", + " ARROW_COLOR=\"Dodger blue\", $\n", + " ARROW_OFFSET=[0.25,0.5,0.75,1], $\n", + " STREAMLINE_STEPSIZE=0.05, $\n", + " POSITION=[0.1,0.22,0.95,0.9], $\n", + " X_STREAMPARTICLES=11, Y_STREAMPARTICLES=11, $\n", + " XTITLE='X', YTITLE='Y', $\n", + " TITLE='Van der Pol Oscillator - Phase Portrait')\n", + " \n", + "; Change some properties.\n", + "s.THICK = 2\n", + "s.AUTO_COLOR = 1\n", + "s.AUTO_RANGE = [0.03,0.07]\n", + "s.RGB_TABLE = 33\n", + " \n", + "; Add a colorbar.\n", + "c = COLORBAR(TARGET=s, MINOR=0, $\n", + " POSITION=[0.35,0.1,0.7,0.125], $\n", + " TITLE='Distance moved per step')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "IDL", + "language": "IDL", "name": "idl" }, "language_info": { @@ -230,4 +268,4 @@ }, "nbformat": 4, "nbformat_minor": 0 -} \ No newline at end of file +} diff --git a/idl_kernel.py b/idl_kernel.py index 4a17416..7733e6b 100644 --- a/idl_kernel.py +++ b/idl_kernel.py @@ -78,7 +78,7 @@ def _start_idl(self): finally: signal.signal(signal.SIGINT, sig) - self.idlwrapper.run_command("!quiet=1 & defsysv,'!inline',0 & !more=0".rstrip(), timeout=None) + self.idlwrapper.run_command("!quiet=1 & defsysv,'!inline',0 & defsysv, '!inline_8objs',ptr_new(!NULL) & !more=0".rstrip(), timeout=None) def do_execute(self, code, silent, store_history=True, user_expressions=None, allow_stdin=False): @@ -112,9 +112,9 @@ def do_execute(self, code, silent, store_history=True, user_expressions=None, tfile = tempfile.NamedTemporaryFile(mode='w+t',dir=os.path.expanduser("~")) plot_dir = tempfile.mkdtemp(dir=os.path.expanduser("~")) plot_format = 'png' - postcall = """ device,window_state=winds_arefgij + device,retain=2 if !inline and total(winds_arefgij) ne 0 then begin w_CcjqL6MA = where(winds_arefgij ne 0,nw_CcjqL6MA) for i_KEv8eW6E=0,nw_CcjqL6MA-1 do begin @@ -137,7 +137,16 @@ def do_execute(self, code, silent, store_history=True, user_expressions=None, write_png, outfile_c5BXq4dV, ii_rsApk4JS, r_m9QVFuGP, g_jeeyfQkN, b_mufcResT endif endfor - endif + endif + if !inline and (n_elements(*!inline_8objs) gt 0) then begin + for i_Rahch9ae=0L, n_elements(*!inline_8objs)-1 do begin + outfile_c5BXq4dV = '%(plot_dir)s/__ofig'+strtrim(i_Rahch9ae,2)+'.png' + (*(*!inline_8objs)[i_Rahch9ae]).save,outfile_c5BXq4dV + ptr_free,(*!inline_8objs)[i_Rahch9ae] + endfor + ptr_free, !inline_8objs + !inline_8objs=ptr_new(!NULL) + endif end """ % locals() @@ -145,7 +154,6 @@ def do_execute(self, code, silent, store_history=True, user_expressions=None, tfile.file.write(code.rstrip()+postcall.rstrip()) tfile.file.close() output = self.idlwrapper.run_command(".run "+tfile.name, timeout=None) - # IDL annoying prints out ".run tmp..." command this removes it if os.path.basename(self._executable) == 'idl': output = '\n'.join(output.splitlines()[1::])+'\n' diff --git a/jbarplot.pro b/jbarplot.pro new file mode 100644 index 0000000..da3e1f5 --- /dev/null +++ b/jbarplot.pro @@ -0,0 +1,10 @@ +FUNCTION jbarplot, x, y, _REF_EXTRA=e +;call the function with extra args, and have it go to the buffer rather than a window +IF N_PARAMS() eq 2 THEN p=barplot(x,y,_STRICT_EXTRA=e,/BUFFER) ELSE p=barplot(x,_STRICT_EXTRA=e,/BUFFER) +;add to the stack for writing at the end +new_pointer=ptr_new([*!inline_8objs,ptr_new(p)]) +ptr_free,!inline_8objs +!inline_8objs=new_pointer +RETURN, p +END + diff --git a/jcontour.pro b/jcontour.pro new file mode 100644 index 0000000..440018a --- /dev/null +++ b/jcontour.pro @@ -0,0 +1,14 @@ +FUNCTION jcontour, data,x, y, _REF_EXTRA=e +;call the function with extra args, and have it go to the buffer rather than a window +CASE N_PARAMS() OF +1: p=contour(data,_STRICT_EXTRA=e,/BUFFER) +2: message, 'Cannot take only 2 arguments. 1 or 3 required.' +3: p=contour(data,x,y,_STRICT_EXTRA=e,/BUFFER) +ENDCASE +;add to the stack for writing at the end +new_pointer=ptr_new([*!inline_8objs,ptr_new(p)]) +ptr_free,!inline_8objs +!inline_8objs=new_pointer +RETURN, p +END + diff --git a/jerrorplot.pro b/jerrorplot.pro new file mode 100644 index 0000000..9ccf6b9 --- /dev/null +++ b/jerrorplot.pro @@ -0,0 +1,15 @@ +FUNCTION jerrorplot, x, y, xe, ye, _REF_EXTRA=e +;call the function with extra args, and have it go to the buffer rather than a window +CASE N_PARAMS() OF +1: message, 'Insufficient arguments' +2: p=errorplot(x,y,_STRICT_EXTRA=e,/BUFFER) +3: p=errorplot(x,y,xe,_STRICT_EXTRA=e,/BUFFER) +4: p=errorplot(x,y,xe,ye,_STRICT_EXTRA=e,/BUFFER) +ENDCASE +;add to the stack for writing at the end +new_pointer=ptr_new([*!inline_8objs,ptr_new(p)]) +ptr_free,!inline_8objs +!inline_8objs=new_pointer +RETURN, p +END + diff --git a/jimage.pro b/jimage.pro new file mode 100644 index 0000000..106acfe --- /dev/null +++ b/jimage.pro @@ -0,0 +1,14 @@ +FUNCTION jimage, data,x, y, _REF_EXTRA=e +;call the function with extra args, and have it go to the buffer rather than a window +CASE N_PARAMS() OF +1: p=image(data,_STRICT_EXTRA=e,/BUFFER) +2: message, 'Cannot take only 2 arguments. 1 or 3 required.' +3: p=image(data,x,y,_STRICT_EXTRA=e,/BUFFER) +ENDCASE +;add to the stack for writing at the end +new_pointer=ptr_new([*!inline_8objs,ptr_new(p)]) +ptr_free,!inline_8objs +!inline_8objs=new_pointer +RETURN, p +END + diff --git a/jmap.pro b/jmap.pro new file mode 100644 index 0000000..65c1ef3 --- /dev/null +++ b/jmap.pro @@ -0,0 +1,10 @@ +FUNCTION jmap, m, _REF_EXTRA=e +;call the function with extra args, and have it go to the buffer rather than a window +p=map(m,_STRICT_EXTRA=e,/BUFFER) +;add to the stack for writing at the end +new_pointer=ptr_new([*!inline_8objs,ptr_new(p)]) +ptr_free,!inline_8objs +!inline_8objs=new_pointer +RETURN, p +END + diff --git a/jplot.pro b/jplot.pro new file mode 100644 index 0000000..1a4a0d0 --- /dev/null +++ b/jplot.pro @@ -0,0 +1,10 @@ +FUNCTION jplot, x, y, _REF_EXTRA=e +;call the function with extra args, and have it go to the buffer rather than a window +IF N_PARAMS() eq 2 THEN p=plot(x,y,_STRICT_EXTRA=e,/BUFFER) ELSE p=plot(x,_STRICT_EXTRA=e,/BUFFER) +;add to the stack for writing at the end +new_pointer=ptr_new([*!inline_8objs,ptr_new(p)]) +ptr_free,!inline_8objs +!inline_8objs=new_pointer +RETURN, p +END + diff --git a/jplot3d.pro b/jplot3d.pro new file mode 100644 index 0000000..b47ab97 --- /dev/null +++ b/jplot3d.pro @@ -0,0 +1,10 @@ +FUNCTION jplot3d, x, y, z, _REF_EXTRA=e +;call the function with extra args, and have it go to the buffer rather than a window +p=plot3d(x,y,z,_STRICT_EXTRA=e,/BUFFER) +;add to the stack for writing at the end +new_pointer=ptr_new([*!inline_8objs,ptr_new(p)]) +ptr_free,!inline_8objs +!inline_8objs=new_pointer +RETURN, p +END + diff --git a/jpolarplot.pro b/jpolarplot.pro new file mode 100644 index 0000000..ee093af --- /dev/null +++ b/jpolarplot.pro @@ -0,0 +1,13 @@ +FUNCTION jpolarplot, r, theta, _REF_EXTRA=e +;call the function with extra args, and have it go to the buffer rather than a window +CASE N_PARAMS() OF +1: p=polarplot(r,_STRICT_EXTRA=e,/BUFFER) +2: p=polarplot(r,theta,_STRICT_EXTRA=e,/BUFFER) +ENDCASE +;add to the stack for writing at the end +new_pointer=ptr_new([*!inline_8objs,ptr_new(p)]) +ptr_free,!inline_8objs +!inline_8objs=new_pointer +RETURN, p +END + diff --git a/jstreamline.pro b/jstreamline.pro new file mode 100644 index 0000000..1dc7bbb --- /dev/null +++ b/jstreamline.pro @@ -0,0 +1,15 @@ +FUNCTION jstreamline, u, v, x, y, _REF_EXTRA=e +;call the function with extra args, and have it go to the buffer rather than a window +CASE N_PARAMS() OF +1: message, 'Insufficient arguments' +2: p=streamline(u,v,_STRICT_EXTRA=e,/BUFFER) +3: message, 'Cannot take only 3 arguments. 2 or 4 required. +4: p=streamline(u,v,x,y,_STRICT_EXTRA=e,/BUFFER) +ENDCASE +;add to the stack for writing at the end +new_pointer=ptr_new([*!inline_8objs,ptr_new(p)]) +ptr_free,!inline_8objs +!inline_8objs=new_pointer +RETURN, p +END + diff --git a/jsurface.pro b/jsurface.pro new file mode 100644 index 0000000..77ee8e4 --- /dev/null +++ b/jsurface.pro @@ -0,0 +1,14 @@ +FUNCTION jsurface, data,x, y, _REF_EXTRA=e +;call the function with extra args, and have it go to the buffer rather than a window +CASE N_PARAMS() OF +1: p=surface(data,_STRICT_EXTRA=e,/BUFFER) +2: message, 'Cannot take only 2 arguments. 1 or 3 required.' +3: p=surface(data,x,y,_STRICT_EXTRA=e,/BUFFER) +ENDCASE +;add to the stack for writing at the end +new_pointer=ptr_new([*!inline_8objs,ptr_new(p)]) +ptr_free,!inline_8objs +!inline_8objs=new_pointer +RETURN, p +END + diff --git a/jvector.pro b/jvector.pro new file mode 100644 index 0000000..91d13ad --- /dev/null +++ b/jvector.pro @@ -0,0 +1,15 @@ +FUNCTION jvector, u, v, x, y, _REF_EXTRA=e +;call the function with extra args, and have it go to the buffer rather than a window +CASE N_PARAMS() OF +1: message, 'Insufficient arguments' +2: p=vector(u,v,_STRICT_EXTRA=e,/BUFFER) +3: message, 'Cannot take only 3 arguments. 2 or 4 required. +4: p=vector(u,v,x,y,_STRICT_EXTRA=e,/BUFFER) +ENDCASE +;add to the stack for writing at the end +new_pointer=ptr_new([*!inline_8objs,ptr_new(p)]) +ptr_free,!inline_8objs +!inline_8objs=new_pointer +RETURN, p +END + diff --git a/jwindow.pro b/jwindow.pro new file mode 100644 index 0000000..1bfcbd9 --- /dev/null +++ b/jwindow.pro @@ -0,0 +1,10 @@ +FUNCTION jwindow, _REF_EXTRA=e +;call the function with extra args, and have it go to the buffer rather than a window +p=window(_STRICT_EXTRA=e,/BUFFER) +;add to the stack for writing at the end +new_pointer=ptr_new([*!inline_8objs,ptr_new(p)]) +ptr_free,!inline_8objs +!inline_8objs=new_pointer +RETURN, p +END +