106 lines
2.4 KiB
Python
106 lines
2.4 KiB
Python
|
import functools
|
||
|
import tempfile
|
||
|
from pathlib import Path
|
||
|
import typing as typ
|
||
|
from pathlib import Path
|
||
|
|
||
|
import bpy
|
||
|
import sympy as sp
|
||
|
import pydantic as pyd
|
||
|
import tidy3d as td
|
||
|
import tidy3d.web as _td_web
|
||
|
|
||
|
from ......utils.auth_td_web import g_td_web, is_td_web_authed
|
||
|
from .... import contracts as ct
|
||
|
from .... import sockets
|
||
|
from ... import base
|
||
|
|
||
|
@functools.cache
|
||
|
def task_status(task_id: str):
|
||
|
task = _td_web.api.webapi.get_info(task_id)
|
||
|
return task.status
|
||
|
|
||
|
####################
|
||
|
# - Node
|
||
|
####################
|
||
|
class Tidy3DWebImporterNode(base.MaxwellSimNode):
|
||
|
node_type = ct.NodeType.Tidy3DWebImporter
|
||
|
bl_label = "Tidy3DWebImporter"
|
||
|
|
||
|
input_sockets = {
|
||
|
"Cloud Task": sockets.Tidy3DCloudTaskSocketDef(
|
||
|
task_exists=True,
|
||
|
),
|
||
|
}
|
||
|
output_sockets = {}
|
||
|
|
||
|
####################
|
||
|
# - UI
|
||
|
####################
|
||
|
def draw_info(self, context, layout): pass
|
||
|
|
||
|
####################
|
||
|
# - Output Methods
|
||
|
####################
|
||
|
@base.computes_output_socket(
|
||
|
"FDTD Sim",
|
||
|
input_sockets={"Cloud Task"},
|
||
|
)
|
||
|
def compute_cloud_task(self, input_sockets: dict) -> str:
|
||
|
if not isinstance(task_id := input_sockets["Cloud Task"], str):
|
||
|
msg ="Input task does not exist"
|
||
|
raise ValueError(msg)
|
||
|
|
||
|
# Load the Simulation
|
||
|
td_web = g_td_web(None) ## Presume already auth'ed
|
||
|
with tempfile.NamedTemporaryFile(delete=False) as f:
|
||
|
_path_tmp = Path(f.name)
|
||
|
_path_tmp.rename(f.name + ".json")
|
||
|
path_tmp = Path(f.name + ".json")
|
||
|
|
||
|
cloud_sim = _td_web.api.webapi.load_simulation(
|
||
|
task_id,
|
||
|
path=str(path_tmp),
|
||
|
)
|
||
|
Path(path_tmp).unlink()
|
||
|
|
||
|
return cloud_sim
|
||
|
|
||
|
####################
|
||
|
# - Update
|
||
|
####################
|
||
|
@base.on_value_changed(
|
||
|
socket_name="Cloud Task",
|
||
|
input_sockets={"Cloud Task"}
|
||
|
)
|
||
|
def on_value_changed__cloud_task(self, input_sockets: dict):
|
||
|
task_status.cache_clear()
|
||
|
if (
|
||
|
(task_id := input_sockets["Cloud Task"]) is None
|
||
|
or isinstance(task_id, dict)
|
||
|
or task_status(task_id) != "success"
|
||
|
or not is_td_web_authed
|
||
|
):
|
||
|
if self.loose_output_sockets: self.loose_output_sockets = {}
|
||
|
return
|
||
|
|
||
|
td_web = g_td_web(None) ## Presume already auth'ed
|
||
|
|
||
|
self.loose_output_sockets = {
|
||
|
"FDTD Sim": sockets.MaxwellFDTDSimSocketDef(),
|
||
|
"FDTD Sim Data": sockets.AnySocketDef(),
|
||
|
}
|
||
|
|
||
|
|
||
|
####################
|
||
|
# - Blender Registration
|
||
|
####################
|
||
|
BL_REGISTER = [
|
||
|
Tidy3DWebImporterNode,
|
||
|
]
|
||
|
BL_NODES = {
|
||
|
ct.NodeType.Tidy3DWebImporter: (
|
||
|
ct.NodeCategory.MAXWELLSIM_INPUTS_IMPORTERS
|
||
|
)
|
||
|
}
|