- [ ] Does the imaginary part of a complex phasor scale with the real part? Ex. when doing `V/m -> V/um` conversion, does the phase also scale by 1 million?
- [ ] Implement "saved" state for info, and provide the user an indicator that state has been saved w/a button to reset (the state should also be reset when plugging a new data thing in)
- [ ] Fix the check of folders, actually, just fix `tdcloud` in general!
- [ ] Have a visual indicator for the download status of the currently selected task, as well as its data size.
- [ ] If a task is "selected", lock the cloud task socket, so other tasks can't be selected. While that lock is active, expose a real "download" button. Also make the loose output socket and put out a `FlowPending` until the download is available.
- [ ] A manual download button and seperate re-download button (maybe on the side, round reload boi).
- [ ] An option to pack the data into the blend, with overview of how much data it will take (Base85/base64 has overhead).
- [ ] Default limits for caching/packing.
- [ ] Support importing batched simulations and outputting an `Array` of SimData.
- [ ] File Import / Data File Import
- [ ] Implement `FlowKind.LazyValueFunc` that plays the loading game.
- [ ] Implement `FlowKind.Info` which lets the user describe the data being loaded, for proper further processing.
- [ ] Implement unit system input to guide conversion from numpy data type.
- [ ] Implement datatype dropdown to guide format from disk, prefilled to detected.
- [ ] Implement `FlowKind.Array` that just runs the `LazyValueFunc` as usual.
- [ ] Implement by migrating the material data fitting logic from the `Tidy3D File Importer`, except now only accept a `Data` input socket, and rely on the `Data File Importer` to do the parsing into an acceptable `Data` socket format.
- [ ] Save the result in the node, specifically in a property (serialized!) and lock the input graph while saved.
- [ ] Toggleable option to push-sync the simulation time duration to the scene end time (how to handle FPS vs time-step? Should we adjust the FPS such that there is one time step per frame, while keeping the definition of "second" aligned to the Blender unit system?)
- [ ]`log.error` should invoke `self.report` in some Blender operator - used for errors that are due to usage error (which can't simply be prevented with UX design, like text file formatting of import), not due to error in the program.
- Perhaps keep node / socket versions in a property, so that trying to load an incompatible major version hop can error w/indicator of where to find a compatible `blender_maxwell` version.
- [ ] Implement image-based empty connected to an image (which is managed by a different ManagedImage owned by the same node instance)
- [ ] Implement ManagedVol
- [ ] Implement loading the xarray-defined voxels into OpenVDB, saving it, and loading it as a managed BL object with the volume setting.
- [ ] Implement basic jax-driven volume voxel processing, especially cube based slicing.
- [ ] Implement jax-driven linear interpolation of volume voxels to an image texture, whose pixels are sized according to the dimensions of another managed plane object (perhaps a uniquely described Managed BL object itself).
- ModeSpec, for use by ModeSource, ModeMonitor, ModeSolverMonitor. Data includes ModeSolverData, ModeData, ScalarModeFieldDataArray, ModeAmpsDataArray, ModeIndexDataArray, ModeSolver.
- PR has been merged: <https://projects.blender.org/blender/blender/commit/14106150797a6ce35e006ffde18e78ea7ae67598> (for now, just use the "Combine" node and have seperate socket types for both).
- The `Combine` node has its own benefits, including previewability of "only structures". Multi-input would mainly be a kind of shorthand in specific cases (like input to the `Combine` node?)
- Can't update `items` using `id_properties_ui` of `EnumProperty`. Maybe less a bug than an annoyance.
- **Matrix Display Bug**: The data given to matrix properties is entirely ignored in the UI; the data is flattened, then left-to-right, up-to-down, the data is inserted. It's neither row-major nor column-major - it's completely flat.
- Though, if one wanted row-major (**as is consistent with `mathutils.Matrix`**), one would be disappointed - the UI prints the matrix property column-major
- Trying to set the matrix property with a `mathutils.Matrix` is even stranger - firstly, the size of the `mathutils.Matrix` must be transposed with respect to the property size (again the col/row major mismatch). But secondly, even when accounting for the col/row major mismatch, the values of a ex. 2x3 (row-major) matrix (written to with a 3x2 matrix with same flattened sequence) is written in a very strange order:
- **Workaround (write)**: Simply flatten the 2D array, re-shape by `[cols,rows]`. The UI will display as the original array. `myarray.flatten().reshape([cols,rows])`.
- **Workaround (read)**: `np.array([[el1 for el1 in el0] for el0 in BLENDER_OBJ.matrix_prop]).flatten().reshape([rows,cols])`. Simply flatten the property read 2D array and re-shape by `[rows,cols]`. Mind that data type out is equal to data type in.
- Also, for bool matrices, `toggle=True` has no effect. `alignment='CENTER'` also doesn't align the checkboxes in their cells.
- Directly running `SimulationTask.get()` is missing fields - it doesn't return some fields, including `created_at`. Listing tasks by folder is not broken.
- [ ] Preferences-based specification/alteration of default unit systems for Tidy3D and Blender.
- [ ] Preferences-based specification/alteration of Tidy3D API key, so we can factor away all the `prelock` bullshit.
- [ ] Subsockets
- We need Exprs to not be so picky.
- All the sympy-making nodes should be subsockets of Expr, so that you can plug any socket that should work with Expr into Expr.
- When it comes to Data, any Expr that produces an array-like output from its `LazyValueFunc` should be deemed compatible (as in, the Expr may plug into a Data socket).
- Specifically, that means the presence of a well-defined `Info`, as well as `jax` compatibility.
- [ ] Symbolic Expr Socket
- [ ] Nodes should be able to dynamically define new symbols on their Expr sockets.
- [ ] Expr's `FlowKind`s should be expanded:
- [ ]`Capabilities`: Expand to include subsocket checking, where Expr is the supersocket of ex. most/all of the physical, numerical, vector sockets.
- [ ]`Value`: Just the raw sympy expression, when `active_kind` is `Value`.
- [ ]`Array`: The evaluated `LazyValueFunc`, when `active_kind` is `Array`.
- Should require that the expression as a whole simplifies to `sp.Matrix`.
- Should require that there are no symbols to be defined in a socket (since `LazyValueFunc` must be called with no args).
- [ ]`LazyValueFunc`: Create a 'jax' function from an expression, such that each symbol becomes an argument to that function.
- When `active_kind` is `Value`, it should take arrays/scalars and return a scalar (expression output is a normal sympy number of some kind).
- When `active_kind` is `Array`, it should take arrays/scalars and return an array (expression output is `sp.Matrix`).
- This kind of approach allows using
- [ ]`LazyValueRange`: Expose two expressions, start/end, but with one symbol set.
- [ ]`Info`: Should always produce an `InfoFlow` that, at minimum, has an empty `dim_*`, an `output_shape` of `None`, etc., for a scalar.
- [ ] Implement an Expr Constant node to see all this through in prototype.
- [ ] Expr: Obviously, input and output.
- [ ] Symbols: Node-bound dynamic thing where you can add and subtract symbols, as well as set their type. They should popup in the `Let:` statement of the input expr socket.
- [ ] Examples: Each symbol should have the ability to set "example values", which causes the Node to fill `Params`. When all
- [ ] Report reason for no-link using `self.report`.
- [ ] Dropping a link on empty space should query a menu of possible nodes, or if only one node is reasonable, make that node.
- [ ] Shader visualizations approximated from medium `nk` into a shader node graph, aka. a generic BSDF.
- [ ] Easy conversion of lazyarrayrange to mu/sigma frequency for easy computation of pulse fits from data.
- [ ] IDEA: Hand-craft a faster `spu.convert_to`. <https://github.com/sympy/sympy/blob/a44299273eeb4838beaee9af3b688f2f44d7702f/sympy/physics/units/util.py#L51-L129>
- [ ] We should probably communicate with the `sympy` upstream about our deep usage of unit systems. They might be interested in the various workarounds :)