import gradio as gr import bpy from tqdm import tqdm from math import pi import tempfile import molecularnodes as mn import os def enable_GPUS(): bpy.data.scenes[0].render.engine = "CYCLES" #"CYCLES" # Set the device_type bpy.context.preferences.addons[ "cycles" ].preferences.compute_device_type = "CUDA" # or "OPENCL" # Set the device and feature set bpy.context.scene.cycles.device = "GPU" for scene in bpy.data.scenes: scene.cycles.device = "GPU" bpy.context.preferences.addons["cycles"].preferences.get_devices() print(bpy.context.preferences.addons["cycles"].preferences.compute_device_type) for d in bpy.context.preferences.addons["cycles"].preferences.devices: d["use"] = True # Using all devices, include GPU and CPU print(d["name"]) enable_GPUS() window = bpy.context.window screen = window.screen style = 'cartoon' nodes_to_append = ["MN_color_set", "MN_color_common", "MN_color_attribute_random", mn.nodes.styles_mapping[style]] def get_areas(type): return [area for area in screen.areas if area.type == type] def get_regions(areas): return [region for region in areas[0].regions if region.type == 'WINDOW'] for node in nodes_to_append: bpy.ops.wm.append( 'INVOKE_DEFAULT', directory = os.path.join(mn.nodes.mn_data_file, 'NodeTree'), filename = node, link = False ) def generate(progress=gr.Progress(track_tqdm=True)): area_type = 'VIEW_3D' areas = get_areas(area_type) with bpy.context.temp_override(window=window, area=areas[0], region=get_regions(areas)[0], screen=screen): for obj in bpy.context.scene.objects: if obj.type == 'MESH': bpy.data.objects.remove(obj, do_unlink=True) molecule = mn.load.molecule_rcsb("7TYG", starting_style=style, center_molecule=True) molecule.select_set(True) bpy.context.view_layer.objects.active = molecule bpy.ops.view3d.camera_to_view_selected() camera = bpy.data.objects["Camera"] camera.data.dof.use_dof = True camera.data.dof.focus_distance = 5 camera.data.dof.aperture_fstop = 4 camera.data.angle = pi / 3 camera.data.type = "PERSP" with tempfile.NamedTemporaryFile(suffix=".JPEG", delete=False) as f: bpy.context.scene.render.resolution_y = 400 bpy.context.scene.render.resolution_x = 600 bpy.context.scene.render.image_settings.file_format = "JPEG" bpy.context.scene.render.filepath = f.name with tqdm() as pbar: def elapsed(dummy): pbar.update() bpy.app.handlers.render_stats.append(elapsed) bpy.context.scene.frame_set(1) bpy.context.scene.frame_current = 1 bpy.ops.render.render(animation=False, write_still=True) bpy.data.images["Render Result"].save_render( filepath=bpy.context.scene.render.filepath ) bpy.app.handlers.render_stats.clear() return f.name with gr.Blocks() as demo: with gr.Row(): with gr.Column(): render_btn = gr.Button("Render") with gr.Column(scale=3): image = gr.Image(type="filepath") render_btn.click( generate, outputs=[image], ) demo.queue(concurrency_count=1) demo.launch(debug=True, inline=True)