Skip to content

Commit 111e733

Browse files
committed
Merge branch 'master' into durack1_master
2 parents 07ee9a9 + fad53bd commit 111e733

14 files changed

Lines changed: 89 additions & 46 deletions

CMakeLists.txt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,13 +250,16 @@ option(CDAT_BUILD_GUI "Builds GUI-based dependencies (Vistrails, ParaView, VisIt
250250
option(CDAT_BUILD_GRAPHICS "Build graphics-based dependencies (vcs, pyqt, Vistrails, ParaView, VisIt, R, etc.) " ON)
251251
option(CDAT_BUILD_ESGF "Alias for CDAT_BUILD_LEAN" OFF)
252252
option(CDAT_BUILD_UVCMETRICSPKG "Builds uvcmetrics package " ON)
253-
set(CDAT_BUILD_MODE "DEFAULT" CACHE STRING "Build mode for CDAT <ALL, LEAN, DEFAULT>")
254-
set_property(CACHE CDAT_BUILD_MODE PROPERTY STRINGS "DEFAULT" "ALL" "LEAN")
255253

256254
# If ESGF option is on then our build mode is LEAN.
257255
if (CDAT_BUILD_ESGF)
256+
if( (DEFINED CDAT_BUILD_MODE) AND (NOT "${CDAT_BUILD_MODE}" STREQUAL "LEAN") )
257+
message(WARNING "[INFO] CDAT_BUILD_ESGF enabled, forcing CDAT_BUILD_MODE to LEAN")
258+
endif()
258259
set(CDAT_BUILD_MODE "LEAN" CACHE STRING "Build mode for CDAT <ALL, LEAN, DEFAULT>" FORCE)
259260
endif()
261+
set(CDAT_BUILD_MODE "DEFAULT" CACHE STRING "Build mode for CDAT <ALL, LEAN, DEFAULT>")
262+
set_property(CACHE CDAT_BUILD_MODE PROPERTY STRINGS "DEFAULT" "ALL" "LEAN")
260263

261264
# Set the state of LEAN all based on the MODE
262265
if (CDAT_BUILD_MODE STREQUAL "LEAN")

Packages/DV3D/ButtonBarWidget.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,6 @@
1212
DataDir = os.path.join( PackagePath, 'data' )
1313
ButtonDir = os.path.join( DataDir, 'buttons' )
1414

15-
def get_scalar_value( tvals ):
16-
if hasattr( tvals, '__iter__' ):
17-
return get_scalar_value( tvals[0] )
18-
else: return tvals
19-
2015
class OriginPosition:
2116
Upper_Left = [ 0, 1 ]
2217
Upper_Right = [ 1, 1 ]

Packages/DV3D/ConfigurationFunctions.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@
2525
SLIDER_MAX_VALUE = 100
2626
MAX_IMAGE_SIZE = 1000000
2727

28+
def get_scalar_value( tvals ):
29+
if hasattr( tvals, '__iter__' ):
30+
return get_scalar_value( tvals[0] )
31+
else: return tvals
32+
2833
def isNumerical( vals ):
2934
for val in vals:
3035
if type( val ) not in [ int, float ]: return False
@@ -616,6 +621,7 @@ def serialize( self ):
616621
return str( self.values )
617622

618623
def getValue( self, key=0, default_value=None ):
624+
if key == None: return default_value
619625
return self.values.get( key, default_value )
620626

621627
def getState( self ):

Packages/DV3D/DV3DPlot.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -288,12 +288,14 @@ def getConstituentSelectionButton(self, config_function, build_args, position, *
288288
control_bar.reposition()
289289
return control_bar
290290

291-
def processConfigParameterChange( self, parameter ):
292-
values = parameter.getValues()
291+
def processConfigParameterChange( self, parameter, val_key = None ):
292+
values = parameter.getValue(val_key)
293+
if values == None: values = parameter.getValues()
294+
if not hasattr( values, '__iter__' ): values = [ values ]
293295
state = parameter.getState()
294296
if state <> None: addState( values, state )
295297
argList = [ parameter.name, parameter.ptype, str(values) ]
296-
# print " ..........>>>>>> Process Config Parameter Change: %s " % str(argList)
298+
#print " ..........>>>>>> Process Config Parameter Change: %s ( key: %s ) " % ( str(argList), str( val_key ) )
297299
self.ParameterValueChanged( argList )
298300

299301
def processConfigStateChange( self, parameter ):
@@ -333,7 +335,6 @@ def terminate( self ):
333335
def quit( self, **args ):
334336
eventArgs = args.get( 'args', None )
335337
if eventArgs and ( eventArgs[1] == 'Q' ):
336-
self.recordCamera()
337338
self.saveState()
338339
self.onClosing()
339340
sys.exit( 0 )
@@ -405,6 +406,7 @@ def changeButtonActivations(self, activation_list ):
405406
self.changeButtonActivation( *activation_spec )
406407

407408
def saveState(self, **args):
409+
self.recordCamera()
408410
self.cfgManager.saveState()
409411

410412
def getStateData(self, **args):
@@ -856,7 +858,8 @@ def buildPlotButtons( self, **args ):
856858
bbar = self.buttonBarHandler.createButtonBarWidget( bbar_name, self.renderWindowInteractor, position=( 0.0, 0.96) )
857859
self.buttonBarHandler.DefaultGroup = 'SliceRoundRobin'
858860
if (self.type == '3d_vector') or not enable_3d_plots:
859-
b = bbar.addSliderButton( names=['ZSlider'], key='z', toggle=True, group='SliceRoundRobin', sliderLabels='Slice Position', label="Slicing", state = 1, interactionHandler=self.processSlicingCommand )
861+
sliderLabels= 'Slice Position' if enable_3d_plots else []
862+
b = bbar.addSliderButton( names=['ZSlider'], key='z', toggle=True, group='SliceRoundRobin', sliderLabels=sliderLabels, label="Slicing", state = 1, interactionHandler=self.processSlicingCommand )
860863
else:
861864
b = bbar.addConfigButton( names=['SliceRoundRobin'], key='p', interactionHandler=bbar.sliceRoundRobin )
862865
b = bbar.addSliderButton( names=['XSlider'], key='x', toggle=True, group='SliceRoundRobin', sliderLabels='X Slice Position', label="Slicing", position=[0,3], interactionHandler=self.processSlicingCommand )

Packages/DV3D/RectilinearGridPlot.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,8 @@
1010
from ImagePlaneWidget import *
1111
from StructuredGridPlot import *
1212
from StructuredDataset import *
13+
from ConfigurationFunctions import get_scalar_value
1314
import numpy as np
14-
15-
def get_scalar_value( tvals ):
16-
if hasattr( tvals, '__iter__' ):
17-
return get_scalar_value( tvals[0] )
18-
else: return tvals
1915

2016
LegacyAbsValueTransferFunction = 0
2117
LinearTransferFunction = 1
@@ -382,7 +378,8 @@ def processSlicingCommand( self, args, config_function = None ):
382378
self.ProcessIPWAction( plane_widget, ImagePlaneWidget.InteractionUpdateEvent, action = ImagePlaneWidget.Pushing )
383379
elif args and args[0] == "EndConfig":
384380
plane_widget.endSlicing()
385-
self.processConfigParameterChange( slicePosition )
381+
val_key = 'relative' if (plane_index == 2) else None
382+
self.processConfigParameterChange( slicePosition, val_key )
386383
elif args and args[0] == "InitConfig":
387384
self.skipIndex = 4
388385
bbar = self.getPlotButtonbar()

Packages/DV3D/StructuredVariableReader.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ def __init__(self, **args):
103103
self.vars = args.get( 'vars', None )
104104
if self.vars <> None:
105105
dfile = self.vars[0].parent
106-
self.subSpace = args.get( 'axes', 'xyz' )
106+
self.subSpace = get_scalar_value( args.get( 'axes', 'xyz' ) )
107107
if dfile <> None:
108108
self.datasetId = dfile.Title if hasattr( dfile, 'Title' ) else dfile.id
109109
self.fileSpecs = dfile.id

Packages/DV3D/demo/demo_plots/clt_xyt_demo.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,14 @@
55
dv3d = vcs.get3d_scalar('Hovmoller3D')
66
dv3d.ToggleSurfacePlot = vcs.on
77
dv3d.ToggleVolumePlot = vcs.on
8-
dv3d.IsosurfaceValue = [11.4]
8+
dv3d.IsosurfaceValue = [ 10.0 ]
9+
dv3d.ToggleClipping = [-180.0, 175.0, -22.0, 90.0, 0.0, 119.0 ]
910
dv3d.ScaleTransferFunction = [80, 100, 1]
11+
dv3d.ScaleOpacity={ 'Volume': [0.0, 0.2] }
12+
dv3d.ZSlider = ( 0.0, vcs.on )
13+
dv3d.YSlider = ( 20.0, vcs.on )
14+
dv3d.Camera={'Position': (436.8, -126.3, 285.2), 'ViewUp': (-0.5, 0.25, 0.83), 'FocalPoint': (9.6, 19.9, -3.2)}
15+
1016
x.plot( v, dv3d )
1117
x.interact()
1218

Packages/vcs/Lib/VTKPlots.py

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ def __init__(self,parent):
2828
self.AddObserver("LeftButtonReleaseEvent", parent.leftButtonReleaseEvent )
2929
self.AddObserver( "ModifiedEvent", parent.configureEvent )
3030
self.AddObserver( "ConfigureEvent", parent.configureEvent )
31-
31+
if sys.platform == "darwin":
32+
self.AddObserver( "RenderEvent", parent.renderEvent )
33+
3234
class VTKVCSBackend(object):
3335
def __init__(self,canvas,renWin=None, debug=False,bg=None):
3436
self._lastSize = None
@@ -41,16 +43,15 @@ def __init__(self,canvas,renWin=None, debug=False,bg=None):
4143
self.plotRenderers = set()
4244
self.renderer = None
4345
self._plot_keywords = ['renderer',]
44-
self.numberOfPlotCalls = 0
46+
self.numberOfPlotCalls = 0
47+
self.renderWindowSize=None
4548
if renWin is not None:
4649
self.renWin = renWin
4750
if renWin.GetInteractor() is None and self.bg is False:
4851
self.createDefaultInteractor()
4952
self.logo = None
50-
51-
# def applicationFocusChanged(self):
52-
# for plotApp in self.plotApps.values():
53-
# if hasattr(plotApp, 'refresh'): plotApp.refresh()
53+
if sys.platform == "darwin":
54+
self.reRender = False
5455

5556
def setAnimationStepper( self, stepper ):
5657
for plot in self.plotApps.values():
@@ -61,12 +62,36 @@ def interact(self,*args,**kargs):
6162
warnings.warn("Cannot interact if you did not open the canvas yet")
6263
return
6364
interactor = self.renWin.GetInteractor()
65+
## Mac seems to handle events a bit differently
66+
## Need to add observers on renWin
67+
## Linux is fine w/o it so no need to do it
68+
if sys.platform == "darwin":
69+
self.renWin.AddObserver( "RenderEvent", self.renderEvent )
70+
self.renWin.AddObserver("LeftButtonPressEvent", self.leftButtonPressEvent )
71+
self.renWin.AddObserver("LeftButtonReleaseEvent", self.leftButtonReleaseEvent )
72+
self.renWin.AddObserver( "ModifiedEvent", self.configureEvent )
73+
self.renWin.AddObserver( "ConfigureEvent", self.configureEvent )
74+
self.renWin.AddObserver( "EndEvent",self.endEvent)
6475
if interactor is None:
6576
warnings.warn("Cannot start interaction. Blank plot?")
6677
return
6778
warnings.warn("Press 'Q' to exit interactive mode and continue script execution")
6879
interactor.Start()
6980

81+
def endEvent(self,obj,event):
82+
if self.renWin is not None:
83+
if self.reRender:
84+
self.reRender = False
85+
self._lastSize = None
86+
self.renWin.Render()
87+
88+
def renderEvent(self,caller,evt):
89+
renwin = self.renWin if (caller == None) else caller
90+
window_size = renwin.GetSize()
91+
if ( window_size <> self.renderWindowSize ):
92+
self.configureEvent(caller,evt)
93+
self.renderWindowSize = window_size
94+
7095
def leftButtonPressEvent(self,obj,event):
7196
xy = self.renWin.GetInteractor().GetEventPosition()
7297
sz = self.renWin.GetSize()
@@ -146,16 +171,17 @@ def leftButtonPressEvent(self,obj,event):
146171

147172
def leftButtonReleaseEvent(self,obj,event):
148173
self.clickRenderer.RemoveAllViewProps()
149-
self.clickRenderer.Render()
150174
self.renWin.RemoveRenderer(self.clickRenderer)
151175
self.renWin.Render()
152176

153177
def configureEvent(self,obj,ev):
154178
sz = self.renWin.GetSize()
155-
if self._lastSize == sz: # or (self._lastSize is None and hasattr(self,"fromVistrails")):
179+
if self._lastSize == sz:
156180
# We really only care about resize event
157181
# this is mainly to avoid segfault vwith Vistraisl which does
158182
# not catch configure Events but only modifiedEvents....
183+
if self.renWin is not None and sys.platform == "darwin":
184+
self.renWin.Render()
159185
return
160186
self._lastSize = sz
161187
plots_args = []
@@ -181,13 +207,16 @@ def configureEvent(self,obj,ev):
181207
self.createLogo()
182208
if self.renWin.GetSize()!=(0,0):
183209
self.scaleLogo()
210+
if self.renWin is not None and sys.platform == "darwin":
211+
self.renWin.Render()
212+
if sys.platform == "darwin":
213+
## ON mac somehow we need to issue an extra Render after resize
214+
self.reRender = True
184215

185216
def clear(self):
186217
if self.renWin is None: #Nothing to clear
187218
return
188219
renderers = self.renWin.GetRenderers()
189-
# plot_renderers = [ id(g.plot.renderer) for g in self.plotApps.values() ]
190-
# print " ------------------------------------ ------------------------------------ CLEAR: %s ------------------------------------ ------------------------------------ " % str( plot_renderers )
191220
renderers.InitTraversal()
192221
ren = renderers.GetNextItem()
193222
hasValidRenderer = True if ren is not None else False
@@ -204,7 +233,6 @@ def clear(self):
204233
def createDefaultInteractor( self, ren=None ):
205234
defaultInteractor = self.renWin.GetInteractor()
206235
if defaultInteractor is None:
207-
#defaultInteractor = vtk.vtkGenericRenderWindowInteractor()
208236
defaultInteractor = vtk.vtkRenderWindowInteractor()
209237
self.vcsInteractorStyle = VCSInteractorStyle(self)
210238
if ren:
@@ -310,7 +338,6 @@ def close(self):
310338
self.renWin = None
311339

312340
def geometry(self,x,y,*args):
313-
#screenSize = self.renWin.GetScreenSize()
314341
self.renWin.SetSize(x,y)
315342

316343
def flush(self):
@@ -331,8 +358,6 @@ def plot(self,data1,data2,template,gtype,gname,bg,*args,**kargs):
331358
self.renWin.SetOffScreenRendering(True)
332359
self.renWin.SetSize(self.canvas.bgX,self.canvas.bgY)
333360
self.cell_coordinates=kargs.get( 'cell_coordinates', None )
334-
#self.renWin.Render()
335-
#screenSize = self.renWin.GetScreenSize()
336361
if gtype == "text":
337362
tt,to = gname.split(":::")
338363
tt = vcs.elements["texttable"][tt]
@@ -649,13 +674,6 @@ def plotVector(self,data1,data2,tmpl,gm):
649674
glyphFilter.SetInputArrayToProcess(1,0,0,0,"vectors")
650675
glyphFilter.SetScaleFactor(2.*gm.scale)
651676

652-
#if cellData:
653-
# if ug.IsA("vtkUnstructuredGrid"):
654-
# glyphFilter.SetInputConnection(cln.GetOutputPort())
655-
# else:
656-
# glyphFilter.SetInputConnection(c2p.GetOutputPort())
657-
#else:
658-
# glyphFilter.SetInputData(ug)
659677
glyphFilter.SetInputData(ug)
660678

661679
mapper = vtk.vtkPolyDataMapper()
@@ -875,7 +893,6 @@ def plot2D(self,data1,data2,tmpl,gm):
875893
for j,color in enumerate(COLS[i]):
876894
r,g,b = cmap.index[color]
877895
lut.SetTableValue(j,r/100.,g/100.,b/100.)
878-
#print l[j],vcs.colors.rgb2str(r*2.55,g*2.55,b*2.55),l[j+1]
879896
mapper.SetLookupTable(lut)
880897
mapper.SetScalarRange(0,len(l)-1)
881898
mapper.SetScalarModeToUseCellData()
@@ -933,8 +950,6 @@ def plot2D(self,data1,data2,tmpl,gm):
933950
for k in legend.keys():
934951
legend[float(numpy.ma.log10(legend[k]))] = legend[k]
935952
del(legend[k])
936-
#dx = (levs[-1]-levs[0])/(gm.color_2-gm.color_1+1)
937-
#levs = numpy.arange(levs[0],levs[-1]+dx,dx)
938953

939954
cols = range(gm.color_1,gm.color_2+1)
940955
else:

testing/dv3d/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,9 @@ add_test(dv3d_constituents_test
2222
)
2323

2424

25+
add_test(dv3d_hovmoller_test
26+
${CMAKE_INSTALL_PREFIX}/bin/python
27+
${cdat_SOURCE_DIR}/testing/dv3d/dv3d_hovmoller_test.py
28+
)
29+
30+

testing/dv3d/TestDefinitions.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
'YSlider': ( vcs.off ),
4848
} )
4949

50-
test3 = vcsTest( 'dv3d_constituents_test', file="geos5-sample.nc", vars = [ 'uwnd' ],
50+
test4 = vcsTest( 'dv3d_constituents_test', file="geos5-sample.nc", vars = [ 'uwnd' ],
5151
parameters={'VerticalScaling': 5.0,
5252
'ToggleClipping': ( 40, 360, -28, 90 ),
5353
'ToggleVolumePlot': vcs.on,
@@ -62,6 +62,14 @@
6262
'YSlider': ( 0.0, vcs.off ),
6363
'Camera': { 'Position': (-161, -171, 279), 'ViewUp': (.29, 0.67, 0.68), 'FocalPoint': (146.7, 8.5, -28.6) }
6464
} )
65+
66+
test5 = vcsTest( 'dv3d_hovmoller_test', file="clt.nc", vars = [ 'clt' ], template = 'Hovmoller3D',
67+
parameters={'BasemapOpacity': 0.5,
68+
'XSlider': ( 77.8, vcs.on ),
69+
'ZSlider': ( 0.1, vcs.on ),
70+
'YSlider': ( 49.0, vcs.on ),
71+
'Camera': {'Position': (-300, -409, 400), 'ViewUp': (0.156, 0.64, 0.75), 'FocalPoint': (-23.2, 14.2, -20)}
72+
} )
6573

6674
if __name__ == '__main__':
6775

0 commit comments

Comments
 (0)