def OBJtoVTP(self, objPath, mtlPath, texPath):
        importer = vtk.vtkOBJImporter()
        importer.SetFileName(objPath)
        importer.SetFileNameMTL(mtlPath)
        importer.SetTexturePath(texPath)
        importer.Update()

        exporter = vtk.vtkSingleVTPExporter()
        exporter.SetRenderWindow(importer.GetRenderWindow())
        # exporter.SetFilePrefix(slicer.app.temporaryPath + os.path.splitext(os.path.basename(objPath))[0])
        exporter.SetFilePrefix(slicer.app.temporaryPath + os.path.sep +
                               "multi-texture-temp")
        print(slicer.app.temporaryPath + os.path.sep + "multi-texture-temp")
        exporter.Write()

        # modelNode = slicer.util.loadModel(slicer.app.temporaryPath + os.path.splitext(os.path.basename(objPath))[0] + ".vtp")
        modelNode = slicer.util.loadModel(slicer.app.temporaryPath +
                                          os.path.sep +
                                          "multi-texture-temp.vtp")

        # textureImageNode = slicer.util.loadVolume(slicer.app.temporaryPath + os.path.splitext(os.path.basename(objPath))[0] + ".png", {'singleFile': True})
        textureImageNode = slicer.util.loadVolume(
            slicer.app.temporaryPath + os.path.sep + "multi-texture-temp.png",
            {'singleFile': True})
        return modelNode, textureImageNode
Example #2
0
def main():
    filename_obj, filename_mtl, texturepath = get_program_parameters()

    importer = vtk.vtkOBJImporter()
    importer.SetFileName(filename_obj)
    importer.SetFileNameMTL(filename_mtl)
    importer.SetTexturePath(texturepath)

    colors = vtk.vtkNamedColors()

    renderer = vtk.vtkRenderer()
    render_window = vtk.vtkRenderWindow()
    render_window_interactor = vtk.vtkRenderWindowInteractor()

    renderer.SetBackground2(colors.GetColor3d("Silver"))
    renderer.SetBackground(colors.GetColor3d("Gold"))
    renderer.GradientBackgroundOn()
    render_window.AddRenderer(renderer)
    renderer.UseHiddenLineRemovalOn()
    render_window.AddRenderer(renderer)
    render_window.SetSize(640, 480)

    render_window_interactor.SetRenderWindow(render_window)
    importer.SetRenderWindow(render_window)
    importer.Update()

    actors = vtk.vtkActorCollection()
    actors = renderer.GetActors()
    actors.InitTraversal()
    print("There are", actors.GetNumberOfItems(), "actors")

    for a in range(0, actors.GetNumberOfItems()):
        print(importer.GetOutputDescription(a))

        actor = actors.GetNextActor()

        # OBJImporter turns texture interpolation off
        if actor.GetTexture():
            print("Hastexture\n")
            actor.GetTexture().InterpolateOn()

        pd = actor.GetMapper().GetInput()
        clean = vtk.vtkCleanPolyData()
        clean.SetInputData(pd)
        clean.Update()

        normals = vtk.vtkPolyDataNormals()

        normals.SetInputData(pd)
        normals.SplittingOff()
        normals.ConsistencyOn()
        normals.Update()
        mapper = actor.GetMapper()
        mapper.SetInputData(normals.GetOutput())
        mapper.SetInputData(pd)

    render_window.Render()
    render_window_interactor.Start()
Example #3
0
def ReadSurf(fileName):

    print("Reading:", fileName)

    fname, extension = os.path.splitext(fileName)
    extension = extension.lower()
    if extension == ".vtk":
        reader = vtk.vtkPolyDataReader()
        reader.SetFileName(fileName)
        reader.Update()
        surf = reader.GetOutput()
    elif extension == ".stl":
        reader = vtk.vtkSTLReader()
        reader.SetFileName(fileName)
        reader.Update()
        surf = reader.GetOutput()
    elif extension == ".off":
        reader = OFFReader()
        reader.SetFileName(fileName)
        reader.Update()
        surf = reader.GetOutput()
    elif extension == ".obj":
        if os.path.exists(fname + ".mtl"):
            obj_import = vtk.vtkOBJImporter()
            obj_import.SetFileName(fileName)
            obj_import.SetFileNameMTL(fname + ".mtl")
            textures_path = os.path.normpath(
                os.path.dirname(fname) + "/../images")
            if os.path.exists(textures_path):
                obj_import.SetTexturePath(textures_path)
            obj_import.Read()

            actors = obj_import.GetRenderer().GetActors()
            actors.InitTraversal()
            append = vtk.vtkAppendPolyData()

            for i in range(actors.GetNumberOfItems()):
                surfActor = actors.GetNextActor()
                append.AddInputData(surfActor.GetMapper().GetInputAsDataSet())

            append.Update()
            surf = append.GetOutput()

        else:
            reader = vtk.vtkOBJReader()
            reader.SetFileName(fileName)
            reader.Update()
            surf = reader.GetOutput()

    return surf
Example #4
0
def importOBJModel(file, texturepath=None):
    importer = vtk.vtkOBJImporter()
    importer.SetFileName(file)
    if texturepath:
        path, _ = os.path.split(texturepath)
        importer.SetFileNameMTL(texturepath)
        importer.SetTexturePath(path)

    ren = vtk.vtkRenderer()
    renwin = vtk.vtkRenderWindow()
    renwin.AddRenderer(ren)
    importer.SetRenderWindow(renwin)
    importer.Update()

    return ren
Example #5
0
def importWindow(fileinput, mtlFile=None, texturePath=None):
    """Import a whole scene from a Numpy or OBJ wavefront file.
    Return ``Plotter`` instance.

    :param str mtlFile: MTL file for OBJ wavefront files.
    :param str texturePath: path of the texture files directory.
    """
    from vtkplotter import Plotter

    if '.npy' in fileinput:
        data = np.load(fileinput, allow_pickle=True, encoding="latin1").flatten()[0]

        if 'renderPointsAsSpheres' in data.keys():
            settings.renderPointsAsSpheres = data['renderPointsAsSpheres']
        if 'renderLinesAsTubes' in data.keys():
            settings.renderLinesAsTubes = data['renderLinesAsTubes']
        if 'hiddenLineRemoval' in data.keys():
            settings.hiddenLineRemoval = data['hiddenLineRemoval']
        if 'visibleGridEdges' in data.keys():
            settings.visibleGridEdges = data['visibleGridEdges']
        if 'interactorStyle' in data.keys():
            settings.interactorStyle = data['interactorStyle']
        if 'useParallelProjection' in data.keys():
            settings.useParallelProjection = data['useParallelProjection']

        axes = data.pop('axes', 4)
        title = data.pop('title', '')
        backgrcol = data.pop('backgrcol', "blackboard")

        vp = Plotter(size=data['size'], # not necessarily a good idea to set it
                     #shape=data['shape'],
                     axes=axes,
                     title=title,
                     bg=backgrcol,
        )
        vp.xtitle = data.pop('xtitle', 'x')
        vp.ytitle = data.pop('ytitle', 'y')
        vp.ztitle = data.pop('ztitle', 'z')

        #print(data.keys())
#        print(data['objects'])
#        exit()

        if 'objects' in data.keys():
            objs = loadNumpy(data['objects'])
            if not utils.isSequence(objs):
               objs = [objs]
        else:
            colors.printc("Trying to import a that was not exported.", c=1)
            colors.printc(" -> try to load a single object with load().", c=1)
            return loadNumpy(fileinput)
        vp.actors = objs

        #    if vp.shape==(1,1):
        #        vp.actors = loadNumpy(data['objects'])
        #    else:
        #        print(objs, )
        #        for a in objs:
        #            for ar in a.renderedAt:
        #                print(vp.shape, [a], ar )
        #                vp.show(a, at=ar)
        return vp

    elif '.obj' in fileinput.lower():

        vp = Plotter()

        importer = vtk.vtkOBJImporter()
        importer.SetFileName(fileinput)
        if mtlFile is not False:
            if mtlFile is None:
                mtlFile = fileinput.replace('.obj', '.mtl').replace('.OBJ', '.MTL')
            importer.SetFileNameMTL(mtlFile)
        if texturePath is not False:
            if texturePath is None:
                texturePath = fileinput.replace('.obj', '.txt').replace('.OBJ', '.TXT')
            importer.SetTexturePath(texturePath)
        importer.SetRenderWindow(vp.window)
        importer.Update()

        actors = vp.renderer.GetActors()
        actors.InitTraversal()
        for i in range(actors.GetNumberOfItems()):
            vactor = actors.GetNextActor()
            act = Mesh(vactor)
            act_tu = vactor.GetTexture()
            if act_tu:
                act_tu.InterpolateOn()
                act.texture(act_tu)
            vp.actors.append( act )
        return vp
    def render_3d_obj_rgb(self, transform_stack, file_name):
        write_image_files = self.config['process_3d']['write_renderings']
        off_screen_rendering = self.config['process_3d'][
            'off_screen_rendering']
        n_views = self.config['data_loader']['args']['n_views']
        img_size = self.config['data_loader']['args']['image_size']
        win_size = img_size

        n_channels = 3
        image_stack = np.zeros((n_views, win_size, win_size, n_channels),
                               dtype=np.float32)

        mtl_name = os.path.splitext(file_name)[0] + '.mtl'
        obj_dir = os.path.dirname(file_name)
        obj_in = vtk.vtkOBJImporter()
        obj_in.SetFileName(file_name)
        obj_in.SetFileNameMTL(mtl_name)
        obj_in.SetTexturePath(obj_dir)
        obj_in.Update()

        # Initialize Camera
        ren = vtk.vtkRenderer()
        ren.SetBackground(1, 1, 1)
        ren.GetActiveCamera().SetPosition(0, 0, 1)
        ren.GetActiveCamera().SetFocalPoint(0, 0, 0)
        ren.GetActiveCamera().SetViewUp(0, 1, 0)
        ren.GetActiveCamera().SetParallelProjection(1)

        # Initialize RenderWindow
        ren_win = vtk.vtkRenderWindow()
        ren_win.AddRenderer(ren)
        ren_win.SetSize(win_size, win_size)
        ren_win.SetOffScreenRendering(off_screen_rendering)

        obj_in.SetRenderWindow(ren_win)
        obj_in.Update()

        props = vtk.vtkProperty()
        props.SetDiffuse(0)
        props.SetSpecular(0)
        props.SetAmbient(1)

        actors = ren.GetActors()
        actors.InitTraversal()
        actor = actors.GetNextItem()
        while actor:
            actor.SetProperty(props)
            actor = actors.GetNextItem()
        del props

        t_pre_trans = self.compute_pre_transformation(file_name)

        t = vtk.vtkTransform()
        t.Identity()
        t.Update()

        w2if = vtk.vtkWindowToImageFilter()
        w2if.SetInput(ren_win)
        writer_png = vtk.vtkPNGWriter()
        writer_png.SetInputConnection(w2if.GetOutputPort())

        start = time.time()
        # for idx in tqdm(range(n_views)):
        for idx in range(n_views):
            name_rendering = self.config.temp_dir / ('rendering' + str(idx) +
                                                     '_RGB.png')

            rx, ry, rz, s, tx, ty = transform_stack[idx]
            # rx,ry,rz,s,tx,ty = no_transform() # debug
            # rx = -20
            # ry = 40
            # rz = 10

            t.Identity()
            t.RotateY(ry)
            t.RotateX(rx)
            t.RotateZ(rz)
            t.Concatenate(t_pre_trans)
            t.Update()

            xmin = -150
            xmax = 150
            ymin = -150
            ymax = 150
            xlen = xmax - xmin
            ylen = ymax - ymin

            cx = 0
            cy = 0
            # extend_factor = 1.0
            s = self.config['pre-align']['scale']
            extend_factor = 1.0 / s
            # The side length of the view frustrum which is rectangular since we use a parallel projection
            side_length = max([xlen, ylen]) * extend_factor
            # zoom_factor = win_size / side_length

            ren.GetActiveCamera().SetParallelScale(side_length / 2)
            ren.GetActiveCamera().SetPosition(cx, cy, 500)
            ren.GetActiveCamera().SetFocalPoint(cx, cy, 0)
            ren.GetActiveCamera().SetViewUp(0, 1, 0)
            ren.GetActiveCamera().ApplyTransform(t.GetInverse())
            ren.ResetCameraClippingRange(
            )  # This approach is not recommended when doing depth rendering

            ren_win.Render()

            if write_image_files:
                w2if.Modified(
                )  # Needed here else only first rendering is put to file
                writer_png.SetFileName(str(name_rendering))
                writer_png.Write()
            else:
                w2if.Modified(
                )  # Needed here else only first rendering is put to file
                w2if.Update()

            # add rendering to image stack
            im = w2if.GetOutput()
            rows, cols, _ = im.GetDimensions()
            sc = im.GetPointData().GetScalars()
            a = vtk_to_numpy(sc)
            components = sc.GetNumberOfComponents()
            a = a.reshape(rows, cols, components)
            a = np.flipud(a)

            image_stack[idx, :, :, :] = a[:, :, :]

        end = time.time()
        print("Pure RGB rendering time: " + str(end - start))

        del obj_in
        del writer_png, w2if
        del ren, ren_win, t
        return image_stack
    def visualise_mesh_and_landmarks(mesh_name, landmarks=None):

        print(
            '###################   utils3d/ render3d/ visualise mesh and landmarks   ################### \n'
        )
        file_type = os.path.splitext(mesh_name)[1]
        win_size = 512

        ren = vtk.vtkRenderer()
        ren.SetBackground(1, 1, 1)

        # Initialize RenderWindow
        ren_win = vtk.vtkRenderWindow()
        ren_win.AddRenderer(ren)
        ren_win.SetSize(win_size, win_size)

        file_read = False
        if file_type == ".obj":
            #print('############# if file type == .obj ############# \n')
            mtl_name = os.path.splitext(mesh_name)[0] + '.mtl'
            # only do this for textured files
            if os.path.isfile(mtl_name):
                obj_dir = os.path.dirname(mesh_name)
                obj_in = vtk.vtkOBJImporter()
                obj_in.SetFileName(mesh_name)
                if os.path.isfile(mtl_name):
                    obj_in.SetFileNameMTL(mtl_name)
                    obj_in.SetTexturePath(obj_dir)
                obj_in.Update()

                obj_in.SetRenderWindow(ren_win)
                obj_in.Update()

                props = vtk.vtkProperty()
                props.SetColor(1, 1, 1)
                props.SetDiffuse(0)
                props.SetSpecular(0)
                props.SetAmbient(1)

                actors = ren.GetActors()
                actors.InitTraversal()
                actor = actors.GetNextItem()
                while actor:
                    actor.SetProperty(props)
                    actor = actors.GetNextItem()
                del props
                file_read = True

        if not file_read and file_type in [
                ".vtk", ".stl", ".ply", ".wrl", ".obj"
        ]:
            #print('############## if not file_read and file_type in ############################### \n ')
            pd = Utils3D.multi_read_surface(mesh_name)
            if pd.GetNumberOfPoints() < 1:
                print('Could not read', mesh_name)
                return None

            texture_img = Utils3D.multi_read_texture(mesh_name)
            if texture_img is not None:
                #print('################ if texture_img is not None. Set 1 ##################### \n')
                pd.GetPointData().SetScalars(None)
                texture = vtk.vtkTexture()
                texture.SetInterpolate(1)
                texture.SetQualityTo32Bit()
                texture.SetInputData(texture_img)

            mapper = vtk.vtkPolyDataMapper()
            mapper.SetInputData(pd)

            actor_text = vtk.vtkActor()
            actor_text.SetMapper(mapper)
            if texture_img is not None:
                #print('################ if texture_img is not None. Set 2   ##################### \n')
                actor_text.SetTexture(texture)
                actor_text.GetProperty().SetColor(1, 1, 1)
                actor_text.GetProperty().SetAmbient(1.0)
                actor_text.GetProperty().SetSpecular(0)
                actor_text.GetProperty().SetDiffuse(0)
            ren.AddActor(actor_text)

        if landmarks is not None:
            #print('###########  if landmarks is not None ################ \n')

            lm_pd = Render3D.get_landmarks_as_spheres(landmarks)

            mapper = vtk.vtkPolyDataMapper()
            mapper.SetInputData(lm_pd)

            actor_lm = vtk.vtkActor()
            actor_lm.SetMapper(mapper)
            actor_lm.GetProperty().SetColor(0, 0, 1)
            ren.AddActor(actor_lm)

        # ren.GetActiveCamera().SetPosition(0, 0, 1)
        # ren.GetActiveCamera().SetFocalPoint(0, 0, 0)
        # ren.GetActiveCamera().SetViewUp(0, 1, 0)
        # ren.GetActiveCamera().SetParallelProjection(1)

        iren = vtk.vtkRenderWindowInteractor()
        style = vtk.vtkInteractorStyleTrackballCamera()
        iren.SetInteractorStyle(style)
        iren.SetRenderWindow(ren_win)

        print(
            '############## ren_win.Render & iren.Start ####################### \n '
        )
        ren_win.Render()
        iren.Start()