Exemplo n.º 1
0
    def __init__(self,
                 width,
                 height,
                 colormap,
                 color,
                 parent_interactor=None,
                 on_save=None,
                 on_cancel=None):
        self.render_window = vtk.vtkRenderWindow()
        self.render_window.SetWindowName("Color Picker")
        self.render_window.SetNumberOfLayers(3)
        self.render_window.SetSize(width, height)
        self.color_renderer = vtk.vtkRenderer()
        self.parent_interactor = parent_interactor

        if colormap is None:
            colormap = "default"
        if not vcs.iscolormap(colormap):
            colormap = vcs.getcolormap(colormap)

        self.colormap = colormap
        self.colors = [[int(c / 100.0 * 255.0) for c in colormap.index[i]]
                       for i in range(len(colormap.index))]

        self.actor = make_color_plane(16, 16, self.colors)

        self.color_renderer.SetViewport([.1, .1, .9, .9])
        self.color_renderer.SetBackground((.5, .5, .5))
        self.color_renderer.AddActor(self.actor)
        self.color_renderer.InteractiveOff()
        self.color_renderer.SetLayer(1)

        bg = vtk.vtkRenderer()
        bg.SetBackground(1, 1, 1)
        bg.SetViewport([0, 0, 1, 1])
        bg.SetLayer(0)
        self.render_window.AddRenderer(bg)
        self.render_window.AddRenderer(self.color_renderer)
        inter = vtk.vtkRenderWindowInteractor()

        self.style = vtk.vtkInteractorStyleUser()
        inter.SetInteractorStyle(self.style)
        inter.SetRenderWindow(self.render_window)
        manager = vcs.vtk_ui.manager.get_manager(inter)
        self.render_window.AddRenderer(manager.renderer)
        self.render_window.AddRenderer(manager.actor_renderer)
        manager.elevate()
        self.render_window.Render()

        self.on_save = on_save
        self.on_cancel = on_cancel

        maps = vcs.elements["colormap"]

        current_state = None
        states = []
        self.colormaps = []
        for ind, mapname in enumerate(maps.keys()):
            states.append(ButtonState(label=mapname))
            if colormap.name == mapname:
                current_state = ind
            self.colormaps.append(maps[mapname])

        self.colormap_button = Button(inter,
                                      states=states,
                                      action=self.change_map,
                                      left=10,
                                      top=10)
        self.colormap_button.set_state(current_state)

        self.save_button = Button(inter,
                                  action=self.save,
                                  label="Choose Color",
                                  left=int(width * .75) - 10,
                                  top=int(height * .85))
        self.cancel_button = Button(inter,
                                    action=self.cancel,
                                    label="Cancel",
                                    left=10,
                                    top=int(height * .85))

        self.colormap_button.show()
        self.save_button.show()
        self.cancel_button.show()

        self.make_current()

        self.selectedMapper = vtk.vtkDataSetMapper()
        self.selectedActor = vtk.vtkActor()
        self.selectedActor.SetMapper(self.selectedMapper)
        self.selectedActor.GetProperty().EdgeVisibilityOn()
        self.selectedActor.GetProperty().SetEdgeColor(0, 0, 0)
        self.selectedActor.GetProperty().SetLineWidth(3)
        self.color = color
        # Make sure the current color is selected
        self.selectCell(color)
        self.color_renderer.AddActor(self.selectedActor)
        self.click_handler = inter.AddObserver(
            vtk.vtkCommand.LeftButtonReleaseEvent, self.clickEvent)

        def noop(obj, event):
            pass

        self.char_handler = inter.AddObserver(vtk.vtkCommand.CharEvent, noop)
Exemplo n.º 2
0
    def __init__(self, width, height, colormap, color, parent_interactor=None, on_save=None, on_cancel=None):
        self.render_window = vtk.vtkRenderWindow()
        self.render_window.SetWindowName("Color Picker")
        self.render_window.SetNumberOfLayers(3)
        self.render_window.SetSize(width, height)
        self.color_renderer = vtk.vtkRenderer()
        self.parent_interactor = parent_interactor

        if colormap is None:
            colormap = "default"
        if not vcs.iscolormap(colormap):
            colormap = vcs.getcolormap(colormap)

        self.colormap = colormap
        self.colors =  [[int(c / 100.0 * 255.0) for c in colormap.index[i]] for i in range(len(colormap.index))]

        self.actor = make_color_plane(16, 16, self.colors)

        self.color_renderer.SetViewport([.1, .1, .9, .9])
        self.color_renderer.SetBackground((.5, .5, .5))
        self.color_renderer.AddActor(self.actor)
        self.color_renderer.InteractiveOff()
        self.color_renderer.SetLayer(1)

        bg = vtk.vtkRenderer()
        bg.SetBackground(1,1,1)
        bg.SetViewport([0,0,1,1])
        bg.SetLayer(0)
        self.render_window.AddRenderer(bg)
        self.render_window.AddRenderer(self.color_renderer)
        inter = vtk.vtkRenderWindowInteractor()

        self.style = vtk.vtkInteractorStyleUser()
        inter.SetInteractorStyle(self.style)
        inter.SetRenderWindow(self.render_window)
        manager = vcs.vtk_ui.manager.get_manager(inter)
        self.render_window.AddRenderer(manager.renderer)
        self.render_window.AddRenderer(manager.actor_renderer)
        manager.elevate()
        self.render_window.Render()

        self.on_save = on_save
        self.on_cancel = on_cancel

        maps = vcs.elements["colormap"]

        current_state = None
        states = []
        self.colormaps = []
        for ind, mapname in enumerate(maps.keys()):
            states.append(ButtonState(label=mapname))
            if colormap.name == mapname:
                current_state = ind
            self.colormaps.append(maps[mapname])

        self.colormap_button = Button(inter, states=states, action=self.change_map, left = 10, top=10)
        self.colormap_button.set_state(current_state)

        self.save_button = Button(inter, action=self.save, label="Choose Color", left=int(width * .75) - 10, top=int(height * .85))
        self.cancel_button = Button(inter, action=self.cancel, label="Cancel", left=10, top=int(height * .85))

        self.colormap_button.show()
        self.save_button.show()
        self.cancel_button.show()

        self.make_current()

        self.selectedMapper = vtk.vtkDataSetMapper()
        self.selectedActor = vtk.vtkActor()
        self.selectedActor.SetMapper(self.selectedMapper);
        self.selectedActor.GetProperty().EdgeVisibilityOn();
        self.selectedActor.GetProperty().SetEdgeColor(0,0,0);
        self.selectedActor.GetProperty().SetLineWidth(3);
        self.color = color
        # Make sure the current color is selected
        self.selectCell(color)
        self.color_renderer.AddActor(self.selectedActor)
        self.click_handler = inter.AddObserver(vtk.vtkCommand.LeftButtonReleaseEvent, self.clickEvent)
        def noop(obj, event):
            pass
        self.char_handler = inter.AddObserver(vtk.vtkCommand.CharEvent, noop)
Exemplo n.º 3
0
class ColorPicker(object):
    def __init__(self,
                 width,
                 height,
                 colormap,
                 color,
                 parent_interactor=None,
                 on_save=None,
                 on_cancel=None):
        self.render_window = vtk.vtkRenderWindow()
        self.render_window.SetWindowName("Color Picker")
        self.render_window.SetNumberOfLayers(3)
        self.render_window.SetSize(width, height)
        self.color_renderer = vtk.vtkRenderer()
        self.parent_interactor = parent_interactor

        if colormap is None:
            colormap = "default"
        if not vcs.iscolormap(colormap):
            colormap = vcs.getcolormap(colormap)

        self.colormap = colormap
        self.colors = [[int(c / 100.0 * 255.0) for c in colormap.index[i]]
                       for i in range(len(colormap.index))]

        self.actor = make_color_plane(16, 16, self.colors)

        self.color_renderer.SetViewport([.1, .1, .9, .9])
        self.color_renderer.SetBackground((.5, .5, .5))
        self.color_renderer.AddActor(self.actor)
        self.color_renderer.InteractiveOff()
        self.color_renderer.SetLayer(1)

        bg = vtk.vtkRenderer()
        bg.SetBackground(1, 1, 1)
        bg.SetViewport([0, 0, 1, 1])
        bg.SetLayer(0)
        self.render_window.AddRenderer(bg)
        self.render_window.AddRenderer(self.color_renderer)
        inter = vtk.vtkRenderWindowInteractor()

        self.style = vtk.vtkInteractorStyleUser()
        inter.SetInteractorStyle(self.style)
        inter.SetRenderWindow(self.render_window)
        manager = vcs.vtk_ui.manager.get_manager(inter)
        self.render_window.AddRenderer(manager.renderer)
        self.render_window.AddRenderer(manager.actor_renderer)
        manager.elevate()
        self.render_window.Render()

        self.on_save = on_save
        self.on_cancel = on_cancel

        maps = vcs.elements["colormap"]

        current_state = None
        states = []
        self.colormaps = []
        for ind, mapname in enumerate(maps.keys()):
            states.append(ButtonState(label=mapname))
            if colormap.name == mapname:
                current_state = ind
            self.colormaps.append(maps[mapname])

        self.colormap_button = Button(inter,
                                      states=states,
                                      action=self.change_map,
                                      left=10,
                                      top=10)
        self.colormap_button.set_state(current_state)

        self.save_button = Button(inter,
                                  action=self.save,
                                  label="Choose Color",
                                  left=int(width * .75) - 10,
                                  top=int(height * .85))
        self.cancel_button = Button(inter,
                                    action=self.cancel,
                                    label="Cancel",
                                    left=10,
                                    top=int(height * .85))

        self.colormap_button.show()
        self.save_button.show()
        self.cancel_button.show()

        self.make_current()

        self.selectedMapper = vtk.vtkDataSetMapper()
        self.selectedActor = vtk.vtkActor()
        self.selectedActor.SetMapper(self.selectedMapper)
        self.selectedActor.GetProperty().EdgeVisibilityOn()
        self.selectedActor.GetProperty().SetEdgeColor(0, 0, 0)
        self.selectedActor.GetProperty().SetLineWidth(3)
        self.color = color
        # Make sure the current color is selected
        self.selectCell(color)
        self.color_renderer.AddActor(self.selectedActor)
        self.click_handler = inter.AddObserver(
            vtk.vtkCommand.LeftButtonReleaseEvent, self.clickEvent)

        def noop(obj, event):
            pass

        self.char_handler = inter.AddObserver(vtk.vtkCommand.CharEvent, noop)

    def make_current(self):
        self.render_window.MakeCurrent()

    def topRendererAtPoint(self, x, y):
        inter = self.render_window.GetInteractor()

        top = None

        for renderer in collection(inter.GetRenderWindow().GetRenderers()):
            if renderer.IsInViewport(x, y):
                if top is None or top.GetLayer() <= renderer.GetLayer():
                    top = renderer
        return top

    def change_map(self, state):
        self.colormap = self.colormaps[state]
        self.colors = [[
            int(c / 100.0 * 255.0) for c in self.colormap.index[i]
        ] for i in range(len(self.colormap.index))]
        colorData = colors_to_scalars(self.colors)
        self.actor.GetMapper().GetInput().GetCellData().SetScalars(colorData)
        self.actor.GetMapper().Update()
        self.render_window.Render()

    def save(self, state):
        if self.on_save is not None:
            self.on_save(self.colormap, self.color)

        self.close()

    def cancel(self, state):
        if self.on_cancel is not None:
            self.on_cancel()

        self.close()

    def selectCell(self, cellId):
        if cellId in (None, -1):
            return
        ids = vtk.vtkIdTypeArray()
        ids.SetNumberOfComponents(1)
        ids.InsertNextValue(cellId)

        selectionNode = vtk.vtkSelectionNode()
        selectionNode.SetFieldType(vtk.vtkSelectionNode.CELL)
        selectionNode.SetContentType(vtk.vtkSelectionNode.INDICES)
        selectionNode.SetSelectionList(ids)

        selection = vtk.vtkSelection()
        selection.AddNode(selectionNode)

        extractSelection = vtk.vtkExtractSelection()

        extractSelection.SetInputData(0, self.actor.GetMapper().GetInput())
        extractSelection.SetInputData(1, selection)

        extractSelection.Update()

        selected = vtk.vtkUnstructuredGrid()
        selected.ShallowCopy(extractSelection.GetOutput())

        self.selectedMapper.SetInputData(selected)
        self.selectedMapper.Update()

    def clickEvent(self, obj, event):
        inter = self.render_window.GetInteractor()

        x, y = inter.GetEventPosition()

        renderer = self.color_renderer

        if renderer:
            picker = vtk.vtkCellPicker()
            picker.SetTolerance(.0005)
            picker.Pick(x, y, 0, renderer)

            cell = picker.GetCellId()
            self.selectCell(cell)
            if cell >= 0:
                self.color = int(cell)

            self.render_window.Render()

    def close(self):
        self.save_button.detach()
        self.cancel_button.detach()
        self.colormap_button.detach()
        self.render_window.GetInteractor().RemoveObserver(self.click_handler)
        self.render_window.GetInteractor().RemoveObserver(self.char_handler)
        self.render_window.Finalize()
        inter = self.render_window.GetInteractor()
        inter.TerminateApp()
        del self.render_window, inter
        if self.parent_interactor:
            self.parent_interactor.Start()
Exemplo n.º 4
0
class ColorPicker(object):
    def __init__(self, width, height, colormap, color, parent_interactor=None, on_save=None, on_cancel=None):
        self.render_window = vtk.vtkRenderWindow()
        self.render_window.SetWindowName("Color Picker")
        self.render_window.SetNumberOfLayers(3)
        self.render_window.SetSize(width, height)
        self.color_renderer = vtk.vtkRenderer()
        self.parent_interactor = parent_interactor

        if colormap is None:
            colormap = "default"
        if not vcs.iscolormap(colormap):
            colormap = vcs.getcolormap(colormap)

        self.colormap = colormap
        self.colors =  [[int(c / 100.0 * 255.0) for c in colormap.index[i]] for i in range(len(colormap.index))]

        self.actor = make_color_plane(16, 16, self.colors)

        self.color_renderer.SetViewport([.1, .1, .9, .9])
        self.color_renderer.SetBackground((.5, .5, .5))
        self.color_renderer.AddActor(self.actor)
        self.color_renderer.InteractiveOff()
        self.color_renderer.SetLayer(1)

        bg = vtk.vtkRenderer()
        bg.SetBackground(1,1,1)
        bg.SetViewport([0,0,1,1])
        bg.SetLayer(0)
        self.render_window.AddRenderer(bg)
        self.render_window.AddRenderer(self.color_renderer)
        inter = vtk.vtkRenderWindowInteractor()

        self.style = vtk.vtkInteractorStyleUser()
        inter.SetInteractorStyle(self.style)
        inter.SetRenderWindow(self.render_window)
        manager = vcs.vtk_ui.manager.get_manager(inter)
        self.render_window.AddRenderer(manager.renderer)
        self.render_window.AddRenderer(manager.actor_renderer)
        manager.elevate()
        self.render_window.Render()

        self.on_save = on_save
        self.on_cancel = on_cancel

        maps = vcs.elements["colormap"]

        current_state = None
        states = []
        self.colormaps = []
        for ind, mapname in enumerate(maps.keys()):
            states.append(ButtonState(label=mapname))
            if colormap.name == mapname:
                current_state = ind
            self.colormaps.append(maps[mapname])

        self.colormap_button = Button(inter, states=states, action=self.change_map, left = 10, top=10)
        self.colormap_button.set_state(current_state)

        self.save_button = Button(inter, action=self.save, label="Choose Color", left=int(width * .75) - 10, top=int(height * .85))
        self.cancel_button = Button(inter, action=self.cancel, label="Cancel", left=10, top=int(height * .85))

        self.colormap_button.show()
        self.save_button.show()
        self.cancel_button.show()

        self.make_current()

        self.selectedMapper = vtk.vtkDataSetMapper()
        self.selectedActor = vtk.vtkActor()
        self.selectedActor.SetMapper(self.selectedMapper);
        self.selectedActor.GetProperty().EdgeVisibilityOn();
        self.selectedActor.GetProperty().SetEdgeColor(0,0,0);
        self.selectedActor.GetProperty().SetLineWidth(3);
        self.color = color
        # Make sure the current color is selected
        self.selectCell(color)
        self.color_renderer.AddActor(self.selectedActor)
        self.click_handler = inter.AddObserver(vtk.vtkCommand.LeftButtonReleaseEvent, self.clickEvent)
        def noop(obj, event):
            pass
        self.char_handler = inter.AddObserver(vtk.vtkCommand.CharEvent, noop)

    def make_current(self):
        self.render_window.MakeCurrent()

    def topRendererAtPoint(self, x, y):
        inter = self.render_window.GetInteractor()

        top = None

        for renderer in collection(inter.GetRenderWindow().GetRenderers()):
            if renderer.IsInViewport(x, y):
                if top is None or top.GetLayer() <= renderer.GetLayer():
                    top = renderer
        return top

    def change_map(self, state):
        self.colormap = self.colormaps[state]
        self.colors =  [[int(c / 100.0 * 255.0) for c in self.colormap.index[i]] for i in range(len(self.colormap.index))]
        colorData = colors_to_scalars(self.colors)
        self.actor.GetMapper().GetInput().GetCellData().SetScalars(colorData)
        self.actor.GetMapper().Update()
        self.render_window.Render()

    def save(self, state):
        if self.on_save is not None:
            self.on_save(self.colormap, self.color)

        self.close()

    def cancel(self, state):
        if self.on_cancel is not None:
            self.on_cancel()

        self.close()

    def selectCell(self, cellId):
        if cellId in (None, -1):
            return
        ids = vtk.vtkIdTypeArray();
        ids.SetNumberOfComponents(1);
        ids.InsertNextValue(cellId);

        selectionNode = vtk.vtkSelectionNode();
        selectionNode.SetFieldType(vtk.vtkSelectionNode.CELL);
        selectionNode.SetContentType(vtk.vtkSelectionNode.INDICES);
        selectionNode.SetSelectionList(ids);

        selection = vtk.vtkSelection();
        selection.AddNode(selectionNode);

        extractSelection = vtk.vtkExtractSelection();

        extractSelection.SetInputData(0, self.actor.GetMapper().GetInput());
        extractSelection.SetInputData(1, selection);

        extractSelection.Update();

        selected = vtk.vtkUnstructuredGrid();
        selected.ShallowCopy(extractSelection.GetOutput());

        self.selectedMapper.SetInputData(selected);
        self.selectedMapper.Update()

    def clickEvent(self, obj, event):
        inter = self.render_window.GetInteractor()

        x, y = inter.GetEventPosition()

        renderer = self.color_renderer

        if renderer:
            picker = vtk.vtkCellPicker()
            picker.SetTolerance(.0005)
            picker.Pick(x, y, 0, renderer)

            cell = picker.GetCellId()
            self.selectCell(cell)
            if cell >= 0:
                self.color = int(cell)

            self.render_window.Render()


    def close(self):
        self.save_button.detach()
        self.cancel_button.detach()
        self.colormap_button.detach()
        self.render_window.GetInteractor().RemoveObserver(self.click_handler)
        self.render_window.GetInteractor().RemoveObserver(self.char_handler)
        self.render_window.Finalize()
        inter = self.render_window.GetInteractor()
        inter.TerminateApp()
        del self.render_window, inter
        if self.parent_interactor:
            self.parent_interactor.Start()