← back to Handbag Authentication

handbag_data/github_datasets/amazon-berkeley-objects/render/GLBtoX.py

80 lines

""" Run as blender -b -P GLBtoX.py -- regexp
    Converts all glb files with names matching regexp in `SOURCE_DIR` to OBJ files with the same name in `TARGET_DIR`
"""
import os
import os.path as osp
import re
import sys
import traceback

import bpy

sys.path.append(os.path.dirname(__file__))
from blender_misc import eprint, initialize_blender_cuda, import_glb,

# basedir = 'C:\\Users\\Achleshwar\\Desktop\\UCB\\3d_sample_data\\3d_sample_data\\'
SOURCE_DIR = '/home/jazzie/AMAZON3D146K/3dmodels/'
TARGET_DIR = '/home/jazzie/AMAZON3D146K/3dmodels_obj/'

def glb_to_X(glb_path: str, target_dir: str, out_format: str = 'obj') -> None:
    # Delete all objects in scene
    bpy.ops.object.select_all(action='SELECT')
    bpy.ops.object.delete()

    # Import glb
    object = import_glb(glb_path)

    # Select only the mesh object
    bpy.ops.object.select_all(action='DESELECT')
    object.select_set(True)

    # Target filepath
    portion = osp.splitext(osp.basename(glb_path))
    out_file = portion[0]+ "." + out_format
    out_path = osp.join(target_dir, out_file)

    # Export
    if out_format == 'obj':
        bpy.ops.export_scene.obj(filepath = out_path)
    elif out_format == 'ply':
        bpy.ops.export_mesh.ply(filepath = out_path)
    else:
        raise ValueError

if __name__ == "__main__":

    # Initizlize blender
    initialize_blender_cuda()

    # Check if only part of data has to be rerun
    try:
        regexp = str(sys.argv[sys.argv.index('--') + 1])
    except (IndexError, ValueError):
        regexp = ".*"
    pattern = re.compile(regexp)

    for _mi, model_name in enumerate(os.listdir(SOURCE_DIR)):
        if not pattern.match(model_name):
            print(f'Skipping1 {_mi:04d}: {model_name}')
            continue
        if not osp.splitext(model_name)[1]=='.glb':
            print(f'Skipping2 {_mi:04d}: {model_name}')
            continue
        print(f'{_mi:04d}: {model_name}')
        eprint(f'{_mi:04d}: {model_name}')
        glb_path = f'{SOURCE_DIR}/{model_name}'

        try:
            glb_to_X(glb_path, TARGET_DIR, out_format='obj')
        except:
            eprint("*** failed", model_name)
            exc_type, exc_value, exc_traceback = sys.exc_info()
            eprint("*** print_tb:")
            traceback.print_tb(exc_traceback, limit=1, file=sys.stderr)
            eprint("*** print_exception:")
            # exc_type below is ignored on 3.5 and later
            traceback.print_exception(exc_type, exc_value, exc_traceback,
                                    limit=2, file=sys.stderr)
    print('Done')
    eprint('Done')