def PyQtGraphTubesAsCirclesTest(tube_file, screenshot): import pyqtgraph as pg import pyqtgraph.opengl as gl from tubetk.numpy import tubes_from_file from tubetk.pyqtgraph import tubes_as_circles tubes = tubes_from_file(tube_file) subsample = 30 tubes = tubes[::subsample] # Setup QApplication qapp = pg.mkQApp() view = gl.GLViewWidget() view.setCameraPosition(distance=200) view.orbit(0., 20.) view.setWindowTitle('PyQtGraphTubePointsTest') view.show() x_grid = gl.GLGridItem() grid_scale = 20 x_grid.rotate(90, 0, 1, 0) x_grid.translate(-10 * grid_scale, 0, 0) y_grid = gl.GLGridItem() y_grid.rotate(90, 1, 0, 0) y_grid.translate(0, -10 * grid_scale, 0) z_grid = gl.GLGridItem() z_grid.translate(0, 0, -10 * grid_scale) for grid in x_grid, y_grid, z_grid: grid.scale(grid_scale, grid_scale, grid_scale) view.addItem(grid) circles = tubes_as_circles(tubes) circles_mesh = gl.GLMeshItem(meshdata=circles, smooth=False) view.addItem(circles_mesh) #return qapp.exec_() view.paintGL() framebuffer = view.grabFrameBuffer() return framebuffer.save(screenshot)
def add_tubes(self): """Add the transformed tubes for the visualization.""" memory = 4 target_iterations = tuple(range(self.logic.iteration, self.logic.iteration - memory, -1)) for it in target_iterations: if it >= 0 and it <= self.logic.number_of_iterations: alpha = np.exp(0.8*(it - self.logic.iteration)) center_color = (0.8, 0.1, 0.25, alpha) center = self.logic.tubes_center if self.logic.progression != None: parameters = self.logic.progression[it]['Parameters'] else: parameters = (0.0, 0.0, 0.0, 0.0, 0.0, 0.0) tubes = tubes_from_file(self.logic.subsampled_tubes) #tubes_color = (0.2, 0.25, 0.75, alpha) if 'TubePointWeightsFile' in self.config and \ os.path.exists(self.config['TubePointWeightsFile']): with open(self.config['TubePointWeightsFile'], 'r') as fp: tube_weights = json.load(fp)['TubePointWeights'] tube_weights = np.array(tube_weights) else: tube_weights = 2./(1. + np.exp(-2 * tubes['Radius'])) tube_weights = tube_weights - tube_weights.min() tube_weights = tube_weights / tube_weights.max() tubes_colors = matplotlib.cm.PuBuGn(tube_weights) tubes_colors[:, 3] = tube_weights**0.5 * alpha circles = tubes_as_circles(tubes, point_colors=tubes_colors) circles_mesh = gl.GLMeshItem(meshdata=circles, glOptions='translucent', smooth=False) if self.logic.progression != None: # TODO: need to verify that this is correct circles_mesh.translate(-center[0], -center[1], -center[2]) r2d = 180. / np.pi circles_mesh.rotate(parameters[0] * r2d, 1, 0, 0, local=False) circles_mesh.rotate(parameters[1] * r2d, 0, 1, 0, local=False) circles_mesh.rotate(parameters[2] * r2d, 0, 0, 1, local=False) circles_mesh.translate(center[0] + parameters[3], center[1] + parameters[4], center[2] + parameters[5]) if it in self.tubes_circles: self.removeItem(self.tubes_circles[it][1]) self.addItem(circles_mesh) sphere = gl.MeshData.sphere(rows=10, cols=20, radius=1.0) center_mesh = gl.GLMeshItem(meshdata=sphere, smooth=False, color=center_color, glOptions='translucent') center_mesh.translate(center[0] + parameters[3], center[1] + parameters[4], center[2] + parameters[5]) if it in self.tubes_circles: self.removeItem(self.tubes_circles[it][2]) self.addItem(center_mesh) self.tubes_circles[it] = [circles, circles_mesh, center_mesh] for it, circs in self.tubes_circles.items(): if not it in target_iterations: self.removeItem(circs[1]) self.removeItem(circs[2]) self.tubes_circles.pop(it)