You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
4.2 KiB
149 lines
4.2 KiB
#!/usr/bin/env python
|
|
|
|
# In this example we show the use of the
|
|
# vtkBandedPolyDataContourFilter. This filter creates separate,
|
|
# constant colored bands for a range of scalar values. Each band is
|
|
# bounded by two scalar values, and the cell data lying within the
|
|
# value has the same cell scalar value.
|
|
|
|
import vtk
|
|
from vtk.util.misc import vtkGetDataRoot
|
|
VTK_DATA_ROOT = vtkGetDataRoot()
|
|
|
|
|
|
# The lookup table is similar to that used by maps. Two hues are used:
|
|
# a brown for land, and a blue for water. The value of the hue is
|
|
# changed to give the effect of elevation.
|
|
Scale = 5
|
|
lutWater = vtk.vtkLookupTable()
|
|
lutWater.SetNumberOfColors(10)
|
|
lutWater.SetHueRange(0.58, 0.58)
|
|
lutWater.SetSaturationRange(0.5, 0.1)
|
|
lutWater.SetValueRange(0.5, 1.0)
|
|
lutWater.Build()
|
|
lutLand = vtk.vtkLookupTable()
|
|
lutLand.SetNumberOfColors(10)
|
|
lutLand.SetHueRange(0.1, 0.1)
|
|
lutLand.SetSaturationRange(0.4, 0.1)
|
|
lutLand.SetValueRange(0.55, 0.9)
|
|
lutLand.Build()
|
|
|
|
|
|
# The DEM reader reads data and creates an output image.
|
|
demModel = vtk.vtkDEMReader()
|
|
demModel.SetFileName(VTK_DATA_ROOT + "/Data/SainteHelens.dem")
|
|
demModel.Update()
|
|
|
|
# We shrink the terrain data down a bit to yield better performance for
|
|
# this example.
|
|
shrinkFactor = 4
|
|
shrink = vtk.vtkImageShrink3D()
|
|
shrink.SetShrinkFactors(shrinkFactor, shrinkFactor, 1)
|
|
shrink.SetInputConnection(demModel.GetOutputPort())
|
|
shrink.AveragingOn()
|
|
|
|
# Convert the image into polygons.
|
|
geom = vtk.vtkImageDataGeometryFilter()
|
|
geom.SetInputConnection(shrink.GetOutputPort())
|
|
|
|
# Warp the polygons based on elevation.
|
|
warp = vtk.vtkWarpScalar()
|
|
warp.SetInputConnection(geom.GetOutputPort())
|
|
warp.SetNormal(0, 0, 1)
|
|
warp.UseNormalOn()
|
|
warp.SetScaleFactor(Scale)
|
|
|
|
# Create the contour bands.
|
|
bcf = vtk.vtkBandedPolyDataContourFilter()
|
|
bcf.SetInput(warp.GetPolyDataOutput())
|
|
bcf.GenerateValues(15, demModel.GetOutput().GetScalarRange())
|
|
bcf.SetScalarModeToIndex()
|
|
bcf.GenerateContourEdgesOn()
|
|
|
|
# Compute normals to give a better look.
|
|
normals = vtk.vtkPolyDataNormals()
|
|
normals.SetInputConnection(bcf.GetOutputPort())
|
|
normals.SetFeatureAngle(60)
|
|
normals.ConsistencyOff()
|
|
normals.SplittingOff()
|
|
|
|
demMapper = vtk.vtkPolyDataMapper()
|
|
demMapper.SetInputConnection(normals.GetOutputPort())
|
|
demMapper.SetScalarRange(0, 10)
|
|
demMapper.SetLookupTable(lutLand)
|
|
demMapper.SetScalarModeToUseCellData()
|
|
|
|
demActor = vtk.vtkLODActor()
|
|
demActor.SetMapper(demMapper)
|
|
|
|
## Create contour edges
|
|
edgeMapper = vtk.vtkPolyDataMapper()
|
|
edgeMapper.SetInput(bcf.GetContourEdgesOutput())
|
|
edgeMapper.SetResolveCoincidentTopologyToPolygonOffset()
|
|
edgeActor = vtk.vtkActor()
|
|
edgeActor.SetMapper(edgeMapper)
|
|
edgeActor.GetProperty().SetColor(0, 0, 0)
|
|
|
|
## Test clipping
|
|
# Create the contour bands.
|
|
bcf2 = vtk.vtkBandedPolyDataContourFilter()
|
|
bcf2.SetInput(warp.GetPolyDataOutput())
|
|
bcf2.ClippingOn()
|
|
bcf2.GenerateValues(10, 1000, 2000)
|
|
bcf2.SetScalarModeToValue()
|
|
|
|
# Compute normals to give a better look.
|
|
normals2 = vtk.vtkPolyDataNormals()
|
|
normals2.SetInputConnection(bcf2.GetOutputPort())
|
|
normals2.SetFeatureAngle(60)
|
|
normals2.ConsistencyOff()
|
|
normals2.SplittingOff()
|
|
|
|
lut = vtk.vtkLookupTable()
|
|
lut.SetNumberOfColors(10)
|
|
demMapper2 = vtk.vtkPolyDataMapper()
|
|
demMapper2.SetInputConnection(normals2.GetOutputPort())
|
|
demMapper2.SetScalarRange(demModel.GetOutput().GetScalarRange())
|
|
demMapper2.SetLookupTable(lut)
|
|
demMapper2.SetScalarModeToUseCellData()
|
|
|
|
demActor2 = vtk.vtkLODActor()
|
|
demActor2.SetMapper(demMapper2)
|
|
demActor2.AddPosition(0, 15000, 0)
|
|
|
|
# Create the RenderWindow, Renderer and both Actors
|
|
ren = vtk.vtkRenderer()
|
|
renWin = vtk.vtkRenderWindow()
|
|
renWin.AddRenderer(ren)
|
|
iren = vtk.vtkRenderWindowInteractor()
|
|
iren.SetRenderWindow(renWin)
|
|
|
|
# Add the actors to the renderer, set the background and size
|
|
ren.AddActor(demActor)
|
|
ren.AddActor(demActor2)
|
|
ren.AddActor(edgeActor)
|
|
|
|
ren.SetBackground(.4, .4, .4)
|
|
renWin.SetSize(375, 200)
|
|
|
|
cam = vtk.vtkCamera()
|
|
cam.SetPosition(-17438.8, 2410.62, 25470.8)
|
|
cam.SetFocalPoint(3985.35, 11930.6, 5922.14)
|
|
cam.SetViewUp(0, 0, 1)
|
|
ren.SetActiveCamera(cam)
|
|
ren.ResetCamera()
|
|
cam.Zoom(2)
|
|
|
|
iren.Initialize()
|
|
iren.SetDesiredUpdateRate(1)
|
|
|
|
def CheckAbort(obj, event):
|
|
foo = renWin.GetEventPending()
|
|
if foo != 0:
|
|
renWin.SetAbortRender(1)
|
|
|
|
renWin.AddObserver("AbortCheckEvent", CheckAbort)
|
|
renWin.Render()
|
|
|
|
renWin.Render()
|
|
iren.Start()
|
|
|