Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 42 additions & 4 deletions demo.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -183,9 +183,7 @@
"outputs": [
{
"data": {
"image/png": [
"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"
]
"image/png": "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"
},
"metadata": {},
"output_type": "display_data"
Expand Down Expand Up @@ -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": {
Expand All @@ -230,4 +268,4 @@
},
"nbformat": 4,
"nbformat_minor": 0
}
}
16 changes: 12 additions & 4 deletions idl_kernel.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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
Expand All @@ -137,15 +137,23 @@ 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()

try:
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'
Expand Down
10 changes: 10 additions & 0 deletions jbarplot.pro
Original file line number Diff line number Diff line change
@@ -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

14 changes: 14 additions & 0 deletions jcontour.pro
Original file line number Diff line number Diff line change
@@ -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

15 changes: 15 additions & 0 deletions jerrorplot.pro
Original file line number Diff line number Diff line change
@@ -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

14 changes: 14 additions & 0 deletions jimage.pro
Original file line number Diff line number Diff line change
@@ -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

10 changes: 10 additions & 0 deletions jmap.pro
Original file line number Diff line number Diff line change
@@ -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

10 changes: 10 additions & 0 deletions jplot.pro
Original file line number Diff line number Diff line change
@@ -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

10 changes: 10 additions & 0 deletions jplot3d.pro
Original file line number Diff line number Diff line change
@@ -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

13 changes: 13 additions & 0 deletions jpolarplot.pro
Original file line number Diff line number Diff line change
@@ -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

15 changes: 15 additions & 0 deletions jstreamline.pro
Original file line number Diff line number Diff line change
@@ -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

14 changes: 14 additions & 0 deletions jsurface.pro
Original file line number Diff line number Diff line change
@@ -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

Loading