# QuadraticHexahedron

VTKExamples/Python/GeometricObjects/QuadraticHexahedron

### Code

QuadraticHexahedron.py

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-

    import vtk

    def main():
        namedColors = vtk.vtkNamedColors()

        uGrid = MakeQuadraticHexahedron()

        tessellate = vtk.vtkTessellatorFilter()
        tessellate.SetInputData(uGrid)
        tessellate.SetMaximumNumberOfSubdivisions(2)

        mapper = vtk.vtkDataSetMapper()
        mapper.SetInputConnection(tessellate.GetOutputPort())
        mapper.ScalarVisibilityOff()

        # Create an actor for the grid
        actor = vtk.vtkActor()
        actor.SetMapper(mapper)
        actor.GetProperty().SetDiffuseColor(
            namedColors.GetColor3d("Tomato"))
        actor.GetProperty().SetEdgeColor(
            namedColors.GetColor3d("IvoryBlack"))
        actor.GetProperty().EdgeVisibilityOn()

        sphereSource = vtk.vtkSphereSource()
        sphereSource.SetRadius(0.02)

        glyph3D = vtk.vtkGlyph3D()
        glyph3D.SetInputData(uGrid)
        glyph3D.SetSourceConnection(sphereSource.GetOutputPort())
        glyph3D.ScalingOff()
        glyph3D.Update()

        glyph3DMapper = vtk.vtkDataSetMapper()
        glyph3DMapper.SetInputConnection(glyph3D.GetOutputPort())
        glyph3DMapper.ScalarVisibilityOff()

        glyph3DActor = vtk.vtkActor()
        glyph3DActor.SetMapper(glyph3DMapper)
        glyph3DActor.GetProperty().SetColor(
            namedColors.GetColor3d("Banana"))

        # Visualize
        renderer = vtk.vtkRenderer()
        renderWindow = vtk.vtkRenderWindow()
        renderWindow.SetWindowName("Quadratic Hexahedron")
        renderWindow.AddRenderer(renderer)
        interactor = vtk.vtkRenderWindowInteractor()
        interactor.SetRenderWindow(renderWindow)

        renderer.AddActor(actor)
        renderer.AddActor(glyph3DActor)
        renderer.SetBackground(namedColors.GetColor3d("SlateGray"))

        renderWindow.Render()
        interactor.Start()

    def MakeQuadraticHexahedron():
        aHexahedron = vtk.vtkQuadraticHexahedron()
        points = vtk.vtkPoints()

        pcoords = aHexahedron.GetParametricCoords()
        rng = vtk.vtkMinimalStandardRandomSequence()
        points.SetNumberOfPoints(aHexahedron.GetNumberOfPoints())
        rng.SetSeed(5070)  # for testing
        for i in range(0, aHexahedron.GetNumberOfPoints()):
            perturbation = [0.0] * 3
            for j in range(0, 3):
                rng.Next()
                perturbation[j] = rng.GetRangeValue(-0.1, 0.1)
            aHexahedron.GetPointIds().SetId(i, i)
            points.SetPoint(i, pcoords[3 * i] + perturbation[0],
                            pcoords[3 * i + 1] + perturbation[1],
                            pcoords[3 * i + 2] + perturbation[2])

        # Add the points and hexahedron to an unstructured grid
        uGrid = vtk.vtkUnstructuredGrid()
        uGrid.SetPoints(points)
        uGrid.InsertNextCell(aHexahedron.GetCellType(), aHexahedron.GetPointIds())

        return uGrid

    if __name__ == '__main__':
        main()