diff --git a/src/blender_maxwell/node_trees/maxwell_sim_nodes/nodes/inputs/__init__.py b/src/blender_maxwell/node_trees/maxwell_sim_nodes/nodes/inputs/__init__.py index 0244f95..dd70151 100644 --- a/src/blender_maxwell/node_trees/maxwell_sim_nodes/nodes/inputs/__init__.py +++ b/src/blender_maxwell/node_trees/maxwell_sim_nodes/nodes/inputs/__init__.py @@ -1,21 +1,22 @@ -from . import wave_constant -# from . import unit_system +from . import ( + constants, + unit_system, + wave_constant, + web_importers, +) -from . import constants - -from . import web_importers # from . import file_importers BL_REGISTER = [ *wave_constant.BL_REGISTER, - # *unit_system.BL_REGISTER, + *unit_system.BL_REGISTER, *constants.BL_REGISTER, *web_importers.BL_REGISTER, # *file_importers.BL_REGISTER, ] BL_NODES = { **wave_constant.BL_NODES, - # **unit_system.BL_NODES, + **unit_system.BL_NODES, **constants.BL_NODES, **web_importers.BL_NODES, # *file_importers.BL_REGISTER, diff --git a/src/blender_maxwell/node_trees/maxwell_sim_nodes/nodes/inputs/unit_system.py b/src/blender_maxwell/node_trees/maxwell_sim_nodes/nodes/inputs/unit_system.py index b8a0b38..ee91177 100644 --- a/src/blender_maxwell/node_trees/maxwell_sim_nodes/nodes/inputs/unit_system.py +++ b/src/blender_maxwell/node_trees/maxwell_sim_nodes/nodes/inputs/unit_system.py @@ -1,11 +1,7 @@ -import bpy -import sympy as sp - from ... import contracts as ct from ... import sockets from .. import base - class PhysicalUnitSystemNode(base.MaxwellSimNode): node_type = ct.NodeType.UnitSystem bl_label = 'Unit System' @@ -26,7 +22,7 @@ class PhysicalUnitSystemNode(base.MaxwellSimNode): 'Unit System', input_sockets={'Unit System'}, ) - def compute_value(self, input_sockets) -> dict: + def compute_unit_system(self, input_sockets) -> dict: return input_sockets['Unit System'] diff --git a/src/blender_maxwell/node_trees/maxwell_sim_nodes/sockets/physical/unit_system.py b/src/blender_maxwell/node_trees/maxwell_sim_nodes/sockets/physical/unit_system.py index 4fb985f..bd720bc 100644 --- a/src/blender_maxwell/node_trees/maxwell_sim_nodes/sockets/physical/unit_system.py +++ b/src/blender_maxwell/node_trees/maxwell_sim_nodes/sockets/physical/unit_system.py @@ -1,16 +1,14 @@ -import typing as typ import bpy -import sympy as sp -import sympy.physics.units as spu import pydantic as pyd from .....utils.pydantic_sympy import SympyExpr -from .. import base from ... import contracts as ct +from .. import base ST = ct.SocketType -SU = lambda socket_type: ct.SOCKET_UNITS[socket_type]['values'] +def SU(socket_type): # noqa: N802, D103 + return ct.SOCKET_UNITS[socket_type]['values'] #################### @@ -195,58 +193,69 @@ class PhysicalUnitSystemBLSocket(base.MaxwellSimSocket): def draw_value(self, col: bpy.types.UILayout) -> None: if self.show_definition: - # TODO: We need panels instead of rows!! - col_row = col.row(align=False) - col_row.alignment = 'EXPAND' - col_row.prop(self, 'unit_time', text='') - col_row.prop(self, 'unit_angle', text='') + row = col.row() + row.alignment = 'CENTER' + row.label(text='Time | Angle') + col.prop(self, 'unit_time', text='t') + col.prop(self, 'unit_angle', text='θ') + col.separator(factor=1.0) - col_row = col.row(align=False) - col_row.alignment = 'EXPAND' - col_row.prop(self, 'unit_length', text='') - col_row.prop(self, 'unit_area', text='') - col_row.prop(self, 'unit_volume', text='') + row = col.row() + row.alignment = 'CENTER' + row.label(text='Len | Area | Vol') + col.prop(self, 'unit_length', text='l') + col.prop(self, 'unit_area', text='l²') + col.prop(self, 'unit_volume', text='l³') + col.separator(factor=1.0) - col_row = col.row(align=True) - col_row.alignment = 'EXPAND' - col_row.label(text='Point') - col_row.prop(self, 'unit_point_2d', text='') - col_row.prop(self, 'unit_point_3d', text='') + row = col.row() + row.alignment = 'CENTER' + row.label(text='Point') + col.prop(self, 'unit_point_2d', text='P₂') + col.prop(self, 'unit_point_3d', text='P₃') + col.separator(factor=1.0) - col_row = col.row(align=True) - col_row.alignment = 'EXPAND' - col_row.label(text='Size') - col_row.prop(self, 'unit_size_2d', text='') - col_row.prop(self, 'unit_size_3d', text='') + row = col.row() + row.alignment = 'CENTER' + row.label(text='Size') + col.prop(self, 'unit_size_2d', text='S₂') + col.prop(self, 'unit_size_3d', text='S₃') + col.separator(factor=1.0) - col_row = col.row(align=True) - col_row.alignment = 'EXPAND' - col_row.label(text='Mass') - col_row.prop(self, 'unit_mass', text='') + row = col.row() + row.alignment = 'CENTER' + row.label(text='Mass') + col.prop(self, 'unit_mass', text='M') + col.separator(factor=1.0) - col_row = col.row(align=True) - col_row.alignment = 'EXPAND' - col_row.label(text='Vel') - col_row.prop(self, 'unit_speed', text='') - # col_row.prop(self, "unit_vel_2d_vector", text="") - # col_row.prop(self, "unit_vel_3d_vector", text="") + row = col.row() + row.alignment = 'CENTER' + row.label(text='Vel') + col.prop(self, 'unit_speed', text='|v|') + # col.prop(self, "unit_vel_2d_vector", text="") + # col.prop(self, "unit_vel_3d_vector", text="") + col.separator(factor=1.0) - col_row = col.row(align=True) - col_row.label(text='Accel') - col_row.prop(self, 'unit_accel_scalar', text='') - # col_row.prop(self, "unit_accel_2d_vector", text="") - col_row.prop(self, 'unit_accel_3d', text='') + row = col.row() + row.alignment = 'CENTER' + row.label(text='Accel') + col.prop(self, 'unit_accel_scalar', text='|a|') + # col.prop(self, "unit_accel_2d_vector", text="") + col.prop(self, 'unit_accel_3d', text='a₃') + col.separator(factor=1.0) - col_row = col.row(align=True) - col_row.label(text='Force') - col_row.prop(self, 'unit_force_scalar', text='') - # col_row.prop(self, "unit_force_2d_vector", text="") - col_row.prop(self, 'unit_force_3d', text='') + row = col.row() + row.alignment = 'CENTER' + row.label(text='Force') + col.prop(self, 'unit_force_scalar', text='|F|') + # col.prop(self, "unit_force_2d_vector", text="") + col.prop(self, 'unit_force_3d', text='F₃') + col.separator(factor=1.0) - col_row = col.row(align=True) - col_row.alignment = 'EXPAND' - col_row.label(text='Freq') - col_row.prop(self, 'unit_freq', text='') + row = col.row() + row.alignment = 'CENTER' + row.label(text='Freq') + col.prop(self, 'unit_freq', text='t⁽⁻¹⁾') #################### # - Default Value diff --git a/src/blender_maxwell/preferences.py b/src/blender_maxwell/preferences.py index e111db9..77739a6 100644 --- a/src/blender_maxwell/preferences.py +++ b/src/blender_maxwell/preferences.py @@ -17,8 +17,8 @@ log = simple_logger.get(__name__) # - Preferences #################### class BLMaxwellAddonPrefs(bpy.types.AddonPreferences): - """Manages user preferences and settings for the Blender Maxwell addon. - """ + """Manages user preferences and settings for the Blender Maxwell addon.""" + bl_idname = info.ADDON_NAME ## MUST match addon package name #################### diff --git a/src/blender_maxwell/services/tdcloud.py b/src/blender_maxwell/services/tdcloud.py index 5dfa553..6a04a06 100644 --- a/src/blender_maxwell/services/tdcloud.py +++ b/src/blender_maxwell/services/tdcloud.py @@ -29,10 +29,6 @@ IS_ONLINE = False IS_AUTHENTICATED = False -def is_online(): - return IS_ONLINE - - def set_online(): global IS_ONLINE # noqa: PLW0603 IS_ONLINE = True @@ -99,8 +95,7 @@ class TidyCloudFolders: raise RuntimeError(msg) from ex folders = { - cloud_folder.folder_id: cloud_folder - for cloud_folder in cloud_folders + cloud_folder.folder_id: cloud_folder for cloud_folder in cloud_folders } cls.cache_folders = folders return folders @@ -117,9 +112,7 @@ class TidyCloudFolders: set_online() except td.exceptions.WebError as ex: set_offline() - msg = ( - 'Tried to create cloud folder, but cannot connect to cloud' - ) + msg = 'Tried to create cloud folder, but cannot connect to cloud' raise RuntimeError(msg) from ex if cls.cache_folders is None: @@ -184,9 +177,7 @@ class TidyCloudTasks: """ cache_tasks: typ.ClassVar[dict[CloudTaskID, CloudTask]] = {} - cache_folder_tasks: typ.ClassVar[ - dict[CloudFolderID, set[CloudTaskID]] - ] = {} + cache_folder_tasks: typ.ClassVar[dict[CloudFolderID, set[CloudTaskID]]] = {} cache_task_info: typ.ClassVar[dict[CloudTaskID, CloudTaskInfo]] = {} @classmethod @@ -208,9 +199,7 @@ class TidyCloudTasks: def tasks(cls, cloud_folder: CloudFolder) -> dict[CloudTaskID, CloudTask]: """Get all cloud tasks within a particular cloud folder as a set.""" # Retrieve Cached Tasks - if ( - task_ids := cls.cache_folder_tasks.get(cloud_folder.folder_id) - ) is not None: + if (task_ids := cls.cache_folder_tasks.get(cloud_folder.folder_id)) is not None: return {task_id: cls.cache_tasks[task_id] for task_id in task_ids} # Retrieve Tasks by-Folder @@ -219,9 +208,7 @@ class TidyCloudTasks: set_online() except td.exceptions.WebError as ex: set_offline() - msg = ( - 'Tried to get tasks of a cloud folder, but cannot access cloud' - ) + msg = 'Tried to get tasks of a cloud folder, but cannot access cloud' raise RuntimeError(msg) from ex # No Tasks: Empty Set @@ -231,9 +218,7 @@ class TidyCloudTasks: # Populate Caches ## Direct Task Cache - cloud_tasks = { - cloud_task.task_id: cloud_task for cloud_task in folder_tasks - } + cloud_tasks = {cloud_task.task_id: cloud_task for cloud_task in folder_tasks} cls.cache_tasks |= cloud_tasks ## Task Info Cache @@ -242,9 +227,7 @@ class TidyCloudTasks: task_name=cloud_task.taskName, status=cloud_task.status, created_at=cloud_task.created_at, - cost_est=functools.partial( - td_web.estimate_cost, cloud_task.task_id - ), + cost_est=functools.partial(td_web.estimate_cost, cloud_task.task_id), run_info=cloud_task.get_running_info, callback_url=cloud_task.callback_url, ) @@ -314,18 +297,14 @@ class TidyCloudTasks: task_name=cloud_task.taskName, status=cloud_task.status, created_at=cloud_task.created_at, - cost_est=functools.partial( - td_web.estimate_cost, cloud_task.task_id - ), + cost_est=functools.partial(td_web.estimate_cost, cloud_task.task_id), run_info=cloud_task.get_running_info, callback_url=cloud_task.callback_url, ) ## Task by-Folder Cache if cls.cache_folder_tasks.get(cloud_task.folder_id): - cls.cache_folder_tasks[cloud_task.folder_id].add( - cloud_task.task_id - ) + cls.cache_folder_tasks[cloud_task.folder_id].add(cloud_task.task_id) else: cls.cache_folder_tasks[cloud_task.folder_id] = {cloud_task.task_id} @@ -379,9 +358,7 @@ class TidyCloudTasks: return cls.tasks(cloud_folder)[task_id] @classmethod - def update_tasks( - cls, folder_id: CloudFolderID - ) -> dict[CloudTaskID, CloudTask]: + def update_tasks(cls, folder_id: CloudFolderID) -> dict[CloudTaskID, CloudTask]: """Updates the CloudTask to the latest ex. status attributes.""" # BUG: td_web.core.task_core.SimulationTask.get(task_id) doesn't return the `created_at` field. ## Therefore, we unfortunately need to get all tasks for the folder ID just to update one.