Skip to content

Commit cf99af4

Browse files
danlipsadoutriaux1
authored andcommitted
BUG #26: If masking reduces the bounds of a dataset, plots look incomplete. (#27)
We use 'vtk_dataset_bounds_no_mask', the dataset bounds before masking instead of the dataset bounds for fitToViewport.
1 parent 91a9501 commit cf99af4

File tree

8 files changed

+39
-27
lines changed

8 files changed

+39
-27
lines changed

vcs/VTKPlots.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ def __init__(self, canvas, renWin=None, debug=False, bg=None, geometry=None):
5959
# the same as vcs.utils.getworldcoordinates for now. getworldcoordinates uses
6060
# gm.datawc_... or, if that is not set, it uses data axis margins (without bounds).
6161
'plotting_dataset_bounds',
62+
# dataset bounds before masking
63+
'vtk_dataset_bounds_no_mask',
6264
'renderer',
6365
'vtk_backend_grid',
6466
# vtkGeoTransform used for geographic transformation
@@ -596,8 +598,9 @@ def plot(self, data1, data2, template, gtype, gname, bg, *args, **kargs):
596598
ren = kargs["renderer"]
597599

598600
vtk_backend_grid = kargs.get("vtk_backend_grid", None)
601+
vtk_dataset_bounds_no_mask = kargs.get("vtk_dataset_bounds_no_mask", None)
599602
vtk_backend_geo = kargs.get("vtk_backend_geo", None)
600-
bounds = vtk_backend_grid.GetBounds() if vtk_backend_grid else None
603+
bounds = vtk_dataset_bounds_no_mask if vtk_dataset_bounds_no_mask else None
601604

602605
pipeline = vcsvtk.createPipeline(gm, self)
603606
if pipeline is not None:
@@ -802,11 +805,11 @@ def plotContinents(self, wc, projection, wrap, vp, priority, **kargs):
802805

803806
# Stippling
804807
vcs2vtk.stippleLine(line_prop, contLine.type[0])
805-
vtk_backend_grid = kargs.get("vtk_backend_grid", None)
808+
vtk_dataset_bounds_no_mask = kargs.get("vtk_dataset_bounds_no_mask", None)
806809
return self.fitToViewport(contActor,
807810
vp,
808811
wc=wc, geo=geo,
809-
geoBounds=vtk_backend_grid.GetBounds(),
812+
geoBounds=vtk_dataset_bounds_no_mask,
810813
priority=priority,
811814
create_renderer=True)
812815

vcs/vcs2vtk.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,8 @@ def removeHiddenPoints(grid):
267267
if (vectorNorm < minVectorNorm):
268268
minVector = vector
269269
minVectorNorm = vectorNorm
270+
hiddenScalars = False
271+
hiddenVectors = False
270272
for i in range(pts.GetNumberOfPoints()):
271273
if (ghost.GetValue(i) & vtk.vtkDataSetAttributes.HIDDENPOINT):
272274
cells = vtk.vtkIdList()
@@ -277,9 +279,16 @@ def removeHiddenPoints(grid):
277279
# hidden points are not removed. This causes problems
278280
# because it changes the scalar range.
279281
if(scalars):
282+
hiddenScalars = True
280283
scalars.SetValue(i, minScalar)
281284
if(vectors):
285+
hiddenVectors = True
282286
vectors.SetTypedTuple(i, minVector)
287+
# SetValue does not call modified - we'll have to call it after all calls.
288+
if (hiddenScalars):
289+
scalars.Modified()
290+
if (hiddenVectors):
291+
vectors.Modified()
283292
# ensure that GLOBALIDS are copied
284293
attributes = grid.GetCellData()
285294
attributes.SetActiveAttribute(-1, attributes.GLOBALIDS)

vcs/vcsvtk/boxfillpipeline.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ def _plotInternal(self):
119119
# (we need one for each mapper because of camera flips)
120120
dataset_renderer, xScale, yScale = self._context().fitToViewport(
121121
act, vp,
122-
wc=plotting_dataset_bounds, geoBounds=self._vtkDataSet.GetBounds(),
122+
wc=plotting_dataset_bounds, geoBounds=self._vtkDataSetBoundsNoMask,
123123
geo=self._vtkGeoTransform,
124124
priority=self._template.data.priority,
125125
create_renderer=(dataset_renderer is None))
@@ -130,7 +130,7 @@ def _plotInternal(self):
130130
# why so sticking to many mappers
131131
self._context().fitToViewport(
132132
act, vp,
133-
wc=plotting_dataset_bounds, geoBounds=self._vtkDataSet.GetBounds(),
133+
wc=plotting_dataset_bounds, geoBounds=self._vtkDataSetBoundsNoMask,
134134
geo=self._vtkGeoTransform,
135135
priority=self._template.data.priority,
136136
create_renderer=True)
@@ -146,6 +146,7 @@ def _plotInternal(self):
146146
kwargs = {"vtk_backend_grid": self._vtkDataSet,
147147
"dataset_bounds": self._vtkDataSetBounds,
148148
"plotting_dataset_bounds": plotting_dataset_bounds,
149+
"vtk_dataset_bounds_no_mask": self._vtkDataSetBoundsNoMask,
149150
"vtk_backend_geo": self._vtkGeoTransform}
150151
if ("ratio_autot_viewport" in self._resultDict):
151152
kwargs["ratio_autot_viewport"] = vp
@@ -200,9 +201,7 @@ def _plotInternal(self):
200201
continents_renderer, xScale, yScale = self._context().plotContinents(
201202
plotting_dataset_bounds, projection,
202203
self._dataWrapModulo,
203-
vp, self._template.data.priority,
204-
vtk_backend_grid=self._vtkDataSet,
205-
dataset_bounds=self._vtkDataSetBounds)
204+
vp, self._template.data.priority, **kwargs)
206205

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

vcs/vcsvtk/isofillpipeline.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -153,14 +153,14 @@ def _plotInternal(self):
153153
# (we need one for each mapper because of cmaera flips)
154154
dataset_renderer, xScale, yScale = self._context().fitToViewport(
155155
act, vp,
156-
wc=plotting_dataset_bounds, geoBounds=self._vtkDataSet.GetBounds(),
156+
wc=plotting_dataset_bounds, geoBounds=self._vtkDataSetBoundsNoMask,
157157
geo=self._vtkGeoTransform,
158158
priority=self._template.data.priority,
159159
create_renderer=(mapper is self._maskedDataMapper or dataset_renderer is None))
160160
for act in patternActors:
161161
self._context().fitToViewport(
162162
act, vp,
163-
wc=plotting_dataset_bounds, geoBounds=self._vtkDataSet.GetBounds(),
163+
wc=plotting_dataset_bounds, geoBounds=self._vtkDataSetBoundsNoMask,
164164
geo=self._vtkGeoTransform,
165165
priority=self._template.data.priority,
166166
create_renderer=True)
@@ -176,6 +176,7 @@ def _plotInternal(self):
176176
kwargs = {"vtk_backend_grid": self._vtkDataSet,
177177
"dataset_bounds": self._vtkDataSetBounds,
178178
"plotting_dataset_bounds": plotting_dataset_bounds,
179+
"vtk_dataset_bounds_no_mask": self._vtkDataSetBoundsNoMask,
179180
"vtk_backend_geo": self._vtkGeoTransform}
180181
if ("ratio_autot_viewport" in self._resultDict):
181182
kwargs["ratio_autot_viewport"] = vp
@@ -221,6 +222,4 @@ def _plotInternal(self):
221222
continents_renderer, xScale, yScale = self._context().plotContinents(
222223
plotting_dataset_bounds, projection,
223224
self._dataWrapModulo,
224-
vp, self._template.data.priority,
225-
vtk_backend_grid=self._vtkDataSet,
226-
dataset_bounds=self._vtkDataSetBounds)
225+
vp, self._template.data.priority, **kwargs)

vcs/vcsvtk/isolinepipeline.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ def _plotInternal(self):
257257
# (we need one for each mapper because of cmaera flips)
258258
dataset_renderer, xScale, yScale = self._context().fitToViewport(
259259
act, vp,
260-
wc=plotting_dataset_bounds, geoBounds=self._vtkDataSet.GetBounds(),
260+
wc=plotting_dataset_bounds, geoBounds=self._vtkDataSetBoundsNoMask,
261261
geo=self._vtkGeoTransform,
262262
priority=self._template.data.priority,
263263
create_renderer=(dataset_renderer is None))
@@ -283,7 +283,7 @@ def _plotInternal(self):
283283
# (we need one for each mapper because of cmaera flips)
284284
self._context().fitToViewport(
285285
act, vp,
286-
wc=plotting_dataset_bounds, geoBounds=self._vtkDataSet.GetBounds(),
286+
wc=plotting_dataset_bounds, geoBounds=self._vtkDataSetBoundsNoMask,
287287
geo=self._vtkGeoTransform,
288288
priority=self._template.data.priority,
289289
create_renderer=True)
@@ -298,6 +298,7 @@ def _plotInternal(self):
298298
kwargs = {"vtk_backend_grid": self._vtkDataSet,
299299
"dataset_bounds": self._vtkDataSetBounds,
300300
"plotting_dataset_bounds": plotting_dataset_bounds,
301+
"vtk_dataset_bounds_no_mask": self._vtkDataSetBoundsNoMask,
301302
"vtk_backend_geo": self._vtkGeoTransform}
302303
if ("ratio_autot_viewport" in self._resultDict):
303304
kwargs["ratio_autot_viewport"] = vp
@@ -313,6 +314,4 @@ def _plotInternal(self):
313314
continents_renderer, xScale, yScale = self._context().plotContinents(
314315
plotting_dataset_bounds, projection,
315316
self._dataWrapModulo,
316-
vp, self._template.data.priority,
317-
vtk_backend_grid=self._vtkDataSet,
318-
dataset_bounds=self._vtkDataSetBounds)
317+
vp, self._template.data.priority, **kwargs)

vcs/vcsvtk/meshfillpipeline.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ def _plotInternal(self):
185185
# (we need one for each mapper because of cmaera flips)
186186
dataset_renderer, xScale, yScale = self._context().fitToViewport(
187187
act, vp,
188-
wc=plotting_dataset_bounds, geoBounds=self._vtkDataSet.GetBounds(),
188+
wc=plotting_dataset_bounds, geoBounds=self._vtkDataSetBoundsNoMask,
189189
geo=self._vtkGeoTransform,
190190
priority=self._template.data.priority,
191191
create_renderer=(dataset_renderer is None))
@@ -195,7 +195,7 @@ def _plotInternal(self):
195195
# why so sticking to many mappers
196196
self._context().fitToViewport(
197197
act, vp,
198-
wc=plotting_dataset_bounds, geoBounds=self._vtkDataSet.GetBounds(),
198+
wc=plotting_dataset_bounds, geoBounds=self._vtkDataSetBoundsNoMask,
199199
geo=self._vtkGeoTransform,
200200
priority=self._template.data.priority,
201201
create_renderer=True)
@@ -210,6 +210,7 @@ def _plotInternal(self):
210210
kwargs = {"vtk_backend_grid": self._vtkDataSet,
211211
"dataset_bounds": self._vtkDataSetBounds,
212212
"plotting_dataset_bounds": plotting_dataset_bounds,
213+
"vtk_dataset_bounds_no_mask": self._vtkDataSetBoundsNoMask,
213214
"vtk_backend_geo": self._vtkGeoTransform}
214215
if ("ratio_autot_viewport" in self._resultDict):
215216
kwargs["ratio_autot_viewport"] = vp
@@ -265,9 +266,7 @@ def _plotInternal(self):
265266
continents_renderer, xScale, yScale = self._context().plotContinents(
266267
plotting_dataset_bounds, projection,
267268
self._dataWrapModulo,
268-
vp, self._template.data.priority,
269-
vtk_backend_grid=self._vtkDataSet,
270-
dataset_bounds=self._vtkDataSetBounds)
269+
vp, self._template.data.priority, **kwargs)
271270

272271
def getPlottingBounds(self):
273272
"""gm.datawc if it is set or dataset_bounds

vcs/vcsvtk/pipeline2d.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ class IPipeline2D(Pipeline):
4040
pipeline.
4141
- _vtkDataSetBounds: The bounds of _vtkDataSet, in lon/lat space, as
4242
tuple(float xMin, float xMax, float yMin, float yMax)
43+
- _vtkDataSetBoundsNoMask : The bounds of _vtkDataSet in Cartesian space
44+
before masking. These are used instead of the dataset bounds
45+
because masking can change the dataset bounds which results in a dataset
46+
that looks incomplete.
4347
- _vtkPolyDataFilter: A vtkAlgorithm that produces a polydata
4448
representation of the data.
4549
- _colorMap: The vcs colormap object used to color the scalar data.
@@ -296,6 +300,7 @@ def plot(self, data1, data2, tmpl, grid, transform, **kargs):
296300
self._updateContourLevelsAndColors()
297301

298302
# Generate a mapper to render masked data:
303+
self._vtkDataSetBoundsNoMask = self._vtkDataSet.GetBounds()
299304
self._createMaskedDataMapper()
300305

301306
# Create the polydata filter:
@@ -367,7 +372,7 @@ def _createPolyDataFilter(self):
367372
plotting_dataset_bounds = self.getPlottingBounds()
368373
surface_renderer, xScale, yScale = self._context().fitToViewport(
369374
act, vp,
370-
wc=plotting_dataset_bounds, geoBounds=self._vtkDataSet.GetBounds(),
375+
wc=plotting_dataset_bounds, geoBounds=self._vtkDataSetBoundsNoMask,
371376
geo=self._vtkGeoTransform,
372377
priority=self._template.data.priority,
373378
create_renderer=True)

vcs/vcsvtk/vectorpipeline.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ def _plotInternal(self):
220220
kwargs = {'vtk_backend_grid': self._vtkDataSet,
221221
'dataset_bounds': self._vtkDataSetBounds,
222222
'plotting_dataset_bounds': plotting_dataset_bounds,
223+
"vtk_dataset_bounds_no_mask": self._vtkDataSetBoundsNoMask,
223224
'vtk_backend_geo': self._vtkGeoTransform}
224225
if ('ratio_autot_viewport' in self._resultDict):
225226
kwargs["ratio_autot_viewport"] = vp
@@ -232,9 +233,7 @@ def _plotInternal(self):
232233
if self._useContinents:
233234
continents_renderer, xScale, yScale = self._context().plotContinents(
234235
plotting_dataset_bounds, projection,
235-
self._dataWrapModulo, vp, self._template.data.priority,
236-
vtk_backend_grid=self._vtkDataSet,
237-
dataset_bounds=self._vtkDataSetBounds)
236+
self._dataWrapModulo, vp, self._template.data.priority, **kwargs)
238237
self._resultDict["vtk_backend_actors"] = [[act, plotting_dataset_bounds]]
239238
self._resultDict["vtk_backend_glyphfilters"] = [glyphFilter]
240239
self._resultDict["vtk_backend_luts"] = [[None, None]]

0 commit comments

Comments
 (0)