115 lines
2.3 KiB
Python
115 lines
2.3 KiB
Python
|
import sympy as sp
|
||
|
import sympy.physics.units as spu
|
||
|
import scipy as sc
|
||
|
|
||
|
from ... import contracts
|
||
|
from ... import sockets
|
||
|
from .. import base
|
||
|
|
||
|
class CombineNode(base.MaxwellSimTreeNode):
|
||
|
node_type = contracts.NodeType.Combine
|
||
|
bl_label = "Combine"
|
||
|
#bl_icon = ...
|
||
|
|
||
|
####################
|
||
|
# - Sockets
|
||
|
####################
|
||
|
input_sockets = {}
|
||
|
input_socket_sets = {
|
||
|
"real_3d_vector": {
|
||
|
f"x_{i}": sockets.RealNumberSocketDef(
|
||
|
label=f"x_{i}"
|
||
|
)
|
||
|
for i in range(3)
|
||
|
},
|
||
|
"point_3d": {
|
||
|
axis: sockets.PhysicalLengthSocketDef(
|
||
|
label=axis
|
||
|
)
|
||
|
for i, axis in zip(
|
||
|
range(3),
|
||
|
["x", "y", "z"]
|
||
|
)
|
||
|
},
|
||
|
"size_3d": {
|
||
|
axis_key: sockets.PhysicalLengthSocketDef(
|
||
|
label=axis_label
|
||
|
)
|
||
|
for i, axis_key, axis_label in zip(
|
||
|
range(3),
|
||
|
["x_size", "y_size", "z_size"],
|
||
|
["X Size", "Y Size", "Z Size"],
|
||
|
)
|
||
|
},
|
||
|
}
|
||
|
output_sockets = {}
|
||
|
output_socket_sets = {
|
||
|
"real_3d_vector": {
|
||
|
"real_3d_vector": sockets.Real3DVectorSocketDef(
|
||
|
label="Real 3D Vector",
|
||
|
),
|
||
|
},
|
||
|
"point_3d": {
|
||
|
"point_3d": sockets.PhysicalPoint3DSocketDef(
|
||
|
label="3D Point",
|
||
|
),
|
||
|
},
|
||
|
"size_3d": {
|
||
|
"size_3d": sockets.PhysicalSize3DSocketDef(
|
||
|
label="3D Size",
|
||
|
),
|
||
|
},
|
||
|
}
|
||
|
|
||
|
####################
|
||
|
# - Output Socket Computation
|
||
|
####################
|
||
|
@base.computes_output_socket("real_3d_vector")
|
||
|
def compute_real_3d_vector(self: contracts.NodeTypeProtocol) -> sp.Expr:
|
||
|
x1, x2, x3 = [
|
||
|
self.compute_input(f"x_{i}")
|
||
|
for i in range(3)
|
||
|
]
|
||
|
|
||
|
return (x1, x2, x3)
|
||
|
|
||
|
@base.computes_output_socket("point_3d")
|
||
|
def compute_point_3d(self: contracts.NodeTypeProtocol) -> sp.Expr:
|
||
|
x, y, z = [
|
||
|
self.compute_input(axis)
|
||
|
#spu.convert_to(
|
||
|
# self.compute_input(axis),
|
||
|
# spu.meter,
|
||
|
#) / spu.meter
|
||
|
for axis in ["x", "y", "z"]
|
||
|
]
|
||
|
|
||
|
return sp.Matrix([x, y, z])# * spu.meter
|
||
|
|
||
|
@base.computes_output_socket("size_3d")
|
||
|
def compute_size_3d(self: contracts.NodeTypeProtocol) -> sp.Expr:
|
||
|
x_size, y_size, z_size = [
|
||
|
self.compute_input(axis)
|
||
|
#spu.convert_to(
|
||
|
# self.compute_input(axis),
|
||
|
# spu.meter,
|
||
|
#) / spu.meter
|
||
|
for axis in ["x_size", "y_size", "z_size"]
|
||
|
]
|
||
|
|
||
|
return sp.Matrix([x_size, y_size, z_size])# * spu.meter
|
||
|
|
||
|
|
||
|
|
||
|
####################
|
||
|
# - Blender Registration
|
||
|
####################
|
||
|
BL_REGISTER = [
|
||
|
CombineNode,
|
||
|
]
|
||
|
BL_NODES = {
|
||
|
contracts.NodeType.Combine: (
|
||
|
contracts.NodeCategory.MAXWELLSIM_UTILITIES
|
||
|
)
|
||
|
}
|