Example #1
0
        def draw(self, gfxwindow, device):
            self.lock.acquire()
            meshctxt = mainthread.runBlock(self.who().resolve, (gfxwindow,))
            mesh = meshctxt.getObject()
            meshctxt.restoreCachedData(self.getTime(meshctxt))
            prog = progress.getProgress("Contour plot", progress.DEFINITE)
            try:
                meshctxt.precompute_all_subproblems()
                # self.draw_subcells(mesh, device)
                device.comment("PlainContourDisplay")
                device.set_lineWidth(self.width)
                device.set_lineColor(self.color)

                # clevels is a list of contour values.
                # evalues is a list of lists of function values for the
                # nodes of each element.
                clevels, evalues = self.find_levels(mesh, self.what)
                ecount = 0
                for element in mesh.elements():
                    ## TODO MERGE: hideEmptyElements used to be a
                    ## gfxwindow setting, but in 3D it was removed.
                    ## Mesh filters now accomplish the same thing.
                    if (not gfxwindow.settings.hideEmptyElements) or \
                           ( element.material() is not None ) :
                        (contours, elmin, elmax)  = contour.findContours(
                            mesh, element, self.where,
                            self.what, clevels,
                            self.nbins, 0)
                        for cntr in contours:
                            for loop in cntr.loops:
                                device.draw_polygon(loop)
                            for curve in cntr.curves:
                                device.draw_curve(curve)
                    ecount += 1
                    prog.setFraction((1.*ecount)/mesh.nelements())
                    prog.setMessage("drawing %d/%d elements" %
                                    (ecount, mesh.nelements()))
                self.contour_min = min(clevels)
                self.contour_max = max(clevels)
                self.contour_levels = clevels
                contour.clearCache()
            finally:
                self.lock.release()
                meshctxt.releaseCachedData()
Example #2
0
        def draw(self, gfxwindow, device):
            self.lock.acquire()
            meshctxt = mainthread.runBlock(self.who().resolve, (gfxwindow,))
            mesh = meshctxt.getObject()
            meshctxt.restoreCachedData(self.getTime(meshctxt, gfxwindow))
            prog = progress.getProgress("Contour plot", progress.DEFINITE)
            try:
                meshctxt.precompute_all_subproblems()
        #        self.draw_subcells(mesh, device)
                device.comment("PlainContourDisplay")
                device.set_lineWidth(self.width)
                device.set_lineColor(self.color)

                # clevels is a list of contour values.
                # evalues is a list of lists of function values for the
                # nodes of each element.
                clevels, evalues = self.find_levels(mesh, self.what)
                ecount = 0
                for element in mesh.element_iterator():
                    if (not gfxwindow.settings.hideEmptyElements) or \
                           ( element.material() is not None ) :
                        (contours, elmin, elmax)  = contour.findContours(
                            mesh, element, self.where,
                            self.what, clevels,
                            self.nbins, 0)
                        for cntr in contours:
                            for loop in cntr.loops:
                                device.draw_polygon(loop)
                            for curve in cntr.curves:
                                device.draw_curve(curve)
                    ecount += 1
                    prog.setFraction((1.*ecount)/mesh.nelements())
                    prog.setMessage("drawing %d/%d elements" %
                                    (ecount, mesh.nelements()))
                self.contour_min = min(clevels)
                self.contour_max = max(clevels)
                self.contour_levels = clevels
                contour.clearCache()
            finally:
                self.lock.release()
                meshctxt.releaseCachedData()
                prog.finish()
Example #3
0
    def draw(self, gfxwindow, device):
        self.lock.acquire()
        meshctxt = mainthread.runBlock(self.who().resolve, (gfxwindow, ))
        mesh = meshctxt.getObject()
        meshctxt.restoreCachedData(self.getTime(meshctxt, gfxwindow))
        prog = progress.getProgress("Contour plot", progress.DEFINITE)
        try:
            self.contour_max = None
            self.contour_min = None
            self.contour_levels = []
            meshctxt.precompute_all_subproblems()
            device.comment("FilledContourDisplay")
            # clevels is a list of contour values.
            # evalues is a list of lists of function values
            # for the nodes of each element.
            clevels, evalues = self.find_levels(mesh, self.what)
            minval = min(clevels)
            maxval = max(clevels)
            valrange = maxval - minval
            if valrange == 0.0:
                valrange = 1
            factor = 1. / valrange
            offset = -minval * factor
            if config.dimension() == 2:
                device.set_colormap(self.colormap)
                ecount = 0
                # TODO: we might want to use itertools here
                for element, values in zip(mesh.element_iterator(), evalues):
                    if ( not gfxwindow.settings.hideEmptyElements ) or \
                           ( element.material() is not None ) :
                        (contours, elmin,
                         elmax) = contour.findContours(mesh, element,
                                                       self.where, self.what,
                                                       clevels, self.nbins, 1)

                        # Before drawing anything, fill the element with the
                        # largest contour value below its lowest detected value.
                        vmin = min(values)
                        prevcntour = None
                        for cntour in contours:
                            if cntour.value > elmin:
                                if prevcntour:
                                    device.set_fillColor(offset +
                                                         prevcntour.value *
                                                         factor)
                                else:
                                    device.set_fillColor(0.0)
                                break
                            prevcntour = cntour
                        else:
                            # If all of the contours were below the
                            # element, fill the element with the color
                            # from the top of the colormap.
                            device.set_fillColor(1.0)
                        # Find element perimeter
                        edges = element.perimeter()
                        mcorners = [[0.0]] * element.ncorners()
                        corners = self.where.evaluate(mesh, edges, mcorners)
                        device.fill_polygon(
                            primitives.pontify(primitives.Polygon(corners)))

                        # Now fill contours
                        for cntour in contours:
                            # This is harder than it looks.
                            if len(cntour.loops) == 1:
                                device.set_fillColor(offset +
                                                     cntour.value * factor)
                                device.fill_polygon(cntour.loops[0])
                            elif len(cntour.loops) > 1:
                                device.set_fillColor(offset +
                                                     cntour.value * factor)
                                # Compound Polygon fill
                                device.fill_polygon(cntour.loops)
                    ecount += 1
                    prog.setFraction((1.0 * ecount) / mesh.nelements())
                    prog.setMessage("drawing %d/%d elements" %
                                    (ecount, mesh.nelements()))
                #  self.draw_subcells(mesh, device)
                contour.clearCache()

            elif config.dimension() == 3:
                # TODO 3D: this should be more seamless when meshes
                # use vtk objects.  Also, will need to update for
                # quadratic elements.
                lut = self.colormap.getVtkLookupTable(self.levels, minval,
                                                      maxval)
                numnodes = mesh.nnodes()
                nodes = mesh.node_iterator()
                points = vtk.vtkPoints()
                points.Allocate(numnodes, numnodes)
                data = vtk.vtkDoubleArray()
                data.SetNumberOfComponents(0)
                data.SetNumberOfValues(numnodes)

                while not nodes.end():
                    node = nodes.node()
                    points.InsertNextPoint(node[0], node[1], node[2])
                    nodes.next()

                grid = vtk.vtkUnstructuredGrid()
                nelements = mesh.nelements()
                grid.Allocate(nelements, nelements)
                elements = mesh.element_iterator()

                # this will reset some values. TODO 3D: think about
                # plotting discontinuous stuff with vtk - could add
                # points to points object here
                for element, values in zip(elements, evalues):
                    elnodes = element.ncorners()
                    for i in xrange(elnodes):
                        data.SetValue(element.getPointIds().GetId(i),
                                      values[i])
                    grid.InsertNextCell(element.GetCellType(),
                                        element.getPointIds())

                grid.SetPoints(points)
                grid.GetPointData().SetScalars(data)
                device.draw_unstructuredgrid_with_lookuptable(grid,
                                                              lut,
                                                              mode="point")

                self.lookuptable = lut

            self.contour_min = minval
            self.contour_max = maxval
            self.contour_levels = clevels

        finally:
            self.lock.release()
            meshctxt.releaseCachedData()
            prog.finish()
Example #4
0
    def draw(self, gfxwindow, device): # 2D only
        self.lock.acquire()
        meshctxt = mainthread.runBlock(self.who().resolve, (gfxwindow,))
        mesh = meshctxt.getObject()
        meshctxt.restoreCachedData(self.getTime(meshctxt))
        prog = progress.getProgress("Contour plot", progress.DEFINITE)
        try:
            self.contour_max = None
            self.contour_min = None
            self.contour_levels = []
            meshctxt.precompute_all_subproblems()
            # device.comment("FilledContourDisplay")
            # clevels is a list of contour values.
            # evalues is a list of lists of function values
            # for the nodes of each element.
            clevels, evalues = self.find_levels(mesh, self.what)
            minval = min(clevels)
            maxval = max(clevels)
            nlevels = len(clevels)
            valrange = maxval - minval
            if valrange == 0.0:
                valrange = 1
            factor = 1./valrange
            offset = -minval*factor

            device.set_colormap(self.colormap)
            ecount = 0
            for element, values in zip(mesh.elements(), evalues):
                ## TODO MERGE: hideEmptyElements used to be a
                ## gfxwindow setting, but in 3D it was removed.
                ## Mesh filters now accomplish the same thing.
                if ( not gfxwindow.settings.hideEmptyElements ) or \
                       ( element.material() is not None ) :
                    (contours, elmin, elmax)  = contour.findContours(
                        mesh, element, self.where,
                        self.what, clevels,
                        self.nbins, 1)

                    # Before drawing anything, fill the element with the
                    # largest contour value below its lowest detected value.
                    vmin = min(values)
                    prevcntour = None
                    for cntour in contours:
                        if cntour.value > elmin:
                            if prevcntour:
                                device.set_fillColor(
                                    offset + prevcntour.value*factor)
                            else:
                                device.set_fillColor(0.0)
                            break
                        prevcntour = cntour
                    else:
                        # If all of the contours were below the
                        # element, fill the element with the color
                        # from the top of the colormap.
                        device.set_fillColor(1.0)
                    # Find element perimeter
                    edges = element.perimeter()
                    mcorners = [[0.0]]*element.ncorners()
                    corners = self.where.evaluate(mesh, edges, mcorners)
                    device.fill_polygon(primitives.pontify(
                            primitives.Polygon(corners)))

                    # Now fill contours
                    for cntour in contours:
                        # This is harder than it looks.
                        if len(cntour.loops) == 1:
                            device.set_fillColor(
                                offset + cntour.value*factor)
                            device.fill_polygon(cntour.loops[0])
                        elif len(cntour.loops) > 1:
                            device.set_fillColor(
                                offset + cntour.value*factor)
                            # Compound Polygon fill
                            device.fill_polygon(cntour.loops)
                ecount += 1
                prog.setFraction((1.0*ecount)/mesh.nelements())
                prog.setMessage("drawing %d/%d elements" %
                                (ecount, mesh.nelements()))
            #  self.draw_subcells(mesh, device)
            contour.clearCache()
                
            self.contour_min = minval
            self.contour_max = maxval
            self.contour_levels = clevels

        finally:
            self.lock.release()
            meshctxt.releaseCachedData()
Example #5
0
    def draw(self, gfxwindow, device):
        self.lock.acquire()
        meshctxt = mainthread.runBlock(self.who().resolve, (gfxwindow,))
        mesh = meshctxt.getObject()
        meshctxt.restoreCachedData(self.getTime(meshctxt, gfxwindow))
        prog = progress.getProgress("Contour plot", progress.DEFINITE)
        try:
            self.contour_max = None
            self.contour_min = None
            self.contour_levels = []
            meshctxt.precompute_all_subproblems()
            device.comment("FilledContourDisplay")
            # clevels is a list of contour values.
            # evalues is a list of lists of function values
            # for the nodes of each element.
            clevels, evalues = self.find_levels(mesh, self.what)
            minval = min(clevels)
            maxval = max(clevels)
            valrange = maxval - minval
            if valrange == 0.0:
                valrange = 1
            factor = 1./valrange
            offset = -minval*factor
            if config.dimension() == 2:
                device.set_colormap(self.colormap)
                ecount = 0
                # TODO: we might want to use itertools here
                for element, values in zip(mesh.element_iterator(), evalues):
                    if ( not gfxwindow.settings.hideEmptyElements ) or \
                           ( element.material() is not None ) :
                        (contours, elmin, elmax) = contour.findContours(
                            mesh, element, self.where,
                            self.what, clevels,
                            self.nbins, 1)

                        # Before drawing anything, fill the element with the
                        # largest contour value below its lowest detected value.
                        vmin = min(values)
                        prevcntour = None
                        for cntour in contours:
                            if cntour.value > elmin:
                                if prevcntour:
                                    device.set_fillColor(
                                        offset + prevcntour.value*factor)
                                else:
                                    device.set_fillColor(0.0)
                                break
                            prevcntour = cntour
                        else:
                            # If all of the contours were below the
                            # element, fill the element with the color
                            # from the top of the colormap.
                            device.set_fillColor(1.0)
                        # Find element perimeter
                        edges = element.perimeter()
                        mcorners = [[0.0]]*element.ncorners()
                        corners = self.where.evaluate(mesh, edges, mcorners)
                        device.fill_polygon(primitives.pontify(
                                primitives.Polygon(corners)))

                        # Now fill contours
                        for cntour in contours:
                            # This is harder than it looks.
                            if len(cntour.loops) == 1:
                                device.set_fillColor(
                                    offset + cntour.value*factor)
                                device.fill_polygon(cntour.loops[0])
                            elif len(cntour.loops) > 1:
                                device.set_fillColor(
                                    offset + cntour.value*factor)
                                # Compound Polygon fill
                                device.fill_polygon(cntour.loops)
                    ecount += 1
                    prog.setFraction((1.0*ecount)/mesh.nelements())
                    prog.setMessage("drawing %d/%d elements" %
                                    (ecount, mesh.nelements()))
                #  self.draw_subcells(mesh, device)
                contour.clearCache()

            elif config.dimension() == 3:
                # TODO 3D: this should be more seamless when meshes
                # use vtk objects.  Also, will need to update for
                # quadratic elements.
                lut = self.colormap.getVtkLookupTable(self.levels,minval,maxval)
                numnodes = mesh.nnodes()
                nodes = mesh.node_iterator()
                points = vtk.vtkPoints()
                points.Allocate(numnodes,numnodes)
                data = vtk.vtkDoubleArray()
                data.SetNumberOfComponents(0)
                data.SetNumberOfValues(numnodes)
                    

                while not nodes.end():
                    node = nodes.node()
                    points.InsertNextPoint(node[0],node[1],node[2])
                    nodes.next()

                grid = vtk.vtkUnstructuredGrid()
                nelements = mesh.nelements()
                grid.Allocate(nelements, nelements)
                elements = mesh.element_iterator()

                # this will reset some values. TODO 3D: think about
                # plotting discontinuous stuff with vtk - could add
                # points to points object here
                for element, values in zip(elements, evalues):
                    elnodes = element.ncorners()
                    for i in xrange(elnodes):
                        data.SetValue(element.getPointIds().GetId(i), values[i])
                    grid.InsertNextCell(element.GetCellType(), element.getPointIds())                 

                grid.SetPoints(points)
                grid.GetPointData().SetScalars(data)
                device.draw_unstructuredgrid_with_lookuptable(grid, lut, mode="point")

                self.lookuptable = lut
                
            self.contour_min = minval
            self.contour_max = maxval
            self.contour_levels = clevels

        finally:
            self.lock.release()
            meshctxt.releaseCachedData()
            prog.finish()