Skip to content

Commit 34cc23f

Browse files
author
David C. Lonie
committed
Store backend as a weakref.
1 parent cde4463 commit 34cc23f

File tree

8 files changed

+84
-72
lines changed

8 files changed

+84
-72
lines changed

Packages/vcs/Lib/vcsvtk/boxfillpipeline.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ def _updateScalarData(self):
3030
if self._gm.boxfill_type == "log10":
3131
data = numpy.ma.log10(data)
3232

33-
self._data1 = self._context.trimData2D(data)
34-
self._data2 = self._context.trimData2D(self._originalData2)
33+
self._data1 = self._context().trimData2D(data)
34+
self._data2 = self._context().trimData2D(self._originalData2)
3535

3636
def _updateContourLevelsAndColors(self):
3737
"""Overrides baseclass implementation."""
@@ -173,7 +173,7 @@ def _plotInternal(self):
173173

174174
# create a new renderer for this mapper
175175
# (we need one for each mapper because of cmaera flips)
176-
ren = self._context.fitToViewport(
176+
ren = self._context().fitToViewport(
177177
act, [self._template.data.x1, self._template.data.x2,
178178
self._template.data.y1, self._template.data.y2],
179179
wc=[x1, x2, y1, y2], geo=self._vtkGeoTransform,
@@ -186,9 +186,9 @@ def _plotInternal(self):
186186
z = self._originalData1.getAxis(-3)
187187
else:
188188
z = None
189-
self._resultDict.update(self._context.renderTemplate(self._template,
190-
self._data1,
191-
self._gm, t, z))
189+
self._resultDict.update(self._context().renderTemplate(self._template,
190+
self._data1,
191+
self._gm, t, z))
192192

193193
if getattr(self._gm, "legend", None) is not None:
194194
self._contourLabels = self._gm.legend
@@ -214,17 +214,18 @@ def _plotInternal(self):
214214
self._contourLevels.append(1.e20)
215215

216216
self._resultDict.update(
217-
self._context.renderColorBar(self._template, self._contourLevels,
218-
self._contourColors,
219-
self._contourLabels,
220-
self._colorMap))
217+
self._context().renderColorBar(self._template, self._contourLevels,
218+
self._contourColors,
219+
self._contourLabels,
220+
self._colorMap))
221221

222-
if self._context.canvas._continents is None:
222+
if self._context().canvas._continents is None:
223223
self._useContinents = False
224224
if self._useContinents:
225225
projection = vcs.elements["projection"][self._gm.projection]
226-
self._context.plotContinents(x1, x2, y1, y2, projection,
227-
self._dataWrapModulo, self._template)
226+
self._context().plotContinents(x1, x2, y1, y2, projection,
227+
self._dataWrapModulo,
228+
self._template)
228229

229230
def _plotInternalBoxfill(self):
230231
"""Implements the logic to render a non-custom boxfill."""

Packages/vcs/Lib/vcsvtk/isofillpipeline.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ def _plotInternal(self):
217217

218218
# create a new renderer for this mapper
219219
# (we need one for each mapper because of cmaera flips)
220-
ren = self._context.fitToViewport(
220+
ren = self._context().fitToViewport(
221221
act, [self._template.data.x1, self._template.data.x2,
222222
self._template.data.y1, self._template.data.y2],
223223
wc=[x1, x2, y1, y2], geo=self._vtkGeoTransform,
@@ -231,9 +231,9 @@ def _plotInternal(self):
231231
else:
232232
z = None
233233

234-
self._resultDict.update(self._context.renderTemplate(self._template,
235-
self._data1,
236-
self._gm, t, z))
234+
self._resultDict.update(self._context().renderTemplate(self._template,
235+
self._data1,
236+
self._gm, t, z))
237237

238238
legend = getattr(self._gm, "legend", None)
239239

@@ -258,13 +258,14 @@ def _plotInternal(self):
258258
self._contourLevels.append(1.e20)
259259

260260
self._resultDict.update(
261-
self._context.renderColorBar(self._template, self._contourLevels,
262-
self._contourColors, legend,
263-
self._colorMap))
261+
self._context().renderColorBar(self._template, self._contourLevels,
262+
self._contourColors, legend,
263+
self._colorMap))
264264

265-
if self._context.canvas._continents is None:
265+
if self._context().canvas._continents is None:
266266
self._useContinents = False
267267
if self._useContinents:
268268
projection = vcs.elements["projection"][self._gm.projection]
269-
self._context.plotContinents(x1, x2, y1, y2, projection,
270-
self._dataWrapModulo, self._template)
269+
self._context().plotContinents(x1, x2, y1, y2, projection,
270+
self._dataWrapModulo,
271+
self._template)

Packages/vcs/Lib/vcsvtk/isolinepipeline.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@ def _plotInternal(self):
8484

8585
lut = vtk.vtkLookupTable()
8686
lut.SetNumberOfTableValues(len(self._contourColors))
87-
cmap = vcs.elements["colormap"][self._context.canvas.getcolormapname()]
87+
cmap = self._context().canvas.getcolormapname()
88+
cmap = vcs.elements["colormap"][cmap]
8889
for i, col in enumerate(self._contourColors):
8990
r, g, b = cmap.index[col]
9091
lut.SetTableValue(i, r/100., g/100., b/100.)
@@ -135,14 +136,15 @@ def _plotInternal(self):
135136
tt = tt.name
136137
tprop = vtk.vtkTextProperty()
137138
vcs2vtk.prepTextProperty(tprop,
138-
self._context.renWin.GetSize(),
139+
self._context().renWin.GetSize(),
139140
to, tt)
140141
tprops.AddItem(tprop)
141142
if colorOverride is not None:
142143
del(vcs.elements["texttable"][tt])
143144
else: # No text properties specified. Use the default:
144145
tprop = vtk.vtkTextProperty()
145-
vcs2vtk.prepTextProperty(tprop, self._context.renWin.GetSize())
146+
vcs2vtk.prepTextProperty(tprop,
147+
self._context().renWin.GetSize())
146148
tprops.AddItem(tprop)
147149
self._resultDict["vtk_backend_contours_labels_text_properties"] = \
148150
tprops
@@ -203,7 +205,7 @@ def _plotInternal(self):
203205

204206
# create a new renderer for this mapper
205207
# (we need one for each mapper because of cmaera flips)
206-
ren = self._context.fitToViewport(
208+
ren = self._context().fitToViewport(
207209
act, [self._template.data.x1, self._template.data.x2,
208210
self._template.data.y1, self._template.data.y2],
209211
wc=[x1, x2, y1, y2], geo=self._vtkGeoTransform,
@@ -217,13 +219,14 @@ def _plotInternal(self):
217219
else:
218220
z = None
219221

220-
self._resultDict.update(self._context.renderTemplate(self._template,
221-
self._data1,
222-
self._gm, t, z))
222+
self._resultDict.update(self._context().renderTemplate(self._template,
223+
self._data1,
224+
self._gm, t, z))
223225

224-
if self._context.canvas._continents is None:
226+
if self._context().canvas._continents is None:
225227
self._useContinents = False
226228
if self._useContinents:
227229
projection = vcs.elements["projection"][self._gm.projection]
228-
self._context.plotContinents(x1, x2, y1, y2, projection,
229-
self._dataWrapModulo, self._template)
230+
self._context().plotContinents(x1, x2, y1, y2, projection,
231+
self._dataWrapModulo,
232+
self._template)

Packages/vcs/Lib/vcsvtk/meshfillpipeline.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def __init__(self, context_):
1616
def _updateScalarData(self):
1717
"""Overrides baseclass implementation."""
1818
# We don't trim _data2 for meshfill:
19-
self._data1 = self._context.trimData2D(self._originalData1)
19+
self._data1 = self._context().trimData2D(self._originalData1)
2020
self._data2 = self._originalData2
2121

2222
def _updateContourLevelsAndColors(self):
@@ -239,7 +239,7 @@ def _plotInternal(self):
239239

240240
# create a new renderer for this mapper
241241
# (we need one for each mapper because of cmaera flips)
242-
ren = self._context.fitToViewport(
242+
ren = self._context().fitToViewport(
243243
act, [self._template.data.x1,
244244
self._template.data.x2,
245245
self._template.data.y1,
@@ -249,8 +249,8 @@ def _plotInternal(self):
249249

250250
self._resultDict["vtk_backend_actors"] = actors
251251

252-
self._template.plot(self._context.canvas, self._data1, self._gm,
253-
bg=self._context.bg,
252+
self._template.plot(self._context().canvas, self._data1, self._gm,
253+
bg=self._context().bg,
254254
X=numpy.arange(self._vtkDataSetBounds[0],
255255
self._vtkDataSetBounds[1] * 1.1,
256256
(self._vtkDataSetBounds[1] -
@@ -283,13 +283,14 @@ def _plotInternal(self):
283283
self._contourLevels.append(1.e20)
284284

285285
self._resultDict.update(
286-
self._context.renderColorBar(self._template, self._contourLevels,
287-
self._contourColors, legend,
288-
self._colorMap))
286+
self._context().renderColorBar(self._template, self._contourLevels,
287+
self._contourColors, legend,
288+
self._colorMap))
289289

290-
if self._context.canvas._continents is None:
290+
if self._context().canvas._continents is None:
291291
self._useContinents = False
292292
if self._useContinents:
293293
projection = vcs.elements["projection"][self._gm.projection]
294-
self._context.plotContinents(x1, x2, y1, y2, projection,
295-
self._dataWrapModulo, self._template)
294+
self._context().plotContinents(x1, x2, y1, y2, projection,
295+
self._dataWrapModulo,
296+
self._template)

Packages/vcs/Lib/vcsvtk/pipeline.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import weakref
2+
3+
14
class Pipeline(object):
25
"""Base class for a VTK pipeline implementation of a VCS plot command.
36
@@ -8,9 +11,10 @@ class Pipeline(object):
811
def __init__(self, context_):
912
"""Initialize the pipeline object.
1013
11-
context is the VTKVCSBackend object that created this Pipeline.
14+
_context is a weakref of the VTKVCSBackend object that created this
15+
Pipeline.
1216
"""
13-
self._context = context_
17+
self._context = weakref.ref(context_)
1418

1519
# For now, we'll just throw everything at plot. This might need to be
1620
# broken up into set_data, set_template, etc methods...

Packages/vcs/Lib/vcsvtk/pipeline1d.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ def __init__(self, context_):
1212

1313
def plot(self, data1, data2, tmpl, gm, grid, transform):
1414
"""Overrides baseclass implementation."""
15-
Y = self._context.trimData1D(data1)
15+
Y = self._context().trimData1D(data1)
1616
if data2 is None:
1717
X = Y.getAxis(0)
1818
else:
1919
X = Y
2020
data1._yname = data2.id
21-
Y = self._context.trimData1D(data2)
21+
Y = self._context().trimData1D(data2)
2222

2323
if gm.flip:
2424
tmp = Y
@@ -28,7 +28,7 @@ def plot(self, data1, data2, tmpl, gm, grid, transform):
2828
if gm.smooth is not None:
2929
Y = smooth(Y, gm.smooth)
3030

31-
l = self._context.canvas.createline()
31+
l = self._context().canvas.createline()
3232
Xs = X[:].tolist()
3333
Ys = Y[:].tolist()
3434
xs = []
@@ -72,7 +72,7 @@ def plot(self, data1, data2, tmpl, gm, grid, transform):
7272
x2 += .0001
7373
l._worldcoordinate = [x1, x2, y1, y2]
7474
if gm.marker is not None:
75-
m = self._context.canvas.createmarker()
75+
m = self._context().canvas.createmarker()
7676
m.type = gm.marker
7777
m.color = gm.markercolor
7878
if gm.markersize > 0:
@@ -87,13 +87,13 @@ def plot(self, data1, data2, tmpl, gm, grid, transform):
8787
if not (Y[:].min() > max(y1, y2) or Y[:].max() < min(y1, y2) or
8888
X[:].min() > max(x1, x2) or X[:].max() < min(x1, x2)):
8989
if l.priority > 0:
90-
self._context.canvas.plot(l, donotstoredisplay=True)
90+
self._context().canvas.plot(l, donotstoredisplay=True)
9191
if gm.marker is not None and m.priority > 0:
92-
self._context.canvas.plot(m, donotstoredisplay=True)
92+
self._context().canvas.plot(m, donotstoredisplay=True)
9393

94-
ren2 = self._context.createRenderer()
95-
self._context.renWin.AddRenderer(ren2)
96-
tmpl.plot(self._context.canvas, data1, gm, bg=self._context.bg,
94+
ren2 = self._context().createRenderer()
95+
self._context().renWin.AddRenderer(ren2)
96+
tmpl.plot(self._context().canvas, data1, gm, bg=self._context().bg,
9797
renderer=ren2, X=X, Y=Y)
9898
if hasattr(data1, "_yname"):
9999
del(data1._yname)
@@ -102,23 +102,23 @@ def plot(self, data1, data2, tmpl, gm, grid, transform):
102102
del(vcs.elements["marker"][m.name])
103103

104104
if tmpl.legend.priority > 0:
105-
legd = self._context.canvas.createline()
105+
legd = self._context().canvas.createline()
106106
legd.x = [tmpl.legend.x1, tmpl.legend.x2]
107107
legd.y = [tmpl.legend.y1, tmpl.legend.y1] # [y1, y1] intentional.
108108
legd.color = l.color
109109
legd.width = l.width
110110
legd.type = l.type
111-
t = self._context.canvas.createtext(
111+
t = self._context().canvas.createtext(
112112
To_source=tmpl.legend.textorientation,
113113
Tt_source=tmpl.legend.texttable)
114114
t.x = tmpl.legend.x2
115115
t.y = tmpl.legend.y2
116116
t.string = data1.id
117-
self._context.canvas.plot(t, donotstoredisplay=True)
117+
self._context().canvas.plot(t, donotstoredisplay=True)
118118
sp = t.name.split(":::")
119119
del(vcs.elements["texttable"][sp[0]])
120120
del(vcs.elements["textorientation"][sp[1]])
121121
del(vcs.elements["textcombined"][t.name])
122-
self._context.canvas.plot(legd, donotstoredisplay=True)
122+
self._context().canvas.plot(legd, donotstoredisplay=True)
123123
del(vcs.elements["line"][legd.name])
124124
return {}

Packages/vcs/Lib/vcsvtk/pipeline2d.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ def plot(self, data1, data2, tmpl, gm, grid, transform):
128128
self._vtkDataSet = grid
129129
self._vtkGeoTransform = transform
130130
self._colorMap = \
131-
vcs.elements["colormap"][self._context.canvas.getcolormapname()]
131+
vcs.elements["colormap"][self._context().canvas.getcolormapname()]
132132

133133
# Preprocess the input scalar data:
134134
self._updateScalarData()
@@ -158,8 +158,8 @@ def plot(self, data1, data2, tmpl, gm, grid, transform):
158158

159159
def _updateScalarData(self):
160160
"""Overrides baseclass implementation."""
161-
self._data1 = self._context.trimData2D(self._originalData1)
162-
self._data2 = self._context.trimData2D(self._originalData2)
161+
self._data1 = self._context().trimData2D(self._originalData1)
162+
self._data2 = self._context().trimData2D(self._originalData2)
163163

164164
def _updateVTKDataSet(self):
165165
"""Overrides baseclass implementation."""

Packages/vcs/Lib/vcsvtk/vectorpipeline.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ def plot(self, data1, data2, tmpl, gm, grid, transform):
2121
else:
2222
zaxis = None
2323

24-
data1 = self._context.trimData2D(data1) # Ok get3 only the last 2 dims
25-
data2 = self._context.trimData2D(data2)
24+
# Ok get3 only the last 2 dims
25+
data1 = self._context().trimData2D(data1)
26+
data2 = self._context().trimData2D(data2)
2627

2728
gridGenDict = vcs2vtk.genGridOnPoints(data1, gm, deep=False, grid=grid,
2829
geo=transform)
@@ -90,28 +91,29 @@ def plot(self, data1, data2, tmpl, gm, grid, transform):
9091
act = vtk.vtkActor()
9192
act.SetMapper(mapper)
9293

93-
cmap = vcs.elements["colormap"][self._context.canvas.getcolormapname()]
94+
cmap = self._context().canvas.getcolormapname()
95+
cmap = vcs.elements["colormap"][cmap]
9496
r, g, b = cmap.index[lcolor]
9597
act.GetProperty().SetColor(r / 100., g / 100., b / 100.)
9698

9799
x1, x2, y1, y2 = vcs.utils.getworldcoordinates(gm, data1.getAxis(-1),
98100
data1.getAxis(-2))
99101

100102
act = vcs2vtk.doWrap(act, [x1, x2, y1, y2], wrap)
101-
ren = self._context.fitToViewport(act, [tmpl.data.x1, tmpl.data.x2,
102-
tmpl.data.y1, tmpl.data.y2],
103-
[x1, x2, y1, y2],
104-
priority=tmpl.data.priority)
103+
ren = self._context().fitToViewport(act, [tmpl.data.x1, tmpl.data.x2,
104+
tmpl.data.y1, tmpl.data.y2],
105+
[x1, x2, y1, y2],
106+
priority=tmpl.data.priority)
105107

106108
returned.update(
107-
self._context.renderTemplate(tmpl, data1, gm, taxis, zaxis))
109+
self._context().renderTemplate(tmpl, data1, gm, taxis, zaxis))
108110

109-
if self._context.canvas._continents is None:
111+
if self._context().canvas._continents is None:
110112
continents = False
111113
if continents:
112114
projection = vcs.elements["projection"][gm.projection]
113-
self._context.plotContinents(x1, x2, y1, y2, projection, wrap,
114-
tmpl)
115+
self._context().plotContinents(x1, x2, y1, y2, projection, wrap,
116+
tmpl)
115117

116118
returned["vtk_backend_actors"] = [[act, [x1, x2, y1, y2]]]
117119
returned["vtk_backend_glyphfilters"] = [glyphFilter]

0 commit comments

Comments
 (0)