{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import bpy\n", "from IPython.display import display\n", "from anywidget_3dviewer import Viewer\n", "import solara\n", "from pathlib import Path\n", "import molecularnodes as mn\n", "\n", "\n", "\n", "\n", "def make_gltf_model():\n", " bpy.ops.preferences.addon_enable(module=\"io_scene_gltf2\")\n", "\n", " # Delete all mesh objects from the scene\n", " bpy.ops.object.select_all(action=\"DESELECT\")\n", " bpy.ops.object.select_by_type(type=\"MESH\")\n", " bpy.ops.object.delete()\n", "\n", " obj = mn.load.molecule_rcsb(\"1YAR\", starting_style=\"cartoon\", center_molecule=True)\n", " obj.scale = [10, 10, 10]\n", "\n", " bpy.context.view_layer.objects.active = obj\n", " obj.modifiers[\"MolecularNodes\"].node_group.nodes[\"MN_color_attribute_random\"].inputs[\"Lightness\"].default_value = 0.5\n", " obj.modifiers[\"MolecularNodes\"].node_group.nodes[\"MN_color_attribute_random\"].inputs[\"Saturation\"].default_value = 1\n", " obj.modifiers[\"MolecularNodes\"].node_group.nodes[\"MN_color_attribute_random\"].inputs[\"Seed\"].default_value = 1\n", "\n", " for modifier in obj.modifiers:\n", " bpy.ops.object.modifier_apply(modifier=modifier.name)\n", " bpy.ops.geometry.color_attribute_render_set(name=\"Color\")\n", "\n", "\n", " # Exporting the model to .glb format for Three.js\n", " # Specify the path where you want to save the exported model\n", " gltf_path = Path() / \"_MY_MODEL_DATA.gltf\"\n", "\n", " bpy.ops.geometry.color_attribute_render_set(name=\"Color\")\n", "\n", " # Select only the object\n", " bpy.ops.object.select_all(action=\"DESELECT\")\n", " obj.select_set(True)\n", "\n", " # Export the selected obj object to a .glb file\n", " bpy.ops.export_scene.gltf(\n", " filepath=str(gltf_path), export_format=\"GLTF_EMBEDDED\", use_selection=True\n", " )\n", "\n", " data = gltf_path.read_text()\n", "\n", " gltf_path.unlink()\n", "\n", " return data\n", "\n", "\n", "data = make_gltf_model()\n", " \n", "\n", "do_render = solara.reactive(False)\n", "\n", "data = make_gltf_model()\n", "\n", "@solara.component\n", "def Page():\n", "\n", " def render():\n", " if do_render.value:\n", " return data\n", " \n", " result = solara.use_thread(render, [do_render.value])\n", " if not do_render.value:\n", " solara.Button(\"Start Rendering\", on_click=lambda: do_render.set(True), color=\"orange\")\n", " else:\n", " if result.state == solara.ResultState.RUNNING:\n", " solara.Info(\"Rendering in progress...\")\n", " solara.ProgressLinear()\n", " elif result.state == solara.ResultState.ERROR:\n", " solara.Error(\"Rendering failed!: %s\" % result.error)\n", " elif result.state == solara.ResultState.FINISHED:\n", " with solara.Column():\n", " solara.Success(\"Rendering complete. \")\n", " if result.value:\n", " viewer = Viewer(gltf_data=result.value)\n", " solara.FileDownload(data, filename=\"model_cube.gltf\", label=\"Download model.gltf file\")\n", "\n", " display(viewer)\n", "Page()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": ".venv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.13" } }, "nbformat": 4, "nbformat_minor": 2 }