From c06d83300417c198a2175b0aeddbf5d8918286aa Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Fri, 31 May 2024 21:54:21 +0200 Subject: [PATCH 001/211] draft --- magpylib/_src/display/display.py | 17 +++++++------ magpylib/_src/display/traces_generic.py | 8 +++++-- magpylib/_src/display/traces_utility.py | 32 ++++++++++++++++--------- magpylib/_src/utility.py | 19 +++++++++++++++ 4 files changed, 54 insertions(+), 22 deletions(-) diff --git a/magpylib/_src/display/display.py b/magpylib/_src/display/display.py index 946144312..2cbaadf2e 100644 --- a/magpylib/_src/display/display.py +++ b/magpylib/_src/display/display.py @@ -11,6 +11,7 @@ from magpylib._src.defaults.defaults_utility import get_defaults_dict from magpylib._src.display.traces_generic import MagpyMarkers from magpylib._src.display.traces_generic import get_frames +from magpylib._src.display.traces_utility import DEFAULT_ROW_COL_PARAMS from magpylib._src.display.traces_utility import process_show_input_objs from magpylib._src.input_checks import check_format_input_backend from magpylib._src.input_checks import check_format_input_vector @@ -141,9 +142,6 @@ def get_show_func(backend): ) -ROW_COL_SPECIFIC_NAMES = ("row", "col", "output", "sumup", "pixel_agg", "in_out") - - def infer_backend(canvas): """Infers the plotting backend from canvas and environment""" # pylint: disable=import-outside-toplevel @@ -193,9 +191,10 @@ def _show( # process input objs objects, obj_list_flat, max_rows, max_cols, subplot_specs = process_show_input_objs( - objects, **{k: v for k, v in kwargs.items() if k in ROW_COL_SPECIFIC_NAMES} + objects, + **{k: v for k, v in kwargs.items() if k in DEFAULT_ROW_COL_PARAMS}, ) - kwargs = {k: v for k, v in kwargs.items() if k not in ROW_COL_SPECIFIC_NAMES} + kwargs = {k: v for k, v in kwargs.items() if k not in DEFAULT_ROW_COL_PARAMS} kwargs["max_rows"], kwargs["max_cols"] = max_rows, max_cols kwargs["subplot_specs"] = subplot_specs @@ -407,9 +406,9 @@ def show( } ) if ctx.isrunning: - rco = {k: v for k, v in kwargs.items() if k in ROW_COL_SPECIFIC_NAMES} + rco = {k: v for k, v in kwargs.items() if k in DEFAULT_ROW_COL_PARAMS} ctx.kwargs.update( - {k: v for k, v in kwargs.items() if k not in ROW_COL_SPECIFIC_NAMES} + {k: v for k, v in kwargs.items() if k not in DEFAULT_ROW_COL_PARAMS} ) ctx_objects = tuple({**o, **rco} for o in ctx.objects_from_ctx) objects, *_ = process_show_input_objs(ctx_objects + objects, **rco) @@ -452,11 +451,11 @@ def show_context( ) try: ctx.isrunning = True - rco = {k: v for k, v in kwargs.items() if k in ROW_COL_SPECIFIC_NAMES} + rco = {k: v for k, v in kwargs.items() if k in DEFAULT_ROW_COL_PARAMS} objects, *_ = process_show_input_objs(objects, **rco) ctx.objects_from_ctx += tuple(objects) ctx.kwargs.update( - {k: v for k, v in kwargs.items() if k not in ROW_COL_SPECIFIC_NAMES} + {k: v for k, v in kwargs.items() if k not in DEFAULT_ROW_COL_PARAMS} ) yield ctx ctx.show_return_value = _show(*ctx.objects, **ctx.kwargs) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index 9d82a48cb..e6542bd20 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -419,6 +419,7 @@ def get_generic_traces( extra_backend=False, row=1, col=1, + units_length="mm", **kwargs, ) -> list: """ @@ -530,7 +531,9 @@ def get_generic_traces( name_suff = tr.pop("name_suffix", None) name = tr.get("name", "") if legendtext is None else legendtext for orient, pos in zip(orientations, positions): - tr1 = place_and_orient_model3d(tr, orientation=orient, position=pos) + tr1 = place_and_orient_model3d( + tr, orientation=orient, position=pos, units_length=units_length + ) if name_suff is not None: tr1["name"] = f"{name}{name_suff}" temp_rot_traces.append(tr1) @@ -788,12 +791,13 @@ def get_row_col_traces(flat_objs_props, extra_backend=False, autosize=None, **kw if len(rco_obj) >= 2 and style_temp: # deepcopy style only if obj is in multiple subplots. obj._style = style_temp.copy() - params["row"], params["col"], output_typ = rco + params["row"], params["col"], output_typ, units_length = rco if output_typ == "model3d": out_traces = get_generic_traces( obj, extra_backend=extra_backend, autosize=autosize, + units_length=units_length, **params, ) if extra_backend: diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index d0851986e..d82ca65a9 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -13,6 +13,17 @@ from magpylib._src.defaults.defaults_utility import linearize_dict from magpylib._src.style import get_style from magpylib._src.utility import format_obj_input +from magpylib._src.utility import get_unit_factor + +DEFAULT_ROW_COL_PARAMS = { + "row": 1, + "col": 1, + "output": "model3d", + "sumup": True, + "pixel_agg": "mean", + "in_out": "auto", + "units_length": "m", +} def get_legend_label(obj, style=None, suffix=True): @@ -34,17 +45,21 @@ def get_legend_label(obj, style=None, suffix=True): def place_and_orient_model3d( model_kwargs, + *, model_args=None, orientation=None, position=None, coordsargs=None, scale=1, return_model_args=False, + units_length="m", **kwargs, ): """places and orients mesh3d dict""" - if orientation is None and position is None: + if orientation is None and position is None and units_length == "m" and scale == 1: return {**model_kwargs, **kwargs} + unit_factor = get_unit_factor(units_length, target_unit="m") + scale_factor = scale / unit_factor position = (0.0, 0.0, 0.0) if position is None else position position = np.array(position, dtype=float) new_model_dict = {} @@ -63,7 +78,7 @@ def place_and_orient_model3d( if orientation is not None: vertices = orientation.apply(vertices) - new_vertices = (vertices * scale + position).T + new_vertices = (vertices * scale_factor + position).T new_vertices = np.reshape(new_vertices, vert_shape) for i, k in enumerate("xyz"): key = coordsargs[k] @@ -257,7 +272,9 @@ def get_flatten_objects_properties(*objs, colorsequence, **kwargs): props["row_cols"] = flat_objs[subobj]["row_cols"] elif "row_cols" not in props: props["row_cols"] = [] - props["row_cols"].extend([(obj["row"], obj["col"], obj["output"])]) + props["row_cols"].extend( + [(obj["row"], obj["col"], obj["output"], obj["units_length"])] + ) flat_objs.update(flat_sub_objs) kwargs = {k: v for k, v in kwargs.items() if not k.startswith("style")} return flat_objs, kwargs @@ -578,14 +595,7 @@ def subdivide_mesh_by_facecolor(trace): def process_show_input_objs(objs, **kwargs): """Extract max_rows and max_cols from obj list of dicts""" - defaults = { - "row": 1, - "col": 1, - "output": "model3d", - "sumup": True, - "pixel_agg": "mean", - "in_out": "auto", - } + defaults = DEFAULT_ROW_COL_PARAMS.copy() max_rows = max_cols = 1 flat_objs = [] new_objs = {} diff --git a/magpylib/_src/utility.py b/magpylib/_src/utility.py index d62d377c1..75d3d1e30 100644 --- a/magpylib/_src/utility.py +++ b/magpylib/_src/utility.py @@ -237,6 +237,25 @@ def filter_objects(obj_list, allow="sources+sensors", warn=True): 24: "Y", # yotta } +_UNIT_PREFIX_REVERSED = {v: k for k, v in _UNIT_PREFIX.items()} + + +@lru_cache(maxsize=None) +def get_unit_factor(unit_input, *, target_unit): + """return unit factor based on input and target unit""" + pref, factor_power = "", None + if unit_input: + if len(unit_input) == 2: + pref, *_ = unit_input + factor_power = _UNIT_PREFIX_REVERSED.get(pref, None) + if factor_power is None or len(unit_input) > 2: + valid_inputs = [f"{k}{target_unit}" for k in _UNIT_PREFIX_REVERSED] + raise ValueError( + f"Invalid unit input, must be one of {valid_inputs} got {unit_input!r}" + ) + factor = 10**factor_power + return factor + def unit_prefix(number, unit="", precision=3, char_between="") -> str: """ From b110200924bbffe62543e69c4b75ea093d284c38 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Sun, 2 Jun 2024 01:04:25 +0200 Subject: [PATCH 002/211] add zoom by subplots, fix axes labeling --- magpylib/_src/display/backend_matplotlib.py | 5 +- magpylib/_src/display/backend_plotly.py | 36 ++++-- magpylib/_src/display/display.py | 6 - magpylib/_src/display/traces_generic.py | 133 +++++++++++--------- magpylib/_src/display/traces_utility.py | 97 +++++++------- 5 files changed, 156 insertions(+), 121 deletions(-) diff --git a/magpylib/_src/display/backend_matplotlib.py b/magpylib/_src/display/backend_matplotlib.py index 3aecfbdcb..1ad47e747 100644 --- a/magpylib/_src/display/backend_matplotlib.py +++ b/magpylib/_src/display/backend_matplotlib.py @@ -249,6 +249,7 @@ def display_matplotlib( """Display objects and paths graphically using the matplotlib library.""" frames = data["frames"] ranges = data["ranges"] + labels = data["labels"] fig_kwargs = {} if not fig_kwargs else fig_kwargs fig_kwargs = {"dpi": 80, **fig_kwargs} @@ -353,8 +354,8 @@ def draw_frame(frame_ind): count = count_with_labels.get(row_col_num, 0) if ax.name == "3d": ax.set( - **{f"{k}label": f"{k} (m)" for k in "xyz"}, - **{f"{k}lim": r for k, r in zip("xyz", ranges)}, + **{f"{k}label": labels[row_col_num][k] for k in "xyz"}, + **{f"{k}lim": r for k, r in zip("xyz", ranges[row_col_num])}, ) ax.set_box_aspect(aspect=(1, 1, 1)) if 0 < count <= legend_maxitems: diff --git a/magpylib/_src/display/backend_plotly.py b/magpylib/_src/display/backend_plotly.py index 56efb9a97..eca3fae77 100644 --- a/magpylib/_src/display/backend_plotly.py +++ b/magpylib/_src/display/backend_plotly.py @@ -75,7 +75,7 @@ def match_args(ttype: str): return set(named_args) -def apply_fig_ranges(fig, ranges, apply2d=True): +def apply_fig_ranges(fig, ranges, labels, apply2d=True): """This is a helper function which applies the ranges properties of the provided `fig` object according to a provided ranges. All three space direction will be equal and match the maximum of the ranges needed to display all objects, including their paths. @@ -92,15 +92,26 @@ def apply_fig_ranges(fig, ranges, apply2d=True): ------- None: NoneType """ - fig.update_scenes( - **{ - f"{k}axis": {"range": ranges[i], "autorange": False, "title": f"{k} (m)"} - for i, k in enumerate("xyz") - }, - aspectratio={k: 1 for k in "xyz"}, - aspectmode="manual", - camera_eye={"x": 1, "y": -1.5, "z": 1.4}, - ) + for rc, ranges in ranges.items(): + row, col = rc + kwargs = { + **{ + f"{k}axis": { + "range": ranges[i], + "autorange": False, + "title": labels[rc][k], + } + for i, k in enumerate("xyz") + }, + "aspectratio": {k: 1 for k in "xyz"}, + "aspectmode": "manual", + "camera_eye": {"x": 1, "y": -1.5, "z": 1.4}, + } + + # pylint: disable=protected-access + if fig._grid_ref is not None: + kwargs.update({"row": row, "col": col}) + fig.update_scenes(**kwargs) if apply2d: apply_2d_ranges(fig) @@ -274,7 +285,6 @@ def process_extra_trace(model): def display_plotly( data, - zoom=1, canvas=None, renderer=None, return_fig=False, @@ -347,9 +357,9 @@ def display_plotly( ) ranges = data["ranges"] if extra_data: - ranges = get_scene_ranges(*frames[0]["data"], zoom=zoom) + ranges = get_scene_ranges(*frames[0]["data"]) if update_layout: - apply_fig_ranges(fig, ranges, apply2d=isanimation) + apply_fig_ranges(fig, ranges, labels=data["labels"], apply2d=isanimation) fig.update_layout( legend_itemsizing="constant", # legend_groupclick="toggleitem", diff --git a/magpylib/_src/display/display.py b/magpylib/_src/display/display.py index 2cbaadf2e..6086313b2 100644 --- a/magpylib/_src/display/display.py +++ b/magpylib/_src/display/display.py @@ -55,7 +55,6 @@ def show( cls, *objs, backend, - zoom=0, title=None, max_rows=None, max_cols=None, @@ -118,13 +117,11 @@ def show( objs, supports_colorgradient=self.supports["colorgradient"], backend=backend, - zoom=zoom, title=title, **frame_kwargs, ) return self.show_func_getter()( data, - zoom=zoom, max_rows=max_rows, max_cols=max_cols, subplot_specs=subplot_specs, @@ -180,7 +177,6 @@ def _show( *objects, backend=None, animation=False, - zoom=0, markers=None, **kwargs, ): @@ -203,7 +199,6 @@ def _show( # input checks backend = check_format_input_backend(backend) - check_input_zoom(zoom) check_input_animation(animation) check_format_input_vector( markers, @@ -231,7 +226,6 @@ def _show( return RegisteredBackend.show( backend=backend, *objects, - zoom=zoom, animation=animation, **kwargs, ) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index e6542bd20..2b28f6702 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -20,10 +20,11 @@ from magpylib._src.defaults.defaults_utility import ALLOWED_SYMBOLS from magpylib._src.defaults.defaults_utility import linearize_dict from magpylib._src.display.traces_utility import draw_arrowed_line -from magpylib._src.display.traces_utility import get_flatten_objects_properties from magpylib._src.display.traces_utility import get_legend_label +from magpylib._src.display.traces_utility import get_objects_props_by_row_col from magpylib._src.display.traces_utility import get_rot_pos_from_path from magpylib._src.display.traces_utility import get_scene_ranges +from magpylib._src.display.traces_utility import get_unit_factor from magpylib._src.display.traces_utility import getColorscale from magpylib._src.display.traces_utility import getIntensity from magpylib._src.display.traces_utility import group_traces @@ -246,7 +247,7 @@ def get_trace2D_dict( return trace -def get_generic_traces_2D( +def get_traces_2D( *, objects, output=("Bx", "By", "Bz"), @@ -409,7 +410,7 @@ def process_extra_trace(model): return trace3d -def get_generic_traces( +def get_generic_traces3D( input_obj, autosize=None, legendgroup=None, @@ -719,7 +720,7 @@ def extract_animation_properties( return path_indices, exp, frame_duration -def draw_frame(objs, colorsequence=None, zoom=0.0, autosize=None, **kwargs) -> Tuple: +def draw_frame(objs, colorsequence=None, autosize=None, **kwargs) -> Tuple: """ Creates traces from input `objs` and provided parameters, updates the size of objects like Sensors and Dipoles in `kwargs` depending on the canvas size. @@ -738,82 +739,101 @@ def draw_frame(objs, colorsequence=None, zoom=0.0, autosize=None, **kwargs) -> T style_path_frames = kwargs.get( "style_path_frames", [-1] ) # get before next func strips style - flat_objs_props, kwargs = get_flatten_objects_properties( + objs_props_by_row_col, kwargs = get_objects_props_by_row_col( *objs, colorsequence=colorsequence, **kwargs ) - traces_dict, traces_to_resize_dict, extra_backend_traces = get_row_col_traces( - flat_objs_props, **kwargs - ) - traces = [t for tr in traces_dict.values() for t in tr] - ranges = get_scene_ranges(*traces, *extra_backend_traces, zoom=zoom) - if autosize is None or autosize == "return": - # pylint: disable=no-member - autosize = np.mean(np.diff(ranges)) / default_settings.display.autosizefactor - - traces_dict_2, _, extra_backend_traces2 = get_row_col_traces( - traces_to_resize_dict, autosize=autosize, **kwargs - ) - traces_dict.update(traces_dict_2) - extra_backend_traces.extend(extra_backend_traces2) + traces_dict = {} + extra_backend_traces = [] + autosize_out = {} + labels = {} + zoom = {} + for rc, objs_props in objs_props_by_row_col.items(): + if objs_props["rc_params"]["output"] != "model3d": + continue + rc_keys = ("row", "col", "units_length") + rc_params = {k: v for k, v in objs_props["rc_params"].items() if k in rc_keys} + traces_dict_1, extra_backend_traces_1 = get_traces_3D( + objs_props["objects"], **rc_params, **kwargs + ) + if autosize is None or autosize == "return": + labels[rc] = {k: f"{k} ({rc_params['units_length']})" for k in "xyz"} + zoom[rc] = objs_props["rc_params"]["zoom"] + traces = [t for tr in traces_dict_1.values() for t in tr] + ranges = get_scene_ranges( + *traces, *extra_backend_traces_1, zoom=objs_props["rc_params"]["zoom"] + ) + # pylint: disable=no-member + unit_factor = get_unit_factor(rc_params["units_length"], target_unit="m") + autosize_out[rc] = ( + np.mean(np.diff(ranges[rc])) / default_settings.display.autosizefactor + ) * unit_factor + to_resize_keys = { + k for k, v in traces_dict_1.items() if v and "_autosize" in v[0] + } + flat_objs_props = { + k: v for k, v in objs_props["objects"].items() if k in to_resize_keys + } + traces_dict_2, extra_backend_traces_2 = get_traces_3D( + flat_objs_props, autosize=autosize_out.get(rc, None), **rc_params, **kwargs + ) + traces_dict.update( + {(k, *rc): v for k, v in {**traces_dict_1, **traces_dict_2}.items()} + ) + extra_backend_traces.extend([*extra_backend_traces_1, *extra_backend_traces_2]) traces = group_traces(*[t for tr in traces_dict.values() for t in tr]) + obj_list_2d = [o for o in objs if o["output"] != "model3d"] for objs_2d in obj_list_2d: - traces2d = get_generic_traces_2D( + traces2d = get_traces_2D( **objs_2d, style_path_frames=style_path_frames, ) traces.extend(traces2d) - return traces, autosize, ranges, extra_backend_traces + return ( + traces, + extra_backend_traces, + {"autosize": autosize_out, "labels": labels, "zoom": zoom}, + ) -def get_row_col_traces(flat_objs_props, extra_backend=False, autosize=None, **kwargs): +def get_traces_3D(flat_objs_props, extra_backend=False, autosize=None, **kwargs): """Return traces, traces to resize and extra_backend_traces""" # pylint: disable=protected-access extra_backend_traces = [] traces_dict = {} - traces_to_resize_dict = {} for obj, params in flat_objs_props.items(): - params.update(kwargs) if autosize is None and getattr(obj, "_autosize", False): - traces_to_resize_dict[obj] = {**params} # temporary coordinates to be able to calculate ranges x, y, z = obj._position.T - traces_dict[obj] = [{"x": x, "y": y, "z": z}] + traces_dict[obj] = [{"x": x, "y": y, "z": z, "_autosize": True}] else: + params.update(kwargs) traces_dict[obj] = [] - rco_obj = params.pop("row_cols") orig_style = getattr(obj, "_style", None) try: style_temp = params.pop("style", None) - for rco in rco_obj: - # temporary replace style attribute - obj._style = style_temp - if len(rco_obj) >= 2 and style_temp: - # deepcopy style only if obj is in multiple subplots. - obj._style = style_temp.copy() - params["row"], params["col"], output_typ, units_length = rco - if output_typ == "model3d": - out_traces = get_generic_traces( - obj, - extra_backend=extra_backend, - autosize=autosize, - units_length=units_length, - **params, - ) - if extra_backend: - extra_backend_traces.extend( - out_traces.get(extra_backend, []) - ) - traces_dict[obj].extend(out_traces["generic"]) + # temporary replace style attribute + obj._style = style_temp + if style_temp: + # deepcopy style only if obj is in multiple subplots. + obj._style = style_temp.copy() + out_traces = get_generic_traces3D( + obj, + extra_backend=extra_backend, + autosize=autosize, + **params, + ) + if extra_backend: + extra_backend_traces.extend(out_traces.get(extra_backend, [])) + traces_dict[obj].extend(out_traces["generic"]) finally: obj._style = orig_style - return traces_dict, traces_to_resize_dict, extra_backend_traces + return traces_dict, extra_backend_traces def get_frames( objs, colorsequence=None, - zoom=1, title=None, animation=False, supports_colorgradient=True, @@ -847,25 +867,25 @@ def get_frames( ) # create frame for each path index or downsampled path index frames = [] - autosize = "return" + title_str = title + rc_params = {"autosize": "return"} for i, ind in enumerate(path_indices): extra_backend_traces = [] if animation: kwargs["style_path_frames"] = [ind] title = "Animation 3D - " if title is None else title title_str = f"""{title}path index: {ind+1:0{exp}d}""" - traces, autosize_init, ranges, extra_backend_traces = draw_frame( + traces, extra_backend_traces, rc_params_temp = draw_frame( objs, - colorsequence, - zoom, - autosize=autosize, + colorsequence=colorsequence, + autosize=rc_params["autosize"], supports_colorgradient=supports_colorgradient, extra_backend=backend, **kwargs, ) if i == 0: # get the dipoles and sensors autosize from first frame - autosize = autosize_init + rc_params = rc_params_temp frames.append( { "data": traces, @@ -877,10 +897,11 @@ def get_frames( clean_legendgroups(frames) traces = [t for frame in frames for t in frame["data"]] - ranges = get_scene_ranges(*traces, *extra_backend_traces, zoom=zoom) + ranges = get_scene_ranges(*traces, *extra_backend_traces, zoom=rc_params["zoom"]) out = { "frames": frames, "ranges": ranges, + "labels": rc_params["labels"], "input_kwargs": {**kwargs, **animation_kwargs}, } if animation: diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index d82ca65a9..ca627da07 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -22,6 +22,7 @@ "sumup": True, "pixel_agg": "mean", "in_out": "auto", + "zoom": 0, "units_length": "m", } @@ -58,8 +59,7 @@ def place_and_orient_model3d( """places and orients mesh3d dict""" if orientation is None and position is None and units_length == "m" and scale == 1: return {**model_kwargs, **kwargs} - unit_factor = get_unit_factor(units_length, target_unit="m") - scale_factor = scale / unit_factor + length_factor = get_unit_factor(units_length, target_unit="m") position = (0.0, 0.0, 0.0) if position is None else position position = np.array(position, dtype=float) new_model_dict = {} @@ -78,7 +78,7 @@ def place_and_orient_model3d( if orientation is not None: vertices = orientation.apply(vertices) - new_vertices = (vertices * scale_factor + position).T + new_vertices = (vertices * scale + position).T / length_factor new_vertices = np.reshape(new_vertices, vert_shape) for i, k in enumerate("xyz"): key = coordsargs[k] @@ -259,7 +259,7 @@ def get_rot_pos_from_path(obj, show_path=None): return rots, poss, inds -def get_flatten_objects_properties(*objs, colorsequence, **kwargs): +def get_objects_props_by_row_col(*objs, colorsequence, **kwargs): """Return flat dict with objs as keys object properties as values. Properties include: row_cols, style, legendgroup, legendtext""" flat_objs = {} @@ -268,14 +268,14 @@ def get_flatten_objects_properties(*objs, colorsequence, **kwargs): *obj["objects"], colorsequence=colorsequence, **kwargs ) for subobj, props in flat_sub_objs.items(): - if subobj in flat_objs: - props["row_cols"] = flat_objs[subobj]["row_cols"] - elif "row_cols" not in props: - props["row_cols"] = [] - props["row_cols"].extend( - [(obj["row"], obj["col"], obj["output"], obj["units_length"])] - ) - flat_objs.update(flat_sub_objs) + rc = obj["row"], obj["col"] + if rc not in flat_objs: + flat_objs[rc] = { + "objects": {}, + "rc_params": {k: v for k, v in obj.items() if k != "objects"}, + } + flat_objs[rc]["objects"][subobj] = props + kwargs = {k: v for k, v in kwargs.items() if not k.startswith("style")} return flat_objs, kwargs @@ -484,38 +484,46 @@ def getColorscale( return colorscale -def get_scene_ranges(*traces, zoom=1) -> np.ndarray: +def get_scene_ranges(*traces, zoom=0) -> np.ndarray: """ Returns 3x2 array of the min and max ranges in x,y,z directions of input traces. Traces can be any plotly trace object or a dict, with x,y,z numbered parameters. """ - trace3d_found = False - if traces: - ranges = {k: [] for k in "xyz"} - for tr in traces: - coords = "xyz" - if "constructor" in tr: - verts, *_ = get_vertices_from_model( - model_args=tr.get("args", None), - model_kwargs=tr.get("kwargs", None), - coordsargs=tr.get("coordsargs", None), - ) - tr = dict(zip("xyz", verts)) - if "z" in tr: # only extend range for 3d traces - trace3d_found = True - pts = np.array([tr[k] for k in coords], dtype="float64").T - try: # for mesh3d, use only vertices part of faces for range calculation - inds = np.array([tr[k] for k in "ijk"], dtype="int64").T - pts = pts[inds] - except KeyError: - # for 2d meshes, nothing special needed - pass - pts = pts.reshape(-1, 3) - if pts.size != 0: - min_max = np.nanmin(pts, axis=0), np.nanmax(pts, axis=0) - for v, min_, max_ in zip(ranges.values(), *min_max): - v.extend([min_, max_]) - if trace3d_found: + ranges_rc = {} + tr_dim_count = {} + for tr in traces: + rc = tr.get("row", 1), tr.get("col", 1) + if rc not in ranges_rc: + ranges_rc[rc] = {k: [] for k in "xyz"} + tr_dim_count[rc] = {"2D": 0, "3D": 0} + coords = "xyz" + if "constructor" in tr: + verts, *_ = get_vertices_from_model( + model_args=tr.get("args", None), + model_kwargs=tr.get("kwargs", None), + coordsargs=tr.get("coordsargs", None), + ) + tr = dict(zip("xyz", verts)) + if "z" not in tr: # only extend range for 3d traces + tr_dim_count[rc]["2D"] += 1 + else: + tr_dim_count[rc]["3D"] += 1 + ranges_rc[rc]["trace3d_found"] = True + pts = np.array([tr[k] for k in coords], dtype="float64").T + try: # for mesh3d, use only vertices part of faces for range calculation + inds = np.array([tr[k] for k in "ijk"], dtype="int64").T + pts = pts[inds] + except KeyError: + # for 2d meshes, nothing special needed + pass + pts = pts.reshape(-1, 3) + if pts.size != 0: + min_max = np.nanmin(pts, axis=0), np.nanmax(pts, axis=0) + for v, min_, max_ in zip(ranges_rc[rc].values(), *min_max): + v.extend([min_, max_]) + for rc, ranges in ranges_rc.items(): + if tr_dim_count[rc]["3D"]: + zo = zoom[rc] if isinstance(zoom, dict) else zoom # SET 3D PLOT BOUNDARIES # collect min/max from all elements r = np.array([[np.nanmin(v), np.nanmax(v)] for v in ranges.values()]) @@ -523,10 +531,11 @@ def get_scene_ranges(*traces, zoom=1) -> np.ndarray: m = size.max() / 2 m = 1 if m == 0 else m center = r.mean(axis=1) - ranges = np.array([center - m * (1 + zoom), center + m * (1 + zoom)]).T - if not traces or not trace3d_found: - ranges = np.array([[-1.0, 1.0]] * 3) - return ranges + ranges = np.array([center - m * (1 + zo), center + m * (1 + zo)]).T + else: + ranges = np.array([[-1.0, 1.0]] * 3) + ranges_rc[rc] = ranges + return ranges_rc def group_traces(*traces): From 998b7c74e5079f35a735d2e52953cc6df3159d8b Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Mon, 3 Jun 2024 11:59:24 +0200 Subject: [PATCH 003/211] fix empty subplots --- magpylib/_src/display/traces_generic.py | 2 +- magpylib/_src/display/traces_utility.py | 2 ++ tests/test_display_matplotlib.py | 3 +-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index 2b28f6702..f29a36dd5 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -745,7 +745,7 @@ def draw_frame(objs, colorsequence=None, autosize=None, **kwargs) -> Tuple: traces_dict = {} extra_backend_traces = [] autosize_out = {} - labels = {} + labels = {(1, 1): {k: "" for k in "xyz"}} zoom = {} for rc, objs_props in objs_props_by_row_col.items(): if objs_props["rc_params"]["output"] != "model3d": diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index ca627da07..96eebb111 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -535,6 +535,8 @@ def get_scene_ranges(*traces, zoom=0) -> np.ndarray: else: ranges = np.array([[-1.0, 1.0]] * 3) ranges_rc[rc] = ranges + if not ranges_rc: + ranges_rc[(1, 1)] = np.array([[-1.0, 1.0]] * 3) return ranges_rc diff --git a/tests/test_display_matplotlib.py b/tests/test_display_matplotlib.py index 8a4fc464a..db79434d8 100644 --- a/tests/test_display_matplotlib.py +++ b/tests/test_display_matplotlib.py @@ -422,8 +422,7 @@ def test_matplotlib_model3d_extra_updatefunc(): def test_empty_display(): """should not fail if nothing to display""" - ax = plt.subplot(projection="3d") - magpy.show(canvas=ax, backend="matplotlib", return_fig=True) + magpy.show(backend="matplotlib", return_fig=True) def test_graphics_model_mpl(): From ceb90718cdaada1a2d59fd9f3c942e7f7a731942 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Mon, 3 Jun 2024 13:07:37 +0200 Subject: [PATCH 004/211] fix subplot ranges and animation --- magpylib/_src/display/backend_matplotlib.py | 9 +++++---- magpylib/_src/display/traces_generic.py | 4 ++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/magpylib/_src/display/backend_matplotlib.py b/magpylib/_src/display/backend_matplotlib.py index 1ad47e747..206de393a 100644 --- a/magpylib/_src/display/backend_matplotlib.py +++ b/magpylib/_src/display/backend_matplotlib.py @@ -353,10 +353,11 @@ def draw_frame(frame_ind): for row_col_num, ax in axes.items(): count = count_with_labels.get(row_col_num, 0) if ax.name == "3d": - ax.set( - **{f"{k}label": labels[row_col_num][k] for k in "xyz"}, - **{f"{k}lim": r for k, r in zip("xyz", ranges[row_col_num])}, - ) + if row_col_num in ranges: + ax.set( + **{f"{k}label": labels[row_col_num][k] for k in "xyz"}, + **{f"{k}lim": r for k, r in zip("xyz", ranges[row_col_num])}, + ) ax.set_box_aspect(aspect=(1, 1, 1)) if 0 < count <= legend_maxitems: lg_kw = {"bbox_to_anchor": (1.04, 1), "loc": "upper left"} diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index f29a36dd5..cd6f0a954 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -256,6 +256,8 @@ def get_traces_2D( sumup=True, pixel_agg=None, in_out="auto", + units_length="m", + zoom=0, style_path_frames=None, ): """draws and animates sensor values over a path in a subplot""" @@ -767,6 +769,8 @@ def draw_frame(objs, colorsequence=None, autosize=None, **kwargs) -> Tuple: autosize_out[rc] = ( np.mean(np.diff(ranges[rc])) / default_settings.display.autosizefactor ) * unit_factor + else: + autosize_out = autosize to_resize_keys = { k for k, v in traces_dict_1.items() if v and "_autosize" in v[0] } From 31a88f941bcfe0860cc8a268fc5f5630efe6d9b3 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Mon, 3 Jun 2024 13:40:55 +0200 Subject: [PATCH 005/211] fix zoom check --- magpylib/_src/display/display.py | 1 - magpylib/_src/display/traces_utility.py | 3 ++- magpylib/_src/input_checks.py | 9 ++------- tests/test_input_checks.py | 2 +- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/magpylib/_src/display/display.py b/magpylib/_src/display/display.py index 6086313b2..ec3513eb2 100644 --- a/magpylib/_src/display/display.py +++ b/magpylib/_src/display/display.py @@ -16,7 +16,6 @@ from magpylib._src.input_checks import check_format_input_backend from magpylib._src.input_checks import check_format_input_vector from magpylib._src.input_checks import check_input_animation -from magpylib._src.input_checks import check_input_zoom from magpylib._src.utility import check_path_format disp_args = get_defaults_dict("display").keys() diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index 96eebb111..1ad30abf7 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -11,6 +11,7 @@ from magpylib._src.defaults.defaults_classes import default_settings from magpylib._src.defaults.defaults_utility import linearize_dict +from magpylib._src.input_checks import check_input_zoom from magpylib._src.style import get_style from magpylib._src.utility import format_obj_input from magpylib._src.utility import get_unit_factor @@ -616,7 +617,7 @@ def process_show_input_objs(objs, **kwargs): obj = {**defaults, **obj, **kwargs} else: obj = {**defaults, "objects": obj, **kwargs} - + check_input_zoom(obj.get("zoom", None)) obj["objects"] = format_obj_input( obj["objects"], allow="sources+sensors+collections" ) diff --git a/magpylib/_src/input_checks.py b/magpylib/_src/input_checks.py index 434c6a8b4..54b2a029d 100644 --- a/magpylib/_src/input_checks.py +++ b/magpylib/_src/input_checks.py @@ -69,14 +69,9 @@ def check_array_shape(inp: np.ndarray, dims: tuple, shape_m1: int, length=None, def check_input_zoom(inp): """check show zoom input""" - if not isinstance(inp, numbers.Number): - raise MagpylibBadUserInput( - "Input parameter `zoom` must be a number `zoom>=0`.\n" - f"Instead received {inp}." - ) - if inp < 0: + if not (isinstance(inp, numbers.Number) and inp >= 0): raise MagpylibBadUserInput( - "Input parameter `zoom` must be a number `zoom>=0`.\n" + "Input parameter `zoom` must be a positive number or zero.\n" f"Instead received {inp}." ) diff --git a/tests/test_input_checks.py b/tests/test_input_checks.py index 68024e801..b92c048b9 100644 --- a/tests/test_input_checks.py +++ b/tests/test_input_checks.py @@ -553,7 +553,7 @@ def test_input_show_zoom_bad(zoom): """bad show zoom inputs""" x = magpy.Sensor() with pytest.raises(MagpylibBadUserInput): - magpy.show(x, zoom=zoom) + magpy.show(x, zoom=zoom, return_fig=True, backend="plotly") @pytest.mark.parametrize( From 98786fa0288cc22e144616ff8e5e763c0fe404af Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Mon, 3 Jun 2024 14:09:56 +0200 Subject: [PATCH 006/211] fix labeling --- magpylib/_src/display/backend_plotly.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/magpylib/_src/display/backend_plotly.py b/magpylib/_src/display/backend_plotly.py index eca3fae77..69737ca35 100644 --- a/magpylib/_src/display/backend_plotly.py +++ b/magpylib/_src/display/backend_plotly.py @@ -99,7 +99,7 @@ def apply_fig_ranges(fig, ranges, labels, apply2d=True): f"{k}axis": { "range": ranges[i], "autorange": False, - "title": labels[rc][k], + "title": labels.get(rc, {k: "" for k in "xyz"})[k], } for i, k in enumerate("xyz") }, From d5004d505c4b361d78c019d61106b171b91169dc Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Mon, 3 Jun 2024 17:38:46 +0200 Subject: [PATCH 007/211] fix generic extra trace scaling --- magpylib/_src/display/traces_generic.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index cd6f0a954..cd58163f2 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -534,9 +534,7 @@ def get_generic_traces3D( name_suff = tr.pop("name_suffix", None) name = tr.get("name", "") if legendtext is None else legendtext for orient, pos in zip(orientations, positions): - tr1 = place_and_orient_model3d( - tr, orientation=orient, position=pos, units_length=units_length - ) + tr1 = place_and_orient_model3d(tr, orientation=orient, position=pos) if name_suff is not None: tr1["name"] = f"{name}{name_suff}" temp_rot_traces.append(tr1) @@ -549,6 +547,7 @@ def get_generic_traces3D( path_traces_generic = group_traces(*path_traces_generic) for tr in path_traces_generic: + tr.update(place_and_orient_model3d(tr, units_length=units_length)) tr.update(row=row, col=col) if tr.get("opacity", None) is None: tr["opacity"] = style.opacity From b208c365fbd7a79cab24af70f422c13bf83c04a4 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Mon, 3 Jun 2024 18:18:05 +0200 Subject: [PATCH 008/211] fix extra non generic scaling --- magpylib/_src/display/traces_generic.py | 25 +++++++++++++------------ magpylib/_src/display/traces_utility.py | 2 +- magpylib/_src/utility.py | 2 +- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index cd58163f2..411d2a751 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -387,7 +387,7 @@ def get_label_and_color(obj): return traces -def process_extra_trace(model): +def process_extra_trace(model, units_length): "process extra trace attached to some magpylib object" extr = model["model3d"] model_kwargs = {**(extr.kwargs() if callable(extr.kwargs) else extr.kwargs)} @@ -405,6 +405,7 @@ def process_extra_trace(model): position=model["position"], coordsargs=extr.coordsargs, scale=extr.scale, + units_length=units_length, return_model_args=True, ) trace3d["kwargs"].update(kwargs) @@ -500,24 +501,24 @@ def get_generic_traces3D( extr.update(extr.updatefunc()) # update before checking backend if extr.backend == "generic": extr.update(extr.updatefunc()) - tr_generic = {"opacity": style.opacity} + tr_non_generic = {"opacity": style.opacity} ttype = extr.constructor.lower() obj_extr_trace = extr.kwargs() if callable(extr.kwargs) else extr.kwargs obj_extr_trace = {"type": ttype, **obj_extr_trace} if ttype == "scatter3d": for k in ("marker", "line"): - tr_generic[f"{k}_color"] = tr_generic.get( + tr_non_generic[f"{k}_color"] = tr_non_generic.get( f"{k}_color", style.color ) elif ttype == "mesh3d": - tr_generic["showscale"] = tr_generic.get("showscale", False) - tr_generic["color"] = tr_generic.get("color", style.color) + tr_non_generic["showscale"] = tr_non_generic.get("showscale", False) + tr_non_generic["color"] = tr_non_generic.get("color", style.color) else: # pragma: no cover raise ValueError( f"{ttype} is not supported, only 'scatter3d' and 'mesh3d' are" ) - tr_generic.update(linearize_dict(obj_extr_trace, separator="_")) - traces_generic.append(tr_generic) + tr_non_generic.update(linearize_dict(obj_extr_trace, separator="_")) + traces_generic.append(tr_non_generic) if is_mag_arrows: mag = input_obj.magnetization @@ -577,7 +578,7 @@ def get_generic_traces3D( extr.update(extr.updatefunc()) # update before checking backend if extr.backend == extra_backend: for orient, pos in zip(orientations, positions): - tr_generic = { + tr_non_generic = { "model3d": extr, "position": pos, "orientation": orient, @@ -595,8 +596,8 @@ def get_generic_traces3D( "col": col, }, } - tr_generic = process_extra_trace(tr_generic) - path_traces_extra_non_generic_backend.append(tr_generic) + tr_non_generic = process_extra_trace(tr_non_generic, units_length) + path_traces_extra_non_generic_backend.append(tr_non_generic) out.update({extra_backend: path_traces_extra_non_generic_backend}) return out @@ -764,10 +765,10 @@ def draw_frame(objs, colorsequence=None, autosize=None, **kwargs) -> Tuple: *traces, *extra_backend_traces_1, zoom=objs_props["rc_params"]["zoom"] ) # pylint: disable=no-member - unit_factor = get_unit_factor(rc_params["units_length"], target_unit="m") + length_factor = get_unit_factor(rc_params["units_length"], target_unit="m") autosize_out[rc] = ( np.mean(np.diff(ranges[rc])) / default_settings.display.autosizefactor - ) * unit_factor + ) / length_factor else: autosize_out = autosize to_resize_keys = { diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index 1ad30abf7..771c53089 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -79,7 +79,7 @@ def place_and_orient_model3d( if orientation is not None: vertices = orientation.apply(vertices) - new_vertices = (vertices * scale + position).T / length_factor + new_vertices = (vertices * scale + position).T * length_factor new_vertices = np.reshape(new_vertices, vert_shape) for i, k in enumerate("xyz"): key = coordsargs[k] diff --git a/magpylib/_src/utility.py b/magpylib/_src/utility.py index 75d3d1e30..6a431ab4d 100644 --- a/magpylib/_src/utility.py +++ b/magpylib/_src/utility.py @@ -253,7 +253,7 @@ def get_unit_factor(unit_input, *, target_unit): raise ValueError( f"Invalid unit input, must be one of {valid_inputs} got {unit_input!r}" ) - factor = 10**factor_power + factor = 1 / (10**factor_power) return factor From 5b2e6d39612590c7924c461d48ab252809c131ee Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Mon, 3 Jun 2024 18:27:10 +0200 Subject: [PATCH 009/211] pylint --- magpylib/_src/display/backend_plotly.py | 10 +++++----- magpylib/_src/display/traces_generic.py | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/magpylib/_src/display/backend_plotly.py b/magpylib/_src/display/backend_plotly.py index 69737ca35..25758c738 100644 --- a/magpylib/_src/display/backend_plotly.py +++ b/magpylib/_src/display/backend_plotly.py @@ -75,7 +75,7 @@ def match_args(ttype: str): return set(named_args) -def apply_fig_ranges(fig, ranges, labels, apply2d=True): +def apply_fig_ranges(fig, ranges_rc, labels, apply2d=True): """This is a helper function which applies the ranges properties of the provided `fig` object according to a provided ranges. All three space direction will be equal and match the maximum of the ranges needed to display all objects, including their paths. @@ -92,7 +92,7 @@ def apply_fig_ranges(fig, ranges, labels, apply2d=True): ------- None: NoneType """ - for rc, ranges in ranges.items(): + for rc, ranges in ranges_rc.items(): row, col = rc kwargs = { **{ @@ -355,11 +355,11 @@ def display_plotly( rows=rows_list, cols=cols_list, ) - ranges = data["ranges"] + ranges_rc = data["ranges"] if extra_data: - ranges = get_scene_ranges(*frames[0]["data"]) + ranges_rc = get_scene_ranges(*frames[0]["data"]) if update_layout: - apply_fig_ranges(fig, ranges, labels=data["labels"], apply2d=isanimation) + apply_fig_ranges(fig, ranges_rc, labels=data["labels"], apply2d=isanimation) fig.update_layout( legend_itemsizing="constant", # legend_groupclick="toggleitem", diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index 411d2a751..39e7bcd99 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -256,9 +256,10 @@ def get_traces_2D( sumup=True, pixel_agg=None, in_out="auto", + style_path_frames=None, + # pylint: disable=unused-argument units_length="m", zoom=0, - style_path_frames=None, ): """draws and animates sensor values over a path in a subplot""" # pylint: disable=import-outside-toplevel From 0bd2eb462819523548cc29b6b6a3255d2e3c6e37 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Mon, 3 Jun 2024 19:11:44 +0200 Subject: [PATCH 010/211] add cm and dm as units_length inputs --- magpylib/_src/utility.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/magpylib/_src/utility.py b/magpylib/_src/utility.py index 6a431ab4d..516c2ced6 100644 --- a/magpylib/_src/utility.py +++ b/magpylib/_src/utility.py @@ -241,13 +241,17 @@ def filter_objects(obj_list, allow="sources+sensors", warn=True): @lru_cache(maxsize=None) -def get_unit_factor(unit_input, *, target_unit): +def get_unit_factor(unit_input, *, target_unit, deci_centi=True): """return unit factor based on input and target unit""" pref, factor_power = "", None if unit_input: if len(unit_input) == 2: pref, *_ = unit_input - factor_power = _UNIT_PREFIX_REVERSED.get(pref, None) + prefs = _UNIT_PREFIX_REVERSED + if deci_centi: + prefs = {**_UNIT_PREFIX_REVERSED, "d": -1, "c": -2} + factor_power = prefs.get(pref, None) + if factor_power is None or len(unit_input) > 2: valid_inputs = [f"{k}{target_unit}" for k in _UNIT_PREFIX_REVERSED] raise ValueError( From 0223123ace434e5ee1f1ff0112f1799418d335a1 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Mon, 3 Jun 2024 19:14:34 +0200 Subject: [PATCH 011/211] fix ranges on non generic extra traces --- magpylib/_src/display/traces_utility.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index 771c53089..c339de0dc 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -493,18 +493,20 @@ def get_scene_ranges(*traces, zoom=0) -> np.ndarray: ranges_rc = {} tr_dim_count = {} for tr in traces: - rc = tr.get("row", 1), tr.get("col", 1) - if rc not in ranges_rc: - ranges_rc[rc] = {k: [] for k in "xyz"} - tr_dim_count[rc] = {"2D": 0, "3D": 0} coords = "xyz" + rc = tr.get("row", 1), tr.get("col", 1) if "constructor" in tr: verts, *_ = get_vertices_from_model( model_args=tr.get("args", None), model_kwargs=tr.get("kwargs", None), coordsargs=tr.get("coordsargs", None), ) + kwex = tr["kwargs_extra"] tr = dict(zip("xyz", verts)) + rc = kwex["row"], kwex["col"] + if rc not in ranges_rc: + ranges_rc[rc] = {k: [] for k in "xyz"} + tr_dim_count[rc] = {"2D": 0, "3D": 0} if "z" not in tr: # only extend range for 3d traces tr_dim_count[rc]["2D"] += 1 else: From a66dc84576c401135329dda79cbae57194d5e201 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Mon, 3 Jun 2024 19:24:09 +0200 Subject: [PATCH 012/211] fix edge case range where no trace in subplot --- magpylib/_src/display/traces_generic.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index 39e7bcd99..8adf7dfd5 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -762,14 +762,14 @@ def draw_frame(objs, colorsequence=None, autosize=None, **kwargs) -> Tuple: labels[rc] = {k: f"{k} ({rc_params['units_length']})" for k in "xyz"} zoom[rc] = objs_props["rc_params"]["zoom"] traces = [t for tr in traces_dict_1.values() for t in tr] - ranges = get_scene_ranges( + ranges_rc = get_scene_ranges( *traces, *extra_backend_traces_1, zoom=objs_props["rc_params"]["zoom"] ) - # pylint: disable=no-member + ranges = ranges_rc.get(rc, ranges_rc[(1, 1)]) length_factor = get_unit_factor(rc_params["units_length"], target_unit="m") - autosize_out[rc] = ( - np.mean(np.diff(ranges[rc])) / default_settings.display.autosizefactor - ) / length_factor + # pylint: disable=no-member + factor = default_settings.display.autosizefactor * length_factor + autosize_out[rc] = np.mean(np.diff(ranges)) / factor else: autosize_out = autosize to_resize_keys = { From 6054403731903b0a94d31c827f3bad35ae58c462 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 4 Jun 2024 00:30:16 +0200 Subject: [PATCH 013/211] rework row cols conflicting inputs checks --- magpylib/_src/display/traces_generic.py | 3 +- magpylib/_src/display/traces_utility.py | 63 +++++++++++++------------ magpylib/_src/utility.py | 61 ++++++++++++++++++++++++ tests/test_display_matplotlib.py | 5 +- 4 files changed, 99 insertions(+), 33 deletions(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index 8adf7dfd5..cce3b8fa0 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -765,11 +765,10 @@ def draw_frame(objs, colorsequence=None, autosize=None, **kwargs) -> Tuple: ranges_rc = get_scene_ranges( *traces, *extra_backend_traces_1, zoom=objs_props["rc_params"]["zoom"] ) - ranges = ranges_rc.get(rc, ranges_rc[(1, 1)]) length_factor = get_unit_factor(rc_params["units_length"], target_unit="m") # pylint: disable=no-member factor = default_settings.display.autosizefactor * length_factor - autosize_out[rc] = np.mean(np.diff(ranges)) / factor + autosize_out[rc] = np.mean(np.diff(ranges_rc[rc])) / factor else: autosize_out = autosize to_resize_keys = { diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index c339de0dc..95b153c59 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -15,6 +15,7 @@ from magpylib._src.style import get_style from magpylib._src.utility import format_obj_input from magpylib._src.utility import get_unit_factor +from magpylib._src.utility import merge_dicts_with_conflict_check DEFAULT_ROW_COL_PARAMS = { "row": 1, @@ -610,49 +611,51 @@ def subdivide_mesh_by_facecolor(trace): def process_show_input_objs(objs, **kwargs): """Extract max_rows and max_cols from obj list of dicts""" defaults = DEFAULT_ROW_COL_PARAMS.copy() - max_rows = max_cols = 1 - flat_objs = [] - new_objs = {} - subplot_specs = {} + identifiers = ("row", "col") + unique_fields = tuple(k for k in defaults if k not in identifiers) + sources_and_sensors_only = [] + new_objs = [] for obj in objs: + # add missing kwargs if isinstance(obj, dict): obj = {**defaults, **obj, **kwargs} else: obj = {**defaults, "objects": obj, **kwargs} - check_input_zoom(obj.get("zoom", None)) + + # extend objects list obj["objects"] = format_obj_input( obj["objects"], allow="sources+sensors+collections" ) - flat_objs.extend(format_obj_input(obj["objects"], allow="sources+sensors")) - if obj["row"] is not None: - max_rows = max(max_rows, obj["row"]) - if obj["col"] is not None: - max_cols = max(max_cols, obj["col"]) - out = obj["output"] - key = (obj["row"], obj["col"], out if isinstance(out, str) else tuple(out)) - if key not in new_objs: - new_objs[key] = obj - else: - new_objs[key]["objects"] = list( - dict.fromkeys(new_objs[key]["objects"] + obj["objects"]) - ) - current_subplot_specs = subplot_specs.get(key[:2], obj["output"]) - if current_subplot_specs != obj["output"]: - raise ValueError( - f"Row/Col {key[:2]}, received conflicting output types " - f"{current_subplot_specs!r} vs {obj['output']!r}" - ) - subplot_specs[key[:2]] = obj["output"] + sources_and_sensors_only.extend( + format_obj_input(obj["objects"], allow="sources+sensors") + ) + new_objs.append(obj) + row_col_dict = merge_dicts_with_conflict_check( + new_objs, + target="objects", + identifiers=identifiers, + unique_fields=unique_fields, + ) + + # create subplot specs grid + row_cols = [*row_col_dict] + max_rows, max_cols = np.max(row_cols, axis=0).astype(int) if row_cols else (1, 1) + # convert to int to avoid np.int32 type conflicting with plolty subplot specs + max_rows, max_cols = int(max_rows), int(max_cols) specs = np.array([[{"type": "scene"}] * max_cols] * max_rows) - for inds, out in subplot_specs.items(): - if out != "model3d": - specs[inds[0] - 1, inds[1] - 1] = {"type": "xy"} + for rc, obj in row_col_dict.items(): + if obj["output"] != "model3d": + specs[rc[0] - 1, rc[1] - 1] = {"type": "xy"} if max_rows == 1 and max_cols == 1: max_rows = max_cols = None + + for obj in row_col_dict.values(): + check_input_zoom(obj.get("zoom", None)) + return ( - list(new_objs.values()), - list(dict.fromkeys(flat_objs)), + list(row_col_dict.values()), + list(dict.fromkeys(sources_and_sensors_only)), max_rows, max_cols, specs, diff --git a/magpylib/_src/utility.py b/magpylib/_src/utility.py index 516c2ced6..e27062afc 100644 --- a/magpylib/_src/utility.py +++ b/magpylib/_src/utility.py @@ -421,3 +421,64 @@ def has_parameter(func: Callable, param_name: str) -> bool: """Check if input function has a specific parameter""" sig = signature(func) return param_name in sig.parameters + + +def merge_dicts_with_conflict_check(objs, *, target, identifiers, unique_fields): + """ + Merge dictionaries ensuring unique identifier fields don't lead to conflict. + + Parameters + ---------- + objs : list of dicts + List of dictionaries to be merged based on identifier fields. + target : str + The key in the dictionaries whose values are lists to be merged. + identifiers : list of str + Keys used to identify a unique dictionary. + unique_fields : list of str + Additional keys that must not conflict across merged dictionaries. + + Returns + ------- + dict of dicts + Merged dictionaries with combined `target` lists, ensuring no conflicts + in `unique_fields`. + + Raises + ------ + ValueError + If a conflict is detected in `unique_fields` for any `identifiers`. + + Notes + ----- + `objs` should be a list of dictionaries. Identifiers determine uniqueness, + and merging is done by extending the lists in the `target` key. If any of + the `unique_fields` conflict with previously tracked identifiers, a + `ValueError` is raised detailing the conflict. + + """ + merged_dict = {} + tracker = {} + for obj in objs: + key_dict = {k: obj[k] for k in identifiers} + key = tuple(key_dict.values()) + tracker_previous = tracker.get(key, None) + tracker_actual = tuple(obj[field] for field in unique_fields) + if key in tracker and tracker_previous != tracker_actual: + diff = [ + f"{f!r} first got {a!r} then {t!r}" + for f, a, t in zip(unique_fields, tracker_actual, tracker_previous) + if a != t + ] + raise ValueError( + f"Conflicting parameters detected for {key_dict}: {', '.join(diff)}." + ) + tracker[key] = tracker_actual + + if key not in merged_dict: + merged_dict[key] = obj + else: + merged_dict[key][target] = list( + dict.fromkeys([*merged_dict[key][target], *obj[target]]) + ) + return merged_dict diff --git a/tests/test_display_matplotlib.py b/tests/test_display_matplotlib.py index db79434d8..8575731a4 100644 --- a/tests/test_display_matplotlib.py +++ b/tests/test_display_matplotlib.py @@ -522,7 +522,10 @@ def test_bad_show_inputs(): ) with pytest.raises( ValueError, - match=r"Row/Col .* received conflicting output types.*", + match=( + r"Conflicting parameters detected for {'row': 1, 'col': 1}:" + r" 'output' first got 'model3d' then 'Bx'." + ), ): with magpy.show_context(animation=False, sumup=True, pixel_agg="mean") as s: s.show(cyl1, sensor, col=1, output="Bx") From fc0e790c74b135a4795eba8ba2f7e37ae2d39303 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 4 Jun 2024 10:42:01 +0200 Subject: [PATCH 014/211] update github actions --- .github/workflows/codeql.yml | 2 +- .github/workflows/python-app.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index d7a6835b5..fdb64f535 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -24,7 +24,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/setup-python@v5 - name: Initialize CodeQL uses: github/codeql-action/init@v2 diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml index c06d4d8ce..fd77edb18 100644 --- a/.github/workflows/python-app.yml +++ b/.github/workflows/python-app.yml @@ -16,7 +16,7 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 - name: Setup Python uses: actions/setup-python@v4 with: @@ -45,7 +45,7 @@ jobs: steps: - name: Setup headless display uses: pyvista/setup-headless-display-action@v2 - - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 with: fetch-depth: 0 - name: Setup python for test ${{ matrix.py }} @@ -69,7 +69,7 @@ jobs: id-token: write steps: - name: Checkout source - uses: actions/checkout@v4 + uses: actions/setup-python@v5 - name: Set up Python 3.10 uses: actions/setup-python@v4 with: From 8a58de63d2e36442c57d2a2c39c78ae90336838d Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 4 Jun 2024 10:51:03 +0200 Subject: [PATCH 015/211] bump codeql actions versions --- .github/workflows/codeql.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index fdb64f535..a23916378 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -27,17 +27,17 @@ jobs: uses: actions/setup-python@v5 - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: config-file: ./.github/codeql/codeql-config.yml languages: ${{ matrix.language }} queries: +security-and-quality - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v3 if: ${{ matrix.language == 'javascript' || matrix.language == 'python' }} - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 with: category: "/language:${{ matrix.language }}" From 5166298b8ef2a2cef7032cc8e6a1f29ffde76229 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 4 Jun 2024 12:04:13 +0200 Subject: [PATCH 016/211] fix checkout --- .github/workflows/python-app.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml index fd77edb18..c06d4d8ce 100644 --- a/.github/workflows/python-app.yml +++ b/.github/workflows/python-app.yml @@ -16,7 +16,7 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/setup-python@v5 + - uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v4 with: @@ -45,7 +45,7 @@ jobs: steps: - name: Setup headless display uses: pyvista/setup-headless-display-action@v2 - - uses: actions/setup-python@v5 + - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup python for test ${{ matrix.py }} @@ -69,7 +69,7 @@ jobs: id-token: write steps: - name: Checkout source - uses: actions/setup-python@v5 + uses: actions/checkout@v4 - name: Set up Python 3.10 uses: actions/setup-python@v4 with: From e5a6e5cdea8116eed3c7eb4ad77db3f30a884680 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 4 Jun 2024 12:05:54 +0200 Subject: [PATCH 017/211] fix version --- .github/workflows/codeql.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index a23916378..f9046a523 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -24,7 +24,7 @@ jobs: steps: - name: Checkout - uses: actions/setup-python@v5 + uses: actions/checkout@v4 - name: Initialize CodeQL uses: github/codeql-action/init@v3 From 11b368e419cb724516028888ae4e26c04c224b6f Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 4 Jun 2024 12:09:31 +0200 Subject: [PATCH 018/211] update --- .github/workflows/python-app.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml index c06d4d8ce..1784a0458 100644 --- a/.github/workflows/python-app.yml +++ b/.github/workflows/python-app.yml @@ -18,7 +18,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Setup Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: "3.11" - name: Set up testing tools and environment for pylint @@ -49,7 +49,7 @@ jobs: with: fetch-depth: 0 - name: Setup python for test ${{ matrix.py }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.py }} - name: Install tox @@ -71,7 +71,7 @@ jobs: - name: Checkout source uses: actions/checkout@v4 - name: Set up Python 3.10 - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: "3.10" - name: Install flit From 24d90eeead101c64fbf5be26c11b1d9715072d61 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 4 Jun 2024 14:22:04 +0200 Subject: [PATCH 019/211] move to dev version --- CHANGELOG.md | 3 +++ README.md | 4 ++-- magpylib/__init__.py | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0bc837e3c..2e42473b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## [Unreleased] - YYYY-MM-DD + + ## [5.0.3] - 2024-06-03 - Fix subplot object properties propagation ([#780](https://github.com/magpylib/magpylib/pull/780)) diff --git a/README.md b/README.md index d4b5998ec..e53873454 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Conda Cloud - MyBinder link + MyBinder link black @@ -136,7 +136,7 @@ A valid software citation could be author = {{Michael-Ortner et al.}}, title = {magpylib}, url = {https://magpylib.readthedocs.io/en/latest/}, - version = {5.0.3}, + version = {5.1.0dev}, date = {2023-06-25}, } ``` diff --git a/magpylib/__init__.py b/magpylib/__init__.py index 16290f12b..e04e76c49 100644 --- a/magpylib/__init__.py +++ b/magpylib/__init__.py @@ -28,7 +28,7 @@ """ # module level dunders -__version__ = "5.0.3" +__version__ = "5.1.0dev" __author__ = "Michael Ortner & Alexandre Boisselet" __credits__ = "The Magpylib community" __all__ = [ From dc63fbcbc8b429f390b3a350ec0ceb75cf6dc2e3 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 4 Jun 2024 17:53:40 +0200 Subject: [PATCH 020/211] add tests --- magpylib/_src/display/traces_generic.py | 3 +-- magpylib/_src/utility.py | 29 +++++++++++++++---------- tests/test_display_matplotlib.py | 10 +++++++++ tests/test_display_plotly.py | 27 +++++++++++++++++++++++ 4 files changed, 55 insertions(+), 14 deletions(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index cce3b8fa0..f60ef5077 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -446,7 +446,6 @@ def get_generic_traces3D( # pylint: disable=too-many-nested-blocks # pylint: disable=protected-access # pylint: disable=import-outside-toplevel - style = input_obj.style is_mag_arrows = False is_mag = hasattr(input_obj, "magnetization") and hasattr(style, "magnetization") @@ -811,7 +810,7 @@ def get_traces_3D(flat_objs_props, extra_backend=False, autosize=None, **kwargs) x, y, z = obj._position.T traces_dict[obj] = [{"x": x, "y": y, "z": z, "_autosize": True}] else: - params.update(kwargs) + params = {**params, **kwargs} traces_dict[obj] = [] orig_style = getattr(obj, "_style", None) try: diff --git a/magpylib/_src/utility.py b/magpylib/_src/utility.py index e27062afc..f5e36cc5b 100644 --- a/magpylib/_src/utility.py +++ b/magpylib/_src/utility.py @@ -243,19 +243,24 @@ def filter_objects(obj_list, allow="sources+sensors", warn=True): @lru_cache(maxsize=None) def get_unit_factor(unit_input, *, target_unit, deci_centi=True): """return unit factor based on input and target unit""" - pref, factor_power = "", None - if unit_input: - if len(unit_input) == 2: - pref, *_ = unit_input - prefs = _UNIT_PREFIX_REVERSED - if deci_centi: - prefs = {**_UNIT_PREFIX_REVERSED, "d": -1, "c": -2} - factor_power = prefs.get(pref, None) - - if factor_power is None or len(unit_input) > 2: - valid_inputs = [f"{k}{target_unit}" for k in _UNIT_PREFIX_REVERSED] + if unit_input == target_unit: + return 1 + pref, suff, factor_power = "", "", None + prefs = _UNIT_PREFIX_REVERSED + if deci_centi: + prefs = {**_UNIT_PREFIX_REVERSED, "d": -1, "c": -2} + unit_input_str = str(unit_input) + if unit_input_str: + if len(unit_input_str) >= 2: + pref, *suff = unit_input_str + suff = "".join(suff) + if suff == target_unit: + factor_power = prefs.get(pref, None) + + if factor_power is None or len(unit_input_str) > 2: + valid_inputs = [f"{k}{target_unit}" for k in prefs] raise ValueError( - f"Invalid unit input, must be one of {valid_inputs} got {unit_input!r}" + f"Invalid unit input ({unit_input!r}), must be one of {valid_inputs}" ) factor = 1 / (10**factor_power) return factor diff --git a/tests/test_display_matplotlib.py b/tests/test_display_matplotlib.py index 8575731a4..f2e8f3b07 100644 --- a/tests/test_display_matplotlib.py +++ b/tests/test_display_matplotlib.py @@ -617,3 +617,13 @@ def test_show_legend(): s2.style.legend = "full legend replace" s3.style.description = "description replace only" magpy.show(s1, s2, s3, return_fig=True) + + +@pytest.mark.parametrize("units_length", ["mT", "inch", "dam", "e"]) +def test_bad_units_length(units_length): + """test units lenghts""" + + c = magpy.magnet.Cuboid(polarization=(0, 0, 1), dimension=(1, 1, 1)) + + with pytest.raises(ValueError, match=r"Invalid unit input.*"): + c.show(units_length=units_length, return_fig=True, backend="matpotlib") diff --git a/tests/test_display_plotly.py b/tests/test_display_plotly.py index b9f51abfd..3e0458008 100644 --- a/tests/test_display_plotly.py +++ b/tests/test_display_plotly.py @@ -3,6 +3,7 @@ import pytest import magpylib as magpy +from magpylib._src.display.traces_utility import get_unit_factor from magpylib._src.exceptions import MagpylibBadUserInput # pylint: disable=assignment-from-no-return @@ -383,3 +384,29 @@ def test_legends(): ) assert [t.name for t in fig.data] == ["Plotly extra trace (1m|1m|1m)"] * 4 assert [t.showlegend for t in fig.data] == [True, False, False, False] + + +def test_units_length(): + """test units lenghts""" + + dims = (1, 2, 3) + c1 = magpy.magnet.Cuboid(dimension=dims, polarization=(1, 2, 3)) + inputs = [ + {"objects": c1, "row": 1, "col": 1, "units_length": "m", "zoom": 3}, + {"objects": c1, "row": 1, "col": 2, "units_length": "dm", "zoom": 2}, + {"objects": c1, "row": 2, "col": 1, "units_length": "cm", "zoom": 1}, + {"objects": c1, "row": 2, "col": 2, "units_length": "mm", "zoom": 0}, + ] + fig = magpy.show( + *inputs, + backend="plotly", + return_fig=True, + ) + for ind, inp in enumerate(inputs): + scene = getattr(fig.layout, f"scene{'' if ind==0 else ind+1}") + for j, k in enumerate("xyz"): + ax = getattr(scene, f"{k}axis") + assert ax.title.text == f"{k} ({inp['units_length']})" + factor = get_unit_factor(inp["units_length"], target_unit="m") + r = (inp["zoom"] + 1) / 2 * factor * max(dims) + assert ax.range == (-r, r) From b65caeeca39254dbbba7e5a8cdd2eb825918b3b5 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 4 Jun 2024 18:08:35 +0200 Subject: [PATCH 021/211] add docs entry --- docs/_pages/user_guide/docs/docs_graphics.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/_pages/user_guide/docs/docs_graphics.md b/docs/_pages/user_guide/docs/docs_graphics.md index 4ab213db8..5fc44c814 100644 --- a/docs/_pages/user_guide/docs/docs_graphics.md +++ b/docs/_pages/user_guide/docs/docs_graphics.md @@ -422,3 +422,23 @@ with magpy.show_context(loop, sens, animation=True) as sc: sc.show(output=["Hx", "Hy", "Hz"], row=2) sc.show(output="Hxyz", col=2, row=2) ``` + + +### Canvas length units + +When displaying very small Magpylib objects, the axes scaling in meters might be inadequate and you may want to use other units that fit the system dimensions more nicely. The example below shows how to display an object (in this case the same) with different length units and zoom levels. + +```{code-cell} ipython3 +import magpylib as magpy + +c1 = magpy.magnet.Cuboid( + dimension=(1, 1, 1), + polarization=(1, 2, 3), +) + +with magpy.show_context(c1, backend="plotly", plotly_fig_layout_height=800) as s: + s.show(row=1, col=1, units_length="m", zoom=3) + s.show(row=1, col=2, units_length="dm", zoom=2) + s.show(row=2, col=1, units_length="cm", zoom=1) + s.show(row=2, col=2, units_length="mm", zoom=0) +``` From 3f41c478672c339223bc0b685ff5716f42113d65 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 4 Jun 2024 18:14:04 +0200 Subject: [PATCH 022/211] fix typo in test --- tests/test_display_matplotlib.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_display_matplotlib.py b/tests/test_display_matplotlib.py index f2e8f3b07..890aabfbd 100644 --- a/tests/test_display_matplotlib.py +++ b/tests/test_display_matplotlib.py @@ -626,4 +626,4 @@ def test_bad_units_length(units_length): c = magpy.magnet.Cuboid(polarization=(0, 0, 1), dimension=(1, 1, 1)) with pytest.raises(ValueError, match=r"Invalid unit input.*"): - c.show(units_length=units_length, return_fig=True, backend="matpotlib") + c.show(units_length=units_length, return_fig=True, backend="matplotlib") From 14c4670391773c385780349a7d57a6fc3ddcd8dd Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 4 Jun 2024 22:08:20 +0200 Subject: [PATCH 023/211] pylint --- tests/test_display_plotly.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_display_plotly.py b/tests/test_display_plotly.py index 3e0458008..ce7fe7501 100644 --- a/tests/test_display_plotly.py +++ b/tests/test_display_plotly.py @@ -404,7 +404,7 @@ def test_units_length(): ) for ind, inp in enumerate(inputs): scene = getattr(fig.layout, f"scene{'' if ind==0 else ind+1}") - for j, k in enumerate("xyz"): + for k in "xyz": ax = getattr(scene, f"{k}axis") assert ax.title.text == f"{k} ({inp['units_length']})" factor = get_unit_factor(inp["units_length"], target_unit="m") From 2507c324349ac75ed4d8c1a4ae05699c7d08c9f1 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Wed, 5 Jun 2024 10:01:13 +0200 Subject: [PATCH 024/211] refactor --- magpylib/_src/display/backend_plotly.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/magpylib/_src/display/backend_plotly.py b/magpylib/_src/display/backend_plotly.py index 25758c738..263c0ce82 100644 --- a/magpylib/_src/display/backend_plotly.py +++ b/magpylib/_src/display/backend_plotly.py @@ -75,15 +75,17 @@ def match_args(ttype: str): return set(named_args) -def apply_fig_ranges(fig, ranges_rc, labels, apply2d=True): +def apply_fig_ranges(fig, ranges_rc, labels_rc, apply2d=True): """This is a helper function which applies the ranges properties of the provided `fig` object - according to a provided ranges. All three space direction will be equal and match the - maximum of the ranges needed to display all objects, including their paths. + according to a provided ranges for each subplot. All three space direction will be equal and + match the maximum of the ranges needed to display all objects, including their paths. Parameters ---------- - ranges: array of dimension=(3,2) + ranges_rc: dict of arrays of dimension=(3,2) min and max graph range + labels_rc: dict of dicts + contains a dict with 'x', 'y', 'z' keys and respective labels as strings for each subplot apply2d: bool, default = True applies fixed range also on 2d traces @@ -94,12 +96,13 @@ def apply_fig_ranges(fig, ranges_rc, labels, apply2d=True): """ for rc, ranges in ranges_rc.items(): row, col = rc + labels = labels_rc.get(rc, {k: "" for k in "xyz"}) kwargs = { **{ f"{k}axis": { "range": ranges[i], "autorange": False, - "title": labels.get(rc, {k: "" for k in "xyz"})[k], + "title": labels[k], } for i, k in enumerate("xyz") }, @@ -359,7 +362,9 @@ def display_plotly( if extra_data: ranges_rc = get_scene_ranges(*frames[0]["data"]) if update_layout: - apply_fig_ranges(fig, ranges_rc, labels=data["labels"], apply2d=isanimation) + apply_fig_ranges( + fig, ranges_rc, labels_rc=data["labels"], apply2d=isanimation + ) fig.update_layout( legend_itemsizing="constant", # legend_groupclick="toggleitem", From 1e86e43035b12fcd188acdd190c9d3242552af34 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Wed, 5 Jun 2024 10:54:36 +0200 Subject: [PATCH 025/211] fix autosize scaling with units --- magpylib/_src/display/traces_generic.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index f60ef5077..6591a54c5 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -807,7 +807,8 @@ def get_traces_3D(flat_objs_props, extra_backend=False, autosize=None, **kwargs) for obj, params in flat_objs_props.items(): if autosize is None and getattr(obj, "_autosize", False): # temporary coordinates to be able to calculate ranges - x, y, z = obj._position.T + factor = get_unit_factor(kwargs.get("units_length", "m"), target_unit="m") + x, y, z = obj._position.T * factor traces_dict[obj] = [{"x": x, "y": y, "z": z, "_autosize": True}] else: params = {**params, **kwargs} From 36e648c789466a9ba9217b0aba6fd9df22dffd2e Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Wed, 5 Jun 2024 15:38:44 +0200 Subject: [PATCH 026/211] ad units_length=None als option to remove axes labels --- magpylib/_src/display/traces_generic.py | 7 ++++--- magpylib/_src/utility.py | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index 7a7284328..ebf4471c0 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -748,7 +748,7 @@ def draw_frame(objs, colorsequence=None, autosize=None, **kwargs) -> Tuple: traces_dict = {} extra_backend_traces = [] autosize_out = {} - labels = {(1, 1): {k: "" for k in "xyz"}} + labels = {(1, 1): {k: k for k in "xyz"}} zoom = {} for rc, objs_props in objs_props_by_row_col.items(): if objs_props["rc_params"]["output"] != "model3d": @@ -759,11 +759,12 @@ def draw_frame(objs, colorsequence=None, autosize=None, **kwargs) -> Tuple: objs_props["objects"], **rc_params, **kwargs ) if autosize is None or autosize == "return": - labels[rc] = {k: f"{k} ({rc_params['units_length']})" for k in "xyz"} + unit_str = "" if not (ul := rc_params["units_length"]) else f" {ul}" + labels[rc] = {k: f"{k}{unit_str}" for k in "xyz"} zoom[rc] = objs_props["rc_params"]["zoom"] traces = [t for tr in traces_dict_1.values() for t in tr] ranges_rc = get_scene_ranges( - *traces, *extra_backend_traces_1, zoom=objs_props["rc_params"]["zoom"] + *traces, *extra_backend_traces_1, zoom=zoom[rc] ) length_factor = get_unit_factor(rc_params["units_length"], target_unit="m") # pylint: disable=no-member diff --git a/magpylib/_src/utility.py b/magpylib/_src/utility.py index f5e36cc5b..6fcbad687 100644 --- a/magpylib/_src/utility.py +++ b/magpylib/_src/utility.py @@ -243,7 +243,7 @@ def filter_objects(obj_list, allow="sources+sensors", warn=True): @lru_cache(maxsize=None) def get_unit_factor(unit_input, *, target_unit, deci_centi=True): """return unit factor based on input and target unit""" - if unit_input == target_unit: + if unit_input is None or unit_input == target_unit: return 1 pref, suff, factor_power = "", "", None prefs = _UNIT_PREFIX_REVERSED From da50da578f3f8ef7eed34f6b50c424e9f5ea492c Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Wed, 5 Jun 2024 15:43:44 +0200 Subject: [PATCH 027/211] fix axes label in parentheses --- magpylib/_src/display/traces_generic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index ebf4471c0..b9773f915 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -759,7 +759,7 @@ def draw_frame(objs, colorsequence=None, autosize=None, **kwargs) -> Tuple: objs_props["objects"], **rc_params, **kwargs ) if autosize is None or autosize == "return": - unit_str = "" if not (ul := rc_params["units_length"]) else f" {ul}" + unit_str = "" if not (ul := rc_params["units_length"]) else f" ({ul})" labels[rc] = {k: f"{k}{unit_str}" for k in "xyz"} zoom[rc] = objs_props["rc_params"]["zoom"] traces = [t for tr in traces_dict_1.values() for t in tr] From 11980b65c246da9d4dcb9ac959b073b19a3e8312 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Wed, 5 Jun 2024 18:36:27 +0200 Subject: [PATCH 028/211] remove old code --- magpylib/_src/display/traces_utility.py | 1 - 1 file changed, 1 deletion(-) diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index 95b153c59..0922da84f 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -512,7 +512,6 @@ def get_scene_ranges(*traces, zoom=0) -> np.ndarray: tr_dim_count[rc]["2D"] += 1 else: tr_dim_count[rc]["3D"] += 1 - ranges_rc[rc]["trace3d_found"] = True pts = np.array([tr[k] for k in coords], dtype="float64").T try: # for mesh3d, use only vertices part of faces for range calculation inds = np.array([tr[k] for k in "ijk"], dtype="int64").T From 355cb8ebb7cc3e7503c4d7010aa19e9d8ecc0a06 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Wed, 5 Jun 2024 22:29:17 +0200 Subject: [PATCH 029/211] refactor to allow units_length="auto" --- magpylib/_src/display/traces_generic.py | 78 ++++++++++++++----------- magpylib/_src/display/traces_utility.py | 23 ++++++-- magpylib/_src/utility.py | 14 +++-- tests/test_display_plotly.py | 2 +- 4 files changed, 75 insertions(+), 42 deletions(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index b9773f915..7d0b4fe85 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -24,14 +24,16 @@ from magpylib._src.display.traces_utility import get_objects_props_by_row_col from magpylib._src.display.traces_utility import get_rot_pos_from_path from magpylib._src.display.traces_utility import get_scene_ranges -from magpylib._src.display.traces_utility import get_unit_factor from magpylib._src.display.traces_utility import getColorscale from magpylib._src.display.traces_utility import getIntensity from magpylib._src.display.traces_utility import group_traces from magpylib._src.display.traces_utility import place_and_orient_model3d +from magpylib._src.display.traces_utility import rescale_traces from magpylib._src.display.traces_utility import slice_mesh_from_colorscale from magpylib._src.style import DefaultMarkers from magpylib._src.utility import format_obj_input +from magpylib._src.utility import get_unit_factor +from magpylib._src.utility import unit_prefix class MagpyMarkers: @@ -389,7 +391,7 @@ def get_label_and_color(obj): return traces -def process_extra_trace(model, units_length): +def process_extra_trace(model): "process extra trace attached to some magpylib object" extr = model["model3d"] model_kwargs = {**(extr.kwargs() if callable(extr.kwargs) else extr.kwargs)} @@ -398,6 +400,7 @@ def process_extra_trace(model, units_length): "constructor": extr.constructor, "kwargs": model_kwargs, "args": model_args, + "coordsargs": extr.coordsargs, "kwargs_extra": model["kwargs_extra"], } kwargs, args = place_and_orient_model3d( @@ -407,7 +410,6 @@ def process_extra_trace(model, units_length): position=model["position"], coordsargs=extr.coordsargs, scale=extr.scale, - units_length=units_length, return_model_args=True, ) trace3d["kwargs"].update(kwargs) @@ -425,7 +427,6 @@ def get_generic_traces3D( extra_backend=False, row=1, col=1, - units_length="mm", **kwargs, ) -> list: """ @@ -549,7 +550,7 @@ def get_generic_traces3D( path_traces_generic = group_traces(*path_traces_generic) for tr in path_traces_generic: - tr.update(place_and_orient_model3d(tr, units_length=units_length)) + tr.update(place_and_orient_model3d(tr)) tr.update(row=row, col=col) if tr.get("opacity", None) is None: tr["opacity"] = style.opacity @@ -597,7 +598,7 @@ def get_generic_traces3D( "col": col, }, } - tr_non_generic = process_extra_trace(tr_non_generic, units_length) + tr_non_generic = process_extra_trace(tr_non_generic) path_traces_extra_non_generic_backend.append(tr_non_generic) out.update({extra_backend: path_traces_extra_non_generic_backend}) return out @@ -723,7 +724,7 @@ def extract_animation_properties( return path_indices, exp, frame_duration -def draw_frame(objs, colorsequence=None, autosize=None, **kwargs) -> Tuple: +def draw_frame(objs, *, colorsequence, rc_params, **kwargs) -> Tuple: """ Creates traces from input `objs` and provided parameters, updates the size of objects like Sensors and Dipoles in `kwargs` depending on the canvas size. @@ -747,31 +748,27 @@ def draw_frame(objs, colorsequence=None, autosize=None, **kwargs) -> Tuple: ) traces_dict = {} extra_backend_traces = [] - autosize_out = {} - labels = {(1, 1): {k: k for k in "xyz"}} - zoom = {} + rc_params = {} if rc_params is None else rc_params for rc, objs_props in objs_props_by_row_col.items(): if objs_props["rc_params"]["output"] != "model3d": continue - rc_keys = ("row", "col", "units_length") - rc_params = {k: v for k, v in objs_props["rc_params"].items() if k in rc_keys} + rc_params[rc] = rc_params.get(rc, {}) + rc_params[rc]["units_length"] = objs_props["rc_params"]["units_length"] + rc_keys = ("row", "col") + rc_kwargs = {k: v for k, v in objs_props["rc_params"].items() if k in rc_keys} traces_dict_1, extra_backend_traces_1 = get_traces_3D( - objs_props["objects"], **rc_params, **kwargs + objs_props["objects"], **rc_kwargs, **kwargs ) - if autosize is None or autosize == "return": - unit_str = "" if not (ul := rc_params["units_length"]) else f" ({ul})" - labels[rc] = {k: f"{k}{unit_str}" for k in "xyz"} - zoom[rc] = objs_props["rc_params"]["zoom"] + rc_params[rc]["autosize"] = rc_params.get(rc, {}).get("autosize", None) + if rc_params[rc]["autosize"] is None: + rc_params[rc]["zoom"] = objs_props["rc_params"]["zoom"] traces = [t for tr in traces_dict_1.values() for t in tr] ranges_rc = get_scene_ranges( - *traces, *extra_backend_traces_1, zoom=zoom[rc] + *traces, *extra_backend_traces_1, zoom=rc_params[rc]["zoom"] ) - length_factor = get_unit_factor(rc_params["units_length"], target_unit="m") # pylint: disable=no-member - factor = default_settings.display.autosizefactor * length_factor - autosize_out[rc] = np.mean(np.diff(ranges_rc[rc])) / factor - else: - autosize_out = autosize + autosizefactor = default_settings.display.autosizefactor + rc_params[rc]["autosize"] = np.mean(np.diff(ranges_rc[rc])) / autosizefactor to_resize_keys = { k for k, v in traces_dict_1.items() if v and "_autosize" in v[0] } @@ -779,7 +776,7 @@ def draw_frame(objs, colorsequence=None, autosize=None, **kwargs) -> Tuple: k: v for k, v in objs_props["objects"].items() if k in to_resize_keys } traces_dict_2, extra_backend_traces_2 = get_traces_3D( - flat_objs_props, autosize=autosize_out.get(rc, None), **rc_params, **kwargs + flat_objs_props, autosize=rc_params[rc]["autosize"], **rc_kwargs, **kwargs ) traces_dict.update( {(k, *rc): v for k, v in {**traces_dict_1, **traces_dict_2}.items()} @@ -797,7 +794,7 @@ def draw_frame(objs, colorsequence=None, autosize=None, **kwargs) -> Tuple: return ( traces, extra_backend_traces, - {"autosize": autosize_out, "labels": labels, "zoom": zoom}, + rc_params, ) @@ -809,8 +806,7 @@ def get_traces_3D(flat_objs_props, extra_backend=False, autosize=None, **kwargs) for obj, params in flat_objs_props.items(): if autosize is None and getattr(obj, "_autosize", False): # temporary coordinates to be able to calculate ranges - factor = get_unit_factor(kwargs.get("units_length", "m"), target_unit="m") - x, y, z = obj._position.T * factor + x, y, z = obj._position.T traces_dict[obj] = [{"x": x, "y": y, "z": z, "_autosize": True}] else: params = {**params, **kwargs} @@ -875,7 +871,7 @@ def get_frames( frames = [] title_str = title - rc_params = {"autosize": "return"} + rc_params = {} for i, ind in enumerate(path_indices): extra_backend_traces = [] if animation: @@ -885,7 +881,7 @@ def get_frames( traces, extra_backend_traces, rc_params_temp = draw_frame( objs, colorsequence=colorsequence, - autosize=rc_params["autosize"], + rc_params=rc_params, supports_colorgradient=supports_colorgradient, extra_backend=backend, **kwargs, @@ -900,14 +896,30 @@ def get_frames( "extra_backend_traces": extra_backend_traces, } ) - clean_legendgroups(frames) traces = [t for frame in frames for t in frame["data"]] - ranges = get_scene_ranges(*traces, *extra_backend_traces, zoom=rc_params["zoom"]) + zoom = {rc: v["zoom"] for rc, v in rc_params.items()} + ranges_rc = get_scene_ranges(*traces, *extra_backend_traces, zoom=zoom) + labels_rc = {(1, 1): {k: "" for k in "xyz"}} + scale_factors_rc = {} + for rc, params in rc_params.items(): + units_length = params["units_length"] + if units_length == "auto": + rmax = np.amax(np.abs(ranges_rc[rc])) + units_length = f"{unit_prefix(rmax, as_tuple=True)[2]}m" + unit_str = "" if not (units_length) else f" ({units_length})" + labels_rc[rc] = {k: f"{k}{unit_str}" for k in "xyz"} + scale_factors_rc[rc] = get_unit_factor(units_length, target_unit="m") + ranges_rc[rc] *= scale_factors_rc[rc] + + for frame in frames: + for key in ("data", "extra_backend_traces"): + frame[key] = rescale_traces(frame[key], factors=scale_factors_rc) + out = { "frames": frames, - "ranges": ranges, - "labels": rc_params["labels"], + "ranges": ranges_rc, + "labels": labels_rc, "input_kwargs": {**kwargs, **animation_kwargs}, } if animation: diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index 0922da84f..97ef10d68 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -14,7 +14,6 @@ from magpylib._src.input_checks import check_input_zoom from magpylib._src.style import get_style from magpylib._src.utility import format_obj_input -from magpylib._src.utility import get_unit_factor from magpylib._src.utility import merge_dicts_with_conflict_check DEFAULT_ROW_COL_PARAMS = { @@ -55,13 +54,12 @@ def place_and_orient_model3d( coordsargs=None, scale=1, return_model_args=False, - units_length="m", + length_factor=1, **kwargs, ): """places and orients mesh3d dict""" - if orientation is None and position is None and units_length == "m" and scale == 1: + if orientation is None and position is None and length_factor == 1: return {**model_kwargs, **kwargs} - length_factor = get_unit_factor(units_length, target_unit="m") position = (0.0, 0.0, 0.0) if position is None else position position = np.array(position, dtype=float) new_model_dict = {} @@ -543,6 +541,23 @@ def get_scene_ranges(*traces, zoom=0) -> np.ndarray: return ranges_rc +def rescale_traces(traces, factors): + """Rescale traces based on scale factors by (row,col) index""" + for ind, tr in enumerate(traces): + rc = tr.get("row", 1), tr.get("col", 1) + kw = {} + if "constructor" in tr: + kwex = tr["kwargs_extra"] + rc = kwex["row"], kwex["col"] + kw.update( + model_args=tr.get("args", None), + coordsargs=tr.get("coordsargs", None), + ) + if "z" in tr: # rescale only 3d traces + traces[ind] = place_and_orient_model3d(tr, length_factor=factors[rc], **kw) + return traces + + def group_traces(*traces): """Group and merge mesh traces with similar properties. This drastically improves browser rendering performance when displaying a lot of mesh3d objects.""" diff --git a/magpylib/_src/utility.py b/magpylib/_src/utility.py index 6fcbad687..0fda4f2ee 100644 --- a/magpylib/_src/utility.py +++ b/magpylib/_src/utility.py @@ -266,7 +266,7 @@ def get_unit_factor(unit_input, *, target_unit, deci_centi=True): return factor -def unit_prefix(number, unit="", precision=3, char_between="") -> str: +def unit_prefix(number, unit="", precision=3, char_between="", as_tuple=False) -> str: """ displays a number with given unit and precision and uses unit prefixes for the exponents from yotta (y) to Yocto (Y). If the exponent is smaller or bigger, falls back to scientific notation. @@ -281,10 +281,13 @@ def unit_prefix(number, unit="", precision=3, char_between="") -> str: char_between : str, optional character to insert between number of prefix. Can be " " or any string, if a space is wanted before the unit symbol , by default "" + as_tuple: bool, optional + if True returns (new_number_str, char_between, prefix, unit) tuple + else returns the joined string Returns ------- - str - returns formatted number as string + str or tuple + returns formatted number as string or tuple """ digits = int(log10(abs(number))) // 3 * 3 if number != 0 else 0 prefix = _UNIT_PREFIX.get(digits, "") @@ -292,7 +295,10 @@ def unit_prefix(number, unit="", precision=3, char_between="") -> str: if prefix == "": digits = 0 new_number_str = f"{number / 10 ** digits:.{precision}g}" - return f"{new_number_str}{char_between}{prefix}{unit}" + res = (new_number_str, char_between, prefix, unit) + if as_tuple: + return res + return "".join(f"{v}" for v in res) def add_iteration_suffix(name): diff --git a/tests/test_display_plotly.py b/tests/test_display_plotly.py index 2435e8c58..a684e8b35 100644 --- a/tests/test_display_plotly.py +++ b/tests/test_display_plotly.py @@ -3,8 +3,8 @@ import pytest import magpylib as magpy -from magpylib._src.display.traces_utility import get_unit_factor from magpylib._src.exceptions import MagpylibBadUserInput +from magpylib._src.utility import get_unit_factor # pylint: disable=assignment-from-no-return # pylint: disable=no-member From 09d25f777361a958539080d4859379a7cad6dadc Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Thu, 6 Jun 2024 00:35:29 +0200 Subject: [PATCH 030/211] fix same color for different suplots --- magpylib/_src/display/traces_utility.py | 32 ++++++++++++++----------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index 97ef10d68..1f94c6a3c 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -262,22 +262,26 @@ def get_rot_pos_from_path(obj, show_path=None): def get_objects_props_by_row_col(*objs, colorsequence, **kwargs): """Return flat dict with objs as keys object properties as values. Properties include: row_cols, style, legendgroup, legendtext""" - flat_objs = {} + flat_objs_rc = {} + rc_params_by_obj = {} for obj in objs: - flat_sub_objs = get_flatten_objects_properties_recursive( - *obj["objects"], colorsequence=colorsequence, **kwargs - ) - for subobj, props in flat_sub_objs.items(): - rc = obj["row"], obj["col"] - if rc not in flat_objs: - flat_objs[rc] = { - "objects": {}, - "rc_params": {k: v for k, v in obj.items() if k != "objects"}, - } - flat_objs[rc]["objects"][subobj] = props - + rc = obj["row"], obj["col"] + rc_params = {k: v for k, v in obj.items() if k != "objects"} + for subobj in obj["objects"]: + if subobj not in rc_params_by_obj: + rc_params_by_obj[subobj] = [] + rc_params_by_obj[subobj].append(rc_params) + flat_sub_objs = get_flatten_objects_properties_recursive( + *rc_params_by_obj, colorsequence=colorsequence, **kwargs + ) + for obj, rc_params_list in rc_params_by_obj.items(): + for rc_params in rc_params_list: + rc = rc_params["row"], rc_params["col"] + if rc not in flat_objs_rc: + flat_objs_rc[rc] = {"objects": {}, "rc_params": rc_params} + flat_objs_rc[rc]["objects"][obj] = flat_sub_objs[obj] kwargs = {k: v for k, v in kwargs.items() if not k.startswith("style")} - return flat_objs, kwargs + return flat_objs_rc, kwargs def get_flatten_objects_properties_recursive( From d3dbfda92898b562b88fa95311f07ee13194fa0c Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Thu, 6 Jun 2024 01:05:11 +0200 Subject: [PATCH 031/211] remove unused variable (code ql) --- magpylib/_src/display/traces_utility.py | 1 - 1 file changed, 1 deletion(-) diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index 1f94c6a3c..41dd00e32 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -265,7 +265,6 @@ def get_objects_props_by_row_col(*objs, colorsequence, **kwargs): flat_objs_rc = {} rc_params_by_obj = {} for obj in objs: - rc = obj["row"], obj["col"] rc_params = {k: v for k, v in obj.items() if k != "objects"} for subobj in obj["objects"]: if subobj not in rc_params_by_obj: From 9b9ffed0f228de5adc962c42c4e219cf5f4f9039 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Thu, 6 Jun 2024 20:50:42 +0200 Subject: [PATCH 032/211] update changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e42473b2..85cfbb930 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ # Changelog ## [Unreleased] - YYYY-MM-DD - +- Added `units_length` input to the `show` function to allow displaying axes with different length units. This parameter can be set individually for each subplot. ([#786](https://github.com/magpylib/magpylib/pull/786)) +- Fixed markers legend not being suppressible ([#789](https://github.com/magpylib/magpylib/pull/789)) ## [5.0.3] - 2024-06-03 From 4c3092b7b6ce6ff695fe474507976206d9d208c1 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Thu, 6 Jun 2024 21:51:40 +0200 Subject: [PATCH 033/211] draft --- magpylib/_src/display/traces_core.py | 39 ++++++++++++++++++++----- magpylib/_src/display/traces_generic.py | 25 ++++++++++++++-- 2 files changed, 54 insertions(+), 10 deletions(-) diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index d3c8cd15a..c748f7e52 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -522,19 +522,42 @@ def make_TriangularMesh(obj, **kwargs) -> Union[Dict[str, Any], List[Dict[str, A return traces -def make_Pixels(positions, size=1) -> Dict[str, Any]: +def make_Pixels(sensor, sources, positions, symbol="cone", size=1) -> Dict[str, Any]: """ Create the plotly mesh3d parameters for Sensor pixels based on pixel positions and chosen size For now, only "cube" shape is provided. """ - pixels = [ - make_BaseCuboid("plotly-dict", position=p, dimension=[size] * 3) - for p in positions - ] + # pylint: disable=import-outside-toplevel + from magpylib._src.fields.field_wrap_BH import getBH_level2 + + BH_array = getBH_level2( + sources, + [sensor], + sumup=True, + squeeze=False, + field="B", + pixel_agg=None, + output="ndarray", + in_out="auto", + ) + print(BH_array.shape, positions.shape) + + if symbol == "cube": + pixels = [ + make_BaseCuboid("plotly-dict", position=p, dimension=[size] * 3) + for p in positions + ] + elif symbol == "cone": + pixels = [ + make_BasePyramid( + "plotly-dict", position=p, base=5, diameter=size, height=size + ) + for p in positions + ] return merge_mesh3d(*pixels) -def make_Sensor(obj, autosize=None, **kwargs) -> Dict[str, Any]: +def make_Sensor(obj, *, autosize, sources, **kwargs) -> Dict[str, Any]: """ Create the plotly mesh3d parameters for a Sensor object in a dictionary based on the provided arguments. @@ -591,7 +614,9 @@ def make_Sensor(obj, autosize=None, **kwargs) -> Dict[str, Any]: if pixel_size > 0: pixel_dim *= pixel_size poss = pixel[1:] if one_pix else pixel - pixels_mesh = make_Pixels(positions=poss, size=pixel_dim) + pixels_mesh = make_Pixels( + sensor=obj, sources=sources, positions=poss, size=pixel_dim + ) pixels_mesh["facecolor"] = np.repeat(pixel_color, len(pixels_mesh["i"])) meshes_to_merge.append(pixels_mesh) hull_pos = 0.5 * (pixel.max(axis=0) + pixel.min(axis=0)) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index 7d0b4fe85..e2d69d8b5 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -419,6 +419,7 @@ def process_extra_trace(model): def get_generic_traces3D( input_obj, + sources, autosize=None, legendgroup=None, legendtext=None, @@ -462,6 +463,8 @@ def get_generic_traces3D( make_func_kwargs = {"legendgroup": legendgroup, **kwargs} if getattr(input_obj, "_autosize", False): make_func_kwargs["autosize"] = autosize + if hasattr(style, "pixel"): + make_func_kwargs["sources"] = sources has_path = hasattr(input_obj, "position") and hasattr(input_obj, "orientation") path_traces_extra_non_generic_backend = [] @@ -734,6 +737,15 @@ def draw_frame(objs, *, colorsequence, rc_params, **kwargs) -> Tuple: traces_dicts, kwargs: dict, dict returns the traces in a obj/traces_list dictionary and updated kwargs """ + sources = format_obj_input( + *{sub_obj for obj in objs for sub_obj in obj["objects"]}, + allow="sources+collections", + ) + sources = [ + s + for s in sources + if not (isinstance(s, magpy.Collection) and not s.sources_all) + ] if colorsequence is None: # pylint: disable=no-member colorsequence = default_settings.display.colorsequence @@ -757,7 +769,7 @@ def draw_frame(objs, *, colorsequence, rc_params, **kwargs) -> Tuple: rc_keys = ("row", "col") rc_kwargs = {k: v for k, v in objs_props["rc_params"].items() if k in rc_keys} traces_dict_1, extra_backend_traces_1 = get_traces_3D( - objs_props["objects"], **rc_kwargs, **kwargs + objs_props["objects"], sources=sources, **rc_kwargs, **kwargs ) rc_params[rc]["autosize"] = rc_params.get(rc, {}).get("autosize", None) if rc_params[rc]["autosize"] is None: @@ -776,7 +788,11 @@ def draw_frame(objs, *, colorsequence, rc_params, **kwargs) -> Tuple: k: v for k, v in objs_props["objects"].items() if k in to_resize_keys } traces_dict_2, extra_backend_traces_2 = get_traces_3D( - flat_objs_props, autosize=rc_params[rc]["autosize"], **rc_kwargs, **kwargs + flat_objs_props, + autosize=rc_params[rc]["autosize"], + sources=sources, + **rc_kwargs, + **kwargs, ) traces_dict.update( {(k, *rc): v for k, v in {**traces_dict_1, **traces_dict_2}.items()} @@ -798,7 +814,9 @@ def draw_frame(objs, *, colorsequence, rc_params, **kwargs) -> Tuple: ) -def get_traces_3D(flat_objs_props, extra_backend=False, autosize=None, **kwargs): +def get_traces_3D( + flat_objs_props, sources, extra_backend=False, autosize=None, **kwargs +): """Return traces, traces to resize and extra_backend_traces""" # pylint: disable=protected-access extra_backend_traces = [] @@ -821,6 +839,7 @@ def get_traces_3D(flat_objs_props, extra_backend=False, autosize=None, **kwargs) obj._style = style_temp.copy() out_traces = get_generic_traces3D( obj, + sources=sources, extra_backend=extra_backend, autosize=autosize, **params, From 6ecc14bc4850dd97df7ceb5b3c57e0cda5637ee3 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Fri, 7 Jun 2024 16:17:40 +0200 Subject: [PATCH 034/211] make functional --- magpylib/_src/display/traces_core.py | 52 ++++++++++++++++--------- magpylib/_src/display/traces_generic.py | 14 +++++-- magpylib/_src/display/traces_utility.py | 35 +++++++++++++++++ 3 files changed, 79 insertions(+), 22 deletions(-) diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index c748f7e52..f98002fd2 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -34,6 +34,7 @@ from magpylib._src.display.traces_utility import draw_arrow_from_vertices from magpylib._src.display.traces_utility import draw_arrow_on_circle from magpylib._src.display.traces_utility import get_legend_label +from magpylib._src.display.traces_utility import get_orientation_from_vec from magpylib._src.display.traces_utility import merge_mesh3d from magpylib._src.display.traces_utility import place_and_orient_model3d from magpylib._src.display.traces_utility import triangles_area @@ -522,25 +523,13 @@ def make_TriangularMesh(obj, **kwargs) -> Union[Dict[str, Any], List[Dict[str, A return traces -def make_Pixels(sensor, sources, positions, symbol="cone", size=1) -> Dict[str, Any]: +def make_Pixels( + sensor, sources, positions, symbol="cone", size=1, path_ind=-1 +) -> Dict[str, Any]: """ Create the plotly mesh3d parameters for Sensor pixels based on pixel positions and chosen size For now, only "cube" shape is provided. """ - # pylint: disable=import-outside-toplevel - from magpylib._src.fields.field_wrap_BH import getBH_level2 - - BH_array = getBH_level2( - sources, - [sensor], - sumup=True, - squeeze=False, - field="B", - pixel_agg=None, - output="ndarray", - in_out="auto", - ) - print(BH_array.shape, positions.shape) if symbol == "cube": pixels = [ @@ -548,16 +537,37 @@ def make_Pixels(sensor, sources, positions, symbol="cone", size=1) -> Dict[str, for p in positions ] elif symbol == "cone": + # pylint: disable=import-outside-toplevel + from magpylib._src.fields.field_wrap_BH import getBH_level2 + + BH_array = getBH_level2( + sources, + [sensor], + sumup=True, + squeeze=False, + field="B", + pixel_agg=None, + output="ndarray", + in_out="auto", + ) + # select first source (for sumup=True there is only one) and path index + reshape pixel + BH_array = BH_array[0][path_ind].reshape(-1, 3) + orientations = get_orientation_from_vec(BH_array) pixels = [ make_BasePyramid( - "plotly-dict", position=p, base=5, diameter=size, height=size + "plotly-dict", + position=p, + orientation=o, + base=5, + diameter=size, + height=size * 2, ) - for p in positions + for p, o in zip(positions, orientations) ] return merge_mesh3d(*pixels) -def make_Sensor(obj, *, autosize, sources, **kwargs) -> Dict[str, Any]: +def make_Sensor(obj, *, autosize, sources, path_ind, **kwargs) -> Dict[str, Any]: """ Create the plotly mesh3d parameters for a Sensor object in a dictionary based on the provided arguments. @@ -615,7 +625,11 @@ def make_Sensor(obj, *, autosize, sources, **kwargs) -> Dict[str, Any]: pixel_dim *= pixel_size poss = pixel[1:] if one_pix else pixel pixels_mesh = make_Pixels( - sensor=obj, sources=sources, positions=poss, size=pixel_dim + sensor=obj, + sources=sources, + positions=poss, + size=pixel_dim, + path_ind=path_ind, ) pixels_mesh["facecolor"] = np.repeat(pixel_color, len(pixels_mesh["i"])) meshes_to_merge.append(pixels_mesh) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index e2d69d8b5..c56cf0fa6 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -428,6 +428,7 @@ def get_generic_traces3D( extra_backend=False, row=1, col=1, + path_ind=-1, **kwargs, ) -> list: """ @@ -464,7 +465,7 @@ def get_generic_traces3D( if getattr(input_obj, "_autosize", False): make_func_kwargs["autosize"] = autosize if hasattr(style, "pixel"): - make_func_kwargs["sources"] = sources + make_func_kwargs.update(sources=sources, path_ind=path_ind) has_path = hasattr(input_obj, "position") and hasattr(input_obj, "orientation") path_traces_extra_non_generic_backend = [] @@ -755,6 +756,7 @@ def draw_frame(objs, *, colorsequence, rc_params, **kwargs) -> Tuple: style_path_frames = kwargs.get( "style_path_frames", [-1] ) # get before next func strips style + path_ind = style_path_frames[-1] objs_props_by_row_col, kwargs = get_objects_props_by_row_col( *objs, colorsequence=colorsequence, **kwargs ) @@ -769,7 +771,11 @@ def draw_frame(objs, *, colorsequence, rc_params, **kwargs) -> Tuple: rc_keys = ("row", "col") rc_kwargs = {k: v for k, v in objs_props["rc_params"].items() if k in rc_keys} traces_dict_1, extra_backend_traces_1 = get_traces_3D( - objs_props["objects"], sources=sources, **rc_kwargs, **kwargs + objs_props["objects"], + sources=sources, + path_ind=path_ind, + **rc_kwargs, + **kwargs, ) rc_params[rc]["autosize"] = rc_params.get(rc, {}).get("autosize", None) if rc_params[rc]["autosize"] is None: @@ -791,6 +797,7 @@ def draw_frame(objs, *, colorsequence, rc_params, **kwargs) -> Tuple: flat_objs_props, autosize=rc_params[rc]["autosize"], sources=sources, + path_ind=path_ind, **rc_kwargs, **kwargs, ) @@ -815,7 +822,7 @@ def draw_frame(objs, *, colorsequence, rc_params, **kwargs) -> Tuple: def get_traces_3D( - flat_objs_props, sources, extra_backend=False, autosize=None, **kwargs + flat_objs_props, sources, extra_backend=False, autosize=None, path_ind=-1, **kwargs ): """Return traces, traces to resize and extra_backend_traces""" # pylint: disable=protected-access @@ -842,6 +849,7 @@ def get_traces_3D( sources=sources, extra_backend=extra_backend, autosize=autosize, + path_ind=path_ind, **params, ) if extra_backend: diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index 41dd00e32..f9167710b 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -127,6 +127,41 @@ def get_vertices_from_model(model_kwargs, model_args=None, coordsargs=None): return vertices, coordsargs, useargs +def get_orientation_from_vec(vec, ref_axis=(0, 0, 1)): + """Compute rotation from input vector to reference axis. + + Parameters + ---------- + vec : array_like of shape (n,3) + Input vector (3D) + ref_axis : array_like, optional + Reference axis (3D), default is (0, 0, 1) + + Returns + ------- + RotScipy + Rotation object from input vector to reference axis + """ + # normalize reference axis + norm = np.linalg.norm(ref_axis) + if norm != 0: + ref_axis = ref_axis / norm + + # clean and normalize input vector + vec[np.isnan(vec).any(axis=1)] = [0, 0, 0] + norm = np.linalg.norm(vec, axis=1) + norm[norm == 0] = 1 + vec = (vec.T / norm).T + + # get angle and axis for rotvec + cross = np.cross(vec, ref_axis) + dot = np.dot(vec, ref_axis) + angle = np.arccos(dot) + rotvec = (-angle * cross.T).T + rotvec[(cross == 0).all(axis=1) & (dot == -1)] = [0, 0, np.pi] + return RotScipy.from_rotvec(rotvec) + + def draw_arrowed_line( vec, pos, From 1ab59824cdcdbffa0cd389740c2a46fa13c4ab0c Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Fri, 7 Jun 2024 17:41:56 +0200 Subject: [PATCH 035/211] update docs --- docs/_pages/user_guide/docs/docs_graphics.md | 24 ++++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/_pages/user_guide/docs/docs_graphics.md b/docs/_pages/user_guide/docs/docs_graphics.md index 5fc44c814..6cce8f201 100644 --- a/docs/_pages/user_guide/docs/docs_graphics.md +++ b/docs/_pages/user_guide/docs/docs_graphics.md @@ -4,9 +4,9 @@ jupytext: extension: .md format_name: myst format_version: 0.13 - jupytext_version: 1.16.0 + jupytext_version: 1.16.1 kernelspec: - display_name: Python 3 + display_name: Python 3 (ipykernel) language: python name: python3 orphan: true @@ -423,22 +423,22 @@ with magpy.show_context(loop, sens, animation=True) as sc: sc.show(output="Hxyz", col=2, row=2) ``` - ### Canvas length units When displaying very small Magpylib objects, the axes scaling in meters might be inadequate and you may want to use other units that fit the system dimensions more nicely. The example below shows how to display an object (in this case the same) with different length units and zoom levels. +```{tip} +Setting `units_length="auto"` will infer the most suitable units based on the maximum range of the system. +``` + ```{code-cell} ipython3 import magpylib as magpy -c1 = magpy.magnet.Cuboid( - dimension=(1, 1, 1), - polarization=(1, 2, 3), -) +c1 = magpy.magnet.Cuboid(dimension=(0.001, 0.001, 0.001), polarization=(1, 2, 3)) -with magpy.show_context(c1, backend="plotly", plotly_fig_layout_height=800) as s: - s.show(row=1, col=1, units_length="m", zoom=3) - s.show(row=1, col=2, units_length="dm", zoom=2) - s.show(row=2, col=1, units_length="cm", zoom=1) - s.show(row=2, col=2, units_length="mm", zoom=0) +with magpy.show_context(c1, backend="matplotlib") as s: + s.show(row=1, col=1, units_length="auto", zoom=0) + s.show(row=1, col=2, units_length="mm", zoom=1) + s.show(row=2, col=1, units_length="µm", zoom=2) + s.show(row=2, col=2, units_length="m", zoom=3) ``` From 026e54372954874db29b1e058046abbf111f4a69 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sat, 8 Jun 2024 00:36:37 +0200 Subject: [PATCH 036/211] add colorscale to pixels --- magpylib/_src/display/traces_core.py | 44 ++++++++++++++++--------- magpylib/_src/display/traces_utility.py | 19 +++++++++++ 2 files changed, 47 insertions(+), 16 deletions(-) diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index f98002fd2..d2f982c40 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -33,6 +33,7 @@ from magpylib._src.display.traces_utility import create_null_dim_trace from magpylib._src.display.traces_utility import draw_arrow_from_vertices from magpylib._src.display.traces_utility import draw_arrow_on_circle +from magpylib._src.display.traces_utility import get_hexcolors_from_scale from magpylib._src.display.traces_utility import get_legend_label from magpylib._src.display.traces_utility import get_orientation_from_vec from magpylib._src.display.traces_utility import merge_mesh3d @@ -524,7 +525,12 @@ def make_TriangularMesh(obj, **kwargs) -> Union[Dict[str, Any], List[Dict[str, A def make_Pixels( - sensor, sources, positions, symbol="cone", size=1, path_ind=-1 + sensor, + sources, + positions, + symbol="cone", + size=1, + path_ind=-1, ) -> Dict[str, Any]: """ Create the plotly mesh3d parameters for Sensor pixels based on pixel positions and chosen size @@ -540,7 +546,7 @@ def make_Pixels( # pylint: disable=import-outside-toplevel from magpylib._src.fields.field_wrap_BH import getBH_level2 - BH_array = getBH_level2( + field_array = getBH_level2( sources, [sensor], sumup=True, @@ -551,10 +557,13 @@ def make_Pixels( in_out="auto", ) # select first source (for sumup=True there is only one) and path index + reshape pixel - BH_array = BH_array[0][path_ind].reshape(-1, 3) - orientations = get_orientation_from_vec(BH_array) - pixels = [ - make_BasePyramid( + field_array = field_array[0][path_ind].reshape(-1, 3) + orientations = get_orientation_from_vec(field_array) + field_mag = np.linalg.norm(field_array, axis=1) + hex_colors = get_hexcolors_from_scale(field_mag) + pixels = [] + for p, o, c in zip(positions, orientations, hex_colors): + pix = make_BasePyramid( "plotly-dict", position=p, orientation=o, @@ -562,8 +571,8 @@ def make_Pixels( diameter=size, height=size * 2, ) - for p, o in zip(positions, orientations) - ] + pix["facecolor"] = np.repeat(c, len(pix["i"])) + pixels.append(pix) return merge_mesh3d(*pixels) @@ -578,6 +587,7 @@ def make_Sensor(obj, *, autosize, sources, path_ind, **kwargs) -> Dict[str, Any] distance between any pixel of the same sensor, equal to `size_pixel`. """ style = obj.style + show_hull = True dimension = getattr(obj, "dimension", style.size) pixel = obj.pixel no_pix = pixel is None @@ -631,14 +641,16 @@ def make_Sensor(obj, *, autosize, sources, path_ind, **kwargs) -> Dict[str, Any] size=pixel_dim, path_ind=path_ind, ) - pixels_mesh["facecolor"] = np.repeat(pixel_color, len(pixels_mesh["i"])) + if pixels_mesh.get("facecolor", None) is None: + pixels_mesh["facecolor"] = np.repeat(pixel_color, len(pixels_mesh["i"])) meshes_to_merge.append(pixels_mesh) - hull_pos = 0.5 * (pixel.max(axis=0) + pixel.min(axis=0)) - hull_dim[hull_dim == 0] = pixel_dim / 2 - hull_mesh = make_BaseCuboid( - "plotly-dict", position=hull_pos, dimension=hull_dim - ) - hull_mesh["facecolor"] = np.repeat(style.color, len(hull_mesh["i"])) - meshes_to_merge.append(hull_mesh) + if show_hull: + hull_pos = 0.5 * (pixel.max(axis=0) + pixel.min(axis=0)) + hull_dim[hull_dim == 0] = pixel_dim / 2 + hull_mesh = make_BaseCuboid( + "plotly-dict", position=hull_pos, dimension=hull_dim + ) + hull_mesh["facecolor"] = np.repeat(style.color, len(hull_mesh["i"])) + meshes_to_merge.append(hull_mesh) trace = merge_mesh3d(*meshes_to_merge) return {**trace, **kwargs} diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index f9167710b..13d1bb03a 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -7,6 +7,8 @@ from typing import Tuple import numpy as np +from matplotlib.colors import rgb2hex +from plotly.colors import sample_colorscale from scipy.spatial.transform import Rotation as RotScipy from magpylib._src.defaults.defaults_classes import default_settings @@ -829,3 +831,20 @@ def create_null_dim_trace(color=None, **kwargs): if color is not None: trace["marker_color"] = color return {**trace, **kwargs} + + +def get_hexcolors_from_scale(values, colorscale="Rainbow", nan_color="#b2beb5"): + """Convert numerical values to hexadecimal colors based on a color scale. + Invalid value in the array a converted to the specified `nan_color`.""" + values = np.array(values) + nan_mask = np.isnan(values) + valid = values[~nan_mask] + min_, max_ = np.min(valid), np.max(valid) + ptp = (max_ - min_) if max_ != min_ else 1 + values = (values - min_) / ptp + rgb_colors = sample_colorscale(colorscale, values[~nan_mask], colortype=None) + hex_colors = [rgb2hex(rgb) for rgb in rgb_colors] + out = np.array([""] * len(values), dtype=" Date: Sat, 8 Jun 2024 10:52:38 +0200 Subject: [PATCH 037/211] fix collection subobj not being displayed --- magpylib/_src/display/traces_utility.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index 41dd00e32..4c71d6405 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -267,9 +267,11 @@ def get_objects_props_by_row_col(*objs, colorsequence, **kwargs): for obj in objs: rc_params = {k: v for k, v in obj.items() if k != "objects"} for subobj in obj["objects"]: - if subobj not in rc_params_by_obj: - rc_params_by_obj[subobj] = [] - rc_params_by_obj[subobj].append(rc_params) + children = getattr(subobj, "children_all", [subobj]) + for child in children: + if child not in rc_params_by_obj: + rc_params_by_obj[child] = [] + rc_params_by_obj[child].append(rc_params) flat_sub_objs = get_flatten_objects_properties_recursive( *rc_params_by_obj, colorsequence=colorsequence, **kwargs ) From d61a7333a6ac60a061c17b430025843bbcb6e8ec Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sat, 8 Jun 2024 11:08:55 +0200 Subject: [PATCH 038/211] fix collection precedence in show --- magpylib/_src/display/traces_utility.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index 4c71d6405..f5b426d6c 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -264,6 +264,7 @@ def get_objects_props_by_row_col(*objs, colorsequence, **kwargs): Properties include: row_cols, style, legendgroup, legendtext""" flat_objs_rc = {} rc_params_by_obj = {} + obj_list_semi_flat = [o for obj in objs for o in obj["objects"]] for obj in objs: rc_params = {k: v for k, v in obj.items() if k != "objects"} for subobj in obj["objects"]: @@ -273,7 +274,7 @@ def get_objects_props_by_row_col(*objs, colorsequence, **kwargs): rc_params_by_obj[child] = [] rc_params_by_obj[child].append(rc_params) flat_sub_objs = get_flatten_objects_properties_recursive( - *rc_params_by_obj, colorsequence=colorsequence, **kwargs + *obj_list_semi_flat, colorsequence=colorsequence, **kwargs ) for obj, rc_params_list in rc_params_by_obj.items(): for rc_params in rc_params_list: From 298eb66c8e186c838892b052a6d67396935278b1 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Mon, 10 Jun 2024 12:03:14 +0200 Subject: [PATCH 039/211] fix colorsquence on same obj in different subplot --- magpylib/_src/display/traces_utility.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index f5b426d6c..a54229bc3 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -300,7 +300,7 @@ def get_flatten_objects_properties_recursive( if color_cycle is None: color_cycle = cycle(colorsequence) flat_objs = {} - for subobj in obj_list_semi_flat: + for subobj in dict.fromkeys(obj_list_semi_flat): isCollection = getattr(subobj, "children", None) is not None style = get_style(subobj, default_settings, **kwargs) if style.label is None: @@ -322,18 +322,17 @@ def get_flatten_objects_properties_recursive( "showlegend": parent_showlegend, } if isCollection: - flat_objs.update( - get_flatten_objects_properties_recursive( - *subobj.children, - colorsequence=colorsequence, - color_cycle=color_cycle, - parent_legendgroup=legendgroup, - parent_color=style.color, - parent_label=label, - parent_showlegend=style.legend.show, - **kwargs, - ) + new_ojbs = get_flatten_objects_properties_recursive( + *subobj.children, + colorsequence=colorsequence, + color_cycle=color_cycle, + parent_legendgroup=legendgroup, + parent_color=style.color, + parent_label=label, + parent_showlegend=style.legend.show, + **kwargs, ) + flat_objs = {**new_ojbs, **flat_objs} return flat_objs From 350ccdacce9e31e3383e3c2e88b9cf1cb6544a22 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Mon, 10 Jun 2024 12:03:28 +0200 Subject: [PATCH 040/211] add color precedence tests --- tests/test_display_plotly.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/test_display_plotly.py b/tests/test_display_plotly.py index a684e8b35..a120e40b6 100644 --- a/tests/test_display_plotly.py +++ b/tests/test_display_plotly.py @@ -396,6 +396,32 @@ def test_legends(): assert [t.showlegend for t in fig.data] == [False] +def test_color_precedence(): + """Test if color precedence is respected when calling in nested collections""" + c1 = magpy.magnet.Cuboid(polarization=(0, 0, 1), dimension=(1, 1, 1)) + c2 = c1.copy(position=(1, 0, 0)) + c3 = c1.copy(position=(2, 0, 0)) + coll = magpy.Collection(c1, magpy.Collection(c2, c3)) + kw = dict( + backend="plotly", + style_magnetization_show=False, + colorsequence=["red", "blue", "green"], + return_fig=True, + ) + fig = magpy.show(coll, **kw) + assert [tr["color"] for tr in fig.data] == ["red"] + + fig = magpy.show(*coll, **kw) + assert [tr["color"] for tr in fig.data] == ["red", "blue"] + + fig = magpy.show(*coll.sources_all, **kw) + assert [tr["color"] for tr in fig.data] == ["red", "blue", "green"] + + fig = magpy.show({"objects": c1, "col": 1}, {"objects": c1, "col": 2}, **kw) + # sane obj in different subplot should have same color + assert [tr["color"] for tr in fig.data] == ["red", "red"] + + def test_units_length(): """test units lenghts""" From 6bc14bc77613d0589b0644114232e231ce216c36 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Mon, 10 Jun 2024 12:05:41 +0200 Subject: [PATCH 041/211] set units_length default to "auto" --- magpylib/_src/display/traces_utility.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index a54229bc3..a59322b25 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -24,7 +24,7 @@ "pixel_agg": "mean", "in_out": "auto", "zoom": 0, - "units_length": "m", + "units_length": "auto", } From d2ab5b8310933d0fca8e2c741bc99c0f7f99fea7 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Mon, 10 Jun 2024 13:26:51 +0200 Subject: [PATCH 042/211] fix line color matching 2D vs 3D --- magpylib/_src/display/traces_generic.py | 24 ++++++------ magpylib/_src/utility.py | 17 +++++++++ tests/test_display_plotly.py | 51 ++++++++++++++++++++++--- 3 files changed, 74 insertions(+), 18 deletions(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index 7d0b4fe85..cd861f33e 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -33,6 +33,7 @@ from magpylib._src.style import DefaultMarkers from magpylib._src.utility import format_obj_input from magpylib._src.utility import get_unit_factor +from magpylib._src.utility import style_temp_edit from magpylib._src.utility import unit_prefix @@ -260,6 +261,7 @@ def get_traces_2D( pixel_agg=None, in_out="auto", style_path_frames=None, + styles=None, # pylint: disable=unused-argument units_length="m", zoom=0, @@ -326,7 +328,8 @@ def get_obj_list_str(objs): return obj_lst_str def get_label_and_color(obj): - style = obj.style + style = styles.get(obj, None) + style = obj.style if style is None else style label = get_legend_label(obj, style=style) color = getattr(style, "color", None) return label, color @@ -785,9 +788,15 @@ def draw_frame(objs, *, colorsequence, rc_params, **kwargs) -> Tuple: traces = group_traces(*[t for tr in traces_dict.values() for t in tr]) obj_list_2d = [o for o in objs if o["output"] != "model3d"] + styles = { + obj: params.get("style", None) + for o_rc in objs_props_by_row_col.values() + for obj, params in o_rc["objects"].items() + } for objs_2d in obj_list_2d: traces2d = get_traces_2D( **objs_2d, + styles=styles, style_path_frames=style_path_frames, ) traces.extend(traces2d) @@ -800,25 +809,18 @@ def draw_frame(objs, *, colorsequence, rc_params, **kwargs) -> Tuple: def get_traces_3D(flat_objs_props, extra_backend=False, autosize=None, **kwargs): """Return traces, traces to resize and extra_backend_traces""" - # pylint: disable=protected-access extra_backend_traces = [] traces_dict = {} for obj, params in flat_objs_props.items(): if autosize is None and getattr(obj, "_autosize", False): # temporary coordinates to be able to calculate ranges + # pylint: disable=protected-access x, y, z = obj._position.T traces_dict[obj] = [{"x": x, "y": y, "z": z, "_autosize": True}] else: params = {**params, **kwargs} traces_dict[obj] = [] - orig_style = getattr(obj, "_style", None) - try: - style_temp = params.pop("style", None) - # temporary replace style attribute - obj._style = style_temp - if style_temp: - # deepcopy style only if obj is in multiple subplots. - obj._style = style_temp.copy() + with style_temp_edit(obj, style_temp=params.pop("style", None), copy=True): out_traces = get_generic_traces3D( obj, extra_backend=extra_backend, @@ -828,8 +830,6 @@ def get_traces_3D(flat_objs_props, extra_backend=False, autosize=None, **kwargs) if extra_backend: extra_backend_traces.extend(out_traces.get(extra_backend, [])) traces_dict[obj].extend(out_traces["generic"]) - finally: - obj._style = orig_style return traces_dict, extra_backend_traces diff --git a/magpylib/_src/utility.py b/magpylib/_src/utility.py index 0fda4f2ee..89a24fcff 100644 --- a/magpylib/_src/utility.py +++ b/magpylib/_src/utility.py @@ -3,6 +3,7 @@ # pylint: disable=import-outside-toplevel # pylint: disable=cyclic-import # import numbers +from contextlib import contextmanager from functools import lru_cache from inspect import signature from math import log10 @@ -493,3 +494,19 @@ def merge_dicts_with_conflict_check(objs, *, target, identifiers, unique_fields) dict.fromkeys([*merged_dict[key][target], *obj[target]]) ) return merged_dict + + +@contextmanager +def style_temp_edit(obj, style_temp, copy=True): + """Temporary replace style to allow edits before returning to original state""" + # pylint: disable=protected-access + orig_style = getattr(obj, "_style", None) + try: + # temporary replace style attribute + obj._style = style_temp + if style_temp and copy: + # deepcopy style only if obj is in multiple subplots. + obj._style = style_temp.copy() + yield + finally: + obj._style = orig_style diff --git a/tests/test_display_plotly.py b/tests/test_display_plotly.py index a120e40b6..60a4d682a 100644 --- a/tests/test_display_plotly.py +++ b/tests/test_display_plotly.py @@ -402,12 +402,12 @@ def test_color_precedence(): c2 = c1.copy(position=(1, 0, 0)) c3 = c1.copy(position=(2, 0, 0)) coll = magpy.Collection(c1, magpy.Collection(c2, c3)) - kw = dict( - backend="plotly", - style_magnetization_show=False, - colorsequence=["red", "blue", "green"], - return_fig=True, - ) + kw = { + "backend": "plotly", + "style_magnetization_show": False, + "colorsequence": ["red", "blue", "green"], + "return_fig": True, + } fig = magpy.show(coll, **kw) assert [tr["color"] for tr in fig.data] == ["red"] @@ -422,6 +422,45 @@ def test_color_precedence(): assert [tr["color"] for tr in fig.data] == ["red", "red"] +def test_colors_output2d(): + """Tests if lines have objects corresponding colors in ouptut=Bx, By...""" + l1 = magpy.current.Circle( + current=1, + diameter=1, + style_label="L1", + style_arrow_show=False, + ) + l2 = l1.copy(diameter=2) + s1 = magpy.Sensor( + pixel=[[0, 0, 0], [0, 1, 0]], + position=np.linspace((-1, 0, 1), (1, 0, 1), 10), + style_label="S", + style_model3d_showdefault=False, + ) + s2 = s1.copy().move((0, 0, 1)) + objs = {"objects": [l1, l2, s1, s2]} + kw = { + "return_fig": True, + "colorsequence": ["red", "blue", "green", "cyan"], + } + kw2d = {"output": "Bx", "col": 2} + + def get_scatters2d(fig): + return [t.line.color for t in fig.data if t.type == "scatter"] + + fig = magpy.show(objs, {**objs, **kw2d, "sumup": True}, **kw) + assert get_scatters2d(fig) == ["green", "cyan"] + + fig = magpy.show(objs, {**objs, **kw2d, "sumup": True, "pixel_agg": None}, **kw) + assert get_scatters2d(fig) == [*["green"] * 2, *["cyan"] * 2] + + fig = magpy.show(objs, {**objs, **kw2d, "sumup": False}, **kw) + assert get_scatters2d(fig) == [*["red"] * 2, *["blue"] * 2] + + fig = magpy.show(objs, {**objs, **kw2d, "sumup": False, "pixel_agg": None}, **kw) + assert get_scatters2d(fig) == [*["red"] * 4, *["blue"] * 4] + + def test_units_length(): """test units lenghts""" From 4bbb11e742233f6567d23fab59c0360ebdc56189 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Mon, 10 Jun 2024 17:43:50 +0200 Subject: [PATCH 043/211] refactor --- magpylib/_src/display/traces_generic.py | 145 ++++++++++++------------ 1 file changed, 71 insertions(+), 74 deletions(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index cd861f33e..23bf911cf 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -252,8 +252,7 @@ def get_trace2D_dict( def get_traces_2D( - *, - objects, + *objects, output=("Bx", "By", "Bz"), row=None, col=None, @@ -727,6 +726,32 @@ def extract_animation_properties( return path_indices, exp, frame_duration +def get_traces_3D(flat_objs_props, extra_backend=False, autosize=None, **kwargs): + """Return traces, traces to resize and extra_backend_traces""" + extra_backend_traces = [] + traces_dict = {} + for obj, params in flat_objs_props.items(): + if autosize is None and getattr(obj, "_autosize", False): + # temporary coordinates to be able to calculate ranges + # pylint: disable=protected-access + x, y, z = obj._position.T + traces_dict[obj] = [{"x": x, "y": y, "z": z, "_autosize": True}] + else: + params = {**params, **kwargs} + traces_dict[obj] = [] + with style_temp_edit(obj, style_temp=params.pop("style", None), copy=True): + out_traces = get_generic_traces3D( + obj, + extra_backend=extra_backend, + autosize=autosize, + **params, + ) + if extra_backend: + extra_backend_traces.extend(out_traces.get(extra_backend, [])) + traces_dict[obj].extend(out_traces["generic"]) + return traces_dict, extra_backend_traces + + def draw_frame(objs, *, colorsequence, rc_params, **kwargs) -> Tuple: """ Creates traces from input `objs` and provided parameters, updates the size of objects like @@ -746,91 +771,63 @@ def draw_frame(objs, *, colorsequence, rc_params, **kwargs) -> Tuple: style_path_frames = kwargs.get( "style_path_frames", [-1] ) # get before next func strips style - objs_props_by_row_col, kwargs = get_objects_props_by_row_col( + objs_rc, kwargs = get_objects_props_by_row_col( *objs, colorsequence=colorsequence, **kwargs ) traces_dict = {} extra_backend_traces = [] rc_params = {} if rc_params is None else rc_params - for rc, objs_props in objs_props_by_row_col.items(): - if objs_props["rc_params"]["output"] != "model3d": - continue - rc_params[rc] = rc_params.get(rc, {}) - rc_params[rc]["units_length"] = objs_props["rc_params"]["units_length"] - rc_keys = ("row", "col") - rc_kwargs = {k: v for k, v in objs_props["rc_params"].items() if k in rc_keys} - traces_dict_1, extra_backend_traces_1 = get_traces_3D( - objs_props["objects"], **rc_kwargs, **kwargs - ) - rc_params[rc]["autosize"] = rc_params.get(rc, {}).get("autosize", None) - if rc_params[rc]["autosize"] is None: - rc_params[rc]["zoom"] = objs_props["rc_params"]["zoom"] - traces = [t for tr in traces_dict_1.values() for t in tr] - ranges_rc = get_scene_ranges( - *traces, *extra_backend_traces_1, zoom=rc_params[rc]["zoom"] + for rc, props in objs_rc.items(): + if props["rc_params"]["output"] == "model3d": + rc_params[rc] = rc_params.get(rc, {}) + rc_params[rc]["units_length"] = props["rc_params"]["units_length"] + rc_keys = ("row", "col") + rc_kwargs = {k: v for k, v in props["rc_params"].items() if k in rc_keys} + traces_d1, traces_ex1 = get_traces_3D( + props["objects"], **rc_kwargs, **kwargs ) - # pylint: disable=no-member - autosizefactor = default_settings.display.autosizefactor - rc_params[rc]["autosize"] = np.mean(np.diff(ranges_rc[rc])) / autosizefactor - to_resize_keys = { - k for k, v in traces_dict_1.items() if v and "_autosize" in v[0] - } - flat_objs_props = { - k: v for k, v in objs_props["objects"].items() if k in to_resize_keys - } - traces_dict_2, extra_backend_traces_2 = get_traces_3D( - flat_objs_props, autosize=rc_params[rc]["autosize"], **rc_kwargs, **kwargs - ) - traces_dict.update( - {(k, *rc): v for k, v in {**traces_dict_1, **traces_dict_2}.items()} - ) - extra_backend_traces.extend([*extra_backend_traces_1, *extra_backend_traces_2]) + rc_params[rc]["autosize"] = rc_params.get(rc, {}).get("autosize", None) + if rc_params[rc]["autosize"] is None: + zoom = rc_params[rc]["zoom"] = props["rc_params"]["zoom"] + traces = [t for tr in traces_d1.values() for t in tr] + ranges_rc = get_scene_ranges(*traces, *traces_ex1, zoom=zoom) + # pylint: disable=no-member + factor = default_settings.display.autosizefactor + rc_params[rc]["autosize"] = np.mean(np.diff(ranges_rc[rc])) / factor + to_resize_keys = { + k for k, v in traces_d1.items() if v and "_autosize" in v[0] + } + flat_objs_props = { + k: v for k, v in props["objects"].items() if k in to_resize_keys + } + traces_d2, traces_ex2 = get_traces_3D( + flat_objs_props, + autosize=rc_params[rc]["autosize"], + **rc_kwargs, + **kwargs, + ) + traces_dict.update( + {(k, *rc): v for k, v in {**traces_d1, **traces_d2}.items()} + ) + extra_backend_traces.extend([*traces_ex1, *traces_ex2]) traces = group_traces(*[t for tr in traces_dict.values() for t in tr]) - obj_list_2d = [o for o in objs if o["output"] != "model3d"] styles = { obj: params.get("style", None) - for o_rc in objs_props_by_row_col.values() + for o_rc in objs_rc.values() for obj, params in o_rc["objects"].items() } - for objs_2d in obj_list_2d: - traces2d = get_traces_2D( - **objs_2d, - styles=styles, - style_path_frames=style_path_frames, - ) - traces.extend(traces2d) - return ( - traces, - extra_backend_traces, - rc_params, - ) - -def get_traces_3D(flat_objs_props, extra_backend=False, autosize=None, **kwargs): - """Return traces, traces to resize and extra_backend_traces""" - extra_backend_traces = [] - traces_dict = {} - for obj, params in flat_objs_props.items(): - if autosize is None and getattr(obj, "_autosize", False): - # temporary coordinates to be able to calculate ranges - # pylint: disable=protected-access - x, y, z = obj._position.T - traces_dict[obj] = [{"x": x, "y": y, "z": z, "_autosize": True}] - else: - params = {**params, **kwargs} - traces_dict[obj] = [] - with style_temp_edit(obj, style_temp=params.pop("style", None), copy=True): - out_traces = get_generic_traces3D( - obj, - extra_backend=extra_backend, - autosize=autosize, - **params, - ) - if extra_backend: - extra_backend_traces.extend(out_traces.get(extra_backend, [])) - traces_dict[obj].extend(out_traces["generic"]) - return traces_dict, extra_backend_traces + for props in objs_rc.values(): + if props["rc_params"]["output"] != "model3d": + traces2d = get_traces_2D( + *props["objects"], + **props["rc_params"], + styles=styles, + style_path_frames=style_path_frames, + ) + traces.extend(traces2d) + return traces, extra_backend_traces, rc_params def get_frames( From db3810c6dcb601444755114637446ba2d662f30e Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Mon, 10 Jun 2024 23:18:54 +0200 Subject: [PATCH 044/211] refactor --- magpylib/_src/display/display.py | 18 +++++++--- magpylib/_src/display/traces_generic.py | 46 ++++++++++++++----------- magpylib/_src/display/traces_utility.py | 16 +++++---- 3 files changed, 48 insertions(+), 32 deletions(-) diff --git a/magpylib/_src/display/display.py b/magpylib/_src/display/display.py index 019ae0222..09133a152 100644 --- a/magpylib/_src/display/display.py +++ b/magpylib/_src/display/display.py @@ -12,13 +12,14 @@ from magpylib._src.display.traces_generic import MagpyMarkers from magpylib._src.display.traces_generic import get_frames from magpylib._src.display.traces_utility import DEFAULT_ROW_COL_PARAMS +from magpylib._src.display.traces_utility import linearize_dict from magpylib._src.display.traces_utility import process_show_input_objs from magpylib._src.input_checks import check_format_input_backend from magpylib._src.input_checks import check_format_input_vector from magpylib._src.input_checks import check_input_animation from magpylib._src.utility import check_path_format -disp_args = get_defaults_dict("display").keys() +disp_args = set(get_defaults_dict("display")) class RegisteredBackend: @@ -82,12 +83,18 @@ def show( f"\nFalling back to: {params}" ) kwargs.update(params) - frame_kwargs = { + display_kwargs = { k: v for k, v in kwargs.items() - if any(k.startswith(arg) for arg in disp_args) + if any(k.startswith(arg) for arg in disp_args - {"style"}) + } + style_kwargs = {k: v for k, v in kwargs.items() if k.startswith("style")} + style_kwargs = linearize_dict(style_kwargs, separator="_") + kwargs = { + k: v + for k, v in kwargs.items() + if (k not in display_kwargs and k not in style_kwargs) } - kwargs = {k: v for k, v in kwargs.items() if k not in frame_kwargs} backend_kwargs = { k[len(backend) + 1 :]: v for k, v in kwargs.items() @@ -117,7 +124,8 @@ def show( supports_colorgradient=self.supports["colorgradient"], backend=backend, title=title, - **frame_kwargs, + style_kwargs=style_kwargs, + **display_kwargs, ) return self.show_func_getter()( data, diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index 23bf911cf..0a515435e 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -206,7 +206,7 @@ def get_trace2D_dict( field_str, coords_str, obj_lst_str, - frame_focus_inds, + focus_inds, frames_indices, mode, label_suff, @@ -223,7 +223,7 @@ def get_trace2D_dict( else: y = np.linalg.norm(y, axis=0) marker_size = np.array([2] * len(frames_indices)) - marker_size[frame_focus_inds] = 15 + marker_size[focus_inds] = 15 title = f"{field_str}{''.join(coords_str)}" trace = { "mode": "lines+markers", @@ -259,7 +259,6 @@ def get_traces_2D( sumup=True, pixel_agg=None, in_out="auto", - style_path_frames=None, styles=None, # pylint: disable=unused-argument units_length="m", @@ -311,12 +310,20 @@ def get_traces_2D( in_out=in_out, ) BH_array = BH_array.swapaxes(1, 2) # swap axes to have sensors first, path second - frames_indices = np.arange(0, BH_array.shape[2]) - frame_focus_inds = [-1] if style_path_frames is None else style_path_frames - if isinstance(frame_focus_inds, numbers.Number): - # pylint: disable=invalid-unary-operand-type - frame_focus_inds = frames_indices[::-style_path_frames] + + def get_focus_inds(*objs): + focus_inds = [] + for obj in objs: + style = styles.get(obj, obj.style) + frames = style.path.frames + inds = [] if frames is None else frames + if isinstance(inds, numbers.Number): + # pylint: disable=invalid-unary-operand-type + inds = frames_indices[::-frames] + focus_inds.extend(inds) + focus_inds = list(dict.fromkeys(focus_inds)) + return focus_inds if focus_inds else [-1] def get_obj_list_str(objs): if len(objs) < 8: @@ -346,9 +353,10 @@ def get_label_and_color(obj): label_src, color_src = get_label_and_color(src) symbols = cycle(ALLOWED_SYMBOLS[:6]) for sens_ind, sens in enumerate(sensors): + focus_inds = get_focus_inds(src, sens) label_sens, color_sens = get_label_and_color(sens) label_suff = label_sens - if mode == "sensors": + if not sumup: label, color = label_src, color_src else: label_suff = ( @@ -378,7 +386,7 @@ def get_label_and_color(obj): BH, **param, obj_lst_str=obj_lst_str, - frame_focus_inds=frame_focus_inds, + focus_inds=focus_inds, frames_indices=frames_indices, mode=mode, label_suff=label_suff, @@ -752,7 +760,7 @@ def get_traces_3D(flat_objs_props, extra_backend=False, autosize=None, **kwargs) return traces_dict, extra_backend_traces -def draw_frame(objs, *, colorsequence, rc_params, **kwargs) -> Tuple: +def draw_frame(objs, *, colorsequence, rc_params, style_kwargs, **kwargs) -> Tuple: """ Creates traces from input `objs` and provided parameters, updates the size of objects like Sensors and Dipoles in `kwargs` depending on the canvas size. @@ -767,12 +775,10 @@ def draw_frame(objs, *, colorsequence, rc_params, **kwargs) -> Tuple: colorsequence = default_settings.display.colorsequence # dipoles and sensors use autosize, the trace building has to be put at the back of the queue. # autosize is calculated from the other traces overall scene range - - style_path_frames = kwargs.get( - "style_path_frames", [-1] - ) # get before next func strips style - objs_rc, kwargs = get_objects_props_by_row_col( - *objs, colorsequence=colorsequence, **kwargs + objs_rc = get_objects_props_by_row_col( + *objs, + colorsequence=colorsequence, + style_kwargs=style_kwargs, ) traces_dict = {} extra_backend_traces = [] @@ -817,14 +823,12 @@ def draw_frame(objs, *, colorsequence, rc_params, **kwargs) -> Tuple: for o_rc in objs_rc.values() for obj, params in o_rc["objects"].items() } - for props in objs_rc.values(): if props["rc_params"]["output"] != "model3d": traces2d = get_traces_2D( *props["objects"], **props["rc_params"], styles=styles, - style_path_frames=style_path_frames, ) traces.extend(traces2d) return traces, extra_backend_traces, rc_params @@ -837,6 +841,7 @@ def get_frames( animation=False, supports_colorgradient=True, backend="generic", + style_kwargs=None, **kwargs, ): """This is a helper function which generates frames with generic traces to be provided to @@ -872,7 +877,7 @@ def get_frames( for i, ind in enumerate(path_indices): extra_backend_traces = [] if animation: - kwargs["style_path_frames"] = [ind] + style_kwargs["style_path_frames"] = [ind] title = "Animation 3D - " if title is None else title title_str = f"""{title}path index: {ind+1:0{exp}d}""" traces, extra_backend_traces, rc_params_temp = draw_frame( @@ -881,6 +886,7 @@ def get_frames( rc_params=rc_params, supports_colorgradient=supports_colorgradient, extra_backend=backend, + style_kwargs=style_kwargs, **kwargs, ) if i == 0: # get the dipoles and sensors autosize from first frame diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index a59322b25..429f6bb06 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -259,7 +259,7 @@ def get_rot_pos_from_path(obj, show_path=None): return rots, poss, inds -def get_objects_props_by_row_col(*objs, colorsequence, **kwargs): +def get_objects_props_by_row_col(*objs, colorsequence, style_kwargs): """Return flat dict with objs as keys object properties as values. Properties include: row_cols, style, legendgroup, legendtext""" flat_objs_rc = {} @@ -274,7 +274,9 @@ def get_objects_props_by_row_col(*objs, colorsequence, **kwargs): rc_params_by_obj[child] = [] rc_params_by_obj[child].append(rc_params) flat_sub_objs = get_flatten_objects_properties_recursive( - *obj_list_semi_flat, colorsequence=colorsequence, **kwargs + *obj_list_semi_flat, + style_kwargs=style_kwargs, + colorsequence=colorsequence, ) for obj, rc_params_list in rc_params_by_obj.items(): for rc_params in rc_params_list: @@ -282,19 +284,18 @@ def get_objects_props_by_row_col(*objs, colorsequence, **kwargs): if rc not in flat_objs_rc: flat_objs_rc[rc] = {"objects": {}, "rc_params": rc_params} flat_objs_rc[rc]["objects"][obj] = flat_sub_objs[obj] - kwargs = {k: v for k, v in kwargs.items() if not k.startswith("style")} - return flat_objs_rc, kwargs + return flat_objs_rc def get_flatten_objects_properties_recursive( *obj_list_semi_flat, + style_kwargs=None, colorsequence=None, color_cycle=None, parent_legendgroup=None, parent_color=None, parent_label=None, parent_showlegend=None, - **kwargs, ): """returns a flat dict -> (obj: display_props, ...) from nested collections""" if color_cycle is None: @@ -302,7 +303,8 @@ def get_flatten_objects_properties_recursive( flat_objs = {} for subobj in dict.fromkeys(obj_list_semi_flat): isCollection = getattr(subobj, "children", None) is not None - style = get_style(subobj, default_settings, **kwargs) + style_kwargs = {} if style_kwargs is None else style_kwargs + style = get_style(subobj, default_settings, **style_kwargs) if style.label is None: style.label = str(type(subobj).__name__) legendgroup = f"{subobj}" if parent_legendgroup is None else parent_legendgroup @@ -330,7 +332,7 @@ def get_flatten_objects_properties_recursive( parent_color=style.color, parent_label=label, parent_showlegend=style.legend.show, - **kwargs, + style_kwargs=style_kwargs, ) flat_objs = {**new_ojbs, **flat_objs} return flat_objs From 22b40ce822ddbda7d395c8f59386feaa8dcaa93a Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 11 Jun 2024 10:08:32 +0200 Subject: [PATCH 045/211] add special case marker color to 2d traces --- magpylib/_src/display/traces_generic.py | 37 ++++++++++++------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index 0a515435e..5c50558bb 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -210,9 +210,6 @@ def get_trace2D_dict( frames_indices, mode, label_suff, - color, - symbol, - linestyle, **kwargs, ): """return a 2d trace based on field and parameters""" @@ -222,7 +219,7 @@ def get_trace2D_dict( y = y[0] else: y = np.linalg.norm(y, axis=0) - marker_size = np.array([2] * len(frames_indices)) + marker_size = np.array([3] * len(frames_indices)) marker_size[focus_inds] = 15 title = f"{field_str}{''.join(coords_str)}" trace = { @@ -239,15 +236,11 @@ def get_trace2D_dict( ), "x": frames_indices, "y": y[frames_indices], - "line_dash": linestyle, - "line_color": color, "marker_size": marker_size, - "marker_color": color, - "marker_symbol": symbol, "showlegend": True, "legendgroup": f"{title}{label_suff}", - **kwargs, } + trace.update(kwargs) return trace @@ -291,13 +284,13 @@ def get_traces_2D( if field_str not in "BHMJ" and set(coords_str).difference(set("xyz")): raise ValueError( "The `output` parameter must start with 'B', 'H', 'M', 'J' " - "and be followed by a combination of 'x', 'y', 'z' (e.g. 'Bxy' or ('Bxy', 'Hz') )" + "and be followed by a combination of 'x', 'y', 'z' (e.g. 'Bxy' or ('Bxy', 'Bz') )" f"\nreceived {out!r} instead" ) output_params[out] = { "field_str": field_str, "coords_str": coords_str, - "linestyle": linestyle, + "line_dash": linestyle, } BH_array = getBH_level2( sources, @@ -356,13 +349,15 @@ def get_label_and_color(obj): focus_inds = get_focus_inds(src, sens) label_sens, color_sens = get_label_and_color(sens) label_suff = label_sens - if not sumup: - label, color = label_src, color_src - else: + label = label_src + line_color = color_src + marker_color = color_sens if len(sensors) > 1 else None + if sumup: + line_color = color_sens + label = label_sens label_suff = ( f"{label_src}" if len(sources) == 1 else f"{len(sources)} sources" ) - label, color = label_sens, color_sens num_of_pix = ( len(sens.pixel.reshape(-1, 3)) if (not isinstance(sens, magpy.Collection)) @@ -373,13 +368,13 @@ def get_label_and_color(obj): pix_suff = "" num_of_pix_to_show = 1 if pixel_agg else num_of_pix for pix_ind in range(num_of_pix_to_show): - symbol = next(symbols) + marker_symbol = next(symbols) BH = BH_array[src_ind, sens_ind, :, pix_ind] if num_of_pix > 1: if pixel_agg: - pix_suff = f" ({num_of_pix} pixels {pixel_agg})" + pix_suff = f" - {num_of_pix} pixels {pixel_agg}" else: - pix_suff = f" (pixel {pix_ind})" + pix_suff = f" - pixel {pix_ind}" for param in output_params.values(): traces.append( get_trace2D_dict( @@ -391,8 +386,10 @@ def get_label_and_color(obj): mode=mode, label_suff=label_suff, name=f"{label}{pix_suff}", - color=color, - symbol=symbol, + line_color=line_color, + marker_color=marker_color, + marker_line_color=marker_color, + marker_symbol=marker_symbol, type="scatter", row=row, col=col, From 957ba913a2ac2125fcac20ffe92ea043a558f525 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 11 Jun 2024 10:28:25 +0200 Subject: [PATCH 046/211] refactor show_func --- magpylib/_src/display/display.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/magpylib/_src/display/display.py b/magpylib/_src/display/display.py index 09133a152..5a5468f2d 100644 --- a/magpylib/_src/display/display.py +++ b/magpylib/_src/display/display.py @@ -31,14 +31,14 @@ def __init__( self, *, name, - show_func_getter, + show_func, supports_animation, supports_subplots, supports_colorgradient, supports_animation_output, ): self.name = name - self.show_func_getter = show_func_getter + self.show_func = show_func self.supports = { "animation": supports_animation, "subplots": supports_subplots, @@ -127,7 +127,7 @@ def show( style_kwargs=style_kwargs, **display_kwargs, ) - return self.show_func_getter()( + return self.show_func( data, max_rows=max_rows, max_cols=max_cols, @@ -138,12 +138,12 @@ def show( ) -def get_show_func(backend): +def show_func(backend): """Return the backend show function""" # defer import to show call. Importerror should only fail if unavalaible backend is called - return lambda: getattr( + return lambda *args, backend=backend, **kwargs: getattr( import_module(f"magpylib._src.display.backend_{backend}"), f"display_{backend}" - ) + )(*args, **kwargs) def infer_backend(canvas): @@ -483,7 +483,7 @@ def reset(self, reset_show_return_value=True): RegisteredBackend( name="matplotlib", - show_func_getter=get_show_func("matplotlib"), + show_func=show_func("matplotlib"), supports_animation=True, supports_subplots=True, supports_colorgradient=False, @@ -493,7 +493,7 @@ def reset(self, reset_show_return_value=True): RegisteredBackend( name="plotly", - show_func_getter=get_show_func("plotly"), + show_func=show_func("plotly"), supports_animation=True, supports_subplots=True, supports_colorgradient=True, @@ -502,7 +502,7 @@ def reset(self, reset_show_return_value=True): RegisteredBackend( name="pyvista", - show_func_getter=get_show_func("pyvista"), + show_func=show_func("pyvista"), supports_animation=True, supports_subplots=True, supports_colorgradient=True, From afe7688d7d58671e1297f6c8f279fd6eff4e266c Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 11 Jun 2024 10:56:01 +0200 Subject: [PATCH 047/211] fix different output units in 2d subplots --- magpylib/_src/display/traces_generic.py | 45 +++++++++++++++++-------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index 5c50558bb..fa810f3a8 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -210,6 +210,8 @@ def get_trace2D_dict( frames_indices, mode, label_suff, + units_polarization, + units_magnetization, **kwargs, ): """return a 2d trace based on field and parameters""" @@ -222,6 +224,11 @@ def get_trace2D_dict( marker_size = np.array([3] * len(frames_indices)) marker_size[focus_inds] = 15 title = f"{field_str}{''.join(coords_str)}" + unit = ( + units_polarization + if field_str in "BJ" + else units_magnetization if field_str in "HM" else "" + ) trace = { "mode": "lines+markers", "legendgrouptitle_text": f"{title}" @@ -229,7 +236,7 @@ def get_trace2D_dict( "text": mode, "hovertemplate": ( "Path index: %{x} " - f"{title}: " + "%{y:.3s}T
" + f"{title}: %{{y:.3s}}{unit}
" f"{'sources'}:
{obj_lst_str['sources']}
" f"{'sensors'}:
{obj_lst_str['sensors']}" # "", @@ -253,6 +260,8 @@ def get_traces_2D( pixel_agg=None, in_out="auto", styles=None, + units_polarization="T", + units_magnetization="A/m", # pylint: disable=unused-argument units_length="m", zoom=0, @@ -277,6 +286,7 @@ def get_traces_2D( if not isinstance(output, (list, tuple)): output = [output] output_params = {} + field_str_list = [] for out, linestyle in zip(output, cycle(ALLOWED_LINESTYLES[:6])): field_str, *coords_str = out if not coords_str: @@ -287,23 +297,28 @@ def get_traces_2D( "and be followed by a combination of 'x', 'y', 'z' (e.g. 'Bxy' or ('Bxy', 'Bz') )" f"\nreceived {out!r} instead" ) + field_str_list.append(field_str) output_params[out] = { "field_str": field_str, "coords_str": coords_str, "line_dash": linestyle, } - BH_array = getBH_level2( - sources, - sensors, - sumup=sumup, - squeeze=False, - field=field_str, - pixel_agg=pixel_agg, - output="ndarray", - in_out=in_out, - ) - BH_array = BH_array.swapaxes(1, 2) # swap axes to have sensors first, path second - frames_indices = np.arange(0, BH_array.shape[2]) + field_str_list = list(dict.fromkeys(field_str_list)) + BH_array = {} + for field_str in field_str_list: + BH_array[field_str] = getBH_level2( + sources, + sensors, + sumup=sumup, + squeeze=False, + field=field_str, + pixel_agg=pixel_agg, + output="ndarray", + in_out=in_out, + ) + # swap axes to have sensors first, path second + BH_array[field_str] = BH_array[field_str].swapaxes(1, 2) + frames_indices = np.arange(0, BH_array[field_str_list[0]].shape[2]) def get_focus_inds(*objs): focus_inds = [] @@ -369,13 +384,13 @@ def get_label_and_color(obj): num_of_pix_to_show = 1 if pixel_agg else num_of_pix for pix_ind in range(num_of_pix_to_show): marker_symbol = next(symbols) - BH = BH_array[src_ind, sens_ind, :, pix_ind] if num_of_pix > 1: if pixel_agg: pix_suff = f" - {num_of_pix} pixels {pixel_agg}" else: pix_suff = f" - pixel {pix_ind}" for param in output_params.values(): + BH = BH_array[param["field_str"]][src_ind, sens_ind, :, pix_ind] traces.append( get_trace2D_dict( BH, @@ -393,6 +408,8 @@ def get_label_and_color(obj): type="scatter", row=row, col=col, + units_polarization=units_polarization, + units_magnetization=units_magnetization, ) ) return traces From 584e5605b269dcf894984fdcf52c1ab758e865d6 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 11 Jun 2024 11:00:36 +0200 Subject: [PATCH 048/211] pylint --- magpylib/_src/display/display.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/magpylib/_src/display/display.py b/magpylib/_src/display/display.py index 5a5468f2d..e3f7445d3 100644 --- a/magpylib/_src/display/display.py +++ b/magpylib/_src/display/display.py @@ -138,7 +138,7 @@ def show( ) -def show_func(backend): +def get_show_func(backend): """Return the backend show function""" # defer import to show call. Importerror should only fail if unavalaible backend is called return lambda *args, backend=backend, **kwargs: getattr( @@ -483,7 +483,7 @@ def reset(self, reset_show_return_value=True): RegisteredBackend( name="matplotlib", - show_func=show_func("matplotlib"), + show_func=get_show_func("matplotlib"), supports_animation=True, supports_subplots=True, supports_colorgradient=False, @@ -493,7 +493,7 @@ def reset(self, reset_show_return_value=True): RegisteredBackend( name="plotly", - show_func=show_func("plotly"), + show_func=get_show_func("plotly"), supports_animation=True, supports_subplots=True, supports_colorgradient=True, @@ -502,7 +502,7 @@ def reset(self, reset_show_return_value=True): RegisteredBackend( name="pyvista", - show_func=show_func("pyvista"), + show_func=get_show_func("pyvista"), supports_animation=True, supports_subplots=True, supports_colorgradient=True, From 9040c2acb0287f5949688f2e9c2ad87a352cce25 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 11 Jun 2024 15:12:15 +0200 Subject: [PATCH 049/211] fix extra trace rescaling --- magpylib/_src/display/traces_generic.py | 4 +- magpylib/_src/display/traces_utility.py | 74 ++++++++++++++----------- 2 files changed, 44 insertions(+), 34 deletions(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index fa810f3a8..848442970 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -427,7 +427,7 @@ def process_extra_trace(model): "coordsargs": extr.coordsargs, "kwargs_extra": model["kwargs_extra"], } - kwargs, args = place_and_orient_model3d( + kwargs, args, coordsargs = place_and_orient_model3d( model_kwargs=model_kwargs, model_args=model_args, orientation=model["orientation"], @@ -435,7 +435,9 @@ def process_extra_trace(model): coordsargs=extr.coordsargs, scale=extr.scale, return_model_args=True, + return_coordsargs=True, ) + trace3d["coordsargs"] = coordsargs trace3d["kwargs"].update(kwargs) trace3d["args"] = args return trace3d diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index 429f6bb06..85d87bcc9 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -54,44 +54,48 @@ def place_and_orient_model3d( coordsargs=None, scale=1, return_model_args=False, + return_coordsargs=False, length_factor=1, **kwargs, ): """places and orients mesh3d dict""" if orientation is None and position is None and length_factor == 1: - return {**model_kwargs, **kwargs} - position = (0.0, 0.0, 0.0) if position is None else position - position = np.array(position, dtype=float) - new_model_dict = {} - if model_args is None: - model_args = () - new_model_args = list(model_args) - vertices, coordsargs, useargs = get_vertices_from_model( - model_kwargs, model_args, coordsargs - ) - - # sometimes traces come as (n,m,3) shape - vert_shape = vertices.shape - vertices = np.reshape(vertices, (3, -1)) - - vertices = vertices.T - - if orientation is not None: - vertices = orientation.apply(vertices) - new_vertices = (vertices * scale + position).T * length_factor - new_vertices = np.reshape(new_vertices, vert_shape) - for i, k in enumerate("xyz"): - key = coordsargs[k] - if useargs: - ind = int(key[5]) - new_model_args[ind] = new_vertices[i] - else: - new_model_dict[key] = new_vertices[i] - new_model_kwargs = {**model_kwargs, **new_model_dict, **kwargs} + new_model_kwargs = {**model_kwargs, **kwargs} + new_model_args = model_args + else: + position = (0.0, 0.0, 0.0) if position is None else position + position = np.array(position, dtype=float) + new_model_dict = {} + if model_args is None: + model_args = () + new_model_args = list(model_args) + vertices, coordsargs, useargs = get_vertices_from_model( + model_kwargs, model_args, coordsargs + ) + # sometimes traces come as (n,m,3) shape + vert_shape = vertices.shape + vertices = np.reshape(vertices, (3, -1)) + + vertices = vertices.T + + if orientation is not None: + vertices = orientation.apply(vertices) + new_vertices = (vertices * scale + position).T * length_factor + new_vertices = np.reshape(new_vertices, vert_shape) + for i, k in enumerate("xyz"): + key = coordsargs[k] + if useargs: + ind = int(key[5]) + new_model_args[ind] = new_vertices[i] + else: + new_model_dict[key] = new_vertices[i] + new_model_kwargs = {**model_kwargs, **new_model_dict, **kwargs} out = (new_model_kwargs,) if return_model_args: out += (new_model_args,) + if return_coordsargs: + out += (coordsargs,) return out[0] if len(out) == 1 else out @@ -551,17 +555,21 @@ def get_scene_ranges(*traces, zoom=0) -> np.ndarray: def rescale_traces(traces, factors): """Rescale traces based on scale factors by (row,col) index""" for ind, tr in enumerate(traces): - rc = tr.get("row", 1), tr.get("col", 1) - kw = {} if "constructor" in tr: kwex = tr["kwargs_extra"] rc = kwex["row"], kwex["col"] - kw.update( + kwargs, args = place_and_orient_model3d( + model_kwargs=tr.get("kwargs", None), model_args=tr.get("args", None), coordsargs=tr.get("coordsargs", None), + length_factor=factors[rc], + return_model_args=True, ) + tr["kwargs"].update(kwargs) + tr["args"] = args if "z" in tr: # rescale only 3d traces - traces[ind] = place_and_orient_model3d(tr, length_factor=factors[rc], **kw) + rc = tr.get("row", 1), tr.get("col", 1) + traces[ind] = place_and_orient_model3d(tr, length_factor=factors[rc]) return traces From 8593313c3ab7eecab20437e9ef61323afb013a38 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 11 Jun 2024 16:07:42 +0200 Subject: [PATCH 050/211] fix single to resize trace on different subplots --- magpylib/_src/display/traces_generic.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index 848442970..37b1f1b36 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -755,13 +755,14 @@ def get_traces_3D(flat_objs_props, extra_backend=False, autosize=None, **kwargs) extra_backend_traces = [] traces_dict = {} for obj, params in flat_objs_props.items(): + params = {**params, **kwargs} if autosize is None and getattr(obj, "_autosize", False): # temporary coordinates to be able to calculate ranges # pylint: disable=protected-access x, y, z = obj._position.T - traces_dict[obj] = [{"x": x, "y": y, "z": z, "_autosize": True}] + rc_dict = {k: v for k, v in params.items() if k in ("row", "col")} + traces_dict[obj] = [{"x": x, "y": y, "z": z, "_autosize": True, **rc_dict}] else: - params = {**params, **kwargs} traces_dict[obj] = [] with style_temp_edit(obj, style_temp=params.pop("style", None), copy=True): out_traces = get_generic_traces3D( From d96f752d856fb1bb1893164f2ac7e4c846615b35 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 11 Jun 2024 18:51:10 +0200 Subject: [PATCH 051/211] update --- magpylib/_src/display/traces_core.py | 52 +++++++--------- magpylib/_src/display/traces_generic.py | 82 ++++++++++++++++++------- 2 files changed, 80 insertions(+), 54 deletions(-) diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index 920c7bcc7..932676c28 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -525,44 +525,22 @@ def make_TriangularMesh(obj, **kwargs) -> Union[Dict[str, Any], List[Dict[str, A def make_Pixels( - sensor, *, - sources, positions, - path_ind=-1, - symbol="cone", + symbol, size=1, + field_array=None, ) -> Dict[str, Any]: """ Create the plotly mesh3d parameters for Sensor pixels based on pixel positions and chosen size For now, only "cube" shape is provided. """ - - if symbol == "cube": - pixels = [ - make_BaseCuboid("plotly-dict", position=p, dimension=[size] * 3) - for p in positions - ] - elif symbol == "cone": - # pylint: disable=import-outside-toplevel - from magpylib._src.fields.field_wrap_BH import getBH_level2 - - field_array = getBH_level2( - sources, - [sensor], - sumup=True, - squeeze=False, - field="B", - pixel_agg=None, - output="ndarray", - in_out="auto", - ) - # select first source (for sumup=True there is only one) and path index + reshape pixel - field_array = field_array[0][path_ind].reshape(-1, 3) - orientations = get_orientation_from_vec(field_array) + if field_array is not None: field_mag = np.linalg.norm(field_array, axis=1) hex_colors = get_hexcolors_from_scale(field_mag) - pixels = [] + pixels = [] + if symbol == "." and field_array is not None: + orientations = get_orientation_from_vec(field_array) for p, o, c in zip(positions, orientations, hex_colors): pix = make_BasePyramid( "plotly-dict", @@ -574,10 +552,20 @@ def make_Pixels( ) pix["facecolor"] = np.repeat(c, len(pix["i"])) pixels.append(pix) + else: + for ind, p in enumerate(positions): + pix = make_BaseCuboid( + "plotly-dict", + position=p, + dimension=[size] * 3, + ) + if field_array is not None: + pix["facecolor"] = np.repeat(hex_colors[ind], len(pix["i"])) + pixels.append(pix) return merge_mesh3d(*pixels) -def make_Sensor(obj, *, autosize, sources, **kwargs) -> Dict[str, Any]: +def make_Sensor(obj, *, autosize, path_ind, **kwargs) -> Dict[str, Any]: """ Create the plotly mesh3d parameters for a Sensor object in a dictionary based on the provided arguments. @@ -635,11 +623,13 @@ def make_Sensor(obj, *, autosize, sources, **kwargs) -> Dict[str, Any]: if pixel_size > 0: pixel_dim *= pixel_size poss = pixel[1:] if one_pix else pixel + field_array = getattr(obj, "__field_array", None) + field_array = None if field_array is None else field_array[path_ind] pixels_mesh = make_Pixels( - sensor=obj, - sources=sources, + field_array=field_array, positions=poss, size=pixel_dim, + symbol=style.pixel.symbol, ) if pixels_mesh.get("facecolor", None) is None: pixels_mesh["facecolor"] = np.repeat(pixel_color, len(pixels_mesh["i"])) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index 44722b8d7..ad0a403dc 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -490,7 +490,10 @@ def get_generic_traces3D( if getattr(input_obj, "_autosize", False): make_func_kwargs["autosize"] = autosize if hasattr(style, "pixel"): - make_func_kwargs.update(sources=sources) + frames = style.path.frames + # TODO adapt to frames generally, not just last one + path_ind = frames[-1] if not isinstance(frames, numbers.Number) else -1 + make_func_kwargs.update(path_ind=path_ind) has_path = hasattr(input_obj, "position") and hasattr(input_obj, "orientation") path_traces_extra_non_generic_backend = [] @@ -783,7 +786,44 @@ def get_traces_3D( return traces_dict, extra_backend_traces -def draw_frame(objs, *, colorsequence, rc_params, style_kwargs, **kwargs) -> Tuple: +def set_sensor_field_array(objects, styles): + # pylint: disable=import-outside-toplevel + from magpylib._src.fields.field_wrap_BH import getBH_level2 + + sources = format_obj_input(objects, allow="sources+collections") + sources = [ + s + for s in sources + if not (isinstance(s, magpy.Collection) and not s.sources_all) + ] + sensors = format_obj_input(objects, allow="sensors+collections") + sensors = [ + sub_s + for s in sensors + for sub_s in (s.sensors_all if isinstance(s, magpy.Collection) else [s]) + ] + for sens in sensors: + # TODO change trigger for field array + if styles[sens].pixel.symbol == ".": + field_array = getBH_level2( + sources, + [sens], + sumup=True, + squeeze=False, + field="B", + pixel_agg=None, + output="ndarray", + in_out="auto", + ) + # select first source (for sumup=True there is only one) and path index + reshape pixel + path_len = field_array.shape[1] + field_array = field_array[0].reshape(path_len, -1, 3) + sens.__field_array = field_array + + +def draw_frame( + objs, *, frame_ind, colorsequence, rc_params, style_kwargs, **kwargs +) -> Tuple: """ Creates traces from input `objs` and provided parameters, updates the size of objects like Sensors and Dipoles in `kwargs` depending on the canvas size. @@ -793,15 +833,6 @@ def draw_frame(objs, *, colorsequence, rc_params, style_kwargs, **kwargs) -> Tup traces_dicts, kwargs: dict, dict returns the traces in a obj/traces_list dictionary and updated kwargs """ - sources = format_obj_input( - *{sub_obj for obj in objs for sub_obj in obj["objects"]}, - allow="sources+collections", - ) - sources = [ - s - for s in sources - if not (isinstance(s, magpy.Collection) and not s.sources_all) - ] if colorsequence is None: # pylint: disable=no-member colorsequence = default_settings.display.colorsequence @@ -812,6 +843,17 @@ def draw_frame(objs, *, colorsequence, rc_params, style_kwargs, **kwargs) -> Tup colorsequence=colorsequence, style_kwargs=style_kwargs, ) + + styles = { + obj: params.get("style", None) + for o_rc in objs_rc.values() + for obj, params in o_rc["objects"].items() + } + if frame_ind == 0: + set_sensor_field_array( + [obj for props in objs_rc.values() for obj in props["objects"]], + styles, + ) traces_dict = {} extra_backend_traces = [] rc_params = {} if rc_params is None else rc_params @@ -823,7 +865,6 @@ def draw_frame(objs, *, colorsequence, rc_params, style_kwargs, **kwargs) -> Tup rc_kwargs = {k: v for k, v in props["rc_params"].items() if k in rc_keys} traces_d1, traces_ex1 = get_traces_3D( props["objects"], - sources=sources, **rc_kwargs, **kwargs, ) @@ -844,7 +885,6 @@ def draw_frame(objs, *, colorsequence, rc_params, style_kwargs, **kwargs) -> Tup traces_d2, traces_ex2 = get_traces_3D( flat_objs_props, autosize=rc_params[rc]["autosize"], - sources=sources, **rc_kwargs, **kwargs, ) @@ -854,11 +894,6 @@ def draw_frame(objs, *, colorsequence, rc_params, style_kwargs, **kwargs) -> Tup extra_backend_traces.extend([*traces_ex1, *traces_ex2]) traces = group_traces(*[t for tr in traces_dict.values() for t in tr]) - styles = { - obj: params.get("style", None) - for o_rc in objs_rc.values() - for obj, params in o_rc["objects"].items() - } for props in objs_rc.values(): if props["rc_params"]["output"] != "model3d": traces2d = get_traces_2D( @@ -910,14 +945,15 @@ def get_frames( title_str = title rc_params = {} - for i, ind in enumerate(path_indices): + for frame_ind, path_ind in enumerate(path_indices): extra_backend_traces = [] if animation: - style_kwargs["style_path_frames"] = [ind] + style_kwargs["style_path_frames"] = [path_ind] title = "Animation 3D - " if title is None else title - title_str = f"""{title}path index: {ind+1:0{exp}d}""" + title_str = f"""{title}path index: {path_ind+1:0{exp}d}""" traces, extra_backend_traces, rc_params_temp = draw_frame( objs, + frame_ind=frame_ind, colorsequence=colorsequence, rc_params=rc_params, supports_colorgradient=supports_colorgradient, @@ -925,12 +961,12 @@ def get_frames( style_kwargs=style_kwargs, **kwargs, ) - if i == 0: # get the dipoles and sensors autosize from first frame + if frame_ind == 0: # get the dipoles and sensors autosize from first frame rc_params = rc_params_temp frames.append( { "data": traces, - "name": str(ind + 1), + "name": str(path_ind + 1), "layout": {"title": title_str}, "extra_backend_traces": extra_backend_traces, } From 9a2fca2367febc1c47b1c69de2d905528ae53983 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 11 Jun 2024 23:34:44 +0200 Subject: [PATCH 052/211] update --- magpylib/_src/display/traces_core.py | 4 +- magpylib/_src/display/traces_generic.py | 55 +++++++++++++++---------- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index 932676c28..8c22b99bd 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -565,7 +565,7 @@ def make_Pixels( return merge_mesh3d(*pixels) -def make_Sensor(obj, *, autosize, path_ind, **kwargs) -> Dict[str, Any]: +def make_Sensor(obj, *, autosize, path_ind=None, **kwargs) -> Dict[str, Any]: """ Create the plotly mesh3d parameters for a Sensor object in a dictionary based on the provided arguments. @@ -576,7 +576,7 @@ def make_Sensor(obj, *, autosize, path_ind, **kwargs) -> Dict[str, Any]: distance between any pixel of the same sensor, equal to `size_pixel`. """ style = obj.style - show_hull = True + show_hull = False dimension = getattr(obj, "dimension", style.size) pixel = obj.pixel no_pix = pixel is None diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index ad0a403dc..473620021 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -445,7 +445,6 @@ def process_extra_trace(model): def get_generic_traces3D( input_obj, - sources, autosize=None, legendgroup=None, legendtext=None, @@ -489,11 +488,6 @@ def get_generic_traces3D( make_func_kwargs = {"legendgroup": legendgroup, **kwargs} if getattr(input_obj, "_autosize", False): make_func_kwargs["autosize"] = autosize - if hasattr(style, "pixel"): - frames = style.path.frames - # TODO adapt to frames generally, not just last one - path_ind = frames[-1] if not isinstance(frames, numbers.Number) else -1 - make_func_kwargs.update(path_ind=path_ind) has_path = hasattr(input_obj, "position") and hasattr(input_obj, "orientation") path_traces_extra_non_generic_backend = [] @@ -510,9 +504,17 @@ def get_generic_traces3D( input_obj, style.path.frames ) traces_generic = [] - if pos_orient_inds.size != 0: + + is_frame_dependent = False + if hasattr(style, "pixel"): + # TODO adapt criteria to show field direction + is_frame_dependent = style.pixel.symbol == "." + + def get_traces_func(**extra_kwargs): + nonlocal is_mag + traces_generic_temp = [] if style.model3d.showdefault and make_func is not None: - p_trs = make_func(**make_func_kwargs) + p_trs = make_func(**make_func_kwargs, **extra_kwargs) p_trs = [p_trs] if isinstance(p_trs, dict) else p_trs for p_tr in p_trs: is_mag = p_tr.pop("ismagnet", is_mag) @@ -524,8 +526,14 @@ def get_generic_traces3D( color_slicing=not supports_colorgradient, ) - traces_generic.append(p_tr) + traces_generic_temp.append(p_tr) + return traces_generic_temp + if pos_orient_inds.size != 0: + if is_frame_dependent: + traces_generic.append(None) + else: + traces_generic.extend(get_traces_func()) extra_model3d_traces = ( style.model3d.data if style.model3d.data is not None else [] ) @@ -564,15 +572,23 @@ def get_generic_traces3D( legend_label = get_legend_label(input_obj) path_traces_generic = [] - for tr in traces_generic: + for trg in traces_generic: temp_rot_traces = [] - name_suff = tr.pop("name_suffix", None) - name = tr.get("name", "") if legendtext is None else legendtext - for orient, pos in zip(orientations, positions): - tr1 = place_and_orient_model3d(tr, orientation=orient, position=pos) - if name_suff is not None: - tr1["name"] = f"{name}{name_suff}" - temp_rot_traces.append(tr1) + for path_ind, (orient, pos, pos_orient_ind) in enumerate( + zip(orientations, positions, pos_orient_inds) + ): + tr_list = [trg] + if trg is None: + tr_list = get_traces_func(path_ind=pos_orient_ind) + tr_list = [tr_list] if isinstance(tr_list, dict) else tr_list + for tr in tr_list: + if path_ind == 0: + name_suff = tr.pop("name_suffix", None) + name = tr.get("name", "") if legendtext is None else legendtext + tr1 = place_and_orient_model3d(tr, orientation=orient, position=pos) + if name_suff is not None: + tr1["name"] = f"{name}{name_suff}" + temp_rot_traces.append(tr1) path_traces_generic.extend(group_traces(*temp_rot_traces)) if np.array(input_obj.position).ndim > 1 and style.path.show: @@ -756,9 +772,7 @@ def extract_animation_properties( return path_indices, exp, frame_duration -def get_traces_3D( - flat_objs_props, extra_backend=False, autosize=None, sources=None, **kwargs -): +def get_traces_3D(flat_objs_props, extra_backend=False, autosize=None, **kwargs): """Return traces, traces to resize and extra_backend_traces""" extra_backend_traces = [] traces_dict = {} @@ -775,7 +789,6 @@ def get_traces_3D( with style_temp_edit(obj, style_temp=params.pop("style", None), copy=True): out_traces = get_generic_traces3D( obj, - sources=sources, extra_backend=extra_backend, autosize=autosize, **params, From 64152a0812b8a7bd740bce2a44e68c2459056679 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Wed, 12 Jun 2024 00:11:35 +0200 Subject: [PATCH 053/211] normalize mag --- magpylib/_src/display/traces_core.py | 12 ++++++++++-- magpylib/_src/display/traces_utility.py | 11 +++++++---- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index 8c22b99bd..c4cf7b76d 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -530,6 +530,8 @@ def make_Pixels( symbol, size=1, field_array=None, + cmin=None, + cmax=None, ) -> Dict[str, Any]: """ Create the plotly mesh3d parameters for Sensor pixels based on pixel positions and chosen size @@ -537,7 +539,7 @@ def make_Pixels( """ if field_array is not None: field_mag = np.linalg.norm(field_array, axis=1) - hex_colors = get_hexcolors_from_scale(field_mag) + hex_colors = get_hexcolors_from_scale(field_mag, min_=cmin, max_=cmax) pixels = [] if symbol == "." and field_array is not None: orientations = get_orientation_from_vec(field_array) @@ -624,9 +626,15 @@ def make_Sensor(obj, *, autosize, path_ind=None, **kwargs) -> Dict[str, Any]: pixel_dim *= pixel_size poss = pixel[1:] if one_pix else pixel field_array = getattr(obj, "__field_array", None) - field_array = None if field_array is None else field_array[path_ind] + cmin, cmax = None, None + if field_array is not None: + field_mag = np.linalg.norm(field_array.reshape(-1, 3), axis=1) + cmin, cmax = np.amin(field_mag), np.amax(field_mag) + field_array = field_array[path_ind] pixels_mesh = make_Pixels( field_array=field_array, + cmin=cmin, + cmax=cmax, positions=poss, size=pixel_dim, symbol=style.pixel.symbol, diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index 7839ba07a..59c22f83e 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -845,15 +845,18 @@ def create_null_dim_trace(color=None, **kwargs): return {**trace, **kwargs} -def get_hexcolors_from_scale(values, colorscale="Rainbow", nan_color="#b2beb5"): +def get_hexcolors_from_scale( + values, colorscale="Rainbow", nan_color="#b2beb5", min_=None, max_=None +): """Convert numerical values to hexadecimal colors based on a color scale. Invalid value in the array a converted to the specified `nan_color`.""" values = np.array(values) nan_mask = np.isnan(values) valid = values[~nan_mask] - min_, max_ = np.min(valid), np.max(valid) - ptp = (max_ - min_) if max_ != min_ else 1 - values = (values - min_) / ptp + min_ = np.min(valid) if min_ is None else min_ + max_ = np.max(valid) if max_ is None else max_ + ptp = max_ - min_ + values = (values - min_) / ptp if ptp != 0 else values * 0 + 0.5 rgb_colors = sample_colorscale(colorscale, values[~nan_mask], colortype=None) hex_colors = [rgb2hex(rgb) for rgb in rgb_colors] out = np.array([""] * len(values), dtype=" Date: Wed, 12 Jun 2024 09:18:17 +0200 Subject: [PATCH 054/211] update --- magpylib/_src/display/traces_generic.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index 473620021..a50278ed2 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -492,10 +492,12 @@ def get_generic_traces3D( has_path = hasattr(input_obj, "position") and hasattr(input_obj, "orientation") path_traces_extra_non_generic_backend = [] if not has_path and make_func is not None: - tr = make_func(**make_func_kwargs) - tr["row"] = row - tr["col"] = col - out = {"generic": [tr]} + trs = make_func(**make_func_kwargs) # can return multiple traces + trs = [trs] if isinstance(trs, dict) else trs + for tr in trs: + tr["row"] = row + tr["col"] = col + out = {"generic": trs} if extra_backend: out.update({extra_backend: path_traces_extra_non_generic_backend}) return out From a9968eed92737eb37fb123ca3bb27024bc24c16b Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Wed, 12 Jun 2024 14:15:38 +0200 Subject: [PATCH 055/211] fix rescaling when vertices are None instead fo np.nan --- magpylib/_src/display/traces_utility.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index 85d87bcc9..40fb36de6 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -74,7 +74,7 @@ def place_and_orient_model3d( ) # sometimes traces come as (n,m,3) shape vert_shape = vertices.shape - vertices = np.reshape(vertices, (3, -1)) + vertices = np.reshape(vertices.astype(float), (3, -1)) vertices = vertices.T From 9d054fc175db428586588baa448310b16a97fc53 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Wed, 12 Jun 2024 14:43:59 +0200 Subject: [PATCH 056/211] fix pyvista streamlines example --- .../_pages/user_guide/examples/examples_vis_pv_streamlines.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md b/docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md index ac1e53b3d..8fc2fd30a 100644 --- a/docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md +++ b/docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md @@ -48,8 +48,8 @@ strl = grid.streamlines_from_source( # Create a Pyvista plotting scene pl = pv.Plotter() -# Add magnet to scene -magpy.show(magnet, canvas=pl, backend="pyvista") +# Add magnet to scene - streamlines units are assumed to be meters +magpy.show(magnet, canvas=pl, units_length="m", backend="pyvista") # Prepare legend parameters legend_args = { From 6e4f38f948b8df0ff4a263502d0a11342fe03ef4 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Wed, 12 Jun 2024 14:51:35 +0200 Subject: [PATCH 057/211] fix collection model3d not being displayed --- magpylib/_src/display/traces_utility.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index 40fb36de6..63013fc5e 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -3,6 +3,7 @@ # pylint: disable=too-many-branches from collections import defaultdict from functools import lru_cache +from itertools import chain from itertools import cycle from typing import Tuple @@ -272,8 +273,8 @@ def get_objects_props_by_row_col(*objs, colorsequence, style_kwargs): for obj in objs: rc_params = {k: v for k, v in obj.items() if k != "objects"} for subobj in obj["objects"]: - children = getattr(subobj, "children_all", [subobj]) - for child in children: + children = getattr(subobj, "children_all", []) + for child in chain([subobj], children): if child not in rc_params_by_obj: rc_params_by_obj[child] = [] rc_params_by_obj[child].append(rc_params) From 3c78b93a7a73fd147282098157c31094b7817b79 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Wed, 12 Jun 2024 16:37:07 +0200 Subject: [PATCH 058/211] update --- magpylib/_src/display/traces_generic.py | 26 +++++++++-------- magpylib/_src/display/traces_utility.py | 37 +++++++++---------------- 2 files changed, 27 insertions(+), 36 deletions(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index a50278ed2..45699e690 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -22,11 +22,11 @@ from magpylib._src.display.traces_utility import draw_arrowed_line from magpylib._src.display.traces_utility import get_legend_label from magpylib._src.display.traces_utility import get_objects_props_by_row_col -from magpylib._src.display.traces_utility import get_rot_pos_from_path from magpylib._src.display.traces_utility import get_scene_ranges from magpylib._src.display.traces_utility import getColorscale from magpylib._src.display.traces_utility import getIntensity from magpylib._src.display.traces_utility import group_traces +from magpylib._src.display.traces_utility import path_frames_to_indices from magpylib._src.display.traces_utility import place_and_orient_model3d from magpylib._src.display.traces_utility import rescale_traces from magpylib._src.display.traces_utility import slice_mesh_from_colorscale @@ -502,15 +502,18 @@ def get_generic_traces3D( out.update({extra_backend: path_traces_extra_non_generic_backend}) return out - orientations, positions, pos_orient_inds = get_rot_pos_from_path( - input_obj, style.path.frames - ) traces_generic = [] - + positions, orientations = input_obj._position, input_obj._orientation + path_len = len(positions) + max_pos_ind = path_len - 1 is_frame_dependent = False if hasattr(style, "pixel"): # TODO adapt criteria to show field direction is_frame_dependent = style.pixel.symbol == "." + if is_frame_dependent: + path_len = len(input_obj.__field_array) + + path_inds = path_frames_to_indices(style.path.frames, path_len) def get_traces_func(**extra_kwargs): nonlocal is_mag @@ -531,7 +534,7 @@ def get_traces_func(**extra_kwargs): traces_generic_temp.append(p_tr) return traces_generic_temp - if pos_orient_inds.size != 0: + if path_inds.size != 0: if is_frame_dependent: traces_generic.append(None) else: @@ -572,19 +575,18 @@ def get_traces_func(**extra_kwargs): traces_generic.append(mag_arrow_tr) legend_label = get_legend_label(input_obj) - path_traces_generic = [] for trg in traces_generic: temp_rot_traces = [] - for path_ind, (orient, pos, pos_orient_ind) in enumerate( - zip(orientations, positions, pos_orient_inds) - ): + for ind, path_ind in enumerate(path_inds): + pos_orient_ind = max_pos_ind if path_ind > max_pos_ind else path_ind + pos, orient = positions[pos_orient_ind], orientations[pos_orient_ind] tr_list = [trg] if trg is None: - tr_list = get_traces_func(path_ind=pos_orient_ind) + tr_list = get_traces_func(path_ind=path_ind) tr_list = [tr_list] if isinstance(tr_list, dict) else tr_list for tr in tr_list: - if path_ind == 0: + if ind == 0: name_suff = tr.pop("name_suffix", None) name = tr.get("name", "") if legendtext is None else legendtext tr1 = place_and_orient_model3d(tr, orientation=orient, position=pos) diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index e279b75c3..0835237aa 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -270,35 +270,24 @@ def draw_arrow_on_circle(sign, diameter, arrow_size, scaled=True, angle_pos_deg= return vertices -def get_rot_pos_from_path(obj, show_path=None): - """ - subsets orientations and positions depending on `show_path` value. - examples: - show_path = [1,2,8], path_len = 6 -> path_indices = [1,2,6] - returns rots[[1,2,6]], poss[[1,2,6]] - """ +def path_frames_to_indices(frames, path_len): + """get frames indices from frames input (can be bool,int, array)""" # pylint: disable=protected-access # pylint: disable=invalid-unary-operand-type - if show_path is None: - show_path = True - pos = obj._position - orient = obj._orientation - path_len = pos.shape[0] - if show_path is True or show_path is False or show_path == 0: + if frames is None: + frames = True + if frames is True or frames is False or frames == 0: inds = np.array([-1]) - elif isinstance(show_path, int): - inds = np.arange(path_len, dtype=int)[::-show_path] - elif hasattr(show_path, "__iter__") and not isinstance(show_path, str): - inds = np.array(show_path) + elif isinstance(frames, int): + inds = np.arange(path_len, dtype=int)[::-frames] + elif hasattr(frames, "__iter__") and not isinstance(frames, str): + inds = np.array(frames) else: # pragma: no cover - raise ValueError(f"Invalid show_path value ({show_path})") - inds[inds >= path_len] = path_len - 1 - inds = np.unique(inds) + raise ValueError(f"Invalid show_path value ({frames})") + inds = inds[inds < path_len] if inds.size == 0: inds = np.array([path_len - 1]) - rots = orient[inds] - poss = pos[inds] - return rots, poss, inds + return inds def get_objects_props_by_row_col(*objs, colorsequence, style_kwargs): @@ -847,7 +836,7 @@ def create_null_dim_trace(color=None, **kwargs): def get_hexcolors_from_scale( - values, colorscale="Rainbow", nan_color="#b2beb5", min_=None, max_=None + values, colorscale="Jet", nan_color="#b2beb5", min_=None, max_=None ): """Convert numerical values to hexadecimal colors based on a color scale. Invalid value in the array a converted to the specified `nan_color`.""" From d580f21e18a86a2778a5c53bf886662dadf499ea Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Wed, 12 Jun 2024 18:16:53 +0200 Subject: [PATCH 059/211] null field as cubes --- magpylib/_src/display/traces_core.py | 39 +++++++++++++++++----------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index c4cf7b76d..86e8eb409 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -527,7 +527,6 @@ def make_TriangularMesh(obj, **kwargs) -> Union[Dict[str, Any], List[Dict[str, A def make_Pixels( *, positions, - symbol, size=1, field_array=None, cmin=None, @@ -537,21 +536,32 @@ def make_Pixels( Create the plotly mesh3d parameters for Sensor pixels based on pixel positions and chosen size For now, only "cube" shape is provided. """ + pixels = [] if field_array is not None: + null_mask = (np.abs(field_array) < 1e-12).all(axis=1) + field_array[null_mask] = np.nan + nan_color = "#b2beb5" field_mag = np.linalg.norm(field_array, axis=1) - hex_colors = get_hexcolors_from_scale(field_mag, min_=cmin, max_=cmax) - pixels = [] - if symbol == "." and field_array is not None: + hex_colors = get_hexcolors_from_scale( + field_mag, min_=cmin, max_=cmax, nan_color=nan_color + ) orientations = get_orientation_from_vec(field_array) for p, o, c in zip(positions, orientations, hex_colors): - pix = make_BasePyramid( - "plotly-dict", - position=p, - orientation=o, - base=5, - diameter=size, - height=size * 2, - ) + if c == nan_color: + pix = make_BaseCuboid( + "plotly-dict", + position=p, + dimension=[size] * 3, + ) + else: + pix = make_BasePyramid( + "plotly-dict", + position=p, + orientation=o, + base=5, + diameter=size, + height=size * 2, + ) pix["facecolor"] = np.repeat(c, len(pix["i"])) pixels.append(pix) else: @@ -578,7 +588,8 @@ def make_Sensor(obj, *, autosize, path_ind=None, **kwargs) -> Dict[str, Any]: distance between any pixel of the same sensor, equal to `size_pixel`. """ style = obj.style - show_hull = False + field_array = getattr(obj, "__field_array", None) + show_hull = field_array is None dimension = getattr(obj, "dimension", style.size) pixel = obj.pixel no_pix = pixel is None @@ -625,7 +636,6 @@ def make_Sensor(obj, *, autosize, path_ind=None, **kwargs) -> Dict[str, Any]: if pixel_size > 0: pixel_dim *= pixel_size poss = pixel[1:] if one_pix else pixel - field_array = getattr(obj, "__field_array", None) cmin, cmax = None, None if field_array is not None: field_mag = np.linalg.norm(field_array.reshape(-1, 3), axis=1) @@ -637,7 +647,6 @@ def make_Sensor(obj, *, autosize, path_ind=None, **kwargs) -> Dict[str, Any]: cmax=cmax, positions=poss, size=pixel_dim, - symbol=style.pixel.symbol, ) if pixels_mesh.get("facecolor", None) is None: pixels_mesh["facecolor"] = np.repeat(pixel_color, len(pixels_mesh["i"])) From 499d656295b9d8fcf97dfddc21cab13c78b528c9 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Thu, 13 Jun 2024 18:19:56 +0200 Subject: [PATCH 060/211] add pixel field styles --- magpylib/_src/defaults/defaults_values.py | 5 ++ magpylib/_src/display/traces_core.py | 104 ++++++++++++---------- magpylib/_src/display/traces_generic.py | 45 ++++++---- magpylib/_src/style.py | 81 +++++++++++++++++ 4 files changed, 168 insertions(+), 67 deletions(-) diff --git a/magpylib/_src/defaults/defaults_values.py b/magpylib/_src/defaults/defaults_values.py index 8b7ddb2fb..c37a0dd62 100644 --- a/magpylib/_src/defaults/defaults_values.py +++ b/magpylib/_src/defaults/defaults_values.py @@ -95,6 +95,11 @@ "sizemode": "scaled", "color": None, "symbol": "o", + "field": { + "symbol": "cone", + "vectorsource": None, + "colorsource": None, + }, }, "arrows": { "x": {"color": "red"}, diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index 86e8eb409..0098e0212 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -527,52 +527,44 @@ def make_TriangularMesh(obj, **kwargs) -> Union[Dict[str, Any], List[Dict[str, A def make_Pixels( *, positions, - size=1, - field_array=None, - cmin=None, - cmax=None, + vectors, + colors, + symbol, + size, + null_thresh=1e-12, ) -> Dict[str, Any]: """ Create the plotly mesh3d parameters for Sensor pixels based on pixel positions and chosen size For now, only "cube" shape is provided. """ pixels = [] - if field_array is not None: - null_mask = (np.abs(field_array) < 1e-12).all(axis=1) - field_array[null_mask] = np.nan - nan_color = "#b2beb5" - field_mag = np.linalg.norm(field_array, axis=1) - hex_colors = get_hexcolors_from_scale( - field_mag, min_=cmin, max_=cmax, nan_color=nan_color - ) - orientations = get_orientation_from_vec(field_array) - for p, o, c in zip(positions, orientations, hex_colors): - if c == nan_color: - pix = make_BaseCuboid( - "plotly-dict", - position=p, - dimension=[size] * 3, - ) - else: - pix = make_BasePyramid( - "plotly-dict", - position=p, - orientation=o, - base=5, - diameter=size, - height=size * 2, - ) - pix["facecolor"] = np.repeat(c, len(pix["i"])) + kw = {"backend": "plotly-dict"} + if vectors is None: + for ind, pos in enumerate(positions): + pix = make_BaseCuboid("plotly-dict", position=pos, dimension=[size] * 3) + if colors is not None: + pix["facecolor"] = np.repeat(colors[ind], len(pix["i"])) pixels.append(pix) else: - for ind, p in enumerate(positions): - pix = make_BaseCuboid( - "plotly-dict", - position=p, - dimension=[size] * 3, - ) - if field_array is not None: - pix["facecolor"] = np.repeat(hex_colors[ind], len(pix["i"])) + orientations = get_orientation_from_vec(vectors) + for ind, (pos, orient) in enumerate(zip(positions, orientations)): + kw.update(position=pos) + is_null_vec = (np.abs(vectors[ind]) < null_thresh).all() + if is_null_vec: + pix = make_BaseCuboid(dimension=[size] * 3, **kw) + else: + kw.update(orientation=orient, base=5, diameter=size, height=size * 2) + if symbol == "cone": + pix = make_BasePyramid(**kw) + elif symbol == "arrow3d": + pix = make_BaseArrow(**kw) + else: # pragma: no cover + raise ValueError( + "Invalid pixel field symbol (must be 'cone' or 'arrow3d')" + f", got {symbol!r}" + ) + if colors is not None: + pix["facecolor"] = np.repeat(colors[ind], len(pix["i"])) pixels.append(pix) return merge_mesh3d(*pixels) @@ -588,8 +580,8 @@ def make_Sensor(obj, *, autosize, path_ind=None, **kwargs) -> Dict[str, Any]: distance between any pixel of the same sensor, equal to `size_pixel`. """ style = obj.style - field_array = getattr(obj, "__field_array", None) - show_hull = field_array is None + field_array = getattr(obj, "__field_array", {}) + show_hull = not bool(field_array) dimension = getattr(obj, "dimension", style.size) pixel = obj.pixel no_pix = pixel is None @@ -636,17 +628,33 @@ def make_Sensor(obj, *, autosize, path_ind=None, **kwargs) -> Dict[str, Any]: if pixel_size > 0: pixel_dim *= pixel_size poss = pixel[1:] if one_pix else pixel - cmin, cmax = None, None - if field_array is not None: - field_mag = np.linalg.norm(field_array.reshape(-1, 3), axis=1) - cmin, cmax = np.amin(field_mag), np.amax(field_mag) - field_array = field_array[path_ind] + vectors, colors, null_thresh = None, None, 1e-12 + if field_array: + vsrc = style.pixel.field.vectorsource + csrc = style.pixel.field.colorsource + if vsrc: + vectors = field_array[vsrc][path_ind] + # if csrc=="" -> show vectors but no color + csrc = vsrc if csrc is None else csrc + if csrc: + # get cmin, cmax for whole path + field_str, *coords_str = csrc + coords_str = coords_str if coords_str else "xyz" + coords = list({"xyz".index(v) for v in coords_str if v in "xyz"}) + field_array = field_array[field_str][..., coords] + field_mag = np.linalg.norm(field_array, axis=-1) + cmin, cmax = np.amin(field_mag), np.amax(field_mag) + field_mag = field_mag[path_ind] + is_null = (np.abs(field_array[path_ind]) < null_thresh).all(axis=1) + field_mag[is_null] = np.nan + colors = get_hexcolors_from_scale(field_mag, min_=cmin, max_=cmax) pixels_mesh = make_Pixels( - field_array=field_array, - cmin=cmin, - cmax=cmax, positions=poss, + vectors=vectors, + colors=colors, size=pixel_dim, + symbol=style.pixel.field.symbol, + null_thresh=null_thresh, ) if pixels_mesh.get("facecolor", None) is None: pixels_mesh["facecolor"] = np.repeat(pixel_color, len(pixels_mesh["i"])) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index 45699e690..db6f04a7c 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -508,10 +508,11 @@ def get_generic_traces3D( max_pos_ind = path_len - 1 is_frame_dependent = False if hasattr(style, "pixel"): - # TODO adapt criteria to show field direction - is_frame_dependent = style.pixel.symbol == "." + vsrc = style.pixel.field.vectorsource + csrc = style.pixel.field.colorsource + is_frame_dependent = vsrc or csrc if is_frame_dependent: - path_len = len(input_obj.__field_array) + path_len = len(next(iter(input_obj.__field_array.values()))) path_inds = path_frames_to_indices(style.path.frames, path_len) @@ -820,22 +821,28 @@ def set_sensor_field_array(objects, styles): for sub_s in (s.sensors_all if isinstance(s, magpy.Collection) else [s]) ] for sens in sensors: - # TODO change trigger for field array - if styles[sens].pixel.symbol == ".": - field_array = getBH_level2( - sources, - [sens], - sumup=True, - squeeze=False, - field="B", - pixel_agg=None, - output="ndarray", - in_out="auto", - ) - # select first source (for sumup=True there is only one) and path index + reshape pixel - path_len = field_array.shape[1] - field_array = field_array[0].reshape(path_len, -1, 3) - sens.__field_array = field_array + vsrc = styles[sens].pixel.field.vectorsource + csrc = styles[sens].pixel.field.colorsource + if vsrc or csrc: + sens.__field_array = {} + csrc = csrc if csrc else vsrc + vrsc = vsrc if vsrc else csrc[0] + for field in {vrsc, csrc[0]}: + out = getBH_level2( + sources, + [sens], + sumup=True, + squeeze=False, + field=field, + pixel_agg=None, + output="ndarray", + in_out="auto", + ) + # select first source (for sumup=True there is only one) + # and path index + reshape pixel + path_len = out.shape[1] + out = out[0].reshape(path_len, -1, 3) + sens.__field_array[field] = out def draw_frame( diff --git a/magpylib/_src/style.py b/magpylib/_src/style.py index 9c8c2127e..859f35e28 100644 --- a/magpylib/_src/style.py +++ b/magpylib/_src/style.py @@ -1645,6 +1645,78 @@ def __init__(self, **kwargs): super().__init__(**kwargs) +class PixelField(MagicProperties): + """Defines the styling properties of sensor pixels. + + Parameters + ---------- + vectorsource: + + vectorsource: str, default=None + Defines the pixel orientation vector source (one of "B", "H", "M", "J") + + colorsource: str, default=None + Defines the pixel color source (e.g. "Bx", "Hxy", "J", etc.). If not specfied, + the amplitude of the `vectorsource` value is used. + + symbol: {"cone", "arrow3d"}: + Orientation symbol for field vector. + """ + + _allowed_symbols = ("cone", "arrow3d") + _allowed_vectorsources = ("B", "H", "J", "M") + + @property + def vectorsource(self): + """Pixel vector source.""" + return self._vectorsource + + @vectorsource.setter + def vectorsource(self, val): + assert val is None or val in self._allowed_vectorsources, ( + f"The `vectorsource` property of {type(self).__name__} must be one of" + f"{self._allowed_vectorsources},\n" + f"but received {repr(val)} instead." + ) + self._vectorsource = val + + @property + def colorsource(self): + """Pixel vector source.""" + return self._colorsource + + @colorsource.setter + def colorsource(self, val): + valid = True + if val not in ("", None): + field_str, *coords_str = val + if not coords_str: + coords_str = list("xyz") + if field_str not in "BHMJ" and set(coords_str).difference(set("xyz")): + valid = False + assert valid, ( + f"The `colorsource` property of {type(self).__name__} must start with either" + f" {self._allowed_vectorsources} and be followed by a combination of 'x', 'y', 'z'" + " (e.g. 'Bxy' or ('Bxy', 'Bz') )" + f" but received {repr(val)} instead." + ) + self._colorsource = val + + @property + def symbol(self): + """Pixel symbol. Can be one of `("cone", "arrow3d")`.""" + return self._symbol + + @symbol.setter + def symbol(self, val): + assert val is None or val in self._allowed_symbols, ( + f"The `symbol` property of {type(self).__name__} must be one of" + f"{self._allowed_symbols},\n" + f"but received {repr(val)} instead." + ) + self._symbol = val + + class Pixel(MagicProperties): """Defines the styling properties of sensor pixels. @@ -1727,6 +1799,15 @@ def symbol(self, val): ) self._symbol = val + @property + def field(self): + """`PixelField` object or dict.""" + return self._field + + @field.setter + def field(self, val): + self._field = validate_property_class(val, "pixel", PixelField, self) + class CurrentProperties: """Defines styling properties of line current classes. From 6e8a18c180934db7abe99e5a0427f9649aa5d7fe Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Thu, 13 Jun 2024 18:33:47 +0200 Subject: [PATCH 061/211] only minimal positions on extra non generic traces --- magpylib/_src/display/traces_generic.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index db6f04a7c..b0f6e2576 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -507,14 +507,14 @@ def get_generic_traces3D( path_len = len(positions) max_pos_ind = path_len - 1 is_frame_dependent = False + path_inds = path_inds_minimal = path_frames_to_indices(style.path.frames, path_len) if hasattr(style, "pixel"): vsrc = style.pixel.field.vectorsource csrc = style.pixel.field.colorsource is_frame_dependent = vsrc or csrc if is_frame_dependent: path_len = len(next(iter(input_obj.__field_array.values()))) - - path_inds = path_frames_to_indices(style.path.frames, path_len) + path_inds = path_frames_to_indices(style.path.frames, path_len) def get_traces_func(**extra_kwargs): nonlocal is_mag @@ -632,11 +632,11 @@ def get_traces_func(**extra_kwargs): continue extr.update(extr.updatefunc()) # update before checking backend if extr.backend == extra_backend: - for orient, pos in zip(orientations, positions): + for path_ind in path_inds_minimal: tr_non_generic = { "model3d": extr, - "position": pos, - "orientation": orient, + "position": positions[path_ind], + "orientation": orientations[path_ind], "kwargs_extra": { "opacity": style.opacity, "color": style.color, From a5bed0740fbd2c53835f6526bcfeaa046f1b9816 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Thu, 13 Jun 2024 19:01:38 +0200 Subject: [PATCH 062/211] dramatically improve pixel scaling computing performance --- magpylib/_src/display/traces_core.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index 0098e0212..f3dce10e2 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -6,7 +6,6 @@ # pylint: disable=too-many-nested-blocks # pylint: disable=cyclic-import import warnings -from itertools import combinations from itertools import cycle from typing import Any from typing import Dict @@ -15,6 +14,7 @@ import numpy as np from scipy.spatial import distance +from scipy.spatial.distance import pdist from scipy.spatial.transform import Rotation as RotScipy from magpylib._src.display.sensor_mesh import get_sensor_mesh @@ -620,10 +620,13 @@ def make_Sensor(obj, *, autosize, path_ind=None, **kwargs) -> Dict[str, Any]: pixel_size = style.pixel.size pixel_dim = 1 if style.pixel.sizemode == "scaled": - combs = np.array(list(combinations(pixel, 2))) - vecs = np.diff(combs, axis=1) - dists = np.linalg.norm(vecs, axis=2) - min_dist = np.min(dists) + if len(pixel) < 1000: + min_dist = np.min(pdist(pixel)) + else: + # when too many pixels, min_dist computation is too expensive (On^2) + # using volume/(side length) approximation instead + vol = np.prod(np.ptp(pixel, axis=0)) + min_dist = (vol / len(pixel)) ** (1 / 3) pixel_dim = dim_ext / 5 if min_dist == 0 else min_dist / 2 if pixel_size > 0: pixel_dim *= pixel_size From dbf4b3b3cbddefb4e78df20801d9ddd09185c178 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Fri, 14 Jun 2024 15:20:47 +0200 Subject: [PATCH 063/211] remove duplicate sources --- magpylib/_src/display/traces_generic.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index b0f6e2576..a0cc97a31 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -808,12 +808,8 @@ def set_sensor_field_array(objects, styles): # pylint: disable=import-outside-toplevel from magpylib._src.fields.field_wrap_BH import getBH_level2 - sources = format_obj_input(objects, allow="sources+collections") - sources = [ - s - for s in sources - if not (isinstance(s, magpy.Collection) and not s.sources_all) - ] + sources = format_obj_input(objects, allow="sources") + sources = list(set(sources)) # remove duplicates sensors = format_obj_input(objects, allow="sensors+collections") sensors = [ sub_s From a2d2940667190c31e84017cb273d2b88655b6ba8 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Fri, 14 Jun 2024 15:21:41 +0200 Subject: [PATCH 064/211] fix orientation from vec array --- magpylib/_src/display/traces_utility.py | 65 +++++++++++++++++-------- tests/test_display_utility.py | 26 ++++++++++ 2 files changed, 72 insertions(+), 19 deletions(-) diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index 0835237aa..87eb77071 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -135,7 +135,9 @@ def get_vertices_from_model(model_kwargs, model_args=None, coordsargs=None): def get_orientation_from_vec(vec, ref_axis=(0, 0, 1)): - """Compute rotation from input vector to reference axis. + """ + Compute rotation from input vector to reference axis, handling NaNs, infs, + or zero vectors by returning an identity rotation. Parameters ---------- @@ -146,26 +148,51 @@ def get_orientation_from_vec(vec, ref_axis=(0, 0, 1)): Returns ------- - RotScipy - Rotation object from input vector to reference axis + Rotation + Rotation object from input vector to reference axis. """ + # normalize reference axis - norm = np.linalg.norm(ref_axis) - if norm != 0: - ref_axis = ref_axis / norm - - # clean and normalize input vector - vec[np.isnan(vec).any(axis=1)] = [0, 0, 0] - norm = np.linalg.norm(vec, axis=1) - norm[norm == 0] = 1 - vec = (vec.T / norm).T - - # get angle and axis for rotvec - cross = np.cross(vec, ref_axis) - dot = np.dot(vec, ref_axis) - angle = np.arccos(dot) - rotvec = (-angle * cross.T).T - rotvec[(cross == 0).all(axis=1) & (dot == -1)] = [0, 0, np.pi] + ref_axis = np.array(ref_axis) / np.linalg.norm(ref_axis) + + # Initialize rotation vector array + rotvec = np.zeros_like(vec) + + # Find invalid vectors (NaNs, infs) and zero vectors + invalid_mask = np.isnan(vec).any(axis=1) | np.isinf(vec).any(axis=1) + zero_vector_mask = ~invalid_mask & (np.linalg.norm(vec, axis=1) == 0) + valid_mask = ~(invalid_mask | zero_vector_mask) + + # Normalize valid input vectors + vec_valid = vec[valid_mask] + norm_valid = np.linalg.norm(vec_valid, axis=1, keepdims=True) + vec_valid = vec_valid / norm_valid + + # get angle and axis for valid rotvecs + cross_valid = np.cross(vec_valid, ref_axis) + cross_magnitudes = np.linalg.norm(cross_valid, axis=1) + mask = cross_magnitudes > 0 + cross_valid[mask] = cross_valid[mask] / cross_magnitudes[mask][:, np.newaxis] + dot_valid = np.dot(vec_valid, ref_axis) + # Clip dot product to ensure it falls within the valid range of arccos + dot_valid = np.clip(dot_valid, -1.0, 1.0) + angle_valid = np.arccos(dot_valid) + + # Compute rotation vectors for valid inputs + rotvec_valid = -cross_valid * angle_valid[:, np.newaxis] + + # Handle the edge case where the vectors are anti-parallel + anti_parallel_mask = np.isclose(dot_valid, -1) + if np.any(anti_parallel_mask): + # Find an arbitrary axis orthogonal to the reference axis + orthogonal_axis = np.cross(ref_axis, np.array([1, 0, 0])) + # if ref_axis was colinear with orthogonal axis + if np.linalg.norm(orthogonal_axis) == 0: + orthogonal_axis = np.cross(ref_axis, np.array([0, 1, 0])) + # Apply 180 degrees rotation around the orthogonal axis + rotvec_valid[anti_parallel_mask] = np.pi * orthogonal_axis + + rotvec[valid_mask] = rotvec_valid return RotScipy.from_rotvec(rotvec) diff --git a/tests/test_display_utility.py b/tests/test_display_utility.py index d803f0c40..52c9370a8 100644 --- a/tests/test_display_utility.py +++ b/tests/test_display_utility.py @@ -8,6 +8,7 @@ import magpylib as magpy from magpylib._src.display.traces_utility import draw_arrow_from_vertices +from magpylib._src.display.traces_utility import get_orientation_from_vec from magpylib._src.display.traces_utility import merge_scatter3d from magpylib._src.exceptions import MagpylibBadUserInput @@ -101,3 +102,28 @@ def get_traces(n): merge_scatter3d(*get_traces(1)) merge_scatter3d(*get_traces(3)) + + +def test_get_orientation_from_vec(): + """test get_orientation_from_vec""" + # should return ref axis non null vectors and invalid inputs + # antiparallel to the ref_axis should return valid 180 rotation + ref_axis = (0, 0, 1) + vec = np.array( + [ + [0, 0, 1], + [0, 1, 0], + [0, 0, 1], + [np.nan, 0, 0], + [0, 0, 0], + [0, 0, -1], + [1, 2, 3], + [4, 5, 6], + ] + ) + with np.errstate(divide="ignore", invalid="ignore"): + vec = (vec.T / np.linalg.norm(vec, axis=1)).T + hasnan = np.isnan(vec).any(axis=1) + orient = get_orientation_from_vec(vec, ref_axis=ref_axis) + vec[hasnan] = ref_axis + np.testing.assert_allclose(vec, orient.apply(ref_axis), atol=1e-8) From 6bb597b0758b86558d70d72790cafd64fb14e27a Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Fri, 14 Jun 2024 16:51:15 +0200 Subject: [PATCH 065/211] fix kw mutation --- magpylib/_src/display/traces_core.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index f3dce10e2..cbcb58172 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -538,7 +538,6 @@ def make_Pixels( For now, only "cube" shape is provided. """ pixels = [] - kw = {"backend": "plotly-dict"} if vectors is None: for ind, pos in enumerate(positions): pix = make_BaseCuboid("plotly-dict", position=pos, dimension=[size] * 3) @@ -548,7 +547,7 @@ def make_Pixels( else: orientations = get_orientation_from_vec(vectors) for ind, (pos, orient) in enumerate(zip(positions, orientations)): - kw.update(position=pos) + kw = {"backend": "plotly-dict", "position": pos} is_null_vec = (np.abs(vectors[ind]) < null_thresh).all() if is_null_vec: pix = make_BaseCuboid(dimension=[size] * 3, **kw) From 51be386dac1b92650202487e602fcbd00302d834 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Fri, 14 Jun 2024 23:47:17 +0200 Subject: [PATCH 066/211] add field shownull style property --- magpylib/_src/defaults/defaults_values.py | 1 + magpylib/_src/display/traces_core.py | 13 +++++++++---- magpylib/_src/style.py | 16 ++++++++++++++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/magpylib/_src/defaults/defaults_values.py b/magpylib/_src/defaults/defaults_values.py index c37a0dd62..8a6e674ba 100644 --- a/magpylib/_src/defaults/defaults_values.py +++ b/magpylib/_src/defaults/defaults_values.py @@ -99,6 +99,7 @@ "symbol": "cone", "vectorsource": None, "colorsource": None, + "shownull": True, }, }, "arrows": { diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index cbcb58172..ab652205e 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -530,6 +530,7 @@ def make_Pixels( vectors, colors, symbol, + shownull, size, null_thresh=1e-12, ) -> Dict[str, Any]: @@ -549,8 +550,10 @@ def make_Pixels( for ind, (pos, orient) in enumerate(zip(positions, orientations)): kw = {"backend": "plotly-dict", "position": pos} is_null_vec = (np.abs(vectors[ind]) < null_thresh).all() + pix = None if is_null_vec: - pix = make_BaseCuboid(dimension=[size] * 3, **kw) + if shownull: + pix = make_BaseCuboid(dimension=[size] * 3, **kw) else: kw.update(orientation=orient, base=5, diameter=size, height=size * 2) if symbol == "cone": @@ -562,9 +565,10 @@ def make_Pixels( "Invalid pixel field symbol (must be 'cone' or 'arrow3d')" f", got {symbol!r}" ) - if colors is not None: - pix["facecolor"] = np.repeat(colors[ind], len(pix["i"])) - pixels.append(pix) + if pix is not None: + if colors is not None: + pix["facecolor"] = np.repeat(colors[ind], len(pix["i"])) + pixels.append(pix) return merge_mesh3d(*pixels) @@ -656,6 +660,7 @@ def make_Sensor(obj, *, autosize, path_ind=None, **kwargs) -> Dict[str, Any]: colors=colors, size=pixel_dim, symbol=style.pixel.field.symbol, + shownull=style.pixel.field.shownull, null_thresh=null_thresh, ) if pixels_mesh.get("facecolor", None) is None: diff --git a/magpylib/_src/style.py b/magpylib/_src/style.py index 859f35e28..ff39e1e2e 100644 --- a/magpylib/_src/style.py +++ b/magpylib/_src/style.py @@ -1659,6 +1659,9 @@ class PixelField(MagicProperties): Defines the pixel color source (e.g. "Bx", "Hxy", "J", etc.). If not specfied, the amplitude of the `vectorsource` value is used. + shownull: bool, default=True + Show/hide null or invalid field values + symbol: {"cone", "arrow3d"}: Orientation symbol for field vector. """ @@ -1702,6 +1705,19 @@ def colorsource(self, val): ) self._colorsource = val + @property + def shownull(self): + """Show/hide null or invalid field values""" + return self._shownull + + @shownull.setter + def shownull(self, val): + assert val is None or isinstance(val, bool), ( + f"The `shownull` property of {type(self).__name__} must be either True or False," + f"but received {repr(val)} instead." + ) + self._shownull = val + @property def symbol(self): """Pixel symbol. Can be one of `("cone", "arrow3d")`.""" From ed86aed55f773479f1d3f306c5f950ed4f13892f Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sat, 15 Jun 2024 00:01:22 +0200 Subject: [PATCH 067/211] allow pixel field also without source --- magpylib/_src/display/traces_generic.py | 40 ++++++++++++++----------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index a0cc97a31..56e7cba80 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -511,7 +511,7 @@ def get_generic_traces3D( if hasattr(style, "pixel"): vsrc = style.pixel.field.vectorsource csrc = style.pixel.field.colorsource - is_frame_dependent = vsrc or csrc + is_frame_dependent = (vsrc or csrc) and input_obj.__field_array if is_frame_dependent: path_len = len(next(iter(input_obj.__field_array.values()))) path_inds = path_frames_to_indices(style.path.frames, path_len) @@ -808,14 +808,13 @@ def set_sensor_field_array(objects, styles): # pylint: disable=import-outside-toplevel from magpylib._src.fields.field_wrap_BH import getBH_level2 - sources = format_obj_input(objects, allow="sources") - sources = list(set(sources)) # remove duplicates sensors = format_obj_input(objects, allow="sensors+collections") sensors = [ sub_s for s in sensors for sub_s in (s.sensors_all if isinstance(s, magpy.Collection) else [s]) ] + has_pix_field = False for sens in sensors: vsrc = styles[sens].pixel.field.vectorsource csrc = styles[sens].pixel.field.colorsource @@ -824,21 +823,26 @@ def set_sensor_field_array(objects, styles): csrc = csrc if csrc else vsrc vrsc = vsrc if vsrc else csrc[0] for field in {vrsc, csrc[0]}: - out = getBH_level2( - sources, - [sens], - sumup=True, - squeeze=False, - field=field, - pixel_agg=None, - output="ndarray", - in_out="auto", - ) - # select first source (for sumup=True there is only one) - # and path index + reshape pixel - path_len = out.shape[1] - out = out[0].reshape(path_len, -1, 3) - sens.__field_array[field] = out + if not has_pix_field: + sources = format_obj_input(objects, allow="sources") + sources = list(set(sources)) # remove duplicates + if sources: + out = getBH_level2( + sources, + [sens], + sumup=True, + squeeze=False, + field=field, + pixel_agg=None, + output="ndarray", + in_out="auto", + ) + # select first source (for sumup=True there is only one) + # and path index + reshape pixel + path_len = out.shape[1] + out = out[0].reshape(path_len, -1, 3) + sens.__field_array[field] = out + has_pix_field = True def draw_frame( From ed4c3bdcae9efa6951e132bbf002898d17ef50b3 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sat, 15 Jun 2024 01:24:52 +0200 Subject: [PATCH 068/211] refactoring --- magpylib/_src/display/traces_core.py | 5 +- magpylib/_src/display/traces_generic.py | 83 +++++++++++++++---------- 2 files changed, 53 insertions(+), 35 deletions(-) diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index ab652205e..c74845fba 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -572,7 +572,9 @@ def make_Pixels( return merge_mesh3d(*pixels) -def make_Sensor(obj, *, autosize, path_ind=None, **kwargs) -> Dict[str, Any]: +def make_Sensor( + obj, *, autosize, path_ind=None, field_array, **kwargs +) -> Dict[str, Any]: """ Create the plotly mesh3d parameters for a Sensor object in a dictionary based on the provided arguments. @@ -583,7 +585,6 @@ def make_Sensor(obj, *, autosize, path_ind=None, **kwargs) -> Dict[str, Any]: distance between any pixel of the same sensor, equal to `size_pixel`. """ style = obj.style - field_array = getattr(obj, "__field_array", {}) show_hull = not bool(field_array) dimension = getattr(obj, "dimension", style.size) pixel = obj.pixel diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index 56e7cba80..a83dcebb5 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -451,6 +451,7 @@ def get_generic_traces3D( showlegend=None, supports_colorgradient=True, extra_backend=False, + field_array=None, row=1, col=1, **kwargs, @@ -484,16 +485,40 @@ def get_generic_traces3D( is_mag_arrows = "arrow" in magstyl.mode magstyl.show = "color" in magstyl.mode - make_func = getattr(input_obj, "get_trace", None) + get_trace_method = getattr(input_obj, "get_trace", None) + if get_trace_method is not None: + + def make_func(*args, **kwargs): + out = get_trace_method(*args, **kwargs) # can return multiple traces + out = list(out) if isinstance(out, (list, tuple)) else [out] + return out + + else: + make_func = None + make_func_kwargs = {"legendgroup": legendgroup, **kwargs} if getattr(input_obj, "_autosize", False): make_func_kwargs["autosize"] = autosize - has_path = hasattr(input_obj, "position") and hasattr(input_obj, "orientation") + positions = getattr(input_obj, "_position", None) + orientations = getattr(input_obj, "_orientation", None) + has_path = positions is not None and orientations is not None + path_len = 1 if positions is None else len(positions) + max_pos_ind = path_len - 1 + is_frame_dependent = False + path_inds = path_inds_minimal = path_frames_to_indices(style.path.frames, path_len) + if hasattr(style, "pixel"): + make_func_kwargs["field_array"] = field_array + vsrc = style.pixel.field.vectorsource + csrc = style.pixel.field.colorsource + is_frame_dependent = (vsrc or csrc) and field_array + if is_frame_dependent: + path_len = len(next(iter(field_array.values()))) + path_inds = path_frames_to_indices(style.path.frames, path_len) + path_traces_extra_non_generic_backend = [] if not has_path and make_func is not None: - trs = make_func(**make_func_kwargs) # can return multiple traces - trs = [trs] if isinstance(trs, dict) else trs + trs = make_func(**make_func_kwargs) for tr in trs: tr["row"] = row tr["col"] = col @@ -502,26 +527,11 @@ def get_generic_traces3D( out.update({extra_backend: path_traces_extra_non_generic_backend}) return out - traces_generic = [] - positions, orientations = input_obj._position, input_obj._orientation - path_len = len(positions) - max_pos_ind = path_len - 1 - is_frame_dependent = False - path_inds = path_inds_minimal = path_frames_to_indices(style.path.frames, path_len) - if hasattr(style, "pixel"): - vsrc = style.pixel.field.vectorsource - csrc = style.pixel.field.colorsource - is_frame_dependent = (vsrc or csrc) and input_obj.__field_array - if is_frame_dependent: - path_len = len(next(iter(input_obj.__field_array.values()))) - path_inds = path_frames_to_indices(style.path.frames, path_len) - def get_traces_func(**extra_kwargs): nonlocal is_mag traces_generic_temp = [] if style.model3d.showdefault and make_func is not None: p_trs = make_func(**make_func_kwargs, **extra_kwargs) - p_trs = [p_trs] if isinstance(p_trs, dict) else p_trs for p_tr in p_trs: is_mag = p_tr.pop("ismagnet", is_mag) if is_mag and p_tr.get("type", "") == "mesh3d": @@ -535,6 +545,7 @@ def get_traces_func(**extra_kwargs): traces_generic_temp.append(p_tr) return traces_generic_temp + traces_generic = [] if path_inds.size != 0: if is_frame_dependent: traces_generic.append(None) @@ -781,6 +792,7 @@ def get_traces_3D(flat_objs_props, extra_backend=False, autosize=None, **kwargs) """Return traces, traces to resize and extra_backend_traces""" extra_backend_traces = [] traces_dict = {} + field_by_sens = kwargs.pop("field_by_sens", {}) for obj, params in flat_objs_props.items(): params = {**params, **kwargs} if autosize is None and getattr(obj, "_autosize", False): @@ -796,6 +808,7 @@ def get_traces_3D(flat_objs_props, extra_backend=False, autosize=None, **kwargs) obj, extra_backend=extra_backend, autosize=autosize, + field_array=field_by_sens.get(obj, None), **params, ) if extra_backend: @@ -804,10 +817,12 @@ def get_traces_3D(flat_objs_props, extra_backend=False, autosize=None, **kwargs) return traces_dict, extra_backend_traces -def set_sensor_field_array(objects, styles): +def get_sensor_pixel_field(objects, styles): + """get field_by_sens if sensor has style pixel field""" # pylint: disable=import-outside-toplevel from magpylib._src.fields.field_wrap_BH import getBH_level2 + field_by_sens = {} sensors = format_obj_input(objects, allow="sensors+collections") sensors = [ sub_s @@ -819,7 +834,7 @@ def set_sensor_field_array(objects, styles): vsrc = styles[sens].pixel.field.vectorsource csrc = styles[sens].pixel.field.colorsource if vsrc or csrc: - sens.__field_array = {} + field_by_sens[sens] = {} csrc = csrc if csrc else vsrc vrsc = vsrc if vsrc else csrc[0] for field in {vrsc, csrc[0]}: @@ -841,12 +856,13 @@ def set_sensor_field_array(objects, styles): # and path index + reshape pixel path_len = out.shape[1] out = out[0].reshape(path_len, -1, 3) - sens.__field_array[field] = out + field_by_sens[sens][field] = out has_pix_field = True + return field_by_sens def draw_frame( - objs, *, frame_ind, colorsequence, rc_params, style_kwargs, **kwargs + objs, *, field_by_sens, colorsequence, rc_params, style_kwargs, **kwargs ) -> Tuple: """ Creates traces from input `objs` and provided parameters, updates the size of objects like @@ -873,11 +889,12 @@ def draw_frame( for o_rc in objs_rc.values() for obj, params in o_rc["objects"].items() } - if frame_ind == 0: - set_sensor_field_array( + if field_by_sens is None: + field_by_sens = get_sensor_pixel_field( [obj for props in objs_rc.values() for obj in props["objects"]], styles, ) + kwargs["field_by_sens"] = field_by_sens traces_dict = {} extra_backend_traces = [] rc_params = {} if rc_params is None else rc_params @@ -894,6 +911,8 @@ def draw_frame( ) rc_params[rc]["autosize"] = rc_params.get(rc, {}).get("autosize", None) if rc_params[rc]["autosize"] is None: + # get the dipoles and sensors autosize from first frame + # rc_params gets returned and passed back to the function zoom = rc_params[rc]["zoom"] = props["rc_params"]["zoom"] traces = [t for tr in traces_d1.values() for t in tr] ranges_rc = get_scene_ranges(*traces, *traces_ex1, zoom=zoom) @@ -926,7 +945,7 @@ def draw_frame( styles=styles, ) traces.extend(traces2d) - return traces, extra_backend_traces, rc_params + return traces, extra_backend_traces, rc_params, field_by_sens def get_frames( @@ -966,18 +985,18 @@ def get_frames( ) # create frame for each path index or downsampled path index frames = [] - title_str = title - rc_params = {} - for frame_ind, path_ind in enumerate(path_indices): + field_by_sens = None + rc_params = None + for path_ind in path_indices: extra_backend_traces = [] if animation: style_kwargs["style_path_frames"] = [path_ind] title = "Animation 3D - " if title is None else title title_str = f"""{title}path index: {path_ind+1:0{exp}d}""" - traces, extra_backend_traces, rc_params_temp = draw_frame( + traces, extra_backend_traces, rc_params, field_by_sens = draw_frame( objs, - frame_ind=frame_ind, + field_by_sens=field_by_sens, colorsequence=colorsequence, rc_params=rc_params, supports_colorgradient=supports_colorgradient, @@ -985,8 +1004,6 @@ def get_frames( style_kwargs=style_kwargs, **kwargs, ) - if frame_ind == 0: # get the dipoles and sensors autosize from first frame - rc_params = rc_params_temp frames.append( { "data": traces, From dbe9151ce1ac9ce326915a3e8d4e6ed7b4031d4b Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sat, 15 Jun 2024 02:34:47 +0200 Subject: [PATCH 069/211] pylint + tests --- magpylib/_src/display/traces_generic.py | 3 ++- tests/test_obj_BaseGeo.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index a83dcebb5..33ce06150 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -590,6 +590,7 @@ def get_traces_func(**extra_kwargs): path_traces_generic = [] for trg in traces_generic: temp_rot_traces = [] + name, name_suff = "", None for ind, path_ind in enumerate(path_inds): pos_orient_ind = max_pos_ind if path_ind > max_pos_ind else path_ind pos, orient = positions[pos_orient_ind], orientations[pos_orient_ind] @@ -837,7 +838,7 @@ def get_sensor_pixel_field(objects, styles): field_by_sens[sens] = {} csrc = csrc if csrc else vsrc vrsc = vsrc if vsrc else csrc[0] - for field in {vrsc, csrc[0]}: + for field in tuple({vrsc, csrc[0]}): if not has_pix_field: sources = format_obj_input(objects, allow="sources") sources = list(set(sources)) # remove duplicates diff --git a/tests/test_obj_BaseGeo.py b/tests/test_obj_BaseGeo.py index 265f91474..704301d41 100644 --- a/tests/test_obj_BaseGeo.py +++ b/tests/test_obj_BaseGeo.py @@ -555,8 +555,8 @@ def test_describe_with_exclude_None(): " legend=Legend(show=None, text=None), model3d=Model3d(data=[], showdefault=True)," " opacity=None, path=Path(frames=None, line=Line(color=None, style=None, width=None)," " marker=Marker(color=None, size=None, symbol=None), numbering=None, show=None)," - " pixel=Pixel(color=None, size=1, sizemode=None, symbol=None), size=None," - " sizemode=None)" + " pixel=Pixel(color=None, field=PixelField(colorsource=None, shownull=None, symbol=None," + " vectorsource=None), size=1, sizemode=None, symbol=None), size=None, sizemode=None)" ), ] match_string_up_to_id(test, x.describe(exclude=None, return_string=True)) From 0d09514a001c2e6debd70c4f2ea9bb9043d753cf Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sun, 16 Jun 2024 14:54:59 +0200 Subject: [PATCH 070/211] pylint --- tests/test_obj_BaseGeo.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_obj_BaseGeo.py b/tests/test_obj_BaseGeo.py index 704301d41..45787ac3c 100644 --- a/tests/test_obj_BaseGeo.py +++ b/tests/test_obj_BaseGeo.py @@ -555,8 +555,9 @@ def test_describe_with_exclude_None(): " legend=Legend(show=None, text=None), model3d=Model3d(data=[], showdefault=True)," " opacity=None, path=Path(frames=None, line=Line(color=None, style=None, width=None)," " marker=Marker(color=None, size=None, symbol=None), numbering=None, show=None)," - " pixel=Pixel(color=None, field=PixelField(colorsource=None, shownull=None, symbol=None," - " vectorsource=None), size=1, sizemode=None, symbol=None), size=None, sizemode=None)" + " pixel=Pixel(color=None, field=PixelField(colorsource=None, shownull=None," + " symbol=None, vectorsource=None), size=1, sizemode=None, symbol=None)," + " size=None, sizemode=None)" ), ] match_string_up_to_id(test, x.describe(exclude=None, return_string=True)) From fc37c6f4ce1b79bc0860fef1026c75ae67946dc7 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sun, 16 Jun 2024 23:34:36 +0200 Subject: [PATCH 071/211] refactor --- magpylib/_src/display/display.py | 12 +- magpylib/_src/display/traces_generic.py | 269 +++++++++++------------- magpylib/_src/utility.py | 21 +- 3 files changed, 137 insertions(+), 165 deletions(-) diff --git a/magpylib/_src/display/display.py b/magpylib/_src/display/display.py index e3f7445d3..b308f9f94 100644 --- a/magpylib/_src/display/display.py +++ b/magpylib/_src/display/display.py @@ -12,7 +12,6 @@ from magpylib._src.display.traces_generic import MagpyMarkers from magpylib._src.display.traces_generic import get_frames from magpylib._src.display.traces_utility import DEFAULT_ROW_COL_PARAMS -from magpylib._src.display.traces_utility import linearize_dict from magpylib._src.display.traces_utility import process_show_input_objs from magpylib._src.input_checks import check_format_input_backend from magpylib._src.input_checks import check_format_input_vector @@ -86,15 +85,9 @@ def show( display_kwargs = { k: v for k, v in kwargs.items() - if any(k.startswith(arg) for arg in disp_args - {"style"}) - } - style_kwargs = {k: v for k, v in kwargs.items() if k.startswith("style")} - style_kwargs = linearize_dict(style_kwargs, separator="_") - kwargs = { - k: v - for k, v in kwargs.items() - if (k not in display_kwargs and k not in style_kwargs) + if any(k.startswith(arg) for arg in disp_args) } + kwargs = {k: v for k, v in kwargs.items() if k not in display_kwargs} backend_kwargs = { k[len(backend) + 1 :]: v for k, v in kwargs.items() @@ -124,7 +117,6 @@ def show( supports_colorgradient=self.supports["colorgradient"], backend=backend, title=title, - style_kwargs=style_kwargs, **display_kwargs, ) return self.show_func( diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index 33ce06150..4884d7b43 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -259,7 +259,6 @@ def get_traces_2D( sumup=True, pixel_agg=None, in_out="auto", - styles=None, units_polarization="T", units_magnetization="A/m", # pylint: disable=unused-argument @@ -323,8 +322,7 @@ def get_traces_2D( def get_focus_inds(*objs): focus_inds = [] for obj in objs: - style = styles.get(obj, obj.style) - frames = style.path.frames + frames = obj.style.path.frames inds = [] if frames is None else frames if isinstance(inds, numbers.Number): # pylint: disable=invalid-unary-operand-type @@ -342,10 +340,8 @@ def get_obj_list_str(objs): return obj_lst_str def get_label_and_color(obj): - style = styles.get(obj, None) - style = obj.style if style is None else style - label = get_legend_label(obj, style=style) - color = getattr(style, "color", None) + label = get_legend_label(obj) + color = getattr(obj.style, "color", None) return label, color obj_lst_str = { @@ -696,8 +692,11 @@ def clean_legendgroups(frames, clean_2d=False): def process_animation_kwargs(obj_list, animation=False, **kwargs): - """Update animation kwargs""" - flat_obj_list = format_obj_input(obj_list) + """Extract animation kwargs and make sure the number of frames does not exceed + the max frames and max frame rate, downsample if necessary + """ + obj_list_semi_flat = format_obj_input(obj_list, allow="sources+sensors+collections") + flat_obj_list = format_obj_input(obj_list_semi_flat) # set animation and animation_time if isinstance(animation, numbers.Number) and not isinstance(animation, bool): kwargs["animation_time"] = animation @@ -715,8 +714,13 @@ def process_animation_kwargs(obj_list, animation=False, **kwargs): anim_def = default_settings.display.animation.copy() anim_def.update({k[10:]: v for k, v in kwargs.items()}, _match_properties=False) animation_kwargs = {f"animation_{k}": v for k, v in anim_def.as_dict().items()} - kwargs = {k: v for k, v in kwargs.items() if not k.startswith("animation")} - return kwargs, animation, animation_kwargs + + path_indices, path_digits, frame_duration = [-1], 0, 0 + if animation: + path_indices, path_digits, frame_duration = extract_animation_properties( + obj_list_semi_flat, **animation_kwargs + ) + return animation, path_indices, path_digits, frame_duration def extract_animation_properties( @@ -770,7 +774,7 @@ def extract_animation_properties( # calculate exponent of last frame index to avoid digit shift in # frame number display during animation - exp = ( + path_digits = ( np.log10(path_indices.max()).astype(int) + 1 if path_indices.ndim != 0 and path_indices.max() > 0 else 1 @@ -786,7 +790,7 @@ def extract_animation_properties( "`magpylib.defaults.display.animation.maxframes`" ) - return path_indices, exp, frame_duration + return path_indices, path_digits, frame_duration def get_traces_3D(flat_objs_props, extra_backend=False, autosize=None, **kwargs): @@ -804,21 +808,21 @@ def get_traces_3D(flat_objs_props, extra_backend=False, autosize=None, **kwargs) traces_dict[obj] = [{"x": x, "y": y, "z": z, "_autosize": True, **rc_dict}] else: traces_dict[obj] = [] - with style_temp_edit(obj, style_temp=params.pop("style", None), copy=True): - out_traces = get_generic_traces3D( - obj, - extra_backend=extra_backend, - autosize=autosize, - field_array=field_by_sens.get(obj, None), - **params, - ) - if extra_backend: - extra_backend_traces.extend(out_traces.get(extra_backend, [])) - traces_dict[obj].extend(out_traces["generic"]) + params.pop("style", None) + out_traces = get_generic_traces3D( + obj, + extra_backend=extra_backend, + autosize=autosize, + field_array=field_by_sens.get(obj, None), + **params, + ) + if extra_backend: + extra_backend_traces.extend(out_traces.get(extra_backend, [])) + traces_dict[obj].extend(out_traces["generic"]) return traces_dict, extra_backend_traces -def get_sensor_pixel_field(objects, styles): +def get_sensor_pixel_field(objects): """get field_by_sens if sensor has style pixel field""" # pylint: disable=import-outside-toplevel from magpylib._src.fields.field_wrap_BH import getBH_level2 @@ -832,8 +836,8 @@ def get_sensor_pixel_field(objects, styles): ] has_pix_field = False for sens in sensors: - vsrc = styles[sens].pixel.field.vectorsource - csrc = styles[sens].pixel.field.colorsource + vsrc = sens.style.pixel.field.vectorsource + csrc = sens.style.pixel.field.colorsource if vsrc or csrc: field_by_sens[sens] = {} csrc = csrc if csrc else vsrc @@ -862,9 +866,7 @@ def get_sensor_pixel_field(objects, styles): return field_by_sens -def draw_frame( - objs, *, field_by_sens, colorsequence, rc_params, style_kwargs, **kwargs -) -> Tuple: +def draw_frame(objs, *, rc_params, style_kwargs, **kwargs) -> Tuple: """ Creates traces from input `objs` and provided parameters, updates the size of objects like Sensors and Dipoles in `kwargs` depending on the canvas size. @@ -874,95 +876,77 @@ def draw_frame( traces_dicts, kwargs: dict, dict returns the traces in a obj/traces_list dictionary and updated kwargs """ - if colorsequence is None: - # pylint: disable=no-member - colorsequence = default_settings.display.colorsequence # dipoles and sensors use autosize, the trace building has to be put at the back of the queue. # autosize is calculated from the other traces overall scene range - objs_rc = get_objects_props_by_row_col( - *objs, - colorsequence=colorsequence, - style_kwargs=style_kwargs, - ) + style_kwargs = {k[6:]: v for k, v in style_kwargs.items() if k.startswith("style_")} + if style_kwargs: + for obj in objs["objects"]: + obj.style.update(style_kwargs) - styles = { - obj: params.get("style", None) - for o_rc in objs_rc.values() - for obj, params in o_rc["objects"].items() - } - if field_by_sens is None: - field_by_sens = get_sensor_pixel_field( - [obj for props in objs_rc.values() for obj in props["objects"]], - styles, - ) - kwargs["field_by_sens"] = field_by_sens traces_dict = {} extra_backend_traces = [] rc_params = {} if rc_params is None else rc_params - for rc, props in objs_rc.items(): - if props["rc_params"]["output"] == "model3d": - rc_params[rc] = rc_params.get(rc, {}) - rc_params[rc]["units_length"] = props["rc_params"]["units_length"] - rc_keys = ("row", "col") - rc_kwargs = {k: v for k, v in props["rc_params"].items() if k in rc_keys} - traces_d1, traces_ex1 = get_traces_3D( - props["objects"], - **rc_kwargs, - **kwargs, - ) - rc_params[rc]["autosize"] = rc_params.get(rc, {}).get("autosize", None) - if rc_params[rc]["autosize"] is None: - # get the dipoles and sensors autosize from first frame - # rc_params gets returned and passed back to the function - zoom = rc_params[rc]["zoom"] = props["rc_params"]["zoom"] - traces = [t for tr in traces_d1.values() for t in tr] - ranges_rc = get_scene_ranges(*traces, *traces_ex1, zoom=zoom) - # pylint: disable=no-member - factor = default_settings.display.autosizefactor - rc_params[rc]["autosize"] = np.mean(np.diff(ranges_rc[rc])) / factor - to_resize_keys = { - k for k, v in traces_d1.items() if v and "_autosize" in v[0] - } - flat_objs_props = { - k: v for k, v in props["objects"].items() if k in to_resize_keys - } - traces_d2, traces_ex2 = get_traces_3D( - flat_objs_props, - autosize=rc_params[rc]["autosize"], - **rc_kwargs, - **kwargs, - ) - traces_dict.update( - {(k, *rc): v for k, v in {**traces_d1, **traces_d2}.items()} - ) - extra_backend_traces.extend([*traces_ex1, *traces_ex2]) + rc = objs["rc_params"]["row"], objs["rc_params"]["col"] + rc_params["units_length"] = objs["rc_params"]["units_length"] + rc_keys = ("row", "col") + kwargs.update({k: v for k, v in objs["rc_params"].items() if k in rc_keys}) + if objs["rc_params"]["output"] == "model3d": + traces_d1, traces_ex1 = get_traces_3D(objs["objects"], **kwargs) + rc_params["autosize"] = rc_params.get("autosize", None) + if rc_params["autosize"] is None: + # get the dipoles and sensors autosize from first frame + # rc_params gets returned and passed back to the function + zoom = rc_params["zoom"] = objs["rc_params"]["zoom"] + traces = [t for tr in traces_d1.values() for t in tr] + ranges_rc = get_scene_ranges(*traces, *traces_ex1, zoom=zoom) + # pylint: disable=no-member + factor = default_settings.display.autosizefactor + rc_params["autosize"] = np.mean(np.diff(ranges_rc[rc])) / factor + to_resize_keys = {k for k, v in traces_d1.items() if v and "_autosize" in v[0]} + flat_objs_props = { + k: v for k, v in objs["objects"].items() if k in to_resize_keys + } + traces_d2, traces_ex2 = get_traces_3D( + flat_objs_props, autosize=rc_params["autosize"], **kwargs + ) + traces_dict.update({**traces_d1, **traces_d2}) + extra_backend_traces.extend([*traces_ex1, *traces_ex2]) traces = group_traces(*[t for tr in traces_dict.values() for t in tr]) - for props in objs_rc.values(): - if props["rc_params"]["output"] != "model3d": - traces2d = get_traces_2D( - *props["objects"], - **props["rc_params"], - styles=styles, - ) - traces.extend(traces2d) - return traces, extra_backend_traces, rc_params, field_by_sens + if objs["rc_params"]["output"] != "model3d": + traces2d = get_traces_2D( + *objs["objects"], + **objs["rc_params"], + ) + traces.extend(traces2d) + return traces, extra_backend_traces, rc_params -def get_frames( - objs, - colorsequence=None, - title=None, - animation=False, - supports_colorgradient=True, - backend="generic", - style_kwargs=None, - **kwargs, -): +def get_frames(objs, *, title, supports_colorgradient, backend, **kwargs): """This is a helper function which generates frames with generic traces to be provided to the chosen backend. According to a certain zoom level, all three space direction will be equal and match the maximum of the ranges needed to display all objects, including their paths. """ + + # process all kwargs + # pylint: disable=no-member + colorsequence = kwargs.pop("colorsequence", default_settings.display.colorsequence) + + # extract style info + style_kwargs = {k: v for k, v in kwargs.items() if k.startswith("style")} + style_kwargs = linearize_dict(style_kwargs, separator="_") + kwargs = {k: v for k, v in kwargs.items() if not k.startswith("style")} + + # extract animation info + animation_kwargs = {k: v for k, v in kwargs.items() if k.startswith("animation")} + is_animation, path_indices, path_digits, frame_duration = process_animation_kwargs( + [o for obj in objs for o in obj["objects"]], **animation_kwargs + ) + kwargs = {k: v for k, v in kwargs.items() if not k.startswith("animation")} + + if kwargs: + raise TypeError(f"`show` got unexpected keyword argument(s) {kwargs!r}") + # infer title if necessary if objs: style = objs[0]["objects"][0].style @@ -971,55 +955,46 @@ def get_frames( else: title = "No objects to be displayed" - # make sure the number of frames does not exceed the max frames and max frame rate - # downsample if necessary - obj_list_semi_flat = format_obj_input( - [o["objects"] for o in objs], allow="sources+sensors+collections" - ) - kwargs, animation, animation_kwargs = process_animation_kwargs( - obj_list_semi_flat, animation=animation, **kwargs + objs_rc = get_objects_props_by_row_col( + *objs, + colorsequence=colorsequence, + style_kwargs=style_kwargs, ) - path_indices = [-1] - if animation: - path_indices, exp, frame_duration = extract_animation_properties( - obj_list_semi_flat, **animation_kwargs - ) # create frame for each path index or downsampled path index - frames = [] + style_kwargs = {} title_str = title - field_by_sens = None - rc_params = None - for path_ind in path_indices: - extra_backend_traces = [] - if animation: - style_kwargs["style_path_frames"] = [path_ind] - title = "Animation 3D - " if title is None else title - title_str = f"""{title}path index: {path_ind+1:0{exp}d}""" - traces, extra_backend_traces, rc_params, field_by_sens = draw_frame( - objs, - field_by_sens=field_by_sens, - colorsequence=colorsequence, - rc_params=rc_params, - supports_colorgradient=supports_colorgradient, - extra_backend=backend, - style_kwargs=style_kwargs, - **kwargs, - ) - frames.append( - { - "data": traces, - "name": str(path_ind + 1), - "layout": {"title": title_str}, - "extra_backend_traces": extra_backend_traces, - } - ) + frames = [{"name": str(path_ind + 1)} for path_ind in path_indices] + for rc, objs in objs_rc.items(): + styles = {obj: prop["style"] for obj, prop in objs["objects"].items()} + rc_params = None + with style_temp_edit(*styles, styles_temp=styles): + field_by_sens = get_sensor_pixel_field([o for o in objs["objects"]]) + for frame, path_ind in zip(frames, path_indices): + if is_animation: + style_kwargs["style_path_frames"] = [path_ind] + title = "Animation 3D - " if title is None else title + title_str = f"""{title}path index: {path_ind+1:0{path_digits}d}""" + traces, extra_backend_traces, rc_params = draw_frame( + objs, + field_by_sens=field_by_sens, + rc_params=rc_params, + supports_colorgradient=supports_colorgradient, + extra_backend=backend, + style_kwargs=style_kwargs, + ) + frame.setdefault("data", []).extend(traces) + frame.setdefault("extra_backend_traces", []).extend( + extra_backend_traces + ) + frame["layout"] = {"title": title_str} clean_legendgroups(frames) traces = [t for frame in frames for t in frame["data"]] - zoom = {rc: v["zoom"] for rc, v in rc_params.items()} + zoom = {rc: v["rc_params"]["zoom"] for rc, v in objs_rc.items()} ranges_rc = get_scene_ranges(*traces, *extra_backend_traces, zoom=zoom) labels_rc = {(1, 1): {k: "" for k in "xyz"}} scale_factors_rc = {} - for rc, params in rc_params.items(): + for rc, objs in objs_rc.items(): + params = objs["rc_params"] units_length = params["units_length"] if units_length == "auto": rmax = np.amax(np.abs(ranges_rc[rc])) @@ -1039,7 +1014,7 @@ def get_frames( "labels": labels_rc, "input_kwargs": {**kwargs, **animation_kwargs}, } - if animation: + if is_animation: out.update( { "frame_duration": frame_duration, diff --git a/magpylib/_src/utility.py b/magpylib/_src/utility.py index 89a24fcff..cd03fbc69 100644 --- a/magpylib/_src/utility.py +++ b/magpylib/_src/utility.py @@ -497,16 +497,21 @@ def merge_dicts_with_conflict_check(objs, *, target, identifiers, unique_fields) @contextmanager -def style_temp_edit(obj, style_temp, copy=True): +def style_temp_edit(*objs, styles_temp=None): """Temporary replace style to allow edits before returning to original state""" # pylint: disable=protected-access - orig_style = getattr(obj, "_style", None) + styles_temp = {} if styles_temp is None else styles_temp + orig_styles = {} try: - # temporary replace style attribute - obj._style = style_temp - if style_temp and copy: - # deepcopy style only if obj is in multiple subplots. - obj._style = style_temp.copy() + for obj in objs: + style_temp = styles_temp.get(obj, None) + orig_styles[obj] = getattr(obj, "_style", None) + # temporary save original style + if orig_styles[obj] is not None: + orig_styles[obj] = obj._style.copy() + if style_temp is not None: + obj._style = style_temp yield finally: - obj._style = orig_style + for obj in objs: + obj._style = orig_styles[obj] From d8ba1b836a7fe4ead6ea0a79c53131744125b7ed Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sun, 16 Jun 2024 23:59:56 +0200 Subject: [PATCH 072/211] fix animation kwargs --- magpylib/_src/display/traces_generic.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index 4884d7b43..0c56f8ef0 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -720,7 +720,7 @@ def process_animation_kwargs(obj_list, animation=False, **kwargs): path_indices, path_digits, frame_duration = extract_animation_properties( obj_list_semi_flat, **animation_kwargs ) - return animation, path_indices, path_digits, frame_duration + return animation, path_indices, path_digits, frame_duration, animation_kwargs def extract_animation_properties( @@ -938,9 +938,8 @@ def get_frames(objs, *, title, supports_colorgradient, backend, **kwargs): kwargs = {k: v for k, v in kwargs.items() if not k.startswith("style")} # extract animation info - animation_kwargs = {k: v for k, v in kwargs.items() if k.startswith("animation")} - is_animation, path_indices, path_digits, frame_duration = process_animation_kwargs( - [o for obj in objs for o in obj["objects"]], **animation_kwargs + is_animation, path_indices, path_digits, frame_duration, animation_kwargs = ( + process_animation_kwargs([o for obj in objs for o in obj["objects"]], **kwargs) ) kwargs = {k: v for k, v in kwargs.items() if not k.startswith("animation")} From 80dad375ce4b8a75ab034a428fc4c46198bd62ad Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Mon, 17 Jun 2024 00:09:14 +0200 Subject: [PATCH 073/211] fix focus ind --- magpylib/_src/display/traces_generic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index 0c56f8ef0..d1bc380ac 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -222,7 +222,7 @@ def get_trace2D_dict( else: y = np.linalg.norm(y, axis=0) marker_size = np.array([3] * len(frames_indices)) - marker_size[focus_inds] = 15 + marker_size[np.clip(focus_inds, 0, len(marker_size) - 1)] = 15 title = f"{field_str}{''.join(coords_str)}" unit = ( units_polarization From 37e612a19bc0da85331185909581857465fa959b Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Mon, 17 Jun 2024 00:19:13 +0200 Subject: [PATCH 074/211] fix empty show --- magpylib/_src/display/traces_generic.py | 34 +++++++++++++++++-------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index d1bc380ac..b57bed672 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -938,9 +938,13 @@ def get_frames(objs, *, title, supports_colorgradient, backend, **kwargs): kwargs = {k: v for k, v in kwargs.items() if not k.startswith("style")} # extract animation info - is_animation, path_indices, path_digits, frame_duration, animation_kwargs = ( - process_animation_kwargs([o for obj in objs for o in obj["objects"]], **kwargs) - ) + ( + is_animation, + path_indices, + path_digits, + frame_duration, + animation_kwargs, + ) = process_animation_kwargs([o for obj in objs for o in obj["objects"]], **kwargs) kwargs = {k: v for k, v in kwargs.items() if not k.startswith("animation")} if kwargs: @@ -962,7 +966,15 @@ def get_frames(objs, *, title, supports_colorgradient, backend, **kwargs): # create frame for each path index or downsampled path index style_kwargs = {} title_str = title - frames = [{"name": str(path_ind + 1)} for path_ind in path_indices] + frames = [ + { + "name": str(path_ind + 1), + "data": [], + "extra_backend_traces": [], + "layout": {}, + } + for path_ind in path_indices + ] for rc, objs in objs_rc.items(): styles = {obj: prop["style"] for obj, prop in objs["objects"].items()} rc_params = None @@ -981,15 +993,17 @@ def get_frames(objs, *, title, supports_colorgradient, backend, **kwargs): extra_backend=backend, style_kwargs=style_kwargs, ) - frame.setdefault("data", []).extend(traces) - frame.setdefault("extra_backend_traces", []).extend( - extra_backend_traces - ) + frame["data"].extend(traces) + frame["extra_backend_traces"].extend(extra_backend_traces) frame["layout"] = {"title": title_str} clean_legendgroups(frames) - traces = [t for frame in frames for t in frame["data"]] + all_traces = [ + t + for frame in frames + for t in chain(frame["data"], frame["extra_backend_traces"]) + ] zoom = {rc: v["rc_params"]["zoom"] for rc, v in objs_rc.items()} - ranges_rc = get_scene_ranges(*traces, *extra_backend_traces, zoom=zoom) + ranges_rc = get_scene_ranges(*all_traces, zoom=zoom) labels_rc = {(1, 1): {k: "" for k in "xyz"}} scale_factors_rc = {} for rc, objs in objs_rc.items(): From fcf5eedc2603672f0da6528169528a4d590ea83a Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Mon, 17 Jun 2024 00:29:44 +0200 Subject: [PATCH 075/211] pylint --- magpylib/_src/display/traces_generic.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index b57bed672..6997d207f 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -975,18 +975,18 @@ def get_frames(objs, *, title, supports_colorgradient, backend, **kwargs): } for path_ind in path_indices ] - for rc, objs in objs_rc.items(): - styles = {obj: prop["style"] for obj, prop in objs["objects"].items()} + for rc, props in objs_rc.items(): + styles = {obj: prop["style"] for obj, prop in props["objects"].items()} rc_params = None with style_temp_edit(*styles, styles_temp=styles): - field_by_sens = get_sensor_pixel_field([o for o in objs["objects"]]) + field_by_sens = get_sensor_pixel_field(list(props["objects"])) for frame, path_ind in zip(frames, path_indices): if is_animation: style_kwargs["style_path_frames"] = [path_ind] title = "Animation 3D - " if title is None else title title_str = f"""{title}path index: {path_ind+1:0{path_digits}d}""" traces, extra_backend_traces, rc_params = draw_frame( - objs, + props, field_by_sens=field_by_sens, rc_params=rc_params, supports_colorgradient=supports_colorgradient, @@ -1006,8 +1006,8 @@ def get_frames(objs, *, title, supports_colorgradient, backend, **kwargs): ranges_rc = get_scene_ranges(*all_traces, zoom=zoom) labels_rc = {(1, 1): {k: "" for k in "xyz"}} scale_factors_rc = {} - for rc, objs in objs_rc.items(): - params = objs["rc_params"] + for rc, props in objs_rc.items(): + params = props["rc_params"] units_length = params["units_length"] if units_length == "auto": rmax = np.amax(np.abs(ranges_rc[rc])) From 734bcf058a694f4d779cf65d851cf953955ffc99 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Mon, 17 Jun 2024 17:48:37 +0200 Subject: [PATCH 076/211] add arrow2d and pixel symbols --- magpylib/_src/defaults/defaults_values.py | 2 +- magpylib/_src/display/traces_base.py | 51 ++++++------ magpylib/_src/display/traces_core.py | 96 ++++++++++++++++------- magpylib/_src/display/traces_generic.py | 10 +-- magpylib/_src/display/traces_utility.py | 33 ++++++++ magpylib/_src/style.py | 4 +- 6 files changed, 136 insertions(+), 60 deletions(-) diff --git a/magpylib/_src/defaults/defaults_values.py b/magpylib/_src/defaults/defaults_values.py index 8a6e674ba..a5f8e4105 100644 --- a/magpylib/_src/defaults/defaults_values.py +++ b/magpylib/_src/defaults/defaults_values.py @@ -94,7 +94,7 @@ "size": 1, "sizemode": "scaled", "color": None, - "symbol": "o", + "symbol": None, "field": { "symbol": "cone", "vectorsource": None, diff --git a/magpylib/_src/display/traces_base.py b/magpylib/_src/display/traces_base.py index baa4e4115..a256642ca 100644 --- a/magpylib/_src/display/traces_base.py +++ b/magpylib/_src/display/traces_base.py @@ -5,6 +5,7 @@ import numpy as np from scipy.spatial import ConvexHull # pylint: disable=no-name-in-module +from magpylib._src.display.traces_utility import draw_zarrow from magpylib._src.display.traces_utility import merge_mesh3d from magpylib._src.display.traces_utility import place_and_orient_model3d from magpylib._src.fields.field_BH_tetrahedron import check_chirality @@ -41,7 +42,7 @@ def get_model(trace, *, backend, show, scale, kwargs): ) model["kwargs"].update(kwargs) if backend == "plotly-dict": - model = {"type": "mesh3d", **model["kwargs"]} + model = model["kwargs"] else: model["backend"] = backend model["kwargs"].pop("type", None) @@ -94,6 +95,7 @@ def make_Cuboid( """ dimension = np.array(dimension, dtype=float) trace = { + "type": "mesh3d", "i": np.array([7, 0, 0, 0, 4, 4, 2, 6, 4, 0, 3, 7]), "j": np.array([0, 7, 1, 2, 6, 7, 1, 2, 5, 5, 2, 2]), "k": np.array([3, 4, 2, 3, 5, 6, 5, 5, 0, 1, 7, 6]), @@ -191,7 +193,7 @@ def make_Prism( k = np.concatenate([k1, j2, j3, k4]) x, y, z = c.T - trace = {"x": x, "y": y, "z": z, "i": i, "j": j, "k": k} + trace = {"type": "mesh3d", "x": x, "y": y, "z": z, "i": i, "j": j, "k": k} trace = place_and_orient_model3d(trace, orientation=orientation, position=position) return get_model(trace, backend=backend, show=show, scale=scale, kwargs=kwargs) @@ -281,7 +283,7 @@ def make_Ellipsoid( j = np.concatenate([j1, j2, j3, j4]) k = np.concatenate([k1, k2, k3, k4]) - trace = {"x": x, "y": y, "z": z, "i": i, "j": j, "k": k} + trace = {"type": "mesh3d", "x": x, "y": y, "z": z, "i": i, "j": j, "k": k} trace = place_and_orient_model3d(trace, orientation=orientation, position=position) return get_model(trace, backend=backend, show=show, scale=scale, kwargs=kwargs) @@ -381,7 +383,7 @@ def make_CylinderSegment( k.extend([j5, j5 + N - 1]) i, j, k = (np.hstack(l) for l in (i, j, k)) - trace = {"x": x, "y": y, "z": z, "i": i, "j": j, "k": k} + trace = {"type": "mesh3d", "x": x, "y": y, "z": z, "i": i, "j": j, "k": k} trace = place_and_orient_model3d(trace, orientation=orientation, position=position) return get_model(trace, backend=backend, show=show, scale=scale, kwargs=kwargs) @@ -462,7 +464,7 @@ def make_Pyramid( j = i + 1 j[-1] = 0 k = np.array([N] * N, dtype=int) - trace = {"x": x, "y": y, "z": z, "i": i, "j": j, "k": k} + trace = {"type": "mesh3d", "x": x, "y": y, "z": z, "i": i, "j": j, "k": k} trace = place_and_orient_model3d(trace, orientation=orientation, position=position) return get_model(trace, backend=backend, show=show, scale=scale, kwargs=kwargs) @@ -533,21 +535,26 @@ def make_Arrow( "middle": 0, } z = validate_pivot(pivot, pivot_conditions) - cone = make_Pyramid( - backend="plotly-dict", - base=base, - diameter=d, - height=d, - position=(0, 0, z + h / 2 - d / 2), - ) - prism = make_Prism( - backend="plotly-dict", - base=base, - diameter=d / 2, - height=h - d, - position=(0, 0, z + -d / 2), - ) - trace = merge_mesh3d(cone, prism) + ttype = kwargs.pop("type", "mesh3d") + if ttype == "mesh3d": + cone = make_Pyramid( + backend="plotly-dict", + base=base, + diameter=d, + height=d, + position=(0, 0, z + h / 2 - d / 2), + ) + prism = make_Prism( + backend="plotly-dict", + base=base, + diameter=d / 2, + height=h - d, + position=(0, 0, z + -d / 2), + ) + trace = merge_mesh3d(cone, prism) + else: + x, y, z = draw_zarrow(height=h, diameter=diameter, pivot=pivot).T + trace = {"type": "scatter3d", "x": x, "y": y, "z": z, "mode": "lines"} trace = place_and_orient_model3d(trace, orientation=orientation, position=position) return get_model(trace, backend=backend, show=show, scale=scale, kwargs=kwargs) @@ -600,7 +607,7 @@ def make_Tetrahedron( # create triangles implying right vertices chirality triangles = np.array([[0, 2, 1], [0, 3, 2], [1, 3, 0], [1, 2, 3]]) points = check_chirality(np.array([vertices]))[0] - trace = dict(zip("xyzijk", [*points.T, *triangles.T])) + trace = {"type": "mesh3d", **dict(zip("xyzijk", [*points.T, *triangles.T]))} trace = place_and_orient_model3d(trace, orientation=orientation, position=position) return get_model(trace, backend=backend, show=show, scale=scale, kwargs=kwargs) @@ -662,6 +669,6 @@ def make_TriangularMesh( hull = ConvexHull(vertices) faces = hull.simplices i, j, k = np.array(faces).T - trace = {"x": x, "y": y, "z": z, "i": i, "j": j, "k": k} + trace = {"type": "mesh3d", "x": x, "y": y, "z": z, "i": i, "j": j, "k": k} trace = place_and_orient_model3d(trace, orientation=orientation, position=position) return get_model(trace, backend=backend, show=show, scale=scale, kwargs=kwargs) diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index c74845fba..47ae34aa6 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -36,6 +36,7 @@ from magpylib._src.display.traces_utility import get_hexcolors_from_scale from magpylib._src.display.traces_utility import get_legend_label from magpylib._src.display.traces_utility import get_orientation_from_vec +from magpylib._src.display.traces_utility import group_traces from magpylib._src.display.traces_utility import merge_mesh3d from magpylib._src.display.traces_utility import place_and_orient_model3d from magpylib._src.display.traces_utility import triangles_area @@ -530,6 +531,7 @@ def make_Pixels( vectors, colors, symbol, + field_symbol, shownull, size, null_thresh=1e-12, @@ -547,33 +549,46 @@ def make_Pixels( pixels.append(pix) else: orientations = get_orientation_from_vec(vectors) + is_null_vec = (np.abs(vectors) < null_thresh).all(axis=1) for ind, (pos, orient) in enumerate(zip(positions, orientations)): kw = {"backend": "plotly-dict", "position": pos} - is_null_vec = (np.abs(vectors[ind]) < null_thresh).all() pix = None - if is_null_vec: + if is_null_vec[ind]: if shownull: - pix = make_BaseCuboid(dimension=[size] * 3, **kw) + if field_symbol == "arrow2d": + x, y, z = pos.T + coords = {"x": x, "y": y, "z": z} + pix = {"type": "scatter3d", "mode": "markers", **coords} + pix["marker_symbol"] = symbol + pix["marker_size"] = 2 + else: + pix = make_BaseCuboid(dimension=[size] * 3, **kw) else: kw.update(orientation=orient, base=5, diameter=size, height=size * 2) - if symbol == "cone": + if field_symbol == "cone": pix = make_BasePyramid(**kw) - elif symbol == "arrow3d": - pix = make_BaseArrow(**kw) + elif field_symbol == "arrow3d": + pix = make_BaseArrow(**kw, type="mesh3d") + elif field_symbol == "arrow2d": + pix = make_BaseArrow(**kw, type="scatter3d") else: # pragma: no cover raise ValueError( "Invalid pixel field symbol (must be 'cone' or 'arrow3d')" - f", got {symbol!r}" + f", got {field_symbol!r}" ) if pix is not None: if colors is not None: - pix["facecolor"] = np.repeat(colors[ind], len(pix["i"])) + if field_symbol == "arrow2d": + pix["line_color"] = colors[ind] + pix["marker_color"] = colors[ind] + else: + pix["facecolor"] = np.repeat(colors[ind], len(pix["i"])) pixels.append(pix) - return merge_mesh3d(*pixels) + return group_traces(*pixels) def make_Sensor( - obj, *, autosize, path_ind=None, field_array, **kwargs + obj, *, autosize, path_ind=None, field_values, **kwargs ) -> Dict[str, Any]: """ Create the plotly mesh3d parameters for a Sensor object in a dictionary based on the @@ -585,7 +600,7 @@ def make_Sensor( distance between any pixel of the same sensor, equal to `size_pixel`. """ style = obj.style - show_hull = not bool(field_array) + show_hull = not bool(field_values) dimension = getattr(obj, "dimension", style.size) pixel = obj.pixel no_pix = pixel is None @@ -618,7 +633,7 @@ def make_Sensor( vertices /= 2 # sensor_mesh vertices are of length 2 x, y, z = vertices.T sensor.update(x=x, y=y, z=z) - meshes_to_merge = [sensor] + traces_to_merge = [sensor] if not no_pix: pixel_color = style.pixel.color pixel_size = style.pixel.size @@ -636,11 +651,11 @@ def make_Sensor( pixel_dim *= pixel_size poss = pixel[1:] if one_pix else pixel vectors, colors, null_thresh = None, None, 1e-12 - if field_array: + if field_values: vsrc = style.pixel.field.vectorsource csrc = style.pixel.field.colorsource if vsrc: - vectors = field_array[vsrc][path_ind] + vectors = field_values[vsrc][path_ind] # if csrc=="" -> show vectors but no color csrc = vsrc if csrc is None else csrc if csrc: @@ -648,25 +663,46 @@ def make_Sensor( field_str, *coords_str = csrc coords_str = coords_str if coords_str else "xyz" coords = list({"xyz".index(v) for v in coords_str if v in "xyz"}) - field_array = field_array[field_str][..., coords] + field_array = field_values[field_str][..., coords] field_mag = np.linalg.norm(field_array, axis=-1) cmin, cmax = np.amin(field_mag), np.amax(field_mag) field_mag = field_mag[path_ind] is_null = (np.abs(field_array[path_ind]) < null_thresh).all(axis=1) field_mag[is_null] = np.nan colors = get_hexcolors_from_scale(field_mag, min_=cmin, max_=cmax) - pixels_mesh = make_Pixels( - positions=poss, - vectors=vectors, - colors=colors, - size=pixel_dim, - symbol=style.pixel.field.symbol, - shownull=style.pixel.field.shownull, - null_thresh=null_thresh, - ) - if pixels_mesh.get("facecolor", None) is None: - pixels_mesh["facecolor"] = np.repeat(pixel_color, len(pixels_mesh["i"])) - meshes_to_merge.append(pixels_mesh) + if style.pixel.symbol is None or field_values: + pixels_traces = make_Pixels( + positions=poss, + vectors=vectors, + colors=colors, + size=pixel_dim, + symbol=style.pixel.symbol, + field_symbol=style.pixel.field.symbol, + shownull=style.pixel.field.shownull, + null_thresh=null_thresh, + ) + for tr in pixels_traces: + if ( + tr["type"].lower() == "mesh3d" + and tr.get("facecolor", None) is None + ): + tr["facecolor"] = np.repeat(pixel_color, len(tr["i"])) + else: + x, y, z = poss.T + pixels_traces = [ + { + "type": "scatter3d", + "mode": "markers", + "x": x, + "y": y, + "z": z, + "marker_symbol": style.pixel.symbol, + "marker_color": "black" if pixel_color is None else pixel_color, + "marker_size": 2, + } + ] + + traces_to_merge.extend(pixels_traces) if show_hull: hull_pos = 0.5 * (pixel.max(axis=0) + pixel.min(axis=0)) hull_dim[hull_dim == 0] = pixel_dim / 2 @@ -674,6 +710,6 @@ def make_Sensor( "plotly-dict", position=hull_pos, dimension=hull_dim ) hull_mesh["facecolor"] = np.repeat(style.color, len(hull_mesh["i"])) - meshes_to_merge.append(hull_mesh) - trace = merge_mesh3d(*meshes_to_merge) - return {**trace, **kwargs} + traces_to_merge.append(hull_mesh) + traces = group_traces(*traces_to_merge) + return [{**tr, **kwargs} for tr in traces] diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index 6997d207f..18bffaa40 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -447,7 +447,7 @@ def get_generic_traces3D( showlegend=None, supports_colorgradient=True, extra_backend=False, - field_array=None, + field_values=None, row=1, col=1, **kwargs, @@ -504,12 +504,12 @@ def make_func(*args, **kwargs): is_frame_dependent = False path_inds = path_inds_minimal = path_frames_to_indices(style.path.frames, path_len) if hasattr(style, "pixel"): - make_func_kwargs["field_array"] = field_array + make_func_kwargs["field_values"] = field_values vsrc = style.pixel.field.vectorsource csrc = style.pixel.field.colorsource - is_frame_dependent = (vsrc or csrc) and field_array + is_frame_dependent = (vsrc or csrc) and field_values if is_frame_dependent: - path_len = len(next(iter(field_array.values()))) + path_len = len(next(iter(field_values.values()))) path_inds = path_frames_to_indices(style.path.frames, path_len) path_traces_extra_non_generic_backend = [] @@ -813,7 +813,7 @@ def get_traces_3D(flat_objs_props, extra_backend=False, autosize=None, **kwargs) obj, extra_backend=extra_backend, autosize=autosize, - field_array=field_by_sens.get(obj, None), + field_values=field_by_sens.get(obj, None), **params, ) if extra_backend: diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index 87eb77071..b330fdc8f 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -196,6 +196,39 @@ def get_orientation_from_vec(vec, ref_axis=(0, 0, 1)): return RotScipy.from_rotvec(rotvec) +def draw_zarrow( + height=1.0, + diameter=0.1, + sign_offset=1.0, + sign=1, + pivot="middle", + include_line=True, +): + """Provides x,y,z coordinates of an arrow drawn in the x-z-plane (y=0) + centered in x,y,z=(0,0,0)""" + shift = sign_offset - 0.5 + hx = 0.6 * diameter + hz = np.sign(sign) * diameter + anchor = ( + (0, -0.5, 0) + if pivot == "tip" + else (0, 0.5, 0) if pivot == "tail" else (0, 0, 0) + ) + arrow = [ + [0, 0, shift], + [-hx, 0, shift - hz], + [0, 0, shift], + [hx, 0, shift - hz], + [0, 0, shift], + ] + if include_line: + arrow = [[0, 0, -0.5], *arrow, [0, 0, 0.5]] + else: + arrow = [[0, 0, -0.5], [np.nan] * 3, *arrow, [np.nan] * 3, [0, 0, 0.5]] + arrow = (np.array(arrow) + np.array(anchor)) * height + return arrow + + def draw_arrowed_line( vec, pos, diff --git a/magpylib/_src/style.py b/magpylib/_src/style.py index ff39e1e2e..28a495933 100644 --- a/magpylib/_src/style.py +++ b/magpylib/_src/style.py @@ -1662,11 +1662,11 @@ class PixelField(MagicProperties): shownull: bool, default=True Show/hide null or invalid field values - symbol: {"cone", "arrow3d"}: + symbol: {"cone", "arrow2d", "arrow3d"}: Orientation symbol for field vector. """ - _allowed_symbols = ("cone", "arrow3d") + _allowed_symbols = ("cone", "arrow2d", "arrow3d") _allowed_vectorsources = ("B", "H", "J", "M") @property From f7e775840476133d607d4ba537aaec0a7cdbe5f4 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Mon, 17 Jun 2024 22:24:56 +0200 Subject: [PATCH 077/211] refactor --- magpylib/_src/display/traces_core.py | 75 +++++++++++++--------------- 1 file changed, 35 insertions(+), 40 deletions(-) diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index 47ae34aa6..12a0830b8 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -541,49 +541,44 @@ def make_Pixels( For now, only "cube" shape is provided. """ pixels = [] - if vectors is None: - for ind, pos in enumerate(positions): - pix = make_BaseCuboid("plotly-dict", position=pos, dimension=[size] * 3) - if colors is not None: - pix["facecolor"] = np.repeat(colors[ind], len(pix["i"])) - pixels.append(pix) - else: + orientations = None + is_null_vec = None + if vectors is not None: orientations = get_orientation_from_vec(vectors) is_null_vec = (np.abs(vectors) < null_thresh).all(axis=1) - for ind, (pos, orient) in enumerate(zip(positions, orientations)): - kw = {"backend": "plotly-dict", "position": pos} - pix = None - if is_null_vec[ind]: - if shownull: - if field_symbol == "arrow2d": - x, y, z = pos.T - coords = {"x": x, "y": y, "z": z} - pix = {"type": "scatter3d", "mode": "markers", **coords} - pix["marker_symbol"] = symbol - pix["marker_size"] = 2 - else: - pix = make_BaseCuboid(dimension=[size] * 3, **kw) + for ind, pos in enumerate(positions): + kw = {"backend": "plotly-dict", "position": pos} + pix = None + if vectors is not None and not is_null_vec[ind]: + orient = orientations[ind] + kw.update(orientation=orient, base=5, diameter=size, height=size * 2) + if field_symbol == "cone": + pix = make_BasePyramid(**kw) + elif field_symbol == "arrow3d": + pix = make_BaseArrow(**kw, type="mesh3d") + elif field_symbol == "arrow2d": + pix = make_BaseArrow(**kw, type="scatter3d") + else: # pragma: no cover + raise ValueError( + "Invalid pixel field symbol (must be 'cone' or 'arrow3d')" + f", got {field_symbol!r}" + ) + elif vectors is None or shownull: + if field_symbol == "arrow2d": + x, y, z = pos.T + coords = {"x": x, "y": y, "z": z} + pix = {"type": "scatter3d", "mode": "markers", **coords} + pix["marker_symbol"] = symbol + pix["marker_size"] = 2 else: - kw.update(orientation=orient, base=5, diameter=size, height=size * 2) - if field_symbol == "cone": - pix = make_BasePyramid(**kw) - elif field_symbol == "arrow3d": - pix = make_BaseArrow(**kw, type="mesh3d") - elif field_symbol == "arrow2d": - pix = make_BaseArrow(**kw, type="scatter3d") - else: # pragma: no cover - raise ValueError( - "Invalid pixel field symbol (must be 'cone' or 'arrow3d')" - f", got {field_symbol!r}" - ) - if pix is not None: - if colors is not None: - if field_symbol == "arrow2d": - pix["line_color"] = colors[ind] - pix["marker_color"] = colors[ind] - else: - pix["facecolor"] = np.repeat(colors[ind], len(pix["i"])) - pixels.append(pix) + pix = make_BaseCuboid(dimension=[size] * 3, **kw) + if pix is not None: + if colors is not None: + if field_symbol == "arrow2d": + pix["line_color"] = colors[ind] + else: + pix["facecolor"] = np.repeat(colors[ind], len(pix["i"])) + pixels.append(pix) return group_traces(*pixels) From 3fa3c7414d43388234767959964467675aac2977 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 18 Jun 2024 01:01:24 +0200 Subject: [PATCH 078/211] fix arrow2d line merging --- magpylib/_src/display/backend_matplotlib.py | 24 ++++++++++------- magpylib/_src/display/backend_pyvista.py | 20 ++++++++------ magpylib/_src/display/traces_core.py | 2 +- magpylib/_src/display/traces_utility.py | 30 ++++++++++++++++++--- 4 files changed, 54 insertions(+), 22 deletions(-) diff --git a/magpylib/_src/display/backend_matplotlib.py b/magpylib/_src/display/backend_matplotlib.py index 206de393a..4cdbccf6e 100644 --- a/magpylib/_src/display/backend_matplotlib.py +++ b/magpylib/_src/display/backend_matplotlib.py @@ -13,6 +13,7 @@ from matplotlib import patches from matplotlib.animation import FuncAnimation +from magpylib._src.display.traces_utility import split_line_color_array from magpylib._src.display.traces_utility import subdivide_mesh_by_facecolor if os.getenv("MAGPYLIB_MPL_SVG") == "true": # pragma: no cover @@ -169,16 +170,19 @@ def generic_trace_to_matplotlib(trace, antialiased=True): "args": (*coords_s, txt), } ) - traces_mpl.append( - { - "constructor": "plot", - "args": coords, - "kwargs": { - **{k: v for k, v in props.items() if v is not None}, - "alpha": trace.get("opacity", 1), - }, - } - ) + line_colors = split_line_color_array(trace.get("line_color", None)) + for split in line_colors: + props["color"], inds = split + traces_mpl.append( + { + "constructor": "plot", + "args": coords[:, inds[0] : inds[1]], + "kwargs": { + **{k: v for k, v in props.items() if v is not None}, + "alpha": trace.get("opacity", 1), + }, + } + ) else: # pragma: no cover raise ValueError( f"Trace type {trace['type']!r} cannot be transformed into matplotlib trace" diff --git a/magpylib/_src/display/backend_pyvista.py b/magpylib/_src/display/backend_pyvista.py index 2776ff9b2..8ceee8ff3 100644 --- a/magpylib/_src/display/backend_pyvista.py +++ b/magpylib/_src/display/backend_pyvista.py @@ -19,6 +19,7 @@ from matplotlib.colors import LinearSegmentedColormap from pyvista.plotting.colors import Color # pylint: disable=import-error +from magpylib._src.display.traces_utility import split_line_color_array from magpylib._src.utility import open_animation # from magpylib._src.utility import format_obj_input @@ -124,14 +125,17 @@ def generic_trace_to_pyvista(trace): if trace["type"] == "scatter3d": points = np.array([trace[k] for k in "xyz"], dtype=float).T if "lines" in mode: - trace_pv_line = { - "type": "mesh", - "mesh": pv.lines_from_points(points), - "color": line_color, - "line_width": line_width, - "opacity": trace.get("opacity", None), - } - traces_pv.append(trace_pv_line) + line_colors = split_line_color_array(line_color) + for split in line_colors: + color, inds = split + trace_pv_line = { + "type": "mesh", + "mesh": pv.lines_from_points(points[inds[0] : inds[1]]), + "color": color, + "line_width": line_width, + "opacity": trace.get("opacity", None), + } + traces_pv.append(trace_pv_line) if "markers" in mode: trace_pv_marker = { "type": "mesh", diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index 12a0830b8..71e89e56f 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -575,7 +575,7 @@ def make_Pixels( if pix is not None: if colors is not None: if field_symbol == "arrow2d": - pix["line_color"] = colors[ind] + pix["line_color"] = np.repeat(colors[ind], len(pix["x"])) else: pix["facecolor"] = np.repeat(colors[ind], len(pix["i"])) pixels.append(pix) diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index b330fdc8f..afc344b1e 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -464,13 +464,17 @@ def merge_scatter3d(*traces): if not mode: traces[0]["mode"] = "markers" no_gap = "line" not in mode - + fill_values = {"x": None, "y": None, "z": None} + for k in ("marker_color", "line_color"): + if traces[0].get(k, None) is not None: + if isinstance(traces[0][k], (list, tuple, np.ndarray)): + fill_values[k] = "black" merged_trace = {} - for k in "xyz": + for k, fill_value in fill_values.items(): if no_gap: stack = [b[k] for b in traces] else: - stack = [pts for b in traces for pts in [[None], b[k]]] + stack = [pts for b in traces for pts in [[fill_value], b[k]]] merged_trace[k] = np.hstack(stack) for k, v in traces[0].items(): if k not in merged_trace: @@ -687,6 +691,9 @@ def group_traces(*traces): for k in [*common_keys, *spec_keys.get(tr["type"], [])]: if k == "facecolor": v = tr.get(k, None) is None + elif k in ("line_color", "marker_color"): + v = tr.get(k, None) + v = v if isinstance(v, str) else str(type(v)) else: v = tr.get(k, "") gr.append(str(v)) @@ -913,3 +920,20 @@ def get_hexcolors_from_scale( out[nan_mask] = nan_color out[~nan_mask] = hex_colors return out + + +def split_line_color_array(line_colors): + """splits line_color when it is an array. Unlike plotly, matplotlib + and pyvista cannot display line plots with an array of colors.""" + color_split = [] + if not isinstance(line_colors, (list, tuple, np.ndarray)): + line_colors = [line_colors] + line_colors = np.array(line_colors) + last_color = next((c for c in line_colors if c is not None), None) + last_ind = 0 + for ind, color in enumerate(line_colors): + if (color is not None and color != last_color) or ind == len(line_colors): + color_split.append((last_color, (last_ind, ind))) + last_ind = ind + last_color = color + return color_split From d9af5160166c63bf70143ab7e76a4b66605ef626 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 18 Jun 2024 01:28:11 +0200 Subject: [PATCH 079/211] replace `np.NINF` with `-np.inf` --- magpylib/_src/fields/field_BH_dipole.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/magpylib/_src/fields/field_BH_dipole.py b/magpylib/_src/fields/field_BH_dipole.py index ac7455d6a..3a20651d2 100644 --- a/magpylib/_src/fields/field_BH_dipole.py +++ b/magpylib/_src/fields/field_BH_dipole.py @@ -58,7 +58,7 @@ def dipole_Hfield( if np.any(mask1): with np.errstate(divide="ignore", invalid="ignore"): H[mask1] = moments[mask1] / 0.0 - np.nan_to_num(H, copy=False, posinf=np.inf, neginf=np.NINF) + np.nan_to_num(H, copy=False, posinf=np.inf, neginf=-np.inf) return H From f159ca5f43cedda9fd482f314188d7a41300d133 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 18 Jun 2024 01:39:52 +0200 Subject: [PATCH 080/211] pylint --- tests/test_field_cylinder.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_field_cylinder.py b/tests/test_field_cylinder.py index c0fe6bc50..171ab0084 100644 --- a/tests/test_field_cylinder.py +++ b/tests/test_field_cylinder.py @@ -219,7 +219,7 @@ def test_cylinder_field1(): nulll = np.zeros(N) eins = np.ones(N) - d, h, _ = dim.T + d, h, _ = dim.T # pylint: disable=no-member dim5 = np.array([nulll, d / 2, h, nulll, eins * 360]).T B1 = BHJM_cylinder_segment( field="B", observers=poso, polarization=magg, dimension=dim5 @@ -400,6 +400,7 @@ def test_cylinder_tile_vs_fem(): amp3 = np.linalg.norm(B3, axis=1) amp4 = np.linalg.norm(B4, axis=1) + # pylint: disable=unsubscriptable-object assert np.amax((fd1[:, 1:] * 1000 - B1).T / amp1) < 0.05 assert np.amax((fd2[5:-5, 1:] * 1000 - B2[5:-5]).T / amp2[5:-5]) < 0.05 assert np.amax((fd3[:, 1:] * 1000 - B3).T / amp3) < 0.05 From bc35bd1d289ccd2aa991900cf3cf63755d8eda53 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 18 Jun 2024 01:44:35 +0200 Subject: [PATCH 081/211] =?UTF-8?q?replace=20=C2=B4np.row=5Fstack=C2=B4=20?= =?UTF-8?q?with=20`np.vstack`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- magpylib/_src/fields/field_BH_circle.py | 2 +- magpylib/_src/fields/field_BH_cylinder.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/magpylib/_src/fields/field_BH_circle.py b/magpylib/_src/fields/field_BH_circle.py index da82a8a99..bf430bebe 100644 --- a/magpylib/_src/fields/field_BH_circle.py +++ b/magpylib/_src/fields/field_BH_circle.py @@ -78,7 +78,7 @@ def current_circle_Hfield( Hz = -pf * cel_iter(q, p, np.ones(n5), cc, ss, p, q) # input is I -> output must be H-field - return np.row_stack((Hr, np.zeros(n5), Hz)) * 795774.7154594767 # *1e7/4/np.pi + return np.vstack((Hr, np.zeros(n5), Hz)) * 795774.7154594767 # *1e7/4/np.pi def BHJM_circle( diff --git a/magpylib/_src/fields/field_BH_cylinder.py b/magpylib/_src/fields/field_BH_cylinder.py index e71eea7d0..8f5cf4e65 100644 --- a/magpylib/_src/fields/field_BH_cylinder.py +++ b/magpylib/_src/fields/field_BH_cylinder.py @@ -71,7 +71,7 @@ def magnet_cylinder_axial_Bfield(z0: np.ndarray, r: np.ndarray, z: np.ndarray) - / np.pi ) - return np.row_stack((Br, np.zeros(n), Bz)) + return np.vstack((Br, np.zeros(n), Bz)) # CORE @@ -257,7 +257,7 @@ def magnet_cylinder_diametral_Hfield( ) ) - return np.row_stack((Hr, Hphi, Hz)) + return np.vstack((Hr, Hphi, Hz)) def BHJM_magnet_cylinder( From 035a1da6db7f07feecb3cc65ebde8f14359fbec7 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 18 Jun 2024 10:12:08 +0200 Subject: [PATCH 082/211] update changelog --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0bc837e3c..f56d38441 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,10 @@ # Changelog -## [5.0.3] - 2024-06-03 +## Unreleased +- Add support for Numpy 2.0 ([#795](https://github.com/magpylib/magpylib/pull/789)) +- Fix markers legend not being suppressible ([#795](https://github.com/magpylib/magpylib/pull/789)) +## [5.0.3] - 2024-06-03 - Fix subplot object properties propagation ([#780](https://github.com/magpylib/magpylib/pull/780)) - Migrate to pydata-sphinx-theme and fix docs search function ([#762](https://github.com/magpylib/magpylib/pull/762)) - Fix docs version-switcher ([#782](https://github.com/magpylib/magpylib/pull/782)) From 35c323f19225634bb0e7e21e50a2b8d3c92dfa44 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 18 Jun 2024 10:17:54 +0200 Subject: [PATCH 083/211] bump version --- CHANGELOG.md | 5 +++-- README.md | 4 ++-- docs/_static/switcher.json | 4 ++-- magpylib/__init__.py | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f56d38441..6cdfd25e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## Unreleased +## [5.0.4] - 2024-06-18 - Add support for Numpy 2.0 ([#795](https://github.com/magpylib/magpylib/pull/789)) - Fix markers legend not being suppressible ([#795](https://github.com/magpylib/magpylib/pull/789)) @@ -469,7 +469,8 @@ The first official release of the Magpylib library. --- -[Unreleased]:https://github.com/magpylib/magpylib/compare/5.0.3...HEAD +[Unreleased]:https://github.com/magpylib/magpylib/compare/5.0.4...HEAD +[5.0.4]:https://github.com/magpylib/magpylib/compare/5.0.3...5.0.4 [5.0.3]:https://github.com/magpylib/magpylib/compare/5.0.2...5.0.3 [5.0.2]:https://github.com/magpylib/magpylib/compare/5.0.1...5.0.2 [5.0.1]:https://github.com/magpylib/magpylib/compare/5.0.0...5.0.1 diff --git a/README.md b/README.md index d4b5998ec..485c0f9fb 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Conda Cloud - MyBinder link + MyBinder link black @@ -136,7 +136,7 @@ A valid software citation could be author = {{Michael-Ortner et al.}}, title = {magpylib}, url = {https://magpylib.readthedocs.io/en/latest/}, - version = {5.0.3}, + version = {5.0.4}, date = {2023-06-25}, } ``` diff --git a/docs/_static/switcher.json b/docs/_static/switcher.json index 931420ee3..de64f2ff2 100644 --- a/docs/_static/switcher.json +++ b/docs/_static/switcher.json @@ -4,8 +4,8 @@ "url": "https://magpylib.readthedocs.io/en/latest/" }, { - "name": "5.0.3 (stable)", - "version": "5.0.3", + "name": "5.0.4 (stable)", + "version": "5.0.4", "url": "https://magpylib.readthedocs.io/en/stable", "preferred": true }, diff --git a/magpylib/__init__.py b/magpylib/__init__.py index 16290f12b..f4d092c57 100644 --- a/magpylib/__init__.py +++ b/magpylib/__init__.py @@ -28,7 +28,7 @@ """ # module level dunders -__version__ = "5.0.3" +__version__ = "5.0.4" __author__ = "Michael Ortner & Alexandre Boisselet" __credits__ = "The Magpylib community" __all__ = [ From 79ee1cddf376cc2c991fba63e792fb59ab90cb70 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 18 Jun 2024 10:47:50 +0200 Subject: [PATCH 084/211] update --- magpylib/_src/display/traces_core.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index 71e89e56f..bf77d1e9d 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -565,11 +565,14 @@ def make_Pixels( ) elif vectors is None or shownull: if field_symbol == "arrow2d": - x, y, z = pos.T - coords = {"x": x, "y": y, "z": z} - pix = {"type": "scatter3d", "mode": "markers", **coords} - pix["marker_symbol"] = symbol - pix["marker_size"] = 2 + x, y, z = pos[:, None] + pix = { + "type": "scatter3d", + "mode": "markers", + **{"x": x, "y": y, "z": z}, + "marker_symbol": symbol, + "marker_size": 2, + } else: pix = make_BaseCuboid(dimension=[size] * 3, **kw) if pix is not None: @@ -688,9 +691,7 @@ def make_Sensor( { "type": "scatter3d", "mode": "markers", - "x": x, - "y": y, - "z": z, + **{"x": x, "y": y, "z": z}, "marker_symbol": style.pixel.symbol, "marker_color": "black" if pixel_color is None else pixel_color, "marker_size": 2, From f259441c51eb0a019ebe942186a6265ee5d434cf Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 18 Jun 2024 13:25:35 +0200 Subject: [PATCH 085/211] rename arrow 2d to arrow --- magpylib/_src/display/traces_core.py | 6 +++--- magpylib/_src/style.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index bf77d1e9d..49e996e1c 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -556,7 +556,7 @@ def make_Pixels( pix = make_BasePyramid(**kw) elif field_symbol == "arrow3d": pix = make_BaseArrow(**kw, type="mesh3d") - elif field_symbol == "arrow2d": + elif field_symbol == "arrow": pix = make_BaseArrow(**kw, type="scatter3d") else: # pragma: no cover raise ValueError( @@ -564,7 +564,7 @@ def make_Pixels( f", got {field_symbol!r}" ) elif vectors is None or shownull: - if field_symbol == "arrow2d": + if field_symbol == "arrow": x, y, z = pos[:, None] pix = { "type": "scatter3d", @@ -577,7 +577,7 @@ def make_Pixels( pix = make_BaseCuboid(dimension=[size] * 3, **kw) if pix is not None: if colors is not None: - if field_symbol == "arrow2d": + if field_symbol == "arrow": pix["line_color"] = np.repeat(colors[ind], len(pix["x"])) else: pix["facecolor"] = np.repeat(colors[ind], len(pix["i"])) diff --git a/magpylib/_src/style.py b/magpylib/_src/style.py index 28a495933..c1eb2186a 100644 --- a/magpylib/_src/style.py +++ b/magpylib/_src/style.py @@ -1662,11 +1662,11 @@ class PixelField(MagicProperties): shownull: bool, default=True Show/hide null or invalid field values - symbol: {"cone", "arrow2d", "arrow3d"}: + symbol: {"cone", "arrow", "arrow3d"}: Orientation symbol for field vector. """ - _allowed_symbols = ("cone", "arrow2d", "arrow3d") + _allowed_symbols = ("cone", "arrow", "arrow3d") _allowed_vectorsources = ("B", "H", "J", "M") @property From c2141a9d341aeae6a9d0dda0957a499c61086507 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 18 Jun 2024 15:46:49 +0200 Subject: [PATCH 086/211] rework trace grouping core func --- magpylib/_src/display/traces_utility.py | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index afc344b1e..151b0d1af 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -683,24 +683,14 @@ def group_traces(*traces): ], } for tr in traces: - tr = linearize_dict( - tr, - separator="_", - ) + tr = linearize_dict(tr, separator="_") gr = [tr["type"]] for k in [*common_keys, *spec_keys.get(tr["type"], [])]: - if k == "facecolor": - v = tr.get(k, None) is None - elif k in ("line_color", "marker_color"): - v = tr.get(k, None) - v = v if isinstance(v, str) else str(type(v)) - else: - v = tr.get(k, "") + v = tr.get(k, None) + v = type(v) if isinstance(v, (list, tuple, np.ndarray)) else v gr.append(str(v)) - gr = "".join(gr) - if gr not in mesh_groups: - mesh_groups[gr] = [] - mesh_groups[gr].append(tr) + gr = tuple(gr) + mesh_groups.setdefault(gr, []).append(tr) traces = [] for group in mesh_groups.values(): From 203e557d24e642a39ac8da9279f4c7a07633ed8d Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 18 Jun 2024 17:06:33 +0200 Subject: [PATCH 087/211] remove redundant color --- magpylib/_src/display/traces_utility.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index 151b0d1af..bb75add8c 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -670,7 +670,7 @@ def group_traces(*traces): mesh_groups = {} common_keys = ["legendgroup", "opacity", "row", "col", "color"] spec_keys = { - "mesh3d": ["colorscale", "color", "facecolor"], + "mesh3d": ["colorscale", "facecolor"], "scatter3d": [ "marker", "line_dash", From 367b73af11dd579f93e34b8de286715ad24921bb Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Wed, 19 Jun 2024 23:14:39 +0200 Subject: [PATCH 088/211] rework traces merging to allow consistent animation --- magpylib/_src/display/backend_matplotlib.py | 216 +++++++++--------- magpylib/_src/display/backend_pyvista.py | 241 +++++++++++--------- magpylib/_src/display/traces_core.py | 147 ++++++------ magpylib/_src/display/traces_utility.py | 99 +++++--- magpylib/_src/utility.py | 5 + 5 files changed, 397 insertions(+), 311 deletions(-) diff --git a/magpylib/_src/display/backend_matplotlib.py b/magpylib/_src/display/backend_matplotlib.py index 4cdbccf6e..3fbac0062 100644 --- a/magpylib/_src/display/backend_matplotlib.py +++ b/magpylib/_src/display/backend_matplotlib.py @@ -13,8 +13,10 @@ from matplotlib import patches from matplotlib.animation import FuncAnimation -from magpylib._src.display.traces_utility import split_line_color_array +from magpylib._src.display.traces_utility import get_trace_kw +from magpylib._src.display.traces_utility import split_input_arrays from magpylib._src.display.traces_utility import subdivide_mesh_by_facecolor +from magpylib._src.utility import is_array_like if os.getenv("MAGPYLIB_MPL_SVG") == "true": # pragma: no cover from matplotlib_inline.backend_inline import set_matplotlib_formats @@ -38,16 +40,6 @@ "longdashdot": "loosely dashdotted", } -SCATTER_KWARGS_LOOKUPS = { - "ls": ("line", "dash"), - "lw": ("line", "width"), - "color": ("line", "color"), - "marker": ("marker", "symbol"), - "mfc": ("marker", "color"), - "mec": ("marker", "color"), - "ms": ("marker", "size"), -} - class StripedHandler: """ @@ -88,117 +80,129 @@ def legend_artist(self, legend, orig_handle, fontsize, handlebox): current_position += patch_width * proportion -def generic_trace_to_matplotlib(trace, antialiased=True): - """Transform a generic trace into a matplotlib trace""" - traces_mpl = [] - leg_title = trace.get("legendgrouptitle_text", None) - showlegend = trace.get("showlegend", True) - if trace["type"] == "mesh3d": - subtraces = [trace] - has_facecolor = trace.get("facecolor", None) is not None - if has_facecolor: - subtraces = subdivide_mesh_by_facecolor(trace) - for ind, subtrace in enumerate(subtraces): - x, y, z = np.array([subtrace[k] for k in "xyz"], dtype=float) - triangles = np.array([subtrace[k] for k in "ijk"]).T - tr_mesh = { - "constructor": "plot_trisurf", - "args": (x, y, z), - "kwargs": { - "triangles": triangles, - "alpha": subtrace.get("opacity", None), - "color": subtrace.get("color", None), - "linewidth": 0, - "antialiased": antialiased, - }, - } - if showlegend and has_facecolor: - tr_mesh["legend_handler"] = StripedHandler(Counter(trace["facecolor"])) - if ind != 0: # hide substrace legends except first - tr_mesh["kwargs"]["label"] = "_nolegend_" - traces_mpl.append(tr_mesh) - elif "scatter" in trace["type"]: - props = { - k: trace.get(v[0], {}).get(v[1], trace.get("_".join(v), None)) - for k, v in SCATTER_KWARGS_LOOKUPS.items() +def mesh3d_to_matplotlib(trace, antialiased): + """Convert mesh3d trace input to a list of plot_trisurf constructor dicts + Note: plot_trisurf does not accept different facecolors on the same trace + so they need to be splitted into multiple traces + """ + traces = [] + subtraces = [trace] + has_facecolor = trace.get("facecolor", None) is not None + if has_facecolor: + subtraces = subdivide_mesh_by_facecolor(trace) + for ind, subtrace in enumerate(subtraces): + x, y, z = np.array([subtrace[k] for k in "xyz"], dtype=float) + triangles = np.array([subtrace[k] for k in "ijk"]).T + tr_mesh = { + "constructor": "plot_trisurf", + "args": (x, y, z), + "kwargs": { + "triangles": triangles, + "alpha": subtrace.get("opacity", None), + "color": subtrace.get("color", None), + "linewidth": 0, + "antialiased": antialiased, + }, } - coords_str = "xyz" - if trace["type"] == "scatter": - coords_str = "xy" - # marker size is proportional to area, not radius like generic - props["ms"] = np.pi * props["ms"] ** 2 - coords = np.array([trace[k] for k in coords_str], dtype=float) - if isinstance(props["ms"], (list, tuple, np.ndarray)): - traces_mpl.append( + if trace.get("showlegend", True) and has_facecolor: + tr_mesh["legend_handler"] = StripedHandler(Counter(trace["facecolor"])) + if ind != 0: # hide substrace legends except first + tr_mesh["kwargs"]["label"] = "_nolegend_" + traces.append(tr_mesh) + return traces + + +def scatter_to_matplotlib(trace): + """Convert scatter trace input to a list of plot or scatter constructor dicts + Note on `scatter` constructor: + - supports arrays for marker size and color, not symbol + - no support for line + Note on `plot` constructor: + - support for line + - no array support for marker size or marker color or line color or line style + """ + traces = [] + + # get kwargs + mode = get_trace_kw(trace, "mode", none_replace="markers") + line_color = get_trace_kw(trace, "line_color") + line_width = get_trace_kw(trace, "line_width", none_replace=1) + line_dash = get_trace_kw(trace, "line_dash") + line_dash = LINE_STYLES_TO_MATPLOTLIB.get(line_dash, line_dash) + marker_color = get_trace_kw(trace, "marker_color") + marker_size = get_trace_kw(trace, "marker_size", none_replace=1) + marker_symbol = get_trace_kw(trace, "marker_symbol", none_replace="o") + + # get coords + coords_str = "xyz" + if trace["type"] == "scatter": + coords_str = "xy" + # for 2d traces marker size is proportional to area, not radius like generic + marker_size = marker_size**2 + coords = np.array([trace[k] for k in coords_str], dtype=float) + + # plot the marker part with `scatter` constructor + if "markers" in mode: + for (msymb,), inds in split_input_arrays(marker_symbol): + msymb = SYMBOLS_TO_MATPLOTLIB.get(msymb, msymb) + kw = {"s": marker_size, "color": marker_color} + for k, v in kw.items(): + if is_array_like(v): + kw[k] = v[inds[0] : inds[1]] + traces.append( { "constructor": "scatter", - "args": (*coords,), - "kwargs": { - "s": props["ms"], - "color": props["mec"], - "marker": SYMBOLS_TO_MATPLOTLIB.get( - props["marker"], props["marker"] - ), - "label": None, - }, + "args": tuple(coords[:, inds[0] : inds[1]]), + "kwargs": {"marker": msymb, "label": None, **kw}, } ) - props.pop("ms") - props.pop("marker") - if "ls" in props: - props["ls"] = LINE_STYLES_TO_MATPLOTLIB.get(props["ls"], props["ls"]) - if "marker" in props: - props["marker"] = SYMBOLS_TO_MATPLOTLIB.get( - props["marker"], props["marker"] - ) - mode = trace.get("mode", None) - mode = "markers" if mode is None else mode - if "lines" not in mode: - props["ls"] = "" - if "markers" in mode: - if not props.get("marker", None): - props["marker"] = "o" - else: - props["marker"] = None - if "text" in mode and trace.get("text", False) and len(coords) > 0: - txt = trace["text"] - txt = [txt] * len(coords[0]) if isinstance(txt, str) else txt - for *coords_s, txt in zip(*coords, txt): - traces_mpl.append( - { - "constructor": "text", - "args": (*coords_s, txt), - } - ) - line_colors = split_line_color_array(trace.get("line_color", None)) - for split in line_colors: - props["color"], inds = split - traces_mpl.append( + + # plot the line part with `plot` constructor + if "lines" in mode: + for (lcolor, lwidth), inds in split_input_arrays(line_color, line_width): + traces.append( { "constructor": "plot", "args": coords[:, inds[0] : inds[1]], "kwargs": { - **{k: v for k, v in props.items() if v is not None}, "alpha": trace.get("opacity", 1), + "ls": line_dash, + "lw": lwidth, + "color": lcolor, }, } ) + # plot the test parts with `text` constructor + if "text" in mode and trace.get("text", False) and len(coords) > 0: + txt = trace["text"] + txt = [txt] * len(coords[0]) if isinstance(txt, str) else txt + for *coords_s, txt in zip(*coords, txt): + traces.append({"constructor": "text", "args": (*coords_s, txt)}) + return traces + + +def generic_trace_to_matplotlib(trace, antialiased=True): + """Transform a generic trace into a matplotlib trace""" + traces_mpl = [] + if trace["type"] == "mesh3d": + traces_mpl.extend(mesh3d_to_matplotlib(trace, antialiased)) + elif trace["type"] in ("scatter", "scatter3d"): + traces_mpl.extend(scatter_to_matplotlib(trace)) else: # pragma: no cover - raise ValueError( - f"Trace type {trace['type']!r} cannot be transformed into matplotlib trace" - ) - for tr_mesh in traces_mpl: - tr_mesh["row"] = trace.get("row", 1) - tr_mesh["col"] = trace.get("col", 1) - tr_mesh["kwargs"] = tr_mesh.get("kwargs", {}) - if tr_mesh["constructor"] != "text": - if showlegend: - if "label" not in tr_mesh["kwargs"]: - tr_mesh["kwargs"]["label"] = trace.get("name", "") + raise ValueError(f"{trace['type']!r} trace type conversion not supported") + for tr in traces_mpl: + tr["row"] = trace.get("row", 1) + tr["col"] = trace.get("col", 1) + tr["kwargs"] = tr.get("kwargs", {}) + if tr["constructor"] != "text": + if trace.get("showlegend", True): + if "label" not in tr["kwargs"]: + tr["kwargs"]["label"] = trace.get("name", "") + leg_title = trace.get("legendgrouptitle_text", None) if leg_title is not None: - tr_mesh["kwargs"]["label"] += f" ({leg_title})" + tr["kwargs"]["label"] += f" ({leg_title})" else: - tr_mesh["kwargs"]["label"] = "_nolegend" + tr["kwargs"]["label"] = "_nolegend" return traces_mpl diff --git a/magpylib/_src/display/backend_pyvista.py b/magpylib/_src/display/backend_pyvista.py index 8ceee8ff3..5476ae7b3 100644 --- a/magpylib/_src/display/backend_pyvista.py +++ b/magpylib/_src/display/backend_pyvista.py @@ -19,7 +19,8 @@ from matplotlib.colors import LinearSegmentedColormap from pyvista.plotting.colors import Color # pylint: disable=import-error -from magpylib._src.display.traces_utility import split_line_color_array +from magpylib._src.display.traces_utility import get_trace_kw +from magpylib._src.display.traces_utility import split_input_arrays from magpylib._src.utility import open_animation # from magpylib._src.utility import format_obj_input @@ -76,125 +77,136 @@ def colormap_from_colorscale(colorscale, name="plotly_to_mpl", N=256, gamma=1.0) return LinearSegmentedColormap(name, cdict, N, gamma) -def generic_trace_to_pyvista(trace): - """Transform a generic trace into a pyvista trace""" - traces_pv = [] - leg_title = trace.get("legendgrouptitle_text", None) - if trace["type"] == "mesh3d": - vertices = np.array([trace[k] for k in "xyz"], dtype=float).T - faces = np.array([trace[k] for k in "ijk"]).T.flatten() - faces = np.insert(faces, range(0, len(faces), 3), 3) - colorscale = trace.get("colorscale", None) - mesh = pv.PolyData(vertices, faces) - facecolor = trace.get("facecolor", None) - trace_pv = { - "type": "mesh", - "mesh": mesh, - "color": trace.get("color", None), - "scalars": trace.get("intensity", None), - "opacity": trace.get("opacity", None), - } - if facecolor is not None: - # pylint: disable=unsupported-assignment-operation - mesh.cell_data["colors"] = [ - Color(c, default_color=(0, 0, 0)).int_rgb for c in facecolor - ] - trace_pv.update( - { - "scalars": "colors", - "rgb": True, - "preference": "cell", +def mesh3d_to_pyvista(trace): + """Convert mesh3d trace input to a list of mesh constructor dict""" + vertices = np.array([trace[k] for k in "xyz"], dtype=float).T + faces = np.array([trace[k] for k in "ijk"]).T.flatten() + faces = np.insert(faces, range(0, len(faces), 3), 3) + colorscale = trace.get("colorscale", None) + mesh = pv.PolyData(vertices, faces) + facecolor = trace.get("facecolor", None) + trace_pv = { + "type": "mesh", + "mesh": mesh, + "color": trace.get("color", None), + "scalars": trace.get("intensity", None), + "opacity": trace.get("opacity", None), + } + if facecolor is not None: + # pylint: disable=unsupported-assignment-operation + mesh.cell_data["colors"] = [ + Color(c, default_color=(0, 0, 0)).int_rgb for c in facecolor + ] + trace_pv.update( + { + "scalars": "colors", + "rgb": True, + "preference": "cell", + } + ) + if colorscale is not None: + trace_pv["cmap"] = colormap_from_colorscale(colorscale) + return trace_pv + + +def scatter_to_pyvista(trace): + """Convert scatter trace input to a list of plot or scatter constructor dicts + Note 3d scatter plot is done with the mesh constructor and does not support symbols + """ + traces = [] + + # get kwargs + mode = get_trace_kw(trace, "mode", none_replace="markers") + line_color = get_trace_kw(trace, "line_color") + line_width = get_trace_kw(trace, "line_width", none_replace=1) + line_dash = get_trace_kw(trace, "line_dash") + line_dash = LINESTYLES_TO_PYVISTA.get(line_dash, "-") + marker_color = get_trace_kw(trace, "marker_color") + marker_size = get_trace_kw(trace, "marker_size", none_replace=1) + marker_symbol = get_trace_kw(trace, "marker_symbol", none_replace="o") + + if trace["type"] == "scatter3d": + points = np.array([trace[k] for k in "xyz"], dtype=float).T + if "lines" in mode: + for (lcol,), inds in split_input_arrays(line_color): + trace_pv_line = { + "type": "mesh", + "mesh": pv.lines_from_points(points[inds[0] : inds[1]]), + "color": lcol, + "line_width": line_width, + "opacity": trace.get("opacity", None), } - ) - traces_pv.append(trace_pv) - if colorscale is not None: - trace_pv["cmap"] = colormap_from_colorscale(colorscale) - elif "scatter" in trace["type"]: - line = trace.get("line", {}) - line_color = line.get("color", trace.get("line_color", None)) - line_width = line.get("width", trace.get("line_width", None)) - line_width = 1 if line_width is None else line_width - line_style = line.get("dash", trace.get("line_dash")) - marker = trace.get("marker", {}) - marker_color = marker.get("color", trace.get("marker_color", None)) - marker_size = marker.get("size", trace.get("marker_size", None)) - marker_size = 1 if marker_size is None else marker_size - marker_symbol = marker.get("symbol", trace.get("marker_symbol", None)) - mode = trace.get("mode", None) - mode = "markers" if mode is None else mode - if trace["type"] == "scatter3d": - points = np.array([trace[k] for k in "xyz"], dtype=float).T - if "lines" in mode: - line_colors = split_line_color_array(line_color) - for split in line_colors: - color, inds = split - trace_pv_line = { + traces.append(trace_pv_line) + if "markers" in mode: + splits = split_input_arrays(marker_color, marker_size) + for (mcolor, msize), inds in splits: + if marker_size != 0: + trace_pv_marker = { "type": "mesh", - "mesh": pv.lines_from_points(points[inds[0] : inds[1]]), - "color": color, - "line_width": line_width, + "mesh": pv.PolyData(points[inds[0] : inds[1]]), + "color": mcolor, + "point_size": msize, "opacity": trace.get("opacity", None), } - traces_pv.append(trace_pv_line) - if "markers" in mode: - trace_pv_marker = { - "type": "mesh", - "mesh": pv.PolyData(points), - "color": marker_color, - "point_size": marker_size, - "opacity": trace.get("opacity", None), - } - traces_pv.append(trace_pv_marker) - if "text" in mode and trace.get("text", False) and len(points) > 0: - txt = trace["text"] - txt = [txt] * len(points[0]) if isinstance(txt, str) else txt - trace_pv_text = { - "type": "point_labels", - "points": points, - "labels": txt, - "always_visible": True, - } - traces_pv.append(trace_pv_text) - elif trace["type"] == "scatter": - if "lines" in mode: - trace_pv_line = { - "type": "line", - "x": trace["x"], - "y": trace["y"], - "color": line_color, - "width": line_width, - "style": LINESTYLES_TO_PYVISTA.get(line_style, "-"), - "label": trace.get("name", ""), - } - traces_pv.append(trace_pv_line) - if "markers" in mode: - trace_pv_marker = { - "type": "scatter", - "x": trace["x"], - "y": trace["y"], - "color": marker_color, - "size": marker_size, - "style": SYMBOLS_TO_PYVISTA.get(marker_symbol, "o"), + traces.append(trace_pv_marker) + if "text" in mode and trace.get("text", False) and len(points) > 0: + txt = trace["text"] + txt = [txt] * len(points[0]) if isinstance(txt, str) else txt + trace_pv_text = { + "type": "point_labels", + "points": points, + "labels": txt, + "always_visible": True, + } + traces.append(trace_pv_text) + else: + if "lines" in mode: + trace_pv_line = { + "type": "line", + "x": trace["x"], + "y": trace["y"], + "color": line_color, + "width": line_width, + "style": line_dash, + "label": trace.get("name", ""), + } + traces.append(trace_pv_line) + if "markers" in mode: + trace_pv_marker = { + "type": "scatter", + "x": trace["x"], + "y": trace["y"], + "color": marker_color, + "size": marker_size, + "style": SYMBOLS_TO_PYVISTA.get(marker_symbol, "o"), + } + marker_size = ( + marker_size + if isinstance(marker_size, (list, tuple, np.ndarray)) + else np.array([marker_size]) + ) + for size in np.unique(marker_size): + tr = trace_pv_marker.copy() + mask = marker_size == size + tr = { + **tr, + "x": np.array(tr["x"])[mask], + "y": np.array(tr["y"][mask]), + "size": size, } - marker_size = ( - marker_size - if isinstance(marker_size, (list, tuple, np.ndarray)) - else np.array([marker_size]) - ) - for size in np.unique(marker_size): - tr = trace_pv_marker.copy() - mask = marker_size == size - tr = { - **tr, - "x": np.array(tr["x"])[mask], - "y": np.array(tr["y"][mask]), - "size": size, - } - traces_pv.append(tr) + traces.append(tr) + return traces + + +def generic_trace_to_pyvista(trace): + """Transform a generic trace into a pyvista traces""" + traces_pv = [] + if trace["type"] == "mesh3d": + traces_pv.append(mesh3d_to_pyvista(trace)) + elif trace["type"] in ("scatter", "scatter3d"): + traces_pv.extend(scatter_to_pyvista(trace)) else: # pragma: no cover - raise ValueError( - f"Trace type {trace['type']!r} cannot be transformed into pyvista trace" - ) + raise ValueError(f"{trace['type']!r} trace type conversion not supported") showlegend = trace.get("showlegend", False) for tr in traces_pv: tr["row"] = trace.get("row", 1) - 1 @@ -204,6 +216,7 @@ def generic_trace_to_pyvista(trace): showlegend = False # show only first subtrace if "label" not in tr: tr["label"] = trace.get("name", "") + leg_title = trace.get("legendgrouptitle_text", None) if leg_title is not None: tr["label"] += f" ({leg_title})" if not tr.get("label", ""): diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index 49e996e1c..04e1d03f7 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -534,20 +534,49 @@ def make_Pixels( field_symbol, shownull, size, + marker_size=10, null_thresh=1e-12, ) -> Dict[str, Any]: """ - Create the plotly mesh3d parameters for Sensor pixels based on pixel positions and chosen size + Create the plotly dict for Sensor pixels based on pixel positions and chosen size For now, only "cube" shape is provided. """ + # Note: the function must return a single object after grouping + # This is relevant for animation in plotly where a different number of traces + # in each frame results in weird artifacts. + # markers plots must share the same kw types to be able to be merged with line plots! + + if symbol is not None and vectors is None: + x, y, z = positions.T + return { + "type": "scatter3d", + "mode": "markers", + **{"x": x, "y": y, "z": z}, + "marker_symbol": symbol, + "marker_color": colors, + "marker_size": marker_size, + } pixels = [] orientations = None is_null_vec = None + allowed_symbols = ("cone", "arrow", "arrow3d") + if field_symbol not in allowed_symbols: # pragma: no cover + raise ValueError( + f"Invalid pixel field symbol (must be one of {allowed_symbols})" + f", got {field_symbol!r}" + ) if vectors is not None: orientations = get_orientation_from_vec(vectors) is_null_vec = (np.abs(vectors) < null_thresh).all(axis=1) for ind, pos in enumerate(positions): kw = {"backend": "plotly-dict", "position": pos} + kw2d = { + "type": "scatter3d", + "mode": "markers+lines", + "marker_symbol": symbol, + "marker_color": None, + "line_color": None, + } pix = None if vectors is not None and not is_null_vec[ind]: orient = orientations[ind] @@ -555,34 +584,36 @@ def make_Pixels( if field_symbol == "cone": pix = make_BasePyramid(**kw) elif field_symbol == "arrow3d": - pix = make_BaseArrow(**kw, type="mesh3d") + pix = make_BaseArrow(**kw) elif field_symbol == "arrow": - pix = make_BaseArrow(**kw, type="scatter3d") - else: # pragma: no cover - raise ValueError( - "Invalid pixel field symbol (must be 'cone' or 'arrow3d')" - f", got {field_symbol!r}" - ) + pix = make_BaseArrow(**kw, **kw2d) + pix["marker_size"] = np.repeat(0.0, len(pix["x"])) elif vectors is None or shownull: if field_symbol == "arrow": x, y, z = pos[:, None] pix = { - "type": "scatter3d", - "mode": "markers", **{"x": x, "y": y, "z": z}, - "marker_symbol": symbol, - "marker_size": 2, + "marker_size": [marker_size], + **kw2d, } else: pix = make_BaseCuboid(dimension=[size] * 3, **kw) if pix is not None: if colors is not None: + color = ( + colors[ind] + if isinstance(colors, (list, tuple, np.ndarray)) + else colors + ) if field_symbol == "arrow": - pix["line_color"] = np.repeat(colors[ind], len(pix["x"])) + pix["line_color"] = np.repeat(color, len(pix["x"])) + pix["marker_color"] = pix["line_color"] else: - pix["facecolor"] = np.repeat(colors[ind], len(pix["i"])) + pix["facecolor"] = np.repeat(color, len(pix["i"])) pixels.append(pix) - return group_traces(*pixels) + pixels = group_traces(*pixels) + assert len(pixels) == 1 + return pixels[0] def make_Sensor( @@ -598,24 +629,18 @@ def make_Sensor( distance between any pixel of the same sensor, equal to `size_pixel`. """ style = obj.style + traces_to_merge = [] show_hull = not bool(field_values) dimension = getattr(obj, "dimension", style.size) + dim = np.array( + [dimension] * 3 if isinstance(dimension, (float, int)) else dimension[:3], + dtype=float, + ) pixel = obj.pixel no_pix = pixel is None if not no_pix: pixel = np.unique(np.array(pixel).reshape((-1, 3)), axis=0) one_pix = not no_pix and pixel.shape[0] == 1 - style_arrows = style.arrows.as_dict(flatten=True, separator="_") - sensor = get_sensor_mesh( - **style_arrows, center_color=style.color, handedness=obj.handedness - ) - vertices = np.array([sensor[k] for k in "xyz"]).T - if style.color is not None: - sensor["facecolor"][sensor["facecolor"] == "rgb(238,238,238)"] = style.color - dim = np.array( - [dimension] * 3 if isinstance(dimension, (float, int)) else dimension[:3], - dtype=float, - ) if autosize is not None and style.sizemode == "scaled": dim *= autosize if no_pix: @@ -625,13 +650,23 @@ def make_Sensor( pixel = np.concatenate([[[0, 0, 0]], pixel]) hull_dim = pixel.max(axis=0) - pixel.min(axis=0) dim_ext = max(np.mean(dim), np.min(hull_dim)) - cube_mask = (abs(vertices) < 1).all(axis=1) - vertices[cube_mask] = 0 * vertices[cube_mask] - vertices[~cube_mask] = dim_ext * vertices[~cube_mask] - vertices /= 2 # sensor_mesh vertices are of length 2 - x, y, z = vertices.T - sensor.update(x=x, y=y, z=z) - traces_to_merge = [sensor] + style_arrows = style.arrows.as_dict(flatten=True, separator="_") + if any(style_arrows[f"{k}_show"] for k in "xyz"): + sens_mesh = get_sensor_mesh( + **style_arrows, center_color=style.color, handedness=obj.handedness + ) + vertices = np.array([sens_mesh[k] for k in "xyz"]).T + if style.color is not None: + sens_mesh["facecolor"][ + sens_mesh["facecolor"] == "rgb(238,238,238)" + ] = style.color + cube_mask = (abs(vertices) < 1).all(axis=1) + vertices[cube_mask] = 0 * vertices[cube_mask] + vertices[~cube_mask] = dim_ext * vertices[~cube_mask] + vertices /= 2 # sensor_mesh vertices are of length 2 + x, y, z = vertices.T + sens_mesh.update(x=x, y=y, z=z) + traces_to_merge.append(sens_mesh) if not no_pix: pixel_color = style.pixel.color pixel_size = style.pixel.size @@ -648,7 +683,8 @@ def make_Sensor( if pixel_size > 0: pixel_dim *= pixel_size poss = pixel[1:] if one_pix else pixel - vectors, colors, null_thresh = None, None, 1e-12 + vectors, null_thresh = None, 1e-12 + colors = "black" if pixel_color is None else pixel_color if field_values: vsrc = style.pixel.field.vectorsource csrc = style.pixel.field.colorsource @@ -668,37 +704,18 @@ def make_Sensor( is_null = (np.abs(field_array[path_ind]) < null_thresh).all(axis=1) field_mag[is_null] = np.nan colors = get_hexcolors_from_scale(field_mag, min_=cmin, max_=cmax) - if style.pixel.symbol is None or field_values: - pixels_traces = make_Pixels( - positions=poss, - vectors=vectors, - colors=colors, - size=pixel_dim, - symbol=style.pixel.symbol, - field_symbol=style.pixel.field.symbol, - shownull=style.pixel.field.shownull, - null_thresh=null_thresh, - ) - for tr in pixels_traces: - if ( - tr["type"].lower() == "mesh3d" - and tr.get("facecolor", None) is None - ): - tr["facecolor"] = np.repeat(pixel_color, len(tr["i"])) - else: - x, y, z = poss.T - pixels_traces = [ - { - "type": "scatter3d", - "mode": "markers", - **{"x": x, "y": y, "z": z}, - "marker_symbol": style.pixel.symbol, - "marker_color": "black" if pixel_color is None else pixel_color, - "marker_size": 2, - } - ] - - traces_to_merge.extend(pixels_traces) + pixels_trace = make_Pixels( + positions=poss, + vectors=vectors, + colors=colors, + size=pixel_dim, + symbol=style.pixel.symbol, + field_symbol=style.pixel.field.symbol, + shownull=style.pixel.field.shownull, + null_thresh=null_thresh, + ) + + traces_to_merge.append(pixels_trace) if show_hull: hull_pos = 0.5 * (pixel.max(axis=0) + pixel.min(axis=0)) hull_dim[hull_dim == 0] = pixel_dim / 2 diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index bb75add8c..dec613809 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -17,6 +17,7 @@ from magpylib._src.input_checks import check_input_zoom from magpylib._src.style import get_style from magpylib._src.utility import format_obj_input +from magpylib._src.utility import is_array_like from magpylib._src.utility import merge_dicts_with_conflict_check DEFAULT_ROW_COL_PARAMS = { @@ -464,17 +465,34 @@ def merge_scatter3d(*traces): if not mode: traces[0]["mode"] = "markers" no_gap = "line" not in mode - fill_values = {"x": None, "y": None, "z": None} - for k in ("marker_color", "line_color"): - if traces[0].get(k, None) is not None: - if isinstance(traces[0][k], (list, tuple, np.ndarray)): - fill_values[k] = "black" - merged_trace = {} + + ffill = "----" + + def fill_trace(tr, fill_value): + if fill_value == ffill: + return [*tr[k], *tr[k][-1:]] + return [*tr[k], fill_value] + + fill_values = { + "x": np.nan, + "y": np.nan, + "z": np.nan, + "marker_symbol": ffill, + "marker_size": 0, + "marker_color": ffill, + "line_color": ffill, + } + fill_values = { + k: v + for k, v in fill_values.items() + if k in traces[0] and isinstance(traces[0][k], (list, tuple, np.ndarray)) + } + merged_trace = {**traces[0]} for k, fill_value in fill_values.items(): if no_gap: - stack = [b[k] for b in traces] + stack = [tr[k] for tr in traces] else: - stack = [pts for b in traces for pts in [[fill_value], b[k]]] + stack = [fill_trace(tr, fill_value) for tr in traces] merged_trace[k] = np.hstack(stack) for k, v in traces[0].items(): if k not in merged_trace: @@ -687,11 +705,10 @@ def group_traces(*traces): gr = [tr["type"]] for k in [*common_keys, *spec_keys.get(tr["type"], [])]: v = tr.get(k, None) - v = type(v) if isinstance(v, (list, tuple, np.ndarray)) else v + v = "array" if isinstance(v, (list, tuple, np.ndarray)) else v gr.append(str(v)) - gr = tuple(gr) + gr = hash(tuple(gr)) mesh_groups.setdefault(gr, []).append(tr) - traces = [] for group in mesh_groups.values(): traces.extend(merge_traces(*group)) @@ -912,18 +929,48 @@ def get_hexcolors_from_scale( return out -def split_line_color_array(line_colors): - """splits line_color when it is an array. Unlike plotly, matplotlib - and pyvista cannot display line plots with an array of colors.""" - color_split = [] - if not isinstance(line_colors, (list, tuple, np.ndarray)): - line_colors = [line_colors] - line_colors = np.array(line_colors) - last_color = next((c for c in line_colors if c is not None), None) - last_ind = 0 - for ind, color in enumerate(line_colors): - if (color is not None and color != last_color) or ind == len(line_colors): - color_split.append((last_color, (last_ind, ind))) - last_ind = ind - last_color = color - return color_split +def split_input_arrays(*input_arrays): + """splits input_arrays into chunks of same values. + Use case: Unlike plotly, matplotlib and pyvista cannot display line plots with an array of + colors. + """ + list_like = (list, tuple, np.ndarray) + max_length = max( + len(inp) if isinstance(inp, list_like) else 1 for inp in input_arrays + ) + input_arrays = [ + [inp] * max_length if not isinstance(inp, list_like) else inp + for inp in input_arrays + ] + input_array = list(zip(*input_arrays)) + input_split = [] + prev_inp = next(iter(input_array)) + prev_ind = 0 + for ind, inp in enumerate(input_array): + val, last_val = tuple(inp), tuple(prev_inp) + is_end = ind == len(input_array) - 1 + if val != last_val or is_end: + last_ind = ind if ind != 0 else None + input_split.append((prev_inp, (prev_ind, last_ind))) + prev_ind = ind + prev_inp = inp + return input_split + + +def get_trace_kw(trace, arg, *, none_replace=None): + """Return the trace value from key while accepting magic notation + examples for: trace = {"marker_size": [3], "line": {"color": "blue"}} + get_kw(trace, "marker_size") -> array([3]) + get_kw(trace, "line_color") -> "blue" + get_kw(trace, "line_dash") -> None + get_kw(trace, "line_width", none_replace=3) -> 3 # not found is like None + """ + pref, *param = arg.split("_") + parent = trace.get(pref, {}) + res = trace.get(arg, None) + if param: + res = parent.get("".join(param), trace.get(arg, None)) + res = np.array(res) if is_array_like(res) else res + if res is None: + return none_replace + return res diff --git a/magpylib/_src/utility.py b/magpylib/_src/utility.py index cd03fbc69..e6f75c311 100644 --- a/magpylib/_src/utility.py +++ b/magpylib/_src/utility.py @@ -515,3 +515,8 @@ def style_temp_edit(*objs, styles_temp=None): finally: for obj in objs: obj._style = orig_styles[obj] + + +def is_array_like(inp): + """Return boolean on wether input is an array, list or tuple""" + return isinstance(inp, (list, tuple, np.ndarray)) From 710e0430b27605d21dc7a3e43d790794180854aa Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Wed, 19 Jun 2024 23:22:29 +0200 Subject: [PATCH 089/211] fix mpl and pyvista marker color on None --- magpylib/_src/display/backend_matplotlib.py | 2 +- magpylib/_src/display/backend_pyvista.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/magpylib/_src/display/backend_matplotlib.py b/magpylib/_src/display/backend_matplotlib.py index 3fbac0062..43f9e1884 100644 --- a/magpylib/_src/display/backend_matplotlib.py +++ b/magpylib/_src/display/backend_matplotlib.py @@ -129,7 +129,7 @@ def scatter_to_matplotlib(trace): line_width = get_trace_kw(trace, "line_width", none_replace=1) line_dash = get_trace_kw(trace, "line_dash") line_dash = LINE_STYLES_TO_MATPLOTLIB.get(line_dash, line_dash) - marker_color = get_trace_kw(trace, "marker_color") + marker_color = get_trace_kw(trace, "marker_color", none_replace=line_color) marker_size = get_trace_kw(trace, "marker_size", none_replace=1) marker_symbol = get_trace_kw(trace, "marker_symbol", none_replace="o") diff --git a/magpylib/_src/display/backend_pyvista.py b/magpylib/_src/display/backend_pyvista.py index 5476ae7b3..e612c0f4f 100644 --- a/magpylib/_src/display/backend_pyvista.py +++ b/magpylib/_src/display/backend_pyvista.py @@ -121,7 +121,7 @@ def scatter_to_pyvista(trace): line_width = get_trace_kw(trace, "line_width", none_replace=1) line_dash = get_trace_kw(trace, "line_dash") line_dash = LINESTYLES_TO_PYVISTA.get(line_dash, "-") - marker_color = get_trace_kw(trace, "marker_color") + marker_color = get_trace_kw(trace, "marker_color", none_replace=line_color) marker_size = get_trace_kw(trace, "marker_size", none_replace=1) marker_symbol = get_trace_kw(trace, "marker_symbol", none_replace="o") From 0a8cf10b25ac46065031a7f103f6cba7b1761e85 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Wed, 19 Jun 2024 23:25:39 +0200 Subject: [PATCH 090/211] bad argument name fixed --- magpylib/_src/display/backend_pyvista.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/magpylib/_src/display/backend_pyvista.py b/magpylib/_src/display/backend_pyvista.py index e612c0f4f..2d74b75b2 100644 --- a/magpylib/_src/display/backend_pyvista.py +++ b/magpylib/_src/display/backend_pyvista.py @@ -140,7 +140,7 @@ def scatter_to_pyvista(trace): if "markers" in mode: splits = split_input_arrays(marker_color, marker_size) for (mcolor, msize), inds in splits: - if marker_size != 0: + if msize != 0: trace_pv_marker = { "type": "mesh", "mesh": pv.PolyData(points[inds[0] : inds[1]]), From c0b518d2beb8624fb52ac1b56c6f7888e57b2bc7 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Thu, 20 Jun 2024 00:03:06 +0200 Subject: [PATCH 091/211] fix pyvista scatter2d splitting --- magpylib/_src/display/backend_pyvista.py | 64 ++++++++++++------------ 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/magpylib/_src/display/backend_pyvista.py b/magpylib/_src/display/backend_pyvista.py index 2d74b75b2..df2d9b1dc 100644 --- a/magpylib/_src/display/backend_pyvista.py +++ b/magpylib/_src/display/backend_pyvista.py @@ -21,6 +21,7 @@ from magpylib._src.display.traces_utility import get_trace_kw from magpylib._src.display.traces_utility import split_input_arrays +from magpylib._src.utility import is_array_like from magpylib._src.utility import open_animation # from magpylib._src.utility import format_obj_input @@ -161,40 +162,39 @@ def scatter_to_pyvista(trace): traces.append(trace_pv_text) else: if "lines" in mode: - trace_pv_line = { - "type": "line", - "x": trace["x"], - "y": trace["y"], - "color": line_color, - "width": line_width, - "style": line_dash, - "label": trace.get("name", ""), - } + splits = split_input_arrays(line_color, line_width, line_dash) + for (lcolor, lwidth, ldash), inds in splits: + print("asdf") + trace_pv_line = { + "type": "line", + "x": trace["x"][inds[0] : inds[1]], + "y": trace["y"][inds[0] : inds[1]], + "color": lcolor, + "width": lwidth, + "style": ldash, + "label": trace.get("name", ""), + } traces.append(trace_pv_line) if "markers" in mode: - trace_pv_marker = { - "type": "scatter", - "x": trace["x"], - "y": trace["y"], - "color": marker_color, - "size": marker_size, - "style": SYMBOLS_TO_PYVISTA.get(marker_symbol, "o"), - } - marker_size = ( - marker_size - if isinstance(marker_size, (list, tuple, np.ndarray)) - else np.array([marker_size]) - ) - for size in np.unique(marker_size): - tr = trace_pv_marker.copy() - mask = marker_size == size - tr = { - **tr, - "x": np.array(tr["x"])[mask], - "y": np.array(tr["y"][mask]), - "size": size, - } - traces.append(tr) + for (msize,), inds in split_input_arrays(marker_size): + if msize != 0: + mcol = marker_color + if is_array_like(mcol): + mcol = mcol[inds[0] : inds[1]] + if is_array_like(marker_symbol): + msymb = marker_symbol[inds[0] : inds[1]] + msymb = [SYMBOLS_TO_PYVISTA.get(s, "o") for s in msymb] + else: + msymb = SYMBOLS_TO_PYVISTA.get(marker_symbol, "o") + trace_pv_marker = { + "type": "scatter", + "x": trace["x"][inds[0] : inds[1]], + "y": trace["y"][inds[0] : inds[1]], + "color": mcol, + "size": msize, + "style": msymb, + } + traces.append(trace_pv_marker) return traces From cd8c026a85a730628ae7d8833b9853594e88cc57 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Thu, 20 Jun 2024 01:01:57 +0200 Subject: [PATCH 092/211] reduce number of traces on alternating sizes or symbols --- magpylib/_src/display/backend_matplotlib.py | 8 ++--- magpylib/_src/display/backend_pyvista.py | 21 ++++++------- magpylib/_src/display/traces_utility.py | 34 +++++++++++++-------- 3 files changed, 36 insertions(+), 27 deletions(-) diff --git a/magpylib/_src/display/backend_matplotlib.py b/magpylib/_src/display/backend_matplotlib.py index 43f9e1884..921a29a23 100644 --- a/magpylib/_src/display/backend_matplotlib.py +++ b/magpylib/_src/display/backend_matplotlib.py @@ -143,16 +143,16 @@ def scatter_to_matplotlib(trace): # plot the marker part with `scatter` constructor if "markers" in mode: - for (msymb,), inds in split_input_arrays(marker_symbol): + for (msymb,), inds in split_input_arrays(marker_symbol, ordered=False): msymb = SYMBOLS_TO_MATPLOTLIB.get(msymb, msymb) kw = {"s": marker_size, "color": marker_color} for k, v in kw.items(): if is_array_like(v): - kw[k] = v[inds[0] : inds[1]] + kw[k] = v[inds] traces.append( { "constructor": "scatter", - "args": tuple(coords[:, inds[0] : inds[1]]), + "args": tuple(coords[:, inds]), "kwargs": {"marker": msymb, "label": None, **kw}, } ) @@ -163,7 +163,7 @@ def scatter_to_matplotlib(trace): traces.append( { "constructor": "plot", - "args": coords[:, inds[0] : inds[1]], + "args": coords[:, inds], "kwargs": { "alpha": trace.get("opacity", 1), "ls": line_dash, diff --git a/magpylib/_src/display/backend_pyvista.py b/magpylib/_src/display/backend_pyvista.py index df2d9b1dc..9f48ddff1 100644 --- a/magpylib/_src/display/backend_pyvista.py +++ b/magpylib/_src/display/backend_pyvista.py @@ -132,19 +132,19 @@ def scatter_to_pyvista(trace): for (lcol,), inds in split_input_arrays(line_color): trace_pv_line = { "type": "mesh", - "mesh": pv.lines_from_points(points[inds[0] : inds[1]]), + "mesh": pv.lines_from_points(points[inds]), "color": lcol, "line_width": line_width, "opacity": trace.get("opacity", None), } traces.append(trace_pv_line) if "markers" in mode: - splits = split_input_arrays(marker_color, marker_size) + splits = split_input_arrays(marker_color, marker_size, ordered=False) for (mcolor, msize), inds in splits: if msize != 0: trace_pv_marker = { "type": "mesh", - "mesh": pv.PolyData(points[inds[0] : inds[1]]), + "mesh": pv.PolyData(points[inds]), "color": mcolor, "point_size": msize, "opacity": trace.get("opacity", None), @@ -164,11 +164,10 @@ def scatter_to_pyvista(trace): if "lines" in mode: splits = split_input_arrays(line_color, line_width, line_dash) for (lcolor, lwidth, ldash), inds in splits: - print("asdf") trace_pv_line = { "type": "line", - "x": trace["x"][inds[0] : inds[1]], - "y": trace["y"][inds[0] : inds[1]], + "x": trace["x"][inds], + "y": trace["y"][inds], "color": lcolor, "width": lwidth, "style": ldash, @@ -176,20 +175,20 @@ def scatter_to_pyvista(trace): } traces.append(trace_pv_line) if "markers" in mode: - for (msize,), inds in split_input_arrays(marker_size): + for (msize,), inds in split_input_arrays(marker_size, ordered=False): if msize != 0: mcol = marker_color if is_array_like(mcol): - mcol = mcol[inds[0] : inds[1]] + mcol = mcol[inds] if is_array_like(marker_symbol): - msymb = marker_symbol[inds[0] : inds[1]] + msymb = marker_symbol[inds] msymb = [SYMBOLS_TO_PYVISTA.get(s, "o") for s in msymb] else: msymb = SYMBOLS_TO_PYVISTA.get(marker_symbol, "o") trace_pv_marker = { "type": "scatter", - "x": trace["x"][inds[0] : inds[1]], - "y": trace["y"][inds[0] : inds[1]], + "x": trace["x"][inds], + "y": trace["y"][inds], "color": mcol, "size": msize, "style": msymb, diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index dec613809..d5a75a6b7 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -929,10 +929,13 @@ def get_hexcolors_from_scale( return out -def split_input_arrays(*input_arrays): +def split_input_arrays(*input_arrays, ordered=True): """splits input_arrays into chunks of same values. Use case: Unlike plotly, matplotlib and pyvista cannot display line plots with an array of colors. + The argument order=True is necessary for line arrays wher the order is important. + For markers, the order is not important and unique combinations with their respective + indices are returned. """ list_like = (list, tuple, np.ndarray) max_length = max( @@ -943,18 +946,25 @@ def split_input_arrays(*input_arrays): for inp in input_arrays ] input_array = list(zip(*input_arrays)) - input_split = [] - prev_inp = next(iter(input_array)) - prev_ind = 0 + if ordered: + input_split = [] + prev_inp = next(iter(input_array)) + prev_ind = 0 + for ind, inp in enumerate(input_array): + val, prev_val = tuple(inp), tuple(prev_inp) + is_end = ind == len(input_array) - 1 + if val != prev_val or is_end: + last_ind = ind if ind != 0 else None + input_split.append((prev_inp, slice(prev_ind, last_ind))) + prev_ind = ind + prev_inp = inp + return input_split + + input_split = {} for ind, inp in enumerate(input_array): - val, last_val = tuple(inp), tuple(prev_inp) - is_end = ind == len(input_array) - 1 - if val != last_val or is_end: - last_ind = ind if ind != 0 else None - input_split.append((prev_inp, (prev_ind, last_ind))) - prev_ind = ind - prev_inp = inp - return input_split + val = tuple(inp) + input_split.setdefault(val, []).append(ind) + return list(input_split.items()) def get_trace_kw(trace, arg, *, none_replace=None): From 57867f8c056692b6140abfea92d5ce7f3e56ffd6 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Thu, 20 Jun 2024 01:29:35 +0200 Subject: [PATCH 093/211] fix mpl marker size --- magpylib/_src/display/backend_matplotlib.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/magpylib/_src/display/backend_matplotlib.py b/magpylib/_src/display/backend_matplotlib.py index 921a29a23..2262b3920 100644 --- a/magpylib/_src/display/backend_matplotlib.py +++ b/magpylib/_src/display/backend_matplotlib.py @@ -135,7 +135,10 @@ def scatter_to_matplotlib(trace): # get coords coords_str = "xyz" - if trace["type"] == "scatter": + if trace["type"] == "scatter3d": + # for 3d traces marker size is proportional to volume, not radius like generic + marker_size = marker_size**3 + else: coords_str = "xy" # for 2d traces marker size is proportional to area, not radius like generic marker_size = marker_size**2 @@ -143,12 +146,13 @@ def scatter_to_matplotlib(trace): # plot the marker part with `scatter` constructor if "markers" in mode: - for (msymb,), inds in split_input_arrays(marker_symbol, ordered=False): + for (msymb,), inds in split_input_arrays(marker_symbol, ordered=True): msymb = SYMBOLS_TO_MATPLOTLIB.get(msymb, msymb) kw = {"s": marker_size, "color": marker_color} for k, v in kw.items(): if is_array_like(v): kw[k] = v[inds] + # print(kw) traces.append( { "constructor": "scatter", From 7a277ea30c1722fc24e3b91de31c8a6c7d6a7ad0 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Thu, 20 Jun 2024 01:37:37 +0200 Subject: [PATCH 094/211] fix focus ind --- magpylib/_src/display/traces_generic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index 18bffaa40..b6f8f3c91 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -222,7 +222,7 @@ def get_trace2D_dict( else: y = np.linalg.norm(y, axis=0) marker_size = np.array([3] * len(frames_indices)) - marker_size[np.clip(focus_inds, 0, len(marker_size) - 1)] = 15 + marker_size[np.clip(focus_inds, None, len(marker_size) - 1)] = 15 title = f"{field_str}{''.join(coords_str)}" unit = ( units_polarization From 9dbbfee9b0d97c577fb8da9f4db5aa1d3c736b4f Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Thu, 20 Jun 2024 01:39:20 +0200 Subject: [PATCH 095/211] fix marker ordered --- magpylib/_src/display/backend_matplotlib.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/magpylib/_src/display/backend_matplotlib.py b/magpylib/_src/display/backend_matplotlib.py index 2262b3920..cea3eec40 100644 --- a/magpylib/_src/display/backend_matplotlib.py +++ b/magpylib/_src/display/backend_matplotlib.py @@ -146,7 +146,7 @@ def scatter_to_matplotlib(trace): # plot the marker part with `scatter` constructor if "markers" in mode: - for (msymb,), inds in split_input_arrays(marker_symbol, ordered=True): + for (msymb,), inds in split_input_arrays(marker_symbol, ordered=False): msymb = SYMBOLS_TO_MATPLOTLIB.get(msymb, msymb) kw = {"s": marker_size, "color": marker_color} for k, v in kw.items(): From 4b4242cfe08c310a697c1ceb1360994df745aa81 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Thu, 20 Jun 2024 10:29:13 +0200 Subject: [PATCH 096/211] refactor + fix split_input_arrays on single val --- magpylib/_src/display/backend_matplotlib.py | 2 +- magpylib/_src/display/traces_core.py | 7 ++---- magpylib/_src/display/traces_utility.py | 24 +++++++++------------ magpylib/_src/input_checks.py | 6 +++--- 4 files changed, 16 insertions(+), 23 deletions(-) diff --git a/magpylib/_src/display/backend_matplotlib.py b/magpylib/_src/display/backend_matplotlib.py index cea3eec40..78953908e 100644 --- a/magpylib/_src/display/backend_matplotlib.py +++ b/magpylib/_src/display/backend_matplotlib.py @@ -142,6 +142,7 @@ def scatter_to_matplotlib(trace): coords_str = "xy" # for 2d traces marker size is proportional to area, not radius like generic marker_size = marker_size**2 + coords = np.array([trace[k] for k in coords_str], dtype=float) # plot the marker part with `scatter` constructor @@ -152,7 +153,6 @@ def scatter_to_matplotlib(trace): for k, v in kw.items(): if is_array_like(v): kw[k] = v[inds] - # print(kw) traces.append( { "constructor": "scatter", diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index 04e1d03f7..0e5da0fad 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -40,6 +40,7 @@ from magpylib._src.display.traces_utility import merge_mesh3d from magpylib._src.display.traces_utility import place_and_orient_model3d from magpylib._src.display.traces_utility import triangles_area +from magpylib._src.utility import is_array_like def make_DefaultTrace(obj, **kwargs) -> Union[Dict[str, Any], List[Dict[str, Any]]]: @@ -600,11 +601,7 @@ def make_Pixels( pix = make_BaseCuboid(dimension=[size] * 3, **kw) if pix is not None: if colors is not None: - color = ( - colors[ind] - if isinstance(colors, (list, tuple, np.ndarray)) - else colors - ) + color = colors[ind] if is_array_like(colors) else colors if field_symbol == "arrow": pix["line_color"] = np.repeat(color, len(pix["x"])) pix["marker_color"] = pix["line_color"] diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index d5a75a6b7..dfb2b2ab1 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -473,7 +473,7 @@ def fill_trace(tr, fill_value): return [*tr[k], *tr[k][-1:]] return [*tr[k], fill_value] - fill_values = { + fill_vals = { "x": np.nan, "y": np.nan, "z": np.nan, @@ -482,17 +482,15 @@ def fill_trace(tr, fill_value): "marker_color": ffill, "line_color": ffill, } - fill_values = { - k: v - for k, v in fill_values.items() - if k in traces[0] and isinstance(traces[0][k], (list, tuple, np.ndarray)) + fill_vals = { + k: v for k, v in fill_vals.items() if is_array_like(traces[0].get(k, None)) } merged_trace = {**traces[0]} - for k, fill_value in fill_values.items(): + for k, fill_val in fill_vals.items(): if no_gap: stack = [tr[k] for tr in traces] else: - stack = [fill_trace(tr, fill_value) for tr in traces] + stack = [fill_trace(tr, fill_val) for tr in traces] merged_trace[k] = np.hstack(stack) for k, v in traces[0].items(): if k not in merged_trace: @@ -705,7 +703,7 @@ def group_traces(*traces): gr = [tr["type"]] for k in [*common_keys, *spec_keys.get(tr["type"], [])]: v = tr.get(k, None) - v = "array" if isinstance(v, (list, tuple, np.ndarray)) else v + v = "array" if is_array_like(v) else v gr.append(str(v)) gr = hash(tuple(gr)) mesh_groups.setdefault(gr, []).append(tr) @@ -937,13 +935,11 @@ def split_input_arrays(*input_arrays, ordered=True): For markers, the order is not important and unique combinations with their respective indices are returned. """ - list_like = (list, tuple, np.ndarray) - max_length = max( - len(inp) if isinstance(inp, list_like) else 1 for inp in input_arrays - ) + max_length = max(len(inp) if is_array_like(inp) else 0 for inp in input_arrays) + if max_length == 0: + return [(tuple(input_arrays), slice(None))] input_arrays = [ - [inp] * max_length if not isinstance(inp, list_like) else inp - for inp in input_arrays + [inp] * max_length if not is_array_like(inp) else inp for inp in input_arrays ] input_array = list(zip(*input_arrays)) if ordered: diff --git a/magpylib/_src/input_checks.py b/magpylib/_src/input_checks.py index 54b2a029d..b6135e007 100644 --- a/magpylib/_src/input_checks.py +++ b/magpylib/_src/input_checks.py @@ -28,7 +28,7 @@ def all_same(lst: list) -> bool: return lst[1:] == lst[:-1] -def is_array_like(inp, msg: str): +def check_array_like(inp, msg: str): """test if inp is array_like: type list, tuple or ndarray inp: test object msg: str, error msg @@ -324,7 +324,7 @@ def check_format_input_vector( if inp is None: return None - is_array_like( + check_array_like( inp, f"Input parameter `{sig_name}` must be {sig_type}.\n" f"Instead received type {type(inp)}.", @@ -364,7 +364,7 @@ def check_format_input_vector2( - convert inp to ndarray with dtype float - make sure that inp.ndim = target_ndim, None dimensions are ignored """ - is_array_like( + check_array_like( inp, f"Input parameter `{param_name}` must be array_like.\n" f"Instead received type {type(inp)}.", From 7517ac5e0fa52eca906e1cddd40c86ec4f914268 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Thu, 20 Jun 2024 14:49:20 +0200 Subject: [PATCH 097/211] renaming --- magpylib/_src/display/traces_core.py | 47 +++++++++++++------------ magpylib/_src/display/traces_generic.py | 10 ++++-- magpylib/_src/style.py | 9 +++-- 3 files changed, 35 insertions(+), 31 deletions(-) diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index 0e5da0fad..123b82857 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -627,7 +627,6 @@ def make_Sensor( """ style = obj.style traces_to_merge = [] - show_hull = not bool(field_values) dimension = getattr(obj, "dimension", style.size) dim = np.array( [dimension] * 3 if isinstance(dimension, (float, int)) else dimension[:3], @@ -665,9 +664,9 @@ def make_Sensor( sens_mesh.update(x=x, y=y, z=z) traces_to_merge.append(sens_mesh) if not no_pix: - pixel_color = style.pixel.color - pixel_size = style.pixel.size - pixel_dim = 1 + px_color = style.pixel.color + px_size = style.pixel.size + px_dim = 1 if style.pixel.sizemode == "scaled": if len(pixel) < 1000: min_dist = np.min(pdist(pixel)) @@ -676,21 +675,20 @@ def make_Sensor( # using volume/(side length) approximation instead vol = np.prod(np.ptp(pixel, axis=0)) min_dist = (vol / len(pixel)) ** (1 / 3) - pixel_dim = dim_ext / 5 if min_dist == 0 else min_dist / 2 - if pixel_size > 0: - pixel_dim *= pixel_size - poss = pixel[1:] if one_pix else pixel - vectors, null_thresh = None, 1e-12 - colors = "black" if pixel_color is None else pixel_color + px_dim = dim_ext / 5 if min_dist == 0 else min_dist / 2 + if px_size > 0: + px_dim *= px_size + px_positions = pixel[1:] if one_pix else pixel + px_vectors, null_thresh = None, 1e-12 + px_colors = "black" if px_color is None else px_color if field_values: vsrc = style.pixel.field.vectorsource csrc = style.pixel.field.colorsource - if vsrc: - vectors = field_values[vsrc][path_ind] - # if csrc=="" -> show vectors but no color - csrc = vsrc if csrc is None else csrc - if csrc: - # get cmin, cmax for whole path + csrc = vsrc if csrc is None else csrc + if vsrc is not None: + px_vectors = field_values[vsrc][path_ind] + if csrc is not False: + # get cmin, cmax from whole path field_str, *coords_str = csrc coords_str = coords_str if coords_str else "xyz" coords = list({"xyz".index(v) for v in coords_str if v in "xyz"}) @@ -700,12 +698,14 @@ def make_Sensor( field_mag = field_mag[path_ind] is_null = (np.abs(field_array[path_ind]) < null_thresh).all(axis=1) field_mag[is_null] = np.nan - colors = get_hexcolors_from_scale(field_mag, min_=cmin, max_=cmax) + px_colors = get_hexcolors_from_scale( + field_mag, min_=cmin, max_=cmax + ) pixels_trace = make_Pixels( - positions=poss, - vectors=vectors, - colors=colors, - size=pixel_dim, + positions=px_positions, + vectors=px_vectors, + colors=px_colors, + size=px_dim, symbol=style.pixel.symbol, field_symbol=style.pixel.field.symbol, shownull=style.pixel.field.shownull, @@ -713,9 +713,10 @@ def make_Sensor( ) traces_to_merge.append(pixels_trace) - if show_hull: + # Show hull over pixels only if no field values are provided + if not field_values: hull_pos = 0.5 * (pixel.max(axis=0) + pixel.min(axis=0)) - hull_dim[hull_dim == 0] = pixel_dim / 2 + hull_dim[hull_dim == 0] = px_dim / 2 hull_mesh = make_BaseCuboid( "plotly-dict", position=hull_pos, dimension=hull_dim ) diff --git a/magpylib/_src/display/traces_generic.py b/magpylib/_src/display/traces_generic.py index b6f8f3c91..18b93b3ff 100644 --- a/magpylib/_src/display/traces_generic.py +++ b/magpylib/_src/display/traces_generic.py @@ -838,11 +838,15 @@ def get_sensor_pixel_field(objects): for sens in sensors: vsrc = sens.style.pixel.field.vectorsource csrc = sens.style.pixel.field.colorsource + csrc = vsrc if csrc == "auto" else csrc if vsrc or csrc: field_by_sens[sens] = {} - csrc = csrc if csrc else vsrc - vrsc = vsrc if vsrc else csrc[0] - for field in tuple({vrsc, csrc[0]}): + fields_str = [] + if vsrc: + fields_str.append(vsrc) + if csrc: + fields_str.append(csrc[0]) + for field in set(fields_str): if not has_pix_field: sources = format_obj_input(objects, allow="sources") sources = list(set(sources)) # remove duplicates diff --git a/magpylib/_src/style.py b/magpylib/_src/style.py index c1eb2186a..dcf6ae5c9 100644 --- a/magpylib/_src/style.py +++ b/magpylib/_src/style.py @@ -1691,17 +1691,16 @@ def colorsource(self): @colorsource.setter def colorsource(self, val): valid = True - if val not in ("", None): + if val not in (None, False): field_str, *coords_str = val if not coords_str: coords_str = list("xyz") if field_str not in "BHMJ" and set(coords_str).difference(set("xyz")): valid = False assert valid, ( - f"The `colorsource` property of {type(self).__name__} must start with either" - f" {self._allowed_vectorsources} and be followed by a combination of 'x', 'y', 'z'" - " (e.g. 'Bxy' or ('Bxy', 'Bz') )" - f" but received {repr(val)} instead." + f"The `colorsource` property of {type(self).__name__} must be None or False or start" + f" with either {self._allowed_vectorsources} and be followed by a combination of" + f" 'x', 'y', 'z' (e.g. 'Bxy' or ('Bxy', 'Bz') ) but received {repr(val)} instead." ) self._colorsource = val From 4f5b3b8f37273309df7ec0c5cf48c77d11dc0a39 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Fri, 21 Jun 2024 11:51:04 +0200 Subject: [PATCH 098/211] renaming --- magpylib/_src/display/traces_core.py | 2 +- magpylib/_src/display/traces_utility.py | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index 123b82857..79e1682dc 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -699,7 +699,7 @@ def make_Sensor( is_null = (np.abs(field_array[path_ind]) < null_thresh).all(axis=1) field_mag[is_null] = np.nan px_colors = get_hexcolors_from_scale( - field_mag, min_=cmin, max_=cmax + field_mag, cmin=cmin, cmax=cmax ) pixels_trace = make_Pixels( positions=px_positions, diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index dfb2b2ab1..fa809a5c7 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -908,17 +908,21 @@ def create_null_dim_trace(color=None, **kwargs): def get_hexcolors_from_scale( - values, colorscale="Jet", nan_color="#b2beb5", min_=None, max_=None + values, + colorscale="Jet", + cmin=None, + cmax=None, + nan_color="#b2beb5", ): """Convert numerical values to hexadecimal colors based on a color scale. Invalid value in the array a converted to the specified `nan_color`.""" values = np.array(values) nan_mask = np.isnan(values) valid = values[~nan_mask] - min_ = np.min(valid) if min_ is None else min_ - max_ = np.max(valid) if max_ is None else max_ - ptp = max_ - min_ - values = (values - min_) / ptp if ptp != 0 else values * 0 + 0.5 + cmin = np.min(valid) if cmin is None else cmin + cmax = np.max(valid) if cmax is None else cmax + ptp = cmax - cmin + values = (values - cmin) / ptp if ptp != 0 else values * 0 + 0.5 rgb_colors = sample_colorscale(colorscale, values[~nan_mask], colortype=None) hex_colors = [rgb2hex(rgb) for rgb in rgb_colors] out = np.array([""] * len(values), dtype=" Date: Sat, 22 Jun 2024 00:50:20 +0200 Subject: [PATCH 099/211] add style.pixel.field.sizemode --- magpylib/_src/defaults/defaults_values.py | 1 + magpylib/_src/display/traces_core.py | 20 +++++++++++++++++--- magpylib/_src/style.py | 22 ++++++++++++++++++++-- tests/test_obj_BaseGeo.py | 6 +++--- 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/magpylib/_src/defaults/defaults_values.py b/magpylib/_src/defaults/defaults_values.py index a5f8e4105..6e7bcf457 100644 --- a/magpylib/_src/defaults/defaults_values.py +++ b/magpylib/_src/defaults/defaults_values.py @@ -100,6 +100,7 @@ "vectorsource": None, "colorsource": None, "shownull": True, + "sizemode": "constant", }, }, "arrows": { diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index 79e1682dc..2e293565b 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -534,7 +534,7 @@ def make_Pixels( symbol, field_symbol, shownull, - size, + sizes, marker_size=10, null_thresh=1e-12, ) -> Dict[str, Any]: @@ -579,6 +579,7 @@ def make_Pixels( "line_color": None, } pix = None + size = sizes[ind] if is_array_like(sizes) else sizes if vectors is not None and not is_null_vec[ind]: orient = orientations[ind] kw.update(orientation=orient, base=5, diameter=size, height=size * 2) @@ -677,16 +678,29 @@ def make_Sensor( min_dist = (vol / len(pixel)) ** (1 / 3) px_dim = dim_ext / 5 if min_dist == 0 else min_dist / 2 if px_size > 0: - px_dim *= px_size + px_sizes = px_dim = px_dim* px_size px_positions = pixel[1:] if one_pix else pixel px_vectors, null_thresh = None, 1e-12 px_colors = "black" if px_color is None else px_color if field_values: vsrc = style.pixel.field.vectorsource csrc = style.pixel.field.colorsource + sizemode = style.pixel.field.sizemode csrc = vsrc if csrc is None else csrc if vsrc is not None: px_vectors = field_values[vsrc][path_ind] + if sizemode != "constant": + norms = np.linalg.norm(field_values[vsrc], axis=-1) + if sizemode=="log": + norms[norms == 0] = 1 + norms[np.isnan(norms)] = 1 + norms = np.log(norms) + min_, max_ = np.min(norms), np.max(norms) + ptp = max_ - min_ + norms = (norms - min_) / ptp if ptp != 0 else norms * 0 + 0.5 + px_sizes *= norms[path_ind] + else: + px_sizes *= norms[path_ind]/np.max(norms) if csrc is not False: # get cmin, cmax from whole path field_str, *coords_str = csrc @@ -705,7 +719,7 @@ def make_Sensor( positions=px_positions, vectors=px_vectors, colors=px_colors, - size=px_dim, + sizes=px_sizes, symbol=style.pixel.symbol, field_symbol=style.pixel.field.symbol, shownull=style.pixel.field.shownull, diff --git a/magpylib/_src/style.py b/magpylib/_src/style.py index dcf6ae5c9..6790bcc6f 100644 --- a/magpylib/_src/style.py +++ b/magpylib/_src/style.py @@ -1664,10 +1664,14 @@ class PixelField(MagicProperties): symbol: {"cone", "arrow", "arrow3d"}: Orientation symbol for field vector. + + sizemode: {"constant", "linear", "log"} + Symbol size mode releative the the field magnitude. """ - _allowed_symbols = ("cone", "arrow", "arrow3d") _allowed_vectorsources = ("B", "H", "J", "M") + _allowed_symbols = ("cone", "arrow", "arrow3d") + _allowed_sizemodes = ("constant", "linear", "log") @property def vectorsource(self): @@ -1719,7 +1723,7 @@ def shownull(self, val): @property def symbol(self): - """Pixel symbol. Can be one of `("cone", "arrow3d")`.""" + """Pixel symbol. Can be one of `{"cone", "arrow", "arrow3d"}`.""" return self._symbol @symbol.setter @@ -1731,6 +1735,20 @@ def symbol(self, val): ) self._symbol = val + @property + def sizemode(self): + """Pixel sizemode. Can be one of `{"constant", "linear", "log"}`.""" + return self._sizemode + + @sizemode.setter + def sizemode(self, val): + assert val is None or val in self._allowed_sizemodes, ( + f"The `sizemode` property of {type(self).__name__} must be one of" + f"{self._allowed_sizemodes},\n" + f"but received {repr(val)} instead." + ) + self._sizemode = val + class Pixel(MagicProperties): """Defines the styling properties of sensor pixels. diff --git a/tests/test_obj_BaseGeo.py b/tests/test_obj_BaseGeo.py index 45787ac3c..b08cd347e 100644 --- a/tests/test_obj_BaseGeo.py +++ b/tests/test_obj_BaseGeo.py @@ -542,7 +542,7 @@ def test_describe_with_exclude_None(): # print("test = [\n " + '",\n '.join(f'"{s}' for s in desc.split("\n")) + '",\n]') x = magpy.Sensor() test = [ - "Sensor(id=1687262758416)", + "Sensor(id=140534160166976)", " • parent: None", " • position: [0. 0. 0.] m", " • orientation: [0. 0. 0.] deg", @@ -556,8 +556,8 @@ def test_describe_with_exclude_None(): " opacity=None, path=Path(frames=None, line=Line(color=None, style=None, width=None)," " marker=Marker(color=None, size=None, symbol=None), numbering=None, show=None)," " pixel=Pixel(color=None, field=PixelField(colorsource=None, shownull=None," - " symbol=None, vectorsource=None), size=1, sizemode=None, symbol=None)," - " size=None, sizemode=None)" + " sizemode=None, symbol=None, vectorsource=None), size=1, sizemode=None," + " symbol=None), size=None, sizemode=None)" ), ] match_string_up_to_id(test, x.describe(exclude=None, return_string=True)) From aa99732d7f5208b6c05ff2259aaf831c67222ae7 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 21 Jun 2024 22:50:39 +0000 Subject: [PATCH 100/211] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- magpylib/_src/display/traces_core.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index 2e293565b..a3f4f255b 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -678,7 +678,7 @@ def make_Sensor( min_dist = (vol / len(pixel)) ** (1 / 3) px_dim = dim_ext / 5 if min_dist == 0 else min_dist / 2 if px_size > 0: - px_sizes = px_dim = px_dim* px_size + px_sizes = px_dim = px_dim * px_size px_positions = pixel[1:] if one_pix else pixel px_vectors, null_thresh = None, 1e-12 px_colors = "black" if px_color is None else px_color @@ -691,7 +691,7 @@ def make_Sensor( px_vectors = field_values[vsrc][path_ind] if sizemode != "constant": norms = np.linalg.norm(field_values[vsrc], axis=-1) - if sizemode=="log": + if sizemode == "log": norms[norms == 0] = 1 norms[np.isnan(norms)] = 1 norms = np.log(norms) @@ -700,7 +700,7 @@ def make_Sensor( norms = (norms - min_) / ptp if ptp != 0 else norms * 0 + 0.5 px_sizes *= norms[path_ind] else: - px_sizes *= norms[path_ind]/np.max(norms) + px_sizes *= norms[path_ind] / np.max(norms) if csrc is not False: # get cmin, cmax from whole path field_str, *coords_str = csrc From 999a824a507f98c6695f6a7570e61181d3170443 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sun, 23 Jun 2024 23:41:05 +0200 Subject: [PATCH 101/211] log pixel field scaling minimum should not be zero --- magpylib/_src/display/traces_core.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index a3f4f255b..85549e146 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -692,12 +692,13 @@ def make_Sensor( if sizemode != "constant": norms = np.linalg.norm(field_values[vsrc], axis=-1) if sizemode == "log": - norms[norms == 0] = 1 - norms[np.isnan(norms)] = 1 - norms = np.log(norms) + is_null_mask = np.logical_or(norms == 0, np.isnan(norms)) + norms[is_null_mask] = 1 + norms = np.log10(norms) min_, max_ = np.min(norms), np.max(norms) ptp = max_ - min_ - norms = (norms - min_) / ptp if ptp != 0 else norms * 0 + 0.5 + norms = (norms-min_+1)/(ptp+1) if ptp != -1 else norms * 0 + 0.5 + norms[is_null_mask] = 0 px_sizes *= norms[path_ind] else: px_sizes *= norms[path_ind] / np.max(norms) From 56f824c6e09a6261ee50959278556eb0bca1bd85 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 23 Jun 2024 21:41:23 +0000 Subject: [PATCH 102/211] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- magpylib/_src/display/traces_core.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index 85549e146..6065ce981 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -697,7 +697,11 @@ def make_Sensor( norms = np.log10(norms) min_, max_ = np.min(norms), np.max(norms) ptp = max_ - min_ - norms = (norms-min_+1)/(ptp+1) if ptp != -1 else norms * 0 + 0.5 + norms = ( + (norms - min_ + 1) / (ptp + 1) + if ptp != -1 + else norms * 0 + 0.5 + ) norms[is_null_mask] = 0 px_sizes *= norms[path_ind] else: From eb92c1242a3e8e6b7fbea2cdf443870c87a2eee7 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Mon, 24 Jun 2024 02:05:29 +0200 Subject: [PATCH 103/211] fix sizing when color mode only --- magpylib/_src/display/traces_core.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index 85549e146..7a80074c6 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -535,7 +535,7 @@ def make_Pixels( field_symbol, shownull, sizes, - marker_size=10, + marker2d_default_size = 10, null_thresh=1e-12, ) -> Dict[str, Any]: """ @@ -547,15 +547,17 @@ def make_Pixels( # in each frame results in weird artifacts. # markers plots must share the same kw types to be able to be merged with line plots! + sizes_2dfactor = marker2d_default_size/np.max(sizes) if symbol is not None and vectors is None: x, y, z = positions.T + sizes = sizes if is_array_like(sizes) else np.repeat(sizes, len(x)) return { "type": "scatter3d", "mode": "markers", **{"x": x, "y": y, "z": z}, "marker_symbol": symbol, "marker_color": colors, - "marker_size": marker_size, + "marker_size": sizes * sizes_2dfactor, } pixels = [] orientations = None @@ -595,7 +597,7 @@ def make_Pixels( x, y, z = pos[:, None] pix = { **{"x": x, "y": y, "z": z}, - "marker_size": [marker_size], + "marker_size": [size*sizes_2dfactor], **kw2d, } else: @@ -690,10 +692,11 @@ def make_Sensor( if vsrc is not None: px_vectors = field_values[vsrc][path_ind] if sizemode != "constant": + vsrc = csrc if vsrc is None else vsrc norms = np.linalg.norm(field_values[vsrc], axis=-1) if sizemode == "log": is_null_mask = np.logical_or(norms == 0, np.isnan(norms)) - norms[is_null_mask] = 1 + norms[is_null_mask] = np.min(norms[norms!=0]) norms = np.log10(norms) min_, max_ = np.min(norms), np.max(norms) ptp = max_ - min_ From ffcc06165e5fa8ce213bb7db31cf0825ff37f5db Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 00:05:47 +0000 Subject: [PATCH 104/211] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- magpylib/_src/display/traces_core.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index 1b70285a1..80b3860bc 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -535,7 +535,7 @@ def make_Pixels( field_symbol, shownull, sizes, - marker2d_default_size = 10, + marker2d_default_size=10, null_thresh=1e-12, ) -> Dict[str, Any]: """ @@ -547,7 +547,7 @@ def make_Pixels( # in each frame results in weird artifacts. # markers plots must share the same kw types to be able to be merged with line plots! - sizes_2dfactor = marker2d_default_size/np.max(sizes) + sizes_2dfactor = marker2d_default_size / np.max(sizes) if symbol is not None and vectors is None: x, y, z = positions.T sizes = sizes if is_array_like(sizes) else np.repeat(sizes, len(x)) @@ -597,7 +597,7 @@ def make_Pixels( x, y, z = pos[:, None] pix = { **{"x": x, "y": y, "z": z}, - "marker_size": [size*sizes_2dfactor], + "marker_size": [size * sizes_2dfactor], **kw2d, } else: @@ -696,7 +696,7 @@ def make_Sensor( norms = np.linalg.norm(field_values[vsrc], axis=-1) if sizemode == "log": is_null_mask = np.logical_or(norms == 0, np.isnan(norms)) - norms[is_null_mask] = np.min(norms[norms!=0]) + norms[is_null_mask] = np.min(norms[norms != 0]) norms = np.log10(norms) min_, max_ = np.min(norms), np.max(norms) ptp = max_ - min_ From 045a3fadb079c1b7f5f50dcce63a471fcc498435 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Mon, 24 Jun 2024 02:12:00 +0200 Subject: [PATCH 105/211] fix sizing on 2dmarkers with pixel size style input --- magpylib/_src/display/traces_core.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index 80b3860bc..4b7a678c8 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -535,7 +535,7 @@ def make_Pixels( field_symbol, shownull, sizes, - marker2d_default_size=10, + marker2d_default_size, null_thresh=1e-12, ) -> Dict[str, Any]: """ @@ -732,6 +732,7 @@ def make_Sensor( field_symbol=style.pixel.field.symbol, shownull=style.pixel.field.shownull, null_thresh=null_thresh, + marker2d_default_size=10 * px_size, ) traces_to_merge.append(pixels_trace) From 2fecc963c0500e8204b57f481fcc349b0ae64ccc Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Fri, 5 Jul 2024 21:40:45 +0200 Subject: [PATCH 106/211] keep pixel order and number for field value matching --- magpylib/_src/display/traces_core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index 4b7a678c8..3dc53a966 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -638,7 +638,7 @@ def make_Sensor( pixel = obj.pixel no_pix = pixel is None if not no_pix: - pixel = np.unique(np.array(pixel).reshape((-1, 3)), axis=0) + pixel = np.array(pixel).reshape((-1, 3)) one_pix = not no_pix and pixel.shape[0] == 1 if autosize is not None and style.sizemode == "scaled": dim *= autosize From 565266dcf586ecf636030bcf4344d69448743f6d Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sat, 6 Jul 2024 12:07:12 +0200 Subject: [PATCH 107/211] fix mesh3d merging --- magpylib/_src/display/traces_utility.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index fa809a5c7..16272e409 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -700,10 +700,13 @@ def group_traces(*traces): } for tr in traces: tr = linearize_dict(tr, separator="_") - gr = [tr["type"]] - for k in [*common_keys, *spec_keys.get(tr["type"], [])]: + tr_typ = tr["type"] + gr = [tr_typ] + for k in [*common_keys, *spec_keys.get(tr_typ, [])]: v = tr.get(k, None) - v = "array" if is_array_like(v) else v + # colorscales cannot merged in mesh3d (yet) + if k != "colorscale" and is_array_like(v): + v = "array" gr.append(str(v)) gr = hash(tuple(gr)) mesh_groups.setdefault(gr, []).append(tr) From 5731f9304dd1e8b4abc86272d4aab198382fda56 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Mon, 8 Jul 2024 21:40:54 +0200 Subject: [PATCH 108/211] add pixel field color scales --- magpylib/_src/defaults/defaults_values.py | 1 + magpylib/_src/display/traces_core.py | 5 ++- magpylib/_src/display/traces_utility.py | 2 +- magpylib/_src/style.py | 48 +++++++++++++++++++++-- 4 files changed, 50 insertions(+), 6 deletions(-) diff --git a/magpylib/_src/defaults/defaults_values.py b/magpylib/_src/defaults/defaults_values.py index 6e7bcf457..b4dd3edcc 100644 --- a/magpylib/_src/defaults/defaults_values.py +++ b/magpylib/_src/defaults/defaults_values.py @@ -99,6 +99,7 @@ "symbol": "cone", "vectorsource": None, "colorsource": None, + "colorscale": "Viridis", "shownull": True, "sizemode": "constant", }, diff --git a/magpylib/_src/display/traces_core.py b/magpylib/_src/display/traces_core.py index 3dc53a966..2755709b1 100644 --- a/magpylib/_src/display/traces_core.py +++ b/magpylib/_src/display/traces_core.py @@ -721,7 +721,10 @@ def make_Sensor( is_null = (np.abs(field_array[path_ind]) < null_thresh).all(axis=1) field_mag[is_null] = np.nan px_colors = get_hexcolors_from_scale( - field_mag, cmin=cmin, cmax=cmax + values=field_mag, + colorscale=style.pixel.field.colorscale, + cmin=cmin, + cmax=cmax, ) pixels_trace = make_Pixels( positions=px_positions, diff --git a/magpylib/_src/display/traces_utility.py b/magpylib/_src/display/traces_utility.py index 16272e409..85b4d54a2 100644 --- a/magpylib/_src/display/traces_utility.py +++ b/magpylib/_src/display/traces_utility.py @@ -912,7 +912,7 @@ def create_null_dim_trace(color=None, **kwargs): def get_hexcolors_from_scale( values, - colorscale="Jet", + colorscale, cmin=None, cmax=None, nan_color="#b2beb5", diff --git a/magpylib/_src/style.py b/magpylib/_src/style.py index 6790bcc6f..ee73600b8 100644 --- a/magpylib/_src/style.py +++ b/magpylib/_src/style.py @@ -1650,15 +1650,16 @@ class PixelField(MagicProperties): Parameters ---------- - vectorsource: - vectorsource: str, default=None - Defines the pixel orientation vector source (one of "B", "H", "M", "J") + The pixel orientation vector source (one of "B", "H", "M", "J") colorsource: str, default=None - Defines the pixel color source (e.g. "Bx", "Hxy", "J", etc.). If not specfied, + The pixel color source (e.g. "Bx", "Hxy", "J", etc.). If not specfied, the amplitude of the `vectorsource` value is used. + colorscale: str, default="Inferno", + The colorscale used with `colorsource`. + shownull: bool, default=True Show/hide null or invalid field values @@ -1672,6 +1673,31 @@ class PixelField(MagicProperties): _allowed_vectorsources = ("B", "H", "J", "M") _allowed_symbols = ("cone", "arrow", "arrow3d") _allowed_sizemodes = ("constant", "linear", "log") + _allowed_colorscales = [ + "Viridis", + "Plasma", + "Inferno", + "Magma", + "Cividis", + "Greys", + "Purples", + "Blues", + "Greens", + "Oranges", + "Reds", + "YlOrBr", + "YlOrRd", + "OrRd", + "PuRd", + "RdPu", + "BuPu", + "GnBu", + "PuBu", + "YlGnBu", + "PuBuGn", + "BuGn", + "YlGn", + ] @property def vectorsource(self): @@ -1708,6 +1734,20 @@ def colorsource(self, val): ) self._colorsource = val + @property + def colorscale(self): + """Pixel vector source.""" + return self._colorscale + + @colorscale.setter + def colorscale(self, val): + assert val is None or val in self._allowed_colorscales, ( + f"The `colorscale` property of {type(self).__name__} must be one of" + f"{self._allowed_colorscales},\n" + f"but received {repr(val)} instead." + ) + self._colorscale = val + @property def shownull(self): """Show/hide null or invalid field values""" From c4fc8845d8ac952739246826cabe5cdf953186bd Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Mon, 8 Jul 2024 21:58:12 +0200 Subject: [PATCH 109/211] fix base desc test --- tests/test_obj_BaseGeo.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_obj_BaseGeo.py b/tests/test_obj_BaseGeo.py index b08cd347e..417e7505d 100644 --- a/tests/test_obj_BaseGeo.py +++ b/tests/test_obj_BaseGeo.py @@ -555,9 +555,9 @@ def test_describe_with_exclude_None(): " legend=Legend(show=None, text=None), model3d=Model3d(data=[], showdefault=True)," " opacity=None, path=Path(frames=None, line=Line(color=None, style=None, width=None)," " marker=Marker(color=None, size=None, symbol=None), numbering=None, show=None)," - " pixel=Pixel(color=None, field=PixelField(colorsource=None, shownull=None," - " sizemode=None, symbol=None, vectorsource=None), size=1, sizemode=None," - " symbol=None), size=None, sizemode=None)" + " pixel=Pixel(color=None, field=PixelField(colorscale=None, colorsource=None," + " shownull=None, sizemode=None, symbol=None, vectorsource=None), size=1," + " sizemode=None, symbol=None), size=None, sizemode=None)" ), ] match_string_up_to_id(test, x.describe(exclude=None, return_string=True)) From c565bbf98239e5077f7185071da574dc014af977 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Mon, 8 Jul 2024 22:05:48 +0200 Subject: [PATCH 110/211] fix pyvista error --- magpylib/_src/display/backend_pyvista.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/magpylib/_src/display/backend_pyvista.py b/magpylib/_src/display/backend_pyvista.py index 1c868ab82..94adc8eab 100644 --- a/magpylib/_src/display/backend_pyvista.py +++ b/magpylib/_src/display/backend_pyvista.py @@ -296,7 +296,7 @@ def draw_frame(frame_ind): canvas.add_mesh(pv.PolyData(pts), opacity=0) try: canvas.remove_scalar_bar() - except IndexError: + except (StopIteration, IndexError): # try to remove scalar bar, if none, pass # needs to happen in the loop otherwise they cummulate # while the max of 10 is reached and throws a ValueError From 6d62729e7b8d01d698f4b62ede565b94ebe8ce20 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Mon, 21 Apr 2025 13:12:57 +0200 Subject: [PATCH 111/211] draft --- .copier-answers.yml | 13 + .git_archival.txt | 3 + .gitattributes | 1 + .github/CONTRIBUTING.md | 89 +++ .github/PULL_REQUEST_TEMPLATE.md | 1 - .github/codeql/codeql-config.yml | 3 - .github/dependabot.yml | 11 + .github/release.yml | 5 + .github/workflows/cd.yml | 60 +++ .github/workflows/ci.yml | 71 +++ .github/workflows/codeql.yml | 43 -- .github/workflows/python-app.yml | 82 --- .gitignore | 73 ++- .pre-commit-config.yaml | 106 ++-- .pylintrc | 510 ------------------ .readthedocs.yaml | 39 +- MANIFEST.in | 2 - README.md | 51 +- docs/Makefile | 20 - docs/conf.py | 24 +- docs/make.bat | 242 --------- magpylib/__init__.py | 72 --- noxfile.py | 107 ++++ pyproject.toml | 178 ++++-- src/magpylib/__init__.py | 45 ++ {magpylib => src/magpylib}/_src/__init__.py | 0 .../magpylib}/_src/defaults/__init__.py | 0 .../_src/defaults/defaults_classes.py | 0 .../_src/defaults/defaults_utility.py | 0 .../_src/defaults/defaults_values.py | 0 .../magpylib}/_src/display/__init__.py | 0 .../_src/display/backend_matplotlib.py | 0 .../magpylib}/_src/display/backend_plotly.py | 0 .../magpylib}/_src/display/backend_pyvista.py | 0 .../magpylib}/_src/display/display.py | 0 .../magpylib}/_src/display/sensor_mesh.py | 0 .../magpylib}/_src/display/traces_base.py | 0 .../magpylib}/_src/display/traces_core.py | 0 .../magpylib}/_src/display/traces_generic.py | 0 .../magpylib}/_src/display/traces_utility.py | 0 {magpylib => src/magpylib}/_src/exceptions.py | 0 .../magpylib}/_src/fields/__init__.py | 0 .../magpylib}/_src/fields/field_BH_circle.py | 0 .../magpylib}/_src/fields/field_BH_cuboid.py | 0 .../_src/fields/field_BH_cylinder.py | 0 .../_src/fields/field_BH_cylinder_segment.py | 0 .../magpylib}/_src/fields/field_BH_dipole.py | 0 .../_src/fields/field_BH_polyline.py | 0 .../magpylib}/_src/fields/field_BH_sphere.py | 0 .../_src/fields/field_BH_tetrahedron.py | 0 .../_src/fields/field_BH_triangle.py | 0 .../_src/fields/field_BH_triangularmesh.py | 0 .../magpylib}/_src/fields/field_wrap_BH.py | 0 .../magpylib}/_src/fields/special_cel.py | 0 .../magpylib}/_src/fields/special_el3.py | 0 .../magpylib}/_src/input_checks.py | 0 .../magpylib}/_src/obj_classes/__init__.py | 0 .../_src/obj_classes/class_BaseDisplayRepr.py | 0 .../_src/obj_classes/class_BaseExcitations.py | 0 .../_src/obj_classes/class_BaseGeo.py | 0 .../_src/obj_classes/class_BaseTransform.py | 0 .../_src/obj_classes/class_Collection.py | 0 .../_src/obj_classes/class_Sensor.py | 0 .../_src/obj_classes/class_current_Circle.py | 0 .../obj_classes/class_current_Polyline.py | 0 .../_src/obj_classes/class_magnet_Cuboid.py | 0 .../_src/obj_classes/class_magnet_Cylinder.py | 0 .../class_magnet_CylinderSegment.py | 0 .../_src/obj_classes/class_magnet_Sphere.py | 0 .../obj_classes/class_magnet_Tetrahedron.py | 0 .../class_magnet_TriangularMesh.py | 0 .../obj_classes/class_misc_CustomSource.py | 0 .../_src/obj_classes/class_misc_Dipole.py | 0 .../_src/obj_classes/class_misc_Triangle.py | 0 {magpylib => src/magpylib}/_src/style.py | 0 {magpylib => src/magpylib}/_src/utility.py | 0 src/magpylib/_version.pyi | 4 + {magpylib => src/magpylib}/core/__init__.py | 0 .../magpylib}/current/__init__.py | 0 .../magpylib}/graphics/__init__.py | 0 .../magpylib}/graphics/model3d/__init__.py | 0 .../magpylib}/graphics/style/__init__.py | 0 {magpylib => src/magpylib}/magnet/__init__.py | 0 {magpylib => src/magpylib}/misc/__init__.py | 0 src/magpylib/py.typed | 0 tests/test_package.py | 9 + tox.ini | 28 - 87 files changed, 723 insertions(+), 1169 deletions(-) create mode 100644 .copier-answers.yml create mode 100644 .git_archival.txt create mode 100644 .gitattributes create mode 100644 .github/CONTRIBUTING.md delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/codeql/codeql-config.yml create mode 100644 .github/dependabot.yml create mode 100644 .github/release.yml create mode 100644 .github/workflows/cd.yml create mode 100644 .github/workflows/ci.yml delete mode 100644 .github/workflows/codeql.yml delete mode 100644 .github/workflows/python-app.yml delete mode 100644 .pylintrc delete mode 100644 MANIFEST.in delete mode 100644 docs/Makefile delete mode 100644 docs/make.bat delete mode 100644 magpylib/__init__.py create mode 100644 noxfile.py create mode 100644 src/magpylib/__init__.py rename {magpylib => src/magpylib}/_src/__init__.py (100%) rename {magpylib => src/magpylib}/_src/defaults/__init__.py (100%) rename {magpylib => src/magpylib}/_src/defaults/defaults_classes.py (100%) rename {magpylib => src/magpylib}/_src/defaults/defaults_utility.py (100%) rename {magpylib => src/magpylib}/_src/defaults/defaults_values.py (100%) rename {magpylib => src/magpylib}/_src/display/__init__.py (100%) rename {magpylib => src/magpylib}/_src/display/backend_matplotlib.py (100%) rename {magpylib => src/magpylib}/_src/display/backend_plotly.py (100%) rename {magpylib => src/magpylib}/_src/display/backend_pyvista.py (100%) rename {magpylib => src/magpylib}/_src/display/display.py (100%) rename {magpylib => src/magpylib}/_src/display/sensor_mesh.py (100%) rename {magpylib => src/magpylib}/_src/display/traces_base.py (100%) rename {magpylib => src/magpylib}/_src/display/traces_core.py (100%) rename {magpylib => src/magpylib}/_src/display/traces_generic.py (100%) rename {magpylib => src/magpylib}/_src/display/traces_utility.py (100%) rename {magpylib => src/magpylib}/_src/exceptions.py (100%) rename {magpylib => src/magpylib}/_src/fields/__init__.py (100%) rename {magpylib => src/magpylib}/_src/fields/field_BH_circle.py (100%) rename {magpylib => src/magpylib}/_src/fields/field_BH_cuboid.py (100%) rename {magpylib => src/magpylib}/_src/fields/field_BH_cylinder.py (100%) rename {magpylib => src/magpylib}/_src/fields/field_BH_cylinder_segment.py (100%) rename {magpylib => src/magpylib}/_src/fields/field_BH_dipole.py (100%) rename {magpylib => src/magpylib}/_src/fields/field_BH_polyline.py (100%) rename {magpylib => src/magpylib}/_src/fields/field_BH_sphere.py (100%) rename {magpylib => src/magpylib}/_src/fields/field_BH_tetrahedron.py (100%) rename {magpylib => src/magpylib}/_src/fields/field_BH_triangle.py (100%) rename {magpylib => src/magpylib}/_src/fields/field_BH_triangularmesh.py (100%) rename {magpylib => src/magpylib}/_src/fields/field_wrap_BH.py (100%) rename {magpylib => src/magpylib}/_src/fields/special_cel.py (100%) rename {magpylib => src/magpylib}/_src/fields/special_el3.py (100%) rename {magpylib => src/magpylib}/_src/input_checks.py (100%) rename {magpylib => src/magpylib}/_src/obj_classes/__init__.py (100%) rename {magpylib => src/magpylib}/_src/obj_classes/class_BaseDisplayRepr.py (100%) rename {magpylib => src/magpylib}/_src/obj_classes/class_BaseExcitations.py (100%) rename {magpylib => src/magpylib}/_src/obj_classes/class_BaseGeo.py (100%) rename {magpylib => src/magpylib}/_src/obj_classes/class_BaseTransform.py (100%) rename {magpylib => src/magpylib}/_src/obj_classes/class_Collection.py (100%) rename {magpylib => src/magpylib}/_src/obj_classes/class_Sensor.py (100%) rename {magpylib => src/magpylib}/_src/obj_classes/class_current_Circle.py (100%) rename {magpylib => src/magpylib}/_src/obj_classes/class_current_Polyline.py (100%) rename {magpylib => src/magpylib}/_src/obj_classes/class_magnet_Cuboid.py (100%) rename {magpylib => src/magpylib}/_src/obj_classes/class_magnet_Cylinder.py (100%) rename {magpylib => src/magpylib}/_src/obj_classes/class_magnet_CylinderSegment.py (100%) rename {magpylib => src/magpylib}/_src/obj_classes/class_magnet_Sphere.py (100%) rename {magpylib => src/magpylib}/_src/obj_classes/class_magnet_Tetrahedron.py (100%) rename {magpylib => src/magpylib}/_src/obj_classes/class_magnet_TriangularMesh.py (100%) rename {magpylib => src/magpylib}/_src/obj_classes/class_misc_CustomSource.py (100%) rename {magpylib => src/magpylib}/_src/obj_classes/class_misc_Dipole.py (100%) rename {magpylib => src/magpylib}/_src/obj_classes/class_misc_Triangle.py (100%) rename {magpylib => src/magpylib}/_src/style.py (100%) rename {magpylib => src/magpylib}/_src/utility.py (100%) create mode 100644 src/magpylib/_version.pyi rename {magpylib => src/magpylib}/core/__init__.py (100%) rename {magpylib => src/magpylib}/current/__init__.py (100%) rename {magpylib => src/magpylib}/graphics/__init__.py (100%) rename {magpylib => src/magpylib}/graphics/model3d/__init__.py (100%) rename {magpylib => src/magpylib}/graphics/style/__init__.py (100%) rename {magpylib => src/magpylib}/magnet/__init__.py (100%) rename {magpylib => src/magpylib}/misc/__init__.py (100%) create mode 100644 src/magpylib/py.typed create mode 100644 tests/test_package.py delete mode 100644 tox.ini diff --git a/.copier-answers.yml b/.copier-answers.yml new file mode 100644 index 000000000..34056dc84 --- /dev/null +++ b/.copier-answers.yml @@ -0,0 +1,13 @@ +# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY +_commit: 2025.01.22-34-g133af09 +_src_path: gh:scientific-python/cookie +backend: hatch +email: magpylib@gmail.com +full_name: Michael Ortner +license: BSD +org: magpylib +project_name: magpylib +project_short_description: Python package for computation of magnetic fields of magnets, + currents and moments. +url: https://github.com/magpylib/magpylib +vcs: true diff --git a/.git_archival.txt b/.git_archival.txt new file mode 100644 index 000000000..7c5100942 --- /dev/null +++ b/.git_archival.txt @@ -0,0 +1,3 @@ +node: $Format:%H$ +node-date: $Format:%cI$ +describe-name: $Format:%(describe:tags=true,match=*[0-9]*)$ diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..00a7b00c9 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +.git_archival.txt export-subst diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 000000000..b57a1f790 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,89 @@ +See the [Scientific Python Developer Guide][spc-dev-intro] for a detailed +description of best practices for developing scientific packages. + +[spc-dev-intro]: https://learn.scientific-python.org/development/ + +# Quick development + +The fastest way to start with development is to use nox. If you don't have nox, +you can use `pipx run nox` to run it without installing, or `pipx install nox`. +If you don't have pipx (pip for applications), then you can install with +`pip install pipx` (the only case were installing an application with regular +pip is reasonable). If you use macOS, then pipx and nox are both in brew, use +`brew install pipx nox`. + +To use, run `nox`. This will lint and test using every installed version of +Python on your system, skipping ones that are not installed. You can also run +specific jobs: + +```console +$ nox -s lint # Lint only +$ nox -s tests # Python tests +$ nox -s docs # Build and serve the docs +$ nox -s build # Make an SDist and wheel +``` + +Nox handles everything for you, including setting up an temporary virtual +environment for each run. + +# Setting up a development environment manually + +You can set up a development environment by running: + +```bash +python3 -m venv .venv +source ./.venv/bin/activate +pip install -v -e .[dev] +``` + +If you have the +[Python Launcher for Unix](https://github.com/brettcannon/python-launcher), you +can instead do: + +```bash +py -m venv .venv +py -m install -v -e .[dev] +``` + +# Pre-commit + +You should prepare pre-commit, which will help you by checking that commits pass +required checks: + +```bash +pip install pre-commit # or brew install pre-commit on macOS +pre-commit install # Will install a pre-commit hook into the git repo +``` + +You can also/alternatively run `pre-commit run` (changes only) or +`pre-commit run --all-files` to check even without installing the hook. + +# Testing + +Use pytest to run the unit checks: + +```bash +pytest +``` + +# Coverage + +Use pytest-cov to generate coverage reports: + +```bash +pytest --cov=magpylib +``` + +# Building docs + +You can build and serve the docs using: + +```bash +nox -s docs +``` + +You can build the docs only with: + +```bash +nox -s docs --non-interactive +``` diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index a58e337f6..000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1 +0,0 @@ -# Related Issues diff --git a/.github/codeql/codeql-config.yml b/.github/codeql/codeql-config.yml deleted file mode 100644 index d08937108..000000000 --- a/.github/codeql/codeql-config.yml +++ /dev/null @@ -1,3 +0,0 @@ -query-filters: - - exclude: - id: py/cyclic-import diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..6c4b36953 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +version: 2 +updates: + # Maintain dependencies for GitHub Actions + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + groups: + actions: + patterns: + - "*" diff --git a/.github/release.yml b/.github/release.yml new file mode 100644 index 000000000..9d1e0987b --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,5 @@ +changelog: + exclude: + authors: + - dependabot + - pre-commit-ci diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml new file mode 100644 index 000000000..92d8acd69 --- /dev/null +++ b/.github/workflows/cd.yml @@ -0,0 +1,60 @@ +name: CD + +on: + workflow_dispatch: + pull_request: + push: + branches: + - main + release: + types: + - published + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + # Many color libraries just need this to be set to any value, but at least + # one distinguishes color depth, where "3" -> "256-bit color". + FORCE_COLOR: 3 + +jobs: + dist: + name: Distribution build + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: hynek/build-and-inspect-python-package@v2 + + publish: + needs: [dist] + name: Publish to PyPI + environment: pypi + permissions: + id-token: write + attestations: write + contents: read + runs-on: ubuntu-latest + if: github.event_name == 'release' && github.event.action == 'published' + + steps: + - uses: actions/download-artifact@v4 + with: + name: Packages + path: dist + + - name: Generate artifact attestation for sdist and wheel + uses: actions/attest-build-provenance@v2.2.3 + with: + subject-path: "dist/*" + + - uses: pypa/gh-action-pypi-publish@release/v1 + with: + # Remember to tell (test-)pypi about this repo before publishing + # Remove this line to publish to PyPI + repository-url: https://test.pypi.org/legacy/ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..add9840df --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,71 @@ +name: CI + +on: + workflow_dispatch: + pull_request: + push: + branches: + - main + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + FORCE_COLOR: 3 + +jobs: + pre-commit: + name: Format + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: astral-sh/setup-uv@v5 + - uses: pre-commit/action@v3.0.1 + with: + extra_args: --hook-stage manual --all-files + - name: Run Pylint + run: uvx nox -s pylint -- --output-format=github + + checks: + name: Check Python ${{ matrix.python-version }} on ${{ matrix.runs-on }} + runs-on: ${{ matrix.runs-on }} + needs: [pre-commit] + strategy: + fail-fast: false + matrix: + python-version: ["3.11", "3.12", "3.13"] + runs-on: [ubuntu-latest, windows-latest, macos-latest] + + include: + - python-version: "pypy-3.11" + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install OpenBLAS + if: runner.os == 'Linux' && startsWith(matrix.python-version, 'pypy') + run: sudo apt-get update && sudo apt-get install -y libopenblas-dev + + - name: Install uv and set the python version + uses: astral-sh/setup-uv@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Install dependencies with uv + run: uv pip install .[test] + + - name: Test package + run: >- + uv run pytest -ra --cov --cov-report=xml --cov-report=term + --durations=20 + + - name: Upload coverage report + uses: codecov/codecov-action@v5 + with: + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml deleted file mode 100644 index f9046a523..000000000 --- a/.github/workflows/codeql.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: "CodeQL" - -on: - pull_request: - branches: [ "main", "*code-ql*"] - paths-ignore: - - "docs/**" - schedule: - - cron: "36 6 * * 0" - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - matrix: - language: [ javascript, python ] - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Initialize CodeQL - uses: github/codeql-action/init@v3 - with: - config-file: ./.github/codeql/codeql-config.yml - languages: ${{ matrix.language }} - queries: +security-and-quality - - - name: Autobuild - uses: github/codeql-action/autobuild@v3 - if: ${{ matrix.language == 'javascript' || matrix.language == 'python' }} - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 - with: - category: "/language:${{ matrix.language }}" diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml deleted file mode 100644 index 78adddfd7..000000000 --- a/.github/workflows/python-app.yml +++ /dev/null @@ -1,82 +0,0 @@ -name: Python package - -on: - push: - paths-ignore: - - "docs/**" - pull_request: - paths-ignore: - - "docs/**" - -concurrency: - group: check-${{ github.ref }} - cancel-in-progress: true - -jobs: - lint: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: "3.11" - - name: Set up testing tools and environment for pylint - run: | - python -m pip install --upgrade pip - pip install .[test] - - name: Run pylint test - run: pylint --rcfile='./.pylintrc' magpylib tests - - test: - name: test with ${{ matrix.py }} on ${{ matrix.os }} - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - py: - - "3.12" - - "3.11" - - "3.10" - os: - - ubuntu-latest - - macos-latest - - windows-latest - steps: - - name: Setup headless display - uses: pyvista/setup-headless-display-action@v3 - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Setup python for test ${{ matrix.py }} - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.py }} - - name: Install tox - run: python -m pip install tox-gh>=1.2 - - name: Setup test suite - run: tox -vv --notest - - name: Run test suite - run: tox --skip-pkg-install - - publish: - name: Publish to PyPI - needs: test - if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags') - runs-on: ubuntu-latest - permissions: - # IMPORTANT: this permission is mandatory for trusted publishing - id-token: write - steps: - - name: Checkout source - uses: actions/checkout@v4 - - name: Set up Python 3.10 - uses: actions/setup-python@v5 - with: - python-version: "3.10" - - name: Install flit - run: pip install flit - - name: Build package - run: flit build - - name: Publish - uses: pypa/gh-action-pypi-publish@release/v1 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 5affe0c87..25cf9a498 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,3 @@ -# Created by https://www.gitignore.io/api/python -# Edit at https://www.gitignore.io/?templates=python - -### Python ### # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] @@ -18,6 +14,7 @@ dist/ downloads/ eggs/ .eggs/ +lib/ lib64/ parts/ sdist/ @@ -28,19 +25,6 @@ share/python-wheels/ .installed.cfg *.egg MANIFEST -_autogen - -# docs -docs/auto_examples - -# sphinx-gallery -auto_examples - -# coderunner -tempCodeRunnerFile.py - -#temp files -__temp* # PyInstaller # Usually these files are written by a python script from a template @@ -54,7 +38,6 @@ pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ -test-results/ .tox/ .nox/ .coverage @@ -63,8 +46,10 @@ test-results/ nosetests.xml coverage.xml *.cover +*.py,cover .hypothesis/ .pytest_cache/ +cover/ # Translations *.mo @@ -74,6 +59,7 @@ coverage.xml *.log local_settings.py db.sqlite3 +db.sqlite3-journal # Flask stuff: instance/ @@ -84,31 +70,41 @@ instance/ # Sphinx documentation docs/_build/ -docs/_autogen/ -docs/_auto_examples/ + # PyBuilder +.pybuilder/ target/ # Jupyter Notebook .ipynb_checkpoints -*.ipynb -.virtual_documents/ # IPython profile_default/ ipython_config.py # pyenv -.python-version +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock -# celery beat schedule file +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff celerybeat-schedule +celerybeat.pid # SageMath parsed files *.sage.py # Environments -.vscode/ .env .venv env/ @@ -135,7 +131,28 @@ dmypy.json # Pyre type checker .pyre/ -### Python Patch ### -.venv/ +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# setuptools_scm +src/*/_version.py + + +# ruff +.ruff_cache/ + +# OS specific stuff +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db -.DS_Store \ No newline at end of file +# Common editor files +*~ +*.swp diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 393552ab1..5978c50f9 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,46 +1,90 @@ +ci: + autoupdate_commit_msg: "chore: update pre-commit hooks" + autofix_commit_msg: "style: pre-commit fixes" + +exclude: ^.cruft.json|.copier-answers.yml$ + repos: + - repo: https://github.com/adamchainz/blacken-docs + rev: "1.19.1" + hooks: + - id: blacken-docs + additional_dependencies: [black==24.*] + - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v5.0.0 + rev: "v5.0.0" hooks: + - id: check-added-large-files + - id: check-case-conflict + - id: check-merge-conflict + - id: check-symlinks - id: check-yaml + - id: debug-statements - id: end-of-file-fixer - types: [file, python] + - id: mixed-line-ending + - id: name-tests-test + args: ["--pytest-test-first"] + - id: requirements-txt-fixer - id: trailing-whitespace - types: [file, python] - - id: check-added-large-files - - id: debug-statements - language_version: python3 - - repo: https://github.com/pycqa/isort - rev: 6.0.1 + - repo: https://github.com/pre-commit/pygrep-hooks + rev: "v1.10.0" hooks: - - id: isort - name: isort (python) + - id: rst-backticks + - id: rst-directive-colons + - id: rst-inline-touching-normal - - repo: https://github.com/asottile/pyupgrade - rev: v3.19.1 + - repo: https://github.com/rbubley/mirrors-prettier + rev: "v3.5.3" hooks: - - id: pyupgrade - args: [--py38-plus] + - id: prettier + types_or: [yaml, markdown, html, css, scss, javascript, json] + args: [--prose-wrap=always] + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: "v0.11.5" + hooks: + - id: ruff + args: ["--fix", "--show-fixes"] + - id: ruff-format + + # TODO: enforce type checking in new PR + #- repo: https://github.com/pre-commit/mirrors-mypy + # rev: "v1.15.0" + # hooks: + # - id: mypy + # files: src|tests + # args: [] + # additional_dependencies: + # - pytest + + - repo: https://github.com/codespell-project/codespell + rev: "v2.4.1" + hooks: + - id: codespell - - repo: https://github.com/psf/black - rev: "25.1.0" + - repo: https://github.com/shellcheck-py/shellcheck-py + rev: "v0.10.0.1" hooks: - - id: black + - id: shellcheck + - repo: local + hooks: + - id: disallow-caps + name: Disallow improper capitalization + language: pygrep + entry: PyBind|Numpy|Cmake|CCache|Github|PyTest + exclude: .pre-commit-config.yaml + + - repo: https://github.com/abravalheri/validate-pyproject + rev: "v0.24.1" + hooks: + - id: validate-pyproject + additional_dependencies: ["validate-pyproject-schema-store[all]"] - # - repo: local - # hooks: - # - id: pylint - # name: pylint - # entry: pylint - # language: system - # types: [python] - # files: ^magpylib/ - # args: [ - # "-rn", # Only display messages - # "-sn", # Don't display the score - # "--rcfile=.pylintrc", # Link to your config file - # #"--load-plugins=pylint.extensions.docparams", # Load an extension - # ] + - repo: https://github.com/python-jsonschema/check-jsonschema + rev: "0.33.0" + hooks: + - id: check-dependabot + - id: check-github-workflows + - id: check-readthedocs diff --git a/.pylintrc b/.pylintrc deleted file mode 100644 index 7321e574c..000000000 --- a/.pylintrc +++ /dev/null @@ -1,510 +0,0 @@ -[MASTER] - -# A comma-separated list of package or module names from where C extensions may -# be loaded. Extensions are loading into the active Python interpreter and may -# run arbitrary code. -extension-pkg-whitelist= - -# Specify a score threshold to be exceeded before program exits with error. -fail-under=10.0 - -# Add files or directories to the blacklist. They should be base names, not -# paths. -ignore=CVS - -# Add files or directories matching the regex patterns to the blacklist. The -# regex matches against base names, not paths. -ignore-patterns= - -# Python code to execute, usually for sys.path manipulation such as -# pygtk.require(). -#init-hook= - -# Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the -# number of processors available to use. -jobs=1 - -# Control the amount of potential inferred values when inferring a single -# object. This can help the performance when dealing with large functions or -# complex, nested conditions. -limit-inference-results=100 - -# List of plugins (as comma separated values of python module names) to load, -# usually to register additional checkers. -load-plugins= - -# Pickle collected data for later comparisons. -persistent=yes - -# When enabled, pylint would attempt to guess common misconfiguration and emit -# user-friendly hints instead of false-positive error messages. -suggestion-mode=yes - -# Allow loading of arbitrary C extensions. Extensions are imported into the -# active Python interpreter and may run arbitrary code. -unsafe-load-any-extension=no - - -[MESSAGES CONTROL] - -# Only show warnings with the listed confidence levels. Leave empty to show -# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED. -confidence= - -# Disable the message, report, category or checker with the given id(s). You -# can either give multiple identifiers separated by comma (,) or put this -# option multiple times (only on the command line, not in the configuration -# file where it should appear only once). You can also use "--disable=all" to -# disable everything first and then reenable specific checks. For example, if -# you want to run only the similarities checker, you can use "--disable=all -# --enable=similarities". If you want to run only the classes checker, but have -# no Warning level messages displayed, use "--disable=all --enable=classes -# --disable=W". -disable=R0801, # duplicate code from getB in different src classes - too-few-public-methods, # complex field computation functions - too-many-locals, # complex field computation functions - too-many-arguments, # complex field computation functions - missing-module-docstring, # pylint does not recognize module docstring - invalid-name, # scientific software gannot go without x,y,z,... - -# Enable the message, report, category or checker with the given id(s). You can -# either give multiple identifier separated by comma (,) or put this option -# multiple time (only on the command line, not in the configuration file where -# it should appear only once). See also the "--disable" option for examples. -enable=c-extension-no-member - - -[REPORTS] - -# Python expression which should return a score less than or equal to 10. You -# have access to the variables 'error', 'warning', 'refactor', and 'convention' -# which contain the number of messages in each category, as well as 'statement' -# which is the total number of statements analyzed. This score is used by the -# global evaluation report (RP0004). -evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) - -# Template used to display messages. This is a python new-style format string -# used to format the message information. See doc for all details. -#msg-template= - -# Set the output format. Available formats are text, parseable, colorized, json -# and msvs (visual studio). You can also give a reporter class, e.g. -# mypackage.mymodule.MyReporterClass. -output-format=text - -# Tells whether to display a full report or only the messages. -reports=no - -# Activate the evaluation score. -score=yes - - -[REFACTORING] - -# Maximum number of nested blocks for function / method body -max-nested-blocks=5 - -# Complete name of functions that never returns. When checking for -# inconsistent-return-statements if a never returning function is called then -# it will be considered as an explicit return statement and no message will be -# printed. -never-returning-functions=sys.exit - - -[BASIC] - -# Naming style matching correct argument names. -argument-naming-style=snake_case - -# Regular expression matching correct argument names. Overrides argument- -# naming-style. -#argument-rgx= - -# Naming style matching correct attribute names. -attr-naming-style=snake_case - -# Regular expression matching correct attribute names. Overrides attr-naming- -# style. -#attr-rgx= - -# Bad variable names which should always be refused, separated by a comma. -bad-names=foo, - bar, - baz, - toto, - tutu, - tata - -# Bad variable names regexes, separated by a comma. If names match any regex, -# they will always be refused -bad-names-rgxs= - -# Naming style matching correct class attribute names. -class-attribute-naming-style=any - -# Regular expression matching correct class attribute names. Overrides class- -# attribute-naming-style. -#class-attribute-rgx= - -# Naming style matching correct class names. -class-naming-style=PascalCase - -# Regular expression matching correct class names. Overrides class-naming- -# style. -#class-rgx= - -# Naming style matching correct constant names. -const-naming-style=UPPER_CASE - -# Regular expression matching correct constant names. Overrides const-naming- -# style. -#const-rgx= - -# Minimum line length for functions/classes that require docstrings, shorter -# ones are exempt. -docstring-min-length=-1 - -# Naming style matching correct function names. -function-naming-style=snake_case - -# Regular expression matching correct function names. Overrides function- -# naming-style. -#function-rgx= - -# Good variable names which should always be accepted, separated by a comma. -good-names= - -# Good variable names regexes, separated by a comma. If names match any regex, -# they will always be accepted -good-names-rgxs= - -# Include a hint for the correct naming format with invalid-name. -include-naming-hint=no - -# Naming style matching correct inline iteration names. -inlinevar-naming-style=any - -# Regular expression matching correct inline iteration names. Overrides -# inlinevar-naming-style. -#inlinevar-rgx= - -# Naming style matching correct method names. -method-naming-style=snake_case - -# Regular expression matching correct method names. Overrides method-naming- -# style. -#method-rgx= - -# Naming style matching correct module names. -module-naming-style=snake_case - -# Regular expression matching correct module names. Overrides module-naming- -# style. -#module-rgx= - -# Colon-delimited sets of names that determine each other's naming style when -# the name regexes allow several styles. -name-group= - -# Regular expression which should only match function or class names that do -# not require a docstring. -no-docstring-rgx=^_ - -# List of decorators that produce properties, such as abc.abstractproperty. Add -# to this list to register other decorators that produce valid properties. -# These decorators are taken in consideration only for invalid-name. -property-classes=abc.abstractproperty - -# Naming style matching correct variable names. -variable-naming-style=snake_case - -# Regular expression matching correct variable names. Overrides variable- -# naming-style. -#variable-rgx= - - -[FORMAT] - -# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. -expected-line-ending-format= - -# Regexp for a line that is allowed to be longer than the limit. -ignore-long-lines=^\s*(# )??$ - -# Number of spaces of indent required inside a hanging or continued line. -indent-after-paren=4 - -# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 -# tab). -indent-string=' ' - -# Maximum number of characters on a single line. -max-line-length=100 - -# Maximum number of lines in a module. -max-module-lines=1000 - -# Allow the body of a class to be on the same line as the declaration if body -# contains single statement. -single-line-class-stmt=no - -# Allow the body of an if to be on the same line as the test if there is no -# else. -single-line-if-stmt=no - - -[LOGGING] - -# The type of string formatting that logging methods do. `old` means using % -# formatting, `new` is for `{}` formatting. -logging-format-style=old - -# Logging modules to check that the string format arguments are in logging -# function parameter format. -logging-modules=logging - - -[MISCELLANEOUS] - -# List of note tags to take in consideration, separated by a comma. -notes=FIXME, - XXX, - TODO - -# Regular expression of note tags to take in consideration. -#notes-rgx= - - -[SIMILARITIES] - -# Ignore comments when computing similarities. -ignore-comments=yes - -# Ignore docstrings when computing similarities. -ignore-docstrings=yes - -# Ignore imports when computing similarities. -ignore-imports=no - -# Minimum lines number of a similarity. -min-similarity-lines=4 - - -[SPELLING] - -# Limits count of emitted suggestions for spelling mistakes. -max-spelling-suggestions=4 - -# Spelling dictionary name. Available dictionaries: none. To make it work, -# install the python-enchant package. -spelling-dict= - -# List of comma separated words that should not be checked. -spelling-ignore-words= - -# A path to a file that contains the private dictionary; one word per line. -spelling-private-dict-file= - -# Tells whether to store unknown words to the private dictionary (see the -# --spelling-private-dict-file option) instead of raising a message. -spelling-store-unknown-words=no - - -[STRING] - -# This flag controls whether inconsistent-quotes generates a warning when the -# character used as a quote delimiter is used inconsistently within a module. -check-quote-consistency=no - -# This flag controls whether the implicit-str-concat should generate a warning -# on implicit string concatenation in sequences defined over several lines. -check-str-concat-over-line-jumps=no - - -[TYPECHECK] - -# List of decorators that produce context managers, such as -# contextlib.contextmanager. Add to this list to register other decorators that -# produce valid context managers. -contextmanager-decorators=contextlib.contextmanager - -# List of members which are set dynamically and missed by pylint inference -# system, and so shouldn't trigger E1101 when accessed. Python regular -# expressions are accepted. -generated-members= - -# Tells whether missing members accessed in mixin class should be ignored. A -# mixin class is detected if its name ends with "mixin" (case insensitive). -ignore-mixin-members=yes - -# Tells whether to warn about missing members when the owner of the attribute -# is inferred to be None. -ignore-none=yes - -# This flag controls whether pylint should warn about no-member and similar -# checks whenever an opaque object is returned when inferring. The inference -# can return multiple potential results while evaluating a Python object, but -# some branches might not be evaluated, which results in partial inference. In -# that case, it might be useful to still emit no-member and other checks for -# the rest of the inferred objects. -ignore-on-opaque-inference=yes - -# List of class names for which member attributes should not be checked (useful -# for classes with dynamically set attributes). This supports the use of -# qualified names. -ignored-classes=optparse.Values,thread._local,_thread._local - -# List of module names for which member attributes should not be checked -# (useful for modules/projects where namespaces are manipulated during runtime -# and thus existing member attributes cannot be deduced by static analysis). It -# supports qualified module names, as well as Unix pattern matching. -ignored-modules= - -# Show a hint with possible names when a member name was not found. The aspect -# of finding the hint is based on edit distance. -missing-member-hint=yes - -# The minimum edit distance a name should have in order to be considered a -# similar match for a missing member name. -missing-member-hint-distance=1 - -# The total number of similar names that should be taken in consideration when -# showing a hint for a missing member. -missing-member-max-choices=1 - -# List of decorators that change the signature of a decorated function. -signature-mutators= - - -[VARIABLES] - -# List of additional names supposed to be defined in builtins. Remember that -# you should avoid defining new builtins when possible. -additional-builtins= - -# Tells whether unused global variables should be treated as a violation. -allow-global-unused-variables=yes - -# List of strings which can identify a callback function by name. A callback -# name must start or end with one of those strings. -callbacks=cb_, - _cb - -# A regular expression matching the name of dummy variables (i.e. expected to -# not be used). -dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ - -# Argument names that match this expression will be ignored. Default to name -# with leading underscore. -ignored-argument-names=_.*|^ignored_|^unused_ - -# Tells whether we should check for unused import in __init__ files. -init-import=no - -# List of qualified module names which can have objects that can redefine -# builtins. -redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io - - -[CLASSES] - -# List of method names used to declare (i.e. assign) instance attributes. -defining-attr-methods=__init__, - __new__, - setUp, - __post_init__ - -# List of member names, which should be excluded from the protected access -# warning. -exclude-protected=_asdict, - _fields, - _replace, - _source, - _make - -# List of valid names for the first argument in a class method. -valid-classmethod-first-arg=cls - -# List of valid names for the first argument in a metaclass class method. -valid-metaclass-classmethod-first-arg=cls - - -[DESIGN] - -# Maximum number of arguments for function / method. -max-args=5 - -# Maximum number of attributes for a class (see R0902). -max-attributes=7 - -# Maximum number of boolean expressions in an if statement (see R0916). -max-bool-expr=5 - -# Maximum number of branch for function / method body. -max-branches=12 - -# Maximum number of locals for function / method body. -max-locals=15 - -# Maximum number of parents for a class (see R0901). -max-parents=7 - -# Maximum number of public methods for a class (see R0904). -max-public-methods=20 - -# Maximum number of return / yield for function / method body. -max-returns=6 - -# Maximum number of statements in function / method body. -max-statements=50 - -# Minimum number of public methods for a class (see R0903). -min-public-methods=2 - - -[IMPORTS] - -# List of modules that can be imported at any level, not just the top level -# one. -allow-any-import-level= - -# Allow wildcard imports from modules that define __all__. -allow-wildcard-with-all=no - -# Analyse import fallback blocks. This can be used to support both Python 2 and -# 3 compatible code, which means that the block might have code that exists -# only in one or another interpreter, leading to false positives when analysed. -analyse-fallback-blocks=no - -# Deprecated modules which should not be used, separated by a comma. -deprecated-modules=optparse,tkinter.tix - -# Create a graph of external dependencies in the given file (report RP0402 must -# not be disabled). -ext-import-graph= - -# Create a graph of every (i.e. internal and external) dependencies in the -# given file (report RP0402 must not be disabled). -import-graph= - -# Create a graph of internal dependencies in the given file (report RP0402 must -# not be disabled). -int-import-graph= - -# Force import order to recognize a module as part of the standard -# compatibility libraries. -known-standard-library= - -# Force import order to recognize a module as part of a third party library. -known-third-party=enchant - -# Couples of modules and preferred modules, separated by a comma. -preferred-modules= - - -[EXCEPTIONS] - -# Exceptions that will emit a warning when being caught. Defaults to -# "BaseException, Exception". -overgeneral-exceptions=builtins.BaseException, - builtins.Exception diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 17ed253d1..67c194c82 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -1,36 +1,17 @@ -# .readthedocs.yaml # Read the Docs configuration file # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details -# Required version: 2 -# Set the version of Python and other tools you might need build: - os: ubuntu-20.04 + os: ubuntu-22.04 tools: - python: "3.10" - # You can also specify other tool versions: - # nodejs: "16" - # rust: "1.55" - # golang: "1.17" - apt_packages: - # for pyvista - - libgl1-mesa-dev - - xvfb - -# Build documentation in the docs/ directory with Sphinx -sphinx: - configuration: docs/conf.py - -# If using Sphinx, optionally build your docs in additional formats such as PDF -# formats: -# - pdf - -# Optionally declare the Python requirements required to build your docs -python: - install: - - method: pip - path: . - extra_requirements: - - docs \ No newline at end of file + python: "3.12" + commands: + - asdf plugin add uv + - asdf install uv latest + - asdf global uv latest + - uv venv + - uv pip install .[docs] + - .venv/bin/python -m sphinx -T -b html -d docs/_build/doctrees -D + language=en docs $READTHEDOCS_OUTPUT/html diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index d8b53868e..000000000 --- a/MANIFEST.in +++ /dev/null @@ -1,2 +0,0 @@ -include LICENSE README.md CHANGELOG.md -recursive-include tests *.py diff --git a/README.md b/README.md index 432da3ca9..744408fbe 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,31 @@ +# magpylib + +[![Actions Status][actions-badge]][actions-link] +[![Documentation Status][rtd-badge]][rtd-link] + +[![PyPI version][pypi-version]][pypi-link] +[![Conda-Forge][conda-badge]][conda-link] +[![PyPI platforms][pypi-platforms]][pypi-link] + +[![GitHub Discussion][github-discussions-badge]][github-discussions-link] + + + + +[actions-badge]: https://github.com/magpylib/magpylib/workflows/CI/badge.svg +[actions-link]: https://github.com/magpylib/magpylib/actions +[conda-badge]: https://img.shields.io/conda/vn/conda-forge/magpylib +[conda-link]: https://github.com/conda-forge/magpylib-feedstock +[github-discussions-badge]: https://img.shields.io/static/v1?label=Discussions&message=Ask&color=blue&logo=github +[github-discussions-link]: https://github.com/magpylib/magpylib/discussions +[pypi-link]: https://pypi.org/project/magpylib/ +[pypi-platforms]: https://img.shields.io/pypi/pyversions/magpylib +[pypi-version]: https://img.shields.io/pypi/v/magpylib +[rtd-badge]: https://readthedocs.org/projects/magpylib/badge/?version=latest +[rtd-link]: https://magpylib.readthedocs.io/en/latest/?badge=latest + + + > [!WARNING] > Version 5 introduces critical breaking changes with, among others, the _move to SI units_. We recommended to pin your dependencies to `magpylib>=4.5<5` until you are ready to migrate to the latest version! ([see details](https://github.com/magpylib/magpylib/discussions/647)) @@ -5,27 +33,6 @@

---- - -
- - - - - - - - - PyPI version - - Conda Cloud - - MyBinder link - - black - -
- Magpylib is an **open-source Python package** for calculating static **magnetic fields** of magnets, currents, and other sources. It uses **analytical expressions**, solutions to macroscopic magnetostatic problems, implemented in **vectorized** form which makes the computation **extremely fast** and leverages the open-source Python ecosystem for spectacular visualizations! # Installation @@ -38,7 +45,7 @@ Install from conda forge using **conda** ``` conda install -c conda-forge magpylib ``` -Magpylib supports _Python3.10+_ and relies on common scientific computation libraries _NumPy_, _Scipy_, _Matplotlib_ and _Plotly_. Optionally, _Pyvista_ is recommended as graphical backend. +Magpylib supports _Python3.11+_ and relies on common scientific computation libraries _NumPy_, _Scipy_, _Matplotlib_ and _Plotly_. Optionally, _Pyvista_ is recommended as graphical backend. # Resources diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index c88c67085..000000000 --- a/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @pip install .[docs] - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index 88719a64e..968d5c213 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,19 +1,8 @@ -# -# Configuration file for the Sphinx documentation builder. -# -# This file does only contain a selection of the most common options. For a -# full list see the documentation: -# http://www.sphinx-doc.org/en/main/config -# -- Path setup -------------------------------------------------------------- -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) +from __future__ import annotations + import os import sys +import importlib.metadata # This is for pyvista os.system("/usr/bin/Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &") @@ -59,13 +48,10 @@ def setup(app): # -- Project information ----------------------------------------------------- project = "Magpylib" -copyright = "2019-2024, Magpylib developers, License: BSD 2-clause, Built with Sphinx Pydata-Theme" +copyright = "2019-2025, Magpylib developers, License: BSD 2-clause, Built with Sphinx Pydata-Theme" author = "The Magpylib Project " -# The short X.Y version -version = "" -# The full version, including alpha/beta/rc tags -from magpylib import __version__ as release +version = release = importlib.metadata.version("magpylib") # -- General configuration --------------------------------------------------- diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 32c993c5a..000000000 --- a/docs/make.bat +++ /dev/null @@ -1,242 +0,0 @@ -@ECHO OFF - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set BUILDDIR=_build -set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . -set I18NSPHINXOPTS=%SPHINXOPTS% . -if NOT "%PAPER%" == "" ( - set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% - set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% -) - -if "%1" == "" goto help - -if "%1" == "help" ( - :help - echo.Please use `make ^` where ^ is one of - echo. html to make standalone HTML files - echo. dirhtml to make HTML files named index.html in directories - echo. singlehtml to make a single large HTML file - echo. pickle to make pickle files - echo. json to make JSON files - echo. htmlhelp to make HTML files and a HTML help project - echo. qthelp to make HTML files and a qthelp project - echo. devhelp to make HTML files and a Devhelp project - echo. epub to make an epub - echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter - echo. text to make text files - echo. man to make manual pages - echo. texinfo to make Texinfo files - echo. gettext to make PO message catalogs - echo. changes to make an overview over all changed/added/deprecated items - echo. xml to make Docutils-native XML files - echo. pseudoxml to make pseudoxml-XML files for display purposes - echo. linkcheck to check all external links for integrity - echo. doctest to run all doctests embedded in the documentation if enabled - goto end -) - -if "%1" == "clean" ( - for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i - del /q /s %BUILDDIR%\* - goto end -) - - -%SPHINXBUILD% 2> nul -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -if "%1" == "html" ( - %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/html. - goto end -) - -if "%1" == "dirhtml" ( - %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. - goto end -) - -if "%1" == "singlehtml" ( - %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. - goto end -) - -if "%1" == "pickle" ( - %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the pickle files. - goto end -) - -if "%1" == "json" ( - %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the JSON files. - goto end -) - -if "%1" == "htmlhelp" ( - %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run HTML Help Workshop with the ^ -.hhp project file in %BUILDDIR%/htmlhelp. - goto end -) - -if "%1" == "qthelp" ( - %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run "qcollectiongenerator" with the ^ -.qhcp project file in %BUILDDIR%/qthelp, like this: - echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Sphinx-Gallery.qhcp - echo.To view the help file: - echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Sphinx-Gallery.ghc - goto end -) - -if "%1" == "devhelp" ( - %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. - goto end -) - -if "%1" == "epub" ( - %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The epub file is in %BUILDDIR%/epub. - goto end -) - -if "%1" == "latex" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdf" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf - cd %BUILDDIR%/.. - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdfja" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf-ja - cd %BUILDDIR%/.. - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "text" ( - %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The text files are in %BUILDDIR%/text. - goto end -) - -if "%1" == "man" ( - %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The manual pages are in %BUILDDIR%/man. - goto end -) - -if "%1" == "texinfo" ( - %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. - goto end -) - -if "%1" == "gettext" ( - %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The message catalogs are in %BUILDDIR%/locale. - goto end -) - -if "%1" == "changes" ( - %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes - if errorlevel 1 exit /b 1 - echo. - echo.The overview file is in %BUILDDIR%/changes. - goto end -) - -if "%1" == "linkcheck" ( - %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck - if errorlevel 1 exit /b 1 - echo. - echo.Link check complete; look for any errors in the above output ^ -or in %BUILDDIR%/linkcheck/output.txt. - goto end -) - -if "%1" == "doctest" ( - %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest - if errorlevel 1 exit /b 1 - echo. - echo.Testing of doctests in the sources finished, look at the ^ -results in %BUILDDIR%/doctest/output.txt. - goto end -) - -if "%1" == "xml" ( - %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The XML files are in %BUILDDIR%/xml. - goto end -) - -if "%1" == "pseudoxml" ( - %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. - goto end -) - -:end \ No newline at end of file diff --git a/magpylib/__init__.py b/magpylib/__init__.py deleted file mode 100644 index 4481c871a..000000000 --- a/magpylib/__init__.py +++ /dev/null @@ -1,72 +0,0 @@ -# pylint: disable=line-too-long -""" -Welcome to Magpylib ! ---------------------- - -Magpylib is a Python package for calculating 3D static magnetic fields of -magnets, line currents and other sources. The computation is based on -analytical expressions and therefore extremely fast. A user friendly -geometry interface enables convenient relative positioning between sources -and observers. - -Help us develop the package further - we appreciate any feedback ! - -Resources ---------- - -Documentation and examples on Read-the-docs: - -https://magpylib.readthedocs.io/en/latest/ - -Our Github repository: - -https://github.com/magpylib/magpylib - -The original software publication (version 2): - -https://www.sciencedirect.com/science/article/pii/S2352711020300170 - -""" -# module level dunders -__version__ = "5.1.1" -__author__ = "Michael Ortner & Alexandre Boisselet" -__credits__ = "The Magpylib community" -__all__ = [ - "magnet", - "current", - "misc", - "getB", - "getH", - "getM", - "getJ", - "Sensor", - "Collection", - "show", - "show_context", - "defaults", - "__version__", - "__author__", - "__credits__", - "core", - "graphics", - "mu_0", -] - -# create interface to outside of package -from scipy.constants import mu_0 - -from magpylib import core -from magpylib import current -from magpylib import graphics -from magpylib import magnet -from magpylib import misc -from magpylib._src.defaults.defaults_classes import default_settings as defaults -from magpylib._src.defaults.defaults_utility import SUPPORTED_PLOTTING_BACKENDS -from magpylib._src.display.display import show -from magpylib._src.display.display import show_context -from magpylib._src.fields import getB -from magpylib._src.fields import getH -from magpylib._src.fields import getJ -from magpylib._src.fields import getM -from magpylib._src.obj_classes.class_Collection import Collection -from magpylib._src.obj_classes.class_Sensor import Sensor diff --git a/noxfile.py b/noxfile.py new file mode 100644 index 000000000..7f90540b0 --- /dev/null +++ b/noxfile.py @@ -0,0 +1,107 @@ +from __future__ import annotations + +import argparse +import shutil +from pathlib import Path + +import nox + +DIR = Path(__file__).parent.resolve() + +nox.needs_version = ">=2024.3.2" +nox.options.sessions = ["lint", "pylint", "tests"] +nox.options.default_venv_backend = "uv|virtualenv" + + +@nox.session +def lint(session: nox.Session) -> None: + """ + Run the linter. + """ + session.install("pre-commit") + session.run( + "pre-commit", "run", "--all-files", "--show-diff-on-failure", *session.posargs + ) + + +@nox.session +def pylint(session: nox.Session) -> None: + """ + Run Pylint. + """ + # This needs to be installed into the package environment, and is slower + # than a pre-commit check + session.install("-e.", "pylint>=3.2") + session.run("pylint", "magpylib", *session.posargs) + + +@nox.session +def tests(session: nox.Session) -> None: + """ + Run the unit and regular tests. + """ + session.install("-e.[test]") + session.run("pytest", *session.posargs) + + +@nox.session(reuse_venv=True) +def docs(session: nox.Session) -> None: + """ + Build the docs. Pass --non-interactive to avoid serving. First positional argument is the target directory. + """ + + parser = argparse.ArgumentParser() + parser.add_argument( + "-b", dest="builder", default="html", help="Build target (default: html)" + ) + parser.add_argument("output", nargs="?", help="Output directory") + args, posargs = parser.parse_known_args(session.posargs) + serve = args.builder == "html" and session.interactive + + session.install("-e.[docs]", "sphinx-autobuild") + + shared_args = ( + "-n", # nitpicky mode + "-T", # full tracebacks + f"-b={args.builder}", + "docs", + args.output or f"docs/_build/{args.builder}", + *posargs, + ) + + if serve: + session.run("sphinx-autobuild", "--open-browser", *shared_args) + else: + session.run("sphinx-build", "--keep-going", *shared_args) + + +@nox.session +def build_api_docs(session: nox.Session) -> None: + """ + Build (regenerate) API docs. + """ + + session.install("sphinx") + session.run( + "sphinx-apidoc", + "-o", + "docs/api/", + "--module-first", + "--no-toc", + "--force", + "src/magpylib", + ) + + +@nox.session +def build(session: nox.Session) -> None: + """ + Build an SDist and wheel. + """ + + build_path = DIR.joinpath("build") + if build_path.exists(): + shutil.rmtree(build_path) + + session.install("build") + session.run("python", "-m", "build") diff --git a/pyproject.toml b/pyproject.toml index 50c8b07ac..d0788aebf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,46 +1,52 @@ [build-system] -requires = ["flit_core >=3.2,<4"] -build-backend = "flit_core.buildapi" +requires = ["hatchling", "hatch-vcs"] +build-backend = "hatchling.build" + [project] name = "magpylib" -dynamic = ["version"] -dependencies = [ - "numpy>=1.23", - "scipy>=1.8", - "matplotlib>=3.6", - "plotly>=5.16", - ] -requires-python = ">=3.10" authors = [ - {name = "Michael Ortner", email = "magpylib@gmail.com"}, + { name = "Michael Ortner", email = "magpylib@gmail.com" }, ] maintainers = [ {name = "Alexandre Boisselet", email = "alexabois+magpylib@gmail.com"} ] -description = "Free Python3 package to compute magnetic fields." +description = "Python package for computation of magnetic fields of magnets, currents and moments." readme = "README.md" license = {file = "LICENSE"} keywords = ["magnetism", "physics", "analytical", "electromagnetic", "magnetic-field", "B-field"] +requires-python = ">=3.11" classifiers = [ - "Development Status :: 5 - Production/Stable", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Intended Audience :: Developers", - "Intended Audience :: Science/Research", - "Intended Audience :: Education", - "Operating System :: OS Independent", + "Development Status :: 1 - Planning", + "Intended Audience :: Science/Research", + "Intended Audience :: Developers", + "License :: OSI Approved :: BSD License", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Topic :: Scientific/Engineering", + "Typing :: Typed", +] +dynamic = ["version"] +dependencies = [ + "numpy>=1.23", + "scipy>=1.8", + "matplotlib>=3.6", + "plotly>=5.16", ] [project.optional-dependencies] -code_style = [ - "pre-commit", +dev = [ + "pytest >=6", + "pytest-cov >=3", ] docs = [ "pydata-sphinx-theme", - "sphinx==7.3", + "sphinx>=7.0,<8.0", "sphinx-design", "sphinx-thebe", "sphinx-favicon", @@ -55,8 +61,9 @@ docs = [ ] test = [ "tox>=4.11", + "pytest >=6", + "pytest-cov >=3", "pytest>=7.4", - "pylint>3.0", "coverage", "pandas", "pyvista", @@ -71,20 +78,117 @@ binder = [ "jupyterlab-myst", ] + [project.urls] -Documentation = "https://magpylib.readthedocs.io/en/latest/" -Repository = "https://github.com/magpylib/magpylib.git" +Homepage = "https://github.com/magpylib/magpylib" "Bug Tracker" = "https://github.com/magpylib/magpylib/issues" -Changelog = "https://github.com/magpylib/magpylib/blob/master/CHANGELOG.md" +Discussions = "https://github.com/magpylib/magpylib/discussions" +Changelog = "https://github.com/magpylib/magpylib/releases" + + +[tool.hatch] +version.source = "vcs" +build.hooks.vcs.version-file = "src/magpylib/_version.py" + +[tool.hatch.envs.default] +features = ["test"] +scripts.test = "pytest {args}" + + +[tool.uv] +dev-dependencies = [ + "magpylib[test]", +] [tool.pytest.ini_options] -# backend_pyvista.py file imports pyvista on top level which messes with the namespace when running -# doctests with the missing_pyvista test -addopts = ["--doctest-modules", "--ignore-glob=*backend_pyvista.py"] -testpaths = ["magpylib", "tests"] - -[tool.isort] -# add_imports = ["from __future__ import annotations"] -force_single_line = true -profile = "black" \ No newline at end of file +minversion = "6.0" +addopts = ["-ra", "--showlocals", "--strict-markers", "--strict-config"] +xfail_strict = true +filterwarnings = [ + "error", +] +log_cli_level = "INFO" +testpaths = [ + "tests", +] + + +[tool.coverage] +run.source = ["magpylib"] +report.exclude_also = [ + '\.\.\.', + 'if typing.TYPE_CHECKING:', +] + +[tool.mypy] +files = ["src", "tests"] +python_version = "3.11" +warn_unused_configs = true +strict = true +enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"] +warn_unreachable = true +disallow_untyped_defs = false +disallow_incomplete_defs = false + +[[tool.mypy.overrides]] +module = "magpylib.*" +disallow_untyped_defs = true +disallow_incomplete_defs = true + + +[tool.ruff] + +[tool.ruff.lint] +extend-select = [ + "ARG", # flake8-unused-arguments + "B", # flake8-bugbear + "C4", # flake8-comprehensions + "EM", # flake8-errmsg + "EXE", # flake8-executable + "G", # flake8-logging-format + "I", # isort + "ICN", # flake8-import-conventions + "NPY", # NumPy specific rules + "PD", # pandas-vet + "PGH", # pygrep-hooks + "PIE", # flake8-pie + "PL", # pylint + "PT", # flake8-pytest-style + "PTH", # flake8-use-pathlib + "RET", # flake8-return + "RUF", # Ruff-specific + "SIM", # flake8-simplify + "T20", # flake8-print + "UP", # pyupgrade + "YTT", # flake8-2020 +] +ignore = [ + "PLR09", # Too many <...> + "PLR2004", # Magic value used in comparison +] +isort.required-imports = ["from __future__ import annotations"] +# Uncomment if using a _compat.typing backport +# typing-modules = ["magpylib._compat.typing"] + +[tool.ruff.lint.per-file-ignores] +"tests/**" = ["T20"] +"noxfile.py" = ["T20"] + + +[tool.pylint] +py-version = "3.11" +ignore-paths = [".*/_version.py"] +reports.output-format = "colorized" +similarities.ignore-imports = "yes" +messages_control.disable = [ + "design", + "fixme", + "line-too-long", + "missing-module-docstring", + "missing-function-docstring", + "wrong-import-position", + "invalid-name", # TODO - review later + "protected-access", # TODO - review later + "unused-argument", # already covered by ruff +] diff --git a/src/magpylib/__init__.py b/src/magpylib/__init__.py new file mode 100644 index 000000000..f3306e1dd --- /dev/null +++ b/src/magpylib/__init__.py @@ -0,0 +1,45 @@ +""" +Copyright (c) 2025 Michael Ortner. All rights reserved. + +magpylib: Python package for computation of magnetic fields of magnets, currents and moments. +""" + +from __future__ import annotations + +from ._version import version as __version__ + +from scipy.constants import mu_0 + +from magpylib import core +from magpylib import current +from magpylib import graphics +from magpylib import magnet +from magpylib import misc +from magpylib._src.defaults.defaults_classes import default_settings as defaults +from magpylib._src.defaults.defaults_utility import SUPPORTED_PLOTTING_BACKENDS +from magpylib._src.display.display import show +from magpylib._src.display.display import show_context +from magpylib._src.fields import getB +from magpylib._src.fields import getH +from magpylib._src.fields import getJ +from magpylib._src.fields import getM +from magpylib._src.obj_classes.class_Collection import Collection +from magpylib._src.obj_classes.class_Sensor import Sensor + +__all__ = ["__version__", + "magnet", + "current", + "misc", + "getB", + "getH", + "getM", + "getJ", + "Sensor", + "Collection", + "show", + "show_context", + "defaults", + "core", + "graphics", + "mu_0", +] diff --git a/magpylib/_src/__init__.py b/src/magpylib/_src/__init__.py similarity index 100% rename from magpylib/_src/__init__.py rename to src/magpylib/_src/__init__.py diff --git a/magpylib/_src/defaults/__init__.py b/src/magpylib/_src/defaults/__init__.py similarity index 100% rename from magpylib/_src/defaults/__init__.py rename to src/magpylib/_src/defaults/__init__.py diff --git a/magpylib/_src/defaults/defaults_classes.py b/src/magpylib/_src/defaults/defaults_classes.py similarity index 100% rename from magpylib/_src/defaults/defaults_classes.py rename to src/magpylib/_src/defaults/defaults_classes.py diff --git a/magpylib/_src/defaults/defaults_utility.py b/src/magpylib/_src/defaults/defaults_utility.py similarity index 100% rename from magpylib/_src/defaults/defaults_utility.py rename to src/magpylib/_src/defaults/defaults_utility.py diff --git a/magpylib/_src/defaults/defaults_values.py b/src/magpylib/_src/defaults/defaults_values.py similarity index 100% rename from magpylib/_src/defaults/defaults_values.py rename to src/magpylib/_src/defaults/defaults_values.py diff --git a/magpylib/_src/display/__init__.py b/src/magpylib/_src/display/__init__.py similarity index 100% rename from magpylib/_src/display/__init__.py rename to src/magpylib/_src/display/__init__.py diff --git a/magpylib/_src/display/backend_matplotlib.py b/src/magpylib/_src/display/backend_matplotlib.py similarity index 100% rename from magpylib/_src/display/backend_matplotlib.py rename to src/magpylib/_src/display/backend_matplotlib.py diff --git a/magpylib/_src/display/backend_plotly.py b/src/magpylib/_src/display/backend_plotly.py similarity index 100% rename from magpylib/_src/display/backend_plotly.py rename to src/magpylib/_src/display/backend_plotly.py diff --git a/magpylib/_src/display/backend_pyvista.py b/src/magpylib/_src/display/backend_pyvista.py similarity index 100% rename from magpylib/_src/display/backend_pyvista.py rename to src/magpylib/_src/display/backend_pyvista.py diff --git a/magpylib/_src/display/display.py b/src/magpylib/_src/display/display.py similarity index 100% rename from magpylib/_src/display/display.py rename to src/magpylib/_src/display/display.py diff --git a/magpylib/_src/display/sensor_mesh.py b/src/magpylib/_src/display/sensor_mesh.py similarity index 100% rename from magpylib/_src/display/sensor_mesh.py rename to src/magpylib/_src/display/sensor_mesh.py diff --git a/magpylib/_src/display/traces_base.py b/src/magpylib/_src/display/traces_base.py similarity index 100% rename from magpylib/_src/display/traces_base.py rename to src/magpylib/_src/display/traces_base.py diff --git a/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py similarity index 100% rename from magpylib/_src/display/traces_core.py rename to src/magpylib/_src/display/traces_core.py diff --git a/magpylib/_src/display/traces_generic.py b/src/magpylib/_src/display/traces_generic.py similarity index 100% rename from magpylib/_src/display/traces_generic.py rename to src/magpylib/_src/display/traces_generic.py diff --git a/magpylib/_src/display/traces_utility.py b/src/magpylib/_src/display/traces_utility.py similarity index 100% rename from magpylib/_src/display/traces_utility.py rename to src/magpylib/_src/display/traces_utility.py diff --git a/magpylib/_src/exceptions.py b/src/magpylib/_src/exceptions.py similarity index 100% rename from magpylib/_src/exceptions.py rename to src/magpylib/_src/exceptions.py diff --git a/magpylib/_src/fields/__init__.py b/src/magpylib/_src/fields/__init__.py similarity index 100% rename from magpylib/_src/fields/__init__.py rename to src/magpylib/_src/fields/__init__.py diff --git a/magpylib/_src/fields/field_BH_circle.py b/src/magpylib/_src/fields/field_BH_circle.py similarity index 100% rename from magpylib/_src/fields/field_BH_circle.py rename to src/magpylib/_src/fields/field_BH_circle.py diff --git a/magpylib/_src/fields/field_BH_cuboid.py b/src/magpylib/_src/fields/field_BH_cuboid.py similarity index 100% rename from magpylib/_src/fields/field_BH_cuboid.py rename to src/magpylib/_src/fields/field_BH_cuboid.py diff --git a/magpylib/_src/fields/field_BH_cylinder.py b/src/magpylib/_src/fields/field_BH_cylinder.py similarity index 100% rename from magpylib/_src/fields/field_BH_cylinder.py rename to src/magpylib/_src/fields/field_BH_cylinder.py diff --git a/magpylib/_src/fields/field_BH_cylinder_segment.py b/src/magpylib/_src/fields/field_BH_cylinder_segment.py similarity index 100% rename from magpylib/_src/fields/field_BH_cylinder_segment.py rename to src/magpylib/_src/fields/field_BH_cylinder_segment.py diff --git a/magpylib/_src/fields/field_BH_dipole.py b/src/magpylib/_src/fields/field_BH_dipole.py similarity index 100% rename from magpylib/_src/fields/field_BH_dipole.py rename to src/magpylib/_src/fields/field_BH_dipole.py diff --git a/magpylib/_src/fields/field_BH_polyline.py b/src/magpylib/_src/fields/field_BH_polyline.py similarity index 100% rename from magpylib/_src/fields/field_BH_polyline.py rename to src/magpylib/_src/fields/field_BH_polyline.py diff --git a/magpylib/_src/fields/field_BH_sphere.py b/src/magpylib/_src/fields/field_BH_sphere.py similarity index 100% rename from magpylib/_src/fields/field_BH_sphere.py rename to src/magpylib/_src/fields/field_BH_sphere.py diff --git a/magpylib/_src/fields/field_BH_tetrahedron.py b/src/magpylib/_src/fields/field_BH_tetrahedron.py similarity index 100% rename from magpylib/_src/fields/field_BH_tetrahedron.py rename to src/magpylib/_src/fields/field_BH_tetrahedron.py diff --git a/magpylib/_src/fields/field_BH_triangle.py b/src/magpylib/_src/fields/field_BH_triangle.py similarity index 100% rename from magpylib/_src/fields/field_BH_triangle.py rename to src/magpylib/_src/fields/field_BH_triangle.py diff --git a/magpylib/_src/fields/field_BH_triangularmesh.py b/src/magpylib/_src/fields/field_BH_triangularmesh.py similarity index 100% rename from magpylib/_src/fields/field_BH_triangularmesh.py rename to src/magpylib/_src/fields/field_BH_triangularmesh.py diff --git a/magpylib/_src/fields/field_wrap_BH.py b/src/magpylib/_src/fields/field_wrap_BH.py similarity index 100% rename from magpylib/_src/fields/field_wrap_BH.py rename to src/magpylib/_src/fields/field_wrap_BH.py diff --git a/magpylib/_src/fields/special_cel.py b/src/magpylib/_src/fields/special_cel.py similarity index 100% rename from magpylib/_src/fields/special_cel.py rename to src/magpylib/_src/fields/special_cel.py diff --git a/magpylib/_src/fields/special_el3.py b/src/magpylib/_src/fields/special_el3.py similarity index 100% rename from magpylib/_src/fields/special_el3.py rename to src/magpylib/_src/fields/special_el3.py diff --git a/magpylib/_src/input_checks.py b/src/magpylib/_src/input_checks.py similarity index 100% rename from magpylib/_src/input_checks.py rename to src/magpylib/_src/input_checks.py diff --git a/magpylib/_src/obj_classes/__init__.py b/src/magpylib/_src/obj_classes/__init__.py similarity index 100% rename from magpylib/_src/obj_classes/__init__.py rename to src/magpylib/_src/obj_classes/__init__.py diff --git a/magpylib/_src/obj_classes/class_BaseDisplayRepr.py b/src/magpylib/_src/obj_classes/class_BaseDisplayRepr.py similarity index 100% rename from magpylib/_src/obj_classes/class_BaseDisplayRepr.py rename to src/magpylib/_src/obj_classes/class_BaseDisplayRepr.py diff --git a/magpylib/_src/obj_classes/class_BaseExcitations.py b/src/magpylib/_src/obj_classes/class_BaseExcitations.py similarity index 100% rename from magpylib/_src/obj_classes/class_BaseExcitations.py rename to src/magpylib/_src/obj_classes/class_BaseExcitations.py diff --git a/magpylib/_src/obj_classes/class_BaseGeo.py b/src/magpylib/_src/obj_classes/class_BaseGeo.py similarity index 100% rename from magpylib/_src/obj_classes/class_BaseGeo.py rename to src/magpylib/_src/obj_classes/class_BaseGeo.py diff --git a/magpylib/_src/obj_classes/class_BaseTransform.py b/src/magpylib/_src/obj_classes/class_BaseTransform.py similarity index 100% rename from magpylib/_src/obj_classes/class_BaseTransform.py rename to src/magpylib/_src/obj_classes/class_BaseTransform.py diff --git a/magpylib/_src/obj_classes/class_Collection.py b/src/magpylib/_src/obj_classes/class_Collection.py similarity index 100% rename from magpylib/_src/obj_classes/class_Collection.py rename to src/magpylib/_src/obj_classes/class_Collection.py diff --git a/magpylib/_src/obj_classes/class_Sensor.py b/src/magpylib/_src/obj_classes/class_Sensor.py similarity index 100% rename from magpylib/_src/obj_classes/class_Sensor.py rename to src/magpylib/_src/obj_classes/class_Sensor.py diff --git a/magpylib/_src/obj_classes/class_current_Circle.py b/src/magpylib/_src/obj_classes/class_current_Circle.py similarity index 100% rename from magpylib/_src/obj_classes/class_current_Circle.py rename to src/magpylib/_src/obj_classes/class_current_Circle.py diff --git a/magpylib/_src/obj_classes/class_current_Polyline.py b/src/magpylib/_src/obj_classes/class_current_Polyline.py similarity index 100% rename from magpylib/_src/obj_classes/class_current_Polyline.py rename to src/magpylib/_src/obj_classes/class_current_Polyline.py diff --git a/magpylib/_src/obj_classes/class_magnet_Cuboid.py b/src/magpylib/_src/obj_classes/class_magnet_Cuboid.py similarity index 100% rename from magpylib/_src/obj_classes/class_magnet_Cuboid.py rename to src/magpylib/_src/obj_classes/class_magnet_Cuboid.py diff --git a/magpylib/_src/obj_classes/class_magnet_Cylinder.py b/src/magpylib/_src/obj_classes/class_magnet_Cylinder.py similarity index 100% rename from magpylib/_src/obj_classes/class_magnet_Cylinder.py rename to src/magpylib/_src/obj_classes/class_magnet_Cylinder.py diff --git a/magpylib/_src/obj_classes/class_magnet_CylinderSegment.py b/src/magpylib/_src/obj_classes/class_magnet_CylinderSegment.py similarity index 100% rename from magpylib/_src/obj_classes/class_magnet_CylinderSegment.py rename to src/magpylib/_src/obj_classes/class_magnet_CylinderSegment.py diff --git a/magpylib/_src/obj_classes/class_magnet_Sphere.py b/src/magpylib/_src/obj_classes/class_magnet_Sphere.py similarity index 100% rename from magpylib/_src/obj_classes/class_magnet_Sphere.py rename to src/magpylib/_src/obj_classes/class_magnet_Sphere.py diff --git a/magpylib/_src/obj_classes/class_magnet_Tetrahedron.py b/src/magpylib/_src/obj_classes/class_magnet_Tetrahedron.py similarity index 100% rename from magpylib/_src/obj_classes/class_magnet_Tetrahedron.py rename to src/magpylib/_src/obj_classes/class_magnet_Tetrahedron.py diff --git a/magpylib/_src/obj_classes/class_magnet_TriangularMesh.py b/src/magpylib/_src/obj_classes/class_magnet_TriangularMesh.py similarity index 100% rename from magpylib/_src/obj_classes/class_magnet_TriangularMesh.py rename to src/magpylib/_src/obj_classes/class_magnet_TriangularMesh.py diff --git a/magpylib/_src/obj_classes/class_misc_CustomSource.py b/src/magpylib/_src/obj_classes/class_misc_CustomSource.py similarity index 100% rename from magpylib/_src/obj_classes/class_misc_CustomSource.py rename to src/magpylib/_src/obj_classes/class_misc_CustomSource.py diff --git a/magpylib/_src/obj_classes/class_misc_Dipole.py b/src/magpylib/_src/obj_classes/class_misc_Dipole.py similarity index 100% rename from magpylib/_src/obj_classes/class_misc_Dipole.py rename to src/magpylib/_src/obj_classes/class_misc_Dipole.py diff --git a/magpylib/_src/obj_classes/class_misc_Triangle.py b/src/magpylib/_src/obj_classes/class_misc_Triangle.py similarity index 100% rename from magpylib/_src/obj_classes/class_misc_Triangle.py rename to src/magpylib/_src/obj_classes/class_misc_Triangle.py diff --git a/magpylib/_src/style.py b/src/magpylib/_src/style.py similarity index 100% rename from magpylib/_src/style.py rename to src/magpylib/_src/style.py diff --git a/magpylib/_src/utility.py b/src/magpylib/_src/utility.py similarity index 100% rename from magpylib/_src/utility.py rename to src/magpylib/_src/utility.py diff --git a/src/magpylib/_version.pyi b/src/magpylib/_version.pyi new file mode 100644 index 000000000..91744f983 --- /dev/null +++ b/src/magpylib/_version.pyi @@ -0,0 +1,4 @@ +from __future__ import annotations + +version: str +version_tuple: tuple[int, int, int] | tuple[int, int, int, str, str] diff --git a/magpylib/core/__init__.py b/src/magpylib/core/__init__.py similarity index 100% rename from magpylib/core/__init__.py rename to src/magpylib/core/__init__.py diff --git a/magpylib/current/__init__.py b/src/magpylib/current/__init__.py similarity index 100% rename from magpylib/current/__init__.py rename to src/magpylib/current/__init__.py diff --git a/magpylib/graphics/__init__.py b/src/magpylib/graphics/__init__.py similarity index 100% rename from magpylib/graphics/__init__.py rename to src/magpylib/graphics/__init__.py diff --git a/magpylib/graphics/model3d/__init__.py b/src/magpylib/graphics/model3d/__init__.py similarity index 100% rename from magpylib/graphics/model3d/__init__.py rename to src/magpylib/graphics/model3d/__init__.py diff --git a/magpylib/graphics/style/__init__.py b/src/magpylib/graphics/style/__init__.py similarity index 100% rename from magpylib/graphics/style/__init__.py rename to src/magpylib/graphics/style/__init__.py diff --git a/magpylib/magnet/__init__.py b/src/magpylib/magnet/__init__.py similarity index 100% rename from magpylib/magnet/__init__.py rename to src/magpylib/magnet/__init__.py diff --git a/magpylib/misc/__init__.py b/src/magpylib/misc/__init__.py similarity index 100% rename from magpylib/misc/__init__.py rename to src/magpylib/misc/__init__.py diff --git a/src/magpylib/py.typed b/src/magpylib/py.typed new file mode 100644 index 000000000..e69de29bb diff --git a/tests/test_package.py b/tests/test_package.py new file mode 100644 index 000000000..ecd393909 --- /dev/null +++ b/tests/test_package.py @@ -0,0 +1,9 @@ +from __future__ import annotations + +import importlib.metadata + +import magpylib as m + + +def test_version(): + assert importlib.metadata.version("magpylib") == m.__version__ diff --git a/tox.ini b/tox.ini deleted file mode 100644 index 62ad23d13..000000000 --- a/tox.ini +++ /dev/null @@ -1,28 +0,0 @@ -[tox] -min_version = 4.11.4 -env_list = - py311 - -[gh] -python = - 3.12 = py312 - 3.11 = py311 #, type - 3.10 = py310 - -[testenv] -description = run the tests with pytest -package = wheel -wheel_build_env = .pkg -deps = - pytest>=7 - pytest-sugar -extras = test -commands = - pytest {tty:--color=yes} {posargs} - -[testenv:docs] -description = build documentation -extras = docs -commands = - sphinx-build -d "{envtmpdir}{/}doctree" docs "{toxworkdir}{/}docs_out" --color -b html - python -c 'print(r"documentation available under file:\\{toxworkdir}{/}docs_out{/}index.html")' From 8f9cc482422bce2a6f292cef356e523bc820f1b0 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Mon, 21 Apr 2025 20:51:47 +0200 Subject: [PATCH 112/211] add uv as hatch installer --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index d0788aebf..0ba3bfb27 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -91,6 +91,7 @@ version.source = "vcs" build.hooks.vcs.version-file = "src/magpylib/_version.py" [tool.hatch.envs.default] +installer = "uv" features = ["test"] scripts.test = "pytest {args}" From c8792d2739dd08df93d95977a62f2aeb0a6f68f2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 21 Apr 2025 19:06:45 +0000 Subject: [PATCH 113/211] style: pre-commit fixes --- .binder/apt.txt | 2 +- .../labconfig/default_setting_overrides.json | 12 +- .binder/postBuild | 2 +- .binder/start | 2 +- CHANGELOG.md | 817 +++++++++++++----- CODE_OF_CONDUCT.md | 101 ++- CONTRIBUTING.md | 72 +- LICENSE | 2 +- README.md | 59 +- docs/README.md | 28 +- docs/_pages/API_reference.md | 3 +- docs/_pages/changelog_.md | 8 +- .../contributing/cont_code_of_conduct.md | 3 +- docs/_pages/contributing/cont_contributing.md | 3 +- docs/_pages/contributing/cont_index.md | 3 +- docs/_pages/contributing/cont_license.md | 12 +- docs/_pages/user_guide/docs/docs_classes.md | 574 ++++++------ docs/_pages/user_guide/docs/docs_fieldcomp.md | 146 ++-- docs/_pages/user_guide/docs/docs_graphics.md | 199 +++-- .../user_guide/docs/docs_magpylib_force.md | 77 +- docs/_pages/user_guide/docs/docs_pos_ori.md | 277 +++--- docs/_pages/user_guide/docs/docs_styles.md | 155 +++- .../user_guide/docs/docs_units_types.md | 47 +- .../user_guide/examples/examples_app_coils.md | 34 +- .../examples/examples_app_end_of_shaft.md | 14 +- .../examples/examples_app_halbach.md | 12 +- .../examples/examples_app_scales.md | 3 +- .../examples/examples_force_floating.md | 70 +- .../examples/examples_force_force.md | 13 +- .../examples/examples_force_holding_force.md | 26 +- .../user_guide/examples/examples_index.md | 326 +++---- .../examples/examples_misc_compound.md | 31 +- .../examples_misc_field_interpolation.md | 24 +- .../examples/examples_misc_inhom.md | 45 +- .../examples/examples_shapes_cad.md | 5 +- .../examples/examples_shapes_convex_hull.md | 11 +- .../examples/examples_shapes_pyvista.md | 17 +- .../examples/examples_shapes_superpos.md | 78 +- .../examples/examples_shapes_triangle.md | 55 +- .../examples/examples_tutorial_collection.md | 74 +- .../examples/examples_tutorial_custom.md | 31 +- .../examples_tutorial_field_computation.md | 47 +- .../examples_tutorial_modeling_magnets.md | 195 +++-- .../examples/examples_tutorial_paths.md | 45 +- .../examples/examples_vis_animations.md | 73 +- .../examples/examples_vis_magnet_colors.md | 16 +- .../examples/examples_vis_mpl_streamplot.md | 20 +- .../examples/examples_vis_pv_streamlines.md | 6 +- .../examples/examples_vis_subplots.md | 27 +- docs/_pages/user_guide/guide_index.md | 4 +- .../user_guide/guide_resources_01_physics.md | 223 +++-- .../user_guide/guide_start_01_install.md | 27 +- .../user_guide/guide_start_02_fundamentals.md | 184 ++-- docs/_static/custom.css | 18 +- docs/_static/switcher.json | 46 +- docs/_static/webcode/copybutton.js | 140 +-- docs/_static/webcode/summaryOpen.js | 32 +- docs/conf.py | 2 +- docs/index.md | 57 +- src/magpylib/__init__.py | 39 +- .../_src/defaults/defaults_classes.py | 40 +- .../_src/defaults/defaults_utility.py | 15 +- src/magpylib/_src/defaults/defaults_values.py | 2 + .../_src/display/backend_matplotlib.py | 12 +- src/magpylib/_src/display/backend_plotly.py | 9 +- src/magpylib/_src/display/backend_pyvista.py | 1 + src/magpylib/_src/display/display.py | 26 +- src/magpylib/_src/display/sensor_mesh.py | 3 +- src/magpylib/_src/display/traces_base.py | 6 +- src/magpylib/_src/display/traces_core.py | 62 +- src/magpylib/_src/display/traces_generic.py | 69 +- src/magpylib/_src/display/traces_utility.py | 47 +- src/magpylib/_src/exceptions.py | 2 + src/magpylib/_src/fields/__init__.py | 9 +- src/magpylib/_src/fields/field_BH_circle.py | 7 +- src/magpylib/_src/fields/field_BH_cuboid.py | 4 +- src/magpylib/_src/fields/field_BH_cylinder.py | 9 +- .../_src/fields/field_BH_cylinder_segment.py | 8 +- src/magpylib/_src/fields/field_BH_dipole.py | 4 +- src/magpylib/_src/fields/field_BH_polyline.py | 3 +- src/magpylib/_src/fields/field_BH_sphere.py | 4 +- .../_src/fields/field_BH_tetrahedron.py | 4 +- src/magpylib/_src/fields/field_BH_triangle.py | 4 +- .../_src/fields/field_BH_triangularmesh.py | 6 +- src/magpylib/_src/fields/field_wrap_BH.py | 46 +- src/magpylib/_src/fields/special_cel.py | 5 +- src/magpylib/_src/fields/special_el3.py | 4 +- src/magpylib/_src/input_checks.py | 27 +- .../_src/obj_classes/class_BaseDisplayRepr.py | 16 +- .../_src/obj_classes/class_BaseExcitations.py | 12 +- .../_src/obj_classes/class_BaseGeo.py | 8 +- .../_src/obj_classes/class_BaseTransform.py | 17 +- .../_src/obj_classes/class_Collection.py | 10 +- src/magpylib/_src/obj_classes/class_Sensor.py | 4 +- .../_src/obj_classes/class_current_Circle.py | 2 + .../obj_classes/class_current_Polyline.py | 2 + .../_src/obj_classes/class_magnet_Cuboid.py | 2 + .../_src/obj_classes/class_magnet_Cylinder.py | 2 + .../class_magnet_CylinderSegment.py | 2 + .../_src/obj_classes/class_magnet_Sphere.py | 2 + .../obj_classes/class_magnet_Tetrahedron.py | 2 + .../class_magnet_TriangularMesh.py | 24 +- .../obj_classes/class_misc_CustomSource.py | 2 + .../_src/obj_classes/class_misc_Dipole.py | 2 + .../_src/obj_classes/class_misc_Triangle.py | 2 + src/magpylib/_src/style.py | 139 ++- src/magpylib/_src/utility.py | 58 +- src/magpylib/core/__init__.py | 14 +- src/magpylib/current/__init__.py | 10 +- src/magpylib/graphics/__init__.py | 7 +- src/magpylib/graphics/model3d/__init__.py | 24 +- src/magpylib/graphics/style/__init__.py | 9 +- src/magpylib/magnet/__init__.py | 4 +- src/magpylib/misc/__init__.py | 4 +- tests/test_BHMJ_level.py | 10 +- tests/test_BaseTransform.py | 5 +- tests/test_Coumpound_setters.py | 10 +- tests/test_CustomSource.py | 2 + tests/test__missing_optional_modules.py | 2 + tests/test_core.py | 2 + tests/test_core_physics_consistency.py | 8 +- tests/test_default_utils.py | 38 +- tests/test_defaults.py | 10 +- tests/test_display_matplotlib.py | 2 + tests/test_display_plotly.py | 11 +- tests/test_display_pyvista.py | 4 +- tests/test_display_utility.py | 8 +- tests/test_elliptics.py | 17 +- tests/test_exceptions.py | 6 +- tests/test_field_cylinder.py | 4 +- tests/test_getBH_dict.py | 5 +- tests/test_getBH_interfaces.py | 2 + tests/test_getBH_level2.py | 20 +- tests/test_input_checks.py | 10 +- tests/test_misc.py | 2 + tests/test_numerical_stability.py | 2 + tests/test_obj_BaseGeo.py | 4 +- tests/test_obj_BaseGeo_v4motion.py | 10 +- tests/test_obj_Circle.py | 2 + tests/test_obj_Collection.py | 6 +- tests/test_obj_Collection_child_parent.py | 2 + tests/test_obj_Collection_v4motion.py | 13 +- tests/test_obj_Cuboid.py | 6 +- tests/test_obj_Cylinder.py | 4 +- tests/test_obj_CylinderSegment.py | 4 +- tests/test_obj_Dipole.py | 2 + tests/test_obj_Polyline.py | 2 + tests/test_obj_Sensor.py | 2 + tests/test_obj_Sphere.py | 6 +- tests/test_obj_Tetrahedron.py | 2 + tests/test_obj_Triangle.py | 2 + tests/test_obj_TriangularMesh.py | 10 +- tests/test_path.py | 2 + tests/test_physics_consistency.py | 2 + tests/test_scaling.py | 2 + tests/test_utility.py | 6 +- tests/test_vs_mag2.py | 2 + 157 files changed, 3639 insertions(+), 2124 deletions(-) diff --git a/.binder/apt.txt b/.binder/apt.txt index df634497d..e5f2b6eb1 100644 --- a/.binder/apt.txt +++ b/.binder/apt.txt @@ -1,2 +1,2 @@ libgl1-mesa-dev -xvfb \ No newline at end of file +xvfb diff --git a/.binder/labconfig/default_setting_overrides.json b/.binder/labconfig/default_setting_overrides.json index 145c434be..84c367341 100644 --- a/.binder/labconfig/default_setting_overrides.json +++ b/.binder/labconfig/default_setting_overrides.json @@ -1,8 +1,8 @@ { - "@jupyterlab/docmanager-extension:plugin": { - "defaultViewers": { - "markdown": "Jupytext Notebook", - "myst": "Jupytext Notebook" - } + "@jupyterlab/docmanager-extension:plugin": { + "defaultViewers": { + "markdown": "Jupytext Notebook", + "myst": "Jupytext Notebook" } - } \ No newline at end of file + } +} diff --git a/.binder/postBuild b/.binder/postBuild index 002498f2b..2514e5133 100644 --- a/.binder/postBuild +++ b/.binder/postBuild @@ -3,4 +3,4 @@ set -e # See https://github.com/mwouts/jupytext/issues/803#issuecomment-982170660 mkdir -p ${HOME}/.jupyter/labconfig -cp .binder/labconfig/* ${HOME}/.jupyter/labconfig \ No newline at end of file +cp .binder/labconfig/* ${HOME}/.jupyter/labconfig diff --git a/.binder/start b/.binder/start index d3aec7575..ba526b95f 100644 --- a/.binder/start +++ b/.binder/start @@ -7,4 +7,4 @@ which Xvfb Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & sleep 3 set +x -exec "$@" \ No newline at end of file +exec "$@" diff --git a/CHANGELOG.md b/CHANGELOG.md index 62c67d76d..f3b977ef3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,122 +1,248 @@ # Changelog ## [Unreleased] - YYYY-MM-DD -- Improved docstrings by adding examples where missing and by using rounding in all examples to avoid doctest fails + +- Improved docstrings by adding examples where missing and by using rounding in + all examples to avoid doctest fails - Fixed a bug where a core getH would return the B-field -- Input `in_out` is by default set to `"auto"` for collections to avoiding ambiguities. -- Improve documentation ([#829](https://github.com/magpylib/magpylib/issues/829)) +- Input `in_out` is by default set to `"auto"` for collections to avoiding + ambiguities. +- Improve documentation + ([#829](https://github.com/magpylib/magpylib/issues/829)) ## [5.1.1] - 2024-10-31 + - Included magpylib-force version 0.3.1 in documentation - Removed unused issue templates and improved PR template ## [5.1.0] - 2024-10-09 -- Fixed a bug where the magnetization arrow graphical representation would be anchored badly after rotation ([#805](https://github.com/magpylib/magpylib/issues/805)) -- Added `units_length` input to the `show` function to allow displaying axes with different length units. This parameter can be set individually for each subplot. ([#786](https://github.com/magpylib/magpylib/pull/786)) -- Small documentation and Readme improvement. Change naming from "explicit expression" to "analytical expression" as described in ([#794](https://github.com/magpylib/magpylib/issues/794)). -- Fixed Pvyvista plot bounds not fitting on animation. Also enables `zoom` feature which was not working until now. ([#798](https://github.com/magpylib/magpylib/pull/798)) -- Fixed canvas layout being modified even when user-provided. Also added a new `canvas_update` parameter to choose the layout behavior (by default `"auto"`) ([#799](https://github.com/magpylib/magpylib/pull/799)) -- Improved documentation ([#766](https://github.com/magpylib/magpylib/issues/766), [#802](https://github.com/magpylib/magpylib/issues/802)) -- Documentation now includes force computation, which is still in a separate package "magpylib-force", but which will be integrated into Magplyib in the coming months. ([#787](https://github.com/magpylib/magpylib/issues/787)) + +- Fixed a bug where the magnetization arrow graphical representation would be + anchored badly after rotation + ([#805](https://github.com/magpylib/magpylib/issues/805)) +- Added `units_length` input to the `show` function to allow displaying axes + with different length units. This parameter can be set individually for each + subplot. ([#786](https://github.com/magpylib/magpylib/pull/786)) +- Small documentation and Readme improvement. Change naming from "explicit + expression" to "analytical expression" as described in + ([#794](https://github.com/magpylib/magpylib/issues/794)). +- Fixed Pvyvista plot bounds not fitting on animation. Also enables `zoom` + feature which was not working until now. + ([#798](https://github.com/magpylib/magpylib/pull/798)) +- Fixed canvas layout being modified even when user-provided. Also added a new + `canvas_update` parameter to choose the layout behavior (by default `"auto"`) + ([#799](https://github.com/magpylib/magpylib/pull/799)) +- Improved documentation + ([#766](https://github.com/magpylib/magpylib/issues/766), + [#802](https://github.com/magpylib/magpylib/issues/802)) +- Documentation now includes force computation, which is still in a separate + package "magpylib-force", but which will be integrated into Magplyib in the + coming months. ([#787](https://github.com/magpylib/magpylib/issues/787)) ## [5.0.4] - 2024-06-18 -- Added support for Numpy 2.0 ([#795](https://github.com/magpylib/magpylib/pull/789)) -- Fixed markers legend not being suppressible ([#795](https://github.com/magpylib/magpylib/pull/789)) + +- Added support for Numpy 2.0 + ([#795](https://github.com/magpylib/magpylib/pull/789)) +- Fixed markers legend not being suppressible + ([#795](https://github.com/magpylib/magpylib/pull/789)) ## [5.0.3] - 2024-06-03 -- Fixed subplot object properties propagation ([#780](https://github.com/magpylib/magpylib/pull/780)) -- Migrate to pydata-sphinx-theme and fix docs search function ([#762](https://github.com/magpylib/magpylib/pull/762)) -- Fixed docs version-switcher ([#782](https://github.com/magpylib/magpylib/pull/782)) + +- Fixed subplot object properties propagation + ([#780](https://github.com/magpylib/magpylib/pull/780)) +- Migrate to pydata-sphinx-theme and fix docs search function + ([#762](https://github.com/magpylib/magpylib/pull/762)) +- Fixed docs version-switcher + ([#782](https://github.com/magpylib/magpylib/pull/782)) ## [5.0.2] - 2024-05-21 -- Fixed a display issue causing incorrect calculation of view box limits ([#772](https://github.com/magpylib/magpylib/pull/772)) -- Removed support for python 3.8 and 3.9 by now following the scientific-python.org support timelines ([#773](https://github.com/magpylib/magpylib/pull/773)) -- Fixed CI testing with newer backend versions ([#774](https://github.com/magpylib/magpylib/pull/774)) -- Updated site notice to mention the awarded "small development grant" by NumFocus. ([#758](https://github.com/magpylib/magpylib/pull/758)) -- Fixed inaccurate citation year for Yang publication ([#764](https://github.com/magpylib/magpylib/pull/764), with thanks to @feldnerd for the contribution!) + +- Fixed a display issue causing incorrect calculation of view box limits + ([#772](https://github.com/magpylib/magpylib/pull/772)) +- Removed support for python 3.8 and 3.9 by now following the + scientific-python.org support timelines + ([#773](https://github.com/magpylib/magpylib/pull/773)) +- Fixed CI testing with newer backend versions + ([#774](https://github.com/magpylib/magpylib/pull/774)) +- Updated site notice to mention the awarded "small development grant" by + NumFocus. ([#758](https://github.com/magpylib/magpylib/pull/758)) +- Fixed inaccurate citation year for Yang publication + ([#764](https://github.com/magpylib/magpylib/pull/764), with thanks to + @feldnerd for the contribution!) ## [5.0.1] - 2024-04-12 -- Fixed a bug where `getBHJM` of a Collection would produce one extra dimension ([#753](https://github.com/magpylib/magpylib/issues/753)) -- Fixed a bug where the legend of a deeply nested Collection would be wrong ([#756](https://github.com/magpylib/magpylib/issues/756)) + +- Fixed a bug where `getBHJM` of a Collection would produce one extra dimension + ([#753](https://github.com/magpylib/magpylib/issues/753)) +- Fixed a bug where the legend of a deeply nested Collection would be wrong + ([#756](https://github.com/magpylib/magpylib/issues/756)) ## [5.0.0] - 2024-03-13 + ### ⚠️ Breaking Changes ⚠️ + - The Magpylib inputs and outputs are now in **SI Units**. -- The `magnetization` parameter has also been redefined to reflect the true physical magnetization quantity in units of A/m. +- The `magnetization` parameter has also been redefined to reflect the true + physical magnetization quantity in units of A/m. + ### Other Improvements -- The `magnetization` parameter is now codependent with the new `polarization` parameter that is the physical magnetic polarization ([#712](https://github.com/magpylib/magpylib/issues/712)) in units of Tesla -- Added `getM` (magnetization) and `getJ` (polarization) top level functions and class methods reminiscent of `getB` and `getH`. -- The `in_out` (inside/outside) parameter is added to all field functions (`getBHJM`) to specify the location of the observers relative to the magnet body in order to increase performance ([#717](https://github.com/magpylib/magpylib/issues/717), [#608](https://github.com/magpylib/magpylib/issues/608)) -- Review of documentation and adding a few requested things ([#685](https://github.com/magpylib/magpylib/issues/685), some of [#659](https://github.com/magpylib/magpylib/issues/659)) -- Added mu0 at top level as `magpylib.mu_0`. The value of mu0 is taken from scipy and follows the 2019 redefinition. All internal computations now include this new value. ([#714](https://github.com/magpylib/magpylib/issues/714), [#731](https://github.com/magpylib/magpylib/issues/731)) -- The core level now includes only the true bottom level implementations. ([#727](https://github.com/magpylib/magpylib/issues/727)) -- As Matplotlib graphic representation of 3D objects is terrible, we decided to go back to "arrow" graphic default mode when graphic backend is "Matplotlib".([#735](https://github.com/magpylib/magpylib/issues/735)) + +- The `magnetization` parameter is now codependent with the new `polarization` + parameter that is the physical magnetic polarization + ([#712](https://github.com/magpylib/magpylib/issues/712)) in units of Tesla +- Added `getM` (magnetization) and `getJ` (polarization) top level functions and + class methods reminiscent of `getB` and `getH`. +- The `in_out` (inside/outside) parameter is added to all field functions + (`getBHJM`) to specify the location of the observers relative to the magnet + body in order to increase performance + ([#717](https://github.com/magpylib/magpylib/issues/717), + [#608](https://github.com/magpylib/magpylib/issues/608)) +- Review of documentation and adding a few requested things + ([#685](https://github.com/magpylib/magpylib/issues/685), some of + [#659](https://github.com/magpylib/magpylib/issues/659)) +- Added mu0 at top level as `magpylib.mu_0`. The value of mu0 is taken from + scipy and follows the 2019 redefinition. All internal computations now include + this new value. ([#714](https://github.com/magpylib/magpylib/issues/714), + [#731](https://github.com/magpylib/magpylib/issues/731)) +- The core level now includes only the true bottom level implementations. + ([#727](https://github.com/magpylib/magpylib/issues/727)) +- As Matplotlib graphic representation of 3D objects is terrible, we decided to + go back to "arrow" graphic default mode when graphic backend is + "Matplotlib".([#735](https://github.com/magpylib/magpylib/issues/735)) ## [4.5.1] - 2023-12-28 -- Fixed a field computation issue where H-field resulting from axial magnetization is computed incorrectly inside of Cylinders ([#703](https://github.com/magpylib/magpylib/issues/703)) + +- Fixed a field computation issue where H-field resulting from axial + magnetization is computed incorrectly inside of Cylinders + ([#703](https://github.com/magpylib/magpylib/issues/703)) ## [4.5.0] - 2023-12-13 -- Added optional handedness parameter for Sensors ([#687](https://github.com/magpylib/magpylib/pull/687)) -- Renaming classes: `Line`→`Polyline`, `Loop`→`Circle`. Old names are still valid but will issue a `DeprecationWarning` and will eventually be removed in the next major version ([#690](https://github.com/magpylib/magpylib/pull/690)) + +- Added optional handedness parameter for Sensors + ([#687](https://github.com/magpylib/magpylib/pull/687)) +- Renaming classes: `Line`→`Polyline`, `Loop`→`Circle`. Old names are still + valid but will issue a `DeprecationWarning` and will eventually be removed in + the next major version ([#690](https://github.com/magpylib/magpylib/pull/690)) - Rework CI/CD workflows ([#686](https://github.com/magpylib/magpylib/pull/686)) ## [4.4.1] - 2023-11-09 -- Fixed deployment release ([#682](https://github.com/magpylib/magpylib/pull/682)) -- Fixed axis mismatch on show/hide of sensor arrows ([#679](https://github.com/magpylib/magpylib/pull/679)) -- Documentation improvements ([#673](https://github.com/magpylib/magpylib/pull/673)) +- Fixed deployment release + ([#682](https://github.com/magpylib/magpylib/pull/682)) +- Fixed axis mismatch on show/hide of sensor arrows + ([#679](https://github.com/magpylib/magpylib/pull/679)) +- Documentation improvements + ([#673](https://github.com/magpylib/magpylib/pull/673)) ## [4.4.0] - 2023-09-03 -- Included self-intersection check in `TriangularMesh` ([#622](https://github.com/magpylib/magpylib/pull/622)) -- Fixed incorrect edge case of TriangularMesh reorientation ([#644](https://github.com/magpylib/magpylib/pull/644)) -- Discontinuous segments in `current.Line` are now accepted and correctly treated as separate lines ([#632](https://github.com/magpylib/magpylib/pull/632), [#642](https://github.com/magpylib/magpylib/pull/642)) -- Objects can now be displayed with missing dimension and/or excitation ([#640](https://github.com/magpylib/magpylib/pull/640)) -- Added magnetization and current arrows `sizemode` styling option (absolute or scaled) ([#639](https://github.com/magpylib/magpylib/pull/639)) -- `Collection` objects now also have a default description when displayed (number of children) ([#634](https://github.com/magpylib/magpylib/pull/634)) -- Many minor graphic improvements ([#663](https://github.com/magpylib/magpylib/pull/663), [#649](https://github.com/magpylib/magpylib/issues/649), [#653](https://github.com/magpylib/magpylib/issues/653)) -- `legend` style option ([#650](https://github.com/magpylib/magpylib/issues/650)) -- Changed unit naming in text to comply with DIN Norm 641 ([#614](https://github.com/magpylib/magpylib/issues/614)) -- Improved documentation now boasting a contribution guide, a news-blog, an example and tutorial gallery, a getting started section and many other improvements ([#621](https://github.com/magpylib/magpylib/issues/621), [#596](https://github.com/magpylib/magpylib/issues/596), [#580](https://github.com/magpylib/magpylib/issues/580)) -- Improved numerical stability of `CylinderSegment`, ([#648](https://github.com/magpylib/magpylib/issues/648), [#651](https://github.com/magpylib/magpylib/issues/651)) +- Included self-intersection check in `TriangularMesh` + ([#622](https://github.com/magpylib/magpylib/pull/622)) +- Fixed incorrect edge case of TriangularMesh reorientation + ([#644](https://github.com/magpylib/magpylib/pull/644)) +- Discontinuous segments in `current.Line` are now accepted and correctly + treated as separate lines + ([#632](https://github.com/magpylib/magpylib/pull/632), + [#642](https://github.com/magpylib/magpylib/pull/642)) +- Objects can now be displayed with missing dimension and/or excitation + ([#640](https://github.com/magpylib/magpylib/pull/640)) +- Added magnetization and current arrows `sizemode` styling option (absolute or + scaled) ([#639](https://github.com/magpylib/magpylib/pull/639)) +- `Collection` objects now also have a default description when displayed + (number of children) ([#634](https://github.com/magpylib/magpylib/pull/634)) +- Many minor graphic improvements + ([#663](https://github.com/magpylib/magpylib/pull/663), + [#649](https://github.com/magpylib/magpylib/issues/649), + [#653](https://github.com/magpylib/magpylib/issues/653)) +- `legend` style option + ([#650](https://github.com/magpylib/magpylib/issues/650)) +- Changed unit naming in text to comply with DIN Norm 641 + ([#614](https://github.com/magpylib/magpylib/issues/614)) +- Improved documentation now boasting a contribution guide, a news-blog, an + example and tutorial gallery, a getting started section and many other + improvements ([#621](https://github.com/magpylib/magpylib/issues/621), + [#596](https://github.com/magpylib/magpylib/issues/596), + [#580](https://github.com/magpylib/magpylib/issues/580)) +- Improved numerical stability of `CylinderSegment`, + ([#648](https://github.com/magpylib/magpylib/issues/648), + [#651](https://github.com/magpylib/magpylib/issues/651)) ## [4.3.0] - 2023-06-25 -- New `TriangularMesh` magnet class added to conveniently work with triangular surface meshes instead of large collections of individual `Triangle` objects. The `TriangularMesh` class performs important checks (closed, connected, oriented) and can directly import Pyvista objects and for convex hull bodies. ([#569](https://github.com/magpylib/magpylib/issues/569), [#598](https://github.com/magpylib/magpylib/pull/598)). -- Added magnetization coloring for `matplotlib` backend ([#597](https://github.com/magpylib/magpylib/pull/597)) -- New automatic backend behavior, set to a dynamic default `auto` depending on the current environment and the given `canvas`, if provided. ([#617](https://github.com/magpylib/magpylib/pull/617)) -- Drop python 3.7 support, following python life cycle. ([#616](https://github.com/magpylib/magpylib/pull/616)) + +- New `TriangularMesh` magnet class added to conveniently work with triangular + surface meshes instead of large collections of individual `Triangle` objects. + The `TriangularMesh` class performs important checks (closed, connected, + oriented) and can directly import Pyvista objects and for convex hull bodies. + ([#569](https://github.com/magpylib/magpylib/issues/569), + [#598](https://github.com/magpylib/magpylib/pull/598)). +- Added magnetization coloring for `matplotlib` backend + ([#597](https://github.com/magpylib/magpylib/pull/597)) +- New automatic backend behavior, set to a dynamic default `auto` depending on + the current environment and the given `canvas`, if provided. + ([#617](https://github.com/magpylib/magpylib/pull/617)) +- Drop python 3.7 support, following python life cycle. + ([#616](https://github.com/magpylib/magpylib/pull/616)) ## [4.2.0] - 2023-01-27 -- (Re)introducing the powerful `misc.Triangle` class that can be used to compute magnetic fields of arbitrarily shaped bodies by approximating their surface with triangular faces. ([#568](https://github.com/magpylib/magpylib/issues/568)) -- Introducing the `magnet.Tetrahedron` class as a derivate of the Triangle class. ([#289](https://github.com/magpylib/magpylib/issues/289)) -- Change Pyvista plotting defaults when using `show(backend='pyvista')` to fit better with other libraries. ([#551](https://github.com/magpylib/magpylib/issues/551)) -- Added code of conduct attempting to align with NumFocus standards ([#558](https://github.com/magpylib/magpylib/issues/558)) -- Improved Loop field computation in terms of performance and numerical stability ([#374](https://github.com/magpylib/magpylib/issues/374)) -- Added `magnetization.mode` style to allow showing magnetization direction for any backend ([#576](https://github.com/magpylib/magpylib/pull/576)) + +- (Re)introducing the powerful `misc.Triangle` class that can be used to compute + magnetic fields of arbitrarily shaped bodies by approximating their surface + with triangular faces. + ([#568](https://github.com/magpylib/magpylib/issues/568)) +- Introducing the `magnet.Tetrahedron` class as a derivate of the Triangle + class. ([#289](https://github.com/magpylib/magpylib/issues/289)) +- Change Pyvista plotting defaults when using `show(backend='pyvista')` to fit + better with other libraries. + ([#551](https://github.com/magpylib/magpylib/issues/551)) +- Added code of conduct attempting to align with NumFocus standards + ([#558](https://github.com/magpylib/magpylib/issues/558)) +- Improved Loop field computation in terms of performance and numerical + stability ([#374](https://github.com/magpylib/magpylib/issues/374)) +- Added `magnetization.mode` style to allow showing magnetization direction for + any backend ([#576](https://github.com/magpylib/magpylib/pull/576)) - Documentation changes: - - Correct conda install command - - Integration of Triangle and Tetrahedron - - Changed example gallery substructure - - Rewritten and added some passages + - Correct conda install command + - Integration of Triangle and Tetrahedron + - Changed example gallery substructure + - Rewritten and added some passages - Fixed some bugs, minor performance increase, internal refactoring ## [4.1.2] - 2023-01-15 -- Fixed wrong magnetization arrow direction for some edge cases ([#570](https://github.com/magpylib/magpylib/discussions/570), [#571](https://github.com/magpylib/magpylib/issues/571), [#572](https://github.com/magpylib/magpylib/pull/572)) -- Fixed cryptic `getB`/`getH` error message ([#562](https://github.com/magpylib/magpylib/issues/562), [#563](https://github.com/magpylib/magpylib/pull/563)) + +- Fixed wrong magnetization arrow direction for some edge cases + ([#570](https://github.com/magpylib/magpylib/discussions/570), + [#571](https://github.com/magpylib/magpylib/issues/571), + [#572](https://github.com/magpylib/magpylib/pull/572)) +- Fixed cryptic `getB`/`getH` error message + ([#562](https://github.com/magpylib/magpylib/issues/562), + [#563](https://github.com/magpylib/magpylib/pull/563)) ## [4.1.1] - 2022-08-11 -- Fixed inverted y and z axes colors for sensor representations ([#556](https://github.com/magpylib/magpylib/pull/556)) + +- Fixed inverted y and z axes colors for sensor representations + ([#556](https://github.com/magpylib/magpylib/pull/556)) ## [4.1.0] - 2022-08-08 -- Field computation `getB`/`getH` now supports 2D [pandas](https://pandas.pydata.org/).[dataframe](https://pandas.pydata.org/docs/user_guide/dsintro.html#dataframe) in addition to the `numpy.ndarray` as output type. ([#523](https://github.com/magpylib/magpylib/pull/523)) -- Internal `getB`/`getH` refactoring. The direct interface with `'Line'` source argument now also accepts `'vertices'` as argument. ([#540](https://github.com/magpylib/magpylib/pull/540)) -- Complete plotting backend rework to prepare for easy implementation of new backends, with minimal maintenance. ([#539](https://github.com/magpylib/magpylib/pull/539)) -- New [Pyvista](https://docs.pyvista.org/) plotting backend ([#548](https://github.com/magpylib/magpylib/pull/548)) -- Improvements on the [documentation](https://magpylib.readthedocs.io/en/latest/) + +- Field computation `getB`/`getH` now supports 2D + [pandas](https://pandas.pydata.org/).[dataframe](https://pandas.pydata.org/docs/user_guide/dsintro.html#dataframe) + in addition to the `numpy.ndarray` as output type. + ([#523](https://github.com/magpylib/magpylib/pull/523)) +- Internal `getB`/`getH` refactoring. The direct interface with `'Line'` source + argument now also accepts `'vertices'` as argument. + ([#540](https://github.com/magpylib/magpylib/pull/540)) +- Complete plotting backend rework to prepare for easy implementation of new + backends, with minimal maintenance. + ([#539](https://github.com/magpylib/magpylib/pull/539)) +- New [Pyvista](https://docs.pyvista.org/) plotting backend + ([#548](https://github.com/magpylib/magpylib/pull/548)) +- Improvements on the + [documentation](https://magpylib.readthedocs.io/en/latest/) ## [4.0.4] - 2022-06-09 -- Exclude redundant properties with `_all` suffix in the `.describe()` method ([#534](https://github.com/magpylib/magpylib/pull/534)) +- Exclude redundant properties with `_all` suffix in the `.describe()` method + ([#534](https://github.com/magpylib/magpylib/pull/534)) - Docstring improvements ([#535](https://github.com/magpylib/magpylib/pull/535)) ## [4.0.3] - 2022-05-13 @@ -125,12 +251,15 @@ ## [4.0.2] - 2022-05-04 -- Fixed magnetization coloring with mesh grouping (Plotly) ([#526](https://github.com/magpylib/magpylib/pull/526)) -- Allow float color quadruples ([#529](https://github.com/magpylib/magpylib/pull/529)) +- Fixed magnetization coloring with mesh grouping (Plotly) + ([#526](https://github.com/magpylib/magpylib/pull/526)) +- Allow float color quadruples + ([#529](https://github.com/magpylib/magpylib/pull/529)) ## [4.0.1] - 2022-04-29 -- Graphic performance update for Plotly when showing a large number of objects. ([#524](https://github.com/magpylib/magpylib/pull/524)) +- Graphic performance update for Plotly when showing a large number of objects. + ([#524](https://github.com/magpylib/magpylib/pull/524)) ## [4.0.0] - 2022-04-14 @@ -141,116 +270,234 @@ This is a major update that includes - Improved internal workings ### Magpylib class changes/fixes: -- `Box` class renamed to `Cuboid`. ([#350](https://github.com/magpylib/magpylib/issues/350)) -- `Circular` class renamed to `Loop`. ([#402](https://github.com/magpylib/magpylib/pull/402)) -- New `CylinderSegment` class with dimension `(r1,r2,h,phi1,phi2)` with the inner radius `r1`, the outer radius `r2` the height `h` and the cylinder section angles `phi1 < phi2`. ([#386](https://github.com/magpylib/magpylib/issues/386), [#385](https://github.com/magpylib/magpylib/issues/385), [#484](https://github.com/magpylib/magpylib/pull/484), [#480](https://github.com/magpylib/magpylib/issues/480)) -- New `CustomSource` class for user defined field functions ([#349](https://github.com/magpylib/magpylib/issues/349), [#409](https://github.com/magpylib/magpylib/issues/409), [#411](https://github.com/magpylib/magpylib/pull/411), [#506](https://github.com/magpylib/magpylib/pull/506)) -- All Magpylib objects can now be initialized without excitation and dimension attributes. -- All classes now have the `parent` attribute to reference to a collection they are part of. Any object can only have a single parent. -- All classes have the `describe` method which gives a quick object property overview. + +- `Box` class renamed to `Cuboid`. + ([#350](https://github.com/magpylib/magpylib/issues/350)) +- `Circular` class renamed to `Loop`. + ([#402](https://github.com/magpylib/magpylib/pull/402)) +- New `CylinderSegment` class with dimension `(r1,r2,h,phi1,phi2)` with the + inner radius `r1`, the outer radius `r2` the height `h` and the cylinder + section angles `phi1 < phi2`. + ([#386](https://github.com/magpylib/magpylib/issues/386), + [#385](https://github.com/magpylib/magpylib/issues/385), + [#484](https://github.com/magpylib/magpylib/pull/484), + [#480](https://github.com/magpylib/magpylib/issues/480)) +- New `CustomSource` class for user defined field functions + ([#349](https://github.com/magpylib/magpylib/issues/349), + [#409](https://github.com/magpylib/magpylib/issues/409), + [#411](https://github.com/magpylib/magpylib/pull/411), + [#506](https://github.com/magpylib/magpylib/pull/506)) +- All Magpylib objects can now be initialized without excitation and dimension + attributes. +- All classes now have the `parent` attribute to reference to a collection they + are part of. Any object can only have a single parent. +- All classes have the `describe` method which gives a quick object property + overview. ### Field computation changes/fixes: -- New computation core. Added top level subpackage `magpylib.core` where all field implementations can be accessed directly without the position/orientation interface. ([#376](https://github.com/magpylib/magpylib/issues/376)) -- Direct interface functions `getBdict` and `getHdict` (previously `getBv` and `getHv`) are now integrated into `getB` and `getH`. See docs for details ([#449](https://github.com/magpylib/magpylib/pull/449)) -- Generally improved field expressions: ([#374](https://github.com/magpylib/magpylib/issues/374)) - - Negative dimension input taken as absolute when only positive dimensions are allowed. + +- New computation core. Added top level subpackage `magpylib.core` where all + field implementations can be accessed directly without the + position/orientation interface. + ([#376](https://github.com/magpylib/magpylib/issues/376)) +- Direct interface functions `getBdict` and `getHdict` (previously `getBv` and + `getHv`) are now integrated into `getB` and `getH`. See docs for details + ([#449](https://github.com/magpylib/magpylib/pull/449)) +- Generally improved field expressions: + ([#374](https://github.com/magpylib/magpylib/issues/374)) + - Negative dimension input taken as absolute when only positive dimensions are + allowed. - Scale invariant field evaluations. - - Special cases caught within 1e-15 rtol and atol to account for numerical imprecision with positioning (e.g. object rotation). - - Suppress Numpy divide/invalid warnings. return `np.nan` as `(0,0,0)` (e.g. on magnet edges or on line currents) and allow return of `np.inf`. - - New closed form implementation for `Cylinder` with diametral magnetization is much faster (100-1000x) and numerically stable for small `r`. ([#404](https://github.com/magpylib/magpylib/issues/404), [#370](https://github.com/magpylib/magpylib/issues/370)) - - Improved numerical stability of current loop field. Now 12-14 correct digits everywhere. ([#374](https://github.com/magpylib/magpylib/issues/374)) - - Fixed `Collection` of `Lines` field computation error. ([#368](https://github.com/magpylib/magpylib/issues/368)) + - Special cases caught within 1e-15 rtol and atol to account for numerical + imprecision with positioning (e.g. object rotation). + - Suppress Numpy divide/invalid warnings. return `np.nan` as `(0,0,0)` (e.g. + on magnet edges or on line currents) and allow return of `np.inf`. + - New closed form implementation for `Cylinder` with diametral magnetization + is much faster (100-1000x) and numerically stable for small `r`. + ([#404](https://github.com/magpylib/magpylib/issues/404), + [#370](https://github.com/magpylib/magpylib/issues/370)) + - Improved numerical stability of current loop field. Now 12-14 correct digits + everywhere. ([#374](https://github.com/magpylib/magpylib/issues/374)) + - Fixed `Collection` of `Lines` field computation error. + ([#368](https://github.com/magpylib/magpylib/issues/368)) - Object oriented interface fixes and modifications: - Improved performance of `getB` and `getH`. - - Fixed array dimension wrongly reduced when `sumup=True` and `squeeze=False` in `getB` and `getH` functions ([#425](https://github.com/magpylib/magpylib/issues/425), [#426](https://github.com/magpylib/magpylib/pull/426)) - - Minimal non-squeeze output shape is (1,1,1,1,3), meaning that a single pixel is now also represented. ([#493](https://github.com/magpylib/magpylib/pull/493)) -- With the new kwarg `pixel_agg` it is now possible to apply a Numpy function with reducing functionality (like `mean`, `min`, `average`) to the pixel output. In this case, it is allowed to provide `getB` and `getH` with different observer input shapes. ([#503](https://github.com/magpylib/magpylib/pull/503)) + - Fixed array dimension wrongly reduced when `sumup=True` and `squeeze=False` + in `getB` and `getH` functions + ([#425](https://github.com/magpylib/magpylib/issues/425), + [#426](https://github.com/magpylib/magpylib/pull/426)) + - Minimal non-squeeze output shape is (1,1,1,1,3), meaning that a single pixel + is now also represented. + ([#493](https://github.com/magpylib/magpylib/pull/493)) +- With the new kwarg `pixel_agg` it is now possible to apply a Numpy function + with reducing functionality (like `mean`, `min`, `average`) to the pixel + output. In this case, it is allowed to provide `getB` and `getH` with + different observer input shapes. + ([#503](https://github.com/magpylib/magpylib/pull/503)) ### Major graphic output overhaul: + - Styles: - - All object now have the `style` attribute for graphical output customization. Arguments can be passed as dictionaries, class attributes or with underscore magic. - - Style defaults stored in `magpylib.defaults.display`. ([#291](https://github.com/magpylib/magpylib/issues/291), [#396](https://github.com/magpylib/magpylib/pull/396)) - - Possibility to add a custom 3D-model to any object. ([#416](https://github.com/magpylib/magpylib/pull/416)) -- `display` now called `show`, to be more in-line with standard graphic backends. Functionality completely overhauled to function with styles. ([#453](https://github.com/magpylib/magpylib/pull/453), [#451](https://github.com/magpylib/magpylib/issues/451)) - - New `show` arguments replace previous ones. Some are now handed over through styles. + - All object now have the `style` attribute for graphical output + customization. Arguments can be passed as dictionaries, class attributes or + with underscore magic. + - Style defaults stored in `magpylib.defaults.display`. + ([#291](https://github.com/magpylib/magpylib/issues/291), + [#396](https://github.com/magpylib/magpylib/pull/396)) + - Possibility to add a custom 3D-model to any object. + ([#416](https://github.com/magpylib/magpylib/pull/416)) +- `display` now called `show`, to be more in-line with standard graphic + backends. Functionality completely overhauled to function with styles. + ([#453](https://github.com/magpylib/magpylib/pull/453), + [#451](https://github.com/magpylib/magpylib/issues/451)) + - New `show` arguments replace previous ones. Some are now handed over through + styles. - `axis` ➡️ `canvas` - `show_direction` ➡️ `style_magnetization_show` - - `show_path` ➡️ `style_path_show` ([#453](https://github.com/magpylib/magpylib/pull/453)) + - `show_path` ➡️ `style_path_show` + ([#453](https://github.com/magpylib/magpylib/pull/453)) - `size_sensors`&`size_dipoles` ➡️ `style_size` - `size_direction` ➡️ `style_magnetization_size` - new `zoom` option -- Plotly as new optional graphic backend. 🚀 ([#396](https://github.com/magpylib/magpylib/pull/396), [#353](https://github.com/magpylib/magpylib/issues/353)) - - `plotly` is now automatically installed with Magpylib. ([#395](https://github.com/magpylib/magpylib/issues/395)) - - Interactive path `animation` option in `show`. ([#453](https://github.com/magpylib/magpylib/pull/453)) - - Automatic Matplotlib <-> Plotly style input translations ([#452](https://github.com/magpylib/magpylib/issues/452), [#454](https://github.com/magpylib/magpylib/pull/454)) +- Plotly as new optional graphic backend. 🚀 + ([#396](https://github.com/magpylib/magpylib/pull/396), + [#353](https://github.com/magpylib/magpylib/issues/353)) + - `plotly` is now automatically installed with Magpylib. + ([#395](https://github.com/magpylib/magpylib/issues/395)) + - Interactive path `animation` option in `show`. + ([#453](https://github.com/magpylib/magpylib/pull/453)) + - Automatic Matplotlib <-> Plotly style input translations + ([#452](https://github.com/magpylib/magpylib/issues/452), + [#454](https://github.com/magpylib/magpylib/pull/454)) - Misc: - - Added `matplotlib` pixel display ([#279](https://github.com/magpylib/magpylib/issues/279)) - - Sensors have their own color now ([#483](https://github.com/magpylib/magpylib/pull/483)) - - UI fix empty display ([#401](https://github.com/magpylib/magpylib/issues/401)) - - Error msg when `show` is called without argument ([#448](https://github.com/magpylib/magpylib/issues/448)) + - Added `matplotlib` pixel display + ([#279](https://github.com/magpylib/magpylib/issues/279)) + - Sensors have their own color now + ([#483](https://github.com/magpylib/magpylib/pull/483)) + - UI fix empty display + ([#401](https://github.com/magpylib/magpylib/issues/401)) + - Error msg when `show` is called without argument + ([#448](https://github.com/magpylib/magpylib/issues/448)) ### New documentation: -- Completely new structure and layout. ([#399](https://github.com/magpylib/magpylib/issues/399), [#294](https://github.com/magpylib/magpylib/issues/294)) -- Binder links and live code. ([#389](https://github.com/magpylib/magpylib/issues/389)) + +- Completely new structure and layout. + ([#399](https://github.com/magpylib/magpylib/issues/399), + [#294](https://github.com/magpylib/magpylib/issues/294)) +- Binder links and live code. + ([#389](https://github.com/magpylib/magpylib/issues/389)) - Example galleries with practical user examples -- Guidelines for advanced subclassing of `Collection` to form complex dynamic compound objects that seamlessly integrate into the Magpylib interface. +- Guidelines for advanced subclassing of `Collection` to form complex dynamic + compound objects that seamlessly integrate into the Magpylib interface. ### Geometry interface modification -- Added all Scipy Rotation forms as rotation object methods. ([#427](https://github.com/magpylib/magpylib/pull/427)) -- `move` and `rotate` inputs differentiate between scalar and vector input. Scalar input is applied to the whole path vector input is merged. ([#438](https://github.com/magpylib/magpylib/discussions/438), [#444](https://github.com/magpylib/magpylib/issues/444), [#442](https://github.com/magpylib/magpylib/issues/443)) -- `move` and `rotate` methods have default `start='auto'` (scalar input: `start=0`-> applied to whole path, vector input: `start=len_path`-> append) instead of `start=-1`. -- `move` and `rotate` methods maintain collection geometry when applied to a collection. -- Improved `position` and `orientation` setter methods in line with `move` and `rotate` functionality and maintain `Collection` geometry. -- Removed `increment` argument from `move` and `rotate` functions ([#438](https://github.com/magpylib/magpylib/discussions/438), [#444](https://github.com/magpylib/magpylib/issues/444)) + +- Added all Scipy Rotation forms as rotation object methods. + ([#427](https://github.com/magpylib/magpylib/pull/427)) +- `move` and `rotate` inputs differentiate between scalar and vector input. + Scalar input is applied to the whole path vector input is merged. + ([#438](https://github.com/magpylib/magpylib/discussions/438), + [#444](https://github.com/magpylib/magpylib/issues/444), + [#442](https://github.com/magpylib/magpylib/issues/443)) +- `move` and `rotate` methods have default `start='auto'` (scalar input: + `start=0`-> applied to whole path, vector input: `start=len_path`-> append) + instead of `start=-1`. +- `move` and `rotate` methods maintain collection geometry when applied to a + collection. +- Improved `position` and `orientation` setter methods in line with `move` and + `rotate` functionality and maintain `Collection` geometry. +- Removed `increment` argument from `move` and `rotate` functions + ([#438](https://github.com/magpylib/magpylib/discussions/438), + [#444](https://github.com/magpylib/magpylib/issues/444)) ### Modifications to the `Collection` class -- Collections can now contain `Source`, `Sensor` and other `Collection` objects and can function as source and observer inputs in `getB` and `getH`. ([#502](https://github.com/magpylib/magpylib/pull/502), [#410](https://github.com/magpylib/magpylib/issues/410), [#415](https://github.com/magpylib/magpylib/pull/415), [#297](https://github.com/magpylib/magpylib/issues/297)) -- Instead of the property `Collection.sources` there are now the `Collection.children`, `Collection.sources`, `Collection.sensors` and `Collection.collections` properties. Setting these collection properties will automatically override parents. ([#446](https://github.com/magpylib/magpylib/issues/446), [#502](https://github.com/magpylib/magpylib/pull/502)) -- `Collection` has it's own `position`, `orientation` and `style`. ([#444](https://github.com/magpylib/magpylib/issues/444), [#461](https://github.com/magpylib/magpylib/issues/461)) -- All methods applied to a collection maintain relative child-positions in the local reference frame. -- Added `__len__` dunder for `Collection`, so that `Collection.children` length is returned. ([#383](https://github.com/magpylib/magpylib/issues/383)) + +- Collections can now contain `Source`, `Sensor` and other `Collection` objects + and can function as source and observer inputs in `getB` and `getH`. + ([#502](https://github.com/magpylib/magpylib/pull/502), + [#410](https://github.com/magpylib/magpylib/issues/410), + [#415](https://github.com/magpylib/magpylib/pull/415), + [#297](https://github.com/magpylib/magpylib/issues/297)) +- Instead of the property `Collection.sources` there are now the + `Collection.children`, `Collection.sources`, `Collection.sensors` and + `Collection.collections` properties. Setting these collection properties will + automatically override parents. + ([#446](https://github.com/magpylib/magpylib/issues/446), + [#502](https://github.com/magpylib/magpylib/pull/502)) +- `Collection` has it's own `position`, `orientation` and `style`. + ([#444](https://github.com/magpylib/magpylib/issues/444), + [#461](https://github.com/magpylib/magpylib/issues/461)) +- All methods applied to a collection maintain relative child-positions in the + local reference frame. +- Added `__len__` dunder for `Collection`, so that `Collection.children` length + is returned. ([#383](https://github.com/magpylib/magpylib/issues/383)) - `-` operation was removed. -- `+` operation now functions as `a + b = Collection(a, b)`. Warning: `a + b + c` now creates a nested collection ! -- Allowed `Collection`, `add` and `remove` input is now only `*args` or a single flat list or tuple of Magpylib objects. -- `add` and `remove` have some additional functionality related to child-parent relations. +- `+` operation now functions as `a + b = Collection(a, b)`. Warning: + `a + b + c` now creates a nested collection ! +- Allowed `Collection`, `add` and `remove` input is now only `*args` or a single + flat list or tuple of Magpylib objects. +- `add` and `remove` have some additional functionality related to child-parent + relations. - The `describe` method gives a great Collection tree overview. ### Other changes/fixes: -- Magpylib error message improvement. Msg will now tell you what input is expected. -- Magpylib object `copy` method now works properly ([#477](https://github.com/magpylib/magpylib/pull/477), [#470](https://github.com/magpylib/magpylib/pull/470), [#476](https://github.com/magpylib/magpylib/issues/476)) -- Defaults and input checks ([#406](https://github.com/magpylib/magpylib/issues/406)) - - `magpylib.Config` parameters are now in `magpylib.defaults`. ([#387](https://github.com/magpylib/magpylib/issues/387)) - - `config.ITERCYLINDER` is now obsolete. The iterative solution replaced by a new analytical expression. + +- Magpylib error message improvement. Msg will now tell you what input is + expected. +- Magpylib object `copy` method now works properly + ([#477](https://github.com/magpylib/magpylib/pull/477), + [#470](https://github.com/magpylib/magpylib/pull/470), + [#476](https://github.com/magpylib/magpylib/issues/476)) +- Defaults and input checks + ([#406](https://github.com/magpylib/magpylib/issues/406)) + - `magpylib.Config` parameters are now in `magpylib.defaults`. + ([#387](https://github.com/magpylib/magpylib/issues/387)) + - `config.ITERCYLINDER` is now obsolete. The iterative solution replaced by a + new analytical expression. - `config.inputchecks` is removed - input checks are always performed. --- + ## [3.0.5] - 2022-04-26 - fix docs build + --- + ## [3.0.4] - 2022-02-17 - fix `Collection` operation tests --- + ## [3.0.3] - 2022-02-17 ### Fixed -- When adding with `Source + Collection` to create a new `Collection`, the original now remains unaffected ([#472](https://github.com/magpylib/magpylib/issues/472)) + +- When adding with `Source + Collection` to create a new `Collection`, the + original now remains unaffected + ([#472](https://github.com/magpylib/magpylib/issues/472)) --- ## [3.0.2] - 2021-06-27 -- Update release version and license year ([#343](https://github.com/magpylib/magpylib/pull/343), [#344](https://github.com/magpylib/magpylib/pull/344)) + +- Update release version and license year + ([#343](https://github.com/magpylib/magpylib/pull/343), + [#344](https://github.com/magpylib/magpylib/pull/344)) --- ## [3.0.1] - 2021-06-27 -- Added deployment automation ([#260](https://github.com/magpylib/magpylib/issues/260), [#296](https://github.com/magpylib/magpylib/issues/296), [#341](https://github.com/magpylib/magpylib/pull/341), [#342](https://github.com/magpylib/magpylib/pull/342)) - +- Added deployment automation + ([#260](https://github.com/magpylib/magpylib/issues/260), + [#296](https://github.com/magpylib/magpylib/issues/296), + [#341](https://github.com/magpylib/magpylib/pull/341), + [#342](https://github.com/magpylib/magpylib/pull/342)) --- + ## [3.0.0] - 2021-06-27 This is a major update that includes @@ -258,25 +505,40 @@ This is a major update that includes - API changes - New features - Improved internal workings + ### Added - New `orientation` property: - - The `orientation` attribute stores the relative rotation of an object with respect to the reference orientation (defined in each class docstring). + - The `orientation` attribute stores the relative rotation of an object with + respect to the reference orientation (defined in each class docstring). - The default (`orientation=None`) corresponds to a unit rotation. - `orientation` is stored as a `scipy.spatial.transform.Rotation` object. - - Calling the attribute `source.orientation` returns a Scipy Rotation object `R`. + - Calling the attribute `source.orientation` returns a Scipy Rotation object + `R`. - Make use of all advantages of this great Scipy package: - define `R.from_rotvec()` or `R.from_quat()` or ... - view with `R.as_rotvec()` or `R.as_quat()` or ... - combine subsequent rotations `R1 * R2 * R3` - Sensor pixel: - - The new `Sensor(position, pixel, orientation)` class has the argument `pixel` which is `(0,0,0)` by default and refers to pixel positions inside the Sensor (in the Sensor local CS). `pixel` is an arbitrary array_like of the shape (N1, N2, ..., 3). + - The new `Sensor(position, pixel, orientation)` class has the argument + `pixel` which is `(0,0,0)` by default and refers to pixel positions inside + the Sensor (in the Sensor local CS). `pixel` is an arbitrary array_like of + the shape (N1, N2, ..., 3). - Geometry paths: - - The `position` and `orientation` attributes can now store paths in the global CS. For a path of length M the attribute `position` is an array of the shape (M,3) and `orientation` is a Rotation object with length M. Each path position is associated with a respective rotation. - - Field computations `getB()` and `getH()` will evaluate the field for all source path positions. - - Paths can be set by hand `position = X`, `orientation = Y`, but they can also conveniently be generated using the `rotate` and `move` methods. - - Paths can be shown via the `show_path=True` kwarg in `display()`. By setting `show_path=x` the object will be displayed at every `x`'th path step. This helps to follow up on object rotation along the path. - - All objects have a `reset_path()` method defined to set their paths to `position=(0,0,0)` and `orientation=None`. + + - The `position` and `orientation` attributes can now store paths in the + global CS. For a path of length M the attribute `position` is an array of + the shape (M,3) and `orientation` is a Rotation object with length M. Each + path position is associated with a respective rotation. + - Field computations `getB()` and `getH()` will evaluate the field for all + source path positions. + - Paths can be set by hand `position = X`, `orientation = Y`, but they can + also conveniently be generated using the `rotate` and `move` methods. + - Paths can be shown via the `show_path=True` kwarg in `display()`. By setting + `show_path=x` the object will be displayed at every `x`'th path step. This + helps to follow up on object rotation along the path. + - All objects have a `reset_path()` method defined to set their paths to + `position=(0,0,0)` and `orientation=None`. - Streamlining operation with all Magpylib objects: - All objects (Sensors, Sources, Collections) have additional direct access to @@ -284,165 +546,248 @@ This is a major update that includes - `getB()` and `getH()` methods for fast field computations - `__repr__` attribute defined and will return their type and their `id`. - Other new features: - - The top-level `Config` allows users to access and edit Magpylib default values. + - The top-level `Config` allows users to access and edit Magpylib default + values. + ### Changed + - Renamed modules: - `.magnet` and `.current` sub-packages were moved to the top level. - - The `.moment` sub-package was renamed to `.misc` and was moved to the top level. - - The `.vector` sub-package was completely removed. Functionalities are mostly replaced by new top-level function `getBv()`. - - The `.math` sub-package was removed. Functionalities are mostly provided by the `scipy - Rotation` package. + - The `.moment` sub-package was renamed to `.misc` and was moved to the top + level. + - The `.vector` sub-package was completely removed. Functionalities are mostly + replaced by new top-level function `getBv()`. + - The `.math` sub-package was removed. Functionalities are mostly provided by + the `scipy - Rotation` package. - Renamed functions: - The top level function `displaySystem()` was renamed to `display()`. -- Renamed attributes (parameters cannot be initialized in their short forms anymore): - - `angle` and `axis` are replaced by `orientation` - - `dimension` is replaced by `diameter` for Loop and Sphere classes. - - `angle`&`axis` are replaced by `orientation`. +- Renamed attributes (parameters cannot be initialized in their short forms + anymore): + + - `angle` and `axis` are replaced by `orientation` + - `dimension` is replaced by `diameter` for Loop and Sphere classes. + - `angle`&`axis` are replaced by `orientation`. - Modified rotate methods: - - The class methods `.rotate(angle, axis, anchor)` have been replaced by a new `.rotate(rotation, anchor, increment, start)` method where `rotation` ist a scipy `Rotation` object. - - The original angle-axis-anchor rotation is now provided by the new method `.rotate_from_angax(angle, axis, anchor, increment, start, degrees)`. - - The argument `axis` can now easily be set to the global CS axes with `"x"`, `"y"`, `"z"`. + - The class methods `.rotate(angle, axis, anchor)` have been replaced by a new + `.rotate(rotation, anchor, increment, start)` method where `rotation` ist a + scipy `Rotation` object. + - The original angle-axis-anchor rotation is now provided by the new method + `.rotate_from_angax(angle, axis, anchor, increment, start, degrees)`. + - The argument `axis` can now easily be set to the global CS axes with + `"x"`, `"y"`, `"z"`. - The anchor argument `anchor=0` represents the origin `(0,0,0)`. - - `angle` argument is in units of deg by default. It can now be set to rad using the `degrees` argument. + - `angle` argument is in units of deg by default. It can now be set to rad + using the `degrees` argument. - The "move"-class method is now `.move(displacement, increment, start)` - - Rotation and move methods can now be used to generate paths using vector input and the `increment` and `start` arguments. + - Rotation and move methods can now be used to generate paths using vector + input and the `increment` and `start` arguments. - All operations can now be chained (e.g. `.move_by().rotate().move_to()`) - Miscellaneous: - - `getB(pos)` now takes single AND vector position arguments. If a vector is handed to getB it will automatically execute vectorized code from the vector module. - - In a finite region (size defined by `Config.EDGESIZE`) about magnet edges and line currents the field evaluates to `(0,0,0)` instead of `(NaN, NaN, NaN)`. Special case catching reduces performance slightly. + - `getB(pos)` now takes single AND vector position arguments. If a vector is + handed to getB it will automatically execute vectorized code from the vector + module. + - In a finite region (size defined by `Config.EDGESIZE`) about magnet edges + and line currents the field evaluates to `(0,0,0)` instead of + `(NaN, NaN, NaN)`. Special case catching reduces performance slightly. + ### Updated + - Improved Computation: - - The Box field is now more stable. Numerical instabilities in the outfield were completely removed. + - The Box field is now more stable. Numerical instabilities in the outfield + were completely removed. - Updated Field computation interface - There are two fundamental arguments for field computation: - - The argument `sources` refers to a source/Collection or to a 1D list of L sources and/or Collections. - - The argument `observers` refers to a set of positions of shape (N1, N2, ..., 3) or a Sensor with `pixel` shape (N1, N2, ..., 3) or a 1D list of K Sensors. + - The argument `sources` refers to a source/Collection or to a 1D list of L + sources and/or Collections. + - The argument `observers` refers to a set of positions of shape (N1, N2, + ..., 3) or a Sensor with `pixel` shape (N1, N2, ..., 3) or a 1D list of K + Sensors. - With Magpylib3 there are several ways to compute the field: 1. `source.getB(*observers)` 2. `sensor.getB(*sources)` 3. `magpylib.getB(sources, observers)` - - The output shape is always (L, M, K, N1, N2, ..., 3) with L sources, M path positions, K sensors and N (pixel) positions. - - Objects with shorter paths will be considered as static once their path ends while other paths continue. - 4. `magpylib.getBv(**kwargs)` gives direct access to the field formulas and mostly replaces the `getBv_XXX()` functionality of v2. All inputs must be arrays of length N or of length 1 (statics will be tiled). - - While `getBv` is the fastest way to compute the fields it is much more convenient to use `getB()` which mostly provides the same performance. Specifically,the new `getB()` automatically groups all inputs for combined vectorized evaluation. This leads to a massive speedup when dealing with large Collections of similar sources. + - The output shape is always (L, M, K, N1, N2, ..., 3) with L sources, M + path positions, K sensors and N (pixel) positions. + - Objects with shorter paths will be considered as static once their path + ends while other paths continue. + 4. `magpylib.getBv(**kwargs)` gives direct access to the field formulas and + mostly replaces the `getBv_XXX()` functionality of v2. All inputs must be + arrays of length N or of length 1 (statics will be tiled). + - While `getBv` is the fastest way to compute the fields it is much more + convenient to use `getB()` which mostly provides the same performance. + Specifically,the new `getB()` automatically groups all inputs for combined + vectorized evaluation. This leads to a massive speedup when dealing with + large Collections of similar sources. - In addition to `getB`, the new `getH` returns the field in kA/m. ### Removed -- the kwarg `niter=50` does not exist anymore for the Cylinder field computation. The functionality was completely replaced by the config setting `Config.ITER_CYLINDER=50`. + +- the kwarg `niter=50` does not exist anymore for the Cylinder field + computation. The functionality was completely replaced by the config setting + `Config.ITER_CYLINDER=50`. --- + ## [2.3.0b] - 2020-01-17 ### Changed -- Improved performance of `getB` for diametral magnetized Cylinders by 20%. -- `getB` of Line current now uses vectorized code which leads to massive performance enhancement. -- **IMPORTANT:** position arguments of `getBv` functions have been flipped! First comes the source position POSm THEN the observer position POSo! +- Improved performance of `getB` for diametral magnetized Cylinders by 20%. +- `getB` of Line current now uses vectorized code which leads to massive + performance enhancement. +- **IMPORTANT:** position arguments of `getBv` functions have been flipped! + First comes the source position POSm THEN the observer position POSo! ### Added -- completed the library vector functionality adding magnet Cylinder, moment Dipole, current Loop and Line. This includes adding several private vectorized functions (e.g. ellipticV) to mathLib_vector, adding respective tests and docs examples. + +- completed the library vector functionality adding magnet Cylinder, moment + Dipole, current Loop and Line. This includes adding several private vectorized + functions (e.g. ellipticV) to mathLib_vector, adding respective tests and docs + examples. --- ## [2.1.0b] - 2019-12-06 ### Added + - Docstrings for vector functions. - `displaySystem` kwarg `figsize` - bringing documentation up to speed ### Fixed + - init file bug --- ## [2.0.0b] - 2019-11-29 + This is a major update that includes -API changes -New features -Improved internal workings +API changes New features Improved internal workings + ### Changed + - Restructuring - displaySystem is now a top-level function, not a Collection method anymore. - - getBsweep and multiprocessing options have been completely removed, this functionality - should be overtaken by the new vector functionality which uses the numpy native vectorized - code paradigm. If mkl library is set (test by numpy.show_config()) numpy will also - automatically use multiprocessing. Code parallelization at magpylib level should be done - by hand. -- Docstrings are adjusted to work better with intellisense. (Problems with *.rst code) -- public rotatePosition() is now called angleAxisRotation(), former private angleAxisRotation - is now called angleAxisRotation_priv(). + - getBsweep and multiprocessing options have been completely removed, this + functionality should be overtaken by the new vector functionality which uses + the numpy native vectorized code paradigm. If mkl library is set (test by + numpy.show_config()) numpy will also automatically use multiprocessing. Code + parallelization at magpylib level should be done by hand. +- Docstrings are adjusted to work better with intellisense. (Problems with + \*.rst code) +- public rotatePosition() is now called angleAxisRotation(), former private + angleAxisRotation is now called angleAxisRotation_priv(). - Major rework of the documentation and examples. ### Added -- Performance computation trough vector functionality included in new top-level subpackage "vector" + +- Performance computation trough vector functionality included in new top-level + subpackage "vector" - Vectorized versions of math functions added to "math" subpackage --- ## [1.2.1b0] - 2019-07-31 + ### Changed + - Optimized `getB` call (utility integrated) - Improved Documentation (added Sensor class v1) --- ## [1.2.0b0] - 2019-07-16 + ### Added + - Sensor Class - - This allows users to create a coordinate system-enabled Sensor object, which can be placed, rotated, moved, and oriented. - - This object can take the B-Field of a system (be it single source or a Collection) with the added functionality of having its own reference in the coordinate space, allowing users to easily acquire relative B-Field measurements of a system from an arbitrarily placed sensor object. - - Sensors in a list may be displayed in the `Collection.displaySystem()` by using the `sensors` keyword argument. -- Added content to the `__repr__` built-in to all source classes for quick console evaluations, simply call a defined object in your Python shell to print out its attributes. + - This allows users to create a coordinate system-enabled Sensor object, which + can be placed, rotated, moved, and oriented. + - This object can take the B-Field of a system (be it single source or a + Collection) with the added functionality of having its own reference in the + coordinate space, allowing users to easily acquire relative B-Field + measurements of a system from an arbitrarily placed sensor object. + - Sensors in a list may be displayed in the `Collection.displaySystem()` by + using the `sensors` keyword argument. +- Added content to the `__repr__` built-in to all source classes for quick + console evaluations, simply call a defined object in your Python shell to + print out its attributes. + ### Changed -- Edge cases in field calculations now return a proper [RuntimeWarning](https://docs.python.org/3/library/exceptions.html#RuntimeWarning) instead of console prints + +- Edge cases in field calculations now return a proper + [RuntimeWarning](https://docs.python.org/3/library/exceptions.html#RuntimeWarning) + instead of console prints + ### Fixed + - Unused imports and variables --- ## [1.1.1b0] - 2019-06-25 + ### Added + - Changelog + ### Changed -- Change `Collection.displaySystem()` not having the `block=False` setting for matplotlib's `pyplot.show()` by default, this meant that outside interactive mode calling this function would hang the script until the plot was closed. - - If for some reason you want to block the application, you may still use `Collection.displaySystem()`'s `suppress=True` kwarg then call pyplot.show() normally. + +- Change `Collection.displaySystem()` not having the `block=False` setting for + matplotlib's `pyplot.show()` by default, this meant that outside interactive + mode calling this function would hang the script until the plot was closed. + - If for some reason you want to block the application, you may still use + `Collection.displaySystem()`'s `suppress=True` kwarg then call pyplot.show() + normally. - This should cause no API changes, if you have problems please notify us. ### Fixed -- Fixed multiprocessing enabled `Collection.getBsweep()` for lots of objects with few positions causing great performance loss. This functionality now behaves as expected for the use case. -- Fixed `Collection.displaySystem()`'s drawing of Dipole objects in external axes (plots) using the `subplotAx` kwarg crashing the application. This functionality now behaves as expected for the use case. + +- Fixed multiprocessing enabled `Collection.getBsweep()` for lots of objects + with few positions causing great performance loss. This functionality now + behaves as expected for the use case. +- Fixed `Collection.displaySystem()`'s drawing of Dipole objects in external + axes (plots) using the `subplotAx` kwarg crashing the application. This + functionality now behaves as expected for the use case. --- ## [1.1.0b0] - 2019-06-14 + ### Added + - Implemented one new kwarg for `Collection.displaySystem()`: - > `subplotAx=None` - Draw into a subplot axe that already exists. The subplot needs to be 3D projected + > `subplotAx=None` - This allows for creating side-by-side plots using `displaySystem`. - Figure information must be set manually in pyplot.figure() in order to not squash the plots upon sub plotting. + Draw into a subplot axe that already exists. The subplot needs to be 3D projected + This allows for creating side-by-side plots using `displaySystem`. Figure + information must be set manually in pyplot.figure() in order to not squash the + plots upon sub plotting.
Click here for Example - Code: https://gist.github.com/lucasgcb/77d55f2fda688e2fb8e1e4a68bb830b8 + Code: https://gist.github.com/lucasgcb/77d55f2fda688e2fb8e1e4a68bb830b8 - **Output:** - ![image](https://user-images.githubusercontent.com/7332704/58973138-86b4a600-87bf-11e9-9e63-35892b7a6713.png) + **Output:** + ![image](https://user-images.githubusercontent.com/7332704/58973138-86b4a600-87bf-11e9-9e63-35892b7a6713.png)
### Changed - `getBsweep()` for Collections and Sources now always returns a Numpy array -- Zero-length segments in Line sources now return `[0,0,0]` and a warning, making it easier to draw spirals without letting users do this unaware. +- Zero-length segments in Line sources now return `[0,0,0]` and a warning, + making it easier to draw spirals without letting users do this unaware. ### Fixed + - Added a workaround fix for a rotation bug we are still working on. --- @@ -463,8 +808,6 @@ Improved internal workings - Continuous Integration settings (Azure and Appveyor) - Code Coverage Reports with Codecov - - ### Removed - Support for Python 3.5 and under. @@ -478,47 +821,47 @@ The first official release of the Magpylib library. ### Added - Source classes: - - Box - - Cylinder - - Sphere - - Loop Current - - Current Line - - Dipole + - Box + - Cylinder + - Sphere + - Loop Current + - Current Line + - Dipole - Collection class --- -[Unreleased]:https://github.com/magpylib/magpylib/compare/5.1.1...HEAD -[5.1.1]:https://github.com/magpylib/magpylib/compare/5.1.0...5.1.1 -[5.1.0]:https://github.com/magpylib/magpylib/compare/5.0.4...5.1.0 -[5.0.4]:https://github.com/magpylib/magpylib/compare/5.0.3...5.0.4 -[5.0.3]:https://github.com/magpylib/magpylib/compare/5.0.2...5.0.3 -[5.0.2]:https://github.com/magpylib/magpylib/compare/5.0.1...5.0.2 -[5.0.1]:https://github.com/magpylib/magpylib/compare/5.0.0...5.0.1 -[5.0.0]:https://github.com/magpylib/magpylib/compare/4.5.1...5.0.0 -[4.5.1]:https://github.com/magpylib/magpylib/compare/4.5.0...4.5.1 -[4.5.0]:https://github.com/magpylib/magpylib/compare/4.4.0...4.5.0 -[4.4.1]:https://github.com/magpylib/magpylib/compare/4.4.0...4.4.1 -[4.4.0]:https://github.com/magpylib/magpylib/compare/4.3.0...4.4.0 -[4.3.0]:https://github.com/magpylib/magpylib/compare/4.2.0...4.3.0 -[4.2.0]:https://github.com/magpylib/magpylib/compare/4.1.2...4.2.0 -[4.1.2]:https://github.com/magpylib/magpylib/compare/4.1.1...4.1.2 -[4.1.1]:https://github.com/magpylib/magpylib/compare/4.1.0...4.1.1 -[4.1.0]:https://github.com/magpylib/magpylib/compare/4.0.4...4.1.0 -[4.0.4]:https://github.com/magpylib/magpylib/compare/4.0.3...4.0.4 -[4.0.3]:https://github.com/magpylib/magpylib/compare/4.0.2...4.0.3 -[4.0.2]:https://github.com/magpylib/magpylib/compare/4.0.1...4.0.2 -[4.0.1]:https://github.com/magpylib/magpylib/compare/4.0.0...4.0.1 -[4.0.0]:https://github.com/magpylib/magpylib/compare/3.0.4...4.0.0 -[3.0.5]:https://github.com/magpylib/magpylib/compare/3.0.4...3.0.5 -[3.0.4]:https://github.com/magpylib/magpylib/compare/3.0.3...3.0.4 -[3.0.3]:https://github.com/magpylib/magpylib/compare/3.0.2...3.0.3 -[3.0.2]:https://github.com/magpylib/magpylib/compare/3.0.1...3.0.2 -[3.0.1]:https://github.com/magpylib/magpylib/compare/3.0.0...3.0.1 -[3.0.0]:https://github.com/magpylib/magpylib/compare/2.3.0-beta...3.0.0 -[2.3.0b]:https://github.com/magpylib/magpylib/compare/2.1.0-beta...2.3.0-beta -[2.1.0b]:https://github.com/magpylib/magpylib/compare/2.0.0-beta...2.1.0-beta -[2.0.0b]:https://github.com/magpylib/magpylib/compare/1.2.1-beta...2.0.0-beta +[Unreleased]: https://github.com/magpylib/magpylib/compare/5.1.1...HEAD +[5.1.1]: https://github.com/magpylib/magpylib/compare/5.1.0...5.1.1 +[5.1.0]: https://github.com/magpylib/magpylib/compare/5.0.4...5.1.0 +[5.0.4]: https://github.com/magpylib/magpylib/compare/5.0.3...5.0.4 +[5.0.3]: https://github.com/magpylib/magpylib/compare/5.0.2...5.0.3 +[5.0.2]: https://github.com/magpylib/magpylib/compare/5.0.1...5.0.2 +[5.0.1]: https://github.com/magpylib/magpylib/compare/5.0.0...5.0.1 +[5.0.0]: https://github.com/magpylib/magpylib/compare/4.5.1...5.0.0 +[4.5.1]: https://github.com/magpylib/magpylib/compare/4.5.0...4.5.1 +[4.5.0]: https://github.com/magpylib/magpylib/compare/4.4.0...4.5.0 +[4.4.1]: https://github.com/magpylib/magpylib/compare/4.4.0...4.4.1 +[4.4.0]: https://github.com/magpylib/magpylib/compare/4.3.0...4.4.0 +[4.3.0]: https://github.com/magpylib/magpylib/compare/4.2.0...4.3.0 +[4.2.0]: https://github.com/magpylib/magpylib/compare/4.1.2...4.2.0 +[4.1.2]: https://github.com/magpylib/magpylib/compare/4.1.1...4.1.2 +[4.1.1]: https://github.com/magpylib/magpylib/compare/4.1.0...4.1.1 +[4.1.0]: https://github.com/magpylib/magpylib/compare/4.0.4...4.1.0 +[4.0.4]: https://github.com/magpylib/magpylib/compare/4.0.3...4.0.4 +[4.0.3]: https://github.com/magpylib/magpylib/compare/4.0.2...4.0.3 +[4.0.2]: https://github.com/magpylib/magpylib/compare/4.0.1...4.0.2 +[4.0.1]: https://github.com/magpylib/magpylib/compare/4.0.0...4.0.1 +[4.0.0]: https://github.com/magpylib/magpylib/compare/3.0.4...4.0.0 +[3.0.5]: https://github.com/magpylib/magpylib/compare/3.0.4...3.0.5 +[3.0.4]: https://github.com/magpylib/magpylib/compare/3.0.3...3.0.4 +[3.0.3]: https://github.com/magpylib/magpylib/compare/3.0.2...3.0.3 +[3.0.2]: https://github.com/magpylib/magpylib/compare/3.0.1...3.0.2 +[3.0.1]: https://github.com/magpylib/magpylib/compare/3.0.0...3.0.1 +[3.0.0]: https://github.com/magpylib/magpylib/compare/2.3.0-beta...3.0.0 +[2.3.0b]: https://github.com/magpylib/magpylib/compare/2.1.0-beta...2.3.0-beta +[2.1.0b]: https://github.com/magpylib/magpylib/compare/2.0.0-beta...2.1.0-beta +[2.0.0b]: https://github.com/magpylib/magpylib/compare/1.2.1-beta...2.0.0-beta [1.2.1b0]: https://github.com/magpylib/magpylib/compare/1.2.0-beta...1.2.1-beta [1.2.0b0]: https://github.com/magpylib/magpylib/compare/1.1.1-beta...1.2.0-beta [1.1.1b0]: https://github.com/magpylib/magpylib/compare/1.1.0-beta...1.1.1-beta @@ -527,6 +870,6 @@ The first official release of the Magpylib library. [1.0.1b0]: https://github.com/magpylib/magpylib/compare/1.0.0-beta...1.0.1-beta [1.0.0b0]: https://github.com/magpylib/magpylib/releases/tag/1.0.0-beta - The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +and this project adheres to +[Semantic Versioning](https://semver.org/spec/v2.0.0.html). diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index d4bf6982c..880eae093 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -2,72 +2,117 @@ ## Our Pledge -We as Magpylib members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. +We as Magpylib members, contributors, and leaders pledge to make participation +in our community a harassment-free experience for everyone, regardless of age, +body size, visible or invisible disability, ethnicity, sex characteristics, +gender identity and expression, level of experience, education, socio-economic +status, nationality, personal appearance, race, caste, color, religion, or +sexual identity and orientation. -We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. ## Our Standards -Examples of behavior that contributes to a positive environment for our community include: +Examples of behavior that contributes to a positive environment for our +community include: -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience -* Focusing on what is best not just for us as individuals, but for the overall community +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +- Focusing on what is best not just for us as individuals, but for the overall + community Examples of unacceptable behavior include: -* The use of sexualized language or imagery, and sexual attention or advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting +- The use of sexualized language or imagery, and sexual attention or advances of + any kind +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email address, + without their explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting ## Enforcement Responsibilities -Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. -Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. ## Scope -This Code of Conduct applies within all community spaces, and applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. +This Code of Conduct applies within all community spaces, and applies when an +individual is officially representing the community in public spaces. Examples +of representing our community include using an official e-mail address, posting +via an official social media account, or acting as an appointed representative +at an online or offline event. ## Enforcement -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at [magpylib@gmail.com](mailto:magpylib@gmail.com). All complaints will be reviewed and investigated promptly and fairly. +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +[magpylib@gmail.com](mailto:magpylib@gmail.com). All complaints will be reviewed +and investigated promptly and fairly. -All community leaders are obligated to respect the privacy and security of the reporter of any incident. +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. ## Enforcement Guidelines -Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: ### 1. Correction -**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. -**Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. ### 2. Warning -**Community Impact**: A violation through a single incident or series of actions. +**Community Impact**: A violation through a single incident or series of +actions. -**Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. ### 3. Temporary Ban -**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. -**Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. ### 4. Permanent Ban -**Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. -**Consequence**: A permanent ban from any sort of public interaction within the community. +**Consequence**: A permanent ban from any sort of public interaction within the +community. ## Attribution -This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/). \ No newline at end of file +This Code of Conduct is adapted from the +[Contributor Covenant](https://www.contributor-covenant.org/). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4f65e7f95..7575c2340 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,40 +1,72 @@ # Contribution Guide -The success of Magpylib relies on its user-friendliness. Your feedback and participation in discussions is strongly encouraged. Ask questions about Magpylib. Tell us what you like and what you dislike. Start general discussions in our informal [Discussions](https://github.com/magpylib/magpylib/discussions) channel on GitHub. +The success of Magpylib relies on its user-friendliness. Your feedback and +participation in discussions is strongly encouraged. Ask questions about +Magpylib. Tell us what you like and what you dislike. Start general discussions +in our informal [Discussions](https://github.com/magpylib/magpylib/discussions) +channel on GitHub. -We use GitHub [Issues and Milestones](https://github.com/magpylib/magpylib/issues) to plan and track the Magpylib project. Open new Issues to report a bug, to point out a problem, or to make a feature request, e.g. following a fruitful discussion. Within the issue we will define in detail what should be done. For small bug fixes, code cleanups, and other small improvements it's not necessary to create issues. +We use GitHub +[Issues and Milestones](https://github.com/magpylib/magpylib/issues) to plan and +track the Magpylib project. Open new Issues to report a bug, to point out a +problem, or to make a feature request, e.g. following a fruitful discussion. +Within the issue we will define in detail what should be done. For small bug +fixes, code cleanups, and other small improvements it's not necessary to create +issues. Always feel free to reach out through the official email . ## How to Contribute with Coding -You are most welcome to become a project contributor by helping us with coding. This includes the implementation of new features, fixing bugs, code cleanup and restructuring as well as documentation improvements. Please abide by the following procedure to make things easy for us to review and to manage the project. +You are most welcome to become a project contributor by helping us with coding. +This includes the implementation of new features, fixing bugs, code cleanup and +restructuring as well as documentation improvements. Please abide by the +following procedure to make things easy for us to review and to manage the +project. 1. Fork the Magpylib repository to your GitHub account -2. Edit your new repository (good practice: clone to local machine, edit, push changes). -3. Rebase your new repository (or pull from upstream) regularly to include upstream changes. -4. Once your changes are complete (see [Coding requirements](coding-requ) below), or you want some feedback, make a pull request (PR) targeting the Magpylib repository. Explain your feature in the PR, and/or refer to the respective issue that you address. Add illustrative code examples. -5. Once a PR is created, our pipeline tests will automatically check your code. A Magpylib member will review your contributions and discuss your changes. Possible improvements will be requested. -6. When satisfied, the reviewer will merge your PR and you become an official Magpylib contributor. +2. Edit your new repository (good practice: clone to local machine, edit, push + changes). +3. Rebase your new repository (or pull from upstream) regularly to include + upstream changes. +4. Once your changes are complete (see [Coding requirements](coding-requ) + below), or you want some feedback, make a pull request (PR) targeting the + Magpylib repository. Explain your feature in the PR, and/or refer to the + respective issue that you address. Add illustrative code examples. +5. Once a PR is created, our pipeline tests will automatically check your code. + A Magpylib member will review your contributions and discuss your changes. + Possible improvements will be requested. +6. When satisfied, the reviewer will merge your PR and you become an official + Magpylib contributor. (coding-requ)= + ## Coding Requirements -- All code is well documented and all top level doc strings abide by the [NumPy docstring style](https://numpydoc.readthedocs.io/en/latest/format.html). -- All unit tests are running. We recommend using the [Pytest](https://docs.pytest.org/en/7.4.x/) package. -- New unit tests are written aiming for 100% code coverage. We use [Coverage](https://coverage.readthedocs.io/en/) to test this. -- [Pylint](https://pylint.readthedocs.io/en/stable/) rates your code 10/10 and there are no formatting issues reported (e.g. line-too-long). -- Your code is PEP8 compliant and formatted with [Black](https://black.readthedocs.io/en/stable/) default settings. +- All code is well documented and all top level doc strings abide by the + [NumPy docstring style](https://numpydoc.readthedocs.io/en/latest/format.html). +- All unit tests are running. We recommend using the + [Pytest](https://docs.pytest.org/en/7.4.x/) package. +- New unit tests are written aiming for 100% code coverage. We use + [Coverage](https://coverage.readthedocs.io/en/) to test this. +- [Pylint](https://pylint.readthedocs.io/en/stable/) rates your code 10/10 and + there are no formatting issues reported (e.g. line-too-long). +- Your code is PEP8 compliant and formatted with + [Black](https://black.readthedocs.io/en/stable/) default settings. -We strongly suggest that you use the [Pre-Commit](https://pre-commit.com/) hooks that apply important code checks which each commit. +We strongly suggest that you use the [Pre-Commit](https://pre-commit.com/) hooks +that apply important code checks which each commit. ## For Your Orientation The Magpylib repository is structured as follows: + - **magpylib** - - **magpylib**: the actual package. - - **_src**: source code - - Other files generate the interface - - **docs**: documentation that is displayed on [Read the Docs](https://readthedocs.org/) using [Sphinx](https://www.sphinx-doc.org/en/master/). - - **tests**: unit tests - - Other files are project configuration files, Readme, ... + - **magpylib**: the actual package. + - **\_src**: source code + - Other files generate the interface + - **docs**: documentation that is displayed on + [Read the Docs](https://readthedocs.org/) using + [Sphinx](https://www.sphinx-doc.org/en/master/). + - **tests**: unit tests + - Other files are project configuration files, Readme, ... diff --git a/LICENSE b/LICENSE index 77224da87..9de07e4cb 100644 --- a/LICENSE +++ b/LICENSE @@ -13,4 +13,4 @@ are met: disclaimer in the documentation and/or other materials provided with the distribution. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md index 744408fbe..5e4347e95 100644 --- a/README.md +++ b/README.md @@ -26,34 +26,60 @@ - -> [!WARNING] -> Version 5 introduces critical breaking changes with, among others, the _move to SI units_. We recommended to pin your dependencies to `magpylib>=4.5<5` until you are ready to migrate to the latest version! ([see details](https://github.com/magpylib/magpylib/discussions/647)) +> [!WARNING] Version 5 introduces critical breaking changes with, among others, +> the _move to SI units_. We recommended to pin your dependencies to +> `magpylib>=4.5<5` until you are ready to migrate to the latest version! +> ([see details](https://github.com/magpylib/magpylib/discussions/647))

-Magpylib is an **open-source Python package** for calculating static **magnetic fields** of magnets, currents, and other sources. It uses **analytical expressions**, solutions to macroscopic magnetostatic problems, implemented in **vectorized** form which makes the computation **extremely fast** and leverages the open-source Python ecosystem for spectacular visualizations! +Magpylib is an **open-source Python package** for calculating static **magnetic +fields** of magnets, currents, and other sources. It uses **analytical +expressions**, solutions to macroscopic magnetostatic problems, implemented in +**vectorized** form which makes the computation **extremely fast** and leverages +the open-source Python ecosystem for spectacular visualizations! # Installation Install from PyPI using **pip** + ``` pip install magpylib ``` + Install from conda forge using **conda** + ``` conda install -c conda-forge magpylib ``` -Magpylib supports _Python3.11+_ and relies on common scientific computation libraries _NumPy_, _Scipy_, _Matplotlib_ and _Plotly_. Optionally, _Pyvista_ is recommended as graphical backend. + +Magpylib supports _Python3.11+_ and relies on common scientific computation +libraries _NumPy_, _Scipy_, _Matplotlib_ and _Plotly_. Optionally, _Pyvista_ is +recommended as graphical backend. # Resources - - Check out our **[Documentation](https://magpylib.readthedocs.io/en/stable)** for detailed information about the last stable release, or the **[Dev Docs](https://magpylib.readthedocs.io/en/latest)** to see the unreleased development version features. - - Please abide by our **[Code of Conduct](https://github.com/magpylib/magpylib/blob/main/CODE_OF_CONDUCT.md)**. - - Contribute through **[Discussions](https://github.com/magpylib/magpylib/discussions)** and coding by following the **[Contribution Guide](https://github.com/magpylib/magpylib/blob/main/CONTRIBUTING.md)**. The Git project **[Issues](https://github.com/magpylib/magpylib/issues)** give an up-to-date list of potential enhancements and planned milestones. Propose new ones. - - A **[Youtube video](https://www.youtube.com/watch?v=LeUx6cM1vcs)** introduction to Magpylib v4.0.0 within the **[GSC network](https://www.internationalcollaboration.org/).** -- An **[open-access paper](https://www.sciencedirect.com/science/article/pii/S2352711020300170)** from the year 2020 describes v2 of this library with most basic concepts still intact in later versions. +- Check out our **[Documentation](https://magpylib.readthedocs.io/en/stable)** + for detailed information about the last stable release, or the + **[Dev Docs](https://magpylib.readthedocs.io/en/latest)** to see the + unreleased development version features. +- Please abide by our + **[Code of Conduct](https://github.com/magpylib/magpylib/blob/main/CODE_OF_CONDUCT.md)**. +- Contribute through + **[Discussions](https://github.com/magpylib/magpylib/discussions)** and coding + by following the + **[Contribution Guide](https://github.com/magpylib/magpylib/blob/main/CONTRIBUTING.md)**. + The Git project **[Issues](https://github.com/magpylib/magpylib/issues)** give + an up-to-date list of potential enhancements and planned milestones. Propose + new ones. +- A **[Youtube video](https://www.youtube.com/watch?v=LeUx6cM1vcs)** + introduction to Magpylib v4.0.0 within the + **[GSC network](https://www.internationalcollaboration.org/).** +- An + **[open-access paper](https://www.sciencedirect.com/science/article/pii/S2352711020300170)** + from the year 2020 describes v2 of this library with most basic concepts still + intact in later versions. # Quickstart @@ -77,7 +103,7 @@ print(cube.orientation.as_rotvec()) # --> [0. 0. 0.] # Manipulate object position and orientation through the respective attributes, # or by using the powerful `move` and `rotate` methods. -cube.move((0, 0, -0.02))# in SI Units (m) +cube.move((0, 0, -0.02)) # in SI Units (m) cube.rotate_from_angax(angle=45, axis="z") print(cube.position) # --> [0. 0. -0.02] print(cube.orientation.as_rotvec(degrees=True)) # --> [0. 0. 45.] @@ -101,7 +127,7 @@ print(H.round()) # --> [-94537. -35642. -14085.] # in SI Units (A/m) # Position and orientation attributes of Magpylib objects can be vectors of # multiple positions/orientations referred to as "paths". When computing the # magnetic field of an object with a path, it is computed at every path index. -cube.position = [(0, 0, -.02), (1, 0, -.02), (2, 0, -.02)] # in SI Units (m) +cube.position = [(0, 0, -0.02), (1, 0, -0.02), (2, 0, -0.02)] # in SI Units (m) B = cube.getB(sensor) print(B.round(2)) # --> [[-0.12 -0.04 -0.02] # [ 0. -0. 0. ] @@ -112,7 +138,9 @@ print(B.round(2)) # --> [[-0.12 -0.04 -0.02] magpy.show(cube, sensor, backend="pyvista") ``` -More details and other important features are described in detail in the **[Documentation](https://magpylib.readthedocs.io/en/stable)**. Key features are: +More details and other important features are described in detail in the +**[Documentation](https://magpylib.readthedocs.io/en/stable)**. Key features +are: - **Collections**: Group multiple objects for common manipulation - **Complex shapes**: Create magnets with arbitrary shapes @@ -122,7 +150,10 @@ More details and other important features are described in detail in the **[Docu # How can I cite this library ? -We would be happy if you give us credit for our efforts. A valid bibtex entry for the [2020 open-access paper](https://www.sciencedirect.com/science/article/pii/S2352711020300170) would be +We would be happy if you give us credit for our efforts. A valid bibtex entry +for the +[2020 open-access paper](https://www.sciencedirect.com/science/article/pii/S2352711020300170) +would be ``` @article{ortner2020magpylib, diff --git a/docs/README.md b/docs/README.md index 0a0ba2474..662e2c965 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,10 +1,32 @@ ## About Magpylib Documentation -The Documentation is built with [Sphinx](http://www.sphinx-doc.org/en/main/) and the configuration file is [conf.py](./conf.py). Files get converted to `.html` files by Sphinx during build time. Images, web code and videos are kept in the [_static](./_static) folder. +The Documentation is built with [Sphinx](http://www.sphinx-doc.org/en/main/) and +the configuration file is [conf.py](./conf.py). Files get converted to `.html` +files by Sphinx during build time. Images, web code and videos are kept in the +[\_static](./_static) folder. ### API docs - The docstring format is under the [NumPy Convention](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_numpy.html). Sphinx is configured to read Docstring information from the codebase and convert it into pages utilizing the [autodoc extension](http://www.sphinx-doc.org/en/main/usage/extensions/autodoc.html). The generated files are created at build time and put into a folder called `_autogen` + +The docstring format is under the +[NumPy Convention](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_numpy.html). +Sphinx is configured to read Docstring information from the codebase and convert +it into pages utilizing the +[autodoc extension](http://www.sphinx-doc.org/en/main/usage/extensions/autodoc.html). +The generated files are created at build time and put into a folder called +`_autogen` ### Handwritten documents -Handwritten pages and guides are kept in the [_pages](./_pages) folder. They are all written in [Markdown](https://www.markdownguide.org/) using [myst-parser](https://github.com/executablebooks/MyST-Parser) as interface. Some documents like in the examples folder are dynamically computed with [myst-nb](https://github.com/executablebooks/myst-nb) as jupyter notebooks. With the help of the [jupytext](https://github.com/mwouts/jupytext) library ands its jupyterlab extension, examples can be written and executed within the jupyterlab ecosystem and saved as markdown file. It is recommended to use the [jupyterlab-myst](https://github.com/executablebooks/jupyterlab-myst) extension to be able to work with the full set of myst markdown flavor within jupyterlab. When editing the docs with vscode, use the [MyST-Markdown](https://marketplace.visualstudio.com/items?itemName=ExecutableBookProject.myst-highlight) extension to visualize the rendered document. +Handwritten pages and guides are kept in the [\_pages](./_pages) folder. They +are all written in [Markdown](https://www.markdownguide.org/) using +[myst-parser](https://github.com/executablebooks/MyST-Parser) as interface. Some +documents like in the examples folder are dynamically computed with +[myst-nb](https://github.com/executablebooks/myst-nb) as jupyter notebooks. With +the help of the [jupytext](https://github.com/mwouts/jupytext) library ands its +jupyterlab extension, examples can be written and executed within the jupyterlab +ecosystem and saved as markdown file. It is recommended to use the +[jupyterlab-myst](https://github.com/executablebooks/jupyterlab-myst) extension +to be able to work with the full set of myst markdown flavor within jupyterlab. +When editing the docs with vscode, use the +[MyST-Markdown](https://marketplace.visualstudio.com/items?itemName=ExecutableBookProject.myst-highlight) +extension to visualize the rendered document. diff --git a/docs/_pages/API_reference.md b/docs/_pages/API_reference.md index 9c7ec255d..5145a7e10 100644 --- a/docs/_pages/API_reference.md +++ b/docs/_pages/API_reference.md @@ -1,4 +1,5 @@ (docu-APIref)= + # API reference The API reference includes all Magpylib docstrings. @@ -7,4 +8,4 @@ The API reference includes all Magpylib docstrings. :maxdepth: 2 ../../_autogen/magpylib.rst -``` \ No newline at end of file +``` diff --git a/docs/_pages/changelog_.md b/docs/_pages/changelog_.md index 76a8f304f..4d6fd7bd4 100644 --- a/docs/_pages/changelog_.md +++ b/docs/_pages/changelog_.md @@ -1,12 +1,12 @@ - - (changelog)= + # Changelog -The changelog provides a compressed history of the Magpylib development since its publication in 2019. +The changelog provides a compressed history of the Magpylib development since +its publication in 2019. ```{include} ../../CHANGELOG.md :relative-docs: docs/ :relative-images: :start-line: 2 -``` \ No newline at end of file +``` diff --git a/docs/_pages/contributing/cont_code_of_conduct.md b/docs/_pages/contributing/cont_code_of_conduct.md index 1dbcfc576..b865cb81a 100644 --- a/docs/_pages/contributing/cont_code_of_conduct.md +++ b/docs/_pages/contributing/cont_code_of_conduct.md @@ -1,7 +1,6 @@ (code-of-conduct)= -# Code of Conduct - +# Code of Conduct ```{include} ../../../CODE_OF_CONDUCT.md :relative-docs: docs/ diff --git a/docs/_pages/contributing/cont_contributing.md b/docs/_pages/contributing/cont_contributing.md index ad09b1627..f0e581579 100644 --- a/docs/_pages/contributing/cont_contributing.md +++ b/docs/_pages/contributing/cont_contributing.md @@ -1,7 +1,6 @@ (contributing)= -# Contribution Guide - +# Contribution Guide ```{include} ../../../CONTRIBUTING.md :relative-docs: docs/ diff --git a/docs/_pages/contributing/cont_index.md b/docs/_pages/contributing/cont_index.md index 3feaf1907..ee8518596 100644 --- a/docs/_pages/contributing/cont_index.md +++ b/docs/_pages/contributing/cont_index.md @@ -1,6 +1,7 @@ # Contributing -Magpylib is a free-of-use open-source project aiming to help researchers and engineers with magnetic field computation. Your participation is most welcome! +Magpylib is a free-of-use open-source project aiming to help researchers and +engineers with magnetic field computation. Your participation is most welcome! ```{toctree} :maxdepth: 2 diff --git a/docs/_pages/contributing/cont_license.md b/docs/_pages/contributing/cont_license.md index fa4c916db..f2e4b4b63 100644 --- a/docs/_pages/contributing/cont_license.md +++ b/docs/_pages/contributing/cont_license.md @@ -1,15 +1,15 @@ (license)= -# License - +# License ## Overview -Magpylib is published under the open source [FreeBSD](https://www.freebsd.org/copyright/freebsd-license/) license. +Magpylib is published under the open source +[FreeBSD](https://www.freebsd.org/copyright/freebsd-license/) license. -- *Permissions:* Commercial use, Modification, Distribution, Private use -- *Limitations:* Liability, Warranty -- *Conditions:* License and copyright notice +- _Permissions:_ Commercial use, Modification, Distribution, Private use +- _Limitations:_ Liability, Warranty +- _Conditions:_ License and copyright notice ## License Text diff --git a/docs/_pages/user_guide/docs/docs_classes.md b/docs/_pages/user_guide/docs/docs_classes.md index c7e8d00eb..7fe59be1b 100644 --- a/docs/_pages/user_guide/docs/docs_classes.md +++ b/docs/_pages/user_guide/docs/docs_classes.md @@ -1,383 +1,441 @@ (docs-classes)= + # The Magpylib Classes -In Magpylib's [object oriented interface](docs-fieldcomp-oo) magnetic field **sources** (generate the field) and **observers** (read the field) are created as Python objects with various defining attributes and methods. +In Magpylib's [object oriented interface](docs-fieldcomp-oo) magnetic field +**sources** (generate the field) and **observers** (read the field) are created +as Python objects with various defining attributes and methods. ## Base properties The following basic properties are shared by all Magpylib classes: -* The **position** and **orientation** attributes describe the object placement in the global coordinate system. +- The **position** and + **orientation** attributes describe the + object placement in the global coordinate system. -* The **move()** and **rotate()** methods enable relative object positioning. +- The **move()** and + **rotate()** methods enable relative object + positioning. -* The **reset_path()** method sets position and orientation to default values. +- The **reset_path()** method sets position + and orientation to default values. -* The **barycenter** property returns the object barycenter (often the same as position). +- The **barycenter** property returns the + object barycenter (often the same as position). See {ref}`docs-position` for more information on these features. +- The **style** attribute includes all + settings for graphical object representation. -* The **style** attribute includes all settings for graphical object representation. - -* The **show()** method gives quick access to the graphical representation. +- The **show()** method gives quick access to + the graphical representation. -See {ref}`guide-graphics` for more information on graphic output, default styles and customization possibilities. +See {ref}`guide-graphics` for more information on graphic output, default styles +and customization possibilities. -* The **getB()**, **getH()**, **getJ()** and **getM()** methods give quick access to field computation. +- The **getB()**, + **getH()**, + **getJ()** and + **getM()** methods give quick access to + field computation. See {ref}`docs-fieldcomp` for more information. +- The **parent** attribute references a + [Collection](guide-docs-classes-collections) that the object is part of. -* The **parent** attribute references a [Collection](guide-docs-classes-collections) that the object is part of. - -* The **copy()** method creates a clone of any object where selected properties, given by kwargs, are modified. +- The **copy()** method creates a clone of + any object where selected properties, given by kwargs, are modified. -* The **describe()** method provides a brief description of the object and returns the unique object id. - - ---------------------------------------------- +- The **describe()** method provides a brief + description of the object and returns the unique object id. +--- ## Local and global coordinates -::::{grid} 2 -:::{grid-item} -:columns: 9 -Magpylib objects span a local reference frame, and all object properties are defined within this frame, for example the vertices of a `Tetrahedron` magnet. The position and orientation attributes describe how the local frame lies within the global coordinates. The two frames coincide by default, when `position=(0,0,0)` and `orientation=None` (=unit rotation). The `position` and `orientation` attributes are described in detail in {ref}`docs-position`. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_global_local.png) -::: -:::: - - ---------------------------------------------- +::::{grid} 2 :::{grid-item} :columns: 9 Magpylib objects span a local reference +frame, and all object properties are defined within this frame, for example the +vertices of a `Tetrahedron` magnet. The position and orientation attributes +describe how the local frame lies within the global coordinates. The two frames +coincide by default, when `position=(0,0,0)` and `orientation=None` (=unit +rotation). The `position` and `orientation` attributes are described in detail +in {ref}`docs-position`. ::: :::{grid-item} :columns: 3 +![](../../../_static/images/docu_classes_init_global_local.png) ::: :::: +--- (docu-magnet-classes)= -## Magnet classes -All magnets are sources. They have the **polarization** attribute which is of the format $\vec{J}=(J_x, J_y, J_z)$ and denotes a homogeneous magnetic polarization vector in the local object coordinates in units of T. Alternatively, the magnetization vector can be set via the **magnetization** attribute of the format $\vec{M}=(M_x, M_y, M_z)$. These two parameters are codependent and Magpylib ensures that they stay in sync via the relation $\vec{J}=\mu_0\cdot\vec{M}$. Information on how this is related to material properties from data sheets is found in {ref}`examples-tutorial-modeling-magnets`. +## Magnet classes +All magnets are sources. They have the +**polarization** attribute which is of the +format $\vec{J}=(J_x, J_y, J_z)$ and denotes a homogeneous magnetic polarization +vector in the local object coordinates in units of T. Alternatively, the +magnetization vector can be set via the +**magnetization** attribute of the format +$\vec{M}=(M_x, M_y, M_z)$. These two parameters are codependent and Magpylib +ensures that they stay in sync via the relation $\vec{J}=\mu_0\cdot\vec{M}$. +Information on how this is related to material properties from data sheets is +found in {ref}`examples-tutorial-modeling-magnets`. ### Cuboid + ```python -magpylib.magnet.Cuboid(position, orientation, dimension, polarization, magnetization, style) +magpylib.magnet.Cuboid( + position, orientation, dimension, polarization, magnetization, style +) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -`Cuboid` objects represent magnets with cuboid shape. The **dimension** attribute has the format $(a,b,c)$ and denotes the sides of the cuboid units of meter. The center of the cuboid lies in the origin of the local coordinates, and the sides are parallel to the coordinate axes. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_cuboid.png) -::: -:::: - +::::{grid} 2 :::{grid-item} :columns: 9 `Cuboid` objects represent magnets with +cuboid shape. The **dimension** attribute has +the format $(a,b,c)$ and denotes the sides of the cuboid units of meter. The +center of the cuboid lies in the origin of the local coordinates, and the sides +are parallel to the coordinate axes. ::: :::{grid-item} :columns: 3 +![](../../../_static/images/docu_classes_init_cuboid.png) ::: :::: ### Cylinder + ```python -magpylib.magnet.Cylinder(position, orientation, dimension, polarization, magnetization, style) +magpylib.magnet.Cylinder( + position, orientation, dimension, polarization, magnetization, style +) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -`Cylinder` objects represent magnets with cylindrical shape. The **dimension** attribute has the format $(d,h)$ and denotes diameter and height of the cylinder in units of meter. The center of the cylinder lies in the origin of the local coordinates, and the cylinder axis coincides with the z-axis. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_cylinder.png) -::: -:::: - +::::{grid} 2 :::{grid-item} :columns: 9 `Cylinder` objects represent magnets +with cylindrical shape. The **dimension** +attribute has the format $(d,h)$ and denotes diameter and height of the cylinder +in units of meter. The center of the cylinder lies in the origin of the local +coordinates, and the cylinder axis coincides with the z-axis. ::: :::{grid-item} +:columns: 3 ![](../../../_static/images/docu_classes_init_cylinder.png) ::: :::: ### CylinderSegment + ```python -magpylib.magnet.CylinderSegment(position, orientation, dimension, polarization, magnetization, style) +magpylib.magnet.CylinderSegment( + position, orientation, dimension, polarization, magnetization, style +) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -`CylinderSegment` objects represent magnets with the shape of a cylindrical ring section. The **dimension** attribute has the format $(r_1,r_2,h,\varphi_1,\varphi_2)$ and denotes inner radius, outer radius and height in units of meter, and the two section angles $\varphi_1<\varphi_2$ in °. The center of the full cylinder lies in the origin of the local coordinates, and the cylinder axis coincides with the z-axis. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_cylindersegment.png) -::: -:::{grid-item} -:columns: 12 -**Info:** When the cylinder section angles span 360°, then the much faster `Cylinder` methods are used for the field computation. -::: -:::: - +::::{grid} 2 :::{grid-item} :columns: 9 `CylinderSegment` objects represent +magnets with the shape of a cylindrical ring section. The +**dimension** attribute has the format +$(r_1,r_2,h,\varphi_1,\varphi_2)$ and denotes inner radius, outer radius and +height in units of meter, and the two section angles $\varphi_1<\varphi_2$ in °. +The center of the full cylinder lies in the origin of the local coordinates, and +the cylinder axis coincides with the z-axis. ::: :::{grid-item} :columns: 3 +![](../../../_static/images/docu_classes_init_cylindersegment.png) ::: +:::{grid-item} :columns: 12 **Info:** When the cylinder section angles span +360°, then the much faster `Cylinder` methods are used for the field +computation. ::: :::: ### Sphere + ```python -magpylib.magnet.Sphere(position, orientation, diameter, polarization, magnetization, style) +magpylib.magnet.Sphere( + position, orientation, diameter, polarization, magnetization, style +) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -`Sphere` objects represent magnets of spherical shape. The **diameter** attribute is the sphere diameter $d$ in units of meter. The center of the sphere lies in the origin of the local coordinates. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_sphere.png) -::: -:::: - +::::{grid} 2 :::{grid-item} :columns: 9 `Sphere` objects represent magnets of +spherical shape. The **diameter** attribute +is the sphere diameter $d$ in units of meter. The center of the sphere lies in +the origin of the local coordinates. ::: :::{grid-item} :columns: 3 +![](../../../_static/images/docu_classes_init_sphere.png) ::: :::: ### Tetrahedron + ```python -magpylib.magnet.Tetrahedron(position, orientation, vertices, polarization, magnetization, style) +magpylib.magnet.Tetrahedron( + position, orientation, vertices, polarization, magnetization, style +) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -`Tetrahedron` objects represent magnets of tetrahedral shape. The **vertices** attribute stores the four corner points $(\vec{P}_1, \vec{P}_2, \vec{P}_3, \vec{P}_4)$ in the local object coordinates in units of m. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_tetra.png) -::: -:::{grid-item} -:columns: 12 -**Info:** The `Tetrahedron` field is computed from four `Triangle` fields. -::: -:::: +::::{grid} 2 :::{grid-item} :columns: 9 `Tetrahedron` objects represent magnets +of tetrahedral shape. The **vertices** +attribute stores the four corner points +$(\vec{P}_1, \vec{P}_2, \vec{P}_3, \vec{P}_4)$ in the local object coordinates +in units of m. ::: :::{grid-item} :columns: 3 +![](../../../_static/images/docu_classes_init_tetra.png) ::: :::{grid-item} +:columns: 12 **Info:** The `Tetrahedron` field is computed from four `Triangle` +fields. ::: :::: (docu-magpylib-api-trimesh)= ### TriangularMesh + ```python -magpylib.magnet.TriangularMesh(position, orientation, vertices, faces, polarization, magnetization, check_open, check_disconnected, check_selfintersecting, reorient_faces, style) +magpylib.magnet.TriangularMesh( + position, + orientation, + vertices, + faces, + polarization, + magnetization, + check_open, + check_disconnected, + check_selfintersecting, + reorient_faces, + style, +) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -`TriangularMesh` objects represent magnets with surface given by a triangular mesh. The mesh is defined by the **vertices** attribute, an array of all unique corner points $(\vec{P}_1, \vec{P}_2, ...)$ in units of meter, and the **faces** attribute, which is an array of index-triplets that define individual faces $(\vec{F}_1, \vec{F}_2, ...)$. The property **mesh** returns an array of all faces as point-triples $[(\vec{P}_1^1, \vec{P}_2^1, \vec{P}_3^1), (\vec{P}_1^2, \vec{P}_2^2, \vec{P}_3^2), ...]$. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_trimesh.png) -::: -:::{grid-item} -:columns: 12 -At initialization the mesh integrity is automatically checked, and all faces are reoriented to point outwards. These actions are controlled via the kwargs -* **check_open** -* **check_disconnected** -* **check_selfintersecting** -* **reorient_faces** - -which are all by default set to `"warn"`. Options are `"skip"` (don't perform check), `"ignore"` (ignore if check fails), `"warn"` (warn if check fails), `"raise"` (raise error if check fails). +::::{grid} 2 :::{grid-item} :columns: 9 `TriangularMesh` objects represent +magnets with surface given by a triangular mesh. The mesh is defined by the +**vertices** attribute, an array of all +unique corner points $(\vec{P}_1, \vec{P}_2, ...)$ in units of meter, and the +**faces** attribute, which is an array of +index-triplets that define individual faces $(\vec{F}_1, \vec{F}_2, ...)$. The +property **mesh** returns an array of all +faces as point-triples +$[(\vec{P}_1^1, \vec{P}_2^1, \vec{P}_3^1), (\vec{P}_1^2, \vec{P}_2^2, \vec{P}_3^2), ...]$. +::: :::{grid-item} :columns: 3 +![](../../../_static/images/docu_classes_init_trimesh.png) ::: :::{grid-item} +:columns: 12 At initialization the mesh integrity is automatically checked, and +all faces are reoriented to point outwards. These actions are controlled via the +kwargs + +- **check_open** +- **check_disconnected** +- **check_selfintersecting** +- **reorient_faces** + +which are all by default set to `"warn"`. Options are `"skip"` (don't perform +check), `"ignore"` (ignore if check fails), `"warn"` (warn if check fails), +`"raise"` (raise error if check fails). Results of the checks are stored in the following object attributes -* **status_open** can be `True`, `False` or `None` (unchecked) -* **status_open_data** contains an array of open edges -* **status_disconnected** can be `True`, `False` or `None` (unchecked) -* **status_disconnected_data** contains an array of mesh parts -* **status_selfintersecting** can be `True`, `None` or `None` (unchecked) -* **status_selfintersecting_data** contains an array of self-intersecting faces -* **status_reoriented** can be `True` or `False` -The checks can also be performed after initialization using the methods -* **check_open()** -* **check_disconnected()** -* **check_selfintersecting()** -* **reorient_faces()** - -The following class methods enable easy mesh creating and mesh loading. +- **status_open** can be `True`, `False` or + `None` (unchecked) +- **status_open_data** contains an array of + open edges +- **status_disconnected** can be `True`, + `False` or `None` (unchecked) +- **status_disconnected_data** contains an + array of mesh parts +- **status_selfintersecting** can be `True`, + `None` or `None` (unchecked) +- **status_selfintersecting_data** contains + an array of self-intersecting faces +- **status_reoriented** can be `True` or + `False` -* **TriangularMesh.from_mesh()** generates a `TriangularMesh` objects from the input **mesh**, which is an array in the mesh format $[(\vec{P}_1^1, \vec{P}_2^1, \vec{P}_3^1), (\vec{P}_1^2, \vec{P}_2^2, \vec{P}_3^2), ...]$. -* **TriangularMesh.from_ConvexHull()** generates a `TriangularMesh` object from the input **points**, which is an array of positions $(\vec{P}_1, \vec{P}_2, \vec{P}_3, ...)$ from which the convex Hull is computed via the [Scipy ConvexHull](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.ConvexHull.html) implementation. -* **TriangularMesh.from_triangles()** generates a `TriangularMesh` object from the input **triangles**, which is a list or a `Collection` of `Triangle` objects. -* **TriangularMesh.from_pyvista()** generates a `TriangularMesh` object from the input **polydata**, which is a [Pyvista PolyData](https://docs.pyvista.org/version/stable/api/core/_autosummary/pyvista.PolyData.html) object. - -The method **to_TriangleCollection()** transforms a `TriangularMesh` object into a `Collection` of `Triangle` objects. - -**Info:** While the checks may be disabled, the field computation guarantees correct results only if the mesh is closed, connected, not self-intersecting and all faces are oriented outwards. Examples of working with the `TriangularMesh` class are found in {ref}`examples-shapes-triangle` and in {ref}`examples-shapes-pyvista`. -::: -:::: +The checks can also be performed after initialization using the methods +- **check_open()** +- **check_disconnected()** +- **check_selfintersecting()** +- **reorient_faces()** ---------------------------------------------- +The following class methods enable easy mesh creating and mesh loading. +- **TriangularMesh.from_mesh()** generates a + `TriangularMesh` objects from the input + **mesh**, which is an array in the mesh + format + $[(\vec{P}_1^1, \vec{P}_2^1, \vec{P}_3^1), (\vec{P}_1^2, \vec{P}_2^2, \vec{P}_3^2), ...]$. +- **TriangularMesh.from_ConvexHull()** + generates a `TriangularMesh` object from the input + **points**, which is an array of positions + $(\vec{P}_1, \vec{P}_2, \vec{P}_3, ...)$ from which the convex Hull is + computed via the + [Scipy ConvexHull](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.ConvexHull.html) + implementation. +- **TriangularMesh.from_triangles()** + generates a `TriangularMesh` object from the input + **triangles**, which is a list or a + `Collection` of `Triangle` objects. +- **TriangularMesh.from_pyvista()** generates + a `TriangularMesh` object from the input + **polydata**, which is a + [Pyvista PolyData](https://docs.pyvista.org/version/stable/api/core/_autosummary/pyvista.PolyData.html) + object. + +The method **to_TriangleCollection()** +transforms a `TriangularMesh` object into a `Collection` of `Triangle` objects. + +**Info:** While the checks may be disabled, the field computation guarantees +correct results only if the mesh is closed, connected, not self-intersecting and +all faces are oriented outwards. Examples of working with the `TriangularMesh` +class are found in {ref}`examples-shapes-triangle` and in +{ref}`examples-shapes-pyvista`. ::: :::: + +--- ## Current classes -All currents are sources. Current objects have the **current** attribute which is a scalar that denotes the electrical current in units of ampere. +All currents are sources. Current objects have the +**current** attribute which is a scalar that +denotes the electrical current in units of ampere. ### Circle + ```python magpylib.current.Circle(position, orientation, diameter, current, style) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -`Circle` objects represent circular line current loops. The **diameter** attribute is the loop diameter $d$ in units of meter. The loop lies in the xy-plane with it's center in the origin of the local coordinates. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_loop.png) -::: -:::: +::::{grid} 2 :::{grid-item} :columns: 9 `Circle` objects represent circular line +current loops. The **diameter** attribute is +the loop diameter $d$ in units of meter. The loop lies in the xy-plane with it's +center in the origin of the local coordinates. ::: :::{grid-item} :columns: 3 +![](../../../_static/images/docu_classes_init_loop.png) ::: :::: ### Polyline + ```python magpylib.current.Polyline(position, orientation, vertices, current, style) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -`Polyline` objects represent line current segments where the electric current flows in straight lines from vertex to vertex. The **vertices** attribute is a vector of all vertices $(\vec{P}_1, \vec{P}_2, ...)$ given in the local coordinates in units of meter. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_line.png) -::: -:::: +::::{grid} 2 :::{grid-item} :columns: 9 `Polyline` objects represent line +current segments where the electric current flows in straight lines from vertex +to vertex. The **vertices** attribute is a +vector of all vertices $(\vec{P}_1, \vec{P}_2, ...)$ given in the local +coordinates in units of meter. ::: :::{grid-item} :columns: 3 +![](../../../_static/images/docu_classes_init_line.png) ::: :::: ---------------------------------------------- +--- ## Miscellaneous classes -There are classes listed hereon that function as sources, but they do not represent physical magnets or current distributions. - +There are classes listed hereon that function as sources, but they do not +represent physical magnets or current distributions. ### Dipole + ```python magpylib.misc.Dipole(position, orientation, moment, style) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -`Dipole` objects represent magnetic dipole moments with the **moment** attribute that describes the magnetic dipole moment $\vec{m}=(m_x,m_y,m_z)$ in SI-units of Am², which lies in the origin of the local coordinates. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_dipole.png) -::: -:::{grid-item} -:columns: 12 -**Info:** The total dipole moment of a homogeneous magnet with body volume $V$ is given by $\vec{m}=\vec{M}\cdot V$. -::: -:::: - +::::{grid} 2 :::{grid-item} :columns: 9 `Dipole` objects represent magnetic +dipole moments with the **moment** attribute +that describes the magnetic dipole moment $\vec{m}=(m_x,m_y,m_z)$ in SI-units of +Am², which lies in the origin of the local coordinates. ::: :::{grid-item} +:columns: 3 ![](../../../_static/images/docu_classes_init_dipole.png) ::: +:::{grid-item} :columns: 12 **Info:** The total dipole moment of a homogeneous +magnet with body volume $V$ is given by $\vec{m}=\vec{M}\cdot V$. ::: :::: ### Triangle + ```python -magpylib.misc.Triangle(position, orientation, vertices, polarization, magnetization, style) +magpylib.misc.Triangle( + position, orientation, vertices, polarization, magnetization, style +) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -`Triangle` objects represent triangular surfaces with homogeneous charge density given by the projection of the polarization or magnetization vector onto the surface normal. The attributes **polarization** and **magnetization** are treated similar as by the {ref}`docu-magnet-classes`. The **vertices** attribute is a set of the three triangle corners $(\vec{P}_1, \vec{P}_2, \vec{P}_3)$ in units of meter in the local coordinates. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_triangle.png) -::: -:::{grid-item} -:columns: 12 -**Info:** When multiple Triangles with similar magnetization/polarization vectors form a closed surface, and all their orientations (right-hand-rule) point outwards, their total H-field is equivalent to the field of a homogeneous magnet of the same shape. In this case, the B-field is only correct on the outside of the body. On the inside the polarization must be added to the field. This is demonstrated in the tutorial {ref}`examples-shapes-triangle`. -::: -:::: +::::{grid} 2 :::{grid-item} :columns: 9 `Triangle` objects represent triangular +surfaces with homogeneous charge density given by the projection of the +polarization or magnetization vector onto the surface normal. The attributes +**polarization** and +**magnetization** are treated similar as by +the {ref}`docu-magnet-classes`. The +**vertices** attribute is a set of the three +triangle corners $(\vec{P}_1, \vec{P}_2, \vec{P}_3)$ in units of meter in the +local coordinates. ::: :::{grid-item} :columns: 3 +![](../../../_static/images/docu_classes_init_triangle.png) ::: :::{grid-item} +:columns: 12 **Info:** When multiple Triangles with similar +magnetization/polarization vectors form a closed surface, and all their +orientations (right-hand-rule) point outwards, their total H-field is equivalent +to the field of a homogeneous magnet of the same shape. In this case, the +B-field is only correct on the outside of the body. On the inside the +polarization must be added to the field. This is demonstrated in the tutorial +{ref}`examples-shapes-triangle`. ::: :::: (guide-docs-classes-custom-source)= + ### CustomSource + ```python magpylib.misc.CustomSource(field_func, position, orientation, style) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -The `CustomSource` class is used to create user defined sources provided with with custom field computation functions. The argument **field_func** takes a function that is then automatically called for the field computation. This custom field function is treated like a [core function](docs-field-core). It must have the positional arguments `field` with values `"B"` or `"H"`, and `observers` (must accept array with shape (n,3)) and return the B-field and the H-field with a similar shape. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_custom.png) -::: -:::{grid-item} -:columns: 12 -**Info:** A tutorial {ref}`examples-tutorial-custom` is found in the examples. -::: -:::: - - ---------------------------------------------- +::::{grid} 2 :::{grid-item} :columns: 9 The `CustomSource` class is used to +create user defined sources provided with with custom field computation +functions. The argument **field_func** takes +a function that is then automatically called for the field computation. This +custom field function is treated like a [core function](docs-field-core). It +must have the positional arguments `field` with values `"B"` or `"H"`, and +`observers` (must accept array with shape (n,3)) and return the B-field and the +H-field with a similar shape. ::: :::{grid-item} :columns: 3 +![](../../../_static/images/docu_classes_init_custom.png) ::: :::{grid-item} +:columns: 12 **Info:** A tutorial {ref}`examples-tutorial-custom` is found in +the examples. ::: :::: +--- ## Sensor + ```python magpylib.Sensor(position, orientation, pixel, handedness, style) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -`Sensor` objects represent observers of the magnetic field and can be used as Magpylib `observers` input for magnetic field computation. The **pixel** attribute is an array of positions $(\vec{P}_1, \vec{P}_2, ...)$ provided in units of meter in the local sensor coordinates. A sensor returns the magnetic field at these pixel positions. By default `pixel=(0,0,0)` and the sensor simply returns the field at it's position. The **handedness** attribute can be `"left"` or `"right"` (default) to set a left- or right-handed sensor coordinate system for the field computation. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_sensor.png) -::: -:::{grid-item} -:columns: 12 -**Info:** Sensors can have their own position and orientation and enable easy relative positioning between sources and observers. The field is always computed in the reference frame of the sensor, which might itself be moving in the global coordinate system. Magpylib sensors can be understood as perfect magnetic field sensors with infinitesimally sensitive elements. An example how to use sensors is given in {ref}`examples-tutorial-field-computation-sensors`. -::: -:::: - - ---------------------------------------------- - +::::{grid} 2 :::{grid-item} :columns: 9 `Sensor` objects represent observers of +the magnetic field and can be used as Magpylib `observers` input for magnetic +field computation. The **pixel** attribute is +an array of positions $(\vec{P}_1, \vec{P}_2, ...)$ provided in units of meter +in the local sensor coordinates. A sensor returns the magnetic field at these +pixel positions. By default `pixel=(0,0,0)` and the sensor simply returns the +field at it's position. The **handedness** +attribute can be `"left"` or `"right"` (default) to set a left- or right-handed +sensor coordinate system for the field computation. ::: :::{grid-item} :columns: +3 ![](../../../_static/images/docu_classes_init_sensor.png) ::: :::{grid-item} +:columns: 12 **Info:** Sensors can have their own position and orientation and +enable easy relative positioning between sources and observers. The field is +always computed in the reference frame of the sensor, which might itself be +moving in the global coordinate system. Magpylib sensors can be understood as +perfect magnetic field sensors with infinitesimally sensitive elements. An +example how to use sensors is given in +{ref}`examples-tutorial-field-computation-sensors`. ::: :::: + +--- (guide-docs-classes-collections)= + ## Collection + ```python magpylib.Collection(*children, position, orientation, override_parent, style) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -A `Collection` is a group of Magpylib objects that is used for common manipulation. All these objects are stored by reference in the **children** attribute. The collection becomes the **parent** of the object. An object can only have one parent. There are several options for accessing only specific children via the following properties - -* **sources**: return only sources -* **observers**: return only observers -* **collections**: return only collections -* **sources_all**: return all sources, including the ones from sub-collections -* **observers_all**: return all observers, including the ones from sub-collections -* **collections_all**: return all collections, including the ones from sub-collections +::::{grid} 2 :::{grid-item} :columns: 9 A `Collection` is a group of Magpylib +objects that is used for common manipulation. All these objects are stored by +reference in the **children** attribute. The +collection becomes the **parent** of the +object. An object can only have one parent. There are several options for +accessing only specific children via the following properties + +- **sources**: return only sources +- **observers**: return only observers +- **collections**: return only collections +- **sources_all**: return all sources, + including the ones from sub-collections +- **observers_all**: return all observers, + including the ones from sub-collections +- **collections_all**: return all + collections, including the ones from sub-collections Additional methods for adding and removing children: - **add()**: Add an object to the collection -- **remove()**: Remove an object from the collection -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_collection.png) -::: -:::{grid-item} -:columns: 12 -**Info:** A collection object has its own `position` and `orientation` attributes and spans a local reference frame for all its children. An operation applied to a collection moves the frame and is individually applied to all children such that their relative position in the local reference frame is maintained. This means that the collection functions as a container for manipulation, but child position and orientation are always updated in the global coordinate system. After being added to a collection, it is still possible to manipulate the individual children, which will also move them to a new relative position in the collection frame. - -Collections have **format** as an additional argument for **describe()** method. Default value is `format="type+id+label"`. Any combination of `"type"`, `"id"`, and `"label"` is allowed. - -A tutorial {ref}`examples-tutorial-collection` is provided in the example examples. -::: -:::: +- **remove()**: Remove an object from the + collection ::: :::{grid-item} :columns: 3 + ![](../../../_static/images/docu_classes_init_collection.png) ::: + :::{grid-item} :columns: 12 **Info:** A collection object has its own + `position` and `orientation` attributes and spans a local reference frame for + all its children. An operation applied to a collection moves the frame and is + individually applied to all children such that their relative position in the + local reference frame is maintained. This means that the collection functions + as a container for manipulation, but child position and orientation are always + updated in the global coordinate system. After being added to a collection, it + is still possible to manipulate the individual children, which will also move + them to a new relative position in the collection frame. + +Collections have **format** as an additional argument for **describe()** method. +Default value is `format="type+id+label"`. Any combination of `"type"`, `"id"`, +and `"label"` is allowed. + +A tutorial {ref}`examples-tutorial-collection` is provided in the example +examples. ::: :::: diff --git a/docs/_pages/user_guide/docs/docs_fieldcomp.md b/docs/_pages/user_guide/docs/docs_fieldcomp.md index c1632f3cf..d4280ca24 100644 --- a/docs/_pages/user_guide/docs/docs_fieldcomp.md +++ b/docs/_pages/user_guide/docs/docs_fieldcomp.md @@ -1,13 +1,22 @@ (docs-fieldcomp)= + # Field Computation -The following is a detailed technical documentation of Magpylib field computation. -The tutorial {ref}`examples-tutorial-field-computation` shows good practices and illustrative examples. +The following is a detailed technical documentation of Magpylib field +computation. The tutorial {ref}`examples-tutorial-field-computation` shows good +practices and illustrative examples. (docs-fieldcomp-oo)= + ## Object-oriented interface -The object-oriented interface relies on the idea that sources of the magnetic field and observers thereof are created as Python objects which can be manipulated at will, and called for field computation. This is done via four top-level functions **getB**, **getH**, **getJ** and, **getM**, +The object-oriented interface relies on the idea that sources of the magnetic +field and observers thereof are created as Python objects which can be +manipulated at will, and called for field computation. This is done via four +top-level functions **getB**, +**getH**, +**getJ** and, +**getM**, ```python magpylib.getB(sources, observers, squeeze=True, pixel_agg=None, output="ndarray") @@ -16,13 +25,19 @@ magpylib.getJ(sources, observers, squeeze=True, pixel_agg=None, output="ndarray" magpylib.getM(sources, observers, squeeze=True, pixel_agg=None, output="ndarray") ``` -that compute the respective fields B (B-field), H (H-field), J (polarization) or M (magnetization) generated by `sources` as seen by the `observers` in their local coordinates. `sources` can be any Magpylib source object (e.g. magnets) or a flat list thereof. `observers` can be an array of position vectors with shape `(n1,n2,n3,...,3)`, any Magpylib observer object (e.g. sensors), or a flat list thereof. The following code shows a minimal example for Magpylib field computation. +that compute the respective fields B (B-field), H (H-field), J (polarization) or +M (magnetization) generated by `sources` as seen by the `observers` in their +local coordinates. `sources` can be any Magpylib source object (e.g. magnets) or +a flat list thereof. `observers` can be an array of position vectors with shape +`(n1,n2,n3,...,3)`, any Magpylib observer object (e.g. sensors), or a flat list +thereof. The following code shows a minimal example for Magpylib field +computation. ```python import magpylib as magpy # Define source and observer objects -loop = magpy.current.Circle(current=1, diameter=.001) +loop = magpy.current.Circle(current=1, diameter=0.001) sens = magpy.Sensor() # Compute field @@ -32,7 +47,9 @@ print(B) # --> [0. 0. 0.00125664] ``` -For quick access, the functions `getBHJM` are also methods of all Magpylib objects, such that the `sources` or `observers` input is the object itself. The above example can be continued as +For quick access, the functions `getBHJM` are also methods of all Magpylib +objects, such that the `sources` or `observers` input is the object itself. The +above example can be continued as ```python # Call getB as method of loop @@ -44,19 +61,33 @@ B = sens.getB(loop) with the same result for `B`. -By default, `getB` returns the B-field in units of T, `getH` the H-field in units of A/m, `getJ` the magnetic polarization in T and, `getM` the magnetization in A/m, assuming that all inputs are given in SI units as described in the docstrings. +By default, `getB` returns the B-field in units of T, `getH` the H-field in +units of A/m, `getJ` the magnetic polarization in T and, `getM` the +magnetization in A/m, assuming that all inputs are given in SI units as +described in the docstrings. ```{hint} In reality, `getB` is proportional to the `polarization` input and therefore returns the same unit. For example, with polarization input in mT, `getB` will return mT as well. At the same time when the `magnetization` input is kA/m, then `getH` returns kA/m as well. The B/H-field outputs are related to a M/J-inputs via a factor of $µ_0$. ``` -The output of a field computation `magpy.getB(sources, observers)` is by default a NumPy array of shape `(l, m, k, n1, n2, n3, ..., 3)` where `l` is the number of input sources, `m` the (maximal) object path length, `k` the number of observers, `n1,n2,n3,...` the sensor pixel shape or the shape of the observer position array input and `3` the three magnetic field components $(B_x, B_y, B_z)$. +The output of a field computation `magpy.getB(sources, observers)` is by default +a NumPy array of shape `(l, m, k, n1, n2, n3, ..., 3)` where `l` is the number +of input sources, `m` the (maximal) object path length, `k` the number of +observers, `n1,n2,n3,...` the sensor pixel shape or the shape of the observer +position array input and `3` the three magnetic field components +$(B_x, B_y, B_z)$. -* `squeeze`: If True (default) all axes of length 1 in the output (e.g. only a single source) are squeezed. +- `squeeze`: If True (default) all axes of length 1 in the output (e.g. only a + single source) are squeezed. -* `pixel_agg`: Select a compatible NumPy aggregator function (e.g. `"min"`, `"mean"`) that is applied to the output. For example, with `pixel_agg="mean"` the mean field of all observer points is returned. With this option it is possible to supply `getBHJM` with multiple observers that have different pixel shapes. +- `pixel_agg`: Select a compatible NumPy aggregator function (e.g. `"min"`, + `"mean"`) that is applied to the output. For example, with `pixel_agg="mean"` + the mean field of all observer points is returned. With this option it is + possible to supply `getBHJM` with multiple observers that have different pixel + shapes. -* `output`: Change the output format. Options are `"ndarray"` (default, returns a NumPy ndarray) and `"dataframe"` (returns a 2D-table Pandas DataFrame). +- `output`: Change the output format. Options are `"ndarray"` (default, returns + a NumPy ndarray) and `"dataframe"` (returns a 2D-table Pandas DataFrame). ```{note} Magpylib collects all inputs (object parameters), and vectorizes them for the computation which reduces the computation time dramatically for large inputs. @@ -65,28 +96,37 @@ Try to make all field computations with as few calls to `getBHJM` as possible. A ``` (docs-field-functional)= + ## Functional interface -Users can bypass the object oriented functionality of Magpylib and instead compute the field for n given parameter sets. This is done by providing the following inputs to the top level functions `getB`, `getH`, `getJ` and, `getM`. +Users can bypass the object oriented functionality of Magpylib and instead +compute the field for n given parameter sets. This is done by providing the +following inputs to the top level functions `getB`, `getH`, `getJ` and, `getM`. -1. `sources`: a string denoting the source type. Allowed values are the Magpylib source class names, see {ref}`docs-classes`. +1. `sources`: a string denoting the source type. Allowed values are the Magpylib + source class names, see {ref}`docs-classes`. 2. `observers`: array-like of shape (3,) or (n,3) giving the observer positions. -3. `kwargs`: a dictionary with inputs of shape (x,) or (n,x). Must include all mandatory class-specific inputs. By default, `position=(0,0,0)` and `orientation=None`(=unit rotation). +3. `kwargs`: a dictionary with inputs of shape (x,) or (n,x). Must include all + mandatory class-specific inputs. By default, `position=(0,0,0)` and + `orientation=None`(=unit rotation). -All "scalar" inputs of shape (x,) are automatically tiled up to shape (n,x) to create a set of n computation instances. The field is returned in the shape (n,3). The following code demonstrates the functional interface. +All "scalar" inputs of shape (x,) are automatically tiled up to shape (n,x) to +create a set of n computation instances. The field is returned in the shape +(n,3). The following code demonstrates the functional interface. ```python import numpy as np import magpylib as magpy + # All inputs and outputs in SI units # Compute the cuboid field for 3 input instances -N = 3 # number of instances +N = 3 # number of instances B = magpy.getB( - sources='Cuboid', - observers=np.linspace((0,0,1), (0,0,3), N), - dimension=np.linspace((1,1,1), (3,3,3),3, N), - polarization=(0,0,1), + sources="Cuboid", + observers=np.linspace((0, 0, 1), (0, 0, 3), N), + dimension=np.linspace((1, 1, 1), (3, 3, 3), 3, N), + polarization=(0, 0, 1), ) # This example demonstrates the scale invariance @@ -100,65 +140,70 @@ print(B) The functional interface is potentially faster than the object oriented one if users know how to generate the input arrays efficiently with numpy (e.g. `np.arange`, `np.linspace`, `np.tile`, `np.repeat`, ...). ``` - (docs-field-core)= + ## Core interface -At the heart of Magpylib lies a set of core functions that are our implementations of analytical field expressions found in the literature, see {ref}`guide-ressources-physics`. Direct access to these functions is given through the `magpylib.core` subpackage which includes, +At the heart of Magpylib lies a set of core functions that are our +implementations of analytical field expressions found in the literature, see +{ref}`guide-ressources-physics`. Direct access to these functions is given +through the `magpylib.core` subpackage which includes, -::::{grid} 1 -:gutter: 1 +::::{grid} 1 :gutter: 1 -:::{grid-item} -**magnet_cuboid_Bfield(** `observers`, `dimensions`, `polarizations`**)** -::: +:::{grid-item} **magnet_cuboid_Bfield(** +`observers`, `dimensions`, +`polarizations`**)** ::: :::{grid-item} -**magnet_cylinder_axial_Bfield(** `z0`, `r`, `z`**)** -::: +**magnet_cylinder_axial_Bfield(** `z0`, `r`, +`z`**)** ::: :::{grid-item} -**magnet_cylinder_diametral_Hfield(** `z0`, `r`, `z`, `phi`**)** -::: +**magnet_cylinder_diametral_Hfield(** `z0`, +`r`, `z`, `phi`**)** ::: :::{grid-item} -**magnet_cylinder_segment_Hfield(** `observers`, `dimensions`, `magnetizations`**)** -::: +**magnet_cylinder_segment_Hfield(** +`observers`, `dimensions`, +`magnetizations`**)** ::: :::{grid-item} -**magnet_sphere_Bfield(**`observers`, `diameters`, `polarizations`**)** -::: +**magnet_sphere_Bfield(**`observers`, +`diameters`, `polarizations`**)** ::: :::{grid-item} -**current_circle_Hfield(**`r0`, `r`, `z`, `i0`**)** -::: +**current_circle_Hfield(**`r0`, `r`, `z`, +`i0`**)** ::: :::{grid-item} -**current_polyline_Hfield(**`observers`, `segments_start`, `segments_end`, `currents`**)** -::: +**current_polyline_Hfield(**`observers`, +`segments_start`, `segments_end`, +`currents`**)** ::: -:::{grid-item} -**dipole_Hfield(**`observers`, `moments`**)** -::: +:::{grid-item} **dipole_Hfield(**`observers`, +`moments`**)** ::: :::{grid-item} -**triangle_Bfield(**`observers`, `vertices`, `polarizations`**)** -::: +**triangle_Bfield(**`observers`, `vertices`, +`polarizations`**)** ::: :::: -All inputs must be NumPy ndarrays of shape (n,x). Details can be found in the respective function docstrings. The following example demonstrates the core interface. - +All inputs must be NumPy ndarrays of shape (n,x). Details can be found in the +respective function docstrings. The following example demonstrates the core +interface. ```python import numpy as np import magpylib as magpy + # All inputs and outputs in SI units # Prepare input -z0 = np.array([1,1]) -r = np.array([1,1]) -z = np.array([2,2]) +z0 = np.array([1, 1]) +r = np.array([1, 1]) +z = np.array([2, 2]) # Compute field with core functions B = magpy.core.magnet_cylinder_axial_Bfield(z0=z0, r=r, z=z).T @@ -170,6 +215,7 @@ print(B) ## Field computation workflow -The Magpylib field computation internal workflow and different approaches of the three interfaces is outlined in the following sketch. +The Magpylib field computation internal workflow and different approaches of the +three interfaces is outlined in the following sketch. ![](../../../_static/images/docu_field_comp_flow.png) diff --git a/docs/_pages/user_guide/docs/docs_graphics.md b/docs/_pages/user_guide/docs/docs_graphics.md index 74ab19846..581cff36b 100644 --- a/docs/_pages/user_guide/docs/docs_graphics.md +++ b/docs/_pages/user_guide/docs/docs_graphics.md @@ -13,12 +13,17 @@ orphan: true --- (guide-graphics)= + # Graphic output (guide-graphics-show)= + ## 3D graphics with show -Once all Magpylib objects and their paths have been created, `show` creates a 3D plot of the geometric arrangement using the Matplotlib (command line default) and Plotly (notebook default) packages. `show` generates a new figure which is automatically displayed. +Once all Magpylib objects and their paths have been created, `show` creates a 3D +plot of the geometric arrangement using the Matplotlib (command line default) +and Plotly (notebook default) packages. `show` generates a new figure which is +automatically displayed. ```{code-cell} ipython3 import magpylib as magpy @@ -43,16 +48,26 @@ sensor = magpy.Sensor( magpy.show(magnet, current, dipole, sensor) ``` -Notice that objects and their paths are automatically assigned different colors. The polarization of the magnet is displayed by default (Plotly and Pyvista) by coloring the poles, which overwrites the object color. In Matplotlib the polarization is by default displayed by an arrow. Current directions and dipole objects are indicated by arrows and sensors are shown as tri-colored coordinate cross with pixel as markers. +Notice that objects and their paths are automatically assigned different colors. +The polarization of the magnet is displayed by default (Plotly and Pyvista) by +coloring the poles, which overwrites the object color. In Matplotlib the +polarization is by default displayed by an arrow. Current directions and dipole +objects are indicated by arrows and sensors are shown as tri-colored coordinate +cross with pixel as markers. -How objects are represented graphically (color, line thickness, etc.) is defined by their [style properties](guide-graphic-styles). +How objects are represented graphically (color, line thickness, etc.) is defined +by their [style properties](guide-graphic-styles). (guide-graphic-backends)= + ## Graphic backends -The graphic backend refers to the plotting library that is used for graphic output. A plotting canvas refers to the frame/window/canvas/axes object the graphic output is forwarded to. +The graphic backend refers to the plotting library that is used for graphic +output. A plotting canvas refers to the frame/window/canvas/axes object the +graphic output is forwarded to. -The graphic backend is set via the kwarg `backend` in the `show` function, which is demonstrated in the following example +The graphic backend is set via the kwarg `backend` in the `show` function, which +is demonstrated in the following example ```{code-cell} ipython3 import magpylib as magpy @@ -72,64 +87,80 @@ for backend in magpy.SUPPORTED_PLOTTING_BACKENDS: magpy.show(loop, cylinder, backend=backend) ``` -With the installation default setting, `backend='auto'`, Magpylib infers the graphic backend from the environment running the code, or from the requested canvas. +With the installation default setting, `backend='auto'`, Magpylib infers the +graphic backend from the environment running the code, or from the requested +canvas. | environment | canvas | inferred backend | -|------------------|-------------------------------------------------|------------------| +| ---------------- | ----------------------------------------------- | ---------------- | | Command-Line | `None` | `matplotlib` | | IPython notebook | `None` | `plotly` | | all | `matplotlib.axes.Axes` | `matplotlib` | | all | `plotly.graph_objects.Figure` or `FigureWidget` | `plotly` | | all | `pyvista.Plotter` | `pyvista` | -The library default can be changed, e.g. with the command `magpy.defaults.display.backend = 'plotly'`. - -There is a high level of **feature parity**, however, not all graphic features are supported by all backends, and not all graphic features work equally well, so that [default style settings](guide-graphic-styles-default) differ slightly. In addition, some common Matplotlib syntax (e.g. color `'r'`, linestyle `':'`) is automatically translated to other backends. - -| Feature | Matplotlib | Plotly | Pyvista | -|:------------------------:|:----------:|:------:|:-------:| -| triangular mesh 3d | ✔️ | ✔️ | ✔️ | -| line 3d | ✔️ | ✔️ | ✔️ | -| line style | ✔️ | ✔️ | ❌ | -| line color | ✔️ | ✔️ | ✔️ | -| line width | ✔️ | ✔️ | ✔️ | -| marker 3d | ✔️ | ✔️ | ✔️ | -| marker color | ✔️ | ✔️ | ✔️ | -| marker size | ✔️ | ✔️ | ✔️ | -| marker symbol | ✔️ | ✔️ | ❌ | -| marker numbering | ✔️ | ✔️ | ❌ | -| zoom level | ✔️ | ✔️ | ❌[2] | -| magnetization color | ✔️[7] | ✔️ | ✔️ | -| animation | ✔️ | ✔️ | ✔️[5] | -| animation time | ✔️ | ✔️ | ✔️[5] | -| animation fps | ✔️ | ✔️ | ✔️[5] | -| animation slider | ✔️[1] | ✔️ | ❌ | -| subplots 2D | ✔️ | ✔️ | ✔️[6] | -| subplots 3D | ✔️ | ✔️ | ✔️ | -| user canvas | ✔️ | ✔️ | ✔️ | -| user extra 3d model [3] | ✔️ | ✔️ | ✔️[4] | +The library default can be changed, e.g. with the command +`magpy.defaults.display.backend = 'plotly'`. + +There is a high level of **feature parity**, however, not all graphic features +are supported by all backends, and not all graphic features work equally well, +so that [default style settings](guide-graphic-styles-default) differ slightly. +In addition, some common Matplotlib syntax (e.g. color `'r'`, linestyle `':'`) +is automatically translated to other backends. + +| Feature | Matplotlib | Plotly | Pyvista | +| :---------------------: | :--------: | :----: | :-----: | +| triangular mesh 3d | ✔️ | ✔️ | ✔️ | +| line 3d | ✔️ | ✔️ | ✔️ | +| line style | ✔️ | ✔️ | ❌ | +| line color | ✔️ | ✔️ | ✔️ | +| line width | ✔️ | ✔️ | ✔️ | +| marker 3d | ✔️ | ✔️ | ✔️ | +| marker color | ✔️ | ✔️ | ✔️ | +| marker size | ✔️ | ✔️ | ✔️ | +| marker symbol | ✔️ | ✔️ | ❌ | +| marker numbering | ✔️ | ✔️ | ❌ | +| zoom level | ✔️ | ✔️ | ❌[2] | +| magnetization color | ✔️[7] | ✔️ | ✔️ | +| animation | ✔️ | ✔️ | ✔️[5] | +| animation time | ✔️ | ✔️ | ✔️[5] | +| animation fps | ✔️ | ✔️ | ✔️[5] | +| animation slider | ✔️[1] | ✔️ | ❌ | +| subplots 2D | ✔️ | ✔️ | ✔️[6] | +| subplots 3D | ✔️ | ✔️ | ✔️ | +| user canvas | ✔️ | ✔️ | ✔️ | +| user extra 3d model [3] | ✔️ | ✔️ | ✔️[4] | [1]: when returning animation object and exporting it as jshtml. [2]: possible but not implemented at the moment. -[3]: only `"scatter3d"`, and `"mesh3d"`. Gets "translated" to every other backend. +[3]: only `"scatter3d"`, and `"mesh3d"`. Gets "translated" to every other +backend. -[4]: custom user defined trace constructors allowed, which are specific to the backend. +[4]: custom user defined trace constructors allowed, which are specific to the +backend. [5]: animation is only available through export as `gif` or `mp4` -[6]: 2D plots are not supported for all jupyter_backends. As of pyvista>=0.38 these are deprecated and replaced by the [trame](https://docs.pyvista.org/api/plotting/trame.html) backend. +[6]: 2D plots are not supported for all jupyter_backends. As of pyvista>=0.38 +these are deprecated and replaced by the +[trame](https://docs.pyvista.org/api/plotting/trame.html) backend. -[7]: Matplotlib does not support color gradient. Instead magnetization is shown through object slicing and coloring. - -`show` will also pass on all kwargs to the respective plotting backends. For example, in the [animation sample code](guide-graphic-animations) the kwarg `show_legend` is forwarded to the Plotly backend. +[7]: Matplotlib does not support color gradient. Instead magnetization is shown +through object slicing and coloring. +`show` will also pass on all kwargs to the respective plotting backends. For +example, in the [animation sample code](guide-graphic-animations) the kwarg +`show_legend` is forwarded to the Plotly backend. (guide-graphics-canvas)= + ## Plotting canvas -When calling `show`, a figure is automatically generated and displayed. It is also possible to place the `show` output in a given figure using the `canvas` argument. Consider the following Magpylib field computation, +When calling `show`, a figure is automatically generated and displayed. It is +also possible to place the `show` output in a given figure using the `canvas` +argument. Consider the following Magpylib field computation, ```{code-cell} ipython3 import magpylib as magpy @@ -141,11 +172,13 @@ sens = magpy.Sensor(position=np.linspace((0, 0, -0.1), (0, 0, 0.1), 100)) B = loop.getB(sens) ``` -The following examples demonstrate how to place the Magpylib `show` output in figures created with the three supported graphic backends. +The following examples demonstrate how to place the Magpylib `show` output in +figures created with the three supported graphic backends. +++ -In **Matplotlib** we combine a 2D-field plot with the 3D show output and modify the 3D show output with a line. +In **Matplotlib** we combine a 2D-field plot with the 3D show output and modify +the 3D show output with a line. ```{code-cell} ipython3 import magpylib as magpy @@ -182,7 +215,8 @@ When providing a canvas, no update to its layout is performed by Magpylib, unles +++ -In **Plotly** we combine a 2D-field plot with the 3D show output and modify the 3D show output with a line. +In **Plotly** we combine a 2D-field plot with the 3D show output and modify the +3D show output with a line. ```{code-cell} ipython3 import magpylib as magpy @@ -212,7 +246,8 @@ fig.add_scatter3d(x=(-0.1, 0.1), y=(0, 0), z=(0, 0), col=2, row=1) fig.show() ``` -**Pyvista** is not made for 2D plotting. Here we simply add a line to the 3D show output. +**Pyvista** is not made for 2D plotting. Here we simply add a line to the 3D +show output. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -234,9 +269,12 @@ pl.show() ``` (guide-graphics-return_fig)= + ## Return figure -Instead of forwarding a figure to an existing canvas, it is also possible to return the figure object for further manipulation using the `return_fig` command. In the following example this is demonstrated for the pyvista backend. +Instead of forwarding a figure to an existing canvas, it is also possible to +return the figure object for further manipulation using the `return_fig` +command. In the following example this is demonstrated for the pyvista backend. ```{code-cell} ipython3 import magpylib as magpy @@ -260,16 +298,26 @@ pl.show() ``` (guide-graphic-animations)= + ## Animation -The Magpylib [object paths](docs-position-paths) visualized with `show` can be animated by setting the kwarg `animation=True`. This synergize specifically well with the Plotly backend. +The Magpylib [object paths](docs-position-paths) visualized with `show` can be +animated by setting the kwarg `animation=True`. This synergize specifically well +with the Plotly backend. The animations can be fine-tuned with the following kwargs of `show`: -1. `animation_time` (default=3), must be a positive number that gives the animation time in seconds. -2. `animation_slider` (default=`True`), is boolean and sets if a slider should be displayed. + +1. `animation_time` (default=3), must be a positive number that gives the + animation time in seconds. +2. `animation_slider` (default=`True`), is boolean and sets if a slider should + be displayed. 3. `animation_fps` (default=30), sets the maximal frames per second. -Each path step will generate one frame of the animation, unless `animation_fps` would be exceeded. In this case specific equidistant frames will be selected automatically to adjust to the limited display possibilities. For practicality, the input `animation=x` will automatically set `animation=True` and `animation_time=x`. +Each path step will generate one frame of the animation, unless `animation_fps` +would be exceeded. In this case specific equidistant frames will be selected +automatically to adjust to the limited display possibilities. For practicality, +the input `animation=x` will automatically set `animation=True` and +`animation_time=x`. The following example demonstrates the animation feature, @@ -298,27 +346,38 @@ Even with some implemented fail safes, such as a maximum frame rate and frame co ``` (guide-graphics-subplots)= + ## Built-in Subplots -:::{versionadded} 4.4 -Coupled subplots -::: +:::{versionadded} 4.4 Coupled subplots ::: -It is often tedious to integrate the Magpylib `show` output into sub-plots as shown above, especially when dealing with animations and combinations of 2D and 3D plots. +It is often tedious to integrate the Magpylib `show` output into sub-plots as +shown above, especially when dealing with animations and combinations of 2D and +3D plots. -For this, Magpylib offers the possibility to show the sensor output along a path in addition to the 3D-output, and to place 2D and 3D outputs in subplots. +For this, Magpylib offers the possibility to show the sensor output along a path +in addition to the 3D-output, and to place 2D and 3D outputs in subplots. ### With show -All of this is achieved via the `show` function by passing input objects as dictionaries with the arguments. +All of this is achieved via the `show` function by passing input objects as +dictionaries with the arguments. 1. `objects`: list of Magpylib objects 2. `col`: int which selects the subplot column. Default is `col=1`. 3. `row`: int which selects the subplot row. Default is `row=1`. -4. `output`: string which selects the type of output that should be displayed in this subplot. Options are - - 1. `"model3d"` is the default value and selects the 3D output. - 2. `"Xa"` selects a 2D line-plot of a field component (combination) as seen by the sensor(s) along their path. The sensor(s) must be part of the `objects` input. Here "X" selects the field and must be one of "BHJM", and "a" selects the respective component combination and must be a subset of "xyz". For example, `output=Hx` displays the x-component of the H-field, or `output=Bxz` displays `sqrt(|Bx|² + |Bz|²)`. By default, source outputs are summed up (`sumup=True`) and sensor pixels, are aggregated by mean (`pixel_agg="mean"`). +4. `output`: string which selects the type of output that should be displayed in + this subplot. Options are + + 1. `"model3d"` is the default value and selects the 3D output. + 2. `"Xa"` selects a 2D line-plot of a field component (combination) as seen + by the sensor(s) along their path. The sensor(s) must be part of the + `objects` input. Here "X" selects the field and must be one of "BHJM", and + "a" selects the respective component combination and must be a subset of + "xyz". For example, `output=Hx` displays the x-component of the H-field, + or `output=Bxz` displays `sqrt(|Bx|² + |Bz|²)`. By default, source outputs + are summed up (`sumup=True`) and sensor pixels, are aggregated by mean + (`pixel_agg="mean"`). The following code demonstrates these features. @@ -342,7 +401,8 @@ magpy.show( ) ``` -Each input dictionary can contain kwargs, like `pixel_agg=None` or `sumup=False` for 2D plots. +Each input dictionary can contain kwargs, like `pixel_agg=None` or `sumup=False` +for 2D plots. ```{code-cell} ipython3 import magpylib as magpy @@ -375,9 +435,15 @@ magpy.show( ``` (guide-graphics-show_context)= + ### With show_context -To make the subplot syntax more convenient we introduced the `show_context` native Python context manager. It allows to defer calls to the `show` function while passing additional arguments. This is necessary for Magpylib to know how many rows and columns are requested by the user, which single `show` calls do not keep track of. All kwargs, e.g. `backend` are handed directly to the context manager. +To make the subplot syntax more convenient we introduced the `show_context` +native Python context manager. It allows to defer calls to the `show` function +while passing additional arguments. This is necessary for Magpylib to know how +many rows and columns are requested by the user, which single `show` calls do +not keep track of. All kwargs, e.g. `backend` are handed directly to the context +manager. The above example becomes: @@ -429,7 +495,11 @@ with magpy.show_context(): ### Coupled 2D/3D Animation -It is very helpful to combine 2D and 3D subplots in an animation that shows the motion of the 3D system, while displaying the field at the respective path instance at the same time. Unfortunately, it is quite tedious to create such animations. The most powerful feature and main reason behind built-in subplots is the ability to do just that with few lines of code. +It is very helpful to combine 2D and 3D subplots in an animation that shows the +motion of the 3D system, while displaying the field at the respective path +instance at the same time. Unfortunately, it is quite tedious to create such +animations. The most powerful feature and main reason behind built-in subplots +is the ability to do just that with few lines of code. ```{code-cell} ipython3 import magpylib as magpy @@ -451,7 +521,10 @@ with magpy.show_context(loop, sens, animation=True) as sc: ### Canvas length units -When displaying very small Magpylib objects, the axes scaling in meters might be inadequate and you may want to use other units that fit the system dimensions more nicely. The example below shows how to display an object (in this case the same) with different length units and zoom levels. +When displaying very small Magpylib objects, the axes scaling in meters might be +inadequate and you may want to use other units that fit the system dimensions +more nicely. The example below shows how to display an object (in this case the +same) with different length units and zoom levels. ```{tip} Setting `units_length="auto"` will infer the most suitable units based on the maximum range of the system. diff --git a/docs/_pages/user_guide/docs/docs_magpylib_force.md b/docs/_pages/user_guide/docs/docs_magpylib_force.md index 71536f4af..6a6e73c8d 100644 --- a/docs/_pages/user_guide/docs/docs_magpylib_force.md +++ b/docs/_pages/user_guide/docs/docs_magpylib_force.md @@ -13,9 +13,11 @@ kernelspec: --- (docs-magpylib-force)= + # Magpylib Force v0.3.1 -The package `magpylib-force` provides an addon for magnetic force and torque computation between magpylib source objects. +The package `magpylib-force` provides an addon for magnetic force and torque +computation between magpylib source objects. ## Installation @@ -27,36 +29,59 @@ pip install magpylib-force ## API -The package provides only a single top-level function **getFT()** for computing force and torque. +The package provides only a single top-level function +**getFT()** for computing force and torque. ```python import magpylib_force as mforce + mforce.getFT(sources, targets, anchor, eps=1e-5, squeeze=True) ``` -Here `sources` are Magpylib source objects that generate the magnetic field. The `targets` are the objects on which the magnetic field of the sources acts to generate force and torque. With current version 0.3.1 only `Cuboid`, `Cylinder`, `CylinderSegment`, `Polyline`, and `Circle` objects can be targets. The `anchor` denotes an anchor point which is the barycenter of the target. If no barycenter is given, homogeneous mass density is assumed and the geometric center of the target is chose as it's barycenter. `eps` refers to the finite difference length when computing the magnetic field gradient and should be adjusted to be much smaller than size of the system. `squeeze` can be used to squeeze the output array dimensions as in Magpylib's `getB`, `getH`, `getJ`, and `getM`. - -The computation is based on numerically integrating the magnetic field generated by the `sources` over the `targets`, see [here](docs-force-computation) for more details. This requires that each target has a **meshing** directive, which must be provided via an attribute to the object. How `meshing` is defined: - -For all objects as an integer, which defines the target number of mesh-points. In some cases an algorithm will attempt to come close to this number by splitting up magnets into quasi-cubical cells. Exceptions are: - -- `Cuboid`: takes also a 3-vector that defines the number of equidistant splits along each axis resulting in a rectangular regular grid. Keep in mind that the accuracy is increased by cubical aspect ratios. -- `PolyLine`: defines the number of equidistant splits of each PolyLine segment, not of the whole multi-segmented object. The total number of mesh-points will be number of segments times meshing. - -The function `getFT()` returns force and torque as `np.ndarray` of shape (2,3), or (t,2,3) when t targets are given. - -The following example code computes the force acting on a cuboid magnet, generated by a current loop. +Here `sources` are Magpylib source objects that generate the magnetic field. The +`targets` are the objects on which the magnetic field of the sources acts to +generate force and torque. With current version 0.3.1 only `Cuboid`, `Cylinder`, +`CylinderSegment`, `Polyline`, and `Circle` objects can be targets. The `anchor` +denotes an anchor point which is the barycenter of the target. If no barycenter +is given, homogeneous mass density is assumed and the geometric center of the +target is chose as it's barycenter. `eps` refers to the finite difference length +when computing the magnetic field gradient and should be adjusted to be much +smaller than size of the system. `squeeze` can be used to squeeze the output +array dimensions as in Magpylib's `getB`, `getH`, `getJ`, and `getM`. + +The computation is based on numerically integrating the magnetic field generated +by the `sources` over the `targets`, see [here](docs-force-computation) for more +details. This requires that each target has a +**meshing** directive, which must be provided +via an attribute to the object. How `meshing` is defined: + +For all objects as an integer, which defines the target number of mesh-points. +In some cases an algorithm will attempt to come close to this number by +splitting up magnets into quasi-cubical cells. Exceptions are: + +- `Cuboid`: takes also a 3-vector that defines the number of equidistant splits + along each axis resulting in a rectangular regular grid. Keep in mind that the + accuracy is increased by cubical aspect ratios. +- `PolyLine`: defines the number of equidistant splits of each PolyLine segment, + not of the whole multi-segmented object. The total number of mesh-points will + be number of segments times meshing. + +The function `getFT()` returns force and torque as `np.ndarray` of shape (2,3), +or (t,2,3) when t targets are given. + +The following example code computes the force acting on a cuboid magnet, +generated by a current loop. ```python import magpylib as magpy import magpylib_force as mforce # create source and target objects -loop = magpy.current.Circle(diameter=2e-3, current=10, position=(0,0,-1e-3)) -cube = magpy.magnet.Cuboid(dimension=(1e-3,1e-3,1e-3), polarization=(1,0,0)) +loop = magpy.current.Circle(diameter=2e-3, current=10, position=(0, 0, -1e-3)) +cube = magpy.magnet.Cuboid(dimension=(1e-3, 1e-3, 1e-3), polarization=(1, 0, 0)) # provide meshing for target object -cube.meshing = (5,5,5) +cube.meshing = (5, 5, 5) # compute force and torque FT = mforce.getFT(loop, cube) @@ -70,9 +95,11 @@ print(FT) ``` (docs-force-computation)= + ## Computation details -The force $\vec{F}_m$ acting on a magnetization distribution $\vec{M}$ in a magnetic field $\vec{B}$ is given by +The force $\vec{F}_m$ acting on a magnetization distribution $\vec{M}$ in a +magnetic field $\vec{B}$ is given by $$\vec{F}_m = \int \nabla (\vec{M}\cdot\vec{B}) \ dV.$$ @@ -80,14 +107,20 @@ The torque $\vec{T}_m$ which acts on the magnetization distribution is $$\vec{T}_m = \int \vec{M} \times \vec{B} \ dV.$$ -The force $\vec{F}_c$ which acts on a current distribution $\vec{j}$ in a magnetic field is +The force $\vec{F}_c$ which acts on a current distribution $\vec{j}$ in a +magnetic field is $$\vec{F}_c = \int \vec{j}\times \vec{B} \ dV.$$ -And there is no torque. However, one must not forget that a force, when applied off-center, adds to the torque as +And there is no torque. However, one must not forget that a force, when applied +off-center, adds to the torque as $$\vec{T}' = \int \vec{r} \times \vec{F} \ dV,$$ -where $\vec{r}$ points from the body barycenter to the position where the force is applied. +where $\vec{r}$ points from the body barycenter to the position where the force +is applied. -The idea behind `magplyib-force` is to compute the above integrals by discretization. For this purpose, the target body is split up into small cells using the object `meshing` attribute. The force and torque computation is performed for all cells in a vectorized form, and the sum is returned. +The idea behind `magplyib-force` is to compute the above integrals by +discretization. For this purpose, the target body is split up into small cells +using the object `meshing` attribute. The force and torque computation is +performed for all cells in a vectorized form, and the sum is returned. diff --git a/docs/_pages/user_guide/docs/docs_pos_ori.md b/docs/_pages/user_guide/docs/docs_pos_ori.md index 0025c8f89..591d3b97d 100644 --- a/docs/_pages/user_guide/docs/docs_pos_ori.md +++ b/docs/_pages/user_guide/docs/docs_pos_ori.md @@ -1,44 +1,53 @@ (docs-position)= + # Position, Orientation, and Paths -The following secions are detiled technical documentations of the Magpylib position and orientation interface. Practical examples and good practice usage is demonstrated in the tutorial {ref}`examples-tutorial-paths`. +The following secions are detiled technical documentations of the Magpylib +position and orientation interface. Practical examples and good practice usage +is demonstrated in the tutorial {ref}`examples-tutorial-paths`. -::::{grid} 2 -:gutter: 2 +::::{grid} 2 :gutter: 2 -:::{grid-item} -:columns: 12 7 7 7 -The analytical magnetic field expressions found in the literature, implemented in the [Magpylib core](docs-field-core), are given in native coordinates of the sources which is convenient for the mathematical formulation. It is a common problem to transform the field into an application relevant observer coordinate system. While not technically difficult, such transformations are prone to error. -::: -:::{grid-item} -:columns: 12 5 5 5 -![](../../../_static/images/docu_position_sketch.png) -::: -:::: +:::{grid-item} :columns: 12 7 7 7 The analytical magnetic field expressions +found in the literature, implemented in the [Magpylib core](docs-field-core), +are given in native coordinates of the sources which is convenient for the +mathematical formulation. It is a common problem to transform the field into an +application relevant observer coordinate system. While not technically +difficult, such transformations are prone to error. ::: :::{grid-item} :columns: +12 5 5 5 ![](../../../_static/images/docu_position_sketch.png) ::: :::: -Here Magpylib helps. All Magpylib sources and observers lie in a global Cartesian coordinate system. Object position and orientation are defined by the attributes `position` and `orientation`, 😏. Objects can easily be moved around using the `move()` and `rotate()` methods. Eventually, the field is computed in the reference frame of the observers (e.g. Sensor objects). Positions are given in units of meter, and the default unit for orientation is °. +Here Magpylib helps. All Magpylib sources and observers lie in a global +Cartesian coordinate system. Object position and orientation are defined by the +attributes `position` and `orientation`, 😏. Objects can easily be moved around +using the `move()` and `rotate()` methods. Eventually, the field is computed in +the reference frame of the observers (e.g. Sensor objects). Positions are given +in units of meter, and the default unit for orientation is °. (docs-position-paths)= + ## Position and orientation attributes -Position and orientation of all Magpylib objects are defined by the two attributes - -::::{grid} 2 -:gutter: 2 - -:::{grid-item-card} -:shadow: none -:columns: 12 5 5 5 -**position** - a point $(x,y,z)$ in the global coordinates, or a set of such points $(\vec{P}_1, \vec{P}_2, ...)$. By default objects are created with `position=(0,0,0)`. -::: -:::{grid-item-card} -:shadow: none -:columns: 12 7 7 7 -**orientation** - a [Scipy Rotation object](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html) which describes the object rotation relative to its default orientation (defined in {ref}`docs-classes`). By default, objects are created with unit rotation `orientation=None`. -::: -:::: +Position and orientation of all Magpylib objects are defined by the two +attributes -The position and orientation attributes can be either **scalar**, i.e. a single position or a single rotation, or **vector**, when they are arrays of such scalars. The two attributes together define the **path** of an object - Magpylib makes sure that they are always of the same length. When the field is computed, it is automatically computed for the whole path. +::::{grid} 2 :gutter: 2 + +:::{grid-item-card} :shadow: none :columns: 12 5 5 5 +**position** - a point $(x,y,z)$ in the +global coordinates, or a set of such points $(\vec{P}_1, \vec{P}_2, ...)$. By +default objects are created with `position=(0,0,0)`. ::: :::{grid-item-card} +:shadow: none :columns: 12 7 7 7 +**orientation** - a +[Scipy Rotation object](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html) +which describes the object rotation relative to its default orientation (defined +in {ref}`docs-classes`). By default, objects are created with unit rotation +`orientation=None`. ::: :::: + +The position and orientation attributes can be either **scalar**, i.e. a single +position or a single rotation, or **vector**, when they are arrays of such +scalars. The two attributes together define the **path** of an object - Magpylib +makes sure that they are always of the same length. When the field is computed, +it is automatically computed for the whole path. ```{tip} To enable vectorized field computation, paths should always be used when modeling multiple object positions. Avoid using Python loops at all costs for that purpose! If your path is difficult to realize, consider using the [functional interface](docs-field-functional) instead. @@ -48,120 +57,136 @@ To enable vectorized field computation, paths should always be used when modelin Magpylib offers two powerful methods for object manipulation: -::::{grid} 2 -:gutter: 2 - -:::{grid-item-card} -:columns: 12 5 5 5 -:shadow: none -**move(**`displacement`, `start="auto"`**)** - move object by `displacement` input. `displacement` is a position vector (scalar input) or a set of position vectors (vector input). -::: -:::{grid-item-card} -:columns: 12 7 7 7 -:shadow: none -**rotate(**`rotation`, `anchor=None`, `start="auto"`**)** - rotates the object by the `rotation` input about an anchor point defined by the `anchor` input. `rotation` is a [Scipy Rotation object](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html), and `anchor` is a position vector. Both can be scalar or vector inputs. With `anchor=None` the object is rotated about its `position`. -::: -:::: - -- **Scalar input** is applied to the whole object path, starting with path index `start`. With the default `start="auto"` the index is set to `start=0` and the functionality is **moving objects around** (incl. their whole paths). -- **Vector input** of length $n$ applies the $n$ individual operations to $n$ object path entries, starting with path index `start`. Padding applies when the input exceeds the existing path length. With the default `start="auto"` the index is set to `start=len(object path)` and the functionality is **appending the input**. - -The practical application of this formalism is best demonstrated by the following program +::::{grid} 2 :gutter: 2 + +:::{grid-item-card} :columns: 12 5 5 5 :shadow: none +**move(**`displacement`, +`start="auto"`**)** - move object by +`displacement` input. `displacement` is a position vector (scalar input) or a +set of position vectors (vector input). ::: :::{grid-item-card} :columns: 12 7 7 +7 :shadow: none **rotate(**`rotation`, +`anchor=None`, `start="auto"`**)** - rotates +the object by the `rotation` input about an anchor point defined by the `anchor` +input. `rotation` is a +[Scipy Rotation object](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html), +and `anchor` is a position vector. Both can be scalar or vector inputs. With +`anchor=None` the object is rotated about its `position`. ::: :::: + +- **Scalar input** is applied to the whole object path, starting with path index + `start`. With the default `start="auto"` the index is set to `start=0` and the + functionality is **moving objects around** (incl. their whole paths). +- **Vector input** of length $n$ applies the $n$ individual operations to $n$ + object path entries, starting with path index `start`. Padding applies when + the input exceeds the existing path length. With the default `start="auto"` + the index is set to `start=len(object path)` and the functionality is + **appending the input**. + +The practical application of this formalism is best demonstrated by the +following program ```python import magpylib as magpy + # Note that all units are in SI sensor = magpy.Sensor() -print(sensor.position) # Default value +print(sensor.position) # Default value # --> [0. 0. 0.] -sensor.move((1,1,1)) # Scalar input is by default applied -print(sensor.position) # to the whole path +sensor.move((1, 1, 1)) # Scalar input is by default applied +print(sensor.position) # to the whole path # --> [1. 1. 1.] -sensor.move([(1,1,1), (2,2,2)]) # Vector input is by default appended -print(sensor.position) # to the existing path +sensor.move([(1, 1, 1), (2, 2, 2)]) # Vector input is by default appended +print(sensor.position) # to the existing path # --> [[1. 1. 1.] [2. 2. 2.] [3. 3. 3.]] -sensor.move((1,1,1), start=1) # Scalar input and start=1 is applied -print(sensor.position) # to whole path starting at index 1 +sensor.move((1, 1, 1), start=1) # Scalar input and start=1 is applied +print(sensor.position) # to whole path starting at index 1 # --> [[1. 1. 1.] [3. 3. 3.] [4. 4. 4.]] -sensor.move([(0,0,10), (0,0,20)], start=1) # Vector input and start=1 merges -print(sensor.position) # the input with the existing path +sensor.move([(0, 0, 10), (0, 0, 20)], start=1) # Vector input and start=1 merges +print(sensor.position) # the input with the existing path # --> [[ 1. 1. 1.] [ 3. 3. 13.] [ 4. 4. 24.]] # starting at index 1. ``` -Several extensions of the `rotate` method give a lot of flexibility with object rotation. They all feature the arguments `anchor` and `start` which work as described above. - -::::{grid} 1 -:gutter: 2 - -:::{grid-item-card} -:columns: 12 -:shadow: none -**rotate_from_angax(**`angle`, `axis`, `anchor=None`, `start="auto"`, `degrees=True` **)** -* `angle`: scalar or array with shape (n). Angle(s) of rotation. -* `axis`: array of shape (3,) or string. The direction of the rotation axis. String input can be 'x', 'y' or 'z' to denote respective directions. -* `degrees`: bool, default=True. Interpret angle input in units of deg (True) or rad (False). -::: - -:::{grid-item-card} -:columns: 12 -:shadow: none -**rotate_from_rotvec(**`rotvec`, `anchor=None`, `start="auto"`, `degrees=True` **)** -* `rotvec` : array with shape (n,3) or (3,). The rotation vector direction is the rotation axis and the vector length is the rotation angle in units of deg. -* `degrees`: bool, default=True. Interpret angle input in units of deg (True) or rad (False). -::: - -:::{grid-item-card} -:columns: 12 -:shadow: none -**rotate_from_euler(** `angle`, `seq`, `anchor=None`, `start="auto"`, `degrees=True` **)** -* `angle`: scalar or array with shape (n). Angle(s) of rotation in units of deg (by default). -* `seq` : string. Specifies sequence of axes for rotations. Up to 3 characters belonging to the set {'X', 'Y', 'Z'} for intrinsic rotations, or {'x', 'y', 'z'} for extrinsic rotations. Extrinsic and intrinsic rotations cannot be mixed in one function call. -* `degrees`: bool, default=True. Interpret angle input in units of deg (True) or rad (False). -::: - -:::{grid-item-card} -:columns: 12 -:shadow: none -**rotate_from_quat(**`quat`, `anchor=None`, `start="auto"` **)** -* `quat` : array with shape (n,4) or (4,). Rotation input in quaternion form. -::: - -:::{grid-item-card} -:columns: 12 -:shadow: none -**rotate_from_mrp(**`matrix`, `anchor=None`, `start="auto"` **)** -* `matrix` : array with shape (n,3,3) or (3,3). Rotation matrix. See scipy.spatial.transform.Rotation for details. -::: - -:::{grid-item-card} -:columns: 12 -:shadow: none -**rotate_from_mrp(**`mrp`, `anchor=None`, `start="auto"` **)** -* `mrp` : array with shape (n,3) or (3,). Modified Rodrigues parameter input. See scipy Rotation package for details. -::: +Several extensions of the `rotate` method give a lot of flexibility with object +rotation. They all feature the arguments `anchor` and `start` which work as +described above. -:::: +::::{grid} 1 :gutter: 2 + +:::{grid-item-card} :columns: 12 :shadow: none +**rotate_from_angax(**`angle`, `axis`, +`anchor=None`, `start="auto"`, `degrees=True` +**)** + +- `angle`: scalar or array with shape (n). Angle(s) of rotation. +- `axis`: array of shape (3,) or string. The direction of the rotation axis. + String input can be 'x', 'y' or 'z' to denote respective directions. +- `degrees`: bool, default=True. Interpret angle input in units of deg (True) or + rad (False). ::: + +:::{grid-item-card} :columns: 12 :shadow: none +**rotate_from_rotvec(**`rotvec`, +`anchor=None`, `start="auto"`, `degrees=True` +**)** + +- `rotvec` : array with shape (n,3) or (3,). The rotation vector direction is + the rotation axis and the vector length is the rotation angle in units of deg. +- `degrees`: bool, default=True. Interpret angle input in units of deg (True) or + rad (False). ::: + +:::{grid-item-card} :columns: 12 :shadow: none +**rotate_from_euler(** `angle`, `seq`, +`anchor=None`, `start="auto"`, `degrees=True` +**)** + +- `angle`: scalar or array with shape (n). Angle(s) of rotation in units of deg + (by default). +- `seq` : string. Specifies sequence of axes for rotations. Up to 3 characters + belonging to the set {'X', 'Y', 'Z'} for intrinsic rotations, or {'x', 'y', + 'z'} for extrinsic rotations. Extrinsic and intrinsic rotations cannot be + mixed in one function call. +- `degrees`: bool, default=True. Interpret angle input in units of deg (True) or + rad (False). ::: + +:::{grid-item-card} :columns: 12 :shadow: none +**rotate_from_quat(**`quat`, `anchor=None`, +`start="auto"` **)** + +- `quat` : array with shape (n,4) or (4,). Rotation input in quaternion form. + ::: + +:::{grid-item-card} :columns: 12 :shadow: none +**rotate_from_mrp(**`matrix`, `anchor=None`, +`start="auto"` **)** + +- `matrix` : array with shape (n,3,3) or (3,3). Rotation matrix. See + scipy.spatial.transform.Rotation for details. ::: + +:::{grid-item-card} :columns: 12 :shadow: none +**rotate_from_mrp(**`mrp`, `anchor=None`, +`start="auto"` **)** + +- `mrp` : array with shape (n,3) or (3,). Modified Rodrigues parameter input. + See scipy Rotation package for details. ::: -When objects with different path lengths are combined, e.g. when computing the field, the shorter paths are treated as static beyond their end to make the computation sensible. Internally, Magpylib follows a philosophy of edge-padding and end-slicing when adjusting paths. - -::::{grid} 2 -:gutter: 2 - -:::{grid-item-card} -:columns: 12 7 7 7 -:shadow: none -**Edge-padding:** whenever path entries beyond the existing path length are needed the edge-entries of the existing path are returned. This means that the object is “static” beyond its existing path. -::: -:::{grid-item-card} -:columns: 12 5 5 5 -:shadow: none -**End-slicing:** whenever a path is automatically reduced in length, Magpylib will slice such that the ending of the path is kept. -::: :::: -The tutorial {ref}`examples-tutorial-paths` shows intuitive good practice examples of the important functionality described in this section. \ No newline at end of file +When objects with different path lengths are combined, e.g. when computing the +field, the shorter paths are treated as static beyond their end to make the +computation sensible. Internally, Magpylib follows a philosophy of edge-padding +and end-slicing when adjusting paths. + +::::{grid} 2 :gutter: 2 + +:::{grid-item-card} :columns: 12 7 7 7 :shadow: none **Edge-padding:** whenever +path entries beyond the existing path length are needed the edge-entries of the +existing path are returned. This means that the object is “static” beyond its +existing path. ::: :::{grid-item-card} :columns: 12 5 5 5 :shadow: none +**End-slicing:** whenever a path is automatically reduced in length, Magpylib +will slice such that the ending of the path is kept. ::: :::: + +The tutorial {ref}`examples-tutorial-paths` shows intuitive good practice +examples of the important functionality described in this section. diff --git a/docs/_pages/user_guide/docs/docs_styles.md b/docs/_pages/user_guide/docs/docs_styles.md index 39075b285..73b3c023d 100644 --- a/docs/_pages/user_guide/docs/docs_styles.md +++ b/docs/_pages/user_guide/docs/docs_styles.md @@ -13,22 +13,36 @@ orphan: true --- (guide-graphic-styles)= + # Graphic styles -The graphic styles define how Magpylib objects are displayed visually when calling `show`. They can be fine-tuned and individualized to suit requirements and taste. +The graphic styles define how Magpylib objects are displayed visually when +calling `show`. They can be fine-tuned and individualized to suit requirements +and taste. Graphic styles can be defined in various ways: -1. There is a **default style** setting which is applied when no other inputs are made. -2. An **individual style** can be defined at object level. If the object is a [Collection](guide-docs-classes-collections) it will apply its color to all children. -3. Finally, styles that are defined in the `show` function call will override all other settings. This is referred to as **local style override**. +1. There is a **default style** setting which is applied when no other inputs + are made. +2. An **individual style** can be defined at object level. If the object is a + [Collection](guide-docs-classes-collections) it will apply its color to all + children. +3. Finally, styles that are defined in the `show` function call will override + all other settings. This is referred to as **local style override**. The following sections describe these styling options and how to customize them. (guide-graphic-styles-default)= + ## Default style -The default style is stored in `magpylib.defaults.display.style`. Note that the installation default styles differ slightly between different [graphic backends](guide-graphic-backends) depending on their respective capabilities. Specifically, the magnet magnetization in Matplotlib is displayed with arrows by default, while it is displayed using a color scheme in Plotly and Pyvista. The color scheme is also implemented in Matplotlib, but it is visually unsatisfactory. +The default style is stored in `magpylib.defaults.display.style`. Note that the +installation default styles differ slightly between different +[graphic backends](guide-graphic-backends) depending on their respective +capabilities. Specifically, the magnet magnetization in Matplotlib is displayed +with arrows by default, while it is displayed using a color scheme in Plotly and +Pyvista. The color scheme is also implemented in Matplotlib, but it is visually +unsatisfactory. The default styles can be modified in three ways: @@ -57,7 +71,11 @@ magpy.defaults.display.style.magnet.magnetization.update( ) ``` -All three examples result in the same default style. Once modified, the library default can always be restored with the `magpylib.style.reset()` method. The following practical example demonstrates how to create and set a user defined magnet magnetization style as default. The chosen custom style combines a 3-color scheme with an arrow which points in the magnetization direction. +All three examples result in the same default style. Once modified, the library +default can always be restored with the `magpylib.style.reset()` method. The +following practical example demonstrates how to create and set a user defined +magnet magnetization style as default. The chosen custom style combines a +3-color scheme with an arrow which points in the magnetization direction. ```{code-cell} ipython3 import magpylib as magpy @@ -110,10 +128,14 @@ The default Magpylib style abides by the tri-color scheme for ideal-typical magn A list of all style options can be found [here](examples-list-of-styles). - ## Magic underscore notation -To facilitate working with deeply nested properties, all style constructors and object style methods support the "magic underscore notation". It enables referencing nested properties by joining together multiple property names with underscores. This feature mainly helps reduce the code verbosity and is heavily inspired by the [Plotly underscore notation](https://plotly.com/python/creating-and-updating-figures/#magic-underscore-notation)). +To facilitate working with deeply nested properties, all style constructors and +object style methods support the "magic underscore notation". It enables +referencing nested properties by joining together multiple property names with +underscores. This feature mainly helps reduce the code verbosity and is heavily +inspired by the +[Plotly underscore notation](https://plotly.com/python/creating-and-updating-figures/#magic-underscore-notation)). With magic underscore notation, the previous examples can be written as: @@ -139,13 +161,23 @@ magpy.defaults.display.style.magnet.update( ## Individual style -Any Magpylib object can have its own individual style that will take precedence over the default values when `show` is called. When setting individual styles, the object family specifier such as `magnet` or `current` can be omitted. +Any Magpylib object can have its own individual style that will take precedence +over the default values when `show` is called. When setting individual styles, +the object family specifier such as `magnet` or `current` can be omitted. ```{note} Users should be aware that the individual object style is organized in classes that take much longer to initialize than bare Magpylib objects, i.e. objects without individual style. This can lead to a computational bottleneck when setting individual styles of many Magpylib objects. For this reason Magpylib automatically defers style initialization until it is needed the first time, e.g. when calling the `show` function, so that object creatin time is not affected. However, this works only if style properties are set at initialization (e.g.: `magpy.magnet.Cuboid(..., style_label="MyCuboid")`). While this effect may not be noticeable for a small number of objects, it is best to avoid setting styles until it is plotting time. ``` -In the following example `cube` has no individual style, so the default style is used. `cylinder` has an individual style set for `magnetization` which is a tricolor scheme that will display the object color in the middle. The individual style is set at object initialization (good practice), and it will be applied only when `show` is called at the end of the example. Finally, `sphere` is also given an individual style for `magnetization` that displays the latter using a 2-color scheme. In this case, however, the individual style is applied after object initialization (bad practice), which results in style initialization before it is needed. +In the following example `cube` has no individual style, so the default style is +used. `cylinder` has an individual style set for `magnetization` which is a +tricolor scheme that will display the object color in the middle. The individual +style is set at object initialization (good practice), and it will be applied +only when `show` is called at the end of the example. Finally, `sphere` is also +given an individual style for `magnetization` that displays the latter using a +2-color scheme. In this case, however, the individual style is applied after +object initialization (bad practice), which results in style initialization +before it is needed. ```{code-cell} ipython3 import magpylib as magpy @@ -181,7 +213,11 @@ magpy.show(cube, cylinder, sphere, backend="plotly") ## Collection style -When displaying [Collection objects](guide-docs-classes-collections) their `color` property will be assigned to all its children override the default color cycle. In the following example this is demonstrated. Therefore, we make use of the [Matplotlib backend](guide-graphic-backends) which displays magnet color by default and shows the magnetization as an arrow rather than a color sequence. +When displaying [Collection objects](guide-docs-classes-collections) their +`color` property will be assigned to all its children override the default color +cycle. In the following example this is demonstrated. Therefore, we make use of +the [Matplotlib backend](guide-graphic-backends) which displays magnet color by +default and shows the magnetization as an arrow rather than a color sequence. ```{code-cell} ipython3 import magpylib as magpy @@ -204,20 +240,32 @@ coll = cube + cylinder magpy.show(coll, sphere, backend="matplotlib") ``` -In addition, it is possible to modify individual style properties of all children, that cannot be set at Collection level, with the `set_children_styles` method. Non-matching properties, e.g. magnetization color for children that are currents, are simply ignored. +In addition, it is possible to modify individual style properties of all +children, that cannot be set at Collection level, with the `set_children_styles` +method. Non-matching properties, e.g. magnetization color for children that are +currents, are simply ignored. ```{code-cell} ipython3 coll.set_children_styles(magnetization_color_south="blue") magpy.show(coll, sphere, backend="plotly") ``` -The child-styles are individual style properties of the collection object and are not set as individual styles on each child-object. This means that when displayed individually with `show`, the above child-objects will have Magpylib default style. +The child-styles are individual style properties of the collection object and +are not set as individual styles on each child-object. This means that when +displayed individually with `show`, the above child-objects will have Magpylib +default style. ## Local style override -Finally, it is possible to hand style input to the `show` function directly and locally override all style properties for this specific `show` output. Default or individual style attributes will not be modified. Such inputs must start with the `style` prefix and the object family specifier must be omitted. Naturally underscore magic is supported. +Finally, it is possible to hand style input to the `show` function directly and +locally override all style properties for this specific `show` output. Default +or individual style attributes will not be modified. Such inputs must start with +the `style` prefix and the object family specifier must be omitted. Naturally +underscore magic is supported. -In the following example the default `style.magnetization.show=True` is overridden locally, so that object colors become visible instead of magnetization colors in the Plotly backend. +In the following example the default `style.magnetization.show=True` is +overridden locally, so that object colors become visible instead of +magnetization colors in the Plotly backend. ```{code-cell} ipython3 import magpylib as magpy @@ -245,30 +293,64 @@ magpy.defaults.display.style.as_dict(flatten=True, separator=".") ``` (examples-own-3d-models)= -## Custom 3D models - -Each Magpylib object has a default 3D representation that is displayed with `show`. It is possible to disable the default model and to provide Magpylib with a custom model. -There are several reasons why this can be of interest. For example, the integration of a [custom source](guide-docs-classes-custom-source) object that has its own geometry, to display a sensor in the form of a realistic package provided in CAD form, representation of a [Collection](guide-docs-classes-collections) as a parts holder, integration of environmental parts to the Magpylib 3D plotting scene, or simply highlighting an object when colors do not suffice. - -The default trace of a Magpylib object `obj` can simply be turned off using the individual style command `obj.style.model3d.showdefault = False`. A custom 3D model can be added using the function `obj.style.model3d.add_trace()`. The new trace is then stored in the `obj.style.model3d.data` property. This property is a list and it is possible to store multiple custom traces there. The default style is not included in this property. It is instead inherently stored in the Magpylib classes to enable visualization of the magnetization with a color scheme. - -The input of `add_trace()` must be a `magpylib.graphics.Trace3d` object, or a dictionary that contains all necessary information for generating a 3D model. Because different plotting libraries require different directives, traces might be bound to specific [backends](guide-graphic-backends). For example, a trace dictionary might contain all information for Matplotlib to generate a 3D model using the [plot_surface](https://matplotlib.org/stable/plot_types/3D/surface3d_simple.html) function. +## Custom 3D models -To enable visualization of custom objects with different graphic backends Magpylib implements a **generic backend**. Traces defined in the generic backend are translated to all other backends automatically. If a specific backend is used, the model will only appear when called with the corresponding backend. +Each Magpylib object has a default 3D representation that is displayed with +`show`. It is possible to disable the default model and to provide Magpylib with +a custom model. + +There are several reasons why this can be of interest. For example, the +integration of a [custom source](guide-docs-classes-custom-source) object that +has its own geometry, to display a sensor in the form of a realistic package +provided in CAD form, representation of a +[Collection](guide-docs-classes-collections) as a parts holder, integration of +environmental parts to the Magpylib 3D plotting scene, or simply highlighting an +object when colors do not suffice. + +The default trace of a Magpylib object `obj` can simply be turned off using the +individual style command `obj.style.model3d.showdefault = False`. A custom 3D +model can be added using the function `obj.style.model3d.add_trace()`. The new +trace is then stored in the `obj.style.model3d.data` property. This property is +a list and it is possible to store multiple custom traces there. The default +style is not included in this property. It is instead inherently stored in the +Magpylib classes to enable visualization of the magnetization with a color +scheme. + +The input of `add_trace()` must be a `magpylib.graphics.Trace3d` object, or a +dictionary that contains all necessary information for generating a 3D model. +Because different plotting libraries require different directives, traces might +be bound to specific [backends](guide-graphic-backends). For example, a trace +dictionary might contain all information for Matplotlib to generate a 3D model +using the +[plot_surface](https://matplotlib.org/stable/plot_types/3D/surface3d_simple.html) +function. + +To enable visualization of custom objects with different graphic backends +Magpylib implements a **generic backend**. Traces defined in the generic backend +are translated to all other backends automatically. If a specific backend is +used, the model will only appear when called with the corresponding backend. A trace-dictionary has the following keys: 1. `'backend'`: `'generic'`, `'matplotlib'` or `'plotly'` -2. `'constructor'`: name of the plotting constructor from the respective backend, e.g. plotly `'Mesh3d'` or matplotlib `'plot_surface'` +2. `'constructor'`: name of the plotting constructor from the respective + backend, e.g. plotly `'Mesh3d'` or matplotlib `'plot_surface'` 3. `'args'`: default `None`, positional arguments handed to constructor 4. `'kwargs'`: default `None`, keyword arguments handed to constructor -5. `'coordsargs'`: tells Magpylib which input corresponds to which coordinate direction, so that geometric representation becomes possible. By default `{'x': 'x', 'y': 'y', 'z': 'z'}` for the `'generic'` backend and Plotly backend, and `{'x': 'args[0]', 'y': 'args[1]', 'z': 'args[2]'}` for the Matplotlib backend. +5. `'coordsargs'`: tells Magpylib which input corresponds to which coordinate + direction, so that geometric representation becomes possible. By default + `{'x': 'x', 'y': 'y', 'z': 'z'}` for the `'generic'` backend and Plotly + backend, and `{'x': 'args[0]', 'y': 'args[1]', 'z': 'args[2]'}` for the + Matplotlib backend. 6. `'show'`: default `True`, toggle if this trace should be displayed 7. `'scale'`: default 1, object geometric scaling factor -8. `'updatefunc'`: default `None`, updates the trace parameters when `show` is called. Used to generate dynamic traces. +8. `'updatefunc'`: default `None`, updates the trace parameters when `show` is + called. Used to generate dynamic traces. -The following example shows how a trace is constructed using the generic backend with the `Mesh3d` constructor. We create a `Sensor` object and replace its default 3d model by a tetrahedron. +The following example shows how a trace is constructed using the generic backend +with the `Mesh3d` constructor. We create a `Sensor` object and replace its +default 3d model by a tetrahedron. ```{code-cell} ipython3 import magpylib as magpy @@ -303,7 +385,10 @@ for backend in magpy.SUPPORTED_PLOTTING_BACKENDS: magpy.show(sensor, backend=backend) ``` -As noted above, it is possible to have multiple user-defined traces that will be displayed at the same time. The following example continuation demonstrates this by adding two more traces using the `Scatter3d` constructor in the generic backend. In addition, it showns how to copy and manipulate `Trace3d` objects. +As noted above, it is possible to have multiple user-defined traces that will be +displayed at the same time. The following example continuation demonstrates this +by adding two more traces using the `Scatter3d` constructor in the generic +backend. In addition, it showns how to copy and manipulate `Trace3d` objects. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -338,7 +423,8 @@ magpy.show(sensor) ### Matplotlib constructors -The following examples show how to construct traces with `plot`, `plot_surface` and `plot_trisurf`: +The following examples show how to construct traces with `plot`, `plot_surface` +and `plot_trisurf`: ```{code-cell} ipython3 import matplotlib.pyplot as plt @@ -406,7 +492,8 @@ magpy.show(magnet, ball, mobius, backend="matplotlib") ## Pre-defined 3D models -Automatic trace generators are provided for several basic 3D models in `magpylib.graphics.model3d`. They can be used as follows, +Automatic trace generators are provided for several basic 3D models in +`magpylib.graphics.model3d`. They can be used as follows, ```{code-cell} ipython3 from magpylib import Collection @@ -470,9 +557,11 @@ obj0.show(obj1, obj2, obj3, obj4, obj5, backend="plotly") ``` ((guide-docs-style-cad))= + ## Adding a CAD model -The following code sample shows how a standard CAD model (*.stl file) can be transformed into a Magpylib `Trace3d` object. +The following code sample shows how a standard CAD model (\*.stl file) can be +transformed into a Magpylib `Trace3d` object. ```{note} The code below requires installation of the `numpy-stl` package. @@ -559,4 +648,4 @@ magpy.show(args, **kwargs, backend="plotly") ```{code-cell} ipython3 -``` \ No newline at end of file +``` diff --git a/docs/_pages/user_guide/docs/docs_units_types.md b/docs/_pages/user_guide/docs/docs_units_types.md index 9d12b32e1..bba1f66a2 100644 --- a/docs/_pages/user_guide/docs/docs_units_types.md +++ b/docs/_pages/user_guide/docs/docs_units_types.md @@ -1,30 +1,28 @@ # Units and Types (guide-docs-units)= + ## Units -The important vacuum permeability $\mu_0$ is provided at the package top-level **mu_0**. It's value is not $4 \pi 10^{-7}$ since [the redefinition of the SI base units](https://en.wikipedia.org/wiki/2019_redefinition_of_the_SI_base_units), but a value close to it. - -For historical reasons Magpylib used non-SI units until Version 4. Starting with version 5 all inputs and outputs are SI-based. - -::::{grid} 3 -:::{grid-item} -:columns: 1 -::: - -:::{grid-item} -:columns: 10 -| PHYSICAL QUANTITY | MAGPYLIB PARAMETER | UNITS from v5| UNITS until v4| -|:---:|:---:|:---:|:---:| -| Magnetic Polarization $\vec{J}$ | `polarization`, `getJ()` | **T** | - | -| Magnetization $\vec{M}$ | `magnetization`, `getM()` | **A/m** | mT | -| Electric Current $i_0$ | `current` | **A** | A | -| Magnetic Dipole Moment $\vec{m}$ | `moment` | **A·m²** | mT·mm³ | -| B-field $\vec{B}$ | `getB()` | **T** | mT | -| H-field $\vec{H}$ | `getH()` | **A/m** | kA/m | -| Length-inputs | `position`, `dimension`, `vertices`, ... | **m** | mm | -| Angle-inputs | `angle`, `dimension`, ... | **°** | ° | -::: +The important vacuum permeability $\mu_0$ is provided at the package top-level +**mu_0**. It's value is not $4 \pi 10^{-7}$ +since +[the redefinition of the SI base units](https://en.wikipedia.org/wiki/2019_redefinition_of_the_SI_base_units), +but a value close to it. + +For historical reasons Magpylib used non-SI units until Version 4. Starting with +version 5 all inputs and outputs are SI-based. + +::::{grid} 3 :::{grid-item} :columns: 1 ::: + +:::{grid-item} :columns: 10 | PHYSICAL QUANTITY | MAGPYLIB PARAMETER | UNITS +from v5| UNITS until v4| |:---:|:---:|:---:|:---:| | Magnetic Polarization +$\vec{J}$ | `polarization`, `getJ()` | **T** | - | | Magnetization $\vec{M}$ | +`magnetization`, `getM()` | **A/m** | mT | | Electric Current $i_0$ | `current` +| **A** | A | | Magnetic Dipole Moment $\vec{m}$ | `moment` | **A·m²** | mT·mm³ +| | B-field $\vec{B}$ | `getB()` | **T** | mT | | H-field $\vec{H}$ | `getH()` | +**A/m** | kA/m | | Length-inputs | `position`, `dimension`, `vertices`, ... | +**m** | mm | | Angle-inputs | `angle`, `dimension`, ... | **°** | ° | ::: :::: @@ -37,6 +35,7 @@ The connection between the magnetic polarization J, the magnetization M and the ``` (guide-docs-io-scale-invariance)= + ## Arbitrary unit Convention ```{hint} @@ -47,4 +46,6 @@ In addition, `getB` returns the same unit as given by the `polarization` input. ## Types -Magpylib requires no special input format. All scalar types (`int`, `float`, ...) and vector types (`list`, `tuple`, `np.ndarray`, ... ) are accepted. Magpylib returns everything as `np.ndarray`. \ No newline at end of file +Magpylib requires no special input format. All scalar types (`int`, `float`, +...) and vector types (`list`, `tuple`, `np.ndarray`, ... ) are accepted. +Magpylib returns everything as `np.ndarray`. diff --git a/docs/_pages/user_guide/examples/examples_app_coils.md b/docs/_pages/user_guide/examples/examples_app_coils.md index aebd64078..b72cf7c5b 100644 --- a/docs/_pages/user_guide/examples/examples_app_coils.md +++ b/docs/_pages/user_guide/examples/examples_app_coils.md @@ -16,11 +16,19 @@ kernelspec: # Coils -In this example we show how to model air-coils, then combine two coils into a Helmholtz-pair and visualize the homogeneity of the resulting magnetic field. A nice explanation of coils and the magnetic field is given [here](https://www.nagwa.com/en/explainers/186157825721/#:~:text=The%20magnetic%20field%20strength%2C%20%F0%9D%90%B5,%EF%8A%AD%20T%E2%8B%85m%2FA.). With the code examples below you can easily compare Magpylib results to results presented in this tutorial. +In this example we show how to model air-coils, then combine two coils into a +Helmholtz-pair and visualize the homogeneity of the resulting magnetic field. A +nice explanation of coils and the magnetic field is given +[here](https://www.nagwa.com/en/explainers/186157825721/#:~:text=The%20magnetic%20field%20strength%2C%20%F0%9D%90%B5,%EF%8A%AD%20T%E2%8B%85m%2FA.). +With the code examples below you can easily compare Magpylib results to results +presented in this tutorial. ## Coil models -**Model 1:** The coil consists of multiple windings, each of which can be modeled with a circular current loop which is realized by the `Circle` class. The individual windings are combined into a `Collection` which itself behaves like a single magnetic field source. +**Model 1:** The coil consists of multiple windings, each of which can be +modeled with a circular current loop which is realized by the `Circle` class. +The individual windings are combined into a `Collection` which itself behaves +like a single magnetic field source. ```{code-cell} ipython3 import numpy as np @@ -38,7 +46,9 @@ for z in np.linspace(-8, 8, 16): coil1.show() ``` -**Model 2:** The coil is in reality more like a spiral, which can be modeled using the `Polyline` class. However, a good spiral approximation requires many small line segments, which makes the computation slower. +**Model 2:** The coil is in reality more like a spiral, which can be modeled +using the `Polyline` class. However, a good spiral approximation requires many +small line segments, which makes the computation slower. ```{code-cell} ipython3 import numpy as np @@ -54,7 +64,11 @@ coil2 = magpy.current.Polyline( coil2.show() ``` -**Model 3:** A [Helmholtz coil](https://en.wikipedia.org/wiki/Helmholtz_coil) is a device for producing a region of nearly uniform magnetic field. It consists of two coils on the same axis, carrying an equal electric current in the same direction. In classical layouts, the distance between the coils is similar to the coil radius. +**Model 3:** A [Helmholtz coil](https://en.wikipedia.org/wiki/Helmholtz_coil) is +a device for producing a region of nearly uniform magnetic field. It consists of +two coils on the same axis, carrying an equal electric current in the same +direction. In classical layouts, the distance between the coils is similar to +the coil radius. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -80,7 +94,11 @@ helmholtz.show() ## Plotting the field -Streamplot from Matplotlib is a powerful tool to outline the field lines. However, it must be understood that streamplot shows only a projection of the field onto the observation plane. All field components that point out of the plane become invisible. In out example we choose symmetry planes, where the perpendicular component is negligible. +Streamplot from Matplotlib is a powerful tool to outline the field lines. +However, it must be understood that streamplot shows only a projection of the +field onto the observation plane. All field components that point out of the +plane become invisible. In out example we choose symmetry planes, where the +perpendicular component is negligible. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -122,7 +140,9 @@ plt.show() ## Helmholtz field homogeneity -While the optimal solution is given by two current loops, real world applications must deal with finite sizes and limited construction space. Here Magpylib enables fast analysis of different possible geometries. +While the optimal solution is given by two current loops, real world +applications must deal with finite sizes and limited construction space. Here +Magpylib enables fast analysis of different possible geometries. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -159,4 +179,4 @@ plt.tight_layout() plt.show() ``` -Notice that in such finite sized arrangements the field is not very homogeneous. \ No newline at end of file +Notice that in such finite sized arrangements the field is not very homogeneous. diff --git a/docs/_pages/user_guide/examples/examples_app_end_of_shaft.md b/docs/_pages/user_guide/examples/examples_app_end_of_shaft.md index f0fa70179..916a465f3 100644 --- a/docs/_pages/user_guide/examples/examples_app_end_of_shaft.md +++ b/docs/_pages/user_guide/examples/examples_app_end_of_shaft.md @@ -16,9 +16,19 @@ orphan: true # Magnetic Angle Sensor -End of shaft angle sensing is a classic example for a magnetic position system. The goal is to determine the angular position of a rotating shaft. A magnet, typically a diametrically magnetized cylinder, is mounted at the end of the shaft. A 2D sensor is mounted below. When the shaft rotates the two sensor outputs will be $s_1=B_0 sin(\varphi)$ and $s_2=B_0 cos(\varphi)$, so that the angle is uniquely given by $\varphi = arctan_2(s_1,s_2)$. +End of shaft angle sensing is a classic example for a magnetic position system. +The goal is to determine the angular position of a rotating shaft. A magnet, +typically a diametrically magnetized cylinder, is mounted at the end of the +shaft. A 2D sensor is mounted below. When the shaft rotates the two sensor +outputs will be $s_1=B_0 sin(\varphi)$ and $s_2=B_0 cos(\varphi)$, so that the +angle is uniquely given by $\varphi = arctan_2(s_1,s_2)$. -In the example below we show such a typical end-of-shaft system with a 2-pixel sensor, that is commonly used to eliminate external stray fields. In addition, we assume that the magnet is not perfectly mounted at the end of the shaft, but slightly displaced to the side, which results in a wobble motion. Such tolerances are easily implemented with Magpylib, they can be visualized and their influence on the sensor output signal can be tested quickly. +In the example below we show such a typical end-of-shaft system with a 2-pixel +sensor, that is commonly used to eliminate external stray fields. In addition, +we assume that the magnet is not perfectly mounted at the end of the shaft, but +slightly displaced to the side, which results in a wobble motion. Such +tolerances are easily implemented with Magpylib, they can be visualized and +their influence on the sensor output signal can be tested quickly. ```{code-cell} ipython3 import numpy as np diff --git a/docs/_pages/user_guide/examples/examples_app_halbach.md b/docs/_pages/user_guide/examples/examples_app_halbach.md index 90e4f1096..d7395c15e 100644 --- a/docs/_pages/user_guide/examples/examples_app_halbach.md +++ b/docs/_pages/user_guide/examples/examples_app_halbach.md @@ -16,13 +16,18 @@ kernelspec: # Halbach Magnets -Magpylib is an excellent tool to create magnet assemblies. In this example we will show how to model Halbach magnets. +Magpylib is an excellent tool to create magnet assemblies. In this example we +will show how to model Halbach magnets. ```{note} In the following examples we make use of the [arbitrary unit convention](guide-docs-io-scale-invariance). ``` -The original Halbach-magnetization describes a hollow cylinder with a polarization direction that rotates twice while going around the cylinder once. In reality such polarizations are difficult to fabricate. What is commonly done instead are "Discreete Halbach Arrays", which are magnet assemblies that approximate a Halbach magnetization. +The original Halbach-magnetization describes a hollow cylinder with a +polarization direction that rotates twice while going around the cylinder once. +In reality such polarizations are difficult to fabricate. What is commonly done +instead are "Discreete Halbach Arrays", which are magnet assemblies that +approximate a Halbach magnetization. The following code creates a Discreete Halbach Cylinder generated from Cuboids: @@ -48,7 +53,8 @@ for a in angles: halbach.show(backend='plotly') ``` -Next we compute and display the field on an xy-grid in the symmetry plane using the [matplotlib streamplot](examples-vis-mpl-streamplot) example. +Next we compute and display the field on an xy-grid in the symmetry plane using +the [matplotlib streamplot](examples-vis-mpl-streamplot) example. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed diff --git a/docs/_pages/user_guide/examples/examples_app_scales.md b/docs/_pages/user_guide/examples/examples_app_scales.md index d07cd28cf..d5d723190 100644 --- a/docs/_pages/user_guide/examples/examples_app_scales.md +++ b/docs/_pages/user_guide/examples/examples_app_scales.md @@ -16,7 +16,8 @@ kernelspec: # Magnetic Scales -In this example we will show how magnetic scales can be constructed with Magpylib for fast field computation. +In this example we will show how magnetic scales can be constructed with +Magpylib for fast field computation. - reference to DS 91411 and 91479 - ideal-typical scales diff --git a/docs/_pages/user_guide/examples/examples_force_floating.md b/docs/_pages/user_guide/examples/examples_force_floating.md index 25c28a323..ac3754831 100644 --- a/docs/_pages/user_guide/examples/examples_force_floating.md +++ b/docs/_pages/user_guide/examples/examples_force_floating.md @@ -16,17 +16,26 @@ kernelspec: # Floating Magnets -The examples here require installaion of the [magpylib-force package](https://pypi.org/project/magpylib-force/). See also the [magpylib-force documentation](docs-magpylib-force). +The examples here require installaion of the +[magpylib-force package](https://pypi.org/project/magpylib-force/). See also the +[magpylib-force documentation](docs-magpylib-force). ## Formalism -With force and torque we can compute how a magnet moves in a magnetic field by solving the equations of motion, +With force and torque we can compute how a magnet moves in a magnetic field by +solving the equations of motion, $$ \vec{F} = \dot{\vec{p}} \ \text{and} \ \vec{T} = \dot{\vec{L}}$$ -with force $\vec{F}$, momentum $\vec{p}$, torque $\vec{T}$ and angular momentum $\vec{L}$. +with force $\vec{F}$, momentum $\vec{p}$, torque $\vec{T}$ and angular momentum +$\vec{L}$. -We implement a first order semi-implicit Euler method that is used to compute [planetary motion](https://www.mgaillard.fr/2021/07/11/euler-integration.html). The algorithm splits the computation into small subsequent time-steps $\Delta t$, resulting in the following equations for the position $\vec{s}$, the velocity $\vec{v} = \dot{\vec{s}}$, the rotation angle $\vec{\varphi}$ and the angular velocity $\vec{\omega}$, +We implement a first order semi-implicit Euler method that is used to compute +[planetary motion](https://www.mgaillard.fr/2021/07/11/euler-integration.html). +The algorithm splits the computation into small subsequent time-steps +$\Delta t$, resulting in the following equations for the position $\vec{s}$, the +velocity $\vec{v} = \dot{\vec{s}}$, the rotation angle $\vec{\varphi}$ and the +angular velocity $\vec{\omega}$, $$\vec{v}(t+\Delta t) = \vec{v}(t) + \frac{\Delta t}{m} \vec{F}(t)$$ @@ -38,7 +47,9 @@ $$\vec{\varphi} (t + \Delta t) = \vec{\varphi}(t) + \Delta t \cdot \vec{\omega} ## Magnet and Coil -In the following example we show an implementation of the proposed Euler scheme. A cubical magnet is accelerated by a current loop along the z-axis as show in the following sketch: +In the following example we show an implementation of the proposed Euler scheme. +A cubical magnet is accelerated by a current loop along the z-axis as show in +the following sketch: ```{figure} ../../../_static/images/examples_force_floating_coil-magnet.png :width: 40% @@ -48,9 +59,12 @@ In the following example we show an implementation of the proposed Euler scheme. A cubical magnet is accelerated by a current loop. ``` -Due to the symmetry of the problem there is no torque so we solve only the translation part of the equations of motion. +Due to the symmetry of the problem there is no torque so we solve only the +translation part of the equations of motion. -In the beginning, the magnet is at rest and slightly displaced in z-direction from the center of the current loop. With time the magnet is accelerated and it's z-position is displayed in the figure below. +In the beginning, the magnet is at rest and slightly displaced in z-direction +from the center of the current loop. With time the magnet is accelerated and +it's z-position is displayed in the figure below. ```{code-cell} ipython3 import numpy as np @@ -73,10 +87,10 @@ def timestep(source, target, dt): dt: Euler scheme length of timestep """ - + # compute force F, _ = getFT(source, target) - + # compute/set new velocity and position target.v = target.v + dt/target.m * F target.position = target.position + dt * target.v @@ -91,7 +105,7 @@ cube2 = cube1.copy(polarization=(0,0,-1)) # Compute motion for cube, lab in zip([cube1, cube2], ["attractive", "repulsive"]): - + # Set initial conditions cube.m = 1e-3 cube.position=(0,0,3e-3) @@ -116,7 +130,13 @@ plt.gca().set( plt.show() ``` -The simulation is made with two magnets with opposing polarizations. In the "repulsive" case (orange) the magnetic moment of magnet and coil are anti-parallel and the magnet is simply pushed away from the coil in positive z-direction. In the "attractive" case (blue) the moments are parallel to each other, and the magnet is accelerated towards the coil center. Due to inertia it then comes out on the other side, and is again attracted towards the center resulting in an oscillation. +The simulation is made with two magnets with opposing polarizations. In the +"repulsive" case (orange) the magnetic moment of magnet and coil are +anti-parallel and the magnet is simply pushed away from the coil in positive +z-direction. In the "attractive" case (blue) the moments are parallel to each +other, and the magnet is accelerated towards the coil center. Due to inertia it +then comes out on the other side, and is again attracted towards the center +resulting in an oscillation. ```{warning} This algorithm accumulates its error over time, which can be avoided by choosing smaller timesteps. @@ -124,7 +144,9 @@ This algorithm accumulates its error over time, which can be avoided by choosing ## Two-body problem -In the following example we demonstrate a fully dynamic simulation with two magnetic bodies that rotate around each other, attracted towards each other by the magnetic force, and repelled by the centrifugal force. +In the following example we demonstrate a fully dynamic simulation with two +magnetic bodies that rotate around each other, attracted towards each other by +the magnetic force, and repelled by the centrifugal force. ```{figure} ../../../_static/images/examples_force_floating_ringdown.png :width: 80% @@ -134,7 +156,9 @@ In the following example we demonstrate a fully dynamic simulation with two magn Two freely moving magnets rotate around each other. ``` -Contrary to the simple case above, we apply the Euler scheme also to the rotation degrees of freedom, as the magnets will change their orientation while they circle around each other. +Contrary to the simple case above, we apply the Euler scheme also to the +rotation degrees of freedom, as the magnets will change their orientation while +they circle around each other. ```{code-cell} ipython3 import numpy as np @@ -160,11 +184,11 @@ def timestep(source, target, dt): """ # compute force F, T = getFT(source, target) - + # compute/set new velocity and position target.v = target.v + dt/target.m * F target.position = target.position + dt * target.v - + # compute/set new angular velocity and rotation angle target.w = target.w + dt*target.orientation.apply(np.dot(target.I_inv, target.orientation.inv().apply(T))) target.orientation = R.from_rotvec(dt*target.w)*target.orientation @@ -201,11 +225,11 @@ for i in range(steps): fig, (ax1,ax2) = plt.subplots(2,1,figsize=(10,5)) for j,ls in enumerate(["-", "--"]): - + # Plot positions for i,a in enumerate("xyz"): ax1.plot(data[j,:,i], label= a + str(j+1), ls=ls) - + # Plot orientations for i,a in enumerate(["phi", "psi", "theta"]): ax2.plot(data[j+2,:,i], label= a + str(j+1), ls=ls) @@ -226,9 +250,15 @@ plt.tight_layout() plt.show() ``` -In the figure one can see, that the initial velocity is chosen so that the magnets approach each other in a ringdown-like behavior. The magnets are magnetically locked towards each other - both always show the same orientation. However, given no initial angular velocity, the rotation angle is oscillating several times while circling once. +In the figure one can see, that the initial velocity is chosen so that the +magnets approach each other in a ringdown-like behavior. The magnets are +magnetically locked towards each other - both always show the same orientation. +However, given no initial angular velocity, the rotation angle is oscillating +several times while circling once. -A video is helpful in this case to understand what is going on. From the computation above, we build the following gif making use of this [export-animation](examples-vis-exporting-animations) tutorial. +A video is helpful in this case to understand what is going on. From the +computation above, we build the following gif making use of this +[export-animation](examples-vis-exporting-animations) tutorial. ```{figure} ../../../_static/videos/example_force_floating_ringdown.gif :width: 60% @@ -236,4 +266,4 @@ A video is helpful in this case to understand what is going on. From the computa :alt: animation of simulated magnet ringdown. Animation of above simulated magnet ringdown. -``` \ No newline at end of file +``` diff --git a/docs/_pages/user_guide/examples/examples_force_force.md b/docs/_pages/user_guide/examples/examples_force_force.md index 342ab1338..f121e0656 100644 --- a/docs/_pages/user_guide/examples/examples_force_force.md +++ b/docs/_pages/user_guide/examples/examples_force_force.md @@ -16,13 +16,16 @@ kernelspec: # Magnetic Force and Torque -The `magpylib-force` extension provides force and torque computation between Magpylib objects. A detailed description of the API and how the computation is achieved can be found in the [user guide](docs-force-computation). +The `magpylib-force` extension provides force and torque computation between +Magpylib objects. A detailed description of the API and how the computation is +achieved can be found in the [user guide](docs-force-computation). ```{warning} [Scaling invariance](guide-docs-io-scale-invariance) does not hold for force computations! Be careful to provide the inputs in the correct units! ``` -In the following example we show how to compute force and torque between two objects and how to represent it graphically. +In the following example we show how to compute force and torque between two +objects and how to represent it graphically. ```{code-cell} ipython3 import pyvista as pv @@ -44,7 +47,9 @@ print(f"Force (blue): {[round(f) for f in F]} N") print(f"Torque (yellow): {[round(t) for t in T]} Nm") ``` -Force and torque are really strong in this example, because the magnet and the coil are very large objects. With 0.7 m side length, the magnet has a Volume of ~1/3rd cubic meter :). +Force and torque are really strong in this example, because the magnet and the +coil are very large objects. With 0.7 m side length, the magnet has a Volume of +~1/3rd cubic meter :). ```{code-cell} ipython3 # Example continued from above @@ -57,4 +62,4 @@ arrowT = pv.Arrow(start=(0,0,0), direction=T) pl.add_mesh(arrowT, color="yellow") pl.show() -``` \ No newline at end of file +``` diff --git a/docs/_pages/user_guide/examples/examples_force_holding_force.md b/docs/_pages/user_guide/examples/examples_force_holding_force.md index d755e1d07..293ea4004 100644 --- a/docs/_pages/user_guide/examples/examples_force_holding_force.md +++ b/docs/_pages/user_guide/examples/examples_force_holding_force.md @@ -2,9 +2,13 @@ # Magnetic Holding Force -The examples here require installaion of the [magpylib-force package](https://pypi.org/project/magpylib-force/). See also the [magpylib-force documentation](docs-magpylib-force). +The examples here require installaion of the +[magpylib-force package](https://pypi.org/project/magpylib-force/). See also the +[magpylib-force documentation](docs-magpylib-force). -With Magpylib-force it is possible to compute the holding force of a magnet attached magnetically to a soft-ferromagnetic plate. The "pull-force" is the opposing force that is required to detach the magnet from the surface. +With Magpylib-force it is possible to compute the holding force of a magnet +attached magnetically to a soft-ferromagnetic plate. The "pull-force" is the +opposing force that is required to detach the magnet from the surface. ```{figure} ../../../_static/images/examples_force_holding_force.png :width: 40% @@ -14,9 +18,15 @@ With Magpylib-force it is possible to compute the holding force of a magnet atta Sketch of holding force F that must be overcome to detach the magnet from a soft-magnetic plate. ``` -For this we make use of the "magnetic mirror" effect, which is quite similar to the well-known electrostatic "mirror-charge" model. The magnetic field of a magnetic dipole moment that lies in front of a highly permeable surface is similar to the field of two dipole moments: the original one and one that is mirrored across the surface such that each "magnetic charge" that makes up the dipole moment is mirrored in both position and charge. +For this we make use of the "magnetic mirror" effect, which is quite similar to +the well-known electrostatic "mirror-charge" model. The magnetic field of a +magnetic dipole moment that lies in front of a highly permeable surface is +similar to the field of two dipole moments: the original one and one that is +mirrored across the surface such that each "magnetic charge" that makes up the +dipole moment is mirrored in both position and charge. -The following example computes the holding force of a Cuboid magnet using the magnetic mirror effect. +The following example computes the holding force of a Cuboid magnet using the +magnetic mirror effect. ```{code-block} python import magpylib as magpy @@ -37,4 +47,10 @@ print(f"Holding Force: {round(F[2]*100)} g") # Holding Force: 349 g ``` -Magnet dimensions and material from this example are taken from the [web](https://www.supermagnete.at/quadermagnete-neodym/quadermagnet-5mm-2.5mm-1.5mm_Q-05-2.5-1.5-HN). The remanence of N45 material lies within 1.32 and 1.36 T which corresponds to the polarization, see also the ["Modeling a real magnet"](examples-tutorial-modeling-magnets) tutorial. The computation confirms what is stated on the web-page, that the holding force of this magnet is about 350 g. +Magnet dimensions and material from this example are taken from the +[web](https://www.supermagnete.at/quadermagnete-neodym/quadermagnet-5mm-2.5mm-1.5mm_Q-05-2.5-1.5-HN). +The remanence of N45 material lies within 1.32 and 1.36 T which corresponds to +the polarization, see also the +["Modeling a real magnet"](examples-tutorial-modeling-magnets) tutorial. The +computation confirms what is stated on the web-page, that the holding force of +this magnet is about 350 g. diff --git a/docs/_pages/user_guide/examples/examples_index.md b/docs/_pages/user_guide/examples/examples_index.md index 7c4135d06..579645fd0 100644 --- a/docs/_pages/user_guide/examples/examples_index.md +++ b/docs/_pages/user_guide/examples/examples_index.md @@ -1,254 +1,147 @@ (examples)= + # Examples ## Tutorials -::::{grid} 2 3 4 4 -:gutter: 4 - -:::{grid-item-card} {ref}`examples-tutorial-paths` -:text-align: center -:link: examples-tutorial-paths -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_tutorial_paths.png -::: - -:::{grid-item-card} {ref}`examples-tutorial-field-computation` -:text-align: center -:link: examples-tutorial-field-computation -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_tutorial_field_computation.png -::: - -:::{grid-item-card} {ref}`examples-tutorial-collection` -:text-align: center -:link: examples-tutorial-collection -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_tutorial_collection.png -::: - -:::{grid-item-card} {ref}`examples-tutorial-custom` -:text-align: center -:link: examples-tutorial-custom -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_tutorial_custom.png -::: - -:::{grid-item-card} {ref}`examples-tutorial-modeling-magnets` -:text-align: center -:link: examples-tutorial-modeling-magnets -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_tutorial_modeling_magnets.png -::: +::::{grid} 2 3 4 4 :gutter: 4 -:::: +:::{grid-item-card} {ref}`examples-tutorial-paths` :text-align: center :link: +examples-tutorial-paths :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_tutorial_paths.png ::: + +:::{grid-item-card} {ref}`examples-tutorial-field-computation` :text-align: +center :link: examples-tutorial-field-computation :link-type: ref :link-alt: +link to example :img-bottom: +../../../\_static/images/examples_icon_tutorial_field_computation.png ::: + +:::{grid-item-card} {ref}`examples-tutorial-collection` :text-align: center +:link: examples-tutorial-collection :link-type: ref :link-alt: link to example +:img-bottom: ../../../\_static/images/examples_icon_tutorial_collection.png ::: +:::{grid-item-card} {ref}`examples-tutorial-custom` :text-align: center :link: +examples-tutorial-custom :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_tutorial_custom.png ::: + +:::{grid-item-card} {ref}`examples-tutorial-modeling-magnets` :text-align: +center :link: examples-tutorial-modeling-magnets :link-type: ref :link-alt: link +to example :img-bottom: +../../../\_static/images/examples_icon_tutorial_modeling_magnets.png ::: + +:::: ## Visualizations -::::{grid} 2 3 4 4 -:gutter: 4 - -:::{grid-item-card} {ref}`examples-vis-magnet-colors` -:text-align: center -:link: examples-vis-magnet-colors -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_vis_magnet_colors.png -::: - -:::{grid-item-card} {ref}`examples-vis-animations` -:text-align: center -:link: examples-vis-animations -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_vis_animations.png -::: - -:::{grid-item-card} {ref}`examples-vis-subplots` -:text-align: center -:link: examples-vis-subplots -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_vis_subplots.png -::: - -:::{grid-item-card} {ref}`examples-vis-mpl-streamplot` -:text-align: center -:link: examples-vis-mpl-streamplot -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_vis_mpl_streamplot.png -::: - -:::{grid-item-card} {ref}`examples-vis-pv-streamlines` -:text-align: center -:link: examples-vis-pv-streamlines -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_vis_pv_streamlines.png -::: +::::{grid} 2 3 4 4 :gutter: 4 + +:::{grid-item-card} {ref}`examples-vis-magnet-colors` :text-align: center :link: +examples-vis-magnet-colors :link-type: ref :link-alt: link to example +:img-bottom: ../../../\_static/images/examples_icon_vis_magnet_colors.png ::: +:::{grid-item-card} {ref}`examples-vis-animations` :text-align: center :link: +examples-vis-animations :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_vis_animations.png ::: +:::{grid-item-card} {ref}`examples-vis-subplots` :text-align: center :link: +examples-vis-subplots :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_vis_subplots.png ::: + +:::{grid-item-card} {ref}`examples-vis-mpl-streamplot` :text-align: center +:link: examples-vis-mpl-streamplot :link-type: ref :link-alt: link to example +:img-bottom: ../../../\_static/images/examples_icon_vis_mpl_streamplot.png ::: + +:::{grid-item-card} {ref}`examples-vis-pv-streamlines` :text-align: center +:link: examples-vis-pv-streamlines :link-type: ref :link-alt: link to example +:img-bottom: ../../../\_static/images/examples_icon_vis_pv_streamlines.png ::: :::: (examples-complex-magnet-shapes)= + ## Complex Magnet Shapes -::::{grid} 2 3 4 4 -:gutter: 4 - -:::{grid-item-card} {ref}`examples-shapes-superpos` -:text-align: center -:link: examples-shapes-superpos -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_shapes_superpos.png -::: - -:::{grid-item-card} {ref}`examples-shapes-convex-hull` -:text-align: center -:link: examples-shapes-convex-hull -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_shapes_convex_hull.png -::: - -:::{grid-item-card} {ref}`examples-shapes-triangle` -:text-align: center -:link: examples-shapes-triangle -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_shapes_triangle.png -::: - -:::{grid-item-card} {ref}`examples-shapes-pyvista` -:text-align: center -:link: examples-shapes-pyvista -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_shapes_pyvista.png -::: - -:::{grid-item-card} {ref}`examples-shapes-cad` -:text-align: center -:link: examples-shapes-cad -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_shapes_cad.png -::: +::::{grid} 2 3 4 4 :gutter: 4 -:::: +:::{grid-item-card} {ref}`examples-shapes-superpos` :text-align: center :link: +examples-shapes-superpos :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_shapes_superpos.png ::: +:::{grid-item-card} {ref}`examples-shapes-convex-hull` :text-align: center +:link: examples-shapes-convex-hull :link-type: ref :link-alt: link to example +:img-bottom: ../../../\_static/images/examples_icon_shapes_convex_hull.png ::: -## Miscellaneous +:::{grid-item-card} {ref}`examples-shapes-triangle` :text-align: center :link: +examples-shapes-triangle :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_shapes_triangle.png ::: + +:::{grid-item-card} {ref}`examples-shapes-pyvista` :text-align: center :link: +examples-shapes-pyvista :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_shapes_pyvista.png ::: -::::{grid} 2 3 4 4 -:gutter: 4 - -:::{grid-item-card} {ref}`examples-misc-compound` -:text-align: center -:link: examples-misc-compound -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_misc_compound.png -::: - -:::{grid-item-card} {ref}`examples-misc-field-interpolation` -:text-align: center -:link: examples-misc-field-interpolation -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_misc_field_interpolation.png -::: - -:::{grid-item-card} {ref}`examples-misc-inhom` -:text-align: center -:link: examples-misc-inhom -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_misc_inhom.png -::: +:::{grid-item-card} {ref}`examples-shapes-cad` :text-align: center :link: +examples-shapes-cad :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_shapes_cad.png ::: :::: +## Miscellaneous + +::::{grid} 2 3 4 4 :gutter: 4 + +:::{grid-item-card} {ref}`examples-misc-compound` :text-align: center :link: +examples-misc-compound :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_misc_compound.png ::: + +:::{grid-item-card} {ref}`examples-misc-field-interpolation` :text-align: center +:link: examples-misc-field-interpolation :link-type: ref :link-alt: link to +example :img-bottom: +../../../\_static/images/examples_icon_misc_field_interpolation.png ::: + +:::{grid-item-card} {ref}`examples-misc-inhom` :text-align: center :link: +examples-misc-inhom :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_misc_inhom.png ::: + +:::: ## Applications -::::{grid} 2 3 4 4 -:gutter: 4 - -:::{grid-item-card} {ref}`examples-app-end-of-shaft` -:text-align: center -:link: examples-app-end-of-shaft -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_app_end_of_shaft.png -::: - -:::{grid-item-card} {ref}`examples-app-halbach` -:text-align: center -:link: examples-app-halbach -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_app_halbach.png -::: - -:::{grid-item-card} {ref}`examples-app-helmholtz` -:text-align: center -:link: examples-app-helmholtz -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_app_helmholtz.png -::: - -:::{grid-item-card} {ref}`examples-app-scales` -:text-align: center -:link: examples-app-scales -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_WIP.png -::: +::::{grid} 2 3 4 4 :gutter: 4 + +:::{grid-item-card} {ref}`examples-app-end-of-shaft` :text-align: center :link: +examples-app-end-of-shaft :link-type: ref :link-alt: link to example +:img-bottom: ../../../\_static/images/examples_icon_app_end_of_shaft.png ::: + +:::{grid-item-card} {ref}`examples-app-halbach` :text-align: center :link: +examples-app-halbach :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_app_halbach.png ::: + +:::{grid-item-card} {ref}`examples-app-helmholtz` :text-align: center :link: +examples-app-helmholtz :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_app_helmholtz.png ::: + +:::{grid-item-card} {ref}`examples-app-scales` :text-align: center :link: +examples-app-scales :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_WIP.png ::: :::: ## Magpylib-Force -::::{grid} 2 3 4 4 -:gutter: 4 - -:::{grid-item-card} {ref}`examples-force-force` -:text-align: center -:link: examples-force-force -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_force_force.png -::: - -:::{grid-item-card} {ref}`examples-force-holding-force` -:text-align: center -:link: examples-force-holding-force -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_force_holding_force.png -::: - -:::{grid-item-card} {ref}`examples-force-floating` -:text-align: center -:link: examples-force-floating -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_force_floating.png -::: +::::{grid} 2 3 4 4 :gutter: 4 -:::: +:::{grid-item-card} {ref}`examples-force-force` :text-align: center :link: +examples-force-force :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_force_force.png ::: + +:::{grid-item-card} {ref}`examples-force-holding-force` :text-align: center +:link: examples-force-holding-force :link-type: ref :link-alt: link to example +:img-bottom: ../../../\_static/images/examples_icon_force_holding_force.png ::: +:::{grid-item-card} {ref}`examples-force-floating` :text-align: center :link: +examples-force-floating :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_force_floating.png ::: + +:::: ```{toctree} :maxdepth: 2 @@ -285,4 +178,3 @@ examples_force_force.md examples_force_holding_force.md examples_force_floating.md ``` - diff --git a/docs/_pages/user_guide/examples/examples_misc_compound.md b/docs/_pages/user_guide/examples/examples_misc_compound.md index 6f2616d6f..d2608e3e8 100644 --- a/docs/_pages/user_guide/examples/examples_misc_compound.md +++ b/docs/_pages/user_guide/examples/examples_misc_compound.md @@ -16,11 +16,19 @@ orphan: true # Compounds -The `Collection` class is a powerful tool for grouping and tracking object assemblies. However, it is often convenient to have assembly parameters themselves, like number of magnets, as variables. This is achieved by sub-classing `Collection`. We refer to such classes as "**Compounds**" and show how to seamlessly integrate them into Magpylib. +The `Collection` class is a powerful tool for grouping and tracking object +assemblies. However, it is often convenient to have assembly parameters +themselves, like number of magnets, as variables. This is achieved by +sub-classing `Collection`. We refer to such classes as "**Compounds**" and show +how to seamlessly integrate them into Magpylib. ## Subclassing collections -In the following example we design a compound class `MagnetRing` which represents a ring of cuboid magnets with the parameter `cubes` that should refer to the number of magnets on the ring. The ring will automatically adjust its size when `cubes` is modified, including an additionally added encompassing 3D model that may, for example, represent a mechanical magnet holder. +In the following example we design a compound class `MagnetRing` which +represents a ring of cuboid magnets with the parameter `cubes` that should refer +to the number of magnets on the ring. The ring will automatically adjust its +size when `cubes` is modified, including an additionally added encompassing 3D +model that may, for example, represent a mechanical magnet holder. ```{code-cell} ipython3 import magpylib as magpy @@ -87,7 +95,8 @@ class MagnetRing(magpy.Collection): return self ``` -This new `MagnetRing` class seamlessly integrates into Magpylib and makes use of the position and orientation interface, field computation and graphic display. +This new `MagnetRing` class seamlessly integrates into Magpylib and makes use of +the position and orientation interface, field computation and graphic display. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -124,9 +133,15 @@ magpy.show(ring, sensor, backend='plotly') ## Postponed trace construction -In the above example, the trace is constructed in `_update`, every time the parameter `cubes` is modified. This can lead to an unwanted computational overhead, especially as the construction is only necessary for graphical representation. +In the above example, the trace is constructed in `_update`, every time the +parameter `cubes` is modified. This can lead to an unwanted computational +overhead, especially as the construction is only necessary for graphical +representation. -To make our compounds ready for heavy computation, while retaining Magpylib graphic possibilities, it is possible to provide a trace which will only be constructed when `show` is called. The following modification of the above example demonstrates this: +To make our compounds ready for heavy computation, while retaining Magpylib +graphic possibilities, it is possible to provide a trace which will only be +constructed when `show` is called. The following modification of the above +example demonstrates this: ```{code-cell} ipython3 class MagnetRingAdv(magpy.Collection): @@ -191,7 +206,8 @@ class MagnetRingAdv(magpy.Collection): return trace ``` -We have removed the trace construction from the `_update` method, and instead provided `_custom_trace3d` as a callable. +We have removed the trace construction from the `_update` method, and instead +provided `_custom_trace3d` as a callable. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -203,4 +219,5 @@ ring1 = MagnetRingAdv() %time for _ in range(10): ring1.cubes=10 ``` -This example is not very impressive because the provided trace is not very heavy. +This example is not very impressive because the provided trace is not very +heavy. diff --git a/docs/_pages/user_guide/examples/examples_misc_field_interpolation.md b/docs/_pages/user_guide/examples/examples_misc_field_interpolation.md index 63a779352..976c88bd8 100644 --- a/docs/_pages/user_guide/examples/examples_misc_field_interpolation.md +++ b/docs/_pages/user_guide/examples/examples_misc_field_interpolation.md @@ -16,16 +16,21 @@ orphan: true # Field Interpolation -There are several reasons for working with field interpolations rather than computing the field on demand. +There are several reasons for working with field interpolations rather than +computing the field on demand. 1. Very large grids take a lot of time to compute, even with Magpylib. -2. The field might not be accessible through Magpylib, e.g. when demagnetization is included, but it can be computed with a 3rd party FE tool or is the result of an experiment. +2. The field might not be accessible through Magpylib, e.g. when demagnetization + is included, but it can be computed with a 3rd party FE tool or is the result + of an experiment. -Combining field interpolation and `CustomSource` enables integration of pre-computed solutions. In the following example we show how this can be done. +Combining field interpolation and `CustomSource` enables integration of +pre-computed solutions. In the following example we show how this can be done. ## Interpolation -We start by defining a 3D vector-field interpolation function relying on Scipy `RegularGridInterpolator`. +We start by defining a 3D vector-field interpolation function relying on Scipy +`RegularGridInterpolator`. ```{code-cell} ipython3 import numpy as np @@ -84,7 +89,11 @@ def interpolation(observer, data, method="linear", bounds_error=False, fill_valu ## CustomSource with Interpolation Field -In the second step we create a custom source with an interpolated field `field_func` input. The data for the interpolation is generated from the Magpylib `Cuboid` field, which makes it easy to verify the approach afterwards. To the custom source a nice 3D model is added that makes it possible to display it and the cuboid at the same time. +In the second step we create a custom source with an interpolated field +`field_func` input. The data for the interpolation is generated from the +Magpylib `Cuboid` field, which makes it easy to verify the approach afterwards. +To the custom source a nice 3D model is added that makes it possible to display +it and the cuboid at the same time. ```{code-cell} ipython3 # Create data for interpolation @@ -118,7 +127,10 @@ magpy.show(custom, cube, zoom=1, backend="matplotlib") ## Testing Interpolation Accuracy -Finally, we compare the "exact" field of the cuboid source with the interpolated field of the custom source. For this purpose, a sensor is added and a generic rotation is applied to the sources. Naturally there is some error that can be reduced by increasing the interpolation grid finesse. +Finally, we compare the "exact" field of the cuboid source with the interpolated +field of the custom source. For this purpose, a sensor is added and a generic +rotation is applied to the sources. Naturally there is some error that can be +reduced by increasing the interpolation grid finesse. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed diff --git a/docs/_pages/user_guide/examples/examples_misc_inhom.md b/docs/_pages/user_guide/examples/examples_misc_inhom.md index 4f12f9669..61718f0df 100644 --- a/docs/_pages/user_guide/examples/examples_misc_inhom.md +++ b/docs/_pages/user_guide/examples/examples_misc_inhom.md @@ -16,11 +16,24 @@ kernelspec: # Inhomogeneous Magnetization -The analytical expressions implemented in Magpylib treat only simple homogeneous polarizations. When dealing with high-grade materials that are magnetized in homogeneous fields this is a good approximation. However, there are many cases where such a homogeneous model is not justified. The tutorial {ref}`examples-tutorial-modeling-magnets` and the user-guide {ref}`guide-physics-demag` provide some insights on this topic. - -Here we show how to deal with inhomogeneous polarization based on a commonly misunderstood example of a cylindrical quadrupol magnet. While graphical representations of such magnets usually depict only four poles, see {ref}`examples-vis-magnet-colors`, such magnets exhibit complex polarization given by the magnetization device that is used to magnetize them. - -The following code shows how the field of such a magnetization device would look like and what magnetization field it produces. To relize a Cylindrical Quadrupole magnert there are four coils with ferromagnetic cores involved, arranged in circle around the magnet. In the example, coils and cores are modeled by Cuboid magnets. +The analytical expressions implemented in Magpylib treat only simple homogeneous +polarizations. When dealing with high-grade materials that are magnetized in +homogeneous fields this is a good approximation. However, there are many cases +where such a homogeneous model is not justified. The tutorial +{ref}`examples-tutorial-modeling-magnets` and the user-guide +{ref}`guide-physics-demag` provide some insights on this topic. + +Here we show how to deal with inhomogeneous polarization based on a commonly +misunderstood example of a cylindrical quadrupol magnet. While graphical +representations of such magnets usually depict only four poles, see +{ref}`examples-vis-magnet-colors`, such magnets exhibit complex polarization +given by the magnetization device that is used to magnetize them. + +The following code shows how the field of such a magnetization device would look +like and what magnetization field it produces. To relize a Cylindrical +Quadrupole magnert there are four coils with ferromagnetic cores involved, +arranged in circle around the magnet. In the example, coils and cores are +modeled by Cuboid magnets. ```{note} While Magpylib uses SI units by default, in this example we make use of [scaling invariance](guide-docs-io-scale-invariance) and consider arbitrary input length units. For this example millimeters are sensible. @@ -89,7 +102,16 @@ plt.tight_layout() plt.show() ``` -It can be assumed that the polarization that is written into the unmagnetized Cylinder will, in a lowest order approximation, follow the magnetic field generated by the magnetization tool. To create a Cylinder magnet with such a polarization pattern we apply the [superposition principle](examples-shapes-superpos) and approximate the inhomogneous polarization as the sum of multiple small homogeneous cells using the `CylinderSegment` class. Splitting up the Cylinder into many cells is easily done by hand, but for practicality we make use of the [magpylib-material-response](https://pypi.org/project/magpylib-material-response/) package which provides an excellent function for this purpose. +It can be assumed that the polarization that is written into the unmagnetized +Cylinder will, in a lowest order approximation, follow the magnetic field +generated by the magnetization tool. To create a Cylinder magnet with such a +polarization pattern we apply the +[superposition principle](examples-shapes-superpos) and approximate the +inhomogneous polarization as the sum of multiple small homogeneous cells using +the `CylinderSegment` class. Splitting up the Cylinder into many cells is easily +done by hand, but for practicality we make use of the +[magpylib-material-response](https://pypi.org/project/magpylib-material-response/) +package which provides an excellent function for this purpose. ```{code-cell} ipython # Continuation from above - ensure previous code is executed @@ -136,6 +158,13 @@ plt.tight_layout() plt.show() ``` -The color on the right-hand-side corresponds to the angle of orientation of the material polarization. Increasing the mesh finesse will improve the approximation but slow down any field computation at the same time. +The color on the right-hand-side corresponds to the angle of orientation of the +material polarization. Increasing the mesh finesse will improve the +approximation but slow down any field computation at the same time. -**What is the purpose of this example ?** In addition to demonstrating how inhomogeneous polarizations can be modeled, this example should raise awareness that many magnets can look simple on a data sheet (color pattern) but may have an inhomogeneous, complex, unknown polarization distribution. It goes without saying that the magnetic field generated by such a magnet, for example in an angle sensing application, will depend strongly on the polarization. +**What is the purpose of this example ?** In addition to demonstrating how +inhomogeneous polarizations can be modeled, this example should raise awareness +that many magnets can look simple on a data sheet (color pattern) but may have +an inhomogeneous, complex, unknown polarization distribution. It goes without +saying that the magnetic field generated by such a magnet, for example in an +angle sensing application, will depend strongly on the polarization. diff --git a/docs/_pages/user_guide/examples/examples_shapes_cad.md b/docs/_pages/user_guide/examples/examples_shapes_cad.md index 41615f458..b865db9f9 100644 --- a/docs/_pages/user_guide/examples/examples_shapes_cad.md +++ b/docs/_pages/user_guide/examples/examples_shapes_cad.md @@ -16,7 +16,10 @@ kernelspec: # Magnets from CAD -The easiest way to create complex magnet shapes from CAD files is through Pyvista using the [TriangularMesh class](docu-magpylib-api-trimesh). Pyvista supports *.stl files, and any open CAD file format is easily transformed to stl. +The easiest way to create complex magnet shapes from CAD files is through +Pyvista using the [TriangularMesh class](docu-magpylib-api-trimesh). Pyvista +supports \*.stl files, and any open CAD file format is easily transformed to +stl. ```{warning} CAD files might include many Triangles, especially when dealing with round sides and edges, that do not significantly contribute to the field and will slow down the Magpylib computation. diff --git a/docs/_pages/user_guide/examples/examples_shapes_convex_hull.md b/docs/_pages/user_guide/examples/examples_shapes_convex_hull.md index 69f493834..b706a57f4 100644 --- a/docs/_pages/user_guide/examples/examples_shapes_convex_hull.md +++ b/docs/_pages/user_guide/examples/examples_shapes_convex_hull.md @@ -16,9 +16,14 @@ orphan: true # Convex Hull -In geometry the convex hull of a point cloud is the smallest convex shape that contains all points, see [Wikipedia](https://en.wikipedia.org/wiki/Convex_hull). - -Magpylib offers construction of convex hull magnets by combining the `magpylib.magnets.TriangularMesh` and the [scipy.spatial.ConvexHull](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.ConvexHull.html) classes via the class method `from_ConvexHull`. Note, that the Scipy method does not guarantee correct face orientations if `reorient_faces` is disabled. +In geometry the convex hull of a point cloud is the smallest convex shape that +contains all points, see [Wikipedia](https://en.wikipedia.org/wiki/Convex_hull). + +Magpylib offers construction of convex hull magnets by combining the +`magpylib.magnets.TriangularMesh` and the +[scipy.spatial.ConvexHull](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.ConvexHull.html) +classes via the class method `from_ConvexHull`. Note, that the Scipy method does +not guarantee correct face orientations if `reorient_faces` is disabled. ## Pyramid magnet diff --git a/docs/_pages/user_guide/examples/examples_shapes_pyvista.md b/docs/_pages/user_guide/examples/examples_shapes_pyvista.md index d4bf7763d..e29b69f21 100644 --- a/docs/_pages/user_guide/examples/examples_shapes_pyvista.md +++ b/docs/_pages/user_guide/examples/examples_shapes_pyvista.md @@ -16,7 +16,10 @@ orphan: true # Pyvista Bodies -[Pyvista](https://docs.pyvista.org/version/stable/) is a powerful open-source tool for the creation and visualization of meshes. Pyvista `PolyData` objects can be directly transformed into Magpylib `TriangularMesh` magnets via the classmethod `from_pyvista`. +[Pyvista](https://docs.pyvista.org/version/stable/) is a powerful open-source +tool for the creation and visualization of meshes. Pyvista `PolyData` objects +can be directly transformed into Magpylib `TriangularMesh` magnets via the +classmethod `from_pyvista`. ```{note} The Pyvista library used in the following examples is not automatically installed with Magpylib. A Pyvista installation guide is found [here](https://docs.pyvista.org/getting-started/installation.html). @@ -50,7 +53,10 @@ with magpy.show_context(dodec, sens, backend='plotly') as s: ## Boolean operations with Pyvista -With Pyvista it is possible to build complex shapes with boolean geometric operations. However, such operations often result in open and disconnected meshes that require some refinement to produce solid magnets. The following example demonstrates the problem, how to analyze and fix it. +With Pyvista it is possible to build complex shapes with boolean geometric +operations. However, such operations often result in open and disconnected +meshes that require some refinement to produce solid magnets. The following +example demonstrates the problem, how to analyze and fix it. ```{code-cell} ipython3 import pyvista as pv @@ -83,10 +89,13 @@ magnet.show( ) ``` -The result cannot be used for magnetic field computation. Even if all faces were present, the reorient-faces algorithm would fail when these faces are disconnected. Such problems can be fixed by +The result cannot be used for magnetic field computation. Even if all faces were +present, the reorient-faces algorithm would fail when these faces are +disconnected. Such problems can be fixed by 1. giving Pyvista a finer mesh to work with from the start -2. Pyvista mesh cleaning (merge duplicate points, remove unused points, remove degenerate faces) +2. Pyvista mesh cleaning (merge duplicate points, remove unused points, remove + degenerate faces) The following code produces a clean magnet. diff --git a/docs/_pages/user_guide/examples/examples_shapes_superpos.md b/docs/_pages/user_guide/examples/examples_shapes_superpos.md index 287d88df4..62428c3a4 100644 --- a/docs/_pages/user_guide/examples/examples_shapes_superpos.md +++ b/docs/_pages/user_guide/examples/examples_shapes_superpos.md @@ -16,30 +16,36 @@ orphan: true # Superposition -The [superposition principle](https://en.wikipedia.org/wiki/Superposition_principle) states that the net response caused by two or more stimuli is the sum of the responses caused by each stimulus individually. This principle holds in magnetostatics when there is no material response, and simply states that the total field created by multiple magnets and currents is the sum of the individual fields. - -When two magnets overlap geometrically, the magnetization in the overlap region is given by the vector sum of the two individual magnetizations. This enables two geometric operations, - -:::::{grid} 1 2 2 2 -:gutter: 4 - -::::{grid-item-card} Union -:img-bottom: ../../../_static/images/docu_field_superpos_union.png -:shadow: None -Build complex forms by aligning base shapes (no overlap) with each other with similar magnetization vector. -:::: - -::::{grid-item-card} Cut-Out -:img-bottom: ../../../_static/images/docu_field_superpos_cutout.png -:shadow: None -When two objects with opposing magnetization vectors of similar amplitude overlap, they will just cancel in the overlap region. This enables geometric cut-out operations. -:::: -::::: - +The +[superposition principle](https://en.wikipedia.org/wiki/Superposition_principle) +states that the net response caused by two or more stimuli is the sum of the +responses caused by each stimulus individually. This principle holds in +magnetostatics when there is no material response, and simply states that the +total field created by multiple magnets and currents is the sum of the +individual fields. + +When two magnets overlap geometrically, the magnetization in the overlap region +is given by the vector sum of the two individual magnetizations. This enables +two geometric operations, + +:::::{grid} 1 2 2 2 :gutter: 4 + +::::{grid-item-card} Union :img-bottom: +../../../\_static/images/docu_field_superpos_union.png :shadow: None Build +complex forms by aligning base shapes (no overlap) with each other with similar +magnetization vector. :::: + +::::{grid-item-card} Cut-Out :img-bottom: +../../../\_static/images/docu_field_superpos_cutout.png :shadow: None When two +objects with opposing magnetization vectors of similar amplitude overlap, they +will just cancel in the overlap region. This enables geometric cut-out +operations. :::: ::::: ## Union operation -Geometric union by superposition is demonstrated in the following example where a wedge-shaped magnet with a round back is constructed from three base-forms: a CylinderSegment, a Cuboid and a TriangularMesh. +Geometric union by superposition is demonstrated in the following example where +a wedge-shaped magnet with a round back is constructed from three base-forms: a +CylinderSegment, a Cuboid and a TriangularMesh. ```{code-cell} ipython3 import numpy as np @@ -76,9 +82,14 @@ with magpy.show_context(magnet, sensor, backend="plotly", style_legend_show=Fals ## Cut-out operation -When two objects with opposing magnetization vectors of similar amplitude overlap, they will just cancel in the overlap region. This enables geometric cut-out operations. In the following example we construct an exact hollow cylinder solution from two concentric cylinder shapes with opposite magnetizations and compare the result to the `CylinderSegment` class solution. +When two objects with opposing magnetization vectors of similar amplitude +overlap, they will just cancel in the overlap region. This enables geometric +cut-out operations. In the following example we construct an exact hollow +cylinder solution from two concentric cylinder shapes with opposite +magnetizations and compare the result to the `CylinderSegment` class solution. -Here the `getM` and `getJ` functions come in handy. They allow us to see the magnetization distribution that is the result of the superposition. +Here the `getM` and `getJ` functions come in handy. They allow us to see the +magnetization distribution that is the result of the superposition. ```{code-cell} ipython3 import numpy as np @@ -128,9 +139,11 @@ plt.tight_layout() plt.show() ``` -The two figures show that the magnetization is zero outside of the cylinder, as well as in the overlap region where the two magnetizations cancel. +The two figures show that the magnetization is zero outside of the cylinder, as +well as in the overlap region where the two magnetizations cancel. -Finally, we want to show that the superposition gives the same result as a computation from the CylinderSegment solution. +Finally, we want to show that the superposition gives the same result as a +computation from the CylinderSegment solution. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -145,13 +158,20 @@ print("CylinderSegment result:", ring1.getB((.01, .02, .03))) print(" Cut-out result:", ring0.getB((.01, .02, .03))) ``` -Note that it is faster to compute the `Cylinder` field two times than computing the `CylinderSegment` field one time. This is why Magpylib automatically falls back to the `Cylinder` solution whenever `CylinderSegment` is called with 360 deg section angles. +Note that it is faster to compute the `Cylinder` field two times than computing +the `CylinderSegment` field one time. This is why Magpylib automatically falls +back to the `Cylinder` solution whenever `CylinderSegment` is called with 360 +deg section angles. -Unfortunately, with respect to 3D-models, cut-out operations cannot be displayed graphically at this point in time, but {ref}`examples-own-3d-models` offer custom solutions. +Unfortunately, with respect to 3D-models, cut-out operations cannot be displayed +graphically at this point in time, but {ref}`examples-own-3d-models` offer +custom solutions. ## Nice example -The following example combines union and cut-out to create a complex magnet shape which is then displayed by combining a streamplot with a contourplot in matplotlib. +The following example combines union and cut-out to create a complex magnet +shape which is then displayed by combining a streamplot with a contourplot in +matplotlib. ```{code-cell} ipython3 import numpy as np @@ -192,4 +212,4 @@ ax.set( ) plt.tight_layout() plt.show() -``` \ No newline at end of file +``` diff --git a/docs/_pages/user_guide/examples/examples_shapes_triangle.md b/docs/_pages/user_guide/examples/examples_shapes_triangle.md index bb2a211b8..ec7514d80 100644 --- a/docs/_pages/user_guide/examples/examples_shapes_triangle.md +++ b/docs/_pages/user_guide/examples/examples_shapes_triangle.md @@ -16,18 +16,27 @@ orphan: true # Triangular Meshes -The magnetic field of a homogeneously magnetized body is equivalent to the field of a charged surface. The surface is the hull of the body, and the charge density is proportional to the projection of the magnetization vector onto the surface normal. - -It is very common to approximate the surface of bodies by triangular meshes, which can then be transformed into magnets using the `Triangle` and the `TriangularMesh` classes. When using these classes one should abide by the following rules: - -1. The surface must be closed, or all missing faces must have zero charge (magnetization vector perpendicular to surface normal). +The magnetic field of a homogeneously magnetized body is equivalent to the field +of a charged surface. The surface is the hull of the body, and the charge +density is proportional to the projection of the magnetization vector onto the +surface normal. + +It is very common to approximate the surface of bodies by triangular meshes, +which can then be transformed into magnets using the `Triangle` and the +`TriangularMesh` classes. When using these classes one should abide by the +following rules: + +1. The surface must be closed, or all missing faces must have zero charge + (magnetization vector perpendicular to surface normal). 2. All triangles are oriented outwards (right-hand-rule) 3. The surface must not be self-intersecting. -4. For the B-field magnetic polarization must be added on the inside of the body. +4. For the B-field magnetic polarization must be added on the inside of the + body. ## Cuboctahedron Magnet -In this example `Triangle` is used to create a magnet with cuboctahedral shape. Notice that triangle orientation is displayed by default for convenience. +In this example `Triangle` is used to create a magnet with cuboctahedral shape. +Notice that triangle orientation is displayed by default for convenience. ```{code-cell} ipython3 import magpylib as magpy @@ -77,9 +86,15 @@ magpy.show( ## Triangular Prism Magnet -Consider a prism with triangular base that is magnetized orthogonal to the base. All surface normals of the sides of the prism are orthogonal to the magnetization vector. As a result, the sides do not contribute to the magnetic field because their charge density disappears. Only the top and bottom surfaces contribute. One must be very careful when defining those surfaces in such a way that the surface normals point outwards. +Consider a prism with triangular base that is magnetized orthogonal to the base. +All surface normals of the sides of the prism are orthogonal to the +magnetization vector. As a result, the sides do not contribute to the magnetic +field because their charge density disappears. Only the top and bottom surfaces +contribute. One must be very careful when defining those surfaces in such a way +that the surface normals point outwards. -Leaving out parts of the surface that do not contribute to the field is beneficial for computation speed. +Leaving out parts of the surface that do not contribute to the field is +beneficial for computation speed. ```{code-cell} ipython3 import magpylib as magpy @@ -103,13 +118,18 @@ magpy.show(*prism, backend="plotly", style_opacity=0.5, style_magnetization_show ## TriangularMesh class -While `Triangle` simply provides the field of a charged triangle and can be used to construct complex forms, it is prone to error and tedious to work with when meshes become large. For this purpose, the `TriangularMesh` class ensures proper and convenient magnet creation by automatically checking mesh integrity and by orienting the faces at initialization. +While `Triangle` simply provides the field of a charged triangle and can be used +to construct complex forms, it is prone to error and tedious to work with when +meshes become large. For this purpose, the `TriangularMesh` class ensures proper +and convenient magnet creation by automatically checking mesh integrity and by +orienting the faces at initialization. ```{attention} Automatic face reorientation of `TriangularMesh` may fail when the mesh is open. ``` -In this example we revisit the cuboctahedron but generate it through the `TriangularMesh` class. +In this example we revisit the cuboctahedron but generate it through the +`TriangularMesh` class. ```{code-cell} ipython3 import magpylib as magpy @@ -138,7 +158,10 @@ magpy.show( ) ``` -The `TriangularMesh` class is extremely powerful as it enables almost arbitrary magnet shapes. It is described in detail in {ref}`docu-magpylib-api-trimesh`. There are many ways to generate such triangular meshes. An example thereof is shown in {ref}`examples-shapes-pyvista`. +The `TriangularMesh` class is extremely powerful as it enables almost arbitrary +magnet shapes. It is described in detail in {ref}`docu-magpylib-api-trimesh`. +There are many ways to generate such triangular meshes. An example thereof is +shown in {ref}`examples-shapes-pyvista`. ```{caution} * `getB` and `getH` compute the fields correctly only if the mesh is closed, not self-intersecting, and all faces are properly oriented outwards. @@ -152,7 +175,13 @@ The `TriangularMesh` class is extremely powerful as it enables almost arbitrary ## Open TriangularMesh -In some cases, it may be desirable to generate a `TriangularMesh` object from an open mesh (see Prism example above). In this case one must be extremely careful because one cannot rely on the checks. Not to generate warnings or error messages, these checks can be disabled with `"skip"` or their outcome can be ignored with `"ignore"`. The `show` function can be used to view open edges and disconnected parts. In the following example we generate such an open mesh directly from `Triangle` objects. +In some cases, it may be desirable to generate a `TriangularMesh` object from an +open mesh (see Prism example above). In this case one must be extremely careful +because one cannot rely on the checks. Not to generate warnings or error +messages, these checks can be disabled with `"skip"` or their outcome can be +ignored with `"ignore"`. The `show` function can be used to view open edges and +disconnected parts. In the following example we generate such an open mesh +directly from `Triangle` objects. ```{code-cell} ipython3 import magpylib as magpy diff --git a/docs/_pages/user_guide/examples/examples_tutorial_collection.md b/docs/_pages/user_guide/examples/examples_tutorial_collection.md index ac1a81d3b..5246445ea 100644 --- a/docs/_pages/user_guide/examples/examples_tutorial_collection.md +++ b/docs/_pages/user_guide/examples/examples_tutorial_collection.md @@ -16,16 +16,28 @@ orphan: true # Working with Collections -The top-level class `Collection` allows users to group objects by reference for common manipulation. The following concepts apply to Magpylib Collections: - -1. A collection spans its own local frame of reference with position and orientation, to which the children are added. Thus, any operation applied to the collection is individually applied to all its children. -2. The collection itself behaves like a single Magpylib object (can be source and/or observer). -3. All children inside the collection can be individually addressed and manipulated, which will automatically manipulate their state inside the parent collection. -4. Collections have their own `style` attributes, their paths are displayed in `show`, and all children are automatically assigned their parent color. +The top-level class `Collection` allows users to group objects by reference for +common manipulation. The following concepts apply to Magpylib Collections: + +1. A collection spans its own local frame of reference with position and + orientation, to which the children are added. Thus, any operation applied to + the collection is individually applied to all its children. +2. The collection itself behaves like a single Magpylib object (can be source + and/or observer). +3. All children inside the collection can be individually addressed and + manipulated, which will automatically manipulate their state inside the + parent collection. +4. Collections have their own `style` attributes, their paths are displayed in + `show`, and all children are automatically assigned their parent color. ## Constructing Collections -Collections have the attributes `children`, `sources`, `sensors` and `collections`. These attributes are ordered lists that contain objects that are added to the collection by reference (not copied). `children` returns a list of all objects in the collection. `sources` returns a list of the sources, `sensors` a list of the sensors and `collections` a list of "sub-collections" within the collection. +Collections have the attributes `children`, `sources`, `sensors` and +`collections`. These attributes are ordered lists that contain objects that are +added to the collection by reference (not copied). `children` returns a list of +all objects in the collection. `sources` returns a list of the sources, +`sensors` a list of the sensors and `collections` a list of "sub-collections" +within the collection. ```{code-cell} ipython3 import magpylib as magpy @@ -42,7 +54,8 @@ print(f"sensors: {coll.sensors}") print(f"collections: {coll.collections}") ``` -New additions are always added at the end. Use the **`add`** method or the parameters. +New additions are always added at the end. Use the **`add`** method or the +parameters. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -64,7 +77,9 @@ print(f"sensors: {coll.sensors}") print(f"collections: {coll.collections}") ``` -The **`describe`** method is a very convenient way to view a Collection structure, especially when the collection is nested, i.e., when containing other collections. +The **`describe`** method is a very convenient way to view a Collection +structure, especially when the collection is nested, i.e., when containing other +collections. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -76,9 +91,11 @@ c2.add(s2.copy()) coll.describe(format="label+type") ``` -The parameter `format` can be any combination of `"type"`, `"label"`, `"id"` and `"properties"`. +The parameter `format` can be any combination of `"type"`, `"label"`, `"id"` and +`"properties"`. -For convenience, any two Magpylib objects can be added up with `+` to form a collection. +For convenience, any two Magpylib objects can be added up with `+` to form a +collection. ```{code-cell} ipython3 import magpylib as magpy @@ -93,7 +110,9 @@ coll.describe(format="label") ## Child-Parent Relations -Objects that are part of a collection become children of that collection, and the collection itself becomes their parent. Every Magpylib object has the `parent` attribute, which is `None` by default. +Objects that are part of a collection become children of that collection, and +the collection itself becomes their parent. Every Magpylib object has the +`parent` attribute, which is `None` by default. ```{code-cell} ipython3 import magpylib as magpy @@ -106,7 +125,10 @@ print(f"c1.parent: {c1.parent}") print(f"c1.children: {c1.children}") ``` -Rather than adding objects to a collection, as described above, one can also set the `parent` parameter. A Magpylib object can only have a single parent, i.e., it can only be part of a single collection. As a result, changing the parent will automatically remove the object from its previous collection. +Rather than adding objects to a collection, as described above, one can also set +the `parent` parameter. A Magpylib object can only have a single parent, i.e., +it can only be part of a single collection. As a result, changing the parent +will automatically remove the object from its previous collection. ```{code-cell} ipython3 import magpylib as magpy @@ -129,7 +151,8 @@ c2.describe(format="label") ## Accessing Children -Collections have `__getitem__` through the attribute `children` defined which enables using collections directly as iterators, +Collections have `__getitem__` through the attribute `children` defined which +enables using collections directly as iterators, ```{code-cell} ipython3 import magpylib as magpy @@ -151,7 +174,10 @@ and makes it possible to directly reference to a child object by index: print(coll[0]) ``` -Collection nesting is powerful to create a self-consistent hierarchical structure, however, it is often in the way of quick child access in nested trees. For this, the `children_all`, `sources_all`, `sensors_all` and `collections_all` read-only parameters, return all objects in the tree: +Collection nesting is powerful to create a self-consistent hierarchical +structure, however, it is often in the way of quick child access in nested +trees. For this, the `children_all`, `sources_all`, `sensors_all` and +`collections_all` read-only parameters, return all objects in the tree: ```{code-cell} ipython3 import magpylib as magpy @@ -170,7 +196,8 @@ print([s.style.label for s in coll.sensors_all]) ## Practical Example -The following example demonstrates how collections enable user-friendly manipulation of groups, sub-groups, and individual objects. +The following example demonstrates how collections enable user-friendly +manipulation of groups, sub-groups, and individual objects. ```{code-cell} ipython3 import numpy as np @@ -203,7 +230,10 @@ for coil in [coil1, coil2]: magpy.show(*helmholtz, animation=True, style_path_show=False) ``` -For magnetic field computation, a collection with source children behaves like a single source object, and a collection with sensor children behaves like a flat list of its sensors when provided as `sources` and `observers` input respectively. +For magnetic field computation, a collection with source children behaves like a +single source object, and a collection with sensor children behaves like a flat +list of its sensors when provided as `sources` and `observers` input +respectively. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -226,7 +256,11 @@ plt.show() ## Efficient 3D Models -The graphical backend libraries were not designed for complex 3D graphic output. As a result, it often becomes inconvenient and slow when attempting to display many 3D objects. One solution to this problem when dealing with large collections is to represent the latter by a single encompassing body, and to deactivate the individual 3D models of all children. +The graphical backend libraries were not designed for complex 3D graphic output. +As a result, it often becomes inconvenient and slow when attempting to display +many 3D objects. One solution to this problem when dealing with large +collections is to represent the latter by a single encompassing body, and to +deactivate the individual 3D models of all children. ```{code-cell} ipython3 import magpylib as magpy @@ -260,4 +294,6 @@ coll.show() ## Compound Objects -Collections can be subclassed to form dynamic groups that seamlessly integrate into Magpylib. Such classes are referred to as **compounds**. An example of how this is done is shown in {ref}`examples-misc-compound`. +Collections can be subclassed to form dynamic groups that seamlessly integrate +into Magpylib. Such classes are referred to as **compounds**. An example of how +this is done is shown in {ref}`examples-misc-compound`. diff --git a/docs/_pages/user_guide/examples/examples_tutorial_custom.md b/docs/_pages/user_guide/examples/examples_tutorial_custom.md index ea9983b84..b2a63bbaf 100644 --- a/docs/_pages/user_guide/examples/examples_tutorial_custom.md +++ b/docs/_pages/user_guide/examples/examples_tutorial_custom.md @@ -16,7 +16,9 @@ orphan: true # CustomSource -The {ref}`guide-docs-classes-custom-source` class was implemented to offer easy integration of user field implementations into Magpylib's object-oriented interface. +The {ref}`guide-docs-classes-custom-source` class was implemented to offer easy +integration of user field implementations into Magpylib's object-oriented +interface. ```{note} Obviously, any field implementation can be integrated. Specifically, fields where superposition holds and interactions do not disturb the sources (e.g. electric, gravitational, ...) can benefit from Magpylib's position and orientation interface. @@ -24,15 +26,21 @@ Obviously, any field implementation can be integrated. Specifically, fields wher ## Magnetic Monopole -In this example we create a class that represents the elusive magnetic monopole, which would have a magnetic field like this +In this example we create a class that represents the elusive magnetic monopole, +which would have a magnetic field like this $$ {\bf B} = Q_m \frac{{\bf r}}{|{\bf r}|^3}. $$ -Here the monopole lies in the origin of the local coordinates, $Q_m$ is the monopole charge and ${\bf r}$ is the observer position. +Here the monopole lies in the origin of the local coordinates, $Q_m$ is the +monopole charge and ${\bf r}$ is the observer position. -We create this field as a Python function and hand it over to a CustomSource `field_func` argument. The `field_func` input must be a callable with two positional arguments `field` (can be `'B'` or `'H'`) and `observers` (must accept ndarrays of shape (n,3)), and return the respective fields in units of T and A/m in the same shape. +We create this field as a Python function and hand it over to a CustomSource +`field_func` argument. The `field_func` input must be a callable with two +positional arguments `field` (can be `'B'` or `'H'`) and `observers` (must +accept ndarrays of shape (n,3)), and return the respective fields in units of T +and A/m in the same shape. ```{code-cell} ipython3 import numpy as np @@ -71,7 +79,8 @@ print(mono.getB((1, 0, 0))) print(mono.getH((1, 0, 0))) ``` -Multiple of these sources can now be combined, making use of the Magpylib position/orientation interface. +Multiple of these sources can now be combined, making use of the Magpylib +position/orientation interface. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -104,7 +113,8 @@ plt.show() ## Adding a 3D model -While `CustomSource` is graphically represented by a simple marker by default, we can easily add a 3D model as described in {ref}`examples-own-3d-models`. +While `CustomSource` is graphically represented by a simple marker by default, +we can easily add a 3D model as described in {ref}`examples-own-3d-models`. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -127,7 +137,11 @@ magpy.show(mono1, mono2) ## Subclassing CustomSource -In the above example it would be nice to make the `CustomSource` dynamic, so that it would have a property `charge` that can be changed at will, rather than having to redefine the `field_func` and initialize a new object every time. In the following example we show how to sub-class `CustomSource` to achieve this. The problem is reminiscent of {ref}`examples-misc-compound`. +In the above example it would be nice to make the `CustomSource` dynamic, so +that it would have a property `charge` that can be changed at will, rather than +having to redefine the `field_func` and initialize a new object every time. In +the following example we show how to sub-class `CustomSource` to achieve this. +The problem is reminiscent of {ref}`examples-misc-compound`. ```{code-cell} ipython3 import numpy as np @@ -195,7 +209,8 @@ mono.charge = -1 print(mono.getB((1, 0, 0))) ``` -The new class seamlessly integrates into the Magpylib interface as we show in the following example where we have a look at the Quadrupole field. +The new class seamlessly integrates into the Magpylib interface as we show in +the following example where we have a look at the Quadrupole field. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed diff --git a/docs/_pages/user_guide/examples/examples_tutorial_field_computation.md b/docs/_pages/user_guide/examples/examples_tutorial_field_computation.md index 0e54212ee..0c2890f9d 100644 --- a/docs/_pages/user_guide/examples/examples_tutorial_field_computation.md +++ b/docs/_pages/user_guide/examples/examples_tutorial_field_computation.md @@ -18,7 +18,8 @@ orphan: true ## Most basic Example -The v2 slogan was *"The magnetic field is only three lines of code away"*, which is demonstrated by the following most fundamental and self-explanatory example, +The v2 slogan was _"The magnetic field is only three lines of code away"_, which +is demonstrated by the following most fundamental and self-explanatory example, ```{code-cell} ipython3 import magpylib as magpy @@ -30,9 +31,14 @@ print(B) ## Field on a Grid -There are four field computation functions: `getB` will compute the B-field in T. `getH` computes the H-field in A/m. `getJ` computes the magnetic polarization in units of T. `getM` computes the magnetization in units of A/m. +There are four field computation functions: `getB` will compute the B-field in +T. `getH` computes the H-field in A/m. `getJ` computes the magnetic polarization +in units of T. `getM` computes the magnetization in units of A/m. -All these functions will return the field in the shape of the input. In the following example, BHJM-fields of a diametrically magnetized cylinder magnet are computed on a position grid in the symmetry plane and are then displayed using Matplotlib. +All these functions will return the field in the shape of the input. In the +following example, BHJM-fields of a diametrically magnetized cylinder magnet are +computed on a position grid in the symmetry plane and are then displayed using +Matplotlib. ```{code-cell} ipython3 import matplotlib.pyplot as plt @@ -92,9 +98,14 @@ plt.show() ## Using Sensors -The `Sensor` class enables relative positioning of observer grids in the global coordinate system. The observer grid is stored in the `pixel` parameter of the sensor object which is `(0,0,0)` by default (sensor position = observer position). +The `Sensor` class enables relative positioning of observer grids in the global +coordinate system. The observer grid is stored in the `pixel` parameter of the +sensor object which is `(0,0,0)` by default (sensor position = observer +position). -The following example shows a moving and rotating sensor with two pixels. At the same time, the source objects are moving to demonstrate the versatility of the field computation. +The following example shows a moving and rotating sensor with two pixels. At the +same time, the source objects are moving to demonstrate the versatility of the +field computation. ```{code-cell} ipython3 import numpy as np @@ -127,7 +138,10 @@ with magpy.show_context(sensor, coll, animation=True, backend="plotly"): ## Multiple Inputs -When `getBHJM` receive multiple inputs for sources and observers they will compute all possible combinations. It is still beneficial to call the field computation only a single time, because similar sources will be grouped, and the computation will be vectorized automatically. +When `getBHJM` receive multiple inputs for sources and observers they will +compute all possible combinations. It is still beneficial to call the field +computation only a single time, because similar sources will be grouped, and the +computation will be vectorized automatically. ```{code-cell} ipython3 import magpylib as magpy @@ -149,7 +163,8 @@ B = magpy.getB([cube1, cube2, cube3], [sens1, sens2]) B.shape ``` -Select the second cube (first index), the first sensor (second index), pixel 3-4 (index three and four) and the Bz-component of the field (index five) +Select the second cube (first index), the first sensor (second index), pixel 3-4 +(index three and four) and the Bz-component of the field (index five) ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -157,11 +172,14 @@ Select the second cube (first index), the first sensor (second index), pixel 3-4 B[1, 0, 2, 3, 2] ``` -A path will add another index. Every higher pixel dimension will add another index as well. +A path will add another index. Every higher pixel dimension will add another +index as well. ## Field as Pandas Dataframe -Instead of a NumPy `ndarray`, the field computation can also return a [pandas](https://pandas.pydata.org/).[dataframe](https://pandas.pydata.org/docs/user_guide/dsintro.html#dataframe) using the `output='dataframe'` kwarg. +Instead of a NumPy `ndarray`, the field computation can also return a +[pandas](https://pandas.pydata.org/).[dataframe](https://pandas.pydata.org/docs/user_guide/dsintro.html#dataframe) +using the `output='dataframe'` kwarg. ```{code-cell} ipython3 import numpy as np @@ -191,7 +209,9 @@ B = magpy.getB( B ``` -Plotting libraries such as [plotly](https://plotly.com/python/plotly-express/) or [seaborn](https://seaborn.pydata.org/introduction.html) can take advantage of this feature, as they can deal with `dataframes` directly. +Plotting libraries such as [plotly](https://plotly.com/python/plotly-express/) +or [seaborn](https://seaborn.pydata.org/introduction.html) can take advantage of +this feature, as they can deal with `dataframes` directly. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -214,12 +234,15 @@ fig.show() ## Functional Interface -All above computations demonstrate the convenient object-oriented interface of Magpylib. However, there are instances when it is better to work with the functional interface instead. +All above computations demonstrate the convenient object-oriented interface of +Magpylib. However, there are instances when it is better to work with the +functional interface instead. 1. Reduce overhead of Python objects 2. Complex computation instances -In the following example we show how complex instances are computed using the functional interface. +In the following example we show how complex instances are computed using the +functional interface. ```{important} The functional interface will only outperform the object oriented interface if you use NumPy operations for input array creation, such as `tile`, `repeat`, `reshape`, ... ! diff --git a/docs/_pages/user_guide/examples/examples_tutorial_modeling_magnets.md b/docs/_pages/user_guide/examples/examples_tutorial_modeling_magnets.md index fc00f1099..6f8ad96db 100644 --- a/docs/_pages/user_guide/examples/examples_tutorial_modeling_magnets.md +++ b/docs/_pages/user_guide/examples/examples_tutorial_modeling_magnets.md @@ -2,15 +2,34 @@ # Modeling a real magnet -Whenever you wish to compare Magpylib simulations with experimental data obtained using a real permanent magnet, you might wonder how to properly set up a Magpylib magnet object to reflect the physical permanent magnet in question. The goal of this tutorial is to explain how to extract this information from respective datasheets, to provide better understanding of permanent magnets, and show how to align Magpylib simulations with experimental measurements. +Whenever you wish to compare Magpylib simulations with experimental data +obtained using a real permanent magnet, you might wonder how to properly set up +a Magpylib magnet object to reflect the physical permanent magnet in question. +The goal of this tutorial is to explain how to extract this information from +respective datasheets, to provide better understanding of permanent magnets, and +show how to align Magpylib simulations with experimental measurements. -This tutorial was supported by [BOMATEC](https://www.bomatec.com/de) by providing excellent data sheets and by supplying magnets for the experimental demonstration below. +This tutorial was supported by [BOMATEC](https://www.bomatec.com/de) by +providing excellent data sheets and by supplying magnets for the experimental +demonstration below. ## Short summary -In a magnet data sheet, you should find B-H curves and J-H curves. These curves coincide at H=0, which gives the intrinsic material remanence $B_r$. As a result of material response and self-interaction, the magnet "demagnetizes" itself so that the mean magnetic polarization of a real magnet is always below the remanence. How much below depends strongly on the shape of the magnet and is expressed in the data sheet through the permeance coefficient lines (grey lines). The numbers at the end indicate the typical magnet length to diameter ratio (L/D). - -To obtain the correct magnetic polarization of a magnet from the data sheet, one must find the crossing between B-H curve and respective permeance coefficient line. This gives the "working point" which corresponds to the mean demagnetizing H-field inside the magnet. The correct polarization to use in the Magpylib simulation is the J-value at the working point which can be read off from the J-H curve. +In a magnet data sheet, you should find B-H curves and J-H curves. These curves +coincide at H=0, which gives the intrinsic material remanence $B_r$. As a result +of material response and self-interaction, the magnet "demagnetizes" itself so +that the mean magnetic polarization of a real magnet is always below the +remanence. How much below depends strongly on the shape of the magnet and is +expressed in the data sheet through the permeance coefficient lines (grey +lines). The numbers at the end indicate the typical magnet length to diameter +ratio (L/D). + +To obtain the correct magnetic polarization of a magnet from the data sheet, one +must find the crossing between B-H curve and respective permeance coefficient +line. This gives the "working point" which corresponds to the mean demagnetizing +H-field inside the magnet. The correct polarization to use in the Magpylib +simulation is the J-value at the working point which can be read off from the +J-H curve. ![data sheet snippet](../../../_static/images/examples_tutorial_magnet_datasheet2.png) @@ -18,80 +37,158 @@ The following sections provide further explanation on the matter. ## Hysteresis loop -If you've worked with magnetism, chances are very high that you have seen a magnetic hysteresis loop. Hysteresis loops describe the connection between the **mean values** of an externally applied H-field and the resulting B-field, polarization J or magnetization M **within a defined volume**. This connection depends strongly on the size and shape of this volume and what is inside and what is outside. - -The B-H curve is called the "normal loop", while J-H and M-H curves are called "intrinsic loops". Hereon we only make use of the J-H loops, but the discussion is similar for M-H. Normal and intrinsic loops are connected via $B = \mu_0 H + J$. In free space the B-H connection is just a straight line defined via $B = \mu_0 H$. When the whole space is filled with magnetic material you will see something like this within an arbitrary volume: - -::::{grid} 2 -:::{grid-item} -:columns: 3 -::: -:::{grid-item} -:columns: 6 +If you've worked with magnetism, chances are very high that you have seen a +magnetic hysteresis loop. Hysteresis loops describe the connection between the +**mean values** of an externally applied H-field and the resulting B-field, +polarization J or magnetization M **within a defined volume**. This connection +depends strongly on the size and shape of this volume and what is inside and +what is outside. + +The B-H curve is called the "normal loop", while J-H and M-H curves are called +"intrinsic loops". Hereon we only make use of the J-H loops, but the discussion +is similar for M-H. Normal and intrinsic loops are connected via +$B = \mu_0 H + J$. In free space the B-H connection is just a straight line +defined via $B = \mu_0 H$. When the whole space is filled with magnetic material +you will see something like this within an arbitrary volume: + +::::{grid} 2 :::{grid-item} :columns: 3 ::: :::{grid-item} :columns: 6 ![hysteresis loops](../../../_static/images/examples_tutorial_magnet_hysteresis.png) -::: -:::: - -**1st quadrant**: Initially we have $J=0$ and $H=0$. The magnetic material is not magnetized, and no external H-field is applied. When increasing the H-field, the material polarization will follow the "virgin curve" and will increase until it reaches its maximum possible value, the saturation polarization $J_S$. Higher values of $H$ will not affect $J$, while $B$ will keep increasing linearly. Now we are on the "major loop" - we will never return to the virgin curve. After reaching a large H-value we slowly turn the H-field off. As it drops to zero the material will retain its strong polarization at saturation level while the resulting $B$ decreases. At $H = 0$ the B-field then approaches the "remanence field" $B_r$, and its only contribution is $J_S$. - -**2nd quadrant**: Now the H-field becomes negative. Its amplitude increases but it is oriented opposite to the initial direction. Therefore, it is also opposite to the magnetic polarization. In the 2nd quadrant we are now trying to actively demagnetize the material. This part of the hysteresis loop is often referred to as the "demagnetization curve". With increasing negative H, the B-field continues to become smaller until it reaches zero at the "coercive field" $H_c$. At this point the net B-field inside the volume is zero, however, the material is still magnetized! In the example loop above, the polarization at $H_c$ is still at the $J_S$ level. By increasing the H-field further, a point will be reached where the material will start to demagnetize. This can be seen by the non-linear drop of $J$. The point where $J$ reaches zero is called the "intrinsic coercive field" $H_{ci}$. At this point the net polarization in the observed volume is zero. The material is demagnetized. The intrinsic coercive field is a measure of how well a magnetized material can resist a demagnetizing field. Having large values of $H_{ci}$ is a property of "hard magnets", as they can keep their magnetization $J$ even for strong external fields in the opposite direction. - -**3rd and 4th quadrants**: Moving to the third quadrant the behavior is now mirrored. As $H$ increases past $H_{ci}$, polarization quickly aligns with the external field and the material becomes saturated $J=-J_S$. By turning the field around again, we move through the fourth quadrant to complete the hysteresis loop. - -Hysteresis in magnetism as presented here is a macroscopic model that is the result of a complex interplay between dipole and exchange interaction, material texture and resulting domain formation at a microscopic level. Details can be found, for example, in Aharoni's classical textbook "Introduction to the Theory of Ferromagnetism". +::: :::: + +**1st quadrant**: Initially we have $J=0$ and $H=0$. The magnetic material is +not magnetized, and no external H-field is applied. When increasing the H-field, +the material polarization will follow the "virgin curve" and will increase until +it reaches its maximum possible value, the saturation polarization $J_S$. Higher +values of $H$ will not affect $J$, while $B$ will keep increasing linearly. Now +we are on the "major loop" - we will never return to the virgin curve. After +reaching a large H-value we slowly turn the H-field off. As it drops to zero the +material will retain its strong polarization at saturation level while the +resulting $B$ decreases. At $H = 0$ the B-field then approaches the "remanence +field" $B_r$, and its only contribution is $J_S$. + +**2nd quadrant**: Now the H-field becomes negative. Its amplitude increases but +it is oriented opposite to the initial direction. Therefore, it is also opposite +to the magnetic polarization. In the 2nd quadrant we are now trying to actively +demagnetize the material. This part of the hysteresis loop is often referred to +as the "demagnetization curve". With increasing negative H, the B-field +continues to become smaller until it reaches zero at the "coercive field" $H_c$. +At this point the net B-field inside the volume is zero, however, the material +is still magnetized! In the example loop above, the polarization at $H_c$ is +still at the $J_S$ level. By increasing the H-field further, a point will be +reached where the material will start to demagnetize. This can be seen by the +non-linear drop of $J$. The point where $J$ reaches zero is called the +"intrinsic coercive field" $H_{ci}$. At this point the net polarization in the +observed volume is zero. The material is demagnetized. The intrinsic coercive +field is a measure of how well a magnetized material can resist a demagnetizing +field. Having large values of $H_{ci}$ is a property of "hard magnets", as they +can keep their magnetization $J$ even for strong external fields in the opposite +direction. + +**3rd and 4th quadrants**: Moving to the third quadrant the behavior is now +mirrored. As $H$ increases past $H_{ci}$, polarization quickly aligns with the +external field and the material becomes saturated $J=-J_S$. By turning the field +around again, we move through the fourth quadrant to complete the hysteresis +loop. + +Hysteresis in magnetism as presented here is a macroscopic model that is the +result of a complex interplay between dipole and exchange interaction, material +texture and resulting domain formation at a microscopic level. Details can be +found, for example, in Aharoni's classical textbook "Introduction to the Theory +of Ferromagnetism". ## The demagnetizing field -If in an application the applied external H-field is zero, it seems intuitive to use the remanence $B_r$ for the magnetic polarization in the Magpylib simulation. It is a value that you will find in the data sheet. +If in an application the applied external H-field is zero, it seems intuitive to +use the remanence $B_r$ for the magnetic polarization in the Magpylib +simulation. It is a value that you will find in the data sheet. ![data sheet snippet](../../../_static/images/examples_tutorial_magnet_table.png) -However, if considering $J=B_r$, you will quickly see that the experimental results are up to ~30 % below of what you would expect. The reason for this is the self-induced demagnetizing field of the magnet which is generated by the magnetic polarization itself. Just like $J$ generates an H-field on the outside of the magnet, it also generates an H-field inside the magnet, along the opposite direction of the polarization. The H-field outside the magnet is known as the stray field, and the H-field inside the magnet is called the demagnetizing field (as it opposes the magnetic polarization). This is demonstrated by the following figure: +However, if considering $J=B_r$, you will quickly see that the experimental +results are up to ~30 % below of what you would expect. The reason for this is +the self-induced demagnetizing field of the magnet which is generated by the +magnetic polarization itself. Just like $J$ generates an H-field on the outside +of the magnet, it also generates an H-field inside the magnet, along the +opposite direction of the polarization. The H-field outside the magnet is known +as the stray field, and the H-field inside the magnet is called the +demagnetizing field (as it opposes the magnetic polarization). This is +demonstrated by the following figure: ![demagnetization field simulation](../../../_static/images/examples_tutorial_magnet_fieldcomparison.png) -Making use of the [streamplot example](examples-vis-mpl-streamplot), on the left side we show the cross-section of a Cuboid magnet and its homogeneous polarization. And on the right, we see the H-field generated by it. Inside the magnet the generated H-field opposes the polarization. As a result, the polarization of a magnet will not be $B_r$, but instead will be some value of $J$ in the 2nd quadrant of the J-H loop that corresponds to the mean H-field inside the magnet. This H-value is often referred to as the "working point". +Making use of the [streamplot example](examples-vis-mpl-streamplot), on the left +side we show the cross-section of a Cuboid magnet and its homogeneous +polarization. And on the right, we see the H-field generated by it. Inside the +magnet the generated H-field opposes the polarization. As a result, the +polarization of a magnet will not be $B_r$, but instead will be some value of +$J$ in the 2nd quadrant of the J-H loop that corresponds to the mean H-field +inside the magnet. This H-value is often referred to as the "working point". ## Finding the correct polarization -As explained above, the hysteresis loop depends strongly on the chosen observation volume geometry, the material inside, and what is outside of the volume. Magnet manufacturers provide such loops (usually only the 2nd quadrant) for their magnets, meaning that the observation volume is the whole magnet with air outside. +As explained above, the hysteresis loop depends strongly on the chosen +observation volume geometry, the material inside, and what is outside of the +volume. Magnet manufacturers provide such loops (usually only the 2nd quadrant) +for their magnets, meaning that the observation volume is the whole magnet with +air outside. -To obtain the correct mean polarization of a magnet we simply must compute the mean demagnetizing field (= working point) and read the resulting $J$ off the provided J-H loop. Computing the mean demagnetizing field, however, is not a simple task. In addition to the material response (permeability), it depends strongly on the magnet geometry. Fortunately, the working points can be read off from well written data sheets. +To obtain the correct mean polarization of a magnet we simply must compute the +mean demagnetizing field (= working point) and read the resulting $J$ off the +provided J-H loop. Computing the mean demagnetizing field, however, is not a +simple task. In addition to the material response (permeability), it depends +strongly on the magnet geometry. Fortunately, the working points can be read off +from well written data sheets. ![data sheet snippet](../../../_static/images/examples_tutorial_magnet_datasheet.png) -This datasheet snippet shows the second quadrant of the B-H and J-H loops, even for two different temperatures. The working point is given by the intersection between the "permeance coefficient" lines (gray) and the B-H curve. The number at the end of these lines indicate the length to diameter ratio (L/D) of the magnet, which is the critical geometric factor. Different lines are for different L/D values, which allows one to select the correct working point for different magnets made from this specific material. Once the working point is found, the correct magnetic polarization, here denoted by $J_W$ (the magnetic polarization at the working point), can be read off. The following figure exemplifies the changes in $J_W$ for different L/D values, considering a cylinder magnet: +This datasheet snippet shows the second quadrant of the B-H and J-H loops, even +for two different temperatures. The working point is given by the intersection +between the "permeance coefficient" lines (gray) and the B-H curve. The number +at the end of these lines indicate the length to diameter ratio (L/D) of the +magnet, which is the critical geometric factor. Different lines are for +different L/D values, which allows one to select the correct working point for +different magnets made from this specific material. Once the working point is +found, the correct magnetic polarization, here denoted by $J_W$ (the magnetic +polarization at the working point), can be read off. The following figure +exemplifies the changes in $J_W$ for different L/D values, considering a +cylinder magnet: ![finding the working point](../../../_static/images/examples_tutorial_magnet_LDratio.png) -Permanent magnets with different geometries, such as a parallelepiped shape, will have different behavior in terms of L/D values. Make sure you are reading the data from the correct part number. +Permanent magnets with different geometries, such as a parallelepiped shape, +will have different behavior in terms of L/D values. Make sure you are reading +the data from the correct part number. + ## Warning -Keep in mind that there are still many reasons why your simulation might not fit well to your experiment. Here are some of the most common problems: +Keep in mind that there are still many reasons why your simulation might not fit +well to your experiment. Here are some of the most common problems: -1. Small position errors of less than 100 um can have a large impact on the measurement result. The reference should be the sensitive element inside a sensor package. These elements can be displaced by 10-100 um and even rotated by a few degrees. The sensor might also not be well calibrated. -2. There are external stray fields, like the earth magnetic field, that influence the measurements. Those might also come from other nearby electronic equipment or magnetic parts. +1. Small position errors of less than 100 um can have a large impact on the + measurement result. The reference should be the sensitive element inside a + sensor package. These elements can be displaced by 10-100 um and even rotated + by a few degrees. The sensor might also not be well calibrated. +2. There are external stray fields, like the earth magnetic field, that + influence the measurements. Those might also come from other nearby + electronic equipment or magnetic parts. 3. Off-the-shelf magnets often do not hold what is promised in the datasheet - - Magnetic polarization amplitude can be off by 5-10 %. - - The direction of polarization often varies by up to a few degrees. - - Worst-case: the polarization can be inhomogeneous which is often a problem in injection-mold magnets. + - Magnetic polarization amplitude can be off by 5-10 %. + - The direction of polarization often varies by up to a few degrees. + - Worst-case: the polarization can be inhomogeneous which is often a problem + in injection-mold magnets. ## Example -::::{grid} 2 -:::{grid-item} -:columns: 3 -::: -:::{grid-item} -:columns: 6 -![](../../../_static/images/examples_icon_WIP.png) -::: -:::: +::::{grid} 2 :::{grid-item} :columns: 3 ::: :::{grid-item} :columns: 6 +![](../../../_static/images/examples_icon_WIP.png) ::: :::: coming soon: + 1. Magpylib simulation code 2. Experimental data 3. Comparison and discussion -**Exterior reference** -G. Martinek, S. Ruoho and U. Wyss. (2021). *Magnetic Properties of Permanents Magnets & Measuring Techniques* [White paper]. Arnold Magnetic Technologies. https://www.arnoldmagnetics.com/blog/measuring-permanent-magnets-white-paper/ \ No newline at end of file +**Exterior reference** G. Martinek, S. Ruoho and U. Wyss. (2021). _Magnetic +Properties of Permanents Magnets & Measuring Techniques_ [White paper]. Arnold +Magnetic Technologies. +https://www.arnoldmagnetics.com/blog/measuring-permanent-magnets-white-paper/ diff --git a/docs/_pages/user_guide/examples/examples_tutorial_paths.md b/docs/_pages/user_guide/examples/examples_tutorial_paths.md index 0da674d36..952b13528 100644 --- a/docs/_pages/user_guide/examples/examples_tutorial_paths.md +++ b/docs/_pages/user_guide/examples/examples_tutorial_paths.md @@ -16,7 +16,10 @@ orphan: true # Working with Paths -The position and orientation attributes are key elements of Magpylib. The documentation section {ref}`docs-position` describes how they work in detail. Wile these definitions can seem abstract, the interface was constructed as intuitively as possible which is demonstrated in this tutorial. +The position and orientation attributes are key elements of Magpylib. The +documentation section {ref}`docs-position` describes how they work in detail. +Wile these definitions can seem abstract, the interface was constructed as +intuitively as possible which is demonstrated in this tutorial. ```{important} Always make use of paths when computing with multiple Magpylib object position and orientation instances. This enables vectorized computation. Avoid Python loops at all costs! @@ -26,7 +29,8 @@ In this tutorial we show some good practice examples. ## Assigning Absolute Paths -Absolute object paths are assigned at initialization or through the object properties. +Absolute object paths are assigned at initialization or through the object +properties. ```{code-cell} ipython3 import numpy as np @@ -52,7 +56,8 @@ magpy.show(sensor, cube, animation=True, backend="plotly") ## Relative Paths -`move` and `rotate` input is interpreted relative to the existing path. When the input is scalar the whole existing path is moved. +`move` and `rotate` input is interpreted relative to the existing path. When the +input is scalar the whole existing path is moved. ```{code-cell} ipython3 import numpy as np @@ -102,7 +107,11 @@ sphere.show() ## Merging paths -Complex paths can be created by merging multiple path operations. This is done with vector input for the `move` and `rotate` methods and choosing values for `start` that will make the paths overlap. In the following example we combine a linear path with a rotation about self (`anchor=None`) until path index 30. Thereon, a second rotation about the origin is applied, creating a spiral. +Complex paths can be created by merging multiple path operations. This is done +with vector input for the `move` and `rotate` methods and choosing values for +`start` that will make the paths overlap. In the following example we combine a +linear path with a rotation about self (`anchor=None`) until path index 30. +Thereon, a second rotation about the origin is applied, creating a spiral. ```{code-cell} ipython3 import numpy as np @@ -124,7 +133,8 @@ cube.show(backend="plotly", animation=True) ## Reset path -The `reset_path()` method allows users to reset an object path to `position=(0,0,0)` and `orientation=None`. +The `reset_path()` method allows users to reset an object path to +`position=(0,0,0)` and `orientation=None`. ```{code-cell} ipython3 import magpylib as magpy @@ -142,13 +152,22 @@ print(sensor.orientation.as_quat()) ``` (examples-tutorial-paths-edge-padding-end-slicing)= + ## Edge-padding and end-slicing -Magpylib will always make sure that object paths are in the right format, i.e., `position` and `orientation` attributes are of the same length. In addition, when objects with different path lengths are combined, e.g., when computing the field, the shorter paths are treated as static beyond their end to make the computation sensible. Internally, Magpylib follows a philosophy of edge-padding and end-slicing when adjusting paths. +Magpylib will always make sure that object paths are in the right format, i.e., +`position` and `orientation` attributes are of the same length. In addition, +when objects with different path lengths are combined, e.g., when computing the +field, the shorter paths are treated as static beyond their end to make the +computation sensible. Internally, Magpylib follows a philosophy of edge-padding +and end-slicing when adjusting paths. -The idea behind **edge-padding** is that, whenever path entries beyond the existing path length are needed, the edge-entries of the existing path are returned. This means that the object is static beyond its existing path. +The idea behind **edge-padding** is that, whenever path entries beyond the +existing path length are needed, the edge-entries of the existing path are +returned. This means that the object is static beyond its existing path. -In the following example the orientation attribute is padded by its edge value `(0,0,.2)` as the position attribute length is increased. +In the following example the orientation attribute is padded by its edge value +`(0,0,.2)` as the position attribute length is increased. ```{code-cell} ipython3 from scipy.spatial.transform import Rotation as R @@ -163,7 +182,9 @@ print(sensor.position) print(sensor.orientation.as_rotvec()) ``` -When the field is computed of `loop1` with path length 4 and `loop2` with path length 2, `loop2` will remain in position (= edge padding) while the other object is still in motion. +When the field is computed of `loop1` with path length 4 and `loop2` with path +length 2, `loop2` will remain in position (= edge padding) while the other +object is still in motion. ```{code-cell} ipython3 from magpylib.current import Circle @@ -175,7 +196,11 @@ B = magpy.getB([loop1, loop2], (0, 0, 0)) print(B) ``` -The idea behind **end-slicing** is that, whenever a path is automatically reduced in length, Magpylib will slice to keep the ending of the path. While this occurs rarely, the following example shows how the `orientation` attribute is automatically end-sliced, keeping the values `[(0,0,.3), (0,0,.4)]`, when the `position` attribute is reduced in length: +The idea behind **end-slicing** is that, whenever a path is automatically +reduced in length, Magpylib will slice to keep the ending of the path. While +this occurs rarely, the following example shows how the `orientation` attribute +is automatically end-sliced, keeping the values `[(0,0,.3), (0,0,.4)]`, when the +`position` attribute is reduced in length: ```{code-cell} ipython3 from scipy.spatial.transform import Rotation as R diff --git a/docs/_pages/user_guide/examples/examples_vis_animations.md b/docs/_pages/user_guide/examples/examples_vis_animations.md index 87c560685..b43333515 100644 --- a/docs/_pages/user_guide/examples/examples_vis_animations.md +++ b/docs/_pages/user_guide/examples/examples_vis_animations.md @@ -16,7 +16,8 @@ orphan: true # Animations -Magpylib can display the motion of objects along paths in the form of animations. +Magpylib can display the motion of objects along paths in the form of +animations. ```{hint} 1. Animations work best with the [plotly backend](guide-graphic-backends). @@ -26,11 +27,13 @@ Magpylib can display the motion of objects along paths in the form of animations 3. Avoid rendering too many frames. ``` -Detailed information about how to tune animations can be found in the [graphics documentation](guide-graphic-animations). +Detailed information about how to tune animations can be found in the +[graphics documentation](guide-graphic-animations). ## Simple Animations -Animations are created with `show` by setting `animation=True`. It is also possible to hand over the animation time with this parameter. +Animations are created with `show` by setting `animation=True`. It is also +possible to hand over the animation time with this parameter. ```{code-cell} ipython3 import magpylib as magpy @@ -60,7 +63,10 @@ magpy.show(sensor, magnet, animation=True, backend="plotly") ## Animated Subplots -[Subplots](examples-vis-subplots) are a powerful tool to see the field along a path while viewing the 3D models at the same time. This is specifically illustrative as an animation where the field at the respective path position is indicated by a marker. +[Subplots](examples-vis-subplots) are a powerful tool to see the field along a +path while viewing the 3D models at the same time. This is specifically +illustrative as an animation where the field at the respective path position is +indicated by a marker. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -73,7 +79,8 @@ magpy.show( ) ``` -It is also possible to use the [show_context](guide-graphics-show_context) context manager. +It is also possible to use the [show_context](guide-graphics-show_context) +context manager. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -89,20 +96,24 @@ with magpy.show_context([magnet, sensor], backend="plotly", animation=True) as s ## Exporting Animations -Animations are wonderful but can be quite difficult to export when they are needed, for example, in a presentation. Here we show how to creat and export animations using the *.gif format. +Animations are wonderful but can be quite difficult to export when they are +needed, for example, in a presentation. Here we show how to creat and export +animations using the \*.gif format. ### Built-in export -The easiest way to export an animation is via the Magpylib built-in command `animation_output` in the `show` function. It works only with the Pyvista backend. The following code will create a file "test4.gif". +The easiest way to export an animation is via the Magpylib built-in command +`animation_output` in the `show` function. It works only with the Pyvista +backend. The following code will create a file "test4.gif". ```python import magpylib as magpy import numpy as np # Create magnets with Paths -path = [(np.sin(t)+1.5,0,0) for t in np.linspace(0, 2*np.pi, 30)] -cube1 = magpy.magnet.Cuboid(dimension=(1,1,1), polarization=(1,0,0), position= path) -cube2 = cube1.copy(position=-np.array(path), polarization=(-1,0,0)) +path = [(np.sin(t) + 1.5, 0, 0) for t in np.linspace(0, 2 * np.pi, 30)] +cube1 = magpy.magnet.Cuboid(dimension=(1, 1, 1), polarization=(1, 0, 0), position=path) +cube2 = cube1.copy(position=-np.array(path), polarization=(-1, 0, 0)) # Store gif with animation_output using Pyvista magpy.show( @@ -120,13 +131,17 @@ magpy.show( ### Custom export Pyvista -For customizing videos it is best to work directly in the respective graphic backends. Here we show how to transfer the Magpylib graphic objects to a Pyvista plotter, customize the plotting scene, export screen shots, and combine them in a *.gif. The following example also shows how to achieve transparency. +For customizing videos it is best to work directly in the respective graphic +backends. Here we show how to transfer the Magpylib graphic objects to a Pyvista +plotter, customize the plotting scene, export screen shots, and combine them in +a \*.gif. The following example also shows how to achieve transparency. ```python import magpylib as magpy import pyvista as pv from PIL import Image + def create_gif(images, frame_time, output_file): """Create a GIF from images""" frames = [Image.fromarray(img) for img in images] @@ -143,12 +158,12 @@ def create_gif(images, frame_time, output_file): def init_plotter(): - """ Init Pyvista plotter with custom scene layout""" + """Init Pyvista plotter with custom scene layout""" pl = pv.Plotter(notebook=False, off_screen=True, window_size=[300, 300]) pl.camera_position = [ (5, 5, 5), # Position of the camera (0, 0, 0), # Focal point (what the camera is looking at) - (0, 0, 1) # View up direction + (0, 0, 1), # View up direction ] pl.camera.zoom(0.5) pl.set_background("k") # For better transparency @@ -157,18 +172,22 @@ def init_plotter(): def create_frames(frames): """Create frames with Pyvista.""" - + # Create Magpylib objects - mag1 = magpy.magnet.CylinderSegment(dimension=(3, 4, 1, 0, 45), polarization=(0, 0, 1)) - mag2 = magpy.magnet.CylinderSegment(dimension=(2, 3, 1, 0, 45), polarization=(0, 0, -1)) + mag1 = magpy.magnet.CylinderSegment( + dimension=(3, 4, 1, 0, 45), polarization=(0, 0, 1) + ) + mag2 = magpy.magnet.CylinderSegment( + dimension=(2, 3, 1, 0, 45), polarization=(0, 0, -1) + ) images = [] pl = init_plotter() for i in range(frames): - + # Modify object positions - mag1.rotate_from_angax(360 / frames, axis='z') - mag2.rotate_from_angax(-360 / frames, axis='z') + mag1.rotate_from_angax(360 / frames, axis="z") + mag2.rotate_from_angax(-360 / frames, axis="z") # Transfer Magpylib objects to Pyvista plotter pl.clear() @@ -201,7 +220,11 @@ if __name__ == "__main__": -Notice that when providing a canvas, no update to its layout is performed by Magpylib, unless explicitly specified by setting `canvas_update=True` in `show()`. By default `canvas_update="auto"` only updates the canvas if is not provided by the user. Details can be found in the [graphics documentation](guide-graphics-canvas). +Notice that when providing a canvas, no update to its layout is performed by +Magpylib, unless explicitly specified by setting `canvas_update=True` in +`show()`. By default `canvas_update="auto"` only updates the canvas if is not +provided by the user. Details can be found in the +[graphics documentation](guide-graphics-canvas). ### Custom export Plotly @@ -231,9 +254,13 @@ def create_frames(frames): """Create frames with Pyvista.""" # Create Magpylib objects - mag1 = magpy.magnet.CylinderSegment(dimension=(3, 4, 1, 0, 45), polarization=(0, 0, 1)) - mag2 = magpy.magnet.CylinderSegment(dimension=(2, 3, 1, 0, 45), polarization=(0, 0, -1)) - + mag1 = magpy.magnet.CylinderSegment( + dimension=(3, 4, 1, 0, 45), polarization=(0, 0, 1) + ) + mag2 = magpy.magnet.CylinderSegment( + dimension=(2, 3, 1, 0, 45), polarization=(0, 0, -1) + ) + images = [] for i in range(frames): # Set object position diff --git a/docs/_pages/user_guide/examples/examples_vis_magnet_colors.md b/docs/_pages/user_guide/examples/examples_vis_magnet_colors.md index bf0218a58..5b833f569 100644 --- a/docs/_pages/user_guide/examples/examples_vis_magnet_colors.md +++ b/docs/_pages/user_guide/examples/examples_vis_magnet_colors.md @@ -13,19 +13,26 @@ kernelspec: --- (examples-vis-magnet-colors)= + # Magnet colors -The polarization direction of a permanent magnet is often graphically displayed with the help of colors. However, there is no unified color scheme that everyone agrees on. The following image shows some color-examples from the web. +The polarization direction of a permanent magnet is often graphically displayed +with the help of colors. However, there is no unified color scheme that everyone +agrees on. The following image shows some color-examples from the web. ![](../../../_static/images/examples_vis_magnet_colors.png) -Magpylib uses the DIN Specification 91411 (soon 91479) standard as default setting. The tri-color scheme has the advantage that for multi-pole elements it becomes clear which north is "connected" to which south. +Magpylib uses the DIN Specification 91411 (soon 91479) standard as default +setting. The tri-color scheme has the advantage that for multi-pole elements it +becomes clear which north is "connected" to which south. ```{hint} The color schemes often seem to represent homogeneous polarizations, referred to as "ideal typical" magnets in DIN Specification 91479. However, they often just represent general "pole patterns", i.e. rough sketches where the field goes in and where it comes out, that are not the result of homogeneous polarizations. On this topic review also the examples example {ref}`examples-misc-inhom`, and the tutorial {ref}`examples-tutorial-modeling-magnets`. ``` -With Magpylib users can easily tune the magnet color schemes. The `style` options are `tricolor` with north, middle and south colors, and `bicolor` with north and south colors. +With Magpylib users can easily tune the magnet color schemes. The `style` +options are `tricolor` with north, middle and south colors, and `bicolor` with +north and south colors. ```{code-cell} ipython import magpylib as magpy @@ -68,4 +75,5 @@ cyl.style.magnetization.color.south = "orange" magpy.show(sphere, cube, cyl, backend='plotly', style_legend_show=False) ``` -More information about styles and how to apply them is given in the user-guide [style section](guide-graphic-styles). +More information about styles and how to apply them is given in the user-guide +[style section](guide-graphic-styles). diff --git a/docs/_pages/user_guide/examples/examples_vis_mpl_streamplot.md b/docs/_pages/user_guide/examples/examples_vis_mpl_streamplot.md index 223a214a6..f37416f2f 100644 --- a/docs/_pages/user_guide/examples/examples_vis_mpl_streamplot.md +++ b/docs/_pages/user_guide/examples/examples_vis_mpl_streamplot.md @@ -18,9 +18,19 @@ orphan: true ## Example 1: Cuboid Magnet -In this example we show the B-field of a cuboid magnet using Matplotlib streamlines. Streamlines are not magnetic field lines in the sense that the field amplitude cannot be derived from their density. However, Matplotlib streamlines can show the field amplitude via color and line thickness. One must be careful that streamlines can only display two components of the field. In the following example the third field component is always zero - but this is generally not the case. - -In the example we make use of the [scaling property](guide-docs-io-scale-invariance). We assume that all length inputs are in units of mm, and that the polarization input is in units of millitesla. The resulting `getB` output will also be in millitesla. One must be careful with scaling - the conversion to H would ofc give units of mA/m. +In this example we show the B-field of a cuboid magnet using Matplotlib +streamlines. Streamlines are not magnetic field lines in the sense that the +field amplitude cannot be derived from their density. However, Matplotlib +streamlines can show the field amplitude via color and line thickness. One must +be careful that streamlines can only display two components of the field. In the +following example the third field component is always zero - but this is +generally not the case. + +In the example we make use of the +[scaling property](guide-docs-io-scale-invariance). We assume that all length +inputs are in units of mm, and that the polarization input is in units of +millitesla. The resulting `getB` output will also be in millitesla. One must be +careful with scaling - the conversion to H would ofc give units of mA/m. ```{code-cell} ipython3 import matplotlib.pyplot as plt @@ -81,7 +91,9 @@ Be aware that the above code is not very performant, but quite readable. The fol ## Example 2 - Hollow Cylinder Magnet -A nice visualization is achieved by combining `streamplot` with `contourf`. In this example we show the B-field of a hollow Cylinder magnet with diametral polarization in the xy-symmetry plane. +A nice visualization is achieved by combining `streamplot` with `contourf`. In +this example we show the B-field of a hollow Cylinder magnet with diametral +polarization in the xy-symmetry plane. ```{code-cell} ipython3 import matplotlib.pyplot as plt diff --git a/docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md b/docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md index 8fc2fd30a..807d21be9 100644 --- a/docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md +++ b/docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md @@ -16,7 +16,9 @@ orphan: true # Pyvista 3D field lines -Pyvista offers field-line computation and visualization in 3D. In addition to the field computation, Magpylib offers magnet visualization that seamlessly integrates into a Pyvista plotting scene. +Pyvista offers field-line computation and visualization in 3D. In addition to +the field computation, Magpylib offers magnet visualization that seamlessly +integrates into a Pyvista plotting scene. ```{code-cell} ipython3 import magpylib as magpy @@ -70,4 +72,4 @@ pl.add_mesh( # Prepare and show scene pl.camera.position = (0.03, 0.03, 0.03) pl.show() -``` \ No newline at end of file +``` diff --git a/docs/_pages/user_guide/examples/examples_vis_subplots.md b/docs/_pages/user_guide/examples/examples_vis_subplots.md index 9f926ed03..caeaefdcc 100644 --- a/docs/_pages/user_guide/examples/examples_vis_subplots.md +++ b/docs/_pages/user_guide/examples/examples_vis_subplots.md @@ -16,7 +16,9 @@ kernelspec: # Subplots -It is very illustrative to combine 2D and 3D subplots when viewing the field along paths. Consider the following system of a sensor and a magnet, both endowed with paths. +It is very illustrative to combine 2D and 3D subplots when viewing the field +along paths. Consider the following system of a sensor and a magnet, both +endowed with paths. ```{code-cell} ipython3 import numpy as np @@ -37,11 +39,14 @@ sens = magpy.Sensor( ) ``` -In the following, we demonstrate various ways how to generate 2D/3D subplot combinations for this system. +In the following, we demonstrate various ways how to generate 2D/3D subplot +combinations for this system. # Plotting canvas with own figure -Customization is best done by adding the [Magpylib 3D-model](guide-graphics-show) to your own figure using the `canvas` kwarg. +Customization is best done by adding the +[Magpylib 3D-model](guide-graphics-show) to your own figure using the `canvas` +kwarg. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -61,12 +66,16 @@ magpy.show(sens, cyl, canvas=ax2) plt.show() ``` -How to add and modify subplots in all three supported backends is demonstrated in the [canvas documentation](guide-graphics-canvas). It is also possible to customize the Magpylib 3D output by returning and editing the respective canvas using the `return_fig` kwarg, see [return figures](guide-graphics-return_fig). - +How to add and modify subplots in all three supported backends is demonstrated +in the [canvas documentation](guide-graphics-canvas). It is also possible to +customize the Magpylib 3D output by returning and editing the respective canvas +using the `return_fig` kwarg, see [return figures](guide-graphics-return_fig). # Built-in subplots -For maximal efficiency, Magpylib offers auto-generated subplots of 3D models and the field along paths by providing the `show` function with proper input dictionaries. +For maximal efficiency, Magpylib offers auto-generated subplots of 3D models and +the field along paths by providing the `show` function with proper input +dictionaries. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -78,11 +87,13 @@ magpy.show( ) ``` -Detailed information on built-in subplots is provided in the [user guide](guide-graphics-subplots). +Detailed information on built-in subplots is provided in the +[user guide](guide-graphics-subplots). # show_context -With a built-in context manager this functionality can be accessed with maximal ease +With a built-in context manager this functionality can be accessed with maximal +ease ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed diff --git a/docs/_pages/user_guide/guide_index.md b/docs/_pages/user_guide/guide_index.md index a63482e3d..62769d139 100644 --- a/docs/_pages/user_guide/guide_index.md +++ b/docs/_pages/user_guide/guide_index.md @@ -1,7 +1,9 @@ (guide-index)= + # User Guide -The user guide provides detailed descriptions of the Magpylib API with many interactive examples to help users along the way. +The user guide provides detailed descriptions of the Magpylib API with many +interactive examples to help users along the way. ```{toctree} :maxdepth: 2 diff --git a/docs/_pages/user_guide/guide_resources_01_physics.md b/docs/_pages/user_guide/guide_resources_01_physics.md index 9c0b2821a..0c412c405 100644 --- a/docs/_pages/user_guide/guide_resources_01_physics.md +++ b/docs/_pages/user_guide/guide_resources_01_physics.md @@ -1,13 +1,23 @@ (guide-ressources-physics)= + # Physics and Computation ## What is implemented ? -The expressions used in Magpylib describe perfectly homogeneous magnets, surface charges, and line currents with natural boundary conditions. Magpylib is at its best when dealing with static air-coils (no eddy currents, no soft-magnetic cores) and high-grade permanent magnets (Ferrite, NdFeB, SmCo or similar materials). When **magnet** permeabilities are below $\mu_r < 1.1$ the error typically undercuts few %. Demagnetization factors are not included. The line **current** solutions give the exact same field as outside of a wire that carries a homogeneous current. +The expressions used in Magpylib describe perfectly homogeneous magnets, surface +charges, and line currents with natural boundary conditions. Magpylib is at its +best when dealing with static air-coils (no eddy currents, no soft-magnetic +cores) and high-grade permanent magnets (Ferrite, NdFeB, SmCo or similar +materials). When **magnet** permeabilities are below $\mu_r < 1.1$ the error +typically undercuts few %. Demagnetization factors are not included. The line +**current** solutions give the exact same field as outside of a wire that +carries a homogeneous current. ## The analytical solutions -Magnetic field computations in Magpylib are based on known analytical solutions (closed form expressions) to permanent magnet and current problems. The Magpylib implementations are based on the following literature references: +Magnetic field computations in Magpylib are based on known analytical solutions +(closed form expressions) to permanent magnet and current problems. The Magpylib +implementations are based on the following literature references: - Field of cuboid magnets [^1] [^2] [^3] [^4] - Field of cylindrical magnets: [^5] [^6] [^7] [^8] @@ -15,109 +25,218 @@ Magnetic field computations in Magpylib are based on known analytical solutions - Field of the current loop: [^12] - all others derived by hand -A short reflection on how these formulas can be achieved: In magnetostatics the magnetic field becomes conservative (Maxwell: $\nabla \times {\bf H} = 0$) and can thus be expressed through the magnetic scalar potential $\Phi_m$: +A short reflection on how these formulas can be achieved: In magnetostatics the +magnetic field becomes conservative (Maxwell: $\nabla \times {\bf H} = 0$) and +can thus be expressed through the magnetic scalar potential $\Phi_m$: $$ {\bf H} = -\nabla\cdot\Phi_m $$ -The solution to this equation can be expressed by an integral over the magnetization distribution ${\bf M}({\bf r})$ as +The solution to this equation can be expressed by an integral over the +magnetization distribution ${\bf M}({\bf r})$ as $$ \Phi_m({\bf r}) = \frac{1}{4\pi}\int_{V'}\frac{\nabla'\cdot {\bf M}({\bf r}')}{|{\bf r}-{\bf r}'|}dV'+\frac{1}{4\pi}\oint_{S'}\frac{{\bf n}'\cdot {\bf M}({\bf r}')}{|{\bf r}-{\bf r}'|}dS' $$ -where ${\bf r}$ denotes the position, $V$ is the magnetized volume with surface $S$ and normal vector ${\bf n}$ onto the surface. This solution is derived in detail e.g. in [^13]. +where ${\bf r}$ denotes the position, $V$ is the magnetized volume with surface +$S$ and normal vector ${\bf n}$ onto the surface. This solution is derived in +detail e.g. in [^13]. -The fields of currents are directly derived using the law of Biot-Savart with the current distribution ${\bf J}({\bf r})$: +The fields of currents are directly derived using the law of Biot-Savart with +the current distribution ${\bf J}({\bf r})$: $$ {\bf B}({\bf r}) = \frac{\mu_0}{4\pi}\int_{V'} {\bf J}({\bf r}')\times \frac{{\bf r}-{\bf r}'}{|{\bf r}-{\bf r}'|^3} dV' $$ -In some special cases (simple shapes, homogeneous magnetisations, and current distributions) the above integrals can be worked out directly to give analytical formulas (or simple, fast converging series). The derivations can be found in the respective references. A noteworthy comparison between the Coulombian approach and the Amperian current model is given in [^14]. +In some special cases (simple shapes, homogeneous magnetisations, and current +distributions) the above integrals can be worked out directly to give analytical +formulas (or simple, fast converging series). The derivations can be found in +the respective references. A noteworthy comparison between the Coulombian +approach and the Amperian current model is given in [^14]. ## Accuracy of the Solutions and Demagnetization ### Line currents: -The magnetic field of a wire carrying a homogeneous current density is (on the outside) similar to the field of a line current positioned in the center of the wire, which carries the same total current. Current distributions become inhomogeneous at bends of the wire or when eddy currents (finite frequencies) are involved. +The magnetic field of a wire carrying a homogeneous current density is (on the +outside) similar to the field of a line current positioned in the center of the +wire, which carries the same total current. Current distributions become +inhomogeneous at bends of the wire or when eddy currents (finite frequencies) +are involved. (guide-physics-demag)= -### Magnets and Demagnetization -The analytical solutions are exact when bodies have a homogeneous magnetization. However, real materials always have a material response which results in an inhomogeneous magnetization even when the initial magnetization is perfectly homogeneous. There is a lot of literature on such [demagnetization effects](https://en.wikipedia.org/wiki/Demagnetizing_field). +### Magnets and Demagnetization -Modern high grade permanent magnets (NdFeB, SmCo, Ferrite) have a very weak material responses (local slope of the magnetization curve, remanent permeability) of the order of $\mu_r \approx 1.05$. In this case the analytical solutions provide an excellent approximation with less than 1% error even at close distance from the magnet surface. A detailed error analysis and discussion is presented in the appendix of [^15]. +The analytical solutions are exact when bodies have a homogeneous magnetization. +However, real materials always have a material response which results in an +inhomogeneous magnetization even when the initial magnetization is perfectly +homogeneous. There is a lot of literature on such +[demagnetization effects](https://en.wikipedia.org/wiki/Demagnetizing_field). -Error estimation as a result of the material response is evaluated in more detail in the appendix of [Malagò2020](https://www.mdpi.com/1424-8220/20/23/6873). +Modern high grade permanent magnets (NdFeB, SmCo, Ferrite) have a very weak +material responses (local slope of the magnetization curve, remanent +permeability) of the order of $\mu_r \approx 1.05$. In this case the analytical +solutions provide an excellent approximation with less than 1% error even at +close distance from the magnet surface. A detailed error analysis and discussion +is presented in the appendix of [^15]. -Demagnetization factors can be used to compensate a large part of the demagnetization effect. Analytical expressions for the demagnetization factors of cuboids can be found at [magpar.net](http://www.magpar.net/static/magpar/doc/html/demagcalc.html). +Error estimation as a result of the material response is evaluated in more +detail in the appendix of +[Malagò2020](https://www.mdpi.com/1424-8220/20/23/6873). +Demagnetization factors can be used to compensate a large part of the +demagnetization effect. Analytical expressions for the demagnetization factors +of cuboids can be found at +[magpar.net](http://www.magpar.net/static/magpar/doc/html/demagcalc.html). (phys-remanence)= -### Modeling a datasheet magnet - -The material remanence, often found in data sheets, simply corresponds to the material magnetization/polarization when not under the influence of external fields. This can never happen, as the material itself generates a magnetic field. Such self-interactions result in self-demagnetization that can be approximated using the demagnetization factors and the material permeability (or susceptibility). -For example, a cube with 1 mm sides has a demagnetization factor is 0.333, see [magpar.net](http://www.magpar.net/static/magpar/doc/html/demagcalc.html). When the remanence field of this cube is 1 T, and its susceptibility is 0.1, the magnetization resulting from self-interaction is reduced to 1 T - 0.3333*0.1 T = 0.9667 T, assuming linear material laws. - -A [tutorial](examples-tutorial-modeling-magnets) explains how to deal with demagnetization effects and how real magnets can be modeled using datasheet values. +### Modeling a datasheet magnet -It must be understood that the change in magnetization resulting from self-interaction has a homogeneous contribution which is approximated by the demagnetization factor, and an inhomogeneous contribution which cannot be modeled easily with analytical solutions. The inhomogeneous part, however, is typically an order of magnitude lower than the homogenous part. You can use the Magpylib extension [Magpylib material response](https://github.com/magpylib/magpylib-material-response) to model the self-interactions. +The material remanence, often found in data sheets, simply corresponds to the +material magnetization/polarization when not under the influence of external +fields. This can never happen, as the material itself generates a magnetic +field. Such self-interactions result in self-demagnetization that can be +approximated using the demagnetization factors and the material permeability (or +susceptibility). + +For example, a cube with 1 mm sides has a demagnetization factor is 0.333, see +[magpar.net](http://www.magpar.net/static/magpar/doc/html/demagcalc.html). When +the remanence field of this cube is 1 T, and its susceptibility is 0.1, the +magnetization resulting from self-interaction is reduced to 1 T - 0.3333\*0.1 T += 0.9667 T, assuming linear material laws. + +A [tutorial](examples-tutorial-modeling-magnets) explains how to deal with +demagnetization effects and how real magnets can be modeled using datasheet +values. + +It must be understood that the change in magnetization resulting from +self-interaction has a homogeneous contribution which is approximated by the +demagnetization factor, and an inhomogeneous contribution which cannot be +modeled easily with analytical solutions. The inhomogeneous part, however, is +typically an order of magnitude lower than the homogenous part. You can use the +Magpylib extension +[Magpylib material response](https://github.com/magpylib/magpylib-material-response) +to model the self-interactions. ### Soft-Magnetic Materials -Soft-magnetic materials like iron or steel with large permeabilities $\mu_r \sim 1000$ and low remanence fields are dominated by the material response. It is not possible to describe such bodies with analytical solutions. However, recent developments showed that the **Magnetostatic Method of Moments** can be a powerful tool in combination with Magpylib to compute such a material response. An integration into Magpylib is planned in the future. - -When a magnet lies in front of a soft-magnetic plate, the contribution from the plate can be modeled with high accuracy using a **mirror**-approach, similar to the electrostatic "mirror charge". +Soft-magnetic materials like iron or steel with large permeabilities +$\mu_r \sim 1000$ and low remanence fields are dominated by the material +response. It is not possible to describe such bodies with analytical solutions. +However, recent developments showed that the **Magnetostatic Method of Moments** +can be a powerful tool in combination with Magpylib to compute such a material +response. An integration into Magpylib is planned in the future. +When a magnet lies in front of a soft-magnetic plate, the contribution from the +plate can be modeled with high accuracy using a **mirror**-approach, similar to +the electrostatic "mirror charge". (docu-performance)= + ## Computation Performance -Magpylib code is fully [vectorized](https://en.wikipedia.org/wiki/Array_programming), written almost completely in numpy native. Magpylib automatically vectorizes the computation with complex inputs (many sources, many observers, paths) and never falls back on using loops. +Magpylib code is fully +[vectorized](https://en.wikipedia.org/wiki/Array_programming), written almost +completely in numpy native. Magpylib automatically vectorizes the computation +with complex inputs (many sources, many observers, paths) and never falls back +on using loops. ```{note} Maximal performance is achieved when `.getB(sources, observers)` is called only a single time in your program. Try not to use loops. ``` -The object-oriented interface comes with an overhead. If you want to achieve maximal performance this overhead can be avoided with {ref}`docs-field-functional`. +The object-oriented interface comes with an overhead. If you want to achieve +maximal performance this overhead can be avoided with +{ref}`docs-field-functional`. -The analytical solutions provide extreme performance. Single field evaluations take of the order of `100 µs`. For large input arrays (e.g. many observer positions or many similar magnets) the computation time can drop below `1 µs` per evaluation point on single state-of-the-art x86 mobile cores (tested on `Intel Core i5-8365U @ 1.60GHz`), depending on the source type. +The analytical solutions provide extreme performance. Single field evaluations +take of the order of `100 µs`. For large input arrays (e.g. many observer +positions or many similar magnets) the computation time can drop below `1 µs` +per evaluation point on single state-of-the-art x86 mobile cores (tested on +`Intel Core i5-8365U @ 1.60GHz`), depending on the source type. ## Numerical stability -Many expressions provided in the literature have very questionable numerical stability. Many of these problems are fixed in Magpylib, but one should be aware that accuracy can be a problem very close to objects, close the z-axis in cylindrical symmetries, at edge extensions, and at large distances. We are working on fixing these problems. Some details can be found in [^12]. +Many expressions provided in the literature have very questionable numerical +stability. Many of these problems are fixed in Magpylib, but one should be aware +that accuracy can be a problem very close to objects, close the z-axis in +cylindrical symmetries, at edge extensions, and at large distances. We are +working on fixing these problems. Some details can be found in [^12]. **References** -[^1]: Z. J. Yang et al., "Potential and force between a magnet and a bulk Y1Ba2Cu3O7-d superconductor studied by a mechanical pendulum", Superconductor Science and Technology 3(12):591, 1990 - -[^2]: R. Engel-Herbert et al., Journal of Applied Physics 97(7):074504 - 074504-4 (2005) - -[^3]: J.M. Camacho and V. Sosa, "Alternative method to calculate the magnetic field of permanent magnets with azimuthal symmetry", Revista Mexicana de Fisica E 59 8–17, 2013 - -[^4]: D. Cichon, R. Psiuk and H. Brauer, "A Hall-Sensor-Based Localization Method With Six Degrees of Freedom Using Unscented Kalman Filter", IEEE Sensors Journal, Vol. 19, No. 7, April 1, 2019. - -[^5]: E. P. Furlani, S. Reanik and W. Janson, "A Three-Dimensional Field Solution for Bipolar Cylinders", IEEE Transaction on Magnetics, VOL. 30, NO. 5, 1994 - -[^6]: N. Derby, "Cylindrical Magnets and Ideal Solenoids", arXiv:0909.3880v1, 2009 - -[^7]: A. Caciagli, R. J. Baars, A. P. Philipse and B. W. M. Kuipers, "Exact expression for the magnetic field of a finite cylinder with arbitrary uniform magnetization", Journal of Magnetism and Magnetic Materials 456 (2018) 423–432. - -[^8]: F. Slanovc, M. Ortner, M. Moridi, C. Abert and D. Suess, "Full analytical solution for the magnetic field of uniformly magnetized cylinder tiles", submitted to Journal of Magnetism and Magnetic Materials. - -[^9]: D. Guptasarma and B. Singh, "New scheme for computing the magnetic field resulting from a uniformly magnetized arbitrary polyhedron", Geophysics (1999), 64(1):70. - -[^10]: J.L.G. Janssen, J.J.H. Paulides and E.A. Lomonova, "3D ANALYTICAL FIELD CALCULATION USING TRIANGULAR MAGNET SEGMENTS APPLIED TO A SKEWED LINEAR PERMANENT MAGNET ACTUATOR", ISEF 2009 - XIV International Symposium on Electromagnetic Fields in Mechatronics, Electrical and Electronic Engineering Arras, France, September 10-12, 2009 - -[^11]: C. Rubeck et al., "Analytical Calculation of Magnet Systems: Magnetic Field Created by Charged Triangles and Polyhedra", IEEE Transactions on Magnetics, VOL. 49, NO. 1, 2013 - -[^12]: M. Ortner, S. Slanovc and P. Leitner, "Numerically Stable and Computationally Efficient Expression for the Magnetic Field of a Current Loop", MDPI Magnetism, 3(1), 11-31, 2022. +[^1]: + Z. J. Yang et al., "Potential and force between a magnet and a bulk + Y1Ba2Cu3O7-d superconductor studied by a mechanical pendulum", + Superconductor Science and Technology 3(12):591, 1990 + +[^2]: + R. Engel-Herbert et al., Journal of Applied Physics 97(7):074504 - 074504-4 + (2005) + +[^3]: + J.M. Camacho and V. Sosa, "Alternative method to calculate the magnetic + field of permanent magnets with azimuthal symmetry", Revista Mexicana de + Fisica E 59 8–17, 2013 + +[^4]: + D. Cichon, R. Psiuk and H. Brauer, "A Hall-Sensor-Based Localization Method + With Six Degrees of Freedom Using Unscented Kalman Filter", IEEE Sensors + Journal, Vol. 19, No. 7, April 1, 2019. + +[^5]: + E. P. Furlani, S. Reanik and W. Janson, "A Three-Dimensional Field Solution + for Bipolar Cylinders", IEEE Transaction on Magnetics, VOL. 30, NO. 5, 1994 + +[^6]: + N. Derby, "Cylindrical Magnets and Ideal Solenoids", arXiv:0909.3880v1, 2009 + +[^7]: + A. Caciagli, R. J. Baars, A. P. Philipse and B. W. M. Kuipers, "Exact + expression for the magnetic field of a finite cylinder with arbitrary + uniform magnetization", Journal of Magnetism and Magnetic Materials 456 + (2018) 423–432. + +[^8]: + F. Slanovc, M. Ortner, M. Moridi, C. Abert and D. Suess, "Full analytical + solution for the magnetic field of uniformly magnetized cylinder tiles", + submitted to Journal of Magnetism and Magnetic Materials. + +[^9]: + D. Guptasarma and B. Singh, "New scheme for computing the magnetic field + resulting from a uniformly magnetized arbitrary polyhedron", Geophysics + (1999), 64(1):70. + +[^10]: + J.L.G. Janssen, J.J.H. Paulides and E.A. Lomonova, "3D ANALYTICAL FIELD + CALCULATION USING TRIANGULAR MAGNET SEGMENTS APPLIED TO A SKEWED LINEAR + PERMANENT MAGNET ACTUATOR", ISEF 2009 - XIV International Symposium on + Electromagnetic Fields in Mechatronics, Electrical and Electronic + Engineering Arras, France, September 10-12, 2009 + +[^11]: + C. Rubeck et al., "Analytical Calculation of Magnet Systems: Magnetic Field + Created by Charged Triangles and Polyhedra", IEEE Transactions on Magnetics, + VOL. 49, NO. 1, 2013 + +[^12]: + M. Ortner, S. Slanovc and P. Leitner, "Numerically Stable and + Computationally Efficient Expression for the Magnetic Field of a Current + Loop", MDPI Magnetism, 3(1), 11-31, 2022. [^13]: J. D. Jackson, "Classical Electrodynamics", 1999 Wiley, New York -[^14]: R. Ravaud and G. Lamarquand, "Comparison of the coulombian and amperian current models for calculating the magnetic field produced by radially magnetized arc-shaped permanent magnets", HAL Id: hal-00412346 +[^14]: + R. Ravaud and G. Lamarquand, "Comparison of the coulombian and amperian + current models for calculating the magnetic field produced by radially + magnetized arc-shaped permanent magnets", HAL Id: hal-00412346 -[^15]: P. Malagò et al., Magnetic Position System Design Method Applied to Three-Axis Joystick Motion Tracking. Sensors, 2020, 20. Jg., Nr. 23, S. 6873. +[^15]: + P. Malagò et al., Magnetic Position System Design Method Applied to + Three-Axis Joystick Motion Tracking. Sensors, 2020, 20. Jg., Nr. 23, + S. 6873. diff --git a/docs/_pages/user_guide/guide_start_01_install.md b/docs/_pages/user_guide/guide_start_01_install.md index e8f1473e8..e351f5434 100644 --- a/docs/_pages/user_guide/guide_start_01_install.md +++ b/docs/_pages/user_guide/guide_start_01_install.md @@ -2,28 +2,27 @@ ## Dependencies and Synergies -Magpylib supports *Python3.10+* and relies on common scientific computation libraries *NumPy* and *Scipy* for computation, and *Matplotlib* and *Plotly* for graphic outputs. +Magpylib supports _Python3.10+_ and relies on common scientific computation +libraries _NumPy_ and _Scipy_ for computation, and _Matplotlib_ and _Plotly_ for +graphic outputs. -Optionally, *Pyvista* is supported as graphical backend, as well as *Pandas* for the field computation output. +Optionally, _Pyvista_ is supported as graphical backend, as well as _Pandas_ for +the field computation output. ## Installation -::::{grid} 1 1 2 2 -:margin: 4 4 0 0 -:gutter: 4 +::::{grid} 1 1 2 2 :margin: 4 4 0 0 :gutter: 4 + +:::{grid-item-card} Install with pip: :text-align: center :shadow: none -:::{grid-item-card} Install with pip: -:text-align: center -:shadow: none ```console pip install magpylib ``` -::: -:::{grid-item-card} Install with conda: -:text-align: center -:shadow: none + +::: :::{grid-item-card} Install with conda: :text-align: center :shadow: none + ```console conda install -c conda-forge magpylib ``` -::: -:::: + +::: :::: diff --git a/docs/_pages/user_guide/guide_start_02_fundamentals.md b/docs/_pages/user_guide/guide_start_02_fundamentals.md index a8f18ca35..85b45ffad 100644 --- a/docs/_pages/user_guide/guide_start_02_fundamentals.md +++ b/docs/_pages/user_guide/guide_start_02_fundamentals.md @@ -1,11 +1,16 @@ (getting-started)= + # The Magpylib fundamentals -In this section we present the most important Magpylib features, focussing on the intuitive object-oriented interface. +In this section we present the most important Magpylib features, focussing on +the intuitive object-oriented interface. ## Basic features -Learn the Magpylib fundamentals (create magnets, view system, compute field) in 5 minutes. This requires a basic understanding of the Python programming language, the [NumPy array class](https://numpy.org/doc/stable/) and the [Scipy Rotation class](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html). +Learn the Magpylib fundamentals (create magnets, view system, compute field) in +5 minutes. This requires a basic understanding of the Python programming +language, the [NumPy array class](https://numpy.org/doc/stable/) and the +[Scipy Rotation class](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html). ```{hint} Since v5 all Magpylib inputs and ouputs are by default in SI-units. See {ref}`guide-docs-io-scale-invariance` for convenient use. @@ -13,7 +18,9 @@ Since v5 all Magpylib inputs and ouputs are by default in SI-units. See {ref}`gu ### Create sources and observers as Python objects -In the object oriented interface sources of the magnetic field (magnets, currents, others) and observers of the magnetic field (sensors) are created as Python objects. +In the object oriented interface sources of the magnetic field (magnets, +currents, others) and observers of the magnetic field (sensors) are created as +Python objects. ```python import magpylib as magpy @@ -22,7 +29,7 @@ import magpylib as magpy # of 1 T pointing in x-direction and sides of # 1,2 and 3 cm respectively (notice the use of SI units). -cube = magpy.magnet.Cuboid(polarization=(1,0,0), dimension=(0.01,0.02,0.03)) +cube = magpy.magnet.Cuboid(polarization=(1, 0, 0), dimension=(0.01, 0.02, 0.03)) # Create a Sensor for measuring the field @@ -33,71 +40,78 @@ Find detailed information on the Magpylib classes [here](docs-classes). ### Position and orientation -All Magpylib objects (sources and observers) have position and orientation in a global Cartesian coordinate system that can be manipulated. +All Magpylib objects (sources and observers) have position and orientation in a +global Cartesian coordinate system that can be manipulated. ```python # By default, the position of a Magpylib object is # (0,0,0) and its orientation is the unit rotation, # given by a scipy rotation object. -print(cube.position) # -> [0. 0. 0.] -print(cube.orientation.as_rotvec()) # -> [0. 0. 0.] +print(cube.position) # -> [0. 0. 0.] +print(cube.orientation.as_rotvec()) # -> [0. 0. 0.] # Manipulate object position and orientation through # the respective attributes (move 10 mm and rotate 45 deg): from scipy.spatial.transform import Rotation as R -cube.position = (0.01,0,0) -cube.orientation = R.from_rotvec((0,0,45), degrees=True) -print(cube.position) # -> [0.01 0. 0. ] -print(cube.orientation.as_rotvec(degrees=True)) # -> [0. 0. 45.] +cube.position = (0.01, 0, 0) +cube.orientation = R.from_rotvec((0, 0, 45), degrees=True) + +print(cube.position) # -> [0.01 0. 0. ] +print(cube.orientation.as_rotvec(degrees=True)) # -> [0. 0. 45.] # Apply relative motion with the powerful `move` # and `rotate` methods. -sensor.move((-0.01,0,0)) -sensor.rotate_from_angax(angle=-45, axis='z') +sensor.move((-0.01, 0, 0)) +sensor.rotate_from_angax(angle=-45, axis="z") -print(sensor.position) # -> [-0.01 0. 0. ] -print(sensor.orientation.as_rotvec(degrees=True)) # -> [ 0. 0. -45.] +print(sensor.position) # -> [-0.01 0. 0. ] +print(sensor.orientation.as_rotvec(degrees=True)) # -> [ 0. 0. -45.] ``` -Find detailed information on position and orientation attributes and how to manipulate them [here](docs-position). +Find detailed information on position and orientation attributes and how to +manipulate them [here](docs-position). ### 3D view of objects -In-built 3D graphic output helps to see if all Magpylib objects are positioned properly. The magnet polarization is represented by default by a 3-color scheme, the sensor by an axes cross. +In-built 3D graphic output helps to see if all Magpylib objects are positioned +properly. The magnet polarization is represented by default by a 3-color scheme, +the sensor by an axes cross. ```python # Use the `show` function to view your system # through Matplotlib, Plotly or Pyvista backends. -magpy.show(cube, sensor, backend='plotly') +magpy.show(cube, sensor, backend="plotly") ``` -Detailed information on the graphical output with `show` is given [here](guide-graphics). +Detailed information on the graphical output with `show` is given +[here](guide-graphics). ### Computing the field -The field can be computed at sensor objects, or simply by specifying a position of interest. +The field can be computed at sensor objects, or simply by specifying a position +of interest. ```python # Compute the B-field for some positions. -points = [(0,0,-.01), (0,0,0), (0,0,.01)] # in SI Units (m) +points = [(0, 0, -0.01), (0, 0, 0), (0, 0, 0.01)] # in SI Units (m) B = magpy.getB(cube, points) -print(B.round(2)) # -> [[ 0.26 0.07 0.08] - # [ 0.28 0.05 0. ] - # [ 0.26 0.07 -0.08]] # in SI Units (T) +print(B.round(2)) # -> [[ 0.26 0.07 0.08] +# [ 0.28 0.05 0. ] +# [ 0.26 0.07 -0.08]] # in SI Units (T) # Compute the H-field at the sensor. H = magpy.getH(cube, sensor) -print(H.round()) # -> [51017. 24210. 0.] # in SI Units (A/m) +print(H.round()) # -> [51017. 24210. 0.] # in SI Units (A/m) ``` ```{hint} @@ -108,64 +122,68 @@ Detailed information on field computation is provided [here](docs-fieldcomp). ## Advanced features -While most things can be achieved with the above, the following features will make your live much easier. +While most things can be achieved with the above, the following features will +make your live much easier. ### Paths -Magpylib position and orientation attributes can store multiple values that are referred to as paths. The field will automatically be computed for all path positions. Use this feature to model objects that move to multiple locations. +Magpylib position and orientation attributes can store multiple values that are +referred to as paths. The field will automatically be computed for all path +positions. Use this feature to model objects that move to multiple locations. ```python import numpy as np import magpylib as magpy # Create magnet -sphere = magpy.magnet.Sphere( - diameter=.01, - polarization=(0,0,1) -) +sphere = magpy.magnet.Sphere(diameter=0.01, polarization=(0, 0, 1)) # Assign a path -sphere.position = np.linspace((-.02,0,0), (.02,0,0), 7) +sphere.position = np.linspace((-0.02, 0, 0), (0.02, 0, 0), 7) # The field is automatically computed for every path position -B = sphere.getB((0,0,.01)) +B = sphere.getB((0, 0, 0.01)) print(B.round(3)) # ->[[ 0.004 0. -0.001] - # [ 0.013 0. 0.001] - # [ 0.033 0. 0.026] - # [ 0. 0. 0.083] - # [-0.033 0. 0.026] - # [-0.013 0. 0.001] - # [-0.004 0. -0.001]] +# [ 0.013 0. 0.001] +# [ 0.033 0. 0.026] +# [ 0. 0. 0.083] +# [-0.033 0. 0.026] +# [-0.013 0. 0.001] +# [-0.004 0. -0.001]] ``` More information on paths is provided [here](docs-position). ### Collections -Magpylib objects can be grouped into Collections. An operation applied to a Collection is applied to every object in it. The Collection itself behaves like a single source object. + +Magpylib objects can be grouped into Collections. An operation applied to a +Collection is applied to every object in it. The Collection itself behaves like +a single source object. ```python import magpylib as magpy # Create objects obj1 = magpy.Sensor() -obj2 = magpy.magnet.Cuboid( - polarization=(0,0,1), - dimension=(.01,.02,.03)) +obj2 = magpy.magnet.Cuboid(polarization=(0, 0, 1), dimension=(0.01, 0.02, 0.03)) # Group objects coll = magpy.Collection(obj1, obj2) # Manipulate Collection -coll.move((.001,.002,.003)) +coll.move((0.001, 0.002, 0.003)) -print(obj1.position) # -> [0.001 0.002 0.003] -print(obj2.position) # -> [0.001 0.002 0.003] +print(obj1.position) # -> [0.001 0.002 0.003] +print(obj2.position) # -> [0.001 0.002 0.003] ``` Collections are dicussed in detail [here](guide-docs-classes-collections). ### Complex Magnet Shapes -There most convenient way to create a magnet with complex shape is by using the convex hull of a point cloud (= simplest geometric form that includes all given points) and transform it into a triangular surface mesh. + +There most convenient way to create a magnet with complex shape is by using the +convex hull of a point cloud (= simplest geometric form that includes all given +points) and transform it into a triangular surface mesh. ```python import numpy as np @@ -173,16 +191,14 @@ import numpy as np import magpylib as magpy # Create a Pyramid magnet -points = ( - np.array( - [ - (-1, -1, 0), - (-1, 1, 0), - (1, -1, 0), - (1, 1, 0), - (0, 0, 2), - ] - ) +points = np.array( + [ + (-1, -1, 0), + (-1, 1, 0), + (1, -1, 0), + (1, 1, 0), + (0, 0, 2), + ] ) pyramid = magpy.magnet.TriangularMesh.from_ConvexHull( magnetization=(0, 0, 1e6), @@ -192,12 +208,14 @@ pyramid = magpy.magnet.TriangularMesh.from_ConvexHull( # Display the magnet graphically pyramid.show() ``` - -There are several other possibilities to create complex magnet shapes. Some can be found in the [examples](examples-complex-magnet-shapes). + +There are several other possibilities to create complex magnet shapes. Some can +be found in the [examples](examples-complex-magnet-shapes). ### Graphic Styles + Magpylib offers many ways to customize the graphic output. ```python @@ -205,29 +223,32 @@ import magpylib as magpy # Create Cuboid magnet with custom style cube = magpy.magnet.Cuboid( - polarization=(0,0,1), - dimension=(.01,.01,.01), - style_color='r', - style_magnetization_mode='arrow' + polarization=(0, 0, 1), + dimension=(0.01, 0.01, 0.01), + style_color="r", + style_magnetization_mode="arrow", ) # Create Cylinder magnet with custom style cyl = magpy.magnet.Cylinder( - polarization=(0,0,1), - dimension=(.01,.01), - position=(.02,0,0), - style_magnetization_color_mode='bicolor', - style_magnetization_color_north='m', - style_magnetization_color_south='c', + polarization=(0, 0, 1), + dimension=(0.01, 0.01), + position=(0.02, 0, 0), + style_magnetization_color_mode="bicolor", + style_magnetization_color_north="m", + style_magnetization_color_south="c", ) magpy.show(cube, cyl) ``` + The many options for graphic styling can be found [here](guide-graphic-styles). ### Animation -Object paths can be animated. For this feature the plotly graphic backend is recommended. + +Object paths can be animated. For this feature the plotly graphic backend is +recommended. ```python import numpy as np @@ -236,23 +257,26 @@ import magpylib as magpy # Create magnet with path cube = magpy.magnet.Cuboid( - magnetization=(0,0,1), - dimension=(1,1,1), -) -cube.rotate_from_angax( - angle=np.linspace(10,360,18), - axis='x' + magnetization=(0, 0, 1), + dimension=(1, 1, 1), ) +cube.rotate_from_angax(angle=np.linspace(10, 360, 18), axis="x") # Generate an animation with `show` cube.show(animation=True, backend="plotly") ``` + -Nice animation examples are shown [here](examples-vis-animations), and a detailed discussion is provided [here](guide-graphic-animations). +Nice animation examples are shown [here](examples-vis-animations), and a +detailed discussion is provided [here](guide-graphic-animations). ### Functional interface -Magpylib's object oriented interface is convenient to work with but is also slowed down by object initialization and handling. The functional interface bypasses this load and enables fast field computation for an arbitrary set of input parameters. + +Magpylib's object oriented interface is convenient to work with but is also +slowed down by object initialization and handling. The functional interface +bypasses this load and enables fast field computation for an arbitrary set of +input parameters. ```python import magpylib as magpy @@ -266,8 +290,8 @@ B = magpy.getB( ) print(B.round(3)) # -> [[-0.043 0. 0.014] - # [ 0. 0. 0.135] - # [ 0.043 0. 0.014]] +# [ 0. 0. 0.135] +# [ 0.043 0. 0.014]] ``` Details on the functional interface are found [here](docs-field-functional). diff --git a/docs/_static/custom.css b/docs/_static/custom.css index d699c9c38..b53294376 100644 --- a/docs/_static/custom.css +++ b/docs/_static/custom.css @@ -1,39 +1,35 @@ #galleryimg { - background: red; + background: red; } /* fix image transparency in docu WTF? */ -html[data-theme=dark] .bd-content img:not(.only-dark):not(.dark-light) { - background: none; +html[data-theme="dark"] .bd-content img:not(.only-dark):not(.dark-light) { + background: none; } /* custom padding for index page*/ .sectiontext { - margin-top:-40px; + margin-top: -40px; } - /* hide vertical scrollbar - it always appears unwanted when there is no content */ .bd-sidebar { - overflow-y: auto; /* Change to auto to only show scrollbar when necessary */ + overflow-y: auto; /* Change to auto to only show scrollbar when necessary */ } - - /* Adjust the height to ensure it fits within the viewport */ /* .bd-sidebar { max-height: calc(100vh - var(--header-height, 0px)); } */ - /* Target the logo text */ .navbar-brand { - font-weight: bold; - font-size: 1.6em; + font-weight: bold; + font-size: 1.6em; } diff --git a/docs/_static/switcher.json b/docs/_static/switcher.json index 6fa25f9fd..291b20eba 100644 --- a/docs/_static/switcher.json +++ b/docs/_static/switcher.json @@ -1,24 +1,24 @@ [ - { - "version": "dev", - "url": "https://magpylib.readthedocs.io/en/latest/" - }, - { - "name": "5.1.1 (stable)", - "version": "5.1.1", - "url": "https://magpylib.readthedocs.io/en/stable", - "preferred": true - }, - { - "version": "4.5.1", - "url": "https://magpylib.readthedocs.io/en/4.5.1/" - }, - { - "version": "3.0.5", - "url": "https://magpylib.readthedocs.io/en/3.0.5/" - }, - { - "version": "2.3.0-beta", - "url": "https://magpylib.readthedocs.io/en/2.3.0-beta/" - } -] \ No newline at end of file + { + "version": "dev", + "url": "https://magpylib.readthedocs.io/en/latest/" + }, + { + "name": "5.1.1 (stable)", + "version": "5.1.1", + "url": "https://magpylib.readthedocs.io/en/stable", + "preferred": true + }, + { + "version": "4.5.1", + "url": "https://magpylib.readthedocs.io/en/4.5.1/" + }, + { + "version": "3.0.5", + "url": "https://magpylib.readthedocs.io/en/3.0.5/" + }, + { + "version": "2.3.0-beta", + "url": "https://magpylib.readthedocs.io/en/2.3.0-beta/" + } +] diff --git a/docs/_static/webcode/copybutton.js b/docs/_static/webcode/copybutton.js index 6ade74927..87baea833 100644 --- a/docs/_static/webcode/copybutton.js +++ b/docs/_static/webcode/copybutton.js @@ -1,65 +1,89 @@ // Copyright 2014 PSF. Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 // File originates from the cpython source found in https://docs.python.org/3/_static/copybutton.js -$(document).ready(function() { - /* Add a [>>>] button on the top-right corner of code samples to hide - * the >>> and ... prompts and the output and thus make the code - * copyable. */ - var div = $('.highlight-python .highlight,' + - '.highlight-default .highlight,' + - '.highlight-python3 .highlight') - var pre = div.find('pre'); +$(document).ready(function () { + /* Add a [>>>] button on the top-right corner of code samples to hide + * the >>> and ... prompts and the output and thus make the code + * copyable. */ + var div = $( + ".highlight-python .highlight," + + ".highlight-default .highlight," + + ".highlight-python3 .highlight", + ); + var pre = div.find("pre"); - // get the styles from the current theme - pre.parent().parent().css('position', 'relative'); - var hide_text = 'Hide the prompts and output'; - var show_text = 'Show the prompts and output'; - var border_width = pre.css('border-top-width'); - var border_style = pre.css('border-top-style'); - var border_color = pre.css('border-top-color'); - var button_styles = { - 'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0', - 'border-color': border_color, 'border-style': border_style, - 'border-width': border_width, 'color': border_color, 'text-size': '75%', - 'font-family': 'monospace', 'padding-left': '0.2em', 'padding-right': '0.2em', - 'border-radius': '0 3px 0 0' - } + // get the styles from the current theme + pre.parent().parent().css("position", "relative"); + var hide_text = "Hide the prompts and output"; + var show_text = "Show the prompts and output"; + var border_width = pre.css("border-top-width"); + var border_style = pre.css("border-top-style"); + var border_color = pre.css("border-top-color"); + var button_styles = { + cursor: "pointer", + position: "absolute", + top: "0", + right: "0", + "border-color": border_color, + "border-style": border_style, + "border-width": border_width, + color: border_color, + "text-size": "75%", + "font-family": "monospace", + "padding-left": "0.2em", + "padding-right": "0.2em", + "border-radius": "0 3px 0 0", + }; - // create and add the button to all the code blocks that contain >>> - div.each(function(index) { - var jthis = $(this); - if (jthis.find('.gp').length > 0) { - var button = $('Click to Hide >>>'); - button.css(button_styles) - button.attr('title', hide_text); - button.data('hidden', 'false'); - jthis.prepend(button); - } - // tracebacks (.gt) contain bare text elements that need to be - // wrapped in a span to work with .nextUntil() (see later) - jthis.find('pre:has(.gt)').contents().filter(function() { - return ((this.nodeType == 3) && (this.data.trim().length > 0)); - }).wrap(''); - }); + // create and add the button to all the code blocks that contain >>> + div.each(function (index) { + var jthis = $(this); + if (jthis.find(".gp").length > 0) { + var button = $( + 'Click to Hide >>>', + ); + button.css(button_styles); + button.attr("title", hide_text); + button.data("hidden", "false"); + jthis.prepend(button); + } + // tracebacks (.gt) contain bare text elements that need to be + // wrapped in a span to work with .nextUntil() (see later) + jthis + .find("pre:has(.gt)") + .contents() + .filter(function () { + return this.nodeType == 3 && this.data.trim().length > 0; + }) + .wrap(""); + }); - // define the behavior of the button when it's clicked - $('.copybutton').click(function(e){ - e.preventDefault(); - var button = $(this); - if (button.data('hidden') === 'false') { - // hide the code output - button.parent().find('.go, .gp, .gt').hide(); - button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden'); - button.css('text-decoration', 'line-through'); - button.attr('title', show_text); - button.data('hidden', 'true'); - } else { - // show the code output - button.parent().find('.go, .gp, .gt').show(); - button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible'); - button.css('text-decoration', 'none'); - button.attr('title', hide_text); - button.data('hidden', 'false'); - } - }); + // define the behavior of the button when it's clicked + $(".copybutton").click(function (e) { + e.preventDefault(); + var button = $(this); + if (button.data("hidden") === "false") { + // hide the code output + button.parent().find(".go, .gp, .gt").hide(); + button + .next("pre") + .find(".gt") + .nextUntil(".gp, .go") + .css("visibility", "hidden"); + button.css("text-decoration", "line-through"); + button.attr("title", show_text); + button.data("hidden", "true"); + } else { + // show the code output + button.parent().find(".go, .gp, .gt").show(); + button + .next("pre") + .find(".gt") + .nextUntil(".gp, .go") + .css("visibility", "visible"); + button.css("text-decoration", "none"); + button.attr("title", hide_text); + button.data("hidden", "false"); + } + }); }); diff --git a/docs/_static/webcode/summaryOpen.js b/docs/_static/webcode/summaryOpen.js index 5fe9aa024..878cec8c1 100644 --- a/docs/_static/webcode/summaryOpen.js +++ b/docs/_static/webcode/summaryOpen.js @@ -1,16 +1,22 @@ -$(document).ready(function() { - $('a[href^="#"]').on('click', function(e) { - e.preventDefault(); - var target = this.hash, - $target = $(target); - $(target + ' details').attr('open', true); +$(document).ready(function () { + $('a[href^="#"]').on("click", function (e) { + e.preventDefault(); + var target = this.hash, + $target = $(target); + $(target + " details").attr("open", true); - $('html, body').stop().animate({ - 'scrollTop': $target.offset().top - }, 500, 'swing', function() { - window.location.hash = target; - }); - - }); + $("html, body") + .stop() + .animate( + { + scrollTop: $target.offset().top, + }, + 500, + "swing", + function () { + window.location.hash = target; + }, + ); }); +}); //https://stackoverflow.com/a/48258026/11028959 diff --git a/docs/conf.py b/docs/conf.py index 968d5c213..86e2a025b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,8 +1,8 @@ from __future__ import annotations +import importlib.metadata import os import sys -import importlib.metadata # This is for pyvista os.system("/usr/bin/Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &") diff --git a/docs/index.md b/docs/index.md index 677fceb72..7bde09b9f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,38 +1,27 @@ # Magpylib Documentation -Magpylib is an **open-source Python package** for calculating static **magnetic fields** of magnets, currents, and other sources. It uses **analytical expressions**, solutions to macroscopic magnetostatic problems, implemented in **vectorized** form which makes the computation **extremely fast** and leverages the open-source Python ecosystem for spectacular visualizations! +Magpylib is an **open-source Python package** for calculating static **magnetic +fields** of magnets, currents, and other sources. It uses **analytical +expressions**, solutions to macroscopic magnetostatic problems, implemented in +**vectorized** form which makes the computation **extremely fast** and leverages +the open-source Python ecosystem for spectacular visualizations!

Resources

-::::{grid} 1 2 3 3 -:margin: 4 4 0 0 -:gutter: 2 - -:::{grid-item-card} -:link: getting-started -:link-type: ref -:link-alt: link to Getting Started -:img-top: _static/images/index_icon_get_started.png -:text-align: center -**Getting Started** -::: - -:::{grid-item-card} -:link: examples -:link-type: ref -:link-alt: link to Examples -:img-top: _static/images/index_icon_examples.png -:text-align: center -**Examples** -::: - -:::{grid-item-card} -:link: https://www.sciencedirect.com/science/article/pii/S2352711020300170 -:link-alt: link to Journal -:img-top: _static/images/index_icon_academic.png -:text-align: center -**Scientific Reference** -::: +::::{grid} 1 2 3 3 :margin: 4 4 0 0 :gutter: 2 + +:::{grid-item-card} :link: getting-started :link-type: ref :link-alt: link to +Getting Started :img-top: \_static/images/index_icon_get_started.png +:text-align: center **Getting Started** ::: + +:::{grid-item-card} :link: examples :link-type: ref :link-alt: link to Examples +:img-top: \_static/images/index_icon_examples.png :text-align: center +**Examples** ::: + +:::{grid-item-card} :link: +https://www.sciencedirect.com/science/article/pii/S2352711020300170 :link-alt: +link to Journal :img-top: \_static/images/index_icon_academic.png :text-align: +center **Scientific Reference** ::: :::: @@ -40,8 +29,12 @@ Magpylib is an **open-source Python package** for calculating static **magnetic ![](_static/images/index_flowchart.png) -In Magpylib, **sources** (magnets, currents, ...) and **observers** (sensors, position grids, ...) are created as Python objects with position and orientation attributes. These objects can be **grouped** and **moved** around. The system can be **viewed** graphically through various backends. The **magnetic field** is computed in the observer reference frame. Magpylib collects all inputs, and vectorizes the computation for maximal performance. - +In Magpylib, **sources** (magnets, currents, ...) and **observers** (sensors, +position grids, ...) are created as Python objects with position and orientation +attributes. These objects can be **grouped** and **moved** around. The system +can be **viewed** graphically through various backends. The **magnetic field** +is computed in the observer reference frame. Magpylib collects all inputs, and +vectorizes the computation for maximal performance. ```{toctree} :maxdepth: 2 diff --git a/src/magpylib/__init__.py b/src/magpylib/__init__.py index f3306e1dd..40e468522 100644 --- a/src/magpylib/__init__.py +++ b/src/magpylib/__init__.py @@ -6,40 +6,33 @@ from __future__ import annotations -from ._version import version as __version__ - from scipy.constants import mu_0 -from magpylib import core -from magpylib import current -from magpylib import graphics -from magpylib import magnet -from magpylib import misc +from magpylib import core, current, graphics, magnet, misc from magpylib._src.defaults.defaults_classes import default_settings as defaults from magpylib._src.defaults.defaults_utility import SUPPORTED_PLOTTING_BACKENDS -from magpylib._src.display.display import show -from magpylib._src.display.display import show_context -from magpylib._src.fields import getB -from magpylib._src.fields import getH -from magpylib._src.fields import getJ -from magpylib._src.fields import getM +from magpylib._src.display.display import show, show_context +from magpylib._src.fields import getB, getH, getJ, getM from magpylib._src.obj_classes.class_Collection import Collection from magpylib._src.obj_classes.class_Sensor import Sensor -__all__ = ["__version__", - "magnet", +from ._version import version as __version__ + +__all__ = [ + "Collection", + "Sensor", + "__version__", + "core", "current", - "misc", + "defaults", "getB", "getH", - "getM", "getJ", - "Sensor", - "Collection", - "show", - "show_context", - "defaults", - "core", + "getM", "graphics", + "magnet", + "misc", "mu_0", + "show", + "show_context", ] diff --git a/src/magpylib/_src/defaults/defaults_classes.py b/src/magpylib/_src/defaults/defaults_classes.py index 20ed85f8f..ea8fab886 100644 --- a/src/magpylib/_src/defaults/defaults_classes.py +++ b/src/magpylib/_src/defaults/defaults_classes.py @@ -1,8 +1,12 @@ -from magpylib._src.defaults.defaults_utility import SUPPORTED_PLOTTING_BACKENDS -from magpylib._src.defaults.defaults_utility import MagicProperties -from magpylib._src.defaults.defaults_utility import color_validator -from magpylib._src.defaults.defaults_utility import get_defaults_dict -from magpylib._src.defaults.defaults_utility import validate_property_class +from __future__ import annotations + +from magpylib._src.defaults.defaults_utility import ( + SUPPORTED_PLOTTING_BACKENDS, + MagicProperties, + color_validator, + get_defaults_dict, + validate_property_class, +) from magpylib._src.style import DisplayStyle @@ -91,7 +95,7 @@ def backend(self, val): assert val is None or val in backends, ( f"the `backend` property of {type(self).__name__} must be one of" f"{backends}" - f" but received {repr(val)} instead" + f" but received {val!r} instead" ) self._backend = val @@ -141,9 +145,9 @@ def autosizefactor(self): @autosizefactor.setter def autosizefactor(self, val): - assert val is None or isinstance(val, (int, float)) and val > 0, ( + assert val is None or (isinstance(val, (int, float)) and val > 0), ( f"the `autosizefactor` property of {type(self).__name__} must be a strictly positive" - f" number but received {repr(val)} instead" + f" number but received {val!r} instead" ) self._autosizefactor = val @@ -193,9 +197,9 @@ def maxfps(self): @maxfps.setter def maxfps(self, val): - assert val is None or isinstance(val, int) and val > 0, ( + assert val is None or (isinstance(val, int) and val > 0), ( f"The `maxfps` property of {type(self).__name__} must be a strictly positive" - f" integer but received {repr(val)} instead." + f" integer but received {val!r} instead." ) self._maxfps = val @@ -206,9 +210,9 @@ def fps(self): @fps.setter def fps(self, val): - assert val is None or isinstance(val, int) and val > 0, ( + assert val is None or (isinstance(val, int) and val > 0), ( f"The `fps` property of {type(self).__name__} must be a strictly positive" - f" integer but received {repr(val)} instead." + f" integer but received {val!r} instead." ) self._fps = val @@ -219,9 +223,9 @@ def maxframes(self): @maxframes.setter def maxframes(self, val): - assert val is None or isinstance(val, int) and val > 0, ( + assert val is None or (isinstance(val, int) and val > 0), ( f"The `maxframes` property of {type(self).__name__} must be a strictly positive" - f" integer but received {repr(val)} instead." + f" integer but received {val!r} instead." ) self._maxframes = val @@ -232,9 +236,9 @@ def time(self): @time.setter def time(self, val): - assert val is None or isinstance(val, int) and val > 0, ( + assert val is None or (isinstance(val, int) and val > 0), ( f"The `time` property of {type(self).__name__} must be a strictly positive" - f" integer but received {repr(val)} instead." + f" integer but received {val!r} instead." ) self._time = val @@ -247,7 +251,7 @@ def slider(self): def slider(self, val): assert val is None or isinstance(val, bool), ( f"The `slider` property of {type(self).__name__} must be a either `True` or `False`" - f" but received {repr(val)} instead." + f" but received {val!r} instead." ) self._slider = val @@ -264,7 +268,7 @@ def output(self, val): assert val is None or valid, ( f"The `output` property of {type(self).__name__} must be a either `mp4` or `gif` " "or a valid path ending with `.mp4` or `.gif`" - f" but received {repr(val)} instead." + f" but received {val!r} instead." ) self._output = val diff --git a/src/magpylib/_src/defaults/defaults_utility.py b/src/magpylib/_src/defaults/defaults_utility.py index d44d6f3e2..930c1fc4a 100644 --- a/src/magpylib/_src/defaults/defaults_utility.py +++ b/src/magpylib/_src/defaults/defaults_utility.py @@ -1,6 +1,8 @@ """utilities for creating property classes""" # pylint: disable=too-many-branches +from __future__ import annotations + import collections.abc import re from copy import deepcopy @@ -297,7 +299,7 @@ def validate_property_class(val, name, class_, parent): raise ValueError( f"the `{name}` property of `{type(parent).__name__}` must be an instance \n" f"of `{class_}` or a dictionary with equivalent key/value pairs \n" - f"but received {repr(val)} instead" + f"but received {val!r} instead" ) return val @@ -319,7 +321,8 @@ def validate_style_keys(style_kwargs): class MagicProperties: - """ + ( + """ Base Class to represent only the property attributes defined at initialization, after which the class is frozen. This prevents user to create any attributes that are not defined as properties. @@ -327,12 +330,14 @@ class is frozen. This prevents user to create any attributes that are not define ------ AttributeError raises AttributeError if the object is not a property - """ """""" + """ + """""" + ) __isfrozen = False def __init__(self, **kwargs): - input_dict = {k: None for k in self._property_names_generator()} + input_dict = dict.fromkeys(self._property_names_generator()) if kwargs: magic_kwargs = magic_to_dict(kwargs) diff = set(magic_kwargs.keys()).difference(set(input_dict.keys())) @@ -367,7 +372,7 @@ def _property_names_generator(self): def __repr__(self): params = self._property_names_generator() - dict_str = ", ".join(f"{k}={repr(getattr(self,k))}" for k in params) + dict_str = ", ".join(f"{k}={getattr(self, k)!r}" for k in params) return f"{type(self).__name__}({dict_str})" def as_dict(self, flatten=False, separator="."): diff --git a/src/magpylib/_src/defaults/defaults_values.py b/src/magpylib/_src/defaults/defaults_values.py index 8b7ddb2fb..74d164257 100644 --- a/src/magpylib/_src/defaults/defaults_values.py +++ b/src/magpylib/_src/defaults/defaults_values.py @@ -1,5 +1,7 @@ """Package level config defaults""" +from __future__ import annotations + DEFAULTS = { "display": { "autosizefactor": 10, diff --git a/src/magpylib/_src/display/backend_matplotlib.py b/src/magpylib/_src/display/backend_matplotlib.py index a24d781f8..b5436ae49 100644 --- a/src/magpylib/_src/display/backend_matplotlib.py +++ b/src/magpylib/_src/display/backend_matplotlib.py @@ -5,6 +5,7 @@ # pylint: disable=import-outside-toplevel # pylint: disable=wrong-import-position # pylint: disable=too-many-positional-arguments +from __future__ import annotations import os from collections import Counter @@ -80,7 +81,7 @@ def legend_artist(self, legend, orig_handle, fontsize, handlebox): patch_width = width current_position = x0 - for color, proportion in zip(self.colors, self.proportions): + for color, proportion in zip(self.colors, self.proportions, strict=False): handlebox.add_artist( patches.Rectangle( [current_position, y0], patch_width * proportion, height, fc=color @@ -157,14 +158,14 @@ def generic_trace_to_matplotlib(trace, antialiased=True): if "lines" not in mode: props["ls"] = "" if "markers" in mode: - if not props.get("marker", None): + if not props.get("marker"): props["marker"] = "o" else: props["marker"] = None if "text" in mode and trace.get("text", False) and len(coords) > 0: txt = trace["text"] txt = [txt] * len(coords[0]) if isinstance(txt, str) else txt - for *coords_s, txt in zip(*coords, txt): + for *coords_s, txt in zip(*coords, txt, strict=False): traces_mpl.append( { "constructor": "text", @@ -363,7 +364,10 @@ def draw_frame(frame_ind): if row_col_num in ranges and canvas_update: ax.set( **{f"{k}label": labels[row_col_num][k] for k in "xyz"}, - **{f"{k}lim": r for k, r in zip("xyz", ranges[row_col_num])}, + **{ + f"{k}lim": r + for k, r in zip("xyz", ranges[row_col_num], strict=False) + }, ) ax.set_box_aspect(aspect=(1, 1, 1)) if 0 < count <= legend_maxitems: diff --git a/src/magpylib/_src/display/backend_plotly.py b/src/magpylib/_src/display/backend_plotly.py index 93dd77caf..6ceb57c2b 100644 --- a/src/magpylib/_src/display/backend_plotly.py +++ b/src/magpylib/_src/display/backend_plotly.py @@ -3,9 +3,10 @@ # pylint: disable=C0302 # pylint: disable=too-many-branches # pylint: disable=too-many-positional-arguments +from __future__ import annotations import inspect -from functools import lru_cache +from functools import cache import numpy as np @@ -51,7 +52,7 @@ } -@lru_cache(maxsize=None) # Cache all results +@cache # Cache all results def match_args(ttype: str): """ Return named arguments of a Plotly graph object function. @@ -98,7 +99,7 @@ def apply_fig_ranges(fig, ranges_rc, labels_rc, apply2d=True): """ for rc, ranges in ranges_rc.items(): row, col = rc - labels = labels_rc.get(rc, {k: "" for k in "xyz"}) + labels = labels_rc.get(rc, dict.fromkeys("xyz", "")) kwargs = { **{ f"{k}axis": { @@ -108,7 +109,7 @@ def apply_fig_ranges(fig, ranges_rc, labels_rc, apply2d=True): } for i, k in enumerate("xyz") }, - "aspectratio": {k: 1 for k in "xyz"}, + "aspectratio": dict.fromkeys("xyz", 1), "aspectmode": "manual", "camera_eye": {"x": 1, "y": -1.5, "z": 1.4}, } diff --git a/src/magpylib/_src/display/backend_pyvista.py b/src/magpylib/_src/display/backend_pyvista.py index adcf81c5b..a8a3037c5 100644 --- a/src/magpylib/_src/display/backend_pyvista.py +++ b/src/magpylib/_src/display/backend_pyvista.py @@ -3,6 +3,7 @@ # pylint: disable=too-many-branches # pylint: disable=too-many-statements # pylint: disable=too-many-positional-arguments +from __future__ import annotations import os import tempfile diff --git a/src/magpylib/_src/display/display.py b/src/magpylib/_src/display/display.py index 66098cb6b..85651e8a6 100644 --- a/src/magpylib/_src/display/display.py +++ b/src/magpylib/_src/display/display.py @@ -1,5 +1,7 @@ """Display function codes""" +from __future__ import annotations + import warnings from contextlib import contextmanager from importlib import import_module @@ -7,17 +9,19 @@ from matplotlib.axes import Axes as mplAxes from matplotlib.figure import Figure as mplFig -from magpylib._src.defaults.defaults_utility import _DefaultValue -from magpylib._src.defaults.defaults_utility import get_defaults_dict -from magpylib._src.display.traces_generic import MagpyMarkers -from magpylib._src.display.traces_generic import get_frames -from magpylib._src.display.traces_utility import DEFAULT_ROW_COL_PARAMS -from magpylib._src.display.traces_utility import linearize_dict -from magpylib._src.display.traces_utility import process_show_input_objs -from magpylib._src.input_checks import check_format_input_backend -from magpylib._src.input_checks import check_format_input_vector -from magpylib._src.input_checks import check_input_animation -from magpylib._src.input_checks import check_input_canvas_update +from magpylib._src.defaults.defaults_utility import _DefaultValue, get_defaults_dict +from magpylib._src.display.traces_generic import MagpyMarkers, get_frames +from magpylib._src.display.traces_utility import ( + DEFAULT_ROW_COL_PARAMS, + linearize_dict, + process_show_input_objs, +) +from magpylib._src.input_checks import ( + check_format_input_backend, + check_format_input_vector, + check_input_animation, + check_input_canvas_update, +) from magpylib._src.utility import check_path_format disp_args = set(get_defaults_dict("display")) diff --git a/src/magpylib/_src/display/sensor_mesh.py b/src/magpylib/_src/display/sensor_mesh.py index 0095b4436..04495bd5b 100644 --- a/src/magpylib/_src/display/sensor_mesh.py +++ b/src/magpylib/_src/display/sensor_mesh.py @@ -1,4 +1,5 @@ # pylint: disable=too-many-positional-arguments +from __future__ import annotations import numpy as np from scipy.spatial.transform import Rotation as RotScipy @@ -169,7 +170,7 @@ def get_sensor_mesh( show = (center_show, x_show, y_show, z_show) for k in ("i", "j", "k", "facecolor"): t = [] - for i, s in zip(indices, show): + for i, s in zip(indices, show, strict=False): if s: t.extend(trace[k][i[0] : i[1]]) trace[k] = np.array(t) diff --git a/src/magpylib/_src/display/traces_base.py b/src/magpylib/_src/display/traces_base.py index e752c65f6..b28a7a630 100644 --- a/src/magpylib/_src/display/traces_base.py +++ b/src/magpylib/_src/display/traces_base.py @@ -1,14 +1,14 @@ """base traces building functions""" # pylint: disable=too-many-positional-arguments +from __future__ import annotations from functools import partial import numpy as np from scipy.spatial import ConvexHull # pylint: disable=no-name-in-module -from magpylib._src.display.traces_utility import merge_mesh3d -from magpylib._src.display.traces_utility import place_and_orient_model3d +from magpylib._src.display.traces_utility import merge_mesh3d, place_and_orient_model3d from magpylib._src.fields.field_BH_tetrahedron import check_chirality @@ -602,7 +602,7 @@ def make_Tetrahedron( # create triangles implying right vertices chirality triangles = np.array([[0, 2, 1], [0, 3, 2], [1, 3, 0], [1, 2, 3]]) points = check_chirality(np.array([vertices]))[0] - trace = dict(zip("xyzijk", [*points.T, *triangles.T])) + trace = dict(zip("xyzijk", [*points.T, *triangles.T], strict=False)) trace = place_and_orient_model3d(trace, orientation=orientation, position=position) return get_model(trace, backend=backend, show=show, scale=scale, kwargs=kwargs) diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index d3c8cd15a..ea7809560 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -5,13 +5,11 @@ # pylint: disable=too-many-statements # pylint: disable=too-many-nested-blocks # pylint: disable=cyclic-import +from __future__ import annotations + import warnings -from itertools import combinations -from itertools import cycle +from itertools import combinations, cycle from typing import Any -from typing import Dict -from typing import List -from typing import Union import numpy as np from scipy.spatial import distance @@ -30,16 +28,18 @@ from magpylib._src.display.traces_base import ( make_TriangularMesh as make_BaseTriangularMesh, ) -from magpylib._src.display.traces_utility import create_null_dim_trace -from magpylib._src.display.traces_utility import draw_arrow_from_vertices -from magpylib._src.display.traces_utility import draw_arrow_on_circle -from magpylib._src.display.traces_utility import get_legend_label -from magpylib._src.display.traces_utility import merge_mesh3d -from magpylib._src.display.traces_utility import place_and_orient_model3d -from magpylib._src.display.traces_utility import triangles_area +from magpylib._src.display.traces_utility import ( + create_null_dim_trace, + draw_arrow_from_vertices, + draw_arrow_on_circle, + get_legend_label, + merge_mesh3d, + place_and_orient_model3d, + triangles_area, +) -def make_DefaultTrace(obj, **kwargs) -> Union[Dict[str, Any], List[Dict[str, Any]]]: +def make_DefaultTrace(obj, **kwargs) -> dict[str, Any] | list[dict[str, Any]]: """ Creates the plotly scatter3d parameters for an object with no specifically supported representation. The object will be represented by a scatter point and text above with object @@ -59,7 +59,7 @@ def make_DefaultTrace(obj, **kwargs) -> Union[Dict[str, Any], List[Dict[str, Any return {**trace, **kwargs} -def make_Polyline(obj, **kwargs) -> Union[Dict[str, Any], List[Dict[str, Any]]]: +def make_Polyline(obj, **kwargs) -> dict[str, Any] | list[dict[str, Any]]: """ Creates the plotly scatter3d parameters for a Polyline current in a dictionary based on the provided arguments. @@ -100,7 +100,7 @@ def make_Polyline(obj, **kwargs) -> Union[Dict[str, Any], List[Dict[str, Any]]]: return traces -def make_Circle(obj, base=72, **kwargs) -> Union[Dict[str, Any], List[Dict[str, Any]]]: +def make_Circle(obj, base=72, **kwargs) -> dict[str, Any] | list[dict[str, Any]]: """ Creates the plotly scatter3d parameters for a Circle current in a dictionary based on the provided arguments. @@ -145,7 +145,7 @@ def make_Circle(obj, base=72, **kwargs) -> Union[Dict[str, Any], List[Dict[str, return traces -def make_Dipole(obj, autosize=None, **kwargs) -> Dict[str, Any]: +def make_Dipole(obj, autosize=None, **kwargs) -> dict[str, Any]: """ Create the plotly mesh3d parameters for a dipole in a dictionary based on the provided arguments. @@ -182,7 +182,7 @@ def make_Dipole(obj, autosize=None, **kwargs) -> Dict[str, Any]: return {**trace, **kwargs} -def make_Cuboid(obj, **kwargs) -> Dict[str, Any]: +def make_Cuboid(obj, **kwargs) -> dict[str, Any]: """ Create the plotly mesh3d parameters for a Cuboid Magnet in a dictionary based on the provided arguments. @@ -197,7 +197,7 @@ def make_Cuboid(obj, **kwargs) -> Dict[str, Any]: return {**trace, **kwargs} -def make_Cylinder(obj, base=50, **kwargs) -> Dict[str, Any]: +def make_Cylinder(obj, base=50, **kwargs) -> dict[str, Any]: """ Create the plotly mesh3d parameters for a Cylinder Magnet in a dictionary based on the provided arguments. @@ -217,7 +217,7 @@ def make_Cylinder(obj, base=50, **kwargs) -> Dict[str, Any]: return {**trace, **kwargs} -def make_CylinderSegment(obj, vertices=25, **kwargs) -> Dict[str, Any]: +def make_CylinderSegment(obj, vertices=25, **kwargs) -> dict[str, Any]: """ Create the plotly mesh3d parameters for a Cylinder Segment Magnet in a dictionary based on the provided arguments. @@ -232,7 +232,7 @@ def make_CylinderSegment(obj, vertices=25, **kwargs) -> Dict[str, Any]: return {**trace, **kwargs} -def make_Sphere(obj, vertices=15, **kwargs) -> Dict[str, Any]: +def make_Sphere(obj, vertices=15, **kwargs) -> dict[str, Any]: """ Create the plotly mesh3d parameters for a Sphere Magnet in a dictionary based on the provided arguments. @@ -252,7 +252,7 @@ def make_Sphere(obj, vertices=15, **kwargs) -> Dict[str, Any]: return {**trace, **kwargs} -def make_Tetrahedron(obj, **kwargs) -> Dict[str, Any]: +def make_Tetrahedron(obj, **kwargs) -> dict[str, Any]: """ Create the plotly mesh3d parameters for a Tetrahedron Magnet in a dictionary based on the provided arguments. @@ -267,7 +267,7 @@ def make_Tetrahedron(obj, **kwargs) -> Dict[str, Any]: return {**trace, **kwargs} -def make_triangle_orientations(obj, **kwargs) -> Dict[str, Any]: +def make_triangle_orientations(obj, **kwargs) -> dict[str, Any]: """ Create the plotly mesh3d parameters for a triangle orientation cone or arrow3d in a dictionary based on the provided arguments. @@ -343,7 +343,7 @@ def get_closest_vertices(faces_subsets, vertices): return np.array(closest_verts_list) -def make_mesh_lines(obj, mode, **kwargs) -> Dict[str, Any]: +def make_mesh_lines(obj, mode, **kwargs) -> dict[str, Any]: """Draw mesh lines and vertices""" # pylint: disable=protected-access kwargs.pop("color", None) @@ -388,7 +388,7 @@ def make_mesh_lines(obj, mode, **kwargs) -> Dict[str, Any]: return {**trace, **kwargs} -def make_Triangle(obj, **kwargs) -> Union[Dict[str, Any], List[Dict[str, Any]]]: +def make_Triangle(obj, **kwargs) -> dict[str, Any] | list[dict[str, Any]]: """ Creates the plotly mesh3d parameters for a Trianglular facet in a dictionary based on the provided arguments. @@ -430,7 +430,7 @@ def make_Triangle(obj, **kwargs) -> Union[Dict[str, Any], List[Dict[str, Any]]]: return traces -def make_TriangularMesh_single(obj, **kwargs) -> Dict[str, Any]: +def make_TriangularMesh_single(obj, **kwargs) -> dict[str, Any]: """ Creates the plotly mesh3d parameters for a Trianglular facet mesh in a dictionary based on the provided arguments. @@ -445,7 +445,7 @@ def make_TriangularMesh_single(obj, **kwargs) -> Dict[str, Any]: return {**trace, **kwargs} -def make_TriangularMesh(obj, **kwargs) -> Union[Dict[str, Any], List[Dict[str, Any]]]: +def make_TriangularMesh(obj, **kwargs) -> dict[str, Any] | list[dict[str, Any]]: """ Creates the plotly mesh3d parameters for a Trianglular facet mesh in a dictionary based on the provided arguments. @@ -487,15 +487,15 @@ def make_TriangularMesh(obj, **kwargs) -> Union[Dict[str, Any], List[Dict[str, A subsets = obj.get_faces_subsets() col_seq = cycle(obj.style.mesh.disconnected.colorsequence) exponent = np.log10(len(subsets)).astype(int) + 1 - for ind, (tri, dis_color) in enumerate(zip(subsets, col_seq)): + for ind, (tri, dis_color) in enumerate(zip(subsets, col_seq, strict=False)): # temporary mutate faces from subset obj._faces = tri obj.style.magnetization.show = False tr = make_TriangularMesh_single(obj, **{**kwargs, "color": dis_color}) # match first group with path scatter trace - lg_suff = "" if ind == 0 else f"- part_{ind+1:02d}" + lg_suff = "" if ind == 0 else f"- part_{ind + 1:02d}" tr["legendgroup"] = f"{kwargs.get('legendgroup', obj)}{lg_suff}" - tr["name_suffix"] = f" - part_{ind+1:0{exponent}d}" + tr["name_suffix"] = f" - part_{ind + 1:0{exponent}d}" traces.append(tr) if style.orientation.show: traces.append( @@ -522,7 +522,7 @@ def make_TriangularMesh(obj, **kwargs) -> Union[Dict[str, Any], List[Dict[str, A return traces -def make_Pixels(positions, size=1) -> Dict[str, Any]: +def make_Pixels(positions, size=1) -> dict[str, Any]: """ Create the plotly mesh3d parameters for Sensor pixels based on pixel positions and chosen size For now, only "cube" shape is provided. @@ -534,7 +534,7 @@ def make_Pixels(positions, size=1) -> Dict[str, Any]: return merge_mesh3d(*pixels) -def make_Sensor(obj, autosize=None, **kwargs) -> Dict[str, Any]: +def make_Sensor(obj, autosize=None, **kwargs) -> dict[str, Any]: """ Create the plotly mesh3d parameters for a Sensor object in a dictionary based on the provided arguments. diff --git a/src/magpylib/_src/display/traces_generic.py b/src/magpylib/_src/display/traces_generic.py index 21a301ea4..3d2ff7916 100644 --- a/src/magpylib/_src/display/traces_generic.py +++ b/src/magpylib/_src/display/traces_generic.py @@ -6,37 +6,42 @@ # pylint: disable=too-many-nested-blocks # pylint: disable=cyclic-import # pylint: disable=too-many-positional-arguments +from __future__ import annotations import numbers import warnings from collections import Counter -from itertools import chain -from itertools import cycle -from typing import Tuple +from itertools import chain, cycle import numpy as np import magpylib as magpy from magpylib._src.defaults.defaults_classes import default_settings -from magpylib._src.defaults.defaults_utility import ALLOWED_LINESTYLES -from magpylib._src.defaults.defaults_utility import ALLOWED_SYMBOLS -from magpylib._src.defaults.defaults_utility import linearize_dict -from magpylib._src.display.traces_utility import draw_arrowed_line -from magpylib._src.display.traces_utility import get_legend_label -from magpylib._src.display.traces_utility import get_objects_props_by_row_col -from magpylib._src.display.traces_utility import get_rot_pos_from_path -from magpylib._src.display.traces_utility import get_scene_ranges -from magpylib._src.display.traces_utility import getColorscale -from magpylib._src.display.traces_utility import getIntensity -from magpylib._src.display.traces_utility import group_traces -from magpylib._src.display.traces_utility import place_and_orient_model3d -from magpylib._src.display.traces_utility import rescale_traces -from magpylib._src.display.traces_utility import slice_mesh_from_colorscale +from magpylib._src.defaults.defaults_utility import ( + ALLOWED_LINESTYLES, + ALLOWED_SYMBOLS, + linearize_dict, +) +from magpylib._src.display.traces_utility import ( + draw_arrowed_line, + get_legend_label, + get_objects_props_by_row_col, + get_rot_pos_from_path, + get_scene_ranges, + getColorscale, + getIntensity, + group_traces, + place_and_orient_model3d, + rescale_traces, + slice_mesh_from_colorscale, +) from magpylib._src.style import DefaultMarkers -from magpylib._src.utility import format_obj_input -from magpylib._src.utility import get_unit_factor -from magpylib._src.utility import style_temp_edit -from magpylib._src.utility import unit_prefix +from magpylib._src.utility import ( + format_obj_input, + get_unit_factor, + style_temp_edit, + unit_prefix, +) class MagpyMarkers: @@ -231,7 +236,9 @@ def get_trace2D_dict( unit = ( units_polarization if field_str in "BJ" - else units_magnetization if field_str in "HM" else "" + else units_magnetization + if field_str in "HM" + else "" ) trace = { "mode": "lines+markers", @@ -566,7 +573,7 @@ def get_generic_traces3D( temp_rot_traces = [] name_suff = tr.pop("name_suffix", None) name = tr.get("name", "") if legendtext is None else legendtext - for orient, pos in zip(orientations, positions): + for orient, pos in zip(orientations, positions, strict=False): tr1 = place_and_orient_model3d(tr, orientation=orient, position=pos) if name_suff is not None: tr1["name"] = f"{name}{name_suff}" @@ -599,7 +606,9 @@ def get_generic_traces3D( tr["showlegend"] = ( showlegend if showlegend is not None - else tr_showleg if style.legend.show else False + else tr_showleg + if style.legend.show + else False ) out = {"generic": path_traces_generic} @@ -609,7 +618,7 @@ def get_generic_traces3D( continue extr.update(extr.updatefunc()) # update before checking backend if extr.backend == extra_backend: - for orient, pos in zip(orientations, positions): + for orient, pos in zip(orientations, positions, strict=False): tr_non_generic = { "model3d": extr, "position": pos, @@ -621,7 +630,9 @@ def get_generic_traces3D( "showlegend": ( showlegend if showlegend is not None - else None if style.legend.show else False + else None + if style.legend.show + else False ), "name": legendtext if legendtext else legend_label, "row": row, @@ -781,7 +792,7 @@ def get_traces_3D(flat_objs_props, extra_backend=False, autosize=None, **kwargs) return traces_dict, extra_backend_traces -def draw_frame(objs, *, colorsequence, rc_params, style_kwargs, **kwargs) -> Tuple: +def draw_frame(objs, *, colorsequence, rc_params, style_kwargs, **kwargs) -> tuple: """ Creates traces from input `objs` and provided parameters, updates the size of objects like Sensors and Dipoles in `kwargs` depending on the canvas size. @@ -900,7 +911,7 @@ def get_frames( if animation: style_kwargs["style_path_frames"] = [ind] title = "Animation 3D - " if title is None else title - title_str = f"""{title}path index: {ind+1:0{exp}d}""" + title_str = f"""{title}path index: {ind + 1:0{exp}d}""" traces, extra_backend_traces, rc_params_temp = draw_frame( objs, colorsequence=colorsequence, @@ -924,7 +935,7 @@ def get_frames( traces = [t for frame in frames for t in frame["data"]] zoom = {rc: v["zoom"] for rc, v in rc_params.items()} ranges_rc = get_scene_ranges(*traces, *extra_backend_traces, zoom=zoom) - labels_rc = {(1, 1): {k: "" for k in "xyz"}} + labels_rc = {(1, 1): dict.fromkeys("xyz", "")} scale_factors_rc = {} for rc, params in rc_params.items(): units_length = params["units_length"] diff --git a/src/magpylib/_src/display/traces_utility.py b/src/magpylib/_src/display/traces_utility.py index d1dd5b531..a55118aa2 100644 --- a/src/magpylib/_src/display/traces_utility.py +++ b/src/magpylib/_src/display/traces_utility.py @@ -2,12 +2,11 @@ # pylint: disable=too-many-branches # pylint: disable=too-many-positional-arguments +from __future__ import annotations from collections import defaultdict from functools import lru_cache -from itertools import chain -from itertools import cycle -from typing import Tuple +from itertools import chain, cycle import numpy as np from scipy.spatial.transform import Rotation as RotScipy @@ -16,8 +15,7 @@ from magpylib._src.defaults.defaults_utility import linearize_dict from magpylib._src.input_checks import check_input_zoom from magpylib._src.style import get_style -from magpylib._src.utility import format_obj_input -from magpylib._src.utility import merge_dicts_with_conflict_check +from magpylib._src.utility import format_obj_input, merge_dicts_with_conflict_check DEFAULT_ROW_COL_PARAMS = { "row": 1, @@ -117,17 +115,16 @@ def get_vertices_from_model(model_kwargs, model_args=None, coordsargs=None): useargs = True ind = int(key[5]) v = model_args[ind] + elif key in model_kwargs: + v = model_kwargs[key] else: - if key in model_kwargs: - v = model_kwargs[key] - else: - raise ValueError( - "Rotating/Moving of provided model failed, trace dictionary " - f"has no argument {k!r}, use `coordsargs` to specify the names of the " - "coordinates to be used.\n" - "Matplotlib backends will set up coordsargs automatically if " - "the `args=(xs,ys,zs)` argument is provided." - ) + raise ValueError( + "Rotating/Moving of provided model failed, trace dictionary " + f"has no argument {k!r}, use `coordsargs` to specify the names of the " + "coordinates to be used.\n" + "Matplotlib backends will set up coordsargs automatically if " + "the `args=(xs,ys,zs)` argument is provided." + ) vertices.append(v) vertices = np.array(vertices) @@ -142,7 +139,7 @@ def draw_arrowed_line( arrow_pos=0.5, pivot="middle", include_line=True, -) -> Tuple: +) -> tuple: """ Provides x,y,z coordinates of an arrow drawn in the x-y-plane (z=0), showing up the y-axis and centered in x,y,z=(0,0,0). The arrow vertices are then turned in the direction of `vec` and @@ -160,7 +157,9 @@ def draw_arrowed_line( anchor = ( (0, -0.5, 0) if pivot == "tip" - else (0, 0.5, 0) if pivot == "tail" else (0, 0, 0) + else (0, 0.5, 0) + if pivot == "tail" + else (0, 0, 0) ) arrow = [ [0, arrow_shift, 0], @@ -209,7 +208,7 @@ def draw_arrow_from_vertices( arrow_pos=arrow_pos, include_line=include_line, ).T - for vec, pos, siz in zip(vectors, positions, arrow_sizes) + for vec, pos, siz in zip(vectors, positions, arrow_sizes, strict=False) ], axis=1, ) @@ -356,7 +355,9 @@ def merge_mesh3d(*traces): L = np.array([0] + [len(b["x"]) for b in traces[:-1]]).cumsum() for k in "ijk": if k in traces[0]: - merged_trace[k] = np.hstack([b[k] + l for b, l in zip(traces, L)]) + merged_trace[k] = np.hstack( + [b[k] + l for b, l in zip(traces, L, strict=False)] + ) for k in "xyz": merged_trace[k] = np.concatenate([b[k] for b in traces]) for k in ("intensity", "facecolor"): @@ -515,7 +516,7 @@ def get_scene_ranges(*traces, zoom=0) -> np.ndarray: coordsargs=tr.get("coordsargs", None), ) kwex = tr["kwargs_extra"] - tr = dict(zip("xyz", verts)) + tr = dict(zip("xyz", verts, strict=False)) rc = kwex["row"], kwex["col"] if rc not in ranges_rc: ranges_rc[rc] = {k: [] for k in "xyz"} @@ -534,7 +535,9 @@ def get_scene_ranges(*traces, zoom=0) -> np.ndarray: pts = pts.reshape(-1, 3) if pts.size != 0: min_max = np.nanmin(pts, axis=0), np.nanmax(pts, axis=0) - for v, min_, max_ in zip(ranges_rc[rc].values(), *min_max): + for v, min_, max_ in zip( + ranges_rc[rc].values(), *min_max, strict=False + ): v.extend([min_, max_]) for rc, ranges in ranges_rc.items(): if tr_dim_count[rc]["3D"]: @@ -790,7 +793,7 @@ def slice_mesh_from_colorscale(trace, axis, colorscale): (vl, tl), (vr, tr) = slice_mesh_with_plane(vr, tr, origs[ind], axis) else: vl, tl = vr, tr - trace_temp = dict(zip("xyzijk", [*vl.T, *tl.T])) + trace_temp = dict(zip("xyzijk", [*vl.T, *tl.T], strict=False)) trace_temp.update(facecolor=np.array([color] * len(tl))) traces.append(trace_temp) return {**trace, **merge_mesh3d(*traces)} diff --git a/src/magpylib/_src/exceptions.py b/src/magpylib/_src/exceptions.py index 459b9d740..30d0ff278 100644 --- a/src/magpylib/_src/exceptions.py +++ b/src/magpylib/_src/exceptions.py @@ -1,5 +1,7 @@ """Definition of custom exceptions""" +from __future__ import annotations + class MagpylibBadUserInput(Exception): """bad user input""" diff --git a/src/magpylib/_src/fields/__init__.py b/src/magpylib/_src/fields/__init__.py index 621e57c76..71eb106b6 100644 --- a/src/magpylib/_src/fields/__init__.py +++ b/src/magpylib/_src/fields/__init__.py @@ -1,9 +1,8 @@ """_src.fields""" -__all__ = ["getB", "getH", "getM", "getJ"] +from __future__ import annotations + +__all__ = ["getB", "getH", "getJ", "getM"] # create interface to outside of package -from magpylib._src.fields.field_wrap_BH import getB -from magpylib._src.fields.field_wrap_BH import getH -from magpylib._src.fields.field_wrap_BH import getJ -from magpylib._src.fields.field_wrap_BH import getM +from magpylib._src.fields.field_wrap_BH import getB, getH, getJ, getM diff --git a/src/magpylib/_src/fields/field_BH_circle.py b/src/magpylib/_src/fields/field_BH_circle.py index 43580e1db..490175940 100644 --- a/src/magpylib/_src/fields/field_BH_circle.py +++ b/src/magpylib/_src/fields/field_BH_circle.py @@ -3,13 +3,14 @@ a circular current loop. Computation details in function docstrings. """ +from __future__ import annotations + import numpy as np from scipy.constants import mu_0 as MU0 from magpylib._src.fields.special_cel import cel_iter from magpylib._src.input_checks import check_field_input -from magpylib._src.utility import cart_to_cyl_coordinates -from magpylib._src.utility import cyl_field_to_cart +from magpylib._src.utility import cart_to_cyl_coordinates, cyl_field_to_cart # CORE @@ -152,5 +153,5 @@ def BHJM_circle( return BHJM * MU0 raise ValueError( # pragma: no cover - "`output_field_type` must be one of ('B', 'H', 'M', 'J'), " f"got {field!r}" + f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" ) diff --git a/src/magpylib/_src/fields/field_BH_cuboid.py b/src/magpylib/_src/fields/field_BH_cuboid.py index 2204187b2..2dae0bb24 100644 --- a/src/magpylib/_src/fields/field_BH_cuboid.py +++ b/src/magpylib/_src/fields/field_BH_cuboid.py @@ -3,6 +3,8 @@ magnetized Cuboids. Computation details in function docstrings. """ +from __future__ import annotations + import numpy as np from scipy.constants import mu_0 as MU0 @@ -274,5 +276,5 @@ def BHJM_magnet_cuboid( return BHJM / MU0 raise ValueError( # pragma: no cover - "`output_field_type` must be one of ('B', 'H', 'M', 'J'), " f"got {field!r}" + f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" ) diff --git a/src/magpylib/_src/fields/field_BH_cylinder.py b/src/magpylib/_src/fields/field_BH_cylinder.py index 7f3c826d5..9076af6f5 100644 --- a/src/magpylib/_src/fields/field_BH_cylinder.py +++ b/src/magpylib/_src/fields/field_BH_cylinder.py @@ -4,16 +4,15 @@ """ # pylint: disable = no-name-in-module +from __future__ import annotations import numpy as np from scipy.constants import mu_0 as MU0 -from scipy.special import ellipe -from scipy.special import ellipk +from scipy.special import ellipe, ellipk from magpylib._src.fields.special_cel import cel from magpylib._src.input_checks import check_field_input -from magpylib._src.utility import cart_to_cyl_coordinates -from magpylib._src.utility import cyl_field_to_cart +from magpylib._src.utility import cart_to_cyl_coordinates, cyl_field_to_cart # CORE @@ -397,5 +396,5 @@ def BHJM_magnet_cylinder( return BHJM / MU0 raise ValueError( # pragma: no cover - "`output_field_type` must be one of ('B', 'H', 'M', 'J'), " f"got {field!r}" + f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" ) diff --git a/src/magpylib/_src/fields/field_BH_cylinder_segment.py b/src/magpylib/_src/fields/field_BH_cylinder_segment.py index f09a7d8e9..ce4baef56 100644 --- a/src/magpylib/_src/fields/field_BH_cylinder_segment.py +++ b/src/magpylib/_src/fields/field_BH_cylinder_segment.py @@ -4,11 +4,11 @@ # pylint: disable=no-name-in-module # pylint: disable=too-many-statements # pylint: disable=too-many-positional-arguments +from __future__ import annotations import numpy as np from scipy.constants import mu_0 as MU0 -from scipy.special import ellipeinc -from scipy.special import ellipkinc +from scipy.special import ellipeinc, ellipkinc from magpylib._src.fields.field_BH_cylinder import BHJM_magnet_cylinder from magpylib._src.fields.special_el3 import el3_angle @@ -2285,7 +2285,7 @@ def magnet_cylinder_segment_Hfield( ] # calling case functions with respective masked arguments - for cid, cfkt, cargs in zip(case_id, case_fkt, case_args): + for cid, cfkt, cargs in zip(case_id, case_fkt, case_args, strict=False): mask = cases == cid if any(mask): result[mask] = cfkt(*[allargs[aid][mask] for aid in cargs]) @@ -2458,7 +2458,7 @@ def BHJM_cylinder_segment( return BHJM raise ValueError( # pragma: no cover - "`output_field_type` must be one of ('B', 'H', 'M', 'J'), " f"got {field!r}" + f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" ) # return convert_HBMJ( diff --git a/src/magpylib/_src/fields/field_BH_dipole.py b/src/magpylib/_src/fields/field_BH_dipole.py index 7b377336a..020edb37f 100644 --- a/src/magpylib/_src/fields/field_BH_dipole.py +++ b/src/magpylib/_src/fields/field_BH_dipole.py @@ -2,6 +2,8 @@ Core implementation of dipole field """ +from __future__ import annotations + import numpy as np from scipy.constants import mu_0 as MU0 @@ -101,5 +103,5 @@ def BHJM_dipole( return BHJM * MU0 raise ValueError( # pragma: no cover - "`output_field_type` must be one of ('B', 'H', 'M', 'J'), " f"got {field!r}" + f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" ) diff --git a/src/magpylib/_src/fields/field_BH_polyline.py b/src/magpylib/_src/fields/field_BH_polyline.py index 67b1a875a..98fe36b68 100644 --- a/src/magpylib/_src/fields/field_BH_polyline.py +++ b/src/magpylib/_src/fields/field_BH_polyline.py @@ -3,6 +3,7 @@ """ # pylint: disable=too-many-positional-arguments +from __future__ import annotations import numpy as np from numpy.linalg import norm @@ -242,5 +243,5 @@ def BHJM_current_polyline( return BHJM * MU0 raise ValueError( # pragma: no cover - "`output_field_type` must be one of ('B', 'H', 'M', 'J'), " f"got {field!r}" + f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" ) diff --git a/src/magpylib/_src/fields/field_BH_sphere.py b/src/magpylib/_src/fields/field_BH_sphere.py index f3d58d3f5..6b6131ab7 100644 --- a/src/magpylib/_src/fields/field_BH_sphere.py +++ b/src/magpylib/_src/fields/field_BH_sphere.py @@ -3,6 +3,8 @@ magnetized Spheres. Computation details in function docstrings. """ +from __future__ import annotations + import numpy as np from scipy.constants import mu_0 as MU0 @@ -114,5 +116,5 @@ def BHJM_magnet_sphere( return BHJM / MU0 raise ValueError( # pragma: no cover - "`output_field_type` must be one of ('B', 'H', 'M', 'J'), " f"got {field!r}" + f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" ) diff --git a/src/magpylib/_src/fields/field_BH_tetrahedron.py b/src/magpylib/_src/fields/field_BH_tetrahedron.py index 5b392ec43..e8e6c61eb 100644 --- a/src/magpylib/_src/fields/field_BH_tetrahedron.py +++ b/src/magpylib/_src/fields/field_BH_tetrahedron.py @@ -3,6 +3,8 @@ magnetized tetrahedra. Computation details in function docstrings. """ +from __future__ import annotations + import numpy as np from scipy.constants import mu_0 as MU0 @@ -127,5 +129,5 @@ def BHJM_magnet_tetrahedron( return BHJM raise ValueError( # pragma: no cover - "`output_field_type` must be one of ('B', 'H', 'M', 'J'), " f"got {field!r}" + f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" ) diff --git a/src/magpylib/_src/fields/field_BH_triangle.py b/src/magpylib/_src/fields/field_BH_triangle.py index ff23601ba..904195394 100644 --- a/src/magpylib/_src/fields/field_BH_triangle.py +++ b/src/magpylib/_src/fields/field_BH_triangle.py @@ -4,6 +4,8 @@ """ # pylance: disable=Code is unreachable +from __future__ import annotations + import numpy as np from scipy.constants import mu_0 as MU0 @@ -214,5 +216,5 @@ def BHJM_triangle( return BHJM / MU0 raise ValueError( # pragma: no cover - "`output_field_type` must be one of ('B', 'H', 'M', 'J'), " f"got {field!r}" + f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" ) diff --git a/src/magpylib/_src/fields/field_BH_triangularmesh.py b/src/magpylib/_src/fields/field_BH_triangularmesh.py index f9928faa1..15cdd0805 100644 --- a/src/magpylib/_src/fields/field_BH_triangularmesh.py +++ b/src/magpylib/_src/fields/field_BH_triangularmesh.py @@ -6,6 +6,8 @@ # pylint: disable=too-many-nested-blocks # pylint: disable=too-many-branches # pylance: disable=Code is unreachable +from __future__ import annotations + import numpy as np import scipy.spatial from scipy.constants import mu_0 as MU0 @@ -373,7 +375,7 @@ def segments_intersect_facets(segments, facets, eps=1e-6): cross = (np.sign(g1) != np.sign(g2)) * (np.abs(g1) > eps) * (np.abs(g2) > eps) v = [] # get signed volumes - for i, j in zip((0, 1, 2), (1, 2, 0)): + for i, j in zip((0, 1, 2), (1, 2, 0), strict=False): sv = np.sum((t[i] - s[1]) * np.cross(t[j] - s[1], s[0] - s[1]), axis=1) v.append(np.sign(sv)) @@ -574,5 +576,5 @@ def BHJM_magnet_trimesh( return BHJM / MU0 raise ValueError( # pragma: no cover - "`output_field_type` must be one of ('B', 'H', 'M', 'J'), " f"got {field!r}" + f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" ) diff --git a/src/magpylib/_src/fields/field_wrap_BH.py b/src/magpylib/_src/fields/field_wrap_BH.py index a4209f0b6..702ccab9c 100644 --- a/src/magpylib/_src/fields/field_wrap_BH.py +++ b/src/magpylib/_src/fields/field_wrap_BH.py @@ -49,26 +49,32 @@ level5(sens.getB, sens.getH): <--- USER INTERFACE """ + +from __future__ import annotations + import numbers import warnings +from collections.abc import Callable from itertools import product -from typing import Callable import numpy as np from scipy.spatial.transform import Rotation as R -from magpylib._src.exceptions import MagpylibBadUserInput -from magpylib._src.exceptions import MagpylibMissingInput -from magpylib._src.input_checks import check_dimensions -from magpylib._src.input_checks import check_excitations -from magpylib._src.input_checks import check_format_input_observers -from magpylib._src.input_checks import check_format_pixel_agg -from magpylib._src.input_checks import check_getBH_output_type -from magpylib._src.utility import check_static_sensor_orient -from magpylib._src.utility import format_obj_input -from magpylib._src.utility import format_src_inputs -from magpylib._src.utility import get_registered_sources -from magpylib._src.utility import has_parameter +from magpylib._src.exceptions import MagpylibBadUserInput, MagpylibMissingInput +from magpylib._src.input_checks import ( + check_dimensions, + check_excitations, + check_format_input_observers, + check_format_pixel_agg, + check_getBH_output_type, +) +from magpylib._src.utility import ( + check_static_sensor_orient, + format_obj_input, + format_src_inputs, + get_registered_sources, + has_parameter, +) def tile_group_property(group: list, n_pp: int, prop_name: str): @@ -279,11 +285,13 @@ def getBH_level2( # objects to tile up and reset below mask_reset = [max_path_len != pl for pl in path_lengths] - reset_obj = [obj for obj, mask in zip(obj_list, mask_reset) if mask] - reset_obj_m0 = [pl for pl, mask in zip(path_lengths, mask_reset) if mask] + reset_obj = [obj for obj, mask in zip(obj_list, mask_reset, strict=False) if mask] + reset_obj_m0 = [ + pl for pl, mask in zip(path_lengths, mask_reset, strict=False) if mask + ] if max_path_len > 1: - for obj, m0 in zip(reset_obj, reset_obj_m0): + for obj, m0 in zip(reset_obj, reset_obj_m0, strict=False): # length to be tiled m_tile = max_path_len - m0 # tile up position @@ -306,7 +314,7 @@ def getBH_level2( else r.apply(sens.pixel.reshape(-1, 3)) ) + p - for r, p in zip(sens._orientation, sens._position) + for r, p in zip(sens._orientation, sens._position, strict=False) ] for sens in sensors ] @@ -403,7 +411,7 @@ def getBH_level2( B = np.concatenate(Bagg, axis=2) # reset tiled objects - for obj, m0 in zip(reset_obj, reset_obj_m0): + for obj, m0 in zip(reset_obj, reset_obj_m0, strict=False): obj._position = obj._position[:m0] obj._orientation = obj._orientation[:m0] @@ -520,7 +528,7 @@ def getBH_dict_level2( val = np.array(val, dtype=float) except TypeError as err: raise MagpylibBadUserInput( - f"{key} input must be array-like.\n" f"Instead received {val}" + f"{key} input must be array-like.\nInstead received {val}" ) from err expected_dim = field_func_kwargs_ndim.get(key, 1) if val.ndim == expected_dim or ragged_seq[key]: diff --git a/src/magpylib/_src/fields/special_cel.py b/src/magpylib/_src/fields/special_cel.py index 71bf2ca26..cc5968eac 100644 --- a/src/magpylib/_src/fields/special_cel.py +++ b/src/magpylib/_src/fields/special_cel.py @@ -1,4 +1,5 @@ # pylint: disable=too-many-positional-arguments +from __future__ import annotations import math as m @@ -129,7 +130,9 @@ def ellipticPi(x, y): n_input = len(kcv) if n_input < 10: - return np.array([cel0(kc, p, c, s) for kc, p, c, s in zip(kcv, pv, cv, sv)]) + return np.array( + [cel0(kc, p, c, s) for kc, p, c, s in zip(kcv, pv, cv, sv, strict=False)] + ) return celv(kcv, pv, cv, sv) diff --git a/src/magpylib/_src/fields/special_el3.py b/src/magpylib/_src/fields/special_el3.py index aad6b2593..6f37479a8 100644 --- a/src/magpylib/_src/fields/special_el3.py +++ b/src/magpylib/_src/fields/special_el3.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import numpy as np from magpylib._src.fields.special_cel import cel @@ -558,7 +560,7 @@ def el3(xv: np.ndarray, kcv: np.ndarray, pv: np.ndarray) -> np.ndarray: n_input = len(xv) if n_input < 10: - return np.array([el30(x, kc, p) for x, kc, p in zip(xv, kcv, pv)]) + return np.array([el30(x, kc, p) for x, kc, p in zip(xv, kcv, pv, strict=False)]) return el3v(xv, kcv, pv) diff --git a/src/magpylib/_src/input_checks.py b/src/magpylib/_src/input_checks.py index 0ed91df4f..214a77b91 100644 --- a/src/magpylib/_src/input_checks.py +++ b/src/magpylib/_src/input_checks.py @@ -3,6 +3,7 @@ # pylint: disable=import-outside-toplevel # pylint: disable=cyclic-import # pylint: disable=too-many-positional-arguments +from __future__ import annotations import inspect import numbers @@ -13,10 +14,8 @@ from magpylib import _src from magpylib._src.defaults.defaults_classes import default_settings from magpylib._src.defaults.defaults_utility import SUPPORTED_PLOTTING_BACKENDS -from magpylib._src.exceptions import MagpylibBadUserInput -from magpylib._src.exceptions import MagpylibMissingInput -from magpylib._src.utility import format_obj_input -from magpylib._src.utility import wrong_obj_msg +from magpylib._src.exceptions import MagpylibBadUserInput, MagpylibMissingInput +from magpylib._src.utility import format_obj_input, wrong_obj_msg # pylint: disable=no-member @@ -61,11 +60,11 @@ def check_array_shape(inp: np.ndarray, dims: tuple, shape_m1: int, length=None, if inp.ndim in dims: if length is None: if inp.shape[-1] == shape_m1: - return None + return if shape_m1 == "any": - return None + return elif len(inp) == length: - return None + return raise MagpylibBadUserInput(msg) @@ -120,8 +119,7 @@ def check_field_input(inp): allowed = tuple("BHMJ") if not (isinstance(inp, str) and inp in allowed): raise MagpylibBadUserInput( - f"`field` input can only be one of {allowed}.\n" - f"Instead received {inp!r}." + f"`field` input can only be one of {allowed}.\nInstead received {inp!r}." ) @@ -131,7 +129,7 @@ def validate_field_func(val): - input and output shape must match """ if val is None: - return None + return if not callable(val): raise MagpylibBadUserInput( @@ -164,7 +162,7 @@ def validate_field_func(val): "(2,3)" ) - return None + return ################################################################# @@ -288,8 +286,7 @@ def check_format_input_scalar( return None ERR_MSG = ( - f"Input parameter `{sig_name}` must be {sig_type}.\n" - f"Instead received {inp!r}." + f"Input parameter `{sig_name}` must be {sig_type}.\nInstead received {inp!r}." ) if not isinstance(inp, numbers.Number): @@ -376,7 +373,7 @@ def check_format_input_vector2( inp, f"Input parameter `{param_name}` must contain only float compatible entries.\n", ) - for d1, d2 in zip(inp.shape, shape): + for d1, d2 in zip(inp.shape, shape, strict=False): if d2 is not None: if d1 != d2: raise ValueError(f"Input parameter `{param_name}` has bad shape.") @@ -448,7 +445,7 @@ def check_format_input_backend(inp): if inp in backends: return inp raise MagpylibBadUserInput( - f"Input parameter `backend` must be one of `{backends+[None]}`." + f"Input parameter `backend` must be one of `{backends + [None]}`." f"\nInstead received {inp!r}." ) diff --git a/src/magpylib/_src/obj_classes/class_BaseDisplayRepr.py b/src/magpylib/_src/obj_classes/class_BaseDisplayRepr.py index abe48a398..f50b2de4d 100644 --- a/src/magpylib/_src/obj_classes/class_BaseDisplayRepr.py +++ b/src/magpylib/_src/obj_classes/class_BaseDisplayRepr.py @@ -2,6 +2,8 @@ # pylint: disable=cyclic-import # pylint: disable=too-many-branches +from __future__ import annotations + import numpy as np from magpylib._src.display.display import show @@ -48,22 +50,22 @@ def _get_description(self, exclude=None): lines = [f"{self!r}"] for k in list(dict.fromkeys(list(UNITS) + list(params))): if not k.startswith("_") and k in params and k not in exclude: - unit = UNITS.get(k, None) + unit = UNITS.get(k) unit_str = f" {unit}" if unit else "" if k == "position": - val = getattr(self, "_position") + val = self._position if val.shape[0] != 1: lines.append(f" • path length: {val.shape[0]}") k = f"{k} (last)" val = f"{val[-1]}" elif k == "orientation": - val = getattr(self, "_orientation") + val = self._orientation val = val.as_rotvec(degrees=True) if len(val) != 1: k = f"{k} (last)" val = f"{val[-1]}" elif k == "pixel": - val = getattr(self, "pixel") + val = self.pixel if val is not None: px_shape = val.shape[:-1] val_str = f"{int(np.prod(px_shape))}" @@ -73,7 +75,7 @@ def _get_description(self, exclude=None): elif k == "status_disconnected_data": val = getattr(self, k) if val is not None: - val = f"{len(val)} part{'s'[:len(val)^1]}" + val = f"{len(val)} part{'s'[: len(val) ^ 1]}" elif isinstance(getattr(self, k), (list, tuple, np.ndarray)): val = np.array(getattr(self, k)) if np.prod(val.shape) > 4: @@ -105,11 +107,11 @@ def describe(self, *, exclude=("style", "field_func"), return_string=False): def _repr_html_(self): lines = self._get_description(exclude=("style", "field_func")) - return f"""
{'
'.join(lines)}
""" + return f"""
{"
".join(lines)}
""" def __repr__(self) -> str: name = getattr(self, "name", None) if name is None and hasattr(self, "style"): - name = getattr(getattr(self, "style"), "label", None) + name = getattr(self.style, "label", None) name_str = "" if name is None else f", label={name!r}" return f"{type(self).__name__}(id={id(self)!r}{name_str})" diff --git a/src/magpylib/_src/obj_classes/class_BaseExcitations.py b/src/magpylib/_src/obj_classes/class_BaseExcitations.py index f9b4ada82..2437ec39b 100644 --- a/src/magpylib/_src/obj_classes/class_BaseExcitations.py +++ b/src/magpylib/_src/obj_classes/class_BaseExcitations.py @@ -2,6 +2,7 @@ # pylint: disable=cyclic-import # pylint: disable=too-many-positional-arguments +from __future__ import annotations import warnings @@ -9,13 +10,14 @@ from magpylib._src.exceptions import MagpylibDeprecationWarning from magpylib._src.fields.field_wrap_BH import getBH_level2 -from magpylib._src.input_checks import check_format_input_scalar -from magpylib._src.input_checks import check_format_input_vector -from magpylib._src.input_checks import validate_field_func +from magpylib._src.input_checks import ( + check_format_input_scalar, + check_format_input_vector, + validate_field_func, +) from magpylib._src.obj_classes.class_BaseDisplayRepr import BaseDisplayRepr from magpylib._src.obj_classes.class_BaseGeo import BaseGeo -from magpylib._src.style import CurrentStyle -from magpylib._src.style import MagnetStyle +from magpylib._src.style import CurrentStyle, MagnetStyle from magpylib._src.utility import format_star_input diff --git a/src/magpylib/_src/obj_classes/class_BaseGeo.py b/src/magpylib/_src/obj_classes/class_BaseGeo.py index e01108f2e..4c8226f3d 100644 --- a/src/magpylib/_src/obj_classes/class_BaseGeo.py +++ b/src/magpylib/_src/obj_classes/class_BaseGeo.py @@ -3,12 +3,16 @@ # pylint: disable=cyclic-import # pylint: disable=too-many-instance-attributes # pylint: disable=protected-access +from __future__ import annotations + import numpy as np from scipy.spatial.transform import Rotation as R from magpylib._src.exceptions import MagpylibBadUserInput -from magpylib._src.input_checks import check_format_input_orientation -from magpylib._src.input_checks import check_format_input_vector +from magpylib._src.input_checks import ( + check_format_input_orientation, + check_format_input_vector, +) from magpylib._src.obj_classes.class_BaseTransform import BaseTransform from magpylib._src.style import BaseStyle from magpylib._src.utility import add_iteration_suffix diff --git a/src/magpylib/_src/obj_classes/class_BaseTransform.py b/src/magpylib/_src/obj_classes/class_BaseTransform.py index 9b0c1875f..05ad74afb 100644 --- a/src/magpylib/_src/obj_classes/class_BaseTransform.py +++ b/src/magpylib/_src/obj_classes/class_BaseTransform.py @@ -2,19 +2,22 @@ # pylint: disable=protected-access # pylint: disable=too-many-positional-arguments +from __future__ import annotations import numbers import numpy as np from scipy.spatial.transform import Rotation as R -from magpylib._src.input_checks import check_degree_type -from magpylib._src.input_checks import check_format_input_anchor -from magpylib._src.input_checks import check_format_input_angle -from magpylib._src.input_checks import check_format_input_axis -from magpylib._src.input_checks import check_format_input_orientation -from magpylib._src.input_checks import check_format_input_vector -from magpylib._src.input_checks import check_start_type +from magpylib._src.input_checks import ( + check_degree_type, + check_format_input_anchor, + check_format_input_angle, + check_format_input_axis, + check_format_input_orientation, + check_format_input_vector, + check_start_type, +) def multi_anchor_behavior(anchor, inrotQ, rotation): diff --git a/src/magpylib/_src/obj_classes/class_Collection.py b/src/magpylib/_src/obj_classes/class_Collection.py index a880385a8..69dd7bb56 100644 --- a/src/magpylib/_src/obj_classes/class_Collection.py +++ b/src/magpylib/_src/obj_classes/class_Collection.py @@ -3,6 +3,7 @@ # pylint: disable=redefined-builtin # pylint: disable=import-outside-toplevel # pylint: disable=too-many-positional-arguments +from __future__ import annotations from collections import Counter @@ -12,8 +13,7 @@ from magpylib._src.input_checks import check_format_input_obj from magpylib._src.obj_classes.class_BaseDisplayRepr import BaseDisplayRepr from magpylib._src.obj_classes.class_BaseGeo import BaseGeo -from magpylib._src.utility import format_obj_input -from magpylib._src.utility import rec_obj_remover +from magpylib._src.utility import format_obj_input, rec_obj_remover def repr_obj(obj, format="type+id+label"): @@ -98,7 +98,7 @@ def collection_tree_generator( pointers[: len(props)] = [branch if children else space] * len(props) # create branch entries - for pointer, child in zip(pointers, contents): + for pointer, child in zip(pointers, contents, strict=False): child_repr = child if isinstance(child, str) else repr_obj(child, format) yield prefix + pointer + child_repr @@ -245,7 +245,7 @@ def _repr_html_(self): max_elems=10, ): lines.append(line) - return f"""
{'
'.join(lines)}
""" + return f"""
{"
".join(lines)}
""" def describe(self, format="type+label+id", max_elems=10, return_string=False): # pylint: disable=arguments-differ @@ -820,7 +820,7 @@ def _default_style_description(self): } for name, num in nums.items(): if num > 0: - items.append(f"{num} {name}{'s'[:num^1]}") + items.append(f"{num} {name}{'s'[: num ^ 1]}") else: items.append("no children") return ", ".join(items) diff --git a/src/magpylib/_src/obj_classes/class_Sensor.py b/src/magpylib/_src/obj_classes/class_Sensor.py index aadf33aea..54deb334c 100644 --- a/src/magpylib/_src/obj_classes/class_Sensor.py +++ b/src/magpylib/_src/obj_classes/class_Sensor.py @@ -2,6 +2,8 @@ """Sensor class code""" +from __future__ import annotations + import numpy as np from magpylib._src.display.traces_core import make_Sensor @@ -520,5 +522,5 @@ def _default_style_description(self): nop = int(np.prod(px_shape)) if pix.ndim > 2: desc += f"{'x'.join(str(p) for p in px_shape)}=" - desc += f"{nop} pixel{'s'[:nop^1]}" + desc += f"{nop} pixel{'s'[: nop ^ 1]}" return desc diff --git a/src/magpylib/_src/obj_classes/class_current_Circle.py b/src/magpylib/_src/obj_classes/class_current_Circle.py index 8b30e81f0..4f72017c2 100644 --- a/src/magpylib/_src/obj_classes/class_current_Circle.py +++ b/src/magpylib/_src/obj_classes/class_current_Circle.py @@ -1,5 +1,7 @@ """CircularCircle current class code""" +from __future__ import annotations + import warnings from magpylib._src.display.traces_core import make_Circle diff --git a/src/magpylib/_src/obj_classes/class_current_Polyline.py b/src/magpylib/_src/obj_classes/class_current_Polyline.py index a172bc053..61b2799f3 100644 --- a/src/magpylib/_src/obj_classes/class_current_Polyline.py +++ b/src/magpylib/_src/obj_classes/class_current_Polyline.py @@ -2,6 +2,8 @@ """Polyline current class code""" +from __future__ import annotations + import warnings from magpylib._src.display.traces_core import make_Polyline diff --git a/src/magpylib/_src/obj_classes/class_magnet_Cuboid.py b/src/magpylib/_src/obj_classes/class_magnet_Cuboid.py index d9c5faf9e..4cf866f05 100644 --- a/src/magpylib/_src/obj_classes/class_magnet_Cuboid.py +++ b/src/magpylib/_src/obj_classes/class_magnet_Cuboid.py @@ -2,6 +2,8 @@ """Magnet Cuboid class code""" +from __future__ import annotations + from magpylib._src.display.traces_core import make_Cuboid from magpylib._src.fields.field_BH_cuboid import BHJM_magnet_cuboid from magpylib._src.input_checks import check_format_input_vector diff --git a/src/magpylib/_src/obj_classes/class_magnet_Cylinder.py b/src/magpylib/_src/obj_classes/class_magnet_Cylinder.py index ade5907f3..46f4b7512 100644 --- a/src/magpylib/_src/obj_classes/class_magnet_Cylinder.py +++ b/src/magpylib/_src/obj_classes/class_magnet_Cylinder.py @@ -2,6 +2,8 @@ """Magnet Cylinder class code""" +from __future__ import annotations + from magpylib._src.display.traces_core import make_Cylinder from magpylib._src.fields.field_BH_cylinder import BHJM_magnet_cylinder from magpylib._src.input_checks import check_format_input_vector diff --git a/src/magpylib/_src/obj_classes/class_magnet_CylinderSegment.py b/src/magpylib/_src/obj_classes/class_magnet_CylinderSegment.py index 07108a8f9..d86b2abd0 100644 --- a/src/magpylib/_src/obj_classes/class_magnet_CylinderSegment.py +++ b/src/magpylib/_src/obj_classes/class_magnet_CylinderSegment.py @@ -2,6 +2,8 @@ """Magnet Cylinder class code""" +from __future__ import annotations + import numpy as np from magpylib._src.display.traces_core import make_CylinderSegment diff --git a/src/magpylib/_src/obj_classes/class_magnet_Sphere.py b/src/magpylib/_src/obj_classes/class_magnet_Sphere.py index bed7da0bb..565271a5c 100644 --- a/src/magpylib/_src/obj_classes/class_magnet_Sphere.py +++ b/src/magpylib/_src/obj_classes/class_magnet_Sphere.py @@ -2,6 +2,8 @@ """Magnet Sphere class code""" +from __future__ import annotations + from magpylib._src.display.traces_core import make_Sphere from magpylib._src.fields.field_BH_sphere import BHJM_magnet_sphere from magpylib._src.input_checks import check_format_input_scalar diff --git a/src/magpylib/_src/obj_classes/class_magnet_Tetrahedron.py b/src/magpylib/_src/obj_classes/class_magnet_Tetrahedron.py index 924513ca0..d0d2aa7b8 100644 --- a/src/magpylib/_src/obj_classes/class_magnet_Tetrahedron.py +++ b/src/magpylib/_src/obj_classes/class_magnet_Tetrahedron.py @@ -2,6 +2,8 @@ """Magnet Tetrahedron class code""" +from __future__ import annotations + import numpy as np from magpylib._src.display.traces_core import make_Tetrahedron diff --git a/src/magpylib/_src/obj_classes/class_magnet_TriangularMesh.py b/src/magpylib/_src/obj_classes/class_magnet_TriangularMesh.py index ccb7694d8..0a3b9dd21 100644 --- a/src/magpylib/_src/obj_classes/class_magnet_TriangularMesh.py +++ b/src/magpylib/_src/obj_classes/class_magnet_TriangularMesh.py @@ -1,5 +1,7 @@ """Magnet TriangularMesh class code""" +from __future__ import annotations + import warnings import numpy as np @@ -7,14 +9,18 @@ from magpylib._src.display.traces_core import make_TriangularMesh from magpylib._src.exceptions import MagpylibMissingInput -from magpylib._src.fields.field_BH_triangularmesh import BHJM_magnet_trimesh -from magpylib._src.fields.field_BH_triangularmesh import calculate_centroid -from magpylib._src.fields.field_BH_triangularmesh import fix_trimesh_orientation -from magpylib._src.fields.field_BH_triangularmesh import get_disconnected_faces_subsets -from magpylib._src.fields.field_BH_triangularmesh import get_intersecting_triangles -from magpylib._src.fields.field_BH_triangularmesh import get_open_edges -from magpylib._src.input_checks import check_format_input_vector -from magpylib._src.input_checks import check_format_input_vector2 +from magpylib._src.fields.field_BH_triangularmesh import ( + BHJM_magnet_trimesh, + calculate_centroid, + fix_trimesh_orientation, + get_disconnected_faces_subsets, + get_intersecting_triangles, + get_open_edges, +) +from magpylib._src.input_checks import ( + check_format_input_vector, + check_format_input_vector2, +) from magpylib._src.obj_classes.class_BaseExcitations import BaseMagnet from magpylib._src.obj_classes.class_Collection import Collection from magpylib._src.obj_classes.class_misc_Triangle import Triangle @@ -931,4 +937,4 @@ def from_mesh( def _default_style_description(self): """Default style description text""" ntri = len(self.faces) - return f"{ntri} face{'s'[:ntri^1]}" + return f"{ntri} face{'s'[: ntri ^ 1]}" diff --git a/src/magpylib/_src/obj_classes/class_misc_CustomSource.py b/src/magpylib/_src/obj_classes/class_misc_CustomSource.py index 4692ca264..b091da7bd 100644 --- a/src/magpylib/_src/obj_classes/class_misc_CustomSource.py +++ b/src/magpylib/_src/obj_classes/class_misc_CustomSource.py @@ -1,5 +1,7 @@ """Custom class code""" +from __future__ import annotations + from magpylib._src.obj_classes.class_BaseExcitations import BaseSource diff --git a/src/magpylib/_src/obj_classes/class_misc_Dipole.py b/src/magpylib/_src/obj_classes/class_misc_Dipole.py index bad48f7fb..62fedd7da 100644 --- a/src/magpylib/_src/obj_classes/class_misc_Dipole.py +++ b/src/magpylib/_src/obj_classes/class_misc_Dipole.py @@ -1,5 +1,7 @@ """Dipole class code""" +from __future__ import annotations + import numpy as np from magpylib._src.display.traces_core import make_Dipole diff --git a/src/magpylib/_src/obj_classes/class_misc_Triangle.py b/src/magpylib/_src/obj_classes/class_misc_Triangle.py index d2e479a9f..418e81749 100644 --- a/src/magpylib/_src/obj_classes/class_misc_Triangle.py +++ b/src/magpylib/_src/obj_classes/class_misc_Triangle.py @@ -2,6 +2,8 @@ """Magnet Triangle class""" +from __future__ import annotations + import numpy as np from magpylib._src.display.traces_core import make_Triangle diff --git a/src/magpylib/_src/style.py b/src/magpylib/_src/style.py index 901b91b30..3fa17b7c1 100644 --- a/src/magpylib/_src/style.py +++ b/src/magpylib/_src/style.py @@ -4,17 +4,20 @@ # pylint: disable=too-many-instance-attributes # pylint: disable=cyclic-import # pylint: disable=too-many-positional-arguments +from __future__ import annotations import numpy as np -from magpylib._src.defaults.defaults_utility import ALLOWED_LINESTYLES -from magpylib._src.defaults.defaults_utility import ALLOWED_SYMBOLS -from magpylib._src.defaults.defaults_utility import SUPPORTED_PLOTTING_BACKENDS -from magpylib._src.defaults.defaults_utility import MagicProperties -from magpylib._src.defaults.defaults_utility import color_validator -from magpylib._src.defaults.defaults_utility import get_defaults_dict -from magpylib._src.defaults.defaults_utility import validate_property_class -from magpylib._src.defaults.defaults_utility import validate_style_keys +from magpylib._src.defaults.defaults_utility import ( + ALLOWED_LINESTYLES, + ALLOWED_SYMBOLS, + SUPPORTED_PLOTTING_BACKENDS, + MagicProperties, + color_validator, + get_defaults_dict, + validate_property_class, + validate_style_keys, +) ALLOWED_SIZEMODES = ("scaled", "absolute") @@ -24,21 +27,6 @@ def get_families(obj): # pylint: disable=import-outside-toplevel # pylint: disable=possibly-unused-variable # pylint: disable=redefined-outer-name - from magpylib._src.display.traces_generic import MagpyMarkers as Markers - from magpylib._src.obj_classes.class_BaseExcitations import BaseCurrent as Current - from magpylib._src.obj_classes.class_BaseExcitations import BaseMagnet as Magnet - from magpylib._src.obj_classes.class_current_Circle import Circle - from magpylib._src.obj_classes.class_current_Polyline import Polyline - from magpylib._src.obj_classes.class_magnet_Cuboid import Cuboid - from magpylib._src.obj_classes.class_magnet_Cylinder import Cylinder - from magpylib._src.obj_classes.class_magnet_CylinderSegment import CylinderSegment - from magpylib._src.obj_classes.class_magnet_Sphere import Sphere - from magpylib._src.obj_classes.class_magnet_Tetrahedron import Tetrahedron - from magpylib._src.obj_classes.class_magnet_TriangularMesh import TriangularMesh - from magpylib._src.obj_classes.class_misc_CustomSource import CustomSource - from magpylib._src.obj_classes.class_misc_Dipole import Dipole - from magpylib._src.obj_classes.class_misc_Triangle import Triangle - from magpylib._src.obj_classes.class_Sensor import Sensor loc = locals() obj_families = [] @@ -122,7 +110,7 @@ def style(self, val): assert val is None or val in ALLOWED_LINESTYLES, ( f"The `style` property of {type(self).__name__} must be one of " f"{ALLOWED_LINESTYLES},\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._style = val @@ -142,9 +130,9 @@ def width(self): @width.setter def width(self, val): - assert val is None or isinstance(val, (int, float)) and val >= 0, ( + assert val is None or (isinstance(val, (int, float)) and val >= 0), ( f"The `width` property of {type(self).__name__} must be a positive number,\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._width = val @@ -256,7 +244,7 @@ def opacity(self): def opacity(self, val): assert val is None or (isinstance(val, (float, int)) and 0 <= val <= 1), ( "The `opacity` property must be a value betwen 0 and 1,\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._opacity = val @@ -304,7 +292,7 @@ def text(self): def text(self, val): assert val is None or isinstance(val, str), ( f"The `show` property of {type(self).__name__} must be a string,\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._text = val @@ -317,7 +305,7 @@ def show(self): def show(self, val): assert val is None or isinstance(val, bool), ( f"The `show` property of {type(self).__name__} must be either True or False,\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._show = val @@ -346,7 +334,7 @@ def text(self): def text(self, val): assert val is None or isinstance(val, str), ( f"The `show` property of {type(self).__name__} must be a string,\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._text = val @@ -359,7 +347,7 @@ def show(self): def show(self, val): assert val is None or isinstance(val, bool), ( f"The `show` property of {type(self).__name__} must be either True or False,\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._show = val @@ -392,7 +380,7 @@ def showdefault(self, val): assert isinstance(val, bool), ( f"The `showdefault` property of {type(self).__name__} must be " f"one of `[True, False]`,\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._showdefault = val @@ -582,7 +570,7 @@ def constructor(self): def constructor(self, val): assert val is None or isinstance(val, str), ( f"The `constructor` property of {type(self).__name__} must be a string," - f"\nbut received {repr(val)} instead." + f"\nbut received {val!r} instead." ) self._constructor = val @@ -596,7 +584,7 @@ def show(self, val): assert isinstance(val, bool), ( f"The `show` property of {type(self).__name__} must be " f"one of `[True, False]`,\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._show = val @@ -609,7 +597,7 @@ def scale(self): def scale(self, val): assert isinstance(val, (int, float)) and val > 0, ( f"The `scale` property of {type(self).__name__} must be a strictly positive number,\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._scale = val @@ -627,7 +615,7 @@ def coordsargs(self, val): ), ( f"The `coordsargs` property of {type(self).__name__} must be " f"a dictionary with `'x', 'y', 'z'` keys,\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._coordsargs = val @@ -643,7 +631,7 @@ def backend(self, val): assert val is None or val in backends, ( f"The `backend` property of {type(self).__name__} must be one of" f"{backends},\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._backend = val @@ -717,7 +705,7 @@ def show(self): def show(self, val): assert val is None or isinstance(val, bool), ( "The `show` input must be either True or False,\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._show = val @@ -764,7 +752,7 @@ def mode(self, val): allowed = ("auto", "arrow", "color", "arrow+color", "color+arrow") assert val is None or val in allowed, ( f"The `mode` input must None or be one of `{allowed}`,\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._mode = val @@ -846,9 +834,9 @@ def transition(self): @transition.setter def transition(self, val): - assert ( - val is None or isinstance(val, (float, int)) and 0 <= val <= 1 - ), "color transition must be a value between 0 and 1" + assert val is None or (isinstance(val, (float, int)) and 0 <= val <= 1), ( + "color transition must be a value between 0 and 1" + ) self._transition = val @property @@ -866,7 +854,7 @@ def mode(self, val): assert val is None or val in self._allowed_modes, ( f"The `mode` property of {type(self).__name__} must be one of" f"{list(self._allowed_modes)},\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._mode = val @@ -959,7 +947,7 @@ def show(self): def show(self, val): assert val is None or isinstance(val, bool), ( f"The `show` property of {type(self).__name__} must be either True or False,\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._show = val @@ -1194,7 +1182,7 @@ def show(self): def show(self, val): assert val is None or isinstance(val, bool), ( f"The `show` property of {type(self).__name__} must be either True or False,\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._show = val @@ -1205,9 +1193,9 @@ def size(self): @size.setter def size(self, val): - assert val is None or isinstance(val, (int, float)) and val >= 0, ( + assert val is None or (isinstance(val, (int, float)) and val >= 0), ( f"The `size` property of {type(self).__name__} must be a positive number,\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._size = val @@ -1231,8 +1219,7 @@ def offset(self): @offset.setter def offset(self, val): assert val is None or (isinstance(val, (float, int))), ( - "The `offset` property must valid number\n" - f"but received {repr(val)} instead." + f"The `offset` property must valid number\nbut received {val!r} instead." ) self._offset = val @@ -1246,7 +1233,7 @@ def symbol(self, val): assert val is None or val in self._allowed_symbols, ( f"The `symbol` property of {type(self).__name__} must be one of" f"{self._allowed_symbols},\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._symbol = val @@ -1492,7 +1479,7 @@ def show(self): def show(self, val): assert val is None or isinstance(val, bool), ( f"The `show` property of {type(self).__name__} must be either True or False,\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._show = val @@ -1532,9 +1519,9 @@ def size(self): @size.setter def size(self, val): - assert val is None or isinstance(val, (int, float)) and val >= 0, ( + assert val is None or (isinstance(val, (int, float)) and val >= 0), ( f"The `size` property of {type(self).__name__} must be a positive number,\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._size = val @@ -1547,7 +1534,7 @@ def sizemode(self): def sizemode(self, val): assert val is None or val in ALLOWED_SIZEMODES, ( f"The `sizemode` property of {type(self).__name__} must be a one of " - f"{ALLOWED_SIZEMODES},\nbut received {repr(val)} instead." + f"{ALLOWED_SIZEMODES},\nbut received {val!r} instead." ) self._sizemode = val @@ -1687,9 +1674,9 @@ def size(self): @size.setter def size(self, val): - assert val is None or isinstance(val, (int, float)) and val >= 0, ( + assert val is None or (isinstance(val, (int, float)) and val >= 0), ( f"the `size` property of {type(self).__name__} must be a positive number" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._size = val @@ -1702,7 +1689,7 @@ def sizemode(self): def sizemode(self, val): assert val is None or val in ALLOWED_SIZEMODES, ( f"The `sizemode` property of {type(self).__name__} must be a one of " - f"{ALLOWED_SIZEMODES},\nbut received {repr(val)} instead." + f"{ALLOWED_SIZEMODES},\nbut received {val!r} instead." ) self._sizemode = val @@ -1725,7 +1712,7 @@ def symbol(self, val): assert val is None or val in ALLOWED_SYMBOLS, ( f"The `symbol` property of {type(self).__name__} must be one of" f"{ALLOWED_SYMBOLS},\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._symbol = val @@ -1853,7 +1840,7 @@ def show(self): def show(self, val): assert val is None or isinstance(val, bool), ( f"The `show` property of {type(self).__name__} must be either True or False," - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._show = val @@ -1864,9 +1851,9 @@ def size(self): @size.setter def size(self, val): - assert val is None or isinstance(val, (int, float)) and val >= 0, ( + assert val is None or (isinstance(val, (int, float)) and val >= 0), ( f"The `size` property of {type(self).__name__} must be a positive number,\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._size = val @@ -1879,7 +1866,7 @@ def sizemode(self): def sizemode(self, val): assert val is None or val in ALLOWED_SIZEMODES, ( f"The `sizemode` property of {type(self).__name__} must be a one of " - f"{ALLOWED_SIZEMODES},\nbut received {repr(val)} instead." + f"{ALLOWED_SIZEMODES},\nbut received {val!r} instead." ) self._sizemode = val @@ -1892,9 +1879,9 @@ def offset(self): @offset.setter def offset(self, val): - assert val is None or (isinstance(val, (float, int))) and 0 <= val <= 1, ( + assert val is None or ((isinstance(val, (float, int))) and 0 <= val <= 1), ( "The `offset` property must valid number between 0 and 1\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._offset = val @@ -1928,7 +1915,7 @@ def show(self): def show(self, val): assert val is None or isinstance(val, bool), ( f"The `show` property of {type(self).__name__} must be either True or False," - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._show = val @@ -1956,9 +1943,9 @@ def size(self): @size.setter def size(self, val): - assert val is None or isinstance(val, (int, float)) and val >= 0, ( + assert val is None or (isinstance(val, (int, float)) and val >= 0), ( f"The `size` property of {type(self).__name__} must be a positive number,\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._size = val @@ -1981,7 +1968,7 @@ def symbol(self, val): assert val is None or val in ALLOWED_SYMBOLS, ( f"The `symbol` property of {type(self).__name__} must be one of" f"{ALLOWED_SYMBOLS},\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._symbol = val @@ -2035,9 +2022,9 @@ def size(self): @size.setter def size(self, val): - assert val is None or isinstance(val, (int, float)) and val >= 0, ( + assert val is None or (isinstance(val, (int, float)) and val >= 0), ( f"The `size` property of {type(self).__name__} must be a positive number,\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._size = val @@ -2050,7 +2037,7 @@ def sizemode(self): def sizemode(self, val): assert val is None or val in ALLOWED_SIZEMODES, ( f"The `sizemode` property of {type(self).__name__} must be a one of " - f"{ALLOWED_SIZEMODES},\nbut received {repr(val)} instead." + f"{ALLOWED_SIZEMODES},\nbut received {val!r} instead." ) self._sizemode = val @@ -2066,7 +2053,7 @@ def pivot(self, val): assert val is None or val in (self._allowed_pivots), ( f"The `pivot` property of {type(self).__name__} must be one of " f"{self._allowed_pivots},\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._pivot = val @@ -2189,10 +2176,12 @@ def frames(self, val): is_valid_path = False elif not (val is None or np.issubdtype(type(val), int)): is_valid_path = False - assert is_valid_path, f"""The `frames` property of {type(self).__name__} must be either: + assert ( + is_valid_path + ), f"""The `frames` property of {type(self).__name__} must be either: - integer i: Displays the object(s) at every i'th path position. - array_like, shape (n,), dtype=int: Displays object(s) at given path indices. -but received {repr(val)} instead""" +but received {val!r} instead""" self._frames = val @property @@ -2204,7 +2193,7 @@ def numbering(self): def numbering(self, val): assert val is None or isinstance(val, bool), ( f"The `numbering` property of {type(self).__name__} must be one of (True, False),\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._numbering = val diff --git a/src/magpylib/_src/utility.py b/src/magpylib/_src/utility.py index 544628e08..8df00f9ba 100644 --- a/src/magpylib/_src/utility.py +++ b/src/magpylib/_src/utility.py @@ -3,12 +3,13 @@ # pylint: disable=import-outside-toplevel # pylint: disable=cyclic-import # import numbers +from __future__ import annotations + +from collections.abc import Callable, Sequence from contextlib import contextmanager -from functools import lru_cache +from functools import cache from inspect import signature from math import log10 -from typing import Callable -from typing import Sequence import numpy as np @@ -52,7 +53,7 @@ def wrong_obj_msg(*objs, allow="sources"): msg += "\n" + ALLOWED_SENSORS_MSG if objs: obj = objs[0] - msg += f"\nreceived {obj!r} of type {type(obj).__name__!r} instead." "" + msg += f"\nreceived {obj!r} of type {type(obj).__name__!r} instead." return msg @@ -79,20 +80,19 @@ def format_obj_input(*objects: Sequence, allow="sources+sensors", warn=True) -> from magpylib._src.obj_classes.class_Sensor import Sensor obj_list = [] - flatten_collection = not "collections" in allow.split("+") + flatten_collection = "collections" not in allow.split("+") for obj in objects: try: if isinstance(obj, (BaseSource, Sensor)): obj_list += [obj] + elif flatten_collection or isinstance(obj, (list, tuple)): + obj_list += format_obj_input( + *obj, + allow=allow, + warn=warn, + ) # recursive flattening else: - if flatten_collection or isinstance(obj, (list, tuple)): - obj_list += format_obj_input( - *obj, - allow=allow, - warn=warn, - ) # recursive flattening - else: - obj_list += [obj] + obj_list += [obj] except Exception as error: raise MagpylibBadUserInput(wrong_obj_msg(obj, allow=allow)) from error obj_list = filter_objects(obj_list, allow=allow, warn=False) @@ -212,9 +212,8 @@ def filter_objects(obj_list, allow="sources+sensors", warn=True): for obj in obj_list: if isinstance(obj, allowed_classes): new_list += [obj] - else: - if warn: - print(f"Warning, cannot add {obj!r} to Collection.") + elif warn: + print(f"Warning, cannot add {obj!r} to Collection.") return new_list @@ -241,7 +240,7 @@ def filter_objects(obj_list, allow="sources+sensors", warn=True): _UNIT_PREFIX_REVERSED = {v: k for k, v in _UNIT_PREFIX.items()} -@lru_cache(maxsize=None) +@cache def get_unit_factor(unit_input, *, target_unit, deci_centi=True): """return unit factor based on input and target unit""" if unit_input is None or unit_input == target_unit: @@ -295,7 +294,7 @@ def unit_prefix(number, unit="", precision=3, char_between="", as_tuple=False) - if prefix == "": digits = 0 - new_number_str = f"{number / 10 ** digits:.{precision}g}" + new_number_str = f"{number / 10**digits:.{precision}g}" res = (new_number_str, char_between, prefix, unit) if as_tuple: return res @@ -322,7 +321,7 @@ def add_iteration_suffix(name): midchar = "" n = m.group() endstr = -len(n) - name = f"{name[:endstr]}{midchar}{int(n)+1:0{len(n)}}" + name = f"{name[:endstr]}{midchar}{int(n) + 1:0{len(n)}}" return name @@ -379,14 +378,16 @@ def get_subclasses(cls, recursive=False): def get_registered_sources(): """Return all registered sources""" # pylint: disable=import-outside-toplevel - from magpylib._src.obj_classes.class_BaseExcitations import BaseCurrent - from magpylib._src.obj_classes.class_BaseExcitations import BaseMagnet - from magpylib._src.obj_classes.class_BaseExcitations import BaseSource + from magpylib._src.obj_classes.class_BaseExcitations import ( + BaseCurrent, + BaseMagnet, + BaseSource, + ) return { k: v for k, v in get_subclasses(BaseSource, recursive=True).items() - if not v in (BaseCurrent, BaseMagnet, BaseSource) + if v not in (BaseCurrent, BaseMagnet, BaseSource) } @@ -416,8 +417,7 @@ def open_animation(filepath, embed=True): display(IPyImage(data=filepath, embed=embed)) elif filepath.endswith(".mp4"): - from IPython.display import Video - from IPython.display import display + from IPython.display import Video, display display(Video(data=filepath, embed=embed)) else: # pragma: no cover @@ -428,7 +428,7 @@ def open_animation(filepath, embed=True): webbrowser.open(filepath) -@lru_cache(maxsize=None) +@cache def has_parameter(func: Callable, param_name: str) -> bool: """Check if input function has a specific parameter""" sig = signature(func) @@ -474,12 +474,14 @@ def merge_dicts_with_conflict_check(objs, *, target, identifiers, unique_fields) for obj in objs: key_dict = {k: obj[k] for k in identifiers} key = tuple(key_dict.values()) - tracker_previous = tracker.get(key, None) + tracker_previous = tracker.get(key) tracker_actual = tuple(obj[field] for field in unique_fields) if key in tracker and tracker_previous != tracker_actual: diff = [ f"{f!r} first got {a!r} then {t!r}" - for f, a, t in zip(unique_fields, tracker_actual, tracker_previous) + for f, a, t in zip( + unique_fields, tracker_actual, tracker_previous, strict=False + ) if a != t ] raise ValueError( diff --git a/src/magpylib/core/__init__.py b/src/magpylib/core/__init__.py index fdd0a14f0..7e24c1e56 100644 --- a/src/magpylib/core/__init__.py +++ b/src/magpylib/core/__init__.py @@ -2,22 +2,26 @@ The core sub-package gives direct access to our field implementations. """ +from __future__ import annotations + __all__ = [ + "current_circle_Hfield", + "current_polyline_Hfield", + "dipole_Hfield", "magnet_cuboid_Bfield", "magnet_cylinder_axial_Bfield", "magnet_cylinder_diametral_Hfield", "magnet_cylinder_segment_Hfield", "magnet_sphere_Bfield", - "current_circle_Hfield", - "current_polyline_Hfield", - "dipole_Hfield", "triangle_Bfield", ] from magpylib._src.fields.field_BH_circle import current_circle_Hfield from magpylib._src.fields.field_BH_cuboid import magnet_cuboid_Bfield -from magpylib._src.fields.field_BH_cylinder import magnet_cylinder_axial_Bfield -from magpylib._src.fields.field_BH_cylinder import magnet_cylinder_diametral_Hfield +from magpylib._src.fields.field_BH_cylinder import ( + magnet_cylinder_axial_Bfield, + magnet_cylinder_diametral_Hfield, +) from magpylib._src.fields.field_BH_cylinder_segment import ( magnet_cylinder_segment_Hfield, ) diff --git a/src/magpylib/current/__init__.py b/src/magpylib/current/__init__.py index 30cb6b0ca..8e961ae2a 100644 --- a/src/magpylib/current/__init__.py +++ b/src/magpylib/current/__init__.py @@ -2,9 +2,9 @@ The `magpylib.current` subpackage contains all electric current classes. """ -__all__ = ["Circle", "Loop", "Polyline", "Line"] +from __future__ import annotations -from magpylib._src.obj_classes.class_current_Circle import Circle -from magpylib._src.obj_classes.class_current_Circle import Loop -from magpylib._src.obj_classes.class_current_Polyline import Line -from magpylib._src.obj_classes.class_current_Polyline import Polyline +__all__ = ["Circle", "Line", "Loop", "Polyline"] + +from magpylib._src.obj_classes.class_current_Circle import Circle, Loop +from magpylib._src.obj_classes.class_current_Polyline import Line, Polyline diff --git a/src/magpylib/graphics/__init__.py b/src/magpylib/graphics/__init__.py index 9963f8f39..8bed79222 100644 --- a/src/magpylib/graphics/__init__.py +++ b/src/magpylib/graphics/__init__.py @@ -3,8 +3,9 @@ features for independent use. """ -__all__ = ["model3d", "style", "Trace3d"] +from __future__ import annotations + +__all__ = ["Trace3d", "model3d", "style"] from magpylib._src.style import Trace3d -from magpylib.graphics import model3d -from magpylib.graphics import style +from magpylib.graphics import model3d, style diff --git a/src/magpylib/graphics/model3d/__init__.py b/src/magpylib/graphics/model3d/__init__.py index 18e13e585..0566b6906 100644 --- a/src/magpylib/graphics/model3d/__init__.py +++ b/src/magpylib/graphics/model3d/__init__.py @@ -4,22 +4,26 @@ library. """ +from __future__ import annotations + __all__ = [ "make_Arrow", - "make_Ellipsoid", - "make_Pyramid", "make_Cuboid", "make_CylinderSegment", + "make_Ellipsoid", "make_Prism", + "make_Pyramid", "make_Tetrahedron", "make_TriangularMesh", ] -from magpylib._src.display.traces_base import make_Arrow -from magpylib._src.display.traces_base import make_Cuboid -from magpylib._src.display.traces_base import make_CylinderSegment -from magpylib._src.display.traces_base import make_Ellipsoid -from magpylib._src.display.traces_base import make_Prism -from magpylib._src.display.traces_base import make_Pyramid -from magpylib._src.display.traces_base import make_Tetrahedron -from magpylib._src.display.traces_base import make_TriangularMesh +from magpylib._src.display.traces_base import ( + make_Arrow, + make_Cuboid, + make_CylinderSegment, + make_Ellipsoid, + make_Prism, + make_Pyramid, + make_Tetrahedron, + make_TriangularMesh, +) diff --git a/src/magpylib/graphics/style/__init__.py b/src/magpylib/graphics/style/__init__.py index 5febd7c8d..405c841ec 100644 --- a/src/magpylib/graphics/style/__init__.py +++ b/src/magpylib/graphics/style/__init__.py @@ -2,14 +2,13 @@ The `magpylib.display.style` sub-package provides different object styles. """ +from __future__ import annotations + __all__ = [ - "MagnetStyle", "CurrentStyle", "DipoleStyle", + "MagnetStyle", "SensorStyle", ] -from magpylib._src.style import CurrentStyle -from magpylib._src.style import DipoleStyle -from magpylib._src.style import MagnetStyle -from magpylib._src.style import SensorStyle +from magpylib._src.style import CurrentStyle, DipoleStyle, MagnetStyle, SensorStyle diff --git a/src/magpylib/magnet/__init__.py b/src/magpylib/magnet/__init__.py index 3555aee18..28eaf393f 100644 --- a/src/magpylib/magnet/__init__.py +++ b/src/magpylib/magnet/__init__.py @@ -2,11 +2,13 @@ The `magpylib.magnet` subpackage contains all magnet classes. """ +from __future__ import annotations + __all__ = [ "Cuboid", "Cylinder", - "Sphere", "CylinderSegment", + "Sphere", "Tetrahedron", "TriangularMesh", ] diff --git a/src/magpylib/misc/__init__.py b/src/magpylib/misc/__init__.py index f7107dec8..bdc6d6741 100644 --- a/src/magpylib/misc/__init__.py +++ b/src/magpylib/misc/__init__.py @@ -2,7 +2,9 @@ The `magpylib.misc` sub-package contains miscellaneous source objects. """ -__all__ = ["Dipole", "CustomSource", "Triangle"] +from __future__ import annotations + +__all__ = ["CustomSource", "Dipole", "Triangle"] from magpylib._src.obj_classes.class_misc_CustomSource import CustomSource from magpylib._src.obj_classes.class_misc_Dipole import Dipole diff --git a/tests/test_BHMJ_level.py b/tests/test_BHMJ_level.py index ea4322132..82f6cc8f3 100644 --- a/tests/test_BHMJ_level.py +++ b/tests/test_BHMJ_level.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import numpy as np from numpy.testing import assert_allclose from scipy.constants import mu_0 as MU0 @@ -7,8 +9,10 @@ from magpylib._src.fields.field_BH_cylinder import BHJM_magnet_cylinder from magpylib._src.fields.field_BH_cylinder_segment import BHJM_cylinder_segment from magpylib._src.fields.field_BH_dipole import BHJM_dipole -from magpylib._src.fields.field_BH_polyline import BHJM_current_polyline -from magpylib._src.fields.field_BH_polyline import current_vertices_field +from magpylib._src.fields.field_BH_polyline import ( + BHJM_current_polyline, + current_vertices_field, +) from magpylib._src.fields.field_BH_sphere import BHJM_magnet_sphere from magpylib._src.fields.field_BH_tetrahedron import BHJM_magnet_tetrahedron from magpylib._src.fields.field_BH_triangle import BHJM_triangle @@ -752,7 +756,7 @@ def test_field_line_from_vert(): ) B = [] - for obs, vert, curr in zip(observers, vertices, current): + for obs, vert, curr in zip(observers, vertices, current, strict=False): p1 = vert[:-1] p2 = vert[1:] po = np.array([obs] * (len(vert) - 1)) diff --git a/tests/test_BaseTransform.py b/tests/test_BaseTransform.py index 38265a688..6c2bbd9a4 100644 --- a/tests/test_BaseTransform.py +++ b/tests/test_BaseTransform.py @@ -1,10 +1,11 @@ +from __future__ import annotations + import numpy as np import pytest from scipy.spatial.transform import Rotation as R import magpylib as magpy -from magpylib._src.obj_classes.class_BaseTransform import apply_move -from magpylib._src.obj_classes.class_BaseTransform import apply_rotation +from magpylib._src.obj_classes.class_BaseTransform import apply_move, apply_rotation # pylint: disable=too-many-positional-arguments diff --git a/tests/test_Coumpound_setters.py b/tests/test_Coumpound_setters.py index 8cb3083e8..59f99dfa8 100644 --- a/tests/test_Coumpound_setters.py +++ b/tests/test_Coumpound_setters.py @@ -1,10 +1,11 @@ # pylint: disable=eval-used # pylint: disable=unused-import +from __future__ import annotations + import os import numpy as np import pytest -from scipy.spatial.transform import Rotation as R import magpylib as magpy from magpylib._src.display.traces_base import make_Prism @@ -138,6 +139,7 @@ def get_pos_orient_from_collection(coll): zip( COMPOUND_DATA["setters_inputs"], COMPOUND_DATA["pos_orient_as_matrix_expected"], + strict=False, ) ), ids=COMPOUND_DATA["test_names"], @@ -146,7 +148,9 @@ def test_compound_setters(setters_inputs, pos_orient_as_matrix_expected): """testing of compound object setters and the effects on its children.""" c1 = create_compound_set(**setters_inputs) pos_orient = get_pos_orient_from_collection(c1) - for ind, (po, po_exp) in enumerate(zip(pos_orient, pos_orient_as_matrix_expected)): + for ind, (po, po_exp) in enumerate( + zip(pos_orient, pos_orient_as_matrix_expected, strict=False) + ): obj_str = "child" if ind == 0: # first ind is (position, orientation.as_matrix()) of collection obj_str = "Collection" @@ -154,5 +158,5 @@ def test_compound_setters(setters_inputs, pos_orient_as_matrix_expected): pos_exp, orient_exp = po_exp err_msg = f"{obj_str} position matching failed" np.testing.assert_almost_equal(pos, pos_exp, err_msg=err_msg) - err_msg = f"{obj_str}{ind if ind!=0 else ''} orientation matching failed" + err_msg = f"{obj_str}{ind if ind != 0 else ''} orientation matching failed" np.testing.assert_almost_equal(orient, orient_exp, err_msg=err_msg) diff --git a/tests/test_CustomSource.py b/tests/test_CustomSource.py index 49abe38aa..715063c1f 100644 --- a/tests/test_CustomSource.py +++ b/tests/test_CustomSource.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import numpy as np import pytest diff --git a/tests/test__missing_optional_modules.py b/tests/test__missing_optional_modules.py index 3f96f1ae8..87d14556c 100644 --- a/tests/test__missing_optional_modules.py +++ b/tests/test__missing_optional_modules.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import sys from unittest.mock import patch diff --git a/tests/test_core.py b/tests/test_core.py index befd37cfa..9879cb142 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -1,4 +1,6 @@ # here all core functions should be tested properly - ideally against FEM +from __future__ import annotations + import numpy as np from magpylib._src.fields.field_BH_sphere import magnet_sphere_Bfield diff --git a/tests/test_core_physics_consistency.py b/tests/test_core_physics_consistency.py index 61669136d..c7498ee64 100644 --- a/tests/test_core_physics_consistency.py +++ b/tests/test_core_physics_consistency.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import numpy as np from scipy.constants import mu_0 as MU0 @@ -179,7 +181,9 @@ def test_core_physics_dipole_sphere(): obs = np.array([(1, 2, 3), (-2, -2, -2), (3, 5, -4), (5, 4, 0.1)]) dia = np.array([2, 3, 0.1, 3.3]) pol = np.array([(1, 2, 3), (0, 0, 1), (-1, -2, 0), (1, -1, 0.1)]) - mom = np.array([4 * (d / 2) ** 3 * np.pi / 3 * p / MU0 for d, p in zip(dia, pol)]) + mom = np.array( + [4 * (d / 2) ** 3 * np.pi / 3 * p / MU0 for d, p in zip(dia, pol, strict=False)] + ) B1 = BHJM_magnet_sphere( field="B", @@ -322,7 +326,7 @@ def test_core_physics_geometry_cylinder_from_segments(): sections = np.array([-12, 65, 123, 180, 245, 348]) Bseg = np.zeros((2, 3)) - for phi1, phi2 in zip(sections[:-1], sections[1:]): + for phi1, phi2 in zip(sections[:-1], sections[1:], strict=False): B_part = BHJM_cylinder_segment( field="B", observers=obs, diff --git a/tests/test_default_utils.py b/tests/test_default_utils.py index 84864ea7c..085096bcf 100644 --- a/tests/test_default_utils.py +++ b/tests/test_default_utils.py @@ -1,14 +1,18 @@ +from __future__ import annotations + from copy import deepcopy import pytest -from magpylib._src.defaults.defaults_utility import COLORS_SHORT_TO_LONG -from magpylib._src.defaults.defaults_utility import MagicProperties -from magpylib._src.defaults.defaults_utility import color_validator -from magpylib._src.defaults.defaults_utility import get_defaults_dict -from magpylib._src.defaults.defaults_utility import linearize_dict -from magpylib._src.defaults.defaults_utility import magic_to_dict -from magpylib._src.defaults.defaults_utility import update_nested_dict +from magpylib._src.defaults.defaults_utility import ( + COLORS_SHORT_TO_LONG, + MagicProperties, + color_validator, + get_defaults_dict, + linearize_dict, + magic_to_dict, + update_nested_dict, +) def test_update_nested_dict(): @@ -170,7 +174,7 @@ def prop2(self, val): # check setting attribute/property assert bp1.prop1 == 1, "`bp1.prop1` should be `1`" with pytest.raises(AttributeError): - getattr(bp1, "prop1e") # only properties are allowed to be set + bp1.prop1e # only properties are allowed to be set assert bp1.as_dict() == {"prop1": 1}, "`as_dict` method failed" @@ -181,9 +185,9 @@ def prop2(self, val): assert bp1.as_dict() == {"prop1": {"prop2": 2}}, "`as_dict` method failed" # check update method with different parameters - assert bp1.update(prop1_prop2=10).as_dict() == { - "prop1": {"prop2": 10} - }, "magic property setting failed" + assert bp1.update(prop1_prop2=10).as_dict() == {"prop1": {"prop2": 10}}, ( + "magic property setting failed" + ) with pytest.raises(AttributeError): bp1.update(prop1_prop2=10, prop3=4) @@ -199,14 +203,14 @@ def prop2(self, val): bp3 = bp2.copy() assert bp3 is not bp2, "failed copying, should return a different id" - assert ( - bp3.as_dict() == bp2.as_dict() - ), "failed copying, should return the same property values" + assert bp3.as_dict() == bp2.as_dict(), ( + "failed copying, should return the same property values" + ) # check flatten dict - assert bp3.as_dict(flatten=True) == bp2.as_dict( - flatten=True - ), "failed copying, should return the same property values" + assert bp3.as_dict(flatten=True) == bp2.as_dict(flatten=True), ( + "failed copying, should return the same property values" + ) # check failing init with pytest.raises(AttributeError): diff --git a/tests/test_defaults.py b/tests/test_defaults.py index cf43825e2..9d1151887 100644 --- a/tests/test_defaults.py +++ b/tests/test_defaults.py @@ -1,10 +1,14 @@ +from __future__ import annotations + import pytest import magpylib as magpy from magpylib._src.defaults.defaults_classes import DefaultSettings -from magpylib._src.defaults.defaults_utility import ALLOWED_LINESTYLES -from magpylib._src.defaults.defaults_utility import ALLOWED_SYMBOLS -from magpylib._src.defaults.defaults_utility import SUPPORTED_PLOTTING_BACKENDS +from magpylib._src.defaults.defaults_utility import ( + ALLOWED_LINESTYLES, + ALLOWED_SYMBOLS, + SUPPORTED_PLOTTING_BACKENDS, +) from magpylib._src.style import DisplayStyle bad_inputs = { diff --git a/tests/test_display_matplotlib.py b/tests/test_display_matplotlib.py index 890aabfbd..a1daa8ddb 100644 --- a/tests/test_display_matplotlib.py +++ b/tests/test_display_matplotlib.py @@ -1,4 +1,6 @@ # pylint: disable="wrong-import-position" +from __future__ import annotations + import re from unittest.mock import patch diff --git a/tests/test_display_plotly.py b/tests/test_display_plotly.py index eabccc766..bd52d6fcc 100644 --- a/tests/test_display_plotly.py +++ b/tests/test_display_plotly.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import numpy as np import plotly.graph_objects as go import pytest @@ -229,12 +231,7 @@ def my_callable_kwargs(): } cuboid.style.model3d.add_trace( - **{ - "backend": "plotly", - "constructor": "Scatter3d", - "kwargs": my_callable_kwargs, - "show": True, - } + backend="plotly", constructor="Scatter3d", kwargs=my_callable_kwargs, show=True ) cuboid.style.model3d.data[0].show = False cuboid.show( @@ -479,7 +476,7 @@ def test_units_length(): return_fig=True, ) for ind, inp in enumerate(inputs): - scene = getattr(fig.layout, f"scene{'' if ind==0 else ind+1}") + scene = getattr(fig.layout, f"scene{'' if ind == 0 else ind + 1}") for k in "xyz": ax = getattr(scene, f"{k}axis") assert ax.title.text == f"{k} ({inp['units_length']})" diff --git a/tests/test_display_pyvista.py b/tests/test_display_pyvista.py index 0a3c88f73..5f95d8358 100644 --- a/tests/test_display_pyvista.py +++ b/tests/test_display_pyvista.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import sys import tempfile @@ -29,7 +31,7 @@ imageio.plugins.ffmpeg.download() else: raise err -except Exception: # noqa: E722 +except Exception: # skip test if ffmpeg cannot be loaded FFMPEG_FAILED = True diff --git a/tests/test_display_utility.py b/tests/test_display_utility.py index d803f0c40..5a984f7c3 100644 --- a/tests/test_display_utility.py +++ b/tests/test_display_utility.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from unittest.mock import patch import matplotlib.pyplot as plt @@ -7,8 +9,10 @@ import pyvista import magpylib as magpy -from magpylib._src.display.traces_utility import draw_arrow_from_vertices -from magpylib._src.display.traces_utility import merge_scatter3d +from magpylib._src.display.traces_utility import ( + draw_arrow_from_vertices, + merge_scatter3d, +) from magpylib._src.exceptions import MagpylibBadUserInput diff --git a/tests/test_elliptics.py b/tests/test_elliptics.py index 5c3b5b04f..d5ddc1992 100644 --- a/tests/test_elliptics.py +++ b/tests/test_elliptics.py @@ -1,14 +1,11 @@ +from __future__ import annotations + import unittest import numpy as np -from magpylib._src.fields.special_cel import cel -from magpylib._src.fields.special_cel import cel0 -from magpylib._src.fields.special_cel import celv -from magpylib._src.fields.special_el3 import el3 -from magpylib._src.fields.special_el3 import el3_angle -from magpylib._src.fields.special_el3 import el3v -from magpylib._src.fields.special_el3 import el30 +from magpylib._src.fields.special_cel import cel, cel0, celv +from magpylib._src.fields.special_el3 import el3, el3_angle, el3v, el30 class TestEllExceptions(unittest.TestCase): @@ -59,7 +56,7 @@ def test_el3_vs_original(): np.testing.assert_allclose(res0, resv) # compare to modified original - res1 = np.array([el30(x, kc, p) for x, kc, p in zip(x11, kc11, p11)]) + res1 = np.array([el30(x, kc, p) for x, kc, p in zip(x11, kc11, p11, strict=False)]) np.testing.assert_allclose(res0, res1) @@ -93,7 +90,7 @@ def test_el3s(): kcs = (np.random.rand(N) - 0.5) * 10 ps = (np.random.rand(N) - 0.5) * 10 - res0 = [el30(x, kc, p) for x, kc, p in zip(xs, kcs, ps)] + res0 = [el30(x, kc, p) for x, kc, p in zip(xs, kcs, ps, strict=False)] res1 = el3v(xs, kcs, ps) res2 = el3(xs, kcs, ps) @@ -112,7 +109,7 @@ def test_cels(): cc = (np.random.rand(N) - 0.5) * 10 ss = (np.random.rand(N) - 0.5) * 10 - res0 = [cel0(kc, p, c, s) for kc, p, c, s in zip(kcc, pp, cc, ss)] + res0 = [cel0(kc, p, c, s) for kc, p, c, s in zip(kcc, pp, cc, ss, strict=False)] res1 = celv(kcc, pp, cc, ss) res2 = cel(kcc, pp, cc, ss) diff --git a/tests/test_exceptions.py b/tests/test_exceptions.py index 07628ec58..307d32a39 100644 --- a/tests/test_exceptions.py +++ b/tests/test_exceptions.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import unittest import numpy as np @@ -6,9 +8,7 @@ from magpylib._src.exceptions import MagpylibBadUserInput from magpylib._src.fields.field_wrap_BH import getBH_level2 from magpylib._src.input_checks import check_format_input_observers -from magpylib._src.utility import check_path_format -from magpylib._src.utility import format_obj_input -from magpylib._src.utility import format_src_inputs +from magpylib._src.utility import check_path_format, format_obj_input, format_src_inputs GETBH_KWARGS = { "sumup": False, diff --git a/tests/test_field_cylinder.py b/tests/test_field_cylinder.py index dec240b40..046f5d8e6 100644 --- a/tests/test_field_cylinder.py +++ b/tests/test_field_cylinder.py @@ -2,13 +2,15 @@ Testing all cases against a large set of pre-computed values """ +from __future__ import annotations + import numpy as np import pytest import magpylib as magpy from magpylib._src.fields.field_BH_cylinder import BHJM_magnet_cylinder -from magpylib._src.fields.field_BH_cylinder_segment import BHJM_cylinder_segment from magpylib._src.fields.field_BH_cylinder_segment import ( + BHJM_cylinder_segment, magnet_cylinder_segment_Hfield, ) diff --git a/tests/test_getBH_dict.py b/tests/test_getBH_dict.py index 4c8998fea..a193b16f2 100644 --- a/tests/test_getBH_dict.py +++ b/tests/test_getBH_dict.py @@ -1,10 +1,11 @@ +from __future__ import annotations + import numpy as np import pytest from scipy.spatial.transform import Rotation as R import magpylib as magpy -from magpylib._src.exceptions import MagpylibBadUserInput -from magpylib._src.exceptions import MagpylibDeprecationWarning +from magpylib._src.exceptions import MagpylibBadUserInput, MagpylibDeprecationWarning def test_getB_dict1(): diff --git a/tests/test_getBH_interfaces.py b/tests/test_getBH_interfaces.py index f022ee83a..06eff6977 100644 --- a/tests/test_getBH_interfaces.py +++ b/tests/test_getBH_interfaces.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import numpy as np import pytest diff --git a/tests/test_getBH_level2.py b/tests/test_getBH_level2.py index a5ca5e114..30e0b7a10 100644 --- a/tests/test_getBH_level2.py +++ b/tests/test_getBH_level2.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import unittest import warnings @@ -37,6 +39,7 @@ def test_getB_level2_input_simple(): [pos_obs, sens1, sens2, sens3, [sens1, sens2]], [fb1, fb1, fb1, fb1, fb2], [fc1, fc1, fc1, fc1, fc2], + strict=False, ): src_obs_res = [ [pm1, poso, fb], @@ -93,6 +96,7 @@ def pm4(): [pos_obs, sens1, [sens1, sens1, sens1]], [fb22, fb22, [fb22, fb22, fb22]], [fc22, fc22, [fc22, fc22, fc22]], + strict=False, ): fb = np.array(fb) fc = np.array(fc) @@ -508,9 +512,13 @@ def test_pixel_agg3(): c2 = x0 + x1 + x2 + x3 - for src, src_sh in zip([s0, c0, [s0, c0], c1, [s0, c0, c1, s1]], [1, 1, 2, 1, 4]): + for src, src_sh in zip( + [s0, c0, [s0, c0], c1, [s0, c0, c1, s1]], [1, 1, 2, 1, 4], strict=False + ): for obs, obs_sh in zip( - [e0, e1, e2, e3, x0, x1, x2, x3, c2, [x0, x2, x3]], [1] * 8 + [4, 3] + [e0, e1, e2, e3, x0, x1, x2, x3, c2, [x0, x2, x3]], + [1] * 8 + [4, 3], + strict=False, ): for px_agg in ["mean", "average", "min"]: np.testing.assert_allclose( @@ -522,9 +530,13 @@ def test_pixel_agg3(): # same check with a path s0.position = [(0, 0, 0)] * 5 - for src, src_sh in zip([s0, c0, [s0, c0], c1, [s0, c0, c1, s1]], [1, 1, 2, 1, 4]): + for src, src_sh in zip( + [s0, c0, [s0, c0], c1, [s0, c0, c1, s1]], [1, 1, 2, 1, 4], strict=False + ): for obs, obs_sh in zip( - [e0, e1, e2, e3, x0, x1, x2, x3, c2, [x0, x2, x3]], [1] * 8 + [4, 3] + [e0, e1, e2, e3, x0, x1, x2, x3, c2, [x0, x2, x3]], + [1] * 8 + [4, 3], + strict=False, ): for px_agg in ["mean", "average", "min"]: np.testing.assert_allclose( diff --git a/tests/test_input_checks.py b/tests/test_input_checks.py index b92c048b9..94edfb18f 100644 --- a/tests/test_input_checks.py +++ b/tests/test_input_checks.py @@ -1,11 +1,15 @@ +from __future__ import annotations + import numpy as np import pytest from scipy.spatial.transform import Rotation as R import magpylib as magpy -from magpylib._src.exceptions import MagpylibBadUserInput -from magpylib._src.exceptions import MagpylibDeprecationWarning -from magpylib._src.exceptions import MagpylibMissingInput +from magpylib._src.exceptions import ( + MagpylibBadUserInput, + MagpylibDeprecationWarning, + MagpylibMissingInput, +) from magpylib._src.fields.field_BH_dipole import BHJM_dipole # pylint: disable=unnecessary-lambda-assignment diff --git a/tests/test_misc.py b/tests/test_misc.py index b4431a954..795daa568 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import magpylib as magpy diff --git a/tests/test_numerical_stability.py b/tests/test_numerical_stability.py index ef225d6ed..1af576208 100644 --- a/tests/test_numerical_stability.py +++ b/tests/test_numerical_stability.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import numpy as np import magpylib as magpy diff --git a/tests/test_obj_BaseGeo.py b/tests/test_obj_BaseGeo.py index 265f91474..55a5326c8 100644 --- a/tests/test_obj_BaseGeo.py +++ b/tests/test_obj_BaseGeo.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import re import numpy as np @@ -109,7 +111,7 @@ def test_rotate_vs_rotate_from(): bg2 = BaseGeo(position=(3, 4, 5), orientation=R.from_quat((0, 0, 0, 1))) angs = np.linalg.norm(roz, axis=1) - for ang, ax in zip(angs, roz): + for ang, ax in zip(angs, roz, strict=False): bg2.rotate_from_angax(angle=[ang], degrees=False, axis=ax, anchor=(-3, -2, 1)) pos2 = bg2.position ori2 = bg2.orientation.as_quat() diff --git a/tests/test_obj_BaseGeo_v4motion.py b/tests/test_obj_BaseGeo_v4motion.py index 25d0ed1c0..7ced9e942 100644 --- a/tests/test_obj_BaseGeo_v4motion.py +++ b/tests/test_obj_BaseGeo_v4motion.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import numpy as np import pytest from scipy.spatial.transform import Rotation as R @@ -22,7 +24,7 @@ def validate_pos_orient(obj, ppath, opath_as_rotvec): ppath, rtol=1e-05, atol=1e-08, - err_msg=f"position validation failed with ({sp})" f"\n expected {ppath}", + err_msg=f"position validation failed with ({sp})\n expected {ppath}", ) np.testing.assert_allclose( so.as_matrix(), @@ -81,7 +83,7 @@ def get_init_pos_orient_test_data(): @pytest.mark.parametrize( "init_position, init_orientation_rotvec, expected_position, expected_orientation_rotvec", get_init_pos_orient_test_data(), - ids=[f"{ind+1:02d}" for ind, t in enumerate(get_init_pos_orient_test_data())], + ids=[f"{ind + 1:02d}" for ind, t in enumerate(get_init_pos_orient_test_data())], ) def test_BaseGeo_init( init_position, @@ -163,7 +165,7 @@ def get_data_object_setter(inp): @pytest.mark.parametrize( "init_pos, init_ori, test_pos, test_ori", get_data_object_setter("pos"), - ids=[f"{ind+1:02d}" for ind, _ in enumerate(get_data_object_setter("pos"))], + ids=[f"{ind + 1:02d}" for ind, _ in enumerate(get_data_object_setter("pos"))], ) def test_BaseGeo_setting_position( init_pos, @@ -185,7 +187,7 @@ def test_BaseGeo_setting_position( @pytest.mark.parametrize( "init_pos, init_ori, test_pos, test_ori", get_data_object_setter("ori"), - ids=[f"{ind+1:02d}" for ind, _ in enumerate(get_data_object_setter("ori"))], + ids=[f"{ind + 1:02d}" for ind, _ in enumerate(get_data_object_setter("ori"))], ) def test_BaseGeo_setting_orientation( init_pos, diff --git a/tests/test_obj_Circle.py b/tests/test_obj_Circle.py index d81ecd2a3..68e0b86fc 100644 --- a/tests/test_obj_Circle.py +++ b/tests/test_obj_Circle.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import numpy as np import pytest diff --git a/tests/test_obj_Collection.py b/tests/test_obj_Collection.py index a30886d86..256431a67 100644 --- a/tests/test_obj_Collection.py +++ b/tests/test_obj_Collection.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import pickle import re @@ -57,7 +59,7 @@ def test_Collection_basics(): B1, B2 = [], [] for mag, dim2, dim3, ang, ax, anch, mov, poso, rv in zip( - mags, dims2, dims3, angs, axs, anchs, movs, posos, rvs + mags, dims2, dims3, angs, axs, anchs, movs, posos, rvs, strict=False ): rot = R.from_rotvec(rv) @@ -79,7 +81,7 @@ def test_Collection_basics(): col1.add(pm4, pm5, pm6) # 18 subsequent operations - for a, aa, aaa, mv in zip(ang, ax, anch, mov): + for a, aa, aaa, mv in zip(ang, ax, anch, mov, strict=False): for pm in [pm1b, pm2b, pm3b, pm4b, pm5b, pm6b]: pm.move(mv).rotate_from_angax(a, aa, aaa).rotate(rot, aaa) diff --git a/tests/test_obj_Collection_child_parent.py b/tests/test_obj_Collection_child_parent.py index bd33aca3d..bbd211764 100644 --- a/tests/test_obj_Collection_child_parent.py +++ b/tests/test_obj_Collection_child_parent.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import numpy as np import magpylib as magpy diff --git a/tests/test_obj_Collection_v4motion.py b/tests/test_obj_Collection_v4motion.py index b22607675..11717150f 100644 --- a/tests/test_obj_Collection_v4motion.py +++ b/tests/test_obj_Collection_v4motion.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import numpy as np import pytest from scipy.spatial.transform import Rotation as R @@ -18,8 +20,7 @@ def validate_pos_orient(obj, ppath, opath_as_rotvec): ppath = np.array(ppath) opath = R.from_rotvec(opath_as_rotvec) assert ppath.shape == sp.shape, ( - "position shapes do not match" - f"\n object has {sp.shape} instead of {ppath.shape}" + f"position shapes do not match\n object has {sp.shape} instead of {ppath.shape}" ) assert opath.as_rotvec().shape == so.as_rotvec().shape, ( "orientation as_rotvec shapes do not match" @@ -107,7 +108,9 @@ def get_data_collection_position_setter(): """col_pos_init, col_ori_init, src_pos_init, src_ori_init, col_pos_test, col_ori_test, src_pos_test, src_ori_test""", get_data_collection_position_setter(), - ids=[f"{ind+1:02d}" for ind, _ in enumerate(get_data_collection_position_setter())], + ids=[ + f"{ind + 1:02d}" for ind, _ in enumerate(get_data_collection_position_setter()) + ], ) def test_Collection_setting_position( col_pos_init, @@ -217,7 +220,8 @@ def get_data_collection_orientation_setter(): col_ori_test, src_pos_test, src_ori_test""", get_data_collection_orientation_setter(), ids=[ - f"{ind+1:02d}" for ind, _ in enumerate(get_data_collection_orientation_setter()) + f"{ind + 1:02d}" + for ind, _ in enumerate(get_data_collection_orientation_setter()) ], ) def test_Collection_setting_orientation( @@ -277,6 +281,7 @@ def test_Collection_setter(): for poz, roz in zip( [(0, 0, 0), (0, 0, 5), (5, 0, 0), (5, 0, 5), (10, 0, 0), (10, 0, 5)], [(0, 0, 0), (1, 0, 0), (0, 1, 0), (0, 0, 1), (1, 2, 3), (-2, -1, 3)], + strict=False, ): col = magpy.Collection() for i in range(5): diff --git a/tests/test_obj_Cuboid.py b/tests/test_obj_Cuboid.py index 0cb55083b..2f0a372d1 100644 --- a/tests/test_obj_Cuboid.py +++ b/tests/test_obj_Cuboid.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import pickle @@ -45,12 +47,12 @@ def test_Cuboid_basics(): btest = [] for mag, dim, ang, ax, anch, mov, poso in zip( - mags, dims, angs, axs, anchs, movs, posos + mags, dims, angs, axs, anchs, movs, posos, strict=False ): pm = magpy.magnet.Cuboid(polarization=mag, dimension=np.abs(dim)) # 18 subsequent operations - for a, aa, aaa, mv in zip(ang, ax, anch, mov): + for a, aa, aaa, mv in zip(ang, ax, anch, mov, strict=False): pm.move(mv).rotate_from_angax(a, aa, aaa, start=-1) btest += [pm.getB(poso)] diff --git a/tests/test_obj_Cylinder.py b/tests/test_obj_Cylinder.py index d73f81528..8bc78ead5 100644 --- a/tests/test_obj_Cylinder.py +++ b/tests/test_obj_Cylinder.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import numpy as np import magpylib as magpy @@ -68,7 +70,7 @@ def test_Cylinder_getBH(): dim2 = [(1, 2), (2, 3), (3, 4)] dim5 = [(0, 0.5, 2, 0, 360), (0, 1, 3, 0, 360), (0.0000001, 1.5, 4, 0, 360)] - for d2, d5 in zip(dim2, dim5): + for d2, d5 in zip(dim2, dim5, strict=False): src1 = magpy.magnet.Cylinder(polarization=pol, dimension=d2) src2 = magpy.magnet.CylinderSegment(polarization=pol, dimension=d5) B0 = src1.getB(poso) diff --git a/tests/test_obj_CylinderSegment.py b/tests/test_obj_CylinderSegment.py index 679aa7e4a..48e77c69f 100644 --- a/tests/test_obj_CylinderSegment.py +++ b/tests/test_obj_CylinderSegment.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import numpy as np import magpylib as magpy @@ -20,7 +22,7 @@ def test_barycenter(): expected_barycenter_squeezed = np.array([-0.86248133, 1.12400755, 0.0]) np.testing.assert_allclose(cs.barycenter, expected_barycenter_squeezed) - cs.rotate_from_angax([76 * i for i in range(0, 5)], "x", anchor=(0, 0, 5), start=0) + cs.rotate_from_angax([76 * i for i in range(5)], "x", anchor=(0, 0, 5), start=0) expected_barycenter_path = np.array( [ diff --git a/tests/test_obj_Dipole.py b/tests/test_obj_Dipole.py index e27483f2a..e239e3b51 100644 --- a/tests/test_obj_Dipole.py +++ b/tests/test_obj_Dipole.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import numpy as np import magpylib as magpy diff --git a/tests/test_obj_Polyline.py b/tests/test_obj_Polyline.py index 66bea15cb..b5ff0de52 100644 --- a/tests/test_obj_Polyline.py +++ b/tests/test_obj_Polyline.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import numpy as np import pytest diff --git a/tests/test_obj_Sensor.py b/tests/test_obj_Sensor.py index 80d930dbf..4aa4f2cf1 100644 --- a/tests/test_obj_Sensor.py +++ b/tests/test_obj_Sensor.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import numpy as np import magpylib as magpy diff --git a/tests/test_obj_Sphere.py b/tests/test_obj_Sphere.py index 979139102..cd21ce6ed 100644 --- a/tests/test_obj_Sphere.py +++ b/tests/test_obj_Sphere.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import pickle @@ -44,12 +46,12 @@ def test_Sphere_basics(): btest = [] for mag, dim, ang, ax, anch, mov, poso in zip( - mags, dims, angs, axs, anchs, movs, posos + mags, dims, angs, axs, anchs, movs, posos, strict=False ): pm = magpy.magnet.Sphere(polarization=mag, diameter=dim) # 18 subsequent operations - for a, aa, aaa, mv in zip(ang, ax, anch, mov): + for a, aa, aaa, mv in zip(ang, ax, anch, mov, strict=False): pm.move(mv).rotate_from_angax(a, aa, aaa, start=-1) btest += [pm.getB(poso)] diff --git a/tests/test_obj_Tetrahedron.py b/tests/test_obj_Tetrahedron.py index 250514994..56da15a83 100644 --- a/tests/test_obj_Tetrahedron.py +++ b/tests/test_obj_Tetrahedron.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import numpy as np import pytest diff --git a/tests/test_obj_Triangle.py b/tests/test_obj_Triangle.py index 8156d4007..d71832210 100644 --- a/tests/test_obj_Triangle.py +++ b/tests/test_obj_Triangle.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import numpy as np import magpylib as magpy diff --git a/tests/test_obj_TriangularMesh.py b/tests/test_obj_TriangularMesh.py index aa11cc42e..3e213f1a5 100644 --- a/tests/test_obj_TriangularMesh.py +++ b/tests/test_obj_TriangularMesh.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import re import sys import warnings @@ -9,9 +11,11 @@ import magpylib as magpy from magpylib._src.exceptions import MagpylibBadUserInput -from magpylib._src.fields.field_BH_triangularmesh import BHJM_magnet_trimesh -from magpylib._src.fields.field_BH_triangularmesh import fix_trimesh_orientation -from magpylib._src.fields.field_BH_triangularmesh import lines_end_in_trimesh +from magpylib._src.fields.field_BH_triangularmesh import ( + BHJM_magnet_trimesh, + fix_trimesh_orientation, + lines_end_in_trimesh, +) def test_TriangularMesh_repr(): diff --git a/tests/test_path.py b/tests/test_path.py index de8aac398..633a43df2 100644 --- a/tests/test_path.py +++ b/tests/test_path.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import numpy as np import magpylib as magpy diff --git a/tests/test_physics_consistency.py b/tests/test_physics_consistency.py index c83065431..a80010a7c 100644 --- a/tests/test_physics_consistency.py +++ b/tests/test_physics_consistency.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import numpy as np import magpylib as magpy diff --git a/tests/test_scaling.py b/tests/test_scaling.py index 510293546..c61abfc76 100644 --- a/tests/test_scaling.py +++ b/tests/test_scaling.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import numpy as np import magpylib as magpy diff --git a/tests/test_utility.py b/tests/test_utility.py index e122ae25b..669ac6098 100644 --- a/tests/test_utility.py +++ b/tests/test_utility.py @@ -1,10 +1,10 @@ +from __future__ import annotations + import numpy as np import pytest import magpylib as magpy -from magpylib._src.utility import add_iteration_suffix -from magpylib._src.utility import check_duplicates -from magpylib._src.utility import filter_objects +from magpylib._src.utility import add_iteration_suffix, check_duplicates, filter_objects def test_duplicates(): diff --git a/tests/test_vs_mag2.py b/tests/test_vs_mag2.py index 46d961c6b..99db10bc4 100644 --- a/tests/test_vs_mag2.py +++ b/tests/test_vs_mag2.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import pickle From 8bbdb84b16a3052e49388b41aa97a789691f6c31 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Mon, 21 Apr 2025 21:42:58 +0200 Subject: [PATCH 114/211] fix typos --- CHANGELOG.md | 6 +++--- docs/_pages/user_guide/docs/docs_pos_ori.md | 2 +- docs/_pages/user_guide/docs/docs_styles.md | 2 +- .../examples/examples_force_floating.md | 2 +- .../examples/examples_force_holding_force.md | 2 +- .../user_guide/examples/examples_misc_inhom.md | 4 ++-- .../examples/examples_tutorial_paths.md | 2 +- .../user_guide/guide_resources_01_physics.md | 2 +- .../user_guide/guide_start_02_fundamentals.md | 4 ++-- pyproject.toml | 3 +++ src/magpylib/_src/defaults/defaults_classes.py | 4 ++-- src/magpylib/_src/display/backend_pyvista.py | 2 +- src/magpylib/_src/display/traces_core.py | 8 ++++---- src/magpylib/_src/display/traces_utility.py | 4 ++-- .../_src/fields/field_BH_cylinder_segment.py | 2 +- src/magpylib/_src/fields/field_BH_polyline.py | 8 ++++---- .../_src/fields/field_BH_triangularmesh.py | 4 ++-- src/magpylib/_src/fields/special_el3.py | 1 + src/magpylib/_src/input_checks.py | 2 +- src/magpylib/_src/style.py | 6 +++--- tests/test_display_matplotlib.py | 4 ++-- tests/test_display_plotly.py | 6 +++--- tests/test_elliptics.py | 4 ++-- tests/test_field_cylinder.py | 16 ++++++++-------- tests/test_getBH_level2.py | 4 ++-- tests/test_obj_Circle.py | 2 +- tests/test_obj_Polyline.py | 2 +- tests/test_obj_TriangularMesh.py | 4 ++-- 28 files changed, 58 insertions(+), 54 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3b977ef3..baa809fca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -570,7 +570,7 @@ This is a major update that includes - Modified rotate methods: - The class methods `.rotate(angle, axis, anchor)` have been replaced by a new - `.rotate(rotation, anchor, increment, start)` method where `rotation` ist a + `.rotate(rotation, anchor, increment, start)` method where `rotation` is a scipy `Rotation` object. - The original angle-axis-anchor rotation is now provided by the new method `.rotate_from_angax(angle, axis, anchor, increment, start, degrees)`. @@ -613,7 +613,7 @@ This is a major update that includes ends while other paths continue. 4. `magpylib.getBv(**kwargs)` gives direct access to the field formulas and mostly replaces the `getBv_XXX()` functionality of v2. All inputs must be - arrays of length N or of length 1 (statics will be tiled). + arrays of length N or of length 1 (constants will be tiled). - While `getBv` is the fastest way to compute the fields it is much more convenient to use `getB()` which mostly provides the same performance. Specifically,the new `getB()` automatically groups all inputs for combined @@ -685,7 +685,7 @@ API changes New features Improved internal workings ### Added -- Performance computation trough vector functionality included in new top-level +- Performance computation through vector functionality included in new top-level subpackage "vector" - Vectorized versions of math functions added to "math" subpackage diff --git a/docs/_pages/user_guide/docs/docs_pos_ori.md b/docs/_pages/user_guide/docs/docs_pos_ori.md index 591d3b97d..3def7f93b 100644 --- a/docs/_pages/user_guide/docs/docs_pos_ori.md +++ b/docs/_pages/user_guide/docs/docs_pos_ori.md @@ -2,7 +2,7 @@ # Position, Orientation, and Paths -The following secions are detiled technical documentations of the Magpylib +The following sections are detailed technical documentations of the Magpylib position and orientation interface. Practical examples and good practice usage is demonstrated in the tutorial {ref}`examples-tutorial-paths`. diff --git a/docs/_pages/user_guide/docs/docs_styles.md b/docs/_pages/user_guide/docs/docs_styles.md index 73b3c023d..3af789ae2 100644 --- a/docs/_pages/user_guide/docs/docs_styles.md +++ b/docs/_pages/user_guide/docs/docs_styles.md @@ -166,7 +166,7 @@ over the default values when `show` is called. When setting individual styles, the object family specifier such as `magnet` or `current` can be omitted. ```{note} -Users should be aware that the individual object style is organized in classes that take much longer to initialize than bare Magpylib objects, i.e. objects without individual style. This can lead to a computational bottleneck when setting individual styles of many Magpylib objects. For this reason Magpylib automatically defers style initialization until it is needed the first time, e.g. when calling the `show` function, so that object creatin time is not affected. However, this works only if style properties are set at initialization (e.g.: `magpy.magnet.Cuboid(..., style_label="MyCuboid")`). While this effect may not be noticeable for a small number of objects, it is best to avoid setting styles until it is plotting time. +Users should be aware that the individual object style is organized in classes that take much longer to initialize than bare Magpylib objects, i.e. objects without individual style. This can lead to a computational bottleneck when setting individual styles of many Magpylib objects. For this reason Magpylib automatically defers style initialization until it is needed the first time, e.g. when calling the `show` function, so that object creation time is not affected. However, this works only if style properties are set at initialization (e.g.: `magpy.magnet.Cuboid(..., style_label="MyCuboid")`). While this effect may not be noticeable for a small number of objects, it is best to avoid setting styles until it is plotting time. ``` In the following example `cube` has no individual style, so the default style is diff --git a/docs/_pages/user_guide/examples/examples_force_floating.md b/docs/_pages/user_guide/examples/examples_force_floating.md index ac3754831..fa247171e 100644 --- a/docs/_pages/user_guide/examples/examples_force_floating.md +++ b/docs/_pages/user_guide/examples/examples_force_floating.md @@ -16,7 +16,7 @@ kernelspec: # Floating Magnets -The examples here require installaion of the +The examples here require installation of the [magpylib-force package](https://pypi.org/project/magpylib-force/). See also the [magpylib-force documentation](docs-magpylib-force). diff --git a/docs/_pages/user_guide/examples/examples_force_holding_force.md b/docs/_pages/user_guide/examples/examples_force_holding_force.md index 293ea4004..1c482c080 100644 --- a/docs/_pages/user_guide/examples/examples_force_holding_force.md +++ b/docs/_pages/user_guide/examples/examples_force_holding_force.md @@ -2,7 +2,7 @@ # Magnetic Holding Force -The examples here require installaion of the +The examples here require installation of the [magpylib-force package](https://pypi.org/project/magpylib-force/). See also the [magpylib-force documentation](docs-magpylib-force). diff --git a/docs/_pages/user_guide/examples/examples_misc_inhom.md b/docs/_pages/user_guide/examples/examples_misc_inhom.md index 61718f0df..038406da1 100644 --- a/docs/_pages/user_guide/examples/examples_misc_inhom.md +++ b/docs/_pages/user_guide/examples/examples_misc_inhom.md @@ -30,8 +30,8 @@ representations of such magnets usually depict only four poles, see given by the magnetization device that is used to magnetize them. The following code shows how the field of such a magnetization device would look -like and what magnetization field it produces. To relize a Cylindrical -Quadrupole magnert there are four coils with ferromagnetic cores involved, +like and what magnetization field it produces. To realize a Cylindrical +Quadrupole magnet there are four coils with ferromagnetic cores involved, arranged in circle around the magnet. In the example, coils and cores are modeled by Cuboid magnets. diff --git a/docs/_pages/user_guide/examples/examples_tutorial_paths.md b/docs/_pages/user_guide/examples/examples_tutorial_paths.md index 952b13528..d1fcd8612 100644 --- a/docs/_pages/user_guide/examples/examples_tutorial_paths.md +++ b/docs/_pages/user_guide/examples/examples_tutorial_paths.md @@ -18,7 +18,7 @@ orphan: true The position and orientation attributes are key elements of Magpylib. The documentation section {ref}`docs-position` describes how they work in detail. -Wile these definitions can seem abstract, the interface was constructed as +While these definitions can seem abstract, the interface was constructed as intuitively as possible which is demonstrated in this tutorial. ```{important} diff --git a/docs/_pages/user_guide/guide_resources_01_physics.md b/docs/_pages/user_guide/guide_resources_01_physics.md index 0c412c405..8d8731862 100644 --- a/docs/_pages/user_guide/guide_resources_01_physics.md +++ b/docs/_pages/user_guide/guide_resources_01_physics.md @@ -118,7 +118,7 @@ It must be understood that the change in magnetization resulting from self-interaction has a homogeneous contribution which is approximated by the demagnetization factor, and an inhomogeneous contribution which cannot be modeled easily with analytical solutions. The inhomogeneous part, however, is -typically an order of magnitude lower than the homogenous part. You can use the +typically an order of magnitude lower than the homogeneous part. You can use the Magpylib extension [Magpylib material response](https://github.com/magpylib/magpylib-material-response) to model the self-interactions. diff --git a/docs/_pages/user_guide/guide_start_02_fundamentals.md b/docs/_pages/user_guide/guide_start_02_fundamentals.md index 85b45ffad..cdd0fa4d4 100644 --- a/docs/_pages/user_guide/guide_start_02_fundamentals.md +++ b/docs/_pages/user_guide/guide_start_02_fundamentals.md @@ -13,7 +13,7 @@ language, the [NumPy array class](https://numpy.org/doc/stable/) and the [Scipy Rotation class](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html). ```{hint} -Since v5 all Magpylib inputs and ouputs are by default in SI-units. See {ref}`guide-docs-io-scale-invariance` for convenient use. +Since v5 all Magpylib inputs and outputs are by default in SI-units. See {ref}`guide-docs-io-scale-invariance` for convenient use. ``` ### Create sources and observers as Python objects @@ -177,7 +177,7 @@ print(obj1.position) # -> [0.001 0.002 0.003] print(obj2.position) # -> [0.001 0.002 0.003] ``` -Collections are dicussed in detail [here](guide-docs-classes-collections). +Collections are discussed in detail [here](guide-docs-classes-collections). ### Complex Magnet Shapes diff --git a/pyproject.toml b/pyproject.toml index 0ba3bfb27..2aab52774 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -193,3 +193,6 @@ messages_control.disable = [ "protected-access", # TODO - review later "unused-argument", # already covered by ruff ] + +[tool.codespell] +skip = './src/magpylib/_src/fields/special_el3' diff --git a/src/magpylib/_src/defaults/defaults_classes.py b/src/magpylib/_src/defaults/defaults_classes.py index ea8fab886..13b2f7d90 100644 --- a/src/magpylib/_src/defaults/defaults_classes.py +++ b/src/magpylib/_src/defaults/defaults_classes.py @@ -62,7 +62,7 @@ class Display(MagicProperties): '#B68100', '#750D86', '#EB663B', '#511CFB', '#00A08B', '#FB00D1', '#FC0080', '#B2828D', '#6C7C32', '#778AAE', '#862A16', '#A777F1', '#620042', '#1616A7', '#DA60CA', '#6C4516', '#0D2A63', '#AF0038'] - An iterable of color values used to cycle trough for every object displayed. + An iterable of color values used to cycle through for every object displayed. A color may be specified by - a hex string (e.g. '#ff0000') - an rgb/rgba string (e.g. 'rgb(255,0,0)') @@ -101,7 +101,7 @@ def backend(self, val): @property def colorsequence(self): - """An iterable of color values used to cycle trough for every object displayed. + """An iterable of color values used to cycle through for every object displayed. A color may be specified by - a hex string (e.g. '#ff0000') - an rgb/rgba string (e.g. 'rgb(255,0,0)') diff --git a/src/magpylib/_src/display/backend_pyvista.py b/src/magpylib/_src/display/backend_pyvista.py index a8a3037c5..017fe54c2 100644 --- a/src/magpylib/_src/display/backend_pyvista.py +++ b/src/magpylib/_src/display/backend_pyvista.py @@ -276,7 +276,7 @@ def draw_frame(frame_ind): charts[(row, col)] = pv.Chart2D() canvas.add_chart(charts[(row, col)]) getattr(charts[(row, col)], typ)(**tr1) - # in pyvista there is no way to set the bouds so we add corners with + # in pyvista there is no way to set the bounds so we add corners with # a transparent scatter plot to set the ranges and zoom correctly ranges = data["ranges"][row + 1, col + 1] pts = np.array(np.meshgrid(*ranges)).T.reshape(-1, 3) diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index ea7809560..4d769af1d 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -312,7 +312,7 @@ def make_triangle_orientations(obj, **kwargs) -> dict[str, Any]: ) traces.append(tr) trace = merge_mesh3d(*traces) - trace["ismagnet"] = False # neede to avoid updating mag mesh + trace["ismagnet"] = False # needed to avoid updating mag mesh return trace @@ -390,7 +390,7 @@ def make_mesh_lines(obj, mode, **kwargs) -> dict[str, Any]: def make_Triangle(obj, **kwargs) -> dict[str, Any] | list[dict[str, Any]]: """ - Creates the plotly mesh3d parameters for a Trianglular facet in a dictionary based on the + Creates the plotly mesh3d parameters for a Triangular facet in a dictionary based on the provided arguments. """ style = obj.style @@ -432,7 +432,7 @@ def make_Triangle(obj, **kwargs) -> dict[str, Any] | list[dict[str, Any]]: def make_TriangularMesh_single(obj, **kwargs) -> dict[str, Any]: """ - Creates the plotly mesh3d parameters for a Trianglular facet mesh in a dictionary based on the + Creates the plotly mesh3d parameters for a Triangular facet mesh in a dictionary based on the provided arguments. """ style = obj.style @@ -447,7 +447,7 @@ def make_TriangularMesh_single(obj, **kwargs) -> dict[str, Any]: def make_TriangularMesh(obj, **kwargs) -> dict[str, Any] | list[dict[str, Any]]: """ - Creates the plotly mesh3d parameters for a Trianglular facet mesh in a dictionary based on the + Creates the plotly mesh3d parameters for a Triangular facet mesh in a dictionary based on the provided arguments. """ # pylint: disable=protected-access diff --git a/src/magpylib/_src/display/traces_utility.py b/src/magpylib/_src/display/traces_utility.py index a55118aa2..19516f00b 100644 --- a/src/magpylib/_src/display/traces_utility.py +++ b/src/magpylib/_src/display/traces_utility.py @@ -204,11 +204,11 @@ def draw_arrow_from_vertices( vec, pos, sign, - arrow_size=siz, + arrow_size=size, arrow_pos=arrow_pos, include_line=include_line, ).T - for vec, pos, siz in zip(vectors, positions, arrow_sizes, strict=False) + for vec, pos, size in zip(vectors, positions, arrow_sizes, strict=False) ], axis=1, ) diff --git a/src/magpylib/_src/fields/field_BH_cylinder_segment.py b/src/magpylib/_src/fields/field_BH_cylinder_segment.py index ce4baef56..d7b75f67c 100644 --- a/src/magpylib/_src/fields/field_BH_cylinder_segment.py +++ b/src/magpylib/_src/fields/field_BH_cylinder_segment.py @@ -2411,7 +2411,7 @@ def BHJM_cylinder_segment( # mask_inside = np.full(len(observers), in_out == "inside") # mask_not_on_surf = np.full(len(observers), True) # WARNING @alex - # 1. inside and not_on_surface are not the same! Cant just put to true. + # 1. inside and not_on_surface are not the same! Can't just put to true. # return 0 when all points are on surface if not np.any(mask_not_on_surf): diff --git a/src/magpylib/_src/fields/field_BH_polyline.py b/src/magpylib/_src/fields/field_BH_polyline.py index 98fe36b68..6a6c0ba62 100644 --- a/src/magpylib/_src/fields/field_BH_polyline.py +++ b/src/magpylib/_src/fields/field_BH_polyline.py @@ -121,7 +121,7 @@ def current_polyline_Hfield( Field computation via law of Biot Savart. See also countless online resources. eg. http://www.phys.uri.edu/gerhard/PHY204/tsl216.pdf - Be careful with magnetic fields of discontinued segements. They are + Be careful with magnetic fields of discontinued segments. They are unphysical and can lead to unphysical effects. """ # rename @@ -156,9 +156,9 @@ def current_polyline_Hfield( currents = currents[not_mask1] # determine field direction - cros = np.cross(p2 - p1, po - p4) - norm_cros = norm(cros, axis=1) - eB = (cros.T / norm_cros).T + cros_ = np.cross(p2 - p1, po - p4) + norm_cros = norm(cros_, axis=1) + eB = (cros_.T / norm_cros).T # compute angles norm_o1 = norm( diff --git a/src/magpylib/_src/fields/field_BH_triangularmesh.py b/src/magpylib/_src/fields/field_BH_triangularmesh.py index 15cdd0805..d85a41935 100644 --- a/src/magpylib/_src/fields/field_BH_triangularmesh.py +++ b/src/magpylib/_src/fields/field_BH_triangularmesh.py @@ -231,7 +231,7 @@ def get_inwards_mask( break else: # if loop reaches the end and does not find any connected edge, while still - # having some indices to go trough -> mesh is is disconnected. A new seed is + # having some indices to go through -> mesh is is disconnected. A new seed is # needed and needs to be checked via ray tracing before continuing. any_connected = False return mask @@ -248,7 +248,7 @@ def lines_end_in_trimesh(lines: np.ndarray, faces: np.ndarray) -> np.ndarray: Parameters ---------- lines: ndarray shape (n,2,3) - n line segements defined through respectively 2 (first index) positions with + n line segments defined through respectively 2 (first index) positions with coordinates (x,y,z) (last index). The first point must lie outside of the mesh. faces: ndarray, shape (m,3,3) diff --git a/src/magpylib/_src/fields/special_el3.py b/src/magpylib/_src/fields/special_el3.py index 6f37479a8..2d44ac29e 100644 --- a/src/magpylib/_src/fields/special_el3.py +++ b/src/magpylib/_src/fields/special_el3.py @@ -15,6 +15,7 @@ def el30(x, kc, p): # pylint: disable=too-many-branches # pylint: disable=too-many-statements # pylint: disable=consider-swap-variables + # codespell:ignore if x == 0: return 0.0 diff --git a/src/magpylib/_src/input_checks.py b/src/magpylib/_src/input_checks.py index 214a77b91..e8c2d20e8 100644 --- a/src/magpylib/_src/input_checks.py +++ b/src/magpylib/_src/input_checks.py @@ -648,7 +648,7 @@ def check_getBH_output_type(output): def check_input_canvas_update(canvas_update, canvas): - """chekc if canvas_update is acceptable also depending on canvas input""" + """check if canvas_update is acceptable also depending on canvas input""" acceptable = (True, False, "auto", None) if canvas_update not in acceptable: raise ValueError( diff --git a/src/magpylib/_src/style.py b/src/magpylib/_src/style.py index 3fa17b7c1..3fc2a4ff7 100644 --- a/src/magpylib/_src/style.py +++ b/src/magpylib/_src/style.py @@ -243,7 +243,7 @@ def opacity(self): @opacity.setter def opacity(self, val): assert val is None or (isinstance(val, (float, int)) and 0 <= val <= 1), ( - "The `opacity` property must be a value betwen 0 and 1,\n" + "The `opacity` property must be a value between 0 and 1,\n" f"but received {val!r} instead." ) self._opacity = val @@ -1023,7 +1023,7 @@ class DisconnectedMesh(MagicProperties, MarkerLineProperties): key/value pairs. colorsequence: iterable, default=["red", "blue", "green", "cyan", "magenta", "yellow"] - An iterable of color values used to cycle trough for every disconnected part of + An iterable of color values used to cycle through for every disconnected part of disconnected triangular mesh object. A color may be specified by - a hex string (e.g. '#ff0000') @@ -1035,7 +1035,7 @@ class DisconnectedMesh(MagicProperties, MarkerLineProperties): @property def colorsequence(self): - """An iterable of color values used to cycle trough for every disconnected part of + """An iterable of color values used to cycle through for every disconnected part of disconnected triangular mesh object. A color may be specified by - a hex string (e.g. '#ff0000') diff --git a/tests/test_display_matplotlib.py b/tests/test_display_matplotlib.py index a1daa8ddb..e56bcca2a 100644 --- a/tests/test_display_matplotlib.py +++ b/tests/test_display_matplotlib.py @@ -148,7 +148,7 @@ def test_Triangle_display(): for v in points[triangles] ] ) - # make north/south limit pass an ege by bicolor mode and (45° mag) + # make north/south limit pass an edge by bicolor mode and (45° mag) magpy.show( *src, backend="matplotlib", @@ -623,7 +623,7 @@ def test_show_legend(): @pytest.mark.parametrize("units_length", ["mT", "inch", "dam", "e"]) def test_bad_units_length(units_length): - """test units lenghts""" + """test units lengths""" c = magpy.magnet.Cuboid(polarization=(0, 0, 1), dimension=(1, 1, 1)) diff --git a/tests/test_display_plotly.py b/tests/test_display_plotly.py index bd52d6fcc..7ef63141d 100644 --- a/tests/test_display_plotly.py +++ b/tests/test_display_plotly.py @@ -175,7 +175,7 @@ def test_display_bad_style_kwargs(): def test_extra_model3d(): - """test diplay when object has an extra model object attached""" + """test display when object has an extra model object attached""" magpy.defaults.display.backend = "plotly" cuboid = magpy.magnet.Cuboid(polarization=(1, 2, 3), dimension=(1, 2, 3)) cuboid.move(np.linspace((0.4, 0.4, 0.4), (12.4, 12.4, 12.4), 33), start=-1) @@ -420,7 +420,7 @@ def test_color_precedence(): def test_colors_output2d(): - """Tests if lines have objects corresponding colors in ouptut=Bx, By...""" + """Tests if lines have objects corresponding colors in output=Bx, By...""" l1 = magpy.current.Circle( current=1, diameter=1, @@ -460,7 +460,7 @@ def get_scatters2d(fig): def test_units_length(): - """test units lenghts""" + """test units lengths""" dims = (1, 2, 3) c1 = magpy.magnet.Cuboid(dimension=dims, polarization=(1, 2, 3)) diff --git a/tests/test_elliptics.py b/tests/test_elliptics.py index d5ddc1992..80cd6f300 100644 --- a/tests/test_elliptics.py +++ b/tests/test_elliptics.py @@ -47,7 +47,7 @@ def test_el3_vs_original(): # result0 = np.array([el30(x, kc, p) for x,kc,p in zip(x11,kc11,p11)]) # np.save('data_test_el3', np.array([result0,x11,kc11,p11])) - # load data from orginal implementation + # load data from original implementation data = np.load("tests/testdata/testdata_el3.npy") res0, x11, kc11, p11 = data @@ -72,7 +72,7 @@ def test_el3_angle_vs_original(): # result0 = np.array([el3_angle0(phi, n, m) for phi,n,m in zip(phis,ns,ms)]) # np.save('data_test_el3_angle', np.array([result0,phis,ns,ms])) - # load data from orginal implementation + # load data from original implementation data = np.load("tests/testdata/testdata_el3_angle.npy") res0, phis, ns, ms = data diff --git a/tests/test_field_cylinder.py b/tests/test_field_cylinder.py index 046f5d8e6..f4417dbac 100644 --- a/tests/test_field_cylinder.py +++ b/tests/test_field_cylinder.py @@ -217,10 +217,10 @@ def test_cylinder_field1(): N = 100 magg, dim, poso, B0 = np.load("tests/testdata/testdata_full_cyl.npy") - nulll = np.zeros(N) + null = np.zeros(N) eins = np.ones(N) d, h, _ = dim.T # pylint: disable=no-member - dim5 = np.array([nulll, d / 2, h, nulll, eins * 360]).T + dim5 = np.array([null, d / 2, h, null, eins * 360]).T B1 = BHJM_cylinder_segment( field="B", observers=poso, polarization=magg, dimension=dim5 ) @@ -286,7 +286,7 @@ def test_cylinder_slanovc_field3(): hinn = np.array((-13.11018204, -15.87919449, -3.09467591)) * 1e6 hout = np.array((0.01408664, 0.1016354, 0.21743108)) * 1e6 - nulll = (0, 0, 0) + null = (0, 0, 0) # only inside htest = np.array([hinn] * 3) @@ -294,7 +294,7 @@ def test_cylinder_slanovc_field3(): np.testing.assert_allclose(H, htest) # only surf - htest = np.array([nulll] * 3) + htest = np.array([null] * 3) H = src.getH([[1, 0, 0]] * 3) np.testing.assert_allclose(H, htest) @@ -304,12 +304,12 @@ def test_cylinder_slanovc_field3(): np.testing.assert_allclose(H, htest) # surf + out - htest = np.array([nulll, nulll, hout]) + htest = np.array([null, null, hout]) H = src.getH([0.6, 0, 1], [1, 0, 0.5], [1, 2, 3]) np.testing.assert_allclose(H, htest) # surf + in - htest = np.array([nulll, nulll, hinn]) + htest = np.array([null, null, hinn]) H = src.getH([0, 0.5, 1], [1, 0, 0.5], [0.5, 0.6, 0.3]) np.testing.assert_allclose(H, htest) @@ -319,7 +319,7 @@ def test_cylinder_slanovc_field3(): np.testing.assert_allclose(H, htest) # in + out + surf - htest = np.array([nulll, nulll, hinn, hout, nulll, nulll]) + htest = np.array([null, null, hinn, hout, null, null]) H = src.getH( [0.5, 0.5, 1], [0, 1, 0.5], @@ -479,7 +479,7 @@ def test_cylinder_scaling_invariance(): def test_cylinder_diametral_small_r(): """ test if the transition from Taylor series to general case is smooth - test if the gneral case fluctuations are small + test if the general case fluctuations are small """ B = BHJM_magnet_cylinder( field="B", diff --git a/tests/test_getBH_level2.py b/tests/test_getBH_level2.py index 30e0b7a10..18a2759b1 100644 --- a/tests/test_getBH_level2.py +++ b/tests/test_getBH_level2.py @@ -449,7 +449,7 @@ def test_pixel_agg_heterogeneous_pixel_shapes(): sens_col1.rotate_from_angax([45], "z", anchor=(5, 0, 0)) sens_col2.rotate_from_angax([45], "z", anchor=(5, 0, 0)) - # different pixel shapes withoug pixel_agg should raise an error + # different pixel shapes without pixel_agg should raise an error with pytest.raises(MagpylibBadUserInput): magpy.getB(src1, sens_col2, pixel_agg=None) @@ -477,7 +477,7 @@ def test_pixel_agg_heterogeneous_pixel_shapes(): # positions respectively for each sensor, so mean equals single value np.testing.assert_allclose(B3, B4) - # Testing autmatic vs manual aggregation (mean) with different pixel shapes + # Testing automatic vs manual aggregation (mean) with different pixel shapes B_by_sens_agg_1 = magpy.getB(src_col, sens_col2, squeeze=False, pixel_agg="mean") B_by_sens_agg_2 = [] for sens in sens_col2: diff --git a/tests/test_obj_Circle.py b/tests/test_obj_Circle.py index 68e0b86fc..f89ba5e32 100644 --- a/tests/test_obj_Circle.py +++ b/tests/test_obj_Circle.py @@ -68,7 +68,7 @@ def test_repr(): def test_old_Loop_deprecation_warning(): - """test old calss deprecation warning""" + """test old class deprecation warning""" with pytest.warns(MagpylibDeprecationWarning): old_class = magpy.current.Loop() diff --git a/tests/test_obj_Polyline.py b/tests/test_obj_Polyline.py index b5ff0de52..efffa0441 100644 --- a/tests/test_obj_Polyline.py +++ b/tests/test_obj_Polyline.py @@ -125,7 +125,7 @@ def test_discontinous_line(): def test_old_Line_deprecation_warning(): - """test old calss deprecation warning""" + """test old class deprecation warning""" with pytest.warns(MagpylibDeprecationWarning): old_class = magpy.current.Line() diff --git a/tests/test_obj_TriangularMesh.py b/tests/test_obj_TriangularMesh.py index 3e213f1a5..04025eb63 100644 --- a/tests/test_obj_TriangularMesh.py +++ b/tests/test_obj_TriangularMesh.py @@ -121,7 +121,7 @@ def test_TriangularMesh_getB_different_facet_shapes_mixed(): tmesh_cube = magpy.magnet.TriangularMesh.from_pyvista( polydata=pv.Cube(), **cube_kwargs ) - # create a sensor of which the pixel line corsses both bodies + # create a sensor of which the pixel line crosses both bodies sens = magpy.Sensor(pixel=np.linspace((-2, 1, 1), (2, 1, 1))).rotate_from_angax( [14, 65, 97], (4, 6, 9), anchor=0 ) @@ -304,7 +304,7 @@ def get_tri_from_pv(obj): polarization=(0, 0, 1), polydata=obj ) - # shoud work + # should work get_tri_from_pv(pv.Cube()) # should fail From b00ee6bf346d858de6cdfef910cd4a791f7653aa Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Mon, 21 Apr 2025 21:47:25 +0200 Subject: [PATCH 115/211] finish codespell --- pyproject.toml | 2 +- src/magpylib/_src/fields/special_el3.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 2aab52774..768125306 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -195,4 +195,4 @@ messages_control.disable = [ ] [tool.codespell] -skip = './src/magpylib/_src/fields/special_el3' +skip = 'src/magpylib/_src/fields/special_el3.py' diff --git a/src/magpylib/_src/fields/special_el3.py b/src/magpylib/_src/fields/special_el3.py index 2d44ac29e..09b8370bd 100644 --- a/src/magpylib/_src/fields/special_el3.py +++ b/src/magpylib/_src/fields/special_el3.py @@ -15,7 +15,7 @@ def el30(x, kc, p): # pylint: disable=too-many-branches # pylint: disable=too-many-statements # pylint: disable=consider-swap-variables - # codespell:ignore + if x == 0: return 0.0 From 8ba7031ca336dc4a58a80de222821d2f61309c26 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Mon, 21 Apr 2025 22:04:56 +0200 Subject: [PATCH 116/211] fix capitalization --- CHANGELOG.md | 8 ++++---- docs/conf.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index baa809fca..ee98a5d3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,7 +41,7 @@ ## [5.0.4] - 2024-06-18 -- Added support for Numpy 2.0 +- Added support for NumPy 2.0 ([#795](https://github.com/magpylib/magpylib/pull/789)) - Fixed markers legend not being suppressible ([#795](https://github.com/magpylib/magpylib/pull/789)) @@ -310,7 +310,7 @@ This is a major update that includes - Scale invariant field evaluations. - Special cases caught within 1e-15 rtol and atol to account for numerical imprecision with positioning (e.g. object rotation). - - Suppress Numpy divide/invalid warnings. return `np.nan` as `(0,0,0)` (e.g. + - Suppress NumPy divide/invalid warnings. return `np.nan` as `(0,0,0)` (e.g. on magnet edges or on line currents) and allow return of `np.inf`. - New closed form implementation for `Cylinder` with diametral magnetization is much faster (100-1000x) and numerically stable for small `r`. @@ -329,7 +329,7 @@ This is a major update that includes - Minimal non-squeeze output shape is (1,1,1,1,3), meaning that a single pixel is now also represented. ([#493](https://github.com/magpylib/magpylib/pull/493)) -- With the new kwarg `pixel_agg` it is now possible to apply a Numpy function +- With the new kwarg `pixel_agg` it is now possible to apply a NumPy function with reducing functionality (like `mean`, `min`, `average`) to the pixel output. In this case, it is allowed to provide `getB` and `getH` with different observer input shapes. @@ -782,7 +782,7 @@ API changes New features Improved internal workings ### Changed -- `getBsweep()` for Collections and Sources now always returns a Numpy array +- `getBsweep()` for Collections and Sources now always returns a NumPy array - Zero-length segments in Line sources now return `[0,0,0]` and a warning, making it easier to draw spirals without letting users do this unaware. diff --git a/docs/conf.py b/docs/conf.py index 86e2a025b..305e5e2ec 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -156,7 +156,7 @@ def setup(app): "check_switcher": True, "icon_links": [ { - "name": "Github", + "name": "GitHub", "url": "https://github.com/magpylib/magpylib", "icon": "https://img.shields.io/github/stars/magpylib/magpylib?style=social", "type": "url", From 252719df1492e3732a9967796c798d2913d7f11e Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Mon, 21 Apr 2025 23:29:37 +0200 Subject: [PATCH 117/211] apply unsafe fixes --- .../_src/defaults/defaults_classes.py | 9 +- .../_src/defaults/defaults_utility.py | 17 ++- .../_src/display/backend_matplotlib.py | 29 +++-- src/magpylib/_src/display/backend_plotly.py | 9 +- src/magpylib/_src/display/backend_pyvista.py | 29 ++--- src/magpylib/_src/display/display.py | 11 +- src/magpylib/_src/display/traces_base.py | 2 +- src/magpylib/_src/display/traces_core.py | 16 +-- src/magpylib/_src/display/traces_generic.py | 31 +++-- src/magpylib/_src/display/traces_utility.py | 24 ++-- src/magpylib/_src/fields/field_BH_circle.py | 3 +- src/magpylib/_src/fields/field_BH_cuboid.py | 3 +- src/magpylib/_src/fields/field_BH_cylinder.py | 5 +- .../_src/fields/field_BH_cylinder_segment.py | 5 +- src/magpylib/_src/fields/field_BH_dipole.py | 5 +- src/magpylib/_src/fields/field_BH_polyline.py | 5 +- src/magpylib/_src/fields/field_BH_sphere.py | 5 +- .../_src/fields/field_BH_tetrahedron.py | 9 +- src/magpylib/_src/fields/field_BH_triangle.py | 5 +- .../_src/fields/field_BH_triangularmesh.py | 24 ++-- src/magpylib/_src/fields/field_wrap_BH.py | 33 +++-- src/magpylib/_src/fields/special_cel.py | 3 +- src/magpylib/_src/fields/special_el3.py | 9 +- src/magpylib/_src/input_checks.py | 121 +++++++++--------- .../_src/obj_classes/class_BaseDisplayRepr.py | 2 +- .../_src/obj_classes/class_BaseExcitations.py | 8 +- .../_src/obj_classes/class_BaseGeo.py | 11 +- .../_src/obj_classes/class_BaseTransform.py | 5 +- .../_src/obj_classes/class_Collection.py | 23 ++-- src/magpylib/_src/obj_classes/class_Sensor.py | 5 +- .../class_magnet_CylinderSegment.py | 3 +- .../obj_classes/class_magnet_Tetrahedron.py | 3 +- .../class_magnet_TriangularMesh.py | 47 +++---- .../_src/obj_classes/class_misc_Triangle.py | 3 +- src/magpylib/_src/style.py | 35 ++--- src/magpylib/_src/utility.py | 39 +++--- tests/test_Coumpound_setters.py | 4 +- tests/test_core_physics_consistency.py | 4 +- tests/test_default_utils.py | 4 +- tests/test_display_matplotlib.py | 43 ++++--- tests/test_display_pyvista.py | 6 +- tests/test_display_utility.py | 2 +- tests/test_field_cylinder.py | 2 +- tests/test_getBH_interfaces.py | 7 +- tests/test_input_checks.py | 2 +- tests/test_obj_BaseGeo_v4motion.py | 23 ++-- tests/test_obj_Collection.py | 2 +- tests/test_obj_Collection_child_parent.py | 24 +++- tests/test_obj_Collection_v4motion.py | 30 +++-- tests/test_utility.py | 8 +- tests/test_vs_mag2.py | 8 +- 51 files changed, 405 insertions(+), 360 deletions(-) diff --git a/src/magpylib/_src/defaults/defaults_classes.py b/src/magpylib/_src/defaults/defaults_classes.py index 13b2f7d90..7c7b5cb32 100644 --- a/src/magpylib/_src/defaults/defaults_classes.py +++ b/src/magpylib/_src/defaults/defaults_classes.py @@ -120,10 +120,11 @@ def colorsequence(self, val): for c in val ) except TypeError as err: - raise ValueError( + msg = ( f"The `colorsequence` property of {name} must be an " f"iterable of colors but received {val!r} instead" - ) from err + ) + raise ValueError(msg) from err self._colorsequence = val @@ -145,7 +146,7 @@ def autosizefactor(self): @autosizefactor.setter def autosizefactor(self, val): - assert val is None or (isinstance(val, (int, float)) and val > 0), ( + assert val is None or (isinstance(val, int | float) and val > 0), ( f"the `autosizefactor` property of {type(self).__name__} must be a strictly positive" f" number but received {val!r} instead" ) @@ -264,7 +265,7 @@ def output(self): def output(self, val): if val is not None: val = str(val) - valid = val.endswith("mp4") or val.endswith("gif") + valid = val.endswith(("mp4", "gif")) assert val is None or valid, ( f"The `output` property of {type(self).__name__} must be a either `mp4` or `gif` " "or a valid path ending with `.mp4` or `.gif`" diff --git a/src/magpylib/_src/defaults/defaults_utility.py b/src/magpylib/_src/defaults/defaults_utility.py index 930c1fc4a..b53185c8b 100644 --- a/src/magpylib/_src/defaults/defaults_utility.py +++ b/src/magpylib/_src/defaults/defaults_utility.py @@ -244,7 +244,7 @@ def color_validator(color_input, allow_None=True, parent_name=""): if 0 <= color_new <= 1: c = int(color_new * 255) color_new = f"#{c:02x}{c:02x}{c:02x}" - elif isinstance(color_input, (tuple, list)): + elif isinstance(color_input, tuple | list): color_new = tuple(color_input) if len(color_new) == 4: # trim opacity color_new = color_new[:-1] @@ -275,7 +275,7 @@ def color_validator(color_input, allow_None=True, parent_name=""): fail = not re_hex.fullmatch(color_new) if fail and str(color_new) not in mcolors: - raise ValueError( + msg = ( f"Invalid value of type '{type(color_input)}' " f"received for the color property of {parent_name}" f"\n Received value: {color_input!r}" @@ -286,6 +286,7 @@ def color_validator(color_input, allow_None=True, parent_name=""): " - A number between 0 and 1 (for grey scale) (e.g. '.5' or .8)\n" f" - A named CSS color:\n{list(mcolors.keys())}" ) + raise ValueError(msg) return color_new @@ -296,11 +297,12 @@ def validate_property_class(val, name, class_, parent): elif val is None: val = class_() if not isinstance(val, class_): - raise ValueError( + msg = ( f"the `{name}` property of `{type(parent).__name__}` must be an instance \n" f"of `{class_}` or a dictionary with equivalent key/value pairs \n" f"but received {val!r} instead" ) + raise ValueError(msg) return val @@ -313,10 +315,11 @@ def validate_style_keys(style_kwargs): kwargs_diff = set(level0_style_keys).difference(valid_keys) invalid_keys = {level0_style_keys[k] for k in kwargs_diff} if invalid_keys: - raise ValueError( + msg = ( f"Following arguments are invalid style properties: `{invalid_keys}`\n" f"\n Available style properties are: `{valid_keys}`" ) + raise ValueError(msg) return style_kwargs @@ -342,10 +345,11 @@ def __init__(self, **kwargs): magic_kwargs = magic_to_dict(kwargs) diff = set(magic_kwargs.keys()).difference(set(input_dict.keys())) for attr in diff: - raise AttributeError( + msg = ( f"{type(self).__name__} has no property '{attr}'" f"\n Available properties are: {list(self._property_names_generator())}" ) + raise AttributeError(msg) input_dict.update(magic_kwargs) for k, v in input_dict.items(): setattr(self, k, v) @@ -353,10 +357,11 @@ def __init__(self, **kwargs): def __setattr__(self, key, value): if self.__isfrozen and not hasattr(self, key): - raise AttributeError( + msg = ( f"{type(self).__name__} has no property '{key}'" f"\n Available properties are: {list(self._property_names_generator())}" ) + raise AttributeError(msg) object.__setattr__(self, key, value) def _freeze(self): diff --git a/src/magpylib/_src/display/backend_matplotlib.py b/src/magpylib/_src/display/backend_matplotlib.py index b5436ae49..990d41e3a 100644 --- a/src/magpylib/_src/display/backend_matplotlib.py +++ b/src/magpylib/_src/display/backend_matplotlib.py @@ -10,7 +10,7 @@ import os from collections import Counter -import matplotlib +import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np from matplotlib import patches @@ -130,7 +130,7 @@ def generic_trace_to_matplotlib(trace, antialiased=True): # marker size is proportional to area, not radius like generic props["ms"] = np.pi * props["ms"] ** 2 coords = np.array([trace[k] for k in coords_str], dtype=float) - if isinstance(props["ms"], (list, tuple, np.ndarray)): + if isinstance(props["ms"], list | tuple | np.ndarray): traces_mpl.append( { "constructor": "scatter", @@ -183,9 +183,10 @@ def generic_trace_to_matplotlib(trace, antialiased=True): } ) else: # pragma: no cover - raise ValueError( + msg = ( f"Trace type {trace['type']!r} cannot be transformed into matplotlib trace" ) + raise ValueError(msg) for tr_mesh in traces_mpl: tr_mesh["row"] = trace.get("row", 1) tr_mesh["col"] = trace.get("col", 1) @@ -216,8 +217,7 @@ def geom(ax): inds = [geom(ax)[-1] for ax in fig.axes] # retrieve first index that matches ind = inds.index(default_ind) - ax = fig.axes[ind] - return ax + return fig.axes[ind] def process_extra_trace(model): @@ -256,8 +256,8 @@ def display_matplotlib( labels = data["labels"] # only update layout if canvas is not provided - fig_kwargs = {} if not fig_kwargs else fig_kwargs - show_kwargs = {} if not show_kwargs else show_kwargs + fig_kwargs = fig_kwargs if fig_kwargs else {} + show_kwargs = show_kwargs if show_kwargs else {} show_kwargs = {**show_kwargs} for fr in frames: @@ -280,26 +280,28 @@ def display_matplotlib( fig_kwargs["figsize"] = (figsize[0] * ratio, figsize[1]) if canvas is None: fig = plt.figure(**{"tight_layout": True, **fig_kwargs}) - elif isinstance(canvas, matplotlib.axes.Axes): + elif isinstance(canvas, mpl.axes.Axes): fig = canvas.get_figure() if max_rows is not None or max_cols is not None: - raise ValueError( + msg = ( "Provided canvas is an instance of `matplotlib.axes.Axes` and does not support " "`rows` or `cols` attributes. Use an instance of `matplotlib.figure.Figure` " "instead" ) - elif isinstance(canvas, matplotlib.figure.Figure): + raise ValueError(msg) + elif isinstance(canvas, mpl.figure.Figure): fig = canvas else: - raise TypeError( + msg = ( "The `canvas` parameter must be one of `[None, matplotlib.axes.Axes, " f"matplotlib.figure.Figure]`. Received type {type(canvas)!r} instead" ) + raise TypeError(msg) if canvas is not None and canvas_update: fig.set_size_inches(*fig_kwargs["figsize"], forward=True) fig.set_dpi(fig_kwargs["dpi"]) if max_rows is None and max_cols is None: - if isinstance(canvas, matplotlib.axes.Axes): + if isinstance(canvas, mpl.axes.Axes): axes[(1, 1)] = canvas else: sp_typ = subplot_specs[0, 0]["type"] @@ -318,7 +320,7 @@ def display_matplotlib( projection = ( "3d" if subplot_specs[row - 1, col - 1]["type"] == "scene" else None ) - if isinstance(canvas, matplotlib.figure.Figure): + if isinstance(canvas, mpl.figure.Figure): try: axes[row_col_num] = extract_axis_from_row_col(fig, row, col) except (ValueError, IndexError): # IndexError if axis is not found @@ -413,3 +415,4 @@ def animate(ind): # pragma: no cover if out: return out[0] if len(out) == 1 else out + return None diff --git a/src/magpylib/_src/display/backend_plotly.py b/src/magpylib/_src/display/backend_plotly.py index 6ceb57c2b..cae6b3a09 100644 --- a/src/magpylib/_src/display/backend_plotly.py +++ b/src/magpylib/_src/display/backend_plotly.py @@ -13,10 +13,9 @@ try: import plotly.graph_objects as go except ImportError as missing_module: # pragma: no cover - raise ModuleNotFoundError( - """In order to use the plotly plotting backend, you need to install plotly via pip or conda, + msg = """In order to use the plotly plotting backend, you need to install plotly via pip or conda, see https://github.com/plotly/plotly.py""" - ) from missing_module + raise ModuleNotFoundError(msg) from missing_module from magpylib._src.defaults.defaults_utility import linearize_dict from magpylib._src.display.traces_utility import get_scene_ranges @@ -296,8 +295,8 @@ def display_plotly( ): """Display objects and paths graphically using the plotly library.""" - fig_kwargs = {} if not fig_kwargs else fig_kwargs - show_kwargs = {} if not show_kwargs else show_kwargs + fig_kwargs = fig_kwargs if fig_kwargs else {} + show_kwargs = show_kwargs if show_kwargs else {} show_kwargs = {"renderer": renderer, **show_kwargs} # only update layout if canvas is not provided diff --git a/src/magpylib/_src/display/backend_pyvista.py b/src/magpylib/_src/display/backend_pyvista.py index 017fe54c2..a03937c90 100644 --- a/src/magpylib/_src/display/backend_pyvista.py +++ b/src/magpylib/_src/display/backend_pyvista.py @@ -14,10 +14,9 @@ try: import pyvista as pv except ImportError as missing_module: # pragma: no cover - raise ModuleNotFoundError( - """In order to use the pyvista plotting backend, you need to install pyvista via pip or + msg = """In order to use the pyvista plotting backend, you need to install pyvista via pip or conda, see https://docs.pyvista.org/getting-started/installation.html""" - ) from missing_module + raise ModuleNotFoundError(msg) from missing_module from matplotlib.colors import LinearSegmentedColormap from pyvista.plotting.colors import Color # pylint: disable=import-error @@ -177,7 +176,7 @@ def generic_trace_to_pyvista(trace): } marker_size = ( marker_size - if isinstance(marker_size, (list, tuple, np.ndarray)) + if isinstance(marker_size, list | tuple | np.ndarray) else np.array([marker_size]) ) for size in np.unique(marker_size): @@ -191,20 +190,18 @@ def generic_trace_to_pyvista(trace): } traces_pv.append(tr) else: # pragma: no cover - raise ValueError( - f"Trace type {trace['type']!r} cannot be transformed into pyvista trace" - ) + msg = f"Trace type {trace['type']!r} cannot be transformed into pyvista trace" + raise ValueError(msg) showlegend = trace.get("showlegend", False) for tr in traces_pv: tr["row"] = trace.get("row", 1) - 1 tr["col"] = trace.get("col", 1) - 1 - if tr["type"] != "point_labels": - if showlegend: - showlegend = False # show only first subtrace - if "label" not in tr: - tr["label"] = trace.get("name", "") - if leg_title is not None: - tr["label"] += f" ({leg_title})" + if tr["type"] != "point_labels" and showlegend: + showlegend = False # show only first subtrace + if "label" not in tr: + tr["label"] = trace.get("name", "") + if leg_title is not None: + tr["label"] += f" ({leg_title})" if not tr.get("label", ""): tr.pop("label", None) return traces_pv @@ -230,8 +227,8 @@ def display_pyvista( frames = data["frames"] - fig_kwargs = {} if not fig_kwargs else fig_kwargs - show_kwargs = {} if not show_kwargs else show_kwargs + fig_kwargs = fig_kwargs if fig_kwargs else {} + show_kwargs = show_kwargs if show_kwargs else {} show_kwargs = {**show_kwargs} animation = bool(len(frames) > 1) diff --git a/src/magpylib/_src/display/display.py b/src/magpylib/_src/display/display.py index 85651e8a6..ed2c7c44b 100644 --- a/src/magpylib/_src/display/display.py +++ b/src/magpylib/_src/display/display.py @@ -85,7 +85,8 @@ def show( warnings.warn( f"The {backend!r} backend does not support {name!r}, " f"you need to use {supported_str} instead." - f"\nFalling back to: {params}" + f"\nFalling back to: {params}", + stacklevel=2, ) kwargs.update(params) display_kwargs = { @@ -120,9 +121,7 @@ def show( **{k[5:]: v for k, v in backend_kwargs.items() if k.startswith("show_")}, } kwargs = { - k: v - for k, v in kwargs.items() - if not (k.startswith("fig") or k.startswith("show")) + k: v for k, v in kwargs.items() if not (k.startswith(("fig", "show"))) } data = get_frames( objs, @@ -168,10 +167,10 @@ def infer_backend(canvas): backend = "plotly" except ImportError: # pragma: no cover pass - if isinstance(canvas, (mplAxes, mplFig)): + if isinstance(canvas, mplAxes | mplFig): backend = "matplotlib" elif plotly_available and isinstance( - canvas, (plotly.graph_objects.Figure, plotly.graph_objects.FigureWidget) + canvas, plotly.graph_objects.Figure | plotly.graph_objects.FigureWidget ): backend = "plotly" else: diff --git a/src/magpylib/_src/display/traces_base.py b/src/magpylib/_src/display/traces_base.py index b28a7a630..7bdad3c5c 100644 --- a/src/magpylib/_src/display/traces_base.py +++ b/src/magpylib/_src/display/traces_base.py @@ -18,7 +18,7 @@ def base_validator(name, value, conditions): msg = f"""Input {name} must be one of `{tuple(conditions.keys())},` received {value!r} instead. """ - assert value in conditions.keys(), msg + assert value in conditions, msg return conditions[value] diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index 4d769af1d..8c06c1857 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -359,10 +359,7 @@ def make_mesh_lines(obj, mode, **kwargs) -> dict[str, Any]: if mode == "selfintersecting": tr = obj.faces[obj.get_selfintersecting_faces()] edges = np.concatenate([tr[:, 0:2], tr[:, 1:3], tr[:, ::2]], axis=0) - if mode == "open": - edges = obj.get_open_edges() - else: - edges = np.unique(edges, axis=0) + edges = obj.get_open_edges() if mode == "open" else np.unique(edges, axis=0) lines = vert[edges] if lines.size == 0: @@ -460,7 +457,8 @@ def make_TriangularMesh(obj, **kwargs) -> dict[str, Any] | list[dict[str, Any]]: warnings.warn( f"Unchecked open mesh status in {obj!r} detected, before attempting " "to show potential open edges, which may take a while to compute " - "when the mesh has many faces, now applying operation..." + "when the mesh has many faces, now applying operation...", + stacklevel=2, ) obj.check_open() elif mode == "disconnected" and show_mesh: @@ -468,7 +466,8 @@ def make_TriangularMesh(obj, **kwargs) -> dict[str, Any] | list[dict[str, Any]]: warnings.warn( f"Unchecked disconnected mesh status in {obj!r} detected, before " "attempting to show possible disconnected parts, which may take a while " - "to compute when the mesh has many faces, now applying operation..." + "to compute when the mesh has many faces, now applying operation...", + stacklevel=2, ) is_disconnected = obj.check_disconnected() elif mode == "selfintersecting": @@ -476,7 +475,8 @@ def make_TriangularMesh(obj, **kwargs) -> dict[str, Any] | list[dict[str, Any]]: warnings.warn( f"Unchecked selfintersecting mesh status in {obj!r} detected, before " "attempting to show possible disconnected parts, which may take a while " - "to compute when the mesh has many faces, now applying operation..." + "to compute when the mesh has many faces, now applying operation...", + stacklevel=2, ) obj.check_selfintersecting() @@ -559,7 +559,7 @@ def make_Sensor(obj, autosize=None, **kwargs) -> dict[str, Any]: if style.color is not None: sensor["facecolor"][sensor["facecolor"] == "rgb(238,238,238)"] = style.color dim = np.array( - [dimension] * 3 if isinstance(dimension, (float, int)) else dimension[:3], + [dimension] * 3 if isinstance(dimension, float | int) else dimension[:3], dtype=float, ) if autosize is not None and style.sizemode == "scaled": diff --git a/src/magpylib/_src/display/traces_generic.py b/src/magpylib/_src/display/traces_generic.py index 3d2ff7916..a8a96bfbc 100644 --- a/src/magpylib/_src/display/traces_generic.py +++ b/src/magpylib/_src/display/traces_generic.py @@ -165,7 +165,7 @@ def make_mag_arrows(obj): x, y, z = draw_arrowed_line( direc, pos, sign=1, arrow_pos=arrow.offset, pivot="tail" ).T - trace = { + return { "type": "scatter3d", "mode": "lines", "line_width": arrow.width, @@ -176,7 +176,6 @@ def make_mag_arrows(obj): "z": z, "showlegend": False, } - return trace def make_path(input_obj, label=None): @@ -195,7 +194,7 @@ def make_path(input_obj, label=None): line["dash"] = line["style"] line["color"] = style.color if line["color"] is None else line["color"] line = {k: v for k, v in line.items() if k != "style"} - scatter_path = { + return { "type": "scatter3d", "x": x, "y": y, @@ -206,7 +205,6 @@ def make_path(input_obj, label=None): **txt_kwargs, "opacity": style.opacity, } - return scatter_path def get_trace2D_dict( @@ -226,10 +224,7 @@ def get_trace2D_dict( """return a 2d trace based on field and parameters""" coords_inds = ["xyz".index(k) for k in coords_str] y = BH.T[list(coords_inds)] - if len(coords_inds) == 1: - y = y[0] - else: - y = np.linalg.norm(y, axis=0) + y = y[0] if len(coords_inds) == 1 else np.linalg.norm(y, axis=0) marker_size = np.array([3] * len(frames_indices)) marker_size[focus_inds] = 15 title = f"{field_str}{''.join(coords_str)}" @@ -294,7 +289,7 @@ def get_traces_2D( for sub_s in (s.sensors_all if isinstance(s, magpy.Collection) else [s]) ] - if not isinstance(output, (list, tuple)): + if not isinstance(output, list | tuple): output = [output] output_params = {} field_str_list = [] @@ -303,11 +298,12 @@ def get_traces_2D( if not coords_str: coords_str = list("xyz") if field_str not in "BHMJ" and set(coords_str).difference(set("xyz")): - raise ValueError( + msg = ( "The `output` parameter must start with 'B', 'H', 'M', 'J' " "and be followed by a combination of 'x', 'y', 'z' (e.g. 'Bxy' or ('Bxy', 'Bz') )" f"\nreceived {out!r} instead" ) + raise ValueError(msg) field_str_list.append(field_str) output_params[out] = { "field_str": field_str, @@ -553,9 +549,8 @@ def get_generic_traces3D( tr_non_generic["showscale"] = tr_non_generic.get("showscale", False) tr_non_generic["color"] = tr_non_generic.get("color", style.color) else: # pragma: no cover - raise ValueError( - f"{ttype} is not supported, only 'scatter3d' and 'mesh3d' are" - ) + msg = f"{ttype} is not supported, only 'scatter3d' and 'mesh3d' are" + raise ValueError(msg) tr_non_generic.update(linearize_dict(obj_extr_trace, separator="_")) traces_generic.append(tr_non_generic) @@ -685,7 +680,9 @@ def process_animation_kwargs(obj_list, animation=False, **kwargs): and animation is not False ): # check if some path exist for any object animation = False - warnings.warn("No path to be animated detected, displaying standard plot") + warnings.warn( + "No path to be animated detected, displaying standard plot", stacklevel=2 + ) # pylint: disable=no-member anim_def = default_settings.display.animation.copy() @@ -726,7 +723,8 @@ def extract_animation_properties( f" {animation_maxfps}. `animation_fps` will be set to" f" {animation_maxfps}. " f"You can modify the default value by setting it in " - "`magpylib.defaults.display.animation.maxfps`" + "`magpylib.defaults.display.animation.maxfps`", + stacklevel=2, ) animation_fps = animation_maxfps @@ -759,7 +757,8 @@ def extract_animation_properties( f"The number of frames ({max_pl}) is greater than the max allowed " f"of {animation_maxframes}. The `animation_fps` will be set to {new_fps}. " f"You can modify the default value by setting it in " - "`magpylib.defaults.display.animation.maxframes`" + "`magpylib.defaults.display.animation.maxframes`", + stacklevel=2, ) return path_indices, exp, frame_duration diff --git a/src/magpylib/_src/display/traces_utility.py b/src/magpylib/_src/display/traces_utility.py index 19516f00b..f662f0fe8 100644 --- a/src/magpylib/_src/display/traces_utility.py +++ b/src/magpylib/_src/display/traces_utility.py @@ -102,9 +102,8 @@ def place_and_orient_model3d( def get_vertices_from_model(model_kwargs, model_args=None, coordsargs=None): """get vertices from model kwargs and args""" - if model_args: - if coordsargs is None: # matplotlib default - coordsargs = {"x": "args[0]", "y": "args[1]", "z": "args[2]"} + if model_args and coordsargs is None: # matplotlib default + coordsargs = {"x": "args[0]", "y": "args[1]", "z": "args[2]"} vertices = [] if coordsargs is None: coordsargs = {"x": "x", "y": "y", "z": "z"} @@ -118,13 +117,14 @@ def get_vertices_from_model(model_kwargs, model_args=None, coordsargs=None): elif key in model_kwargs: v = model_kwargs[key] else: - raise ValueError( + msg = ( "Rotating/Moving of provided model failed, trace dictionary " f"has no argument {k!r}, use `coordsargs` to specify the names of the " "coordinates to be used.\n" "Matplotlib backends will set up coordsargs automatically if " "the `args=(xs,ys,zs)` argument is provided." ) + raise ValueError(msg) vertices.append(v) vertices = np.array(vertices) @@ -218,10 +218,7 @@ def draw_arrow_from_vertices( def draw_arrow_on_circle(sign, diameter, arrow_size, scaled=True, angle_pos_deg=0): """draws an oriented circle with an arrow""" - if scaled: - hy = 0.2 * arrow_size - else: - hy = arrow_size / diameter * 2 + hy = 0.2 * arrow_size if scaled else arrow_size / diameter * 2 hx = 0.6 * hy hy *= np.sign(sign) x = np.array([1 + hx, 1, 1 - hx]) * diameter / 2 @@ -255,7 +252,8 @@ def get_rot_pos_from_path(obj, show_path=None): elif hasattr(show_path, "__iter__") and not isinstance(show_path, str): inds = np.array(show_path) else: # pragma: no cover - raise ValueError(f"Invalid show_path value ({show_path})") + msg = f"Invalid show_path value ({show_path})" + raise ValueError(msg) inds[inds >= path_len] = path_len - 1 inds = np.unique(inds) if inds.size == 0: @@ -445,8 +443,7 @@ def getIntensity(vertices, axis) -> np.ndarray: # normalize to interval [0,1] (necessary for when merging mesh3d traces) ptp = np.ptp(intensity) ptp = ptp if ptp != 0 else 1 - intensity = (intensity - np.min(intensity)) / ptp - return intensity + return (intensity - np.min(intensity)) / ptp @lru_cache(maxsize=32) @@ -604,10 +601,7 @@ def group_traces(*traces): ) gr = [tr["type"]] for k in [*common_keys, *spec_keys.get(tr["type"], [])]: - if k == "facecolor": - v = tr.get(k, None) is None - else: - v = tr.get(k, "") + v = tr.get(k, None) is None if k == "facecolor" else tr.get(k, "") gr.append(str(v)) gr = "".join(gr) if gr not in mesh_groups: diff --git a/src/magpylib/_src/fields/field_BH_circle.py b/src/magpylib/_src/fields/field_BH_circle.py index 490175940..9ee4fc062 100644 --- a/src/magpylib/_src/fields/field_BH_circle.py +++ b/src/magpylib/_src/fields/field_BH_circle.py @@ -152,6 +152,7 @@ def BHJM_circle( if field == "B": return BHJM * MU0 + msg = f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" raise ValueError( # pragma: no cover - f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" + msg ) diff --git a/src/magpylib/_src/fields/field_BH_cuboid.py b/src/magpylib/_src/fields/field_BH_cuboid.py index 2dae0bb24..d79a47b2f 100644 --- a/src/magpylib/_src/fields/field_BH_cuboid.py +++ b/src/magpylib/_src/fields/field_BH_cuboid.py @@ -275,6 +275,7 @@ def BHJM_magnet_cuboid( BHJM[mask_inside] -= polarization[mask_inside] return BHJM / MU0 + msg = f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" raise ValueError( # pragma: no cover - f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" + msg ) diff --git a/src/magpylib/_src/fields/field_BH_cylinder.py b/src/magpylib/_src/fields/field_BH_cylinder.py index 9076af6f5..04fa1a52a 100644 --- a/src/magpylib/_src/fields/field_BH_cylinder.py +++ b/src/magpylib/_src/fields/field_BH_cylinder.py @@ -395,6 +395,5 @@ def BHJM_magnet_cylinder( BHJM[mask_ax_inside, 2] -= pol_z[mask_ax_inside] return BHJM / MU0 - raise ValueError( # pragma: no cover - f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" - ) + msg = f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" + raise ValueError(msg) # pragma: no cover diff --git a/src/magpylib/_src/fields/field_BH_cylinder_segment.py b/src/magpylib/_src/fields/field_BH_cylinder_segment.py index d7b75f67c..2d0e775b7 100644 --- a/src/magpylib/_src/fields/field_BH_cylinder_segment.py +++ b/src/magpylib/_src/fields/field_BH_cylinder_segment.py @@ -2457,9 +2457,8 @@ def BHJM_cylinder_segment( BHJM[~mask_not_on_surf] *= 0 return BHJM - raise ValueError( # pragma: no cover - f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" - ) + msg = f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" + raise ValueError(msg) # pragma: no cover # return convert_HBMJ( # output_field_type=field, diff --git a/src/magpylib/_src/fields/field_BH_dipole.py b/src/magpylib/_src/fields/field_BH_dipole.py index 020edb37f..07196bc76 100644 --- a/src/magpylib/_src/fields/field_BH_dipole.py +++ b/src/magpylib/_src/fields/field_BH_dipole.py @@ -102,6 +102,5 @@ def BHJM_dipole( if field == "B": return BHJM * MU0 - raise ValueError( # pragma: no cover - f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" - ) + msg = f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" + raise ValueError(msg) # pragma: no cover diff --git a/src/magpylib/_src/fields/field_BH_polyline.py b/src/magpylib/_src/fields/field_BH_polyline.py index 6a6c0ba62..7d998a321 100644 --- a/src/magpylib/_src/fields/field_BH_polyline.py +++ b/src/magpylib/_src/fields/field_BH_polyline.py @@ -242,6 +242,5 @@ def BHJM_current_polyline( if field == "B": return BHJM * MU0 - raise ValueError( # pragma: no cover - f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" - ) + msg = f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" + raise ValueError(msg) # pragma: no cover diff --git a/src/magpylib/_src/fields/field_BH_sphere.py b/src/magpylib/_src/fields/field_BH_sphere.py index 6b6131ab7..585ba1e2d 100644 --- a/src/magpylib/_src/fields/field_BH_sphere.py +++ b/src/magpylib/_src/fields/field_BH_sphere.py @@ -115,6 +115,5 @@ def BHJM_magnet_sphere( BHJM[~out] -= polarization[~out] return BHJM / MU0 - raise ValueError( # pragma: no cover - f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" - ) + msg = f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" + raise ValueError(msg) # pragma: no cover diff --git a/src/magpylib/_src/fields/field_BH_tetrahedron.py b/src/magpylib/_src/fields/field_BH_tetrahedron.py index e8e6c61eb..9e7a2bf0b 100644 --- a/src/magpylib/_src/fields/field_BH_tetrahedron.py +++ b/src/magpylib/_src/fields/field_BH_tetrahedron.py @@ -58,14 +58,12 @@ def point_inside(points: np.ndarray, vertices: np.ndarray, in_out: str) -> np.nd tetra = np.linalg.inv(mat) newp = np.matmul(tetra, np.reshape(points - vertices[:, 0, :], (*points.shape, 1))) - inside = ( + return ( np.all(newp >= 0, axis=1) & np.all(newp <= 1, axis=1) & (np.sum(newp, axis=1) <= 1) ).flatten() - return inside - def BHJM_magnet_tetrahedron( field: str, @@ -128,6 +126,5 @@ def BHJM_magnet_tetrahedron( BHJM[mask_inside] += polarization[mask_inside] return BHJM - raise ValueError( # pragma: no cover - f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" - ) + msg = f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" + raise ValueError(msg) # pragma: no cover diff --git a/src/magpylib/_src/fields/field_BH_triangle.py b/src/magpylib/_src/fields/field_BH_triangle.py index 904195394..3bf169d1f 100644 --- a/src/magpylib/_src/fields/field_BH_triangle.py +++ b/src/magpylib/_src/fields/field_BH_triangle.py @@ -215,6 +215,5 @@ def BHJM_triangle( if field == "H": return BHJM / MU0 - raise ValueError( # pragma: no cover - f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" - ) + msg = f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" + raise ValueError(msg) # pragma: no cover diff --git a/src/magpylib/_src/fields/field_BH_triangularmesh.py b/src/magpylib/_src/fields/field_BH_triangularmesh.py index d85a41935..a6bc357db 100644 --- a/src/magpylib/_src/fields/field_BH_triangularmesh.py +++ b/src/magpylib/_src/fields/field_BH_triangularmesh.py @@ -40,12 +40,10 @@ def calculate_centroid(vertices, faces): ) # Calculate the centroid of the entire mesh - mesh_centroid = np.sum(triangle_centroids.T * triangle_areas, axis=1) / np.sum( + return np.sum(triangle_centroids.T * triangle_areas, axis=1) / np.sum( triangle_areas ) - return mesh_centroid - def v_norm2(a: np.ndarray) -> np.ndarray: """ @@ -70,26 +68,24 @@ def v_cross(a: np.ndarray, b: np.ndarray) -> np.ndarray: """ a x b """ - result = np.array( + return np.array( ( a[:, 1] * b[:, 2] - a[:, 2] * b[:, 1], a[:, 2] * b[:, 0] - a[:, 0] * b[:, 2], a[:, 0] * b[:, 1] - a[:, 1] * b[:, 0], ) ).T - return result def v_dot_cross3d(a: np.ndarray, b: np.ndarray, c: np.ndarray) -> np.ndarray: """ a x b * c """ - result = ( + return ( (a[..., 1] * b[..., 2] - a[..., 2] * b[..., 1]) * c[..., 0] + (a[..., 2] * b[..., 0] - a[..., 0] * b[..., 2]) * c[..., 1] + (a[..., 0] * b[..., 1] - a[..., 1] * b[..., 0]) * c[..., 2] ) - return result def get_disconnected_faces_subsets(faces: list) -> list: @@ -111,8 +107,7 @@ def get_disconnected_faces_subsets(faces: list) -> list: rest = rest2 subsets_inds.append(list(first)) tria_temp = rest - subsets = [faces[np.isin(faces, list(ps)).all(axis=1)] for ps in subsets_inds] - return subsets + return [faces[np.isin(faces, list(ps)).all(axis=1)] for ps in subsets_inds] def get_open_edges(faces: np.ndarray) -> bool: @@ -355,7 +350,8 @@ def segments_intersect_facets(segments, facets, eps=1e-6): otherwise some triangles may be detected as intersecting themselves. """ if eps <= 0: # pragma: no cover - raise ValueError("eps must be strictly positive") + msg = "eps must be strictly positive" + raise ValueError(msg) s, t = segments.swapaxes(0, 1), facets.swapaxes(0, 1) @@ -411,7 +407,8 @@ def get_intersecting_triangles(vertices, triangles, r=None, r_factor=1.5, eps=1e otherwise some triangles may be detected as intersecting themselves. """ if r_factor < 1: # pragma: no cover - raise ValueError("r_factor must be greater or equal to 1") + msg = "r_factor must be greater or equal to 1" + raise ValueError(msg) vertices = vertices.astype(np.float32) facets = vertices[triangles] @@ -575,6 +572,5 @@ def BHJM_magnet_trimesh( if field == "M": return BHJM / MU0 - raise ValueError( # pragma: no cover - f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" - ) + msg = f"`output_field_type` must be one of ('B', 'H', 'M', 'J'), got {field!r}" + raise ValueError(msg) # pragma: no cover diff --git a/src/magpylib/_src/fields/field_wrap_BH.py b/src/magpylib/_src/fields/field_wrap_BH.py index 702ccab9c..7d7b45ca4 100644 --- a/src/magpylib/_src/fields/field_wrap_BH.py +++ b/src/magpylib/_src/fields/field_wrap_BH.py @@ -201,10 +201,11 @@ def getBH_level2( # bad user inputs mixing getBH_dict kwargs with object oriented interface if kwargs: - raise MagpylibBadUserInput( + msg = ( f"Keyword arguments {tuple(kwargs.keys())} are only allowed when the source " "is defined by a string (e.g. sources='Cylinder')" ) + raise MagpylibBadUserInput(msg) # format sources input: # input: allow only one bare src object or a 1D list/tuple of src and col @@ -221,12 +222,13 @@ def getBH_level2( if in_out != "auto": from magpylib._src.obj_classes.class_magnet_Tetrahedron import Tetrahedron - if not any(isinstance(src, (Tetrahedron, TriangularMesh)) for src in src_list): + if not any(isinstance(src, Tetrahedron | TriangularMesh) for src in src_list): warnings.warn( "Argument `in_out` for field computation was set, but is ignored" " in the computation. `in_out` has an effect only for magnet classes" " Tetrahedron and TriangularMesh.", UserWarning, + stacklevel=2, ) # make sure that TriangularMesh sources have a closed mesh when getB is called - warn if not @@ -237,12 +239,14 @@ def getBH_level2( if src.status_open is None: warnings.warn( f"Unchecked mesh status of {src} detected before B-field computation. " - "An open mesh may return bad results." + "An open mesh may return bad results.", + stacklevel=2, ) elif src.status_open: # mesh is open warnings.warn( f"Open mesh of {src} detected before B-field computation. " - "An open mesh may return bad results." + "An open mesh may return bad results.", + stacklevel=2, ) # format observers input: @@ -255,7 +259,7 @@ def getBH_level2( pix_nums = [ int(np.prod(ps[:-1])) for ps in pix_shapes ] # number of pixel for each sensor - pix_inds = np.cumsum([0] + pix_nums) # cumulative indices of pixel for each sensor + pix_inds = np.cumsum([0, *pix_nums]) # cumulative indices of pixel for each sensor pix_all_same = len(set(pix_shapes)) == 1 # check which sensors have unit rotation @@ -327,10 +331,11 @@ def getBH_level2( for ind, src in enumerate(src_list): group_key = src.field_func if group_key is None: - raise MagpylibMissingInput( + msg = ( f"Cannot compute {field}-field because " f"`field_func` of {src} has undefined {field}-field computation." ) + raise MagpylibMissingInput(msg) if group_key not in field_func_groups: field_func_groups[group_key] = { "sources": [], @@ -350,10 +355,11 @@ def getBH_level2( field_func=field_func, field=field, in_out=in_out, **src_dict ) if B_group is None: - raise MagpylibMissingInput( + msg = ( f"Cannot compute {field}-field because " f"`field_func` {field_func} has undefined {field}-field computation." ) + raise MagpylibMissingInput(msg) B_group = B_group.reshape( (lg, max_path_len, n_pix, 3) ) # reshape (2% slower for large arrays) @@ -500,10 +506,11 @@ def getBH_dict_level2( source_classes[source_type]._field_func_kwargs_ndim ) except KeyError as err: - raise MagpylibBadUserInput( + msg = ( f"Input parameter `sources` must be one of {list(source_classes)}" " when using the functional interface." - ) from err + ) + raise MagpylibBadUserInput(msg) from err kwargs["observers"] = observers kwargs["position"] = position @@ -527,9 +534,8 @@ def getBH_dict_level2( ragged_seq[key] = False val = np.array(val, dtype=float) except TypeError as err: - raise MagpylibBadUserInput( - f"{key} input must be array-like.\nInstead received {val}" - ) from err + msg = f"{key} input must be array-like.\nInstead received {val}" + raise MagpylibBadUserInput(msg) from err expected_dim = field_func_kwargs_ndim.get(key, 1) if val.ndim == expected_dim or ragged_seq[key]: if len(val) == 1: @@ -540,10 +546,11 @@ def getBH_dict_level2( kwargs[key] = val if len(set(vec_lengths.values())) > 1: - raise MagpylibBadUserInput( + msg = ( "Input array lengths must be 1 or of a similar length.\n" f"Instead received lengths {vec_lengths}" ) + raise MagpylibBadUserInput(msg) vec_len = max(vec_lengths.values(), default=1) # tile 1D inputs and replace original values in kwargs for key, val in kwargs.items(): diff --git a/src/magpylib/_src/fields/special_cel.py b/src/magpylib/_src/fields/special_cel.py index cc5968eac..149dc6880 100644 --- a/src/magpylib/_src/fields/special_cel.py +++ b/src/magpylib/_src/fields/special_cel.py @@ -11,7 +11,8 @@ def cel0(kc, p, c, s): complete elliptic integral algorithm vom Kirby2009 """ if kc == 0: - raise RuntimeError("FAIL") + msg = "FAIL" + raise RuntimeError(msg) errtol = 0.000001 k = abs(kc) pp = p diff --git a/src/magpylib/_src/fields/special_el3.py b/src/magpylib/_src/fields/special_el3.py index 09b8370bd..303d3b9ed 100644 --- a/src/magpylib/_src/fields/special_el3.py +++ b/src/magpylib/_src/fields/special_el3.py @@ -62,12 +62,12 @@ def el30(x, kc, p): if bo: s = -s u = (u + 1) * 0.5 - result = (u - s * h) * np.sqrt(h) * x + u * np.arcsinh(x) - return result + return (u - s * h) * np.sqrt(h) * x + u * np.arcsinh(x) w = 1 + f if w == 0: - raise RuntimeError("FAIL") + msg = "FAIL" + raise RuntimeError(msg) p1 = CB / hh if p == 0.0 else p s = np.abs(s) y = np.abs(x) @@ -328,7 +328,8 @@ def el3v(x, kc, p): w = 1 + f if np.any(w == 0): - raise RuntimeError("FAIL") + msg = "FAIL" + raise RuntimeError(msg) p1 = np.copy(p) mask3 = p == 0 diff --git a/src/magpylib/_src/input_checks.py b/src/magpylib/_src/input_checks.py index e8c2d20e8..32bb512b3 100644 --- a/src/magpylib/_src/input_checks.py +++ b/src/magpylib/_src/input_checks.py @@ -34,7 +34,7 @@ def is_array_like(inp, msg: str): inp: test object msg: str, error msg """ - if not isinstance(inp, (list, tuple, np.ndarray)): + if not isinstance(inp, list | tuple | np.ndarray): raise MagpylibBadUserInput(msg) @@ -71,10 +71,11 @@ def check_array_shape(inp: np.ndarray, dims: tuple, shape_m1: int, length=None, def check_input_zoom(inp): """check show zoom input""" if not (isinstance(inp, numbers.Number) and inp >= 0): - raise MagpylibBadUserInput( + msg = ( "Input parameter `zoom` must be a positive number or zero.\n" f"Instead received {inp!r}." ) + raise MagpylibBadUserInput(msg) def check_input_animation(inp): @@ -97,30 +98,31 @@ def check_input_animation(inp): def check_start_type(inp): """start input must be int or str""" if not ( - isinstance(inp, (int, np.integer)) or (isinstance(inp, str) and inp == "auto") + isinstance(inp, int | np.integer) or (isinstance(inp, str) and inp == "auto") ): - raise MagpylibBadUserInput( + msg = ( f"Input parameter `start` must be integer value or 'auto'.\n" f"Instead received {inp!r}." ) + raise MagpylibBadUserInput(msg) def check_degree_type(inp): """degrees input must be bool""" if not isinstance(inp, bool): - raise MagpylibBadUserInput( + msg = ( "Input parameter `degrees` must be boolean (`True` or `False`).\n" f"Instead received {inp!r}." ) + raise MagpylibBadUserInput(msg) def check_field_input(inp): """check field input""" allowed = tuple("BHMJ") if not (isinstance(inp, str) and inp in allowed): - raise MagpylibBadUserInput( - f"`field` input can only be one of {allowed}.\nInstead received {inp!r}." - ) + msg = f"`field` input can only be one of {allowed}.\nInstead received {inp!r}." + raise MagpylibBadUserInput(msg) def validate_field_func(val): @@ -132,35 +134,39 @@ def validate_field_func(val): return if not callable(val): - raise MagpylibBadUserInput( + msg = ( "Input parameter `field_func` must be a callable.\n" f"Instead received {type(val).__name__!r}." ) + raise MagpylibBadUserInput(msg) fn_args = inspect.getfullargspec(val).args if fn_args[:2] != ["field", "observers"]: - raise MagpylibBadUserInput( + msg = ( "Input parameter `field_func` must have two positional args" " called 'field' and 'observers'.\n" f"Instead received a callable where the first two args are: {fn_args[:2]!r}" ) + raise MagpylibBadUserInput(msg) for field in ["B", "H"]: out = val(field, np.array([[1, 2, 3], [4, 5, 6]])) if out is not None: if not isinstance(out, np.ndarray): - raise MagpylibBadUserInput( + msg = ( "Input parameter `field_func` must be a callable that returns B- and H-field" " as numpy ndarray.\n" f"Instead it returns type {type(out)!r} for {field}-field." ) + raise MagpylibBadUserInput(msg) if out.shape != (2, 3): - raise MagpylibBadUserInput( + msg = ( "Input parameter `field_func` must be a callable that returns B- and H-field" " as numpy ndarray with shape (n,3), when `observers` input is shape (n,3).\n" f"Instead it returns shape {out.shape} for {field}-field for input shape " "(2,3)" ) + raise MagpylibBadUserInput(msg) return @@ -183,11 +189,12 @@ def check_format_input_orientation(inp, init_format=False): creates same behavior. """ # check type - if not isinstance(inp, (Rotation, type(None))): - raise MagpylibBadUserInput( + if not isinstance(inp, Rotation | type(None)): + msg = ( f"Input parameter `orientation` must be `None` or scipy `Rotation` object.\n" f"Instead received type {type(inp)!r}." ) + raise MagpylibBadUserInput(msg) # handle None input and compute inpQ if inp is None: inpQ = np.array((0, 0, 0, 1)) @@ -233,10 +240,11 @@ def check_format_input_axis(inp): return np.array((0, 1, 0)) if inp == "z": return np.array((0, 0, 1)) - raise MagpylibBadUserInput( + msg = ( "Input parameter `axis` must be array_like shape (3,) or one of ['x', 'y', 'z'].\n" f"Instead received string {inp!r}.\n" ) + raise MagpylibBadUserInput(msg) inp = check_format_input_vector( inp, @@ -247,7 +255,8 @@ def check_format_input_axis(inp): ) if np.all(inp == 0): - raise MagpylibBadUserInput("Input parameter `axis` must not be (0,0,0).\n") + msg = "Input parameter `axis` must not be (0,0,0).\n" + raise MagpylibBadUserInput(msg) return inp @@ -281,9 +290,8 @@ def check_format_input_scalar( - must be float compatible - transform into float """ - if allow_None: - if inp is None: - return None + if allow_None and inp is None: + return None ERR_MSG = ( f"Input parameter `{sig_name}` must be {sig_type}.\nInstead received {inp!r}." @@ -294,9 +302,8 @@ def check_format_input_scalar( inp = float(inp) - if forbid_negative: - if inp < 0: - raise MagpylibBadUserInput(ERR_MSG) + if forbid_negative and inp < 0: + raise MagpylibBadUserInput(ERR_MSG) return inp @@ -320,9 +327,8 @@ def check_format_input_vector( - if allow_None: return None - if extend_dim_to2: add a dimension if input is only (1,2,3) - required for sensor pixel """ - if allow_None: - if inp is None: - return None + if allow_None and inp is None: + return None is_array_like( inp, @@ -346,11 +352,9 @@ def check_format_input_vector( if isinstance(reshape, tuple): return np.reshape(inp, reshape) - if forbid_negative0: - if np.any(inp <= 0): - raise MagpylibBadUserInput( - f"Input parameter `{sig_name}` cannot have values <= 0." - ) + if forbid_negative0 and np.any(inp <= 0): + msg = f"Input parameter `{sig_name}` cannot have values <= 0." + raise MagpylibBadUserInput(msg) return inp @@ -374,9 +378,9 @@ def check_format_input_vector2( f"Input parameter `{param_name}` must contain only float compatible entries.\n", ) for d1, d2 in zip(inp.shape, shape, strict=False): - if d2 is not None: - if d1 != d2: - raise ValueError(f"Input parameter `{param_name}` has bad shape.") + if d2 is not None and d1 != d2: + msg = f"Input parameter `{param_name}` has bad shape." + raise ValueError(msg) return inp @@ -393,11 +397,9 @@ def check_format_input_vertices(inp): allow_None=True, ) - if inp is not None: - if inp.shape[0] < 2: - raise MagpylibBadUserInput( - "Input parameter `vertices` must have more than one vertex." - ) + if inp is not None and inp.shape[0] < 2: + msg = "Input parameter `vertices` must have more than one vertex." + raise MagpylibBadUserInput(msg) return inp @@ -429,11 +431,12 @@ def check_format_input_cylinder_segment(inp): case4 = (phi2 - phi1) > 360 case5 = (r1 < 0) | (r2 <= 0) | (h <= 0) if case2 | case3 | case4 | case5: - raise MagpylibBadUserInput( + msg = ( f"Input parameter `CylinderSegment.dimension` must be array_like of the form" f" (r1, r2, h, phi1, phi2) with 0<=r10, phi1 4: val = f"shape{val.shape}" diff --git a/src/magpylib/_src/obj_classes/class_BaseExcitations.py b/src/magpylib/_src/obj_classes/class_BaseExcitations.py index 2437ec39b..12c5041da 100644 --- a/src/magpylib/_src/obj_classes/class_BaseExcitations.py +++ b/src/magpylib/_src/obj_classes/class_BaseExcitations.py @@ -51,9 +51,8 @@ def field_func(self, val): if self._editable_field_func: validate_field_func(val) else: - raise AttributeError( - "The `field_func` attribute should not be edited for original Magpylib sources." - ) + msg = "The `field_func` attribute should not be edited for original Magpylib sources." + raise AttributeError(msg) self._field_func = val def getB( @@ -405,10 +404,11 @@ def __init__( if magnetization is not None: self.magnetization = magnetization if polarization is not None: - raise ValueError( + msg = ( "The attributes magnetization and polarization are dependent. " "Only one can be provided at magnet initialization." ) + raise ValueError(msg) if polarization is not None: self.polarization = polarization diff --git a/src/magpylib/_src/obj_classes/class_BaseGeo.py b/src/magpylib/_src/obj_classes/class_BaseGeo.py index 4c8226f3d..807e3ab72 100644 --- a/src/magpylib/_src/obj_classes/class_BaseGeo.py +++ b/src/magpylib/_src/obj_classes/class_BaseGeo.py @@ -95,9 +95,8 @@ def _process_style_kwargs(style=None, **kwargs): if k.startswith("style_"): style_kwargs[k[6:]] = v else: - raise TypeError( - f"__init__() got an unexpected keyword argument {k!r}" - ) + msg = f"__init__() got an unexpected keyword argument {k!r}" + raise TypeError(msg) style.update(**style_kwargs) return style @@ -151,10 +150,11 @@ def parent(self, inp): self._parent.remove(self) self._parent = None else: - raise MagpylibBadUserInput( + msg = ( "Input `parent` must be `None` or a `Collection` object." f"Instead received {type(inp)}." ) + raise MagpylibBadUserInput(msg) @property def position(self): @@ -272,10 +272,11 @@ def _validate_style(self, val=None): if isinstance(val, dict): style.update(val) elif not isinstance(val, self._style_class): - raise ValueError( + msg = ( f"Input parameter `style` must be of type {self._style_class}.\n" f"Instead received type {type(val)}" ) + raise ValueError(msg) return style # dunders ------------------------------------------------------- diff --git a/src/magpylib/_src/obj_classes/class_BaseTransform.py b/src/magpylib/_src/obj_classes/class_BaseTransform.py index 05ad74afb..0bc49c89e 100644 --- a/src/magpylib/_src/obj_classes/class_BaseTransform.py +++ b/src/magpylib/_src/obj_classes/class_BaseTransform.py @@ -69,10 +69,7 @@ def path_padding_param(scalar_input: bool, lenop: int, lenip: int, start: int): # start='auto': apply to all if scalar, append if vector if start == "auto": - if scalar_input: - start = 0 - else: - start = lenop + start = 0 if scalar_input else lenop # numpy convention with negative start indices if start < 0: diff --git a/src/magpylib/_src/obj_classes/class_Collection.py b/src/magpylib/_src/obj_classes/class_Collection.py index 69dd7bb56..88b9b2c14 100644 --- a/src/magpylib/_src/obj_classes/class_Collection.py +++ b/src/magpylib/_src/obj_classes/class_Collection.py @@ -316,7 +316,7 @@ def add(self, *children, override_parent=False): # pylint: disable=protected-access # allow flat lists as input - if len(children) == 1 and isinstance(children[0], (list, tuple)): + if len(children) == 1 and isinstance(children[0], list | tuple): children = children[0] # check and format input @@ -332,19 +332,19 @@ def add(self, *children, override_parent=False): if isinstance(obj, Collection): # no need to check recursively with `collections_all` if obj is already self if obj is self or self in obj.collections_all: - raise MagpylibBadUserInput( - f"Cannot add {obj!r} because a Collection must not reference itself." - ) + msg = f"Cannot add {obj!r} because a Collection must not reference itself." + raise MagpylibBadUserInput(msg) if obj._parent is None: obj._parent = self elif override_parent: obj._parent.remove(obj) obj._parent = self else: - raise MagpylibBadUserInput( + msg = ( f"Cannot add {obj!r} to {self!r} because it already has a parent.\n" "Consider using `override_parent=True`." ) + raise MagpylibBadUserInput(msg) # set attributes self._children += obj_list @@ -405,7 +405,7 @@ def remove(self, *children, recursive=True, errors="raise"): # pylint: disable=protected-access # allow flat lists as input - if len(children) == 1 and isinstance(children[0], (list, tuple)): + if len(children) == 1 and isinstance(children[0], list | tuple): children = children[0] # check and format input @@ -426,14 +426,14 @@ def remove(self, *children, recursive=True, errors="raise"): child._parent = None else: if errors == "raise": - raise MagpylibBadUserInput( - f"Cannot find and remove {child} from {self}." - ) + msg = f"Cannot find and remove {child} from {self}." + raise MagpylibBadUserInput(msg) if errors != "ignore": - raise MagpylibBadUserInput( + msg = ( "Input `errors` must be one of ('raise', 'ignore').\n" f"Instead received {errors}." ) + raise MagpylibBadUserInput(msg) return self def set_children_styles(self, arg=None, recursive=True, _validate=True, **kwargs): @@ -517,10 +517,11 @@ def _validate_getBH_inputs(self, *inputs): if current_sensors and current_sources: sources, sensors = self, self if inputs: - raise MagpylibBadUserInput( + msg = ( "Collections with sensors and sources do not allow `collection.getB()` inputs." "Consider using `magpy.getB()` instead." ) + raise MagpylibBadUserInput(msg) # if collection has no sources, *inputs must be the sources elif not current_sources: sources, sensors = inputs, self diff --git a/src/magpylib/_src/obj_classes/class_Sensor.py b/src/magpylib/_src/obj_classes/class_Sensor.py index 54deb334c..9f92172ea 100644 --- a/src/magpylib/_src/obj_classes/class_Sensor.py +++ b/src/magpylib/_src/obj_classes/class_Sensor.py @@ -145,9 +145,8 @@ def handedness(self): def handedness(self, val): """Set Sensor handedness in the local object coordinates.""" if val not in {"right", "left"}: - raise MagpylibBadUserInput( - "Sensor `handedness` must be either `'right'` or `'left'`" - ) + msg = "Sensor `handedness` must be either `'right'` or `'left'`" + raise MagpylibBadUserInput(msg) self._handedness = val def getB( diff --git a/src/magpylib/_src/obj_classes/class_magnet_CylinderSegment.py b/src/magpylib/_src/obj_classes/class_magnet_CylinderSegment.py index d86b2abd0..d5626c42e 100644 --- a/src/magpylib/_src/obj_classes/class_magnet_CylinderSegment.py +++ b/src/magpylib/_src/obj_classes/class_magnet_CylinderSegment.py @@ -152,8 +152,7 @@ def _get_barycenter(position, orientation, dimension): # get centroid for rotated annular sector x, y, z = centroid_x * np.cos(phi), centroid_x * np.sin(phi), 0 centroid = np.array([x, y, z]) - barycenter = orientation.apply(centroid) + position - return barycenter + return orientation.apply(centroid) + position @property def _default_style_description(self): diff --git a/src/magpylib/_src/obj_classes/class_magnet_Tetrahedron.py b/src/magpylib/_src/obj_classes/class_magnet_Tetrahedron.py index d0d2aa7b8..6be644a97 100644 --- a/src/magpylib/_src/obj_classes/class_magnet_Tetrahedron.py +++ b/src/magpylib/_src/obj_classes/class_magnet_Tetrahedron.py @@ -139,8 +139,7 @@ def _get_barycenter(position, orientation, vertices): centroid = ( np.array([0.0, 0.0, 0.0]) if vertices is None else np.mean(vertices, axis=0) ) - barycenter = orientation.apply(centroid) + position - return barycenter + return orientation.apply(centroid) + position @property def _default_style_description(self): diff --git a/src/magpylib/_src/obj_classes/class_magnet_TriangularMesh.py b/src/magpylib/_src/obj_classes/class_magnet_TriangularMesh.py index 0a3b9dd21..02d5d3166 100644 --- a/src/magpylib/_src/obj_classes/class_magnet_TriangularMesh.py +++ b/src/magpylib/_src/obj_classes/class_magnet_TriangularMesh.py @@ -197,13 +197,13 @@ def _validate_mode_arg(arg, arg_name="mode"): """Validate mode argument""" accepted_arg_vals = (True, False, "warn", "raise", "ignore", "skip") if arg not in accepted_arg_vals: - raise ValueError( + msg = ( f"The `{arg_name}` argument must be one of {accepted_arg_vals}, " f"instead received {arg!r}." f"\nNote that `True` translates to `'warn'` and `False` to `'skip'`" ) - arg = "warn" if arg is True else "skip" if arg is False else arg - return arg + raise ValueError(msg) + return "warn" if arg is True else "skip" if arg is False else arg def check_open(self, mode="warn"): """ @@ -250,7 +250,7 @@ def check_open(self, mode="warn"): "Open edges are stored in the status_open_data property." ) if mode == "warn": - warnings.warn(msg) + warnings.warn(msg, stacklevel=2) elif mode == "raise": raise ValueError(msg) return self._status_open @@ -298,7 +298,7 @@ def check_disconnected(self, mode="warn"): "Parts are stored in the status_disconnected_data property." ) if mode == "warn": - warnings.warn(msg) + warnings.warn(msg, stacklevel=2) elif mode == "raise": raise ValueError(msg) return self._status_disconnected @@ -347,7 +347,7 @@ def check_selfintersecting(self, mode="warn"): "Parts are stored in the status_selfintersecting_data property." ) if mode == "warn": - warnings.warn(msg) + warnings.warn(msg, stacklevel=2) elif mode == "raise": raise ValueError(msg) return self._status_selfintersecting @@ -390,14 +390,15 @@ def reorient_faces(self, mode="warn"): if self._status_open is None: if mode in ["warn", "raise"]: warnings.warn( - f"Unchecked mesh status in {self!r} detected. Now applying check_open()" + f"Unchecked mesh status in {self!r} detected. Now applying check_open()", + stacklevel=2, ) self.check_open(mode=mode) if self._status_open: msg = f"Open mesh in {self!r} detected. reorient_faces() can give bad results." if mode == "warn": - warnings.warn(msg) + warnings.warn(msg, stacklevel=2) elif mode == "raise": raise ValueError(msg) @@ -488,8 +489,7 @@ def _get_barycenter(position, orientation, vertices, faces): if vertices is None else calculate_centroid(vertices, faces) ) - barycenter = orientation.apply(centroid) + position - return barycenter + return orientation.apply(centroid) + position def _input_check(self, vertices, faces): """input checks here ?""" @@ -498,9 +498,11 @@ def _input_check(self, vertices, faces): # unique vertices ? # do validation checks if vertices is None: - raise MagpylibMissingInput(f"Parameter `vertices` of {self} must be set.") + msg = f"Parameter `vertices` of {self} must be set." + raise MagpylibMissingInput(msg) if faces is None: - raise MagpylibMissingInput(f"Parameter `faces` of {self} must be set.") + msg = f"Parameter `faces` of {self} must be set." + raise MagpylibMissingInput(msg) verts = check_format_input_vector( vertices, dims=(2,), @@ -518,9 +520,8 @@ def _input_check(self, vertices, faces): try: verts[trias] except IndexError as e: - raise IndexError( - "Some `faces` indices do not match with `vertices` array" - ) from e + msg = "Some `faces` indices do not match with `vertices` array" + raise IndexError(msg) from e return verts, trias def to_TriangleCollection(self): @@ -703,15 +704,15 @@ def from_pyvista( try: import pyvista except ImportError as missing_module: # pragma: no cover - raise ModuleNotFoundError( - """In order load pyvista Polydata objects, you first need to install pyvista via pip + msg = """In order load pyvista Polydata objects, you first need to install pyvista via pip or conda, see https://docs.pyvista.org/getting-started/installation.html""" - ) from missing_module + raise ModuleNotFoundError(msg) from missing_module if not isinstance(polydata, pyvista.core.pointset.PolyData): - raise TypeError( + msg = ( "The `polydata` parameter must be an instance of `pyvista.core.pointset.PolyData`, " f"received {polydata!r} instead" ) + raise TypeError(msg) polydata = polydata.triangulate() vertices = polydata.points faces = polydata.faces.reshape(-1, 4)[:, 1:] @@ -806,17 +807,19 @@ def from_triangles( ------- magnet source: `TriangularMesh` object """ - if not isinstance(triangles, (list, Collection)): - raise TypeError( + if not isinstance(triangles, list | Collection): + msg = ( "The `triangles` parameter must be a list or Collection of `Triangle` objects, " f"\nreceived type {type(triangles)} instead" ) + raise TypeError(msg) for obj in triangles: if not isinstance(obj, Triangle): - raise TypeError( + msg = ( "All elements of `triangles` must be `Triangle` objects, " f"\nreceived type {type(obj)} instead" ) + raise TypeError(msg) mesh = np.array([tria.vertices for tria in triangles]) vertices, tr = np.unique(mesh.reshape((-1, 3)), axis=0, return_inverse=True) faces = tr.reshape((-1, 3)) diff --git a/src/magpylib/_src/obj_classes/class_misc_Triangle.py b/src/magpylib/_src/obj_classes/class_misc_Triangle.py index 418e81749..1c7dbbf21 100644 --- a/src/magpylib/_src/obj_classes/class_misc_Triangle.py +++ b/src/magpylib/_src/obj_classes/class_misc_Triangle.py @@ -140,8 +140,7 @@ def _get_barycenter(position, orientation, vertices): centroid = ( np.array([0.0, 0.0, 0.0]) if vertices is None else np.mean(vertices, axis=0) ) - barycenter = orientation.apply(centroid) + position - return barycenter + return orientation.apply(centroid) + position @property def _default_style_description(self): diff --git a/src/magpylib/_src/style.py b/src/magpylib/_src/style.py index 3fc2a4ff7..8a36f9782 100644 --- a/src/magpylib/_src/style.py +++ b/src/magpylib/_src/style.py @@ -130,7 +130,7 @@ def width(self): @width.setter def width(self, val): - assert val is None or (isinstance(val, (int, float)) and val >= 0), ( + assert val is None or (isinstance(val, int | float) and val >= 0), ( f"The `width` property of {type(self).__name__} must be a positive number,\n" f"but received {val!r} instead." ) @@ -242,7 +242,7 @@ def opacity(self): @opacity.setter def opacity(self, val): - assert val is None or (isinstance(val, (float, int)) and 0 <= val <= 1), ( + assert val is None or (isinstance(val, float | int) and 0 <= val <= 1), ( "The `opacity` property must be a value between 0 and 1,\n" f"but received {val!r} instead." ) @@ -396,7 +396,7 @@ def data(self, val): def _validate_data(self, traces, **kwargs): if traces is None: traces = [] - elif not isinstance(traces, (list, tuple)): + elif not isinstance(traces, list | tuple): traces = [traces] new_traces = [] for trace in traces: @@ -595,7 +595,7 @@ def scale(self): @scale.setter def scale(self, val): - assert isinstance(val, (int, float)) and val > 0, ( + assert isinstance(val, int | float) and val > 0, ( f"The `scale` property of {type(self).__name__} must be a strictly positive number,\n" f"but received {val!r} instead." ) @@ -627,7 +627,7 @@ def backend(self): @backend.setter def backend(self, val): - backends = ["generic"] + list(SUPPORTED_PLOTTING_BACKENDS) + backends = ["generic", *list(SUPPORTED_PLOTTING_BACKENDS)] assert val is None or val in backends, ( f"The `backend` property of {type(self).__name__} must be one of" f"{backends},\n" @@ -660,7 +660,7 @@ def val(): if not isinstance(test_val, dict): msg = f"but callable returned type {type(test_val)}." else: - bad_keys = [k for k in test_val.keys() if k not in valid_props] + bad_keys = [k for k in test_val if k not in valid_props] if bad_keys: msg = f"but invalid output dictionary keys received: {bad_keys}." @@ -834,7 +834,7 @@ def transition(self): @transition.setter def transition(self, val): - assert val is None or (isinstance(val, (float, int)) and 0 <= val <= 1), ( + assert val is None or (isinstance(val, float | int) and 0 <= val <= 1), ( "color transition must be a value between 0 and 1" ) self._transition = val @@ -1055,10 +1055,11 @@ def colorsequence(self, val): for c in val ) except TypeError as err: - raise ValueError( + msg = ( f"The `colorsequence` property of {name} must be an " f"iterable of colors but received {val!r} instead" - ) from err + ) + raise ValueError(msg) from err self._colorsequence = val @@ -1193,7 +1194,7 @@ def size(self): @size.setter def size(self, val): - assert val is None or (isinstance(val, (int, float)) and val >= 0), ( + assert val is None or (isinstance(val, int | float) and val >= 0), ( f"The `size` property of {type(self).__name__} must be a positive number,\n" f"but received {val!r} instead." ) @@ -1218,7 +1219,7 @@ def offset(self): @offset.setter def offset(self, val): - assert val is None or (isinstance(val, (float, int))), ( + assert val is None or (isinstance(val, float | int)), ( f"The `offset` property must valid number\nbut received {val!r} instead." ) self._offset = val @@ -1519,7 +1520,7 @@ def size(self): @size.setter def size(self, val): - assert val is None or (isinstance(val, (int, float)) and val >= 0), ( + assert val is None or (isinstance(val, int | float) and val >= 0), ( f"The `size` property of {type(self).__name__} must be a positive number,\n" f"but received {val!r} instead." ) @@ -1674,7 +1675,7 @@ def size(self): @size.setter def size(self, val): - assert val is None or (isinstance(val, (int, float)) and val >= 0), ( + assert val is None or (isinstance(val, int | float) and val >= 0), ( f"the `size` property of {type(self).__name__} must be a positive number" f"but received {val!r} instead." ) @@ -1851,7 +1852,7 @@ def size(self): @size.setter def size(self, val): - assert val is None or (isinstance(val, (int, float)) and val >= 0), ( + assert val is None or (isinstance(val, int | float) and val >= 0), ( f"The `size` property of {type(self).__name__} must be a positive number,\n" f"but received {val!r} instead." ) @@ -1879,7 +1880,7 @@ def offset(self): @offset.setter def offset(self, val): - assert val is None or ((isinstance(val, (float, int))) and 0 <= val <= 1), ( + assert val is None or ((isinstance(val, float | int)) and 0 <= val <= 1), ( "The `offset` property must valid number between 0 and 1\n" f"but received {val!r} instead." ) @@ -1943,7 +1944,7 @@ def size(self): @size.setter def size(self, val): - assert val is None or (isinstance(val, (int, float)) and val >= 0), ( + assert val is None or (isinstance(val, int | float) and val >= 0), ( f"The `size` property of {type(self).__name__} must be a positive number,\n" f"but received {val!r} instead." ) @@ -2022,7 +2023,7 @@ def size(self): @size.setter def size(self, val): - assert val is None or (isinstance(val, (int, float)) and val >= 0), ( + assert val is None or (isinstance(val, int | float) and val >= 0), ( f"The `size` property of {type(self).__name__} must be a positive number,\n" f"but received {val!r} instead." ) diff --git a/src/magpylib/_src/utility.py b/src/magpylib/_src/utility.py index 8df00f9ba..aafc54de6 100644 --- a/src/magpylib/_src/utility.py +++ b/src/magpylib/_src/utility.py @@ -5,6 +5,7 @@ # import numbers from __future__ import annotations +import warnings from collections.abc import Callable, Sequence from contextlib import contextmanager from functools import cache @@ -83,9 +84,9 @@ def format_obj_input(*objects: Sequence, allow="sources+sensors", warn=True) -> flatten_collection = "collections" not in allow.split("+") for obj in objects: try: - if isinstance(obj, (BaseSource, Sensor)): + if isinstance(obj, BaseSource | Sensor): obj_list += [obj] - elif flatten_collection or isinstance(obj, (list, tuple)): + elif flatten_collection or isinstance(obj, list | tuple): obj_list += format_obj_input( *obj, allow=allow, @@ -95,8 +96,7 @@ def format_obj_input(*objects: Sequence, allow="sources+sensors", warn=True) -> obj_list += [obj] except Exception as error: raise MagpylibBadUserInput(wrong_obj_msg(obj, allow=allow)) from error - obj_list = filter_objects(obj_list, allow=allow, warn=False) - return obj_list + return filter_objects(obj_list, allow=allow, warn=False) def format_src_inputs(sources) -> list: @@ -119,7 +119,7 @@ def format_src_inputs(sources) -> list: src_list = [] # if bare source make into list - if not isinstance(sources, (list, tuple)): + if not isinstance(sources, list | tuple): sources = [sources] if not sources: @@ -167,7 +167,7 @@ def check_duplicates(obj_list: Sequence) -> list: obj_list_new += [src] if len(obj_list_new) != len(obj_list): - print("WARNING: Eliminating duplicates") + warnings.warn("Eliminating duplicates", UserWarning, stacklevel=2) return obj_list_new @@ -213,7 +213,8 @@ def filter_objects(obj_list, allow="sources+sensors", warn=True): if isinstance(obj, allowed_classes): new_list += [obj] elif warn: - print(f"Warning, cannot add {obj!r} to Collection.") + msg = f"Warning, cannot add {obj!r} to Collection." + warnings.warn(msg, UserWarning, stacklevel=2) return new_list @@ -259,11 +260,9 @@ def get_unit_factor(unit_input, *, target_unit, deci_centi=True): if factor_power is None or len(unit_input_str) > 2: valid_inputs = [f"{k}{target_unit}" for k in prefs] - raise ValueError( - f"Invalid unit input ({unit_input!r}), must be one of {valid_inputs}" - ) - factor = 1 / (10**factor_power) - return factor + msg = f"Invalid unit input ({unit_input!r}), must be one of {valid_inputs}" + raise ValueError(msg) + return 1 / (10**factor_power) def unit_prefix(number, unit="", precision=3, char_between="", as_tuple=False) -> str: @@ -321,8 +320,7 @@ def add_iteration_suffix(name): midchar = "" n = m.group() endstr = -len(n) - name = f"{name[:endstr]}{midchar}{int(n) + 1:0{len(n)}}" - return name + return f"{name[:endstr]}{midchar}{int(n) + 1:0{len(n)}}" def cart_to_cyl_coordinates(observer): @@ -359,9 +357,8 @@ def rec_obj_remover(parent, child): parent._children.remove(child) parent._update_src_and_sens() return True - if isinstance(obj, Collection): - if rec_obj_remover(obj, child): - break + if isinstance(obj, Collection) and rec_obj_remover(obj, child): + break return None @@ -421,7 +418,8 @@ def open_animation(filepath, embed=True): display(Video(data=filepath, embed=embed)) else: # pragma: no cover - raise TypeError("Filetype not supported, only 'mp4 or 'gif' allowed") + msg = "Filetype not supported, only 'mp4 or 'gif' allowed" + raise TypeError(msg) else: import webbrowser @@ -484,9 +482,8 @@ def merge_dicts_with_conflict_check(objs, *, target, identifiers, unique_fields) ) if a != t ] - raise ValueError( - f"Conflicting parameters detected for {key_dict}: {', '.join(diff)}." - ) + msg = f"Conflicting parameters detected for {key_dict}: {', '.join(diff)}." + raise ValueError(msg) tracker[key] = tracker_actual if key not in merged_dict: diff --git a/tests/test_Coumpound_setters.py b/tests/test_Coumpound_setters.py index 59f99dfa8..598cfd813 100644 --- a/tests/test_Coumpound_setters.py +++ b/tests/test_Coumpound_setters.py @@ -121,7 +121,7 @@ def get_pos_orient_from_collection(coll): """returns a list of (position, orientation.as_matrix()) tuple of a collection and of its children""" pos_orient = [] - for obj in [coll] + coll.children: + for obj in [coll, *coll.children]: pos_orient.append((obj.position, obj.orientation.as_matrix())) return pos_orient @@ -134,7 +134,7 @@ def get_pos_orient_from_collection(coll): @pytest.mark.parametrize( - "setters_inputs, pos_orient_as_matrix_expected", + ("setters_inputs", "pos_orient_as_matrix_expected"), list( zip( COMPOUND_DATA["setters_inputs"], diff --git a/tests/test_core_physics_consistency.py b/tests/test_core_physics_consistency.py index c7498ee64..da857d602 100644 --- a/tests/test_core_physics_consistency.py +++ b/tests/test_core_physics_consistency.py @@ -1,5 +1,7 @@ from __future__ import annotations +import itertools + import numpy as np from scipy.constants import mu_0 as MU0 @@ -326,7 +328,7 @@ def test_core_physics_geometry_cylinder_from_segments(): sections = np.array([-12, 65, 123, 180, 245, 348]) Bseg = np.zeros((2, 3)) - for phi1, phi2 in zip(sections[:-1], sections[1:], strict=False): + for phi1, phi2 in itertools.pairwise(sections): B_part = BHJM_cylinder_segment( field="B", observers=obs, diff --git a/tests/test_default_utils.py b/tests/test_default_utils.py index 085096bcf..c3162a59d 100644 --- a/tests/test_default_utils.py +++ b/tests/test_default_utils.py @@ -100,7 +100,7 @@ def test_linearize_dict(): @pytest.mark.parametrize( - "color, allow_None, color_expected", + ("color", "allow_None", "color_expected"), [ (None, True, None), ("blue", True, "blue"), @@ -122,7 +122,7 @@ def test_good_colors(color, allow_None, color_expected): @pytest.mark.parametrize( - "color, allow_None, expected_exception", + ("color", "allow_None", "expected_exception"), [ (None, False, ValueError), (-1, False, ValueError), diff --git a/tests/test_display_matplotlib.py b/tests/test_display_matplotlib.py index e56bcca2a..6be1c5261 100644 --- a/tests/test_display_matplotlib.py +++ b/tests/test_display_matplotlib.py @@ -4,9 +4,9 @@ import re from unittest.mock import patch -import matplotlib # noreorder +import matplotlib as mpl # noreorder -matplotlib.use("Agg") +mpl.use("Agg") import matplotlib.pyplot as plt import matplotlib.tri as mtri import numpy as np @@ -400,7 +400,10 @@ def test_matplotlib_model3d_extra_bad_input(): def test_matplotlib_model3d_extra_updatefunc(): """test display extra model3d""" obj = magpy.misc.Dipole(moment=(0, 0, 1)) - updatefunc = lambda: make_Cuboid("matplotlib", position=(2, 0, 0)) + + def updatefunc(): + return make_Cuboid("matplotlib", position=(2, 0, 0)) + obj.style.model3d.data = updatefunc ax = plt.subplot(projection="3d") obj.show(canvas=ax, return_fig=True) @@ -414,11 +417,17 @@ def test_matplotlib_model3d_extra_updatefunc(): obj.style.model3d.add_trace(updatefunc=updatefunc) with pytest.raises(AssertionError): - updatefunc = lambda: "bad output type" + + def updatefunc(): + return "bad output type" + obj.style.model3d.add_trace(updatefunc=updatefunc) with pytest.raises(AssertionError): - updatefunc = lambda: {"bad_key": "some_value"} + + def updatefunc(): + return {"bad_key": "some_value"} + obj.style.model3d.add_trace(updatefunc=updatefunc) @@ -444,7 +453,7 @@ def test_graphics_model_generic_to_mpl(): model3d["kwargs"]["facecolor"] = np.array(["blue"] * 12) c.style.model3d.add_trace(**model3d) fig = c.show(style_path_frames=1, backend="matplotlib", return_fig=True) - assert isinstance(fig, matplotlib.figure.Figure) + assert isinstance(fig, mpl.figure.Figure) def test_mpl_animation(): @@ -456,8 +465,8 @@ def test_mpl_animation(): ) # pylint: disable=protected-access anim._draw_was_started = True # avoid mpl test warning - assert isinstance(fig, matplotlib.figure.Figure) - assert isinstance(anim, matplotlib.animation.FuncAnimation) + assert isinstance(fig, mpl.figure.Figure) + assert isinstance(anim, mpl.animation.FuncAnimation) def test_subplots(): @@ -522,16 +531,18 @@ def test_bad_show_inputs(): cyl1 = magpy.magnet.Cylinder( polarization=(0.1, 0, 0), dimension=(1, 2), style_label="Cylinder1" ) - with pytest.raises( - ValueError, - match=( - r"Conflicting parameters detected for {'row': 1, 'col': 1}:" - r" 'output' first got 'model3d' then 'Bx'." + with ( + pytest.raises( + ValueError, + match=( + r"Conflicting parameters detected for {'row': 1, 'col': 1}:" + r" 'output' first got 'model3d' then 'Bx'." + ), ), + magpy.show_context(animation=False, sumup=True, pixel_agg="mean") as s, ): - with magpy.show_context(animation=False, sumup=True, pixel_agg="mean") as s: - s.show(cyl1, sensor, col=1, output="Bx") - s.show(cyl1, sensor, col=1) + s.show(cyl1, sensor, col=1, output="Bx") + s.show(cyl1, sensor, col=1) # test unsupported specific args for some backends with pytest.warns( diff --git a/tests/test_display_pyvista.py b/tests/test_display_pyvista.py index 5f95d8358..ebd9c7764 100644 --- a/tests/test_display_pyvista.py +++ b/tests/test_display_pyvista.py @@ -102,9 +102,9 @@ def test_animation_warning(): src.show(canvas=pl, animation=True, backend="pyvista") -@pytest.mark.parametrize("is_notebook_result", (True, False)) -@pytest.mark.parametrize("extension", ("mp4", "gif")) -@pytest.mark.parametrize("filename", (True, False)) +@pytest.mark.parametrize("is_notebook_result", [True, False]) +@pytest.mark.parametrize("extension", ["mp4", "gif"]) +@pytest.mark.parametrize("filename", [True, False]) def test_pyvista_animation(is_notebook_result, extension, filename): """Test pyvista animation""" # define sensor and source diff --git a/tests/test_display_utility.py b/tests/test_display_utility.py index 5a984f7c3..00f13f7eb 100644 --- a/tests/test_display_utility.py +++ b/tests/test_display_utility.py @@ -74,7 +74,7 @@ def test_bad_backend(): @pytest.mark.parametrize( - "canvas,is_notebook_result,backend", + ("canvas", "is_notebook_result", "backend"), [ (None, True, "plotly"), (None, False, "matplotlib"), diff --git a/tests/test_field_cylinder.py b/tests/test_field_cylinder.py index f4417dbac..ba1c8262c 100644 --- a/tests/test_field_cylinder.py +++ b/tests/test_field_cylinder.py @@ -195,7 +195,7 @@ @pytest.mark.parametrize( - "inputs, H_expected", + ("inputs", "H_expected"), [[v["inputs"], v["H_expected"]] for v in DATA.values()], ids=list(DATA.keys()), ) diff --git a/tests/test_getBH_interfaces.py b/tests/test_getBH_interfaces.py index 06eff6977..0818367bc 100644 --- a/tests/test_getBH_interfaces.py +++ b/tests/test_getBH_interfaces.py @@ -266,7 +266,10 @@ def test_sensor_handedness(): """test sensor handedness""" k = 0.1 N = [5, 4, 3] - ls = lambda n: np.linspace(-k / 2, k / 2, n) + + def ls(n): + return np.linspace(-k / 2, k / 2, n) + pixel = np.array([[x, y, z] for x in ls(N[0]) for y in ls(N[1]) for z in ls(N[2])]) pixel = pixel.reshape((*N, 3)) c = magpy.magnet.Cuboid( @@ -365,7 +368,7 @@ def test_getB_on_missing_excitations(module, class_, missing_arg, kwargs): getattr(getattr(magpy, module), class_)(**kwargs).getB([0, 0, 0]) -@pytest.mark.parametrize("field", ("H", "B", "M", "J")) +@pytest.mark.parametrize("field", ["H", "B", "M", "J"]) def test_getHBMJ_self_consistency(field): """test getHBMJ self consistency""" sources = [ diff --git a/tests/test_input_checks.py b/tests/test_input_checks.py index 94edfb18f..cba566b56 100644 --- a/tests/test_input_checks.py +++ b/tests/test_input_checks.py @@ -856,7 +856,7 @@ def test_input_collection_remove_good(children): """good inputs: collection.remove(children)""" col = magpy.Collection(*children) assert col.children == ( - list(children[0]) if isinstance(children[0], (tuple, list)) else children + list(children[0]) if isinstance(children[0], tuple | list) else children ) col.remove(*children) assert not col.children diff --git a/tests/test_obj_BaseGeo_v4motion.py b/tests/test_obj_BaseGeo_v4motion.py index 7ced9e942..2d6bea5c6 100644 --- a/tests/test_obj_BaseGeo_v4motion.py +++ b/tests/test_obj_BaseGeo_v4motion.py @@ -62,7 +62,7 @@ def get_init_pos_orient_test_data(): o3 = [(0, 0, 0.1), (0, 0, 0.2)] o4 = [(0, 0, 0.1), (0, 0, 0.2), (0, 0, 0.3)] - init_test_data = [ + return [ [p0, o0, p0, (0, 0, 0)], [p0, o1, p0, o1], [p0, o2, p0, o1], @@ -75,13 +75,17 @@ def get_init_pos_orient_test_data(): [p2, o1, p2, [o1] * 2], [p2, o2, p2, [o1] * 2], [p2, o3, p2, o3], - [p2, o4, p2 + [(1, 1, 1)], o4], # uneven paths + [p2, o4, [*p2, (1, 1, 1)], o4], # uneven paths ] - return init_test_data @pytest.mark.parametrize( - "init_position, init_orientation_rotvec, expected_position, expected_orientation_rotvec", + ( + "init_position", + "init_orientation_rotvec", + "expected_position", + "expected_orientation_rotvec", + ), get_init_pos_orient_test_data(), ids=[f"{ind + 1:02d}" for ind, t in enumerate(get_init_pos_orient_test_data())], ) @@ -139,7 +143,7 @@ def get_data_object_setter(inp): (P1, O1, p1, O1), (P1, O1, p3, [O1] * 3), # edge-pad (P2, O2, p1, O2[1]), # end-slice - (P2, O2, p3, O2 + [(0.3, 0.3, 0.3)]), # edge-pad + (P2, O2, p3, [*O2, (0.3, 0.3, 0.3)]), # edge-pad (P3, O3, p1, O3[2]), # end-slice (P3, O3, p3, O3), (P4, O4, p1, O4[3]), # end-slice @@ -151,7 +155,7 @@ def get_data_object_setter(inp): (P1, O1, P1, o1), (P1, O1, [P1] * 3, o3), # edge-pad (P2, O2, P2[1], o1), # end-slice - (P2, O2, P2 + [P2[1]], o3), # edge-pad + (P2, O2, [*P2, P2[1]], o3), # edge-pad (P3, O3, P3[-1], o1), # end-slice (P3, O3, P3, o3), (P4, O4, P4[-1], o1), # end-slice @@ -163,7 +167,7 @@ def get_data_object_setter(inp): @pytest.mark.parametrize( - "init_pos, init_ori, test_pos, test_ori", + ("init_pos", "init_ori", "test_pos", "test_ori"), get_data_object_setter("pos"), ids=[f"{ind + 1:02d}" for ind, _ in enumerate(get_data_object_setter("pos"))], ) @@ -185,7 +189,7 @@ def test_BaseGeo_setting_position( @pytest.mark.parametrize( - "init_pos, init_ori, test_pos, test_ori", + ("init_pos", "init_ori", "test_pos", "test_ori"), get_data_object_setter("ori"), ids=[f"{ind + 1:02d}" for ind, _ in enumerate(get_data_object_setter("ori"))], ) @@ -213,7 +217,7 @@ def test_BaseGeo_setting_orientation( def get_data_BaseGeo_multianchor_rotation(): """get test data as dictionaries for multi anchor testing""" - data = [ + return [ { "description": "scalar path - scalar anchor", "init_position": (0, 0, 0), @@ -336,7 +340,6 @@ def get_data_BaseGeo_multianchor_rotation(): ], }, ] - return data @pytest.mark.parametrize( diff --git a/tests/test_obj_Collection.py b/tests/test_obj_Collection.py index 256431a67..dface2a25 100644 --- a/tests/test_obj_Collection.py +++ b/tests/test_obj_Collection.py @@ -99,7 +99,7 @@ def test_Collection_basics(): @pytest.mark.parametrize( - "test_input,expected", + ("test_input", "expected"), [ ("sens_col.getB(src_col).shape", (4, 3)), ("src_col.getB(sens_col).shape", (4, 3)), diff --git a/tests/test_obj_Collection_child_parent.py b/tests/test_obj_Collection_child_parent.py index bbd211764..5c793a111 100644 --- a/tests/test_obj_Collection_child_parent.py +++ b/tests/test_obj_Collection_child_parent.py @@ -11,7 +11,9 @@ def test_parent_setter(): """setting and removing a parent""" - child_labels = lambda x: [c.style.label for c in x] + + def child_labels(x): + return [c.style.label for c in x] # default parent is None x1 = magpy.Sensor(style_label="x1") @@ -179,7 +181,9 @@ def test_collection_parent_child_relation(): def test_collections_add(): """test collection construction""" - child_labels = lambda x: [c.style.label for c in x] + + def child_labels(x): + return [c.style.label for c in x] x1 = magpy.Sensor(style_label="x1") x2 = magpy.Sensor(style_label="x2") @@ -226,7 +230,9 @@ def test_collection_plus(): """ testing collection adding and the += functionality """ - child_labels = lambda x: [c.style.label for c in x] + + def child_labels(x): + return [c.style.label for c in x] s1 = magpy.magnet.Cuboid(style_label="s1") s2 = magpy.magnet.Cuboid(style_label="s2") @@ -254,9 +260,15 @@ def test_collection_plus(): def test_collection_remove(): """removing from collections""" - child_labels = lambda x: [c.style.label for c in x] - source_labels = lambda x: [c.style.label for c in x.sources] - sensor_labels = lambda x: [c.style.label for c in x.sensors] + + def child_labels(x): + return [c.style.label for c in x] + + def source_labels(x): + return [c.style.label for c in x.sources] + + def sensor_labels(x): + return [c.style.label for c in x.sensors] x1 = magpy.Sensor(style_label="x1") x2 = magpy.Sensor(style_label="x2") diff --git a/tests/test_obj_Collection_v4motion.py b/tests/test_obj_Collection_v4motion.py index 11717150f..30ae07ed9 100644 --- a/tests/test_obj_Collection_v4motion.py +++ b/tests/test_obj_Collection_v4motion.py @@ -59,7 +59,7 @@ def get_data_collection_position_setter(): col_pos_init, col_ori_init, src_pos_init, src_ori_init col_pos_test, col_ori_test, src_pos_test, src_ori_test """ - data_pos = [ + return [ [ (1, 2, 3), (0.1, 0.2, 0.3), @@ -101,12 +101,19 @@ def get_data_collection_position_setter(): [(0.1, 0.1, 0.1)] * 3, ], ] - return data_pos @pytest.mark.parametrize( - """col_pos_init, col_ori_init, src_pos_init, src_ori_init, - col_pos_test, col_ori_test, src_pos_test, src_ori_test""", + ( + "col_pos_init", + "col_ori_init", + "src_pos_init", + "src_ori_init", + "col_pos_test", + "col_ori_test", + "src_pos_test", + "src_ori_test", + ), get_data_collection_position_setter(), ids=[ f"{ind + 1:02d}" for ind, _ in enumerate(get_data_collection_position_setter()) @@ -144,7 +151,7 @@ def get_data_collection_orientation_setter(): col_pos_init, col_ori_init, src_pos_init, src_ori_init col_pos_test, col_ori_test, src_pos_test, src_ori_test """ - data_ori = [ + return [ # col orientation setter simple [ (1, 0, 3), @@ -212,12 +219,19 @@ def get_data_collection_orientation_setter(): (0, 0, np.pi / 2), ], ] - return data_ori @pytest.mark.parametrize( - """col_pos_init, col_ori_init, src_pos_init, src_ori_init, col_pos_test, - col_ori_test, src_pos_test, src_ori_test""", + ( + "col_pos_init", + "col_ori_init", + "src_pos_init", + "src_ori_init", + "col_pos_test", + "col_ori_test", + "src_pos_test", + "src_ori_test", + ), get_data_collection_orientation_setter(), ids=[ f"{ind + 1:02d}" diff --git a/tests/test_utility.py b/tests/test_utility.py index 669ac6098..c234ad44c 100644 --- a/tests/test_utility.py +++ b/tests/test_utility.py @@ -12,7 +12,8 @@ def test_duplicates(): pm1 = magpy.magnet.Cuboid(polarization=(1, 2, 3), dimension=(1, 2, 3)) pm2 = magpy.magnet.Cylinder(polarization=(1, 2, 3), dimension=(1, 2)) src_list = [pm1, pm2, pm1] - src_list_new = check_duplicates(src_list) + with pytest.warns(UserWarning): + src_list_new = check_duplicates(src_list) assert src_list_new == [pm1, pm2], "duplicate elimination failed" @@ -22,7 +23,8 @@ def test_filter_objects(): pm2 = magpy.magnet.Cylinder(polarization=(1, 2, 3), dimension=(1, 2)) sens = magpy.Sensor() src_list = [pm1, pm2, sens] - list_new = filter_objects(src_list, allow="sources") + with pytest.warns(UserWarning): + list_new = filter_objects(src_list, allow="sources") assert list_new == [pm1, pm2], "Failed to eliminate sensor" @@ -75,7 +77,7 @@ def test_format_getBH_class_inputs(): @pytest.mark.parametrize( - "name, expected", + ("name", "expected"), [ ("col", "col_01"), ("col_", "col_01"), diff --git a/tests/test_vs_mag2.py b/tests/test_vs_mag2.py index 99db10bc4..86962614a 100644 --- a/tests/test_vs_mag2.py +++ b/tests/test_vs_mag2.py @@ -1,7 +1,7 @@ from __future__ import annotations -import os import pickle +from pathlib import Path import numpy as np @@ -36,7 +36,7 @@ def test_vs_mag2_linear(): """test against magpylib v2""" - with open(os.path.abspath("tests/testdata/testdata_vs_mag2.p"), "rb") as f: + with open(Path("tests/testdata/testdata_vs_mag2.p").resolve(), "rb") as f: data = pickle.load(f)[0] poso = [(t, -t, t) for t in np.linspace(0, 3, 100)] pm = magpy.magnet.Cuboid(polarization=(111, 222, 333), dimension=(1, 2, 3)) @@ -47,7 +47,7 @@ def test_vs_mag2_linear(): def test_vs_mag2_rotation(): """test against magpylib v2""" - with open(os.path.abspath("tests/testdata/testdata_vs_mag2.p"), "rb") as f: + with Path("tests/testdata/testdata_vs_mag2.p").resolve().open("rb") as f: data = pickle.load(f)[1] pm = magpy.magnet.Cuboid(polarization=(111, 222, 333), dimension=(1, 2, 3)) possis = [ @@ -60,7 +60,7 @@ def test_vs_mag2_rotation(): def test_vs_mag2_spiral(): """test against magpylib v2""" - with open(os.path.abspath("tests/testdata/testdata_vs_mag2.p"), "rb") as f: + with Path("tests/testdata/testdata_vs_mag2.p").resolve().open("rb") as f: data = pickle.load(f)[2] pm = magpy.magnet.Cuboid( polarization=(111, 222, 333), dimension=(1, 2, 3), position=(3, 0, 0) From fc0421e69c18e2545c095e6b1b6233424825ea3e Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 22 Apr 2025 00:14:54 +0200 Subject: [PATCH 118/211] update --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 25cf9a498..cb5b44247 100644 --- a/.gitignore +++ b/.gitignore @@ -156,3 +156,7 @@ Thumbs.db # Common editor files *~ *.swp +__temp*.py + +# uv +uv.lock \ No newline at end of file From 07a5465a15b0b71dac2c1ca7d7a1981a368bb6f0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 21 Apr 2025 22:16:12 +0000 Subject: [PATCH 119/211] style: pre-commit fixes --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index cb5b44247..d3c456207 100644 --- a/.gitignore +++ b/.gitignore @@ -159,4 +159,4 @@ Thumbs.db __temp*.py # uv -uv.lock \ No newline at end of file +uv.lock From b0a7df026af9531ae7d4214f6bc935f91de9016f Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 22 Apr 2025 00:56:01 +0200 Subject: [PATCH 120/211] prevent removing unused imports, otherwise breaks the style inheritance logic --- src/magpylib/_src/style.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/magpylib/_src/style.py b/src/magpylib/_src/style.py index 3fc2a4ff7..8481ebfb3 100644 --- a/src/magpylib/_src/style.py +++ b/src/magpylib/_src/style.py @@ -27,6 +27,23 @@ def get_families(obj): # pylint: disable=import-outside-toplevel # pylint: disable=possibly-unused-variable # pylint: disable=redefined-outer-name + # ruff: noqa: F401, I001, I002 + from magpylib._src.display.traces_generic import MagpyMarkers as Markers + from magpylib._src.obj_classes.class_BaseExcitations import BaseCurrent as Current + from magpylib._src.obj_classes.class_BaseExcitations import BaseMagnet as Magnet + from magpylib._src.obj_classes.class_current_Circle import Circle + from magpylib._src.obj_classes.class_current_Polyline import Polyline + from magpylib._src.obj_classes.class_magnet_Cuboid import Cuboid + from magpylib._src.obj_classes.class_magnet_Cylinder import Cylinder + from magpylib._src.obj_classes.class_magnet_CylinderSegment import CylinderSegment + from magpylib._src.obj_classes.class_magnet_Sphere import Sphere + from magpylib._src.obj_classes.class_magnet_Tetrahedron import Tetrahedron + from magpylib._src.obj_classes.class_magnet_TriangularMesh import TriangularMesh + from magpylib._src.obj_classes.class_misc_CustomSource import CustomSource + from magpylib._src.obj_classes.class_misc_Dipole import Dipole + from magpylib._src.obj_classes.class_misc_Triangle import Triangle + from magpylib._src.obj_classes.class_Sensor import Sensor + # ruff: enable = F401, I001, I002 loc = locals() obj_families = [] From 59e2daf10557b1bbd28e6381b18d4e05166d0018 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 22 Apr 2025 01:35:49 +0200 Subject: [PATCH 121/211] fix tests --- tests/test_Coumpound_setters.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_Coumpound_setters.py b/tests/test_Coumpound_setters.py index 598cfd813..aaaacd5be 100644 --- a/tests/test_Coumpound_setters.py +++ b/tests/test_Coumpound_setters.py @@ -7,6 +7,9 @@ import numpy as np import pytest +from scipy.spatial.transform import Rotation as R # noqa: F401 + + import magpylib as magpy from magpylib._src.display.traces_base import make_Prism From bd96dc10f1131b91ac56732c75532660b54c7bc8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 21 Apr 2025 23:37:21 +0000 Subject: [PATCH 122/211] style: pre-commit fixes --- tests/test_Coumpound_setters.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/test_Coumpound_setters.py b/tests/test_Coumpound_setters.py index aaaacd5be..e02b73bfe 100644 --- a/tests/test_Coumpound_setters.py +++ b/tests/test_Coumpound_setters.py @@ -6,9 +6,7 @@ import numpy as np import pytest - -from scipy.spatial.transform import Rotation as R # noqa: F401 - +from scipy.spatial.transform import Rotation as R # noqa: F401 import magpylib as magpy from magpylib._src.display.traces_base import make_Prism From 965032a8fd5fb10879c77f1c9bbaff5e3393ae81 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 22 Apr 2025 01:39:00 +0200 Subject: [PATCH 123/211] fix tests --- tests/test_Coumpound_setters.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_Coumpound_setters.py b/tests/test_Coumpound_setters.py index 598cfd813..e02b73bfe 100644 --- a/tests/test_Coumpound_setters.py +++ b/tests/test_Coumpound_setters.py @@ -6,6 +6,7 @@ import numpy as np import pytest +from scipy.spatial.transform import Rotation as R # noqa: F401 import magpylib as magpy from magpylib._src.display.traces_base import make_Prism From 35ccb78efa64c532f72c313409b96c208c02388b Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Wed, 23 Apr 2025 00:33:30 +0200 Subject: [PATCH 124/211] linting fixes, first part --- .../_src/obj_classes/class_BaseExcitations.py | 3 +- .../_src/obj_classes/class_current_Circle.py | 3 +- .../obj_classes/class_current_Polyline.py | 3 +- .../_src/obj_classes/class_magnet_Cuboid.py | 5 +- .../_src/obj_classes/class_magnet_Cylinder.py | 7 +- .../class_magnet_CylinderSegment.py | 7 +- .../_src/obj_classes/class_magnet_Sphere.py | 7 +- .../obj_classes/class_magnet_Tetrahedron.py | 7 +- .../class_magnet_TriangularMesh.py | 3 +- .../_src/obj_classes/class_misc_Dipole.py | 4 +- .../_src/obj_classes/class_misc_Triangle.py | 7 +- tests/test_default_utils.py | 2 +- tests/test_defaults.py | 23 +++- tests/test_display_matplotlib.py | 49 ++++---- tests/test_display_plotly.py | 5 +- tests/test_display_pyvista.py | 44 +++---- tests/test_display_utility.py | 2 +- tests/test_elliptics.py | 43 +++---- tests/test_exceptions.py | 112 +++++++++++------- tests/test_getBH_interfaces.py | 17 ++- tests/test_getBH_level2.py | 6 +- tests/test_input_checks.py | 36 ++++-- tests/test_obj_BaseGeo.py | 2 +- tests/test_obj_Collection.py | 15 +-- tests/test_obj_Cuboid.py | 4 +- tests/test_obj_Sphere.py | 4 +- tests/test_obj_TriangularMesh.py | 40 +++---- tests/test_vs_mag2.py | 2 +- 28 files changed, 275 insertions(+), 187 deletions(-) diff --git a/src/magpylib/_src/obj_classes/class_BaseExcitations.py b/src/magpylib/_src/obj_classes/class_BaseExcitations.py index 12c5041da..d4b8023d4 100644 --- a/src/magpylib/_src/obj_classes/class_BaseExcitations.py +++ b/src/magpylib/_src/obj_classes/class_BaseExcitations.py @@ -5,6 +5,7 @@ from __future__ import annotations import warnings +from typing import ClassVar import numpy as np @@ -26,7 +27,7 @@ class BaseSource(BaseGeo, BaseDisplayRepr): and corresponding field function""" _field_func = None - _field_func_kwargs_ndim = {} + _field_func_kwargs_ndim: ClassVar[dict[str, int]] = {} _editable_field_func = False def __init__(self, position, orientation, field_func=None, style=None, **kwargs): diff --git a/src/magpylib/_src/obj_classes/class_current_Circle.py b/src/magpylib/_src/obj_classes/class_current_Circle.py index 4f72017c2..b9291dc16 100644 --- a/src/magpylib/_src/obj_classes/class_current_Circle.py +++ b/src/magpylib/_src/obj_classes/class_current_Circle.py @@ -3,6 +3,7 @@ from __future__ import annotations import warnings +from typing import ClassVar from magpylib._src.display.traces_core import make_Circle from magpylib._src.exceptions import MagpylibDeprecationWarning @@ -67,7 +68,7 @@ class Circle(BaseCurrent): """ _field_func = staticmethod(BHJM_circle) - _field_func_kwargs_ndim = {"current": 1, "diameter": 1} + _field_func_kwargs_ndim: ClassVar[dict[str, int]] = {"current": 1, "diameter": 1} get_trace = make_Circle def __init__( diff --git a/src/magpylib/_src/obj_classes/class_current_Polyline.py b/src/magpylib/_src/obj_classes/class_current_Polyline.py index 61b2799f3..8794265cd 100644 --- a/src/magpylib/_src/obj_classes/class_current_Polyline.py +++ b/src/magpylib/_src/obj_classes/class_current_Polyline.py @@ -5,6 +5,7 @@ from __future__ import annotations import warnings +from typing import ClassVar from magpylib._src.display.traces_core import make_Polyline from magpylib._src.exceptions import MagpylibDeprecationWarning @@ -75,7 +76,7 @@ class Polyline(BaseCurrent): # pylint: disable=dangerous-default-value _field_func = staticmethod(current_vertices_field) - _field_func_kwargs_ndim = { + _field_func_kwargs_ndim: ClassVar[dict[str, int]] = { "current": 1, "vertices": 3, "segment_start": 2, diff --git a/src/magpylib/_src/obj_classes/class_magnet_Cuboid.py b/src/magpylib/_src/obj_classes/class_magnet_Cuboid.py index 4cf866f05..843fa1e43 100644 --- a/src/magpylib/_src/obj_classes/class_magnet_Cuboid.py +++ b/src/magpylib/_src/obj_classes/class_magnet_Cuboid.py @@ -72,7 +72,10 @@ class Cuboid(BaseMagnet): """ _field_func = staticmethod(BHJM_magnet_cuboid) - _field_func_kwargs_ndim = {"polarization": 2, "dimension": 2} + _field_func_kwargs_ndim: ClassVar[dict[str, int]] = { + "polarization": 2, + "dimension": 2, + } get_trace = make_Cuboid def __init__( diff --git a/src/magpylib/_src/obj_classes/class_magnet_Cylinder.py b/src/magpylib/_src/obj_classes/class_magnet_Cylinder.py index 46f4b7512..7c25e2e55 100644 --- a/src/magpylib/_src/obj_classes/class_magnet_Cylinder.py +++ b/src/magpylib/_src/obj_classes/class_magnet_Cylinder.py @@ -4,6 +4,8 @@ from __future__ import annotations +from typing import ClassVar + from magpylib._src.display.traces_core import make_Cylinder from magpylib._src.fields.field_BH_cylinder import BHJM_magnet_cylinder from magpylib._src.input_checks import check_format_input_vector @@ -71,7 +73,10 @@ class Cylinder(BaseMagnet): """ _field_func = staticmethod(BHJM_magnet_cylinder) - _field_func_kwargs_ndim = {"polarization": 2, "dimension": 2} + _field_func_kwargs_ndim: ClassVar[dict[str, int]] = { + "polarization": 2, + "dimension": 2, + } get_trace = make_Cylinder def __init__( diff --git a/src/magpylib/_src/obj_classes/class_magnet_CylinderSegment.py b/src/magpylib/_src/obj_classes/class_magnet_CylinderSegment.py index d5626c42e..44fc15107 100644 --- a/src/magpylib/_src/obj_classes/class_magnet_CylinderSegment.py +++ b/src/magpylib/_src/obj_classes/class_magnet_CylinderSegment.py @@ -4,6 +4,8 @@ from __future__ import annotations +from typing import ClassVar + import numpy as np from magpylib._src.display.traces_core import make_CylinderSegment @@ -86,7 +88,10 @@ class CylinderSegment(BaseMagnet): """ _field_func = staticmethod(BHJM_cylinder_segment_internal) - _field_func_kwargs_ndim = {"polarization": 2, "dimension": 2} + _field_func_kwargs_ndim: ClassVar[dict[str, int]] = { + "polarization": 2, + "dimension": 2, + } get_trace = make_CylinderSegment def __init__( diff --git a/src/magpylib/_src/obj_classes/class_magnet_Sphere.py b/src/magpylib/_src/obj_classes/class_magnet_Sphere.py index 565271a5c..8a5f08ee2 100644 --- a/src/magpylib/_src/obj_classes/class_magnet_Sphere.py +++ b/src/magpylib/_src/obj_classes/class_magnet_Sphere.py @@ -4,6 +4,8 @@ from __future__ import annotations +from typing import ClassVar + from magpylib._src.display.traces_core import make_Sphere from magpylib._src.fields.field_BH_sphere import BHJM_magnet_sphere from magpylib._src.input_checks import check_format_input_scalar @@ -71,7 +73,10 @@ class Sphere(BaseMagnet): """ _field_func = staticmethod(BHJM_magnet_sphere) - _field_func_kwargs_ndim = {"polarization": 2, "diameter": 1} + _field_func_kwargs_ndim: ClassVar[dict[str, int]] = { + "polarization": 2, + "diameter": 1, + } get_trace = make_Sphere def __init__( diff --git a/src/magpylib/_src/obj_classes/class_magnet_Tetrahedron.py b/src/magpylib/_src/obj_classes/class_magnet_Tetrahedron.py index 6be644a97..c463e833e 100644 --- a/src/magpylib/_src/obj_classes/class_magnet_Tetrahedron.py +++ b/src/magpylib/_src/obj_classes/class_magnet_Tetrahedron.py @@ -4,6 +4,8 @@ from __future__ import annotations +from typing import ClassVar + import numpy as np from magpylib._src.display.traces_core import make_Tetrahedron @@ -83,7 +85,10 @@ class Tetrahedron(BaseMagnet): """ _field_func = staticmethod(BHJM_magnet_tetrahedron) - _field_func_kwargs_ndim = {"polarization": 1, "vertices": 3} + _field_func_kwargs_ndim: ClassVar[dict[str, int]] = { + "polarization": 1, + "vertices": 3, + } get_trace = make_Tetrahedron def __init__( diff --git a/src/magpylib/_src/obj_classes/class_magnet_TriangularMesh.py b/src/magpylib/_src/obj_classes/class_magnet_TriangularMesh.py index 02d5d3166..263f1c1ba 100644 --- a/src/magpylib/_src/obj_classes/class_magnet_TriangularMesh.py +++ b/src/magpylib/_src/obj_classes/class_magnet_TriangularMesh.py @@ -3,6 +3,7 @@ from __future__ import annotations import warnings +from typing import ClassVar import numpy as np from scipy.spatial import ConvexHull # pylint: disable=no-name-in-module @@ -123,7 +124,7 @@ class TriangularMesh(BaseMagnet): """ _field_func = staticmethod(BHJM_magnet_trimesh) - _field_func_kwargs_ndim = {"polarization": 2, "mesh": 3} + _field_func_kwargs_ndim: ClassVar[dict[str, int]] = {"polarization": 2, "mesh": 3} get_trace = make_TriangularMesh _style_class = TriangularMeshStyle diff --git a/src/magpylib/_src/obj_classes/class_misc_Dipole.py b/src/magpylib/_src/obj_classes/class_misc_Dipole.py index 62fedd7da..c65bea8ec 100644 --- a/src/magpylib/_src/obj_classes/class_misc_Dipole.py +++ b/src/magpylib/_src/obj_classes/class_misc_Dipole.py @@ -2,6 +2,8 @@ from __future__ import annotations +from typing import ClassVar + import numpy as np from magpylib._src.display.traces_core import make_Dipole @@ -65,7 +67,7 @@ class Dipole(BaseSource): """ _field_func = staticmethod(BHJM_dipole) - _field_func_kwargs_ndim = {"moment": 2} + _field_func_kwargs_ndim: ClassVar[dict[str, int]] = {"moment": 2} _style_class = DipoleStyle get_trace = make_Dipole _autosize = True diff --git a/src/magpylib/_src/obj_classes/class_misc_Triangle.py b/src/magpylib/_src/obj_classes/class_misc_Triangle.py index 1c7dbbf21..7f8c6e19e 100644 --- a/src/magpylib/_src/obj_classes/class_misc_Triangle.py +++ b/src/magpylib/_src/obj_classes/class_misc_Triangle.py @@ -4,6 +4,8 @@ from __future__ import annotations +from typing import ClassVar + import numpy as np from magpylib._src.display.traces_core import make_Triangle @@ -85,7 +87,10 @@ class Triangle(BaseMagnet): """ _field_func = staticmethod(BHJM_triangle) - _field_func_kwargs_ndim = {"polarization": 2, "vertices": 2} + _field_func_kwargs_ndim: ClassVar[dict[str, int]] = { + "polarization": 2, + "vertices": 2, + } get_trace = make_Triangle _style_class = TriangleStyle diff --git a/tests/test_default_utils.py b/tests/test_default_utils.py index c3162a59d..f2ee4a2dc 100644 --- a/tests/test_default_utils.py +++ b/tests/test_default_utils.py @@ -174,7 +174,7 @@ def prop2(self, val): # check setting attribute/property assert bp1.prop1 == 1, "`bp1.prop1` should be `1`" with pytest.raises(AttributeError): - bp1.prop1e # only properties are allowed to be set + bp1.prop1e = "val" # only properties are allowed to be set assert bp1.as_dict() == {"prop1": 1}, "`as_dict` method failed" diff --git a/tests/test_defaults.py b/tests/test_defaults.py index 9d1151887..44e497c3f 100644 --- a/tests/test_defaults.py +++ b/tests/test_defaults.py @@ -231,17 +231,32 @@ def test_defaults_good_inputs(key, value, expected): def test_bad_style_classes(style_class): """testing properties which take classes as properties""" c = DisplayStyle().reset() - with pytest.raises(ValueError): + with pytest.raises( + ValueError, + match=( + r"the `.*` property of `.*` must be an instance \nof `` or a " + r"dictionary with equivalent key/value pairs \nbut received 'bad class' instead" + ), + ): c.update(**{style_class: "bad class"}) def test_bad_default_classes(): """testing properties which take classes as properties""" - with pytest.raises(ValueError): + with pytest.raises( + ValueError, + match=r"the `display` property of `DefaultSettings` must be.*", + ): magpy.defaults.display = "wrong input" - with pytest.raises(ValueError): + with pytest.raises( + ValueError, + match=r"the `animation` property of `Display` must be.*", + ): magpy.defaults.display.animation = "wrong input" - with pytest.raises(ValueError): + with pytest.raises( + ValueError, + match=r"the `style` property of `Display` must be.*", + ): magpy.defaults.display.style = "wrong input" diff --git a/tests/test_display_matplotlib.py b/tests/test_display_matplotlib.py index 6be1c5261..6a147e9e0 100644 --- a/tests/test_display_matplotlib.py +++ b/tests/test_display_matplotlib.py @@ -391,9 +391,12 @@ def test_matplotlib_model3d_extra_bad_input(): "coordsargs": {"x": "xs", "y": "ys", "z": "Z"}, # bad Z input } obj = magpy.misc.Dipole(moment=(0, 0, 1)) - with pytest.raises(ValueError): - obj.style.model3d.add_trace(**trace) - ax = plt.subplot(projection="3d") + obj.style.model3d.add_trace(**trace) + ax = plt.subplot(projection="3d") + with pytest.raises( + ValueError, + match=r"Rotating/Moving of provided model failed, trace dictionary has no argument 'z',.*", + ): obj.show(canvas=ax, return_fig=True) @@ -408,26 +411,26 @@ def updatefunc(): ax = plt.subplot(projection="3d") obj.show(canvas=ax, return_fig=True) - with pytest.raises(ValueError): - updatefunc = "not callable" + updatefunc = "not callable" + with pytest.raises( + ValueError, match=(r"the `data` property of `Model3d` must be an instance.*") + ): obj.style.model3d.add_trace(updatefunc) + updatefunc = "not callable" with pytest.raises(AssertionError): - updatefunc = "not callable" obj.style.model3d.add_trace(updatefunc=updatefunc) - with pytest.raises(AssertionError): - - def updatefunc(): - return "bad output type" - - obj.style.model3d.add_trace(updatefunc=updatefunc) + def updatefunc(): + return "bad output type" with pytest.raises(AssertionError): + obj.style.model3d.add_trace(updatefunc=updatefunc) - def updatefunc(): - return {"bad_key": "some_value"} + def updatefunc(): + return {"bad_key": "some_value"} + with pytest.raises(AssertionError): obj.style.model3d.add_trace(updatefunc=updatefunc) @@ -531,18 +534,16 @@ def test_bad_show_inputs(): cyl1 = magpy.magnet.Cylinder( polarization=(0.1, 0, 0), dimension=(1, 2), style_label="Cylinder1" ) - with ( - pytest.raises( - ValueError, - match=( - r"Conflicting parameters detected for {'row': 1, 'col': 1}:" - r" 'output' first got 'model3d' then 'Bx'." - ), + with pytest.raises( # noqa: PT012, SIM117 + ValueError, + match=( + r"Conflicting parameters detected for {'row': 1, 'col': 1}:" + r" 'output' first got 'model3d' then 'Bx'." ), - magpy.show_context(animation=False, sumup=True, pixel_agg="mean") as s, ): - s.show(cyl1, sensor, col=1, output="Bx") - s.show(cyl1, sensor, col=1) + with magpy.show_context(animation=False, sumup=True, pixel_agg="mean") as s: + s.show(cyl1, sensor, col=1, output="Bx") + s.show(cyl1, sensor, col=1) # test unsupported specific args for some backends with pytest.warns( diff --git a/tests/test_display_plotly.py b/tests/test_display_plotly.py index 7ef63141d..33050a33a 100644 --- a/tests/test_display_plotly.py +++ b/tests/test_display_plotly.py @@ -170,7 +170,10 @@ def test_display_bad_style_kwargs(): """test if some magic kwargs are invalid""" magpy.defaults.display.backend = "plotly" fig = go.Figure() - with pytest.raises(ValueError): + with pytest.raises( + ValueError, + match=r"Following arguments are invalid style properties: `{'bad_style_kwarg'}`.*", + ): magpy.show(canvas=fig, markers=[(1, 2, 3)], style_bad_style_kwarg=None) diff --git a/tests/test_display_pyvista.py b/tests/test_display_pyvista.py index ebd9c7764..aa908768f 100644 --- a/tests/test_display_pyvista.py +++ b/tests/test_display_pyvista.py @@ -1,5 +1,6 @@ from __future__ import annotations +import contextlib import os import sys import tempfile @@ -120,24 +121,25 @@ def test_pyvista_animation(is_notebook_result, extension, filename): src.move([[0, 0, 0], [0, 0, 1]], start=0) objs = [src, sens] - with patch("magpylib._src.utility.is_notebook", return_value=is_notebook_result): - with patch("webbrowser.open"): - try: - temp = os.path.join(tempfile.gettempdir(), os.urandom(24).hex()) - temp += f".{extension}" - animation_output = temp if filename else extension - magpy.show( - {"objects": objs, "col": 1, "output": ("Bx", "By", "Bz")}, - {"objects": objs, "col": 2}, - backend="pyvista", - animation=True, - animation_output=animation_output, - mp4_quality=1, - return_fig=True, - ) - finally: - try: - os.unlink(temp) - except FileNotFoundError: - # avoid exception if file is not found - pass + with ( + patch("magpylib._src.utility.is_notebook", return_value=is_notebook_result), + patch("webbrowser.open"), + ): + try: + from pathlib import Path + + temp = Path(tempfile.gettempdir()) / os.urandom(24).hex() + temp = temp.with_suffix(f".{extension}") + animation_output = temp if filename else extension + magpy.show( + {"objects": objs, "col": 1, "output": ("Bx", "By", "Bz")}, + {"objects": objs, "col": 2}, + backend="pyvista", + animation=True, + animation_output=animation_output, + mp4_quality=1, + return_fig=True, + ) + finally: + with contextlib.suppress(FileNotFoundError): + temp.unlink() diff --git a/tests/test_display_utility.py b/tests/test_display_utility.py index 00f13f7eb..52c781f77 100644 --- a/tests/test_display_utility.py +++ b/tests/test_display_utility.py @@ -68,8 +68,8 @@ def test_draw_arrow_from_vertices(): def test_bad_backend(): """test bad plotting input name""" + c = magpy.magnet.Cuboid(polarization=(0, 0, 1), dimension=(1, 1, 1)) with pytest.raises(MagpylibBadUserInput): - c = magpy.magnet.Cuboid(polarization=(0, 0, 1), dimension=(1, 1, 1)) c.show(backend="asdf") diff --git a/tests/test_elliptics.py b/tests/test_elliptics.py index 80cd6f300..2a780264b 100644 --- a/tests/test_elliptics.py +++ b/tests/test_elliptics.py @@ -1,31 +1,22 @@ from __future__ import annotations -import unittest - import numpy as np +import pytest from magpylib._src.fields.special_cel import cel, cel0, celv from magpylib._src.fields.special_el3 import el3, el3_angle, el3v, el30 -class TestEllExceptions(unittest.TestCase): - """test class for exception testing""" - - def test_except_cel0(self): - """bad cel0 input""" - - def cel0_kc0(): - cel0(0, 0.1, 0.2, 0.3) - - self.assertRaises(RuntimeError, cel0_kc0) - - def test_except_el30(self): - """bad el3""" +def test_except_cel0(): + """bad cel0 input""" + with pytest.raises(RuntimeError): + cel0(0, 0.1, 0.2, 0.3) - def el30_error1(): - el30(1, 1, -1) - self.assertRaises(RuntimeError, el30_error1) +def test_except_el30(): + """bad el3""" + with pytest.raises(RuntimeError): + el30(1, 1, -1) def test_el3_inputs(): @@ -86,9 +77,10 @@ def test_el3s(): test el30, el3v, el3 vs each other """ N = 999 - xs = (np.random.rand(N)) * 5 - kcs = (np.random.rand(N) - 0.5) * 10 - ps = (np.random.rand(N) - 0.5) * 10 + rng = np.random.default_rng() + xs = (rng.random(N)) * 5 + kcs = (rng.random(N) - 0.5) * 10 + ps = (rng.random(N) - 0.5) * 10 res0 = [el30(x, kc, p) for x, kc, p in zip(xs, kcs, ps, strict=False)] res1 = el3v(xs, kcs, ps) @@ -104,10 +96,11 @@ def test_cels(): against each other """ N = 999 - kcc = (np.random.rand(N) - 0.5) * 10 - pp = (np.random.rand(N) - 0.5) * 10 - cc = (np.random.rand(N) - 0.5) * 10 - ss = (np.random.rand(N) - 0.5) * 10 + rng = np.random.default_rng() + kcc = (rng.random(N) - 0.5) * 10 + pp = (rng.random(N) - 0.5) * 10 + cc = (rng.random(N) - 0.5) * 10 + ss = (rng.random(N) - 0.5) * 10 res0 = [cel0(kc, p, c, s) for kc, p, c, s in zip(kcc, pp, cc, ss, strict=False)] res1 = celv(kcc, pp, cc, ss) diff --git a/tests/test_exceptions.py b/tests/test_exceptions.py index 307d32a39..e64b942df 100644 --- a/tests/test_exceptions.py +++ b/tests/test_exceptions.py @@ -1,8 +1,7 @@ from __future__ import annotations -import unittest - import numpy as np +import pytest import magpylib as magpy from magpylib._src.exceptions import MagpylibBadUserInput @@ -254,44 +253,71 @@ def bad_input_shape_dipole_mom(): ##################################################################### -class TestExceptions(unittest.TestCase): - """test class for exception testing""" - - def test_except_utility(self): - """utility""" - self.assertRaises(MagpylibBadUserInput, utility_check_path_format) - self.assertRaises(MagpylibBadUserInput, utility_format_obj_input) - self.assertRaises(MagpylibBadUserInput, utility_format_src_inputs) - self.assertRaises(MagpylibBadUserInput, utility_format_obs_inputs) - - def test_except_getBHv(self): - """getBHv""" - self.assertRaises(TypeError, getBHv_missing_input1) - self.assertRaises(TypeError, getBHv_missing_input2) - self.assertRaises(TypeError, getBHv_missing_input3) - self.assertRaises(TypeError, getBHv_missing_input4_cuboid) - self.assertRaises(TypeError, getBHv_missing_input4_cyl) - self.assertRaises(TypeError, getBHv_missing_input4_sphere) - self.assertRaises(TypeError, getBHv_missing_input5_cuboid) - self.assertRaises(TypeError, getBHv_missing_input5_cyl) - self.assertRaises(TypeError, getBHv_missing_input5_sphere) - self.assertRaises(MagpylibBadUserInput, getBHv_bad_input1) - self.assertRaises(MagpylibBadUserInput, getBHv_bad_input2) - self.assertRaises(MagpylibBadUserInput, getBHv_bad_input3) - self.assertRaises(MagpylibBadUserInput, getBHv_unknown_source_type) - - def test_except_getBH_lev2(self): - """getBH_level2 exception testing""" - self.assertRaises(MagpylibBadUserInput, getBH_level2_bad_input1) - self.assertRaises(MagpylibBadUserInput, getBH_different_pixel_shapes) - - def test_except_bad_input_shape_basegeo(self): - """BaseGeo bad input shapes""" - self.assertRaises(MagpylibBadUserInput, bad_input_shape_basegeo_pos) - self.assertRaises(MagpylibBadUserInput, bad_input_shape_cuboid_dim) - self.assertRaises(MagpylibBadUserInput, bad_input_shape_cuboid_mag) - self.assertRaises(MagpylibBadUserInput, bad_input_shape_cyl_dim) - self.assertRaises(MagpylibBadUserInput, bad_input_shape_cyl_mag) - self.assertRaises(MagpylibBadUserInput, bad_input_shape_sphere_mag) - self.assertRaises(MagpylibBadUserInput, bad_input_shape_sensor_pix_pos) - self.assertRaises(MagpylibBadUserInput, bad_input_shape_dipole_mom) +def test_except_utility(): + """utility""" + with pytest.raises(MagpylibBadUserInput): + utility_check_path_format() + with pytest.raises(MagpylibBadUserInput): + utility_format_obj_input() + with pytest.raises(MagpylibBadUserInput): + utility_format_src_inputs() + with pytest.raises(MagpylibBadUserInput): + utility_format_obs_inputs() + + +def test_except_getBHv(): + """getBHv""" + with pytest.raises(TypeError): + getBHv_missing_input1() + with pytest.raises(TypeError): + getBHv_missing_input2() + with pytest.raises(TypeError): + getBHv_missing_input3() + with pytest.raises(TypeError): + getBHv_missing_input4_cuboid() + with pytest.raises(TypeError): + getBHv_missing_input4_cyl() + with pytest.raises(TypeError): + getBHv_missing_input4_sphere() + with pytest.raises(TypeError): + getBHv_missing_input5_cuboid() + with pytest.raises(TypeError): + getBHv_missing_input5_cyl() + with pytest.raises(TypeError): + getBHv_missing_input5_sphere() + with pytest.raises(MagpylibBadUserInput): + getBHv_bad_input1() + with pytest.raises(MagpylibBadUserInput): + getBHv_bad_input2() + with pytest.raises(MagpylibBadUserInput): + getBHv_bad_input3() + with pytest.raises(MagpylibBadUserInput): + getBHv_unknown_source_type() + + +def test_except_getBH_lev2(): + """getBH_level2 exception testing""" + with pytest.raises(MagpylibBadUserInput): + getBH_level2_bad_input1() + with pytest.raises(MagpylibBadUserInput): + getBH_different_pixel_shapes() + + +def test_except_bad_input_shape_basegeo(): + """BaseGeo bad input shapes""" + with pytest.raises(MagpylibBadUserInput): + bad_input_shape_basegeo_pos() + with pytest.raises(MagpylibBadUserInput): + bad_input_shape_cuboid_dim() + with pytest.raises(MagpylibBadUserInput): + bad_input_shape_cuboid_mag() + with pytest.raises(MagpylibBadUserInput): + bad_input_shape_cyl_dim() + with pytest.raises(MagpylibBadUserInput): + bad_input_shape_cyl_mag() + with pytest.raises(MagpylibBadUserInput): + bad_input_shape_sphere_mag() + with pytest.raises(MagpylibBadUserInput): + bad_input_shape_sensor_pix_pos() + with pytest.raises(MagpylibBadUserInput): + bad_input_shape_dipole_mom() diff --git a/tests/test_getBH_interfaces.py b/tests/test_getBH_interfaces.py index 0818367bc..be1422b59 100644 --- a/tests/test_getBH_interfaces.py +++ b/tests/test_getBH_interfaces.py @@ -201,7 +201,7 @@ def test_dataframe_ouptut(): for field in "BH": cols = [f"{field}{k}" for k in "xyz"] - df = getattr(magpy, f"get{field}")( + df_field = getattr(magpy, f"get{field}")( sources, sens_col, sumup=False, output="dataframe" ) BH = getattr(magpy, f"get{field}")( @@ -209,18 +209,20 @@ def test_dataframe_ouptut(): ) for i in range(2): np.testing.assert_array_equal( - BH[i].reshape(-1, 3), df[df["source"] == df["source"].unique()[i]][cols] + BH[i].reshape(-1, 3), + df_field[df_field["source"] == df_field["source"].unique()[i]][cols], ) np.testing.assert_array_equal( - BH[:, i].reshape(-1, 3), df[df["path"] == df["path"].unique()[i]][cols] + BH[:, i].reshape(-1, 3), + df_field[df_field["path"] == df_field["path"].unique()[i]][cols], ) np.testing.assert_array_equal( BH[:, :, i].reshape(-1, 3), - df[df["sensor"] == df["sensor"].unique()[i]][cols], + df_field[df_field["sensor"] == df_field["sensor"].unique()[i]][cols], ) np.testing.assert_array_equal( BH[:, :, :, i].reshape(-1, 3), - df[df["pixel"] == df["pixel"].unique()[i]][cols], + df_field[df_field["pixel"] == df_field["pixel"].unique()[i]][cols], ) @@ -258,7 +260,10 @@ def test_dataframe_ouptut_pixel_agg(): def test_getBH_bad_output_type(): """test bad output in `getBH`""" src = magpy.magnet.Cuboid(polarization=(0, 0, 1), dimension=(1, 1, 1)) - with pytest.raises(ValueError): + with pytest.raises( + ValueError, + match=r"The `output` argument must be one of ('ndarray', 'dataframe')*.", + ): src.getB((0, 0, 0), output="bad_output_type") diff --git a/tests/test_getBH_level2.py b/tests/test_getBH_level2.py index 18a2759b1..1cac1edd7 100644 --- a/tests/test_getBH_level2.py +++ b/tests/test_getBH_level2.py @@ -92,14 +92,14 @@ def pm4(): fb22 = magpy.getB(pm1(), pos_obs) fc22 = magpy.getB(pm3(), pos_obs) - for poso, fb, fc in zip( + for poso, fb_, fc_ in zip( [pos_obs, sens1, [sens1, sens1, sens1]], [fb22, fb22, [fb22, fb22, fb22]], [fc22, fc22, [fc22, fc22, fc22]], strict=False, ): - fb = np.array(fb) - fc = np.array(fc) + fb = np.array(fb_) + fc = np.array(fc_) src_obs_res = [ [pm1(), poso, fb], [pm3(), poso, fc], diff --git a/tests/test_input_checks.py b/tests/test_input_checks.py index cba566b56..81ec65253 100644 --- a/tests/test_input_checks.py +++ b/tests/test_input_checks.py @@ -472,7 +472,7 @@ def test_input_objects_field_func_good(): np.testing.assert_raises(MagpylibMissingInput, src.getH, (1, 2, 3)) # acceptable func with B and H return - def f(field, observers): + def f(field, observers): # noqa : ARG001 """3 in 3 out""" return observers @@ -506,18 +506,28 @@ def fff(field, observers): @pytest.mark.parametrize( "func", [ - 1, # non callable - lambda fieldd, observers, whatever: None, # bad arg names - lambda field, observers: 1 if field == "B" else None, # no ndarray return on B - lambda field, observers: ( - 1 if field == "H" else observers - ), # no ndarray return on H - lambda field, observers: ( - np.array([1, 2, 3]) if field == "B" else None - ), # bad return shape on B - lambda field, observers: ( - np.array([1, 2, 3]) if field == "H" else observers - ), # bad return shape on H + pytest.param(1, id="non-callable"), + pytest.param(lambda fieldd, observers, whatever: None, id="bad-arg-names"), # noqa: ARG005 + pytest.param( + lambda field, observers: 1 if field == "B" else None, # noqa: ARG005 + id="no-ndarray-return-on-B", + ), + pytest.param( + lambda field, observers: (1 if field == "H" else observers), + id="no-ndarray-return-on-H", + ), + pytest.param( + lambda field, observers: ( # noqa: ARG005 + np.array([1, 2, 3]) if field == "B" else None + ), + id="bad-return-shape-on-B", + ), + pytest.param( + lambda field, observers: ( + np.array([1, 2, 3]) if field == "H" else observers + ), + id="bad-return-shape-on-H", + ), ], ) def test_input_objects_field_func_bad(func): diff --git a/tests/test_obj_BaseGeo.py b/tests/test_obj_BaseGeo.py index 55a5326c8..52998c77a 100644 --- a/tests/test_obj_BaseGeo.py +++ b/tests/test_obj_BaseGeo.py @@ -406,7 +406,7 @@ def test_style(): bg.style = {"label": "mylabel"} assert bg.style.color == "red" assert bg.style.label == "mylabel" - with pytest.raises(ValueError): + with pytest.raises(ValueError, match="Input parameter `style` must be.*"): bg.style = "wrong class" diff --git a/tests/test_obj_Collection.py b/tests/test_obj_Collection.py index dface2a25..5cd0a6ffd 100644 --- a/tests/test_obj_Collection.py +++ b/tests/test_obj_Collection.py @@ -1,8 +1,8 @@ from __future__ import annotations -import os import pickle import re +from pathlib import Path import numpy as np import pytest @@ -53,7 +53,7 @@ def test_Collection_basics(): """test Collection fundamentals, test against magpylib2 fields""" # pylint: disable=pointless-statement # data generated below - with open(os.path.abspath("./tests/testdata/testdata_Collection.p"), "rb") as f: + with Path("tests/testdata/testdata_Collection.p").resolve().open("rb") as f: data = pickle.load(f) mags, dims2, dims3, posos, angs, axs, anchs, movs, rvs, _ = data @@ -319,11 +319,12 @@ def test_set_children_styles(): src2 = magpy.magnet.Cylinder(polarization=(1, 2, 3), dimension=(1, 2)) col = src1 + src2 col.set_children_styles(magnetization_show=False) - assert ( - src1.style.magnetization.show is False - and src1.style.magnetization.show is False - ), """failed updating styles to children""" - with pytest.raises(ValueError): + assert src1.style.magnetization.show is False, "failed updating styles to src1" + assert src2.style.magnetization.show is False, "failed updating styles to src2" + with pytest.raises( + ValueError, + match=r"Following arguments are invalid style properties: `{'bad_input'}`", + ): col.set_children_styles(bad_input="somevalue") diff --git a/tests/test_obj_Cuboid.py b/tests/test_obj_Cuboid.py index 2f0a372d1..c01ff1d49 100644 --- a/tests/test_obj_Cuboid.py +++ b/tests/test_obj_Cuboid.py @@ -1,7 +1,7 @@ from __future__ import annotations -import os import pickle +from pathlib import Path import numpy as np @@ -41,7 +41,7 @@ def test_Cuboid_basics(): """test Cuboid fundamentals""" # data generated in comment above - with open(os.path.abspath("./tests/testdata/testdata_Cuboid.p"), "rb") as f: + with Path("tests/testdata/testdata_Cuboid.p").resolve().open("rb") as f: data = pickle.load(f) mags, dims, posos, angs, axs, anchs, movs, B = data diff --git a/tests/test_obj_Sphere.py b/tests/test_obj_Sphere.py index cd21ce6ed..bbf0bad4a 100644 --- a/tests/test_obj_Sphere.py +++ b/tests/test_obj_Sphere.py @@ -1,7 +1,7 @@ from __future__ import annotations -import os import pickle +from pathlib import Path import numpy as np @@ -40,7 +40,7 @@ def test_Sphere_basics(): """test Cuboid fundamentals, test against magpylib2 fields""" # data generated below - with open(os.path.abspath("./tests/testdata/testdata_Sphere.p"), "rb") as f: + with Path("tests/testdata/testdata_Sphere.p").resolve().open("rb") as f: data = pickle.load(f) mags, dims, posos, angs, axs, anchs, movs, B = data diff --git a/tests/test_obj_TriangularMesh.py b/tests/test_obj_TriangularMesh.py index 04025eb63..e4a70ec55 100644 --- a/tests/test_obj_TriangularMesh.py +++ b/tests/test_obj_TriangularMesh.py @@ -312,43 +312,41 @@ def get_tri_from_pv(obj): get_tri_from_pv("bad_pyvista_obj_input") # Should raise if pyvista is not installed - with patch.dict(sys.modules, {"pyvista": None}): - with pytest.raises(ModuleNotFoundError): - get_tri_from_pv(pv.Cube()) + with patch.dict(sys.modules, {"pyvista": None}), pytest.raises(ModuleNotFoundError): + get_tri_from_pv(pv.Cube()) def test_TriangularMesh_from_faces_bad_inputs(): """Test from_faces classmethod bad inputs""" pol = (0, 0, 1) + kw = { + "polarization": pol, + "check_open": False, + "check_disconnected": False, + "reorient_faces": False, + } def get_tri_from_triangles(trias): - return magpy.magnet.TriangularMesh.from_triangles( - polarization=pol, - triangles=trias, - check_open=False, - check_disconnected=False, - reorient_faces=False, - ) + return magpy.magnet.TriangularMesh.from_triangles(triangles=trias, **kw) def get_tri_from_mesh(mesh): - return magpy.magnet.TriangularMesh.from_mesh( - polarization=pol, - mesh=mesh, - check_open=False, - check_disconnected=False, - reorient_faces=False, - ) + return magpy.magnet.TriangularMesh.from_mesh(mesh=mesh, **kw) triangle = magpy.misc.Triangle( polarization=pol, vertices=[(0, 0, 0), (1, 0, 0), (0, 1, 0)] ) # good element type but not array-like - with pytest.raises(TypeError): + with pytest.raises( + TypeError, + match=r"The `triangles` parameter must be a list or Collection of `Triangle` objects*.", + ): get_tri_from_triangles(triangle) # element in list has wrong type - with pytest.raises(TypeError): + with pytest.raises( + TypeError, match=r"All elements of `triangles` must be `Triangle` objects*." + ): get_tri_from_triangles(["bad_type"]) # bad type input @@ -357,12 +355,12 @@ def get_tri_from_mesh(mesh): # bad shape input msh = [((0, 0), (1, 0), (0, 1))] * 2 - with pytest.raises(ValueError): + with pytest.raises(ValueError, match=r"Input parameter `mesh` has bad shape*."): get_tri_from_mesh(msh) # bad shape input msh = [((0, 0, 0), (1, 0, 0), (0, 1, 0), (0, 0, 1))] * 2 - with pytest.raises(ValueError): + with pytest.raises(ValueError, match=r"Input parameter `mesh` has bad shape*."): get_tri_from_mesh(msh) diff --git a/tests/test_vs_mag2.py b/tests/test_vs_mag2.py index 86962614a..226bfc129 100644 --- a/tests/test_vs_mag2.py +++ b/tests/test_vs_mag2.py @@ -36,7 +36,7 @@ def test_vs_mag2_linear(): """test against magpylib v2""" - with open(Path("tests/testdata/testdata_vs_mag2.p").resolve(), "rb") as f: + with Path("tests/testdata/testdata_vs_mag2.p").resolve().open("rb") as f: data = pickle.load(f)[0] poso = [(t, -t, t) for t in np.linspace(0, 3, 100)] pm = magpy.magnet.Cuboid(polarization=(111, 222, 333), dimension=(1, 2, 3)) From bccb0a756e6a7a41b926a88d2527d843e73b1917 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Wed, 23 Apr 2025 00:39:36 +0200 Subject: [PATCH 125/211] blacken docs --- docs/_pages/user_guide/docs/docs_styles.md | 25 +++++++++++++--------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/docs/_pages/user_guide/docs/docs_styles.md b/docs/_pages/user_guide/docs/docs_styles.md index 3af789ae2..80d9ed4bd 100644 --- a/docs/_pages/user_guide/docs/docs_styles.md +++ b/docs/_pages/user_guide/docs/docs_styles.md @@ -50,15 +50,15 @@ The default styles can be modified in three ways: ```python magpy.defaults.display.style.magnet.magnetization.show = True -magpy.defaults.display.style.magnet.magnetization.color.mode = 'bicolor' -magpy.defaults.display.style.magnet.magnetization.color.north = 'grey' +magpy.defaults.display.style.magnet.magnetization.color.mode = "bicolor" +magpy.defaults.display.style.magnet.magnetization.color.north = "grey" ``` 2. By assigning a style dictionary with equivalent keys, ```python magpy.defaults.display.style.magnet = { - 'magnetization': {'show': True, 'color': {'north': 'grey', 'mode': 'tricolor'}} + "magnetization": {"show": True, "color": {"north": "grey", "mode": "tricolor"}} } ``` @@ -66,8 +66,11 @@ magpy.defaults.display.style.magnet = { ```python magpy.defaults.display.style.magnet.magnetization.update( - 'show': True, - 'color': {'north'='grey', mode='tricolor',} + show=True, + color={ + "north": "grey", + "mode": "tricolor", + }, ) ``` @@ -141,10 +144,11 @@ With magic underscore notation, the previous examples can be written as: ```python import magpylib as magpy + magpy.defaults.display.style.magnet = { - 'magnetization_show': True, - 'magnetization_color_middle': 'grey', - 'magnetization_color_mode': 'tricolor', + "magnetization_show": True, + "magnetization_color_middle": "grey", + "magnetization_color_mode": "tricolor", } ``` @@ -152,10 +156,11 @@ or directly as named keywords in the `update` method as: ```python import magpylib as magpy + magpy.defaults.display.style.magnet.update( magnetization_show=True, - magnetization_color_middle='grey', - magnetization_color_mode='tricolor', + magnetization_color_middle="grey", + magnetization_color_mode="tricolor", ) ``` From 85443e687cfe9603594e47a8a04c0c7304bbe0fe Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Wed, 23 Apr 2025 01:43:07 +0200 Subject: [PATCH 126/211] linting fixes, second part --- docs/conf.py | 7 ++-- src/magpylib/__init__.py | 1 + .../_src/defaults/defaults_utility.py | 7 ++-- .../_src/display/backend_matplotlib.py | 15 ++++---- src/magpylib/_src/display/backend_plotly.py | 16 ++++----- src/magpylib/_src/display/backend_pyvista.py | 31 ++++++++-------- src/magpylib/_src/display/display.py | 5 +-- src/magpylib/_src/display/traces_base.py | 2 +- src/magpylib/_src/display/traces_core.py | 17 +++++---- src/magpylib/_src/display/traces_generic.py | 20 +++++------ src/magpylib/_src/display/traces_utility.py | 14 +++++--- src/magpylib/_src/fields/field_BH_triangle.py | 10 +++--- .../_src/fields/field_BH_triangularmesh.py | 3 +- src/magpylib/_src/fields/field_wrap_BH.py | 14 ++++---- src/magpylib/_src/fields/special_el3.py | 2 ++ src/magpylib/_src/input_checks.py | 36 +++++++++---------- .../_src/obj_classes/class_BaseDisplayRepr.py | 5 +-- .../_src/obj_classes/class_Collection.py | 13 +++---- .../_src/obj_classes/class_magnet_Cuboid.py | 2 ++ src/magpylib/_src/style.py | 5 +-- src/magpylib/_src/utility.py | 4 +-- tests/test_Coumpound_setters.py | 4 +-- tests/test_CustomSource.py | 2 +- tests/test__missing_optional_modules.py | 10 +++--- tests/test_core_physics_consistency.py | 5 ++- tests/test_getBH_interfaces.py | 8 ++--- 26 files changed, 134 insertions(+), 124 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 305e5e2ec..0e57b45dd 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -3,6 +3,9 @@ import importlib.metadata import os import sys +from pathlib import Path + +import sphinx.ext.apidoc # This is for pyvista os.system("/usr/bin/Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &") @@ -12,11 +15,11 @@ os.environ["MAGPYLIB_MPL_SVG"] = "true" # Location of Sphinx files -sys.path.insert(0, os.path.abspath("./../")) ##Add the folder one level above + +sys.path.insert(0, str(Path("./../").resolve())) ##Add the folder one level above os.environ["SPHINX_APIDOC_OPTIONS"] = ( "members,show-inheritance" ## Hide undocumented members ) -import sphinx.ext.apidoc # from sphinx_gallery.sorting import FileNameSortKey diff --git a/src/magpylib/__init__.py b/src/magpylib/__init__.py index 40e468522..fc3aa71a7 100644 --- a/src/magpylib/__init__.py +++ b/src/magpylib/__init__.py @@ -19,6 +19,7 @@ from ._version import version as __version__ __all__ = [ + "SUPPORTED_PLOTTING_BACKENDS", "Collection", "Sensor", "__version__", diff --git a/src/magpylib/_src/defaults/defaults_utility.py b/src/magpylib/_src/defaults/defaults_utility.py index b53185c8b..192f087e5 100644 --- a/src/magpylib/_src/defaults/defaults_utility.py +++ b/src/magpylib/_src/defaults/defaults_utility.py @@ -119,9 +119,10 @@ def update_nested_dict(d, u, same_keys_only=False, replace_None_only=False) -> d same_keys_only=same_keys_only, replace_None_only=replace_None_only, ) - elif new_dict.get(k, None) is None or not replace_None_only: - if not same_keys_only or k in new_dict: - new_dict[k] = u[k] + elif (new_dict.get(k, None) is None or not replace_None_only) and ( + not same_keys_only or k in new_dict + ): + new_dict[k] = u[k] return new_dict diff --git a/src/magpylib/_src/display/backend_matplotlib.py b/src/magpylib/_src/display/backend_matplotlib.py index 990d41e3a..3e4a7f55d 100644 --- a/src/magpylib/_src/display/backend_matplotlib.py +++ b/src/magpylib/_src/display/backend_matplotlib.py @@ -7,6 +7,7 @@ # pylint: disable=too-many-positional-arguments from __future__ import annotations +import contextlib import os from collections import Counter @@ -73,7 +74,7 @@ def __init__(self, color_data): self.colors = list(color_data.keys()) self.proportions = [value / total for value in color_data.values()] - def legend_artist(self, legend, orig_handle, fontsize, handlebox): + def legend_artist(self, legend, orig_handle, fontsize, handlebox): # noqa: ARG002 # pylint: disable=unused-argument """Create custom legend key""" x0, y0 = handlebox.xdescent, handlebox.ydescent @@ -165,11 +166,11 @@ def generic_trace_to_matplotlib(trace, antialiased=True): if "text" in mode and trace.get("text", False) and len(coords) > 0: txt = trace["text"] txt = [txt] * len(coords[0]) if isinstance(txt, str) else txt - for *coords_s, txt in zip(*coords, txt, strict=False): + for *coords_s, t in zip(*coords, txt, strict=False): traces_mpl.append( { "constructor": "text", - "args": (*coords_s, txt), + "args": (*coords_s, t), } ) traces_mpl.append( @@ -248,7 +249,7 @@ def display_matplotlib( legend_maxitems=20, fig_kwargs=None, show_kwargs=None, - **kwargs, # pylint: disable=unused-argument + **kwargs, # noqa: ARG001 ): """Display objects and paths graphically using the matplotlib library.""" frames = data["frames"] @@ -376,11 +377,9 @@ def draw_frame(frame_ind): lg_kw = {"bbox_to_anchor": (1.04, 1), "loc": "upper left"} if handler_map: lg_kw["handler_map"] = handler_map - try: - ax.legend(**lg_kw) - except AttributeError: + with contextlib.suppress(AttributeError): # see https://github.com/matplotlib/matplotlib/pull/25565 - pass + ax.legend(**lg_kw) else: ax.legend(loc="best") diff --git a/src/magpylib/_src/display/backend_plotly.py b/src/magpylib/_src/display/backend_plotly.py index cae6b3a09..c7a9156ae 100644 --- a/src/magpylib/_src/display/backend_plotly.py +++ b/src/magpylib/_src/display/backend_plotly.py @@ -291,7 +291,7 @@ def display_plotly( subplot_specs=None, fig_kwargs=None, show_kwargs=None, - **kwargs, # pylint: disable=unused-argument + **kwargs, # noqa: ARG001 ): """Display objects and paths graphically using the plotly library.""" @@ -308,14 +308,12 @@ def display_plotly( show_fig = True fig = go.Figure() - if not (max_rows is None and max_cols is None): - # pylint: disable=protected-access - if fig._grid_ref is None: - fig = fig.set_subplots( - rows=max_rows, - cols=max_cols, - specs=subplot_specs.tolist(), - ) + if not (max_rows is None and max_cols is None) and fig._grid_ref is None: # pylint: disable=protected-access + fig = fig.set_subplots( + rows=max_rows, + cols=max_cols, + specs=subplot_specs.tolist(), + ) frames = data["frames"] for fr in frames: diff --git a/src/magpylib/_src/display/backend_pyvista.py b/src/magpylib/_src/display/backend_pyvista.py index a03937c90..ff118b33e 100644 --- a/src/magpylib/_src/display/backend_pyvista.py +++ b/src/magpylib/_src/display/backend_pyvista.py @@ -5,9 +5,11 @@ # pylint: disable=too-many-positional-arguments from __future__ import annotations +import contextlib import os import tempfile from functools import lru_cache +from pathlib import Path import numpy as np @@ -221,7 +223,7 @@ def display_pyvista( fig_kwargs=None, show_kwargs=None, mp4_quality=5, - **kwargs, # pylint: disable=unused-argument + **kwargs, # noqa: ARG001 ): """Display objects and paths graphically using the pyvista library.""" @@ -278,13 +280,10 @@ def draw_frame(frame_ind): ranges = data["ranges"][row + 1, col + 1] pts = np.array(np.meshgrid(*ranges)).T.reshape(-1, 3) canvas.add_mesh(pv.PolyData(pts), opacity=0) - try: + with contextlib.suppress(StopIteration, IndexError): canvas.remove_scalar_bar() - except (StopIteration, IndexError): - # try to remove scalar bar, if none, pass # needs to happen in the loop otherwise they cummulate # while the max of 10 is reached and throws a ValueError - pass for (row, col), count in count_with_labels.items(): canvas.subplot(row, col) @@ -294,16 +293,17 @@ def draw_frame(frame_ind): canvas.show_axes() canvas.camera.azimuth = -90 canvas.set_background("gray", top="white") - if 0 < count <= legend_maxitems: - if subplot_specs[row, col]["type"] == "scene": - canvas.add_legend(bcolor=None) + if ( + 0 < count <= legend_maxitems + and subplot_specs[row, col]["type"] == "scene" + ): + canvas.add_legend(bcolor=None) def run_animation(filename, embed=True): # embed=True, embeds the animation into the notebook page and is necessary when using # temp files nonlocal show_canvas, charts_max_ind, charts - - suff = os.path.splitext(filename)[-1] + suff = Path(filename).suffix if suff == ".gif": loop = 1 if repeat is False else 0 if repeat is True else int(repeat) canvas.open_gif(filename, loop=loop, fps=1000 / data["frame_duration"]) @@ -331,15 +331,12 @@ def run_animation(filename, embed=True): animation_output = "gif" if animation_output is None else animation_output if animation_output in ("gif", "mp4"): try: - temp = os.path.join(tempfile.gettempdir(), os.urandom(24).hex()) - temp += f".{animation_output}" + temp = Path(tempfile.gettempdir()) / os.urandom(24).hex() + temp = temp.with_suffix(f".{animation_output}") run_animation(temp, embed=True) finally: - try: - os.unlink(temp) - except FileNotFoundError: # pragma: no cover - # avoid exception if file is not found - pass + with contextlib.suppress(FileNotFoundError): # pragma: no cover + temp.unlink() else: run_animation(animation_output, embed=True) diff --git a/src/magpylib/_src/display/display.py b/src/magpylib/_src/display/display.py index ed2c7c44b..3a26ac129 100644 --- a/src/magpylib/_src/display/display.py +++ b/src/magpylib/_src/display/display.py @@ -5,6 +5,7 @@ import warnings from contextlib import contextmanager from importlib import import_module +from typing import ClassVar from matplotlib.axes import Axes as mplAxes from matplotlib.figure import Figure as mplFig @@ -30,7 +31,7 @@ class RegisteredBackend: """Base class for display backends""" - backends = {} + backends: ClassVar[dict[str, RegisteredBackend]] = {} def __init__( self, @@ -227,8 +228,8 @@ def _show( backend = infer_backend(canvas) return RegisteredBackend.show( - backend=backend, *objects, + backend=backend, animation=animation, canvas=canvas, canvas_update=canvas_update, diff --git a/src/magpylib/_src/display/traces_base.py b/src/magpylib/_src/display/traces_base.py index 7bdad3c5c..832d37fb3 100644 --- a/src/magpylib/_src/display/traces_base.py +++ b/src/magpylib/_src/display/traces_base.py @@ -381,7 +381,7 @@ def make_CylinderSegment( i.extend([i5, i5 + N - 1]) j.extend([k5, k5 + N - 1]) k.extend([j5, j5 + N - 1]) - i, j, k = (np.hstack(l) for l in (i, j, k)) + i, j, k = (np.hstack(m) for m in (i, j, k)) trace = {"x": x, "y": y, "z": z, "i": i, "j": j, "k": k} trace = place_and_orient_model3d(trace, orientation=orientation, position=position) diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index 8c06c1857..d64fa4f41 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -470,15 +470,14 @@ def make_TriangularMesh(obj, **kwargs) -> dict[str, Any] | list[dict[str, Any]]: stacklevel=2, ) is_disconnected = obj.check_disconnected() - elif mode == "selfintersecting": - if obj._status_selfintersecting is None: - warnings.warn( - f"Unchecked selfintersecting mesh status in {obj!r} detected, before " - "attempting to show possible disconnected parts, which may take a while " - "to compute when the mesh has many faces, now applying operation...", - stacklevel=2, - ) - obj.check_selfintersecting() + elif mode == "selfintersecting" and obj._status_selfintersecting is None: + warnings.warn( + f"Unchecked selfintersecting mesh status in {obj!r} detected, before " + "attempting to show possible disconnected parts, which may take a while " + "to compute when the mesh has many faces, now applying operation...", + stacklevel=2, + ) + obj.check_selfintersecting() if is_disconnected: tria_orig = obj._faces diff --git a/src/magpylib/_src/display/traces_generic.py b/src/magpylib/_src/display/traces_generic.py index a8a96bfbc..f051ce627 100644 --- a/src/magpylib/_src/display/traces_generic.py +++ b/src/magpylib/_src/display/traces_generic.py @@ -268,9 +268,8 @@ def get_traces_2D( styles=None, units_polarization="T", units_magnetization="A/m", - # pylint: disable=unused-argument - units_length="m", - zoom=0, + units_length="m", # noqa: ARG001 + zoom=0, # noqa: ARG001 ): """draws and animates sensor values over a path in a subplot""" # pylint: disable=import-outside-toplevel @@ -515,7 +514,8 @@ def get_generic_traces3D( if style.model3d.showdefault and make_func is not None: p_trs = make_func(**make_func_kwargs) p_trs = [p_trs] if isinstance(p_trs, dict) else p_trs - for p_tr in p_trs: + for p_tr_item in p_trs: + p_tr = p_tr_item.copy() is_mag = p_tr.pop("ismagnet", is_mag) if is_mag and p_tr.get("type", "") == "mesh3d": p_tr = update_magnet_mesh( @@ -644,7 +644,8 @@ def clean_legendgroups(frames, clean_2d=False): """removes legend duplicates for a plotly figure""" for fr in frames: legendgroups = {} - for tr in chain(fr["data"], fr["extra_backend_traces"]): + for tr_item in chain(fr["data"], fr["extra_backend_traces"]): + tr = tr_item if "z" in tr or clean_2d or "kwargs_extra" in tr: tr = tr.get("kwargs_extra", tr) lg = tr.get("legendgroup", None) @@ -699,9 +700,8 @@ def extract_animation_properties( animation_time, animation_fps, animation_maxframes, - # pylint: disable=unused-argument - animation_slider, - animation_output, + animation_slider, # noqa: ARG001 + animation_output, # noqa: ARG001 ): """Extract animation properties""" # pylint: disable=import-outside-toplevel @@ -768,8 +768,8 @@ def get_traces_3D(flat_objs_props, extra_backend=False, autosize=None, **kwargs) """Return traces, traces to resize and extra_backend_traces""" extra_backend_traces = [] traces_dict = {} - for obj, params in flat_objs_props.items(): - params = {**params, **kwargs} + for obj, params_item in flat_objs_props.items(): + params = {**params_item, **kwargs} if autosize is None and getattr(obj, "_autosize", False): # temporary coordinates to be able to calculate ranges # pylint: disable=protected-access diff --git a/src/magpylib/_src/display/traces_utility.py b/src/magpylib/_src/display/traces_utility.py index f662f0fe8..c5c7fd7a5 100644 --- a/src/magpylib/_src/display/traces_utility.py +++ b/src/magpylib/_src/display/traces_utility.py @@ -354,7 +354,7 @@ def merge_mesh3d(*traces): for k in "ijk": if k in traces[0]: merged_trace[k] = np.hstack( - [b[k] + l for b, l in zip(traces, L, strict=False)] + [b[k] + m for b, m in zip(traces, L, strict=False)] ) for k in "xyz": merged_trace[k] = np.concatenate([b[k] for b in traces]) @@ -503,7 +503,8 @@ def get_scene_ranges(*traces, zoom=0) -> np.ndarray: """ ranges_rc = {} tr_dim_count = {} - for tr in traces: + for tr_item in traces: + tr = tr_item coords = "xyz" rc = tr.get("row", 1), tr.get("col", 1) if "constructor" in tr: @@ -536,7 +537,8 @@ def get_scene_ranges(*traces, zoom=0) -> np.ndarray: ranges_rc[rc].values(), *min_max, strict=False ): v.extend([min_, max_]) - for rc, ranges in ranges_rc.items(): + for rc, ranges_item in ranges_rc.items(): + ranges = ranges_item if tr_dim_count[rc]["3D"]: zo = zoom[rc] if isinstance(zoom, dict) else zoom # SET 3D PLOT BOUNDARIES @@ -594,7 +596,8 @@ def group_traces(*traces): "mode", ], } - for tr in traces: + for tr_item in traces: + tr = tr_item tr = linearize_dict( tr, separator="_", @@ -644,7 +647,8 @@ def process_show_input_objs(objs, **kwargs): unique_fields = tuple(k for k in defaults if k not in identifiers) sources_and_sensors_only = [] new_objs = [] - for obj in objs: + for obj_item in objs: + obj = obj_item # add missing kwargs if isinstance(obj, dict): obj = {**defaults, **obj, **kwargs} diff --git a/src/magpylib/_src/fields/field_BH_triangle.py b/src/magpylib/_src/fields/field_BH_triangle.py index 3bf169d1f..c311a330b 100644 --- a/src/magpylib/_src/fields/field_BH_triangle.py +++ b/src/magpylib/_src/fields/field_BH_triangle.py @@ -142,11 +142,11 @@ def triangle_Bfield( L = vertices[:, (1, 2, 0)] - vertices[:, (0, 1, 2)] L = np.swapaxes(L, 0, 1) l2 = np.sum(L * L, axis=-1) - l = np.sqrt(l2) + l1 = np.sqrt(l2) # vert-vert -- vert-obs b = np.einsum("ijk, ijk->ij", R, L) - bl = b / l + bl = b / l1 ind = np.fabs(r + bl) # closeness measure to corner and edge # The computation of ind is the origin of a major numerical instability @@ -168,10 +168,10 @@ def triangle_Bfield( # ) with np.errstate(divide="ignore", invalid="ignore"): - I = np.where( + I = np.where( # noqa: E741 ind > 1.0e-12, - 1.0 / l * np.log((np.sqrt(l2 + 2 * b + r2) + l + bl) / ind), - -(1.0 / l) * np.log(np.fabs(l - r) / r), + 1.0 / l1 * np.log((np.sqrt(l2 + 2 * b + r2) + l1 + bl) / ind), + -(1.0 / l1) * np.log(np.fabs(l1 - r) / r), ) PQR = np.einsum("ij, ijk -> jk", I, L) B = sigma * (n.T * solid_angle(R, r) - vcross3(n, PQR).T) diff --git a/src/magpylib/_src/fields/field_BH_triangularmesh.py b/src/magpylib/_src/fields/field_BH_triangularmesh.py index a6bc357db..0ea1d014f 100644 --- a/src/magpylib/_src/fields/field_BH_triangularmesh.py +++ b/src/magpylib/_src/fields/field_BH_triangularmesh.py @@ -544,7 +544,8 @@ def BHJM_magnet_trimesh( if in_out == "auto": prev_ind = 0 # group similar meshes for inside-outside evaluation and adding B - for new_ind, _ in enumerate(BHJM): + for new_ind_item, _ in enumerate(BHJM): + new_ind = new_ind_item if ( new_ind == len(BHJM) - 1 or mesh[new_ind].shape != mesh[prev_ind].shape diff --git a/src/magpylib/_src/fields/field_wrap_BH.py b/src/magpylib/_src/fields/field_wrap_BH.py index 7d7b45ca4..9cbca8562 100644 --- a/src/magpylib/_src/fields/field_wrap_BH.py +++ b/src/magpylib/_src/fields/field_wrap_BH.py @@ -438,12 +438,12 @@ def getBH_level2( src_ids = [s.style.label if s.style.label else f"{s}" for s in sources] sens_ids = [s.style.label if s.style.label else f"{s}" for s in sensors] num_of_pixels = np.prod(pix_shapes[0][:-1]) if pixel_agg is None else 1 - df = pd.DataFrame( + df_field = pd.DataFrame( data=product(src_ids, range(max_path_len), sens_ids, range(num_of_pixels)), columns=["source", "path", "sensor", "pixel"], ) - df[[field + k for k in "xyz"]] = B.reshape(-1, 3) - return df + df_field[[field + k for k in "xyz"]] = B.reshape(-1, 3) + return df_field # reduce all size-1 levels if squeeze: @@ -462,7 +462,7 @@ def getBH_dict_level2( *, field: str, position=(0, 0, 0), - orientation=R.identity(), + orientation=None, squeeze=True, in_out="auto", **kwargs: dict, @@ -497,7 +497,8 @@ def getBH_dict_level2( # which tells the program which dimension it should tile up. # pylint: disable=import-outside-toplevel - + if orientation is None: + orientation = R.identity() try: source_classes = get_registered_sources() field_func = source_classes[source_type]._field_func @@ -521,7 +522,8 @@ def getBH_dict_level2( # evaluation vector lengths vec_lengths = {} ragged_seq = {} - for key, val in kwargs.items(): + for key, val_item in kwargs.items(): + val = val_item try: if ( not isinstance(val, numbers.Number) diff --git a/src/magpylib/_src/fields/special_el3.py b/src/magpylib/_src/fields/special_el3.py index 303d3b9ed..e2578db9c 100644 --- a/src/magpylib/_src/fields/special_el3.py +++ b/src/magpylib/_src/fields/special_el3.py @@ -4,6 +4,8 @@ from magpylib._src.fields.special_cel import cel +# ruff: noqa: E741 # Avoid ambiguity with variable names + def el30(x, kc, p): """ diff --git a/src/magpylib/_src/input_checks.py b/src/magpylib/_src/input_checks.py index 32bb512b3..6b6be3717 100644 --- a/src/magpylib/_src/input_checks.py +++ b/src/magpylib/_src/input_checks.py @@ -7,6 +7,7 @@ import inspect import numbers +from importlib.util import find_spec import numpy as np from scipy.spatial.transform import Rotation @@ -482,22 +483,27 @@ def check_format_input_observers(inp, pixel_agg=None): inp = np.array(inp, dtype=float) pix_shapes = [(1, 3) if inp.shape == (3,) else inp.shape] return [_src.obj_classes.class_Sensor.Sensor(pixel=inp)], pix_shapes - except (TypeError, ValueError): # if not, it must be [pos_vec, sens, coll] + except (TypeError, ValueError) as err: # if not, it must be [pos_vec, sens, coll] sensors = [] - for obj in inp: + for obj_item in inp: + obj = obj_item if isinstance(obj, Sensor): sensors.append(obj) elif isinstance(obj, Collection): child_sensors = format_obj_input(obj, allow="sensors") if not child_sensors: - raise MagpylibBadUserInput(wrong_obj_msg(obj, allow="observers")) + raise MagpylibBadUserInput( + wrong_obj_msg(obj, allow="observers") + ) from err sensors.extend(child_sensors) else: # if its not a Sensor or a Collection it can only be a pos_vec try: obj = np.array(obj, dtype=float) sensors.append(_src.obj_classes.class_Sensor.Sensor(pixel=obj)) except Exception: # or some unwanted crap - raise MagpylibBadUserInput(wrong_obj_msg(obj, allow="observers")) + raise MagpylibBadUserInput( + wrong_obj_msg(obj, allow="observers") + ) from err # all pixel shapes must be the same pix_shapes = [ @@ -510,7 +516,7 @@ def check_format_input_observers(inp, pixel_agg=None): " All observer inputs must be of similar shape, unless a" " numpy pixel aggregator is provided, e.g. `pixel_agg='mean'`!" ) - raise MagpylibBadUserInput(msg) + raise MagpylibBadUserInput(msg) from err return sensors, pix_shapes @@ -637,19 +643,13 @@ def check_getBH_output_type(output): f"\nInstead received {output!r}." ) raise ValueError(msg) - if output == "dataframe": - try: - # pylint: disable=import-outside-toplevel - # pylint: disable=unused-import - import pandas as pd - except ImportError as missing_module: # pragma: no cover - msg = ( - "In order to use the `dataframe` output type, you need to install pandas " - "via pip or conda, " - "see https://pandas.pydata.org/docs/getting_started/install.html" - ) - raise ModuleNotFoundError(msg) from missing_module - + if output == "dataframe" and find_spec("pandas") is None: # pragma: no cover + msg = ( + "In order to use the `dataframe` output type, you need to install pandas " + "via pip or conda, " + "see https://pandas.pydata.org/docs/getting_started/install.html" + ) + raise ModuleNotFoundError(msg) return output diff --git a/src/magpylib/_src/obj_classes/class_BaseDisplayRepr.py b/src/magpylib/_src/obj_classes/class_BaseDisplayRepr.py index 9b6d0292a..40ac9a6ac 100644 --- a/src/magpylib/_src/obj_classes/class_BaseDisplayRepr.py +++ b/src/magpylib/_src/obj_classes/class_BaseDisplayRepr.py @@ -48,7 +48,8 @@ def _get_description(self, exclude=None): exclude = () params = list(self._property_names_generator()) lines = [f"{self!r}"] - for k in list(dict.fromkeys(list(UNITS) + list(params))): + for key in list(dict.fromkeys(list(UNITS) + list(params))): + k = key if not k.startswith("_") and k in params and k not in exclude: unit = UNITS.get(k) unit_str = f" {unit}" if unit else "" @@ -102,7 +103,7 @@ def describe(self, *, exclude=("style", "field_func"), return_string=False): if return_string: return output - print(output) + print(output) # noqa: T201 return None def _repr_html_(self): diff --git a/src/magpylib/_src/obj_classes/class_Collection.py b/src/magpylib/_src/obj_classes/class_Collection.py index 88b9b2c14..bcc491d8f 100644 --- a/src/magpylib/_src/obj_classes/class_Collection.py +++ b/src/magpylib/_src/obj_classes/class_Collection.py @@ -274,7 +274,7 @@ def describe(self, format="type+label+id", max_elems=10, return_string=False): if return_string: return output - print(output) + print(output) # noqa: T201 return None # methods ------------------------------------------------------- @@ -329,11 +329,12 @@ def add(self, *children, override_parent=False): # assign parent for obj in obj_list: - if isinstance(obj, Collection): - # no need to check recursively with `collections_all` if obj is already self - if obj is self or self in obj.collections_all: - msg = f"Cannot add {obj!r} because a Collection must not reference itself." - raise MagpylibBadUserInput(msg) + # no need to check recursively with `collections_all` if obj is already self + if isinstance(obj, Collection) and ( + obj is self or self in obj.collections_all + ): + msg = f"Cannot add {obj!r} because a Collection must not reference itself." + raise MagpylibBadUserInput(msg) if obj._parent is None: obj._parent = self elif override_parent: diff --git a/src/magpylib/_src/obj_classes/class_magnet_Cuboid.py b/src/magpylib/_src/obj_classes/class_magnet_Cuboid.py index 843fa1e43..e09580faa 100644 --- a/src/magpylib/_src/obj_classes/class_magnet_Cuboid.py +++ b/src/magpylib/_src/obj_classes/class_magnet_Cuboid.py @@ -4,6 +4,8 @@ from __future__ import annotations +from typing import ClassVar + from magpylib._src.display.traces_core import make_Cuboid from magpylib._src.fields.field_BH_cuboid import BHJM_magnet_cuboid from magpylib._src.input_checks import check_format_input_vector diff --git a/src/magpylib/_src/style.py b/src/magpylib/_src/style.py index cd15354f8..f245abf10 100644 --- a/src/magpylib/_src/style.py +++ b/src/magpylib/_src/style.py @@ -416,7 +416,8 @@ def _validate_data(self, traces, **kwargs): elif not isinstance(traces, list | tuple): traces = [traces] new_traces = [] - for trace in traces: + for trace_item in traces: + trace = trace_item updatefunc = None if not isinstance(trace, Trace3d) and callable(trace): updatefunc = trace @@ -612,7 +613,7 @@ def scale(self): @scale.setter def scale(self, val): - assert isinstance(val, int | float) and val > 0, ( + assert isinstance(val, int | float) and val > 0, ( # noqa: PT018 f"The `scale` property of {type(self).__name__} must be a strictly positive number,\n" f"but received {val!r} instead." ) diff --git a/src/magpylib/_src/utility.py b/src/magpylib/_src/utility.py index aafc54de6..6d145d0cf 100644 --- a/src/magpylib/_src/utility.py +++ b/src/magpylib/_src/utility.py @@ -408,12 +408,12 @@ def open_animation(filepath, embed=True): """Display video or gif file using tkinter or IPython""" # pylint: disable=import-outside-toplevel if is_notebook(): - if filepath.endswith(".gif"): + if str(filepath).lower().endswith(".gif"): from IPython.display import Image as IPyImage from IPython.display import display display(IPyImage(data=filepath, embed=embed)) - elif filepath.endswith(".mp4"): + elif str(filepath).lower().endswith(".mp4"): from IPython.display import Video, display display(Video(data=filepath, embed=embed)) diff --git a/tests/test_Coumpound_setters.py b/tests/test_Coumpound_setters.py index e02b73bfe..3f5579a5c 100644 --- a/tests/test_Coumpound_setters.py +++ b/tests/test_Coumpound_setters.py @@ -2,7 +2,7 @@ # pylint: disable=unused-import from __future__ import annotations -import os +from pathlib import Path import numpy as np import pytest @@ -128,7 +128,7 @@ def get_pos_orient_from_collection(coll): folder = "tests/testdata" -file = os.path.join(folder, "testdata_compound_setter_cases.npy") +file = Path(folder) / "testdata_compound_setter_cases.npy" # create_compound_test_data(file) COMPOUND_DATA = np.load(file, allow_pickle=True).item() diff --git a/tests/test_CustomSource.py b/tests/test_CustomSource.py index 715063c1f..3b1508b28 100644 --- a/tests/test_CustomSource.py +++ b/tests/test_CustomSource.py @@ -9,7 +9,7 @@ # pylint: disable=unused-argument -def constant_field(field, observers=(0, 0, 0)): +def constant_field(field, observers=(0, 0, 0)): # noqa: ARG001 """constant field""" position = np.array(observers) length = 1 if position.ndim == 1 else len(position) diff --git a/tests/test__missing_optional_modules.py b/tests/test__missing_optional_modules.py index 87d14556c..9fc4b3290 100644 --- a/tests/test__missing_optional_modules.py +++ b/tests/test__missing_optional_modules.py @@ -11,14 +11,12 @@ def test_show_with_missing_pyvista(): """Should raise if pyvista is not installed""" src = magpy.magnet.Cuboid(polarization=(0, 0, 1), dimension=(1, 1, 1)) - with patch.dict(sys.modules, {"pyvista": None}): - with pytest.raises(ModuleNotFoundError): - src.show(return_fig=True, backend="pyvista") + with patch.dict(sys.modules, {"pyvista": None}), pytest.raises(ModuleNotFoundError): + src.show(return_fig=True, backend="pyvista") def test_dataframe_output_missing_pandas(): """test if pandas is installed when using dataframe output in `getBH`""" src = magpy.magnet.Cuboid(polarization=(0, 0, 1), dimension=(1, 1, 1)) - with patch.dict(sys.modules, {"pandas": None}): - with pytest.raises(ModuleNotFoundError): - src.getB((0, 0, 0), output="dataframe") + with patch.dict(sys.modules, {"pandas": None}), pytest.raises(ModuleNotFoundError): + src.getB((0, 0, 0), output="dataframe") diff --git a/tests/test_core_physics_consistency.py b/tests/test_core_physics_consistency.py index da857d602..e1efeb2c6 100644 --- a/tests/test_core_physics_consistency.py +++ b/tests/test_core_physics_consistency.py @@ -226,7 +226,7 @@ def test_core_physics_long_solenoid(): where Jz = MU0 * I * N / L, and holds for B and for H-M. """ - I = 134 + I = 134 # noqa: E741 N = 5000 R = 1.543 L = 1234 @@ -299,12 +299,11 @@ def test_core_physics_current_replacement(): )[0, 2] N = 1000 # current discretization - I = Jz / MU0 / N * L H = BHJM_circle( field="H", observers=np.linspace((0, 0, -L / 2), (0, 0, L / 2), N) + obs, diameter=np.array([2 * R] * N), - current=np.array([I] * N), + current=np.array([Jz / MU0 / N * L] * N), ) Hz_curr = np.sum(H, axis=0)[2] diff --git a/tests/test_getBH_interfaces.py b/tests/test_getBH_interfaces.py index be1422b59..6c54044e3 100644 --- a/tests/test_getBH_interfaces.py +++ b/tests/test_getBH_interfaces.py @@ -232,9 +232,9 @@ def test_dataframe_ouptut_sumup(): magpy.magnet.Cuboid(polarization=(0, 0, 1000), dimension=(1, 1, 1)), magpy.magnet.Cylinder(polarization=(0, 1000, 0), dimension=(1, 1)), ] - df = magpy.getB(sources, (0, 0, 0), sumup=True, output="dataframe") + df_field = magpy.getB(sources, (0, 0, 0), sumup=True, output="dataframe") np.testing.assert_allclose( - df[["Bx", "By", "Bz"]].values, + df_field[["Bx", "By", "Bz"]].values, np.array([[-2.16489014e-14, 6.46446609e02, 6.66666667e02]]), ) @@ -248,9 +248,9 @@ def test_dataframe_ouptut_pixel_agg(): sources = (src1,) sensors = sens1, sens2, sens3 - df = magpy.getB(sources, sensors, pixel_agg="mean", output="dataframe") + df_field = magpy.getB(sources, sensors, pixel_agg="mean", output="dataframe") np.testing.assert_allclose( - df[["Bx", "By", "Bz"]].values, + df_field[["Bx", "By", "Bz"]].values, np.array( [[0.0, 0.0, 134.78238624], [0.0, 0.0, 19.63857207], [0.0, 0.0, 5.87908614]] ), From af5acda3f39afdfc362443afeafeaefa5f468530 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Wed, 23 Apr 2025 23:03:24 +0200 Subject: [PATCH 127/211] pylint --- noxfile.py | 2 +- pyproject.toml | 1 + src/magpylib/_src/display/backend_pyvista.py | 4 +-- .../_src/obj_classes/class_BaseDisplayRepr.py | 33 +++++++++++-------- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/noxfile.py b/noxfile.py index 7f90540b0..d249a3bdb 100644 --- a/noxfile.py +++ b/noxfile.py @@ -31,7 +31,7 @@ def pylint(session: nox.Session) -> None: """ # This needs to be installed into the package environment, and is slower # than a pre-commit check - session.install("-e.", "pylint>=3.2") + session.install("-e.[test]", "pylint>=3.2") session.run("pylint", "magpylib", *session.posargs) diff --git a/pyproject.toml b/pyproject.toml index 768125306..1e87d5cae 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -191,6 +191,7 @@ messages_control.disable = [ "wrong-import-position", "invalid-name", # TODO - review later "protected-access", # TODO - review later + "duplicate-code", # already covered by ruff "unused-argument", # already covered by ruff ] diff --git a/src/magpylib/_src/display/backend_pyvista.py b/src/magpylib/_src/display/backend_pyvista.py index ff118b33e..6b6ddd2fd 100644 --- a/src/magpylib/_src/display/backend_pyvista.py +++ b/src/magpylib/_src/display/backend_pyvista.py @@ -16,9 +16,9 @@ try: import pyvista as pv except ImportError as missing_module: # pragma: no cover - msg = """In order to use the pyvista plotting backend, you need to install pyvista via pip or + error_msg = """In order to use the pyvista plotting backend, you need to install pyvista via pip or conda, see https://docs.pyvista.org/getting-started/installation.html""" - raise ModuleNotFoundError(msg) from missing_module + raise ModuleNotFoundError(error_msg) from missing_module from matplotlib.colors import LinearSegmentedColormap from pyvista.plotting.colors import Color # pylint: disable=import-error diff --git a/src/magpylib/_src/obj_classes/class_BaseDisplayRepr.py b/src/magpylib/_src/obj_classes/class_BaseDisplayRepr.py index 40ac9a6ac..b78ef946b 100644 --- a/src/magpylib/_src/obj_classes/class_BaseDisplayRepr.py +++ b/src/magpylib/_src/obj_classes/class_BaseDisplayRepr.py @@ -5,6 +5,7 @@ from __future__ import annotations import numpy as np +from scipy.spatial.transform import Rotation from magpylib._src.display.display import show from magpylib._src.display.traces_core import make_DefaultTrace @@ -53,21 +54,24 @@ def _get_description(self, exclude=None): if not k.startswith("_") and k in params and k not in exclude: unit = UNITS.get(k) unit_str = f" {unit}" if unit else "" + val = "" if k == "position": - val = self._position - if val.shape[0] != 1: - lines.append(f" • path length: {val.shape[0]}") - k = f"{k} (last)" - val = f"{val[-1]}" + val = getattr(self, "_position", None) + if isinstance(val, np.ndarray): + if val.shape[0] != 1: + lines.append(f" • path length: {val.shape[0]}") + k = f"{k} (last)" + val = f"{val[-1]}" elif k == "orientation": - val = self._orientation - val = val.as_rotvec(degrees=True) - if len(val) != 1: - k = f"{k} (last)" - val = f"{val[-1]}" + val = getattr(self, "_orientation", None) + if isinstance(val, Rotation): + val = val.as_rotvec(degrees=True) #pylint: disable=no-member + if len(val) != 1: + k = f"{k} (last)" + val = f"{val[-1]}" elif k == "pixel": - val = self.pixel - if val is not None: + val = getattr(self, "pixel", None) + if isinstance(val, np.ndarray): px_shape = val.shape[:-1] val_str = f"{int(np.prod(px_shape))}" if val.ndim > 2: @@ -112,7 +116,8 @@ def _repr_html_(self): def __repr__(self) -> str: name = getattr(self, "name", None) - if name is None and hasattr(self, "style"): - name = getattr(self.style, "label", None) + if name is None: + style = getattr(self, "style", None) + name = getattr(style, "label", None) name_str = "" if name is None else f", label={name!r}" return f"{type(self).__name__}(id={id(self)!r}{name_str})" From 4c6f6306b0ea1172bcaf9d7611eb0095e7d2b475 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 23 Apr 2025 21:03:42 +0000 Subject: [PATCH 128/211] style: pre-commit fixes --- src/magpylib/_src/obj_classes/class_BaseDisplayRepr.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/magpylib/_src/obj_classes/class_BaseDisplayRepr.py b/src/magpylib/_src/obj_classes/class_BaseDisplayRepr.py index b78ef946b..d015cef1b 100644 --- a/src/magpylib/_src/obj_classes/class_BaseDisplayRepr.py +++ b/src/magpylib/_src/obj_classes/class_BaseDisplayRepr.py @@ -65,7 +65,7 @@ def _get_description(self, exclude=None): elif k == "orientation": val = getattr(self, "_orientation", None) if isinstance(val, Rotation): - val = val.as_rotvec(degrees=True) #pylint: disable=no-member + val = val.as_rotvec(degrees=True) # pylint: disable=no-member if len(val) != 1: k = f"{k} (last)" val = f"{val[-1]}" From ac42f9e5592efa625ba254cb3853cfde6e624e4a Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Wed, 23 Apr 2025 23:26:54 +0200 Subject: [PATCH 129/211] update --- .readthedocs.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 67c194c82..598a3a98b 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -7,6 +7,9 @@ build: os: ubuntu-22.04 tools: python: "3.12" + apt_packages: + # for pyvista + - libgl1-mesa-dev commands: - asdf plugin add uv - asdf install uv latest From e69a9d1da8236a1ec75a002dcd09bb5f9ec3c266 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Wed, 23 Apr 2025 23:29:40 +0200 Subject: [PATCH 130/211] test docs --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 0e57b45dd..d054046d0 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -16,7 +16,7 @@ # Location of Sphinx files -sys.path.insert(0, str(Path("./../").resolve())) ##Add the folder one level above +#sys.path.insert(0, str(Path("./../").resolve())) ##Add the folder one level above os.environ["SPHINX_APIDOC_OPTIONS"] = ( "members,show-inheritance" ## Hide undocumented members ) From a285b4795235a6f97d3798b6a5c121699e765659 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 23 Apr 2025 21:29:55 +0000 Subject: [PATCH 131/211] style: pre-commit fixes --- docs/conf.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index d054046d0..3943f246c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -2,8 +2,6 @@ import importlib.metadata import os -import sys -from pathlib import Path import sphinx.ext.apidoc @@ -16,7 +14,7 @@ # Location of Sphinx files -#sys.path.insert(0, str(Path("./../").resolve())) ##Add the folder one level above +# sys.path.insert(0, str(Path("./../").resolve())) ##Add the folder one level above os.environ["SPHINX_APIDOC_OPTIONS"] = ( "members,show-inheritance" ## Hide undocumented members ) From 227b1aacdd6082ec1bb3a0a3c1b62c2ff4b6daed Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Wed, 23 Apr 2025 23:31:42 +0200 Subject: [PATCH 132/211] test --- docs/conf.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 3943f246c..0e57b45dd 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -2,6 +2,8 @@ import importlib.metadata import os +import sys +from pathlib import Path import sphinx.ext.apidoc @@ -14,7 +16,7 @@ # Location of Sphinx files -# sys.path.insert(0, str(Path("./../").resolve())) ##Add the folder one level above +sys.path.insert(0, str(Path("./../").resolve())) ##Add the folder one level above os.environ["SPHINX_APIDOC_OPTIONS"] = ( "members,show-inheritance" ## Hide undocumented members ) From 97f7219f92d96292e30fe4fd471d8afbbc22c5b7 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Wed, 23 Apr 2025 23:37:20 +0200 Subject: [PATCH 133/211] test --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 0e57b45dd..1ee329f4c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -43,7 +43,7 @@ def setup(app): "-M", # Modules first "-o", # Output the files to: "./_autogen/", # Output Directory - "./../magpylib", # Main Module directory + "./../src/magpylib", # Main Module directory ] ) From 8e0b3cb3b5d606c33f421c0b73b738b0206d9e98 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Wed, 23 Apr 2025 23:40:39 +0200 Subject: [PATCH 134/211] test --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 1ee329f4c..2a5eacb03 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -43,7 +43,7 @@ def setup(app): "-M", # Modules first "-o", # Output the files to: "./_autogen/", # Output Directory - "./../src/magpylib", # Main Module directory + "./src/magpylib", # Main Module directory ] ) From a6eac0ba32c5a91db84eb88b2e276ff688535a8e Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Wed, 23 Apr 2025 23:51:57 +0200 Subject: [PATCH 135/211] test --- tests/test_display_pyvista.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_display_pyvista.py b/tests/test_display_pyvista.py index aa908768f..bbf9694fe 100644 --- a/tests/test_display_pyvista.py +++ b/tests/test_display_pyvista.py @@ -111,7 +111,7 @@ def test_pyvista_animation(is_notebook_result, extension, filename): # define sensor and source pv.OFF_SCREEN = True if sys.platform == "linux": - pv.start_xvfb() # needed for unix systems or it will test will crash with fatal error + os.environ["PYVISTA_VTK_OSMESA"] = "1" if not HAS_IMAGEIO and extension == "gif": pytest.skip("Extension gif skipped because imageio failed to load") if FFMPEG_FAILED and extension == "mp4": From 1f26ba622332e273c96a749165749a999f221103 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sat, 26 Apr 2025 11:46:01 +0200 Subject: [PATCH 136/211] add pyvista headless display gh action --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index add9840df..fc7211ada 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,6 +44,9 @@ jobs: runs-on: ubuntu-latest steps: + - name: Setup headless display + uses: pyvista/setup-headless-display-action@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 From 5a2eb775d5ecf94f76366fdaf5d87fb6c384993c Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sat, 26 Apr 2025 22:59:50 +0200 Subject: [PATCH 137/211] do not test on pypy yet --- .github/workflows/ci.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fc7211ada..97e3aa42e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,9 +39,10 @@ jobs: python-version: ["3.11", "3.12", "3.13"] runs-on: [ubuntu-latest, windows-latest, macos-latest] - include: - - python-version: "pypy-3.11" - runs-on: ubuntu-latest + # include: + # - python-version: "pypy-3.11" + # runs-on: ubuntu-latest + # Note: Commented out because it fails tests for pyvista due to vtk wheels steps: - name: Setup headless display From 32b0a859c033e36fbaab96ad47c0887a0b3318b2 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sat, 26 Apr 2025 23:24:09 +0200 Subject: [PATCH 138/211] remove prettier formatting --- docs/README.md | 28 +- docs/_pages/API_reference.md | 3 +- docs/_pages/changelog_.md | 8 +- .../contributing/cont_code_of_conduct.md | 3 +- docs/_pages/contributing/cont_contributing.md | 3 +- docs/_pages/contributing/cont_index.md | 3 +- docs/_pages/contributing/cont_license.md | 12 +- docs/_pages/user_guide/docs/docs_classes.md | 574 ++++++++---------- docs/_pages/user_guide/docs/docs_fieldcomp.md | 146 ++--- docs/_pages/user_guide/docs/docs_graphics.md | 199 ++---- .../user_guide/docs/docs_magpylib_force.md | 77 +-- docs/_pages/user_guide/docs/docs_pos_ori.md | 277 ++++----- docs/_pages/user_guide/docs/docs_styles.md | 182 ++---- .../user_guide/docs/docs_units_types.md | 47 +- .../user_guide/examples/examples_app_coils.md | 34 +- .../examples/examples_app_end_of_shaft.md | 14 +- .../examples/examples_app_halbach.md | 12 +- .../examples/examples_app_scales.md | 3 +- .../examples/examples_force_floating.md | 70 +-- .../examples/examples_force_force.md | 13 +- .../examples/examples_force_holding_force.md | 26 +- .../user_guide/examples/examples_index.md | 326 ++++++---- .../examples/examples_misc_compound.md | 31 +- .../examples_misc_field_interpolation.md | 24 +- .../examples/examples_misc_inhom.md | 45 +- .../examples/examples_shapes_cad.md | 5 +- .../examples/examples_shapes_convex_hull.md | 11 +- .../examples/examples_shapes_pyvista.md | 17 +- .../examples/examples_shapes_superpos.md | 78 +-- .../examples/examples_shapes_triangle.md | 55 +- .../examples/examples_tutorial_collection.md | 74 +-- .../examples/examples_tutorial_custom.md | 31 +- .../examples_tutorial_field_computation.md | 47 +- .../examples_tutorial_modeling_magnets.md | 195 ++---- .../examples/examples_tutorial_paths.md | 45 +- .../examples/examples_vis_animations.md | 73 +-- .../examples/examples_vis_magnet_colors.md | 16 +- .../examples/examples_vis_mpl_streamplot.md | 20 +- .../examples/examples_vis_pv_streamlines.md | 6 +- .../examples/examples_vis_subplots.md | 27 +- docs/_pages/user_guide/guide_index.md | 4 +- .../user_guide/guide_resources_01_physics.md | 223 ++----- .../user_guide/guide_start_01_install.md | 27 +- .../user_guide/guide_start_02_fundamentals.md | 188 +++--- docs/_static/custom.css | 18 +- docs/_static/switcher.json | 46 +- docs/_static/webcode/copybutton.js | 140 ++--- docs/_static/webcode/summaryOpen.js | 32 +- docs/index.md | 57 +- 49 files changed, 1360 insertions(+), 2235 deletions(-) diff --git a/docs/README.md b/docs/README.md index 662e2c965..0a0ba2474 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,32 +1,10 @@ ## About Magpylib Documentation -The Documentation is built with [Sphinx](http://www.sphinx-doc.org/en/main/) and -the configuration file is [conf.py](./conf.py). Files get converted to `.html` -files by Sphinx during build time. Images, web code and videos are kept in the -[\_static](./_static) folder. +The Documentation is built with [Sphinx](http://www.sphinx-doc.org/en/main/) and the configuration file is [conf.py](./conf.py). Files get converted to `.html` files by Sphinx during build time. Images, web code and videos are kept in the [_static](./_static) folder. ### API docs - -The docstring format is under the -[NumPy Convention](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_numpy.html). -Sphinx is configured to read Docstring information from the codebase and convert -it into pages utilizing the -[autodoc extension](http://www.sphinx-doc.org/en/main/usage/extensions/autodoc.html). -The generated files are created at build time and put into a folder called -`_autogen` + The docstring format is under the [NumPy Convention](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_numpy.html). Sphinx is configured to read Docstring information from the codebase and convert it into pages utilizing the [autodoc extension](http://www.sphinx-doc.org/en/main/usage/extensions/autodoc.html). The generated files are created at build time and put into a folder called `_autogen` ### Handwritten documents +Handwritten pages and guides are kept in the [_pages](./_pages) folder. They are all written in [Markdown](https://www.markdownguide.org/) using [myst-parser](https://github.com/executablebooks/MyST-Parser) as interface. Some documents like in the examples folder are dynamically computed with [myst-nb](https://github.com/executablebooks/myst-nb) as jupyter notebooks. With the help of the [jupytext](https://github.com/mwouts/jupytext) library ands its jupyterlab extension, examples can be written and executed within the jupyterlab ecosystem and saved as markdown file. It is recommended to use the [jupyterlab-myst](https://github.com/executablebooks/jupyterlab-myst) extension to be able to work with the full set of myst markdown flavor within jupyterlab. When editing the docs with vscode, use the [MyST-Markdown](https://marketplace.visualstudio.com/items?itemName=ExecutableBookProject.myst-highlight) extension to visualize the rendered document. -Handwritten pages and guides are kept in the [\_pages](./_pages) folder. They -are all written in [Markdown](https://www.markdownguide.org/) using -[myst-parser](https://github.com/executablebooks/MyST-Parser) as interface. Some -documents like in the examples folder are dynamically computed with -[myst-nb](https://github.com/executablebooks/myst-nb) as jupyter notebooks. With -the help of the [jupytext](https://github.com/mwouts/jupytext) library ands its -jupyterlab extension, examples can be written and executed within the jupyterlab -ecosystem and saved as markdown file. It is recommended to use the -[jupyterlab-myst](https://github.com/executablebooks/jupyterlab-myst) extension -to be able to work with the full set of myst markdown flavor within jupyterlab. -When editing the docs with vscode, use the -[MyST-Markdown](https://marketplace.visualstudio.com/items?itemName=ExecutableBookProject.myst-highlight) -extension to visualize the rendered document. diff --git a/docs/_pages/API_reference.md b/docs/_pages/API_reference.md index 5145a7e10..9c7ec255d 100644 --- a/docs/_pages/API_reference.md +++ b/docs/_pages/API_reference.md @@ -1,5 +1,4 @@ (docu-APIref)= - # API reference The API reference includes all Magpylib docstrings. @@ -8,4 +7,4 @@ The API reference includes all Magpylib docstrings. :maxdepth: 2 ../../_autogen/magpylib.rst -``` +``` \ No newline at end of file diff --git a/docs/_pages/changelog_.md b/docs/_pages/changelog_.md index 4d6fd7bd4..76a8f304f 100644 --- a/docs/_pages/changelog_.md +++ b/docs/_pages/changelog_.md @@ -1,12 +1,12 @@ -(changelog)= + +(changelog)= # Changelog -The changelog provides a compressed history of the Magpylib development since -its publication in 2019. +The changelog provides a compressed history of the Magpylib development since its publication in 2019. ```{include} ../../CHANGELOG.md :relative-docs: docs/ :relative-images: :start-line: 2 -``` +``` \ No newline at end of file diff --git a/docs/_pages/contributing/cont_code_of_conduct.md b/docs/_pages/contributing/cont_code_of_conduct.md index b865cb81a..1dbcfc576 100644 --- a/docs/_pages/contributing/cont_code_of_conduct.md +++ b/docs/_pages/contributing/cont_code_of_conduct.md @@ -1,7 +1,8 @@ (code-of-conduct)= - # Code of Conduct + + ```{include} ../../../CODE_OF_CONDUCT.md :relative-docs: docs/ :relative-images: diff --git a/docs/_pages/contributing/cont_contributing.md b/docs/_pages/contributing/cont_contributing.md index f0e581579..ad09b1627 100644 --- a/docs/_pages/contributing/cont_contributing.md +++ b/docs/_pages/contributing/cont_contributing.md @@ -1,7 +1,8 @@ (contributing)= - # Contribution Guide + + ```{include} ../../../CONTRIBUTING.md :relative-docs: docs/ :relative-images: diff --git a/docs/_pages/contributing/cont_index.md b/docs/_pages/contributing/cont_index.md index ee8518596..3feaf1907 100644 --- a/docs/_pages/contributing/cont_index.md +++ b/docs/_pages/contributing/cont_index.md @@ -1,7 +1,6 @@ # Contributing -Magpylib is a free-of-use open-source project aiming to help researchers and -engineers with magnetic field computation. Your participation is most welcome! +Magpylib is a free-of-use open-source project aiming to help researchers and engineers with magnetic field computation. Your participation is most welcome! ```{toctree} :maxdepth: 2 diff --git a/docs/_pages/contributing/cont_license.md b/docs/_pages/contributing/cont_license.md index f2e4b4b63..fa4c916db 100644 --- a/docs/_pages/contributing/cont_license.md +++ b/docs/_pages/contributing/cont_license.md @@ -1,15 +1,15 @@ (license)= - # License + + ## Overview -Magpylib is published under the open source -[FreeBSD](https://www.freebsd.org/copyright/freebsd-license/) license. +Magpylib is published under the open source [FreeBSD](https://www.freebsd.org/copyright/freebsd-license/) license. -- _Permissions:_ Commercial use, Modification, Distribution, Private use -- _Limitations:_ Liability, Warranty -- _Conditions:_ License and copyright notice +- *Permissions:* Commercial use, Modification, Distribution, Private use +- *Limitations:* Liability, Warranty +- *Conditions:* License and copyright notice ## License Text diff --git a/docs/_pages/user_guide/docs/docs_classes.md b/docs/_pages/user_guide/docs/docs_classes.md index 7fe59be1b..c7e8d00eb 100644 --- a/docs/_pages/user_guide/docs/docs_classes.md +++ b/docs/_pages/user_guide/docs/docs_classes.md @@ -1,441 +1,383 @@ (docs-classes)= - # The Magpylib Classes -In Magpylib's [object oriented interface](docs-fieldcomp-oo) magnetic field -**sources** (generate the field) and **observers** (read the field) are created -as Python objects with various defining attributes and methods. +In Magpylib's [object oriented interface](docs-fieldcomp-oo) magnetic field **sources** (generate the field) and **observers** (read the field) are created as Python objects with various defining attributes and methods. ## Base properties The following basic properties are shared by all Magpylib classes: -- The **position** and - **orientation** attributes describe the - object placement in the global coordinate system. +* The **position** and **orientation** attributes describe the object placement in the global coordinate system. -- The **move()** and - **rotate()** methods enable relative object - positioning. +* The **move()** and **rotate()** methods enable relative object positioning. -- The **reset_path()** method sets position - and orientation to default values. +* The **reset_path()** method sets position and orientation to default values. -- The **barycenter** property returns the - object barycenter (often the same as position). +* The **barycenter** property returns the object barycenter (often the same as position). See {ref}`docs-position` for more information on these features. -- The **style** attribute includes all - settings for graphical object representation. -- The **show()** method gives quick access to - the graphical representation. +* The **style** attribute includes all settings for graphical object representation. + +* The **show()** method gives quick access to the graphical representation. -See {ref}`guide-graphics` for more information on graphic output, default styles -and customization possibilities. +See {ref}`guide-graphics` for more information on graphic output, default styles and customization possibilities. -- The **getB()**, - **getH()**, - **getJ()** and - **getM()** methods give quick access to - field computation. +* The **getB()**, **getH()**, **getJ()** and **getM()** methods give quick access to field computation. See {ref}`docs-fieldcomp` for more information. -- The **parent** attribute references a - [Collection](guide-docs-classes-collections) that the object is part of. -- The **copy()** method creates a clone of - any object where selected properties, given by kwargs, are modified. +* The **parent** attribute references a [Collection](guide-docs-classes-collections) that the object is part of. + +* The **copy()** method creates a clone of any object where selected properties, given by kwargs, are modified. -- The **describe()** method provides a brief - description of the object and returns the unique object id. +* The **describe()** method provides a brief description of the object and returns the unique object id. + + +--------------------------------------------- ---- ## Local and global coordinates -::::{grid} 2 :::{grid-item} :columns: 9 Magpylib objects span a local reference -frame, and all object properties are defined within this frame, for example the -vertices of a `Tetrahedron` magnet. The position and orientation attributes -describe how the local frame lies within the global coordinates. The two frames -coincide by default, when `position=(0,0,0)` and `orientation=None` (=unit -rotation). The `position` and `orientation` attributes are described in detail -in {ref}`docs-position`. ::: :::{grid-item} :columns: 3 -![](../../../_static/images/docu_classes_init_global_local.png) ::: :::: +::::{grid} 2 +:::{grid-item} +:columns: 9 +Magpylib objects span a local reference frame, and all object properties are defined within this frame, for example the vertices of a `Tetrahedron` magnet. The position and orientation attributes describe how the local frame lies within the global coordinates. The two frames coincide by default, when `position=(0,0,0)` and `orientation=None` (=unit rotation). The `position` and `orientation` attributes are described in detail in {ref}`docs-position`. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_global_local.png) +::: +:::: ---- -(docu-magnet-classes)= +--------------------------------------------- + +(docu-magnet-classes)= ## Magnet classes -All magnets are sources. They have the -**polarization** attribute which is of the -format $\vec{J}=(J_x, J_y, J_z)$ and denotes a homogeneous magnetic polarization -vector in the local object coordinates in units of T. Alternatively, the -magnetization vector can be set via the -**magnetization** attribute of the format -$\vec{M}=(M_x, M_y, M_z)$. These two parameters are codependent and Magpylib -ensures that they stay in sync via the relation $\vec{J}=\mu_0\cdot\vec{M}$. -Information on how this is related to material properties from data sheets is -found in {ref}`examples-tutorial-modeling-magnets`. +All magnets are sources. They have the **polarization** attribute which is of the format $\vec{J}=(J_x, J_y, J_z)$ and denotes a homogeneous magnetic polarization vector in the local object coordinates in units of T. Alternatively, the magnetization vector can be set via the **magnetization** attribute of the format $\vec{M}=(M_x, M_y, M_z)$. These two parameters are codependent and Magpylib ensures that they stay in sync via the relation $\vec{J}=\mu_0\cdot\vec{M}$. Information on how this is related to material properties from data sheets is found in {ref}`examples-tutorial-modeling-magnets`. -### Cuboid +### Cuboid ```python -magpylib.magnet.Cuboid( - position, orientation, dimension, polarization, magnetization, style -) +magpylib.magnet.Cuboid(position, orientation, dimension, polarization, magnetization, style) ``` -::::{grid} 2 :::{grid-item} :columns: 9 `Cuboid` objects represent magnets with -cuboid shape. The **dimension** attribute has -the format $(a,b,c)$ and denotes the sides of the cuboid units of meter. The -center of the cuboid lies in the origin of the local coordinates, and the sides -are parallel to the coordinate axes. ::: :::{grid-item} :columns: 3 -![](../../../_static/images/docu_classes_init_cuboid.png) ::: :::: +::::{grid} 2 +:::{grid-item} +:columns: 9 +`Cuboid` objects represent magnets with cuboid shape. The **dimension** attribute has the format $(a,b,c)$ and denotes the sides of the cuboid units of meter. The center of the cuboid lies in the origin of the local coordinates, and the sides are parallel to the coordinate axes. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_cuboid.png) +::: +:::: -### Cylinder +### Cylinder ```python -magpylib.magnet.Cylinder( - position, orientation, dimension, polarization, magnetization, style -) +magpylib.magnet.Cylinder(position, orientation, dimension, polarization, magnetization, style) ``` -::::{grid} 2 :::{grid-item} :columns: 9 `Cylinder` objects represent magnets -with cylindrical shape. The **dimension** -attribute has the format $(d,h)$ and denotes diameter and height of the cylinder -in units of meter. The center of the cylinder lies in the origin of the local -coordinates, and the cylinder axis coincides with the z-axis. ::: :::{grid-item} -:columns: 3 ![](../../../_static/images/docu_classes_init_cylinder.png) ::: :::: +::::{grid} 2 +:::{grid-item} +:columns: 9 +`Cylinder` objects represent magnets with cylindrical shape. The **dimension** attribute has the format $(d,h)$ and denotes diameter and height of the cylinder in units of meter. The center of the cylinder lies in the origin of the local coordinates, and the cylinder axis coincides with the z-axis. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_cylinder.png) +::: +:::: -### CylinderSegment +### CylinderSegment ```python -magpylib.magnet.CylinderSegment( - position, orientation, dimension, polarization, magnetization, style -) +magpylib.magnet.CylinderSegment(position, orientation, dimension, polarization, magnetization, style) ``` -::::{grid} 2 :::{grid-item} :columns: 9 `CylinderSegment` objects represent -magnets with the shape of a cylindrical ring section. The -**dimension** attribute has the format -$(r_1,r_2,h,\varphi_1,\varphi_2)$ and denotes inner radius, outer radius and -height in units of meter, and the two section angles $\varphi_1<\varphi_2$ in °. -The center of the full cylinder lies in the origin of the local coordinates, and -the cylinder axis coincides with the z-axis. ::: :::{grid-item} :columns: 3 -![](../../../_static/images/docu_classes_init_cylindersegment.png) ::: -:::{grid-item} :columns: 12 **Info:** When the cylinder section angles span -360°, then the much faster `Cylinder` methods are used for the field -computation. ::: :::: +::::{grid} 2 +:::{grid-item} +:columns: 9 +`CylinderSegment` objects represent magnets with the shape of a cylindrical ring section. The **dimension** attribute has the format $(r_1,r_2,h,\varphi_1,\varphi_2)$ and denotes inner radius, outer radius and height in units of meter, and the two section angles $\varphi_1<\varphi_2$ in °. The center of the full cylinder lies in the origin of the local coordinates, and the cylinder axis coincides with the z-axis. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_cylindersegment.png) +::: +:::{grid-item} +:columns: 12 +**Info:** When the cylinder section angles span 360°, then the much faster `Cylinder` methods are used for the field computation. +::: +:::: -### Sphere +### Sphere ```python -magpylib.magnet.Sphere( - position, orientation, diameter, polarization, magnetization, style -) +magpylib.magnet.Sphere(position, orientation, diameter, polarization, magnetization, style) ``` -::::{grid} 2 :::{grid-item} :columns: 9 `Sphere` objects represent magnets of -spherical shape. The **diameter** attribute -is the sphere diameter $d$ in units of meter. The center of the sphere lies in -the origin of the local coordinates. ::: :::{grid-item} :columns: 3 -![](../../../_static/images/docu_classes_init_sphere.png) ::: :::: +::::{grid} 2 +:::{grid-item} +:columns: 9 +`Sphere` objects represent magnets of spherical shape. The **diameter** attribute is the sphere diameter $d$ in units of meter. The center of the sphere lies in the origin of the local coordinates. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_sphere.png) +::: +:::: -### Tetrahedron +### Tetrahedron ```python -magpylib.magnet.Tetrahedron( - position, orientation, vertices, polarization, magnetization, style -) +magpylib.magnet.Tetrahedron(position, orientation, vertices, polarization, magnetization, style) ``` -::::{grid} 2 :::{grid-item} :columns: 9 `Tetrahedron` objects represent magnets -of tetrahedral shape. The **vertices** -attribute stores the four corner points -$(\vec{P}_1, \vec{P}_2, \vec{P}_3, \vec{P}_4)$ in the local object coordinates -in units of m. ::: :::{grid-item} :columns: 3 -![](../../../_static/images/docu_classes_init_tetra.png) ::: :::{grid-item} -:columns: 12 **Info:** The `Tetrahedron` field is computed from four `Triangle` -fields. ::: :::: +::::{grid} 2 +:::{grid-item} +:columns: 9 +`Tetrahedron` objects represent magnets of tetrahedral shape. The **vertices** attribute stores the four corner points $(\vec{P}_1, \vec{P}_2, \vec{P}_3, \vec{P}_4)$ in the local object coordinates in units of m. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_tetra.png) +::: +:::{grid-item} +:columns: 12 +**Info:** The `Tetrahedron` field is computed from four `Triangle` fields. +::: +:::: (docu-magpylib-api-trimesh)= ### TriangularMesh - ```python -magpylib.magnet.TriangularMesh( - position, - orientation, - vertices, - faces, - polarization, - magnetization, - check_open, - check_disconnected, - check_selfintersecting, - reorient_faces, - style, -) +magpylib.magnet.TriangularMesh(position, orientation, vertices, faces, polarization, magnetization, check_open, check_disconnected, check_selfintersecting, reorient_faces, style) ``` -::::{grid} 2 :::{grid-item} :columns: 9 `TriangularMesh` objects represent -magnets with surface given by a triangular mesh. The mesh is defined by the -**vertices** attribute, an array of all -unique corner points $(\vec{P}_1, \vec{P}_2, ...)$ in units of meter, and the -**faces** attribute, which is an array of -index-triplets that define individual faces $(\vec{F}_1, \vec{F}_2, ...)$. The -property **mesh** returns an array of all -faces as point-triples -$[(\vec{P}_1^1, \vec{P}_2^1, \vec{P}_3^1), (\vec{P}_1^2, \vec{P}_2^2, \vec{P}_3^2), ...]$. -::: :::{grid-item} :columns: 3 -![](../../../_static/images/docu_classes_init_trimesh.png) ::: :::{grid-item} -:columns: 12 At initialization the mesh integrity is automatically checked, and -all faces are reoriented to point outwards. These actions are controlled via the -kwargs - -- **check_open** -- **check_disconnected** -- **check_selfintersecting** -- **reorient_faces** - -which are all by default set to `"warn"`. Options are `"skip"` (don't perform -check), `"ignore"` (ignore if check fails), `"warn"` (warn if check fails), -`"raise"` (raise error if check fails). +::::{grid} 2 +:::{grid-item} +:columns: 9 +`TriangularMesh` objects represent magnets with surface given by a triangular mesh. The mesh is defined by the **vertices** attribute, an array of all unique corner points $(\vec{P}_1, \vec{P}_2, ...)$ in units of meter, and the **faces** attribute, which is an array of index-triplets that define individual faces $(\vec{F}_1, \vec{F}_2, ...)$. The property **mesh** returns an array of all faces as point-triples $[(\vec{P}_1^1, \vec{P}_2^1, \vec{P}_3^1), (\vec{P}_1^2, \vec{P}_2^2, \vec{P}_3^2), ...]$. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_trimesh.png) +::: +:::{grid-item} +:columns: 12 +At initialization the mesh integrity is automatically checked, and all faces are reoriented to point outwards. These actions are controlled via the kwargs +* **check_open** +* **check_disconnected** +* **check_selfintersecting** +* **reorient_faces** + +which are all by default set to `"warn"`. Options are `"skip"` (don't perform check), `"ignore"` (ignore if check fails), `"warn"` (warn if check fails), `"raise"` (raise error if check fails). Results of the checks are stored in the following object attributes - -- **status_open** can be `True`, `False` or - `None` (unchecked) -- **status_open_data** contains an array of - open edges -- **status_disconnected** can be `True`, - `False` or `None` (unchecked) -- **status_disconnected_data** contains an - array of mesh parts -- **status_selfintersecting** can be `True`, - `None` or `None` (unchecked) -- **status_selfintersecting_data** contains - an array of self-intersecting faces -- **status_reoriented** can be `True` or - `False` +* **status_open** can be `True`, `False` or `None` (unchecked) +* **status_open_data** contains an array of open edges +* **status_disconnected** can be `True`, `False` or `None` (unchecked) +* **status_disconnected_data** contains an array of mesh parts +* **status_selfintersecting** can be `True`, `None` or `None` (unchecked) +* **status_selfintersecting_data** contains an array of self-intersecting faces +* **status_reoriented** can be `True` or `False` The checks can also be performed after initialization using the methods - -- **check_open()** -- **check_disconnected()** -- **check_selfintersecting()** -- **reorient_faces()** +* **check_open()** +* **check_disconnected()** +* **check_selfintersecting()** +* **reorient_faces()** The following class methods enable easy mesh creating and mesh loading. -- **TriangularMesh.from_mesh()** generates a - `TriangularMesh` objects from the input - **mesh**, which is an array in the mesh - format - $[(\vec{P}_1^1, \vec{P}_2^1, \vec{P}_3^1), (\vec{P}_1^2, \vec{P}_2^2, \vec{P}_3^2), ...]$. -- **TriangularMesh.from_ConvexHull()** - generates a `TriangularMesh` object from the input - **points**, which is an array of positions - $(\vec{P}_1, \vec{P}_2, \vec{P}_3, ...)$ from which the convex Hull is - computed via the - [Scipy ConvexHull](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.ConvexHull.html) - implementation. -- **TriangularMesh.from_triangles()** - generates a `TriangularMesh` object from the input - **triangles**, which is a list or a - `Collection` of `Triangle` objects. -- **TriangularMesh.from_pyvista()** generates - a `TriangularMesh` object from the input - **polydata**, which is a - [Pyvista PolyData](https://docs.pyvista.org/version/stable/api/core/_autosummary/pyvista.PolyData.html) - object. - -The method **to_TriangleCollection()** -transforms a `TriangularMesh` object into a `Collection` of `Triangle` objects. - -**Info:** While the checks may be disabled, the field computation guarantees -correct results only if the mesh is closed, connected, not self-intersecting and -all faces are oriented outwards. Examples of working with the `TriangularMesh` -class are found in {ref}`examples-shapes-triangle` and in -{ref}`examples-shapes-pyvista`. ::: :::: - ---- +* **TriangularMesh.from_mesh()** generates a `TriangularMesh` objects from the input **mesh**, which is an array in the mesh format $[(\vec{P}_1^1, \vec{P}_2^1, \vec{P}_3^1), (\vec{P}_1^2, \vec{P}_2^2, \vec{P}_3^2), ...]$. +* **TriangularMesh.from_ConvexHull()** generates a `TriangularMesh` object from the input **points**, which is an array of positions $(\vec{P}_1, \vec{P}_2, \vec{P}_3, ...)$ from which the convex Hull is computed via the [Scipy ConvexHull](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.ConvexHull.html) implementation. +* **TriangularMesh.from_triangles()** generates a `TriangularMesh` object from the input **triangles**, which is a list or a `Collection` of `Triangle` objects. +* **TriangularMesh.from_pyvista()** generates a `TriangularMesh` object from the input **polydata**, which is a [Pyvista PolyData](https://docs.pyvista.org/version/stable/api/core/_autosummary/pyvista.PolyData.html) object. + +The method **to_TriangleCollection()** transforms a `TriangularMesh` object into a `Collection` of `Triangle` objects. + +**Info:** While the checks may be disabled, the field computation guarantees correct results only if the mesh is closed, connected, not self-intersecting and all faces are oriented outwards. Examples of working with the `TriangularMesh` class are found in {ref}`examples-shapes-triangle` and in {ref}`examples-shapes-pyvista`. +::: +:::: + + +--------------------------------------------- + ## Current classes -All currents are sources. Current objects have the -**current** attribute which is a scalar that -denotes the electrical current in units of ampere. +All currents are sources. Current objects have the **current** attribute which is a scalar that denotes the electrical current in units of ampere. ### Circle - ```python magpylib.current.Circle(position, orientation, diameter, current, style) ``` -::::{grid} 2 :::{grid-item} :columns: 9 `Circle` objects represent circular line -current loops. The **diameter** attribute is -the loop diameter $d$ in units of meter. The loop lies in the xy-plane with it's -center in the origin of the local coordinates. ::: :::{grid-item} :columns: 3 -![](../../../_static/images/docu_classes_init_loop.png) ::: :::: +::::{grid} 2 +:::{grid-item} +:columns: 9 +`Circle` objects represent circular line current loops. The **diameter** attribute is the loop diameter $d$ in units of meter. The loop lies in the xy-plane with it's center in the origin of the local coordinates. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_loop.png) +::: +:::: ### Polyline - ```python magpylib.current.Polyline(position, orientation, vertices, current, style) ``` -::::{grid} 2 :::{grid-item} :columns: 9 `Polyline` objects represent line -current segments where the electric current flows in straight lines from vertex -to vertex. The **vertices** attribute is a -vector of all vertices $(\vec{P}_1, \vec{P}_2, ...)$ given in the local -coordinates in units of meter. ::: :::{grid-item} :columns: 3 -![](../../../_static/images/docu_classes_init_line.png) ::: :::: +::::{grid} 2 +:::{grid-item} +:columns: 9 +`Polyline` objects represent line current segments where the electric current flows in straight lines from vertex to vertex. The **vertices** attribute is a vector of all vertices $(\vec{P}_1, \vec{P}_2, ...)$ given in the local coordinates in units of meter. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_line.png) +::: +:::: ---- +--------------------------------------------- ## Miscellaneous classes -There are classes listed hereon that function as sources, but they do not -represent physical magnets or current distributions. +There are classes listed hereon that function as sources, but they do not represent physical magnets or current distributions. -### Dipole +### Dipole ```python magpylib.misc.Dipole(position, orientation, moment, style) ``` -::::{grid} 2 :::{grid-item} :columns: 9 `Dipole` objects represent magnetic -dipole moments with the **moment** attribute -that describes the magnetic dipole moment $\vec{m}=(m_x,m_y,m_z)$ in SI-units of -Am², which lies in the origin of the local coordinates. ::: :::{grid-item} -:columns: 3 ![](../../../_static/images/docu_classes_init_dipole.png) ::: -:::{grid-item} :columns: 12 **Info:** The total dipole moment of a homogeneous -magnet with body volume $V$ is given by $\vec{m}=\vec{M}\cdot V$. ::: :::: +::::{grid} 2 +:::{grid-item} +:columns: 9 +`Dipole` objects represent magnetic dipole moments with the **moment** attribute that describes the magnetic dipole moment $\vec{m}=(m_x,m_y,m_z)$ in SI-units of Am², which lies in the origin of the local coordinates. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_dipole.png) +::: +:::{grid-item} +:columns: 12 +**Info:** The total dipole moment of a homogeneous magnet with body volume $V$ is given by $\vec{m}=\vec{M}\cdot V$. +::: +:::: -### Triangle +### Triangle ```python -magpylib.misc.Triangle( - position, orientation, vertices, polarization, magnetization, style -) +magpylib.misc.Triangle(position, orientation, vertices, polarization, magnetization, style) ``` -::::{grid} 2 :::{grid-item} :columns: 9 `Triangle` objects represent triangular -surfaces with homogeneous charge density given by the projection of the -polarization or magnetization vector onto the surface normal. The attributes -**polarization** and -**magnetization** are treated similar as by -the {ref}`docu-magnet-classes`. The -**vertices** attribute is a set of the three -triangle corners $(\vec{P}_1, \vec{P}_2, \vec{P}_3)$ in units of meter in the -local coordinates. ::: :::{grid-item} :columns: 3 -![](../../../_static/images/docu_classes_init_triangle.png) ::: :::{grid-item} -:columns: 12 **Info:** When multiple Triangles with similar -magnetization/polarization vectors form a closed surface, and all their -orientations (right-hand-rule) point outwards, their total H-field is equivalent -to the field of a homogeneous magnet of the same shape. In this case, the -B-field is only correct on the outside of the body. On the inside the -polarization must be added to the field. This is demonstrated in the tutorial -{ref}`examples-shapes-triangle`. ::: :::: +::::{grid} 2 +:::{grid-item} +:columns: 9 +`Triangle` objects represent triangular surfaces with homogeneous charge density given by the projection of the polarization or magnetization vector onto the surface normal. The attributes **polarization** and **magnetization** are treated similar as by the {ref}`docu-magnet-classes`. The **vertices** attribute is a set of the three triangle corners $(\vec{P}_1, \vec{P}_2, \vec{P}_3)$ in units of meter in the local coordinates. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_triangle.png) +::: +:::{grid-item} +:columns: 12 +**Info:** When multiple Triangles with similar magnetization/polarization vectors form a closed surface, and all their orientations (right-hand-rule) point outwards, their total H-field is equivalent to the field of a homogeneous magnet of the same shape. In this case, the B-field is only correct on the outside of the body. On the inside the polarization must be added to the field. This is demonstrated in the tutorial {ref}`examples-shapes-triangle`. +::: +:::: (guide-docs-classes-custom-source)= - ### CustomSource - ```python magpylib.misc.CustomSource(field_func, position, orientation, style) ``` -::::{grid} 2 :::{grid-item} :columns: 9 The `CustomSource` class is used to -create user defined sources provided with with custom field computation -functions. The argument **field_func** takes -a function that is then automatically called for the field computation. This -custom field function is treated like a [core function](docs-field-core). It -must have the positional arguments `field` with values `"B"` or `"H"`, and -`observers` (must accept array with shape (n,3)) and return the B-field and the -H-field with a similar shape. ::: :::{grid-item} :columns: 3 -![](../../../_static/images/docu_classes_init_custom.png) ::: :::{grid-item} -:columns: 12 **Info:** A tutorial {ref}`examples-tutorial-custom` is found in -the examples. ::: :::: +::::{grid} 2 +:::{grid-item} +:columns: 9 +The `CustomSource` class is used to create user defined sources provided with with custom field computation functions. The argument **field_func** takes a function that is then automatically called for the field computation. This custom field function is treated like a [core function](docs-field-core). It must have the positional arguments `field` with values `"B"` or `"H"`, and `observers` (must accept array with shape (n,3)) and return the B-field and the H-field with a similar shape. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_custom.png) +::: +:::{grid-item} +:columns: 12 +**Info:** A tutorial {ref}`examples-tutorial-custom` is found in the examples. +::: +:::: ---- -## Sensor +--------------------------------------------- + +## Sensor ```python magpylib.Sensor(position, orientation, pixel, handedness, style) ``` -::::{grid} 2 :::{grid-item} :columns: 9 `Sensor` objects represent observers of -the magnetic field and can be used as Magpylib `observers` input for magnetic -field computation. The **pixel** attribute is -an array of positions $(\vec{P}_1, \vec{P}_2, ...)$ provided in units of meter -in the local sensor coordinates. A sensor returns the magnetic field at these -pixel positions. By default `pixel=(0,0,0)` and the sensor simply returns the -field at it's position. The **handedness** -attribute can be `"left"` or `"right"` (default) to set a left- or right-handed -sensor coordinate system for the field computation. ::: :::{grid-item} :columns: -3 ![](../../../_static/images/docu_classes_init_sensor.png) ::: :::{grid-item} -:columns: 12 **Info:** Sensors can have their own position and orientation and -enable easy relative positioning between sources and observers. The field is -always computed in the reference frame of the sensor, which might itself be -moving in the global coordinate system. Magpylib sensors can be understood as -perfect magnetic field sensors with infinitesimally sensitive elements. An -example how to use sensors is given in -{ref}`examples-tutorial-field-computation-sensors`. ::: :::: - ---- +::::{grid} 2 +:::{grid-item} +:columns: 9 +`Sensor` objects represent observers of the magnetic field and can be used as Magpylib `observers` input for magnetic field computation. The **pixel** attribute is an array of positions $(\vec{P}_1, \vec{P}_2, ...)$ provided in units of meter in the local sensor coordinates. A sensor returns the magnetic field at these pixel positions. By default `pixel=(0,0,0)` and the sensor simply returns the field at it's position. The **handedness** attribute can be `"left"` or `"right"` (default) to set a left- or right-handed sensor coordinate system for the field computation. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_sensor.png) +::: +:::{grid-item} +:columns: 12 +**Info:** Sensors can have their own position and orientation and enable easy relative positioning between sources and observers. The field is always computed in the reference frame of the sensor, which might itself be moving in the global coordinate system. Magpylib sensors can be understood as perfect magnetic field sensors with infinitesimally sensitive elements. An example how to use sensors is given in {ref}`examples-tutorial-field-computation-sensors`. +::: +:::: -(guide-docs-classes-collections)= -## Collection +--------------------------------------------- + +(guide-docs-classes-collections)= +## Collection ```python magpylib.Collection(*children, position, orientation, override_parent, style) ``` -::::{grid} 2 :::{grid-item} :columns: 9 A `Collection` is a group of Magpylib -objects that is used for common manipulation. All these objects are stored by -reference in the **children** attribute. The -collection becomes the **parent** of the -object. An object can only have one parent. There are several options for -accessing only specific children via the following properties - -- **sources**: return only sources -- **observers**: return only observers -- **collections**: return only collections -- **sources_all**: return all sources, - including the ones from sub-collections -- **observers_all**: return all observers, - including the ones from sub-collections -- **collections_all**: return all - collections, including the ones from sub-collections +::::{grid} 2 +:::{grid-item} +:columns: 9 +A `Collection` is a group of Magpylib objects that is used for common manipulation. All these objects are stored by reference in the **children** attribute. The collection becomes the **parent** of the object. An object can only have one parent. There are several options for accessing only specific children via the following properties + +* **sources**: return only sources +* **observers**: return only observers +* **collections**: return only collections +* **sources_all**: return all sources, including the ones from sub-collections +* **observers_all**: return all observers, including the ones from sub-collections +* **collections_all**: return all collections, including the ones from sub-collections Additional methods for adding and removing children: - **add()**: Add an object to the collection -- **remove()**: Remove an object from the - collection ::: :::{grid-item} :columns: 3 - ![](../../../_static/images/docu_classes_init_collection.png) ::: - :::{grid-item} :columns: 12 **Info:** A collection object has its own - `position` and `orientation` attributes and spans a local reference frame for - all its children. An operation applied to a collection moves the frame and is - individually applied to all children such that their relative position in the - local reference frame is maintained. This means that the collection functions - as a container for manipulation, but child position and orientation are always - updated in the global coordinate system. After being added to a collection, it - is still possible to manipulate the individual children, which will also move - them to a new relative position in the collection frame. - -Collections have **format** as an additional argument for **describe()** method. -Default value is `format="type+id+label"`. Any combination of `"type"`, `"id"`, -and `"label"` is allowed. - -A tutorial {ref}`examples-tutorial-collection` is provided in the example -examples. ::: :::: +- **remove()**: Remove an object from the collection +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_collection.png) +::: +:::{grid-item} +:columns: 12 +**Info:** A collection object has its own `position` and `orientation` attributes and spans a local reference frame for all its children. An operation applied to a collection moves the frame and is individually applied to all children such that their relative position in the local reference frame is maintained. This means that the collection functions as a container for manipulation, but child position and orientation are always updated in the global coordinate system. After being added to a collection, it is still possible to manipulate the individual children, which will also move them to a new relative position in the collection frame. + +Collections have **format** as an additional argument for **describe()** method. Default value is `format="type+id+label"`. Any combination of `"type"`, `"id"`, and `"label"` is allowed. + +A tutorial {ref}`examples-tutorial-collection` is provided in the example examples. +::: +:::: diff --git a/docs/_pages/user_guide/docs/docs_fieldcomp.md b/docs/_pages/user_guide/docs/docs_fieldcomp.md index d4280ca24..c1632f3cf 100644 --- a/docs/_pages/user_guide/docs/docs_fieldcomp.md +++ b/docs/_pages/user_guide/docs/docs_fieldcomp.md @@ -1,22 +1,13 @@ (docs-fieldcomp)= - # Field Computation -The following is a detailed technical documentation of Magpylib field -computation. The tutorial {ref}`examples-tutorial-field-computation` shows good -practices and illustrative examples. +The following is a detailed technical documentation of Magpylib field computation. +The tutorial {ref}`examples-tutorial-field-computation` shows good practices and illustrative examples. (docs-fieldcomp-oo)= - ## Object-oriented interface -The object-oriented interface relies on the idea that sources of the magnetic -field and observers thereof are created as Python objects which can be -manipulated at will, and called for field computation. This is done via four -top-level functions **getB**, -**getH**, -**getJ** and, -**getM**, +The object-oriented interface relies on the idea that sources of the magnetic field and observers thereof are created as Python objects which can be manipulated at will, and called for field computation. This is done via four top-level functions **getB**, **getH**, **getJ** and, **getM**, ```python magpylib.getB(sources, observers, squeeze=True, pixel_agg=None, output="ndarray") @@ -25,19 +16,13 @@ magpylib.getJ(sources, observers, squeeze=True, pixel_agg=None, output="ndarray" magpylib.getM(sources, observers, squeeze=True, pixel_agg=None, output="ndarray") ``` -that compute the respective fields B (B-field), H (H-field), J (polarization) or -M (magnetization) generated by `sources` as seen by the `observers` in their -local coordinates. `sources` can be any Magpylib source object (e.g. magnets) or -a flat list thereof. `observers` can be an array of position vectors with shape -`(n1,n2,n3,...,3)`, any Magpylib observer object (e.g. sensors), or a flat list -thereof. The following code shows a minimal example for Magpylib field -computation. +that compute the respective fields B (B-field), H (H-field), J (polarization) or M (magnetization) generated by `sources` as seen by the `observers` in their local coordinates. `sources` can be any Magpylib source object (e.g. magnets) or a flat list thereof. `observers` can be an array of position vectors with shape `(n1,n2,n3,...,3)`, any Magpylib observer object (e.g. sensors), or a flat list thereof. The following code shows a minimal example for Magpylib field computation. ```python import magpylib as magpy # Define source and observer objects -loop = magpy.current.Circle(current=1, diameter=0.001) +loop = magpy.current.Circle(current=1, diameter=.001) sens = magpy.Sensor() # Compute field @@ -47,9 +32,7 @@ print(B) # --> [0. 0. 0.00125664] ``` -For quick access, the functions `getBHJM` are also methods of all Magpylib -objects, such that the `sources` or `observers` input is the object itself. The -above example can be continued as +For quick access, the functions `getBHJM` are also methods of all Magpylib objects, such that the `sources` or `observers` input is the object itself. The above example can be continued as ```python # Call getB as method of loop @@ -61,33 +44,19 @@ B = sens.getB(loop) with the same result for `B`. -By default, `getB` returns the B-field in units of T, `getH` the H-field in -units of A/m, `getJ` the magnetic polarization in T and, `getM` the -magnetization in A/m, assuming that all inputs are given in SI units as -described in the docstrings. +By default, `getB` returns the B-field in units of T, `getH` the H-field in units of A/m, `getJ` the magnetic polarization in T and, `getM` the magnetization in A/m, assuming that all inputs are given in SI units as described in the docstrings. ```{hint} In reality, `getB` is proportional to the `polarization` input and therefore returns the same unit. For example, with polarization input in mT, `getB` will return mT as well. At the same time when the `magnetization` input is kA/m, then `getH` returns kA/m as well. The B/H-field outputs are related to a M/J-inputs via a factor of $µ_0$. ``` -The output of a field computation `magpy.getB(sources, observers)` is by default -a NumPy array of shape `(l, m, k, n1, n2, n3, ..., 3)` where `l` is the number -of input sources, `m` the (maximal) object path length, `k` the number of -observers, `n1,n2,n3,...` the sensor pixel shape or the shape of the observer -position array input and `3` the three magnetic field components -$(B_x, B_y, B_z)$. +The output of a field computation `magpy.getB(sources, observers)` is by default a NumPy array of shape `(l, m, k, n1, n2, n3, ..., 3)` where `l` is the number of input sources, `m` the (maximal) object path length, `k` the number of observers, `n1,n2,n3,...` the sensor pixel shape or the shape of the observer position array input and `3` the three magnetic field components $(B_x, B_y, B_z)$. -- `squeeze`: If True (default) all axes of length 1 in the output (e.g. only a - single source) are squeezed. +* `squeeze`: If True (default) all axes of length 1 in the output (e.g. only a single source) are squeezed. -- `pixel_agg`: Select a compatible NumPy aggregator function (e.g. `"min"`, - `"mean"`) that is applied to the output. For example, with `pixel_agg="mean"` - the mean field of all observer points is returned. With this option it is - possible to supply `getBHJM` with multiple observers that have different pixel - shapes. +* `pixel_agg`: Select a compatible NumPy aggregator function (e.g. `"min"`, `"mean"`) that is applied to the output. For example, with `pixel_agg="mean"` the mean field of all observer points is returned. With this option it is possible to supply `getBHJM` with multiple observers that have different pixel shapes. -- `output`: Change the output format. Options are `"ndarray"` (default, returns - a NumPy ndarray) and `"dataframe"` (returns a 2D-table Pandas DataFrame). +* `output`: Change the output format. Options are `"ndarray"` (default, returns a NumPy ndarray) and `"dataframe"` (returns a 2D-table Pandas DataFrame). ```{note} Magpylib collects all inputs (object parameters), and vectorizes them for the computation which reduces the computation time dramatically for large inputs. @@ -96,37 +65,28 @@ Try to make all field computations with as few calls to `getBHJM` as possible. A ``` (docs-field-functional)= - ## Functional interface -Users can bypass the object oriented functionality of Magpylib and instead -compute the field for n given parameter sets. This is done by providing the -following inputs to the top level functions `getB`, `getH`, `getJ` and, `getM`. +Users can bypass the object oriented functionality of Magpylib and instead compute the field for n given parameter sets. This is done by providing the following inputs to the top level functions `getB`, `getH`, `getJ` and, `getM`. -1. `sources`: a string denoting the source type. Allowed values are the Magpylib - source class names, see {ref}`docs-classes`. +1. `sources`: a string denoting the source type. Allowed values are the Magpylib source class names, see {ref}`docs-classes`. 2. `observers`: array-like of shape (3,) or (n,3) giving the observer positions. -3. `kwargs`: a dictionary with inputs of shape (x,) or (n,x). Must include all - mandatory class-specific inputs. By default, `position=(0,0,0)` and - `orientation=None`(=unit rotation). +3. `kwargs`: a dictionary with inputs of shape (x,) or (n,x). Must include all mandatory class-specific inputs. By default, `position=(0,0,0)` and `orientation=None`(=unit rotation). -All "scalar" inputs of shape (x,) are automatically tiled up to shape (n,x) to -create a set of n computation instances. The field is returned in the shape -(n,3). The following code demonstrates the functional interface. +All "scalar" inputs of shape (x,) are automatically tiled up to shape (n,x) to create a set of n computation instances. The field is returned in the shape (n,3). The following code demonstrates the functional interface. ```python import numpy as np import magpylib as magpy - # All inputs and outputs in SI units # Compute the cuboid field for 3 input instances -N = 3 # number of instances +N = 3 # number of instances B = magpy.getB( - sources="Cuboid", - observers=np.linspace((0, 0, 1), (0, 0, 3), N), - dimension=np.linspace((1, 1, 1), (3, 3, 3), 3, N), - polarization=(0, 0, 1), + sources='Cuboid', + observers=np.linspace((0,0,1), (0,0,3), N), + dimension=np.linspace((1,1,1), (3,3,3),3, N), + polarization=(0,0,1), ) # This example demonstrates the scale invariance @@ -140,70 +100,65 @@ print(B) The functional interface is potentially faster than the object oriented one if users know how to generate the input arrays efficiently with numpy (e.g. `np.arange`, `np.linspace`, `np.tile`, `np.repeat`, ...). ``` -(docs-field-core)= +(docs-field-core)= ## Core interface -At the heart of Magpylib lies a set of core functions that are our -implementations of analytical field expressions found in the literature, see -{ref}`guide-ressources-physics`. Direct access to these functions is given -through the `magpylib.core` subpackage which includes, +At the heart of Magpylib lies a set of core functions that are our implementations of analytical field expressions found in the literature, see {ref}`guide-ressources-physics`. Direct access to these functions is given through the `magpylib.core` subpackage which includes, -::::{grid} 1 :gutter: 1 +::::{grid} 1 +:gutter: 1 -:::{grid-item} **magnet_cuboid_Bfield(** -`observers`, `dimensions`, -`polarizations`**)** ::: +:::{grid-item} +**magnet_cuboid_Bfield(** `observers`, `dimensions`, `polarizations`**)** +::: :::{grid-item} -**magnet_cylinder_axial_Bfield(** `z0`, `r`, -`z`**)** ::: +**magnet_cylinder_axial_Bfield(** `z0`, `r`, `z`**)** +::: :::{grid-item} -**magnet_cylinder_diametral_Hfield(** `z0`, -`r`, `z`, `phi`**)** ::: +**magnet_cylinder_diametral_Hfield(** `z0`, `r`, `z`, `phi`**)** +::: :::{grid-item} -**magnet_cylinder_segment_Hfield(** -`observers`, `dimensions`, -`magnetizations`**)** ::: +**magnet_cylinder_segment_Hfield(** `observers`, `dimensions`, `magnetizations`**)** +::: :::{grid-item} -**magnet_sphere_Bfield(**`observers`, -`diameters`, `polarizations`**)** ::: +**magnet_sphere_Bfield(**`observers`, `diameters`, `polarizations`**)** +::: :::{grid-item} -**current_circle_Hfield(**`r0`, `r`, `z`, -`i0`**)** ::: +**current_circle_Hfield(**`r0`, `r`, `z`, `i0`**)** +::: :::{grid-item} -**current_polyline_Hfield(**`observers`, -`segments_start`, `segments_end`, -`currents`**)** ::: +**current_polyline_Hfield(**`observers`, `segments_start`, `segments_end`, `currents`**)** +::: -:::{grid-item} **dipole_Hfield(**`observers`, -`moments`**)** ::: +:::{grid-item} +**dipole_Hfield(**`observers`, `moments`**)** +::: :::{grid-item} -**triangle_Bfield(**`observers`, `vertices`, -`polarizations`**)** ::: +**triangle_Bfield(**`observers`, `vertices`, `polarizations`**)** +::: :::: -All inputs must be NumPy ndarrays of shape (n,x). Details can be found in the -respective function docstrings. The following example demonstrates the core -interface. +All inputs must be NumPy ndarrays of shape (n,x). Details can be found in the respective function docstrings. The following example demonstrates the core interface. + ```python import numpy as np import magpylib as magpy - # All inputs and outputs in SI units # Prepare input -z0 = np.array([1, 1]) -r = np.array([1, 1]) -z = np.array([2, 2]) +z0 = np.array([1,1]) +r = np.array([1,1]) +z = np.array([2,2]) # Compute field with core functions B = magpy.core.magnet_cylinder_axial_Bfield(z0=z0, r=r, z=z).T @@ -215,7 +170,6 @@ print(B) ## Field computation workflow -The Magpylib field computation internal workflow and different approaches of the -three interfaces is outlined in the following sketch. +The Magpylib field computation internal workflow and different approaches of the three interfaces is outlined in the following sketch. ![](../../../_static/images/docu_field_comp_flow.png) diff --git a/docs/_pages/user_guide/docs/docs_graphics.md b/docs/_pages/user_guide/docs/docs_graphics.md index 581cff36b..74ab19846 100644 --- a/docs/_pages/user_guide/docs/docs_graphics.md +++ b/docs/_pages/user_guide/docs/docs_graphics.md @@ -13,17 +13,12 @@ orphan: true --- (guide-graphics)= - # Graphic output (guide-graphics-show)= - ## 3D graphics with show -Once all Magpylib objects and their paths have been created, `show` creates a 3D -plot of the geometric arrangement using the Matplotlib (command line default) -and Plotly (notebook default) packages. `show` generates a new figure which is -automatically displayed. +Once all Magpylib objects and their paths have been created, `show` creates a 3D plot of the geometric arrangement using the Matplotlib (command line default) and Plotly (notebook default) packages. `show` generates a new figure which is automatically displayed. ```{code-cell} ipython3 import magpylib as magpy @@ -48,26 +43,16 @@ sensor = magpy.Sensor( magpy.show(magnet, current, dipole, sensor) ``` -Notice that objects and their paths are automatically assigned different colors. -The polarization of the magnet is displayed by default (Plotly and Pyvista) by -coloring the poles, which overwrites the object color. In Matplotlib the -polarization is by default displayed by an arrow. Current directions and dipole -objects are indicated by arrows and sensors are shown as tri-colored coordinate -cross with pixel as markers. +Notice that objects and their paths are automatically assigned different colors. The polarization of the magnet is displayed by default (Plotly and Pyvista) by coloring the poles, which overwrites the object color. In Matplotlib the polarization is by default displayed by an arrow. Current directions and dipole objects are indicated by arrows and sensors are shown as tri-colored coordinate cross with pixel as markers. -How objects are represented graphically (color, line thickness, etc.) is defined -by their [style properties](guide-graphic-styles). +How objects are represented graphically (color, line thickness, etc.) is defined by their [style properties](guide-graphic-styles). (guide-graphic-backends)= - ## Graphic backends -The graphic backend refers to the plotting library that is used for graphic -output. A plotting canvas refers to the frame/window/canvas/axes object the -graphic output is forwarded to. +The graphic backend refers to the plotting library that is used for graphic output. A plotting canvas refers to the frame/window/canvas/axes object the graphic output is forwarded to. -The graphic backend is set via the kwarg `backend` in the `show` function, which -is demonstrated in the following example +The graphic backend is set via the kwarg `backend` in the `show` function, which is demonstrated in the following example ```{code-cell} ipython3 import magpylib as magpy @@ -87,80 +72,64 @@ for backend in magpy.SUPPORTED_PLOTTING_BACKENDS: magpy.show(loop, cylinder, backend=backend) ``` -With the installation default setting, `backend='auto'`, Magpylib infers the -graphic backend from the environment running the code, or from the requested -canvas. +With the installation default setting, `backend='auto'`, Magpylib infers the graphic backend from the environment running the code, or from the requested canvas. | environment | canvas | inferred backend | -| ---------------- | ----------------------------------------------- | ---------------- | +|------------------|-------------------------------------------------|------------------| | Command-Line | `None` | `matplotlib` | | IPython notebook | `None` | `plotly` | | all | `matplotlib.axes.Axes` | `matplotlib` | | all | `plotly.graph_objects.Figure` or `FigureWidget` | `plotly` | | all | `pyvista.Plotter` | `pyvista` | -The library default can be changed, e.g. with the command -`magpy.defaults.display.backend = 'plotly'`. - -There is a high level of **feature parity**, however, not all graphic features -are supported by all backends, and not all graphic features work equally well, -so that [default style settings](guide-graphic-styles-default) differ slightly. -In addition, some common Matplotlib syntax (e.g. color `'r'`, linestyle `':'`) -is automatically translated to other backends. - -| Feature | Matplotlib | Plotly | Pyvista | -| :---------------------: | :--------: | :----: | :-----: | -| triangular mesh 3d | ✔️ | ✔️ | ✔️ | -| line 3d | ✔️ | ✔️ | ✔️ | -| line style | ✔️ | ✔️ | ❌ | -| line color | ✔️ | ✔️ | ✔️ | -| line width | ✔️ | ✔️ | ✔️ | -| marker 3d | ✔️ | ✔️ | ✔️ | -| marker color | ✔️ | ✔️ | ✔️ | -| marker size | ✔️ | ✔️ | ✔️ | -| marker symbol | ✔️ | ✔️ | ❌ | -| marker numbering | ✔️ | ✔️ | ❌ | -| zoom level | ✔️ | ✔️ | ❌[2] | -| magnetization color | ✔️[7] | ✔️ | ✔️ | -| animation | ✔️ | ✔️ | ✔️[5] | -| animation time | ✔️ | ✔️ | ✔️[5] | -| animation fps | ✔️ | ✔️ | ✔️[5] | -| animation slider | ✔️[1] | ✔️ | ❌ | -| subplots 2D | ✔️ | ✔️ | ✔️[6] | -| subplots 3D | ✔️ | ✔️ | ✔️ | -| user canvas | ✔️ | ✔️ | ✔️ | -| user extra 3d model [3] | ✔️ | ✔️ | ✔️[4] | +The library default can be changed, e.g. with the command `magpy.defaults.display.backend = 'plotly'`. + +There is a high level of **feature parity**, however, not all graphic features are supported by all backends, and not all graphic features work equally well, so that [default style settings](guide-graphic-styles-default) differ slightly. In addition, some common Matplotlib syntax (e.g. color `'r'`, linestyle `':'`) is automatically translated to other backends. + +| Feature | Matplotlib | Plotly | Pyvista | +|:------------------------:|:----------:|:------:|:-------:| +| triangular mesh 3d | ✔️ | ✔️ | ✔️ | +| line 3d | ✔️ | ✔️ | ✔️ | +| line style | ✔️ | ✔️ | ❌ | +| line color | ✔️ | ✔️ | ✔️ | +| line width | ✔️ | ✔️ | ✔️ | +| marker 3d | ✔️ | ✔️ | ✔️ | +| marker color | ✔️ | ✔️ | ✔️ | +| marker size | ✔️ | ✔️ | ✔️ | +| marker symbol | ✔️ | ✔️ | ❌ | +| marker numbering | ✔️ | ✔️ | ❌ | +| zoom level | ✔️ | ✔️ | ❌[2] | +| magnetization color | ✔️[7] | ✔️ | ✔️ | +| animation | ✔️ | ✔️ | ✔️[5] | +| animation time | ✔️ | ✔️ | ✔️[5] | +| animation fps | ✔️ | ✔️ | ✔️[5] | +| animation slider | ✔️[1] | ✔️ | ❌ | +| subplots 2D | ✔️ | ✔️ | ✔️[6] | +| subplots 3D | ✔️ | ✔️ | ✔️ | +| user canvas | ✔️ | ✔️ | ✔️ | +| user extra 3d model [3] | ✔️ | ✔️ | ✔️[4] | [1]: when returning animation object and exporting it as jshtml. [2]: possible but not implemented at the moment. -[3]: only `"scatter3d"`, and `"mesh3d"`. Gets "translated" to every other -backend. +[3]: only `"scatter3d"`, and `"mesh3d"`. Gets "translated" to every other backend. -[4]: custom user defined trace constructors allowed, which are specific to the -backend. +[4]: custom user defined trace constructors allowed, which are specific to the backend. [5]: animation is only available through export as `gif` or `mp4` -[6]: 2D plots are not supported for all jupyter_backends. As of pyvista>=0.38 -these are deprecated and replaced by the -[trame](https://docs.pyvista.org/api/plotting/trame.html) backend. +[6]: 2D plots are not supported for all jupyter_backends. As of pyvista>=0.38 these are deprecated and replaced by the [trame](https://docs.pyvista.org/api/plotting/trame.html) backend. -[7]: Matplotlib does not support color gradient. Instead magnetization is shown -through object slicing and coloring. +[7]: Matplotlib does not support color gradient. Instead magnetization is shown through object slicing and coloring. -`show` will also pass on all kwargs to the respective plotting backends. For -example, in the [animation sample code](guide-graphic-animations) the kwarg -`show_legend` is forwarded to the Plotly backend. +`show` will also pass on all kwargs to the respective plotting backends. For example, in the [animation sample code](guide-graphic-animations) the kwarg `show_legend` is forwarded to the Plotly backend. -(guide-graphics-canvas)= +(guide-graphics-canvas)= ## Plotting canvas -When calling `show`, a figure is automatically generated and displayed. It is -also possible to place the `show` output in a given figure using the `canvas` -argument. Consider the following Magpylib field computation, +When calling `show`, a figure is automatically generated and displayed. It is also possible to place the `show` output in a given figure using the `canvas` argument. Consider the following Magpylib field computation, ```{code-cell} ipython3 import magpylib as magpy @@ -172,13 +141,11 @@ sens = magpy.Sensor(position=np.linspace((0, 0, -0.1), (0, 0, 0.1), 100)) B = loop.getB(sens) ``` -The following examples demonstrate how to place the Magpylib `show` output in -figures created with the three supported graphic backends. +The following examples demonstrate how to place the Magpylib `show` output in figures created with the three supported graphic backends. +++ -In **Matplotlib** we combine a 2D-field plot with the 3D show output and modify -the 3D show output with a line. +In **Matplotlib** we combine a 2D-field plot with the 3D show output and modify the 3D show output with a line. ```{code-cell} ipython3 import magpylib as magpy @@ -215,8 +182,7 @@ When providing a canvas, no update to its layout is performed by Magpylib, unles +++ -In **Plotly** we combine a 2D-field plot with the 3D show output and modify the -3D show output with a line. +In **Plotly** we combine a 2D-field plot with the 3D show output and modify the 3D show output with a line. ```{code-cell} ipython3 import magpylib as magpy @@ -246,8 +212,7 @@ fig.add_scatter3d(x=(-0.1, 0.1), y=(0, 0), z=(0, 0), col=2, row=1) fig.show() ``` -**Pyvista** is not made for 2D plotting. Here we simply add a line to the 3D -show output. +**Pyvista** is not made for 2D plotting. Here we simply add a line to the 3D show output. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -269,12 +234,9 @@ pl.show() ``` (guide-graphics-return_fig)= - ## Return figure -Instead of forwarding a figure to an existing canvas, it is also possible to -return the figure object for further manipulation using the `return_fig` -command. In the following example this is demonstrated for the pyvista backend. +Instead of forwarding a figure to an existing canvas, it is also possible to return the figure object for further manipulation using the `return_fig` command. In the following example this is demonstrated for the pyvista backend. ```{code-cell} ipython3 import magpylib as magpy @@ -298,26 +260,16 @@ pl.show() ``` (guide-graphic-animations)= - ## Animation -The Magpylib [object paths](docs-position-paths) visualized with `show` can be -animated by setting the kwarg `animation=True`. This synergize specifically well -with the Plotly backend. +The Magpylib [object paths](docs-position-paths) visualized with `show` can be animated by setting the kwarg `animation=True`. This synergize specifically well with the Plotly backend. The animations can be fine-tuned with the following kwargs of `show`: - -1. `animation_time` (default=3), must be a positive number that gives the - animation time in seconds. -2. `animation_slider` (default=`True`), is boolean and sets if a slider should - be displayed. +1. `animation_time` (default=3), must be a positive number that gives the animation time in seconds. +2. `animation_slider` (default=`True`), is boolean and sets if a slider should be displayed. 3. `animation_fps` (default=30), sets the maximal frames per second. -Each path step will generate one frame of the animation, unless `animation_fps` -would be exceeded. In this case specific equidistant frames will be selected -automatically to adjust to the limited display possibilities. For practicality, -the input `animation=x` will automatically set `animation=True` and -`animation_time=x`. +Each path step will generate one frame of the animation, unless `animation_fps` would be exceeded. In this case specific equidistant frames will be selected automatically to adjust to the limited display possibilities. For practicality, the input `animation=x` will automatically set `animation=True` and `animation_time=x`. The following example demonstrates the animation feature, @@ -346,38 +298,27 @@ Even with some implemented fail safes, such as a maximum frame rate and frame co ``` (guide-graphics-subplots)= - ## Built-in Subplots -:::{versionadded} 4.4 Coupled subplots ::: +:::{versionadded} 4.4 +Coupled subplots +::: -It is often tedious to integrate the Magpylib `show` output into sub-plots as -shown above, especially when dealing with animations and combinations of 2D and -3D plots. +It is often tedious to integrate the Magpylib `show` output into sub-plots as shown above, especially when dealing with animations and combinations of 2D and 3D plots. -For this, Magpylib offers the possibility to show the sensor output along a path -in addition to the 3D-output, and to place 2D and 3D outputs in subplots. +For this, Magpylib offers the possibility to show the sensor output along a path in addition to the 3D-output, and to place 2D and 3D outputs in subplots. ### With show -All of this is achieved via the `show` function by passing input objects as -dictionaries with the arguments. +All of this is achieved via the `show` function by passing input objects as dictionaries with the arguments. 1. `objects`: list of Magpylib objects 2. `col`: int which selects the subplot column. Default is `col=1`. 3. `row`: int which selects the subplot row. Default is `row=1`. -4. `output`: string which selects the type of output that should be displayed in - this subplot. Options are - - 1. `"model3d"` is the default value and selects the 3D output. - 2. `"Xa"` selects a 2D line-plot of a field component (combination) as seen - by the sensor(s) along their path. The sensor(s) must be part of the - `objects` input. Here "X" selects the field and must be one of "BHJM", and - "a" selects the respective component combination and must be a subset of - "xyz". For example, `output=Hx` displays the x-component of the H-field, - or `output=Bxz` displays `sqrt(|Bx|² + |Bz|²)`. By default, source outputs - are summed up (`sumup=True`) and sensor pixels, are aggregated by mean - (`pixel_agg="mean"`). +4. `output`: string which selects the type of output that should be displayed in this subplot. Options are + + 1. `"model3d"` is the default value and selects the 3D output. + 2. `"Xa"` selects a 2D line-plot of a field component (combination) as seen by the sensor(s) along their path. The sensor(s) must be part of the `objects` input. Here "X" selects the field and must be one of "BHJM", and "a" selects the respective component combination and must be a subset of "xyz". For example, `output=Hx` displays the x-component of the H-field, or `output=Bxz` displays `sqrt(|Bx|² + |Bz|²)`. By default, source outputs are summed up (`sumup=True`) and sensor pixels, are aggregated by mean (`pixel_agg="mean"`). The following code demonstrates these features. @@ -401,8 +342,7 @@ magpy.show( ) ``` -Each input dictionary can contain kwargs, like `pixel_agg=None` or `sumup=False` -for 2D plots. +Each input dictionary can contain kwargs, like `pixel_agg=None` or `sumup=False` for 2D plots. ```{code-cell} ipython3 import magpylib as magpy @@ -435,15 +375,9 @@ magpy.show( ``` (guide-graphics-show_context)= - ### With show_context -To make the subplot syntax more convenient we introduced the `show_context` -native Python context manager. It allows to defer calls to the `show` function -while passing additional arguments. This is necessary for Magpylib to know how -many rows and columns are requested by the user, which single `show` calls do -not keep track of. All kwargs, e.g. `backend` are handed directly to the context -manager. +To make the subplot syntax more convenient we introduced the `show_context` native Python context manager. It allows to defer calls to the `show` function while passing additional arguments. This is necessary for Magpylib to know how many rows and columns are requested by the user, which single `show` calls do not keep track of. All kwargs, e.g. `backend` are handed directly to the context manager. The above example becomes: @@ -495,11 +429,7 @@ with magpy.show_context(): ### Coupled 2D/3D Animation -It is very helpful to combine 2D and 3D subplots in an animation that shows the -motion of the 3D system, while displaying the field at the respective path -instance at the same time. Unfortunately, it is quite tedious to create such -animations. The most powerful feature and main reason behind built-in subplots -is the ability to do just that with few lines of code. +It is very helpful to combine 2D and 3D subplots in an animation that shows the motion of the 3D system, while displaying the field at the respective path instance at the same time. Unfortunately, it is quite tedious to create such animations. The most powerful feature and main reason behind built-in subplots is the ability to do just that with few lines of code. ```{code-cell} ipython3 import magpylib as magpy @@ -521,10 +451,7 @@ with magpy.show_context(loop, sens, animation=True) as sc: ### Canvas length units -When displaying very small Magpylib objects, the axes scaling in meters might be -inadequate and you may want to use other units that fit the system dimensions -more nicely. The example below shows how to display an object (in this case the -same) with different length units and zoom levels. +When displaying very small Magpylib objects, the axes scaling in meters might be inadequate and you may want to use other units that fit the system dimensions more nicely. The example below shows how to display an object (in this case the same) with different length units and zoom levels. ```{tip} Setting `units_length="auto"` will infer the most suitable units based on the maximum range of the system. diff --git a/docs/_pages/user_guide/docs/docs_magpylib_force.md b/docs/_pages/user_guide/docs/docs_magpylib_force.md index 6a6e73c8d..71536f4af 100644 --- a/docs/_pages/user_guide/docs/docs_magpylib_force.md +++ b/docs/_pages/user_guide/docs/docs_magpylib_force.md @@ -13,11 +13,9 @@ kernelspec: --- (docs-magpylib-force)= - # Magpylib Force v0.3.1 -The package `magpylib-force` provides an addon for magnetic force and torque -computation between magpylib source objects. +The package `magpylib-force` provides an addon for magnetic force and torque computation between magpylib source objects. ## Installation @@ -29,59 +27,36 @@ pip install magpylib-force ## API -The package provides only a single top-level function -**getFT()** for computing force and torque. +The package provides only a single top-level function **getFT()** for computing force and torque. ```python import magpylib_force as mforce - mforce.getFT(sources, targets, anchor, eps=1e-5, squeeze=True) ``` -Here `sources` are Magpylib source objects that generate the magnetic field. The -`targets` are the objects on which the magnetic field of the sources acts to -generate force and torque. With current version 0.3.1 only `Cuboid`, `Cylinder`, -`CylinderSegment`, `Polyline`, and `Circle` objects can be targets. The `anchor` -denotes an anchor point which is the barycenter of the target. If no barycenter -is given, homogeneous mass density is assumed and the geometric center of the -target is chose as it's barycenter. `eps` refers to the finite difference length -when computing the magnetic field gradient and should be adjusted to be much -smaller than size of the system. `squeeze` can be used to squeeze the output -array dimensions as in Magpylib's `getB`, `getH`, `getJ`, and `getM`. - -The computation is based on numerically integrating the magnetic field generated -by the `sources` over the `targets`, see [here](docs-force-computation) for more -details. This requires that each target has a -**meshing** directive, which must be provided -via an attribute to the object. How `meshing` is defined: - -For all objects as an integer, which defines the target number of mesh-points. -In some cases an algorithm will attempt to come close to this number by -splitting up magnets into quasi-cubical cells. Exceptions are: - -- `Cuboid`: takes also a 3-vector that defines the number of equidistant splits - along each axis resulting in a rectangular regular grid. Keep in mind that the - accuracy is increased by cubical aspect ratios. -- `PolyLine`: defines the number of equidistant splits of each PolyLine segment, - not of the whole multi-segmented object. The total number of mesh-points will - be number of segments times meshing. - -The function `getFT()` returns force and torque as `np.ndarray` of shape (2,3), -or (t,2,3) when t targets are given. - -The following example code computes the force acting on a cuboid magnet, -generated by a current loop. +Here `sources` are Magpylib source objects that generate the magnetic field. The `targets` are the objects on which the magnetic field of the sources acts to generate force and torque. With current version 0.3.1 only `Cuboid`, `Cylinder`, `CylinderSegment`, `Polyline`, and `Circle` objects can be targets. The `anchor` denotes an anchor point which is the barycenter of the target. If no barycenter is given, homogeneous mass density is assumed and the geometric center of the target is chose as it's barycenter. `eps` refers to the finite difference length when computing the magnetic field gradient and should be adjusted to be much smaller than size of the system. `squeeze` can be used to squeeze the output array dimensions as in Magpylib's `getB`, `getH`, `getJ`, and `getM`. + +The computation is based on numerically integrating the magnetic field generated by the `sources` over the `targets`, see [here](docs-force-computation) for more details. This requires that each target has a **meshing** directive, which must be provided via an attribute to the object. How `meshing` is defined: + +For all objects as an integer, which defines the target number of mesh-points. In some cases an algorithm will attempt to come close to this number by splitting up magnets into quasi-cubical cells. Exceptions are: + +- `Cuboid`: takes also a 3-vector that defines the number of equidistant splits along each axis resulting in a rectangular regular grid. Keep in mind that the accuracy is increased by cubical aspect ratios. +- `PolyLine`: defines the number of equidistant splits of each PolyLine segment, not of the whole multi-segmented object. The total number of mesh-points will be number of segments times meshing. + +The function `getFT()` returns force and torque as `np.ndarray` of shape (2,3), or (t,2,3) when t targets are given. + +The following example code computes the force acting on a cuboid magnet, generated by a current loop. ```python import magpylib as magpy import magpylib_force as mforce # create source and target objects -loop = magpy.current.Circle(diameter=2e-3, current=10, position=(0, 0, -1e-3)) -cube = magpy.magnet.Cuboid(dimension=(1e-3, 1e-3, 1e-3), polarization=(1, 0, 0)) +loop = magpy.current.Circle(diameter=2e-3, current=10, position=(0,0,-1e-3)) +cube = magpy.magnet.Cuboid(dimension=(1e-3,1e-3,1e-3), polarization=(1,0,0)) # provide meshing for target object -cube.meshing = (5, 5, 5) +cube.meshing = (5,5,5) # compute force and torque FT = mforce.getFT(loop, cube) @@ -95,11 +70,9 @@ print(FT) ``` (docs-force-computation)= - ## Computation details -The force $\vec{F}_m$ acting on a magnetization distribution $\vec{M}$ in a -magnetic field $\vec{B}$ is given by +The force $\vec{F}_m$ acting on a magnetization distribution $\vec{M}$ in a magnetic field $\vec{B}$ is given by $$\vec{F}_m = \int \nabla (\vec{M}\cdot\vec{B}) \ dV.$$ @@ -107,20 +80,14 @@ The torque $\vec{T}_m$ which acts on the magnetization distribution is $$\vec{T}_m = \int \vec{M} \times \vec{B} \ dV.$$ -The force $\vec{F}_c$ which acts on a current distribution $\vec{j}$ in a -magnetic field is +The force $\vec{F}_c$ which acts on a current distribution $\vec{j}$ in a magnetic field is $$\vec{F}_c = \int \vec{j}\times \vec{B} \ dV.$$ -And there is no torque. However, one must not forget that a force, when applied -off-center, adds to the torque as +And there is no torque. However, one must not forget that a force, when applied off-center, adds to the torque as $$\vec{T}' = \int \vec{r} \times \vec{F} \ dV,$$ -where $\vec{r}$ points from the body barycenter to the position where the force -is applied. +where $\vec{r}$ points from the body barycenter to the position where the force is applied. -The idea behind `magplyib-force` is to compute the above integrals by -discretization. For this purpose, the target body is split up into small cells -using the object `meshing` attribute. The force and torque computation is -performed for all cells in a vectorized form, and the sum is returned. +The idea behind `magplyib-force` is to compute the above integrals by discretization. For this purpose, the target body is split up into small cells using the object `meshing` attribute. The force and torque computation is performed for all cells in a vectorized form, and the sum is returned. diff --git a/docs/_pages/user_guide/docs/docs_pos_ori.md b/docs/_pages/user_guide/docs/docs_pos_ori.md index 3def7f93b..0025c8f89 100644 --- a/docs/_pages/user_guide/docs/docs_pos_ori.md +++ b/docs/_pages/user_guide/docs/docs_pos_ori.md @@ -1,53 +1,44 @@ (docs-position)= - # Position, Orientation, and Paths -The following sections are detailed technical documentations of the Magpylib -position and orientation interface. Practical examples and good practice usage -is demonstrated in the tutorial {ref}`examples-tutorial-paths`. +The following secions are detiled technical documentations of the Magpylib position and orientation interface. Practical examples and good practice usage is demonstrated in the tutorial {ref}`examples-tutorial-paths`. -::::{grid} 2 :gutter: 2 +::::{grid} 2 +:gutter: 2 -:::{grid-item} :columns: 12 7 7 7 The analytical magnetic field expressions -found in the literature, implemented in the [Magpylib core](docs-field-core), -are given in native coordinates of the sources which is convenient for the -mathematical formulation. It is a common problem to transform the field into an -application relevant observer coordinate system. While not technically -difficult, such transformations are prone to error. ::: :::{grid-item} :columns: -12 5 5 5 ![](../../../_static/images/docu_position_sketch.png) ::: :::: +:::{grid-item} +:columns: 12 7 7 7 +The analytical magnetic field expressions found in the literature, implemented in the [Magpylib core](docs-field-core), are given in native coordinates of the sources which is convenient for the mathematical formulation. It is a common problem to transform the field into an application relevant observer coordinate system. While not technically difficult, such transformations are prone to error. +::: +:::{grid-item} +:columns: 12 5 5 5 +![](../../../_static/images/docu_position_sketch.png) +::: +:::: -Here Magpylib helps. All Magpylib sources and observers lie in a global -Cartesian coordinate system. Object position and orientation are defined by the -attributes `position` and `orientation`, 😏. Objects can easily be moved around -using the `move()` and `rotate()` methods. Eventually, the field is computed in -the reference frame of the observers (e.g. Sensor objects). Positions are given -in units of meter, and the default unit for orientation is °. +Here Magpylib helps. All Magpylib sources and observers lie in a global Cartesian coordinate system. Object position and orientation are defined by the attributes `position` and `orientation`, 😏. Objects can easily be moved around using the `move()` and `rotate()` methods. Eventually, the field is computed in the reference frame of the observers (e.g. Sensor objects). Positions are given in units of meter, and the default unit for orientation is °. (docs-position-paths)= - ## Position and orientation attributes -Position and orientation of all Magpylib objects are defined by the two -attributes - -::::{grid} 2 :gutter: 2 - -:::{grid-item-card} :shadow: none :columns: 12 5 5 5 -**position** - a point $(x,y,z)$ in the -global coordinates, or a set of such points $(\vec{P}_1, \vec{P}_2, ...)$. By -default objects are created with `position=(0,0,0)`. ::: :::{grid-item-card} -:shadow: none :columns: 12 7 7 7 -**orientation** - a -[Scipy Rotation object](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html) -which describes the object rotation relative to its default orientation (defined -in {ref}`docs-classes`). By default, objects are created with unit rotation -`orientation=None`. ::: :::: +Position and orientation of all Magpylib objects are defined by the two attributes + +::::{grid} 2 +:gutter: 2 + +:::{grid-item-card} +:shadow: none +:columns: 12 5 5 5 +**position** - a point $(x,y,z)$ in the global coordinates, or a set of such points $(\vec{P}_1, \vec{P}_2, ...)$. By default objects are created with `position=(0,0,0)`. +::: +:::{grid-item-card} +:shadow: none +:columns: 12 7 7 7 +**orientation** - a [Scipy Rotation object](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html) which describes the object rotation relative to its default orientation (defined in {ref}`docs-classes`). By default, objects are created with unit rotation `orientation=None`. +::: +:::: -The position and orientation attributes can be either **scalar**, i.e. a single -position or a single rotation, or **vector**, when they are arrays of such -scalars. The two attributes together define the **path** of an object - Magpylib -makes sure that they are always of the same length. When the field is computed, -it is automatically computed for the whole path. +The position and orientation attributes can be either **scalar**, i.e. a single position or a single rotation, or **vector**, when they are arrays of such scalars. The two attributes together define the **path** of an object - Magpylib makes sure that they are always of the same length. When the field is computed, it is automatically computed for the whole path. ```{tip} To enable vectorized field computation, paths should always be used when modeling multiple object positions. Avoid using Python loops at all costs for that purpose! If your path is difficult to realize, consider using the [functional interface](docs-field-functional) instead. @@ -57,136 +48,120 @@ To enable vectorized field computation, paths should always be used when modelin Magpylib offers two powerful methods for object manipulation: -::::{grid} 2 :gutter: 2 - -:::{grid-item-card} :columns: 12 5 5 5 :shadow: none -**move(**`displacement`, -`start="auto"`**)** - move object by -`displacement` input. `displacement` is a position vector (scalar input) or a -set of position vectors (vector input). ::: :::{grid-item-card} :columns: 12 7 7 -7 :shadow: none **rotate(**`rotation`, -`anchor=None`, `start="auto"`**)** - rotates -the object by the `rotation` input about an anchor point defined by the `anchor` -input. `rotation` is a -[Scipy Rotation object](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html), -and `anchor` is a position vector. Both can be scalar or vector inputs. With -`anchor=None` the object is rotated about its `position`. ::: :::: - -- **Scalar input** is applied to the whole object path, starting with path index - `start`. With the default `start="auto"` the index is set to `start=0` and the - functionality is **moving objects around** (incl. their whole paths). -- **Vector input** of length $n$ applies the $n$ individual operations to $n$ - object path entries, starting with path index `start`. Padding applies when - the input exceeds the existing path length. With the default `start="auto"` - the index is set to `start=len(object path)` and the functionality is - **appending the input**. - -The practical application of this formalism is best demonstrated by the -following program +::::{grid} 2 +:gutter: 2 + +:::{grid-item-card} +:columns: 12 5 5 5 +:shadow: none +**move(**`displacement`, `start="auto"`**)** - move object by `displacement` input. `displacement` is a position vector (scalar input) or a set of position vectors (vector input). +::: +:::{grid-item-card} +:columns: 12 7 7 7 +:shadow: none +**rotate(**`rotation`, `anchor=None`, `start="auto"`**)** - rotates the object by the `rotation` input about an anchor point defined by the `anchor` input. `rotation` is a [Scipy Rotation object](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html), and `anchor` is a position vector. Both can be scalar or vector inputs. With `anchor=None` the object is rotated about its `position`. +::: +:::: + +- **Scalar input** is applied to the whole object path, starting with path index `start`. With the default `start="auto"` the index is set to `start=0` and the functionality is **moving objects around** (incl. their whole paths). +- **Vector input** of length $n$ applies the $n$ individual operations to $n$ object path entries, starting with path index `start`. Padding applies when the input exceeds the existing path length. With the default `start="auto"` the index is set to `start=len(object path)` and the functionality is **appending the input**. + +The practical application of this formalism is best demonstrated by the following program ```python import magpylib as magpy - # Note that all units are in SI sensor = magpy.Sensor() -print(sensor.position) # Default value +print(sensor.position) # Default value # --> [0. 0. 0.] -sensor.move((1, 1, 1)) # Scalar input is by default applied -print(sensor.position) # to the whole path +sensor.move((1,1,1)) # Scalar input is by default applied +print(sensor.position) # to the whole path # --> [1. 1. 1.] -sensor.move([(1, 1, 1), (2, 2, 2)]) # Vector input is by default appended -print(sensor.position) # to the existing path +sensor.move([(1,1,1), (2,2,2)]) # Vector input is by default appended +print(sensor.position) # to the existing path # --> [[1. 1. 1.] [2. 2. 2.] [3. 3. 3.]] -sensor.move((1, 1, 1), start=1) # Scalar input and start=1 is applied -print(sensor.position) # to whole path starting at index 1 +sensor.move((1,1,1), start=1) # Scalar input and start=1 is applied +print(sensor.position) # to whole path starting at index 1 # --> [[1. 1. 1.] [3. 3. 3.] [4. 4. 4.]] -sensor.move([(0, 0, 10), (0, 0, 20)], start=1) # Vector input and start=1 merges -print(sensor.position) # the input with the existing path +sensor.move([(0,0,10), (0,0,20)], start=1) # Vector input and start=1 merges +print(sensor.position) # the input with the existing path # --> [[ 1. 1. 1.] [ 3. 3. 13.] [ 4. 4. 24.]] # starting at index 1. ``` -Several extensions of the `rotate` method give a lot of flexibility with object -rotation. They all feature the arguments `anchor` and `start` which work as -described above. - -::::{grid} 1 :gutter: 2 - -:::{grid-item-card} :columns: 12 :shadow: none -**rotate_from_angax(**`angle`, `axis`, -`anchor=None`, `start="auto"`, `degrees=True` -**)** - -- `angle`: scalar or array with shape (n). Angle(s) of rotation. -- `axis`: array of shape (3,) or string. The direction of the rotation axis. - String input can be 'x', 'y' or 'z' to denote respective directions. -- `degrees`: bool, default=True. Interpret angle input in units of deg (True) or - rad (False). ::: - -:::{grid-item-card} :columns: 12 :shadow: none -**rotate_from_rotvec(**`rotvec`, -`anchor=None`, `start="auto"`, `degrees=True` -**)** - -- `rotvec` : array with shape (n,3) or (3,). The rotation vector direction is - the rotation axis and the vector length is the rotation angle in units of deg. -- `degrees`: bool, default=True. Interpret angle input in units of deg (True) or - rad (False). ::: - -:::{grid-item-card} :columns: 12 :shadow: none -**rotate_from_euler(** `angle`, `seq`, -`anchor=None`, `start="auto"`, `degrees=True` -**)** - -- `angle`: scalar or array with shape (n). Angle(s) of rotation in units of deg - (by default). -- `seq` : string. Specifies sequence of axes for rotations. Up to 3 characters - belonging to the set {'X', 'Y', 'Z'} for intrinsic rotations, or {'x', 'y', - 'z'} for extrinsic rotations. Extrinsic and intrinsic rotations cannot be - mixed in one function call. -- `degrees`: bool, default=True. Interpret angle input in units of deg (True) or - rad (False). ::: - -:::{grid-item-card} :columns: 12 :shadow: none -**rotate_from_quat(**`quat`, `anchor=None`, -`start="auto"` **)** - -- `quat` : array with shape (n,4) or (4,). Rotation input in quaternion form. - ::: - -:::{grid-item-card} :columns: 12 :shadow: none -**rotate_from_mrp(**`matrix`, `anchor=None`, -`start="auto"` **)** - -- `matrix` : array with shape (n,3,3) or (3,3). Rotation matrix. See - scipy.spatial.transform.Rotation for details. ::: - -:::{grid-item-card} :columns: 12 :shadow: none -**rotate_from_mrp(**`mrp`, `anchor=None`, -`start="auto"` **)** - -- `mrp` : array with shape (n,3) or (3,). Modified Rodrigues parameter input. - See scipy Rotation package for details. ::: +Several extensions of the `rotate` method give a lot of flexibility with object rotation. They all feature the arguments `anchor` and `start` which work as described above. + +::::{grid} 1 +:gutter: 2 + +:::{grid-item-card} +:columns: 12 +:shadow: none +**rotate_from_angax(**`angle`, `axis`, `anchor=None`, `start="auto"`, `degrees=True` **)** +* `angle`: scalar or array with shape (n). Angle(s) of rotation. +* `axis`: array of shape (3,) or string. The direction of the rotation axis. String input can be 'x', 'y' or 'z' to denote respective directions. +* `degrees`: bool, default=True. Interpret angle input in units of deg (True) or rad (False). +::: + +:::{grid-item-card} +:columns: 12 +:shadow: none +**rotate_from_rotvec(**`rotvec`, `anchor=None`, `start="auto"`, `degrees=True` **)** +* `rotvec` : array with shape (n,3) or (3,). The rotation vector direction is the rotation axis and the vector length is the rotation angle in units of deg. +* `degrees`: bool, default=True. Interpret angle input in units of deg (True) or rad (False). +::: + +:::{grid-item-card} +:columns: 12 +:shadow: none +**rotate_from_euler(** `angle`, `seq`, `anchor=None`, `start="auto"`, `degrees=True` **)** +* `angle`: scalar or array with shape (n). Angle(s) of rotation in units of deg (by default). +* `seq` : string. Specifies sequence of axes for rotations. Up to 3 characters belonging to the set {'X', 'Y', 'Z'} for intrinsic rotations, or {'x', 'y', 'z'} for extrinsic rotations. Extrinsic and intrinsic rotations cannot be mixed in one function call. +* `degrees`: bool, default=True. Interpret angle input in units of deg (True) or rad (False). +::: + +:::{grid-item-card} +:columns: 12 +:shadow: none +**rotate_from_quat(**`quat`, `anchor=None`, `start="auto"` **)** +* `quat` : array with shape (n,4) or (4,). Rotation input in quaternion form. +::: + +:::{grid-item-card} +:columns: 12 +:shadow: none +**rotate_from_mrp(**`matrix`, `anchor=None`, `start="auto"` **)** +* `matrix` : array with shape (n,3,3) or (3,3). Rotation matrix. See scipy.spatial.transform.Rotation for details. +::: + +:::{grid-item-card} +:columns: 12 +:shadow: none +**rotate_from_mrp(**`mrp`, `anchor=None`, `start="auto"` **)** +* `mrp` : array with shape (n,3) or (3,). Modified Rodrigues parameter input. See scipy Rotation package for details. +::: :::: -When objects with different path lengths are combined, e.g. when computing the -field, the shorter paths are treated as static beyond their end to make the -computation sensible. Internally, Magpylib follows a philosophy of edge-padding -and end-slicing when adjusting paths. - -::::{grid} 2 :gutter: 2 - -:::{grid-item-card} :columns: 12 7 7 7 :shadow: none **Edge-padding:** whenever -path entries beyond the existing path length are needed the edge-entries of the -existing path are returned. This means that the object is “static” beyond its -existing path. ::: :::{grid-item-card} :columns: 12 5 5 5 :shadow: none -**End-slicing:** whenever a path is automatically reduced in length, Magpylib -will slice such that the ending of the path is kept. ::: :::: +When objects with different path lengths are combined, e.g. when computing the field, the shorter paths are treated as static beyond their end to make the computation sensible. Internally, Magpylib follows a philosophy of edge-padding and end-slicing when adjusting paths. + +::::{grid} 2 +:gutter: 2 + +:::{grid-item-card} +:columns: 12 7 7 7 +:shadow: none +**Edge-padding:** whenever path entries beyond the existing path length are needed the edge-entries of the existing path are returned. This means that the object is “static” beyond its existing path. +::: +:::{grid-item-card} +:columns: 12 5 5 5 +:shadow: none +**End-slicing:** whenever a path is automatically reduced in length, Magpylib will slice such that the ending of the path is kept. +::: +:::: -The tutorial {ref}`examples-tutorial-paths` shows intuitive good practice -examples of the important functionality described in this section. +The tutorial {ref}`examples-tutorial-paths` shows intuitive good practice examples of the important functionality described in this section. \ No newline at end of file diff --git a/docs/_pages/user_guide/docs/docs_styles.md b/docs/_pages/user_guide/docs/docs_styles.md index 80d9ed4bd..39075b285 100644 --- a/docs/_pages/user_guide/docs/docs_styles.md +++ b/docs/_pages/user_guide/docs/docs_styles.md @@ -13,36 +13,22 @@ orphan: true --- (guide-graphic-styles)= - # Graphic styles -The graphic styles define how Magpylib objects are displayed visually when -calling `show`. They can be fine-tuned and individualized to suit requirements -and taste. +The graphic styles define how Magpylib objects are displayed visually when calling `show`. They can be fine-tuned and individualized to suit requirements and taste. Graphic styles can be defined in various ways: -1. There is a **default style** setting which is applied when no other inputs - are made. -2. An **individual style** can be defined at object level. If the object is a - [Collection](guide-docs-classes-collections) it will apply its color to all - children. -3. Finally, styles that are defined in the `show` function call will override - all other settings. This is referred to as **local style override**. +1. There is a **default style** setting which is applied when no other inputs are made. +2. An **individual style** can be defined at object level. If the object is a [Collection](guide-docs-classes-collections) it will apply its color to all children. +3. Finally, styles that are defined in the `show` function call will override all other settings. This is referred to as **local style override**. The following sections describe these styling options and how to customize them. (guide-graphic-styles-default)= - ## Default style -The default style is stored in `magpylib.defaults.display.style`. Note that the -installation default styles differ slightly between different -[graphic backends](guide-graphic-backends) depending on their respective -capabilities. Specifically, the magnet magnetization in Matplotlib is displayed -with arrows by default, while it is displayed using a color scheme in Plotly and -Pyvista. The color scheme is also implemented in Matplotlib, but it is visually -unsatisfactory. +The default style is stored in `magpylib.defaults.display.style`. Note that the installation default styles differ slightly between different [graphic backends](guide-graphic-backends) depending on their respective capabilities. Specifically, the magnet magnetization in Matplotlib is displayed with arrows by default, while it is displayed using a color scheme in Plotly and Pyvista. The color scheme is also implemented in Matplotlib, but it is visually unsatisfactory. The default styles can be modified in three ways: @@ -50,15 +36,15 @@ The default styles can be modified in three ways: ```python magpy.defaults.display.style.magnet.magnetization.show = True -magpy.defaults.display.style.magnet.magnetization.color.mode = "bicolor" -magpy.defaults.display.style.magnet.magnetization.color.north = "grey" +magpy.defaults.display.style.magnet.magnetization.color.mode = 'bicolor' +magpy.defaults.display.style.magnet.magnetization.color.north = 'grey' ``` 2. By assigning a style dictionary with equivalent keys, ```python magpy.defaults.display.style.magnet = { - "magnetization": {"show": True, "color": {"north": "grey", "mode": "tricolor"}} + 'magnetization': {'show': True, 'color': {'north': 'grey', 'mode': 'tricolor'}} } ``` @@ -66,19 +52,12 @@ magpy.defaults.display.style.magnet = { ```python magpy.defaults.display.style.magnet.magnetization.update( - show=True, - color={ - "north": "grey", - "mode": "tricolor", - }, + 'show': True, + 'color': {'north'='grey', mode='tricolor',} ) ``` -All three examples result in the same default style. Once modified, the library -default can always be restored with the `magpylib.style.reset()` method. The -following practical example demonstrates how to create and set a user defined -magnet magnetization style as default. The chosen custom style combines a -3-color scheme with an arrow which points in the magnetization direction. +All three examples result in the same default style. Once modified, the library default can always be restored with the `magpylib.style.reset()` method. The following practical example demonstrates how to create and set a user defined magnet magnetization style as default. The chosen custom style combines a 3-color scheme with an arrow which points in the magnetization direction. ```{code-cell} ipython3 import magpylib as magpy @@ -131,24 +110,19 @@ The default Magpylib style abides by the tri-color scheme for ideal-typical magn A list of all style options can be found [here](examples-list-of-styles). + ## Magic underscore notation -To facilitate working with deeply nested properties, all style constructors and -object style methods support the "magic underscore notation". It enables -referencing nested properties by joining together multiple property names with -underscores. This feature mainly helps reduce the code verbosity and is heavily -inspired by the -[Plotly underscore notation](https://plotly.com/python/creating-and-updating-figures/#magic-underscore-notation)). +To facilitate working with deeply nested properties, all style constructors and object style methods support the "magic underscore notation". It enables referencing nested properties by joining together multiple property names with underscores. This feature mainly helps reduce the code verbosity and is heavily inspired by the [Plotly underscore notation](https://plotly.com/python/creating-and-updating-figures/#magic-underscore-notation)). With magic underscore notation, the previous examples can be written as: ```python import magpylib as magpy - magpy.defaults.display.style.magnet = { - "magnetization_show": True, - "magnetization_color_middle": "grey", - "magnetization_color_mode": "tricolor", + 'magnetization_show': True, + 'magnetization_color_middle': 'grey', + 'magnetization_color_mode': 'tricolor', } ``` @@ -156,33 +130,22 @@ or directly as named keywords in the `update` method as: ```python import magpylib as magpy - magpy.defaults.display.style.magnet.update( magnetization_show=True, - magnetization_color_middle="grey", - magnetization_color_mode="tricolor", + magnetization_color_middle='grey', + magnetization_color_mode='tricolor', ) ``` ## Individual style -Any Magpylib object can have its own individual style that will take precedence -over the default values when `show` is called. When setting individual styles, -the object family specifier such as `magnet` or `current` can be omitted. +Any Magpylib object can have its own individual style that will take precedence over the default values when `show` is called. When setting individual styles, the object family specifier such as `magnet` or `current` can be omitted. ```{note} -Users should be aware that the individual object style is organized in classes that take much longer to initialize than bare Magpylib objects, i.e. objects without individual style. This can lead to a computational bottleneck when setting individual styles of many Magpylib objects. For this reason Magpylib automatically defers style initialization until it is needed the first time, e.g. when calling the `show` function, so that object creation time is not affected. However, this works only if style properties are set at initialization (e.g.: `magpy.magnet.Cuboid(..., style_label="MyCuboid")`). While this effect may not be noticeable for a small number of objects, it is best to avoid setting styles until it is plotting time. +Users should be aware that the individual object style is organized in classes that take much longer to initialize than bare Magpylib objects, i.e. objects without individual style. This can lead to a computational bottleneck when setting individual styles of many Magpylib objects. For this reason Magpylib automatically defers style initialization until it is needed the first time, e.g. when calling the `show` function, so that object creatin time is not affected. However, this works only if style properties are set at initialization (e.g.: `magpy.magnet.Cuboid(..., style_label="MyCuboid")`). While this effect may not be noticeable for a small number of objects, it is best to avoid setting styles until it is plotting time. ``` -In the following example `cube` has no individual style, so the default style is -used. `cylinder` has an individual style set for `magnetization` which is a -tricolor scheme that will display the object color in the middle. The individual -style is set at object initialization (good practice), and it will be applied -only when `show` is called at the end of the example. Finally, `sphere` is also -given an individual style for `magnetization` that displays the latter using a -2-color scheme. In this case, however, the individual style is applied after -object initialization (bad practice), which results in style initialization -before it is needed. +In the following example `cube` has no individual style, so the default style is used. `cylinder` has an individual style set for `magnetization` which is a tricolor scheme that will display the object color in the middle. The individual style is set at object initialization (good practice), and it will be applied only when `show` is called at the end of the example. Finally, `sphere` is also given an individual style for `magnetization` that displays the latter using a 2-color scheme. In this case, however, the individual style is applied after object initialization (bad practice), which results in style initialization before it is needed. ```{code-cell} ipython3 import magpylib as magpy @@ -218,11 +181,7 @@ magpy.show(cube, cylinder, sphere, backend="plotly") ## Collection style -When displaying [Collection objects](guide-docs-classes-collections) their -`color` property will be assigned to all its children override the default color -cycle. In the following example this is demonstrated. Therefore, we make use of -the [Matplotlib backend](guide-graphic-backends) which displays magnet color by -default and shows the magnetization as an arrow rather than a color sequence. +When displaying [Collection objects](guide-docs-classes-collections) their `color` property will be assigned to all its children override the default color cycle. In the following example this is demonstrated. Therefore, we make use of the [Matplotlib backend](guide-graphic-backends) which displays magnet color by default and shows the magnetization as an arrow rather than a color sequence. ```{code-cell} ipython3 import magpylib as magpy @@ -245,32 +204,20 @@ coll = cube + cylinder magpy.show(coll, sphere, backend="matplotlib") ``` -In addition, it is possible to modify individual style properties of all -children, that cannot be set at Collection level, with the `set_children_styles` -method. Non-matching properties, e.g. magnetization color for children that are -currents, are simply ignored. +In addition, it is possible to modify individual style properties of all children, that cannot be set at Collection level, with the `set_children_styles` method. Non-matching properties, e.g. magnetization color for children that are currents, are simply ignored. ```{code-cell} ipython3 coll.set_children_styles(magnetization_color_south="blue") magpy.show(coll, sphere, backend="plotly") ``` -The child-styles are individual style properties of the collection object and -are not set as individual styles on each child-object. This means that when -displayed individually with `show`, the above child-objects will have Magpylib -default style. +The child-styles are individual style properties of the collection object and are not set as individual styles on each child-object. This means that when displayed individually with `show`, the above child-objects will have Magpylib default style. ## Local style override -Finally, it is possible to hand style input to the `show` function directly and -locally override all style properties for this specific `show` output. Default -or individual style attributes will not be modified. Such inputs must start with -the `style` prefix and the object family specifier must be omitted. Naturally -underscore magic is supported. +Finally, it is possible to hand style input to the `show` function directly and locally override all style properties for this specific `show` output. Default or individual style attributes will not be modified. Such inputs must start with the `style` prefix and the object family specifier must be omitted. Naturally underscore magic is supported. -In the following example the default `style.magnetization.show=True` is -overridden locally, so that object colors become visible instead of -magnetization colors in the Plotly backend. +In the following example the default `style.magnetization.show=True` is overridden locally, so that object colors become visible instead of magnetization colors in the Plotly backend. ```{code-cell} ipython3 import magpylib as magpy @@ -298,64 +245,30 @@ magpy.defaults.display.style.as_dict(flatten=True, separator=".") ``` (examples-own-3d-models)= - ## Custom 3D models -Each Magpylib object has a default 3D representation that is displayed with -`show`. It is possible to disable the default model and to provide Magpylib with -a custom model. - -There are several reasons why this can be of interest. For example, the -integration of a [custom source](guide-docs-classes-custom-source) object that -has its own geometry, to display a sensor in the form of a realistic package -provided in CAD form, representation of a -[Collection](guide-docs-classes-collections) as a parts holder, integration of -environmental parts to the Magpylib 3D plotting scene, or simply highlighting an -object when colors do not suffice. - -The default trace of a Magpylib object `obj` can simply be turned off using the -individual style command `obj.style.model3d.showdefault = False`. A custom 3D -model can be added using the function `obj.style.model3d.add_trace()`. The new -trace is then stored in the `obj.style.model3d.data` property. This property is -a list and it is possible to store multiple custom traces there. The default -style is not included in this property. It is instead inherently stored in the -Magpylib classes to enable visualization of the magnetization with a color -scheme. - -The input of `add_trace()` must be a `magpylib.graphics.Trace3d` object, or a -dictionary that contains all necessary information for generating a 3D model. -Because different plotting libraries require different directives, traces might -be bound to specific [backends](guide-graphic-backends). For example, a trace -dictionary might contain all information for Matplotlib to generate a 3D model -using the -[plot_surface](https://matplotlib.org/stable/plot_types/3D/surface3d_simple.html) -function. - -To enable visualization of custom objects with different graphic backends -Magpylib implements a **generic backend**. Traces defined in the generic backend -are translated to all other backends automatically. If a specific backend is -used, the model will only appear when called with the corresponding backend. +Each Magpylib object has a default 3D representation that is displayed with `show`. It is possible to disable the default model and to provide Magpylib with a custom model. + +There are several reasons why this can be of interest. For example, the integration of a [custom source](guide-docs-classes-custom-source) object that has its own geometry, to display a sensor in the form of a realistic package provided in CAD form, representation of a [Collection](guide-docs-classes-collections) as a parts holder, integration of environmental parts to the Magpylib 3D plotting scene, or simply highlighting an object when colors do not suffice. + +The default trace of a Magpylib object `obj` can simply be turned off using the individual style command `obj.style.model3d.showdefault = False`. A custom 3D model can be added using the function `obj.style.model3d.add_trace()`. The new trace is then stored in the `obj.style.model3d.data` property. This property is a list and it is possible to store multiple custom traces there. The default style is not included in this property. It is instead inherently stored in the Magpylib classes to enable visualization of the magnetization with a color scheme. + +The input of `add_trace()` must be a `magpylib.graphics.Trace3d` object, or a dictionary that contains all necessary information for generating a 3D model. Because different plotting libraries require different directives, traces might be bound to specific [backends](guide-graphic-backends). For example, a trace dictionary might contain all information for Matplotlib to generate a 3D model using the [plot_surface](https://matplotlib.org/stable/plot_types/3D/surface3d_simple.html) function. + +To enable visualization of custom objects with different graphic backends Magpylib implements a **generic backend**. Traces defined in the generic backend are translated to all other backends automatically. If a specific backend is used, the model will only appear when called with the corresponding backend. A trace-dictionary has the following keys: 1. `'backend'`: `'generic'`, `'matplotlib'` or `'plotly'` -2. `'constructor'`: name of the plotting constructor from the respective - backend, e.g. plotly `'Mesh3d'` or matplotlib `'plot_surface'` +2. `'constructor'`: name of the plotting constructor from the respective backend, e.g. plotly `'Mesh3d'` or matplotlib `'plot_surface'` 3. `'args'`: default `None`, positional arguments handed to constructor 4. `'kwargs'`: default `None`, keyword arguments handed to constructor -5. `'coordsargs'`: tells Magpylib which input corresponds to which coordinate - direction, so that geometric representation becomes possible. By default - `{'x': 'x', 'y': 'y', 'z': 'z'}` for the `'generic'` backend and Plotly - backend, and `{'x': 'args[0]', 'y': 'args[1]', 'z': 'args[2]'}` for the - Matplotlib backend. +5. `'coordsargs'`: tells Magpylib which input corresponds to which coordinate direction, so that geometric representation becomes possible. By default `{'x': 'x', 'y': 'y', 'z': 'z'}` for the `'generic'` backend and Plotly backend, and `{'x': 'args[0]', 'y': 'args[1]', 'z': 'args[2]'}` for the Matplotlib backend. 6. `'show'`: default `True`, toggle if this trace should be displayed 7. `'scale'`: default 1, object geometric scaling factor -8. `'updatefunc'`: default `None`, updates the trace parameters when `show` is - called. Used to generate dynamic traces. +8. `'updatefunc'`: default `None`, updates the trace parameters when `show` is called. Used to generate dynamic traces. -The following example shows how a trace is constructed using the generic backend -with the `Mesh3d` constructor. We create a `Sensor` object and replace its -default 3d model by a tetrahedron. +The following example shows how a trace is constructed using the generic backend with the `Mesh3d` constructor. We create a `Sensor` object and replace its default 3d model by a tetrahedron. ```{code-cell} ipython3 import magpylib as magpy @@ -390,10 +303,7 @@ for backend in magpy.SUPPORTED_PLOTTING_BACKENDS: magpy.show(sensor, backend=backend) ``` -As noted above, it is possible to have multiple user-defined traces that will be -displayed at the same time. The following example continuation demonstrates this -by adding two more traces using the `Scatter3d` constructor in the generic -backend. In addition, it showns how to copy and manipulate `Trace3d` objects. +As noted above, it is possible to have multiple user-defined traces that will be displayed at the same time. The following example continuation demonstrates this by adding two more traces using the `Scatter3d` constructor in the generic backend. In addition, it showns how to copy and manipulate `Trace3d` objects. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -428,8 +338,7 @@ magpy.show(sensor) ### Matplotlib constructors -The following examples show how to construct traces with `plot`, `plot_surface` -and `plot_trisurf`: +The following examples show how to construct traces with `plot`, `plot_surface` and `plot_trisurf`: ```{code-cell} ipython3 import matplotlib.pyplot as plt @@ -497,8 +406,7 @@ magpy.show(magnet, ball, mobius, backend="matplotlib") ## Pre-defined 3D models -Automatic trace generators are provided for several basic 3D models in -`magpylib.graphics.model3d`. They can be used as follows, +Automatic trace generators are provided for several basic 3D models in `magpylib.graphics.model3d`. They can be used as follows, ```{code-cell} ipython3 from magpylib import Collection @@ -562,11 +470,9 @@ obj0.show(obj1, obj2, obj3, obj4, obj5, backend="plotly") ``` ((guide-docs-style-cad))= - ## Adding a CAD model -The following code sample shows how a standard CAD model (\*.stl file) can be -transformed into a Magpylib `Trace3d` object. +The following code sample shows how a standard CAD model (*.stl file) can be transformed into a Magpylib `Trace3d` object. ```{note} The code below requires installation of the `numpy-stl` package. @@ -653,4 +559,4 @@ magpy.show(args, **kwargs, backend="plotly") ```{code-cell} ipython3 -``` +``` \ No newline at end of file diff --git a/docs/_pages/user_guide/docs/docs_units_types.md b/docs/_pages/user_guide/docs/docs_units_types.md index bba1f66a2..9d12b32e1 100644 --- a/docs/_pages/user_guide/docs/docs_units_types.md +++ b/docs/_pages/user_guide/docs/docs_units_types.md @@ -1,28 +1,30 @@ # Units and Types (guide-docs-units)= - ## Units -The important vacuum permeability $\mu_0$ is provided at the package top-level -**mu_0**. It's value is not $4 \pi 10^{-7}$ -since -[the redefinition of the SI base units](https://en.wikipedia.org/wiki/2019_redefinition_of_the_SI_base_units), -but a value close to it. - -For historical reasons Magpylib used non-SI units until Version 4. Starting with -version 5 all inputs and outputs are SI-based. - -::::{grid} 3 :::{grid-item} :columns: 1 ::: - -:::{grid-item} :columns: 10 | PHYSICAL QUANTITY | MAGPYLIB PARAMETER | UNITS -from v5| UNITS until v4| |:---:|:---:|:---:|:---:| | Magnetic Polarization -$\vec{J}$ | `polarization`, `getJ()` | **T** | - | | Magnetization $\vec{M}$ | -`magnetization`, `getM()` | **A/m** | mT | | Electric Current $i_0$ | `current` -| **A** | A | | Magnetic Dipole Moment $\vec{m}$ | `moment` | **A·m²** | mT·mm³ -| | B-field $\vec{B}$ | `getB()` | **T** | mT | | H-field $\vec{H}$ | `getH()` | -**A/m** | kA/m | | Length-inputs | `position`, `dimension`, `vertices`, ... | -**m** | mm | | Angle-inputs | `angle`, `dimension`, ... | **°** | ° | ::: +The important vacuum permeability $\mu_0$ is provided at the package top-level **mu_0**. It's value is not $4 \pi 10^{-7}$ since [the redefinition of the SI base units](https://en.wikipedia.org/wiki/2019_redefinition_of_the_SI_base_units), but a value close to it. + +For historical reasons Magpylib used non-SI units until Version 4. Starting with version 5 all inputs and outputs are SI-based. + +::::{grid} 3 +:::{grid-item} +:columns: 1 +::: + +:::{grid-item} +:columns: 10 +| PHYSICAL QUANTITY | MAGPYLIB PARAMETER | UNITS from v5| UNITS until v4| +|:---:|:---:|:---:|:---:| +| Magnetic Polarization $\vec{J}$ | `polarization`, `getJ()` | **T** | - | +| Magnetization $\vec{M}$ | `magnetization`, `getM()` | **A/m** | mT | +| Electric Current $i_0$ | `current` | **A** | A | +| Magnetic Dipole Moment $\vec{m}$ | `moment` | **A·m²** | mT·mm³ | +| B-field $\vec{B}$ | `getB()` | **T** | mT | +| H-field $\vec{H}$ | `getH()` | **A/m** | kA/m | +| Length-inputs | `position`, `dimension`, `vertices`, ... | **m** | mm | +| Angle-inputs | `angle`, `dimension`, ... | **°** | ° | +::: :::: @@ -35,7 +37,6 @@ The connection between the magnetic polarization J, the magnetization M and the ``` (guide-docs-io-scale-invariance)= - ## Arbitrary unit Convention ```{hint} @@ -46,6 +47,4 @@ In addition, `getB` returns the same unit as given by the `polarization` input. ## Types -Magpylib requires no special input format. All scalar types (`int`, `float`, -...) and vector types (`list`, `tuple`, `np.ndarray`, ... ) are accepted. -Magpylib returns everything as `np.ndarray`. +Magpylib requires no special input format. All scalar types (`int`, `float`, ...) and vector types (`list`, `tuple`, `np.ndarray`, ... ) are accepted. Magpylib returns everything as `np.ndarray`. \ No newline at end of file diff --git a/docs/_pages/user_guide/examples/examples_app_coils.md b/docs/_pages/user_guide/examples/examples_app_coils.md index b72cf7c5b..aebd64078 100644 --- a/docs/_pages/user_guide/examples/examples_app_coils.md +++ b/docs/_pages/user_guide/examples/examples_app_coils.md @@ -16,19 +16,11 @@ kernelspec: # Coils -In this example we show how to model air-coils, then combine two coils into a -Helmholtz-pair and visualize the homogeneity of the resulting magnetic field. A -nice explanation of coils and the magnetic field is given -[here](https://www.nagwa.com/en/explainers/186157825721/#:~:text=The%20magnetic%20field%20strength%2C%20%F0%9D%90%B5,%EF%8A%AD%20T%E2%8B%85m%2FA.). -With the code examples below you can easily compare Magpylib results to results -presented in this tutorial. +In this example we show how to model air-coils, then combine two coils into a Helmholtz-pair and visualize the homogeneity of the resulting magnetic field. A nice explanation of coils and the magnetic field is given [here](https://www.nagwa.com/en/explainers/186157825721/#:~:text=The%20magnetic%20field%20strength%2C%20%F0%9D%90%B5,%EF%8A%AD%20T%E2%8B%85m%2FA.). With the code examples below you can easily compare Magpylib results to results presented in this tutorial. ## Coil models -**Model 1:** The coil consists of multiple windings, each of which can be -modeled with a circular current loop which is realized by the `Circle` class. -The individual windings are combined into a `Collection` which itself behaves -like a single magnetic field source. +**Model 1:** The coil consists of multiple windings, each of which can be modeled with a circular current loop which is realized by the `Circle` class. The individual windings are combined into a `Collection` which itself behaves like a single magnetic field source. ```{code-cell} ipython3 import numpy as np @@ -46,9 +38,7 @@ for z in np.linspace(-8, 8, 16): coil1.show() ``` -**Model 2:** The coil is in reality more like a spiral, which can be modeled -using the `Polyline` class. However, a good spiral approximation requires many -small line segments, which makes the computation slower. +**Model 2:** The coil is in reality more like a spiral, which can be modeled using the `Polyline` class. However, a good spiral approximation requires many small line segments, which makes the computation slower. ```{code-cell} ipython3 import numpy as np @@ -64,11 +54,7 @@ coil2 = magpy.current.Polyline( coil2.show() ``` -**Model 3:** A [Helmholtz coil](https://en.wikipedia.org/wiki/Helmholtz_coil) is -a device for producing a region of nearly uniform magnetic field. It consists of -two coils on the same axis, carrying an equal electric current in the same -direction. In classical layouts, the distance between the coils is similar to -the coil radius. +**Model 3:** A [Helmholtz coil](https://en.wikipedia.org/wiki/Helmholtz_coil) is a device for producing a region of nearly uniform magnetic field. It consists of two coils on the same axis, carrying an equal electric current in the same direction. In classical layouts, the distance between the coils is similar to the coil radius. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -94,11 +80,7 @@ helmholtz.show() ## Plotting the field -Streamplot from Matplotlib is a powerful tool to outline the field lines. -However, it must be understood that streamplot shows only a projection of the -field onto the observation plane. All field components that point out of the -plane become invisible. In out example we choose symmetry planes, where the -perpendicular component is negligible. +Streamplot from Matplotlib is a powerful tool to outline the field lines. However, it must be understood that streamplot shows only a projection of the field onto the observation plane. All field components that point out of the plane become invisible. In out example we choose symmetry planes, where the perpendicular component is negligible. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -140,9 +122,7 @@ plt.show() ## Helmholtz field homogeneity -While the optimal solution is given by two current loops, real world -applications must deal with finite sizes and limited construction space. Here -Magpylib enables fast analysis of different possible geometries. +While the optimal solution is given by two current loops, real world applications must deal with finite sizes and limited construction space. Here Magpylib enables fast analysis of different possible geometries. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -179,4 +159,4 @@ plt.tight_layout() plt.show() ``` -Notice that in such finite sized arrangements the field is not very homogeneous. +Notice that in such finite sized arrangements the field is not very homogeneous. \ No newline at end of file diff --git a/docs/_pages/user_guide/examples/examples_app_end_of_shaft.md b/docs/_pages/user_guide/examples/examples_app_end_of_shaft.md index 916a465f3..f0fa70179 100644 --- a/docs/_pages/user_guide/examples/examples_app_end_of_shaft.md +++ b/docs/_pages/user_guide/examples/examples_app_end_of_shaft.md @@ -16,19 +16,9 @@ orphan: true # Magnetic Angle Sensor -End of shaft angle sensing is a classic example for a magnetic position system. -The goal is to determine the angular position of a rotating shaft. A magnet, -typically a diametrically magnetized cylinder, is mounted at the end of the -shaft. A 2D sensor is mounted below. When the shaft rotates the two sensor -outputs will be $s_1=B_0 sin(\varphi)$ and $s_2=B_0 cos(\varphi)$, so that the -angle is uniquely given by $\varphi = arctan_2(s_1,s_2)$. +End of shaft angle sensing is a classic example for a magnetic position system. The goal is to determine the angular position of a rotating shaft. A magnet, typically a diametrically magnetized cylinder, is mounted at the end of the shaft. A 2D sensor is mounted below. When the shaft rotates the two sensor outputs will be $s_1=B_0 sin(\varphi)$ and $s_2=B_0 cos(\varphi)$, so that the angle is uniquely given by $\varphi = arctan_2(s_1,s_2)$. -In the example below we show such a typical end-of-shaft system with a 2-pixel -sensor, that is commonly used to eliminate external stray fields. In addition, -we assume that the magnet is not perfectly mounted at the end of the shaft, but -slightly displaced to the side, which results in a wobble motion. Such -tolerances are easily implemented with Magpylib, they can be visualized and -their influence on the sensor output signal can be tested quickly. +In the example below we show such a typical end-of-shaft system with a 2-pixel sensor, that is commonly used to eliminate external stray fields. In addition, we assume that the magnet is not perfectly mounted at the end of the shaft, but slightly displaced to the side, which results in a wobble motion. Such tolerances are easily implemented with Magpylib, they can be visualized and their influence on the sensor output signal can be tested quickly. ```{code-cell} ipython3 import numpy as np diff --git a/docs/_pages/user_guide/examples/examples_app_halbach.md b/docs/_pages/user_guide/examples/examples_app_halbach.md index d7395c15e..90e4f1096 100644 --- a/docs/_pages/user_guide/examples/examples_app_halbach.md +++ b/docs/_pages/user_guide/examples/examples_app_halbach.md @@ -16,18 +16,13 @@ kernelspec: # Halbach Magnets -Magpylib is an excellent tool to create magnet assemblies. In this example we -will show how to model Halbach magnets. +Magpylib is an excellent tool to create magnet assemblies. In this example we will show how to model Halbach magnets. ```{note} In the following examples we make use of the [arbitrary unit convention](guide-docs-io-scale-invariance). ``` -The original Halbach-magnetization describes a hollow cylinder with a -polarization direction that rotates twice while going around the cylinder once. -In reality such polarizations are difficult to fabricate. What is commonly done -instead are "Discreete Halbach Arrays", which are magnet assemblies that -approximate a Halbach magnetization. +The original Halbach-magnetization describes a hollow cylinder with a polarization direction that rotates twice while going around the cylinder once. In reality such polarizations are difficult to fabricate. What is commonly done instead are "Discreete Halbach Arrays", which are magnet assemblies that approximate a Halbach magnetization. The following code creates a Discreete Halbach Cylinder generated from Cuboids: @@ -53,8 +48,7 @@ for a in angles: halbach.show(backend='plotly') ``` -Next we compute and display the field on an xy-grid in the symmetry plane using -the [matplotlib streamplot](examples-vis-mpl-streamplot) example. +Next we compute and display the field on an xy-grid in the symmetry plane using the [matplotlib streamplot](examples-vis-mpl-streamplot) example. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed diff --git a/docs/_pages/user_guide/examples/examples_app_scales.md b/docs/_pages/user_guide/examples/examples_app_scales.md index d5d723190..d07cd28cf 100644 --- a/docs/_pages/user_guide/examples/examples_app_scales.md +++ b/docs/_pages/user_guide/examples/examples_app_scales.md @@ -16,8 +16,7 @@ kernelspec: # Magnetic Scales -In this example we will show how magnetic scales can be constructed with -Magpylib for fast field computation. +In this example we will show how magnetic scales can be constructed with Magpylib for fast field computation. - reference to DS 91411 and 91479 - ideal-typical scales diff --git a/docs/_pages/user_guide/examples/examples_force_floating.md b/docs/_pages/user_guide/examples/examples_force_floating.md index fa247171e..25c28a323 100644 --- a/docs/_pages/user_guide/examples/examples_force_floating.md +++ b/docs/_pages/user_guide/examples/examples_force_floating.md @@ -16,26 +16,17 @@ kernelspec: # Floating Magnets -The examples here require installation of the -[magpylib-force package](https://pypi.org/project/magpylib-force/). See also the -[magpylib-force documentation](docs-magpylib-force). +The examples here require installaion of the [magpylib-force package](https://pypi.org/project/magpylib-force/). See also the [magpylib-force documentation](docs-magpylib-force). ## Formalism -With force and torque we can compute how a magnet moves in a magnetic field by -solving the equations of motion, +With force and torque we can compute how a magnet moves in a magnetic field by solving the equations of motion, $$ \vec{F} = \dot{\vec{p}} \ \text{and} \ \vec{T} = \dot{\vec{L}}$$ -with force $\vec{F}$, momentum $\vec{p}$, torque $\vec{T}$ and angular momentum -$\vec{L}$. +with force $\vec{F}$, momentum $\vec{p}$, torque $\vec{T}$ and angular momentum $\vec{L}$. -We implement a first order semi-implicit Euler method that is used to compute -[planetary motion](https://www.mgaillard.fr/2021/07/11/euler-integration.html). -The algorithm splits the computation into small subsequent time-steps -$\Delta t$, resulting in the following equations for the position $\vec{s}$, the -velocity $\vec{v} = \dot{\vec{s}}$, the rotation angle $\vec{\varphi}$ and the -angular velocity $\vec{\omega}$, +We implement a first order semi-implicit Euler method that is used to compute [planetary motion](https://www.mgaillard.fr/2021/07/11/euler-integration.html). The algorithm splits the computation into small subsequent time-steps $\Delta t$, resulting in the following equations for the position $\vec{s}$, the velocity $\vec{v} = \dot{\vec{s}}$, the rotation angle $\vec{\varphi}$ and the angular velocity $\vec{\omega}$, $$\vec{v}(t+\Delta t) = \vec{v}(t) + \frac{\Delta t}{m} \vec{F}(t)$$ @@ -47,9 +38,7 @@ $$\vec{\varphi} (t + \Delta t) = \vec{\varphi}(t) + \Delta t \cdot \vec{\omega} ## Magnet and Coil -In the following example we show an implementation of the proposed Euler scheme. -A cubical magnet is accelerated by a current loop along the z-axis as show in -the following sketch: +In the following example we show an implementation of the proposed Euler scheme. A cubical magnet is accelerated by a current loop along the z-axis as show in the following sketch: ```{figure} ../../../_static/images/examples_force_floating_coil-magnet.png :width: 40% @@ -59,12 +48,9 @@ the following sketch: A cubical magnet is accelerated by a current loop. ``` -Due to the symmetry of the problem there is no torque so we solve only the -translation part of the equations of motion. +Due to the symmetry of the problem there is no torque so we solve only the translation part of the equations of motion. -In the beginning, the magnet is at rest and slightly displaced in z-direction -from the center of the current loop. With time the magnet is accelerated and -it's z-position is displayed in the figure below. +In the beginning, the magnet is at rest and slightly displaced in z-direction from the center of the current loop. With time the magnet is accelerated and it's z-position is displayed in the figure below. ```{code-cell} ipython3 import numpy as np @@ -87,10 +73,10 @@ def timestep(source, target, dt): dt: Euler scheme length of timestep """ - + # compute force F, _ = getFT(source, target) - + # compute/set new velocity and position target.v = target.v + dt/target.m * F target.position = target.position + dt * target.v @@ -105,7 +91,7 @@ cube2 = cube1.copy(polarization=(0,0,-1)) # Compute motion for cube, lab in zip([cube1, cube2], ["attractive", "repulsive"]): - + # Set initial conditions cube.m = 1e-3 cube.position=(0,0,3e-3) @@ -130,13 +116,7 @@ plt.gca().set( plt.show() ``` -The simulation is made with two magnets with opposing polarizations. In the -"repulsive" case (orange) the magnetic moment of magnet and coil are -anti-parallel and the magnet is simply pushed away from the coil in positive -z-direction. In the "attractive" case (blue) the moments are parallel to each -other, and the magnet is accelerated towards the coil center. Due to inertia it -then comes out on the other side, and is again attracted towards the center -resulting in an oscillation. +The simulation is made with two magnets with opposing polarizations. In the "repulsive" case (orange) the magnetic moment of magnet and coil are anti-parallel and the magnet is simply pushed away from the coil in positive z-direction. In the "attractive" case (blue) the moments are parallel to each other, and the magnet is accelerated towards the coil center. Due to inertia it then comes out on the other side, and is again attracted towards the center resulting in an oscillation. ```{warning} This algorithm accumulates its error over time, which can be avoided by choosing smaller timesteps. @@ -144,9 +124,7 @@ This algorithm accumulates its error over time, which can be avoided by choosing ## Two-body problem -In the following example we demonstrate a fully dynamic simulation with two -magnetic bodies that rotate around each other, attracted towards each other by -the magnetic force, and repelled by the centrifugal force. +In the following example we demonstrate a fully dynamic simulation with two magnetic bodies that rotate around each other, attracted towards each other by the magnetic force, and repelled by the centrifugal force. ```{figure} ../../../_static/images/examples_force_floating_ringdown.png :width: 80% @@ -156,9 +134,7 @@ the magnetic force, and repelled by the centrifugal force. Two freely moving magnets rotate around each other. ``` -Contrary to the simple case above, we apply the Euler scheme also to the -rotation degrees of freedom, as the magnets will change their orientation while -they circle around each other. +Contrary to the simple case above, we apply the Euler scheme also to the rotation degrees of freedom, as the magnets will change their orientation while they circle around each other. ```{code-cell} ipython3 import numpy as np @@ -184,11 +160,11 @@ def timestep(source, target, dt): """ # compute force F, T = getFT(source, target) - + # compute/set new velocity and position target.v = target.v + dt/target.m * F target.position = target.position + dt * target.v - + # compute/set new angular velocity and rotation angle target.w = target.w + dt*target.orientation.apply(np.dot(target.I_inv, target.orientation.inv().apply(T))) target.orientation = R.from_rotvec(dt*target.w)*target.orientation @@ -225,11 +201,11 @@ for i in range(steps): fig, (ax1,ax2) = plt.subplots(2,1,figsize=(10,5)) for j,ls in enumerate(["-", "--"]): - + # Plot positions for i,a in enumerate("xyz"): ax1.plot(data[j,:,i], label= a + str(j+1), ls=ls) - + # Plot orientations for i,a in enumerate(["phi", "psi", "theta"]): ax2.plot(data[j+2,:,i], label= a + str(j+1), ls=ls) @@ -250,15 +226,9 @@ plt.tight_layout() plt.show() ``` -In the figure one can see, that the initial velocity is chosen so that the -magnets approach each other in a ringdown-like behavior. The magnets are -magnetically locked towards each other - both always show the same orientation. -However, given no initial angular velocity, the rotation angle is oscillating -several times while circling once. +In the figure one can see, that the initial velocity is chosen so that the magnets approach each other in a ringdown-like behavior. The magnets are magnetically locked towards each other - both always show the same orientation. However, given no initial angular velocity, the rotation angle is oscillating several times while circling once. -A video is helpful in this case to understand what is going on. From the -computation above, we build the following gif making use of this -[export-animation](examples-vis-exporting-animations) tutorial. +A video is helpful in this case to understand what is going on. From the computation above, we build the following gif making use of this [export-animation](examples-vis-exporting-animations) tutorial. ```{figure} ../../../_static/videos/example_force_floating_ringdown.gif :width: 60% @@ -266,4 +236,4 @@ computation above, we build the following gif making use of this :alt: animation of simulated magnet ringdown. Animation of above simulated magnet ringdown. -``` +``` \ No newline at end of file diff --git a/docs/_pages/user_guide/examples/examples_force_force.md b/docs/_pages/user_guide/examples/examples_force_force.md index f121e0656..342ab1338 100644 --- a/docs/_pages/user_guide/examples/examples_force_force.md +++ b/docs/_pages/user_guide/examples/examples_force_force.md @@ -16,16 +16,13 @@ kernelspec: # Magnetic Force and Torque -The `magpylib-force` extension provides force and torque computation between -Magpylib objects. A detailed description of the API and how the computation is -achieved can be found in the [user guide](docs-force-computation). +The `magpylib-force` extension provides force and torque computation between Magpylib objects. A detailed description of the API and how the computation is achieved can be found in the [user guide](docs-force-computation). ```{warning} [Scaling invariance](guide-docs-io-scale-invariance) does not hold for force computations! Be careful to provide the inputs in the correct units! ``` -In the following example we show how to compute force and torque between two -objects and how to represent it graphically. +In the following example we show how to compute force and torque between two objects and how to represent it graphically. ```{code-cell} ipython3 import pyvista as pv @@ -47,9 +44,7 @@ print(f"Force (blue): {[round(f) for f in F]} N") print(f"Torque (yellow): {[round(t) for t in T]} Nm") ``` -Force and torque are really strong in this example, because the magnet and the -coil are very large objects. With 0.7 m side length, the magnet has a Volume of -~1/3rd cubic meter :). +Force and torque are really strong in this example, because the magnet and the coil are very large objects. With 0.7 m side length, the magnet has a Volume of ~1/3rd cubic meter :). ```{code-cell} ipython3 # Example continued from above @@ -62,4 +57,4 @@ arrowT = pv.Arrow(start=(0,0,0), direction=T) pl.add_mesh(arrowT, color="yellow") pl.show() -``` +``` \ No newline at end of file diff --git a/docs/_pages/user_guide/examples/examples_force_holding_force.md b/docs/_pages/user_guide/examples/examples_force_holding_force.md index 1c482c080..d755e1d07 100644 --- a/docs/_pages/user_guide/examples/examples_force_holding_force.md +++ b/docs/_pages/user_guide/examples/examples_force_holding_force.md @@ -2,13 +2,9 @@ # Magnetic Holding Force -The examples here require installation of the -[magpylib-force package](https://pypi.org/project/magpylib-force/). See also the -[magpylib-force documentation](docs-magpylib-force). +The examples here require installaion of the [magpylib-force package](https://pypi.org/project/magpylib-force/). See also the [magpylib-force documentation](docs-magpylib-force). -With Magpylib-force it is possible to compute the holding force of a magnet -attached magnetically to a soft-ferromagnetic plate. The "pull-force" is the -opposing force that is required to detach the magnet from the surface. +With Magpylib-force it is possible to compute the holding force of a magnet attached magnetically to a soft-ferromagnetic plate. The "pull-force" is the opposing force that is required to detach the magnet from the surface. ```{figure} ../../../_static/images/examples_force_holding_force.png :width: 40% @@ -18,15 +14,9 @@ opposing force that is required to detach the magnet from the surface. Sketch of holding force F that must be overcome to detach the magnet from a soft-magnetic plate. ``` -For this we make use of the "magnetic mirror" effect, which is quite similar to -the well-known electrostatic "mirror-charge" model. The magnetic field of a -magnetic dipole moment that lies in front of a highly permeable surface is -similar to the field of two dipole moments: the original one and one that is -mirrored across the surface such that each "magnetic charge" that makes up the -dipole moment is mirrored in both position and charge. +For this we make use of the "magnetic mirror" effect, which is quite similar to the well-known electrostatic "mirror-charge" model. The magnetic field of a magnetic dipole moment that lies in front of a highly permeable surface is similar to the field of two dipole moments: the original one and one that is mirrored across the surface such that each "magnetic charge" that makes up the dipole moment is mirrored in both position and charge. -The following example computes the holding force of a Cuboid magnet using the -magnetic mirror effect. +The following example computes the holding force of a Cuboid magnet using the magnetic mirror effect. ```{code-block} python import magpylib as magpy @@ -47,10 +37,4 @@ print(f"Holding Force: {round(F[2]*100)} g") # Holding Force: 349 g ``` -Magnet dimensions and material from this example are taken from the -[web](https://www.supermagnete.at/quadermagnete-neodym/quadermagnet-5mm-2.5mm-1.5mm_Q-05-2.5-1.5-HN). -The remanence of N45 material lies within 1.32 and 1.36 T which corresponds to -the polarization, see also the -["Modeling a real magnet"](examples-tutorial-modeling-magnets) tutorial. The -computation confirms what is stated on the web-page, that the holding force of -this magnet is about 350 g. +Magnet dimensions and material from this example are taken from the [web](https://www.supermagnete.at/quadermagnete-neodym/quadermagnet-5mm-2.5mm-1.5mm_Q-05-2.5-1.5-HN). The remanence of N45 material lies within 1.32 and 1.36 T which corresponds to the polarization, see also the ["Modeling a real magnet"](examples-tutorial-modeling-magnets) tutorial. The computation confirms what is stated on the web-page, that the holding force of this magnet is about 350 g. diff --git a/docs/_pages/user_guide/examples/examples_index.md b/docs/_pages/user_guide/examples/examples_index.md index 579645fd0..7c4135d06 100644 --- a/docs/_pages/user_guide/examples/examples_index.md +++ b/docs/_pages/user_guide/examples/examples_index.md @@ -1,148 +1,255 @@ (examples)= - # Examples ## Tutorials -::::{grid} 2 3 4 4 :gutter: 4 - -:::{grid-item-card} {ref}`examples-tutorial-paths` :text-align: center :link: -examples-tutorial-paths :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_tutorial_paths.png ::: - -:::{grid-item-card} {ref}`examples-tutorial-field-computation` :text-align: -center :link: examples-tutorial-field-computation :link-type: ref :link-alt: -link to example :img-bottom: -../../../\_static/images/examples_icon_tutorial_field_computation.png ::: - -:::{grid-item-card} {ref}`examples-tutorial-collection` :text-align: center -:link: examples-tutorial-collection :link-type: ref :link-alt: link to example -:img-bottom: ../../../\_static/images/examples_icon_tutorial_collection.png ::: - -:::{grid-item-card} {ref}`examples-tutorial-custom` :text-align: center :link: -examples-tutorial-custom :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_tutorial_custom.png ::: - -:::{grid-item-card} {ref}`examples-tutorial-modeling-magnets` :text-align: -center :link: examples-tutorial-modeling-magnets :link-type: ref :link-alt: link -to example :img-bottom: -../../../\_static/images/examples_icon_tutorial_modeling_magnets.png ::: +::::{grid} 2 3 4 4 +:gutter: 4 + +:::{grid-item-card} {ref}`examples-tutorial-paths` +:text-align: center +:link: examples-tutorial-paths +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_tutorial_paths.png +::: + +:::{grid-item-card} {ref}`examples-tutorial-field-computation` +:text-align: center +:link: examples-tutorial-field-computation +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_tutorial_field_computation.png +::: + +:::{grid-item-card} {ref}`examples-tutorial-collection` +:text-align: center +:link: examples-tutorial-collection +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_tutorial_collection.png +::: + +:::{grid-item-card} {ref}`examples-tutorial-custom` +:text-align: center +:link: examples-tutorial-custom +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_tutorial_custom.png +::: + +:::{grid-item-card} {ref}`examples-tutorial-modeling-magnets` +:text-align: center +:link: examples-tutorial-modeling-magnets +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_tutorial_modeling_magnets.png +::: :::: -## Visualizations - -::::{grid} 2 3 4 4 :gutter: 4 -:::{grid-item-card} {ref}`examples-vis-magnet-colors` :text-align: center :link: -examples-vis-magnet-colors :link-type: ref :link-alt: link to example -:img-bottom: ../../../\_static/images/examples_icon_vis_magnet_colors.png ::: - -:::{grid-item-card} {ref}`examples-vis-animations` :text-align: center :link: -examples-vis-animations :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_vis_animations.png ::: +## Visualizations -:::{grid-item-card} {ref}`examples-vis-subplots` :text-align: center :link: -examples-vis-subplots :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_vis_subplots.png ::: +::::{grid} 2 3 4 4 +:gutter: 4 + +:::{grid-item-card} {ref}`examples-vis-magnet-colors` +:text-align: center +:link: examples-vis-magnet-colors +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_vis_magnet_colors.png +::: + +:::{grid-item-card} {ref}`examples-vis-animations` +:text-align: center +:link: examples-vis-animations +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_vis_animations.png +::: + +:::{grid-item-card} {ref}`examples-vis-subplots` +:text-align: center +:link: examples-vis-subplots +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_vis_subplots.png +::: + +:::{grid-item-card} {ref}`examples-vis-mpl-streamplot` +:text-align: center +:link: examples-vis-mpl-streamplot +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_vis_mpl_streamplot.png +::: + +:::{grid-item-card} {ref}`examples-vis-pv-streamlines` +:text-align: center +:link: examples-vis-pv-streamlines +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_vis_pv_streamlines.png +::: -:::{grid-item-card} {ref}`examples-vis-mpl-streamplot` :text-align: center -:link: examples-vis-mpl-streamplot :link-type: ref :link-alt: link to example -:img-bottom: ../../../\_static/images/examples_icon_vis_mpl_streamplot.png ::: -:::{grid-item-card} {ref}`examples-vis-pv-streamlines` :text-align: center -:link: examples-vis-pv-streamlines :link-type: ref :link-alt: link to example -:img-bottom: ../../../\_static/images/examples_icon_vis_pv_streamlines.png ::: :::: (examples-complex-magnet-shapes)= - ## Complex Magnet Shapes -::::{grid} 2 3 4 4 :gutter: 4 - -:::{grid-item-card} {ref}`examples-shapes-superpos` :text-align: center :link: -examples-shapes-superpos :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_shapes_superpos.png ::: - -:::{grid-item-card} {ref}`examples-shapes-convex-hull` :text-align: center -:link: examples-shapes-convex-hull :link-type: ref :link-alt: link to example -:img-bottom: ../../../\_static/images/examples_icon_shapes_convex_hull.png ::: - -:::{grid-item-card} {ref}`examples-shapes-triangle` :text-align: center :link: -examples-shapes-triangle :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_shapes_triangle.png ::: - -:::{grid-item-card} {ref}`examples-shapes-pyvista` :text-align: center :link: -examples-shapes-pyvista :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_shapes_pyvista.png ::: - -:::{grid-item-card} {ref}`examples-shapes-cad` :text-align: center :link: -examples-shapes-cad :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_shapes_cad.png ::: +::::{grid} 2 3 4 4 +:gutter: 4 + +:::{grid-item-card} {ref}`examples-shapes-superpos` +:text-align: center +:link: examples-shapes-superpos +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_shapes_superpos.png +::: + +:::{grid-item-card} {ref}`examples-shapes-convex-hull` +:text-align: center +:link: examples-shapes-convex-hull +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_shapes_convex_hull.png +::: + +:::{grid-item-card} {ref}`examples-shapes-triangle` +:text-align: center +:link: examples-shapes-triangle +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_shapes_triangle.png +::: + +:::{grid-item-card} {ref}`examples-shapes-pyvista` +:text-align: center +:link: examples-shapes-pyvista +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_shapes_pyvista.png +::: + +:::{grid-item-card} {ref}`examples-shapes-cad` +:text-align: center +:link: examples-shapes-cad +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_shapes_cad.png +::: :::: -## Miscellaneous - -::::{grid} 2 3 4 4 :gutter: 4 - -:::{grid-item-card} {ref}`examples-misc-compound` :text-align: center :link: -examples-misc-compound :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_misc_compound.png ::: -:::{grid-item-card} {ref}`examples-misc-field-interpolation` :text-align: center -:link: examples-misc-field-interpolation :link-type: ref :link-alt: link to -example :img-bottom: -../../../\_static/images/examples_icon_misc_field_interpolation.png ::: +## Miscellaneous -:::{grid-item-card} {ref}`examples-misc-inhom` :text-align: center :link: -examples-misc-inhom :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_misc_inhom.png ::: +::::{grid} 2 3 4 4 +:gutter: 4 + +:::{grid-item-card} {ref}`examples-misc-compound` +:text-align: center +:link: examples-misc-compound +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_misc_compound.png +::: + +:::{grid-item-card} {ref}`examples-misc-field-interpolation` +:text-align: center +:link: examples-misc-field-interpolation +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_misc_field_interpolation.png +::: + +:::{grid-item-card} {ref}`examples-misc-inhom` +:text-align: center +:link: examples-misc-inhom +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_misc_inhom.png +::: :::: -## Applications - -::::{grid} 2 3 4 4 :gutter: 4 - -:::{grid-item-card} {ref}`examples-app-end-of-shaft` :text-align: center :link: -examples-app-end-of-shaft :link-type: ref :link-alt: link to example -:img-bottom: ../../../\_static/images/examples_icon_app_end_of_shaft.png ::: -:::{grid-item-card} {ref}`examples-app-halbach` :text-align: center :link: -examples-app-halbach :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_app_halbach.png ::: - -:::{grid-item-card} {ref}`examples-app-helmholtz` :text-align: center :link: -examples-app-helmholtz :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_app_helmholtz.png ::: +## Applications -:::{grid-item-card} {ref}`examples-app-scales` :text-align: center :link: -examples-app-scales :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_WIP.png ::: +::::{grid} 2 3 4 4 +:gutter: 4 + +:::{grid-item-card} {ref}`examples-app-end-of-shaft` +:text-align: center +:link: examples-app-end-of-shaft +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_app_end_of_shaft.png +::: + +:::{grid-item-card} {ref}`examples-app-halbach` +:text-align: center +:link: examples-app-halbach +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_app_halbach.png +::: + +:::{grid-item-card} {ref}`examples-app-helmholtz` +:text-align: center +:link: examples-app-helmholtz +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_app_helmholtz.png +::: + +:::{grid-item-card} {ref}`examples-app-scales` +:text-align: center +:link: examples-app-scales +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_WIP.png +::: :::: ## Magpylib-Force -::::{grid} 2 3 4 4 :gutter: 4 - -:::{grid-item-card} {ref}`examples-force-force` :text-align: center :link: -examples-force-force :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_force_force.png ::: - -:::{grid-item-card} {ref}`examples-force-holding-force` :text-align: center -:link: examples-force-holding-force :link-type: ref :link-alt: link to example -:img-bottom: ../../../\_static/images/examples_icon_force_holding_force.png ::: - -:::{grid-item-card} {ref}`examples-force-floating` :text-align: center :link: -examples-force-floating :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_force_floating.png ::: +::::{grid} 2 3 4 4 +:gutter: 4 + +:::{grid-item-card} {ref}`examples-force-force` +:text-align: center +:link: examples-force-force +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_force_force.png +::: + +:::{grid-item-card} {ref}`examples-force-holding-force` +:text-align: center +:link: examples-force-holding-force +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_force_holding_force.png +::: + +:::{grid-item-card} {ref}`examples-force-floating` +:text-align: center +:link: examples-force-floating +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_force_floating.png +::: :::: + ```{toctree} :maxdepth: 2 :hidden: @@ -178,3 +285,4 @@ examples_force_force.md examples_force_holding_force.md examples_force_floating.md ``` + diff --git a/docs/_pages/user_guide/examples/examples_misc_compound.md b/docs/_pages/user_guide/examples/examples_misc_compound.md index d2608e3e8..6f2616d6f 100644 --- a/docs/_pages/user_guide/examples/examples_misc_compound.md +++ b/docs/_pages/user_guide/examples/examples_misc_compound.md @@ -16,19 +16,11 @@ orphan: true # Compounds -The `Collection` class is a powerful tool for grouping and tracking object -assemblies. However, it is often convenient to have assembly parameters -themselves, like number of magnets, as variables. This is achieved by -sub-classing `Collection`. We refer to such classes as "**Compounds**" and show -how to seamlessly integrate them into Magpylib. +The `Collection` class is a powerful tool for grouping and tracking object assemblies. However, it is often convenient to have assembly parameters themselves, like number of magnets, as variables. This is achieved by sub-classing `Collection`. We refer to such classes as "**Compounds**" and show how to seamlessly integrate them into Magpylib. ## Subclassing collections -In the following example we design a compound class `MagnetRing` which -represents a ring of cuboid magnets with the parameter `cubes` that should refer -to the number of magnets on the ring. The ring will automatically adjust its -size when `cubes` is modified, including an additionally added encompassing 3D -model that may, for example, represent a mechanical magnet holder. +In the following example we design a compound class `MagnetRing` which represents a ring of cuboid magnets with the parameter `cubes` that should refer to the number of magnets on the ring. The ring will automatically adjust its size when `cubes` is modified, including an additionally added encompassing 3D model that may, for example, represent a mechanical magnet holder. ```{code-cell} ipython3 import magpylib as magpy @@ -95,8 +87,7 @@ class MagnetRing(magpy.Collection): return self ``` -This new `MagnetRing` class seamlessly integrates into Magpylib and makes use of -the position and orientation interface, field computation and graphic display. +This new `MagnetRing` class seamlessly integrates into Magpylib and makes use of the position and orientation interface, field computation and graphic display. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -133,15 +124,9 @@ magpy.show(ring, sensor, backend='plotly') ## Postponed trace construction -In the above example, the trace is constructed in `_update`, every time the -parameter `cubes` is modified. This can lead to an unwanted computational -overhead, especially as the construction is only necessary for graphical -representation. +In the above example, the trace is constructed in `_update`, every time the parameter `cubes` is modified. This can lead to an unwanted computational overhead, especially as the construction is only necessary for graphical representation. -To make our compounds ready for heavy computation, while retaining Magpylib -graphic possibilities, it is possible to provide a trace which will only be -constructed when `show` is called. The following modification of the above -example demonstrates this: +To make our compounds ready for heavy computation, while retaining Magpylib graphic possibilities, it is possible to provide a trace which will only be constructed when `show` is called. The following modification of the above example demonstrates this: ```{code-cell} ipython3 class MagnetRingAdv(magpy.Collection): @@ -206,8 +191,7 @@ class MagnetRingAdv(magpy.Collection): return trace ``` -We have removed the trace construction from the `_update` method, and instead -provided `_custom_trace3d` as a callable. +We have removed the trace construction from the `_update` method, and instead provided `_custom_trace3d` as a callable. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -219,5 +203,4 @@ ring1 = MagnetRingAdv() %time for _ in range(10): ring1.cubes=10 ``` -This example is not very impressive because the provided trace is not very -heavy. +This example is not very impressive because the provided trace is not very heavy. diff --git a/docs/_pages/user_guide/examples/examples_misc_field_interpolation.md b/docs/_pages/user_guide/examples/examples_misc_field_interpolation.md index 976c88bd8..63a779352 100644 --- a/docs/_pages/user_guide/examples/examples_misc_field_interpolation.md +++ b/docs/_pages/user_guide/examples/examples_misc_field_interpolation.md @@ -16,21 +16,16 @@ orphan: true # Field Interpolation -There are several reasons for working with field interpolations rather than -computing the field on demand. +There are several reasons for working with field interpolations rather than computing the field on demand. 1. Very large grids take a lot of time to compute, even with Magpylib. -2. The field might not be accessible through Magpylib, e.g. when demagnetization - is included, but it can be computed with a 3rd party FE tool or is the result - of an experiment. +2. The field might not be accessible through Magpylib, e.g. when demagnetization is included, but it can be computed with a 3rd party FE tool or is the result of an experiment. -Combining field interpolation and `CustomSource` enables integration of -pre-computed solutions. In the following example we show how this can be done. +Combining field interpolation and `CustomSource` enables integration of pre-computed solutions. In the following example we show how this can be done. ## Interpolation -We start by defining a 3D vector-field interpolation function relying on Scipy -`RegularGridInterpolator`. +We start by defining a 3D vector-field interpolation function relying on Scipy `RegularGridInterpolator`. ```{code-cell} ipython3 import numpy as np @@ -89,11 +84,7 @@ def interpolation(observer, data, method="linear", bounds_error=False, fill_valu ## CustomSource with Interpolation Field -In the second step we create a custom source with an interpolated field -`field_func` input. The data for the interpolation is generated from the -Magpylib `Cuboid` field, which makes it easy to verify the approach afterwards. -To the custom source a nice 3D model is added that makes it possible to display -it and the cuboid at the same time. +In the second step we create a custom source with an interpolated field `field_func` input. The data for the interpolation is generated from the Magpylib `Cuboid` field, which makes it easy to verify the approach afterwards. To the custom source a nice 3D model is added that makes it possible to display it and the cuboid at the same time. ```{code-cell} ipython3 # Create data for interpolation @@ -127,10 +118,7 @@ magpy.show(custom, cube, zoom=1, backend="matplotlib") ## Testing Interpolation Accuracy -Finally, we compare the "exact" field of the cuboid source with the interpolated -field of the custom source. For this purpose, a sensor is added and a generic -rotation is applied to the sources. Naturally there is some error that can be -reduced by increasing the interpolation grid finesse. +Finally, we compare the "exact" field of the cuboid source with the interpolated field of the custom source. For this purpose, a sensor is added and a generic rotation is applied to the sources. Naturally there is some error that can be reduced by increasing the interpolation grid finesse. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed diff --git a/docs/_pages/user_guide/examples/examples_misc_inhom.md b/docs/_pages/user_guide/examples/examples_misc_inhom.md index 038406da1..4f12f9669 100644 --- a/docs/_pages/user_guide/examples/examples_misc_inhom.md +++ b/docs/_pages/user_guide/examples/examples_misc_inhom.md @@ -16,24 +16,11 @@ kernelspec: # Inhomogeneous Magnetization -The analytical expressions implemented in Magpylib treat only simple homogeneous -polarizations. When dealing with high-grade materials that are magnetized in -homogeneous fields this is a good approximation. However, there are many cases -where such a homogeneous model is not justified. The tutorial -{ref}`examples-tutorial-modeling-magnets` and the user-guide -{ref}`guide-physics-demag` provide some insights on this topic. - -Here we show how to deal with inhomogeneous polarization based on a commonly -misunderstood example of a cylindrical quadrupol magnet. While graphical -representations of such magnets usually depict only four poles, see -{ref}`examples-vis-magnet-colors`, such magnets exhibit complex polarization -given by the magnetization device that is used to magnetize them. - -The following code shows how the field of such a magnetization device would look -like and what magnetization field it produces. To realize a Cylindrical -Quadrupole magnet there are four coils with ferromagnetic cores involved, -arranged in circle around the magnet. In the example, coils and cores are -modeled by Cuboid magnets. +The analytical expressions implemented in Magpylib treat only simple homogeneous polarizations. When dealing with high-grade materials that are magnetized in homogeneous fields this is a good approximation. However, there are many cases where such a homogeneous model is not justified. The tutorial {ref}`examples-tutorial-modeling-magnets` and the user-guide {ref}`guide-physics-demag` provide some insights on this topic. + +Here we show how to deal with inhomogeneous polarization based on a commonly misunderstood example of a cylindrical quadrupol magnet. While graphical representations of such magnets usually depict only four poles, see {ref}`examples-vis-magnet-colors`, such magnets exhibit complex polarization given by the magnetization device that is used to magnetize them. + +The following code shows how the field of such a magnetization device would look like and what magnetization field it produces. To relize a Cylindrical Quadrupole magnert there are four coils with ferromagnetic cores involved, arranged in circle around the magnet. In the example, coils and cores are modeled by Cuboid magnets. ```{note} While Magpylib uses SI units by default, in this example we make use of [scaling invariance](guide-docs-io-scale-invariance) and consider arbitrary input length units. For this example millimeters are sensible. @@ -102,16 +89,7 @@ plt.tight_layout() plt.show() ``` -It can be assumed that the polarization that is written into the unmagnetized -Cylinder will, in a lowest order approximation, follow the magnetic field -generated by the magnetization tool. To create a Cylinder magnet with such a -polarization pattern we apply the -[superposition principle](examples-shapes-superpos) and approximate the -inhomogneous polarization as the sum of multiple small homogeneous cells using -the `CylinderSegment` class. Splitting up the Cylinder into many cells is easily -done by hand, but for practicality we make use of the -[magpylib-material-response](https://pypi.org/project/magpylib-material-response/) -package which provides an excellent function for this purpose. +It can be assumed that the polarization that is written into the unmagnetized Cylinder will, in a lowest order approximation, follow the magnetic field generated by the magnetization tool. To create a Cylinder magnet with such a polarization pattern we apply the [superposition principle](examples-shapes-superpos) and approximate the inhomogneous polarization as the sum of multiple small homogeneous cells using the `CylinderSegment` class. Splitting up the Cylinder into many cells is easily done by hand, but for practicality we make use of the [magpylib-material-response](https://pypi.org/project/magpylib-material-response/) package which provides an excellent function for this purpose. ```{code-cell} ipython # Continuation from above - ensure previous code is executed @@ -158,13 +136,6 @@ plt.tight_layout() plt.show() ``` -The color on the right-hand-side corresponds to the angle of orientation of the -material polarization. Increasing the mesh finesse will improve the -approximation but slow down any field computation at the same time. +The color on the right-hand-side corresponds to the angle of orientation of the material polarization. Increasing the mesh finesse will improve the approximation but slow down any field computation at the same time. -**What is the purpose of this example ?** In addition to demonstrating how -inhomogeneous polarizations can be modeled, this example should raise awareness -that many magnets can look simple on a data sheet (color pattern) but may have -an inhomogeneous, complex, unknown polarization distribution. It goes without -saying that the magnetic field generated by such a magnet, for example in an -angle sensing application, will depend strongly on the polarization. +**What is the purpose of this example ?** In addition to demonstrating how inhomogeneous polarizations can be modeled, this example should raise awareness that many magnets can look simple on a data sheet (color pattern) but may have an inhomogeneous, complex, unknown polarization distribution. It goes without saying that the magnetic field generated by such a magnet, for example in an angle sensing application, will depend strongly on the polarization. diff --git a/docs/_pages/user_guide/examples/examples_shapes_cad.md b/docs/_pages/user_guide/examples/examples_shapes_cad.md index b865db9f9..41615f458 100644 --- a/docs/_pages/user_guide/examples/examples_shapes_cad.md +++ b/docs/_pages/user_guide/examples/examples_shapes_cad.md @@ -16,10 +16,7 @@ kernelspec: # Magnets from CAD -The easiest way to create complex magnet shapes from CAD files is through -Pyvista using the [TriangularMesh class](docu-magpylib-api-trimesh). Pyvista -supports \*.stl files, and any open CAD file format is easily transformed to -stl. +The easiest way to create complex magnet shapes from CAD files is through Pyvista using the [TriangularMesh class](docu-magpylib-api-trimesh). Pyvista supports *.stl files, and any open CAD file format is easily transformed to stl. ```{warning} CAD files might include many Triangles, especially when dealing with round sides and edges, that do not significantly contribute to the field and will slow down the Magpylib computation. diff --git a/docs/_pages/user_guide/examples/examples_shapes_convex_hull.md b/docs/_pages/user_guide/examples/examples_shapes_convex_hull.md index b706a57f4..69f493834 100644 --- a/docs/_pages/user_guide/examples/examples_shapes_convex_hull.md +++ b/docs/_pages/user_guide/examples/examples_shapes_convex_hull.md @@ -16,14 +16,9 @@ orphan: true # Convex Hull -In geometry the convex hull of a point cloud is the smallest convex shape that -contains all points, see [Wikipedia](https://en.wikipedia.org/wiki/Convex_hull). - -Magpylib offers construction of convex hull magnets by combining the -`magpylib.magnets.TriangularMesh` and the -[scipy.spatial.ConvexHull](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.ConvexHull.html) -classes via the class method `from_ConvexHull`. Note, that the Scipy method does -not guarantee correct face orientations if `reorient_faces` is disabled. +In geometry the convex hull of a point cloud is the smallest convex shape that contains all points, see [Wikipedia](https://en.wikipedia.org/wiki/Convex_hull). + +Magpylib offers construction of convex hull magnets by combining the `magpylib.magnets.TriangularMesh` and the [scipy.spatial.ConvexHull](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.ConvexHull.html) classes via the class method `from_ConvexHull`. Note, that the Scipy method does not guarantee correct face orientations if `reorient_faces` is disabled. ## Pyramid magnet diff --git a/docs/_pages/user_guide/examples/examples_shapes_pyvista.md b/docs/_pages/user_guide/examples/examples_shapes_pyvista.md index e29b69f21..d4bf7763d 100644 --- a/docs/_pages/user_guide/examples/examples_shapes_pyvista.md +++ b/docs/_pages/user_guide/examples/examples_shapes_pyvista.md @@ -16,10 +16,7 @@ orphan: true # Pyvista Bodies -[Pyvista](https://docs.pyvista.org/version/stable/) is a powerful open-source -tool for the creation and visualization of meshes. Pyvista `PolyData` objects -can be directly transformed into Magpylib `TriangularMesh` magnets via the -classmethod `from_pyvista`. +[Pyvista](https://docs.pyvista.org/version/stable/) is a powerful open-source tool for the creation and visualization of meshes. Pyvista `PolyData` objects can be directly transformed into Magpylib `TriangularMesh` magnets via the classmethod `from_pyvista`. ```{note} The Pyvista library used in the following examples is not automatically installed with Magpylib. A Pyvista installation guide is found [here](https://docs.pyvista.org/getting-started/installation.html). @@ -53,10 +50,7 @@ with magpy.show_context(dodec, sens, backend='plotly') as s: ## Boolean operations with Pyvista -With Pyvista it is possible to build complex shapes with boolean geometric -operations. However, such operations often result in open and disconnected -meshes that require some refinement to produce solid magnets. The following -example demonstrates the problem, how to analyze and fix it. +With Pyvista it is possible to build complex shapes with boolean geometric operations. However, such operations often result in open and disconnected meshes that require some refinement to produce solid magnets. The following example demonstrates the problem, how to analyze and fix it. ```{code-cell} ipython3 import pyvista as pv @@ -89,13 +83,10 @@ magnet.show( ) ``` -The result cannot be used for magnetic field computation. Even if all faces were -present, the reorient-faces algorithm would fail when these faces are -disconnected. Such problems can be fixed by +The result cannot be used for magnetic field computation. Even if all faces were present, the reorient-faces algorithm would fail when these faces are disconnected. Such problems can be fixed by 1. giving Pyvista a finer mesh to work with from the start -2. Pyvista mesh cleaning (merge duplicate points, remove unused points, remove - degenerate faces) +2. Pyvista mesh cleaning (merge duplicate points, remove unused points, remove degenerate faces) The following code produces a clean magnet. diff --git a/docs/_pages/user_guide/examples/examples_shapes_superpos.md b/docs/_pages/user_guide/examples/examples_shapes_superpos.md index 62428c3a4..287d88df4 100644 --- a/docs/_pages/user_guide/examples/examples_shapes_superpos.md +++ b/docs/_pages/user_guide/examples/examples_shapes_superpos.md @@ -16,36 +16,30 @@ orphan: true # Superposition -The -[superposition principle](https://en.wikipedia.org/wiki/Superposition_principle) -states that the net response caused by two or more stimuli is the sum of the -responses caused by each stimulus individually. This principle holds in -magnetostatics when there is no material response, and simply states that the -total field created by multiple magnets and currents is the sum of the -individual fields. - -When two magnets overlap geometrically, the magnetization in the overlap region -is given by the vector sum of the two individual magnetizations. This enables -two geometric operations, - -:::::{grid} 1 2 2 2 :gutter: 4 - -::::{grid-item-card} Union :img-bottom: -../../../\_static/images/docu_field_superpos_union.png :shadow: None Build -complex forms by aligning base shapes (no overlap) with each other with similar -magnetization vector. :::: - -::::{grid-item-card} Cut-Out :img-bottom: -../../../\_static/images/docu_field_superpos_cutout.png :shadow: None When two -objects with opposing magnetization vectors of similar amplitude overlap, they -will just cancel in the overlap region. This enables geometric cut-out -operations. :::: ::::: +The [superposition principle](https://en.wikipedia.org/wiki/Superposition_principle) states that the net response caused by two or more stimuli is the sum of the responses caused by each stimulus individually. This principle holds in magnetostatics when there is no material response, and simply states that the total field created by multiple magnets and currents is the sum of the individual fields. + +When two magnets overlap geometrically, the magnetization in the overlap region is given by the vector sum of the two individual magnetizations. This enables two geometric operations, + +:::::{grid} 1 2 2 2 +:gutter: 4 + +::::{grid-item-card} Union +:img-bottom: ../../../_static/images/docu_field_superpos_union.png +:shadow: None +Build complex forms by aligning base shapes (no overlap) with each other with similar magnetization vector. +:::: + +::::{grid-item-card} Cut-Out +:img-bottom: ../../../_static/images/docu_field_superpos_cutout.png +:shadow: None +When two objects with opposing magnetization vectors of similar amplitude overlap, they will just cancel in the overlap region. This enables geometric cut-out operations. +:::: +::::: + ## Union operation -Geometric union by superposition is demonstrated in the following example where -a wedge-shaped magnet with a round back is constructed from three base-forms: a -CylinderSegment, a Cuboid and a TriangularMesh. +Geometric union by superposition is demonstrated in the following example where a wedge-shaped magnet with a round back is constructed from three base-forms: a CylinderSegment, a Cuboid and a TriangularMesh. ```{code-cell} ipython3 import numpy as np @@ -82,14 +76,9 @@ with magpy.show_context(magnet, sensor, backend="plotly", style_legend_show=Fals ## Cut-out operation -When two objects with opposing magnetization vectors of similar amplitude -overlap, they will just cancel in the overlap region. This enables geometric -cut-out operations. In the following example we construct an exact hollow -cylinder solution from two concentric cylinder shapes with opposite -magnetizations and compare the result to the `CylinderSegment` class solution. +When two objects with opposing magnetization vectors of similar amplitude overlap, they will just cancel in the overlap region. This enables geometric cut-out operations. In the following example we construct an exact hollow cylinder solution from two concentric cylinder shapes with opposite magnetizations and compare the result to the `CylinderSegment` class solution. -Here the `getM` and `getJ` functions come in handy. They allow us to see the -magnetization distribution that is the result of the superposition. +Here the `getM` and `getJ` functions come in handy. They allow us to see the magnetization distribution that is the result of the superposition. ```{code-cell} ipython3 import numpy as np @@ -139,11 +128,9 @@ plt.tight_layout() plt.show() ``` -The two figures show that the magnetization is zero outside of the cylinder, as -well as in the overlap region where the two magnetizations cancel. +The two figures show that the magnetization is zero outside of the cylinder, as well as in the overlap region where the two magnetizations cancel. -Finally, we want to show that the superposition gives the same result as a -computation from the CylinderSegment solution. +Finally, we want to show that the superposition gives the same result as a computation from the CylinderSegment solution. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -158,20 +145,13 @@ print("CylinderSegment result:", ring1.getB((.01, .02, .03))) print(" Cut-out result:", ring0.getB((.01, .02, .03))) ``` -Note that it is faster to compute the `Cylinder` field two times than computing -the `CylinderSegment` field one time. This is why Magpylib automatically falls -back to the `Cylinder` solution whenever `CylinderSegment` is called with 360 -deg section angles. +Note that it is faster to compute the `Cylinder` field two times than computing the `CylinderSegment` field one time. This is why Magpylib automatically falls back to the `Cylinder` solution whenever `CylinderSegment` is called with 360 deg section angles. -Unfortunately, with respect to 3D-models, cut-out operations cannot be displayed -graphically at this point in time, but {ref}`examples-own-3d-models` offer -custom solutions. +Unfortunately, with respect to 3D-models, cut-out operations cannot be displayed graphically at this point in time, but {ref}`examples-own-3d-models` offer custom solutions. ## Nice example -The following example combines union and cut-out to create a complex magnet -shape which is then displayed by combining a streamplot with a contourplot in -matplotlib. +The following example combines union and cut-out to create a complex magnet shape which is then displayed by combining a streamplot with a contourplot in matplotlib. ```{code-cell} ipython3 import numpy as np @@ -212,4 +192,4 @@ ax.set( ) plt.tight_layout() plt.show() -``` +``` \ No newline at end of file diff --git a/docs/_pages/user_guide/examples/examples_shapes_triangle.md b/docs/_pages/user_guide/examples/examples_shapes_triangle.md index ec7514d80..bb2a211b8 100644 --- a/docs/_pages/user_guide/examples/examples_shapes_triangle.md +++ b/docs/_pages/user_guide/examples/examples_shapes_triangle.md @@ -16,27 +16,18 @@ orphan: true # Triangular Meshes -The magnetic field of a homogeneously magnetized body is equivalent to the field -of a charged surface. The surface is the hull of the body, and the charge -density is proportional to the projection of the magnetization vector onto the -surface normal. - -It is very common to approximate the surface of bodies by triangular meshes, -which can then be transformed into magnets using the `Triangle` and the -`TriangularMesh` classes. When using these classes one should abide by the -following rules: - -1. The surface must be closed, or all missing faces must have zero charge - (magnetization vector perpendicular to surface normal). +The magnetic field of a homogeneously magnetized body is equivalent to the field of a charged surface. The surface is the hull of the body, and the charge density is proportional to the projection of the magnetization vector onto the surface normal. + +It is very common to approximate the surface of bodies by triangular meshes, which can then be transformed into magnets using the `Triangle` and the `TriangularMesh` classes. When using these classes one should abide by the following rules: + +1. The surface must be closed, or all missing faces must have zero charge (magnetization vector perpendicular to surface normal). 2. All triangles are oriented outwards (right-hand-rule) 3. The surface must not be self-intersecting. -4. For the B-field magnetic polarization must be added on the inside of the - body. +4. For the B-field magnetic polarization must be added on the inside of the body. ## Cuboctahedron Magnet -In this example `Triangle` is used to create a magnet with cuboctahedral shape. -Notice that triangle orientation is displayed by default for convenience. +In this example `Triangle` is used to create a magnet with cuboctahedral shape. Notice that triangle orientation is displayed by default for convenience. ```{code-cell} ipython3 import magpylib as magpy @@ -86,15 +77,9 @@ magpy.show( ## Triangular Prism Magnet -Consider a prism with triangular base that is magnetized orthogonal to the base. -All surface normals of the sides of the prism are orthogonal to the -magnetization vector. As a result, the sides do not contribute to the magnetic -field because their charge density disappears. Only the top and bottom surfaces -contribute. One must be very careful when defining those surfaces in such a way -that the surface normals point outwards. +Consider a prism with triangular base that is magnetized orthogonal to the base. All surface normals of the sides of the prism are orthogonal to the magnetization vector. As a result, the sides do not contribute to the magnetic field because their charge density disappears. Only the top and bottom surfaces contribute. One must be very careful when defining those surfaces in such a way that the surface normals point outwards. -Leaving out parts of the surface that do not contribute to the field is -beneficial for computation speed. +Leaving out parts of the surface that do not contribute to the field is beneficial for computation speed. ```{code-cell} ipython3 import magpylib as magpy @@ -118,18 +103,13 @@ magpy.show(*prism, backend="plotly", style_opacity=0.5, style_magnetization_show ## TriangularMesh class -While `Triangle` simply provides the field of a charged triangle and can be used -to construct complex forms, it is prone to error and tedious to work with when -meshes become large. For this purpose, the `TriangularMesh` class ensures proper -and convenient magnet creation by automatically checking mesh integrity and by -orienting the faces at initialization. +While `Triangle` simply provides the field of a charged triangle and can be used to construct complex forms, it is prone to error and tedious to work with when meshes become large. For this purpose, the `TriangularMesh` class ensures proper and convenient magnet creation by automatically checking mesh integrity and by orienting the faces at initialization. ```{attention} Automatic face reorientation of `TriangularMesh` may fail when the mesh is open. ``` -In this example we revisit the cuboctahedron but generate it through the -`TriangularMesh` class. +In this example we revisit the cuboctahedron but generate it through the `TriangularMesh` class. ```{code-cell} ipython3 import magpylib as magpy @@ -158,10 +138,7 @@ magpy.show( ) ``` -The `TriangularMesh` class is extremely powerful as it enables almost arbitrary -magnet shapes. It is described in detail in {ref}`docu-magpylib-api-trimesh`. -There are many ways to generate such triangular meshes. An example thereof is -shown in {ref}`examples-shapes-pyvista`. +The `TriangularMesh` class is extremely powerful as it enables almost arbitrary magnet shapes. It is described in detail in {ref}`docu-magpylib-api-trimesh`. There are many ways to generate such triangular meshes. An example thereof is shown in {ref}`examples-shapes-pyvista`. ```{caution} * `getB` and `getH` compute the fields correctly only if the mesh is closed, not self-intersecting, and all faces are properly oriented outwards. @@ -175,13 +152,7 @@ shown in {ref}`examples-shapes-pyvista`. ## Open TriangularMesh -In some cases, it may be desirable to generate a `TriangularMesh` object from an -open mesh (see Prism example above). In this case one must be extremely careful -because one cannot rely on the checks. Not to generate warnings or error -messages, these checks can be disabled with `"skip"` or their outcome can be -ignored with `"ignore"`. The `show` function can be used to view open edges and -disconnected parts. In the following example we generate such an open mesh -directly from `Triangle` objects. +In some cases, it may be desirable to generate a `TriangularMesh` object from an open mesh (see Prism example above). In this case one must be extremely careful because one cannot rely on the checks. Not to generate warnings or error messages, these checks can be disabled with `"skip"` or their outcome can be ignored with `"ignore"`. The `show` function can be used to view open edges and disconnected parts. In the following example we generate such an open mesh directly from `Triangle` objects. ```{code-cell} ipython3 import magpylib as magpy diff --git a/docs/_pages/user_guide/examples/examples_tutorial_collection.md b/docs/_pages/user_guide/examples/examples_tutorial_collection.md index 5246445ea..ac1a81d3b 100644 --- a/docs/_pages/user_guide/examples/examples_tutorial_collection.md +++ b/docs/_pages/user_guide/examples/examples_tutorial_collection.md @@ -16,28 +16,16 @@ orphan: true # Working with Collections -The top-level class `Collection` allows users to group objects by reference for -common manipulation. The following concepts apply to Magpylib Collections: - -1. A collection spans its own local frame of reference with position and - orientation, to which the children are added. Thus, any operation applied to - the collection is individually applied to all its children. -2. The collection itself behaves like a single Magpylib object (can be source - and/or observer). -3. All children inside the collection can be individually addressed and - manipulated, which will automatically manipulate their state inside the - parent collection. -4. Collections have their own `style` attributes, their paths are displayed in - `show`, and all children are automatically assigned their parent color. +The top-level class `Collection` allows users to group objects by reference for common manipulation. The following concepts apply to Magpylib Collections: + +1. A collection spans its own local frame of reference with position and orientation, to which the children are added. Thus, any operation applied to the collection is individually applied to all its children. +2. The collection itself behaves like a single Magpylib object (can be source and/or observer). +3. All children inside the collection can be individually addressed and manipulated, which will automatically manipulate their state inside the parent collection. +4. Collections have their own `style` attributes, their paths are displayed in `show`, and all children are automatically assigned their parent color. ## Constructing Collections -Collections have the attributes `children`, `sources`, `sensors` and -`collections`. These attributes are ordered lists that contain objects that are -added to the collection by reference (not copied). `children` returns a list of -all objects in the collection. `sources` returns a list of the sources, -`sensors` a list of the sensors and `collections` a list of "sub-collections" -within the collection. +Collections have the attributes `children`, `sources`, `sensors` and `collections`. These attributes are ordered lists that contain objects that are added to the collection by reference (not copied). `children` returns a list of all objects in the collection. `sources` returns a list of the sources, `sensors` a list of the sensors and `collections` a list of "sub-collections" within the collection. ```{code-cell} ipython3 import magpylib as magpy @@ -54,8 +42,7 @@ print(f"sensors: {coll.sensors}") print(f"collections: {coll.collections}") ``` -New additions are always added at the end. Use the **`add`** method or the -parameters. +New additions are always added at the end. Use the **`add`** method or the parameters. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -77,9 +64,7 @@ print(f"sensors: {coll.sensors}") print(f"collections: {coll.collections}") ``` -The **`describe`** method is a very convenient way to view a Collection -structure, especially when the collection is nested, i.e., when containing other -collections. +The **`describe`** method is a very convenient way to view a Collection structure, especially when the collection is nested, i.e., when containing other collections. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -91,11 +76,9 @@ c2.add(s2.copy()) coll.describe(format="label+type") ``` -The parameter `format` can be any combination of `"type"`, `"label"`, `"id"` and -`"properties"`. +The parameter `format` can be any combination of `"type"`, `"label"`, `"id"` and `"properties"`. -For convenience, any two Magpylib objects can be added up with `+` to form a -collection. +For convenience, any two Magpylib objects can be added up with `+` to form a collection. ```{code-cell} ipython3 import magpylib as magpy @@ -110,9 +93,7 @@ coll.describe(format="label") ## Child-Parent Relations -Objects that are part of a collection become children of that collection, and -the collection itself becomes their parent. Every Magpylib object has the -`parent` attribute, which is `None` by default. +Objects that are part of a collection become children of that collection, and the collection itself becomes their parent. Every Magpylib object has the `parent` attribute, which is `None` by default. ```{code-cell} ipython3 import magpylib as magpy @@ -125,10 +106,7 @@ print(f"c1.parent: {c1.parent}") print(f"c1.children: {c1.children}") ``` -Rather than adding objects to a collection, as described above, one can also set -the `parent` parameter. A Magpylib object can only have a single parent, i.e., -it can only be part of a single collection. As a result, changing the parent -will automatically remove the object from its previous collection. +Rather than adding objects to a collection, as described above, one can also set the `parent` parameter. A Magpylib object can only have a single parent, i.e., it can only be part of a single collection. As a result, changing the parent will automatically remove the object from its previous collection. ```{code-cell} ipython3 import magpylib as magpy @@ -151,8 +129,7 @@ c2.describe(format="label") ## Accessing Children -Collections have `__getitem__` through the attribute `children` defined which -enables using collections directly as iterators, +Collections have `__getitem__` through the attribute `children` defined which enables using collections directly as iterators, ```{code-cell} ipython3 import magpylib as magpy @@ -174,10 +151,7 @@ and makes it possible to directly reference to a child object by index: print(coll[0]) ``` -Collection nesting is powerful to create a self-consistent hierarchical -structure, however, it is often in the way of quick child access in nested -trees. For this, the `children_all`, `sources_all`, `sensors_all` and -`collections_all` read-only parameters, return all objects in the tree: +Collection nesting is powerful to create a self-consistent hierarchical structure, however, it is often in the way of quick child access in nested trees. For this, the `children_all`, `sources_all`, `sensors_all` and `collections_all` read-only parameters, return all objects in the tree: ```{code-cell} ipython3 import magpylib as magpy @@ -196,8 +170,7 @@ print([s.style.label for s in coll.sensors_all]) ## Practical Example -The following example demonstrates how collections enable user-friendly -manipulation of groups, sub-groups, and individual objects. +The following example demonstrates how collections enable user-friendly manipulation of groups, sub-groups, and individual objects. ```{code-cell} ipython3 import numpy as np @@ -230,10 +203,7 @@ for coil in [coil1, coil2]: magpy.show(*helmholtz, animation=True, style_path_show=False) ``` -For magnetic field computation, a collection with source children behaves like a -single source object, and a collection with sensor children behaves like a flat -list of its sensors when provided as `sources` and `observers` input -respectively. +For magnetic field computation, a collection with source children behaves like a single source object, and a collection with sensor children behaves like a flat list of its sensors when provided as `sources` and `observers` input respectively. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -256,11 +226,7 @@ plt.show() ## Efficient 3D Models -The graphical backend libraries were not designed for complex 3D graphic output. -As a result, it often becomes inconvenient and slow when attempting to display -many 3D objects. One solution to this problem when dealing with large -collections is to represent the latter by a single encompassing body, and to -deactivate the individual 3D models of all children. +The graphical backend libraries were not designed for complex 3D graphic output. As a result, it often becomes inconvenient and slow when attempting to display many 3D objects. One solution to this problem when dealing with large collections is to represent the latter by a single encompassing body, and to deactivate the individual 3D models of all children. ```{code-cell} ipython3 import magpylib as magpy @@ -294,6 +260,4 @@ coll.show() ## Compound Objects -Collections can be subclassed to form dynamic groups that seamlessly integrate -into Magpylib. Such classes are referred to as **compounds**. An example of how -this is done is shown in {ref}`examples-misc-compound`. +Collections can be subclassed to form dynamic groups that seamlessly integrate into Magpylib. Such classes are referred to as **compounds**. An example of how this is done is shown in {ref}`examples-misc-compound`. diff --git a/docs/_pages/user_guide/examples/examples_tutorial_custom.md b/docs/_pages/user_guide/examples/examples_tutorial_custom.md index b2a63bbaf..ea9983b84 100644 --- a/docs/_pages/user_guide/examples/examples_tutorial_custom.md +++ b/docs/_pages/user_guide/examples/examples_tutorial_custom.md @@ -16,9 +16,7 @@ orphan: true # CustomSource -The {ref}`guide-docs-classes-custom-source` class was implemented to offer easy -integration of user field implementations into Magpylib's object-oriented -interface. +The {ref}`guide-docs-classes-custom-source` class was implemented to offer easy integration of user field implementations into Magpylib's object-oriented interface. ```{note} Obviously, any field implementation can be integrated. Specifically, fields where superposition holds and interactions do not disturb the sources (e.g. electric, gravitational, ...) can benefit from Magpylib's position and orientation interface. @@ -26,21 +24,15 @@ Obviously, any field implementation can be integrated. Specifically, fields wher ## Magnetic Monopole -In this example we create a class that represents the elusive magnetic monopole, -which would have a magnetic field like this +In this example we create a class that represents the elusive magnetic monopole, which would have a magnetic field like this $$ {\bf B} = Q_m \frac{{\bf r}}{|{\bf r}|^3}. $$ -Here the monopole lies in the origin of the local coordinates, $Q_m$ is the -monopole charge and ${\bf r}$ is the observer position. +Here the monopole lies in the origin of the local coordinates, $Q_m$ is the monopole charge and ${\bf r}$ is the observer position. -We create this field as a Python function and hand it over to a CustomSource -`field_func` argument. The `field_func` input must be a callable with two -positional arguments `field` (can be `'B'` or `'H'`) and `observers` (must -accept ndarrays of shape (n,3)), and return the respective fields in units of T -and A/m in the same shape. +We create this field as a Python function and hand it over to a CustomSource `field_func` argument. The `field_func` input must be a callable with two positional arguments `field` (can be `'B'` or `'H'`) and `observers` (must accept ndarrays of shape (n,3)), and return the respective fields in units of T and A/m in the same shape. ```{code-cell} ipython3 import numpy as np @@ -79,8 +71,7 @@ print(mono.getB((1, 0, 0))) print(mono.getH((1, 0, 0))) ``` -Multiple of these sources can now be combined, making use of the Magpylib -position/orientation interface. +Multiple of these sources can now be combined, making use of the Magpylib position/orientation interface. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -113,8 +104,7 @@ plt.show() ## Adding a 3D model -While `CustomSource` is graphically represented by a simple marker by default, -we can easily add a 3D model as described in {ref}`examples-own-3d-models`. +While `CustomSource` is graphically represented by a simple marker by default, we can easily add a 3D model as described in {ref}`examples-own-3d-models`. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -137,11 +127,7 @@ magpy.show(mono1, mono2) ## Subclassing CustomSource -In the above example it would be nice to make the `CustomSource` dynamic, so -that it would have a property `charge` that can be changed at will, rather than -having to redefine the `field_func` and initialize a new object every time. In -the following example we show how to sub-class `CustomSource` to achieve this. -The problem is reminiscent of {ref}`examples-misc-compound`. +In the above example it would be nice to make the `CustomSource` dynamic, so that it would have a property `charge` that can be changed at will, rather than having to redefine the `field_func` and initialize a new object every time. In the following example we show how to sub-class `CustomSource` to achieve this. The problem is reminiscent of {ref}`examples-misc-compound`. ```{code-cell} ipython3 import numpy as np @@ -209,8 +195,7 @@ mono.charge = -1 print(mono.getB((1, 0, 0))) ``` -The new class seamlessly integrates into the Magpylib interface as we show in -the following example where we have a look at the Quadrupole field. +The new class seamlessly integrates into the Magpylib interface as we show in the following example where we have a look at the Quadrupole field. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed diff --git a/docs/_pages/user_guide/examples/examples_tutorial_field_computation.md b/docs/_pages/user_guide/examples/examples_tutorial_field_computation.md index 0c2890f9d..0e54212ee 100644 --- a/docs/_pages/user_guide/examples/examples_tutorial_field_computation.md +++ b/docs/_pages/user_guide/examples/examples_tutorial_field_computation.md @@ -18,8 +18,7 @@ orphan: true ## Most basic Example -The v2 slogan was _"The magnetic field is only three lines of code away"_, which -is demonstrated by the following most fundamental and self-explanatory example, +The v2 slogan was *"The magnetic field is only three lines of code away"*, which is demonstrated by the following most fundamental and self-explanatory example, ```{code-cell} ipython3 import magpylib as magpy @@ -31,14 +30,9 @@ print(B) ## Field on a Grid -There are four field computation functions: `getB` will compute the B-field in -T. `getH` computes the H-field in A/m. `getJ` computes the magnetic polarization -in units of T. `getM` computes the magnetization in units of A/m. +There are four field computation functions: `getB` will compute the B-field in T. `getH` computes the H-field in A/m. `getJ` computes the magnetic polarization in units of T. `getM` computes the magnetization in units of A/m. -All these functions will return the field in the shape of the input. In the -following example, BHJM-fields of a diametrically magnetized cylinder magnet are -computed on a position grid in the symmetry plane and are then displayed using -Matplotlib. +All these functions will return the field in the shape of the input. In the following example, BHJM-fields of a diametrically magnetized cylinder magnet are computed on a position grid in the symmetry plane and are then displayed using Matplotlib. ```{code-cell} ipython3 import matplotlib.pyplot as plt @@ -98,14 +92,9 @@ plt.show() ## Using Sensors -The `Sensor` class enables relative positioning of observer grids in the global -coordinate system. The observer grid is stored in the `pixel` parameter of the -sensor object which is `(0,0,0)` by default (sensor position = observer -position). +The `Sensor` class enables relative positioning of observer grids in the global coordinate system. The observer grid is stored in the `pixel` parameter of the sensor object which is `(0,0,0)` by default (sensor position = observer position). -The following example shows a moving and rotating sensor with two pixels. At the -same time, the source objects are moving to demonstrate the versatility of the -field computation. +The following example shows a moving and rotating sensor with two pixels. At the same time, the source objects are moving to demonstrate the versatility of the field computation. ```{code-cell} ipython3 import numpy as np @@ -138,10 +127,7 @@ with magpy.show_context(sensor, coll, animation=True, backend="plotly"): ## Multiple Inputs -When `getBHJM` receive multiple inputs for sources and observers they will -compute all possible combinations. It is still beneficial to call the field -computation only a single time, because similar sources will be grouped, and the -computation will be vectorized automatically. +When `getBHJM` receive multiple inputs for sources and observers they will compute all possible combinations. It is still beneficial to call the field computation only a single time, because similar sources will be grouped, and the computation will be vectorized automatically. ```{code-cell} ipython3 import magpylib as magpy @@ -163,8 +149,7 @@ B = magpy.getB([cube1, cube2, cube3], [sens1, sens2]) B.shape ``` -Select the second cube (first index), the first sensor (second index), pixel 3-4 -(index three and four) and the Bz-component of the field (index five) +Select the second cube (first index), the first sensor (second index), pixel 3-4 (index three and four) and the Bz-component of the field (index five) ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -172,14 +157,11 @@ Select the second cube (first index), the first sensor (second index), pixel 3-4 B[1, 0, 2, 3, 2] ``` -A path will add another index. Every higher pixel dimension will add another -index as well. +A path will add another index. Every higher pixel dimension will add another index as well. ## Field as Pandas Dataframe -Instead of a NumPy `ndarray`, the field computation can also return a -[pandas](https://pandas.pydata.org/).[dataframe](https://pandas.pydata.org/docs/user_guide/dsintro.html#dataframe) -using the `output='dataframe'` kwarg. +Instead of a NumPy `ndarray`, the field computation can also return a [pandas](https://pandas.pydata.org/).[dataframe](https://pandas.pydata.org/docs/user_guide/dsintro.html#dataframe) using the `output='dataframe'` kwarg. ```{code-cell} ipython3 import numpy as np @@ -209,9 +191,7 @@ B = magpy.getB( B ``` -Plotting libraries such as [plotly](https://plotly.com/python/plotly-express/) -or [seaborn](https://seaborn.pydata.org/introduction.html) can take advantage of -this feature, as they can deal with `dataframes` directly. +Plotting libraries such as [plotly](https://plotly.com/python/plotly-express/) or [seaborn](https://seaborn.pydata.org/introduction.html) can take advantage of this feature, as they can deal with `dataframes` directly. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -234,15 +214,12 @@ fig.show() ## Functional Interface -All above computations demonstrate the convenient object-oriented interface of -Magpylib. However, there are instances when it is better to work with the -functional interface instead. +All above computations demonstrate the convenient object-oriented interface of Magpylib. However, there are instances when it is better to work with the functional interface instead. 1. Reduce overhead of Python objects 2. Complex computation instances -In the following example we show how complex instances are computed using the -functional interface. +In the following example we show how complex instances are computed using the functional interface. ```{important} The functional interface will only outperform the object oriented interface if you use NumPy operations for input array creation, such as `tile`, `repeat`, `reshape`, ... ! diff --git a/docs/_pages/user_guide/examples/examples_tutorial_modeling_magnets.md b/docs/_pages/user_guide/examples/examples_tutorial_modeling_magnets.md index 6f8ad96db..fc00f1099 100644 --- a/docs/_pages/user_guide/examples/examples_tutorial_modeling_magnets.md +++ b/docs/_pages/user_guide/examples/examples_tutorial_modeling_magnets.md @@ -2,34 +2,15 @@ # Modeling a real magnet -Whenever you wish to compare Magpylib simulations with experimental data -obtained using a real permanent magnet, you might wonder how to properly set up -a Magpylib magnet object to reflect the physical permanent magnet in question. -The goal of this tutorial is to explain how to extract this information from -respective datasheets, to provide better understanding of permanent magnets, and -show how to align Magpylib simulations with experimental measurements. +Whenever you wish to compare Magpylib simulations with experimental data obtained using a real permanent magnet, you might wonder how to properly set up a Magpylib magnet object to reflect the physical permanent magnet in question. The goal of this tutorial is to explain how to extract this information from respective datasheets, to provide better understanding of permanent magnets, and show how to align Magpylib simulations with experimental measurements. -This tutorial was supported by [BOMATEC](https://www.bomatec.com/de) by -providing excellent data sheets and by supplying magnets for the experimental -demonstration below. +This tutorial was supported by [BOMATEC](https://www.bomatec.com/de) by providing excellent data sheets and by supplying magnets for the experimental demonstration below. ## Short summary -In a magnet data sheet, you should find B-H curves and J-H curves. These curves -coincide at H=0, which gives the intrinsic material remanence $B_r$. As a result -of material response and self-interaction, the magnet "demagnetizes" itself so -that the mean magnetic polarization of a real magnet is always below the -remanence. How much below depends strongly on the shape of the magnet and is -expressed in the data sheet through the permeance coefficient lines (grey -lines). The numbers at the end indicate the typical magnet length to diameter -ratio (L/D). - -To obtain the correct magnetic polarization of a magnet from the data sheet, one -must find the crossing between B-H curve and respective permeance coefficient -line. This gives the "working point" which corresponds to the mean demagnetizing -H-field inside the magnet. The correct polarization to use in the Magpylib -simulation is the J-value at the working point which can be read off from the -J-H curve. +In a magnet data sheet, you should find B-H curves and J-H curves. These curves coincide at H=0, which gives the intrinsic material remanence $B_r$. As a result of material response and self-interaction, the magnet "demagnetizes" itself so that the mean magnetic polarization of a real magnet is always below the remanence. How much below depends strongly on the shape of the magnet and is expressed in the data sheet through the permeance coefficient lines (grey lines). The numbers at the end indicate the typical magnet length to diameter ratio (L/D). + +To obtain the correct magnetic polarization of a magnet from the data sheet, one must find the crossing between B-H curve and respective permeance coefficient line. This gives the "working point" which corresponds to the mean demagnetizing H-field inside the magnet. The correct polarization to use in the Magpylib simulation is the J-value at the working point which can be read off from the J-H curve. ![data sheet snippet](../../../_static/images/examples_tutorial_magnet_datasheet2.png) @@ -37,158 +18,80 @@ The following sections provide further explanation on the matter. ## Hysteresis loop -If you've worked with magnetism, chances are very high that you have seen a -magnetic hysteresis loop. Hysteresis loops describe the connection between the -**mean values** of an externally applied H-field and the resulting B-field, -polarization J or magnetization M **within a defined volume**. This connection -depends strongly on the size and shape of this volume and what is inside and -what is outside. - -The B-H curve is called the "normal loop", while J-H and M-H curves are called -"intrinsic loops". Hereon we only make use of the J-H loops, but the discussion -is similar for M-H. Normal and intrinsic loops are connected via -$B = \mu_0 H + J$. In free space the B-H connection is just a straight line -defined via $B = \mu_0 H$. When the whole space is filled with magnetic material -you will see something like this within an arbitrary volume: - -::::{grid} 2 :::{grid-item} :columns: 3 ::: :::{grid-item} :columns: 6 +If you've worked with magnetism, chances are very high that you have seen a magnetic hysteresis loop. Hysteresis loops describe the connection between the **mean values** of an externally applied H-field and the resulting B-field, polarization J or magnetization M **within a defined volume**. This connection depends strongly on the size and shape of this volume and what is inside and what is outside. + +The B-H curve is called the "normal loop", while J-H and M-H curves are called "intrinsic loops". Hereon we only make use of the J-H loops, but the discussion is similar for M-H. Normal and intrinsic loops are connected via $B = \mu_0 H + J$. In free space the B-H connection is just a straight line defined via $B = \mu_0 H$. When the whole space is filled with magnetic material you will see something like this within an arbitrary volume: + +::::{grid} 2 +:::{grid-item} +:columns: 3 +::: +:::{grid-item} +:columns: 6 ![hysteresis loops](../../../_static/images/examples_tutorial_magnet_hysteresis.png) -::: :::: - -**1st quadrant**: Initially we have $J=0$ and $H=0$. The magnetic material is -not magnetized, and no external H-field is applied. When increasing the H-field, -the material polarization will follow the "virgin curve" and will increase until -it reaches its maximum possible value, the saturation polarization $J_S$. Higher -values of $H$ will not affect $J$, while $B$ will keep increasing linearly. Now -we are on the "major loop" - we will never return to the virgin curve. After -reaching a large H-value we slowly turn the H-field off. As it drops to zero the -material will retain its strong polarization at saturation level while the -resulting $B$ decreases. At $H = 0$ the B-field then approaches the "remanence -field" $B_r$, and its only contribution is $J_S$. - -**2nd quadrant**: Now the H-field becomes negative. Its amplitude increases but -it is oriented opposite to the initial direction. Therefore, it is also opposite -to the magnetic polarization. In the 2nd quadrant we are now trying to actively -demagnetize the material. This part of the hysteresis loop is often referred to -as the "demagnetization curve". With increasing negative H, the B-field -continues to become smaller until it reaches zero at the "coercive field" $H_c$. -At this point the net B-field inside the volume is zero, however, the material -is still magnetized! In the example loop above, the polarization at $H_c$ is -still at the $J_S$ level. By increasing the H-field further, a point will be -reached where the material will start to demagnetize. This can be seen by the -non-linear drop of $J$. The point where $J$ reaches zero is called the -"intrinsic coercive field" $H_{ci}$. At this point the net polarization in the -observed volume is zero. The material is demagnetized. The intrinsic coercive -field is a measure of how well a magnetized material can resist a demagnetizing -field. Having large values of $H_{ci}$ is a property of "hard magnets", as they -can keep their magnetization $J$ even for strong external fields in the opposite -direction. - -**3rd and 4th quadrants**: Moving to the third quadrant the behavior is now -mirrored. As $H$ increases past $H_{ci}$, polarization quickly aligns with the -external field and the material becomes saturated $J=-J_S$. By turning the field -around again, we move through the fourth quadrant to complete the hysteresis -loop. - -Hysteresis in magnetism as presented here is a macroscopic model that is the -result of a complex interplay between dipole and exchange interaction, material -texture and resulting domain formation at a microscopic level. Details can be -found, for example, in Aharoni's classical textbook "Introduction to the Theory -of Ferromagnetism". +::: +:::: + +**1st quadrant**: Initially we have $J=0$ and $H=0$. The magnetic material is not magnetized, and no external H-field is applied. When increasing the H-field, the material polarization will follow the "virgin curve" and will increase until it reaches its maximum possible value, the saturation polarization $J_S$. Higher values of $H$ will not affect $J$, while $B$ will keep increasing linearly. Now we are on the "major loop" - we will never return to the virgin curve. After reaching a large H-value we slowly turn the H-field off. As it drops to zero the material will retain its strong polarization at saturation level while the resulting $B$ decreases. At $H = 0$ the B-field then approaches the "remanence field" $B_r$, and its only contribution is $J_S$. + +**2nd quadrant**: Now the H-field becomes negative. Its amplitude increases but it is oriented opposite to the initial direction. Therefore, it is also opposite to the magnetic polarization. In the 2nd quadrant we are now trying to actively demagnetize the material. This part of the hysteresis loop is often referred to as the "demagnetization curve". With increasing negative H, the B-field continues to become smaller until it reaches zero at the "coercive field" $H_c$. At this point the net B-field inside the volume is zero, however, the material is still magnetized! In the example loop above, the polarization at $H_c$ is still at the $J_S$ level. By increasing the H-field further, a point will be reached where the material will start to demagnetize. This can be seen by the non-linear drop of $J$. The point where $J$ reaches zero is called the "intrinsic coercive field" $H_{ci}$. At this point the net polarization in the observed volume is zero. The material is demagnetized. The intrinsic coercive field is a measure of how well a magnetized material can resist a demagnetizing field. Having large values of $H_{ci}$ is a property of "hard magnets", as they can keep their magnetization $J$ even for strong external fields in the opposite direction. + +**3rd and 4th quadrants**: Moving to the third quadrant the behavior is now mirrored. As $H$ increases past $H_{ci}$, polarization quickly aligns with the external field and the material becomes saturated $J=-J_S$. By turning the field around again, we move through the fourth quadrant to complete the hysteresis loop. + +Hysteresis in magnetism as presented here is a macroscopic model that is the result of a complex interplay between dipole and exchange interaction, material texture and resulting domain formation at a microscopic level. Details can be found, for example, in Aharoni's classical textbook "Introduction to the Theory of Ferromagnetism". ## The demagnetizing field -If in an application the applied external H-field is zero, it seems intuitive to -use the remanence $B_r$ for the magnetic polarization in the Magpylib -simulation. It is a value that you will find in the data sheet. +If in an application the applied external H-field is zero, it seems intuitive to use the remanence $B_r$ for the magnetic polarization in the Magpylib simulation. It is a value that you will find in the data sheet. ![data sheet snippet](../../../_static/images/examples_tutorial_magnet_table.png) -However, if considering $J=B_r$, you will quickly see that the experimental -results are up to ~30 % below of what you would expect. The reason for this is -the self-induced demagnetizing field of the magnet which is generated by the -magnetic polarization itself. Just like $J$ generates an H-field on the outside -of the magnet, it also generates an H-field inside the magnet, along the -opposite direction of the polarization. The H-field outside the magnet is known -as the stray field, and the H-field inside the magnet is called the -demagnetizing field (as it opposes the magnetic polarization). This is -demonstrated by the following figure: +However, if considering $J=B_r$, you will quickly see that the experimental results are up to ~30 % below of what you would expect. The reason for this is the self-induced demagnetizing field of the magnet which is generated by the magnetic polarization itself. Just like $J$ generates an H-field on the outside of the magnet, it also generates an H-field inside the magnet, along the opposite direction of the polarization. The H-field outside the magnet is known as the stray field, and the H-field inside the magnet is called the demagnetizing field (as it opposes the magnetic polarization). This is demonstrated by the following figure: ![demagnetization field simulation](../../../_static/images/examples_tutorial_magnet_fieldcomparison.png) -Making use of the [streamplot example](examples-vis-mpl-streamplot), on the left -side we show the cross-section of a Cuboid magnet and its homogeneous -polarization. And on the right, we see the H-field generated by it. Inside the -magnet the generated H-field opposes the polarization. As a result, the -polarization of a magnet will not be $B_r$, but instead will be some value of -$J$ in the 2nd quadrant of the J-H loop that corresponds to the mean H-field -inside the magnet. This H-value is often referred to as the "working point". +Making use of the [streamplot example](examples-vis-mpl-streamplot), on the left side we show the cross-section of a Cuboid magnet and its homogeneous polarization. And on the right, we see the H-field generated by it. Inside the magnet the generated H-field opposes the polarization. As a result, the polarization of a magnet will not be $B_r$, but instead will be some value of $J$ in the 2nd quadrant of the J-H loop that corresponds to the mean H-field inside the magnet. This H-value is often referred to as the "working point". ## Finding the correct polarization -As explained above, the hysteresis loop depends strongly on the chosen -observation volume geometry, the material inside, and what is outside of the -volume. Magnet manufacturers provide such loops (usually only the 2nd quadrant) -for their magnets, meaning that the observation volume is the whole magnet with -air outside. +As explained above, the hysteresis loop depends strongly on the chosen observation volume geometry, the material inside, and what is outside of the volume. Magnet manufacturers provide such loops (usually only the 2nd quadrant) for their magnets, meaning that the observation volume is the whole magnet with air outside. -To obtain the correct mean polarization of a magnet we simply must compute the -mean demagnetizing field (= working point) and read the resulting $J$ off the -provided J-H loop. Computing the mean demagnetizing field, however, is not a -simple task. In addition to the material response (permeability), it depends -strongly on the magnet geometry. Fortunately, the working points can be read off -from well written data sheets. +To obtain the correct mean polarization of a magnet we simply must compute the mean demagnetizing field (= working point) and read the resulting $J$ off the provided J-H loop. Computing the mean demagnetizing field, however, is not a simple task. In addition to the material response (permeability), it depends strongly on the magnet geometry. Fortunately, the working points can be read off from well written data sheets. ![data sheet snippet](../../../_static/images/examples_tutorial_magnet_datasheet.png) -This datasheet snippet shows the second quadrant of the B-H and J-H loops, even -for two different temperatures. The working point is given by the intersection -between the "permeance coefficient" lines (gray) and the B-H curve. The number -at the end of these lines indicate the length to diameter ratio (L/D) of the -magnet, which is the critical geometric factor. Different lines are for -different L/D values, which allows one to select the correct working point for -different magnets made from this specific material. Once the working point is -found, the correct magnetic polarization, here denoted by $J_W$ (the magnetic -polarization at the working point), can be read off. The following figure -exemplifies the changes in $J_W$ for different L/D values, considering a -cylinder magnet: +This datasheet snippet shows the second quadrant of the B-H and J-H loops, even for two different temperatures. The working point is given by the intersection between the "permeance coefficient" lines (gray) and the B-H curve. The number at the end of these lines indicate the length to diameter ratio (L/D) of the magnet, which is the critical geometric factor. Different lines are for different L/D values, which allows one to select the correct working point for different magnets made from this specific material. Once the working point is found, the correct magnetic polarization, here denoted by $J_W$ (the magnetic polarization at the working point), can be read off. The following figure exemplifies the changes in $J_W$ for different L/D values, considering a cylinder magnet: ![finding the working point](../../../_static/images/examples_tutorial_magnet_LDratio.png) -Permanent magnets with different geometries, such as a parallelepiped shape, -will have different behavior in terms of L/D values. Make sure you are reading -the data from the correct part number. - +Permanent magnets with different geometries, such as a parallelepiped shape, will have different behavior in terms of L/D values. Make sure you are reading the data from the correct part number. ## Warning -Keep in mind that there are still many reasons why your simulation might not fit -well to your experiment. Here are some of the most common problems: +Keep in mind that there are still many reasons why your simulation might not fit well to your experiment. Here are some of the most common problems: -1. Small position errors of less than 100 um can have a large impact on the - measurement result. The reference should be the sensitive element inside a - sensor package. These elements can be displaced by 10-100 um and even rotated - by a few degrees. The sensor might also not be well calibrated. -2. There are external stray fields, like the earth magnetic field, that - influence the measurements. Those might also come from other nearby - electronic equipment or magnetic parts. +1. Small position errors of less than 100 um can have a large impact on the measurement result. The reference should be the sensitive element inside a sensor package. These elements can be displaced by 10-100 um and even rotated by a few degrees. The sensor might also not be well calibrated. +2. There are external stray fields, like the earth magnetic field, that influence the measurements. Those might also come from other nearby electronic equipment or magnetic parts. 3. Off-the-shelf magnets often do not hold what is promised in the datasheet - - Magnetic polarization amplitude can be off by 5-10 %. - - The direction of polarization often varies by up to a few degrees. - - Worst-case: the polarization can be inhomogeneous which is often a problem - in injection-mold magnets. + - Magnetic polarization amplitude can be off by 5-10 %. + - The direction of polarization often varies by up to a few degrees. + - Worst-case: the polarization can be inhomogeneous which is often a problem in injection-mold magnets. ## Example -::::{grid} 2 :::{grid-item} :columns: 3 ::: :::{grid-item} :columns: 6 -![](../../../_static/images/examples_icon_WIP.png) ::: :::: +::::{grid} 2 +:::{grid-item} +:columns: 3 +::: +:::{grid-item} +:columns: 6 +![](../../../_static/images/examples_icon_WIP.png) +::: +:::: coming soon: - 1. Magpylib simulation code 2. Experimental data 3. Comparison and discussion -**Exterior reference** G. Martinek, S. Ruoho and U. Wyss. (2021). _Magnetic -Properties of Permanents Magnets & Measuring Techniques_ [White paper]. Arnold -Magnetic Technologies. -https://www.arnoldmagnetics.com/blog/measuring-permanent-magnets-white-paper/ +**Exterior reference** +G. Martinek, S. Ruoho and U. Wyss. (2021). *Magnetic Properties of Permanents Magnets & Measuring Techniques* [White paper]. Arnold Magnetic Technologies. https://www.arnoldmagnetics.com/blog/measuring-permanent-magnets-white-paper/ \ No newline at end of file diff --git a/docs/_pages/user_guide/examples/examples_tutorial_paths.md b/docs/_pages/user_guide/examples/examples_tutorial_paths.md index d1fcd8612..0da674d36 100644 --- a/docs/_pages/user_guide/examples/examples_tutorial_paths.md +++ b/docs/_pages/user_guide/examples/examples_tutorial_paths.md @@ -16,10 +16,7 @@ orphan: true # Working with Paths -The position and orientation attributes are key elements of Magpylib. The -documentation section {ref}`docs-position` describes how they work in detail. -While these definitions can seem abstract, the interface was constructed as -intuitively as possible which is demonstrated in this tutorial. +The position and orientation attributes are key elements of Magpylib. The documentation section {ref}`docs-position` describes how they work in detail. Wile these definitions can seem abstract, the interface was constructed as intuitively as possible which is demonstrated in this tutorial. ```{important} Always make use of paths when computing with multiple Magpylib object position and orientation instances. This enables vectorized computation. Avoid Python loops at all costs! @@ -29,8 +26,7 @@ In this tutorial we show some good practice examples. ## Assigning Absolute Paths -Absolute object paths are assigned at initialization or through the object -properties. +Absolute object paths are assigned at initialization or through the object properties. ```{code-cell} ipython3 import numpy as np @@ -56,8 +52,7 @@ magpy.show(sensor, cube, animation=True, backend="plotly") ## Relative Paths -`move` and `rotate` input is interpreted relative to the existing path. When the -input is scalar the whole existing path is moved. +`move` and `rotate` input is interpreted relative to the existing path. When the input is scalar the whole existing path is moved. ```{code-cell} ipython3 import numpy as np @@ -107,11 +102,7 @@ sphere.show() ## Merging paths -Complex paths can be created by merging multiple path operations. This is done -with vector input for the `move` and `rotate` methods and choosing values for -`start` that will make the paths overlap. In the following example we combine a -linear path with a rotation about self (`anchor=None`) until path index 30. -Thereon, a second rotation about the origin is applied, creating a spiral. +Complex paths can be created by merging multiple path operations. This is done with vector input for the `move` and `rotate` methods and choosing values for `start` that will make the paths overlap. In the following example we combine a linear path with a rotation about self (`anchor=None`) until path index 30. Thereon, a second rotation about the origin is applied, creating a spiral. ```{code-cell} ipython3 import numpy as np @@ -133,8 +124,7 @@ cube.show(backend="plotly", animation=True) ## Reset path -The `reset_path()` method allows users to reset an object path to -`position=(0,0,0)` and `orientation=None`. +The `reset_path()` method allows users to reset an object path to `position=(0,0,0)` and `orientation=None`. ```{code-cell} ipython3 import magpylib as magpy @@ -152,22 +142,13 @@ print(sensor.orientation.as_quat()) ``` (examples-tutorial-paths-edge-padding-end-slicing)= - ## Edge-padding and end-slicing -Magpylib will always make sure that object paths are in the right format, i.e., -`position` and `orientation` attributes are of the same length. In addition, -when objects with different path lengths are combined, e.g., when computing the -field, the shorter paths are treated as static beyond their end to make the -computation sensible. Internally, Magpylib follows a philosophy of edge-padding -and end-slicing when adjusting paths. +Magpylib will always make sure that object paths are in the right format, i.e., `position` and `orientation` attributes are of the same length. In addition, when objects with different path lengths are combined, e.g., when computing the field, the shorter paths are treated as static beyond their end to make the computation sensible. Internally, Magpylib follows a philosophy of edge-padding and end-slicing when adjusting paths. -The idea behind **edge-padding** is that, whenever path entries beyond the -existing path length are needed, the edge-entries of the existing path are -returned. This means that the object is static beyond its existing path. +The idea behind **edge-padding** is that, whenever path entries beyond the existing path length are needed, the edge-entries of the existing path are returned. This means that the object is static beyond its existing path. -In the following example the orientation attribute is padded by its edge value -`(0,0,.2)` as the position attribute length is increased. +In the following example the orientation attribute is padded by its edge value `(0,0,.2)` as the position attribute length is increased. ```{code-cell} ipython3 from scipy.spatial.transform import Rotation as R @@ -182,9 +163,7 @@ print(sensor.position) print(sensor.orientation.as_rotvec()) ``` -When the field is computed of `loop1` with path length 4 and `loop2` with path -length 2, `loop2` will remain in position (= edge padding) while the other -object is still in motion. +When the field is computed of `loop1` with path length 4 and `loop2` with path length 2, `loop2` will remain in position (= edge padding) while the other object is still in motion. ```{code-cell} ipython3 from magpylib.current import Circle @@ -196,11 +175,7 @@ B = magpy.getB([loop1, loop2], (0, 0, 0)) print(B) ``` -The idea behind **end-slicing** is that, whenever a path is automatically -reduced in length, Magpylib will slice to keep the ending of the path. While -this occurs rarely, the following example shows how the `orientation` attribute -is automatically end-sliced, keeping the values `[(0,0,.3), (0,0,.4)]`, when the -`position` attribute is reduced in length: +The idea behind **end-slicing** is that, whenever a path is automatically reduced in length, Magpylib will slice to keep the ending of the path. While this occurs rarely, the following example shows how the `orientation` attribute is automatically end-sliced, keeping the values `[(0,0,.3), (0,0,.4)]`, when the `position` attribute is reduced in length: ```{code-cell} ipython3 from scipy.spatial.transform import Rotation as R diff --git a/docs/_pages/user_guide/examples/examples_vis_animations.md b/docs/_pages/user_guide/examples/examples_vis_animations.md index b43333515..87c560685 100644 --- a/docs/_pages/user_guide/examples/examples_vis_animations.md +++ b/docs/_pages/user_guide/examples/examples_vis_animations.md @@ -16,8 +16,7 @@ orphan: true # Animations -Magpylib can display the motion of objects along paths in the form of -animations. +Magpylib can display the motion of objects along paths in the form of animations. ```{hint} 1. Animations work best with the [plotly backend](guide-graphic-backends). @@ -27,13 +26,11 @@ animations. 3. Avoid rendering too many frames. ``` -Detailed information about how to tune animations can be found in the -[graphics documentation](guide-graphic-animations). +Detailed information about how to tune animations can be found in the [graphics documentation](guide-graphic-animations). ## Simple Animations -Animations are created with `show` by setting `animation=True`. It is also -possible to hand over the animation time with this parameter. +Animations are created with `show` by setting `animation=True`. It is also possible to hand over the animation time with this parameter. ```{code-cell} ipython3 import magpylib as magpy @@ -63,10 +60,7 @@ magpy.show(sensor, magnet, animation=True, backend="plotly") ## Animated Subplots -[Subplots](examples-vis-subplots) are a powerful tool to see the field along a -path while viewing the 3D models at the same time. This is specifically -illustrative as an animation where the field at the respective path position is -indicated by a marker. +[Subplots](examples-vis-subplots) are a powerful tool to see the field along a path while viewing the 3D models at the same time. This is specifically illustrative as an animation where the field at the respective path position is indicated by a marker. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -79,8 +73,7 @@ magpy.show( ) ``` -It is also possible to use the [show_context](guide-graphics-show_context) -context manager. +It is also possible to use the [show_context](guide-graphics-show_context) context manager. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -96,24 +89,20 @@ with magpy.show_context([magnet, sensor], backend="plotly", animation=True) as s ## Exporting Animations -Animations are wonderful but can be quite difficult to export when they are -needed, for example, in a presentation. Here we show how to creat and export -animations using the \*.gif format. +Animations are wonderful but can be quite difficult to export when they are needed, for example, in a presentation. Here we show how to creat and export animations using the *.gif format. ### Built-in export -The easiest way to export an animation is via the Magpylib built-in command -`animation_output` in the `show` function. It works only with the Pyvista -backend. The following code will create a file "test4.gif". +The easiest way to export an animation is via the Magpylib built-in command `animation_output` in the `show` function. It works only with the Pyvista backend. The following code will create a file "test4.gif". ```python import magpylib as magpy import numpy as np # Create magnets with Paths -path = [(np.sin(t) + 1.5, 0, 0) for t in np.linspace(0, 2 * np.pi, 30)] -cube1 = magpy.magnet.Cuboid(dimension=(1, 1, 1), polarization=(1, 0, 0), position=path) -cube2 = cube1.copy(position=-np.array(path), polarization=(-1, 0, 0)) +path = [(np.sin(t)+1.5,0,0) for t in np.linspace(0, 2*np.pi, 30)] +cube1 = magpy.magnet.Cuboid(dimension=(1,1,1), polarization=(1,0,0), position= path) +cube2 = cube1.copy(position=-np.array(path), polarization=(-1,0,0)) # Store gif with animation_output using Pyvista magpy.show( @@ -131,17 +120,13 @@ magpy.show( ### Custom export Pyvista -For customizing videos it is best to work directly in the respective graphic -backends. Here we show how to transfer the Magpylib graphic objects to a Pyvista -plotter, customize the plotting scene, export screen shots, and combine them in -a \*.gif. The following example also shows how to achieve transparency. +For customizing videos it is best to work directly in the respective graphic backends. Here we show how to transfer the Magpylib graphic objects to a Pyvista plotter, customize the plotting scene, export screen shots, and combine them in a *.gif. The following example also shows how to achieve transparency. ```python import magpylib as magpy import pyvista as pv from PIL import Image - def create_gif(images, frame_time, output_file): """Create a GIF from images""" frames = [Image.fromarray(img) for img in images] @@ -158,12 +143,12 @@ def create_gif(images, frame_time, output_file): def init_plotter(): - """Init Pyvista plotter with custom scene layout""" + """ Init Pyvista plotter with custom scene layout""" pl = pv.Plotter(notebook=False, off_screen=True, window_size=[300, 300]) pl.camera_position = [ (5, 5, 5), # Position of the camera (0, 0, 0), # Focal point (what the camera is looking at) - (0, 0, 1), # View up direction + (0, 0, 1) # View up direction ] pl.camera.zoom(0.5) pl.set_background("k") # For better transparency @@ -172,22 +157,18 @@ def init_plotter(): def create_frames(frames): """Create frames with Pyvista.""" - + # Create Magpylib objects - mag1 = magpy.magnet.CylinderSegment( - dimension=(3, 4, 1, 0, 45), polarization=(0, 0, 1) - ) - mag2 = magpy.magnet.CylinderSegment( - dimension=(2, 3, 1, 0, 45), polarization=(0, 0, -1) - ) + mag1 = magpy.magnet.CylinderSegment(dimension=(3, 4, 1, 0, 45), polarization=(0, 0, 1)) + mag2 = magpy.magnet.CylinderSegment(dimension=(2, 3, 1, 0, 45), polarization=(0, 0, -1)) images = [] pl = init_plotter() for i in range(frames): - + # Modify object positions - mag1.rotate_from_angax(360 / frames, axis="z") - mag2.rotate_from_angax(-360 / frames, axis="z") + mag1.rotate_from_angax(360 / frames, axis='z') + mag2.rotate_from_angax(-360 / frames, axis='z') # Transfer Magpylib objects to Pyvista plotter pl.clear() @@ -220,11 +201,7 @@ if __name__ == "__main__": -Notice that when providing a canvas, no update to its layout is performed by -Magpylib, unless explicitly specified by setting `canvas_update=True` in -`show()`. By default `canvas_update="auto"` only updates the canvas if is not -provided by the user. Details can be found in the -[graphics documentation](guide-graphics-canvas). +Notice that when providing a canvas, no update to its layout is performed by Magpylib, unless explicitly specified by setting `canvas_update=True` in `show()`. By default `canvas_update="auto"` only updates the canvas if is not provided by the user. Details can be found in the [graphics documentation](guide-graphics-canvas). ### Custom export Plotly @@ -254,13 +231,9 @@ def create_frames(frames): """Create frames with Pyvista.""" # Create Magpylib objects - mag1 = magpy.magnet.CylinderSegment( - dimension=(3, 4, 1, 0, 45), polarization=(0, 0, 1) - ) - mag2 = magpy.magnet.CylinderSegment( - dimension=(2, 3, 1, 0, 45), polarization=(0, 0, -1) - ) - + mag1 = magpy.magnet.CylinderSegment(dimension=(3, 4, 1, 0, 45), polarization=(0, 0, 1)) + mag2 = magpy.magnet.CylinderSegment(dimension=(2, 3, 1, 0, 45), polarization=(0, 0, -1)) + images = [] for i in range(frames): # Set object position diff --git a/docs/_pages/user_guide/examples/examples_vis_magnet_colors.md b/docs/_pages/user_guide/examples/examples_vis_magnet_colors.md index 5b833f569..bf0218a58 100644 --- a/docs/_pages/user_guide/examples/examples_vis_magnet_colors.md +++ b/docs/_pages/user_guide/examples/examples_vis_magnet_colors.md @@ -13,26 +13,19 @@ kernelspec: --- (examples-vis-magnet-colors)= - # Magnet colors -The polarization direction of a permanent magnet is often graphically displayed -with the help of colors. However, there is no unified color scheme that everyone -agrees on. The following image shows some color-examples from the web. +The polarization direction of a permanent magnet is often graphically displayed with the help of colors. However, there is no unified color scheme that everyone agrees on. The following image shows some color-examples from the web. ![](../../../_static/images/examples_vis_magnet_colors.png) -Magpylib uses the DIN Specification 91411 (soon 91479) standard as default -setting. The tri-color scheme has the advantage that for multi-pole elements it -becomes clear which north is "connected" to which south. +Magpylib uses the DIN Specification 91411 (soon 91479) standard as default setting. The tri-color scheme has the advantage that for multi-pole elements it becomes clear which north is "connected" to which south. ```{hint} The color schemes often seem to represent homogeneous polarizations, referred to as "ideal typical" magnets in DIN Specification 91479. However, they often just represent general "pole patterns", i.e. rough sketches where the field goes in and where it comes out, that are not the result of homogeneous polarizations. On this topic review also the examples example {ref}`examples-misc-inhom`, and the tutorial {ref}`examples-tutorial-modeling-magnets`. ``` -With Magpylib users can easily tune the magnet color schemes. The `style` -options are `tricolor` with north, middle and south colors, and `bicolor` with -north and south colors. +With Magpylib users can easily tune the magnet color schemes. The `style` options are `tricolor` with north, middle and south colors, and `bicolor` with north and south colors. ```{code-cell} ipython import magpylib as magpy @@ -75,5 +68,4 @@ cyl.style.magnetization.color.south = "orange" magpy.show(sphere, cube, cyl, backend='plotly', style_legend_show=False) ``` -More information about styles and how to apply them is given in the user-guide -[style section](guide-graphic-styles). +More information about styles and how to apply them is given in the user-guide [style section](guide-graphic-styles). diff --git a/docs/_pages/user_guide/examples/examples_vis_mpl_streamplot.md b/docs/_pages/user_guide/examples/examples_vis_mpl_streamplot.md index f37416f2f..223a214a6 100644 --- a/docs/_pages/user_guide/examples/examples_vis_mpl_streamplot.md +++ b/docs/_pages/user_guide/examples/examples_vis_mpl_streamplot.md @@ -18,19 +18,9 @@ orphan: true ## Example 1: Cuboid Magnet -In this example we show the B-field of a cuboid magnet using Matplotlib -streamlines. Streamlines are not magnetic field lines in the sense that the -field amplitude cannot be derived from their density. However, Matplotlib -streamlines can show the field amplitude via color and line thickness. One must -be careful that streamlines can only display two components of the field. In the -following example the third field component is always zero - but this is -generally not the case. - -In the example we make use of the -[scaling property](guide-docs-io-scale-invariance). We assume that all length -inputs are in units of mm, and that the polarization input is in units of -millitesla. The resulting `getB` output will also be in millitesla. One must be -careful with scaling - the conversion to H would ofc give units of mA/m. +In this example we show the B-field of a cuboid magnet using Matplotlib streamlines. Streamlines are not magnetic field lines in the sense that the field amplitude cannot be derived from their density. However, Matplotlib streamlines can show the field amplitude via color and line thickness. One must be careful that streamlines can only display two components of the field. In the following example the third field component is always zero - but this is generally not the case. + +In the example we make use of the [scaling property](guide-docs-io-scale-invariance). We assume that all length inputs are in units of mm, and that the polarization input is in units of millitesla. The resulting `getB` output will also be in millitesla. One must be careful with scaling - the conversion to H would ofc give units of mA/m. ```{code-cell} ipython3 import matplotlib.pyplot as plt @@ -91,9 +81,7 @@ Be aware that the above code is not very performant, but quite readable. The fol ## Example 2 - Hollow Cylinder Magnet -A nice visualization is achieved by combining `streamplot` with `contourf`. In -this example we show the B-field of a hollow Cylinder magnet with diametral -polarization in the xy-symmetry plane. +A nice visualization is achieved by combining `streamplot` with `contourf`. In this example we show the B-field of a hollow Cylinder magnet with diametral polarization in the xy-symmetry plane. ```{code-cell} ipython3 import matplotlib.pyplot as plt diff --git a/docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md b/docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md index 807d21be9..8fc2fd30a 100644 --- a/docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md +++ b/docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md @@ -16,9 +16,7 @@ orphan: true # Pyvista 3D field lines -Pyvista offers field-line computation and visualization in 3D. In addition to -the field computation, Magpylib offers magnet visualization that seamlessly -integrates into a Pyvista plotting scene. +Pyvista offers field-line computation and visualization in 3D. In addition to the field computation, Magpylib offers magnet visualization that seamlessly integrates into a Pyvista plotting scene. ```{code-cell} ipython3 import magpylib as magpy @@ -72,4 +70,4 @@ pl.add_mesh( # Prepare and show scene pl.camera.position = (0.03, 0.03, 0.03) pl.show() -``` +``` \ No newline at end of file diff --git a/docs/_pages/user_guide/examples/examples_vis_subplots.md b/docs/_pages/user_guide/examples/examples_vis_subplots.md index caeaefdcc..9f926ed03 100644 --- a/docs/_pages/user_guide/examples/examples_vis_subplots.md +++ b/docs/_pages/user_guide/examples/examples_vis_subplots.md @@ -16,9 +16,7 @@ kernelspec: # Subplots -It is very illustrative to combine 2D and 3D subplots when viewing the field -along paths. Consider the following system of a sensor and a magnet, both -endowed with paths. +It is very illustrative to combine 2D and 3D subplots when viewing the field along paths. Consider the following system of a sensor and a magnet, both endowed with paths. ```{code-cell} ipython3 import numpy as np @@ -39,14 +37,11 @@ sens = magpy.Sensor( ) ``` -In the following, we demonstrate various ways how to generate 2D/3D subplot -combinations for this system. +In the following, we demonstrate various ways how to generate 2D/3D subplot combinations for this system. # Plotting canvas with own figure -Customization is best done by adding the -[Magpylib 3D-model](guide-graphics-show) to your own figure using the `canvas` -kwarg. +Customization is best done by adding the [Magpylib 3D-model](guide-graphics-show) to your own figure using the `canvas` kwarg. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -66,16 +61,12 @@ magpy.show(sens, cyl, canvas=ax2) plt.show() ``` -How to add and modify subplots in all three supported backends is demonstrated -in the [canvas documentation](guide-graphics-canvas). It is also possible to -customize the Magpylib 3D output by returning and editing the respective canvas -using the `return_fig` kwarg, see [return figures](guide-graphics-return_fig). +How to add and modify subplots in all three supported backends is demonstrated in the [canvas documentation](guide-graphics-canvas). It is also possible to customize the Magpylib 3D output by returning and editing the respective canvas using the `return_fig` kwarg, see [return figures](guide-graphics-return_fig). + # Built-in subplots -For maximal efficiency, Magpylib offers auto-generated subplots of 3D models and -the field along paths by providing the `show` function with proper input -dictionaries. +For maximal efficiency, Magpylib offers auto-generated subplots of 3D models and the field along paths by providing the `show` function with proper input dictionaries. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -87,13 +78,11 @@ magpy.show( ) ``` -Detailed information on built-in subplots is provided in the -[user guide](guide-graphics-subplots). +Detailed information on built-in subplots is provided in the [user guide](guide-graphics-subplots). # show_context -With a built-in context manager this functionality can be accessed with maximal -ease +With a built-in context manager this functionality can be accessed with maximal ease ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed diff --git a/docs/_pages/user_guide/guide_index.md b/docs/_pages/user_guide/guide_index.md index 62769d139..a63482e3d 100644 --- a/docs/_pages/user_guide/guide_index.md +++ b/docs/_pages/user_guide/guide_index.md @@ -1,9 +1,7 @@ (guide-index)= - # User Guide -The user guide provides detailed descriptions of the Magpylib API with many -interactive examples to help users along the way. +The user guide provides detailed descriptions of the Magpylib API with many interactive examples to help users along the way. ```{toctree} :maxdepth: 2 diff --git a/docs/_pages/user_guide/guide_resources_01_physics.md b/docs/_pages/user_guide/guide_resources_01_physics.md index 8d8731862..9c0b2821a 100644 --- a/docs/_pages/user_guide/guide_resources_01_physics.md +++ b/docs/_pages/user_guide/guide_resources_01_physics.md @@ -1,23 +1,13 @@ (guide-ressources-physics)= - # Physics and Computation ## What is implemented ? -The expressions used in Magpylib describe perfectly homogeneous magnets, surface -charges, and line currents with natural boundary conditions. Magpylib is at its -best when dealing with static air-coils (no eddy currents, no soft-magnetic -cores) and high-grade permanent magnets (Ferrite, NdFeB, SmCo or similar -materials). When **magnet** permeabilities are below $\mu_r < 1.1$ the error -typically undercuts few %. Demagnetization factors are not included. The line -**current** solutions give the exact same field as outside of a wire that -carries a homogeneous current. +The expressions used in Magpylib describe perfectly homogeneous magnets, surface charges, and line currents with natural boundary conditions. Magpylib is at its best when dealing with static air-coils (no eddy currents, no soft-magnetic cores) and high-grade permanent magnets (Ferrite, NdFeB, SmCo or similar materials). When **magnet** permeabilities are below $\mu_r < 1.1$ the error typically undercuts few %. Demagnetization factors are not included. The line **current** solutions give the exact same field as outside of a wire that carries a homogeneous current. ## The analytical solutions -Magnetic field computations in Magpylib are based on known analytical solutions -(closed form expressions) to permanent magnet and current problems. The Magpylib -implementations are based on the following literature references: +Magnetic field computations in Magpylib are based on known analytical solutions (closed form expressions) to permanent magnet and current problems. The Magpylib implementations are based on the following literature references: - Field of cuboid magnets [^1] [^2] [^3] [^4] - Field of cylindrical magnets: [^5] [^6] [^7] [^8] @@ -25,218 +15,109 @@ implementations are based on the following literature references: - Field of the current loop: [^12] - all others derived by hand -A short reflection on how these formulas can be achieved: In magnetostatics the -magnetic field becomes conservative (Maxwell: $\nabla \times {\bf H} = 0$) and -can thus be expressed through the magnetic scalar potential $\Phi_m$: +A short reflection on how these formulas can be achieved: In magnetostatics the magnetic field becomes conservative (Maxwell: $\nabla \times {\bf H} = 0$) and can thus be expressed through the magnetic scalar potential $\Phi_m$: $$ {\bf H} = -\nabla\cdot\Phi_m $$ -The solution to this equation can be expressed by an integral over the -magnetization distribution ${\bf M}({\bf r})$ as +The solution to this equation can be expressed by an integral over the magnetization distribution ${\bf M}({\bf r})$ as $$ \Phi_m({\bf r}) = \frac{1}{4\pi}\int_{V'}\frac{\nabla'\cdot {\bf M}({\bf r}')}{|{\bf r}-{\bf r}'|}dV'+\frac{1}{4\pi}\oint_{S'}\frac{{\bf n}'\cdot {\bf M}({\bf r}')}{|{\bf r}-{\bf r}'|}dS' $$ -where ${\bf r}$ denotes the position, $V$ is the magnetized volume with surface -$S$ and normal vector ${\bf n}$ onto the surface. This solution is derived in -detail e.g. in [^13]. +where ${\bf r}$ denotes the position, $V$ is the magnetized volume with surface $S$ and normal vector ${\bf n}$ onto the surface. This solution is derived in detail e.g. in [^13]. -The fields of currents are directly derived using the law of Biot-Savart with -the current distribution ${\bf J}({\bf r})$: +The fields of currents are directly derived using the law of Biot-Savart with the current distribution ${\bf J}({\bf r})$: $$ {\bf B}({\bf r}) = \frac{\mu_0}{4\pi}\int_{V'} {\bf J}({\bf r}')\times \frac{{\bf r}-{\bf r}'}{|{\bf r}-{\bf r}'|^3} dV' $$ -In some special cases (simple shapes, homogeneous magnetisations, and current -distributions) the above integrals can be worked out directly to give analytical -formulas (or simple, fast converging series). The derivations can be found in -the respective references. A noteworthy comparison between the Coulombian -approach and the Amperian current model is given in [^14]. +In some special cases (simple shapes, homogeneous magnetisations, and current distributions) the above integrals can be worked out directly to give analytical formulas (or simple, fast converging series). The derivations can be found in the respective references. A noteworthy comparison between the Coulombian approach and the Amperian current model is given in [^14]. ## Accuracy of the Solutions and Demagnetization ### Line currents: -The magnetic field of a wire carrying a homogeneous current density is (on the -outside) similar to the field of a line current positioned in the center of the -wire, which carries the same total current. Current distributions become -inhomogeneous at bends of the wire or when eddy currents (finite frequencies) -are involved. +The magnetic field of a wire carrying a homogeneous current density is (on the outside) similar to the field of a line current positioned in the center of the wire, which carries the same total current. Current distributions become inhomogeneous at bends of the wire or when eddy currents (finite frequencies) are involved. (guide-physics-demag)= - ### Magnets and Demagnetization -The analytical solutions are exact when bodies have a homogeneous magnetization. -However, real materials always have a material response which results in an -inhomogeneous magnetization even when the initial magnetization is perfectly -homogeneous. There is a lot of literature on such -[demagnetization effects](https://en.wikipedia.org/wiki/Demagnetizing_field). +The analytical solutions are exact when bodies have a homogeneous magnetization. However, real materials always have a material response which results in an inhomogeneous magnetization even when the initial magnetization is perfectly homogeneous. There is a lot of literature on such [demagnetization effects](https://en.wikipedia.org/wiki/Demagnetizing_field). -Modern high grade permanent magnets (NdFeB, SmCo, Ferrite) have a very weak -material responses (local slope of the magnetization curve, remanent -permeability) of the order of $\mu_r \approx 1.05$. In this case the analytical -solutions provide an excellent approximation with less than 1% error even at -close distance from the magnet surface. A detailed error analysis and discussion -is presented in the appendix of [^15]. +Modern high grade permanent magnets (NdFeB, SmCo, Ferrite) have a very weak material responses (local slope of the magnetization curve, remanent permeability) of the order of $\mu_r \approx 1.05$. In this case the analytical solutions provide an excellent approximation with less than 1% error even at close distance from the magnet surface. A detailed error analysis and discussion is presented in the appendix of [^15]. -Error estimation as a result of the material response is evaluated in more -detail in the appendix of -[Malagò2020](https://www.mdpi.com/1424-8220/20/23/6873). +Error estimation as a result of the material response is evaluated in more detail in the appendix of [Malagò2020](https://www.mdpi.com/1424-8220/20/23/6873). -Demagnetization factors can be used to compensate a large part of the -demagnetization effect. Analytical expressions for the demagnetization factors -of cuboids can be found at -[magpar.net](http://www.magpar.net/static/magpar/doc/html/demagcalc.html). +Demagnetization factors can be used to compensate a large part of the demagnetization effect. Analytical expressions for the demagnetization factors of cuboids can be found at [magpar.net](http://www.magpar.net/static/magpar/doc/html/demagcalc.html). -(phys-remanence)= +(phys-remanence)= ### Modeling a datasheet magnet -The material remanence, often found in data sheets, simply corresponds to the -material magnetization/polarization when not under the influence of external -fields. This can never happen, as the material itself generates a magnetic -field. Such self-interactions result in self-demagnetization that can be -approximated using the demagnetization factors and the material permeability (or -susceptibility). - -For example, a cube with 1 mm sides has a demagnetization factor is 0.333, see -[magpar.net](http://www.magpar.net/static/magpar/doc/html/demagcalc.html). When -the remanence field of this cube is 1 T, and its susceptibility is 0.1, the -magnetization resulting from self-interaction is reduced to 1 T - 0.3333\*0.1 T -= 0.9667 T, assuming linear material laws. - -A [tutorial](examples-tutorial-modeling-magnets) explains how to deal with -demagnetization effects and how real magnets can be modeled using datasheet -values. - -It must be understood that the change in magnetization resulting from -self-interaction has a homogeneous contribution which is approximated by the -demagnetization factor, and an inhomogeneous contribution which cannot be -modeled easily with analytical solutions. The inhomogeneous part, however, is -typically an order of magnitude lower than the homogeneous part. You can use the -Magpylib extension -[Magpylib material response](https://github.com/magpylib/magpylib-material-response) -to model the self-interactions. +The material remanence, often found in data sheets, simply corresponds to the material magnetization/polarization when not under the influence of external fields. This can never happen, as the material itself generates a magnetic field. Such self-interactions result in self-demagnetization that can be approximated using the demagnetization factors and the material permeability (or susceptibility). + +For example, a cube with 1 mm sides has a demagnetization factor is 0.333, see [magpar.net](http://www.magpar.net/static/magpar/doc/html/demagcalc.html). When the remanence field of this cube is 1 T, and its susceptibility is 0.1, the magnetization resulting from self-interaction is reduced to 1 T - 0.3333*0.1 T = 0.9667 T, assuming linear material laws. + +A [tutorial](examples-tutorial-modeling-magnets) explains how to deal with demagnetization effects and how real magnets can be modeled using datasheet values. + +It must be understood that the change in magnetization resulting from self-interaction has a homogeneous contribution which is approximated by the demagnetization factor, and an inhomogeneous contribution which cannot be modeled easily with analytical solutions. The inhomogeneous part, however, is typically an order of magnitude lower than the homogenous part. You can use the Magpylib extension [Magpylib material response](https://github.com/magpylib/magpylib-material-response) to model the self-interactions. ### Soft-Magnetic Materials -Soft-magnetic materials like iron or steel with large permeabilities -$\mu_r \sim 1000$ and low remanence fields are dominated by the material -response. It is not possible to describe such bodies with analytical solutions. -However, recent developments showed that the **Magnetostatic Method of Moments** -can be a powerful tool in combination with Magpylib to compute such a material -response. An integration into Magpylib is planned in the future. +Soft-magnetic materials like iron or steel with large permeabilities $\mu_r \sim 1000$ and low remanence fields are dominated by the material response. It is not possible to describe such bodies with analytical solutions. However, recent developments showed that the **Magnetostatic Method of Moments** can be a powerful tool in combination with Magpylib to compute such a material response. An integration into Magpylib is planned in the future. -When a magnet lies in front of a soft-magnetic plate, the contribution from the -plate can be modeled with high accuracy using a **mirror**-approach, similar to -the electrostatic "mirror charge". +When a magnet lies in front of a soft-magnetic plate, the contribution from the plate can be modeled with high accuracy using a **mirror**-approach, similar to the electrostatic "mirror charge". -(docu-performance)= +(docu-performance)= ## Computation Performance -Magpylib code is fully -[vectorized](https://en.wikipedia.org/wiki/Array_programming), written almost -completely in numpy native. Magpylib automatically vectorizes the computation -with complex inputs (many sources, many observers, paths) and never falls back -on using loops. +Magpylib code is fully [vectorized](https://en.wikipedia.org/wiki/Array_programming), written almost completely in numpy native. Magpylib automatically vectorizes the computation with complex inputs (many sources, many observers, paths) and never falls back on using loops. ```{note} Maximal performance is achieved when `.getB(sources, observers)` is called only a single time in your program. Try not to use loops. ``` -The object-oriented interface comes with an overhead. If you want to achieve -maximal performance this overhead can be avoided with -{ref}`docs-field-functional`. +The object-oriented interface comes with an overhead. If you want to achieve maximal performance this overhead can be avoided with {ref}`docs-field-functional`. -The analytical solutions provide extreme performance. Single field evaluations -take of the order of `100 µs`. For large input arrays (e.g. many observer -positions or many similar magnets) the computation time can drop below `1 µs` -per evaluation point on single state-of-the-art x86 mobile cores (tested on -`Intel Core i5-8365U @ 1.60GHz`), depending on the source type. +The analytical solutions provide extreme performance. Single field evaluations take of the order of `100 µs`. For large input arrays (e.g. many observer positions or many similar magnets) the computation time can drop below `1 µs` per evaluation point on single state-of-the-art x86 mobile cores (tested on `Intel Core i5-8365U @ 1.60GHz`), depending on the source type. ## Numerical stability -Many expressions provided in the literature have very questionable numerical -stability. Many of these problems are fixed in Magpylib, but one should be aware -that accuracy can be a problem very close to objects, close the z-axis in -cylindrical symmetries, at edge extensions, and at large distances. We are -working on fixing these problems. Some details can be found in [^12]. +Many expressions provided in the literature have very questionable numerical stability. Many of these problems are fixed in Magpylib, but one should be aware that accuracy can be a problem very close to objects, close the z-axis in cylindrical symmetries, at edge extensions, and at large distances. We are working on fixing these problems. Some details can be found in [^12]. **References** -[^1]: - Z. J. Yang et al., "Potential and force between a magnet and a bulk - Y1Ba2Cu3O7-d superconductor studied by a mechanical pendulum", - Superconductor Science and Technology 3(12):591, 1990 - -[^2]: - R. Engel-Herbert et al., Journal of Applied Physics 97(7):074504 - 074504-4 - (2005) - -[^3]: - J.M. Camacho and V. Sosa, "Alternative method to calculate the magnetic - field of permanent magnets with azimuthal symmetry", Revista Mexicana de - Fisica E 59 8–17, 2013 - -[^4]: - D. Cichon, R. Psiuk and H. Brauer, "A Hall-Sensor-Based Localization Method - With Six Degrees of Freedom Using Unscented Kalman Filter", IEEE Sensors - Journal, Vol. 19, No. 7, April 1, 2019. - -[^5]: - E. P. Furlani, S. Reanik and W. Janson, "A Three-Dimensional Field Solution - for Bipolar Cylinders", IEEE Transaction on Magnetics, VOL. 30, NO. 5, 1994 - -[^6]: - N. Derby, "Cylindrical Magnets and Ideal Solenoids", arXiv:0909.3880v1, 2009 - -[^7]: - A. Caciagli, R. J. Baars, A. P. Philipse and B. W. M. Kuipers, "Exact - expression for the magnetic field of a finite cylinder with arbitrary - uniform magnetization", Journal of Magnetism and Magnetic Materials 456 - (2018) 423–432. - -[^8]: - F. Slanovc, M. Ortner, M. Moridi, C. Abert and D. Suess, "Full analytical - solution for the magnetic field of uniformly magnetized cylinder tiles", - submitted to Journal of Magnetism and Magnetic Materials. - -[^9]: - D. Guptasarma and B. Singh, "New scheme for computing the magnetic field - resulting from a uniformly magnetized arbitrary polyhedron", Geophysics - (1999), 64(1):70. - -[^10]: - J.L.G. Janssen, J.J.H. Paulides and E.A. Lomonova, "3D ANALYTICAL FIELD - CALCULATION USING TRIANGULAR MAGNET SEGMENTS APPLIED TO A SKEWED LINEAR - PERMANENT MAGNET ACTUATOR", ISEF 2009 - XIV International Symposium on - Electromagnetic Fields in Mechatronics, Electrical and Electronic - Engineering Arras, France, September 10-12, 2009 - -[^11]: - C. Rubeck et al., "Analytical Calculation of Magnet Systems: Magnetic Field - Created by Charged Triangles and Polyhedra", IEEE Transactions on Magnetics, - VOL. 49, NO. 1, 2013 - -[^12]: - M. Ortner, S. Slanovc and P. Leitner, "Numerically Stable and - Computationally Efficient Expression for the Magnetic Field of a Current - Loop", MDPI Magnetism, 3(1), 11-31, 2022. +[^1]: Z. J. Yang et al., "Potential and force between a magnet and a bulk Y1Ba2Cu3O7-d superconductor studied by a mechanical pendulum", Superconductor Science and Technology 3(12):591, 1990 + +[^2]: R. Engel-Herbert et al., Journal of Applied Physics 97(7):074504 - 074504-4 (2005) + +[^3]: J.M. Camacho and V. Sosa, "Alternative method to calculate the magnetic field of permanent magnets with azimuthal symmetry", Revista Mexicana de Fisica E 59 8–17, 2013 + +[^4]: D. Cichon, R. Psiuk and H. Brauer, "A Hall-Sensor-Based Localization Method With Six Degrees of Freedom Using Unscented Kalman Filter", IEEE Sensors Journal, Vol. 19, No. 7, April 1, 2019. + +[^5]: E. P. Furlani, S. Reanik and W. Janson, "A Three-Dimensional Field Solution for Bipolar Cylinders", IEEE Transaction on Magnetics, VOL. 30, NO. 5, 1994 + +[^6]: N. Derby, "Cylindrical Magnets and Ideal Solenoids", arXiv:0909.3880v1, 2009 + +[^7]: A. Caciagli, R. J. Baars, A. P. Philipse and B. W. M. Kuipers, "Exact expression for the magnetic field of a finite cylinder with arbitrary uniform magnetization", Journal of Magnetism and Magnetic Materials 456 (2018) 423–432. + +[^8]: F. Slanovc, M. Ortner, M. Moridi, C. Abert and D. Suess, "Full analytical solution for the magnetic field of uniformly magnetized cylinder tiles", submitted to Journal of Magnetism and Magnetic Materials. + +[^9]: D. Guptasarma and B. Singh, "New scheme for computing the magnetic field resulting from a uniformly magnetized arbitrary polyhedron", Geophysics (1999), 64(1):70. + +[^10]: J.L.G. Janssen, J.J.H. Paulides and E.A. Lomonova, "3D ANALYTICAL FIELD CALCULATION USING TRIANGULAR MAGNET SEGMENTS APPLIED TO A SKEWED LINEAR PERMANENT MAGNET ACTUATOR", ISEF 2009 - XIV International Symposium on Electromagnetic Fields in Mechatronics, Electrical and Electronic Engineering Arras, France, September 10-12, 2009 + +[^11]: C. Rubeck et al., "Analytical Calculation of Magnet Systems: Magnetic Field Created by Charged Triangles and Polyhedra", IEEE Transactions on Magnetics, VOL. 49, NO. 1, 2013 + +[^12]: M. Ortner, S. Slanovc and P. Leitner, "Numerically Stable and Computationally Efficient Expression for the Magnetic Field of a Current Loop", MDPI Magnetism, 3(1), 11-31, 2022. [^13]: J. D. Jackson, "Classical Electrodynamics", 1999 Wiley, New York -[^14]: - R. Ravaud and G. Lamarquand, "Comparison of the coulombian and amperian - current models for calculating the magnetic field produced by radially - magnetized arc-shaped permanent magnets", HAL Id: hal-00412346 +[^14]: R. Ravaud and G. Lamarquand, "Comparison of the coulombian and amperian current models for calculating the magnetic field produced by radially magnetized arc-shaped permanent magnets", HAL Id: hal-00412346 -[^15]: - P. Malagò et al., Magnetic Position System Design Method Applied to - Three-Axis Joystick Motion Tracking. Sensors, 2020, 20. Jg., Nr. 23, - S. 6873. +[^15]: P. Malagò et al., Magnetic Position System Design Method Applied to Three-Axis Joystick Motion Tracking. Sensors, 2020, 20. Jg., Nr. 23, S. 6873. diff --git a/docs/_pages/user_guide/guide_start_01_install.md b/docs/_pages/user_guide/guide_start_01_install.md index e351f5434..e8f1473e8 100644 --- a/docs/_pages/user_guide/guide_start_01_install.md +++ b/docs/_pages/user_guide/guide_start_01_install.md @@ -2,27 +2,28 @@ ## Dependencies and Synergies -Magpylib supports _Python3.10+_ and relies on common scientific computation -libraries _NumPy_ and _Scipy_ for computation, and _Matplotlib_ and _Plotly_ for -graphic outputs. +Magpylib supports *Python3.10+* and relies on common scientific computation libraries *NumPy* and *Scipy* for computation, and *Matplotlib* and *Plotly* for graphic outputs. -Optionally, _Pyvista_ is supported as graphical backend, as well as _Pandas_ for -the field computation output. +Optionally, *Pyvista* is supported as graphical backend, as well as *Pandas* for the field computation output. ## Installation -::::{grid} 1 1 2 2 :margin: 4 4 0 0 :gutter: 4 - -:::{grid-item-card} Install with pip: :text-align: center :shadow: none +::::{grid} 1 1 2 2 +:margin: 4 4 0 0 +:gutter: 4 +:::{grid-item-card} Install with pip: +:text-align: center +:shadow: none ```console pip install magpylib ``` - -::: :::{grid-item-card} Install with conda: :text-align: center :shadow: none - +::: +:::{grid-item-card} Install with conda: +:text-align: center +:shadow: none ```console conda install -c conda-forge magpylib ``` - -::: :::: +::: +:::: diff --git a/docs/_pages/user_guide/guide_start_02_fundamentals.md b/docs/_pages/user_guide/guide_start_02_fundamentals.md index cdd0fa4d4..a8f18ca35 100644 --- a/docs/_pages/user_guide/guide_start_02_fundamentals.md +++ b/docs/_pages/user_guide/guide_start_02_fundamentals.md @@ -1,26 +1,19 @@ (getting-started)= - # The Magpylib fundamentals -In this section we present the most important Magpylib features, focussing on -the intuitive object-oriented interface. +In this section we present the most important Magpylib features, focussing on the intuitive object-oriented interface. ## Basic features -Learn the Magpylib fundamentals (create magnets, view system, compute field) in -5 minutes. This requires a basic understanding of the Python programming -language, the [NumPy array class](https://numpy.org/doc/stable/) and the -[Scipy Rotation class](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html). +Learn the Magpylib fundamentals (create magnets, view system, compute field) in 5 minutes. This requires a basic understanding of the Python programming language, the [NumPy array class](https://numpy.org/doc/stable/) and the [Scipy Rotation class](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html). ```{hint} -Since v5 all Magpylib inputs and outputs are by default in SI-units. See {ref}`guide-docs-io-scale-invariance` for convenient use. +Since v5 all Magpylib inputs and ouputs are by default in SI-units. See {ref}`guide-docs-io-scale-invariance` for convenient use. ``` ### Create sources and observers as Python objects -In the object oriented interface sources of the magnetic field (magnets, -currents, others) and observers of the magnetic field (sensors) are created as -Python objects. +In the object oriented interface sources of the magnetic field (magnets, currents, others) and observers of the magnetic field (sensors) are created as Python objects. ```python import magpylib as magpy @@ -29,7 +22,7 @@ import magpylib as magpy # of 1 T pointing in x-direction and sides of # 1,2 and 3 cm respectively (notice the use of SI units). -cube = magpy.magnet.Cuboid(polarization=(1, 0, 0), dimension=(0.01, 0.02, 0.03)) +cube = magpy.magnet.Cuboid(polarization=(1,0,0), dimension=(0.01,0.02,0.03)) # Create a Sensor for measuring the field @@ -40,78 +33,71 @@ Find detailed information on the Magpylib classes [here](docs-classes). ### Position and orientation -All Magpylib objects (sources and observers) have position and orientation in a -global Cartesian coordinate system that can be manipulated. +All Magpylib objects (sources and observers) have position and orientation in a global Cartesian coordinate system that can be manipulated. ```python # By default, the position of a Magpylib object is # (0,0,0) and its orientation is the unit rotation, # given by a scipy rotation object. -print(cube.position) # -> [0. 0. 0.] -print(cube.orientation.as_rotvec()) # -> [0. 0. 0.] +print(cube.position) # -> [0. 0. 0.] +print(cube.orientation.as_rotvec()) # -> [0. 0. 0.] # Manipulate object position and orientation through # the respective attributes (move 10 mm and rotate 45 deg): from scipy.spatial.transform import Rotation as R +cube.position = (0.01,0,0) +cube.orientation = R.from_rotvec((0,0,45), degrees=True) -cube.position = (0.01, 0, 0) -cube.orientation = R.from_rotvec((0, 0, 45), degrees=True) - -print(cube.position) # -> [0.01 0. 0. ] -print(cube.orientation.as_rotvec(degrees=True)) # -> [0. 0. 45.] +print(cube.position) # -> [0.01 0. 0. ] +print(cube.orientation.as_rotvec(degrees=True)) # -> [0. 0. 45.] # Apply relative motion with the powerful `move` # and `rotate` methods. -sensor.move((-0.01, 0, 0)) -sensor.rotate_from_angax(angle=-45, axis="z") +sensor.move((-0.01,0,0)) +sensor.rotate_from_angax(angle=-45, axis='z') -print(sensor.position) # -> [-0.01 0. 0. ] -print(sensor.orientation.as_rotvec(degrees=True)) # -> [ 0. 0. -45.] +print(sensor.position) # -> [-0.01 0. 0. ] +print(sensor.orientation.as_rotvec(degrees=True)) # -> [ 0. 0. -45.] ``` -Find detailed information on position and orientation attributes and how to -manipulate them [here](docs-position). +Find detailed information on position and orientation attributes and how to manipulate them [here](docs-position). ### 3D view of objects -In-built 3D graphic output helps to see if all Magpylib objects are positioned -properly. The magnet polarization is represented by default by a 3-color scheme, -the sensor by an axes cross. +In-built 3D graphic output helps to see if all Magpylib objects are positioned properly. The magnet polarization is represented by default by a 3-color scheme, the sensor by an axes cross. ```python # Use the `show` function to view your system # through Matplotlib, Plotly or Pyvista backends. -magpy.show(cube, sensor, backend="plotly") +magpy.show(cube, sensor, backend='plotly') ``` -Detailed information on the graphical output with `show` is given -[here](guide-graphics). +Detailed information on the graphical output with `show` is given [here](guide-graphics). ### Computing the field -The field can be computed at sensor objects, or simply by specifying a position -of interest. +The field can be computed at sensor objects, or simply by specifying a position of interest. ```python # Compute the B-field for some positions. -points = [(0, 0, -0.01), (0, 0, 0), (0, 0, 0.01)] # in SI Units (m) +points = [(0,0,-.01), (0,0,0), (0,0,.01)] # in SI Units (m) B = magpy.getB(cube, points) -print(B.round(2)) # -> [[ 0.26 0.07 0.08] -# [ 0.28 0.05 0. ] -# [ 0.26 0.07 -0.08]] # in SI Units (T) +print(B.round(2)) # -> [[ 0.26 0.07 0.08] + # [ 0.28 0.05 0. ] + # [ 0.26 0.07 -0.08]] # in SI Units (T) # Compute the H-field at the sensor. H = magpy.getH(cube, sensor) -print(H.round()) # -> [51017. 24210. 0.] # in SI Units (A/m) +print(H.round()) # -> [51017. 24210. 0.] # in SI Units (A/m) ``` ```{hint} @@ -122,68 +108,64 @@ Detailed information on field computation is provided [here](docs-fieldcomp). ## Advanced features -While most things can be achieved with the above, the following features will -make your live much easier. +While most things can be achieved with the above, the following features will make your live much easier. ### Paths -Magpylib position and orientation attributes can store multiple values that are -referred to as paths. The field will automatically be computed for all path -positions. Use this feature to model objects that move to multiple locations. +Magpylib position and orientation attributes can store multiple values that are referred to as paths. The field will automatically be computed for all path positions. Use this feature to model objects that move to multiple locations. ```python import numpy as np import magpylib as magpy # Create magnet -sphere = magpy.magnet.Sphere(diameter=0.01, polarization=(0, 0, 1)) +sphere = magpy.magnet.Sphere( + diameter=.01, + polarization=(0,0,1) +) # Assign a path -sphere.position = np.linspace((-0.02, 0, 0), (0.02, 0, 0), 7) +sphere.position = np.linspace((-.02,0,0), (.02,0,0), 7) # The field is automatically computed for every path position -B = sphere.getB((0, 0, 0.01)) +B = sphere.getB((0,0,.01)) print(B.round(3)) # ->[[ 0.004 0. -0.001] -# [ 0.013 0. 0.001] -# [ 0.033 0. 0.026] -# [ 0. 0. 0.083] -# [-0.033 0. 0.026] -# [-0.013 0. 0.001] -# [-0.004 0. -0.001]] + # [ 0.013 0. 0.001] + # [ 0.033 0. 0.026] + # [ 0. 0. 0.083] + # [-0.033 0. 0.026] + # [-0.013 0. 0.001] + # [-0.004 0. -0.001]] ``` More information on paths is provided [here](docs-position). ### Collections - -Magpylib objects can be grouped into Collections. An operation applied to a -Collection is applied to every object in it. The Collection itself behaves like -a single source object. +Magpylib objects can be grouped into Collections. An operation applied to a Collection is applied to every object in it. The Collection itself behaves like a single source object. ```python import magpylib as magpy # Create objects obj1 = magpy.Sensor() -obj2 = magpy.magnet.Cuboid(polarization=(0, 0, 1), dimension=(0.01, 0.02, 0.03)) +obj2 = magpy.magnet.Cuboid( + polarization=(0,0,1), + dimension=(.01,.02,.03)) # Group objects coll = magpy.Collection(obj1, obj2) # Manipulate Collection -coll.move((0.001, 0.002, 0.003)) +coll.move((.001,.002,.003)) -print(obj1.position) # -> [0.001 0.002 0.003] -print(obj2.position) # -> [0.001 0.002 0.003] +print(obj1.position) # -> [0.001 0.002 0.003] +print(obj2.position) # -> [0.001 0.002 0.003] ``` -Collections are discussed in detail [here](guide-docs-classes-collections). +Collections are dicussed in detail [here](guide-docs-classes-collections). ### Complex Magnet Shapes - -There most convenient way to create a magnet with complex shape is by using the -convex hull of a point cloud (= simplest geometric form that includes all given -points) and transform it into a triangular surface mesh. +There most convenient way to create a magnet with complex shape is by using the convex hull of a point cloud (= simplest geometric form that includes all given points) and transform it into a triangular surface mesh. ```python import numpy as np @@ -191,14 +173,16 @@ import numpy as np import magpylib as magpy # Create a Pyramid magnet -points = np.array( - [ - (-1, -1, 0), - (-1, 1, 0), - (1, -1, 0), - (1, 1, 0), - (0, 0, 2), - ] +points = ( + np.array( + [ + (-1, -1, 0), + (-1, 1, 0), + (1, -1, 0), + (1, 1, 0), + (0, 0, 2), + ] + ) ) pyramid = magpy.magnet.TriangularMesh.from_ConvexHull( magnetization=(0, 0, 1e6), @@ -208,14 +192,12 @@ pyramid = magpy.magnet.TriangularMesh.from_ConvexHull( # Display the magnet graphically pyramid.show() ``` - -There are several other possibilities to create complex magnet shapes. Some can -be found in the [examples](examples-complex-magnet-shapes). +There are several other possibilities to create complex magnet shapes. Some can be found in the [examples](examples-complex-magnet-shapes). -### Graphic Styles +### Graphic Styles Magpylib offers many ways to customize the graphic output. ```python @@ -223,32 +205,29 @@ import magpylib as magpy # Create Cuboid magnet with custom style cube = magpy.magnet.Cuboid( - polarization=(0, 0, 1), - dimension=(0.01, 0.01, 0.01), - style_color="r", - style_magnetization_mode="arrow", + polarization=(0,0,1), + dimension=(.01,.01,.01), + style_color='r', + style_magnetization_mode='arrow' ) # Create Cylinder magnet with custom style cyl = magpy.magnet.Cylinder( - polarization=(0, 0, 1), - dimension=(0.01, 0.01), - position=(0.02, 0, 0), - style_magnetization_color_mode="bicolor", - style_magnetization_color_north="m", - style_magnetization_color_south="c", + polarization=(0,0,1), + dimension=(.01,.01), + position=(.02,0,0), + style_magnetization_color_mode='bicolor', + style_magnetization_color_north='m', + style_magnetization_color_south='c', ) magpy.show(cube, cyl) ``` - The many options for graphic styling can be found [here](guide-graphic-styles). ### Animation - -Object paths can be animated. For this feature the plotly graphic backend is -recommended. +Object paths can be animated. For this feature the plotly graphic backend is recommended. ```python import numpy as np @@ -257,26 +236,23 @@ import magpylib as magpy # Create magnet with path cube = magpy.magnet.Cuboid( - magnetization=(0, 0, 1), - dimension=(1, 1, 1), + magnetization=(0,0,1), + dimension=(1,1,1), +) +cube.rotate_from_angax( + angle=np.linspace(10,360,18), + axis='x' ) -cube.rotate_from_angax(angle=np.linspace(10, 360, 18), axis="x") # Generate an animation with `show` cube.show(animation=True, backend="plotly") ``` - -Nice animation examples are shown [here](examples-vis-animations), and a -detailed discussion is provided [here](guide-graphic-animations). +Nice animation examples are shown [here](examples-vis-animations), and a detailed discussion is provided [here](guide-graphic-animations). ### Functional interface - -Magpylib's object oriented interface is convenient to work with but is also -slowed down by object initialization and handling. The functional interface -bypasses this load and enables fast field computation for an arbitrary set of -input parameters. +Magpylib's object oriented interface is convenient to work with but is also slowed down by object initialization and handling. The functional interface bypasses this load and enables fast field computation for an arbitrary set of input parameters. ```python import magpylib as magpy @@ -290,8 +266,8 @@ B = magpy.getB( ) print(B.round(3)) # -> [[-0.043 0. 0.014] -# [ 0. 0. 0.135] -# [ 0.043 0. 0.014]] + # [ 0. 0. 0.135] + # [ 0.043 0. 0.014]] ``` Details on the functional interface are found [here](docs-field-functional). diff --git a/docs/_static/custom.css b/docs/_static/custom.css index b53294376..d699c9c38 100644 --- a/docs/_static/custom.css +++ b/docs/_static/custom.css @@ -1,35 +1,39 @@ #galleryimg { - background: red; + background: red; } /* fix image transparency in docu WTF? */ -html[data-theme="dark"] .bd-content img:not(.only-dark):not(.dark-light) { - background: none; +html[data-theme=dark] .bd-content img:not(.only-dark):not(.dark-light) { + background: none; } /* custom padding for index page*/ .sectiontext { - margin-top: -40px; + margin-top:-40px; } + /* hide vertical scrollbar - it always appears unwanted when there is no content */ .bd-sidebar { - overflow-y: auto; /* Change to auto to only show scrollbar when necessary */ + overflow-y: auto; /* Change to auto to only show scrollbar when necessary */ } + + /* Adjust the height to ensure it fits within the viewport */ /* .bd-sidebar { max-height: calc(100vh - var(--header-height, 0px)); } */ + /* Target the logo text */ .navbar-brand { - font-weight: bold; - font-size: 1.6em; + font-weight: bold; + font-size: 1.6em; } diff --git a/docs/_static/switcher.json b/docs/_static/switcher.json index 291b20eba..6fa25f9fd 100644 --- a/docs/_static/switcher.json +++ b/docs/_static/switcher.json @@ -1,24 +1,24 @@ [ - { - "version": "dev", - "url": "https://magpylib.readthedocs.io/en/latest/" - }, - { - "name": "5.1.1 (stable)", - "version": "5.1.1", - "url": "https://magpylib.readthedocs.io/en/stable", - "preferred": true - }, - { - "version": "4.5.1", - "url": "https://magpylib.readthedocs.io/en/4.5.1/" - }, - { - "version": "3.0.5", - "url": "https://magpylib.readthedocs.io/en/3.0.5/" - }, - { - "version": "2.3.0-beta", - "url": "https://magpylib.readthedocs.io/en/2.3.0-beta/" - } -] + { + "version": "dev", + "url": "https://magpylib.readthedocs.io/en/latest/" + }, + { + "name": "5.1.1 (stable)", + "version": "5.1.1", + "url": "https://magpylib.readthedocs.io/en/stable", + "preferred": true + }, + { + "version": "4.5.1", + "url": "https://magpylib.readthedocs.io/en/4.5.1/" + }, + { + "version": "3.0.5", + "url": "https://magpylib.readthedocs.io/en/3.0.5/" + }, + { + "version": "2.3.0-beta", + "url": "https://magpylib.readthedocs.io/en/2.3.0-beta/" + } +] \ No newline at end of file diff --git a/docs/_static/webcode/copybutton.js b/docs/_static/webcode/copybutton.js index 87baea833..6ade74927 100644 --- a/docs/_static/webcode/copybutton.js +++ b/docs/_static/webcode/copybutton.js @@ -1,89 +1,65 @@ // Copyright 2014 PSF. Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 // File originates from the cpython source found in https://docs.python.org/3/_static/copybutton.js -$(document).ready(function () { - /* Add a [>>>] button on the top-right corner of code samples to hide - * the >>> and ... prompts and the output and thus make the code - * copyable. */ - var div = $( - ".highlight-python .highlight," + - ".highlight-default .highlight," + - ".highlight-python3 .highlight", - ); - var pre = div.find("pre"); +$(document).ready(function() { + /* Add a [>>>] button on the top-right corner of code samples to hide + * the >>> and ... prompts and the output and thus make the code + * copyable. */ + var div = $('.highlight-python .highlight,' + + '.highlight-default .highlight,' + + '.highlight-python3 .highlight') + var pre = div.find('pre'); - // get the styles from the current theme - pre.parent().parent().css("position", "relative"); - var hide_text = "Hide the prompts and output"; - var show_text = "Show the prompts and output"; - var border_width = pre.css("border-top-width"); - var border_style = pre.css("border-top-style"); - var border_color = pre.css("border-top-color"); - var button_styles = { - cursor: "pointer", - position: "absolute", - top: "0", - right: "0", - "border-color": border_color, - "border-style": border_style, - "border-width": border_width, - color: border_color, - "text-size": "75%", - "font-family": "monospace", - "padding-left": "0.2em", - "padding-right": "0.2em", - "border-radius": "0 3px 0 0", - }; - - // create and add the button to all the code blocks that contain >>> - div.each(function (index) { - var jthis = $(this); - if (jthis.find(".gp").length > 0) { - var button = $( - 'Click to Hide >>>', - ); - button.css(button_styles); - button.attr("title", hide_text); - button.data("hidden", "false"); - jthis.prepend(button); + // get the styles from the current theme + pre.parent().parent().css('position', 'relative'); + var hide_text = 'Hide the prompts and output'; + var show_text = 'Show the prompts and output'; + var border_width = pre.css('border-top-width'); + var border_style = pre.css('border-top-style'); + var border_color = pre.css('border-top-color'); + var button_styles = { + 'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0', + 'border-color': border_color, 'border-style': border_style, + 'border-width': border_width, 'color': border_color, 'text-size': '75%', + 'font-family': 'monospace', 'padding-left': '0.2em', 'padding-right': '0.2em', + 'border-radius': '0 3px 0 0' } - // tracebacks (.gt) contain bare text elements that need to be - // wrapped in a span to work with .nextUntil() (see later) - jthis - .find("pre:has(.gt)") - .contents() - .filter(function () { - return this.nodeType == 3 && this.data.trim().length > 0; - }) - .wrap(""); - }); - // define the behavior of the button when it's clicked - $(".copybutton").click(function (e) { - e.preventDefault(); - var button = $(this); - if (button.data("hidden") === "false") { - // hide the code output - button.parent().find(".go, .gp, .gt").hide(); - button - .next("pre") - .find(".gt") - .nextUntil(".gp, .go") - .css("visibility", "hidden"); - button.css("text-decoration", "line-through"); - button.attr("title", show_text); - button.data("hidden", "true"); - } else { - // show the code output - button.parent().find(".go, .gp, .gt").show(); - button - .next("pre") - .find(".gt") - .nextUntil(".gp, .go") - .css("visibility", "visible"); - button.css("text-decoration", "none"); - button.attr("title", hide_text); - button.data("hidden", "false"); - } - }); + // create and add the button to all the code blocks that contain >>> + div.each(function(index) { + var jthis = $(this); + if (jthis.find('.gp').length > 0) { + var button = $('Click to Hide >>>'); + button.css(button_styles) + button.attr('title', hide_text); + button.data('hidden', 'false'); + jthis.prepend(button); + } + // tracebacks (.gt) contain bare text elements that need to be + // wrapped in a span to work with .nextUntil() (see later) + jthis.find('pre:has(.gt)').contents().filter(function() { + return ((this.nodeType == 3) && (this.data.trim().length > 0)); + }).wrap(''); + }); + + // define the behavior of the button when it's clicked + $('.copybutton').click(function(e){ + e.preventDefault(); + var button = $(this); + if (button.data('hidden') === 'false') { + // hide the code output + button.parent().find('.go, .gp, .gt').hide(); + button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden'); + button.css('text-decoration', 'line-through'); + button.attr('title', show_text); + button.data('hidden', 'true'); + } else { + // show the code output + button.parent().find('.go, .gp, .gt').show(); + button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible'); + button.css('text-decoration', 'none'); + button.attr('title', hide_text); + button.data('hidden', 'false'); + } + }); }); diff --git a/docs/_static/webcode/summaryOpen.js b/docs/_static/webcode/summaryOpen.js index 878cec8c1..5fe9aa024 100644 --- a/docs/_static/webcode/summaryOpen.js +++ b/docs/_static/webcode/summaryOpen.js @@ -1,22 +1,16 @@ -$(document).ready(function () { - $('a[href^="#"]').on("click", function (e) { - e.preventDefault(); - var target = this.hash, - $target = $(target); - $(target + " details").attr("open", true); +$(document).ready(function() { + $('a[href^="#"]').on('click', function(e) { + e.preventDefault(); + var target = this.hash, + $target = $(target); + $(target + ' details').attr('open', true); - $("html, body") - .stop() - .animate( - { - scrollTop: $target.offset().top, - }, - 500, - "swing", - function () { - window.location.hash = target; - }, - ); + $('html, body').stop().animate({ + 'scrollTop': $target.offset().top + }, 500, 'swing', function() { + window.location.hash = target; + }); + + }); }); -}); //https://stackoverflow.com/a/48258026/11028959 diff --git a/docs/index.md b/docs/index.md index 7bde09b9f..677fceb72 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,27 +1,38 @@ # Magpylib Documentation -Magpylib is an **open-source Python package** for calculating static **magnetic -fields** of magnets, currents, and other sources. It uses **analytical -expressions**, solutions to macroscopic magnetostatic problems, implemented in -**vectorized** form which makes the computation **extremely fast** and leverages -the open-source Python ecosystem for spectacular visualizations! +Magpylib is an **open-source Python package** for calculating static **magnetic fields** of magnets, currents, and other sources. It uses **analytical expressions**, solutions to macroscopic magnetostatic problems, implemented in **vectorized** form which makes the computation **extremely fast** and leverages the open-source Python ecosystem for spectacular visualizations!

Resources

-::::{grid} 1 2 3 3 :margin: 4 4 0 0 :gutter: 2 - -:::{grid-item-card} :link: getting-started :link-type: ref :link-alt: link to -Getting Started :img-top: \_static/images/index_icon_get_started.png -:text-align: center **Getting Started** ::: - -:::{grid-item-card} :link: examples :link-type: ref :link-alt: link to Examples -:img-top: \_static/images/index_icon_examples.png :text-align: center -**Examples** ::: - -:::{grid-item-card} :link: -https://www.sciencedirect.com/science/article/pii/S2352711020300170 :link-alt: -link to Journal :img-top: \_static/images/index_icon_academic.png :text-align: -center **Scientific Reference** ::: +::::{grid} 1 2 3 3 +:margin: 4 4 0 0 +:gutter: 2 + +:::{grid-item-card} +:link: getting-started +:link-type: ref +:link-alt: link to Getting Started +:img-top: _static/images/index_icon_get_started.png +:text-align: center +**Getting Started** +::: + +:::{grid-item-card} +:link: examples +:link-type: ref +:link-alt: link to Examples +:img-top: _static/images/index_icon_examples.png +:text-align: center +**Examples** +::: + +:::{grid-item-card} +:link: https://www.sciencedirect.com/science/article/pii/S2352711020300170 +:link-alt: link to Journal +:img-top: _static/images/index_icon_academic.png +:text-align: center +**Scientific Reference** +::: :::: @@ -29,12 +40,8 @@ center **Scientific Reference** ::: ![](_static/images/index_flowchart.png) -In Magpylib, **sources** (magnets, currents, ...) and **observers** (sensors, -position grids, ...) are created as Python objects with position and orientation -attributes. These objects can be **grouped** and **moved** around. The system -can be **viewed** graphically through various backends. The **magnetic field** -is computed in the observer reference frame. Magpylib collects all inputs, and -vectorizes the computation for maximal performance. +In Magpylib, **sources** (magnets, currents, ...) and **observers** (sensors, position grids, ...) are created as Python objects with position and orientation attributes. These objects can be **grouped** and **moved** around. The system can be **viewed** graphically through various backends. The **magnetic field** is computed in the observer reference frame. Magpylib collects all inputs, and vectorizes the computation for maximal performance. + ```{toctree} :maxdepth: 2 From 65bd7424c190a14991760c49e8dfbf366e802a47 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 26 Apr 2025 21:24:25 +0000 Subject: [PATCH 139/211] style: pre-commit fixes --- docs/README.md | 28 +- docs/_pages/API_reference.md | 3 +- docs/_pages/changelog_.md | 8 +- .../contributing/cont_code_of_conduct.md | 3 +- docs/_pages/contributing/cont_contributing.md | 3 +- docs/_pages/contributing/cont_index.md | 3 +- docs/_pages/contributing/cont_license.md | 12 +- docs/_pages/user_guide/docs/docs_classes.md | 574 ++++++++++-------- docs/_pages/user_guide/docs/docs_fieldcomp.md | 146 +++-- docs/_pages/user_guide/docs/docs_graphics.md | 199 ++++-- .../user_guide/docs/docs_magpylib_force.md | 77 ++- docs/_pages/user_guide/docs/docs_pos_ori.md | 277 +++++---- docs/_pages/user_guide/docs/docs_styles.md | 155 ++++- .../user_guide/docs/docs_units_types.md | 47 +- .../user_guide/examples/examples_app_coils.md | 34 +- .../examples/examples_app_end_of_shaft.md | 14 +- .../examples/examples_app_halbach.md | 12 +- .../examples/examples_app_scales.md | 3 +- .../examples/examples_force_floating.md | 70 ++- .../examples/examples_force_force.md | 13 +- .../examples/examples_force_holding_force.md | 26 +- .../user_guide/examples/examples_index.md | 326 ++++------ .../examples/examples_misc_compound.md | 31 +- .../examples_misc_field_interpolation.md | 24 +- .../examples/examples_misc_inhom.md | 45 +- .../examples/examples_shapes_cad.md | 5 +- .../examples/examples_shapes_convex_hull.md | 11 +- .../examples/examples_shapes_pyvista.md | 17 +- .../examples/examples_shapes_superpos.md | 78 ++- .../examples/examples_shapes_triangle.md | 55 +- .../examples/examples_tutorial_collection.md | 74 ++- .../examples/examples_tutorial_custom.md | 31 +- .../examples_tutorial_field_computation.md | 47 +- .../examples_tutorial_modeling_magnets.md | 195 ++++-- .../examples/examples_tutorial_paths.md | 45 +- .../examples/examples_vis_animations.md | 73 ++- .../examples/examples_vis_magnet_colors.md | 16 +- .../examples/examples_vis_mpl_streamplot.md | 20 +- .../examples/examples_vis_pv_streamlines.md | 6 +- .../examples/examples_vis_subplots.md | 27 +- docs/_pages/user_guide/guide_index.md | 4 +- .../user_guide/guide_resources_01_physics.md | 223 +++++-- .../user_guide/guide_start_01_install.md | 27 +- .../user_guide/guide_start_02_fundamentals.md | 184 +++--- docs/_static/custom.css | 18 +- docs/_static/switcher.json | 46 +- docs/_static/webcode/copybutton.js | 140 +++-- docs/_static/webcode/summaryOpen.js | 32 +- docs/index.md | 57 +- 49 files changed, 2217 insertions(+), 1347 deletions(-) diff --git a/docs/README.md b/docs/README.md index 0a0ba2474..662e2c965 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,10 +1,32 @@ ## About Magpylib Documentation -The Documentation is built with [Sphinx](http://www.sphinx-doc.org/en/main/) and the configuration file is [conf.py](./conf.py). Files get converted to `.html` files by Sphinx during build time. Images, web code and videos are kept in the [_static](./_static) folder. +The Documentation is built with [Sphinx](http://www.sphinx-doc.org/en/main/) and +the configuration file is [conf.py](./conf.py). Files get converted to `.html` +files by Sphinx during build time. Images, web code and videos are kept in the +[\_static](./_static) folder. ### API docs - The docstring format is under the [NumPy Convention](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_numpy.html). Sphinx is configured to read Docstring information from the codebase and convert it into pages utilizing the [autodoc extension](http://www.sphinx-doc.org/en/main/usage/extensions/autodoc.html). The generated files are created at build time and put into a folder called `_autogen` + +The docstring format is under the +[NumPy Convention](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_numpy.html). +Sphinx is configured to read Docstring information from the codebase and convert +it into pages utilizing the +[autodoc extension](http://www.sphinx-doc.org/en/main/usage/extensions/autodoc.html). +The generated files are created at build time and put into a folder called +`_autogen` ### Handwritten documents -Handwritten pages and guides are kept in the [_pages](./_pages) folder. They are all written in [Markdown](https://www.markdownguide.org/) using [myst-parser](https://github.com/executablebooks/MyST-Parser) as interface. Some documents like in the examples folder are dynamically computed with [myst-nb](https://github.com/executablebooks/myst-nb) as jupyter notebooks. With the help of the [jupytext](https://github.com/mwouts/jupytext) library ands its jupyterlab extension, examples can be written and executed within the jupyterlab ecosystem and saved as markdown file. It is recommended to use the [jupyterlab-myst](https://github.com/executablebooks/jupyterlab-myst) extension to be able to work with the full set of myst markdown flavor within jupyterlab. When editing the docs with vscode, use the [MyST-Markdown](https://marketplace.visualstudio.com/items?itemName=ExecutableBookProject.myst-highlight) extension to visualize the rendered document. +Handwritten pages and guides are kept in the [\_pages](./_pages) folder. They +are all written in [Markdown](https://www.markdownguide.org/) using +[myst-parser](https://github.com/executablebooks/MyST-Parser) as interface. Some +documents like in the examples folder are dynamically computed with +[myst-nb](https://github.com/executablebooks/myst-nb) as jupyter notebooks. With +the help of the [jupytext](https://github.com/mwouts/jupytext) library ands its +jupyterlab extension, examples can be written and executed within the jupyterlab +ecosystem and saved as markdown file. It is recommended to use the +[jupyterlab-myst](https://github.com/executablebooks/jupyterlab-myst) extension +to be able to work with the full set of myst markdown flavor within jupyterlab. +When editing the docs with vscode, use the +[MyST-Markdown](https://marketplace.visualstudio.com/items?itemName=ExecutableBookProject.myst-highlight) +extension to visualize the rendered document. diff --git a/docs/_pages/API_reference.md b/docs/_pages/API_reference.md index 9c7ec255d..5145a7e10 100644 --- a/docs/_pages/API_reference.md +++ b/docs/_pages/API_reference.md @@ -1,4 +1,5 @@ (docu-APIref)= + # API reference The API reference includes all Magpylib docstrings. @@ -7,4 +8,4 @@ The API reference includes all Magpylib docstrings. :maxdepth: 2 ../../_autogen/magpylib.rst -``` \ No newline at end of file +``` diff --git a/docs/_pages/changelog_.md b/docs/_pages/changelog_.md index 76a8f304f..4d6fd7bd4 100644 --- a/docs/_pages/changelog_.md +++ b/docs/_pages/changelog_.md @@ -1,12 +1,12 @@ - - (changelog)= + # Changelog -The changelog provides a compressed history of the Magpylib development since its publication in 2019. +The changelog provides a compressed history of the Magpylib development since +its publication in 2019. ```{include} ../../CHANGELOG.md :relative-docs: docs/ :relative-images: :start-line: 2 -``` \ No newline at end of file +``` diff --git a/docs/_pages/contributing/cont_code_of_conduct.md b/docs/_pages/contributing/cont_code_of_conduct.md index 1dbcfc576..b865cb81a 100644 --- a/docs/_pages/contributing/cont_code_of_conduct.md +++ b/docs/_pages/contributing/cont_code_of_conduct.md @@ -1,7 +1,6 @@ (code-of-conduct)= -# Code of Conduct - +# Code of Conduct ```{include} ../../../CODE_OF_CONDUCT.md :relative-docs: docs/ diff --git a/docs/_pages/contributing/cont_contributing.md b/docs/_pages/contributing/cont_contributing.md index ad09b1627..f0e581579 100644 --- a/docs/_pages/contributing/cont_contributing.md +++ b/docs/_pages/contributing/cont_contributing.md @@ -1,7 +1,6 @@ (contributing)= -# Contribution Guide - +# Contribution Guide ```{include} ../../../CONTRIBUTING.md :relative-docs: docs/ diff --git a/docs/_pages/contributing/cont_index.md b/docs/_pages/contributing/cont_index.md index 3feaf1907..ee8518596 100644 --- a/docs/_pages/contributing/cont_index.md +++ b/docs/_pages/contributing/cont_index.md @@ -1,6 +1,7 @@ # Contributing -Magpylib is a free-of-use open-source project aiming to help researchers and engineers with magnetic field computation. Your participation is most welcome! +Magpylib is a free-of-use open-source project aiming to help researchers and +engineers with magnetic field computation. Your participation is most welcome! ```{toctree} :maxdepth: 2 diff --git a/docs/_pages/contributing/cont_license.md b/docs/_pages/contributing/cont_license.md index fa4c916db..f2e4b4b63 100644 --- a/docs/_pages/contributing/cont_license.md +++ b/docs/_pages/contributing/cont_license.md @@ -1,15 +1,15 @@ (license)= -# License - +# License ## Overview -Magpylib is published under the open source [FreeBSD](https://www.freebsd.org/copyright/freebsd-license/) license. +Magpylib is published under the open source +[FreeBSD](https://www.freebsd.org/copyright/freebsd-license/) license. -- *Permissions:* Commercial use, Modification, Distribution, Private use -- *Limitations:* Liability, Warranty -- *Conditions:* License and copyright notice +- _Permissions:_ Commercial use, Modification, Distribution, Private use +- _Limitations:_ Liability, Warranty +- _Conditions:_ License and copyright notice ## License Text diff --git a/docs/_pages/user_guide/docs/docs_classes.md b/docs/_pages/user_guide/docs/docs_classes.md index c7e8d00eb..7fe59be1b 100644 --- a/docs/_pages/user_guide/docs/docs_classes.md +++ b/docs/_pages/user_guide/docs/docs_classes.md @@ -1,383 +1,441 @@ (docs-classes)= + # The Magpylib Classes -In Magpylib's [object oriented interface](docs-fieldcomp-oo) magnetic field **sources** (generate the field) and **observers** (read the field) are created as Python objects with various defining attributes and methods. +In Magpylib's [object oriented interface](docs-fieldcomp-oo) magnetic field +**sources** (generate the field) and **observers** (read the field) are created +as Python objects with various defining attributes and methods. ## Base properties The following basic properties are shared by all Magpylib classes: -* The **position** and **orientation** attributes describe the object placement in the global coordinate system. +- The **position** and + **orientation** attributes describe the + object placement in the global coordinate system. -* The **move()** and **rotate()** methods enable relative object positioning. +- The **move()** and + **rotate()** methods enable relative object + positioning. -* The **reset_path()** method sets position and orientation to default values. +- The **reset_path()** method sets position + and orientation to default values. -* The **barycenter** property returns the object barycenter (often the same as position). +- The **barycenter** property returns the + object barycenter (often the same as position). See {ref}`docs-position` for more information on these features. +- The **style** attribute includes all + settings for graphical object representation. -* The **style** attribute includes all settings for graphical object representation. - -* The **show()** method gives quick access to the graphical representation. +- The **show()** method gives quick access to + the graphical representation. -See {ref}`guide-graphics` for more information on graphic output, default styles and customization possibilities. +See {ref}`guide-graphics` for more information on graphic output, default styles +and customization possibilities. -* The **getB()**, **getH()**, **getJ()** and **getM()** methods give quick access to field computation. +- The **getB()**, + **getH()**, + **getJ()** and + **getM()** methods give quick access to + field computation. See {ref}`docs-fieldcomp` for more information. +- The **parent** attribute references a + [Collection](guide-docs-classes-collections) that the object is part of. -* The **parent** attribute references a [Collection](guide-docs-classes-collections) that the object is part of. - -* The **copy()** method creates a clone of any object where selected properties, given by kwargs, are modified. +- The **copy()** method creates a clone of + any object where selected properties, given by kwargs, are modified. -* The **describe()** method provides a brief description of the object and returns the unique object id. - - ---------------------------------------------- +- The **describe()** method provides a brief + description of the object and returns the unique object id. +--- ## Local and global coordinates -::::{grid} 2 -:::{grid-item} -:columns: 9 -Magpylib objects span a local reference frame, and all object properties are defined within this frame, for example the vertices of a `Tetrahedron` magnet. The position and orientation attributes describe how the local frame lies within the global coordinates. The two frames coincide by default, when `position=(0,0,0)` and `orientation=None` (=unit rotation). The `position` and `orientation` attributes are described in detail in {ref}`docs-position`. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_global_local.png) -::: -:::: - - ---------------------------------------------- +::::{grid} 2 :::{grid-item} :columns: 9 Magpylib objects span a local reference +frame, and all object properties are defined within this frame, for example the +vertices of a `Tetrahedron` magnet. The position and orientation attributes +describe how the local frame lies within the global coordinates. The two frames +coincide by default, when `position=(0,0,0)` and `orientation=None` (=unit +rotation). The `position` and `orientation` attributes are described in detail +in {ref}`docs-position`. ::: :::{grid-item} :columns: 3 +![](../../../_static/images/docu_classes_init_global_local.png) ::: :::: +--- (docu-magnet-classes)= -## Magnet classes -All magnets are sources. They have the **polarization** attribute which is of the format $\vec{J}=(J_x, J_y, J_z)$ and denotes a homogeneous magnetic polarization vector in the local object coordinates in units of T. Alternatively, the magnetization vector can be set via the **magnetization** attribute of the format $\vec{M}=(M_x, M_y, M_z)$. These two parameters are codependent and Magpylib ensures that they stay in sync via the relation $\vec{J}=\mu_0\cdot\vec{M}$. Information on how this is related to material properties from data sheets is found in {ref}`examples-tutorial-modeling-magnets`. +## Magnet classes +All magnets are sources. They have the +**polarization** attribute which is of the +format $\vec{J}=(J_x, J_y, J_z)$ and denotes a homogeneous magnetic polarization +vector in the local object coordinates in units of T. Alternatively, the +magnetization vector can be set via the +**magnetization** attribute of the format +$\vec{M}=(M_x, M_y, M_z)$. These two parameters are codependent and Magpylib +ensures that they stay in sync via the relation $\vec{J}=\mu_0\cdot\vec{M}$. +Information on how this is related to material properties from data sheets is +found in {ref}`examples-tutorial-modeling-magnets`. ### Cuboid + ```python -magpylib.magnet.Cuboid(position, orientation, dimension, polarization, magnetization, style) +magpylib.magnet.Cuboid( + position, orientation, dimension, polarization, magnetization, style +) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -`Cuboid` objects represent magnets with cuboid shape. The **dimension** attribute has the format $(a,b,c)$ and denotes the sides of the cuboid units of meter. The center of the cuboid lies in the origin of the local coordinates, and the sides are parallel to the coordinate axes. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_cuboid.png) -::: -:::: - +::::{grid} 2 :::{grid-item} :columns: 9 `Cuboid` objects represent magnets with +cuboid shape. The **dimension** attribute has +the format $(a,b,c)$ and denotes the sides of the cuboid units of meter. The +center of the cuboid lies in the origin of the local coordinates, and the sides +are parallel to the coordinate axes. ::: :::{grid-item} :columns: 3 +![](../../../_static/images/docu_classes_init_cuboid.png) ::: :::: ### Cylinder + ```python -magpylib.magnet.Cylinder(position, orientation, dimension, polarization, magnetization, style) +magpylib.magnet.Cylinder( + position, orientation, dimension, polarization, magnetization, style +) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -`Cylinder` objects represent magnets with cylindrical shape. The **dimension** attribute has the format $(d,h)$ and denotes diameter and height of the cylinder in units of meter. The center of the cylinder lies in the origin of the local coordinates, and the cylinder axis coincides with the z-axis. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_cylinder.png) -::: -:::: - +::::{grid} 2 :::{grid-item} :columns: 9 `Cylinder` objects represent magnets +with cylindrical shape. The **dimension** +attribute has the format $(d,h)$ and denotes diameter and height of the cylinder +in units of meter. The center of the cylinder lies in the origin of the local +coordinates, and the cylinder axis coincides with the z-axis. ::: :::{grid-item} +:columns: 3 ![](../../../_static/images/docu_classes_init_cylinder.png) ::: :::: ### CylinderSegment + ```python -magpylib.magnet.CylinderSegment(position, orientation, dimension, polarization, magnetization, style) +magpylib.magnet.CylinderSegment( + position, orientation, dimension, polarization, magnetization, style +) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -`CylinderSegment` objects represent magnets with the shape of a cylindrical ring section. The **dimension** attribute has the format $(r_1,r_2,h,\varphi_1,\varphi_2)$ and denotes inner radius, outer radius and height in units of meter, and the two section angles $\varphi_1<\varphi_2$ in °. The center of the full cylinder lies in the origin of the local coordinates, and the cylinder axis coincides with the z-axis. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_cylindersegment.png) -::: -:::{grid-item} -:columns: 12 -**Info:** When the cylinder section angles span 360°, then the much faster `Cylinder` methods are used for the field computation. -::: -:::: - +::::{grid} 2 :::{grid-item} :columns: 9 `CylinderSegment` objects represent +magnets with the shape of a cylindrical ring section. The +**dimension** attribute has the format +$(r_1,r_2,h,\varphi_1,\varphi_2)$ and denotes inner radius, outer radius and +height in units of meter, and the two section angles $\varphi_1<\varphi_2$ in °. +The center of the full cylinder lies in the origin of the local coordinates, and +the cylinder axis coincides with the z-axis. ::: :::{grid-item} :columns: 3 +![](../../../_static/images/docu_classes_init_cylindersegment.png) ::: +:::{grid-item} :columns: 12 **Info:** When the cylinder section angles span +360°, then the much faster `Cylinder` methods are used for the field +computation. ::: :::: ### Sphere + ```python -magpylib.magnet.Sphere(position, orientation, diameter, polarization, magnetization, style) +magpylib.magnet.Sphere( + position, orientation, diameter, polarization, magnetization, style +) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -`Sphere` objects represent magnets of spherical shape. The **diameter** attribute is the sphere diameter $d$ in units of meter. The center of the sphere lies in the origin of the local coordinates. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_sphere.png) -::: -:::: - +::::{grid} 2 :::{grid-item} :columns: 9 `Sphere` objects represent magnets of +spherical shape. The **diameter** attribute +is the sphere diameter $d$ in units of meter. The center of the sphere lies in +the origin of the local coordinates. ::: :::{grid-item} :columns: 3 +![](../../../_static/images/docu_classes_init_sphere.png) ::: :::: ### Tetrahedron + ```python -magpylib.magnet.Tetrahedron(position, orientation, vertices, polarization, magnetization, style) +magpylib.magnet.Tetrahedron( + position, orientation, vertices, polarization, magnetization, style +) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -`Tetrahedron` objects represent magnets of tetrahedral shape. The **vertices** attribute stores the four corner points $(\vec{P}_1, \vec{P}_2, \vec{P}_3, \vec{P}_4)$ in the local object coordinates in units of m. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_tetra.png) -::: -:::{grid-item} -:columns: 12 -**Info:** The `Tetrahedron` field is computed from four `Triangle` fields. -::: -:::: +::::{grid} 2 :::{grid-item} :columns: 9 `Tetrahedron` objects represent magnets +of tetrahedral shape. The **vertices** +attribute stores the four corner points +$(\vec{P}_1, \vec{P}_2, \vec{P}_3, \vec{P}_4)$ in the local object coordinates +in units of m. ::: :::{grid-item} :columns: 3 +![](../../../_static/images/docu_classes_init_tetra.png) ::: :::{grid-item} +:columns: 12 **Info:** The `Tetrahedron` field is computed from four `Triangle` +fields. ::: :::: (docu-magpylib-api-trimesh)= ### TriangularMesh + ```python -magpylib.magnet.TriangularMesh(position, orientation, vertices, faces, polarization, magnetization, check_open, check_disconnected, check_selfintersecting, reorient_faces, style) +magpylib.magnet.TriangularMesh( + position, + orientation, + vertices, + faces, + polarization, + magnetization, + check_open, + check_disconnected, + check_selfintersecting, + reorient_faces, + style, +) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -`TriangularMesh` objects represent magnets with surface given by a triangular mesh. The mesh is defined by the **vertices** attribute, an array of all unique corner points $(\vec{P}_1, \vec{P}_2, ...)$ in units of meter, and the **faces** attribute, which is an array of index-triplets that define individual faces $(\vec{F}_1, \vec{F}_2, ...)$. The property **mesh** returns an array of all faces as point-triples $[(\vec{P}_1^1, \vec{P}_2^1, \vec{P}_3^1), (\vec{P}_1^2, \vec{P}_2^2, \vec{P}_3^2), ...]$. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_trimesh.png) -::: -:::{grid-item} -:columns: 12 -At initialization the mesh integrity is automatically checked, and all faces are reoriented to point outwards. These actions are controlled via the kwargs -* **check_open** -* **check_disconnected** -* **check_selfintersecting** -* **reorient_faces** - -which are all by default set to `"warn"`. Options are `"skip"` (don't perform check), `"ignore"` (ignore if check fails), `"warn"` (warn if check fails), `"raise"` (raise error if check fails). +::::{grid} 2 :::{grid-item} :columns: 9 `TriangularMesh` objects represent +magnets with surface given by a triangular mesh. The mesh is defined by the +**vertices** attribute, an array of all +unique corner points $(\vec{P}_1, \vec{P}_2, ...)$ in units of meter, and the +**faces** attribute, which is an array of +index-triplets that define individual faces $(\vec{F}_1, \vec{F}_2, ...)$. The +property **mesh** returns an array of all +faces as point-triples +$[(\vec{P}_1^1, \vec{P}_2^1, \vec{P}_3^1), (\vec{P}_1^2, \vec{P}_2^2, \vec{P}_3^2), ...]$. +::: :::{grid-item} :columns: 3 +![](../../../_static/images/docu_classes_init_trimesh.png) ::: :::{grid-item} +:columns: 12 At initialization the mesh integrity is automatically checked, and +all faces are reoriented to point outwards. These actions are controlled via the +kwargs + +- **check_open** +- **check_disconnected** +- **check_selfintersecting** +- **reorient_faces** + +which are all by default set to `"warn"`. Options are `"skip"` (don't perform +check), `"ignore"` (ignore if check fails), `"warn"` (warn if check fails), +`"raise"` (raise error if check fails). Results of the checks are stored in the following object attributes -* **status_open** can be `True`, `False` or `None` (unchecked) -* **status_open_data** contains an array of open edges -* **status_disconnected** can be `True`, `False` or `None` (unchecked) -* **status_disconnected_data** contains an array of mesh parts -* **status_selfintersecting** can be `True`, `None` or `None` (unchecked) -* **status_selfintersecting_data** contains an array of self-intersecting faces -* **status_reoriented** can be `True` or `False` -The checks can also be performed after initialization using the methods -* **check_open()** -* **check_disconnected()** -* **check_selfintersecting()** -* **reorient_faces()** - -The following class methods enable easy mesh creating and mesh loading. +- **status_open** can be `True`, `False` or + `None` (unchecked) +- **status_open_data** contains an array of + open edges +- **status_disconnected** can be `True`, + `False` or `None` (unchecked) +- **status_disconnected_data** contains an + array of mesh parts +- **status_selfintersecting** can be `True`, + `None` or `None` (unchecked) +- **status_selfintersecting_data** contains + an array of self-intersecting faces +- **status_reoriented** can be `True` or + `False` -* **TriangularMesh.from_mesh()** generates a `TriangularMesh` objects from the input **mesh**, which is an array in the mesh format $[(\vec{P}_1^1, \vec{P}_2^1, \vec{P}_3^1), (\vec{P}_1^2, \vec{P}_2^2, \vec{P}_3^2), ...]$. -* **TriangularMesh.from_ConvexHull()** generates a `TriangularMesh` object from the input **points**, which is an array of positions $(\vec{P}_1, \vec{P}_2, \vec{P}_3, ...)$ from which the convex Hull is computed via the [Scipy ConvexHull](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.ConvexHull.html) implementation. -* **TriangularMesh.from_triangles()** generates a `TriangularMesh` object from the input **triangles**, which is a list or a `Collection` of `Triangle` objects. -* **TriangularMesh.from_pyvista()** generates a `TriangularMesh` object from the input **polydata**, which is a [Pyvista PolyData](https://docs.pyvista.org/version/stable/api/core/_autosummary/pyvista.PolyData.html) object. - -The method **to_TriangleCollection()** transforms a `TriangularMesh` object into a `Collection` of `Triangle` objects. - -**Info:** While the checks may be disabled, the field computation guarantees correct results only if the mesh is closed, connected, not self-intersecting and all faces are oriented outwards. Examples of working with the `TriangularMesh` class are found in {ref}`examples-shapes-triangle` and in {ref}`examples-shapes-pyvista`. -::: -:::: +The checks can also be performed after initialization using the methods +- **check_open()** +- **check_disconnected()** +- **check_selfintersecting()** +- **reorient_faces()** ---------------------------------------------- +The following class methods enable easy mesh creating and mesh loading. +- **TriangularMesh.from_mesh()** generates a + `TriangularMesh` objects from the input + **mesh**, which is an array in the mesh + format + $[(\vec{P}_1^1, \vec{P}_2^1, \vec{P}_3^1), (\vec{P}_1^2, \vec{P}_2^2, \vec{P}_3^2), ...]$. +- **TriangularMesh.from_ConvexHull()** + generates a `TriangularMesh` object from the input + **points**, which is an array of positions + $(\vec{P}_1, \vec{P}_2, \vec{P}_3, ...)$ from which the convex Hull is + computed via the + [Scipy ConvexHull](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.ConvexHull.html) + implementation. +- **TriangularMesh.from_triangles()** + generates a `TriangularMesh` object from the input + **triangles**, which is a list or a + `Collection` of `Triangle` objects. +- **TriangularMesh.from_pyvista()** generates + a `TriangularMesh` object from the input + **polydata**, which is a + [Pyvista PolyData](https://docs.pyvista.org/version/stable/api/core/_autosummary/pyvista.PolyData.html) + object. + +The method **to_TriangleCollection()** +transforms a `TriangularMesh` object into a `Collection` of `Triangle` objects. + +**Info:** While the checks may be disabled, the field computation guarantees +correct results only if the mesh is closed, connected, not self-intersecting and +all faces are oriented outwards. Examples of working with the `TriangularMesh` +class are found in {ref}`examples-shapes-triangle` and in +{ref}`examples-shapes-pyvista`. ::: :::: + +--- ## Current classes -All currents are sources. Current objects have the **current** attribute which is a scalar that denotes the electrical current in units of ampere. +All currents are sources. Current objects have the +**current** attribute which is a scalar that +denotes the electrical current in units of ampere. ### Circle + ```python magpylib.current.Circle(position, orientation, diameter, current, style) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -`Circle` objects represent circular line current loops. The **diameter** attribute is the loop diameter $d$ in units of meter. The loop lies in the xy-plane with it's center in the origin of the local coordinates. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_loop.png) -::: -:::: +::::{grid} 2 :::{grid-item} :columns: 9 `Circle` objects represent circular line +current loops. The **diameter** attribute is +the loop diameter $d$ in units of meter. The loop lies in the xy-plane with it's +center in the origin of the local coordinates. ::: :::{grid-item} :columns: 3 +![](../../../_static/images/docu_classes_init_loop.png) ::: :::: ### Polyline + ```python magpylib.current.Polyline(position, orientation, vertices, current, style) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -`Polyline` objects represent line current segments where the electric current flows in straight lines from vertex to vertex. The **vertices** attribute is a vector of all vertices $(\vec{P}_1, \vec{P}_2, ...)$ given in the local coordinates in units of meter. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_line.png) -::: -:::: +::::{grid} 2 :::{grid-item} :columns: 9 `Polyline` objects represent line +current segments where the electric current flows in straight lines from vertex +to vertex. The **vertices** attribute is a +vector of all vertices $(\vec{P}_1, \vec{P}_2, ...)$ given in the local +coordinates in units of meter. ::: :::{grid-item} :columns: 3 +![](../../../_static/images/docu_classes_init_line.png) ::: :::: ---------------------------------------------- +--- ## Miscellaneous classes -There are classes listed hereon that function as sources, but they do not represent physical magnets or current distributions. - +There are classes listed hereon that function as sources, but they do not +represent physical magnets or current distributions. ### Dipole + ```python magpylib.misc.Dipole(position, orientation, moment, style) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -`Dipole` objects represent magnetic dipole moments with the **moment** attribute that describes the magnetic dipole moment $\vec{m}=(m_x,m_y,m_z)$ in SI-units of Am², which lies in the origin of the local coordinates. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_dipole.png) -::: -:::{grid-item} -:columns: 12 -**Info:** The total dipole moment of a homogeneous magnet with body volume $V$ is given by $\vec{m}=\vec{M}\cdot V$. -::: -:::: - +::::{grid} 2 :::{grid-item} :columns: 9 `Dipole` objects represent magnetic +dipole moments with the **moment** attribute +that describes the magnetic dipole moment $\vec{m}=(m_x,m_y,m_z)$ in SI-units of +Am², which lies in the origin of the local coordinates. ::: :::{grid-item} +:columns: 3 ![](../../../_static/images/docu_classes_init_dipole.png) ::: +:::{grid-item} :columns: 12 **Info:** The total dipole moment of a homogeneous +magnet with body volume $V$ is given by $\vec{m}=\vec{M}\cdot V$. ::: :::: ### Triangle + ```python -magpylib.misc.Triangle(position, orientation, vertices, polarization, magnetization, style) +magpylib.misc.Triangle( + position, orientation, vertices, polarization, magnetization, style +) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -`Triangle` objects represent triangular surfaces with homogeneous charge density given by the projection of the polarization or magnetization vector onto the surface normal. The attributes **polarization** and **magnetization** are treated similar as by the {ref}`docu-magnet-classes`. The **vertices** attribute is a set of the three triangle corners $(\vec{P}_1, \vec{P}_2, \vec{P}_3)$ in units of meter in the local coordinates. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_triangle.png) -::: -:::{grid-item} -:columns: 12 -**Info:** When multiple Triangles with similar magnetization/polarization vectors form a closed surface, and all their orientations (right-hand-rule) point outwards, their total H-field is equivalent to the field of a homogeneous magnet of the same shape. In this case, the B-field is only correct on the outside of the body. On the inside the polarization must be added to the field. This is demonstrated in the tutorial {ref}`examples-shapes-triangle`. -::: -:::: +::::{grid} 2 :::{grid-item} :columns: 9 `Triangle` objects represent triangular +surfaces with homogeneous charge density given by the projection of the +polarization or magnetization vector onto the surface normal. The attributes +**polarization** and +**magnetization** are treated similar as by +the {ref}`docu-magnet-classes`. The +**vertices** attribute is a set of the three +triangle corners $(\vec{P}_1, \vec{P}_2, \vec{P}_3)$ in units of meter in the +local coordinates. ::: :::{grid-item} :columns: 3 +![](../../../_static/images/docu_classes_init_triangle.png) ::: :::{grid-item} +:columns: 12 **Info:** When multiple Triangles with similar +magnetization/polarization vectors form a closed surface, and all their +orientations (right-hand-rule) point outwards, their total H-field is equivalent +to the field of a homogeneous magnet of the same shape. In this case, the +B-field is only correct on the outside of the body. On the inside the +polarization must be added to the field. This is demonstrated in the tutorial +{ref}`examples-shapes-triangle`. ::: :::: (guide-docs-classes-custom-source)= + ### CustomSource + ```python magpylib.misc.CustomSource(field_func, position, orientation, style) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -The `CustomSource` class is used to create user defined sources provided with with custom field computation functions. The argument **field_func** takes a function that is then automatically called for the field computation. This custom field function is treated like a [core function](docs-field-core). It must have the positional arguments `field` with values `"B"` or `"H"`, and `observers` (must accept array with shape (n,3)) and return the B-field and the H-field with a similar shape. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_custom.png) -::: -:::{grid-item} -:columns: 12 -**Info:** A tutorial {ref}`examples-tutorial-custom` is found in the examples. -::: -:::: - - ---------------------------------------------- +::::{grid} 2 :::{grid-item} :columns: 9 The `CustomSource` class is used to +create user defined sources provided with with custom field computation +functions. The argument **field_func** takes +a function that is then automatically called for the field computation. This +custom field function is treated like a [core function](docs-field-core). It +must have the positional arguments `field` with values `"B"` or `"H"`, and +`observers` (must accept array with shape (n,3)) and return the B-field and the +H-field with a similar shape. ::: :::{grid-item} :columns: 3 +![](../../../_static/images/docu_classes_init_custom.png) ::: :::{grid-item} +:columns: 12 **Info:** A tutorial {ref}`examples-tutorial-custom` is found in +the examples. ::: :::: +--- ## Sensor + ```python magpylib.Sensor(position, orientation, pixel, handedness, style) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -`Sensor` objects represent observers of the magnetic field and can be used as Magpylib `observers` input for magnetic field computation. The **pixel** attribute is an array of positions $(\vec{P}_1, \vec{P}_2, ...)$ provided in units of meter in the local sensor coordinates. A sensor returns the magnetic field at these pixel positions. By default `pixel=(0,0,0)` and the sensor simply returns the field at it's position. The **handedness** attribute can be `"left"` or `"right"` (default) to set a left- or right-handed sensor coordinate system for the field computation. -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_sensor.png) -::: -:::{grid-item} -:columns: 12 -**Info:** Sensors can have their own position and orientation and enable easy relative positioning between sources and observers. The field is always computed in the reference frame of the sensor, which might itself be moving in the global coordinate system. Magpylib sensors can be understood as perfect magnetic field sensors with infinitesimally sensitive elements. An example how to use sensors is given in {ref}`examples-tutorial-field-computation-sensors`. -::: -:::: - - ---------------------------------------------- - +::::{grid} 2 :::{grid-item} :columns: 9 `Sensor` objects represent observers of +the magnetic field and can be used as Magpylib `observers` input for magnetic +field computation. The **pixel** attribute is +an array of positions $(\vec{P}_1, \vec{P}_2, ...)$ provided in units of meter +in the local sensor coordinates. A sensor returns the magnetic field at these +pixel positions. By default `pixel=(0,0,0)` and the sensor simply returns the +field at it's position. The **handedness** +attribute can be `"left"` or `"right"` (default) to set a left- or right-handed +sensor coordinate system for the field computation. ::: :::{grid-item} :columns: +3 ![](../../../_static/images/docu_classes_init_sensor.png) ::: :::{grid-item} +:columns: 12 **Info:** Sensors can have their own position and orientation and +enable easy relative positioning between sources and observers. The field is +always computed in the reference frame of the sensor, which might itself be +moving in the global coordinate system. Magpylib sensors can be understood as +perfect magnetic field sensors with infinitesimally sensitive elements. An +example how to use sensors is given in +{ref}`examples-tutorial-field-computation-sensors`. ::: :::: + +--- (guide-docs-classes-collections)= + ## Collection + ```python magpylib.Collection(*children, position, orientation, override_parent, style) ``` -::::{grid} 2 -:::{grid-item} -:columns: 9 -A `Collection` is a group of Magpylib objects that is used for common manipulation. All these objects are stored by reference in the **children** attribute. The collection becomes the **parent** of the object. An object can only have one parent. There are several options for accessing only specific children via the following properties - -* **sources**: return only sources -* **observers**: return only observers -* **collections**: return only collections -* **sources_all**: return all sources, including the ones from sub-collections -* **observers_all**: return all observers, including the ones from sub-collections -* **collections_all**: return all collections, including the ones from sub-collections +::::{grid} 2 :::{grid-item} :columns: 9 A `Collection` is a group of Magpylib +objects that is used for common manipulation. All these objects are stored by +reference in the **children** attribute. The +collection becomes the **parent** of the +object. An object can only have one parent. There are several options for +accessing only specific children via the following properties + +- **sources**: return only sources +- **observers**: return only observers +- **collections**: return only collections +- **sources_all**: return all sources, + including the ones from sub-collections +- **observers_all**: return all observers, + including the ones from sub-collections +- **collections_all**: return all + collections, including the ones from sub-collections Additional methods for adding and removing children: - **add()**: Add an object to the collection -- **remove()**: Remove an object from the collection -::: -:::{grid-item} -:columns: 3 -![](../../../_static/images/docu_classes_init_collection.png) -::: -:::{grid-item} -:columns: 12 -**Info:** A collection object has its own `position` and `orientation` attributes and spans a local reference frame for all its children. An operation applied to a collection moves the frame and is individually applied to all children such that their relative position in the local reference frame is maintained. This means that the collection functions as a container for manipulation, but child position and orientation are always updated in the global coordinate system. After being added to a collection, it is still possible to manipulate the individual children, which will also move them to a new relative position in the collection frame. - -Collections have **format** as an additional argument for **describe()** method. Default value is `format="type+id+label"`. Any combination of `"type"`, `"id"`, and `"label"` is allowed. - -A tutorial {ref}`examples-tutorial-collection` is provided in the example examples. -::: -:::: +- **remove()**: Remove an object from the + collection ::: :::{grid-item} :columns: 3 + ![](../../../_static/images/docu_classes_init_collection.png) ::: + :::{grid-item} :columns: 12 **Info:** A collection object has its own + `position` and `orientation` attributes and spans a local reference frame for + all its children. An operation applied to a collection moves the frame and is + individually applied to all children such that their relative position in the + local reference frame is maintained. This means that the collection functions + as a container for manipulation, but child position and orientation are always + updated in the global coordinate system. After being added to a collection, it + is still possible to manipulate the individual children, which will also move + them to a new relative position in the collection frame. + +Collections have **format** as an additional argument for **describe()** method. +Default value is `format="type+id+label"`. Any combination of `"type"`, `"id"`, +and `"label"` is allowed. + +A tutorial {ref}`examples-tutorial-collection` is provided in the example +examples. ::: :::: diff --git a/docs/_pages/user_guide/docs/docs_fieldcomp.md b/docs/_pages/user_guide/docs/docs_fieldcomp.md index c1632f3cf..d4280ca24 100644 --- a/docs/_pages/user_guide/docs/docs_fieldcomp.md +++ b/docs/_pages/user_guide/docs/docs_fieldcomp.md @@ -1,13 +1,22 @@ (docs-fieldcomp)= + # Field Computation -The following is a detailed technical documentation of Magpylib field computation. -The tutorial {ref}`examples-tutorial-field-computation` shows good practices and illustrative examples. +The following is a detailed technical documentation of Magpylib field +computation. The tutorial {ref}`examples-tutorial-field-computation` shows good +practices and illustrative examples. (docs-fieldcomp-oo)= + ## Object-oriented interface -The object-oriented interface relies on the idea that sources of the magnetic field and observers thereof are created as Python objects which can be manipulated at will, and called for field computation. This is done via four top-level functions **getB**, **getH**, **getJ** and, **getM**, +The object-oriented interface relies on the idea that sources of the magnetic +field and observers thereof are created as Python objects which can be +manipulated at will, and called for field computation. This is done via four +top-level functions **getB**, +**getH**, +**getJ** and, +**getM**, ```python magpylib.getB(sources, observers, squeeze=True, pixel_agg=None, output="ndarray") @@ -16,13 +25,19 @@ magpylib.getJ(sources, observers, squeeze=True, pixel_agg=None, output="ndarray" magpylib.getM(sources, observers, squeeze=True, pixel_agg=None, output="ndarray") ``` -that compute the respective fields B (B-field), H (H-field), J (polarization) or M (magnetization) generated by `sources` as seen by the `observers` in their local coordinates. `sources` can be any Magpylib source object (e.g. magnets) or a flat list thereof. `observers` can be an array of position vectors with shape `(n1,n2,n3,...,3)`, any Magpylib observer object (e.g. sensors), or a flat list thereof. The following code shows a minimal example for Magpylib field computation. +that compute the respective fields B (B-field), H (H-field), J (polarization) or +M (magnetization) generated by `sources` as seen by the `observers` in their +local coordinates. `sources` can be any Magpylib source object (e.g. magnets) or +a flat list thereof. `observers` can be an array of position vectors with shape +`(n1,n2,n3,...,3)`, any Magpylib observer object (e.g. sensors), or a flat list +thereof. The following code shows a minimal example for Magpylib field +computation. ```python import magpylib as magpy # Define source and observer objects -loop = magpy.current.Circle(current=1, diameter=.001) +loop = magpy.current.Circle(current=1, diameter=0.001) sens = magpy.Sensor() # Compute field @@ -32,7 +47,9 @@ print(B) # --> [0. 0. 0.00125664] ``` -For quick access, the functions `getBHJM` are also methods of all Magpylib objects, such that the `sources` or `observers` input is the object itself. The above example can be continued as +For quick access, the functions `getBHJM` are also methods of all Magpylib +objects, such that the `sources` or `observers` input is the object itself. The +above example can be continued as ```python # Call getB as method of loop @@ -44,19 +61,33 @@ B = sens.getB(loop) with the same result for `B`. -By default, `getB` returns the B-field in units of T, `getH` the H-field in units of A/m, `getJ` the magnetic polarization in T and, `getM` the magnetization in A/m, assuming that all inputs are given in SI units as described in the docstrings. +By default, `getB` returns the B-field in units of T, `getH` the H-field in +units of A/m, `getJ` the magnetic polarization in T and, `getM` the +magnetization in A/m, assuming that all inputs are given in SI units as +described in the docstrings. ```{hint} In reality, `getB` is proportional to the `polarization` input and therefore returns the same unit. For example, with polarization input in mT, `getB` will return mT as well. At the same time when the `magnetization` input is kA/m, then `getH` returns kA/m as well. The B/H-field outputs are related to a M/J-inputs via a factor of $µ_0$. ``` -The output of a field computation `magpy.getB(sources, observers)` is by default a NumPy array of shape `(l, m, k, n1, n2, n3, ..., 3)` where `l` is the number of input sources, `m` the (maximal) object path length, `k` the number of observers, `n1,n2,n3,...` the sensor pixel shape or the shape of the observer position array input and `3` the three magnetic field components $(B_x, B_y, B_z)$. +The output of a field computation `magpy.getB(sources, observers)` is by default +a NumPy array of shape `(l, m, k, n1, n2, n3, ..., 3)` where `l` is the number +of input sources, `m` the (maximal) object path length, `k` the number of +observers, `n1,n2,n3,...` the sensor pixel shape or the shape of the observer +position array input and `3` the three magnetic field components +$(B_x, B_y, B_z)$. -* `squeeze`: If True (default) all axes of length 1 in the output (e.g. only a single source) are squeezed. +- `squeeze`: If True (default) all axes of length 1 in the output (e.g. only a + single source) are squeezed. -* `pixel_agg`: Select a compatible NumPy aggregator function (e.g. `"min"`, `"mean"`) that is applied to the output. For example, with `pixel_agg="mean"` the mean field of all observer points is returned. With this option it is possible to supply `getBHJM` with multiple observers that have different pixel shapes. +- `pixel_agg`: Select a compatible NumPy aggregator function (e.g. `"min"`, + `"mean"`) that is applied to the output. For example, with `pixel_agg="mean"` + the mean field of all observer points is returned. With this option it is + possible to supply `getBHJM` with multiple observers that have different pixel + shapes. -* `output`: Change the output format. Options are `"ndarray"` (default, returns a NumPy ndarray) and `"dataframe"` (returns a 2D-table Pandas DataFrame). +- `output`: Change the output format. Options are `"ndarray"` (default, returns + a NumPy ndarray) and `"dataframe"` (returns a 2D-table Pandas DataFrame). ```{note} Magpylib collects all inputs (object parameters), and vectorizes them for the computation which reduces the computation time dramatically for large inputs. @@ -65,28 +96,37 @@ Try to make all field computations with as few calls to `getBHJM` as possible. A ``` (docs-field-functional)= + ## Functional interface -Users can bypass the object oriented functionality of Magpylib and instead compute the field for n given parameter sets. This is done by providing the following inputs to the top level functions `getB`, `getH`, `getJ` and, `getM`. +Users can bypass the object oriented functionality of Magpylib and instead +compute the field for n given parameter sets. This is done by providing the +following inputs to the top level functions `getB`, `getH`, `getJ` and, `getM`. -1. `sources`: a string denoting the source type. Allowed values are the Magpylib source class names, see {ref}`docs-classes`. +1. `sources`: a string denoting the source type. Allowed values are the Magpylib + source class names, see {ref}`docs-classes`. 2. `observers`: array-like of shape (3,) or (n,3) giving the observer positions. -3. `kwargs`: a dictionary with inputs of shape (x,) or (n,x). Must include all mandatory class-specific inputs. By default, `position=(0,0,0)` and `orientation=None`(=unit rotation). +3. `kwargs`: a dictionary with inputs of shape (x,) or (n,x). Must include all + mandatory class-specific inputs. By default, `position=(0,0,0)` and + `orientation=None`(=unit rotation). -All "scalar" inputs of shape (x,) are automatically tiled up to shape (n,x) to create a set of n computation instances. The field is returned in the shape (n,3). The following code demonstrates the functional interface. +All "scalar" inputs of shape (x,) are automatically tiled up to shape (n,x) to +create a set of n computation instances. The field is returned in the shape +(n,3). The following code demonstrates the functional interface. ```python import numpy as np import magpylib as magpy + # All inputs and outputs in SI units # Compute the cuboid field for 3 input instances -N = 3 # number of instances +N = 3 # number of instances B = magpy.getB( - sources='Cuboid', - observers=np.linspace((0,0,1), (0,0,3), N), - dimension=np.linspace((1,1,1), (3,3,3),3, N), - polarization=(0,0,1), + sources="Cuboid", + observers=np.linspace((0, 0, 1), (0, 0, 3), N), + dimension=np.linspace((1, 1, 1), (3, 3, 3), 3, N), + polarization=(0, 0, 1), ) # This example demonstrates the scale invariance @@ -100,65 +140,70 @@ print(B) The functional interface is potentially faster than the object oriented one if users know how to generate the input arrays efficiently with numpy (e.g. `np.arange`, `np.linspace`, `np.tile`, `np.repeat`, ...). ``` - (docs-field-core)= + ## Core interface -At the heart of Magpylib lies a set of core functions that are our implementations of analytical field expressions found in the literature, see {ref}`guide-ressources-physics`. Direct access to these functions is given through the `magpylib.core` subpackage which includes, +At the heart of Magpylib lies a set of core functions that are our +implementations of analytical field expressions found in the literature, see +{ref}`guide-ressources-physics`. Direct access to these functions is given +through the `magpylib.core` subpackage which includes, -::::{grid} 1 -:gutter: 1 +::::{grid} 1 :gutter: 1 -:::{grid-item} -**magnet_cuboid_Bfield(** `observers`, `dimensions`, `polarizations`**)** -::: +:::{grid-item} **magnet_cuboid_Bfield(** +`observers`, `dimensions`, +`polarizations`**)** ::: :::{grid-item} -**magnet_cylinder_axial_Bfield(** `z0`, `r`, `z`**)** -::: +**magnet_cylinder_axial_Bfield(** `z0`, `r`, +`z`**)** ::: :::{grid-item} -**magnet_cylinder_diametral_Hfield(** `z0`, `r`, `z`, `phi`**)** -::: +**magnet_cylinder_diametral_Hfield(** `z0`, +`r`, `z`, `phi`**)** ::: :::{grid-item} -**magnet_cylinder_segment_Hfield(** `observers`, `dimensions`, `magnetizations`**)** -::: +**magnet_cylinder_segment_Hfield(** +`observers`, `dimensions`, +`magnetizations`**)** ::: :::{grid-item} -**magnet_sphere_Bfield(**`observers`, `diameters`, `polarizations`**)** -::: +**magnet_sphere_Bfield(**`observers`, +`diameters`, `polarizations`**)** ::: :::{grid-item} -**current_circle_Hfield(**`r0`, `r`, `z`, `i0`**)** -::: +**current_circle_Hfield(**`r0`, `r`, `z`, +`i0`**)** ::: :::{grid-item} -**current_polyline_Hfield(**`observers`, `segments_start`, `segments_end`, `currents`**)** -::: +**current_polyline_Hfield(**`observers`, +`segments_start`, `segments_end`, +`currents`**)** ::: -:::{grid-item} -**dipole_Hfield(**`observers`, `moments`**)** -::: +:::{grid-item} **dipole_Hfield(**`observers`, +`moments`**)** ::: :::{grid-item} -**triangle_Bfield(**`observers`, `vertices`, `polarizations`**)** -::: +**triangle_Bfield(**`observers`, `vertices`, +`polarizations`**)** ::: :::: -All inputs must be NumPy ndarrays of shape (n,x). Details can be found in the respective function docstrings. The following example demonstrates the core interface. - +All inputs must be NumPy ndarrays of shape (n,x). Details can be found in the +respective function docstrings. The following example demonstrates the core +interface. ```python import numpy as np import magpylib as magpy + # All inputs and outputs in SI units # Prepare input -z0 = np.array([1,1]) -r = np.array([1,1]) -z = np.array([2,2]) +z0 = np.array([1, 1]) +r = np.array([1, 1]) +z = np.array([2, 2]) # Compute field with core functions B = magpy.core.magnet_cylinder_axial_Bfield(z0=z0, r=r, z=z).T @@ -170,6 +215,7 @@ print(B) ## Field computation workflow -The Magpylib field computation internal workflow and different approaches of the three interfaces is outlined in the following sketch. +The Magpylib field computation internal workflow and different approaches of the +three interfaces is outlined in the following sketch. ![](../../../_static/images/docu_field_comp_flow.png) diff --git a/docs/_pages/user_guide/docs/docs_graphics.md b/docs/_pages/user_guide/docs/docs_graphics.md index 74ab19846..581cff36b 100644 --- a/docs/_pages/user_guide/docs/docs_graphics.md +++ b/docs/_pages/user_guide/docs/docs_graphics.md @@ -13,12 +13,17 @@ orphan: true --- (guide-graphics)= + # Graphic output (guide-graphics-show)= + ## 3D graphics with show -Once all Magpylib objects and their paths have been created, `show` creates a 3D plot of the geometric arrangement using the Matplotlib (command line default) and Plotly (notebook default) packages. `show` generates a new figure which is automatically displayed. +Once all Magpylib objects and their paths have been created, `show` creates a 3D +plot of the geometric arrangement using the Matplotlib (command line default) +and Plotly (notebook default) packages. `show` generates a new figure which is +automatically displayed. ```{code-cell} ipython3 import magpylib as magpy @@ -43,16 +48,26 @@ sensor = magpy.Sensor( magpy.show(magnet, current, dipole, sensor) ``` -Notice that objects and their paths are automatically assigned different colors. The polarization of the magnet is displayed by default (Plotly and Pyvista) by coloring the poles, which overwrites the object color. In Matplotlib the polarization is by default displayed by an arrow. Current directions and dipole objects are indicated by arrows and sensors are shown as tri-colored coordinate cross with pixel as markers. +Notice that objects and their paths are automatically assigned different colors. +The polarization of the magnet is displayed by default (Plotly and Pyvista) by +coloring the poles, which overwrites the object color. In Matplotlib the +polarization is by default displayed by an arrow. Current directions and dipole +objects are indicated by arrows and sensors are shown as tri-colored coordinate +cross with pixel as markers. -How objects are represented graphically (color, line thickness, etc.) is defined by their [style properties](guide-graphic-styles). +How objects are represented graphically (color, line thickness, etc.) is defined +by their [style properties](guide-graphic-styles). (guide-graphic-backends)= + ## Graphic backends -The graphic backend refers to the plotting library that is used for graphic output. A plotting canvas refers to the frame/window/canvas/axes object the graphic output is forwarded to. +The graphic backend refers to the plotting library that is used for graphic +output. A plotting canvas refers to the frame/window/canvas/axes object the +graphic output is forwarded to. -The graphic backend is set via the kwarg `backend` in the `show` function, which is demonstrated in the following example +The graphic backend is set via the kwarg `backend` in the `show` function, which +is demonstrated in the following example ```{code-cell} ipython3 import magpylib as magpy @@ -72,64 +87,80 @@ for backend in magpy.SUPPORTED_PLOTTING_BACKENDS: magpy.show(loop, cylinder, backend=backend) ``` -With the installation default setting, `backend='auto'`, Magpylib infers the graphic backend from the environment running the code, or from the requested canvas. +With the installation default setting, `backend='auto'`, Magpylib infers the +graphic backend from the environment running the code, or from the requested +canvas. | environment | canvas | inferred backend | -|------------------|-------------------------------------------------|------------------| +| ---------------- | ----------------------------------------------- | ---------------- | | Command-Line | `None` | `matplotlib` | | IPython notebook | `None` | `plotly` | | all | `matplotlib.axes.Axes` | `matplotlib` | | all | `plotly.graph_objects.Figure` or `FigureWidget` | `plotly` | | all | `pyvista.Plotter` | `pyvista` | -The library default can be changed, e.g. with the command `magpy.defaults.display.backend = 'plotly'`. - -There is a high level of **feature parity**, however, not all graphic features are supported by all backends, and not all graphic features work equally well, so that [default style settings](guide-graphic-styles-default) differ slightly. In addition, some common Matplotlib syntax (e.g. color `'r'`, linestyle `':'`) is automatically translated to other backends. - -| Feature | Matplotlib | Plotly | Pyvista | -|:------------------------:|:----------:|:------:|:-------:| -| triangular mesh 3d | ✔️ | ✔️ | ✔️ | -| line 3d | ✔️ | ✔️ | ✔️ | -| line style | ✔️ | ✔️ | ❌ | -| line color | ✔️ | ✔️ | ✔️ | -| line width | ✔️ | ✔️ | ✔️ | -| marker 3d | ✔️ | ✔️ | ✔️ | -| marker color | ✔️ | ✔️ | ✔️ | -| marker size | ✔️ | ✔️ | ✔️ | -| marker symbol | ✔️ | ✔️ | ❌ | -| marker numbering | ✔️ | ✔️ | ❌ | -| zoom level | ✔️ | ✔️ | ❌[2] | -| magnetization color | ✔️[7] | ✔️ | ✔️ | -| animation | ✔️ | ✔️ | ✔️[5] | -| animation time | ✔️ | ✔️ | ✔️[5] | -| animation fps | ✔️ | ✔️ | ✔️[5] | -| animation slider | ✔️[1] | ✔️ | ❌ | -| subplots 2D | ✔️ | ✔️ | ✔️[6] | -| subplots 3D | ✔️ | ✔️ | ✔️ | -| user canvas | ✔️ | ✔️ | ✔️ | -| user extra 3d model [3] | ✔️ | ✔️ | ✔️[4] | +The library default can be changed, e.g. with the command +`magpy.defaults.display.backend = 'plotly'`. + +There is a high level of **feature parity**, however, not all graphic features +are supported by all backends, and not all graphic features work equally well, +so that [default style settings](guide-graphic-styles-default) differ slightly. +In addition, some common Matplotlib syntax (e.g. color `'r'`, linestyle `':'`) +is automatically translated to other backends. + +| Feature | Matplotlib | Plotly | Pyvista | +| :---------------------: | :--------: | :----: | :-----: | +| triangular mesh 3d | ✔️ | ✔️ | ✔️ | +| line 3d | ✔️ | ✔️ | ✔️ | +| line style | ✔️ | ✔️ | ❌ | +| line color | ✔️ | ✔️ | ✔️ | +| line width | ✔️ | ✔️ | ✔️ | +| marker 3d | ✔️ | ✔️ | ✔️ | +| marker color | ✔️ | ✔️ | ✔️ | +| marker size | ✔️ | ✔️ | ✔️ | +| marker symbol | ✔️ | ✔️ | ❌ | +| marker numbering | ✔️ | ✔️ | ❌ | +| zoom level | ✔️ | ✔️ | ❌[2] | +| magnetization color | ✔️[7] | ✔️ | ✔️ | +| animation | ✔️ | ✔️ | ✔️[5] | +| animation time | ✔️ | ✔️ | ✔️[5] | +| animation fps | ✔️ | ✔️ | ✔️[5] | +| animation slider | ✔️[1] | ✔️ | ❌ | +| subplots 2D | ✔️ | ✔️ | ✔️[6] | +| subplots 3D | ✔️ | ✔️ | ✔️ | +| user canvas | ✔️ | ✔️ | ✔️ | +| user extra 3d model [3] | ✔️ | ✔️ | ✔️[4] | [1]: when returning animation object and exporting it as jshtml. [2]: possible but not implemented at the moment. -[3]: only `"scatter3d"`, and `"mesh3d"`. Gets "translated" to every other backend. +[3]: only `"scatter3d"`, and `"mesh3d"`. Gets "translated" to every other +backend. -[4]: custom user defined trace constructors allowed, which are specific to the backend. +[4]: custom user defined trace constructors allowed, which are specific to the +backend. [5]: animation is only available through export as `gif` or `mp4` -[6]: 2D plots are not supported for all jupyter_backends. As of pyvista>=0.38 these are deprecated and replaced by the [trame](https://docs.pyvista.org/api/plotting/trame.html) backend. +[6]: 2D plots are not supported for all jupyter_backends. As of pyvista>=0.38 +these are deprecated and replaced by the +[trame](https://docs.pyvista.org/api/plotting/trame.html) backend. -[7]: Matplotlib does not support color gradient. Instead magnetization is shown through object slicing and coloring. - -`show` will also pass on all kwargs to the respective plotting backends. For example, in the [animation sample code](guide-graphic-animations) the kwarg `show_legend` is forwarded to the Plotly backend. +[7]: Matplotlib does not support color gradient. Instead magnetization is shown +through object slicing and coloring. +`show` will also pass on all kwargs to the respective plotting backends. For +example, in the [animation sample code](guide-graphic-animations) the kwarg +`show_legend` is forwarded to the Plotly backend. (guide-graphics-canvas)= + ## Plotting canvas -When calling `show`, a figure is automatically generated and displayed. It is also possible to place the `show` output in a given figure using the `canvas` argument. Consider the following Magpylib field computation, +When calling `show`, a figure is automatically generated and displayed. It is +also possible to place the `show` output in a given figure using the `canvas` +argument. Consider the following Magpylib field computation, ```{code-cell} ipython3 import magpylib as magpy @@ -141,11 +172,13 @@ sens = magpy.Sensor(position=np.linspace((0, 0, -0.1), (0, 0, 0.1), 100)) B = loop.getB(sens) ``` -The following examples demonstrate how to place the Magpylib `show` output in figures created with the three supported graphic backends. +The following examples demonstrate how to place the Magpylib `show` output in +figures created with the three supported graphic backends. +++ -In **Matplotlib** we combine a 2D-field plot with the 3D show output and modify the 3D show output with a line. +In **Matplotlib** we combine a 2D-field plot with the 3D show output and modify +the 3D show output with a line. ```{code-cell} ipython3 import magpylib as magpy @@ -182,7 +215,8 @@ When providing a canvas, no update to its layout is performed by Magpylib, unles +++ -In **Plotly** we combine a 2D-field plot with the 3D show output and modify the 3D show output with a line. +In **Plotly** we combine a 2D-field plot with the 3D show output and modify the +3D show output with a line. ```{code-cell} ipython3 import magpylib as magpy @@ -212,7 +246,8 @@ fig.add_scatter3d(x=(-0.1, 0.1), y=(0, 0), z=(0, 0), col=2, row=1) fig.show() ``` -**Pyvista** is not made for 2D plotting. Here we simply add a line to the 3D show output. +**Pyvista** is not made for 2D plotting. Here we simply add a line to the 3D +show output. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -234,9 +269,12 @@ pl.show() ``` (guide-graphics-return_fig)= + ## Return figure -Instead of forwarding a figure to an existing canvas, it is also possible to return the figure object for further manipulation using the `return_fig` command. In the following example this is demonstrated for the pyvista backend. +Instead of forwarding a figure to an existing canvas, it is also possible to +return the figure object for further manipulation using the `return_fig` +command. In the following example this is demonstrated for the pyvista backend. ```{code-cell} ipython3 import magpylib as magpy @@ -260,16 +298,26 @@ pl.show() ``` (guide-graphic-animations)= + ## Animation -The Magpylib [object paths](docs-position-paths) visualized with `show` can be animated by setting the kwarg `animation=True`. This synergize specifically well with the Plotly backend. +The Magpylib [object paths](docs-position-paths) visualized with `show` can be +animated by setting the kwarg `animation=True`. This synergize specifically well +with the Plotly backend. The animations can be fine-tuned with the following kwargs of `show`: -1. `animation_time` (default=3), must be a positive number that gives the animation time in seconds. -2. `animation_slider` (default=`True`), is boolean and sets if a slider should be displayed. + +1. `animation_time` (default=3), must be a positive number that gives the + animation time in seconds. +2. `animation_slider` (default=`True`), is boolean and sets if a slider should + be displayed. 3. `animation_fps` (default=30), sets the maximal frames per second. -Each path step will generate one frame of the animation, unless `animation_fps` would be exceeded. In this case specific equidistant frames will be selected automatically to adjust to the limited display possibilities. For practicality, the input `animation=x` will automatically set `animation=True` and `animation_time=x`. +Each path step will generate one frame of the animation, unless `animation_fps` +would be exceeded. In this case specific equidistant frames will be selected +automatically to adjust to the limited display possibilities. For practicality, +the input `animation=x` will automatically set `animation=True` and +`animation_time=x`. The following example demonstrates the animation feature, @@ -298,27 +346,38 @@ Even with some implemented fail safes, such as a maximum frame rate and frame co ``` (guide-graphics-subplots)= + ## Built-in Subplots -:::{versionadded} 4.4 -Coupled subplots -::: +:::{versionadded} 4.4 Coupled subplots ::: -It is often tedious to integrate the Magpylib `show` output into sub-plots as shown above, especially when dealing with animations and combinations of 2D and 3D plots. +It is often tedious to integrate the Magpylib `show` output into sub-plots as +shown above, especially when dealing with animations and combinations of 2D and +3D plots. -For this, Magpylib offers the possibility to show the sensor output along a path in addition to the 3D-output, and to place 2D and 3D outputs in subplots. +For this, Magpylib offers the possibility to show the sensor output along a path +in addition to the 3D-output, and to place 2D and 3D outputs in subplots. ### With show -All of this is achieved via the `show` function by passing input objects as dictionaries with the arguments. +All of this is achieved via the `show` function by passing input objects as +dictionaries with the arguments. 1. `objects`: list of Magpylib objects 2. `col`: int which selects the subplot column. Default is `col=1`. 3. `row`: int which selects the subplot row. Default is `row=1`. -4. `output`: string which selects the type of output that should be displayed in this subplot. Options are - - 1. `"model3d"` is the default value and selects the 3D output. - 2. `"Xa"` selects a 2D line-plot of a field component (combination) as seen by the sensor(s) along their path. The sensor(s) must be part of the `objects` input. Here "X" selects the field and must be one of "BHJM", and "a" selects the respective component combination and must be a subset of "xyz". For example, `output=Hx` displays the x-component of the H-field, or `output=Bxz` displays `sqrt(|Bx|² + |Bz|²)`. By default, source outputs are summed up (`sumup=True`) and sensor pixels, are aggregated by mean (`pixel_agg="mean"`). +4. `output`: string which selects the type of output that should be displayed in + this subplot. Options are + + 1. `"model3d"` is the default value and selects the 3D output. + 2. `"Xa"` selects a 2D line-plot of a field component (combination) as seen + by the sensor(s) along their path. The sensor(s) must be part of the + `objects` input. Here "X" selects the field and must be one of "BHJM", and + "a" selects the respective component combination and must be a subset of + "xyz". For example, `output=Hx` displays the x-component of the H-field, + or `output=Bxz` displays `sqrt(|Bx|² + |Bz|²)`. By default, source outputs + are summed up (`sumup=True`) and sensor pixels, are aggregated by mean + (`pixel_agg="mean"`). The following code demonstrates these features. @@ -342,7 +401,8 @@ magpy.show( ) ``` -Each input dictionary can contain kwargs, like `pixel_agg=None` or `sumup=False` for 2D plots. +Each input dictionary can contain kwargs, like `pixel_agg=None` or `sumup=False` +for 2D plots. ```{code-cell} ipython3 import magpylib as magpy @@ -375,9 +435,15 @@ magpy.show( ``` (guide-graphics-show_context)= + ### With show_context -To make the subplot syntax more convenient we introduced the `show_context` native Python context manager. It allows to defer calls to the `show` function while passing additional arguments. This is necessary for Magpylib to know how many rows and columns are requested by the user, which single `show` calls do not keep track of. All kwargs, e.g. `backend` are handed directly to the context manager. +To make the subplot syntax more convenient we introduced the `show_context` +native Python context manager. It allows to defer calls to the `show` function +while passing additional arguments. This is necessary for Magpylib to know how +many rows and columns are requested by the user, which single `show` calls do +not keep track of. All kwargs, e.g. `backend` are handed directly to the context +manager. The above example becomes: @@ -429,7 +495,11 @@ with magpy.show_context(): ### Coupled 2D/3D Animation -It is very helpful to combine 2D and 3D subplots in an animation that shows the motion of the 3D system, while displaying the field at the respective path instance at the same time. Unfortunately, it is quite tedious to create such animations. The most powerful feature and main reason behind built-in subplots is the ability to do just that with few lines of code. +It is very helpful to combine 2D and 3D subplots in an animation that shows the +motion of the 3D system, while displaying the field at the respective path +instance at the same time. Unfortunately, it is quite tedious to create such +animations. The most powerful feature and main reason behind built-in subplots +is the ability to do just that with few lines of code. ```{code-cell} ipython3 import magpylib as magpy @@ -451,7 +521,10 @@ with magpy.show_context(loop, sens, animation=True) as sc: ### Canvas length units -When displaying very small Magpylib objects, the axes scaling in meters might be inadequate and you may want to use other units that fit the system dimensions more nicely. The example below shows how to display an object (in this case the same) with different length units and zoom levels. +When displaying very small Magpylib objects, the axes scaling in meters might be +inadequate and you may want to use other units that fit the system dimensions +more nicely. The example below shows how to display an object (in this case the +same) with different length units and zoom levels. ```{tip} Setting `units_length="auto"` will infer the most suitable units based on the maximum range of the system. diff --git a/docs/_pages/user_guide/docs/docs_magpylib_force.md b/docs/_pages/user_guide/docs/docs_magpylib_force.md index 71536f4af..6a6e73c8d 100644 --- a/docs/_pages/user_guide/docs/docs_magpylib_force.md +++ b/docs/_pages/user_guide/docs/docs_magpylib_force.md @@ -13,9 +13,11 @@ kernelspec: --- (docs-magpylib-force)= + # Magpylib Force v0.3.1 -The package `magpylib-force` provides an addon for magnetic force and torque computation between magpylib source objects. +The package `magpylib-force` provides an addon for magnetic force and torque +computation between magpylib source objects. ## Installation @@ -27,36 +29,59 @@ pip install magpylib-force ## API -The package provides only a single top-level function **getFT()** for computing force and torque. +The package provides only a single top-level function +**getFT()** for computing force and torque. ```python import magpylib_force as mforce + mforce.getFT(sources, targets, anchor, eps=1e-5, squeeze=True) ``` -Here `sources` are Magpylib source objects that generate the magnetic field. The `targets` are the objects on which the magnetic field of the sources acts to generate force and torque. With current version 0.3.1 only `Cuboid`, `Cylinder`, `CylinderSegment`, `Polyline`, and `Circle` objects can be targets. The `anchor` denotes an anchor point which is the barycenter of the target. If no barycenter is given, homogeneous mass density is assumed and the geometric center of the target is chose as it's barycenter. `eps` refers to the finite difference length when computing the magnetic field gradient and should be adjusted to be much smaller than size of the system. `squeeze` can be used to squeeze the output array dimensions as in Magpylib's `getB`, `getH`, `getJ`, and `getM`. - -The computation is based on numerically integrating the magnetic field generated by the `sources` over the `targets`, see [here](docs-force-computation) for more details. This requires that each target has a **meshing** directive, which must be provided via an attribute to the object. How `meshing` is defined: - -For all objects as an integer, which defines the target number of mesh-points. In some cases an algorithm will attempt to come close to this number by splitting up magnets into quasi-cubical cells. Exceptions are: - -- `Cuboid`: takes also a 3-vector that defines the number of equidistant splits along each axis resulting in a rectangular regular grid. Keep in mind that the accuracy is increased by cubical aspect ratios. -- `PolyLine`: defines the number of equidistant splits of each PolyLine segment, not of the whole multi-segmented object. The total number of mesh-points will be number of segments times meshing. - -The function `getFT()` returns force and torque as `np.ndarray` of shape (2,3), or (t,2,3) when t targets are given. - -The following example code computes the force acting on a cuboid magnet, generated by a current loop. +Here `sources` are Magpylib source objects that generate the magnetic field. The +`targets` are the objects on which the magnetic field of the sources acts to +generate force and torque. With current version 0.3.1 only `Cuboid`, `Cylinder`, +`CylinderSegment`, `Polyline`, and `Circle` objects can be targets. The `anchor` +denotes an anchor point which is the barycenter of the target. If no barycenter +is given, homogeneous mass density is assumed and the geometric center of the +target is chose as it's barycenter. `eps` refers to the finite difference length +when computing the magnetic field gradient and should be adjusted to be much +smaller than size of the system. `squeeze` can be used to squeeze the output +array dimensions as in Magpylib's `getB`, `getH`, `getJ`, and `getM`. + +The computation is based on numerically integrating the magnetic field generated +by the `sources` over the `targets`, see [here](docs-force-computation) for more +details. This requires that each target has a +**meshing** directive, which must be provided +via an attribute to the object. How `meshing` is defined: + +For all objects as an integer, which defines the target number of mesh-points. +In some cases an algorithm will attempt to come close to this number by +splitting up magnets into quasi-cubical cells. Exceptions are: + +- `Cuboid`: takes also a 3-vector that defines the number of equidistant splits + along each axis resulting in a rectangular regular grid. Keep in mind that the + accuracy is increased by cubical aspect ratios. +- `PolyLine`: defines the number of equidistant splits of each PolyLine segment, + not of the whole multi-segmented object. The total number of mesh-points will + be number of segments times meshing. + +The function `getFT()` returns force and torque as `np.ndarray` of shape (2,3), +or (t,2,3) when t targets are given. + +The following example code computes the force acting on a cuboid magnet, +generated by a current loop. ```python import magpylib as magpy import magpylib_force as mforce # create source and target objects -loop = magpy.current.Circle(diameter=2e-3, current=10, position=(0,0,-1e-3)) -cube = magpy.magnet.Cuboid(dimension=(1e-3,1e-3,1e-3), polarization=(1,0,0)) +loop = magpy.current.Circle(diameter=2e-3, current=10, position=(0, 0, -1e-3)) +cube = magpy.magnet.Cuboid(dimension=(1e-3, 1e-3, 1e-3), polarization=(1, 0, 0)) # provide meshing for target object -cube.meshing = (5,5,5) +cube.meshing = (5, 5, 5) # compute force and torque FT = mforce.getFT(loop, cube) @@ -70,9 +95,11 @@ print(FT) ``` (docs-force-computation)= + ## Computation details -The force $\vec{F}_m$ acting on a magnetization distribution $\vec{M}$ in a magnetic field $\vec{B}$ is given by +The force $\vec{F}_m$ acting on a magnetization distribution $\vec{M}$ in a +magnetic field $\vec{B}$ is given by $$\vec{F}_m = \int \nabla (\vec{M}\cdot\vec{B}) \ dV.$$ @@ -80,14 +107,20 @@ The torque $\vec{T}_m$ which acts on the magnetization distribution is $$\vec{T}_m = \int \vec{M} \times \vec{B} \ dV.$$ -The force $\vec{F}_c$ which acts on a current distribution $\vec{j}$ in a magnetic field is +The force $\vec{F}_c$ which acts on a current distribution $\vec{j}$ in a +magnetic field is $$\vec{F}_c = \int \vec{j}\times \vec{B} \ dV.$$ -And there is no torque. However, one must not forget that a force, when applied off-center, adds to the torque as +And there is no torque. However, one must not forget that a force, when applied +off-center, adds to the torque as $$\vec{T}' = \int \vec{r} \times \vec{F} \ dV,$$ -where $\vec{r}$ points from the body barycenter to the position where the force is applied. +where $\vec{r}$ points from the body barycenter to the position where the force +is applied. -The idea behind `magplyib-force` is to compute the above integrals by discretization. For this purpose, the target body is split up into small cells using the object `meshing` attribute. The force and torque computation is performed for all cells in a vectorized form, and the sum is returned. +The idea behind `magplyib-force` is to compute the above integrals by +discretization. For this purpose, the target body is split up into small cells +using the object `meshing` attribute. The force and torque computation is +performed for all cells in a vectorized form, and the sum is returned. diff --git a/docs/_pages/user_guide/docs/docs_pos_ori.md b/docs/_pages/user_guide/docs/docs_pos_ori.md index 0025c8f89..591d3b97d 100644 --- a/docs/_pages/user_guide/docs/docs_pos_ori.md +++ b/docs/_pages/user_guide/docs/docs_pos_ori.md @@ -1,44 +1,53 @@ (docs-position)= + # Position, Orientation, and Paths -The following secions are detiled technical documentations of the Magpylib position and orientation interface. Practical examples and good practice usage is demonstrated in the tutorial {ref}`examples-tutorial-paths`. +The following secions are detiled technical documentations of the Magpylib +position and orientation interface. Practical examples and good practice usage +is demonstrated in the tutorial {ref}`examples-tutorial-paths`. -::::{grid} 2 -:gutter: 2 +::::{grid} 2 :gutter: 2 -:::{grid-item} -:columns: 12 7 7 7 -The analytical magnetic field expressions found in the literature, implemented in the [Magpylib core](docs-field-core), are given in native coordinates of the sources which is convenient for the mathematical formulation. It is a common problem to transform the field into an application relevant observer coordinate system. While not technically difficult, such transformations are prone to error. -::: -:::{grid-item} -:columns: 12 5 5 5 -![](../../../_static/images/docu_position_sketch.png) -::: -:::: +:::{grid-item} :columns: 12 7 7 7 The analytical magnetic field expressions +found in the literature, implemented in the [Magpylib core](docs-field-core), +are given in native coordinates of the sources which is convenient for the +mathematical formulation. It is a common problem to transform the field into an +application relevant observer coordinate system. While not technically +difficult, such transformations are prone to error. ::: :::{grid-item} :columns: +12 5 5 5 ![](../../../_static/images/docu_position_sketch.png) ::: :::: -Here Magpylib helps. All Magpylib sources and observers lie in a global Cartesian coordinate system. Object position and orientation are defined by the attributes `position` and `orientation`, 😏. Objects can easily be moved around using the `move()` and `rotate()` methods. Eventually, the field is computed in the reference frame of the observers (e.g. Sensor objects). Positions are given in units of meter, and the default unit for orientation is °. +Here Magpylib helps. All Magpylib sources and observers lie in a global +Cartesian coordinate system. Object position and orientation are defined by the +attributes `position` and `orientation`, 😏. Objects can easily be moved around +using the `move()` and `rotate()` methods. Eventually, the field is computed in +the reference frame of the observers (e.g. Sensor objects). Positions are given +in units of meter, and the default unit for orientation is °. (docs-position-paths)= + ## Position and orientation attributes -Position and orientation of all Magpylib objects are defined by the two attributes - -::::{grid} 2 -:gutter: 2 - -:::{grid-item-card} -:shadow: none -:columns: 12 5 5 5 -**position** - a point $(x,y,z)$ in the global coordinates, or a set of such points $(\vec{P}_1, \vec{P}_2, ...)$. By default objects are created with `position=(0,0,0)`. -::: -:::{grid-item-card} -:shadow: none -:columns: 12 7 7 7 -**orientation** - a [Scipy Rotation object](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html) which describes the object rotation relative to its default orientation (defined in {ref}`docs-classes`). By default, objects are created with unit rotation `orientation=None`. -::: -:::: +Position and orientation of all Magpylib objects are defined by the two +attributes -The position and orientation attributes can be either **scalar**, i.e. a single position or a single rotation, or **vector**, when they are arrays of such scalars. The two attributes together define the **path** of an object - Magpylib makes sure that they are always of the same length. When the field is computed, it is automatically computed for the whole path. +::::{grid} 2 :gutter: 2 + +:::{grid-item-card} :shadow: none :columns: 12 5 5 5 +**position** - a point $(x,y,z)$ in the +global coordinates, or a set of such points $(\vec{P}_1, \vec{P}_2, ...)$. By +default objects are created with `position=(0,0,0)`. ::: :::{grid-item-card} +:shadow: none :columns: 12 7 7 7 +**orientation** - a +[Scipy Rotation object](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html) +which describes the object rotation relative to its default orientation (defined +in {ref}`docs-classes`). By default, objects are created with unit rotation +`orientation=None`. ::: :::: + +The position and orientation attributes can be either **scalar**, i.e. a single +position or a single rotation, or **vector**, when they are arrays of such +scalars. The two attributes together define the **path** of an object - Magpylib +makes sure that they are always of the same length. When the field is computed, +it is automatically computed for the whole path. ```{tip} To enable vectorized field computation, paths should always be used when modeling multiple object positions. Avoid using Python loops at all costs for that purpose! If your path is difficult to realize, consider using the [functional interface](docs-field-functional) instead. @@ -48,120 +57,136 @@ To enable vectorized field computation, paths should always be used when modelin Magpylib offers two powerful methods for object manipulation: -::::{grid} 2 -:gutter: 2 - -:::{grid-item-card} -:columns: 12 5 5 5 -:shadow: none -**move(**`displacement`, `start="auto"`**)** - move object by `displacement` input. `displacement` is a position vector (scalar input) or a set of position vectors (vector input). -::: -:::{grid-item-card} -:columns: 12 7 7 7 -:shadow: none -**rotate(**`rotation`, `anchor=None`, `start="auto"`**)** - rotates the object by the `rotation` input about an anchor point defined by the `anchor` input. `rotation` is a [Scipy Rotation object](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html), and `anchor` is a position vector. Both can be scalar or vector inputs. With `anchor=None` the object is rotated about its `position`. -::: -:::: - -- **Scalar input** is applied to the whole object path, starting with path index `start`. With the default `start="auto"` the index is set to `start=0` and the functionality is **moving objects around** (incl. their whole paths). -- **Vector input** of length $n$ applies the $n$ individual operations to $n$ object path entries, starting with path index `start`. Padding applies when the input exceeds the existing path length. With the default `start="auto"` the index is set to `start=len(object path)` and the functionality is **appending the input**. - -The practical application of this formalism is best demonstrated by the following program +::::{grid} 2 :gutter: 2 + +:::{grid-item-card} :columns: 12 5 5 5 :shadow: none +**move(**`displacement`, +`start="auto"`**)** - move object by +`displacement` input. `displacement` is a position vector (scalar input) or a +set of position vectors (vector input). ::: :::{grid-item-card} :columns: 12 7 7 +7 :shadow: none **rotate(**`rotation`, +`anchor=None`, `start="auto"`**)** - rotates +the object by the `rotation` input about an anchor point defined by the `anchor` +input. `rotation` is a +[Scipy Rotation object](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html), +and `anchor` is a position vector. Both can be scalar or vector inputs. With +`anchor=None` the object is rotated about its `position`. ::: :::: + +- **Scalar input** is applied to the whole object path, starting with path index + `start`. With the default `start="auto"` the index is set to `start=0` and the + functionality is **moving objects around** (incl. their whole paths). +- **Vector input** of length $n$ applies the $n$ individual operations to $n$ + object path entries, starting with path index `start`. Padding applies when + the input exceeds the existing path length. With the default `start="auto"` + the index is set to `start=len(object path)` and the functionality is + **appending the input**. + +The practical application of this formalism is best demonstrated by the +following program ```python import magpylib as magpy + # Note that all units are in SI sensor = magpy.Sensor() -print(sensor.position) # Default value +print(sensor.position) # Default value # --> [0. 0. 0.] -sensor.move((1,1,1)) # Scalar input is by default applied -print(sensor.position) # to the whole path +sensor.move((1, 1, 1)) # Scalar input is by default applied +print(sensor.position) # to the whole path # --> [1. 1. 1.] -sensor.move([(1,1,1), (2,2,2)]) # Vector input is by default appended -print(sensor.position) # to the existing path +sensor.move([(1, 1, 1), (2, 2, 2)]) # Vector input is by default appended +print(sensor.position) # to the existing path # --> [[1. 1. 1.] [2. 2. 2.] [3. 3. 3.]] -sensor.move((1,1,1), start=1) # Scalar input and start=1 is applied -print(sensor.position) # to whole path starting at index 1 +sensor.move((1, 1, 1), start=1) # Scalar input and start=1 is applied +print(sensor.position) # to whole path starting at index 1 # --> [[1. 1. 1.] [3. 3. 3.] [4. 4. 4.]] -sensor.move([(0,0,10), (0,0,20)], start=1) # Vector input and start=1 merges -print(sensor.position) # the input with the existing path +sensor.move([(0, 0, 10), (0, 0, 20)], start=1) # Vector input and start=1 merges +print(sensor.position) # the input with the existing path # --> [[ 1. 1. 1.] [ 3. 3. 13.] [ 4. 4. 24.]] # starting at index 1. ``` -Several extensions of the `rotate` method give a lot of flexibility with object rotation. They all feature the arguments `anchor` and `start` which work as described above. - -::::{grid} 1 -:gutter: 2 - -:::{grid-item-card} -:columns: 12 -:shadow: none -**rotate_from_angax(**`angle`, `axis`, `anchor=None`, `start="auto"`, `degrees=True` **)** -* `angle`: scalar or array with shape (n). Angle(s) of rotation. -* `axis`: array of shape (3,) or string. The direction of the rotation axis. String input can be 'x', 'y' or 'z' to denote respective directions. -* `degrees`: bool, default=True. Interpret angle input in units of deg (True) or rad (False). -::: - -:::{grid-item-card} -:columns: 12 -:shadow: none -**rotate_from_rotvec(**`rotvec`, `anchor=None`, `start="auto"`, `degrees=True` **)** -* `rotvec` : array with shape (n,3) or (3,). The rotation vector direction is the rotation axis and the vector length is the rotation angle in units of deg. -* `degrees`: bool, default=True. Interpret angle input in units of deg (True) or rad (False). -::: - -:::{grid-item-card} -:columns: 12 -:shadow: none -**rotate_from_euler(** `angle`, `seq`, `anchor=None`, `start="auto"`, `degrees=True` **)** -* `angle`: scalar or array with shape (n). Angle(s) of rotation in units of deg (by default). -* `seq` : string. Specifies sequence of axes for rotations. Up to 3 characters belonging to the set {'X', 'Y', 'Z'} for intrinsic rotations, or {'x', 'y', 'z'} for extrinsic rotations. Extrinsic and intrinsic rotations cannot be mixed in one function call. -* `degrees`: bool, default=True. Interpret angle input in units of deg (True) or rad (False). -::: - -:::{grid-item-card} -:columns: 12 -:shadow: none -**rotate_from_quat(**`quat`, `anchor=None`, `start="auto"` **)** -* `quat` : array with shape (n,4) or (4,). Rotation input in quaternion form. -::: - -:::{grid-item-card} -:columns: 12 -:shadow: none -**rotate_from_mrp(**`matrix`, `anchor=None`, `start="auto"` **)** -* `matrix` : array with shape (n,3,3) or (3,3). Rotation matrix. See scipy.spatial.transform.Rotation for details. -::: - -:::{grid-item-card} -:columns: 12 -:shadow: none -**rotate_from_mrp(**`mrp`, `anchor=None`, `start="auto"` **)** -* `mrp` : array with shape (n,3) or (3,). Modified Rodrigues parameter input. See scipy Rotation package for details. -::: +Several extensions of the `rotate` method give a lot of flexibility with object +rotation. They all feature the arguments `anchor` and `start` which work as +described above. -:::: +::::{grid} 1 :gutter: 2 + +:::{grid-item-card} :columns: 12 :shadow: none +**rotate_from_angax(**`angle`, `axis`, +`anchor=None`, `start="auto"`, `degrees=True` +**)** + +- `angle`: scalar or array with shape (n). Angle(s) of rotation. +- `axis`: array of shape (3,) or string. The direction of the rotation axis. + String input can be 'x', 'y' or 'z' to denote respective directions. +- `degrees`: bool, default=True. Interpret angle input in units of deg (True) or + rad (False). ::: + +:::{grid-item-card} :columns: 12 :shadow: none +**rotate_from_rotvec(**`rotvec`, +`anchor=None`, `start="auto"`, `degrees=True` +**)** + +- `rotvec` : array with shape (n,3) or (3,). The rotation vector direction is + the rotation axis and the vector length is the rotation angle in units of deg. +- `degrees`: bool, default=True. Interpret angle input in units of deg (True) or + rad (False). ::: + +:::{grid-item-card} :columns: 12 :shadow: none +**rotate_from_euler(** `angle`, `seq`, +`anchor=None`, `start="auto"`, `degrees=True` +**)** + +- `angle`: scalar or array with shape (n). Angle(s) of rotation in units of deg + (by default). +- `seq` : string. Specifies sequence of axes for rotations. Up to 3 characters + belonging to the set {'X', 'Y', 'Z'} for intrinsic rotations, or {'x', 'y', + 'z'} for extrinsic rotations. Extrinsic and intrinsic rotations cannot be + mixed in one function call. +- `degrees`: bool, default=True. Interpret angle input in units of deg (True) or + rad (False). ::: + +:::{grid-item-card} :columns: 12 :shadow: none +**rotate_from_quat(**`quat`, `anchor=None`, +`start="auto"` **)** + +- `quat` : array with shape (n,4) or (4,). Rotation input in quaternion form. + ::: + +:::{grid-item-card} :columns: 12 :shadow: none +**rotate_from_mrp(**`matrix`, `anchor=None`, +`start="auto"` **)** + +- `matrix` : array with shape (n,3,3) or (3,3). Rotation matrix. See + scipy.spatial.transform.Rotation for details. ::: + +:::{grid-item-card} :columns: 12 :shadow: none +**rotate_from_mrp(**`mrp`, `anchor=None`, +`start="auto"` **)** + +- `mrp` : array with shape (n,3) or (3,). Modified Rodrigues parameter input. + See scipy Rotation package for details. ::: -When objects with different path lengths are combined, e.g. when computing the field, the shorter paths are treated as static beyond their end to make the computation sensible. Internally, Magpylib follows a philosophy of edge-padding and end-slicing when adjusting paths. - -::::{grid} 2 -:gutter: 2 - -:::{grid-item-card} -:columns: 12 7 7 7 -:shadow: none -**Edge-padding:** whenever path entries beyond the existing path length are needed the edge-entries of the existing path are returned. This means that the object is “static” beyond its existing path. -::: -:::{grid-item-card} -:columns: 12 5 5 5 -:shadow: none -**End-slicing:** whenever a path is automatically reduced in length, Magpylib will slice such that the ending of the path is kept. -::: :::: -The tutorial {ref}`examples-tutorial-paths` shows intuitive good practice examples of the important functionality described in this section. \ No newline at end of file +When objects with different path lengths are combined, e.g. when computing the +field, the shorter paths are treated as static beyond their end to make the +computation sensible. Internally, Magpylib follows a philosophy of edge-padding +and end-slicing when adjusting paths. + +::::{grid} 2 :gutter: 2 + +:::{grid-item-card} :columns: 12 7 7 7 :shadow: none **Edge-padding:** whenever +path entries beyond the existing path length are needed the edge-entries of the +existing path are returned. This means that the object is “static” beyond its +existing path. ::: :::{grid-item-card} :columns: 12 5 5 5 :shadow: none +**End-slicing:** whenever a path is automatically reduced in length, Magpylib +will slice such that the ending of the path is kept. ::: :::: + +The tutorial {ref}`examples-tutorial-paths` shows intuitive good practice +examples of the important functionality described in this section. diff --git a/docs/_pages/user_guide/docs/docs_styles.md b/docs/_pages/user_guide/docs/docs_styles.md index 39075b285..73b3c023d 100644 --- a/docs/_pages/user_guide/docs/docs_styles.md +++ b/docs/_pages/user_guide/docs/docs_styles.md @@ -13,22 +13,36 @@ orphan: true --- (guide-graphic-styles)= + # Graphic styles -The graphic styles define how Magpylib objects are displayed visually when calling `show`. They can be fine-tuned and individualized to suit requirements and taste. +The graphic styles define how Magpylib objects are displayed visually when +calling `show`. They can be fine-tuned and individualized to suit requirements +and taste. Graphic styles can be defined in various ways: -1. There is a **default style** setting which is applied when no other inputs are made. -2. An **individual style** can be defined at object level. If the object is a [Collection](guide-docs-classes-collections) it will apply its color to all children. -3. Finally, styles that are defined in the `show` function call will override all other settings. This is referred to as **local style override**. +1. There is a **default style** setting which is applied when no other inputs + are made. +2. An **individual style** can be defined at object level. If the object is a + [Collection](guide-docs-classes-collections) it will apply its color to all + children. +3. Finally, styles that are defined in the `show` function call will override + all other settings. This is referred to as **local style override**. The following sections describe these styling options and how to customize them. (guide-graphic-styles-default)= + ## Default style -The default style is stored in `magpylib.defaults.display.style`. Note that the installation default styles differ slightly between different [graphic backends](guide-graphic-backends) depending on their respective capabilities. Specifically, the magnet magnetization in Matplotlib is displayed with arrows by default, while it is displayed using a color scheme in Plotly and Pyvista. The color scheme is also implemented in Matplotlib, but it is visually unsatisfactory. +The default style is stored in `magpylib.defaults.display.style`. Note that the +installation default styles differ slightly between different +[graphic backends](guide-graphic-backends) depending on their respective +capabilities. Specifically, the magnet magnetization in Matplotlib is displayed +with arrows by default, while it is displayed using a color scheme in Plotly and +Pyvista. The color scheme is also implemented in Matplotlib, but it is visually +unsatisfactory. The default styles can be modified in three ways: @@ -57,7 +71,11 @@ magpy.defaults.display.style.magnet.magnetization.update( ) ``` -All three examples result in the same default style. Once modified, the library default can always be restored with the `magpylib.style.reset()` method. The following practical example demonstrates how to create and set a user defined magnet magnetization style as default. The chosen custom style combines a 3-color scheme with an arrow which points in the magnetization direction. +All three examples result in the same default style. Once modified, the library +default can always be restored with the `magpylib.style.reset()` method. The +following practical example demonstrates how to create and set a user defined +magnet magnetization style as default. The chosen custom style combines a +3-color scheme with an arrow which points in the magnetization direction. ```{code-cell} ipython3 import magpylib as magpy @@ -110,10 +128,14 @@ The default Magpylib style abides by the tri-color scheme for ideal-typical magn A list of all style options can be found [here](examples-list-of-styles). - ## Magic underscore notation -To facilitate working with deeply nested properties, all style constructors and object style methods support the "magic underscore notation". It enables referencing nested properties by joining together multiple property names with underscores. This feature mainly helps reduce the code verbosity and is heavily inspired by the [Plotly underscore notation](https://plotly.com/python/creating-and-updating-figures/#magic-underscore-notation)). +To facilitate working with deeply nested properties, all style constructors and +object style methods support the "magic underscore notation". It enables +referencing nested properties by joining together multiple property names with +underscores. This feature mainly helps reduce the code verbosity and is heavily +inspired by the +[Plotly underscore notation](https://plotly.com/python/creating-and-updating-figures/#magic-underscore-notation)). With magic underscore notation, the previous examples can be written as: @@ -139,13 +161,23 @@ magpy.defaults.display.style.magnet.update( ## Individual style -Any Magpylib object can have its own individual style that will take precedence over the default values when `show` is called. When setting individual styles, the object family specifier such as `magnet` or `current` can be omitted. +Any Magpylib object can have its own individual style that will take precedence +over the default values when `show` is called. When setting individual styles, +the object family specifier such as `magnet` or `current` can be omitted. ```{note} Users should be aware that the individual object style is organized in classes that take much longer to initialize than bare Magpylib objects, i.e. objects without individual style. This can lead to a computational bottleneck when setting individual styles of many Magpylib objects. For this reason Magpylib automatically defers style initialization until it is needed the first time, e.g. when calling the `show` function, so that object creatin time is not affected. However, this works only if style properties are set at initialization (e.g.: `magpy.magnet.Cuboid(..., style_label="MyCuboid")`). While this effect may not be noticeable for a small number of objects, it is best to avoid setting styles until it is plotting time. ``` -In the following example `cube` has no individual style, so the default style is used. `cylinder` has an individual style set for `magnetization` which is a tricolor scheme that will display the object color in the middle. The individual style is set at object initialization (good practice), and it will be applied only when `show` is called at the end of the example. Finally, `sphere` is also given an individual style for `magnetization` that displays the latter using a 2-color scheme. In this case, however, the individual style is applied after object initialization (bad practice), which results in style initialization before it is needed. +In the following example `cube` has no individual style, so the default style is +used. `cylinder` has an individual style set for `magnetization` which is a +tricolor scheme that will display the object color in the middle. The individual +style is set at object initialization (good practice), and it will be applied +only when `show` is called at the end of the example. Finally, `sphere` is also +given an individual style for `magnetization` that displays the latter using a +2-color scheme. In this case, however, the individual style is applied after +object initialization (bad practice), which results in style initialization +before it is needed. ```{code-cell} ipython3 import magpylib as magpy @@ -181,7 +213,11 @@ magpy.show(cube, cylinder, sphere, backend="plotly") ## Collection style -When displaying [Collection objects](guide-docs-classes-collections) their `color` property will be assigned to all its children override the default color cycle. In the following example this is demonstrated. Therefore, we make use of the [Matplotlib backend](guide-graphic-backends) which displays magnet color by default and shows the magnetization as an arrow rather than a color sequence. +When displaying [Collection objects](guide-docs-classes-collections) their +`color` property will be assigned to all its children override the default color +cycle. In the following example this is demonstrated. Therefore, we make use of +the [Matplotlib backend](guide-graphic-backends) which displays magnet color by +default and shows the magnetization as an arrow rather than a color sequence. ```{code-cell} ipython3 import magpylib as magpy @@ -204,20 +240,32 @@ coll = cube + cylinder magpy.show(coll, sphere, backend="matplotlib") ``` -In addition, it is possible to modify individual style properties of all children, that cannot be set at Collection level, with the `set_children_styles` method. Non-matching properties, e.g. magnetization color for children that are currents, are simply ignored. +In addition, it is possible to modify individual style properties of all +children, that cannot be set at Collection level, with the `set_children_styles` +method. Non-matching properties, e.g. magnetization color for children that are +currents, are simply ignored. ```{code-cell} ipython3 coll.set_children_styles(magnetization_color_south="blue") magpy.show(coll, sphere, backend="plotly") ``` -The child-styles are individual style properties of the collection object and are not set as individual styles on each child-object. This means that when displayed individually with `show`, the above child-objects will have Magpylib default style. +The child-styles are individual style properties of the collection object and +are not set as individual styles on each child-object. This means that when +displayed individually with `show`, the above child-objects will have Magpylib +default style. ## Local style override -Finally, it is possible to hand style input to the `show` function directly and locally override all style properties for this specific `show` output. Default or individual style attributes will not be modified. Such inputs must start with the `style` prefix and the object family specifier must be omitted. Naturally underscore magic is supported. +Finally, it is possible to hand style input to the `show` function directly and +locally override all style properties for this specific `show` output. Default +or individual style attributes will not be modified. Such inputs must start with +the `style` prefix and the object family specifier must be omitted. Naturally +underscore magic is supported. -In the following example the default `style.magnetization.show=True` is overridden locally, so that object colors become visible instead of magnetization colors in the Plotly backend. +In the following example the default `style.magnetization.show=True` is +overridden locally, so that object colors become visible instead of +magnetization colors in the Plotly backend. ```{code-cell} ipython3 import magpylib as magpy @@ -245,30 +293,64 @@ magpy.defaults.display.style.as_dict(flatten=True, separator=".") ``` (examples-own-3d-models)= -## Custom 3D models - -Each Magpylib object has a default 3D representation that is displayed with `show`. It is possible to disable the default model and to provide Magpylib with a custom model. -There are several reasons why this can be of interest. For example, the integration of a [custom source](guide-docs-classes-custom-source) object that has its own geometry, to display a sensor in the form of a realistic package provided in CAD form, representation of a [Collection](guide-docs-classes-collections) as a parts holder, integration of environmental parts to the Magpylib 3D plotting scene, or simply highlighting an object when colors do not suffice. - -The default trace of a Magpylib object `obj` can simply be turned off using the individual style command `obj.style.model3d.showdefault = False`. A custom 3D model can be added using the function `obj.style.model3d.add_trace()`. The new trace is then stored in the `obj.style.model3d.data` property. This property is a list and it is possible to store multiple custom traces there. The default style is not included in this property. It is instead inherently stored in the Magpylib classes to enable visualization of the magnetization with a color scheme. - -The input of `add_trace()` must be a `magpylib.graphics.Trace3d` object, or a dictionary that contains all necessary information for generating a 3D model. Because different plotting libraries require different directives, traces might be bound to specific [backends](guide-graphic-backends). For example, a trace dictionary might contain all information for Matplotlib to generate a 3D model using the [plot_surface](https://matplotlib.org/stable/plot_types/3D/surface3d_simple.html) function. +## Custom 3D models -To enable visualization of custom objects with different graphic backends Magpylib implements a **generic backend**. Traces defined in the generic backend are translated to all other backends automatically. If a specific backend is used, the model will only appear when called with the corresponding backend. +Each Magpylib object has a default 3D representation that is displayed with +`show`. It is possible to disable the default model and to provide Magpylib with +a custom model. + +There are several reasons why this can be of interest. For example, the +integration of a [custom source](guide-docs-classes-custom-source) object that +has its own geometry, to display a sensor in the form of a realistic package +provided in CAD form, representation of a +[Collection](guide-docs-classes-collections) as a parts holder, integration of +environmental parts to the Magpylib 3D plotting scene, or simply highlighting an +object when colors do not suffice. + +The default trace of a Magpylib object `obj` can simply be turned off using the +individual style command `obj.style.model3d.showdefault = False`. A custom 3D +model can be added using the function `obj.style.model3d.add_trace()`. The new +trace is then stored in the `obj.style.model3d.data` property. This property is +a list and it is possible to store multiple custom traces there. The default +style is not included in this property. It is instead inherently stored in the +Magpylib classes to enable visualization of the magnetization with a color +scheme. + +The input of `add_trace()` must be a `magpylib.graphics.Trace3d` object, or a +dictionary that contains all necessary information for generating a 3D model. +Because different plotting libraries require different directives, traces might +be bound to specific [backends](guide-graphic-backends). For example, a trace +dictionary might contain all information for Matplotlib to generate a 3D model +using the +[plot_surface](https://matplotlib.org/stable/plot_types/3D/surface3d_simple.html) +function. + +To enable visualization of custom objects with different graphic backends +Magpylib implements a **generic backend**. Traces defined in the generic backend +are translated to all other backends automatically. If a specific backend is +used, the model will only appear when called with the corresponding backend. A trace-dictionary has the following keys: 1. `'backend'`: `'generic'`, `'matplotlib'` or `'plotly'` -2. `'constructor'`: name of the plotting constructor from the respective backend, e.g. plotly `'Mesh3d'` or matplotlib `'plot_surface'` +2. `'constructor'`: name of the plotting constructor from the respective + backend, e.g. plotly `'Mesh3d'` or matplotlib `'plot_surface'` 3. `'args'`: default `None`, positional arguments handed to constructor 4. `'kwargs'`: default `None`, keyword arguments handed to constructor -5. `'coordsargs'`: tells Magpylib which input corresponds to which coordinate direction, so that geometric representation becomes possible. By default `{'x': 'x', 'y': 'y', 'z': 'z'}` for the `'generic'` backend and Plotly backend, and `{'x': 'args[0]', 'y': 'args[1]', 'z': 'args[2]'}` for the Matplotlib backend. +5. `'coordsargs'`: tells Magpylib which input corresponds to which coordinate + direction, so that geometric representation becomes possible. By default + `{'x': 'x', 'y': 'y', 'z': 'z'}` for the `'generic'` backend and Plotly + backend, and `{'x': 'args[0]', 'y': 'args[1]', 'z': 'args[2]'}` for the + Matplotlib backend. 6. `'show'`: default `True`, toggle if this trace should be displayed 7. `'scale'`: default 1, object geometric scaling factor -8. `'updatefunc'`: default `None`, updates the trace parameters when `show` is called. Used to generate dynamic traces. +8. `'updatefunc'`: default `None`, updates the trace parameters when `show` is + called. Used to generate dynamic traces. -The following example shows how a trace is constructed using the generic backend with the `Mesh3d` constructor. We create a `Sensor` object and replace its default 3d model by a tetrahedron. +The following example shows how a trace is constructed using the generic backend +with the `Mesh3d` constructor. We create a `Sensor` object and replace its +default 3d model by a tetrahedron. ```{code-cell} ipython3 import magpylib as magpy @@ -303,7 +385,10 @@ for backend in magpy.SUPPORTED_PLOTTING_BACKENDS: magpy.show(sensor, backend=backend) ``` -As noted above, it is possible to have multiple user-defined traces that will be displayed at the same time. The following example continuation demonstrates this by adding two more traces using the `Scatter3d` constructor in the generic backend. In addition, it showns how to copy and manipulate `Trace3d` objects. +As noted above, it is possible to have multiple user-defined traces that will be +displayed at the same time. The following example continuation demonstrates this +by adding two more traces using the `Scatter3d` constructor in the generic +backend. In addition, it showns how to copy and manipulate `Trace3d` objects. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -338,7 +423,8 @@ magpy.show(sensor) ### Matplotlib constructors -The following examples show how to construct traces with `plot`, `plot_surface` and `plot_trisurf`: +The following examples show how to construct traces with `plot`, `plot_surface` +and `plot_trisurf`: ```{code-cell} ipython3 import matplotlib.pyplot as plt @@ -406,7 +492,8 @@ magpy.show(magnet, ball, mobius, backend="matplotlib") ## Pre-defined 3D models -Automatic trace generators are provided for several basic 3D models in `magpylib.graphics.model3d`. They can be used as follows, +Automatic trace generators are provided for several basic 3D models in +`magpylib.graphics.model3d`. They can be used as follows, ```{code-cell} ipython3 from magpylib import Collection @@ -470,9 +557,11 @@ obj0.show(obj1, obj2, obj3, obj4, obj5, backend="plotly") ``` ((guide-docs-style-cad))= + ## Adding a CAD model -The following code sample shows how a standard CAD model (*.stl file) can be transformed into a Magpylib `Trace3d` object. +The following code sample shows how a standard CAD model (\*.stl file) can be +transformed into a Magpylib `Trace3d` object. ```{note} The code below requires installation of the `numpy-stl` package. @@ -559,4 +648,4 @@ magpy.show(args, **kwargs, backend="plotly") ```{code-cell} ipython3 -``` \ No newline at end of file +``` diff --git a/docs/_pages/user_guide/docs/docs_units_types.md b/docs/_pages/user_guide/docs/docs_units_types.md index 9d12b32e1..bba1f66a2 100644 --- a/docs/_pages/user_guide/docs/docs_units_types.md +++ b/docs/_pages/user_guide/docs/docs_units_types.md @@ -1,30 +1,28 @@ # Units and Types (guide-docs-units)= + ## Units -The important vacuum permeability $\mu_0$ is provided at the package top-level **mu_0**. It's value is not $4 \pi 10^{-7}$ since [the redefinition of the SI base units](https://en.wikipedia.org/wiki/2019_redefinition_of_the_SI_base_units), but a value close to it. - -For historical reasons Magpylib used non-SI units until Version 4. Starting with version 5 all inputs and outputs are SI-based. - -::::{grid} 3 -:::{grid-item} -:columns: 1 -::: - -:::{grid-item} -:columns: 10 -| PHYSICAL QUANTITY | MAGPYLIB PARAMETER | UNITS from v5| UNITS until v4| -|:---:|:---:|:---:|:---:| -| Magnetic Polarization $\vec{J}$ | `polarization`, `getJ()` | **T** | - | -| Magnetization $\vec{M}$ | `magnetization`, `getM()` | **A/m** | mT | -| Electric Current $i_0$ | `current` | **A** | A | -| Magnetic Dipole Moment $\vec{m}$ | `moment` | **A·m²** | mT·mm³ | -| B-field $\vec{B}$ | `getB()` | **T** | mT | -| H-field $\vec{H}$ | `getH()` | **A/m** | kA/m | -| Length-inputs | `position`, `dimension`, `vertices`, ... | **m** | mm | -| Angle-inputs | `angle`, `dimension`, ... | **°** | ° | -::: +The important vacuum permeability $\mu_0$ is provided at the package top-level +**mu_0**. It's value is not $4 \pi 10^{-7}$ +since +[the redefinition of the SI base units](https://en.wikipedia.org/wiki/2019_redefinition_of_the_SI_base_units), +but a value close to it. + +For historical reasons Magpylib used non-SI units until Version 4. Starting with +version 5 all inputs and outputs are SI-based. + +::::{grid} 3 :::{grid-item} :columns: 1 ::: + +:::{grid-item} :columns: 10 | PHYSICAL QUANTITY | MAGPYLIB PARAMETER | UNITS +from v5| UNITS until v4| |:---:|:---:|:---:|:---:| | Magnetic Polarization +$\vec{J}$ | `polarization`, `getJ()` | **T** | - | | Magnetization $\vec{M}$ | +`magnetization`, `getM()` | **A/m** | mT | | Electric Current $i_0$ | `current` +| **A** | A | | Magnetic Dipole Moment $\vec{m}$ | `moment` | **A·m²** | mT·mm³ +| | B-field $\vec{B}$ | `getB()` | **T** | mT | | H-field $\vec{H}$ | `getH()` | +**A/m** | kA/m | | Length-inputs | `position`, `dimension`, `vertices`, ... | +**m** | mm | | Angle-inputs | `angle`, `dimension`, ... | **°** | ° | ::: :::: @@ -37,6 +35,7 @@ The connection between the magnetic polarization J, the magnetization M and the ``` (guide-docs-io-scale-invariance)= + ## Arbitrary unit Convention ```{hint} @@ -47,4 +46,6 @@ In addition, `getB` returns the same unit as given by the `polarization` input. ## Types -Magpylib requires no special input format. All scalar types (`int`, `float`, ...) and vector types (`list`, `tuple`, `np.ndarray`, ... ) are accepted. Magpylib returns everything as `np.ndarray`. \ No newline at end of file +Magpylib requires no special input format. All scalar types (`int`, `float`, +...) and vector types (`list`, `tuple`, `np.ndarray`, ... ) are accepted. +Magpylib returns everything as `np.ndarray`. diff --git a/docs/_pages/user_guide/examples/examples_app_coils.md b/docs/_pages/user_guide/examples/examples_app_coils.md index aebd64078..b72cf7c5b 100644 --- a/docs/_pages/user_guide/examples/examples_app_coils.md +++ b/docs/_pages/user_guide/examples/examples_app_coils.md @@ -16,11 +16,19 @@ kernelspec: # Coils -In this example we show how to model air-coils, then combine two coils into a Helmholtz-pair and visualize the homogeneity of the resulting magnetic field. A nice explanation of coils and the magnetic field is given [here](https://www.nagwa.com/en/explainers/186157825721/#:~:text=The%20magnetic%20field%20strength%2C%20%F0%9D%90%B5,%EF%8A%AD%20T%E2%8B%85m%2FA.). With the code examples below you can easily compare Magpylib results to results presented in this tutorial. +In this example we show how to model air-coils, then combine two coils into a +Helmholtz-pair and visualize the homogeneity of the resulting magnetic field. A +nice explanation of coils and the magnetic field is given +[here](https://www.nagwa.com/en/explainers/186157825721/#:~:text=The%20magnetic%20field%20strength%2C%20%F0%9D%90%B5,%EF%8A%AD%20T%E2%8B%85m%2FA.). +With the code examples below you can easily compare Magpylib results to results +presented in this tutorial. ## Coil models -**Model 1:** The coil consists of multiple windings, each of which can be modeled with a circular current loop which is realized by the `Circle` class. The individual windings are combined into a `Collection` which itself behaves like a single magnetic field source. +**Model 1:** The coil consists of multiple windings, each of which can be +modeled with a circular current loop which is realized by the `Circle` class. +The individual windings are combined into a `Collection` which itself behaves +like a single magnetic field source. ```{code-cell} ipython3 import numpy as np @@ -38,7 +46,9 @@ for z in np.linspace(-8, 8, 16): coil1.show() ``` -**Model 2:** The coil is in reality more like a spiral, which can be modeled using the `Polyline` class. However, a good spiral approximation requires many small line segments, which makes the computation slower. +**Model 2:** The coil is in reality more like a spiral, which can be modeled +using the `Polyline` class. However, a good spiral approximation requires many +small line segments, which makes the computation slower. ```{code-cell} ipython3 import numpy as np @@ -54,7 +64,11 @@ coil2 = magpy.current.Polyline( coil2.show() ``` -**Model 3:** A [Helmholtz coil](https://en.wikipedia.org/wiki/Helmholtz_coil) is a device for producing a region of nearly uniform magnetic field. It consists of two coils on the same axis, carrying an equal electric current in the same direction. In classical layouts, the distance between the coils is similar to the coil radius. +**Model 3:** A [Helmholtz coil](https://en.wikipedia.org/wiki/Helmholtz_coil) is +a device for producing a region of nearly uniform magnetic field. It consists of +two coils on the same axis, carrying an equal electric current in the same +direction. In classical layouts, the distance between the coils is similar to +the coil radius. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -80,7 +94,11 @@ helmholtz.show() ## Plotting the field -Streamplot from Matplotlib is a powerful tool to outline the field lines. However, it must be understood that streamplot shows only a projection of the field onto the observation plane. All field components that point out of the plane become invisible. In out example we choose symmetry planes, where the perpendicular component is negligible. +Streamplot from Matplotlib is a powerful tool to outline the field lines. +However, it must be understood that streamplot shows only a projection of the +field onto the observation plane. All field components that point out of the +plane become invisible. In out example we choose symmetry planes, where the +perpendicular component is negligible. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -122,7 +140,9 @@ plt.show() ## Helmholtz field homogeneity -While the optimal solution is given by two current loops, real world applications must deal with finite sizes and limited construction space. Here Magpylib enables fast analysis of different possible geometries. +While the optimal solution is given by two current loops, real world +applications must deal with finite sizes and limited construction space. Here +Magpylib enables fast analysis of different possible geometries. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -159,4 +179,4 @@ plt.tight_layout() plt.show() ``` -Notice that in such finite sized arrangements the field is not very homogeneous. \ No newline at end of file +Notice that in such finite sized arrangements the field is not very homogeneous. diff --git a/docs/_pages/user_guide/examples/examples_app_end_of_shaft.md b/docs/_pages/user_guide/examples/examples_app_end_of_shaft.md index f0fa70179..916a465f3 100644 --- a/docs/_pages/user_guide/examples/examples_app_end_of_shaft.md +++ b/docs/_pages/user_guide/examples/examples_app_end_of_shaft.md @@ -16,9 +16,19 @@ orphan: true # Magnetic Angle Sensor -End of shaft angle sensing is a classic example for a magnetic position system. The goal is to determine the angular position of a rotating shaft. A magnet, typically a diametrically magnetized cylinder, is mounted at the end of the shaft. A 2D sensor is mounted below. When the shaft rotates the two sensor outputs will be $s_1=B_0 sin(\varphi)$ and $s_2=B_0 cos(\varphi)$, so that the angle is uniquely given by $\varphi = arctan_2(s_1,s_2)$. +End of shaft angle sensing is a classic example for a magnetic position system. +The goal is to determine the angular position of a rotating shaft. A magnet, +typically a diametrically magnetized cylinder, is mounted at the end of the +shaft. A 2D sensor is mounted below. When the shaft rotates the two sensor +outputs will be $s_1=B_0 sin(\varphi)$ and $s_2=B_0 cos(\varphi)$, so that the +angle is uniquely given by $\varphi = arctan_2(s_1,s_2)$. -In the example below we show such a typical end-of-shaft system with a 2-pixel sensor, that is commonly used to eliminate external stray fields. In addition, we assume that the magnet is not perfectly mounted at the end of the shaft, but slightly displaced to the side, which results in a wobble motion. Such tolerances are easily implemented with Magpylib, they can be visualized and their influence on the sensor output signal can be tested quickly. +In the example below we show such a typical end-of-shaft system with a 2-pixel +sensor, that is commonly used to eliminate external stray fields. In addition, +we assume that the magnet is not perfectly mounted at the end of the shaft, but +slightly displaced to the side, which results in a wobble motion. Such +tolerances are easily implemented with Magpylib, they can be visualized and +their influence on the sensor output signal can be tested quickly. ```{code-cell} ipython3 import numpy as np diff --git a/docs/_pages/user_guide/examples/examples_app_halbach.md b/docs/_pages/user_guide/examples/examples_app_halbach.md index 90e4f1096..d7395c15e 100644 --- a/docs/_pages/user_guide/examples/examples_app_halbach.md +++ b/docs/_pages/user_guide/examples/examples_app_halbach.md @@ -16,13 +16,18 @@ kernelspec: # Halbach Magnets -Magpylib is an excellent tool to create magnet assemblies. In this example we will show how to model Halbach magnets. +Magpylib is an excellent tool to create magnet assemblies. In this example we +will show how to model Halbach magnets. ```{note} In the following examples we make use of the [arbitrary unit convention](guide-docs-io-scale-invariance). ``` -The original Halbach-magnetization describes a hollow cylinder with a polarization direction that rotates twice while going around the cylinder once. In reality such polarizations are difficult to fabricate. What is commonly done instead are "Discreete Halbach Arrays", which are magnet assemblies that approximate a Halbach magnetization. +The original Halbach-magnetization describes a hollow cylinder with a +polarization direction that rotates twice while going around the cylinder once. +In reality such polarizations are difficult to fabricate. What is commonly done +instead are "Discreete Halbach Arrays", which are magnet assemblies that +approximate a Halbach magnetization. The following code creates a Discreete Halbach Cylinder generated from Cuboids: @@ -48,7 +53,8 @@ for a in angles: halbach.show(backend='plotly') ``` -Next we compute and display the field on an xy-grid in the symmetry plane using the [matplotlib streamplot](examples-vis-mpl-streamplot) example. +Next we compute and display the field on an xy-grid in the symmetry plane using +the [matplotlib streamplot](examples-vis-mpl-streamplot) example. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed diff --git a/docs/_pages/user_guide/examples/examples_app_scales.md b/docs/_pages/user_guide/examples/examples_app_scales.md index d07cd28cf..d5d723190 100644 --- a/docs/_pages/user_guide/examples/examples_app_scales.md +++ b/docs/_pages/user_guide/examples/examples_app_scales.md @@ -16,7 +16,8 @@ kernelspec: # Magnetic Scales -In this example we will show how magnetic scales can be constructed with Magpylib for fast field computation. +In this example we will show how magnetic scales can be constructed with +Magpylib for fast field computation. - reference to DS 91411 and 91479 - ideal-typical scales diff --git a/docs/_pages/user_guide/examples/examples_force_floating.md b/docs/_pages/user_guide/examples/examples_force_floating.md index 25c28a323..ac3754831 100644 --- a/docs/_pages/user_guide/examples/examples_force_floating.md +++ b/docs/_pages/user_guide/examples/examples_force_floating.md @@ -16,17 +16,26 @@ kernelspec: # Floating Magnets -The examples here require installaion of the [magpylib-force package](https://pypi.org/project/magpylib-force/). See also the [magpylib-force documentation](docs-magpylib-force). +The examples here require installaion of the +[magpylib-force package](https://pypi.org/project/magpylib-force/). See also the +[magpylib-force documentation](docs-magpylib-force). ## Formalism -With force and torque we can compute how a magnet moves in a magnetic field by solving the equations of motion, +With force and torque we can compute how a magnet moves in a magnetic field by +solving the equations of motion, $$ \vec{F} = \dot{\vec{p}} \ \text{and} \ \vec{T} = \dot{\vec{L}}$$ -with force $\vec{F}$, momentum $\vec{p}$, torque $\vec{T}$ and angular momentum $\vec{L}$. +with force $\vec{F}$, momentum $\vec{p}$, torque $\vec{T}$ and angular momentum +$\vec{L}$. -We implement a first order semi-implicit Euler method that is used to compute [planetary motion](https://www.mgaillard.fr/2021/07/11/euler-integration.html). The algorithm splits the computation into small subsequent time-steps $\Delta t$, resulting in the following equations for the position $\vec{s}$, the velocity $\vec{v} = \dot{\vec{s}}$, the rotation angle $\vec{\varphi}$ and the angular velocity $\vec{\omega}$, +We implement a first order semi-implicit Euler method that is used to compute +[planetary motion](https://www.mgaillard.fr/2021/07/11/euler-integration.html). +The algorithm splits the computation into small subsequent time-steps +$\Delta t$, resulting in the following equations for the position $\vec{s}$, the +velocity $\vec{v} = \dot{\vec{s}}$, the rotation angle $\vec{\varphi}$ and the +angular velocity $\vec{\omega}$, $$\vec{v}(t+\Delta t) = \vec{v}(t) + \frac{\Delta t}{m} \vec{F}(t)$$ @@ -38,7 +47,9 @@ $$\vec{\varphi} (t + \Delta t) = \vec{\varphi}(t) + \Delta t \cdot \vec{\omega} ## Magnet and Coil -In the following example we show an implementation of the proposed Euler scheme. A cubical magnet is accelerated by a current loop along the z-axis as show in the following sketch: +In the following example we show an implementation of the proposed Euler scheme. +A cubical magnet is accelerated by a current loop along the z-axis as show in +the following sketch: ```{figure} ../../../_static/images/examples_force_floating_coil-magnet.png :width: 40% @@ -48,9 +59,12 @@ In the following example we show an implementation of the proposed Euler scheme. A cubical magnet is accelerated by a current loop. ``` -Due to the symmetry of the problem there is no torque so we solve only the translation part of the equations of motion. +Due to the symmetry of the problem there is no torque so we solve only the +translation part of the equations of motion. -In the beginning, the magnet is at rest and slightly displaced in z-direction from the center of the current loop. With time the magnet is accelerated and it's z-position is displayed in the figure below. +In the beginning, the magnet is at rest and slightly displaced in z-direction +from the center of the current loop. With time the magnet is accelerated and +it's z-position is displayed in the figure below. ```{code-cell} ipython3 import numpy as np @@ -73,10 +87,10 @@ def timestep(source, target, dt): dt: Euler scheme length of timestep """ - + # compute force F, _ = getFT(source, target) - + # compute/set new velocity and position target.v = target.v + dt/target.m * F target.position = target.position + dt * target.v @@ -91,7 +105,7 @@ cube2 = cube1.copy(polarization=(0,0,-1)) # Compute motion for cube, lab in zip([cube1, cube2], ["attractive", "repulsive"]): - + # Set initial conditions cube.m = 1e-3 cube.position=(0,0,3e-3) @@ -116,7 +130,13 @@ plt.gca().set( plt.show() ``` -The simulation is made with two magnets with opposing polarizations. In the "repulsive" case (orange) the magnetic moment of magnet and coil are anti-parallel and the magnet is simply pushed away from the coil in positive z-direction. In the "attractive" case (blue) the moments are parallel to each other, and the magnet is accelerated towards the coil center. Due to inertia it then comes out on the other side, and is again attracted towards the center resulting in an oscillation. +The simulation is made with two magnets with opposing polarizations. In the +"repulsive" case (orange) the magnetic moment of magnet and coil are +anti-parallel and the magnet is simply pushed away from the coil in positive +z-direction. In the "attractive" case (blue) the moments are parallel to each +other, and the magnet is accelerated towards the coil center. Due to inertia it +then comes out on the other side, and is again attracted towards the center +resulting in an oscillation. ```{warning} This algorithm accumulates its error over time, which can be avoided by choosing smaller timesteps. @@ -124,7 +144,9 @@ This algorithm accumulates its error over time, which can be avoided by choosing ## Two-body problem -In the following example we demonstrate a fully dynamic simulation with two magnetic bodies that rotate around each other, attracted towards each other by the magnetic force, and repelled by the centrifugal force. +In the following example we demonstrate a fully dynamic simulation with two +magnetic bodies that rotate around each other, attracted towards each other by +the magnetic force, and repelled by the centrifugal force. ```{figure} ../../../_static/images/examples_force_floating_ringdown.png :width: 80% @@ -134,7 +156,9 @@ In the following example we demonstrate a fully dynamic simulation with two magn Two freely moving magnets rotate around each other. ``` -Contrary to the simple case above, we apply the Euler scheme also to the rotation degrees of freedom, as the magnets will change their orientation while they circle around each other. +Contrary to the simple case above, we apply the Euler scheme also to the +rotation degrees of freedom, as the magnets will change their orientation while +they circle around each other. ```{code-cell} ipython3 import numpy as np @@ -160,11 +184,11 @@ def timestep(source, target, dt): """ # compute force F, T = getFT(source, target) - + # compute/set new velocity and position target.v = target.v + dt/target.m * F target.position = target.position + dt * target.v - + # compute/set new angular velocity and rotation angle target.w = target.w + dt*target.orientation.apply(np.dot(target.I_inv, target.orientation.inv().apply(T))) target.orientation = R.from_rotvec(dt*target.w)*target.orientation @@ -201,11 +225,11 @@ for i in range(steps): fig, (ax1,ax2) = plt.subplots(2,1,figsize=(10,5)) for j,ls in enumerate(["-", "--"]): - + # Plot positions for i,a in enumerate("xyz"): ax1.plot(data[j,:,i], label= a + str(j+1), ls=ls) - + # Plot orientations for i,a in enumerate(["phi", "psi", "theta"]): ax2.plot(data[j+2,:,i], label= a + str(j+1), ls=ls) @@ -226,9 +250,15 @@ plt.tight_layout() plt.show() ``` -In the figure one can see, that the initial velocity is chosen so that the magnets approach each other in a ringdown-like behavior. The magnets are magnetically locked towards each other - both always show the same orientation. However, given no initial angular velocity, the rotation angle is oscillating several times while circling once. +In the figure one can see, that the initial velocity is chosen so that the +magnets approach each other in a ringdown-like behavior. The magnets are +magnetically locked towards each other - both always show the same orientation. +However, given no initial angular velocity, the rotation angle is oscillating +several times while circling once. -A video is helpful in this case to understand what is going on. From the computation above, we build the following gif making use of this [export-animation](examples-vis-exporting-animations) tutorial. +A video is helpful in this case to understand what is going on. From the +computation above, we build the following gif making use of this +[export-animation](examples-vis-exporting-animations) tutorial. ```{figure} ../../../_static/videos/example_force_floating_ringdown.gif :width: 60% @@ -236,4 +266,4 @@ A video is helpful in this case to understand what is going on. From the computa :alt: animation of simulated magnet ringdown. Animation of above simulated magnet ringdown. -``` \ No newline at end of file +``` diff --git a/docs/_pages/user_guide/examples/examples_force_force.md b/docs/_pages/user_guide/examples/examples_force_force.md index 342ab1338..f121e0656 100644 --- a/docs/_pages/user_guide/examples/examples_force_force.md +++ b/docs/_pages/user_guide/examples/examples_force_force.md @@ -16,13 +16,16 @@ kernelspec: # Magnetic Force and Torque -The `magpylib-force` extension provides force and torque computation between Magpylib objects. A detailed description of the API and how the computation is achieved can be found in the [user guide](docs-force-computation). +The `magpylib-force` extension provides force and torque computation between +Magpylib objects. A detailed description of the API and how the computation is +achieved can be found in the [user guide](docs-force-computation). ```{warning} [Scaling invariance](guide-docs-io-scale-invariance) does not hold for force computations! Be careful to provide the inputs in the correct units! ``` -In the following example we show how to compute force and torque between two objects and how to represent it graphically. +In the following example we show how to compute force and torque between two +objects and how to represent it graphically. ```{code-cell} ipython3 import pyvista as pv @@ -44,7 +47,9 @@ print(f"Force (blue): {[round(f) for f in F]} N") print(f"Torque (yellow): {[round(t) for t in T]} Nm") ``` -Force and torque are really strong in this example, because the magnet and the coil are very large objects. With 0.7 m side length, the magnet has a Volume of ~1/3rd cubic meter :). +Force and torque are really strong in this example, because the magnet and the +coil are very large objects. With 0.7 m side length, the magnet has a Volume of +~1/3rd cubic meter :). ```{code-cell} ipython3 # Example continued from above @@ -57,4 +62,4 @@ arrowT = pv.Arrow(start=(0,0,0), direction=T) pl.add_mesh(arrowT, color="yellow") pl.show() -``` \ No newline at end of file +``` diff --git a/docs/_pages/user_guide/examples/examples_force_holding_force.md b/docs/_pages/user_guide/examples/examples_force_holding_force.md index d755e1d07..293ea4004 100644 --- a/docs/_pages/user_guide/examples/examples_force_holding_force.md +++ b/docs/_pages/user_guide/examples/examples_force_holding_force.md @@ -2,9 +2,13 @@ # Magnetic Holding Force -The examples here require installaion of the [magpylib-force package](https://pypi.org/project/magpylib-force/). See also the [magpylib-force documentation](docs-magpylib-force). +The examples here require installaion of the +[magpylib-force package](https://pypi.org/project/magpylib-force/). See also the +[magpylib-force documentation](docs-magpylib-force). -With Magpylib-force it is possible to compute the holding force of a magnet attached magnetically to a soft-ferromagnetic plate. The "pull-force" is the opposing force that is required to detach the magnet from the surface. +With Magpylib-force it is possible to compute the holding force of a magnet +attached magnetically to a soft-ferromagnetic plate. The "pull-force" is the +opposing force that is required to detach the magnet from the surface. ```{figure} ../../../_static/images/examples_force_holding_force.png :width: 40% @@ -14,9 +18,15 @@ With Magpylib-force it is possible to compute the holding force of a magnet atta Sketch of holding force F that must be overcome to detach the magnet from a soft-magnetic plate. ``` -For this we make use of the "magnetic mirror" effect, which is quite similar to the well-known electrostatic "mirror-charge" model. The magnetic field of a magnetic dipole moment that lies in front of a highly permeable surface is similar to the field of two dipole moments: the original one and one that is mirrored across the surface such that each "magnetic charge" that makes up the dipole moment is mirrored in both position and charge. +For this we make use of the "magnetic mirror" effect, which is quite similar to +the well-known electrostatic "mirror-charge" model. The magnetic field of a +magnetic dipole moment that lies in front of a highly permeable surface is +similar to the field of two dipole moments: the original one and one that is +mirrored across the surface such that each "magnetic charge" that makes up the +dipole moment is mirrored in both position and charge. -The following example computes the holding force of a Cuboid magnet using the magnetic mirror effect. +The following example computes the holding force of a Cuboid magnet using the +magnetic mirror effect. ```{code-block} python import magpylib as magpy @@ -37,4 +47,10 @@ print(f"Holding Force: {round(F[2]*100)} g") # Holding Force: 349 g ``` -Magnet dimensions and material from this example are taken from the [web](https://www.supermagnete.at/quadermagnete-neodym/quadermagnet-5mm-2.5mm-1.5mm_Q-05-2.5-1.5-HN). The remanence of N45 material lies within 1.32 and 1.36 T which corresponds to the polarization, see also the ["Modeling a real magnet"](examples-tutorial-modeling-magnets) tutorial. The computation confirms what is stated on the web-page, that the holding force of this magnet is about 350 g. +Magnet dimensions and material from this example are taken from the +[web](https://www.supermagnete.at/quadermagnete-neodym/quadermagnet-5mm-2.5mm-1.5mm_Q-05-2.5-1.5-HN). +The remanence of N45 material lies within 1.32 and 1.36 T which corresponds to +the polarization, see also the +["Modeling a real magnet"](examples-tutorial-modeling-magnets) tutorial. The +computation confirms what is stated on the web-page, that the holding force of +this magnet is about 350 g. diff --git a/docs/_pages/user_guide/examples/examples_index.md b/docs/_pages/user_guide/examples/examples_index.md index 7c4135d06..579645fd0 100644 --- a/docs/_pages/user_guide/examples/examples_index.md +++ b/docs/_pages/user_guide/examples/examples_index.md @@ -1,254 +1,147 @@ (examples)= + # Examples ## Tutorials -::::{grid} 2 3 4 4 -:gutter: 4 - -:::{grid-item-card} {ref}`examples-tutorial-paths` -:text-align: center -:link: examples-tutorial-paths -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_tutorial_paths.png -::: - -:::{grid-item-card} {ref}`examples-tutorial-field-computation` -:text-align: center -:link: examples-tutorial-field-computation -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_tutorial_field_computation.png -::: - -:::{grid-item-card} {ref}`examples-tutorial-collection` -:text-align: center -:link: examples-tutorial-collection -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_tutorial_collection.png -::: - -:::{grid-item-card} {ref}`examples-tutorial-custom` -:text-align: center -:link: examples-tutorial-custom -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_tutorial_custom.png -::: - -:::{grid-item-card} {ref}`examples-tutorial-modeling-magnets` -:text-align: center -:link: examples-tutorial-modeling-magnets -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_tutorial_modeling_magnets.png -::: +::::{grid} 2 3 4 4 :gutter: 4 -:::: +:::{grid-item-card} {ref}`examples-tutorial-paths` :text-align: center :link: +examples-tutorial-paths :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_tutorial_paths.png ::: + +:::{grid-item-card} {ref}`examples-tutorial-field-computation` :text-align: +center :link: examples-tutorial-field-computation :link-type: ref :link-alt: +link to example :img-bottom: +../../../\_static/images/examples_icon_tutorial_field_computation.png ::: + +:::{grid-item-card} {ref}`examples-tutorial-collection` :text-align: center +:link: examples-tutorial-collection :link-type: ref :link-alt: link to example +:img-bottom: ../../../\_static/images/examples_icon_tutorial_collection.png ::: +:::{grid-item-card} {ref}`examples-tutorial-custom` :text-align: center :link: +examples-tutorial-custom :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_tutorial_custom.png ::: + +:::{grid-item-card} {ref}`examples-tutorial-modeling-magnets` :text-align: +center :link: examples-tutorial-modeling-magnets :link-type: ref :link-alt: link +to example :img-bottom: +../../../\_static/images/examples_icon_tutorial_modeling_magnets.png ::: + +:::: ## Visualizations -::::{grid} 2 3 4 4 -:gutter: 4 - -:::{grid-item-card} {ref}`examples-vis-magnet-colors` -:text-align: center -:link: examples-vis-magnet-colors -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_vis_magnet_colors.png -::: - -:::{grid-item-card} {ref}`examples-vis-animations` -:text-align: center -:link: examples-vis-animations -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_vis_animations.png -::: - -:::{grid-item-card} {ref}`examples-vis-subplots` -:text-align: center -:link: examples-vis-subplots -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_vis_subplots.png -::: - -:::{grid-item-card} {ref}`examples-vis-mpl-streamplot` -:text-align: center -:link: examples-vis-mpl-streamplot -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_vis_mpl_streamplot.png -::: - -:::{grid-item-card} {ref}`examples-vis-pv-streamlines` -:text-align: center -:link: examples-vis-pv-streamlines -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_vis_pv_streamlines.png -::: +::::{grid} 2 3 4 4 :gutter: 4 + +:::{grid-item-card} {ref}`examples-vis-magnet-colors` :text-align: center :link: +examples-vis-magnet-colors :link-type: ref :link-alt: link to example +:img-bottom: ../../../\_static/images/examples_icon_vis_magnet_colors.png ::: +:::{grid-item-card} {ref}`examples-vis-animations` :text-align: center :link: +examples-vis-animations :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_vis_animations.png ::: +:::{grid-item-card} {ref}`examples-vis-subplots` :text-align: center :link: +examples-vis-subplots :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_vis_subplots.png ::: + +:::{grid-item-card} {ref}`examples-vis-mpl-streamplot` :text-align: center +:link: examples-vis-mpl-streamplot :link-type: ref :link-alt: link to example +:img-bottom: ../../../\_static/images/examples_icon_vis_mpl_streamplot.png ::: + +:::{grid-item-card} {ref}`examples-vis-pv-streamlines` :text-align: center +:link: examples-vis-pv-streamlines :link-type: ref :link-alt: link to example +:img-bottom: ../../../\_static/images/examples_icon_vis_pv_streamlines.png ::: :::: (examples-complex-magnet-shapes)= + ## Complex Magnet Shapes -::::{grid} 2 3 4 4 -:gutter: 4 - -:::{grid-item-card} {ref}`examples-shapes-superpos` -:text-align: center -:link: examples-shapes-superpos -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_shapes_superpos.png -::: - -:::{grid-item-card} {ref}`examples-shapes-convex-hull` -:text-align: center -:link: examples-shapes-convex-hull -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_shapes_convex_hull.png -::: - -:::{grid-item-card} {ref}`examples-shapes-triangle` -:text-align: center -:link: examples-shapes-triangle -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_shapes_triangle.png -::: - -:::{grid-item-card} {ref}`examples-shapes-pyvista` -:text-align: center -:link: examples-shapes-pyvista -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_shapes_pyvista.png -::: - -:::{grid-item-card} {ref}`examples-shapes-cad` -:text-align: center -:link: examples-shapes-cad -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_shapes_cad.png -::: +::::{grid} 2 3 4 4 :gutter: 4 -:::: +:::{grid-item-card} {ref}`examples-shapes-superpos` :text-align: center :link: +examples-shapes-superpos :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_shapes_superpos.png ::: +:::{grid-item-card} {ref}`examples-shapes-convex-hull` :text-align: center +:link: examples-shapes-convex-hull :link-type: ref :link-alt: link to example +:img-bottom: ../../../\_static/images/examples_icon_shapes_convex_hull.png ::: -## Miscellaneous +:::{grid-item-card} {ref}`examples-shapes-triangle` :text-align: center :link: +examples-shapes-triangle :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_shapes_triangle.png ::: + +:::{grid-item-card} {ref}`examples-shapes-pyvista` :text-align: center :link: +examples-shapes-pyvista :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_shapes_pyvista.png ::: -::::{grid} 2 3 4 4 -:gutter: 4 - -:::{grid-item-card} {ref}`examples-misc-compound` -:text-align: center -:link: examples-misc-compound -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_misc_compound.png -::: - -:::{grid-item-card} {ref}`examples-misc-field-interpolation` -:text-align: center -:link: examples-misc-field-interpolation -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_misc_field_interpolation.png -::: - -:::{grid-item-card} {ref}`examples-misc-inhom` -:text-align: center -:link: examples-misc-inhom -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_misc_inhom.png -::: +:::{grid-item-card} {ref}`examples-shapes-cad` :text-align: center :link: +examples-shapes-cad :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_shapes_cad.png ::: :::: +## Miscellaneous + +::::{grid} 2 3 4 4 :gutter: 4 + +:::{grid-item-card} {ref}`examples-misc-compound` :text-align: center :link: +examples-misc-compound :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_misc_compound.png ::: + +:::{grid-item-card} {ref}`examples-misc-field-interpolation` :text-align: center +:link: examples-misc-field-interpolation :link-type: ref :link-alt: link to +example :img-bottom: +../../../\_static/images/examples_icon_misc_field_interpolation.png ::: + +:::{grid-item-card} {ref}`examples-misc-inhom` :text-align: center :link: +examples-misc-inhom :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_misc_inhom.png ::: + +:::: ## Applications -::::{grid} 2 3 4 4 -:gutter: 4 - -:::{grid-item-card} {ref}`examples-app-end-of-shaft` -:text-align: center -:link: examples-app-end-of-shaft -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_app_end_of_shaft.png -::: - -:::{grid-item-card} {ref}`examples-app-halbach` -:text-align: center -:link: examples-app-halbach -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_app_halbach.png -::: - -:::{grid-item-card} {ref}`examples-app-helmholtz` -:text-align: center -:link: examples-app-helmholtz -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_app_helmholtz.png -::: - -:::{grid-item-card} {ref}`examples-app-scales` -:text-align: center -:link: examples-app-scales -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_WIP.png -::: +::::{grid} 2 3 4 4 :gutter: 4 + +:::{grid-item-card} {ref}`examples-app-end-of-shaft` :text-align: center :link: +examples-app-end-of-shaft :link-type: ref :link-alt: link to example +:img-bottom: ../../../\_static/images/examples_icon_app_end_of_shaft.png ::: + +:::{grid-item-card} {ref}`examples-app-halbach` :text-align: center :link: +examples-app-halbach :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_app_halbach.png ::: + +:::{grid-item-card} {ref}`examples-app-helmholtz` :text-align: center :link: +examples-app-helmholtz :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_app_helmholtz.png ::: + +:::{grid-item-card} {ref}`examples-app-scales` :text-align: center :link: +examples-app-scales :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_WIP.png ::: :::: ## Magpylib-Force -::::{grid} 2 3 4 4 -:gutter: 4 - -:::{grid-item-card} {ref}`examples-force-force` -:text-align: center -:link: examples-force-force -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_force_force.png -::: - -:::{grid-item-card} {ref}`examples-force-holding-force` -:text-align: center -:link: examples-force-holding-force -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_force_holding_force.png -::: - -:::{grid-item-card} {ref}`examples-force-floating` -:text-align: center -:link: examples-force-floating -:link-type: ref -:link-alt: link to example -:img-bottom: ../../../_static/images/examples_icon_force_floating.png -::: +::::{grid} 2 3 4 4 :gutter: 4 -:::: +:::{grid-item-card} {ref}`examples-force-force` :text-align: center :link: +examples-force-force :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_force_force.png ::: + +:::{grid-item-card} {ref}`examples-force-holding-force` :text-align: center +:link: examples-force-holding-force :link-type: ref :link-alt: link to example +:img-bottom: ../../../\_static/images/examples_icon_force_holding_force.png ::: +:::{grid-item-card} {ref}`examples-force-floating` :text-align: center :link: +examples-force-floating :link-type: ref :link-alt: link to example :img-bottom: +../../../\_static/images/examples_icon_force_floating.png ::: + +:::: ```{toctree} :maxdepth: 2 @@ -285,4 +178,3 @@ examples_force_force.md examples_force_holding_force.md examples_force_floating.md ``` - diff --git a/docs/_pages/user_guide/examples/examples_misc_compound.md b/docs/_pages/user_guide/examples/examples_misc_compound.md index 6f2616d6f..d2608e3e8 100644 --- a/docs/_pages/user_guide/examples/examples_misc_compound.md +++ b/docs/_pages/user_guide/examples/examples_misc_compound.md @@ -16,11 +16,19 @@ orphan: true # Compounds -The `Collection` class is a powerful tool for grouping and tracking object assemblies. However, it is often convenient to have assembly parameters themselves, like number of magnets, as variables. This is achieved by sub-classing `Collection`. We refer to such classes as "**Compounds**" and show how to seamlessly integrate them into Magpylib. +The `Collection` class is a powerful tool for grouping and tracking object +assemblies. However, it is often convenient to have assembly parameters +themselves, like number of magnets, as variables. This is achieved by +sub-classing `Collection`. We refer to such classes as "**Compounds**" and show +how to seamlessly integrate them into Magpylib. ## Subclassing collections -In the following example we design a compound class `MagnetRing` which represents a ring of cuboid magnets with the parameter `cubes` that should refer to the number of magnets on the ring. The ring will automatically adjust its size when `cubes` is modified, including an additionally added encompassing 3D model that may, for example, represent a mechanical magnet holder. +In the following example we design a compound class `MagnetRing` which +represents a ring of cuboid magnets with the parameter `cubes` that should refer +to the number of magnets on the ring. The ring will automatically adjust its +size when `cubes` is modified, including an additionally added encompassing 3D +model that may, for example, represent a mechanical magnet holder. ```{code-cell} ipython3 import magpylib as magpy @@ -87,7 +95,8 @@ class MagnetRing(magpy.Collection): return self ``` -This new `MagnetRing` class seamlessly integrates into Magpylib and makes use of the position and orientation interface, field computation and graphic display. +This new `MagnetRing` class seamlessly integrates into Magpylib and makes use of +the position and orientation interface, field computation and graphic display. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -124,9 +133,15 @@ magpy.show(ring, sensor, backend='plotly') ## Postponed trace construction -In the above example, the trace is constructed in `_update`, every time the parameter `cubes` is modified. This can lead to an unwanted computational overhead, especially as the construction is only necessary for graphical representation. +In the above example, the trace is constructed in `_update`, every time the +parameter `cubes` is modified. This can lead to an unwanted computational +overhead, especially as the construction is only necessary for graphical +representation. -To make our compounds ready for heavy computation, while retaining Magpylib graphic possibilities, it is possible to provide a trace which will only be constructed when `show` is called. The following modification of the above example demonstrates this: +To make our compounds ready for heavy computation, while retaining Magpylib +graphic possibilities, it is possible to provide a trace which will only be +constructed when `show` is called. The following modification of the above +example demonstrates this: ```{code-cell} ipython3 class MagnetRingAdv(magpy.Collection): @@ -191,7 +206,8 @@ class MagnetRingAdv(magpy.Collection): return trace ``` -We have removed the trace construction from the `_update` method, and instead provided `_custom_trace3d` as a callable. +We have removed the trace construction from the `_update` method, and instead +provided `_custom_trace3d` as a callable. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -203,4 +219,5 @@ ring1 = MagnetRingAdv() %time for _ in range(10): ring1.cubes=10 ``` -This example is not very impressive because the provided trace is not very heavy. +This example is not very impressive because the provided trace is not very +heavy. diff --git a/docs/_pages/user_guide/examples/examples_misc_field_interpolation.md b/docs/_pages/user_guide/examples/examples_misc_field_interpolation.md index 63a779352..976c88bd8 100644 --- a/docs/_pages/user_guide/examples/examples_misc_field_interpolation.md +++ b/docs/_pages/user_guide/examples/examples_misc_field_interpolation.md @@ -16,16 +16,21 @@ orphan: true # Field Interpolation -There are several reasons for working with field interpolations rather than computing the field on demand. +There are several reasons for working with field interpolations rather than +computing the field on demand. 1. Very large grids take a lot of time to compute, even with Magpylib. -2. The field might not be accessible through Magpylib, e.g. when demagnetization is included, but it can be computed with a 3rd party FE tool or is the result of an experiment. +2. The field might not be accessible through Magpylib, e.g. when demagnetization + is included, but it can be computed with a 3rd party FE tool or is the result + of an experiment. -Combining field interpolation and `CustomSource` enables integration of pre-computed solutions. In the following example we show how this can be done. +Combining field interpolation and `CustomSource` enables integration of +pre-computed solutions. In the following example we show how this can be done. ## Interpolation -We start by defining a 3D vector-field interpolation function relying on Scipy `RegularGridInterpolator`. +We start by defining a 3D vector-field interpolation function relying on Scipy +`RegularGridInterpolator`. ```{code-cell} ipython3 import numpy as np @@ -84,7 +89,11 @@ def interpolation(observer, data, method="linear", bounds_error=False, fill_valu ## CustomSource with Interpolation Field -In the second step we create a custom source with an interpolated field `field_func` input. The data for the interpolation is generated from the Magpylib `Cuboid` field, which makes it easy to verify the approach afterwards. To the custom source a nice 3D model is added that makes it possible to display it and the cuboid at the same time. +In the second step we create a custom source with an interpolated field +`field_func` input. The data for the interpolation is generated from the +Magpylib `Cuboid` field, which makes it easy to verify the approach afterwards. +To the custom source a nice 3D model is added that makes it possible to display +it and the cuboid at the same time. ```{code-cell} ipython3 # Create data for interpolation @@ -118,7 +127,10 @@ magpy.show(custom, cube, zoom=1, backend="matplotlib") ## Testing Interpolation Accuracy -Finally, we compare the "exact" field of the cuboid source with the interpolated field of the custom source. For this purpose, a sensor is added and a generic rotation is applied to the sources. Naturally there is some error that can be reduced by increasing the interpolation grid finesse. +Finally, we compare the "exact" field of the cuboid source with the interpolated +field of the custom source. For this purpose, a sensor is added and a generic +rotation is applied to the sources. Naturally there is some error that can be +reduced by increasing the interpolation grid finesse. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed diff --git a/docs/_pages/user_guide/examples/examples_misc_inhom.md b/docs/_pages/user_guide/examples/examples_misc_inhom.md index 4f12f9669..61718f0df 100644 --- a/docs/_pages/user_guide/examples/examples_misc_inhom.md +++ b/docs/_pages/user_guide/examples/examples_misc_inhom.md @@ -16,11 +16,24 @@ kernelspec: # Inhomogeneous Magnetization -The analytical expressions implemented in Magpylib treat only simple homogeneous polarizations. When dealing with high-grade materials that are magnetized in homogeneous fields this is a good approximation. However, there are many cases where such a homogeneous model is not justified. The tutorial {ref}`examples-tutorial-modeling-magnets` and the user-guide {ref}`guide-physics-demag` provide some insights on this topic. - -Here we show how to deal with inhomogeneous polarization based on a commonly misunderstood example of a cylindrical quadrupol magnet. While graphical representations of such magnets usually depict only four poles, see {ref}`examples-vis-magnet-colors`, such magnets exhibit complex polarization given by the magnetization device that is used to magnetize them. - -The following code shows how the field of such a magnetization device would look like and what magnetization field it produces. To relize a Cylindrical Quadrupole magnert there are four coils with ferromagnetic cores involved, arranged in circle around the magnet. In the example, coils and cores are modeled by Cuboid magnets. +The analytical expressions implemented in Magpylib treat only simple homogeneous +polarizations. When dealing with high-grade materials that are magnetized in +homogeneous fields this is a good approximation. However, there are many cases +where such a homogeneous model is not justified. The tutorial +{ref}`examples-tutorial-modeling-magnets` and the user-guide +{ref}`guide-physics-demag` provide some insights on this topic. + +Here we show how to deal with inhomogeneous polarization based on a commonly +misunderstood example of a cylindrical quadrupol magnet. While graphical +representations of such magnets usually depict only four poles, see +{ref}`examples-vis-magnet-colors`, such magnets exhibit complex polarization +given by the magnetization device that is used to magnetize them. + +The following code shows how the field of such a magnetization device would look +like and what magnetization field it produces. To relize a Cylindrical +Quadrupole magnert there are four coils with ferromagnetic cores involved, +arranged in circle around the magnet. In the example, coils and cores are +modeled by Cuboid magnets. ```{note} While Magpylib uses SI units by default, in this example we make use of [scaling invariance](guide-docs-io-scale-invariance) and consider arbitrary input length units. For this example millimeters are sensible. @@ -89,7 +102,16 @@ plt.tight_layout() plt.show() ``` -It can be assumed that the polarization that is written into the unmagnetized Cylinder will, in a lowest order approximation, follow the magnetic field generated by the magnetization tool. To create a Cylinder magnet with such a polarization pattern we apply the [superposition principle](examples-shapes-superpos) and approximate the inhomogneous polarization as the sum of multiple small homogeneous cells using the `CylinderSegment` class. Splitting up the Cylinder into many cells is easily done by hand, but for practicality we make use of the [magpylib-material-response](https://pypi.org/project/magpylib-material-response/) package which provides an excellent function for this purpose. +It can be assumed that the polarization that is written into the unmagnetized +Cylinder will, in a lowest order approximation, follow the magnetic field +generated by the magnetization tool. To create a Cylinder magnet with such a +polarization pattern we apply the +[superposition principle](examples-shapes-superpos) and approximate the +inhomogneous polarization as the sum of multiple small homogeneous cells using +the `CylinderSegment` class. Splitting up the Cylinder into many cells is easily +done by hand, but for practicality we make use of the +[magpylib-material-response](https://pypi.org/project/magpylib-material-response/) +package which provides an excellent function for this purpose. ```{code-cell} ipython # Continuation from above - ensure previous code is executed @@ -136,6 +158,13 @@ plt.tight_layout() plt.show() ``` -The color on the right-hand-side corresponds to the angle of orientation of the material polarization. Increasing the mesh finesse will improve the approximation but slow down any field computation at the same time. +The color on the right-hand-side corresponds to the angle of orientation of the +material polarization. Increasing the mesh finesse will improve the +approximation but slow down any field computation at the same time. -**What is the purpose of this example ?** In addition to demonstrating how inhomogeneous polarizations can be modeled, this example should raise awareness that many magnets can look simple on a data sheet (color pattern) but may have an inhomogeneous, complex, unknown polarization distribution. It goes without saying that the magnetic field generated by such a magnet, for example in an angle sensing application, will depend strongly on the polarization. +**What is the purpose of this example ?** In addition to demonstrating how +inhomogeneous polarizations can be modeled, this example should raise awareness +that many magnets can look simple on a data sheet (color pattern) but may have +an inhomogeneous, complex, unknown polarization distribution. It goes without +saying that the magnetic field generated by such a magnet, for example in an +angle sensing application, will depend strongly on the polarization. diff --git a/docs/_pages/user_guide/examples/examples_shapes_cad.md b/docs/_pages/user_guide/examples/examples_shapes_cad.md index 41615f458..b865db9f9 100644 --- a/docs/_pages/user_guide/examples/examples_shapes_cad.md +++ b/docs/_pages/user_guide/examples/examples_shapes_cad.md @@ -16,7 +16,10 @@ kernelspec: # Magnets from CAD -The easiest way to create complex magnet shapes from CAD files is through Pyvista using the [TriangularMesh class](docu-magpylib-api-trimesh). Pyvista supports *.stl files, and any open CAD file format is easily transformed to stl. +The easiest way to create complex magnet shapes from CAD files is through +Pyvista using the [TriangularMesh class](docu-magpylib-api-trimesh). Pyvista +supports \*.stl files, and any open CAD file format is easily transformed to +stl. ```{warning} CAD files might include many Triangles, especially when dealing with round sides and edges, that do not significantly contribute to the field and will slow down the Magpylib computation. diff --git a/docs/_pages/user_guide/examples/examples_shapes_convex_hull.md b/docs/_pages/user_guide/examples/examples_shapes_convex_hull.md index 69f493834..b706a57f4 100644 --- a/docs/_pages/user_guide/examples/examples_shapes_convex_hull.md +++ b/docs/_pages/user_guide/examples/examples_shapes_convex_hull.md @@ -16,9 +16,14 @@ orphan: true # Convex Hull -In geometry the convex hull of a point cloud is the smallest convex shape that contains all points, see [Wikipedia](https://en.wikipedia.org/wiki/Convex_hull). - -Magpylib offers construction of convex hull magnets by combining the `magpylib.magnets.TriangularMesh` and the [scipy.spatial.ConvexHull](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.ConvexHull.html) classes via the class method `from_ConvexHull`. Note, that the Scipy method does not guarantee correct face orientations if `reorient_faces` is disabled. +In geometry the convex hull of a point cloud is the smallest convex shape that +contains all points, see [Wikipedia](https://en.wikipedia.org/wiki/Convex_hull). + +Magpylib offers construction of convex hull magnets by combining the +`magpylib.magnets.TriangularMesh` and the +[scipy.spatial.ConvexHull](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.ConvexHull.html) +classes via the class method `from_ConvexHull`. Note, that the Scipy method does +not guarantee correct face orientations if `reorient_faces` is disabled. ## Pyramid magnet diff --git a/docs/_pages/user_guide/examples/examples_shapes_pyvista.md b/docs/_pages/user_guide/examples/examples_shapes_pyvista.md index d4bf7763d..e29b69f21 100644 --- a/docs/_pages/user_guide/examples/examples_shapes_pyvista.md +++ b/docs/_pages/user_guide/examples/examples_shapes_pyvista.md @@ -16,7 +16,10 @@ orphan: true # Pyvista Bodies -[Pyvista](https://docs.pyvista.org/version/stable/) is a powerful open-source tool for the creation and visualization of meshes. Pyvista `PolyData` objects can be directly transformed into Magpylib `TriangularMesh` magnets via the classmethod `from_pyvista`. +[Pyvista](https://docs.pyvista.org/version/stable/) is a powerful open-source +tool for the creation and visualization of meshes. Pyvista `PolyData` objects +can be directly transformed into Magpylib `TriangularMesh` magnets via the +classmethod `from_pyvista`. ```{note} The Pyvista library used in the following examples is not automatically installed with Magpylib. A Pyvista installation guide is found [here](https://docs.pyvista.org/getting-started/installation.html). @@ -50,7 +53,10 @@ with magpy.show_context(dodec, sens, backend='plotly') as s: ## Boolean operations with Pyvista -With Pyvista it is possible to build complex shapes with boolean geometric operations. However, such operations often result in open and disconnected meshes that require some refinement to produce solid magnets. The following example demonstrates the problem, how to analyze and fix it. +With Pyvista it is possible to build complex shapes with boolean geometric +operations. However, such operations often result in open and disconnected +meshes that require some refinement to produce solid magnets. The following +example demonstrates the problem, how to analyze and fix it. ```{code-cell} ipython3 import pyvista as pv @@ -83,10 +89,13 @@ magnet.show( ) ``` -The result cannot be used for magnetic field computation. Even if all faces were present, the reorient-faces algorithm would fail when these faces are disconnected. Such problems can be fixed by +The result cannot be used for magnetic field computation. Even if all faces were +present, the reorient-faces algorithm would fail when these faces are +disconnected. Such problems can be fixed by 1. giving Pyvista a finer mesh to work with from the start -2. Pyvista mesh cleaning (merge duplicate points, remove unused points, remove degenerate faces) +2. Pyvista mesh cleaning (merge duplicate points, remove unused points, remove + degenerate faces) The following code produces a clean magnet. diff --git a/docs/_pages/user_guide/examples/examples_shapes_superpos.md b/docs/_pages/user_guide/examples/examples_shapes_superpos.md index 287d88df4..62428c3a4 100644 --- a/docs/_pages/user_guide/examples/examples_shapes_superpos.md +++ b/docs/_pages/user_guide/examples/examples_shapes_superpos.md @@ -16,30 +16,36 @@ orphan: true # Superposition -The [superposition principle](https://en.wikipedia.org/wiki/Superposition_principle) states that the net response caused by two or more stimuli is the sum of the responses caused by each stimulus individually. This principle holds in magnetostatics when there is no material response, and simply states that the total field created by multiple magnets and currents is the sum of the individual fields. - -When two magnets overlap geometrically, the magnetization in the overlap region is given by the vector sum of the two individual magnetizations. This enables two geometric operations, - -:::::{grid} 1 2 2 2 -:gutter: 4 - -::::{grid-item-card} Union -:img-bottom: ../../../_static/images/docu_field_superpos_union.png -:shadow: None -Build complex forms by aligning base shapes (no overlap) with each other with similar magnetization vector. -:::: - -::::{grid-item-card} Cut-Out -:img-bottom: ../../../_static/images/docu_field_superpos_cutout.png -:shadow: None -When two objects with opposing magnetization vectors of similar amplitude overlap, they will just cancel in the overlap region. This enables geometric cut-out operations. -:::: -::::: - +The +[superposition principle](https://en.wikipedia.org/wiki/Superposition_principle) +states that the net response caused by two or more stimuli is the sum of the +responses caused by each stimulus individually. This principle holds in +magnetostatics when there is no material response, and simply states that the +total field created by multiple magnets and currents is the sum of the +individual fields. + +When two magnets overlap geometrically, the magnetization in the overlap region +is given by the vector sum of the two individual magnetizations. This enables +two geometric operations, + +:::::{grid} 1 2 2 2 :gutter: 4 + +::::{grid-item-card} Union :img-bottom: +../../../\_static/images/docu_field_superpos_union.png :shadow: None Build +complex forms by aligning base shapes (no overlap) with each other with similar +magnetization vector. :::: + +::::{grid-item-card} Cut-Out :img-bottom: +../../../\_static/images/docu_field_superpos_cutout.png :shadow: None When two +objects with opposing magnetization vectors of similar amplitude overlap, they +will just cancel in the overlap region. This enables geometric cut-out +operations. :::: ::::: ## Union operation -Geometric union by superposition is demonstrated in the following example where a wedge-shaped magnet with a round back is constructed from three base-forms: a CylinderSegment, a Cuboid and a TriangularMesh. +Geometric union by superposition is demonstrated in the following example where +a wedge-shaped magnet with a round back is constructed from three base-forms: a +CylinderSegment, a Cuboid and a TriangularMesh. ```{code-cell} ipython3 import numpy as np @@ -76,9 +82,14 @@ with magpy.show_context(magnet, sensor, backend="plotly", style_legend_show=Fals ## Cut-out operation -When two objects with opposing magnetization vectors of similar amplitude overlap, they will just cancel in the overlap region. This enables geometric cut-out operations. In the following example we construct an exact hollow cylinder solution from two concentric cylinder shapes with opposite magnetizations and compare the result to the `CylinderSegment` class solution. +When two objects with opposing magnetization vectors of similar amplitude +overlap, they will just cancel in the overlap region. This enables geometric +cut-out operations. In the following example we construct an exact hollow +cylinder solution from two concentric cylinder shapes with opposite +magnetizations and compare the result to the `CylinderSegment` class solution. -Here the `getM` and `getJ` functions come in handy. They allow us to see the magnetization distribution that is the result of the superposition. +Here the `getM` and `getJ` functions come in handy. They allow us to see the +magnetization distribution that is the result of the superposition. ```{code-cell} ipython3 import numpy as np @@ -128,9 +139,11 @@ plt.tight_layout() plt.show() ``` -The two figures show that the magnetization is zero outside of the cylinder, as well as in the overlap region where the two magnetizations cancel. +The two figures show that the magnetization is zero outside of the cylinder, as +well as in the overlap region where the two magnetizations cancel. -Finally, we want to show that the superposition gives the same result as a computation from the CylinderSegment solution. +Finally, we want to show that the superposition gives the same result as a +computation from the CylinderSegment solution. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -145,13 +158,20 @@ print("CylinderSegment result:", ring1.getB((.01, .02, .03))) print(" Cut-out result:", ring0.getB((.01, .02, .03))) ``` -Note that it is faster to compute the `Cylinder` field two times than computing the `CylinderSegment` field one time. This is why Magpylib automatically falls back to the `Cylinder` solution whenever `CylinderSegment` is called with 360 deg section angles. +Note that it is faster to compute the `Cylinder` field two times than computing +the `CylinderSegment` field one time. This is why Magpylib automatically falls +back to the `Cylinder` solution whenever `CylinderSegment` is called with 360 +deg section angles. -Unfortunately, with respect to 3D-models, cut-out operations cannot be displayed graphically at this point in time, but {ref}`examples-own-3d-models` offer custom solutions. +Unfortunately, with respect to 3D-models, cut-out operations cannot be displayed +graphically at this point in time, but {ref}`examples-own-3d-models` offer +custom solutions. ## Nice example -The following example combines union and cut-out to create a complex magnet shape which is then displayed by combining a streamplot with a contourplot in matplotlib. +The following example combines union and cut-out to create a complex magnet +shape which is then displayed by combining a streamplot with a contourplot in +matplotlib. ```{code-cell} ipython3 import numpy as np @@ -192,4 +212,4 @@ ax.set( ) plt.tight_layout() plt.show() -``` \ No newline at end of file +``` diff --git a/docs/_pages/user_guide/examples/examples_shapes_triangle.md b/docs/_pages/user_guide/examples/examples_shapes_triangle.md index bb2a211b8..ec7514d80 100644 --- a/docs/_pages/user_guide/examples/examples_shapes_triangle.md +++ b/docs/_pages/user_guide/examples/examples_shapes_triangle.md @@ -16,18 +16,27 @@ orphan: true # Triangular Meshes -The magnetic field of a homogeneously magnetized body is equivalent to the field of a charged surface. The surface is the hull of the body, and the charge density is proportional to the projection of the magnetization vector onto the surface normal. - -It is very common to approximate the surface of bodies by triangular meshes, which can then be transformed into magnets using the `Triangle` and the `TriangularMesh` classes. When using these classes one should abide by the following rules: - -1. The surface must be closed, or all missing faces must have zero charge (magnetization vector perpendicular to surface normal). +The magnetic field of a homogeneously magnetized body is equivalent to the field +of a charged surface. The surface is the hull of the body, and the charge +density is proportional to the projection of the magnetization vector onto the +surface normal. + +It is very common to approximate the surface of bodies by triangular meshes, +which can then be transformed into magnets using the `Triangle` and the +`TriangularMesh` classes. When using these classes one should abide by the +following rules: + +1. The surface must be closed, or all missing faces must have zero charge + (magnetization vector perpendicular to surface normal). 2. All triangles are oriented outwards (right-hand-rule) 3. The surface must not be self-intersecting. -4. For the B-field magnetic polarization must be added on the inside of the body. +4. For the B-field magnetic polarization must be added on the inside of the + body. ## Cuboctahedron Magnet -In this example `Triangle` is used to create a magnet with cuboctahedral shape. Notice that triangle orientation is displayed by default for convenience. +In this example `Triangle` is used to create a magnet with cuboctahedral shape. +Notice that triangle orientation is displayed by default for convenience. ```{code-cell} ipython3 import magpylib as magpy @@ -77,9 +86,15 @@ magpy.show( ## Triangular Prism Magnet -Consider a prism with triangular base that is magnetized orthogonal to the base. All surface normals of the sides of the prism are orthogonal to the magnetization vector. As a result, the sides do not contribute to the magnetic field because their charge density disappears. Only the top and bottom surfaces contribute. One must be very careful when defining those surfaces in such a way that the surface normals point outwards. +Consider a prism with triangular base that is magnetized orthogonal to the base. +All surface normals of the sides of the prism are orthogonal to the +magnetization vector. As a result, the sides do not contribute to the magnetic +field because their charge density disappears. Only the top and bottom surfaces +contribute. One must be very careful when defining those surfaces in such a way +that the surface normals point outwards. -Leaving out parts of the surface that do not contribute to the field is beneficial for computation speed. +Leaving out parts of the surface that do not contribute to the field is +beneficial for computation speed. ```{code-cell} ipython3 import magpylib as magpy @@ -103,13 +118,18 @@ magpy.show(*prism, backend="plotly", style_opacity=0.5, style_magnetization_show ## TriangularMesh class -While `Triangle` simply provides the field of a charged triangle and can be used to construct complex forms, it is prone to error and tedious to work with when meshes become large. For this purpose, the `TriangularMesh` class ensures proper and convenient magnet creation by automatically checking mesh integrity and by orienting the faces at initialization. +While `Triangle` simply provides the field of a charged triangle and can be used +to construct complex forms, it is prone to error and tedious to work with when +meshes become large. For this purpose, the `TriangularMesh` class ensures proper +and convenient magnet creation by automatically checking mesh integrity and by +orienting the faces at initialization. ```{attention} Automatic face reorientation of `TriangularMesh` may fail when the mesh is open. ``` -In this example we revisit the cuboctahedron but generate it through the `TriangularMesh` class. +In this example we revisit the cuboctahedron but generate it through the +`TriangularMesh` class. ```{code-cell} ipython3 import magpylib as magpy @@ -138,7 +158,10 @@ magpy.show( ) ``` -The `TriangularMesh` class is extremely powerful as it enables almost arbitrary magnet shapes. It is described in detail in {ref}`docu-magpylib-api-trimesh`. There are many ways to generate such triangular meshes. An example thereof is shown in {ref}`examples-shapes-pyvista`. +The `TriangularMesh` class is extremely powerful as it enables almost arbitrary +magnet shapes. It is described in detail in {ref}`docu-magpylib-api-trimesh`. +There are many ways to generate such triangular meshes. An example thereof is +shown in {ref}`examples-shapes-pyvista`. ```{caution} * `getB` and `getH` compute the fields correctly only if the mesh is closed, not self-intersecting, and all faces are properly oriented outwards. @@ -152,7 +175,13 @@ The `TriangularMesh` class is extremely powerful as it enables almost arbitrary ## Open TriangularMesh -In some cases, it may be desirable to generate a `TriangularMesh` object from an open mesh (see Prism example above). In this case one must be extremely careful because one cannot rely on the checks. Not to generate warnings or error messages, these checks can be disabled with `"skip"` or their outcome can be ignored with `"ignore"`. The `show` function can be used to view open edges and disconnected parts. In the following example we generate such an open mesh directly from `Triangle` objects. +In some cases, it may be desirable to generate a `TriangularMesh` object from an +open mesh (see Prism example above). In this case one must be extremely careful +because one cannot rely on the checks. Not to generate warnings or error +messages, these checks can be disabled with `"skip"` or their outcome can be +ignored with `"ignore"`. The `show` function can be used to view open edges and +disconnected parts. In the following example we generate such an open mesh +directly from `Triangle` objects. ```{code-cell} ipython3 import magpylib as magpy diff --git a/docs/_pages/user_guide/examples/examples_tutorial_collection.md b/docs/_pages/user_guide/examples/examples_tutorial_collection.md index ac1a81d3b..5246445ea 100644 --- a/docs/_pages/user_guide/examples/examples_tutorial_collection.md +++ b/docs/_pages/user_guide/examples/examples_tutorial_collection.md @@ -16,16 +16,28 @@ orphan: true # Working with Collections -The top-level class `Collection` allows users to group objects by reference for common manipulation. The following concepts apply to Magpylib Collections: - -1. A collection spans its own local frame of reference with position and orientation, to which the children are added. Thus, any operation applied to the collection is individually applied to all its children. -2. The collection itself behaves like a single Magpylib object (can be source and/or observer). -3. All children inside the collection can be individually addressed and manipulated, which will automatically manipulate their state inside the parent collection. -4. Collections have their own `style` attributes, their paths are displayed in `show`, and all children are automatically assigned their parent color. +The top-level class `Collection` allows users to group objects by reference for +common manipulation. The following concepts apply to Magpylib Collections: + +1. A collection spans its own local frame of reference with position and + orientation, to which the children are added. Thus, any operation applied to + the collection is individually applied to all its children. +2. The collection itself behaves like a single Magpylib object (can be source + and/or observer). +3. All children inside the collection can be individually addressed and + manipulated, which will automatically manipulate their state inside the + parent collection. +4. Collections have their own `style` attributes, their paths are displayed in + `show`, and all children are automatically assigned their parent color. ## Constructing Collections -Collections have the attributes `children`, `sources`, `sensors` and `collections`. These attributes are ordered lists that contain objects that are added to the collection by reference (not copied). `children` returns a list of all objects in the collection. `sources` returns a list of the sources, `sensors` a list of the sensors and `collections` a list of "sub-collections" within the collection. +Collections have the attributes `children`, `sources`, `sensors` and +`collections`. These attributes are ordered lists that contain objects that are +added to the collection by reference (not copied). `children` returns a list of +all objects in the collection. `sources` returns a list of the sources, +`sensors` a list of the sensors and `collections` a list of "sub-collections" +within the collection. ```{code-cell} ipython3 import magpylib as magpy @@ -42,7 +54,8 @@ print(f"sensors: {coll.sensors}") print(f"collections: {coll.collections}") ``` -New additions are always added at the end. Use the **`add`** method or the parameters. +New additions are always added at the end. Use the **`add`** method or the +parameters. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -64,7 +77,9 @@ print(f"sensors: {coll.sensors}") print(f"collections: {coll.collections}") ``` -The **`describe`** method is a very convenient way to view a Collection structure, especially when the collection is nested, i.e., when containing other collections. +The **`describe`** method is a very convenient way to view a Collection +structure, especially when the collection is nested, i.e., when containing other +collections. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -76,9 +91,11 @@ c2.add(s2.copy()) coll.describe(format="label+type") ``` -The parameter `format` can be any combination of `"type"`, `"label"`, `"id"` and `"properties"`. +The parameter `format` can be any combination of `"type"`, `"label"`, `"id"` and +`"properties"`. -For convenience, any two Magpylib objects can be added up with `+` to form a collection. +For convenience, any two Magpylib objects can be added up with `+` to form a +collection. ```{code-cell} ipython3 import magpylib as magpy @@ -93,7 +110,9 @@ coll.describe(format="label") ## Child-Parent Relations -Objects that are part of a collection become children of that collection, and the collection itself becomes their parent. Every Magpylib object has the `parent` attribute, which is `None` by default. +Objects that are part of a collection become children of that collection, and +the collection itself becomes their parent. Every Magpylib object has the +`parent` attribute, which is `None` by default. ```{code-cell} ipython3 import magpylib as magpy @@ -106,7 +125,10 @@ print(f"c1.parent: {c1.parent}") print(f"c1.children: {c1.children}") ``` -Rather than adding objects to a collection, as described above, one can also set the `parent` parameter. A Magpylib object can only have a single parent, i.e., it can only be part of a single collection. As a result, changing the parent will automatically remove the object from its previous collection. +Rather than adding objects to a collection, as described above, one can also set +the `parent` parameter. A Magpylib object can only have a single parent, i.e., +it can only be part of a single collection. As a result, changing the parent +will automatically remove the object from its previous collection. ```{code-cell} ipython3 import magpylib as magpy @@ -129,7 +151,8 @@ c2.describe(format="label") ## Accessing Children -Collections have `__getitem__` through the attribute `children` defined which enables using collections directly as iterators, +Collections have `__getitem__` through the attribute `children` defined which +enables using collections directly as iterators, ```{code-cell} ipython3 import magpylib as magpy @@ -151,7 +174,10 @@ and makes it possible to directly reference to a child object by index: print(coll[0]) ``` -Collection nesting is powerful to create a self-consistent hierarchical structure, however, it is often in the way of quick child access in nested trees. For this, the `children_all`, `sources_all`, `sensors_all` and `collections_all` read-only parameters, return all objects in the tree: +Collection nesting is powerful to create a self-consistent hierarchical +structure, however, it is often in the way of quick child access in nested +trees. For this, the `children_all`, `sources_all`, `sensors_all` and +`collections_all` read-only parameters, return all objects in the tree: ```{code-cell} ipython3 import magpylib as magpy @@ -170,7 +196,8 @@ print([s.style.label for s in coll.sensors_all]) ## Practical Example -The following example demonstrates how collections enable user-friendly manipulation of groups, sub-groups, and individual objects. +The following example demonstrates how collections enable user-friendly +manipulation of groups, sub-groups, and individual objects. ```{code-cell} ipython3 import numpy as np @@ -203,7 +230,10 @@ for coil in [coil1, coil2]: magpy.show(*helmholtz, animation=True, style_path_show=False) ``` -For magnetic field computation, a collection with source children behaves like a single source object, and a collection with sensor children behaves like a flat list of its sensors when provided as `sources` and `observers` input respectively. +For magnetic field computation, a collection with source children behaves like a +single source object, and a collection with sensor children behaves like a flat +list of its sensors when provided as `sources` and `observers` input +respectively. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -226,7 +256,11 @@ plt.show() ## Efficient 3D Models -The graphical backend libraries were not designed for complex 3D graphic output. As a result, it often becomes inconvenient and slow when attempting to display many 3D objects. One solution to this problem when dealing with large collections is to represent the latter by a single encompassing body, and to deactivate the individual 3D models of all children. +The graphical backend libraries were not designed for complex 3D graphic output. +As a result, it often becomes inconvenient and slow when attempting to display +many 3D objects. One solution to this problem when dealing with large +collections is to represent the latter by a single encompassing body, and to +deactivate the individual 3D models of all children. ```{code-cell} ipython3 import magpylib as magpy @@ -260,4 +294,6 @@ coll.show() ## Compound Objects -Collections can be subclassed to form dynamic groups that seamlessly integrate into Magpylib. Such classes are referred to as **compounds**. An example of how this is done is shown in {ref}`examples-misc-compound`. +Collections can be subclassed to form dynamic groups that seamlessly integrate +into Magpylib. Such classes are referred to as **compounds**. An example of how +this is done is shown in {ref}`examples-misc-compound`. diff --git a/docs/_pages/user_guide/examples/examples_tutorial_custom.md b/docs/_pages/user_guide/examples/examples_tutorial_custom.md index ea9983b84..b2a63bbaf 100644 --- a/docs/_pages/user_guide/examples/examples_tutorial_custom.md +++ b/docs/_pages/user_guide/examples/examples_tutorial_custom.md @@ -16,7 +16,9 @@ orphan: true # CustomSource -The {ref}`guide-docs-classes-custom-source` class was implemented to offer easy integration of user field implementations into Magpylib's object-oriented interface. +The {ref}`guide-docs-classes-custom-source` class was implemented to offer easy +integration of user field implementations into Magpylib's object-oriented +interface. ```{note} Obviously, any field implementation can be integrated. Specifically, fields where superposition holds and interactions do not disturb the sources (e.g. electric, gravitational, ...) can benefit from Magpylib's position and orientation interface. @@ -24,15 +26,21 @@ Obviously, any field implementation can be integrated. Specifically, fields wher ## Magnetic Monopole -In this example we create a class that represents the elusive magnetic monopole, which would have a magnetic field like this +In this example we create a class that represents the elusive magnetic monopole, +which would have a magnetic field like this $$ {\bf B} = Q_m \frac{{\bf r}}{|{\bf r}|^3}. $$ -Here the monopole lies in the origin of the local coordinates, $Q_m$ is the monopole charge and ${\bf r}$ is the observer position. +Here the monopole lies in the origin of the local coordinates, $Q_m$ is the +monopole charge and ${\bf r}$ is the observer position. -We create this field as a Python function and hand it over to a CustomSource `field_func` argument. The `field_func` input must be a callable with two positional arguments `field` (can be `'B'` or `'H'`) and `observers` (must accept ndarrays of shape (n,3)), and return the respective fields in units of T and A/m in the same shape. +We create this field as a Python function and hand it over to a CustomSource +`field_func` argument. The `field_func` input must be a callable with two +positional arguments `field` (can be `'B'` or `'H'`) and `observers` (must +accept ndarrays of shape (n,3)), and return the respective fields in units of T +and A/m in the same shape. ```{code-cell} ipython3 import numpy as np @@ -71,7 +79,8 @@ print(mono.getB((1, 0, 0))) print(mono.getH((1, 0, 0))) ``` -Multiple of these sources can now be combined, making use of the Magpylib position/orientation interface. +Multiple of these sources can now be combined, making use of the Magpylib +position/orientation interface. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -104,7 +113,8 @@ plt.show() ## Adding a 3D model -While `CustomSource` is graphically represented by a simple marker by default, we can easily add a 3D model as described in {ref}`examples-own-3d-models`. +While `CustomSource` is graphically represented by a simple marker by default, +we can easily add a 3D model as described in {ref}`examples-own-3d-models`. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -127,7 +137,11 @@ magpy.show(mono1, mono2) ## Subclassing CustomSource -In the above example it would be nice to make the `CustomSource` dynamic, so that it would have a property `charge` that can be changed at will, rather than having to redefine the `field_func` and initialize a new object every time. In the following example we show how to sub-class `CustomSource` to achieve this. The problem is reminiscent of {ref}`examples-misc-compound`. +In the above example it would be nice to make the `CustomSource` dynamic, so +that it would have a property `charge` that can be changed at will, rather than +having to redefine the `field_func` and initialize a new object every time. In +the following example we show how to sub-class `CustomSource` to achieve this. +The problem is reminiscent of {ref}`examples-misc-compound`. ```{code-cell} ipython3 import numpy as np @@ -195,7 +209,8 @@ mono.charge = -1 print(mono.getB((1, 0, 0))) ``` -The new class seamlessly integrates into the Magpylib interface as we show in the following example where we have a look at the Quadrupole field. +The new class seamlessly integrates into the Magpylib interface as we show in +the following example where we have a look at the Quadrupole field. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed diff --git a/docs/_pages/user_guide/examples/examples_tutorial_field_computation.md b/docs/_pages/user_guide/examples/examples_tutorial_field_computation.md index 0e54212ee..0c2890f9d 100644 --- a/docs/_pages/user_guide/examples/examples_tutorial_field_computation.md +++ b/docs/_pages/user_guide/examples/examples_tutorial_field_computation.md @@ -18,7 +18,8 @@ orphan: true ## Most basic Example -The v2 slogan was *"The magnetic field is only three lines of code away"*, which is demonstrated by the following most fundamental and self-explanatory example, +The v2 slogan was _"The magnetic field is only three lines of code away"_, which +is demonstrated by the following most fundamental and self-explanatory example, ```{code-cell} ipython3 import magpylib as magpy @@ -30,9 +31,14 @@ print(B) ## Field on a Grid -There are four field computation functions: `getB` will compute the B-field in T. `getH` computes the H-field in A/m. `getJ` computes the magnetic polarization in units of T. `getM` computes the magnetization in units of A/m. +There are four field computation functions: `getB` will compute the B-field in +T. `getH` computes the H-field in A/m. `getJ` computes the magnetic polarization +in units of T. `getM` computes the magnetization in units of A/m. -All these functions will return the field in the shape of the input. In the following example, BHJM-fields of a diametrically magnetized cylinder magnet are computed on a position grid in the symmetry plane and are then displayed using Matplotlib. +All these functions will return the field in the shape of the input. In the +following example, BHJM-fields of a diametrically magnetized cylinder magnet are +computed on a position grid in the symmetry plane and are then displayed using +Matplotlib. ```{code-cell} ipython3 import matplotlib.pyplot as plt @@ -92,9 +98,14 @@ plt.show() ## Using Sensors -The `Sensor` class enables relative positioning of observer grids in the global coordinate system. The observer grid is stored in the `pixel` parameter of the sensor object which is `(0,0,0)` by default (sensor position = observer position). +The `Sensor` class enables relative positioning of observer grids in the global +coordinate system. The observer grid is stored in the `pixel` parameter of the +sensor object which is `(0,0,0)` by default (sensor position = observer +position). -The following example shows a moving and rotating sensor with two pixels. At the same time, the source objects are moving to demonstrate the versatility of the field computation. +The following example shows a moving and rotating sensor with two pixels. At the +same time, the source objects are moving to demonstrate the versatility of the +field computation. ```{code-cell} ipython3 import numpy as np @@ -127,7 +138,10 @@ with magpy.show_context(sensor, coll, animation=True, backend="plotly"): ## Multiple Inputs -When `getBHJM` receive multiple inputs for sources and observers they will compute all possible combinations. It is still beneficial to call the field computation only a single time, because similar sources will be grouped, and the computation will be vectorized automatically. +When `getBHJM` receive multiple inputs for sources and observers they will +compute all possible combinations. It is still beneficial to call the field +computation only a single time, because similar sources will be grouped, and the +computation will be vectorized automatically. ```{code-cell} ipython3 import magpylib as magpy @@ -149,7 +163,8 @@ B = magpy.getB([cube1, cube2, cube3], [sens1, sens2]) B.shape ``` -Select the second cube (first index), the first sensor (second index), pixel 3-4 (index three and four) and the Bz-component of the field (index five) +Select the second cube (first index), the first sensor (second index), pixel 3-4 +(index three and four) and the Bz-component of the field (index five) ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -157,11 +172,14 @@ Select the second cube (first index), the first sensor (second index), pixel 3-4 B[1, 0, 2, 3, 2] ``` -A path will add another index. Every higher pixel dimension will add another index as well. +A path will add another index. Every higher pixel dimension will add another +index as well. ## Field as Pandas Dataframe -Instead of a NumPy `ndarray`, the field computation can also return a [pandas](https://pandas.pydata.org/).[dataframe](https://pandas.pydata.org/docs/user_guide/dsintro.html#dataframe) using the `output='dataframe'` kwarg. +Instead of a NumPy `ndarray`, the field computation can also return a +[pandas](https://pandas.pydata.org/).[dataframe](https://pandas.pydata.org/docs/user_guide/dsintro.html#dataframe) +using the `output='dataframe'` kwarg. ```{code-cell} ipython3 import numpy as np @@ -191,7 +209,9 @@ B = magpy.getB( B ``` -Plotting libraries such as [plotly](https://plotly.com/python/plotly-express/) or [seaborn](https://seaborn.pydata.org/introduction.html) can take advantage of this feature, as they can deal with `dataframes` directly. +Plotting libraries such as [plotly](https://plotly.com/python/plotly-express/) +or [seaborn](https://seaborn.pydata.org/introduction.html) can take advantage of +this feature, as they can deal with `dataframes` directly. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -214,12 +234,15 @@ fig.show() ## Functional Interface -All above computations demonstrate the convenient object-oriented interface of Magpylib. However, there are instances when it is better to work with the functional interface instead. +All above computations demonstrate the convenient object-oriented interface of +Magpylib. However, there are instances when it is better to work with the +functional interface instead. 1. Reduce overhead of Python objects 2. Complex computation instances -In the following example we show how complex instances are computed using the functional interface. +In the following example we show how complex instances are computed using the +functional interface. ```{important} The functional interface will only outperform the object oriented interface if you use NumPy operations for input array creation, such as `tile`, `repeat`, `reshape`, ... ! diff --git a/docs/_pages/user_guide/examples/examples_tutorial_modeling_magnets.md b/docs/_pages/user_guide/examples/examples_tutorial_modeling_magnets.md index fc00f1099..6f8ad96db 100644 --- a/docs/_pages/user_guide/examples/examples_tutorial_modeling_magnets.md +++ b/docs/_pages/user_guide/examples/examples_tutorial_modeling_magnets.md @@ -2,15 +2,34 @@ # Modeling a real magnet -Whenever you wish to compare Magpylib simulations with experimental data obtained using a real permanent magnet, you might wonder how to properly set up a Magpylib magnet object to reflect the physical permanent magnet in question. The goal of this tutorial is to explain how to extract this information from respective datasheets, to provide better understanding of permanent magnets, and show how to align Magpylib simulations with experimental measurements. +Whenever you wish to compare Magpylib simulations with experimental data +obtained using a real permanent magnet, you might wonder how to properly set up +a Magpylib magnet object to reflect the physical permanent magnet in question. +The goal of this tutorial is to explain how to extract this information from +respective datasheets, to provide better understanding of permanent magnets, and +show how to align Magpylib simulations with experimental measurements. -This tutorial was supported by [BOMATEC](https://www.bomatec.com/de) by providing excellent data sheets and by supplying magnets for the experimental demonstration below. +This tutorial was supported by [BOMATEC](https://www.bomatec.com/de) by +providing excellent data sheets and by supplying magnets for the experimental +demonstration below. ## Short summary -In a magnet data sheet, you should find B-H curves and J-H curves. These curves coincide at H=0, which gives the intrinsic material remanence $B_r$. As a result of material response and self-interaction, the magnet "demagnetizes" itself so that the mean magnetic polarization of a real magnet is always below the remanence. How much below depends strongly on the shape of the magnet and is expressed in the data sheet through the permeance coefficient lines (grey lines). The numbers at the end indicate the typical magnet length to diameter ratio (L/D). - -To obtain the correct magnetic polarization of a magnet from the data sheet, one must find the crossing between B-H curve and respective permeance coefficient line. This gives the "working point" which corresponds to the mean demagnetizing H-field inside the magnet. The correct polarization to use in the Magpylib simulation is the J-value at the working point which can be read off from the J-H curve. +In a magnet data sheet, you should find B-H curves and J-H curves. These curves +coincide at H=0, which gives the intrinsic material remanence $B_r$. As a result +of material response and self-interaction, the magnet "demagnetizes" itself so +that the mean magnetic polarization of a real magnet is always below the +remanence. How much below depends strongly on the shape of the magnet and is +expressed in the data sheet through the permeance coefficient lines (grey +lines). The numbers at the end indicate the typical magnet length to diameter +ratio (L/D). + +To obtain the correct magnetic polarization of a magnet from the data sheet, one +must find the crossing between B-H curve and respective permeance coefficient +line. This gives the "working point" which corresponds to the mean demagnetizing +H-field inside the magnet. The correct polarization to use in the Magpylib +simulation is the J-value at the working point which can be read off from the +J-H curve. ![data sheet snippet](../../../_static/images/examples_tutorial_magnet_datasheet2.png) @@ -18,80 +37,158 @@ The following sections provide further explanation on the matter. ## Hysteresis loop -If you've worked with magnetism, chances are very high that you have seen a magnetic hysteresis loop. Hysteresis loops describe the connection between the **mean values** of an externally applied H-field and the resulting B-field, polarization J or magnetization M **within a defined volume**. This connection depends strongly on the size and shape of this volume and what is inside and what is outside. - -The B-H curve is called the "normal loop", while J-H and M-H curves are called "intrinsic loops". Hereon we only make use of the J-H loops, but the discussion is similar for M-H. Normal and intrinsic loops are connected via $B = \mu_0 H + J$. In free space the B-H connection is just a straight line defined via $B = \mu_0 H$. When the whole space is filled with magnetic material you will see something like this within an arbitrary volume: - -::::{grid} 2 -:::{grid-item} -:columns: 3 -::: -:::{grid-item} -:columns: 6 +If you've worked with magnetism, chances are very high that you have seen a +magnetic hysteresis loop. Hysteresis loops describe the connection between the +**mean values** of an externally applied H-field and the resulting B-field, +polarization J or magnetization M **within a defined volume**. This connection +depends strongly on the size and shape of this volume and what is inside and +what is outside. + +The B-H curve is called the "normal loop", while J-H and M-H curves are called +"intrinsic loops". Hereon we only make use of the J-H loops, but the discussion +is similar for M-H. Normal and intrinsic loops are connected via +$B = \mu_0 H + J$. In free space the B-H connection is just a straight line +defined via $B = \mu_0 H$. When the whole space is filled with magnetic material +you will see something like this within an arbitrary volume: + +::::{grid} 2 :::{grid-item} :columns: 3 ::: :::{grid-item} :columns: 6 ![hysteresis loops](../../../_static/images/examples_tutorial_magnet_hysteresis.png) -::: -:::: - -**1st quadrant**: Initially we have $J=0$ and $H=0$. The magnetic material is not magnetized, and no external H-field is applied. When increasing the H-field, the material polarization will follow the "virgin curve" and will increase until it reaches its maximum possible value, the saturation polarization $J_S$. Higher values of $H$ will not affect $J$, while $B$ will keep increasing linearly. Now we are on the "major loop" - we will never return to the virgin curve. After reaching a large H-value we slowly turn the H-field off. As it drops to zero the material will retain its strong polarization at saturation level while the resulting $B$ decreases. At $H = 0$ the B-field then approaches the "remanence field" $B_r$, and its only contribution is $J_S$. - -**2nd quadrant**: Now the H-field becomes negative. Its amplitude increases but it is oriented opposite to the initial direction. Therefore, it is also opposite to the magnetic polarization. In the 2nd quadrant we are now trying to actively demagnetize the material. This part of the hysteresis loop is often referred to as the "demagnetization curve". With increasing negative H, the B-field continues to become smaller until it reaches zero at the "coercive field" $H_c$. At this point the net B-field inside the volume is zero, however, the material is still magnetized! In the example loop above, the polarization at $H_c$ is still at the $J_S$ level. By increasing the H-field further, a point will be reached where the material will start to demagnetize. This can be seen by the non-linear drop of $J$. The point where $J$ reaches zero is called the "intrinsic coercive field" $H_{ci}$. At this point the net polarization in the observed volume is zero. The material is demagnetized. The intrinsic coercive field is a measure of how well a magnetized material can resist a demagnetizing field. Having large values of $H_{ci}$ is a property of "hard magnets", as they can keep their magnetization $J$ even for strong external fields in the opposite direction. - -**3rd and 4th quadrants**: Moving to the third quadrant the behavior is now mirrored. As $H$ increases past $H_{ci}$, polarization quickly aligns with the external field and the material becomes saturated $J=-J_S$. By turning the field around again, we move through the fourth quadrant to complete the hysteresis loop. - -Hysteresis in magnetism as presented here is a macroscopic model that is the result of a complex interplay between dipole and exchange interaction, material texture and resulting domain formation at a microscopic level. Details can be found, for example, in Aharoni's classical textbook "Introduction to the Theory of Ferromagnetism". +::: :::: + +**1st quadrant**: Initially we have $J=0$ and $H=0$. The magnetic material is +not magnetized, and no external H-field is applied. When increasing the H-field, +the material polarization will follow the "virgin curve" and will increase until +it reaches its maximum possible value, the saturation polarization $J_S$. Higher +values of $H$ will not affect $J$, while $B$ will keep increasing linearly. Now +we are on the "major loop" - we will never return to the virgin curve. After +reaching a large H-value we slowly turn the H-field off. As it drops to zero the +material will retain its strong polarization at saturation level while the +resulting $B$ decreases. At $H = 0$ the B-field then approaches the "remanence +field" $B_r$, and its only contribution is $J_S$. + +**2nd quadrant**: Now the H-field becomes negative. Its amplitude increases but +it is oriented opposite to the initial direction. Therefore, it is also opposite +to the magnetic polarization. In the 2nd quadrant we are now trying to actively +demagnetize the material. This part of the hysteresis loop is often referred to +as the "demagnetization curve". With increasing negative H, the B-field +continues to become smaller until it reaches zero at the "coercive field" $H_c$. +At this point the net B-field inside the volume is zero, however, the material +is still magnetized! In the example loop above, the polarization at $H_c$ is +still at the $J_S$ level. By increasing the H-field further, a point will be +reached where the material will start to demagnetize. This can be seen by the +non-linear drop of $J$. The point where $J$ reaches zero is called the +"intrinsic coercive field" $H_{ci}$. At this point the net polarization in the +observed volume is zero. The material is demagnetized. The intrinsic coercive +field is a measure of how well a magnetized material can resist a demagnetizing +field. Having large values of $H_{ci}$ is a property of "hard magnets", as they +can keep their magnetization $J$ even for strong external fields in the opposite +direction. + +**3rd and 4th quadrants**: Moving to the third quadrant the behavior is now +mirrored. As $H$ increases past $H_{ci}$, polarization quickly aligns with the +external field and the material becomes saturated $J=-J_S$. By turning the field +around again, we move through the fourth quadrant to complete the hysteresis +loop. + +Hysteresis in magnetism as presented here is a macroscopic model that is the +result of a complex interplay between dipole and exchange interaction, material +texture and resulting domain formation at a microscopic level. Details can be +found, for example, in Aharoni's classical textbook "Introduction to the Theory +of Ferromagnetism". ## The demagnetizing field -If in an application the applied external H-field is zero, it seems intuitive to use the remanence $B_r$ for the magnetic polarization in the Magpylib simulation. It is a value that you will find in the data sheet. +If in an application the applied external H-field is zero, it seems intuitive to +use the remanence $B_r$ for the magnetic polarization in the Magpylib +simulation. It is a value that you will find in the data sheet. ![data sheet snippet](../../../_static/images/examples_tutorial_magnet_table.png) -However, if considering $J=B_r$, you will quickly see that the experimental results are up to ~30 % below of what you would expect. The reason for this is the self-induced demagnetizing field of the magnet which is generated by the magnetic polarization itself. Just like $J$ generates an H-field on the outside of the magnet, it also generates an H-field inside the magnet, along the opposite direction of the polarization. The H-field outside the magnet is known as the stray field, and the H-field inside the magnet is called the demagnetizing field (as it opposes the magnetic polarization). This is demonstrated by the following figure: +However, if considering $J=B_r$, you will quickly see that the experimental +results are up to ~30 % below of what you would expect. The reason for this is +the self-induced demagnetizing field of the magnet which is generated by the +magnetic polarization itself. Just like $J$ generates an H-field on the outside +of the magnet, it also generates an H-field inside the magnet, along the +opposite direction of the polarization. The H-field outside the magnet is known +as the stray field, and the H-field inside the magnet is called the +demagnetizing field (as it opposes the magnetic polarization). This is +demonstrated by the following figure: ![demagnetization field simulation](../../../_static/images/examples_tutorial_magnet_fieldcomparison.png) -Making use of the [streamplot example](examples-vis-mpl-streamplot), on the left side we show the cross-section of a Cuboid magnet and its homogeneous polarization. And on the right, we see the H-field generated by it. Inside the magnet the generated H-field opposes the polarization. As a result, the polarization of a magnet will not be $B_r$, but instead will be some value of $J$ in the 2nd quadrant of the J-H loop that corresponds to the mean H-field inside the magnet. This H-value is often referred to as the "working point". +Making use of the [streamplot example](examples-vis-mpl-streamplot), on the left +side we show the cross-section of a Cuboid magnet and its homogeneous +polarization. And on the right, we see the H-field generated by it. Inside the +magnet the generated H-field opposes the polarization. As a result, the +polarization of a magnet will not be $B_r$, but instead will be some value of +$J$ in the 2nd quadrant of the J-H loop that corresponds to the mean H-field +inside the magnet. This H-value is often referred to as the "working point". ## Finding the correct polarization -As explained above, the hysteresis loop depends strongly on the chosen observation volume geometry, the material inside, and what is outside of the volume. Magnet manufacturers provide such loops (usually only the 2nd quadrant) for their magnets, meaning that the observation volume is the whole magnet with air outside. +As explained above, the hysteresis loop depends strongly on the chosen +observation volume geometry, the material inside, and what is outside of the +volume. Magnet manufacturers provide such loops (usually only the 2nd quadrant) +for their magnets, meaning that the observation volume is the whole magnet with +air outside. -To obtain the correct mean polarization of a magnet we simply must compute the mean demagnetizing field (= working point) and read the resulting $J$ off the provided J-H loop. Computing the mean demagnetizing field, however, is not a simple task. In addition to the material response (permeability), it depends strongly on the magnet geometry. Fortunately, the working points can be read off from well written data sheets. +To obtain the correct mean polarization of a magnet we simply must compute the +mean demagnetizing field (= working point) and read the resulting $J$ off the +provided J-H loop. Computing the mean demagnetizing field, however, is not a +simple task. In addition to the material response (permeability), it depends +strongly on the magnet geometry. Fortunately, the working points can be read off +from well written data sheets. ![data sheet snippet](../../../_static/images/examples_tutorial_magnet_datasheet.png) -This datasheet snippet shows the second quadrant of the B-H and J-H loops, even for two different temperatures. The working point is given by the intersection between the "permeance coefficient" lines (gray) and the B-H curve. The number at the end of these lines indicate the length to diameter ratio (L/D) of the magnet, which is the critical geometric factor. Different lines are for different L/D values, which allows one to select the correct working point for different magnets made from this specific material. Once the working point is found, the correct magnetic polarization, here denoted by $J_W$ (the magnetic polarization at the working point), can be read off. The following figure exemplifies the changes in $J_W$ for different L/D values, considering a cylinder magnet: +This datasheet snippet shows the second quadrant of the B-H and J-H loops, even +for two different temperatures. The working point is given by the intersection +between the "permeance coefficient" lines (gray) and the B-H curve. The number +at the end of these lines indicate the length to diameter ratio (L/D) of the +magnet, which is the critical geometric factor. Different lines are for +different L/D values, which allows one to select the correct working point for +different magnets made from this specific material. Once the working point is +found, the correct magnetic polarization, here denoted by $J_W$ (the magnetic +polarization at the working point), can be read off. The following figure +exemplifies the changes in $J_W$ for different L/D values, considering a +cylinder magnet: ![finding the working point](../../../_static/images/examples_tutorial_magnet_LDratio.png) -Permanent magnets with different geometries, such as a parallelepiped shape, will have different behavior in terms of L/D values. Make sure you are reading the data from the correct part number. +Permanent magnets with different geometries, such as a parallelepiped shape, +will have different behavior in terms of L/D values. Make sure you are reading +the data from the correct part number. + ## Warning -Keep in mind that there are still many reasons why your simulation might not fit well to your experiment. Here are some of the most common problems: +Keep in mind that there are still many reasons why your simulation might not fit +well to your experiment. Here are some of the most common problems: -1. Small position errors of less than 100 um can have a large impact on the measurement result. The reference should be the sensitive element inside a sensor package. These elements can be displaced by 10-100 um and even rotated by a few degrees. The sensor might also not be well calibrated. -2. There are external stray fields, like the earth magnetic field, that influence the measurements. Those might also come from other nearby electronic equipment or magnetic parts. +1. Small position errors of less than 100 um can have a large impact on the + measurement result. The reference should be the sensitive element inside a + sensor package. These elements can be displaced by 10-100 um and even rotated + by a few degrees. The sensor might also not be well calibrated. +2. There are external stray fields, like the earth magnetic field, that + influence the measurements. Those might also come from other nearby + electronic equipment or magnetic parts. 3. Off-the-shelf magnets often do not hold what is promised in the datasheet - - Magnetic polarization amplitude can be off by 5-10 %. - - The direction of polarization often varies by up to a few degrees. - - Worst-case: the polarization can be inhomogeneous which is often a problem in injection-mold magnets. + - Magnetic polarization amplitude can be off by 5-10 %. + - The direction of polarization often varies by up to a few degrees. + - Worst-case: the polarization can be inhomogeneous which is often a problem + in injection-mold magnets. ## Example -::::{grid} 2 -:::{grid-item} -:columns: 3 -::: -:::{grid-item} -:columns: 6 -![](../../../_static/images/examples_icon_WIP.png) -::: -:::: +::::{grid} 2 :::{grid-item} :columns: 3 ::: :::{grid-item} :columns: 6 +![](../../../_static/images/examples_icon_WIP.png) ::: :::: coming soon: + 1. Magpylib simulation code 2. Experimental data 3. Comparison and discussion -**Exterior reference** -G. Martinek, S. Ruoho and U. Wyss. (2021). *Magnetic Properties of Permanents Magnets & Measuring Techniques* [White paper]. Arnold Magnetic Technologies. https://www.arnoldmagnetics.com/blog/measuring-permanent-magnets-white-paper/ \ No newline at end of file +**Exterior reference** G. Martinek, S. Ruoho and U. Wyss. (2021). _Magnetic +Properties of Permanents Magnets & Measuring Techniques_ [White paper]. Arnold +Magnetic Technologies. +https://www.arnoldmagnetics.com/blog/measuring-permanent-magnets-white-paper/ diff --git a/docs/_pages/user_guide/examples/examples_tutorial_paths.md b/docs/_pages/user_guide/examples/examples_tutorial_paths.md index 0da674d36..952b13528 100644 --- a/docs/_pages/user_guide/examples/examples_tutorial_paths.md +++ b/docs/_pages/user_guide/examples/examples_tutorial_paths.md @@ -16,7 +16,10 @@ orphan: true # Working with Paths -The position and orientation attributes are key elements of Magpylib. The documentation section {ref}`docs-position` describes how they work in detail. Wile these definitions can seem abstract, the interface was constructed as intuitively as possible which is demonstrated in this tutorial. +The position and orientation attributes are key elements of Magpylib. The +documentation section {ref}`docs-position` describes how they work in detail. +Wile these definitions can seem abstract, the interface was constructed as +intuitively as possible which is demonstrated in this tutorial. ```{important} Always make use of paths when computing with multiple Magpylib object position and orientation instances. This enables vectorized computation. Avoid Python loops at all costs! @@ -26,7 +29,8 @@ In this tutorial we show some good practice examples. ## Assigning Absolute Paths -Absolute object paths are assigned at initialization or through the object properties. +Absolute object paths are assigned at initialization or through the object +properties. ```{code-cell} ipython3 import numpy as np @@ -52,7 +56,8 @@ magpy.show(sensor, cube, animation=True, backend="plotly") ## Relative Paths -`move` and `rotate` input is interpreted relative to the existing path. When the input is scalar the whole existing path is moved. +`move` and `rotate` input is interpreted relative to the existing path. When the +input is scalar the whole existing path is moved. ```{code-cell} ipython3 import numpy as np @@ -102,7 +107,11 @@ sphere.show() ## Merging paths -Complex paths can be created by merging multiple path operations. This is done with vector input for the `move` and `rotate` methods and choosing values for `start` that will make the paths overlap. In the following example we combine a linear path with a rotation about self (`anchor=None`) until path index 30. Thereon, a second rotation about the origin is applied, creating a spiral. +Complex paths can be created by merging multiple path operations. This is done +with vector input for the `move` and `rotate` methods and choosing values for +`start` that will make the paths overlap. In the following example we combine a +linear path with a rotation about self (`anchor=None`) until path index 30. +Thereon, a second rotation about the origin is applied, creating a spiral. ```{code-cell} ipython3 import numpy as np @@ -124,7 +133,8 @@ cube.show(backend="plotly", animation=True) ## Reset path -The `reset_path()` method allows users to reset an object path to `position=(0,0,0)` and `orientation=None`. +The `reset_path()` method allows users to reset an object path to +`position=(0,0,0)` and `orientation=None`. ```{code-cell} ipython3 import magpylib as magpy @@ -142,13 +152,22 @@ print(sensor.orientation.as_quat()) ``` (examples-tutorial-paths-edge-padding-end-slicing)= + ## Edge-padding and end-slicing -Magpylib will always make sure that object paths are in the right format, i.e., `position` and `orientation` attributes are of the same length. In addition, when objects with different path lengths are combined, e.g., when computing the field, the shorter paths are treated as static beyond their end to make the computation sensible. Internally, Magpylib follows a philosophy of edge-padding and end-slicing when adjusting paths. +Magpylib will always make sure that object paths are in the right format, i.e., +`position` and `orientation` attributes are of the same length. In addition, +when objects with different path lengths are combined, e.g., when computing the +field, the shorter paths are treated as static beyond their end to make the +computation sensible. Internally, Magpylib follows a philosophy of edge-padding +and end-slicing when adjusting paths. -The idea behind **edge-padding** is that, whenever path entries beyond the existing path length are needed, the edge-entries of the existing path are returned. This means that the object is static beyond its existing path. +The idea behind **edge-padding** is that, whenever path entries beyond the +existing path length are needed, the edge-entries of the existing path are +returned. This means that the object is static beyond its existing path. -In the following example the orientation attribute is padded by its edge value `(0,0,.2)` as the position attribute length is increased. +In the following example the orientation attribute is padded by its edge value +`(0,0,.2)` as the position attribute length is increased. ```{code-cell} ipython3 from scipy.spatial.transform import Rotation as R @@ -163,7 +182,9 @@ print(sensor.position) print(sensor.orientation.as_rotvec()) ``` -When the field is computed of `loop1` with path length 4 and `loop2` with path length 2, `loop2` will remain in position (= edge padding) while the other object is still in motion. +When the field is computed of `loop1` with path length 4 and `loop2` with path +length 2, `loop2` will remain in position (= edge padding) while the other +object is still in motion. ```{code-cell} ipython3 from magpylib.current import Circle @@ -175,7 +196,11 @@ B = magpy.getB([loop1, loop2], (0, 0, 0)) print(B) ``` -The idea behind **end-slicing** is that, whenever a path is automatically reduced in length, Magpylib will slice to keep the ending of the path. While this occurs rarely, the following example shows how the `orientation` attribute is automatically end-sliced, keeping the values `[(0,0,.3), (0,0,.4)]`, when the `position` attribute is reduced in length: +The idea behind **end-slicing** is that, whenever a path is automatically +reduced in length, Magpylib will slice to keep the ending of the path. While +this occurs rarely, the following example shows how the `orientation` attribute +is automatically end-sliced, keeping the values `[(0,0,.3), (0,0,.4)]`, when the +`position` attribute is reduced in length: ```{code-cell} ipython3 from scipy.spatial.transform import Rotation as R diff --git a/docs/_pages/user_guide/examples/examples_vis_animations.md b/docs/_pages/user_guide/examples/examples_vis_animations.md index 87c560685..b43333515 100644 --- a/docs/_pages/user_guide/examples/examples_vis_animations.md +++ b/docs/_pages/user_guide/examples/examples_vis_animations.md @@ -16,7 +16,8 @@ orphan: true # Animations -Magpylib can display the motion of objects along paths in the form of animations. +Magpylib can display the motion of objects along paths in the form of +animations. ```{hint} 1. Animations work best with the [plotly backend](guide-graphic-backends). @@ -26,11 +27,13 @@ Magpylib can display the motion of objects along paths in the form of animations 3. Avoid rendering too many frames. ``` -Detailed information about how to tune animations can be found in the [graphics documentation](guide-graphic-animations). +Detailed information about how to tune animations can be found in the +[graphics documentation](guide-graphic-animations). ## Simple Animations -Animations are created with `show` by setting `animation=True`. It is also possible to hand over the animation time with this parameter. +Animations are created with `show` by setting `animation=True`. It is also +possible to hand over the animation time with this parameter. ```{code-cell} ipython3 import magpylib as magpy @@ -60,7 +63,10 @@ magpy.show(sensor, magnet, animation=True, backend="plotly") ## Animated Subplots -[Subplots](examples-vis-subplots) are a powerful tool to see the field along a path while viewing the 3D models at the same time. This is specifically illustrative as an animation where the field at the respective path position is indicated by a marker. +[Subplots](examples-vis-subplots) are a powerful tool to see the field along a +path while viewing the 3D models at the same time. This is specifically +illustrative as an animation where the field at the respective path position is +indicated by a marker. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -73,7 +79,8 @@ magpy.show( ) ``` -It is also possible to use the [show_context](guide-graphics-show_context) context manager. +It is also possible to use the [show_context](guide-graphics-show_context) +context manager. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -89,20 +96,24 @@ with magpy.show_context([magnet, sensor], backend="plotly", animation=True) as s ## Exporting Animations -Animations are wonderful but can be quite difficult to export when they are needed, for example, in a presentation. Here we show how to creat and export animations using the *.gif format. +Animations are wonderful but can be quite difficult to export when they are +needed, for example, in a presentation. Here we show how to creat and export +animations using the \*.gif format. ### Built-in export -The easiest way to export an animation is via the Magpylib built-in command `animation_output` in the `show` function. It works only with the Pyvista backend. The following code will create a file "test4.gif". +The easiest way to export an animation is via the Magpylib built-in command +`animation_output` in the `show` function. It works only with the Pyvista +backend. The following code will create a file "test4.gif". ```python import magpylib as magpy import numpy as np # Create magnets with Paths -path = [(np.sin(t)+1.5,0,0) for t in np.linspace(0, 2*np.pi, 30)] -cube1 = magpy.magnet.Cuboid(dimension=(1,1,1), polarization=(1,0,0), position= path) -cube2 = cube1.copy(position=-np.array(path), polarization=(-1,0,0)) +path = [(np.sin(t) + 1.5, 0, 0) for t in np.linspace(0, 2 * np.pi, 30)] +cube1 = magpy.magnet.Cuboid(dimension=(1, 1, 1), polarization=(1, 0, 0), position=path) +cube2 = cube1.copy(position=-np.array(path), polarization=(-1, 0, 0)) # Store gif with animation_output using Pyvista magpy.show( @@ -120,13 +131,17 @@ magpy.show( ### Custom export Pyvista -For customizing videos it is best to work directly in the respective graphic backends. Here we show how to transfer the Magpylib graphic objects to a Pyvista plotter, customize the plotting scene, export screen shots, and combine them in a *.gif. The following example also shows how to achieve transparency. +For customizing videos it is best to work directly in the respective graphic +backends. Here we show how to transfer the Magpylib graphic objects to a Pyvista +plotter, customize the plotting scene, export screen shots, and combine them in +a \*.gif. The following example also shows how to achieve transparency. ```python import magpylib as magpy import pyvista as pv from PIL import Image + def create_gif(images, frame_time, output_file): """Create a GIF from images""" frames = [Image.fromarray(img) for img in images] @@ -143,12 +158,12 @@ def create_gif(images, frame_time, output_file): def init_plotter(): - """ Init Pyvista plotter with custom scene layout""" + """Init Pyvista plotter with custom scene layout""" pl = pv.Plotter(notebook=False, off_screen=True, window_size=[300, 300]) pl.camera_position = [ (5, 5, 5), # Position of the camera (0, 0, 0), # Focal point (what the camera is looking at) - (0, 0, 1) # View up direction + (0, 0, 1), # View up direction ] pl.camera.zoom(0.5) pl.set_background("k") # For better transparency @@ -157,18 +172,22 @@ def init_plotter(): def create_frames(frames): """Create frames with Pyvista.""" - + # Create Magpylib objects - mag1 = magpy.magnet.CylinderSegment(dimension=(3, 4, 1, 0, 45), polarization=(0, 0, 1)) - mag2 = magpy.magnet.CylinderSegment(dimension=(2, 3, 1, 0, 45), polarization=(0, 0, -1)) + mag1 = magpy.magnet.CylinderSegment( + dimension=(3, 4, 1, 0, 45), polarization=(0, 0, 1) + ) + mag2 = magpy.magnet.CylinderSegment( + dimension=(2, 3, 1, 0, 45), polarization=(0, 0, -1) + ) images = [] pl = init_plotter() for i in range(frames): - + # Modify object positions - mag1.rotate_from_angax(360 / frames, axis='z') - mag2.rotate_from_angax(-360 / frames, axis='z') + mag1.rotate_from_angax(360 / frames, axis="z") + mag2.rotate_from_angax(-360 / frames, axis="z") # Transfer Magpylib objects to Pyvista plotter pl.clear() @@ -201,7 +220,11 @@ if __name__ == "__main__": -Notice that when providing a canvas, no update to its layout is performed by Magpylib, unless explicitly specified by setting `canvas_update=True` in `show()`. By default `canvas_update="auto"` only updates the canvas if is not provided by the user. Details can be found in the [graphics documentation](guide-graphics-canvas). +Notice that when providing a canvas, no update to its layout is performed by +Magpylib, unless explicitly specified by setting `canvas_update=True` in +`show()`. By default `canvas_update="auto"` only updates the canvas if is not +provided by the user. Details can be found in the +[graphics documentation](guide-graphics-canvas). ### Custom export Plotly @@ -231,9 +254,13 @@ def create_frames(frames): """Create frames with Pyvista.""" # Create Magpylib objects - mag1 = magpy.magnet.CylinderSegment(dimension=(3, 4, 1, 0, 45), polarization=(0, 0, 1)) - mag2 = magpy.magnet.CylinderSegment(dimension=(2, 3, 1, 0, 45), polarization=(0, 0, -1)) - + mag1 = magpy.magnet.CylinderSegment( + dimension=(3, 4, 1, 0, 45), polarization=(0, 0, 1) + ) + mag2 = magpy.magnet.CylinderSegment( + dimension=(2, 3, 1, 0, 45), polarization=(0, 0, -1) + ) + images = [] for i in range(frames): # Set object position diff --git a/docs/_pages/user_guide/examples/examples_vis_magnet_colors.md b/docs/_pages/user_guide/examples/examples_vis_magnet_colors.md index bf0218a58..5b833f569 100644 --- a/docs/_pages/user_guide/examples/examples_vis_magnet_colors.md +++ b/docs/_pages/user_guide/examples/examples_vis_magnet_colors.md @@ -13,19 +13,26 @@ kernelspec: --- (examples-vis-magnet-colors)= + # Magnet colors -The polarization direction of a permanent magnet is often graphically displayed with the help of colors. However, there is no unified color scheme that everyone agrees on. The following image shows some color-examples from the web. +The polarization direction of a permanent magnet is often graphically displayed +with the help of colors. However, there is no unified color scheme that everyone +agrees on. The following image shows some color-examples from the web. ![](../../../_static/images/examples_vis_magnet_colors.png) -Magpylib uses the DIN Specification 91411 (soon 91479) standard as default setting. The tri-color scheme has the advantage that for multi-pole elements it becomes clear which north is "connected" to which south. +Magpylib uses the DIN Specification 91411 (soon 91479) standard as default +setting. The tri-color scheme has the advantage that for multi-pole elements it +becomes clear which north is "connected" to which south. ```{hint} The color schemes often seem to represent homogeneous polarizations, referred to as "ideal typical" magnets in DIN Specification 91479. However, they often just represent general "pole patterns", i.e. rough sketches where the field goes in and where it comes out, that are not the result of homogeneous polarizations. On this topic review also the examples example {ref}`examples-misc-inhom`, and the tutorial {ref}`examples-tutorial-modeling-magnets`. ``` -With Magpylib users can easily tune the magnet color schemes. The `style` options are `tricolor` with north, middle and south colors, and `bicolor` with north and south colors. +With Magpylib users can easily tune the magnet color schemes. The `style` +options are `tricolor` with north, middle and south colors, and `bicolor` with +north and south colors. ```{code-cell} ipython import magpylib as magpy @@ -68,4 +75,5 @@ cyl.style.magnetization.color.south = "orange" magpy.show(sphere, cube, cyl, backend='plotly', style_legend_show=False) ``` -More information about styles and how to apply them is given in the user-guide [style section](guide-graphic-styles). +More information about styles and how to apply them is given in the user-guide +[style section](guide-graphic-styles). diff --git a/docs/_pages/user_guide/examples/examples_vis_mpl_streamplot.md b/docs/_pages/user_guide/examples/examples_vis_mpl_streamplot.md index 223a214a6..f37416f2f 100644 --- a/docs/_pages/user_guide/examples/examples_vis_mpl_streamplot.md +++ b/docs/_pages/user_guide/examples/examples_vis_mpl_streamplot.md @@ -18,9 +18,19 @@ orphan: true ## Example 1: Cuboid Magnet -In this example we show the B-field of a cuboid magnet using Matplotlib streamlines. Streamlines are not magnetic field lines in the sense that the field amplitude cannot be derived from their density. However, Matplotlib streamlines can show the field amplitude via color and line thickness. One must be careful that streamlines can only display two components of the field. In the following example the third field component is always zero - but this is generally not the case. - -In the example we make use of the [scaling property](guide-docs-io-scale-invariance). We assume that all length inputs are in units of mm, and that the polarization input is in units of millitesla. The resulting `getB` output will also be in millitesla. One must be careful with scaling - the conversion to H would ofc give units of mA/m. +In this example we show the B-field of a cuboid magnet using Matplotlib +streamlines. Streamlines are not magnetic field lines in the sense that the +field amplitude cannot be derived from their density. However, Matplotlib +streamlines can show the field amplitude via color and line thickness. One must +be careful that streamlines can only display two components of the field. In the +following example the third field component is always zero - but this is +generally not the case. + +In the example we make use of the +[scaling property](guide-docs-io-scale-invariance). We assume that all length +inputs are in units of mm, and that the polarization input is in units of +millitesla. The resulting `getB` output will also be in millitesla. One must be +careful with scaling - the conversion to H would ofc give units of mA/m. ```{code-cell} ipython3 import matplotlib.pyplot as plt @@ -81,7 +91,9 @@ Be aware that the above code is not very performant, but quite readable. The fol ## Example 2 - Hollow Cylinder Magnet -A nice visualization is achieved by combining `streamplot` with `contourf`. In this example we show the B-field of a hollow Cylinder magnet with diametral polarization in the xy-symmetry plane. +A nice visualization is achieved by combining `streamplot` with `contourf`. In +this example we show the B-field of a hollow Cylinder magnet with diametral +polarization in the xy-symmetry plane. ```{code-cell} ipython3 import matplotlib.pyplot as plt diff --git a/docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md b/docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md index 8fc2fd30a..807d21be9 100644 --- a/docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md +++ b/docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md @@ -16,7 +16,9 @@ orphan: true # Pyvista 3D field lines -Pyvista offers field-line computation and visualization in 3D. In addition to the field computation, Magpylib offers magnet visualization that seamlessly integrates into a Pyvista plotting scene. +Pyvista offers field-line computation and visualization in 3D. In addition to +the field computation, Magpylib offers magnet visualization that seamlessly +integrates into a Pyvista plotting scene. ```{code-cell} ipython3 import magpylib as magpy @@ -70,4 +72,4 @@ pl.add_mesh( # Prepare and show scene pl.camera.position = (0.03, 0.03, 0.03) pl.show() -``` \ No newline at end of file +``` diff --git a/docs/_pages/user_guide/examples/examples_vis_subplots.md b/docs/_pages/user_guide/examples/examples_vis_subplots.md index 9f926ed03..caeaefdcc 100644 --- a/docs/_pages/user_guide/examples/examples_vis_subplots.md +++ b/docs/_pages/user_guide/examples/examples_vis_subplots.md @@ -16,7 +16,9 @@ kernelspec: # Subplots -It is very illustrative to combine 2D and 3D subplots when viewing the field along paths. Consider the following system of a sensor and a magnet, both endowed with paths. +It is very illustrative to combine 2D and 3D subplots when viewing the field +along paths. Consider the following system of a sensor and a magnet, both +endowed with paths. ```{code-cell} ipython3 import numpy as np @@ -37,11 +39,14 @@ sens = magpy.Sensor( ) ``` -In the following, we demonstrate various ways how to generate 2D/3D subplot combinations for this system. +In the following, we demonstrate various ways how to generate 2D/3D subplot +combinations for this system. # Plotting canvas with own figure -Customization is best done by adding the [Magpylib 3D-model](guide-graphics-show) to your own figure using the `canvas` kwarg. +Customization is best done by adding the +[Magpylib 3D-model](guide-graphics-show) to your own figure using the `canvas` +kwarg. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -61,12 +66,16 @@ magpy.show(sens, cyl, canvas=ax2) plt.show() ``` -How to add and modify subplots in all three supported backends is demonstrated in the [canvas documentation](guide-graphics-canvas). It is also possible to customize the Magpylib 3D output by returning and editing the respective canvas using the `return_fig` kwarg, see [return figures](guide-graphics-return_fig). - +How to add and modify subplots in all three supported backends is demonstrated +in the [canvas documentation](guide-graphics-canvas). It is also possible to +customize the Magpylib 3D output by returning and editing the respective canvas +using the `return_fig` kwarg, see [return figures](guide-graphics-return_fig). # Built-in subplots -For maximal efficiency, Magpylib offers auto-generated subplots of 3D models and the field along paths by providing the `show` function with proper input dictionaries. +For maximal efficiency, Magpylib offers auto-generated subplots of 3D models and +the field along paths by providing the `show` function with proper input +dictionaries. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -78,11 +87,13 @@ magpy.show( ) ``` -Detailed information on built-in subplots is provided in the [user guide](guide-graphics-subplots). +Detailed information on built-in subplots is provided in the +[user guide](guide-graphics-subplots). # show_context -With a built-in context manager this functionality can be accessed with maximal ease +With a built-in context manager this functionality can be accessed with maximal +ease ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed diff --git a/docs/_pages/user_guide/guide_index.md b/docs/_pages/user_guide/guide_index.md index a63482e3d..62769d139 100644 --- a/docs/_pages/user_guide/guide_index.md +++ b/docs/_pages/user_guide/guide_index.md @@ -1,7 +1,9 @@ (guide-index)= + # User Guide -The user guide provides detailed descriptions of the Magpylib API with many interactive examples to help users along the way. +The user guide provides detailed descriptions of the Magpylib API with many +interactive examples to help users along the way. ```{toctree} :maxdepth: 2 diff --git a/docs/_pages/user_guide/guide_resources_01_physics.md b/docs/_pages/user_guide/guide_resources_01_physics.md index 9c0b2821a..0c412c405 100644 --- a/docs/_pages/user_guide/guide_resources_01_physics.md +++ b/docs/_pages/user_guide/guide_resources_01_physics.md @@ -1,13 +1,23 @@ (guide-ressources-physics)= + # Physics and Computation ## What is implemented ? -The expressions used in Magpylib describe perfectly homogeneous magnets, surface charges, and line currents with natural boundary conditions. Magpylib is at its best when dealing with static air-coils (no eddy currents, no soft-magnetic cores) and high-grade permanent magnets (Ferrite, NdFeB, SmCo or similar materials). When **magnet** permeabilities are below $\mu_r < 1.1$ the error typically undercuts few %. Demagnetization factors are not included. The line **current** solutions give the exact same field as outside of a wire that carries a homogeneous current. +The expressions used in Magpylib describe perfectly homogeneous magnets, surface +charges, and line currents with natural boundary conditions. Magpylib is at its +best when dealing with static air-coils (no eddy currents, no soft-magnetic +cores) and high-grade permanent magnets (Ferrite, NdFeB, SmCo or similar +materials). When **magnet** permeabilities are below $\mu_r < 1.1$ the error +typically undercuts few %. Demagnetization factors are not included. The line +**current** solutions give the exact same field as outside of a wire that +carries a homogeneous current. ## The analytical solutions -Magnetic field computations in Magpylib are based on known analytical solutions (closed form expressions) to permanent magnet and current problems. The Magpylib implementations are based on the following literature references: +Magnetic field computations in Magpylib are based on known analytical solutions +(closed form expressions) to permanent magnet and current problems. The Magpylib +implementations are based on the following literature references: - Field of cuboid magnets [^1] [^2] [^3] [^4] - Field of cylindrical magnets: [^5] [^6] [^7] [^8] @@ -15,109 +25,218 @@ Magnetic field computations in Magpylib are based on known analytical solutions - Field of the current loop: [^12] - all others derived by hand -A short reflection on how these formulas can be achieved: In magnetostatics the magnetic field becomes conservative (Maxwell: $\nabla \times {\bf H} = 0$) and can thus be expressed through the magnetic scalar potential $\Phi_m$: +A short reflection on how these formulas can be achieved: In magnetostatics the +magnetic field becomes conservative (Maxwell: $\nabla \times {\bf H} = 0$) and +can thus be expressed through the magnetic scalar potential $\Phi_m$: $$ {\bf H} = -\nabla\cdot\Phi_m $$ -The solution to this equation can be expressed by an integral over the magnetization distribution ${\bf M}({\bf r})$ as +The solution to this equation can be expressed by an integral over the +magnetization distribution ${\bf M}({\bf r})$ as $$ \Phi_m({\bf r}) = \frac{1}{4\pi}\int_{V'}\frac{\nabla'\cdot {\bf M}({\bf r}')}{|{\bf r}-{\bf r}'|}dV'+\frac{1}{4\pi}\oint_{S'}\frac{{\bf n}'\cdot {\bf M}({\bf r}')}{|{\bf r}-{\bf r}'|}dS' $$ -where ${\bf r}$ denotes the position, $V$ is the magnetized volume with surface $S$ and normal vector ${\bf n}$ onto the surface. This solution is derived in detail e.g. in [^13]. +where ${\bf r}$ denotes the position, $V$ is the magnetized volume with surface +$S$ and normal vector ${\bf n}$ onto the surface. This solution is derived in +detail e.g. in [^13]. -The fields of currents are directly derived using the law of Biot-Savart with the current distribution ${\bf J}({\bf r})$: +The fields of currents are directly derived using the law of Biot-Savart with +the current distribution ${\bf J}({\bf r})$: $$ {\bf B}({\bf r}) = \frac{\mu_0}{4\pi}\int_{V'} {\bf J}({\bf r}')\times \frac{{\bf r}-{\bf r}'}{|{\bf r}-{\bf r}'|^3} dV' $$ -In some special cases (simple shapes, homogeneous magnetisations, and current distributions) the above integrals can be worked out directly to give analytical formulas (or simple, fast converging series). The derivations can be found in the respective references. A noteworthy comparison between the Coulombian approach and the Amperian current model is given in [^14]. +In some special cases (simple shapes, homogeneous magnetisations, and current +distributions) the above integrals can be worked out directly to give analytical +formulas (or simple, fast converging series). The derivations can be found in +the respective references. A noteworthy comparison between the Coulombian +approach and the Amperian current model is given in [^14]. ## Accuracy of the Solutions and Demagnetization ### Line currents: -The magnetic field of a wire carrying a homogeneous current density is (on the outside) similar to the field of a line current positioned in the center of the wire, which carries the same total current. Current distributions become inhomogeneous at bends of the wire or when eddy currents (finite frequencies) are involved. +The magnetic field of a wire carrying a homogeneous current density is (on the +outside) similar to the field of a line current positioned in the center of the +wire, which carries the same total current. Current distributions become +inhomogeneous at bends of the wire or when eddy currents (finite frequencies) +are involved. (guide-physics-demag)= -### Magnets and Demagnetization -The analytical solutions are exact when bodies have a homogeneous magnetization. However, real materials always have a material response which results in an inhomogeneous magnetization even when the initial magnetization is perfectly homogeneous. There is a lot of literature on such [demagnetization effects](https://en.wikipedia.org/wiki/Demagnetizing_field). +### Magnets and Demagnetization -Modern high grade permanent magnets (NdFeB, SmCo, Ferrite) have a very weak material responses (local slope of the magnetization curve, remanent permeability) of the order of $\mu_r \approx 1.05$. In this case the analytical solutions provide an excellent approximation with less than 1% error even at close distance from the magnet surface. A detailed error analysis and discussion is presented in the appendix of [^15]. +The analytical solutions are exact when bodies have a homogeneous magnetization. +However, real materials always have a material response which results in an +inhomogeneous magnetization even when the initial magnetization is perfectly +homogeneous. There is a lot of literature on such +[demagnetization effects](https://en.wikipedia.org/wiki/Demagnetizing_field). -Error estimation as a result of the material response is evaluated in more detail in the appendix of [Malagò2020](https://www.mdpi.com/1424-8220/20/23/6873). +Modern high grade permanent magnets (NdFeB, SmCo, Ferrite) have a very weak +material responses (local slope of the magnetization curve, remanent +permeability) of the order of $\mu_r \approx 1.05$. In this case the analytical +solutions provide an excellent approximation with less than 1% error even at +close distance from the magnet surface. A detailed error analysis and discussion +is presented in the appendix of [^15]. -Demagnetization factors can be used to compensate a large part of the demagnetization effect. Analytical expressions for the demagnetization factors of cuboids can be found at [magpar.net](http://www.magpar.net/static/magpar/doc/html/demagcalc.html). +Error estimation as a result of the material response is evaluated in more +detail in the appendix of +[Malagò2020](https://www.mdpi.com/1424-8220/20/23/6873). +Demagnetization factors can be used to compensate a large part of the +demagnetization effect. Analytical expressions for the demagnetization factors +of cuboids can be found at +[magpar.net](http://www.magpar.net/static/magpar/doc/html/demagcalc.html). (phys-remanence)= -### Modeling a datasheet magnet - -The material remanence, often found in data sheets, simply corresponds to the material magnetization/polarization when not under the influence of external fields. This can never happen, as the material itself generates a magnetic field. Such self-interactions result in self-demagnetization that can be approximated using the demagnetization factors and the material permeability (or susceptibility). -For example, a cube with 1 mm sides has a demagnetization factor is 0.333, see [magpar.net](http://www.magpar.net/static/magpar/doc/html/demagcalc.html). When the remanence field of this cube is 1 T, and its susceptibility is 0.1, the magnetization resulting from self-interaction is reduced to 1 T - 0.3333*0.1 T = 0.9667 T, assuming linear material laws. - -A [tutorial](examples-tutorial-modeling-magnets) explains how to deal with demagnetization effects and how real magnets can be modeled using datasheet values. +### Modeling a datasheet magnet -It must be understood that the change in magnetization resulting from self-interaction has a homogeneous contribution which is approximated by the demagnetization factor, and an inhomogeneous contribution which cannot be modeled easily with analytical solutions. The inhomogeneous part, however, is typically an order of magnitude lower than the homogenous part. You can use the Magpylib extension [Magpylib material response](https://github.com/magpylib/magpylib-material-response) to model the self-interactions. +The material remanence, often found in data sheets, simply corresponds to the +material magnetization/polarization when not under the influence of external +fields. This can never happen, as the material itself generates a magnetic +field. Such self-interactions result in self-demagnetization that can be +approximated using the demagnetization factors and the material permeability (or +susceptibility). + +For example, a cube with 1 mm sides has a demagnetization factor is 0.333, see +[magpar.net](http://www.magpar.net/static/magpar/doc/html/demagcalc.html). When +the remanence field of this cube is 1 T, and its susceptibility is 0.1, the +magnetization resulting from self-interaction is reduced to 1 T - 0.3333\*0.1 T += 0.9667 T, assuming linear material laws. + +A [tutorial](examples-tutorial-modeling-magnets) explains how to deal with +demagnetization effects and how real magnets can be modeled using datasheet +values. + +It must be understood that the change in magnetization resulting from +self-interaction has a homogeneous contribution which is approximated by the +demagnetization factor, and an inhomogeneous contribution which cannot be +modeled easily with analytical solutions. The inhomogeneous part, however, is +typically an order of magnitude lower than the homogenous part. You can use the +Magpylib extension +[Magpylib material response](https://github.com/magpylib/magpylib-material-response) +to model the self-interactions. ### Soft-Magnetic Materials -Soft-magnetic materials like iron or steel with large permeabilities $\mu_r \sim 1000$ and low remanence fields are dominated by the material response. It is not possible to describe such bodies with analytical solutions. However, recent developments showed that the **Magnetostatic Method of Moments** can be a powerful tool in combination with Magpylib to compute such a material response. An integration into Magpylib is planned in the future. - -When a magnet lies in front of a soft-magnetic plate, the contribution from the plate can be modeled with high accuracy using a **mirror**-approach, similar to the electrostatic "mirror charge". +Soft-magnetic materials like iron or steel with large permeabilities +$\mu_r \sim 1000$ and low remanence fields are dominated by the material +response. It is not possible to describe such bodies with analytical solutions. +However, recent developments showed that the **Magnetostatic Method of Moments** +can be a powerful tool in combination with Magpylib to compute such a material +response. An integration into Magpylib is planned in the future. +When a magnet lies in front of a soft-magnetic plate, the contribution from the +plate can be modeled with high accuracy using a **mirror**-approach, similar to +the electrostatic "mirror charge". (docu-performance)= + ## Computation Performance -Magpylib code is fully [vectorized](https://en.wikipedia.org/wiki/Array_programming), written almost completely in numpy native. Magpylib automatically vectorizes the computation with complex inputs (many sources, many observers, paths) and never falls back on using loops. +Magpylib code is fully +[vectorized](https://en.wikipedia.org/wiki/Array_programming), written almost +completely in numpy native. Magpylib automatically vectorizes the computation +with complex inputs (many sources, many observers, paths) and never falls back +on using loops. ```{note} Maximal performance is achieved when `.getB(sources, observers)` is called only a single time in your program. Try not to use loops. ``` -The object-oriented interface comes with an overhead. If you want to achieve maximal performance this overhead can be avoided with {ref}`docs-field-functional`. +The object-oriented interface comes with an overhead. If you want to achieve +maximal performance this overhead can be avoided with +{ref}`docs-field-functional`. -The analytical solutions provide extreme performance. Single field evaluations take of the order of `100 µs`. For large input arrays (e.g. many observer positions or many similar magnets) the computation time can drop below `1 µs` per evaluation point on single state-of-the-art x86 mobile cores (tested on `Intel Core i5-8365U @ 1.60GHz`), depending on the source type. +The analytical solutions provide extreme performance. Single field evaluations +take of the order of `100 µs`. For large input arrays (e.g. many observer +positions or many similar magnets) the computation time can drop below `1 µs` +per evaluation point on single state-of-the-art x86 mobile cores (tested on +`Intel Core i5-8365U @ 1.60GHz`), depending on the source type. ## Numerical stability -Many expressions provided in the literature have very questionable numerical stability. Many of these problems are fixed in Magpylib, but one should be aware that accuracy can be a problem very close to objects, close the z-axis in cylindrical symmetries, at edge extensions, and at large distances. We are working on fixing these problems. Some details can be found in [^12]. +Many expressions provided in the literature have very questionable numerical +stability. Many of these problems are fixed in Magpylib, but one should be aware +that accuracy can be a problem very close to objects, close the z-axis in +cylindrical symmetries, at edge extensions, and at large distances. We are +working on fixing these problems. Some details can be found in [^12]. **References** -[^1]: Z. J. Yang et al., "Potential and force between a magnet and a bulk Y1Ba2Cu3O7-d superconductor studied by a mechanical pendulum", Superconductor Science and Technology 3(12):591, 1990 - -[^2]: R. Engel-Herbert et al., Journal of Applied Physics 97(7):074504 - 074504-4 (2005) - -[^3]: J.M. Camacho and V. Sosa, "Alternative method to calculate the magnetic field of permanent magnets with azimuthal symmetry", Revista Mexicana de Fisica E 59 8–17, 2013 - -[^4]: D. Cichon, R. Psiuk and H. Brauer, "A Hall-Sensor-Based Localization Method With Six Degrees of Freedom Using Unscented Kalman Filter", IEEE Sensors Journal, Vol. 19, No. 7, April 1, 2019. - -[^5]: E. P. Furlani, S. Reanik and W. Janson, "A Three-Dimensional Field Solution for Bipolar Cylinders", IEEE Transaction on Magnetics, VOL. 30, NO. 5, 1994 - -[^6]: N. Derby, "Cylindrical Magnets and Ideal Solenoids", arXiv:0909.3880v1, 2009 - -[^7]: A. Caciagli, R. J. Baars, A. P. Philipse and B. W. M. Kuipers, "Exact expression for the magnetic field of a finite cylinder with arbitrary uniform magnetization", Journal of Magnetism and Magnetic Materials 456 (2018) 423–432. - -[^8]: F. Slanovc, M. Ortner, M. Moridi, C. Abert and D. Suess, "Full analytical solution for the magnetic field of uniformly magnetized cylinder tiles", submitted to Journal of Magnetism and Magnetic Materials. - -[^9]: D. Guptasarma and B. Singh, "New scheme for computing the magnetic field resulting from a uniformly magnetized arbitrary polyhedron", Geophysics (1999), 64(1):70. - -[^10]: J.L.G. Janssen, J.J.H. Paulides and E.A. Lomonova, "3D ANALYTICAL FIELD CALCULATION USING TRIANGULAR MAGNET SEGMENTS APPLIED TO A SKEWED LINEAR PERMANENT MAGNET ACTUATOR", ISEF 2009 - XIV International Symposium on Electromagnetic Fields in Mechatronics, Electrical and Electronic Engineering Arras, France, September 10-12, 2009 - -[^11]: C. Rubeck et al., "Analytical Calculation of Magnet Systems: Magnetic Field Created by Charged Triangles and Polyhedra", IEEE Transactions on Magnetics, VOL. 49, NO. 1, 2013 - -[^12]: M. Ortner, S. Slanovc and P. Leitner, "Numerically Stable and Computationally Efficient Expression for the Magnetic Field of a Current Loop", MDPI Magnetism, 3(1), 11-31, 2022. +[^1]: + Z. J. Yang et al., "Potential and force between a magnet and a bulk + Y1Ba2Cu3O7-d superconductor studied by a mechanical pendulum", + Superconductor Science and Technology 3(12):591, 1990 + +[^2]: + R. Engel-Herbert et al., Journal of Applied Physics 97(7):074504 - 074504-4 + (2005) + +[^3]: + J.M. Camacho and V. Sosa, "Alternative method to calculate the magnetic + field of permanent magnets with azimuthal symmetry", Revista Mexicana de + Fisica E 59 8–17, 2013 + +[^4]: + D. Cichon, R. Psiuk and H. Brauer, "A Hall-Sensor-Based Localization Method + With Six Degrees of Freedom Using Unscented Kalman Filter", IEEE Sensors + Journal, Vol. 19, No. 7, April 1, 2019. + +[^5]: + E. P. Furlani, S. Reanik and W. Janson, "A Three-Dimensional Field Solution + for Bipolar Cylinders", IEEE Transaction on Magnetics, VOL. 30, NO. 5, 1994 + +[^6]: + N. Derby, "Cylindrical Magnets and Ideal Solenoids", arXiv:0909.3880v1, 2009 + +[^7]: + A. Caciagli, R. J. Baars, A. P. Philipse and B. W. M. Kuipers, "Exact + expression for the magnetic field of a finite cylinder with arbitrary + uniform magnetization", Journal of Magnetism and Magnetic Materials 456 + (2018) 423–432. + +[^8]: + F. Slanovc, M. Ortner, M. Moridi, C. Abert and D. Suess, "Full analytical + solution for the magnetic field of uniformly magnetized cylinder tiles", + submitted to Journal of Magnetism and Magnetic Materials. + +[^9]: + D. Guptasarma and B. Singh, "New scheme for computing the magnetic field + resulting from a uniformly magnetized arbitrary polyhedron", Geophysics + (1999), 64(1):70. + +[^10]: + J.L.G. Janssen, J.J.H. Paulides and E.A. Lomonova, "3D ANALYTICAL FIELD + CALCULATION USING TRIANGULAR MAGNET SEGMENTS APPLIED TO A SKEWED LINEAR + PERMANENT MAGNET ACTUATOR", ISEF 2009 - XIV International Symposium on + Electromagnetic Fields in Mechatronics, Electrical and Electronic + Engineering Arras, France, September 10-12, 2009 + +[^11]: + C. Rubeck et al., "Analytical Calculation of Magnet Systems: Magnetic Field + Created by Charged Triangles and Polyhedra", IEEE Transactions on Magnetics, + VOL. 49, NO. 1, 2013 + +[^12]: + M. Ortner, S. Slanovc and P. Leitner, "Numerically Stable and + Computationally Efficient Expression for the Magnetic Field of a Current + Loop", MDPI Magnetism, 3(1), 11-31, 2022. [^13]: J. D. Jackson, "Classical Electrodynamics", 1999 Wiley, New York -[^14]: R. Ravaud and G. Lamarquand, "Comparison of the coulombian and amperian current models for calculating the magnetic field produced by radially magnetized arc-shaped permanent magnets", HAL Id: hal-00412346 +[^14]: + R. Ravaud and G. Lamarquand, "Comparison of the coulombian and amperian + current models for calculating the magnetic field produced by radially + magnetized arc-shaped permanent magnets", HAL Id: hal-00412346 -[^15]: P. Malagò et al., Magnetic Position System Design Method Applied to Three-Axis Joystick Motion Tracking. Sensors, 2020, 20. Jg., Nr. 23, S. 6873. +[^15]: + P. Malagò et al., Magnetic Position System Design Method Applied to + Three-Axis Joystick Motion Tracking. Sensors, 2020, 20. Jg., Nr. 23, + S. 6873. diff --git a/docs/_pages/user_guide/guide_start_01_install.md b/docs/_pages/user_guide/guide_start_01_install.md index e8f1473e8..e351f5434 100644 --- a/docs/_pages/user_guide/guide_start_01_install.md +++ b/docs/_pages/user_guide/guide_start_01_install.md @@ -2,28 +2,27 @@ ## Dependencies and Synergies -Magpylib supports *Python3.10+* and relies on common scientific computation libraries *NumPy* and *Scipy* for computation, and *Matplotlib* and *Plotly* for graphic outputs. +Magpylib supports _Python3.10+_ and relies on common scientific computation +libraries _NumPy_ and _Scipy_ for computation, and _Matplotlib_ and _Plotly_ for +graphic outputs. -Optionally, *Pyvista* is supported as graphical backend, as well as *Pandas* for the field computation output. +Optionally, _Pyvista_ is supported as graphical backend, as well as _Pandas_ for +the field computation output. ## Installation -::::{grid} 1 1 2 2 -:margin: 4 4 0 0 -:gutter: 4 +::::{grid} 1 1 2 2 :margin: 4 4 0 0 :gutter: 4 + +:::{grid-item-card} Install with pip: :text-align: center :shadow: none -:::{grid-item-card} Install with pip: -:text-align: center -:shadow: none ```console pip install magpylib ``` -::: -:::{grid-item-card} Install with conda: -:text-align: center -:shadow: none + +::: :::{grid-item-card} Install with conda: :text-align: center :shadow: none + ```console conda install -c conda-forge magpylib ``` -::: -:::: + +::: :::: diff --git a/docs/_pages/user_guide/guide_start_02_fundamentals.md b/docs/_pages/user_guide/guide_start_02_fundamentals.md index a8f18ca35..85b45ffad 100644 --- a/docs/_pages/user_guide/guide_start_02_fundamentals.md +++ b/docs/_pages/user_guide/guide_start_02_fundamentals.md @@ -1,11 +1,16 @@ (getting-started)= + # The Magpylib fundamentals -In this section we present the most important Magpylib features, focussing on the intuitive object-oriented interface. +In this section we present the most important Magpylib features, focussing on +the intuitive object-oriented interface. ## Basic features -Learn the Magpylib fundamentals (create magnets, view system, compute field) in 5 minutes. This requires a basic understanding of the Python programming language, the [NumPy array class](https://numpy.org/doc/stable/) and the [Scipy Rotation class](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html). +Learn the Magpylib fundamentals (create magnets, view system, compute field) in +5 minutes. This requires a basic understanding of the Python programming +language, the [NumPy array class](https://numpy.org/doc/stable/) and the +[Scipy Rotation class](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html). ```{hint} Since v5 all Magpylib inputs and ouputs are by default in SI-units. See {ref}`guide-docs-io-scale-invariance` for convenient use. @@ -13,7 +18,9 @@ Since v5 all Magpylib inputs and ouputs are by default in SI-units. See {ref}`gu ### Create sources and observers as Python objects -In the object oriented interface sources of the magnetic field (magnets, currents, others) and observers of the magnetic field (sensors) are created as Python objects. +In the object oriented interface sources of the magnetic field (magnets, +currents, others) and observers of the magnetic field (sensors) are created as +Python objects. ```python import magpylib as magpy @@ -22,7 +29,7 @@ import magpylib as magpy # of 1 T pointing in x-direction and sides of # 1,2 and 3 cm respectively (notice the use of SI units). -cube = magpy.magnet.Cuboid(polarization=(1,0,0), dimension=(0.01,0.02,0.03)) +cube = magpy.magnet.Cuboid(polarization=(1, 0, 0), dimension=(0.01, 0.02, 0.03)) # Create a Sensor for measuring the field @@ -33,71 +40,78 @@ Find detailed information on the Magpylib classes [here](docs-classes). ### Position and orientation -All Magpylib objects (sources and observers) have position and orientation in a global Cartesian coordinate system that can be manipulated. +All Magpylib objects (sources and observers) have position and orientation in a +global Cartesian coordinate system that can be manipulated. ```python # By default, the position of a Magpylib object is # (0,0,0) and its orientation is the unit rotation, # given by a scipy rotation object. -print(cube.position) # -> [0. 0. 0.] -print(cube.orientation.as_rotvec()) # -> [0. 0. 0.] +print(cube.position) # -> [0. 0. 0.] +print(cube.orientation.as_rotvec()) # -> [0. 0. 0.] # Manipulate object position and orientation through # the respective attributes (move 10 mm and rotate 45 deg): from scipy.spatial.transform import Rotation as R -cube.position = (0.01,0,0) -cube.orientation = R.from_rotvec((0,0,45), degrees=True) -print(cube.position) # -> [0.01 0. 0. ] -print(cube.orientation.as_rotvec(degrees=True)) # -> [0. 0. 45.] +cube.position = (0.01, 0, 0) +cube.orientation = R.from_rotvec((0, 0, 45), degrees=True) + +print(cube.position) # -> [0.01 0. 0. ] +print(cube.orientation.as_rotvec(degrees=True)) # -> [0. 0. 45.] # Apply relative motion with the powerful `move` # and `rotate` methods. -sensor.move((-0.01,0,0)) -sensor.rotate_from_angax(angle=-45, axis='z') +sensor.move((-0.01, 0, 0)) +sensor.rotate_from_angax(angle=-45, axis="z") -print(sensor.position) # -> [-0.01 0. 0. ] -print(sensor.orientation.as_rotvec(degrees=True)) # -> [ 0. 0. -45.] +print(sensor.position) # -> [-0.01 0. 0. ] +print(sensor.orientation.as_rotvec(degrees=True)) # -> [ 0. 0. -45.] ``` -Find detailed information on position and orientation attributes and how to manipulate them [here](docs-position). +Find detailed information on position and orientation attributes and how to +manipulate them [here](docs-position). ### 3D view of objects -In-built 3D graphic output helps to see if all Magpylib objects are positioned properly. The magnet polarization is represented by default by a 3-color scheme, the sensor by an axes cross. +In-built 3D graphic output helps to see if all Magpylib objects are positioned +properly. The magnet polarization is represented by default by a 3-color scheme, +the sensor by an axes cross. ```python # Use the `show` function to view your system # through Matplotlib, Plotly or Pyvista backends. -magpy.show(cube, sensor, backend='plotly') +magpy.show(cube, sensor, backend="plotly") ``` -Detailed information on the graphical output with `show` is given [here](guide-graphics). +Detailed information on the graphical output with `show` is given +[here](guide-graphics). ### Computing the field -The field can be computed at sensor objects, or simply by specifying a position of interest. +The field can be computed at sensor objects, or simply by specifying a position +of interest. ```python # Compute the B-field for some positions. -points = [(0,0,-.01), (0,0,0), (0,0,.01)] # in SI Units (m) +points = [(0, 0, -0.01), (0, 0, 0), (0, 0, 0.01)] # in SI Units (m) B = magpy.getB(cube, points) -print(B.round(2)) # -> [[ 0.26 0.07 0.08] - # [ 0.28 0.05 0. ] - # [ 0.26 0.07 -0.08]] # in SI Units (T) +print(B.round(2)) # -> [[ 0.26 0.07 0.08] +# [ 0.28 0.05 0. ] +# [ 0.26 0.07 -0.08]] # in SI Units (T) # Compute the H-field at the sensor. H = magpy.getH(cube, sensor) -print(H.round()) # -> [51017. 24210. 0.] # in SI Units (A/m) +print(H.round()) # -> [51017. 24210. 0.] # in SI Units (A/m) ``` ```{hint} @@ -108,64 +122,68 @@ Detailed information on field computation is provided [here](docs-fieldcomp). ## Advanced features -While most things can be achieved with the above, the following features will make your live much easier. +While most things can be achieved with the above, the following features will +make your live much easier. ### Paths -Magpylib position and orientation attributes can store multiple values that are referred to as paths. The field will automatically be computed for all path positions. Use this feature to model objects that move to multiple locations. +Magpylib position and orientation attributes can store multiple values that are +referred to as paths. The field will automatically be computed for all path +positions. Use this feature to model objects that move to multiple locations. ```python import numpy as np import magpylib as magpy # Create magnet -sphere = magpy.magnet.Sphere( - diameter=.01, - polarization=(0,0,1) -) +sphere = magpy.magnet.Sphere(diameter=0.01, polarization=(0, 0, 1)) # Assign a path -sphere.position = np.linspace((-.02,0,0), (.02,0,0), 7) +sphere.position = np.linspace((-0.02, 0, 0), (0.02, 0, 0), 7) # The field is automatically computed for every path position -B = sphere.getB((0,0,.01)) +B = sphere.getB((0, 0, 0.01)) print(B.round(3)) # ->[[ 0.004 0. -0.001] - # [ 0.013 0. 0.001] - # [ 0.033 0. 0.026] - # [ 0. 0. 0.083] - # [-0.033 0. 0.026] - # [-0.013 0. 0.001] - # [-0.004 0. -0.001]] +# [ 0.013 0. 0.001] +# [ 0.033 0. 0.026] +# [ 0. 0. 0.083] +# [-0.033 0. 0.026] +# [-0.013 0. 0.001] +# [-0.004 0. -0.001]] ``` More information on paths is provided [here](docs-position). ### Collections -Magpylib objects can be grouped into Collections. An operation applied to a Collection is applied to every object in it. The Collection itself behaves like a single source object. + +Magpylib objects can be grouped into Collections. An operation applied to a +Collection is applied to every object in it. The Collection itself behaves like +a single source object. ```python import magpylib as magpy # Create objects obj1 = magpy.Sensor() -obj2 = magpy.magnet.Cuboid( - polarization=(0,0,1), - dimension=(.01,.02,.03)) +obj2 = magpy.magnet.Cuboid(polarization=(0, 0, 1), dimension=(0.01, 0.02, 0.03)) # Group objects coll = magpy.Collection(obj1, obj2) # Manipulate Collection -coll.move((.001,.002,.003)) +coll.move((0.001, 0.002, 0.003)) -print(obj1.position) # -> [0.001 0.002 0.003] -print(obj2.position) # -> [0.001 0.002 0.003] +print(obj1.position) # -> [0.001 0.002 0.003] +print(obj2.position) # -> [0.001 0.002 0.003] ``` Collections are dicussed in detail [here](guide-docs-classes-collections). ### Complex Magnet Shapes -There most convenient way to create a magnet with complex shape is by using the convex hull of a point cloud (= simplest geometric form that includes all given points) and transform it into a triangular surface mesh. + +There most convenient way to create a magnet with complex shape is by using the +convex hull of a point cloud (= simplest geometric form that includes all given +points) and transform it into a triangular surface mesh. ```python import numpy as np @@ -173,16 +191,14 @@ import numpy as np import magpylib as magpy # Create a Pyramid magnet -points = ( - np.array( - [ - (-1, -1, 0), - (-1, 1, 0), - (1, -1, 0), - (1, 1, 0), - (0, 0, 2), - ] - ) +points = np.array( + [ + (-1, -1, 0), + (-1, 1, 0), + (1, -1, 0), + (1, 1, 0), + (0, 0, 2), + ] ) pyramid = magpy.magnet.TriangularMesh.from_ConvexHull( magnetization=(0, 0, 1e6), @@ -192,12 +208,14 @@ pyramid = magpy.magnet.TriangularMesh.from_ConvexHull( # Display the magnet graphically pyramid.show() ``` - -There are several other possibilities to create complex magnet shapes. Some can be found in the [examples](examples-complex-magnet-shapes). + +There are several other possibilities to create complex magnet shapes. Some can +be found in the [examples](examples-complex-magnet-shapes). ### Graphic Styles + Magpylib offers many ways to customize the graphic output. ```python @@ -205,29 +223,32 @@ import magpylib as magpy # Create Cuboid magnet with custom style cube = magpy.magnet.Cuboid( - polarization=(0,0,1), - dimension=(.01,.01,.01), - style_color='r', - style_magnetization_mode='arrow' + polarization=(0, 0, 1), + dimension=(0.01, 0.01, 0.01), + style_color="r", + style_magnetization_mode="arrow", ) # Create Cylinder magnet with custom style cyl = magpy.magnet.Cylinder( - polarization=(0,0,1), - dimension=(.01,.01), - position=(.02,0,0), - style_magnetization_color_mode='bicolor', - style_magnetization_color_north='m', - style_magnetization_color_south='c', + polarization=(0, 0, 1), + dimension=(0.01, 0.01), + position=(0.02, 0, 0), + style_magnetization_color_mode="bicolor", + style_magnetization_color_north="m", + style_magnetization_color_south="c", ) magpy.show(cube, cyl) ``` + The many options for graphic styling can be found [here](guide-graphic-styles). ### Animation -Object paths can be animated. For this feature the plotly graphic backend is recommended. + +Object paths can be animated. For this feature the plotly graphic backend is +recommended. ```python import numpy as np @@ -236,23 +257,26 @@ import magpylib as magpy # Create magnet with path cube = magpy.magnet.Cuboid( - magnetization=(0,0,1), - dimension=(1,1,1), -) -cube.rotate_from_angax( - angle=np.linspace(10,360,18), - axis='x' + magnetization=(0, 0, 1), + dimension=(1, 1, 1), ) +cube.rotate_from_angax(angle=np.linspace(10, 360, 18), axis="x") # Generate an animation with `show` cube.show(animation=True, backend="plotly") ``` + -Nice animation examples are shown [here](examples-vis-animations), and a detailed discussion is provided [here](guide-graphic-animations). +Nice animation examples are shown [here](examples-vis-animations), and a +detailed discussion is provided [here](guide-graphic-animations). ### Functional interface -Magpylib's object oriented interface is convenient to work with but is also slowed down by object initialization and handling. The functional interface bypasses this load and enables fast field computation for an arbitrary set of input parameters. + +Magpylib's object oriented interface is convenient to work with but is also +slowed down by object initialization and handling. The functional interface +bypasses this load and enables fast field computation for an arbitrary set of +input parameters. ```python import magpylib as magpy @@ -266,8 +290,8 @@ B = magpy.getB( ) print(B.round(3)) # -> [[-0.043 0. 0.014] - # [ 0. 0. 0.135] - # [ 0.043 0. 0.014]] +# [ 0. 0. 0.135] +# [ 0.043 0. 0.014]] ``` Details on the functional interface are found [here](docs-field-functional). diff --git a/docs/_static/custom.css b/docs/_static/custom.css index d699c9c38..b53294376 100644 --- a/docs/_static/custom.css +++ b/docs/_static/custom.css @@ -1,39 +1,35 @@ #galleryimg { - background: red; + background: red; } /* fix image transparency in docu WTF? */ -html[data-theme=dark] .bd-content img:not(.only-dark):not(.dark-light) { - background: none; +html[data-theme="dark"] .bd-content img:not(.only-dark):not(.dark-light) { + background: none; } /* custom padding for index page*/ .sectiontext { - margin-top:-40px; + margin-top: -40px; } - /* hide vertical scrollbar - it always appears unwanted when there is no content */ .bd-sidebar { - overflow-y: auto; /* Change to auto to only show scrollbar when necessary */ + overflow-y: auto; /* Change to auto to only show scrollbar when necessary */ } - - /* Adjust the height to ensure it fits within the viewport */ /* .bd-sidebar { max-height: calc(100vh - var(--header-height, 0px)); } */ - /* Target the logo text */ .navbar-brand { - font-weight: bold; - font-size: 1.6em; + font-weight: bold; + font-size: 1.6em; } diff --git a/docs/_static/switcher.json b/docs/_static/switcher.json index 6fa25f9fd..291b20eba 100644 --- a/docs/_static/switcher.json +++ b/docs/_static/switcher.json @@ -1,24 +1,24 @@ [ - { - "version": "dev", - "url": "https://magpylib.readthedocs.io/en/latest/" - }, - { - "name": "5.1.1 (stable)", - "version": "5.1.1", - "url": "https://magpylib.readthedocs.io/en/stable", - "preferred": true - }, - { - "version": "4.5.1", - "url": "https://magpylib.readthedocs.io/en/4.5.1/" - }, - { - "version": "3.0.5", - "url": "https://magpylib.readthedocs.io/en/3.0.5/" - }, - { - "version": "2.3.0-beta", - "url": "https://magpylib.readthedocs.io/en/2.3.0-beta/" - } -] \ No newline at end of file + { + "version": "dev", + "url": "https://magpylib.readthedocs.io/en/latest/" + }, + { + "name": "5.1.1 (stable)", + "version": "5.1.1", + "url": "https://magpylib.readthedocs.io/en/stable", + "preferred": true + }, + { + "version": "4.5.1", + "url": "https://magpylib.readthedocs.io/en/4.5.1/" + }, + { + "version": "3.0.5", + "url": "https://magpylib.readthedocs.io/en/3.0.5/" + }, + { + "version": "2.3.0-beta", + "url": "https://magpylib.readthedocs.io/en/2.3.0-beta/" + } +] diff --git a/docs/_static/webcode/copybutton.js b/docs/_static/webcode/copybutton.js index 6ade74927..87baea833 100644 --- a/docs/_static/webcode/copybutton.js +++ b/docs/_static/webcode/copybutton.js @@ -1,65 +1,89 @@ // Copyright 2014 PSF. Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 // File originates from the cpython source found in https://docs.python.org/3/_static/copybutton.js -$(document).ready(function() { - /* Add a [>>>] button on the top-right corner of code samples to hide - * the >>> and ... prompts and the output and thus make the code - * copyable. */ - var div = $('.highlight-python .highlight,' + - '.highlight-default .highlight,' + - '.highlight-python3 .highlight') - var pre = div.find('pre'); +$(document).ready(function () { + /* Add a [>>>] button on the top-right corner of code samples to hide + * the >>> and ... prompts and the output and thus make the code + * copyable. */ + var div = $( + ".highlight-python .highlight," + + ".highlight-default .highlight," + + ".highlight-python3 .highlight", + ); + var pre = div.find("pre"); - // get the styles from the current theme - pre.parent().parent().css('position', 'relative'); - var hide_text = 'Hide the prompts and output'; - var show_text = 'Show the prompts and output'; - var border_width = pre.css('border-top-width'); - var border_style = pre.css('border-top-style'); - var border_color = pre.css('border-top-color'); - var button_styles = { - 'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0', - 'border-color': border_color, 'border-style': border_style, - 'border-width': border_width, 'color': border_color, 'text-size': '75%', - 'font-family': 'monospace', 'padding-left': '0.2em', 'padding-right': '0.2em', - 'border-radius': '0 3px 0 0' - } + // get the styles from the current theme + pre.parent().parent().css("position", "relative"); + var hide_text = "Hide the prompts and output"; + var show_text = "Show the prompts and output"; + var border_width = pre.css("border-top-width"); + var border_style = pre.css("border-top-style"); + var border_color = pre.css("border-top-color"); + var button_styles = { + cursor: "pointer", + position: "absolute", + top: "0", + right: "0", + "border-color": border_color, + "border-style": border_style, + "border-width": border_width, + color: border_color, + "text-size": "75%", + "font-family": "monospace", + "padding-left": "0.2em", + "padding-right": "0.2em", + "border-radius": "0 3px 0 0", + }; - // create and add the button to all the code blocks that contain >>> - div.each(function(index) { - var jthis = $(this); - if (jthis.find('.gp').length > 0) { - var button = $('Click to Hide >>>'); - button.css(button_styles) - button.attr('title', hide_text); - button.data('hidden', 'false'); - jthis.prepend(button); - } - // tracebacks (.gt) contain bare text elements that need to be - // wrapped in a span to work with .nextUntil() (see later) - jthis.find('pre:has(.gt)').contents().filter(function() { - return ((this.nodeType == 3) && (this.data.trim().length > 0)); - }).wrap(''); - }); + // create and add the button to all the code blocks that contain >>> + div.each(function (index) { + var jthis = $(this); + if (jthis.find(".gp").length > 0) { + var button = $( + 'Click to Hide >>>', + ); + button.css(button_styles); + button.attr("title", hide_text); + button.data("hidden", "false"); + jthis.prepend(button); + } + // tracebacks (.gt) contain bare text elements that need to be + // wrapped in a span to work with .nextUntil() (see later) + jthis + .find("pre:has(.gt)") + .contents() + .filter(function () { + return this.nodeType == 3 && this.data.trim().length > 0; + }) + .wrap(""); + }); - // define the behavior of the button when it's clicked - $('.copybutton').click(function(e){ - e.preventDefault(); - var button = $(this); - if (button.data('hidden') === 'false') { - // hide the code output - button.parent().find('.go, .gp, .gt').hide(); - button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden'); - button.css('text-decoration', 'line-through'); - button.attr('title', show_text); - button.data('hidden', 'true'); - } else { - // show the code output - button.parent().find('.go, .gp, .gt').show(); - button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible'); - button.css('text-decoration', 'none'); - button.attr('title', hide_text); - button.data('hidden', 'false'); - } - }); + // define the behavior of the button when it's clicked + $(".copybutton").click(function (e) { + e.preventDefault(); + var button = $(this); + if (button.data("hidden") === "false") { + // hide the code output + button.parent().find(".go, .gp, .gt").hide(); + button + .next("pre") + .find(".gt") + .nextUntil(".gp, .go") + .css("visibility", "hidden"); + button.css("text-decoration", "line-through"); + button.attr("title", show_text); + button.data("hidden", "true"); + } else { + // show the code output + button.parent().find(".go, .gp, .gt").show(); + button + .next("pre") + .find(".gt") + .nextUntil(".gp, .go") + .css("visibility", "visible"); + button.css("text-decoration", "none"); + button.attr("title", hide_text); + button.data("hidden", "false"); + } + }); }); diff --git a/docs/_static/webcode/summaryOpen.js b/docs/_static/webcode/summaryOpen.js index 5fe9aa024..878cec8c1 100644 --- a/docs/_static/webcode/summaryOpen.js +++ b/docs/_static/webcode/summaryOpen.js @@ -1,16 +1,22 @@ -$(document).ready(function() { - $('a[href^="#"]').on('click', function(e) { - e.preventDefault(); - var target = this.hash, - $target = $(target); - $(target + ' details').attr('open', true); +$(document).ready(function () { + $('a[href^="#"]').on("click", function (e) { + e.preventDefault(); + var target = this.hash, + $target = $(target); + $(target + " details").attr("open", true); - $('html, body').stop().animate({ - 'scrollTop': $target.offset().top - }, 500, 'swing', function() { - window.location.hash = target; - }); - - }); + $("html, body") + .stop() + .animate( + { + scrollTop: $target.offset().top, + }, + 500, + "swing", + function () { + window.location.hash = target; + }, + ); }); +}); //https://stackoverflow.com/a/48258026/11028959 diff --git a/docs/index.md b/docs/index.md index 677fceb72..7bde09b9f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,38 +1,27 @@ # Magpylib Documentation -Magpylib is an **open-source Python package** for calculating static **magnetic fields** of magnets, currents, and other sources. It uses **analytical expressions**, solutions to macroscopic magnetostatic problems, implemented in **vectorized** form which makes the computation **extremely fast** and leverages the open-source Python ecosystem for spectacular visualizations! +Magpylib is an **open-source Python package** for calculating static **magnetic +fields** of magnets, currents, and other sources. It uses **analytical +expressions**, solutions to macroscopic magnetostatic problems, implemented in +**vectorized** form which makes the computation **extremely fast** and leverages +the open-source Python ecosystem for spectacular visualizations!

Resources

-::::{grid} 1 2 3 3 -:margin: 4 4 0 0 -:gutter: 2 - -:::{grid-item-card} -:link: getting-started -:link-type: ref -:link-alt: link to Getting Started -:img-top: _static/images/index_icon_get_started.png -:text-align: center -**Getting Started** -::: - -:::{grid-item-card} -:link: examples -:link-type: ref -:link-alt: link to Examples -:img-top: _static/images/index_icon_examples.png -:text-align: center -**Examples** -::: - -:::{grid-item-card} -:link: https://www.sciencedirect.com/science/article/pii/S2352711020300170 -:link-alt: link to Journal -:img-top: _static/images/index_icon_academic.png -:text-align: center -**Scientific Reference** -::: +::::{grid} 1 2 3 3 :margin: 4 4 0 0 :gutter: 2 + +:::{grid-item-card} :link: getting-started :link-type: ref :link-alt: link to +Getting Started :img-top: \_static/images/index_icon_get_started.png +:text-align: center **Getting Started** ::: + +:::{grid-item-card} :link: examples :link-type: ref :link-alt: link to Examples +:img-top: \_static/images/index_icon_examples.png :text-align: center +**Examples** ::: + +:::{grid-item-card} :link: +https://www.sciencedirect.com/science/article/pii/S2352711020300170 :link-alt: +link to Journal :img-top: \_static/images/index_icon_academic.png :text-align: +center **Scientific Reference** ::: :::: @@ -40,8 +29,12 @@ Magpylib is an **open-source Python package** for calculating static **magnetic ![](_static/images/index_flowchart.png) -In Magpylib, **sources** (magnets, currents, ...) and **observers** (sensors, position grids, ...) are created as Python objects with position and orientation attributes. These objects can be **grouped** and **moved** around. The system can be **viewed** graphically through various backends. The **magnetic field** is computed in the observer reference frame. Magpylib collects all inputs, and vectorizes the computation for maximal performance. - +In Magpylib, **sources** (magnets, currents, ...) and **observers** (sensors, +position grids, ...) are created as Python objects with position and orientation +attributes. These objects can be **grouped** and **moved** around. The system +can be **viewed** graphically through various backends. The **magnetic field** +is computed in the observer reference frame. Magpylib collects all inputs, and +vectorizes the computation for maximal performance. ```{toctree} :maxdepth: 2 From b7457156e3af3df23cb099e314806a3c94a43aa6 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sat, 26 Apr 2025 23:29:14 +0200 Subject: [PATCH 140/211] back to original docs --- .pre-commit-config.yaml | 1 + docs/README.md | 29 +- docs/_pages/API_reference.md | 1 - docs/_pages/changelog_.md | 6 +- .../contributing/cont_code_of_conduct.md | 3 +- docs/_pages/contributing/cont_contributing.md | 3 +- docs/_pages/contributing/cont_index.md | 3 +- docs/_pages/contributing/cont_license.md | 12 +- docs/_pages/user_guide/docs/docs_classes.md | 536 ++++++++---------- docs/_pages/user_guide/docs/docs_fieldcomp.md | 126 ++-- docs/_pages/user_guide/docs/docs_graphics.md | 199 ++----- .../user_guide/docs/docs_magpylib_force.md | 70 +-- docs/_pages/user_guide/docs/docs_pos_ori.md | 258 ++++----- docs/_pages/user_guide/docs/docs_styles.md | 153 ++--- .../user_guide/docs/docs_units_types.md | 47 +- .../user_guide/examples/examples_app_coils.md | 182 ------ .../examples/examples_app_end_of_shaft.md | 102 ---- .../examples/examples_app_halbach.md | 91 --- .../examples/examples_app_scales.md | 24 - .../examples/examples_force_floating.md | 269 --------- .../examples/examples_force_force.md | 65 --- .../examples/examples_force_holding_force.md | 56 -- .../user_guide/examples/examples_index.md | 180 ------ .../examples/examples_misc_compound.md | 223 -------- .../examples_misc_field_interpolation.md | 176 ------ .../examples/examples_misc_inhom.md | 170 ------ .../examples/examples_shapes_cad.md | 46 -- .../examples/examples_shapes_convex_hull.md | 50 -- .../examples/examples_shapes_pyvista.md | 127 ----- .../examples/examples_shapes_superpos.md | 215 ------- .../examples/examples_shapes_triangle.md | 225 -------- .../examples/examples_tutorial_collection.md | 299 ---------- .../examples/examples_tutorial_custom.md | 267 --------- .../examples_tutorial_field_computation.md | 288 ---------- .../examples_tutorial_modeling_magnets.md | 194 ------- .../examples/examples_tutorial_paths.md | 220 ------- .../examples/examples_vis_animations.md | 316 ----------- .../examples/examples_vis_magnet_colors.md | 79 --- .../examples/examples_vis_mpl_streamplot.md | 143 ----- .../examples/examples_vis_pv_streamlines.md | 75 --- .../examples/examples_vis_subplots.md | 110 ---- docs/_pages/user_guide/examples/logo.stl | Bin 57384 -> 0 bytes docs/_pages/user_guide/guide_index.md | 4 +- .../user_guide/guide_resources_01_physics.md | 223 ++------ .../user_guide/guide_start_01_install.md | 27 +- .../user_guide/guide_start_02_fundamentals.md | 67 +-- docs/_static/custom.css | 18 +- docs/_static/switcher.json | 44 +- docs/_static/webcode/copybutton.js | 140 ++--- docs/_static/webcode/summaryOpen.js | 32 +- docs/index.md | 57 +- 51 files changed, 784 insertions(+), 5467 deletions(-) delete mode 100644 docs/_pages/user_guide/examples/examples_app_coils.md delete mode 100644 docs/_pages/user_guide/examples/examples_app_end_of_shaft.md delete mode 100644 docs/_pages/user_guide/examples/examples_app_halbach.md delete mode 100644 docs/_pages/user_guide/examples/examples_app_scales.md delete mode 100644 docs/_pages/user_guide/examples/examples_force_floating.md delete mode 100644 docs/_pages/user_guide/examples/examples_force_force.md delete mode 100644 docs/_pages/user_guide/examples/examples_force_holding_force.md delete mode 100644 docs/_pages/user_guide/examples/examples_index.md delete mode 100644 docs/_pages/user_guide/examples/examples_misc_compound.md delete mode 100644 docs/_pages/user_guide/examples/examples_misc_field_interpolation.md delete mode 100644 docs/_pages/user_guide/examples/examples_misc_inhom.md delete mode 100644 docs/_pages/user_guide/examples/examples_shapes_cad.md delete mode 100644 docs/_pages/user_guide/examples/examples_shapes_convex_hull.md delete mode 100644 docs/_pages/user_guide/examples/examples_shapes_pyvista.md delete mode 100644 docs/_pages/user_guide/examples/examples_shapes_superpos.md delete mode 100644 docs/_pages/user_guide/examples/examples_shapes_triangle.md delete mode 100644 docs/_pages/user_guide/examples/examples_tutorial_collection.md delete mode 100644 docs/_pages/user_guide/examples/examples_tutorial_custom.md delete mode 100644 docs/_pages/user_guide/examples/examples_tutorial_field_computation.md delete mode 100644 docs/_pages/user_guide/examples/examples_tutorial_modeling_magnets.md delete mode 100644 docs/_pages/user_guide/examples/examples_tutorial_paths.md delete mode 100644 docs/_pages/user_guide/examples/examples_vis_animations.md delete mode 100644 docs/_pages/user_guide/examples/examples_vis_magnet_colors.md delete mode 100644 docs/_pages/user_guide/examples/examples_vis_mpl_streamplot.md delete mode 100644 docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md delete mode 100644 docs/_pages/user_guide/examples/examples_vis_subplots.md delete mode 100644 docs/_pages/user_guide/examples/logo.stl diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5978c50f9..245c50e1e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -40,6 +40,7 @@ repos: - id: prettier types_or: [yaml, markdown, html, css, scss, javascript, json] args: [--prose-wrap=always] + exclude: ^docs/ # messes up colon fences for grids in docs - repo: https://github.com/astral-sh/ruff-pre-commit rev: "v0.11.5" diff --git a/docs/README.md b/docs/README.md index 662e2c965..bc95c1e35 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,32 +1,9 @@ ## About Magpylib Documentation -The Documentation is built with [Sphinx](http://www.sphinx-doc.org/en/main/) and -the configuration file is [conf.py](./conf.py). Files get converted to `.html` -files by Sphinx during build time. Images, web code and videos are kept in the -[\_static](./_static) folder. +The Documentation is built with [Sphinx](http://www.sphinx-doc.org/en/main/) and the configuration file is [conf.py](./conf.py). Files get converted to `.html` files by Sphinx during build time. Images, web code and videos are kept in the [_static](./_static) folder. ### API docs - -The docstring format is under the -[NumPy Convention](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_numpy.html). -Sphinx is configured to read Docstring information from the codebase and convert -it into pages utilizing the -[autodoc extension](http://www.sphinx-doc.org/en/main/usage/extensions/autodoc.html). -The generated files are created at build time and put into a folder called -`_autogen` + The docstring format is under the [NumPy Convention](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_numpy.html). Sphinx is configured to read Docstring information from the codebase and convert it into pages utilizing the [autodoc extension](http://www.sphinx-doc.org/en/main/usage/extensions/autodoc.html). The generated files are created at build time and put into a folder called `_autogen` ### Handwritten documents - -Handwritten pages and guides are kept in the [\_pages](./_pages) folder. They -are all written in [Markdown](https://www.markdownguide.org/) using -[myst-parser](https://github.com/executablebooks/MyST-Parser) as interface. Some -documents like in the examples folder are dynamically computed with -[myst-nb](https://github.com/executablebooks/myst-nb) as jupyter notebooks. With -the help of the [jupytext](https://github.com/mwouts/jupytext) library ands its -jupyterlab extension, examples can be written and executed within the jupyterlab -ecosystem and saved as markdown file. It is recommended to use the -[jupyterlab-myst](https://github.com/executablebooks/jupyterlab-myst) extension -to be able to work with the full set of myst markdown flavor within jupyterlab. -When editing the docs with vscode, use the -[MyST-Markdown](https://marketplace.visualstudio.com/items?itemName=ExecutableBookProject.myst-highlight) -extension to visualize the rendered document. +Handwritten pages and guides are kept in the [_pages](./_pages) folder. They are all written in [Markdown](https://www.markdownguide.org/) using [myst-parser](https://github.com/executablebooks/MyST-Parser) as interface. Some documents like in the examples folder are dynamically computed with [myst-nb](https://github.com/executablebooks/myst-nb) as jupyter notebooks. With the help of the [jupytext](https://github.com/mwouts/jupytext) library ands its jupyterlab extension, examples can be written and executed within the jupyterlab ecosystem and saved as markdown file. It is recommended to use the [jupyterlab-myst](https://github.com/executablebooks/jupyterlab-myst) extension to be able to work with the full set of myst markdown flavor within jupyterlab. When editing the docs with vscode, use the [MyST-Markdown](https://marketplace.visualstudio.com/items?itemName=ExecutableBookProject.myst-highlight) extension to visualize the rendered document. diff --git a/docs/_pages/API_reference.md b/docs/_pages/API_reference.md index 5145a7e10..b44c5a2bc 100644 --- a/docs/_pages/API_reference.md +++ b/docs/_pages/API_reference.md @@ -1,5 +1,4 @@ (docu-APIref)= - # API reference The API reference includes all Magpylib docstrings. diff --git a/docs/_pages/changelog_.md b/docs/_pages/changelog_.md index 4d6fd7bd4..33ac9e8e5 100644 --- a/docs/_pages/changelog_.md +++ b/docs/_pages/changelog_.md @@ -1,9 +1,9 @@ -(changelog)= + +(changelog)= # Changelog -The changelog provides a compressed history of the Magpylib development since -its publication in 2019. +The changelog provides a compressed history of the Magpylib development since its publication in 2019. ```{include} ../../CHANGELOG.md :relative-docs: docs/ diff --git a/docs/_pages/contributing/cont_code_of_conduct.md b/docs/_pages/contributing/cont_code_of_conduct.md index b865cb81a..1dbcfc576 100644 --- a/docs/_pages/contributing/cont_code_of_conduct.md +++ b/docs/_pages/contributing/cont_code_of_conduct.md @@ -1,7 +1,8 @@ (code-of-conduct)= - # Code of Conduct + + ```{include} ../../../CODE_OF_CONDUCT.md :relative-docs: docs/ :relative-images: diff --git a/docs/_pages/contributing/cont_contributing.md b/docs/_pages/contributing/cont_contributing.md index f0e581579..ad09b1627 100644 --- a/docs/_pages/contributing/cont_contributing.md +++ b/docs/_pages/contributing/cont_contributing.md @@ -1,7 +1,8 @@ (contributing)= - # Contribution Guide + + ```{include} ../../../CONTRIBUTING.md :relative-docs: docs/ :relative-images: diff --git a/docs/_pages/contributing/cont_index.md b/docs/_pages/contributing/cont_index.md index ee8518596..3feaf1907 100644 --- a/docs/_pages/contributing/cont_index.md +++ b/docs/_pages/contributing/cont_index.md @@ -1,7 +1,6 @@ # Contributing -Magpylib is a free-of-use open-source project aiming to help researchers and -engineers with magnetic field computation. Your participation is most welcome! +Magpylib is a free-of-use open-source project aiming to help researchers and engineers with magnetic field computation. Your participation is most welcome! ```{toctree} :maxdepth: 2 diff --git a/docs/_pages/contributing/cont_license.md b/docs/_pages/contributing/cont_license.md index f2e4b4b63..fa4c916db 100644 --- a/docs/_pages/contributing/cont_license.md +++ b/docs/_pages/contributing/cont_license.md @@ -1,15 +1,15 @@ (license)= - # License + + ## Overview -Magpylib is published under the open source -[FreeBSD](https://www.freebsd.org/copyright/freebsd-license/) license. +Magpylib is published under the open source [FreeBSD](https://www.freebsd.org/copyright/freebsd-license/) license. -- _Permissions:_ Commercial use, Modification, Distribution, Private use -- _Limitations:_ Liability, Warranty -- _Conditions:_ License and copyright notice +- *Permissions:* Commercial use, Modification, Distribution, Private use +- *Limitations:* Liability, Warranty +- *Conditions:* License and copyright notice ## License Text diff --git a/docs/_pages/user_guide/docs/docs_classes.md b/docs/_pages/user_guide/docs/docs_classes.md index 7fe59be1b..4c3839971 100644 --- a/docs/_pages/user_guide/docs/docs_classes.md +++ b/docs/_pages/user_guide/docs/docs_classes.md @@ -1,172 +1,172 @@ (docs-classes)= - # The Magpylib Classes -In Magpylib's [object oriented interface](docs-fieldcomp-oo) magnetic field -**sources** (generate the field) and **observers** (read the field) are created -as Python objects with various defining attributes and methods. +In Magpylib's [object oriented interface](docs-fieldcomp-oo) magnetic field **sources** (generate the field) and **observers** (read the field) are created as Python objects with various defining attributes and methods. ## Base properties The following basic properties are shared by all Magpylib classes: -- The **position** and - **orientation** attributes describe the - object placement in the global coordinate system. +* The **position** and **orientation** attributes describe the object placement in the global coordinate system. -- The **move()** and - **rotate()** methods enable relative object - positioning. +* The **move()** and **rotate()** methods enable relative object positioning. -- The **reset_path()** method sets position - and orientation to default values. +* The **reset_path()** method sets position and orientation to default values. -- The **barycenter** property returns the - object barycenter (often the same as position). +* The **barycenter** property returns the object barycenter (often the same as position). See {ref}`docs-position` for more information on these features. -- The **style** attribute includes all - settings for graphical object representation. -- The **show()** method gives quick access to - the graphical representation. +* The **style** attribute includes all settings for graphical object representation. + +* The **show()** method gives quick access to the graphical representation. -See {ref}`guide-graphics` for more information on graphic output, default styles -and customization possibilities. +See {ref}`guide-graphics` for more information on graphic output, default styles and customization possibilities. -- The **getB()**, - **getH()**, - **getJ()** and - **getM()** methods give quick access to - field computation. +* The **getB()**, **getH()**, **getJ()** and **getM()** methods give quick access to field computation. See {ref}`docs-fieldcomp` for more information. -- The **parent** attribute references a - [Collection](guide-docs-classes-collections) that the object is part of. -- The **copy()** method creates a clone of - any object where selected properties, given by kwargs, are modified. +* The **parent** attribute references a [Collection](guide-docs-classes-collections) that the object is part of. + +* The **copy()** method creates a clone of any object where selected properties, given by kwargs, are modified. -- The **describe()** method provides a brief - description of the object and returns the unique object id. +* The **describe()** method provides a brief description of the object and returns the unique object id. + + +--------------------------------------------- ---- ## Local and global coordinates -::::{grid} 2 :::{grid-item} :columns: 9 Magpylib objects span a local reference -frame, and all object properties are defined within this frame, for example the -vertices of a `Tetrahedron` magnet. The position and orientation attributes -describe how the local frame lies within the global coordinates. The two frames -coincide by default, when `position=(0,0,0)` and `orientation=None` (=unit -rotation). The `position` and `orientation` attributes are described in detail -in {ref}`docs-position`. ::: :::{grid-item} :columns: 3 -![](../../../_static/images/docu_classes_init_global_local.png) ::: :::: +::::{grid} 2 +:::{grid-item} +:columns: 9 +Magpylib objects span a local reference frame, and all object properties are defined within this frame, for example the vertices of a `Tetrahedron` magnet. The position and orientation attributes describe how the local frame lies within the global coordinates. The two frames coincide by default, when `position=(0,0,0)` and `orientation=None` (=unit rotation). The `position` and `orientation` attributes are described in detail in {ref}`docs-position`. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_global_local.png) +::: +:::: ---- -(docu-magnet-classes)= +--------------------------------------------- + +(docu-magnet-classes)= ## Magnet classes -All magnets are sources. They have the -**polarization** attribute which is of the -format $\vec{J}=(J_x, J_y, J_z)$ and denotes a homogeneous magnetic polarization -vector in the local object coordinates in units of T. Alternatively, the -magnetization vector can be set via the -**magnetization** attribute of the format -$\vec{M}=(M_x, M_y, M_z)$. These two parameters are codependent and Magpylib -ensures that they stay in sync via the relation $\vec{J}=\mu_0\cdot\vec{M}$. -Information on how this is related to material properties from data sheets is -found in {ref}`examples-tutorial-modeling-magnets`. +All magnets are sources. They have the **polarization** attribute which is of the format $\vec{J}=(J_x, J_y, J_z)$ and denotes a homogeneous magnetic polarization vector in the local object coordinates in units of T. Alternatively, the magnetization vector can be set via the **magnetization** attribute of the format $\vec{M}=(M_x, M_y, M_z)$. These two parameters are codependent and Magpylib ensures that they stay in sync via the relation $\vec{J}=\mu_0\cdot\vec{M}$. Information on how this is related to material properties from data sheets is found in {ref}`examples-tutorial-modeling-magnets`. -### Cuboid +### Cuboid ```python magpylib.magnet.Cuboid( position, orientation, dimension, polarization, magnetization, style ) ``` -::::{grid} 2 :::{grid-item} :columns: 9 `Cuboid` objects represent magnets with -cuboid shape. The **dimension** attribute has -the format $(a,b,c)$ and denotes the sides of the cuboid units of meter. The -center of the cuboid lies in the origin of the local coordinates, and the sides -are parallel to the coordinate axes. ::: :::{grid-item} :columns: 3 -![](../../../_static/images/docu_classes_init_cuboid.png) ::: :::: +::::{grid} 2 +:::{grid-item} +:columns: 9 +`Cuboid` objects represent magnets with cuboid shape. The **dimension** attribute has the format $(a,b,c)$ and denotes the sides of the cuboid units of meter. The center of the cuboid lies in the origin of the local coordinates, and the sides are parallel to the coordinate axes. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_cuboid.png) +::: +:::: -### Cylinder +### Cylinder ```python magpylib.magnet.Cylinder( position, orientation, dimension, polarization, magnetization, style ) ``` -::::{grid} 2 :::{grid-item} :columns: 9 `Cylinder` objects represent magnets -with cylindrical shape. The **dimension** -attribute has the format $(d,h)$ and denotes diameter and height of the cylinder -in units of meter. The center of the cylinder lies in the origin of the local -coordinates, and the cylinder axis coincides with the z-axis. ::: :::{grid-item} -:columns: 3 ![](../../../_static/images/docu_classes_init_cylinder.png) ::: :::: +::::{grid} 2 +:::{grid-item} +:columns: 9 +`Cylinder` objects represent magnets with cylindrical shape. The **dimension** attribute has the format $(d,h)$ and denotes diameter and height of the cylinder in units of meter. The center of the cylinder lies in the origin of the local coordinates, and the cylinder axis coincides with the z-axis. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_cylinder.png) +::: +:::: -### CylinderSegment +### CylinderSegment ```python magpylib.magnet.CylinderSegment( position, orientation, dimension, polarization, magnetization, style ) ``` -::::{grid} 2 :::{grid-item} :columns: 9 `CylinderSegment` objects represent -magnets with the shape of a cylindrical ring section. The -**dimension** attribute has the format -$(r_1,r_2,h,\varphi_1,\varphi_2)$ and denotes inner radius, outer radius and -height in units of meter, and the two section angles $\varphi_1<\varphi_2$ in °. -The center of the full cylinder lies in the origin of the local coordinates, and -the cylinder axis coincides with the z-axis. ::: :::{grid-item} :columns: 3 -![](../../../_static/images/docu_classes_init_cylindersegment.png) ::: -:::{grid-item} :columns: 12 **Info:** When the cylinder section angles span -360°, then the much faster `Cylinder` methods are used for the field -computation. ::: :::: +::::{grid} 2 +:::{grid-item} +:columns: 9 +`CylinderSegment` objects represent magnets with the shape of a cylindrical ring section. The **dimension** attribute has the format $(r_1,r_2,h,\varphi_1,\varphi_2)$ and denotes inner radius, outer radius and height in units of meter, and the two section angles $\varphi_1<\varphi_2$ in °. The center of the full cylinder lies in the origin of the local coordinates, and the cylinder axis coincides with the z-axis. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_cylindersegment.png) +::: +:::{grid-item} +:columns: 12 +**Info:** When the cylinder section angles span 360°, then the much faster `Cylinder` methods are used for the field computation. +::: +:::: -### Sphere +### Sphere ```python magpylib.magnet.Sphere( position, orientation, diameter, polarization, magnetization, style ) ``` -::::{grid} 2 :::{grid-item} :columns: 9 `Sphere` objects represent magnets of -spherical shape. The **diameter** attribute -is the sphere diameter $d$ in units of meter. The center of the sphere lies in -the origin of the local coordinates. ::: :::{grid-item} :columns: 3 -![](../../../_static/images/docu_classes_init_sphere.png) ::: :::: +::::{grid} 2 +:::{grid-item} +:columns: 9 +`Sphere` objects represent magnets of spherical shape. The **diameter** attribute is the sphere diameter $d$ in units of meter. The center of the sphere lies in the origin of the local coordinates. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_sphere.png) +::: +:::: -### Tetrahedron +### Tetrahedron ```python magpylib.magnet.Tetrahedron( position, orientation, vertices, polarization, magnetization, style ) ``` -::::{grid} 2 :::{grid-item} :columns: 9 `Tetrahedron` objects represent magnets -of tetrahedral shape. The **vertices** -attribute stores the four corner points -$(\vec{P}_1, \vec{P}_2, \vec{P}_3, \vec{P}_4)$ in the local object coordinates -in units of m. ::: :::{grid-item} :columns: 3 -![](../../../_static/images/docu_classes_init_tetra.png) ::: :::{grid-item} -:columns: 12 **Info:** The `Tetrahedron` field is computed from four `Triangle` -fields. ::: :::: +::::{grid} 2 +:::{grid-item} +:columns: 9 +`Tetrahedron` objects represent magnets of tetrahedral shape. The **vertices** attribute stores the four corner points $(\vec{P}_1, \vec{P}_2, \vec{P}_3, \vec{P}_4)$ in the local object coordinates in units of m. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_tetra.png) +::: +:::{grid-item} +:columns: 12 +**Info:** The `Tetrahedron` field is computed from four `Triangle` fields. +::: +:::: (docu-magpylib-api-trimesh)= ### TriangularMesh - ```python magpylib.magnet.TriangularMesh( position, @@ -183,259 +183,225 @@ magpylib.magnet.TriangularMesh( ) ``` -::::{grid} 2 :::{grid-item} :columns: 9 `TriangularMesh` objects represent -magnets with surface given by a triangular mesh. The mesh is defined by the -**vertices** attribute, an array of all -unique corner points $(\vec{P}_1, \vec{P}_2, ...)$ in units of meter, and the -**faces** attribute, which is an array of -index-triplets that define individual faces $(\vec{F}_1, \vec{F}_2, ...)$. The -property **mesh** returns an array of all -faces as point-triples -$[(\vec{P}_1^1, \vec{P}_2^1, \vec{P}_3^1), (\vec{P}_1^2, \vec{P}_2^2, \vec{P}_3^2), ...]$. -::: :::{grid-item} :columns: 3 -![](../../../_static/images/docu_classes_init_trimesh.png) ::: :::{grid-item} -:columns: 12 At initialization the mesh integrity is automatically checked, and -all faces are reoriented to point outwards. These actions are controlled via the -kwargs - -- **check_open** -- **check_disconnected** -- **check_selfintersecting** -- **reorient_faces** - -which are all by default set to `"warn"`. Options are `"skip"` (don't perform -check), `"ignore"` (ignore if check fails), `"warn"` (warn if check fails), -`"raise"` (raise error if check fails). +::::{grid} 2 +:::{grid-item} +:columns: 9 +`TriangularMesh` objects represent magnets with surface given by a triangular mesh. The mesh is defined by the **vertices** attribute, an array of all unique corner points $(\vec{P}_1, \vec{P}_2, ...)$ in units of meter, and the **faces** attribute, which is an array of index-triplets that define individual faces $(\vec{F}_1, \vec{F}_2, ...)$. The property **mesh** returns an array of all faces as point-triples $[(\vec{P}_1^1, \vec{P}_2^1, \vec{P}_3^1), (\vec{P}_1^2, \vec{P}_2^2, \vec{P}_3^2), ...]$. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_trimesh.png) +::: +:::{grid-item} +:columns: 12 +At initialization the mesh integrity is automatically checked, and all faces are reoriented to point outwards. These actions are controlled via the kwargs +* **check_open** +* **check_disconnected** +* **check_selfintersecting** +* **reorient_faces** + +which are all by default set to `"warn"`. Options are `"skip"` (don't perform check), `"ignore"` (ignore if check fails), `"warn"` (warn if check fails), `"raise"` (raise error if check fails). Results of the checks are stored in the following object attributes - -- **status_open** can be `True`, `False` or - `None` (unchecked) -- **status_open_data** contains an array of - open edges -- **status_disconnected** can be `True`, - `False` or `None` (unchecked) -- **status_disconnected_data** contains an - array of mesh parts -- **status_selfintersecting** can be `True`, - `None` or `None` (unchecked) -- **status_selfintersecting_data** contains - an array of self-intersecting faces -- **status_reoriented** can be `True` or - `False` +* **status_open** can be `True`, `False` or `None` (unchecked) +* **status_open_data** contains an array of open edges +* **status_disconnected** can be `True`, `False` or `None` (unchecked) +* **status_disconnected_data** contains an array of mesh parts +* **status_selfintersecting** can be `True`, `None` or `None` (unchecked) +* **status_selfintersecting_data** contains an array of self-intersecting faces +* **status_reoriented** can be `True` or `False` The checks can also be performed after initialization using the methods - -- **check_open()** -- **check_disconnected()** -- **check_selfintersecting()** -- **reorient_faces()** +* **check_open()** +* **check_disconnected()** +* **check_selfintersecting()** +* **reorient_faces()** The following class methods enable easy mesh creating and mesh loading. -- **TriangularMesh.from_mesh()** generates a - `TriangularMesh` objects from the input - **mesh**, which is an array in the mesh - format - $[(\vec{P}_1^1, \vec{P}_2^1, \vec{P}_3^1), (\vec{P}_1^2, \vec{P}_2^2, \vec{P}_3^2), ...]$. -- **TriangularMesh.from_ConvexHull()** - generates a `TriangularMesh` object from the input - **points**, which is an array of positions - $(\vec{P}_1, \vec{P}_2, \vec{P}_3, ...)$ from which the convex Hull is - computed via the - [Scipy ConvexHull](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.ConvexHull.html) - implementation. -- **TriangularMesh.from_triangles()** - generates a `TriangularMesh` object from the input - **triangles**, which is a list or a - `Collection` of `Triangle` objects. -- **TriangularMesh.from_pyvista()** generates - a `TriangularMesh` object from the input - **polydata**, which is a - [Pyvista PolyData](https://docs.pyvista.org/version/stable/api/core/_autosummary/pyvista.PolyData.html) - object. - -The method **to_TriangleCollection()** -transforms a `TriangularMesh` object into a `Collection` of `Triangle` objects. - -**Info:** While the checks may be disabled, the field computation guarantees -correct results only if the mesh is closed, connected, not self-intersecting and -all faces are oriented outwards. Examples of working with the `TriangularMesh` -class are found in {ref}`examples-shapes-triangle` and in -{ref}`examples-shapes-pyvista`. ::: :::: - ---- +* **TriangularMesh.from_mesh()** generates a `TriangularMesh` objects from the input **mesh**, which is an array in the mesh format $[(\vec{P}_1^1, \vec{P}_2^1, \vec{P}_3^1), (\vec{P}_1^2, \vec{P}_2^2, \vec{P}_3^2), ...]$. +* **TriangularMesh.from_ConvexHull()** generates a `TriangularMesh` object from the input **points**, which is an array of positions $(\vec{P}_1, \vec{P}_2, \vec{P}_3, ...)$ from which the convex Hull is computed via the [Scipy ConvexHull](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.ConvexHull.html) implementation. +* **TriangularMesh.from_triangles()** generates a `TriangularMesh` object from the input **triangles**, which is a list or a `Collection` of `Triangle` objects. +* **TriangularMesh.from_pyvista()** generates a `TriangularMesh` object from the input **polydata**, which is a [Pyvista PolyData](https://docs.pyvista.org/version/stable/api/core/_autosummary/pyvista.PolyData.html) object. + +The method **to_TriangleCollection()** transforms a `TriangularMesh` object into a `Collection` of `Triangle` objects. + +**Info:** While the checks may be disabled, the field computation guarantees correct results only if the mesh is closed, connected, not self-intersecting and all faces are oriented outwards. Examples of working with the `TriangularMesh` class are found in {ref}`examples-shapes-triangle` and in {ref}`examples-shapes-pyvista`. +::: +:::: + + +--------------------------------------------- + ## Current classes -All currents are sources. Current objects have the -**current** attribute which is a scalar that -denotes the electrical current in units of ampere. +All currents are sources. Current objects have the **current** attribute which is a scalar that denotes the electrical current in units of ampere. ### Circle - ```python magpylib.current.Circle(position, orientation, diameter, current, style) ``` -::::{grid} 2 :::{grid-item} :columns: 9 `Circle` objects represent circular line -current loops. The **diameter** attribute is -the loop diameter $d$ in units of meter. The loop lies in the xy-plane with it's -center in the origin of the local coordinates. ::: :::{grid-item} :columns: 3 -![](../../../_static/images/docu_classes_init_loop.png) ::: :::: +::::{grid} 2 +:::{grid-item} +:columns: 9 +`Circle` objects represent circular line current loops. The **diameter** attribute is the loop diameter $d$ in units of meter. The loop lies in the xy-plane with it's center in the origin of the local coordinates. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_loop.png) +::: +:::: ### Polyline - ```python magpylib.current.Polyline(position, orientation, vertices, current, style) ``` -::::{grid} 2 :::{grid-item} :columns: 9 `Polyline` objects represent line -current segments where the electric current flows in straight lines from vertex -to vertex. The **vertices** attribute is a -vector of all vertices $(\vec{P}_1, \vec{P}_2, ...)$ given in the local -coordinates in units of meter. ::: :::{grid-item} :columns: 3 -![](../../../_static/images/docu_classes_init_line.png) ::: :::: +::::{grid} 2 +:::{grid-item} +:columns: 9 +`Polyline` objects represent line current segments where the electric current flows in straight lines from vertex to vertex. The **vertices** attribute is a vector of all vertices $(\vec{P}_1, \vec{P}_2, ...)$ given in the local coordinates in units of meter. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_line.png) +::: +:::: ---- +--------------------------------------------- ## Miscellaneous classes -There are classes listed hereon that function as sources, but they do not -represent physical magnets or current distributions. +There are classes listed hereon that function as sources, but they do not represent physical magnets or current distributions. -### Dipole +### Dipole ```python magpylib.misc.Dipole(position, orientation, moment, style) ``` -::::{grid} 2 :::{grid-item} :columns: 9 `Dipole` objects represent magnetic -dipole moments with the **moment** attribute -that describes the magnetic dipole moment $\vec{m}=(m_x,m_y,m_z)$ in SI-units of -Am², which lies in the origin of the local coordinates. ::: :::{grid-item} -:columns: 3 ![](../../../_static/images/docu_classes_init_dipole.png) ::: -:::{grid-item} :columns: 12 **Info:** The total dipole moment of a homogeneous -magnet with body volume $V$ is given by $\vec{m}=\vec{M}\cdot V$. ::: :::: +::::{grid} 2 +:::{grid-item} +:columns: 9 +`Dipole` objects represent magnetic dipole moments with the **moment** attribute that describes the magnetic dipole moment $\vec{m}=(m_x,m_y,m_z)$ in SI-units of Am², which lies in the origin of the local coordinates. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_dipole.png) +::: +:::{grid-item} +:columns: 12 +**Info:** The total dipole moment of a homogeneous magnet with body volume $V$ is given by $\vec{m}=\vec{M}\cdot V$. +::: +:::: -### Triangle +### Triangle ```python magpylib.misc.Triangle( position, orientation, vertices, polarization, magnetization, style ) ``` -::::{grid} 2 :::{grid-item} :columns: 9 `Triangle` objects represent triangular -surfaces with homogeneous charge density given by the projection of the -polarization or magnetization vector onto the surface normal. The attributes -**polarization** and -**magnetization** are treated similar as by -the {ref}`docu-magnet-classes`. The -**vertices** attribute is a set of the three -triangle corners $(\vec{P}_1, \vec{P}_2, \vec{P}_3)$ in units of meter in the -local coordinates. ::: :::{grid-item} :columns: 3 -![](../../../_static/images/docu_classes_init_triangle.png) ::: :::{grid-item} -:columns: 12 **Info:** When multiple Triangles with similar -magnetization/polarization vectors form a closed surface, and all their -orientations (right-hand-rule) point outwards, their total H-field is equivalent -to the field of a homogeneous magnet of the same shape. In this case, the -B-field is only correct on the outside of the body. On the inside the -polarization must be added to the field. This is demonstrated in the tutorial -{ref}`examples-shapes-triangle`. ::: :::: +::::{grid} 2 +:::{grid-item} +:columns: 9 +`Triangle` objects represent triangular surfaces with homogeneous charge density given by the projection of the polarization or magnetization vector onto the surface normal. The attributes **polarization** and **magnetization** are treated similar as by the {ref}`docu-magnet-classes`. The **vertices** attribute is a set of the three triangle corners $(\vec{P}_1, \vec{P}_2, \vec{P}_3)$ in units of meter in the local coordinates. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_triangle.png) +::: +:::{grid-item} +:columns: 12 +**Info:** When multiple Triangles with similar magnetization/polarization vectors form a closed surface, and all their orientations (right-hand-rule) point outwards, their total H-field is equivalent to the field of a homogeneous magnet of the same shape. In this case, the B-field is only correct on the outside of the body. On the inside the polarization must be added to the field. This is demonstrated in the tutorial {ref}`examples-shapes-triangle`. +::: +:::: (guide-docs-classes-custom-source)= - ### CustomSource - ```python magpylib.misc.CustomSource(field_func, position, orientation, style) ``` -::::{grid} 2 :::{grid-item} :columns: 9 The `CustomSource` class is used to -create user defined sources provided with with custom field computation -functions. The argument **field_func** takes -a function that is then automatically called for the field computation. This -custom field function is treated like a [core function](docs-field-core). It -must have the positional arguments `field` with values `"B"` or `"H"`, and -`observers` (must accept array with shape (n,3)) and return the B-field and the -H-field with a similar shape. ::: :::{grid-item} :columns: 3 -![](../../../_static/images/docu_classes_init_custom.png) ::: :::{grid-item} -:columns: 12 **Info:** A tutorial {ref}`examples-tutorial-custom` is found in -the examples. ::: :::: +::::{grid} 2 +:::{grid-item} +:columns: 9 +The `CustomSource` class is used to create user defined sources provided with with custom field computation functions. The argument **field_func** takes a function that is then automatically called for the field computation. This custom field function is treated like a [core function](docs-field-core). It must have the positional arguments `field` with values `"B"` or `"H"`, and `observers` (must accept array with shape (n,3)) and return the B-field and the H-field with a similar shape. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_custom.png) +::: +:::{grid-item} +:columns: 12 +**Info:** A tutorial {ref}`examples-tutorial-custom` is found in the examples. +::: +:::: ---- -## Sensor +--------------------------------------------- + +## Sensor ```python magpylib.Sensor(position, orientation, pixel, handedness, style) ``` -::::{grid} 2 :::{grid-item} :columns: 9 `Sensor` objects represent observers of -the magnetic field and can be used as Magpylib `observers` input for magnetic -field computation. The **pixel** attribute is -an array of positions $(\vec{P}_1, \vec{P}_2, ...)$ provided in units of meter -in the local sensor coordinates. A sensor returns the magnetic field at these -pixel positions. By default `pixel=(0,0,0)` and the sensor simply returns the -field at it's position. The **handedness** -attribute can be `"left"` or `"right"` (default) to set a left- or right-handed -sensor coordinate system for the field computation. ::: :::{grid-item} :columns: -3 ![](../../../_static/images/docu_classes_init_sensor.png) ::: :::{grid-item} -:columns: 12 **Info:** Sensors can have their own position and orientation and -enable easy relative positioning between sources and observers. The field is -always computed in the reference frame of the sensor, which might itself be -moving in the global coordinate system. Magpylib sensors can be understood as -perfect magnetic field sensors with infinitesimally sensitive elements. An -example how to use sensors is given in -{ref}`examples-tutorial-field-computation-sensors`. ::: :::: - ---- +::::{grid} 2 +:::{grid-item} +:columns: 9 +`Sensor` objects represent observers of the magnetic field and can be used as Magpylib `observers` input for magnetic field computation. The **pixel** attribute is an array of positions $(\vec{P}_1, \vec{P}_2, ...)$ provided in units of meter in the local sensor coordinates. A sensor returns the magnetic field at these pixel positions. By default `pixel=(0,0,0)` and the sensor simply returns the field at it's position. The **handedness** attribute can be `"left"` or `"right"` (default) to set a left- or right-handed sensor coordinate system for the field computation. +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_sensor.png) +::: +:::{grid-item} +:columns: 12 +**Info:** Sensors can have their own position and orientation and enable easy relative positioning between sources and observers. The field is always computed in the reference frame of the sensor, which might itself be moving in the global coordinate system. Magpylib sensors can be understood as perfect magnetic field sensors with infinitesimally sensitive elements. An example how to use sensors is given in {ref}`examples-tutorial-field-computation-sensors`. +::: +:::: -(guide-docs-classes-collections)= -## Collection +--------------------------------------------- + +(guide-docs-classes-collections)= +## Collection ```python magpylib.Collection(*children, position, orientation, override_parent, style) ``` -::::{grid} 2 :::{grid-item} :columns: 9 A `Collection` is a group of Magpylib -objects that is used for common manipulation. All these objects are stored by -reference in the **children** attribute. The -collection becomes the **parent** of the -object. An object can only have one parent. There are several options for -accessing only specific children via the following properties - -- **sources**: return only sources -- **observers**: return only observers -- **collections**: return only collections -- **sources_all**: return all sources, - including the ones from sub-collections -- **observers_all**: return all observers, - including the ones from sub-collections -- **collections_all**: return all - collections, including the ones from sub-collections +::::{grid} 2 +:::{grid-item} +:columns: 9 +A `Collection` is a group of Magpylib objects that is used for common manipulation. All these objects are stored by reference in the **children** attribute. The collection becomes the **parent** of the object. An object can only have one parent. There are several options for accessing only specific children via the following properties + +* **sources**: return only sources +* **observers**: return only observers +* **collections**: return only collections +* **sources_all**: return all sources, including the ones from sub-collections +* **observers_all**: return all observers, including the ones from sub-collections +* **collections_all**: return all collections, including the ones from sub-collections Additional methods for adding and removing children: - **add()**: Add an object to the collection -- **remove()**: Remove an object from the - collection ::: :::{grid-item} :columns: 3 - ![](../../../_static/images/docu_classes_init_collection.png) ::: - :::{grid-item} :columns: 12 **Info:** A collection object has its own - `position` and `orientation` attributes and spans a local reference frame for - all its children. An operation applied to a collection moves the frame and is - individually applied to all children such that their relative position in the - local reference frame is maintained. This means that the collection functions - as a container for manipulation, but child position and orientation are always - updated in the global coordinate system. After being added to a collection, it - is still possible to manipulate the individual children, which will also move - them to a new relative position in the collection frame. - -Collections have **format** as an additional argument for **describe()** method. -Default value is `format="type+id+label"`. Any combination of `"type"`, `"id"`, -and `"label"` is allowed. - -A tutorial {ref}`examples-tutorial-collection` is provided in the example -examples. ::: :::: +- **remove()**: Remove an object from the collection +::: +:::{grid-item} +:columns: 3 +![](../../../_static/images/docu_classes_init_collection.png) +::: +:::{grid-item} +:columns: 12 +**Info:** A collection object has its own `position` and `orientation` attributes and spans a local reference frame for all its children. An operation applied to a collection moves the frame and is individually applied to all children such that their relative position in the local reference frame is maintained. This means that the collection functions as a container for manipulation, but child position and orientation are always updated in the global coordinate system. After being added to a collection, it is still possible to manipulate the individual children, which will also move them to a new relative position in the collection frame. + +Collections have **format** as an additional argument for **describe()** method. Default value is `format="type+id+label"`. Any combination of `"type"`, `"id"`, and `"label"` is allowed. + +A tutorial {ref}`examples-tutorial-collection` is provided in the example examples. +::: +:::: diff --git a/docs/_pages/user_guide/docs/docs_fieldcomp.md b/docs/_pages/user_guide/docs/docs_fieldcomp.md index d4280ca24..0169fd07c 100644 --- a/docs/_pages/user_guide/docs/docs_fieldcomp.md +++ b/docs/_pages/user_guide/docs/docs_fieldcomp.md @@ -1,22 +1,13 @@ (docs-fieldcomp)= - # Field Computation -The following is a detailed technical documentation of Magpylib field -computation. The tutorial {ref}`examples-tutorial-field-computation` shows good -practices and illustrative examples. +The following is a detailed technical documentation of Magpylib field computation. +The tutorial {ref}`examples-tutorial-field-computation` shows good practices and illustrative examples. (docs-fieldcomp-oo)= - ## Object-oriented interface -The object-oriented interface relies on the idea that sources of the magnetic -field and observers thereof are created as Python objects which can be -manipulated at will, and called for field computation. This is done via four -top-level functions **getB**, -**getH**, -**getJ** and, -**getM**, +The object-oriented interface relies on the idea that sources of the magnetic field and observers thereof are created as Python objects which can be manipulated at will, and called for field computation. This is done via four top-level functions **getB**, **getH**, **getJ** and, **getM**, ```python magpylib.getB(sources, observers, squeeze=True, pixel_agg=None, output="ndarray") @@ -25,13 +16,7 @@ magpylib.getJ(sources, observers, squeeze=True, pixel_agg=None, output="ndarray" magpylib.getM(sources, observers, squeeze=True, pixel_agg=None, output="ndarray") ``` -that compute the respective fields B (B-field), H (H-field), J (polarization) or -M (magnetization) generated by `sources` as seen by the `observers` in their -local coordinates. `sources` can be any Magpylib source object (e.g. magnets) or -a flat list thereof. `observers` can be an array of position vectors with shape -`(n1,n2,n3,...,3)`, any Magpylib observer object (e.g. sensors), or a flat list -thereof. The following code shows a minimal example for Magpylib field -computation. +that compute the respective fields B (B-field), H (H-field), J (polarization) or M (magnetization) generated by `sources` as seen by the `observers` in their local coordinates. `sources` can be any Magpylib source object (e.g. magnets) or a flat list thereof. `observers` can be an array of position vectors with shape `(n1,n2,n3,...,3)`, any Magpylib observer object (e.g. sensors), or a flat list thereof. The following code shows a minimal example for Magpylib field computation. ```python import magpylib as magpy @@ -47,9 +32,7 @@ print(B) # --> [0. 0. 0.00125664] ``` -For quick access, the functions `getBHJM` are also methods of all Magpylib -objects, such that the `sources` or `observers` input is the object itself. The -above example can be continued as +For quick access, the functions `getBHJM` are also methods of all Magpylib objects, such that the `sources` or `observers` input is the object itself. The above example can be continued as ```python # Call getB as method of loop @@ -61,33 +44,19 @@ B = sens.getB(loop) with the same result for `B`. -By default, `getB` returns the B-field in units of T, `getH` the H-field in -units of A/m, `getJ` the magnetic polarization in T and, `getM` the -magnetization in A/m, assuming that all inputs are given in SI units as -described in the docstrings. +By default, `getB` returns the B-field in units of T, `getH` the H-field in units of A/m, `getJ` the magnetic polarization in T and, `getM` the magnetization in A/m, assuming that all inputs are given in SI units as described in the docstrings. ```{hint} In reality, `getB` is proportional to the `polarization` input and therefore returns the same unit. For example, with polarization input in mT, `getB` will return mT as well. At the same time when the `magnetization` input is kA/m, then `getH` returns kA/m as well. The B/H-field outputs are related to a M/J-inputs via a factor of $µ_0$. ``` -The output of a field computation `magpy.getB(sources, observers)` is by default -a NumPy array of shape `(l, m, k, n1, n2, n3, ..., 3)` where `l` is the number -of input sources, `m` the (maximal) object path length, `k` the number of -observers, `n1,n2,n3,...` the sensor pixel shape or the shape of the observer -position array input and `3` the three magnetic field components -$(B_x, B_y, B_z)$. +The output of a field computation `magpy.getB(sources, observers)` is by default a NumPy array of shape `(l, m, k, n1, n2, n3, ..., 3)` where `l` is the number of input sources, `m` the (maximal) object path length, `k` the number of observers, `n1,n2,n3,...` the sensor pixel shape or the shape of the observer position array input and `3` the three magnetic field components $(B_x, B_y, B_z)$. -- `squeeze`: If True (default) all axes of length 1 in the output (e.g. only a - single source) are squeezed. +* `squeeze`: If True (default) all axes of length 1 in the output (e.g. only a single source) are squeezed. -- `pixel_agg`: Select a compatible NumPy aggregator function (e.g. `"min"`, - `"mean"`) that is applied to the output. For example, with `pixel_agg="mean"` - the mean field of all observer points is returned. With this option it is - possible to supply `getBHJM` with multiple observers that have different pixel - shapes. +* `pixel_agg`: Select a compatible NumPy aggregator function (e.g. `"min"`, `"mean"`) that is applied to the output. For example, with `pixel_agg="mean"` the mean field of all observer points is returned. With this option it is possible to supply `getBHJM` with multiple observers that have different pixel shapes. -- `output`: Change the output format. Options are `"ndarray"` (default, returns - a NumPy ndarray) and `"dataframe"` (returns a 2D-table Pandas DataFrame). +* `output`: Change the output format. Options are `"ndarray"` (default, returns a NumPy ndarray) and `"dataframe"` (returns a 2D-table Pandas DataFrame). ```{note} Magpylib collects all inputs (object parameters), and vectorizes them for the computation which reduces the computation time dramatically for large inputs. @@ -96,23 +65,15 @@ Try to make all field computations with as few calls to `getBHJM` as possible. A ``` (docs-field-functional)= - ## Functional interface -Users can bypass the object oriented functionality of Magpylib and instead -compute the field for n given parameter sets. This is done by providing the -following inputs to the top level functions `getB`, `getH`, `getJ` and, `getM`. +Users can bypass the object oriented functionality of Magpylib and instead compute the field for n given parameter sets. This is done by providing the following inputs to the top level functions `getB`, `getH`, `getJ` and, `getM`. -1. `sources`: a string denoting the source type. Allowed values are the Magpylib - source class names, see {ref}`docs-classes`. +1. `sources`: a string denoting the source type. Allowed values are the Magpylib source class names, see {ref}`docs-classes`. 2. `observers`: array-like of shape (3,) or (n,3) giving the observer positions. -3. `kwargs`: a dictionary with inputs of shape (x,) or (n,x). Must include all - mandatory class-specific inputs. By default, `position=(0,0,0)` and - `orientation=None`(=unit rotation). +3. `kwargs`: a dictionary with inputs of shape (x,) or (n,x). Must include all mandatory class-specific inputs. By default, `position=(0,0,0)` and `orientation=None`(=unit rotation). -All "scalar" inputs of shape (x,) are automatically tiled up to shape (n,x) to -create a set of n computation instances. The field is returned in the shape -(n,3). The following code demonstrates the functional interface. +All "scalar" inputs of shape (x,) are automatically tiled up to shape (n,x) to create a set of n computation instances. The field is returned in the shape (n,3). The following code demonstrates the functional interface. ```python import numpy as np @@ -140,59 +101,55 @@ print(B) The functional interface is potentially faster than the object oriented one if users know how to generate the input arrays efficiently with numpy (e.g. `np.arange`, `np.linspace`, `np.tile`, `np.repeat`, ...). ``` -(docs-field-core)= +(docs-field-core)= ## Core interface -At the heart of Magpylib lies a set of core functions that are our -implementations of analytical field expressions found in the literature, see -{ref}`guide-ressources-physics`. Direct access to these functions is given -through the `magpylib.core` subpackage which includes, +At the heart of Magpylib lies a set of core functions that are our implementations of analytical field expressions found in the literature, see {ref}`guide-ressources-physics`. Direct access to these functions is given through the `magpylib.core` subpackage which includes, -::::{grid} 1 :gutter: 1 +::::{grid} 1 +:gutter: 1 -:::{grid-item} **magnet_cuboid_Bfield(** -`observers`, `dimensions`, -`polarizations`**)** ::: +:::{grid-item} +**magnet_cuboid_Bfield(** `observers`, `dimensions`, `polarizations`**)** +::: :::{grid-item} -**magnet_cylinder_axial_Bfield(** `z0`, `r`, -`z`**)** ::: +**magnet_cylinder_axial_Bfield(** `z0`, `r`, `z`**)** +::: :::{grid-item} -**magnet_cylinder_diametral_Hfield(** `z0`, -`r`, `z`, `phi`**)** ::: +**magnet_cylinder_diametral_Hfield(** `z0`, `r`, `z`, `phi`**)** +::: :::{grid-item} -**magnet_cylinder_segment_Hfield(** -`observers`, `dimensions`, -`magnetizations`**)** ::: +**magnet_cylinder_segment_Hfield(** `observers`, `dimensions`, `magnetizations`**)** +::: :::{grid-item} -**magnet_sphere_Bfield(**`observers`, -`diameters`, `polarizations`**)** ::: +**magnet_sphere_Bfield(**`observers`, `diameters`, `polarizations`**)** +::: :::{grid-item} -**current_circle_Hfield(**`r0`, `r`, `z`, -`i0`**)** ::: +**current_circle_Hfield(**`r0`, `r`, `z`, `i0`**)** +::: :::{grid-item} -**current_polyline_Hfield(**`observers`, -`segments_start`, `segments_end`, -`currents`**)** ::: +**current_polyline_Hfield(**`observers`, `segments_start`, `segments_end`, `currents`**)** +::: -:::{grid-item} **dipole_Hfield(**`observers`, -`moments`**)** ::: +:::{grid-item} +**dipole_Hfield(**`observers`, `moments`**)** +::: :::{grid-item} -**triangle_Bfield(**`observers`, `vertices`, -`polarizations`**)** ::: +**triangle_Bfield(**`observers`, `vertices`, `polarizations`**)** +::: :::: -All inputs must be NumPy ndarrays of shape (n,x). Details can be found in the -respective function docstrings. The following example demonstrates the core -interface. +All inputs must be NumPy ndarrays of shape (n,x). Details can be found in the respective function docstrings. The following example demonstrates the core interface. + ```python import numpy as np @@ -215,7 +172,6 @@ print(B) ## Field computation workflow -The Magpylib field computation internal workflow and different approaches of the -three interfaces is outlined in the following sketch. +The Magpylib field computation internal workflow and different approaches of the three interfaces is outlined in the following sketch. ![](../../../_static/images/docu_field_comp_flow.png) diff --git a/docs/_pages/user_guide/docs/docs_graphics.md b/docs/_pages/user_guide/docs/docs_graphics.md index 581cff36b..74ab19846 100644 --- a/docs/_pages/user_guide/docs/docs_graphics.md +++ b/docs/_pages/user_guide/docs/docs_graphics.md @@ -13,17 +13,12 @@ orphan: true --- (guide-graphics)= - # Graphic output (guide-graphics-show)= - ## 3D graphics with show -Once all Magpylib objects and their paths have been created, `show` creates a 3D -plot of the geometric arrangement using the Matplotlib (command line default) -and Plotly (notebook default) packages. `show` generates a new figure which is -automatically displayed. +Once all Magpylib objects and their paths have been created, `show` creates a 3D plot of the geometric arrangement using the Matplotlib (command line default) and Plotly (notebook default) packages. `show` generates a new figure which is automatically displayed. ```{code-cell} ipython3 import magpylib as magpy @@ -48,26 +43,16 @@ sensor = magpy.Sensor( magpy.show(magnet, current, dipole, sensor) ``` -Notice that objects and their paths are automatically assigned different colors. -The polarization of the magnet is displayed by default (Plotly and Pyvista) by -coloring the poles, which overwrites the object color. In Matplotlib the -polarization is by default displayed by an arrow. Current directions and dipole -objects are indicated by arrows and sensors are shown as tri-colored coordinate -cross with pixel as markers. +Notice that objects and their paths are automatically assigned different colors. The polarization of the magnet is displayed by default (Plotly and Pyvista) by coloring the poles, which overwrites the object color. In Matplotlib the polarization is by default displayed by an arrow. Current directions and dipole objects are indicated by arrows and sensors are shown as tri-colored coordinate cross with pixel as markers. -How objects are represented graphically (color, line thickness, etc.) is defined -by their [style properties](guide-graphic-styles). +How objects are represented graphically (color, line thickness, etc.) is defined by their [style properties](guide-graphic-styles). (guide-graphic-backends)= - ## Graphic backends -The graphic backend refers to the plotting library that is used for graphic -output. A plotting canvas refers to the frame/window/canvas/axes object the -graphic output is forwarded to. +The graphic backend refers to the plotting library that is used for graphic output. A plotting canvas refers to the frame/window/canvas/axes object the graphic output is forwarded to. -The graphic backend is set via the kwarg `backend` in the `show` function, which -is demonstrated in the following example +The graphic backend is set via the kwarg `backend` in the `show` function, which is demonstrated in the following example ```{code-cell} ipython3 import magpylib as magpy @@ -87,80 +72,64 @@ for backend in magpy.SUPPORTED_PLOTTING_BACKENDS: magpy.show(loop, cylinder, backend=backend) ``` -With the installation default setting, `backend='auto'`, Magpylib infers the -graphic backend from the environment running the code, or from the requested -canvas. +With the installation default setting, `backend='auto'`, Magpylib infers the graphic backend from the environment running the code, or from the requested canvas. | environment | canvas | inferred backend | -| ---------------- | ----------------------------------------------- | ---------------- | +|------------------|-------------------------------------------------|------------------| | Command-Line | `None` | `matplotlib` | | IPython notebook | `None` | `plotly` | | all | `matplotlib.axes.Axes` | `matplotlib` | | all | `plotly.graph_objects.Figure` or `FigureWidget` | `plotly` | | all | `pyvista.Plotter` | `pyvista` | -The library default can be changed, e.g. with the command -`magpy.defaults.display.backend = 'plotly'`. - -There is a high level of **feature parity**, however, not all graphic features -are supported by all backends, and not all graphic features work equally well, -so that [default style settings](guide-graphic-styles-default) differ slightly. -In addition, some common Matplotlib syntax (e.g. color `'r'`, linestyle `':'`) -is automatically translated to other backends. - -| Feature | Matplotlib | Plotly | Pyvista | -| :---------------------: | :--------: | :----: | :-----: | -| triangular mesh 3d | ✔️ | ✔️ | ✔️ | -| line 3d | ✔️ | ✔️ | ✔️ | -| line style | ✔️ | ✔️ | ❌ | -| line color | ✔️ | ✔️ | ✔️ | -| line width | ✔️ | ✔️ | ✔️ | -| marker 3d | ✔️ | ✔️ | ✔️ | -| marker color | ✔️ | ✔️ | ✔️ | -| marker size | ✔️ | ✔️ | ✔️ | -| marker symbol | ✔️ | ✔️ | ❌ | -| marker numbering | ✔️ | ✔️ | ❌ | -| zoom level | ✔️ | ✔️ | ❌[2] | -| magnetization color | ✔️[7] | ✔️ | ✔️ | -| animation | ✔️ | ✔️ | ✔️[5] | -| animation time | ✔️ | ✔️ | ✔️[5] | -| animation fps | ✔️ | ✔️ | ✔️[5] | -| animation slider | ✔️[1] | ✔️ | ❌ | -| subplots 2D | ✔️ | ✔️ | ✔️[6] | -| subplots 3D | ✔️ | ✔️ | ✔️ | -| user canvas | ✔️ | ✔️ | ✔️ | -| user extra 3d model [3] | ✔️ | ✔️ | ✔️[4] | +The library default can be changed, e.g. with the command `magpy.defaults.display.backend = 'plotly'`. + +There is a high level of **feature parity**, however, not all graphic features are supported by all backends, and not all graphic features work equally well, so that [default style settings](guide-graphic-styles-default) differ slightly. In addition, some common Matplotlib syntax (e.g. color `'r'`, linestyle `':'`) is automatically translated to other backends. + +| Feature | Matplotlib | Plotly | Pyvista | +|:------------------------:|:----------:|:------:|:-------:| +| triangular mesh 3d | ✔️ | ✔️ | ✔️ | +| line 3d | ✔️ | ✔️ | ✔️ | +| line style | ✔️ | ✔️ | ❌ | +| line color | ✔️ | ✔️ | ✔️ | +| line width | ✔️ | ✔️ | ✔️ | +| marker 3d | ✔️ | ✔️ | ✔️ | +| marker color | ✔️ | ✔️ | ✔️ | +| marker size | ✔️ | ✔️ | ✔️ | +| marker symbol | ✔️ | ✔️ | ❌ | +| marker numbering | ✔️ | ✔️ | ❌ | +| zoom level | ✔️ | ✔️ | ❌[2] | +| magnetization color | ✔️[7] | ✔️ | ✔️ | +| animation | ✔️ | ✔️ | ✔️[5] | +| animation time | ✔️ | ✔️ | ✔️[5] | +| animation fps | ✔️ | ✔️ | ✔️[5] | +| animation slider | ✔️[1] | ✔️ | ❌ | +| subplots 2D | ✔️ | ✔️ | ✔️[6] | +| subplots 3D | ✔️ | ✔️ | ✔️ | +| user canvas | ✔️ | ✔️ | ✔️ | +| user extra 3d model [3] | ✔️ | ✔️ | ✔️[4] | [1]: when returning animation object and exporting it as jshtml. [2]: possible but not implemented at the moment. -[3]: only `"scatter3d"`, and `"mesh3d"`. Gets "translated" to every other -backend. +[3]: only `"scatter3d"`, and `"mesh3d"`. Gets "translated" to every other backend. -[4]: custom user defined trace constructors allowed, which are specific to the -backend. +[4]: custom user defined trace constructors allowed, which are specific to the backend. [5]: animation is only available through export as `gif` or `mp4` -[6]: 2D plots are not supported for all jupyter_backends. As of pyvista>=0.38 -these are deprecated and replaced by the -[trame](https://docs.pyvista.org/api/plotting/trame.html) backend. +[6]: 2D plots are not supported for all jupyter_backends. As of pyvista>=0.38 these are deprecated and replaced by the [trame](https://docs.pyvista.org/api/plotting/trame.html) backend. -[7]: Matplotlib does not support color gradient. Instead magnetization is shown -through object slicing and coloring. +[7]: Matplotlib does not support color gradient. Instead magnetization is shown through object slicing and coloring. -`show` will also pass on all kwargs to the respective plotting backends. For -example, in the [animation sample code](guide-graphic-animations) the kwarg -`show_legend` is forwarded to the Plotly backend. +`show` will also pass on all kwargs to the respective plotting backends. For example, in the [animation sample code](guide-graphic-animations) the kwarg `show_legend` is forwarded to the Plotly backend. -(guide-graphics-canvas)= +(guide-graphics-canvas)= ## Plotting canvas -When calling `show`, a figure is automatically generated and displayed. It is -also possible to place the `show` output in a given figure using the `canvas` -argument. Consider the following Magpylib field computation, +When calling `show`, a figure is automatically generated and displayed. It is also possible to place the `show` output in a given figure using the `canvas` argument. Consider the following Magpylib field computation, ```{code-cell} ipython3 import magpylib as magpy @@ -172,13 +141,11 @@ sens = magpy.Sensor(position=np.linspace((0, 0, -0.1), (0, 0, 0.1), 100)) B = loop.getB(sens) ``` -The following examples demonstrate how to place the Magpylib `show` output in -figures created with the three supported graphic backends. +The following examples demonstrate how to place the Magpylib `show` output in figures created with the three supported graphic backends. +++ -In **Matplotlib** we combine a 2D-field plot with the 3D show output and modify -the 3D show output with a line. +In **Matplotlib** we combine a 2D-field plot with the 3D show output and modify the 3D show output with a line. ```{code-cell} ipython3 import magpylib as magpy @@ -215,8 +182,7 @@ When providing a canvas, no update to its layout is performed by Magpylib, unles +++ -In **Plotly** we combine a 2D-field plot with the 3D show output and modify the -3D show output with a line. +In **Plotly** we combine a 2D-field plot with the 3D show output and modify the 3D show output with a line. ```{code-cell} ipython3 import magpylib as magpy @@ -246,8 +212,7 @@ fig.add_scatter3d(x=(-0.1, 0.1), y=(0, 0), z=(0, 0), col=2, row=1) fig.show() ``` -**Pyvista** is not made for 2D plotting. Here we simply add a line to the 3D -show output. +**Pyvista** is not made for 2D plotting. Here we simply add a line to the 3D show output. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -269,12 +234,9 @@ pl.show() ``` (guide-graphics-return_fig)= - ## Return figure -Instead of forwarding a figure to an existing canvas, it is also possible to -return the figure object for further manipulation using the `return_fig` -command. In the following example this is demonstrated for the pyvista backend. +Instead of forwarding a figure to an existing canvas, it is also possible to return the figure object for further manipulation using the `return_fig` command. In the following example this is demonstrated for the pyvista backend. ```{code-cell} ipython3 import magpylib as magpy @@ -298,26 +260,16 @@ pl.show() ``` (guide-graphic-animations)= - ## Animation -The Magpylib [object paths](docs-position-paths) visualized with `show` can be -animated by setting the kwarg `animation=True`. This synergize specifically well -with the Plotly backend. +The Magpylib [object paths](docs-position-paths) visualized with `show` can be animated by setting the kwarg `animation=True`. This synergize specifically well with the Plotly backend. The animations can be fine-tuned with the following kwargs of `show`: - -1. `animation_time` (default=3), must be a positive number that gives the - animation time in seconds. -2. `animation_slider` (default=`True`), is boolean and sets if a slider should - be displayed. +1. `animation_time` (default=3), must be a positive number that gives the animation time in seconds. +2. `animation_slider` (default=`True`), is boolean and sets if a slider should be displayed. 3. `animation_fps` (default=30), sets the maximal frames per second. -Each path step will generate one frame of the animation, unless `animation_fps` -would be exceeded. In this case specific equidistant frames will be selected -automatically to adjust to the limited display possibilities. For practicality, -the input `animation=x` will automatically set `animation=True` and -`animation_time=x`. +Each path step will generate one frame of the animation, unless `animation_fps` would be exceeded. In this case specific equidistant frames will be selected automatically to adjust to the limited display possibilities. For practicality, the input `animation=x` will automatically set `animation=True` and `animation_time=x`. The following example demonstrates the animation feature, @@ -346,38 +298,27 @@ Even with some implemented fail safes, such as a maximum frame rate and frame co ``` (guide-graphics-subplots)= - ## Built-in Subplots -:::{versionadded} 4.4 Coupled subplots ::: +:::{versionadded} 4.4 +Coupled subplots +::: -It is often tedious to integrate the Magpylib `show` output into sub-plots as -shown above, especially when dealing with animations and combinations of 2D and -3D plots. +It is often tedious to integrate the Magpylib `show` output into sub-plots as shown above, especially when dealing with animations and combinations of 2D and 3D plots. -For this, Magpylib offers the possibility to show the sensor output along a path -in addition to the 3D-output, and to place 2D and 3D outputs in subplots. +For this, Magpylib offers the possibility to show the sensor output along a path in addition to the 3D-output, and to place 2D and 3D outputs in subplots. ### With show -All of this is achieved via the `show` function by passing input objects as -dictionaries with the arguments. +All of this is achieved via the `show` function by passing input objects as dictionaries with the arguments. 1. `objects`: list of Magpylib objects 2. `col`: int which selects the subplot column. Default is `col=1`. 3. `row`: int which selects the subplot row. Default is `row=1`. -4. `output`: string which selects the type of output that should be displayed in - this subplot. Options are - - 1. `"model3d"` is the default value and selects the 3D output. - 2. `"Xa"` selects a 2D line-plot of a field component (combination) as seen - by the sensor(s) along their path. The sensor(s) must be part of the - `objects` input. Here "X" selects the field and must be one of "BHJM", and - "a" selects the respective component combination and must be a subset of - "xyz". For example, `output=Hx` displays the x-component of the H-field, - or `output=Bxz` displays `sqrt(|Bx|² + |Bz|²)`. By default, source outputs - are summed up (`sumup=True`) and sensor pixels, are aggregated by mean - (`pixel_agg="mean"`). +4. `output`: string which selects the type of output that should be displayed in this subplot. Options are + + 1. `"model3d"` is the default value and selects the 3D output. + 2. `"Xa"` selects a 2D line-plot of a field component (combination) as seen by the sensor(s) along their path. The sensor(s) must be part of the `objects` input. Here "X" selects the field and must be one of "BHJM", and "a" selects the respective component combination and must be a subset of "xyz". For example, `output=Hx` displays the x-component of the H-field, or `output=Bxz` displays `sqrt(|Bx|² + |Bz|²)`. By default, source outputs are summed up (`sumup=True`) and sensor pixels, are aggregated by mean (`pixel_agg="mean"`). The following code demonstrates these features. @@ -401,8 +342,7 @@ magpy.show( ) ``` -Each input dictionary can contain kwargs, like `pixel_agg=None` or `sumup=False` -for 2D plots. +Each input dictionary can contain kwargs, like `pixel_agg=None` or `sumup=False` for 2D plots. ```{code-cell} ipython3 import magpylib as magpy @@ -435,15 +375,9 @@ magpy.show( ``` (guide-graphics-show_context)= - ### With show_context -To make the subplot syntax more convenient we introduced the `show_context` -native Python context manager. It allows to defer calls to the `show` function -while passing additional arguments. This is necessary for Magpylib to know how -many rows and columns are requested by the user, which single `show` calls do -not keep track of. All kwargs, e.g. `backend` are handed directly to the context -manager. +To make the subplot syntax more convenient we introduced the `show_context` native Python context manager. It allows to defer calls to the `show` function while passing additional arguments. This is necessary for Magpylib to know how many rows and columns are requested by the user, which single `show` calls do not keep track of. All kwargs, e.g. `backend` are handed directly to the context manager. The above example becomes: @@ -495,11 +429,7 @@ with magpy.show_context(): ### Coupled 2D/3D Animation -It is very helpful to combine 2D and 3D subplots in an animation that shows the -motion of the 3D system, while displaying the field at the respective path -instance at the same time. Unfortunately, it is quite tedious to create such -animations. The most powerful feature and main reason behind built-in subplots -is the ability to do just that with few lines of code. +It is very helpful to combine 2D and 3D subplots in an animation that shows the motion of the 3D system, while displaying the field at the respective path instance at the same time. Unfortunately, it is quite tedious to create such animations. The most powerful feature and main reason behind built-in subplots is the ability to do just that with few lines of code. ```{code-cell} ipython3 import magpylib as magpy @@ -521,10 +451,7 @@ with magpy.show_context(loop, sens, animation=True) as sc: ### Canvas length units -When displaying very small Magpylib objects, the axes scaling in meters might be -inadequate and you may want to use other units that fit the system dimensions -more nicely. The example below shows how to display an object (in this case the -same) with different length units and zoom levels. +When displaying very small Magpylib objects, the axes scaling in meters might be inadequate and you may want to use other units that fit the system dimensions more nicely. The example below shows how to display an object (in this case the same) with different length units and zoom levels. ```{tip} Setting `units_length="auto"` will infer the most suitable units based on the maximum range of the system. diff --git a/docs/_pages/user_guide/docs/docs_magpylib_force.md b/docs/_pages/user_guide/docs/docs_magpylib_force.md index 6a6e73c8d..fedc88b7d 100644 --- a/docs/_pages/user_guide/docs/docs_magpylib_force.md +++ b/docs/_pages/user_guide/docs/docs_magpylib_force.md @@ -13,11 +13,9 @@ kernelspec: --- (docs-magpylib-force)= - # Magpylib Force v0.3.1 -The package `magpylib-force` provides an addon for magnetic force and torque -computation between magpylib source objects. +The package `magpylib-force` provides an addon for magnetic force and torque computation between magpylib source objects. ## Installation @@ -29,8 +27,7 @@ pip install magpylib-force ## API -The package provides only a single top-level function -**getFT()** for computing force and torque. +The package provides only a single top-level function **getFT()** for computing force and torque. ```python import magpylib_force as mforce @@ -38,39 +35,18 @@ import magpylib_force as mforce mforce.getFT(sources, targets, anchor, eps=1e-5, squeeze=True) ``` -Here `sources` are Magpylib source objects that generate the magnetic field. The -`targets` are the objects on which the magnetic field of the sources acts to -generate force and torque. With current version 0.3.1 only `Cuboid`, `Cylinder`, -`CylinderSegment`, `Polyline`, and `Circle` objects can be targets. The `anchor` -denotes an anchor point which is the barycenter of the target. If no barycenter -is given, homogeneous mass density is assumed and the geometric center of the -target is chose as it's barycenter. `eps` refers to the finite difference length -when computing the magnetic field gradient and should be adjusted to be much -smaller than size of the system. `squeeze` can be used to squeeze the output -array dimensions as in Magpylib's `getB`, `getH`, `getJ`, and `getM`. - -The computation is based on numerically integrating the magnetic field generated -by the `sources` over the `targets`, see [here](docs-force-computation) for more -details. This requires that each target has a -**meshing** directive, which must be provided -via an attribute to the object. How `meshing` is defined: - -For all objects as an integer, which defines the target number of mesh-points. -In some cases an algorithm will attempt to come close to this number by -splitting up magnets into quasi-cubical cells. Exceptions are: - -- `Cuboid`: takes also a 3-vector that defines the number of equidistant splits - along each axis resulting in a rectangular regular grid. Keep in mind that the - accuracy is increased by cubical aspect ratios. -- `PolyLine`: defines the number of equidistant splits of each PolyLine segment, - not of the whole multi-segmented object. The total number of mesh-points will - be number of segments times meshing. - -The function `getFT()` returns force and torque as `np.ndarray` of shape (2,3), -or (t,2,3) when t targets are given. - -The following example code computes the force acting on a cuboid magnet, -generated by a current loop. +Here `sources` are Magpylib source objects that generate the magnetic field. The `targets` are the objects on which the magnetic field of the sources acts to generate force and torque. With current version 0.3.1 only `Cuboid`, `Cylinder`, `CylinderSegment`, `Polyline`, and `Circle` objects can be targets. The `anchor` denotes an anchor point which is the barycenter of the target. If no barycenter is given, homogeneous mass density is assumed and the geometric center of the target is chose as it's barycenter. `eps` refers to the finite difference length when computing the magnetic field gradient and should be adjusted to be much smaller than size of the system. `squeeze` can be used to squeeze the output array dimensions as in Magpylib's `getB`, `getH`, `getJ`, and `getM`. + +The computation is based on numerically integrating the magnetic field generated by the `sources` over the `targets`, see [here](docs-force-computation) for more details. This requires that each target has a **meshing** directive, which must be provided via an attribute to the object. How `meshing` is defined: + +For all objects as an integer, which defines the target number of mesh-points. In some cases an algorithm will attempt to come close to this number by splitting up magnets into quasi-cubical cells. Exceptions are: + +- `Cuboid`: takes also a 3-vector that defines the number of equidistant splits along each axis resulting in a rectangular regular grid. Keep in mind that the accuracy is increased by cubical aspect ratios. +- `PolyLine`: defines the number of equidistant splits of each PolyLine segment, not of the whole multi-segmented object. The total number of mesh-points will be number of segments times meshing. + +The function `getFT()` returns force and torque as `np.ndarray` of shape (2,3), or (t,2,3) when t targets are given. + +The following example code computes the force acting on a cuboid magnet, generated by a current loop. ```python import magpylib as magpy @@ -95,11 +71,9 @@ print(FT) ``` (docs-force-computation)= - ## Computation details -The force $\vec{F}_m$ acting on a magnetization distribution $\vec{M}$ in a -magnetic field $\vec{B}$ is given by +The force $\vec{F}_m$ acting on a magnetization distribution $\vec{M}$ in a magnetic field $\vec{B}$ is given by $$\vec{F}_m = \int \nabla (\vec{M}\cdot\vec{B}) \ dV.$$ @@ -107,20 +81,14 @@ The torque $\vec{T}_m$ which acts on the magnetization distribution is $$\vec{T}_m = \int \vec{M} \times \vec{B} \ dV.$$ -The force $\vec{F}_c$ which acts on a current distribution $\vec{j}$ in a -magnetic field is +The force $\vec{F}_c$ which acts on a current distribution $\vec{j}$ in a magnetic field is $$\vec{F}_c = \int \vec{j}\times \vec{B} \ dV.$$ -And there is no torque. However, one must not forget that a force, when applied -off-center, adds to the torque as +And there is no torque. However, one must not forget that a force, when applied off-center, adds to the torque as $$\vec{T}' = \int \vec{r} \times \vec{F} \ dV,$$ -where $\vec{r}$ points from the body barycenter to the position where the force -is applied. +where $\vec{r}$ points from the body barycenter to the position where the force is applied. -The idea behind `magplyib-force` is to compute the above integrals by -discretization. For this purpose, the target body is split up into small cells -using the object `meshing` attribute. The force and torque computation is -performed for all cells in a vectorized form, and the sum is returned. +The idea behind `magplyib-force` is to compute the above integrals by discretization. For this purpose, the target body is split up into small cells using the object `meshing` attribute. The force and torque computation is performed for all cells in a vectorized form, and the sum is returned. diff --git a/docs/_pages/user_guide/docs/docs_pos_ori.md b/docs/_pages/user_guide/docs/docs_pos_ori.md index 591d3b97d..13dfd20b8 100644 --- a/docs/_pages/user_guide/docs/docs_pos_ori.md +++ b/docs/_pages/user_guide/docs/docs_pos_ori.md @@ -1,53 +1,44 @@ (docs-position)= - # Position, Orientation, and Paths -The following secions are detiled technical documentations of the Magpylib -position and orientation interface. Practical examples and good practice usage -is demonstrated in the tutorial {ref}`examples-tutorial-paths`. +The following secions are detiled technical documentations of the Magpylib position and orientation interface. Practical examples and good practice usage is demonstrated in the tutorial {ref}`examples-tutorial-paths`. -::::{grid} 2 :gutter: 2 +::::{grid} 2 +:gutter: 2 -:::{grid-item} :columns: 12 7 7 7 The analytical magnetic field expressions -found in the literature, implemented in the [Magpylib core](docs-field-core), -are given in native coordinates of the sources which is convenient for the -mathematical formulation. It is a common problem to transform the field into an -application relevant observer coordinate system. While not technically -difficult, such transformations are prone to error. ::: :::{grid-item} :columns: -12 5 5 5 ![](../../../_static/images/docu_position_sketch.png) ::: :::: +:::{grid-item} +:columns: 12 7 7 7 +The analytical magnetic field expressions found in the literature, implemented in the [Magpylib core](docs-field-core), are given in native coordinates of the sources which is convenient for the mathematical formulation. It is a common problem to transform the field into an application relevant observer coordinate system. While not technically difficult, such transformations are prone to error. +::: +:::{grid-item} +:columns: 12 5 5 5 +![](../../../_static/images/docu_position_sketch.png) +::: +:::: -Here Magpylib helps. All Magpylib sources and observers lie in a global -Cartesian coordinate system. Object position and orientation are defined by the -attributes `position` and `orientation`, 😏. Objects can easily be moved around -using the `move()` and `rotate()` methods. Eventually, the field is computed in -the reference frame of the observers (e.g. Sensor objects). Positions are given -in units of meter, and the default unit for orientation is °. +Here Magpylib helps. All Magpylib sources and observers lie in a global Cartesian coordinate system. Object position and orientation are defined by the attributes `position` and `orientation`, 😏. Objects can easily be moved around using the `move()` and `rotate()` methods. Eventually, the field is computed in the reference frame of the observers (e.g. Sensor objects). Positions are given in units of meter, and the default unit for orientation is °. (docs-position-paths)= - ## Position and orientation attributes -Position and orientation of all Magpylib objects are defined by the two -attributes - -::::{grid} 2 :gutter: 2 - -:::{grid-item-card} :shadow: none :columns: 12 5 5 5 -**position** - a point $(x,y,z)$ in the -global coordinates, or a set of such points $(\vec{P}_1, \vec{P}_2, ...)$. By -default objects are created with `position=(0,0,0)`. ::: :::{grid-item-card} -:shadow: none :columns: 12 7 7 7 -**orientation** - a -[Scipy Rotation object](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html) -which describes the object rotation relative to its default orientation (defined -in {ref}`docs-classes`). By default, objects are created with unit rotation -`orientation=None`. ::: :::: +Position and orientation of all Magpylib objects are defined by the two attributes + +::::{grid} 2 +:gutter: 2 + +:::{grid-item-card} +:shadow: none +:columns: 12 5 5 5 +**position** - a point $(x,y,z)$ in the global coordinates, or a set of such points $(\vec{P}_1, \vec{P}_2, ...)$. By default objects are created with `position=(0,0,0)`. +::: +:::{grid-item-card} +:shadow: none +:columns: 12 7 7 7 +**orientation** - a [Scipy Rotation object](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html) which describes the object rotation relative to its default orientation (defined in {ref}`docs-classes`). By default, objects are created with unit rotation `orientation=None`. +::: +:::: -The position and orientation attributes can be either **scalar**, i.e. a single -position or a single rotation, or **vector**, when they are arrays of such -scalars. The two attributes together define the **path** of an object - Magpylib -makes sure that they are always of the same length. When the field is computed, -it is automatically computed for the whole path. +The position and orientation attributes can be either **scalar**, i.e. a single position or a single rotation, or **vector**, when they are arrays of such scalars. The two attributes together define the **path** of an object - Magpylib makes sure that they are always of the same length. When the field is computed, it is automatically computed for the whole path. ```{tip} To enable vectorized field computation, paths should always be used when modeling multiple object positions. Avoid using Python loops at all costs for that purpose! If your path is difficult to realize, consider using the [functional interface](docs-field-functional) instead. @@ -57,32 +48,25 @@ To enable vectorized field computation, paths should always be used when modelin Magpylib offers two powerful methods for object manipulation: -::::{grid} 2 :gutter: 2 - -:::{grid-item-card} :columns: 12 5 5 5 :shadow: none -**move(**`displacement`, -`start="auto"`**)** - move object by -`displacement` input. `displacement` is a position vector (scalar input) or a -set of position vectors (vector input). ::: :::{grid-item-card} :columns: 12 7 7 -7 :shadow: none **rotate(**`rotation`, -`anchor=None`, `start="auto"`**)** - rotates -the object by the `rotation` input about an anchor point defined by the `anchor` -input. `rotation` is a -[Scipy Rotation object](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html), -and `anchor` is a position vector. Both can be scalar or vector inputs. With -`anchor=None` the object is rotated about its `position`. ::: :::: - -- **Scalar input** is applied to the whole object path, starting with path index - `start`. With the default `start="auto"` the index is set to `start=0` and the - functionality is **moving objects around** (incl. their whole paths). -- **Vector input** of length $n$ applies the $n$ individual operations to $n$ - object path entries, starting with path index `start`. Padding applies when - the input exceeds the existing path length. With the default `start="auto"` - the index is set to `start=len(object path)` and the functionality is - **appending the input**. - -The practical application of this formalism is best demonstrated by the -following program +::::{grid} 2 +:gutter: 2 + +:::{grid-item-card} +:columns: 12 5 5 5 +:shadow: none +**move(**`displacement`, `start="auto"`**)** - move object by `displacement` input. `displacement` is a position vector (scalar input) or a set of position vectors (vector input). +::: +:::{grid-item-card} +:columns: 12 7 7 7 +:shadow: none +**rotate(**`rotation`, `anchor=None`, `start="auto"`**)** - rotates the object by the `rotation` input about an anchor point defined by the `anchor` input. `rotation` is a [Scipy Rotation object](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html), and `anchor` is a position vector. Both can be scalar or vector inputs. With `anchor=None` the object is rotated about its `position`. +::: +:::: + +- **Scalar input** is applied to the whole object path, starting with path index `start`. With the default `start="auto"` the index is set to `start=0` and the functionality is **moving objects around** (incl. their whole paths). +- **Vector input** of length $n$ applies the $n$ individual operations to $n$ object path entries, starting with path index `start`. Padding applies when the input exceeds the existing path length. With the default `start="auto"` the index is set to `start=len(object path)` and the functionality is **appending the input**. + +The practical application of this formalism is best demonstrated by the following program ```python import magpylib as magpy @@ -110,83 +94,75 @@ print(sensor.position) # the input with the existing path # --> [[ 1. 1. 1.] [ 3. 3. 13.] [ 4. 4. 24.]] # starting at index 1. ``` -Several extensions of the `rotate` method give a lot of flexibility with object -rotation. They all feature the arguments `anchor` and `start` which work as -described above. - -::::{grid} 1 :gutter: 2 - -:::{grid-item-card} :columns: 12 :shadow: none -**rotate_from_angax(**`angle`, `axis`, -`anchor=None`, `start="auto"`, `degrees=True` -**)** - -- `angle`: scalar or array with shape (n). Angle(s) of rotation. -- `axis`: array of shape (3,) or string. The direction of the rotation axis. - String input can be 'x', 'y' or 'z' to denote respective directions. -- `degrees`: bool, default=True. Interpret angle input in units of deg (True) or - rad (False). ::: - -:::{grid-item-card} :columns: 12 :shadow: none -**rotate_from_rotvec(**`rotvec`, -`anchor=None`, `start="auto"`, `degrees=True` -**)** - -- `rotvec` : array with shape (n,3) or (3,). The rotation vector direction is - the rotation axis and the vector length is the rotation angle in units of deg. -- `degrees`: bool, default=True. Interpret angle input in units of deg (True) or - rad (False). ::: - -:::{grid-item-card} :columns: 12 :shadow: none -**rotate_from_euler(** `angle`, `seq`, -`anchor=None`, `start="auto"`, `degrees=True` -**)** - -- `angle`: scalar or array with shape (n). Angle(s) of rotation in units of deg - (by default). -- `seq` : string. Specifies sequence of axes for rotations. Up to 3 characters - belonging to the set {'X', 'Y', 'Z'} for intrinsic rotations, or {'x', 'y', - 'z'} for extrinsic rotations. Extrinsic and intrinsic rotations cannot be - mixed in one function call. -- `degrees`: bool, default=True. Interpret angle input in units of deg (True) or - rad (False). ::: - -:::{grid-item-card} :columns: 12 :shadow: none -**rotate_from_quat(**`quat`, `anchor=None`, -`start="auto"` **)** - -- `quat` : array with shape (n,4) or (4,). Rotation input in quaternion form. - ::: - -:::{grid-item-card} :columns: 12 :shadow: none -**rotate_from_mrp(**`matrix`, `anchor=None`, -`start="auto"` **)** - -- `matrix` : array with shape (n,3,3) or (3,3). Rotation matrix. See - scipy.spatial.transform.Rotation for details. ::: - -:::{grid-item-card} :columns: 12 :shadow: none -**rotate_from_mrp(**`mrp`, `anchor=None`, -`start="auto"` **)** - -- `mrp` : array with shape (n,3) or (3,). Modified Rodrigues parameter input. - See scipy Rotation package for details. ::: +Several extensions of the `rotate` method give a lot of flexibility with object rotation. They all feature the arguments `anchor` and `start` which work as described above. + +::::{grid} 1 +:gutter: 2 + +:::{grid-item-card} +:columns: 12 +:shadow: none +**rotate_from_angax(**`angle`, `axis`, `anchor=None`, `start="auto"`, `degrees=True` **)** +* `angle`: scalar or array with shape (n). Angle(s) of rotation. +* `axis`: array of shape (3,) or string. The direction of the rotation axis. String input can be 'x', 'y' or 'z' to denote respective directions. +* `degrees`: bool, default=True. Interpret angle input in units of deg (True) or rad (False). +::: + +:::{grid-item-card} +:columns: 12 +:shadow: none +**rotate_from_rotvec(**`rotvec`, `anchor=None`, `start="auto"`, `degrees=True` **)** +* `rotvec` : array with shape (n,3) or (3,). The rotation vector direction is the rotation axis and the vector length is the rotation angle in units of deg. +* `degrees`: bool, default=True. Interpret angle input in units of deg (True) or rad (False). +::: + +:::{grid-item-card} +:columns: 12 +:shadow: none +**rotate_from_euler(** `angle`, `seq`, `anchor=None`, `start="auto"`, `degrees=True` **)** +* `angle`: scalar or array with shape (n). Angle(s) of rotation in units of deg (by default). +* `seq` : string. Specifies sequence of axes for rotations. Up to 3 characters belonging to the set {'X', 'Y', 'Z'} for intrinsic rotations, or {'x', 'y', 'z'} for extrinsic rotations. Extrinsic and intrinsic rotations cannot be mixed in one function call. +* `degrees`: bool, default=True. Interpret angle input in units of deg (True) or rad (False). +::: + +:::{grid-item-card} +:columns: 12 +:shadow: none +**rotate_from_quat(**`quat`, `anchor=None`, `start="auto"` **)** +* `quat` : array with shape (n,4) or (4,). Rotation input in quaternion form. +::: + +:::{grid-item-card} +:columns: 12 +:shadow: none +**rotate_from_mrp(**`matrix`, `anchor=None`, `start="auto"` **)** +* `matrix` : array with shape (n,3,3) or (3,3). Rotation matrix. See scipy.spatial.transform.Rotation for details. +::: + +:::{grid-item-card} +:columns: 12 +:shadow: none +**rotate_from_mrp(**`mrp`, `anchor=None`, `start="auto"` **)** +* `mrp` : array with shape (n,3) or (3,). Modified Rodrigues parameter input. See scipy Rotation package for details. +::: :::: -When objects with different path lengths are combined, e.g. when computing the -field, the shorter paths are treated as static beyond their end to make the -computation sensible. Internally, Magpylib follows a philosophy of edge-padding -and end-slicing when adjusting paths. - -::::{grid} 2 :gutter: 2 - -:::{grid-item-card} :columns: 12 7 7 7 :shadow: none **Edge-padding:** whenever -path entries beyond the existing path length are needed the edge-entries of the -existing path are returned. This means that the object is “static” beyond its -existing path. ::: :::{grid-item-card} :columns: 12 5 5 5 :shadow: none -**End-slicing:** whenever a path is automatically reduced in length, Magpylib -will slice such that the ending of the path is kept. ::: :::: +When objects with different path lengths are combined, e.g. when computing the field, the shorter paths are treated as static beyond their end to make the computation sensible. Internally, Magpylib follows a philosophy of edge-padding and end-slicing when adjusting paths. + +::::{grid} 2 +:gutter: 2 + +:::{grid-item-card} +:columns: 12 7 7 7 +:shadow: none +**Edge-padding:** whenever path entries beyond the existing path length are needed the edge-entries of the existing path are returned. This means that the object is “static” beyond its existing path. +::: +:::{grid-item-card} +:columns: 12 5 5 5 +:shadow: none +**End-slicing:** whenever a path is automatically reduced in length, Magpylib will slice such that the ending of the path is kept. +::: +:::: -The tutorial {ref}`examples-tutorial-paths` shows intuitive good practice -examples of the important functionality described in this section. +The tutorial {ref}`examples-tutorial-paths` shows intuitive good practice examples of the important functionality described in this section. diff --git a/docs/_pages/user_guide/docs/docs_styles.md b/docs/_pages/user_guide/docs/docs_styles.md index 73b3c023d..942954f55 100644 --- a/docs/_pages/user_guide/docs/docs_styles.md +++ b/docs/_pages/user_guide/docs/docs_styles.md @@ -13,36 +13,22 @@ orphan: true --- (guide-graphic-styles)= - # Graphic styles -The graphic styles define how Magpylib objects are displayed visually when -calling `show`. They can be fine-tuned and individualized to suit requirements -and taste. +The graphic styles define how Magpylib objects are displayed visually when calling `show`. They can be fine-tuned and individualized to suit requirements and taste. Graphic styles can be defined in various ways: -1. There is a **default style** setting which is applied when no other inputs - are made. -2. An **individual style** can be defined at object level. If the object is a - [Collection](guide-docs-classes-collections) it will apply its color to all - children. -3. Finally, styles that are defined in the `show` function call will override - all other settings. This is referred to as **local style override**. +1. There is a **default style** setting which is applied when no other inputs are made. +2. An **individual style** can be defined at object level. If the object is a [Collection](guide-docs-classes-collections) it will apply its color to all children. +3. Finally, styles that are defined in the `show` function call will override all other settings. This is referred to as **local style override**. The following sections describe these styling options and how to customize them. (guide-graphic-styles-default)= - ## Default style -The default style is stored in `magpylib.defaults.display.style`. Note that the -installation default styles differ slightly between different -[graphic backends](guide-graphic-backends) depending on their respective -capabilities. Specifically, the magnet magnetization in Matplotlib is displayed -with arrows by default, while it is displayed using a color scheme in Plotly and -Pyvista. The color scheme is also implemented in Matplotlib, but it is visually -unsatisfactory. +The default style is stored in `magpylib.defaults.display.style`. Note that the installation default styles differ slightly between different [graphic backends](guide-graphic-backends) depending on their respective capabilities. Specifically, the magnet magnetization in Matplotlib is displayed with arrows by default, while it is displayed using a color scheme in Plotly and Pyvista. The color scheme is also implemented in Matplotlib, but it is visually unsatisfactory. The default styles can be modified in three ways: @@ -71,11 +57,7 @@ magpy.defaults.display.style.magnet.magnetization.update( ) ``` -All three examples result in the same default style. Once modified, the library -default can always be restored with the `magpylib.style.reset()` method. The -following practical example demonstrates how to create and set a user defined -magnet magnetization style as default. The chosen custom style combines a -3-color scheme with an arrow which points in the magnetization direction. +All three examples result in the same default style. Once modified, the library default can always be restored with the `magpylib.style.reset()` method. The following practical example demonstrates how to create and set a user defined magnet magnetization style as default. The chosen custom style combines a 3-color scheme with an arrow which points in the magnetization direction. ```{code-cell} ipython3 import magpylib as magpy @@ -128,14 +110,10 @@ The default Magpylib style abides by the tri-color scheme for ideal-typical magn A list of all style options can be found [here](examples-list-of-styles). + ## Magic underscore notation -To facilitate working with deeply nested properties, all style constructors and -object style methods support the "magic underscore notation". It enables -referencing nested properties by joining together multiple property names with -underscores. This feature mainly helps reduce the code verbosity and is heavily -inspired by the -[Plotly underscore notation](https://plotly.com/python/creating-and-updating-figures/#magic-underscore-notation)). +To facilitate working with deeply nested properties, all style constructors and object style methods support the "magic underscore notation". It enables referencing nested properties by joining together multiple property names with underscores. This feature mainly helps reduce the code verbosity and is heavily inspired by the [Plotly underscore notation](https://plotly.com/python/creating-and-updating-figures/#magic-underscore-notation)). With magic underscore notation, the previous examples can be written as: @@ -161,23 +139,13 @@ magpy.defaults.display.style.magnet.update( ## Individual style -Any Magpylib object can have its own individual style that will take precedence -over the default values when `show` is called. When setting individual styles, -the object family specifier such as `magnet` or `current` can be omitted. +Any Magpylib object can have its own individual style that will take precedence over the default values when `show` is called. When setting individual styles, the object family specifier such as `magnet` or `current` can be omitted. ```{note} Users should be aware that the individual object style is organized in classes that take much longer to initialize than bare Magpylib objects, i.e. objects without individual style. This can lead to a computational bottleneck when setting individual styles of many Magpylib objects. For this reason Magpylib automatically defers style initialization until it is needed the first time, e.g. when calling the `show` function, so that object creatin time is not affected. However, this works only if style properties are set at initialization (e.g.: `magpy.magnet.Cuboid(..., style_label="MyCuboid")`). While this effect may not be noticeable for a small number of objects, it is best to avoid setting styles until it is plotting time. ``` -In the following example `cube` has no individual style, so the default style is -used. `cylinder` has an individual style set for `magnetization` which is a -tricolor scheme that will display the object color in the middle. The individual -style is set at object initialization (good practice), and it will be applied -only when `show` is called at the end of the example. Finally, `sphere` is also -given an individual style for `magnetization` that displays the latter using a -2-color scheme. In this case, however, the individual style is applied after -object initialization (bad practice), which results in style initialization -before it is needed. +In the following example `cube` has no individual style, so the default style is used. `cylinder` has an individual style set for `magnetization` which is a tricolor scheme that will display the object color in the middle. The individual style is set at object initialization (good practice), and it will be applied only when `show` is called at the end of the example. Finally, `sphere` is also given an individual style for `magnetization` that displays the latter using a 2-color scheme. In this case, however, the individual style is applied after object initialization (bad practice), which results in style initialization before it is needed. ```{code-cell} ipython3 import magpylib as magpy @@ -213,11 +181,7 @@ magpy.show(cube, cylinder, sphere, backend="plotly") ## Collection style -When displaying [Collection objects](guide-docs-classes-collections) their -`color` property will be assigned to all its children override the default color -cycle. In the following example this is demonstrated. Therefore, we make use of -the [Matplotlib backend](guide-graphic-backends) which displays magnet color by -default and shows the magnetization as an arrow rather than a color sequence. +When displaying [Collection objects](guide-docs-classes-collections) their `color` property will be assigned to all its children override the default color cycle. In the following example this is demonstrated. Therefore, we make use of the [Matplotlib backend](guide-graphic-backends) which displays magnet color by default and shows the magnetization as an arrow rather than a color sequence. ```{code-cell} ipython3 import magpylib as magpy @@ -240,32 +204,20 @@ coll = cube + cylinder magpy.show(coll, sphere, backend="matplotlib") ``` -In addition, it is possible to modify individual style properties of all -children, that cannot be set at Collection level, with the `set_children_styles` -method. Non-matching properties, e.g. magnetization color for children that are -currents, are simply ignored. +In addition, it is possible to modify individual style properties of all children, that cannot be set at Collection level, with the `set_children_styles` method. Non-matching properties, e.g. magnetization color for children that are currents, are simply ignored. ```{code-cell} ipython3 coll.set_children_styles(magnetization_color_south="blue") magpy.show(coll, sphere, backend="plotly") ``` -The child-styles are individual style properties of the collection object and -are not set as individual styles on each child-object. This means that when -displayed individually with `show`, the above child-objects will have Magpylib -default style. +The child-styles are individual style properties of the collection object and are not set as individual styles on each child-object. This means that when displayed individually with `show`, the above child-objects will have Magpylib default style. ## Local style override -Finally, it is possible to hand style input to the `show` function directly and -locally override all style properties for this specific `show` output. Default -or individual style attributes will not be modified. Such inputs must start with -the `style` prefix and the object family specifier must be omitted. Naturally -underscore magic is supported. +Finally, it is possible to hand style input to the `show` function directly and locally override all style properties for this specific `show` output. Default or individual style attributes will not be modified. Such inputs must start with the `style` prefix and the object family specifier must be omitted. Naturally underscore magic is supported. -In the following example the default `style.magnetization.show=True` is -overridden locally, so that object colors become visible instead of -magnetization colors in the Plotly backend. +In the following example the default `style.magnetization.show=True` is overridden locally, so that object colors become visible instead of magnetization colors in the Plotly backend. ```{code-cell} ipython3 import magpylib as magpy @@ -293,64 +245,30 @@ magpy.defaults.display.style.as_dict(flatten=True, separator=".") ``` (examples-own-3d-models)= - ## Custom 3D models -Each Magpylib object has a default 3D representation that is displayed with -`show`. It is possible to disable the default model and to provide Magpylib with -a custom model. - -There are several reasons why this can be of interest. For example, the -integration of a [custom source](guide-docs-classes-custom-source) object that -has its own geometry, to display a sensor in the form of a realistic package -provided in CAD form, representation of a -[Collection](guide-docs-classes-collections) as a parts holder, integration of -environmental parts to the Magpylib 3D plotting scene, or simply highlighting an -object when colors do not suffice. - -The default trace of a Magpylib object `obj` can simply be turned off using the -individual style command `obj.style.model3d.showdefault = False`. A custom 3D -model can be added using the function `obj.style.model3d.add_trace()`. The new -trace is then stored in the `obj.style.model3d.data` property. This property is -a list and it is possible to store multiple custom traces there. The default -style is not included in this property. It is instead inherently stored in the -Magpylib classes to enable visualization of the magnetization with a color -scheme. - -The input of `add_trace()` must be a `magpylib.graphics.Trace3d` object, or a -dictionary that contains all necessary information for generating a 3D model. -Because different plotting libraries require different directives, traces might -be bound to specific [backends](guide-graphic-backends). For example, a trace -dictionary might contain all information for Matplotlib to generate a 3D model -using the -[plot_surface](https://matplotlib.org/stable/plot_types/3D/surface3d_simple.html) -function. - -To enable visualization of custom objects with different graphic backends -Magpylib implements a **generic backend**. Traces defined in the generic backend -are translated to all other backends automatically. If a specific backend is -used, the model will only appear when called with the corresponding backend. +Each Magpylib object has a default 3D representation that is displayed with `show`. It is possible to disable the default model and to provide Magpylib with a custom model. + +There are several reasons why this can be of interest. For example, the integration of a [custom source](guide-docs-classes-custom-source) object that has its own geometry, to display a sensor in the form of a realistic package provided in CAD form, representation of a [Collection](guide-docs-classes-collections) as a parts holder, integration of environmental parts to the Magpylib 3D plotting scene, or simply highlighting an object when colors do not suffice. + +The default trace of a Magpylib object `obj` can simply be turned off using the individual style command `obj.style.model3d.showdefault = False`. A custom 3D model can be added using the function `obj.style.model3d.add_trace()`. The new trace is then stored in the `obj.style.model3d.data` property. This property is a list and it is possible to store multiple custom traces there. The default style is not included in this property. It is instead inherently stored in the Magpylib classes to enable visualization of the magnetization with a color scheme. + +The input of `add_trace()` must be a `magpylib.graphics.Trace3d` object, or a dictionary that contains all necessary information for generating a 3D model. Because different plotting libraries require different directives, traces might be bound to specific [backends](guide-graphic-backends). For example, a trace dictionary might contain all information for Matplotlib to generate a 3D model using the [plot_surface](https://matplotlib.org/stable/plot_types/3D/surface3d_simple.html) function. + +To enable visualization of custom objects with different graphic backends Magpylib implements a **generic backend**. Traces defined in the generic backend are translated to all other backends automatically. If a specific backend is used, the model will only appear when called with the corresponding backend. A trace-dictionary has the following keys: 1. `'backend'`: `'generic'`, `'matplotlib'` or `'plotly'` -2. `'constructor'`: name of the plotting constructor from the respective - backend, e.g. plotly `'Mesh3d'` or matplotlib `'plot_surface'` +2. `'constructor'`: name of the plotting constructor from the respective backend, e.g. plotly `'Mesh3d'` or matplotlib `'plot_surface'` 3. `'args'`: default `None`, positional arguments handed to constructor 4. `'kwargs'`: default `None`, keyword arguments handed to constructor -5. `'coordsargs'`: tells Magpylib which input corresponds to which coordinate - direction, so that geometric representation becomes possible. By default - `{'x': 'x', 'y': 'y', 'z': 'z'}` for the `'generic'` backend and Plotly - backend, and `{'x': 'args[0]', 'y': 'args[1]', 'z': 'args[2]'}` for the - Matplotlib backend. +5. `'coordsargs'`: tells Magpylib which input corresponds to which coordinate direction, so that geometric representation becomes possible. By default `{'x': 'x', 'y': 'y', 'z': 'z'}` for the `'generic'` backend and Plotly backend, and `{'x': 'args[0]', 'y': 'args[1]', 'z': 'args[2]'}` for the Matplotlib backend. 6. `'show'`: default `True`, toggle if this trace should be displayed 7. `'scale'`: default 1, object geometric scaling factor -8. `'updatefunc'`: default `None`, updates the trace parameters when `show` is - called. Used to generate dynamic traces. +8. `'updatefunc'`: default `None`, updates the trace parameters when `show` is called. Used to generate dynamic traces. -The following example shows how a trace is constructed using the generic backend -with the `Mesh3d` constructor. We create a `Sensor` object and replace its -default 3d model by a tetrahedron. +The following example shows how a trace is constructed using the generic backend with the `Mesh3d` constructor. We create a `Sensor` object and replace its default 3d model by a tetrahedron. ```{code-cell} ipython3 import magpylib as magpy @@ -385,10 +303,7 @@ for backend in magpy.SUPPORTED_PLOTTING_BACKENDS: magpy.show(sensor, backend=backend) ``` -As noted above, it is possible to have multiple user-defined traces that will be -displayed at the same time. The following example continuation demonstrates this -by adding two more traces using the `Scatter3d` constructor in the generic -backend. In addition, it showns how to copy and manipulate `Trace3d` objects. +As noted above, it is possible to have multiple user-defined traces that will be displayed at the same time. The following example continuation demonstrates this by adding two more traces using the `Scatter3d` constructor in the generic backend. In addition, it showns how to copy and manipulate `Trace3d` objects. ```{code-cell} ipython3 # Continuation from above - ensure previous code is executed @@ -423,8 +338,7 @@ magpy.show(sensor) ### Matplotlib constructors -The following examples show how to construct traces with `plot`, `plot_surface` -and `plot_trisurf`: +The following examples show how to construct traces with `plot`, `plot_surface` and `plot_trisurf`: ```{code-cell} ipython3 import matplotlib.pyplot as plt @@ -492,8 +406,7 @@ magpy.show(magnet, ball, mobius, backend="matplotlib") ## Pre-defined 3D models -Automatic trace generators are provided for several basic 3D models in -`magpylib.graphics.model3d`. They can be used as follows, +Automatic trace generators are provided for several basic 3D models in `magpylib.graphics.model3d`. They can be used as follows, ```{code-cell} ipython3 from magpylib import Collection @@ -557,11 +470,9 @@ obj0.show(obj1, obj2, obj3, obj4, obj5, backend="plotly") ``` ((guide-docs-style-cad))= - ## Adding a CAD model -The following code sample shows how a standard CAD model (\*.stl file) can be -transformed into a Magpylib `Trace3d` object. +The following code sample shows how a standard CAD model (*.stl file) can be transformed into a Magpylib `Trace3d` object. ```{note} The code below requires installation of the `numpy-stl` package. diff --git a/docs/_pages/user_guide/docs/docs_units_types.md b/docs/_pages/user_guide/docs/docs_units_types.md index bba1f66a2..c14ede192 100644 --- a/docs/_pages/user_guide/docs/docs_units_types.md +++ b/docs/_pages/user_guide/docs/docs_units_types.md @@ -1,28 +1,30 @@ # Units and Types (guide-docs-units)= - ## Units -The important vacuum permeability $\mu_0$ is provided at the package top-level -**mu_0**. It's value is not $4 \pi 10^{-7}$ -since -[the redefinition of the SI base units](https://en.wikipedia.org/wiki/2019_redefinition_of_the_SI_base_units), -but a value close to it. - -For historical reasons Magpylib used non-SI units until Version 4. Starting with -version 5 all inputs and outputs are SI-based. - -::::{grid} 3 :::{grid-item} :columns: 1 ::: - -:::{grid-item} :columns: 10 | PHYSICAL QUANTITY | MAGPYLIB PARAMETER | UNITS -from v5| UNITS until v4| |:---:|:---:|:---:|:---:| | Magnetic Polarization -$\vec{J}$ | `polarization`, `getJ()` | **T** | - | | Magnetization $\vec{M}$ | -`magnetization`, `getM()` | **A/m** | mT | | Electric Current $i_0$ | `current` -| **A** | A | | Magnetic Dipole Moment $\vec{m}$ | `moment` | **A·m²** | mT·mm³ -| | B-field $\vec{B}$ | `getB()` | **T** | mT | | H-field $\vec{H}$ | `getH()` | -**A/m** | kA/m | | Length-inputs | `position`, `dimension`, `vertices`, ... | -**m** | mm | | Angle-inputs | `angle`, `dimension`, ... | **°** | ° | ::: +The important vacuum permeability $\mu_0$ is provided at the package top-level **mu_0**. It's value is not $4 \pi 10^{-7}$ since [the redefinition of the SI base units](https://en.wikipedia.org/wiki/2019_redefinition_of_the_SI_base_units), but a value close to it. + +For historical reasons Magpylib used non-SI units until Version 4. Starting with version 5 all inputs and outputs are SI-based. + +::::{grid} 3 +:::{grid-item} +:columns: 1 +::: + +:::{grid-item} +:columns: 10 +| PHYSICAL QUANTITY | MAGPYLIB PARAMETER | UNITS from v5| UNITS until v4| +|:---:|:---:|:---:|:---:| +| Magnetic Polarization $\vec{J}$ | `polarization`, `getJ()` | **T** | - | +| Magnetization $\vec{M}$ | `magnetization`, `getM()` | **A/m** | mT | +| Electric Current $i_0$ | `current` | **A** | A | +| Magnetic Dipole Moment $\vec{m}$ | `moment` | **A·m²** | mT·mm³ | +| B-field $\vec{B}$ | `getB()` | **T** | mT | +| H-field $\vec{H}$ | `getH()` | **A/m** | kA/m | +| Length-inputs | `position`, `dimension`, `vertices`, ... | **m** | mm | +| Angle-inputs | `angle`, `dimension`, ... | **°** | ° | +::: :::: @@ -35,7 +37,6 @@ The connection between the magnetic polarization J, the magnetization M and the ``` (guide-docs-io-scale-invariance)= - ## Arbitrary unit Convention ```{hint} @@ -46,6 +47,4 @@ In addition, `getB` returns the same unit as given by the `polarization` input. ## Types -Magpylib requires no special input format. All scalar types (`int`, `float`, -...) and vector types (`list`, `tuple`, `np.ndarray`, ... ) are accepted. -Magpylib returns everything as `np.ndarray`. +Magpylib requires no special input format. All scalar types (`int`, `float`, ...) and vector types (`list`, `tuple`, `np.ndarray`, ... ) are accepted. Magpylib returns everything as `np.ndarray`. diff --git a/docs/_pages/user_guide/examples/examples_app_coils.md b/docs/_pages/user_guide/examples/examples_app_coils.md deleted file mode 100644 index b72cf7c5b..000000000 --- a/docs/_pages/user_guide/examples/examples_app_coils.md +++ /dev/null @@ -1,182 +0,0 @@ ---- -orphan: true -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.13.7 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -(examples-app-helmholtz)= - -# Coils - -In this example we show how to model air-coils, then combine two coils into a -Helmholtz-pair and visualize the homogeneity of the resulting magnetic field. A -nice explanation of coils and the magnetic field is given -[here](https://www.nagwa.com/en/explainers/186157825721/#:~:text=The%20magnetic%20field%20strength%2C%20%F0%9D%90%B5,%EF%8A%AD%20T%E2%8B%85m%2FA.). -With the code examples below you can easily compare Magpylib results to results -presented in this tutorial. - -## Coil models - -**Model 1:** The coil consists of multiple windings, each of which can be -modeled with a circular current loop which is realized by the `Circle` class. -The individual windings are combined into a `Collection` which itself behaves -like a single magnetic field source. - -```{code-cell} ipython3 -import numpy as np -import magpylib as magpy - -coil1 = magpy.Collection() -for z in np.linspace(-8, 8, 16): - winding = magpy.current.Circle( - current=100, - diameter=10, - position=(0,0,z), - ) - coil1.add(winding) - -coil1.show() -``` - -**Model 2:** The coil is in reality more like a spiral, which can be modeled -using the `Polyline` class. However, a good spiral approximation requires many -small line segments, which makes the computation slower. - -```{code-cell} ipython3 -import numpy as np -import magpylib as magpy - -ts = np.linspace(-8, 8, 300) -vertices = np.c_[5*np.cos(ts*2*np.pi), 5*np.sin(ts*2*np.pi), ts] -coil2 = magpy.current.Polyline( - current=100, - vertices=vertices -) - -coil2.show() -``` - -**Model 3:** A [Helmholtz coil](https://en.wikipedia.org/wiki/Helmholtz_coil) is -a device for producing a region of nearly uniform magnetic field. It consists of -two coils on the same axis, carrying an equal electric current in the same -direction. In classical layouts, the distance between the coils is similar to -the coil radius. - -```{code-cell} ipython3 -# Continuation from above - ensure previous code is executed - -# Create a finite sized Helmholtz coil-pair -coil1 = magpy.Collection() -for z in np.linspace(-1, 1, 5): - for r in np.linspace(4, 5, 5): - winding = magpy.current.Circle( - current=10, - diameter=2*r, - position=(0,0,z), - ) - coil1.add(winding) - -coil1.position = (0,0,5) -coil2 = coil1.copy(position=(0,0,-5)) - -helmholtz = magpy.Collection(coil1, coil2) - -helmholtz.show() -``` - -## Plotting the field - -Streamplot from Matplotlib is a powerful tool to outline the field lines. -However, it must be understood that streamplot shows only a projection of the -field onto the observation plane. All field components that point out of the -plane become invisible. In out example we choose symmetry planes, where the -perpendicular component is negligible. - -```{code-cell} ipython3 -# Continuation from above - ensure previous code is executed - -import matplotlib.pyplot as plt -fig, ax = plt.subplots(1, 1, figsize=(6,5)) - -# Compute field and plot the coil pair field on yz-grid -grid = np.mgrid[0:0:1j, -13:13:20j, -13:13:20j].T[:,:,0] -_, Y, Z = np.moveaxis(grid, 2, 0) - -B = magpy.getB(helmholtz, grid) -_, By, Bz = np.moveaxis(B, 2, 0) - -Bamp = np.linalg.norm(B, axis=2) -Bamp /= np.amax(Bamp) - -sp = ax.streamplot(Y, Z, By, Bz, density=2, color=Bamp, - linewidth=np.sqrt(Bamp)*3, cmap='coolwarm', -) - -# Plot coil outline -from matplotlib.patches import Rectangle -for loc in [(4,4), (4,-6), (-6,4), (-6,-6)]: - ax.add_patch(Rectangle(loc, 2, 2, color='k', zorder=10)) - -# Figure styling -ax.set( - title='Magnetic field of Helmholtz', - xlabel='y-position (m)', - ylabel='z-position (m)', - aspect=1, -) -plt.colorbar(sp.lines, ax=ax, label='(T)') - -plt.tight_layout() -plt.show() -``` - -## Helmholtz field homogeneity - -While the optimal solution is given by two current loops, real world -applications must deal with finite sizes and limited construction space. Here -Magpylib enables fast analysis of different possible geometries. - -```{code-cell} ipython3 -# Continuation from above - ensure previous code is executed - -import matplotlib.pyplot as plt -fig, ax = plt.subplots(1, 1, figsize=(6,5)) - -# Compute field of the coil pair on yz-grid -grid = np.mgrid[0:0:1j, -3:3:20j, -3:3:20j].T[:,:,0] -_, Y, Z = np.moveaxis(grid, 2, 0) - -B = helmholtz.getB(grid) - -# Field at center -B0 = helmholtz.getB((0,0,0)) -B0amp = np.linalg.norm(B0) - -# Homogeneity error -err = np.linalg.norm((B-B0)/B0amp, axis=2) - -# Plot error on grid -sp = ax.contourf(Y, Z, err*100) - -# Figure styling -ax.set( - title='Helmholtz homogeneity error', - xlabel='y-position (m)', - ylabel='z-position (m)', - aspect=1, -) -plt.colorbar(sp, ax=ax, label='(% of B0)') - -plt.tight_layout() -plt.show() -``` - -Notice that in such finite sized arrangements the field is not very homogeneous. diff --git a/docs/_pages/user_guide/examples/examples_app_end_of_shaft.md b/docs/_pages/user_guide/examples/examples_app_end_of_shaft.md deleted file mode 100644 index 916a465f3..000000000 --- a/docs/_pages/user_guide/examples/examples_app_end_of_shaft.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.0 -kernelspec: - display_name: Python 3 - language: python - name: python3 -orphan: true ---- - -(examples-app-end-of-shaft)= - -# Magnetic Angle Sensor - -End of shaft angle sensing is a classic example for a magnetic position system. -The goal is to determine the angular position of a rotating shaft. A magnet, -typically a diametrically magnetized cylinder, is mounted at the end of the -shaft. A 2D sensor is mounted below. When the shaft rotates the two sensor -outputs will be $s_1=B_0 sin(\varphi)$ and $s_2=B_0 cos(\varphi)$, so that the -angle is uniquely given by $\varphi = arctan_2(s_1,s_2)$. - -In the example below we show such a typical end-of-shaft system with a 2-pixel -sensor, that is commonly used to eliminate external stray fields. In addition, -we assume that the magnet is not perfectly mounted at the end of the shaft, but -slightly displaced to the side, which results in a wobble motion. Such -tolerances are easily implemented with Magpylib, they can be visualized and -their influence on the sensor output signal can be tested quickly. - -```{code-cell} ipython3 -import numpy as np -import plotly.express as px -import magpylib as magpy -import plotly.graph_objects as go - -# Create magnet -magnet = magpy.magnet.Cylinder( - polarization=(1, 0, 0), - dimension=(.06, .02), - position=(0, 0, .015), - style_label="Magnet", - style_color=".7", -) - -# Create shaft dummy with 3D model -shaft = magpy.misc.CustomSource( - position=(0, 0, .07), - style_color=".7", - style_model3d_showdefault=False, - style_label="Shaft", -) -shaft_trace = magpy.graphics.model3d.make_Prism( - base=20, - diameter=.1, - height=.1, - opacity=0.3, -) -shaft.style.model3d.add_trace(shaft_trace) - -# Shaft rotation / magnet wobble motion -displacement = .01 -angles = np.linspace(0, 360, 72) -coll = magnet + shaft -magnet.move((displacement, 0, 0)) -coll.rotate_from_angax(angles, "z", anchor=0, start=0) - -# Create sensor -gap = .03 -sens = magpy.Sensor( - position=(0, 0, -gap), - pixel=[(.01, 0, 0), (-.01, 0, 0)], - style_pixel_size=0.5, - style_size=1.5, -) - -# Show 3D animation of wobble motion -fig1 = go.Figure() -magpy.show(magnet, sens, shaft, animation=True, backend="plotly", canvas=fig1) -fig1.update_layout(scene_camera_eye_z=-1.1) -fig1.show() - -# Show sensor output in plotly -fig2 = go.Figure() -df = sens.getB(magnet, output="dataframe") -df["angle (deg)"] = angles[df["path"]] - -fig2 = px.line( - df, - x="angle (deg)", - y=["Bx", "By"], - line_dash="pixel", - labels={"value": "Field (T)"}, -) -fig2.show() -``` - -```{code-cell} ipython3 - -``` diff --git a/docs/_pages/user_guide/examples/examples_app_halbach.md b/docs/_pages/user_guide/examples/examples_app_halbach.md deleted file mode 100644 index d7395c15e..000000000 --- a/docs/_pages/user_guide/examples/examples_app_halbach.md +++ /dev/null @@ -1,91 +0,0 @@ ---- -orphan: true -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.13.7 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -(examples-app-halbach)= - -# Halbach Magnets - -Magpylib is an excellent tool to create magnet assemblies. In this example we -will show how to model Halbach magnets. - -```{note} -In the following examples we make use of the [arbitrary unit convention](guide-docs-io-scale-invariance). -``` - -The original Halbach-magnetization describes a hollow cylinder with a -polarization direction that rotates twice while going around the cylinder once. -In reality such polarizations are difficult to fabricate. What is commonly done -instead are "Discreete Halbach Arrays", which are magnet assemblies that -approximate a Halbach magnetization. - -The following code creates a Discreete Halbach Cylinder generated from Cuboids: - -```{code-cell} ipython3 -import numpy as np -import magpylib as magpy - -N = 10 -angles = np.linspace(0, 360, N, endpoint=False) - -halbach = magpy.Collection() - -for a in angles: - cube = magpy.magnet.Cuboid( - dimension=(1,1,1), - polarization=(1,0,0), - position=(2.3,0,0) - ) - cube.rotate_from_angax(a, 'z', anchor=0) - cube.rotate_from_angax(a, 'z') - halbach.add(cube) - -halbach.show(backend='plotly') -``` - -Next we compute and display the field on an xy-grid in the symmetry plane using -the [matplotlib streamplot](examples-vis-mpl-streamplot) example. - -```{code-cell} ipython3 -# Continuation from above - ensure previous code is executed - -import matplotlib.pyplot as plt -fig, ax = plt.subplots() - -# Compute and plot field on x-y grid -grid = np.mgrid[-3.5:3.5:100j, -3.5:3.5:100j, 0:0:1j].T[0] -X, Y, _ = np.moveaxis(grid, 2, 0) - -B = halbach.getB(grid) -Bx, By, _ = np.moveaxis(B, 2, 0) -Bamp = np.linalg.norm(B, axis=2) - -pc = ax.contourf(X, Y, Bamp, levels=50, cmap="coolwarm") -ax.streamplot(X, Y, Bx, By, color="k", density=1.5, linewidth=1) - -# Add colorbar -fig.colorbar(pc, ax=ax, label="|B|") - -# Figure styling -ax.set( - xlabel="x-position", - ylabel="z-position", - aspect=1, -) - -plt.show() -``` - -```{warning} -Magpylib models magnets with perfect polarization. However, such magnets do not exist in reality due to fabrication tolerances and material response. While fabrication tolerances can be estimated easily, our [tutorial](examples-tutorial-modeling-magnets) explains how to deal with material response. -``` diff --git a/docs/_pages/user_guide/examples/examples_app_scales.md b/docs/_pages/user_guide/examples/examples_app_scales.md deleted file mode 100644 index d5d723190..000000000 --- a/docs/_pages/user_guide/examples/examples_app_scales.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -orphan: true -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.13.7 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -(examples-app-scales)= - -# Magnetic Scales - -In this example we will show how magnetic scales can be constructed with -Magpylib for fast field computation. - -- reference to DS 91411 and 91479 -- ideal-typical scales -- PWS experiment and PWS reference diff --git a/docs/_pages/user_guide/examples/examples_force_floating.md b/docs/_pages/user_guide/examples/examples_force_floating.md deleted file mode 100644 index ac3754831..000000000 --- a/docs/_pages/user_guide/examples/examples_force_floating.md +++ /dev/null @@ -1,269 +0,0 @@ ---- -orphan: true -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.13.7 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -(examples-force-floating)= - -# Floating Magnets - -The examples here require installaion of the -[magpylib-force package](https://pypi.org/project/magpylib-force/). See also the -[magpylib-force documentation](docs-magpylib-force). - -## Formalism - -With force and torque we can compute how a magnet moves in a magnetic field by -solving the equations of motion, - -$$ \vec{F} = \dot{\vec{p}} \ \text{and} \ \vec{T} = \dot{\vec{L}}$$ - -with force $\vec{F}$, momentum $\vec{p}$, torque $\vec{T}$ and angular momentum -$\vec{L}$. - -We implement a first order semi-implicit Euler method that is used to compute -[planetary motion](https://www.mgaillard.fr/2021/07/11/euler-integration.html). -The algorithm splits the computation into small subsequent time-steps -$\Delta t$, resulting in the following equations for the position $\vec{s}$, the -velocity $\vec{v} = \dot{\vec{s}}$, the rotation angle $\vec{\varphi}$ and the -angular velocity $\vec{\omega}$, - -$$\vec{v}(t+\Delta t) = \vec{v}(t) + \frac{\Delta t}{m} \vec{F}(t)$$ - -$$\vec{s}(t+\Delta t) = \vec{s}(t) + \Delta t \cdot \vec{v} (t + \Delta t)$$ - -$$\vec{\omega} (t + \Delta t) = \vec{ω}(t) + \Delta t \cdot J^{-1} \cdot \vec{T}(t)$$ - -$$\vec{\varphi} (t + \Delta t) = \vec{\varphi}(t) + \Delta t \cdot \vec{\omega} (t + \Delta t) $$ - -## Magnet and Coil - -In the following example we show an implementation of the proposed Euler scheme. -A cubical magnet is accelerated by a current loop along the z-axis as show in -the following sketch: - -```{figure} ../../../_static/images/examples_force_floating_coil-magnet.png -:width: 40% -:align: center -:alt: Sketch of current loop and magnet. - -A cubical magnet is accelerated by a current loop. -``` - -Due to the symmetry of the problem there is no torque so we solve only the -translation part of the equations of motion. - -In the beginning, the magnet is at rest and slightly displaced in z-direction -from the center of the current loop. With time the magnet is accelerated and -it's z-position is displayed in the figure below. - -```{code-cell} ipython3 -import numpy as np -import matplotlib.pyplot as plt -import magpylib as magpy -from magpylib_force import getFT -from scipy.spatial.transform import Rotation as R - -def timestep(source, target, dt): - """ - Apply translation-only Euler-sceme timestep to target. - - Parameters: - ----------- - source: Magpylib source object that generates the magnetic field - - target: Magpylib target object viable for force computation. In addition, - the target object must have the following parameters describing - the motion state: v (velocity), m (mass) - - dt: Euler scheme length of timestep - """ - - # compute force - F, _ = getFT(source, target) - - # compute/set new velocity and position - target.v = target.v + dt/target.m * F - target.position = target.position + dt * target.v - -# Current loop that generates the field -loop = magpy.current.Circle(diameter=10e-3, current=10) - -# Magnets which are accelerated in the loop-field -cube1 = magpy.magnet.Cuboid(dimension=(5e-3,5e-3,5e-3), polarization=(0,0,1)) -cube1.meshing=(3,3,3) -cube2 = cube1.copy(polarization=(0,0,-1)) - -# Compute motion -for cube, lab in zip([cube1, cube2], ["attractive", "repulsive"]): - - # Set initial conditions - cube.m = 1e-3 - cube.position=(0,0,3e-3) - cube.v = np.array([0,0,0]) - - # Compute timesteps - z = [] - for _ in range(100): - z.append(cube.position[2]*1000) - timestep(loop, cube, dt=1e-3) - - plt.plot(z, marker='.', label=lab) - -# Graphic styling -plt.gca().legend() -plt.gca().grid() -plt.gca().set( - title="Magnet motion", - xlabel="timestep ()", - ylabel="z-Position (mm)", -) -plt.show() -``` - -The simulation is made with two magnets with opposing polarizations. In the -"repulsive" case (orange) the magnetic moment of magnet and coil are -anti-parallel and the magnet is simply pushed away from the coil in positive -z-direction. In the "attractive" case (blue) the moments are parallel to each -other, and the magnet is accelerated towards the coil center. Due to inertia it -then comes out on the other side, and is again attracted towards the center -resulting in an oscillation. - -```{warning} -This algorithm accumulates its error over time, which can be avoided by choosing smaller timesteps. -``` - -## Two-body problem - -In the following example we demonstrate a fully dynamic simulation with two -magnetic bodies that rotate around each other, attracted towards each other by -the magnetic force, and repelled by the centrifugal force. - -```{figure} ../../../_static/images/examples_force_floating_ringdown.png -:width: 80% -:align: center -:alt: Sketch of two-magnet ringdown. - -Two freely moving magnets rotate around each other. -``` - -Contrary to the simple case above, we apply the Euler scheme also to the -rotation degrees of freedom, as the magnets will change their orientation while -they circle around each other. - -```{code-cell} ipython3 -import numpy as np -import matplotlib.pyplot as plt -import magpylib as magpy -from magpylib_force import getFT -from scipy.spatial.transform import Rotation as R - -def timestep(source, target, dt): - """ - Apply full Euler-sceme timestep to target. - - Parameters: - ----------- - source: Magpylib source object that generates the magnetic field - - target: Magpylib target object viable for force computation. In addition, - the target object must have the following parameters describing - the motion state: v (velocity), m (mass), w (angular velocity), - I_inv (inverse inertial tensor) - - dt: Euler scheme length of timestep - """ - # compute force - F, T = getFT(source, target) - - # compute/set new velocity and position - target.v = target.v + dt/target.m * F - target.position = target.position + dt * target.v - - # compute/set new angular velocity and rotation angle - target.w = target.w + dt*target.orientation.apply(np.dot(target.I_inv, target.orientation.inv().apply(T))) - target.orientation = R.from_rotvec(dt*target.w)*target.orientation - - -v0 = 5.18 # init velocity -steps=505 # number of timesteps -dt = 1e-2 # timstep size - -# Create the two magnets and set initial conditions -sphere1 = magpy.magnet.Sphere(position=(5,0,0), diameter=1, polarization=(1,0,0)) -sphere1.meshing = 5 -sphere1.m = 2 -sphere1.v = np.array([0, v0, 0]) -sphere1.w = np.array([0, 0, 0]) -sphere1.I_inv = 1 * np.eye(3) - -sphere2 = sphere1.copy(position=(-5,0,0)) -sphere2.v = np.array([0,-v0, 0]) - -# Solve equations of motion -data = np.zeros((4,steps,3)) -for i in range(steps): - timestep(sphere1, sphere2, dt) - timestep(sphere2, sphere1, dt) - - # Store results of each timestep - data[0,i] = sphere1.position - data[1,i] = sphere2.position - data[2,i] = sphere1.orientation.as_euler('xyz') - data[3,i] = sphere2.orientation.as_euler('xyz') - -# Plot results -fig, (ax1,ax2) = plt.subplots(2,1,figsize=(10,5)) - -for j,ls in enumerate(["-", "--"]): - - # Plot positions - for i,a in enumerate("xyz"): - ax1.plot(data[j,:,i], label= a + str(j+1), ls=ls) - - # Plot orientations - for i,a in enumerate(["phi", "psi", "theta"]): - ax2.plot(data[j+2,:,i], label= a + str(j+1), ls=ls) - -# Figure styling -for ax in fig.axes: - ax.legend(fontsize=9, loc=6, facecolor='.8') - ax.grid() -ax1.set( - title="Floating Magnet Ringdown", - ylabel="Positions (m)", -) -ax2.set( - ylabel="Orientations (rad)", - xlabel="timestep ()", -) -plt.tight_layout() -plt.show() -``` - -In the figure one can see, that the initial velocity is chosen so that the -magnets approach each other in a ringdown-like behavior. The magnets are -magnetically locked towards each other - both always show the same orientation. -However, given no initial angular velocity, the rotation angle is oscillating -several times while circling once. - -A video is helpful in this case to understand what is going on. From the -computation above, we build the following gif making use of this -[export-animation](examples-vis-exporting-animations) tutorial. - -```{figure} ../../../_static/videos/example_force_floating_ringdown.gif -:width: 60% -:align: center -:alt: animation of simulated magnet ringdown. - -Animation of above simulated magnet ringdown. -``` diff --git a/docs/_pages/user_guide/examples/examples_force_force.md b/docs/_pages/user_guide/examples/examples_force_force.md deleted file mode 100644 index f121e0656..000000000 --- a/docs/_pages/user_guide/examples/examples_force_force.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -orphan: true -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.13.7 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -(examples-force-force)= - -# Magnetic Force and Torque - -The `magpylib-force` extension provides force and torque computation between -Magpylib objects. A detailed description of the API and how the computation is -achieved can be found in the [user guide](docs-force-computation). - -```{warning} -[Scaling invariance](guide-docs-io-scale-invariance) does not hold for force computations! Be careful to provide the inputs in the correct units! -``` - -In the following example we show how to compute force and torque between two -objects and how to represent it graphically. - -```{code-cell} ipython3 -import pyvista as pv -import magpylib as magpy -from magpylib_force import getFT - -# Source -coil = magpy.current.Circle(position=(0,0,-.5), diameter=4, current=1000) -coil.rotate_from_angax(angle=-20, axis='y') - -# Target -cube = magpy.magnet.Cuboid(dimension=(.7,.7,.7), polarization=(0,0,1)) -cube.meshing = (10,10,10) - -# Compute force and torque -F,T = getFT(coil, cube, anchor=None) - -print(f"Force (blue): {[round(f) for f in F]} N") -print(f"Torque (yellow): {[round(t) for t in T]} Nm") -``` - -Force and torque are really strong in this example, because the magnet and the -coil are very large objects. With 0.7 m side length, the magnet has a Volume of -~1/3rd cubic meter :). - -```{code-cell} ipython3 -# Example continued from above - -# Plot force and torque in Pyvista with arrows -pl = magpy.show(coil, cube, backend='pyvista', return_fig=True) -arrowF = pv.Arrow(start=(0,0,0), direction=F) -pl.add_mesh(arrowF, color="blue") -arrowT = pv.Arrow(start=(0,0,0), direction=T) -pl.add_mesh(arrowT, color="yellow") - -pl.show() -``` diff --git a/docs/_pages/user_guide/examples/examples_force_holding_force.md b/docs/_pages/user_guide/examples/examples_force_holding_force.md deleted file mode 100644 index 293ea4004..000000000 --- a/docs/_pages/user_guide/examples/examples_force_holding_force.md +++ /dev/null @@ -1,56 +0,0 @@ -(examples-force-holding-force)= - -# Magnetic Holding Force - -The examples here require installaion of the -[magpylib-force package](https://pypi.org/project/magpylib-force/). See also the -[magpylib-force documentation](docs-magpylib-force). - -With Magpylib-force it is possible to compute the holding force of a magnet -attached magnetically to a soft-ferromagnetic plate. The "pull-force" is the -opposing force that is required to detach the magnet from the surface. - -```{figure} ../../../_static/images/examples_force_holding_force.png -:width: 40% -:align: center -:alt: Sketch of holding force. - -Sketch of holding force F that must be overcome to detach the magnet from a soft-magnetic plate. -``` - -For this we make use of the "magnetic mirror" effect, which is quite similar to -the well-known electrostatic "mirror-charge" model. The magnetic field of a -magnetic dipole moment that lies in front of a highly permeable surface is -similar to the field of two dipole moments: the original one and one that is -mirrored across the surface such that each "magnetic charge" that makes up the -dipole moment is mirrored in both position and charge. - -The following example computes the holding force of a Cuboid magnet using the -magnetic mirror effect. - -```{code-block} python -import magpylib as magpy -from magpylib_force import getFT - -# Target magnet -m1 = magpy.magnet.Cuboid( - dimension=(5e-3, 2.5e-3, 1e-3), - polarization=(0, 0, 1.33), -) -m1.meshing = 100 - -# Mirror magnet -m2 = m1.copy(position=(0,0,1e-3)) - -F,T = getFT(m2, m1) -print(f"Holding Force: {round(F[2]*100)} g") -# Holding Force: 349 g -``` - -Magnet dimensions and material from this example are taken from the -[web](https://www.supermagnete.at/quadermagnete-neodym/quadermagnet-5mm-2.5mm-1.5mm_Q-05-2.5-1.5-HN). -The remanence of N45 material lies within 1.32 and 1.36 T which corresponds to -the polarization, see also the -["Modeling a real magnet"](examples-tutorial-modeling-magnets) tutorial. The -computation confirms what is stated on the web-page, that the holding force of -this magnet is about 350 g. diff --git a/docs/_pages/user_guide/examples/examples_index.md b/docs/_pages/user_guide/examples/examples_index.md deleted file mode 100644 index 579645fd0..000000000 --- a/docs/_pages/user_guide/examples/examples_index.md +++ /dev/null @@ -1,180 +0,0 @@ -(examples)= - -# Examples - -## Tutorials - -::::{grid} 2 3 4 4 :gutter: 4 - -:::{grid-item-card} {ref}`examples-tutorial-paths` :text-align: center :link: -examples-tutorial-paths :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_tutorial_paths.png ::: - -:::{grid-item-card} {ref}`examples-tutorial-field-computation` :text-align: -center :link: examples-tutorial-field-computation :link-type: ref :link-alt: -link to example :img-bottom: -../../../\_static/images/examples_icon_tutorial_field_computation.png ::: - -:::{grid-item-card} {ref}`examples-tutorial-collection` :text-align: center -:link: examples-tutorial-collection :link-type: ref :link-alt: link to example -:img-bottom: ../../../\_static/images/examples_icon_tutorial_collection.png ::: - -:::{grid-item-card} {ref}`examples-tutorial-custom` :text-align: center :link: -examples-tutorial-custom :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_tutorial_custom.png ::: - -:::{grid-item-card} {ref}`examples-tutorial-modeling-magnets` :text-align: -center :link: examples-tutorial-modeling-magnets :link-type: ref :link-alt: link -to example :img-bottom: -../../../\_static/images/examples_icon_tutorial_modeling_magnets.png ::: - -:::: - -## Visualizations - -::::{grid} 2 3 4 4 :gutter: 4 - -:::{grid-item-card} {ref}`examples-vis-magnet-colors` :text-align: center :link: -examples-vis-magnet-colors :link-type: ref :link-alt: link to example -:img-bottom: ../../../\_static/images/examples_icon_vis_magnet_colors.png ::: - -:::{grid-item-card} {ref}`examples-vis-animations` :text-align: center :link: -examples-vis-animations :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_vis_animations.png ::: - -:::{grid-item-card} {ref}`examples-vis-subplots` :text-align: center :link: -examples-vis-subplots :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_vis_subplots.png ::: - -:::{grid-item-card} {ref}`examples-vis-mpl-streamplot` :text-align: center -:link: examples-vis-mpl-streamplot :link-type: ref :link-alt: link to example -:img-bottom: ../../../\_static/images/examples_icon_vis_mpl_streamplot.png ::: - -:::{grid-item-card} {ref}`examples-vis-pv-streamlines` :text-align: center -:link: examples-vis-pv-streamlines :link-type: ref :link-alt: link to example -:img-bottom: ../../../\_static/images/examples_icon_vis_pv_streamlines.png ::: - -:::: - -(examples-complex-magnet-shapes)= - -## Complex Magnet Shapes - -::::{grid} 2 3 4 4 :gutter: 4 - -:::{grid-item-card} {ref}`examples-shapes-superpos` :text-align: center :link: -examples-shapes-superpos :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_shapes_superpos.png ::: - -:::{grid-item-card} {ref}`examples-shapes-convex-hull` :text-align: center -:link: examples-shapes-convex-hull :link-type: ref :link-alt: link to example -:img-bottom: ../../../\_static/images/examples_icon_shapes_convex_hull.png ::: - -:::{grid-item-card} {ref}`examples-shapes-triangle` :text-align: center :link: -examples-shapes-triangle :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_shapes_triangle.png ::: - -:::{grid-item-card} {ref}`examples-shapes-pyvista` :text-align: center :link: -examples-shapes-pyvista :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_shapes_pyvista.png ::: - -:::{grid-item-card} {ref}`examples-shapes-cad` :text-align: center :link: -examples-shapes-cad :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_shapes_cad.png ::: - -:::: - -## Miscellaneous - -::::{grid} 2 3 4 4 :gutter: 4 - -:::{grid-item-card} {ref}`examples-misc-compound` :text-align: center :link: -examples-misc-compound :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_misc_compound.png ::: - -:::{grid-item-card} {ref}`examples-misc-field-interpolation` :text-align: center -:link: examples-misc-field-interpolation :link-type: ref :link-alt: link to -example :img-bottom: -../../../\_static/images/examples_icon_misc_field_interpolation.png ::: - -:::{grid-item-card} {ref}`examples-misc-inhom` :text-align: center :link: -examples-misc-inhom :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_misc_inhom.png ::: - -:::: - -## Applications - -::::{grid} 2 3 4 4 :gutter: 4 - -:::{grid-item-card} {ref}`examples-app-end-of-shaft` :text-align: center :link: -examples-app-end-of-shaft :link-type: ref :link-alt: link to example -:img-bottom: ../../../\_static/images/examples_icon_app_end_of_shaft.png ::: - -:::{grid-item-card} {ref}`examples-app-halbach` :text-align: center :link: -examples-app-halbach :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_app_halbach.png ::: - -:::{grid-item-card} {ref}`examples-app-helmholtz` :text-align: center :link: -examples-app-helmholtz :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_app_helmholtz.png ::: - -:::{grid-item-card} {ref}`examples-app-scales` :text-align: center :link: -examples-app-scales :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_WIP.png ::: - -:::: - -## Magpylib-Force - -::::{grid} 2 3 4 4 :gutter: 4 - -:::{grid-item-card} {ref}`examples-force-force` :text-align: center :link: -examples-force-force :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_force_force.png ::: - -:::{grid-item-card} {ref}`examples-force-holding-force` :text-align: center -:link: examples-force-holding-force :link-type: ref :link-alt: link to example -:img-bottom: ../../../\_static/images/examples_icon_force_holding_force.png ::: - -:::{grid-item-card} {ref}`examples-force-floating` :text-align: center :link: -examples-force-floating :link-type: ref :link-alt: link to example :img-bottom: -../../../\_static/images/examples_icon_force_floating.png ::: - -:::: - -```{toctree} -:maxdepth: 2 -:hidden: - -examples_tutorial_paths.md -examples_tutorial_field_computation.md -examples_tutorial_collection.md -examples_tutorial_custom.md -examples_tutorial_modeling_magnets.md - -examples_vis_magnet_colors.md -examples_vis_animations.md -examples_vis_subplots.md -examples_vis_mpl_streamplot.md -examples_vis_pv_streamlines.md - -examples_shapes_superpos.md -examples_shapes_convex_hull.md -examples_shapes_triangle.md -examples_shapes_pyvista.md -examples_shapes_cad.md - -examples_misc_compound.md -examples_misc_field_interpolation.md -examples_misc_inhom.md - -examples_app_end_of_shaft.md -examples_app_halbach.md -examples_app_coils.md -examples_app_scales.md - -examples_force_force.md -examples_force_holding_force.md -examples_force_floating.md -``` diff --git a/docs/_pages/user_guide/examples/examples_misc_compound.md b/docs/_pages/user_guide/examples/examples_misc_compound.md deleted file mode 100644 index d2608e3e8..000000000 --- a/docs/_pages/user_guide/examples/examples_misc_compound.md +++ /dev/null @@ -1,223 +0,0 @@ ---- -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.0 -kernelspec: - display_name: Python 3 - language: python - name: python3 -orphan: true ---- - -(examples-misc-compound)= - -# Compounds - -The `Collection` class is a powerful tool for grouping and tracking object -assemblies. However, it is often convenient to have assembly parameters -themselves, like number of magnets, as variables. This is achieved by -sub-classing `Collection`. We refer to such classes as "**Compounds**" and show -how to seamlessly integrate them into Magpylib. - -## Subclassing collections - -In the following example we design a compound class `MagnetRing` which -represents a ring of cuboid magnets with the parameter `cubes` that should refer -to the number of magnets on the ring. The ring will automatically adjust its -size when `cubes` is modified, including an additionally added encompassing 3D -model that may, for example, represent a mechanical magnet holder. - -```{code-cell} ipython3 -import magpylib as magpy - -class MagnetRing(magpy.Collection): - """ A ring of cuboid magnets - - Parameters - ---------- - cubes: int, default=6 - Number of cubes on ring. - """ - - def __init__(self, cubes=6, **kwargs): - super().__init__(**kwargs) # hand over style args - self._update(cubes) - - @property - def cubes(self): - """Number of cubes""" - return self._cubes - - @cubes.setter - def cubes(self, inp): - """Set cubes""" - self._update(inp) - - def _update(self, cubes): - """Update MagnetRing instance""" - self._cubes = cubes - ring_radius = cubes/300 - - # Store existing path - pos_temp = self.position - ori_temp = self.orientation - - # Clean up old object properties - self.reset_path() - self.children = [] - self.style.model3d.data.clear() - - # Add children - for i in range(cubes): - child = magpy.magnet.Cuboid( - polarization=(0,0,1), - dimension=(.01,.01,.01), - position=(ring_radius,0,0) - ) - child.rotate_from_angax(360/cubes*i, 'z', anchor=0) - self.add(child) - - # Re-apply path - self.position = pos_temp - self.orientation = ori_temp - - # Add parameter-dependent 3d trace - trace = magpy.graphics.model3d.make_CylinderSegment( - dimension=(ring_radius-.006, ring_radius+.006, 0.011, 0, 360), - vert=150, - opacity=0.2, - ) - self.style.model3d.add_trace(trace) - - return self -``` - -This new `MagnetRing` class seamlessly integrates into Magpylib and makes use of -the position and orientation interface, field computation and graphic display. - -```{code-cell} ipython3 -# Continuation from above - ensure previous code is executed - -# Add a sensor -sensor = magpy.Sensor(position=(0, 0, 0)) - -# Create a MagnetRing object -ring = MagnetRing() - -# Move MagnetRing around -ring.rotate_from_angax(angle=45, axis='x') - -# Compute field -print(f"B-field at sensor → {ring.getB(sensor).round(2)}") - -# Display graphically -magpy.show(ring, sensor, backend='plotly') -``` - -The `MagnetRing` parameter `cubes` can be modified dynamically: - -```{code-cell} ipython3 -# Continuation from above - ensure previous code is executed - -print(f"B-field at sensor for modified ring → {ring.getB(sensor).round(3)}") - -ring.cubes = 10 - -print(f"B-field at sensor for modified ring → {ring.getB(sensor).round(3)}") - -magpy.show(ring, sensor, backend='plotly') -``` - -## Postponed trace construction - -In the above example, the trace is constructed in `_update`, every time the -parameter `cubes` is modified. This can lead to an unwanted computational -overhead, especially as the construction is only necessary for graphical -representation. - -To make our compounds ready for heavy computation, while retaining Magpylib -graphic possibilities, it is possible to provide a trace which will only be -constructed when `show` is called. The following modification of the above -example demonstrates this: - -```{code-cell} ipython3 -class MagnetRingAdv(magpy.Collection): - """ A ring of cuboid magnets - - Parameters - ---------- - cubes: int, default=6 - Number of cubes on ring. - """ - - def __init__(self, cubes=6, **style_kwargs): - super().__init__(**style_kwargs) # hand over style args - self._update(cubes) - - # Hand trace over as callable - self.style.model3d.add_trace(self._custom_trace3d) - - @property - def cubes(self): - """Number of cubes""" - return self._cubes - - @cubes.setter - def cubes(self, inp): - """Set cubes""" - self._update(inp) - - def _update(self, cubes): - """Update MagnetRing instance""" - self._cubes = cubes - ring_radius = cubes/300 - - # Store existing path and reset - pos_temp = self.position - ori_temp = self.orientation - self.reset_path() - - # Add children - for i in range(cubes): - child = magpy.magnet.Cuboid( - polarization=(0,0,1), - dimension=(.01,.01,.01), - position=(ring_radius,0,0) - ) - child.rotate_from_angax(360/cubes*i, 'z', anchor=0) - self.add(child) - - # Re-apply path - self.position = pos_temp - self.orientation = ori_temp - - return self - - def _custom_trace3d(self): - """ creates a parameter-dependent 3d model""" - trace = magpy.graphics.model3d.make_CylinderSegment( - dimension=(self.cubes/300-.006, self.cubes/300+0.006, 0.011, 0, 360), - vert=150, - opacity=0.2, - ) - return trace -``` - -We have removed the trace construction from the `_update` method, and instead -provided `_custom_trace3d` as a callable. - -```{code-cell} ipython3 -# Continuation from above - ensure previous code is executed - -ring0 = MagnetRing() -%time for _ in range(10): ring0.cubes=10 - -ring1 = MagnetRingAdv() -%time for _ in range(10): ring1.cubes=10 -``` - -This example is not very impressive because the provided trace is not very -heavy. diff --git a/docs/_pages/user_guide/examples/examples_misc_field_interpolation.md b/docs/_pages/user_guide/examples/examples_misc_field_interpolation.md deleted file mode 100644 index 976c88bd8..000000000 --- a/docs/_pages/user_guide/examples/examples_misc_field_interpolation.md +++ /dev/null @@ -1,176 +0,0 @@ ---- -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.0 -kernelspec: - display_name: Python 3 - language: python - name: python3 -orphan: true ---- - -(examples-misc-field-interpolation)= - -# Field Interpolation - -There are several reasons for working with field interpolations rather than -computing the field on demand. - -1. Very large grids take a lot of time to compute, even with Magpylib. -2. The field might not be accessible through Magpylib, e.g. when demagnetization - is included, but it can be computed with a 3rd party FE tool or is the result - of an experiment. - -Combining field interpolation and `CustomSource` enables integration of -pre-computed solutions. In the following example we show how this can be done. - -## Interpolation - -We start by defining a 3D vector-field interpolation function relying on Scipy -`RegularGridInterpolator`. - -```{code-cell} ipython3 -import numpy as np -from scipy.interpolate import RegularGridInterpolator -import magpylib as magpy - -def interpolation(observer, data, method="linear", bounds_error=False, fill_value=np.nan): - """ Creates a 3D-vector field interpolation from regular grid data - - Parameters - ---------- - observer: ndarray, shape (n,3) - Array of n position vectors (x,y,z). - - data: ndarray, shape (n,3) - Array of corresponding n interpolation data vectors. - - method : str, optional - The method of interpolation to perform. Supported are "linear" and - "nearest". Default is "linear". - - bounds_error : bool, optional - If True, when interpolated values are requested outside of the - domain of the input data, a ValueError is raised. If False, - then `fill_value` is returned. - - fill_value : number, optional - Value returned when points outside the interpolation domain are - sampled. - - Returns - ------- - callable: interpolating function for field values - """ - - # Condition input - X, Y, Z = [np.unique(o) for o in observer.T] - nx, ny, nz = len(X), len(Y), len(Z) - - # Construct interpolations with RegularGridInterpolator for each field component - rgi = [ - RegularGridInterpolator( - points=(X, Y, Z), - values=d.reshape(nx, ny, nz), - bounds_error=bounds_error, - fill_value=fill_value, - method=method, - ) - for d in data.T] - - # Define field_func usable by Magpylib that returns the interpolation - def field_func(field, observers): - return np.array([f(observers) for f in rgi]).T - return field_func -``` - -## CustomSource with Interpolation Field - -In the second step we create a custom source with an interpolated field -`field_func` input. The data for the interpolation is generated from the -Magpylib `Cuboid` field, which makes it easy to verify the approach afterwards. -To the custom source a nice 3D model is added that makes it possible to display -it and the cuboid at the same time. - -```{code-cell} ipython3 -# Create data for interpolation -cube = magpy.magnet.Cuboid(polarization=(0,0,1), dimension=(.02,.02,.02)) -ts = np.linspace(-.07, .07, 21) -grid = np.array([(x,y,z) for x in ts for y in ts for z in ts]) -data = cube.getB(grid) - -# Create custom source with interpolation field -custom = magpy.misc.CustomSource( - field_func=interpolation(grid, data), - style_label="custom", -) - -# Add nice 3D model (dashed outline) to custom source -xs = 0.011*np.array([-1, -1, 1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, -1]) -ys = 0.011*np.array([-1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1]) -zs = 0.011*np.array([-1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, -1, 1, 1]) -trace = dict( - backend='matplotlib', - constructor='plot', - args=(xs, ys, zs), - kwargs={'ls':'--', 'marker':'', 'lw':1, 'color':'k'}, -) -custom.style.model3d.add_trace(trace) -custom.style.model3d.showdefault = False - -# Display custom -magpy.show(custom, cube, zoom=1, backend="matplotlib") -``` - -## Testing Interpolation Accuracy - -Finally, we compare the "exact" field of the cuboid source with the interpolated -field of the custom source. For this purpose, a sensor is added and a generic -rotation is applied to the sources. Naturally there is some error that can be -reduced by increasing the interpolation grid finesse. - -```{code-cell} ipython3 -# Continuation from above - ensure previous code is executed - -import matplotlib.pyplot as plt - -# Modify orientation of cube and custom -for src in [cube, custom]: - src.rotate_from_angax(angle=45, axis=(1,1,1)) - -# Add a sensor for testing -sensor = magpy.Sensor(position=(-.05,0,0)) -angs = np.linspace(3,150,49) -sensor.rotate_from_angax(angle=angs, axis="y", anchor=0) - -# Display system graphically -magpy.show(cube, custom, sensor, backend="matplotlib") - -# Create Matplotlib plotting axis -ax = plt.subplot() - -# Compute and plot fields -B_cube = cube.getB(sensor) -B_custom = custom.getB(sensor) -for i,lab in enumerate(["Bx", "By", "Bz"]): - ax.plot(B_cube[:,i], ls="-", label=lab) - ax.plot(B_custom[:,i], ls="--", color="k") - -# Matplotlib figure styling -ax.legend() -ax.grid(color=".9") -ax.set( - title="Field at sensor - real (solid), interpolated (dashed)", - xlabel="sensor rotation angle (deg)", - ylabel="(T)", -) - -plt.show() -``` - -```{code-cell} ipython3 - -``` diff --git a/docs/_pages/user_guide/examples/examples_misc_inhom.md b/docs/_pages/user_guide/examples/examples_misc_inhom.md deleted file mode 100644 index 61718f0df..000000000 --- a/docs/_pages/user_guide/examples/examples_misc_inhom.md +++ /dev/null @@ -1,170 +0,0 @@ ---- -orphan: true -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.13.7 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -(examples-misc-inhom)= - -# Inhomogeneous Magnetization - -The analytical expressions implemented in Magpylib treat only simple homogeneous -polarizations. When dealing with high-grade materials that are magnetized in -homogeneous fields this is a good approximation. However, there are many cases -where such a homogeneous model is not justified. The tutorial -{ref}`examples-tutorial-modeling-magnets` and the user-guide -{ref}`guide-physics-demag` provide some insights on this topic. - -Here we show how to deal with inhomogeneous polarization based on a commonly -misunderstood example of a cylindrical quadrupol magnet. While graphical -representations of such magnets usually depict only four poles, see -{ref}`examples-vis-magnet-colors`, such magnets exhibit complex polarization -given by the magnetization device that is used to magnetize them. - -The following code shows how the field of such a magnetization device would look -like and what magnetization field it produces. To relize a Cylindrical -Quadrupole magnert there are four coils with ferromagnetic cores involved, -arranged in circle around the magnet. In the example, coils and cores are -modeled by Cuboid magnets. - -```{note} -While Magpylib uses SI units by default, in this example we make use of [scaling invariance](guide-docs-io-scale-invariance) and consider arbitrary input length units. For this example millimeters are sensible. -``` - -```{code-cell} ipython -import numpy as np -import matplotlib.pyplot as plt -import magpylib as magpy - -# Create figure with 2D and 3D canvas -fig = plt.figure(figsize=(8, 4)) -ax1 = fig.add_subplot(121, projection='3d') -ax2 = fig.add_subplot(122) - -# Model of magnetization tool -tool1 = magpy.magnet.Cuboid( - dimension=(5, 3, 3), - polarization=(1, 0, 0), - position=(9, 0, 0) -).rotate_from_angax(50, 'z', anchor=0) -tool2 = tool1.copy(polarization=(-1,0,0)).rotate_from_angax(-100, 'z', 0) -tool3 = tool1.copy().rotate_from_angax(180, 'z', 0) -tool4 = tool2.copy().rotate_from_angax(180, 'z', 0) -tool = magpy.Collection(tool1, tool2, tool3, tool4) - -# Model of Quadrupole Cylinder -cyl = magpy.magnet.CylinderSegment( - dimension=(2, 5, 1, 0, 360), - polarization=(0, 0, 0), - style_magnetization_show=False, -) - -# Plot 3D model on ax1 -magpy.show(cyl, tool, canvas=ax1, style_legend_show=False, style_magnetization_mode="color") -ax1.view_init(90, -90) - -# Compute and plot tool-field on grid -grid = np.mgrid[-6:6:50j, -6:6:50j, 0:0:1j].T[0] -X, Y, _ = np.moveaxis(grid, 2, 0) - -B = tool.getB(grid) -Bx, By, Bz = np.moveaxis(B, 2, 0) - -ax2.streamplot(X, Y, Bx, By, - color=np.linalg.norm(B, axis=2), - cmap='autumn', - density=1.5, - linewidth=1, -) - -# Outline magnet boundary -ts = np.linspace(0,2*np.pi,200) -ax2.plot(2*np.sin(ts), 2*np.cos(ts), color='k', lw=2) -ax2.plot(5*np.sin(ts), 5*np.cos(ts), color='k', lw=2) - -# Plot styling -ax2.set( - title="B-field in xy-plane", - xlabel="x-position", - ylabel="y-position", - aspect=1, -) - -plt.tight_layout() -plt.show() -``` - -It can be assumed that the polarization that is written into the unmagnetized -Cylinder will, in a lowest order approximation, follow the magnetic field -generated by the magnetization tool. To create a Cylinder magnet with such a -polarization pattern we apply the -[superposition principle](examples-shapes-superpos) and approximate the -inhomogneous polarization as the sum of multiple small homogeneous cells using -the `CylinderSegment` class. Splitting up the Cylinder into many cells is easily -done by hand, but for practicality we make use of the -[magpylib-material-response](https://pypi.org/project/magpylib-material-response/) -package which provides an excellent function for this purpose. - -```{code-cell} ipython -# Continuation from above - ensure previous code is executed - -from magpylib_material_response.meshing import mesh_Cylinder - -# Create figure with 2D and 3D canvas -fig = plt.figure(figsize=(8, 4)) -ax1 = fig.add_subplot(121, projection='3d') -ax2 = fig.add_subplot(122) - -# Show Cylinder cells -mesh = mesh_Cylinder(cyl,30) -magpy.show(*mesh, canvas=ax1, style_magnetization_show=False) - -# Apply polarization -for m in mesh: - Btool = tool.getB(m.barycenter) - m.polarization = Btool/np.linalg.norm(Btool) - -# Compute and plot polarization -J = mesh.getJ(grid) -J[np.linalg.norm(J, axis=2) == 0] = np.nan # remove J=0 from plot -Jx, Jy, _ = np.moveaxis(J, 2, 0) - -Jangle = np.arctan2(Jx, Jy) - -ax2.contourf(X, Y, Jangle, cmap="rainbow", levels=30) -ax2.streamplot(X, Y, Jx, Jy, color='k') - -# Outline magnet boundary -ts = np.linspace(0,2*np.pi,200) -ax2.plot(2*np.sin(ts), 2*np.cos(ts), color='k', lw=2) -ax2.plot(5*np.sin(ts), 5*np.cos(ts), color='k', lw=2) - -# Plot styling -ax2.set( - title="Polarization J in xy-plane", - xlabel="x-position", - ylabel="y-position", - aspect=1, -) -plt.tight_layout() -plt.show() -``` - -The color on the right-hand-side corresponds to the angle of orientation of the -material polarization. Increasing the mesh finesse will improve the -approximation but slow down any field computation at the same time. - -**What is the purpose of this example ?** In addition to demonstrating how -inhomogeneous polarizations can be modeled, this example should raise awareness -that many magnets can look simple on a data sheet (color pattern) but may have -an inhomogeneous, complex, unknown polarization distribution. It goes without -saying that the magnetic field generated by such a magnet, for example in an -angle sensing application, will depend strongly on the polarization. diff --git a/docs/_pages/user_guide/examples/examples_shapes_cad.md b/docs/_pages/user_guide/examples/examples_shapes_cad.md deleted file mode 100644 index b865db9f9..000000000 --- a/docs/_pages/user_guide/examples/examples_shapes_cad.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -orphan: true -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.13.7 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -(examples-shapes-cad)= - -# Magnets from CAD - -The easiest way to create complex magnet shapes from CAD files is through -Pyvista using the [TriangularMesh class](docu-magpylib-api-trimesh). Pyvista -supports \*.stl files, and any open CAD file format is easily transformed to -stl. - -```{warning} -CAD files might include many Triangles, especially when dealing with round sides and edges, that do not significantly contribute to the field and will slow down the Magpylib computation. -``` - -```{code-cell} ipython3 -import pyvista as pv -from magpylib.magnet import TriangularMesh - -# Import *.stl file with Pyvista -mesh = pv.read("logo.stl") - -# Transform into Magpylib magnet -magnet = TriangularMesh.from_pyvista( - polydata=mesh, - polarization=(1,-1,0), - check_disconnected=False, -) -magnet.show(backend="plotly") -``` - -```{hint} -A quick way to work with cad files, especially transforming 2D *.svg to 3D *.stl, is provided by [Tinkercad](https://www.tinkercad.com). -``` diff --git a/docs/_pages/user_guide/examples/examples_shapes_convex_hull.md b/docs/_pages/user_guide/examples/examples_shapes_convex_hull.md deleted file mode 100644 index b706a57f4..000000000 --- a/docs/_pages/user_guide/examples/examples_shapes_convex_hull.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.0 -kernelspec: - display_name: Python 3 - language: python - name: python3 -orphan: true ---- - -(examples-shapes-convex-hull)= - -# Convex Hull - -In geometry the convex hull of a point cloud is the smallest convex shape that -contains all points, see [Wikipedia](https://en.wikipedia.org/wiki/Convex_hull). - -Magpylib offers construction of convex hull magnets by combining the -`magpylib.magnets.TriangularMesh` and the -[scipy.spatial.ConvexHull](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.ConvexHull.html) -classes via the class method `from_ConvexHull`. Note, that the Scipy method does -not guarantee correct face orientations if `reorient_faces` is disabled. - -## Pyramid magnet - -This is the fastest way to construct a pyramid magnet. - -```{code-cell} ipython3 -import numpy as np -import magpylib as magpy - -# Create pyramid magnet -points = np.array([(-2, -2, 0), (-2, 2, 0), (2, -2, 0), (2, 2, 0), (0, 0, 3)]) / 100 -tmesh_pyramid = magpy.magnet.TriangularMesh.from_ConvexHull( - polarization=(0, 0, 1), - points=points, - style_label="Pyramid Magnet", -) - -# Display graphically -tmesh_pyramid.show(backend="plotly") -``` - -```{code-cell} ipython3 - -``` diff --git a/docs/_pages/user_guide/examples/examples_shapes_pyvista.md b/docs/_pages/user_guide/examples/examples_shapes_pyvista.md deleted file mode 100644 index e29b69f21..000000000 --- a/docs/_pages/user_guide/examples/examples_shapes_pyvista.md +++ /dev/null @@ -1,127 +0,0 @@ ---- -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.0 -kernelspec: - display_name: Python 3 - language: python - name: python3 -orphan: true ---- - -(examples-shapes-pyvista)= - -# Pyvista Bodies - -[Pyvista](https://docs.pyvista.org/version/stable/) is a powerful open-source -tool for the creation and visualization of meshes. Pyvista `PolyData` objects -can be directly transformed into Magpylib `TriangularMesh` magnets via the -classmethod `from_pyvista`. - -```{note} -The Pyvista library used in the following examples is not automatically installed with Magpylib. A Pyvista installation guide is found [here](https://docs.pyvista.org/getting-started/installation.html). -``` - -## Dodecahedron Magnet - -In this example a Magpylib magnet is generated directly from a Pyvista body. - -```{code-cell} ipython3 -import numpy as np -import pyvista as pv -import magpylib as magpy - -# Create a simple pyvista PolyData object -dodec_mesh = pv.Dodecahedron(radius=.01) - -dodec = magpy.magnet.TriangularMesh.from_pyvista( - polarization=(0, 0, .1), - polydata=dodec_mesh, -) - -# Add a sensor with path -sens = magpy.Sensor(position=np.linspace((-2,0,1), (2,0,1), 100)/100) - -# Show system and field -with magpy.show_context(dodec, sens, backend='plotly') as s: - s.show(col=1) - s.show(col=2, output=['Bx', 'Bz']) -``` - -## Boolean operations with Pyvista - -With Pyvista it is possible to build complex shapes with boolean geometric -operations. However, such operations often result in open and disconnected -meshes that require some refinement to produce solid magnets. The following -example demonstrates the problem, how to analyze and fix it. - -```{code-cell} ipython3 -import pyvista as pv -import magpylib as magpy - -# Create a complex pyvista PolyData object using a boolean operation -sphere = pv.Sphere(radius=0.006) -cube = pv.Cube(x_length=.01, y_length=.01, z_length=.01).triangulate() -obj = cube.boolean_difference(sphere) - -# Construct magnet from PolyData object and ignore check results -magnet = magpy.magnet.TriangularMesh.from_pyvista( - polarization=(0, 0, .1), - polydata=obj, - check_disconnected="ignore", - check_open="ignore", - reorient_faces="ignore", - style_label="magnet", -) - -print(f'mesh status open: {magnet.status_open}') -print(f'mesh status disconnected: {magnet.status_disconnected}') -print(f"mesh status self-intersecting: {magnet.status_selfintersecting}") -print(f'mesh status reoriented: {magnet.status_reoriented}') - -magnet.show( - backend="plotly", - style_mesh_open_show=True, - style_mesh_disconnected_show=True, -) -``` - -The result cannot be used for magnetic field computation. Even if all faces were -present, the reorient-faces algorithm would fail when these faces are -disconnected. Such problems can be fixed by - -1. giving Pyvista a finer mesh to work with from the start -2. Pyvista mesh cleaning (merge duplicate points, remove unused points, remove - degenerate faces) - -The following code produces a clean magnet. - -```{code-cell} ipython3 -import pyvista as pv -import magpylib as magpy - -# Create a complex Pyvista PolyData object using a boolean operation. Start with -# finer mesh and clean after operation -sphere = pv.Sphere(radius=0.6) -cube = pv.Cube().triangulate().subdivide(2) -obj = cube.boolean_difference(sphere) -obj = obj.clean() -obj = obj.scale([1e-2]*3) - -# Construct magnet from PolyData object -magnet = magpy.magnet.TriangularMesh.from_pyvista( - polarization=(0, 0, .1), - polydata=obj, - style_label="magnet", -) - -print(f'mesh status open: {magnet.status_open}') -print(f'mesh status disconnected: {magnet.status_disconnected}') -print(f"mesh status self-intersecting: {magnet.status_selfintersecting}") -print(f'mesh status reoriented: {magnet.status_reoriented}') - -magnet.show(backend="plotly") -``` diff --git a/docs/_pages/user_guide/examples/examples_shapes_superpos.md b/docs/_pages/user_guide/examples/examples_shapes_superpos.md deleted file mode 100644 index 62428c3a4..000000000 --- a/docs/_pages/user_guide/examples/examples_shapes_superpos.md +++ /dev/null @@ -1,215 +0,0 @@ ---- -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.0 -kernelspec: - display_name: Python 3 - language: python - name: python3 -orphan: true ---- - -(examples-shapes-superpos)= - -# Superposition - -The -[superposition principle](https://en.wikipedia.org/wiki/Superposition_principle) -states that the net response caused by two or more stimuli is the sum of the -responses caused by each stimulus individually. This principle holds in -magnetostatics when there is no material response, and simply states that the -total field created by multiple magnets and currents is the sum of the -individual fields. - -When two magnets overlap geometrically, the magnetization in the overlap region -is given by the vector sum of the two individual magnetizations. This enables -two geometric operations, - -:::::{grid} 1 2 2 2 :gutter: 4 - -::::{grid-item-card} Union :img-bottom: -../../../\_static/images/docu_field_superpos_union.png :shadow: None Build -complex forms by aligning base shapes (no overlap) with each other with similar -magnetization vector. :::: - -::::{grid-item-card} Cut-Out :img-bottom: -../../../\_static/images/docu_field_superpos_cutout.png :shadow: None When two -objects with opposing magnetization vectors of similar amplitude overlap, they -will just cancel in the overlap region. This enables geometric cut-out -operations. :::: ::::: - -## Union operation - -Geometric union by superposition is demonstrated in the following example where -a wedge-shaped magnet with a round back is constructed from three base-forms: a -CylinderSegment, a Cuboid and a TriangularMesh. - -```{code-cell} ipython3 -import numpy as np -import magpylib as magpy - -# Create three magnet parts with similar polarization -pt1 = magpy.magnet.CylinderSegment( - polarization=(0.5, 0, 0), - dimension=(0, 0.04, 0.02, 90, 270), -) -pt2 = magpy.magnet.Cuboid( - polarization=(0.5, 0, 0), dimension=(0.02, 0.08, 0.02), position=(0.01, 0, 0) -) -pt3 = magpy.magnet.TriangularMesh.from_ConvexHull( - polarization=(0.5, 0, 0), - points=np.array( - [(2, 4, -1), (2, 4, 1), (2, -4, -1), (2, -4, 1), (6, 0, 1), (6, 0, -1)] - ) - / 100, -) - -# Combine parts in a Collection -magnet = magpy.Collection(pt1, pt2, pt3) - -# Add a sensor with path -sensor = magpy.Sensor() -sensor.position = np.linspace((7, -10, 0), (7, 10, 0), 100) / 100 - -# Plot -with magpy.show_context(magnet, sensor, backend="plotly", style_legend_show=False) as s: - s.show(col=1) - s.show(output="B", col=2) -``` - -## Cut-out operation - -When two objects with opposing magnetization vectors of similar amplitude -overlap, they will just cancel in the overlap region. This enables geometric -cut-out operations. In the following example we construct an exact hollow -cylinder solution from two concentric cylinder shapes with opposite -magnetizations and compare the result to the `CylinderSegment` class solution. - -Here the `getM` and `getJ` functions come in handy. They allow us to see the -magnetization distribution that is the result of the superposition. - -```{code-cell} ipython3 -import numpy as np -import matplotlib.pyplot as plt -import magpylib as magpy - -fig, [ax1, ax2] = plt.subplots(1, 2, figsize=(12, 5)) - -# Create ring with cut-out -inner = magpy.magnet.Cylinder(polarization=(0, 0, -1), dimension=(4, 5)) -outer = magpy.magnet.Cylinder(polarization=(0, 0, 1), dimension=(6, 5)) -ring0 = inner + outer - -# Compute and plot Magnetization in xy-plane -grid = np.mgrid[-4:4:100j, -4:4:100j, 0:0:1j].T[0] -X, Y, _ = np.moveaxis(grid, 2, 0) - -M = np.linalg.norm(ring0.getM(grid), axis=2) -ax1.contourf(X, Y, M, cmap=plt.cm.hot_r) - -# Compute and plot Magnetization in xz-plane -grid = np.mgrid[-4:4:100j, 0:0:1j, -4:4:100j].T[:,0] -X, _, Z = np.moveaxis(grid, 2, 0) - -M = np.linalg.norm(ring0.getM(grid), axis=2) -ax2.contourf(X, Z, M, cmap=plt.cm.hot_r) - -# Plot styling -ax1.set( - title="|M| in xy-plane", - xlabel="x-position", - ylabel="y-position", - aspect=1, - xlim=(-4,4), - ylim=(-4,4), -) -ax2.set( - title="|M| in xz-plane", - xlabel="x-position", - ylabel="z-position", - aspect=1, - xlim=(-4,4), - ylim=(-4,4), -) - -plt.tight_layout() -plt.show() -``` - -The two figures show that the magnetization is zero outside of the cylinder, as -well as in the overlap region where the two magnetizations cancel. - -Finally, we want to show that the superposition gives the same result as a -computation from the CylinderSegment solution. - -```{code-cell} ipython3 -# Continuation from above - ensure previous code is executed - -from magpylib.magnet import Cylinder, CylinderSegment - -# Create ring with CylinderSegment -ring1 = CylinderSegment(polarization=(0, 0, .1), dimension=(2, 3, 5, 0, 360)) - -# Print results -print("CylinderSegment result:", ring1.getB((.01, .02, .03))) -print(" Cut-out result:", ring0.getB((.01, .02, .03))) -``` - -Note that it is faster to compute the `Cylinder` field two times than computing -the `CylinderSegment` field one time. This is why Magpylib automatically falls -back to the `Cylinder` solution whenever `CylinderSegment` is called with 360 -deg section angles. - -Unfortunately, with respect to 3D-models, cut-out operations cannot be displayed -graphically at this point in time, but {ref}`examples-own-3d-models` offer -custom solutions. - -## Nice example - -The following example combines union and cut-out to create a complex magnet -shape which is then displayed by combining a streamplot with a contourplot in -matplotlib. - -```{code-cell} ipython3 -import numpy as np -import matplotlib.pyplot as plt -import magpylib as magpy - -fig, ax = plt.subplots(1, 1, figsize=(6, 5)) - -# Create a magnet with superposition and cut-out -pt1 = magpy.magnet.Cuboid( - polarization=(1, 0, 0), dimension=(4, 8, 2), position=(-2, 0, 0) -) -pt2 = magpy.magnet.CylinderSegment( - polarization=(1, 0, 0), dimension=(0, 4, 2,-90,90) -) -pt3 = magpy.magnet.Cuboid( - polarization=(-1/np.sqrt(2), 1/np.sqrt(2), 0), dimension=(4, 4, 2), -).rotate_from_angax(45, 'z') -magnet = magpy.Collection(pt1, pt2, pt3) - -# Compute J on mesh and plot with streamplot -grid = np.mgrid[-6:6:100j, -6:6:100j, 0:0:1j].T[0] -X, Y, _ = np.moveaxis(grid, 2, 0) - -J = magnet.getJ(grid) -J[J<1e-12] = 0 # cut off numerically small values -Jx, Jy, _ = np.moveaxis(J, 2, 0) - -ax.contourf(X, Y, np.linalg.norm(J,axis=2), cmap=plt.cm.cool) -ax.streamplot(X, Y, Jx, Jy, color='k', density=1.5) - -# Plot styling -ax.set( - title="Polarization J in xy-plane", - xlabel="x-position", - ylabel="y-position", - aspect=1, -) -plt.tight_layout() -plt.show() -``` diff --git a/docs/_pages/user_guide/examples/examples_shapes_triangle.md b/docs/_pages/user_guide/examples/examples_shapes_triangle.md deleted file mode 100644 index ec7514d80..000000000 --- a/docs/_pages/user_guide/examples/examples_shapes_triangle.md +++ /dev/null @@ -1,225 +0,0 @@ ---- -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.15.2 -kernelspec: - display_name: Python 3 (ipykernel) - language: python - name: python3 -orphan: true ---- - -(examples-shapes-triangle)= - -# Triangular Meshes - -The magnetic field of a homogeneously magnetized body is equivalent to the field -of a charged surface. The surface is the hull of the body, and the charge -density is proportional to the projection of the magnetization vector onto the -surface normal. - -It is very common to approximate the surface of bodies by triangular meshes, -which can then be transformed into magnets using the `Triangle` and the -`TriangularMesh` classes. When using these classes one should abide by the -following rules: - -1. The surface must be closed, or all missing faces must have zero charge - (magnetization vector perpendicular to surface normal). -2. All triangles are oriented outwards (right-hand-rule) -3. The surface must not be self-intersecting. -4. For the B-field magnetic polarization must be added on the inside of the - body. - -## Cuboctahedron Magnet - -In this example `Triangle` is used to create a magnet with cuboctahedral shape. -Notice that triangle orientation is displayed by default for convenience. - -```{code-cell} ipython3 -import magpylib as magpy -import numpy as np - -# Create collection of triangles -triangles_cm = [ - ([0, 1, -1], [-1, 1, 0], [1, 1, 0]), - ([0, 1, 1], [1, 1, 0], [-1, 1, 0]), - ([0, 1, 1], [-1, 0, 1], [0, -1, 1]), - ([0, 1, 1], [0, -1, 1], [1, 0, 1]), - ([0, 1, -1], [1, 0, -1], [0, -1, -1]), - ([0, 1, -1], [0, -1, -1], [-1, 0, -1]), - ([0, -1, 1], [-1, -1, 0], [1, -1, 0]), - ([0, -1, -1], [1, -1, 0], [-1, -1, 0]), - ([-1, 1, 0], [-1, 0, -1], [-1, 0, 1]), - ([-1, -1, 0], [-1, 0, 1], [-1, 0, -1]), - ([1, 1, 0], [1, 0, 1], [1, 0, -1]), - ([1, -1, 0], [1, 0, -1], [1, 0, 1]), - ([0, 1, 1], [-1, 1, 0], [-1, 0, 1]), - ([0, 1, 1], [1, 0, 1], [1, 1, 0]), - ([0, 1, -1], [-1, 0, -1], [-1, 1, 0]), - ([0, 1, -1], [1, 1, 0], [1, 0, -1]), - ([0, -1, -1], [-1, -1, 0], [-1, 0, -1]), - ([0, -1, -1], [1, 0, -1], [1, -1, 0]), - ([0, -1, 1], [-1, 0, 1], [-1, -1, 0]), - ([0, -1, 1], [1, -1, 0], [1, 0, 1]), -] -triangles = np.array(triangles_cm) / 100 # cm -> m -cuboc = magpy.Collection() -for t in triangles: - cuboc.add( - magpy.misc.Triangle( - polarization=(0.1, 0.2, 0.3), - vertices=t, - ) - ) - -# Display collection of triangles -magpy.show( - cuboc, - backend="pyvista", - style_magnetization_mode="arrow", - style_orientation_color="yellow", -) -``` - -## Triangular Prism Magnet - -Consider a prism with triangular base that is magnetized orthogonal to the base. -All surface normals of the sides of the prism are orthogonal to the -magnetization vector. As a result, the sides do not contribute to the magnetic -field because their charge density disappears. Only the top and bottom surfaces -contribute. One must be very careful when defining those surfaces in such a way -that the surface normals point outwards. - -Leaving out parts of the surface that do not contribute to the field is -beneficial for computation speed. - -```{code-cell} ipython3 -import magpylib as magpy - -# Create prism magnet as triangle collection -top = magpy.misc.Triangle( - polarization=(0, 0, 1), - vertices=((-0.01, -0.01, 0.01), (0.01, -0.01, 0.01), (0, 0.02, 0.01)), - style_label="top", -) -bott = magpy.misc.Triangle( - polarization=(0, 0, 1), - vertices=((-0.01, -0.01, -0.01), (0, 0.02, -0.01), (0.01, -0.01, -0.01)), - style_label="bottom", -) -prism = magpy.Collection(top, bott) - -# Display graphically -magpy.show(*prism, backend="plotly", style_opacity=0.5, style_magnetization_show=False) -``` - -## TriangularMesh class - -While `Triangle` simply provides the field of a charged triangle and can be used -to construct complex forms, it is prone to error and tedious to work with when -meshes become large. For this purpose, the `TriangularMesh` class ensures proper -and convenient magnet creation by automatically checking mesh integrity and by -orienting the faces at initialization. - -```{attention} -Automatic face reorientation of `TriangularMesh` may fail when the mesh is open. -``` - -In this example we revisit the cuboctahedron but generate it through the -`TriangularMesh` class. - -```{code-cell} ipython3 -import magpylib as magpy -import numpy as np - -# Create cuboctahedron magnet (vertices and faces are transposed here for more compact display) -vertices_cm = [ - [0, -1, 1, 0, -1, 0, 1, 1, 0, -1, -1, 1], - [1, 1, 1, 1, 0, -1, 0, 0, -1, 0, -1, -1], - [-1, 0, 0, 1, 1, 1, 1, -1, -1, -1, 0, 0], -] -vertices = np.array(vertices_cm).T / 100 # cm -> m -faces = [ - [0, 3, 3, 3, 0, 0, 5, 8, 1, 10, 2, 11, 3, 3, 0, 0, 8, 8, 5, 5], - [1, 2, 4, 5, 7, 8, 10, 11, 9, 4, 6, 7, 1, 6, 9, 2, 10, 7, 4, 11], - [2, 1, 5, 6, 8, 9, 11, 10, 4, 9, 7, 6, 4, 2, 1, 7, 9, 11, 10, 6], -] -faces = np.array(faces).T -cuboc = magpy.magnet.TriangularMesh( - polarization=(0.1, 0.2, 0.3), vertices=vertices, faces=faces -) - -# Display TriangularMesh body -magpy.show( - cuboc, backend="plotly", style_mesh_grid_show=True, style_mesh_grid_line_width=4 -) -``` - -The `TriangularMesh` class is extremely powerful as it enables almost arbitrary -magnet shapes. It is described in detail in {ref}`docu-magpylib-api-trimesh`. -There are many ways to generate such triangular meshes. An example thereof is -shown in {ref}`examples-shapes-pyvista`. - -```{caution} -* `getB` and `getH` compute the fields correctly only if the mesh is closed, not self-intersecting, and all faces are properly oriented outwards. - -* Input checks and face reorientation can be computationally expensive. The checks can individually be deactivated by setting `reorient_faces="skip"`, `check_open="skip"`, `check_disconnected="skip"`, and `check_selfintersecting="skip"` at initialization of `TriangularMesh` objects. The checks can also be performed by hand after initialization. - -* Meshing tools such as the [Pyvista](https://docs.pyvista.org/) library can be very convenient for building complex shapes, but often do not guarantee that the mesh is properly closed or connected - see {ref}`examples-shapes-pyvista`. - -* Meshing tools often create meshes with a lot of faces, especially when working with curved surfaces. Keep in mind that field computation takes of the order of a few microseconds per observer position per face, and that RAM is a limited resource. -``` - -## Open TriangularMesh - -In some cases, it may be desirable to generate a `TriangularMesh` object from an -open mesh (see Prism example above). In this case one must be extremely careful -because one cannot rely on the checks. Not to generate warnings or error -messages, these checks can be disabled with `"skip"` or their outcome can be -ignored with `"ignore"`. The `show` function can be used to view open edges and -disconnected parts. In the following example we generate such an open mesh -directly from `Triangle` objects. - -```{code-cell} ipython3 -import magpylib as magpy -import numpy as np - -# Create top and bottom faces of a prism magnet -top = magpy.misc.Triangle( - polarization=(1, 0, 0), - vertices=((-0.01, -0.01, 0.01), (0.01, -0.01, 0.01), (0, 0.02, 0.01)), -) -bottom = magpy.misc.Triangle( - polarization=(1, 0, 0), - vertices=((-0.01, -0.01, -0.01), (0, 0.02, -0.01), (0.01, -0.01, -0.01)), -) - -# Create prism with open edges -prism = magpy.magnet.TriangularMesh.from_triangles( - polarization=(0, 0, 1), # overrides triangles magnetization - triangles=[top, bottom], - check_open="ignore", # check but ignore open mesh - check_disconnected="ignore", # check but ignore disconnected mesh - reorient_faces="ignore", # check but ignore non-orientable mesh -) -prism.style.label = "Open Prism" -prism.style.magnetization.mode = "arrow" - -print("mesh status open:", prism.status_open) -print("mesh status disconnected:", prism.status_disconnected) -print("mesh status self-intersecting:", prism.status_selfintersecting) -print("mesh status reoriented:", prism.status_reoriented) - -prism.show( - backend="plotly", - style_mesh_open_show=True, - style_mesh_disconnected_show=True, -) -``` - -```{caution} -Keep in mind that the inside-outside check will fail, so that `getB` may yield wrong results on the inside of the prism where the polarization vector should be added. -``` diff --git a/docs/_pages/user_guide/examples/examples_tutorial_collection.md b/docs/_pages/user_guide/examples/examples_tutorial_collection.md deleted file mode 100644 index 5246445ea..000000000 --- a/docs/_pages/user_guide/examples/examples_tutorial_collection.md +++ /dev/null @@ -1,299 +0,0 @@ ---- -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.0 -kernelspec: - display_name: Python 3 - language: python - name: python3 -orphan: true ---- - -(examples-tutorial-collection)= - -# Working with Collections - -The top-level class `Collection` allows users to group objects by reference for -common manipulation. The following concepts apply to Magpylib Collections: - -1. A collection spans its own local frame of reference with position and - orientation, to which the children are added. Thus, any operation applied to - the collection is individually applied to all its children. -2. The collection itself behaves like a single Magpylib object (can be source - and/or observer). -3. All children inside the collection can be individually addressed and - manipulated, which will automatically manipulate their state inside the - parent collection. -4. Collections have their own `style` attributes, their paths are displayed in - `show`, and all children are automatically assigned their parent color. - -## Constructing Collections - -Collections have the attributes `children`, `sources`, `sensors` and -`collections`. These attributes are ordered lists that contain objects that are -added to the collection by reference (not copied). `children` returns a list of -all objects in the collection. `sources` returns a list of the sources, -`sensors` a list of the sensors and `collections` a list of "sub-collections" -within the collection. - -```{code-cell} ipython3 -import magpylib as magpy - -x1 = magpy.Sensor(style_label="x1") -s1 = magpy.magnet.Cuboid(style_label="s1") -c1 = magpy.Collection(style_label="c1") - -coll = magpy.Collection(x1, s1, c1, style_label="coll") - -print(f"children: {coll.children}") -print(f"sources: {coll.sources}") -print(f"sensors: {coll.sensors}") -print(f"collections: {coll.collections}") -``` - -New additions are always added at the end. Use the **`add`** method or the -parameters. - -```{code-cell} ipython3 -# Continuation from above - ensure previous code is executed - -# Copy adjusts object label automatically -x2 = x1.copy() -s2 = s1.copy() -c2 = c1.copy() - -# Add objects with add method -coll.add(x2, s2) - -# Add objects with parameters -coll.collections += [c2] - -print(f"children: {coll.children}") -print(f"sources: {coll.sources}") -print(f"sensors: {coll.sensors}") -print(f"collections: {coll.collections}") -``` - -The **`describe`** method is a very convenient way to view a Collection -structure, especially when the collection is nested, i.e., when containing other -collections. - -```{code-cell} ipython3 -# Continuation from above - ensure previous code is executed - -# Add more objects -c1.add(x2.copy()) -c2.add(s2.copy()) - -coll.describe(format="label+type") -``` - -The parameter `format` can be any combination of `"type"`, `"label"`, `"id"` and -`"properties"`. - -For convenience, any two Magpylib objects can be added up with `+` to form a -collection. - -```{code-cell} ipython3 -import magpylib as magpy - -x1 = magpy.Sensor(style_label="x1") -s1 = magpy.magnet.Cuboid(style_label="s1") - -coll = x1 + s1 - -coll.describe(format="label") -``` - -## Child-Parent Relations - -Objects that are part of a collection become children of that collection, and -the collection itself becomes their parent. Every Magpylib object has the -`parent` attribute, which is `None` by default. - -```{code-cell} ipython3 -import magpylib as magpy - -x1 = magpy.Sensor() -c1 = magpy.Collection(x1) - -print(f"x1.parent: {x1.parent}") -print(f"c1.parent: {c1.parent}") -print(f"c1.children: {c1.children}") -``` - -Rather than adding objects to a collection, as described above, one can also set -the `parent` parameter. A Magpylib object can only have a single parent, i.e., -it can only be part of a single collection. As a result, changing the parent -will automatically remove the object from its previous collection. - -```{code-cell} ipython3 -import magpylib as magpy - -x1 = magpy.Sensor(style_label="x1") -c1 = magpy.Collection(style_label="c1") -c2 = magpy.Collection(c1, style_label="c2") - -print("Two empty, nested collections") -c2.describe(format="label") - -print("\nSet x1 parent to c1") -x1.parent = c1 -c2.describe(format="label") - -print("\nChange x1 parent to c2") -x1.parent = c2 -c2.describe(format="label") -``` - -## Accessing Children - -Collections have `__getitem__` through the attribute `children` defined which -enables using collections directly as iterators, - -```{code-cell} ipython3 -import magpylib as magpy - -x1 = magpy.Sensor() -x2 = magpy.Sensor() - -coll = x1 + x2 - -for child in coll: - print(child) -``` - -and makes it possible to directly reference to a child object by index: - -```{code-cell} ipython3 -# Continuation from above - ensure previous code is executed - -print(coll[0]) -``` - -Collection nesting is powerful to create a self-consistent hierarchical -structure, however, it is often in the way of quick child access in nested -trees. For this, the `children_all`, `sources_all`, `sensors_all` and -`collections_all` read-only parameters, return all objects in the tree: - -```{code-cell} ipython3 -import magpylib as magpy - -s1 = magpy.Sensor(style_label="s1") -s2 = s1.copy() -s3 = s2.copy() - -# This creates a nested collection -coll = s1 + s2 + s3 -coll.describe(format="label") - -# _all gives access to the whole tree -print([s.style.label for s in coll.sensors_all]) -``` - -## Practical Example - -The following example demonstrates how collections enable user-friendly -manipulation of groups, sub-groups, and individual objects. - -```{code-cell} ipython3 -import numpy as np -import magpylib as magpy - -# Construct two coils from windings -coil1 = magpy.Collection(style_label="coil1") -for z in np.linspace(-0.0005, 0.0005, 5): - coil1.add(magpy.current.Circle(current=1, diameter=0.02, position=(0, 0, z))) -coil1.position = (0, 0, -0.005) -coil2 = coil1.copy(position=(0, 0, 0.005)) - -# Helmholtz consists of two coils -helmholtz = coil1 + coil2 - -# Move the helmholtz -helmholtz.position = np.linspace((0, 0, 0), (0.01, 0, 0), 15) -helmholtz.rotate_from_angax(np.linspace(0, 180, 15), "x", start=0) - -# Move the coils -coil1.move(np.linspace((0, 0, 0), (0.005, 0, 0), 15)) -coil2.move(np.linspace((0, 0, 0), (-0.005, 0, 0), 15)) - -# Move the windings -for coil in [coil1, coil2]: - for i, wind in enumerate(coil): - wind.move(np.linspace((0, 0, 0), (0, 0, (2 - i) * 0.001), 15)) - -# Display as animation -magpy.show(*helmholtz, animation=True, style_path_show=False) -``` - -For magnetic field computation, a collection with source children behaves like a -single source object, and a collection with sensor children behaves like a flat -list of its sensors when provided as `sources` and `observers` input -respectively. - -```{code-cell} ipython3 -# Continuation from above - ensure previous code is executed - -import matplotlib.pyplot as plt - -B = magpy.getB(helmholtz, (0.01, 0, 0)) -plt.plot( - B * 1000, # T -> mT - label=["Bx", "By", "Bz"], -) - -plt.gca().set( - title="B-field (mT) at position x=10mm", xlabel="helmholtz path position index" -) -plt.gca().grid(color=".9") -plt.gca().legend() -plt.show() -``` - -## Efficient 3D Models - -The graphical backend libraries were not designed for complex 3D graphic output. -As a result, it often becomes inconvenient and slow when attempting to display -many 3D objects. One solution to this problem when dealing with large -collections is to represent the latter by a single encompassing body, and to -deactivate the individual 3D models of all children. - -```{code-cell} ipython3 -import magpylib as magpy - -# Create collection -coll = magpy.Collection() -for index in range(10): - cuboid = magpy.magnet.Cuboid( - polarization=(0, 0, (index % 2 - 0.5)), - dimension=(0.01, 0.01, 0.01), - position=(index * 0.01, 0, 0), - ) - coll.add(cuboid) - -# Add an encompassing 3D-trace -trace = magpy.graphics.model3d.make_Cuboid( - dimension=(0.104, 0.012, 0.012), - position=(0.045, 0, 0), - opacity=0.5, -) -coll.style.model3d.add_trace(trace) - -coll.style.label = "Collection with visible children" -coll.show() - -# Hide the children default 3D representation -coll.set_children_styles(model3d_showdefault=False) -coll.style.label = "Collection with hidden children" -coll.show() -``` - -## Compound Objects - -Collections can be subclassed to form dynamic groups that seamlessly integrate -into Magpylib. Such classes are referred to as **compounds**. An example of how -this is done is shown in {ref}`examples-misc-compound`. diff --git a/docs/_pages/user_guide/examples/examples_tutorial_custom.md b/docs/_pages/user_guide/examples/examples_tutorial_custom.md deleted file mode 100644 index b2a63bbaf..000000000 --- a/docs/_pages/user_guide/examples/examples_tutorial_custom.md +++ /dev/null @@ -1,267 +0,0 @@ ---- -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.0 -kernelspec: - display_name: Python 3 - language: python - name: python3 -orphan: true ---- - -(examples-tutorial-custom)= - -# CustomSource - -The {ref}`guide-docs-classes-custom-source` class was implemented to offer easy -integration of user field implementations into Magpylib's object-oriented -interface. - -```{note} -Obviously, any field implementation can be integrated. Specifically, fields where superposition holds and interactions do not disturb the sources (e.g. electric, gravitational, ...) can benefit from Magpylib's position and orientation interface. -``` - -## Magnetic Monopole - -In this example we create a class that represents the elusive magnetic monopole, -which would have a magnetic field like this - -$$ -{\bf B} = Q_m \frac{{\bf r}}{|{\bf r}|^3}. -$$ - -Here the monopole lies in the origin of the local coordinates, $Q_m$ is the -monopole charge and ${\bf r}$ is the observer position. - -We create this field as a Python function and hand it over to a CustomSource -`field_func` argument. The `field_func` input must be a callable with two -positional arguments `field` (can be `'B'` or `'H'`) and `observers` (must -accept ndarrays of shape (n,3)), and return the respective fields in units of T -and A/m in the same shape. - -```{code-cell} ipython3 -import numpy as np -import magpylib as magpy - -# Create monopole field -def mono_field(field, observers): - """ - Monopole field - - field: string, "B" or "H - return B or H-field - - observers: array_like of shape (n,3) - Observer positions - - Returns: np.ndarray, shape (n,3) - Magnetic monopole field - """ - Qm = 1 # unit T·m² - obs = np.array(observers).T # unit m - B = Qm * (obs / np.linalg.norm(obs, axis=0) ** 3).T # unit T - if field == "B": - return B # unit T - elif field == "H": - H = B / magpy.mu_0 # unit A/m - return H - else: - raise ValueError("Field Value must be either B or H") - -# Create CustomSource with monopole field -mono = magpy.misc.CustomSource(field_func=mono_field) - -# Compute field -print(mono.getB((1, 0, 0))) -print(mono.getH((1, 0, 0))) -``` - -Multiple of these sources can now be combined, making use of the Magpylib -position/orientation interface. - -```{code-cell} ipython3 -# Continuation from above - ensure previous code is executed - -import matplotlib.pyplot as plt - -# Create two monopole charges -mono1 = magpy.misc.CustomSource(field_func=mono_field, position=(2, 2, 0)) -mono2 = magpy.misc.CustomSource(field_func=mono_field, position=(-2, -2, 0)) - -# Compute field on observer-grid -grid = np.mgrid[-5:5:100j, -5:5:100j, 0:0:1j].T[0] -X, Y, _ = np.moveaxis(grid, 2, 0) - -B = magpy.getB([mono1, mono2], grid, sumup=True) -Bx, By, _ = np.moveaxis(B, 2, 0) -normB = np.linalg.norm(B, axis=2) - -# Plot field in x-y symmetry plane -cp = plt.contourf(X, Y, np.log10(normB), cmap="gray_r", levels=10) -plt.streamplot(X, Y, Bx, By, color="k", density=1) - -plt.title("Field of two Monopoles") -plt.xlabel("x-position (m)") -plt.ylabel("y-position (m)") - -plt.tight_layout() -plt.show() -``` - -## Adding a 3D model - -While `CustomSource` is graphically represented by a simple marker by default, -we can easily add a 3D model as described in {ref}`examples-own-3d-models`. - -```{code-cell} ipython3 -# Continuation from above - ensure previous code is executed - -# Load Sphere model -trace_pole = magpy.graphics.model3d.make_Ellipsoid( - dimension=np.array([.3, .3, .3]), -) - -for mono in [mono1, mono2]: - # Turn off default model - mono.style.model3d.showdefault = False - - # Add sphere model - mono.style.model3d.add_trace(trace_pole) - -# Display models -magpy.show(mono1, mono2) -``` - -## Subclassing CustomSource - -In the above example it would be nice to make the `CustomSource` dynamic, so -that it would have a property `charge` that can be changed at will, rather than -having to redefine the `field_func` and initialize a new object every time. In -the following example we show how to sub-class `CustomSource` to achieve this. -The problem is reminiscent of {ref}`examples-misc-compound`. - -```{code-cell} ipython3 -import numpy as np -import magpylib as magpy - -class Monopole(magpy.misc.CustomSource): - """Magnetic Monopole class - - Parameters - ---------- - charge: float - Monopole charge in units of T·m² - """ - - def __init__(self, charge, **kwargs): - super().__init__(**kwargs) # hand over style kwargs - self._charge = charge - - # Add spherical 3d model - trace_pole = magpy.graphics.model3d.make_Ellipsoid( - dimension=np.array([.3, .3, .3]), - ) - self.style.model3d.showdefault = False - self.style.model3d.add_trace(trace_pole) - - # Add monopole field_func - self._update() - - def _update(self): - """Apply monopole field function""" - - def mono_field(field, observers): - """monopole field""" - Qm = self._charge # unit T·m² - obs = np.array(observers).T # unit m - B = Qm * (obs / np.linalg.norm(obs, axis=0) ** 3).T # unit T - if field == "B": - return B # unit T - elif field == "H": - H = B / magpy.mu_0 # unit A/m - return H - else: - raise ValueError("Field Value must be either B or H") - - self.style.label = f"Monopole (charge={self._charge} T·m²)" - self.field_func = mono_field - - @property - def charge(self): - """Return charge""" - return self._charge - - @charge.setter - def charge(self, input): - """Set charge""" - self._charge = input - self._update() - -# Use new class -mono = Monopole(charge=1) -print(mono.getB((1, 0, 0))) - -# Change property charge of object -mono.charge = -1 -print(mono.getB((1, 0, 0))) -``` - -The new class seamlessly integrates into the Magpylib interface as we show in -the following example where we have a look at the Quadrupole field. - -```{code-cell} ipython3 -# Continuation from above - ensure previous code is executed - -import matplotlib.pyplot as plt - -# Create a quadrupole from four monopoles -mono1 = Monopole(charge=1, style_color="r", position=(1, 0, 0)) -mono2 = Monopole(charge=1, style_color="r", position=(-1, 0, 0)) -mono3 = Monopole(charge=-1, style_color="b", position=(0, 0, 1)) -mono4 = Monopole(charge=-1, style_color="b", position=(0, 0, -1)) -qpole = magpy.Collection(mono1, mono2, mono3, mono4) - -# Matplotlib figure with 3d and 2d axis -fig = plt.figure(figsize=(10, 5)) -ax1 = fig.add_subplot(121, projection="3d", azim=-80, elev=15) -ax2 = fig.add_subplot(122) - -# Show 3D model in ax1 -magpy.show(*qpole, canvas=ax1, style_legend_show=False) - -# Compute B-field on xz-grid and display in ax2 -grid = np.mgrid[-2:2:100j, 0:0:1j, -2:2:100j].T[:,0] -X, _, Z = np.moveaxis(grid, 2, 0) - -B = qpole.getB(grid) -Bx, _, Bz = np.moveaxis(B, 2, 0) -scale = np.linalg.norm(B, axis=2)**.3 - -cp = ax2.contourf(X, Z, np.log(scale), levels=100, cmap="rainbow") -ax2.streamplot(X, Z, Bx, Bz, density=2, color="k", linewidth=scale) - -# Display pole position in ax2 -ppos = np.array([mono.position for mono in qpole]) -ax2.plot(ppos[:, 0], ppos[:, 2], marker="o", ms=10, mfc="k", mec="w", ls="") - -# Figure styling -ax1.set( - title="3D model", - xlabel="x-position (m)", - ylabel="y-position (m)", - zlabel="z-position (m)", -) -ax2.set( - title="Quadrupole field", - xlabel="x-position (m)", - ylabel="z-position (m)", - aspect=1, -) -fig.colorbar(cp, ax=ax2) - -plt.tight_layout() -plt.show() -``` diff --git a/docs/_pages/user_guide/examples/examples_tutorial_field_computation.md b/docs/_pages/user_guide/examples/examples_tutorial_field_computation.md deleted file mode 100644 index 0c2890f9d..000000000 --- a/docs/_pages/user_guide/examples/examples_tutorial_field_computation.md +++ /dev/null @@ -1,288 +0,0 @@ ---- -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.0 -kernelspec: - display_name: Python 3 - language: python - name: python3 -orphan: true ---- - -(examples-tutorial-field-computation)= - -# Computing the Field - -## Most basic Example - -The v2 slogan was _"The magnetic field is only three lines of code away"_, which -is demonstrated by the following most fundamental and self-explanatory example, - -```{code-cell} ipython3 -import magpylib as magpy -loop = magpy.current.Circle(current=1, diameter=1) -B = loop.getB((0, 0, 0)) - -print(B) -``` - -## Field on a Grid - -There are four field computation functions: `getB` will compute the B-field in -T. `getH` computes the H-field in A/m. `getJ` computes the magnetic polarization -in units of T. `getM` computes the magnetization in units of A/m. - -All these functions will return the field in the shape of the input. In the -following example, BHJM-fields of a diametrically magnetized cylinder magnet are -computed on a position grid in the symmetry plane and are then displayed using -Matplotlib. - -```{code-cell} ipython3 -import matplotlib.pyplot as plt -import numpy as np -from numpy.linalg import norm -import magpylib as magpy - -fig, [[ax1,ax2], [ax3,ax4]] = plt.subplots(2, 2, figsize=(10, 10)) - -# Create an observer grid in the xy-symmetry plane -grid = np.mgrid[-50:50:100j, -50:50:100j, 0:0:1j].T[0] -X, Y, _ = np.moveaxis(grid, 2, 0) - -# Compute BHJM-fields of a cylinder magnet on the grid -cyl = magpy.magnet.Cylinder(polarization=(0.5, 0.5, 0), dimension=(40, 20)) - -B = cyl.getB(grid) -Bx, By, _ = np.moveaxis(B, 2, 0) - -H = cyl.getH(grid) -Hx, Hy, _ = np.moveaxis(H, 2, 0) - -J = cyl.getJ(grid) -Jx, Jy, _ = np.moveaxis(J, 2, 0) - -M = cyl.getM(grid) -Mx, My, _ = np.moveaxis(M, 2, 0) - -# Display field with Pyplot -ax1.streamplot(X, Y, Bx, By, color=np.log(norm(B, axis=2)), cmap="spring_r") -ax2.streamplot(X, Y, Hx, Hy, color=np.log(norm(H, axis=2)), cmap="winter_r") -ax3.streamplot(X, Y, Jx, Jy, color=norm(J, axis=2), cmap="summer_r") -ax4.streamplot(X, Y, Mx, My, color=norm(M, axis=2), cmap="autumn_r") - -ax1.set_title("B-Field") -ax2.set_title("H-Field") -ax3.set_title("J-Field") -ax4.set_title("M-Field") - -for ax in [ax1,ax2,ax3,ax4]: - ax.set( - xlabel="x-position", - ylabel="y-position", - aspect=1, - xlim=(-50,50), - ylim=(-50,50), - ) - # Outline magnet boundary - ts = np.linspace(0, 2 * np.pi, 50) - ax.plot(20 * np.sin(ts), 20 * np.cos(ts), "k--") - -plt.tight_layout() -plt.show() -``` - -(examples-tutorial-field-computation-sensors)= - -## Using Sensors - -The `Sensor` class enables relative positioning of observer grids in the global -coordinate system. The observer grid is stored in the `pixel` parameter of the -sensor object which is `(0,0,0)` by default (sensor position = observer -position). - -The following example shows a moving and rotating sensor with two pixels. At the -same time, the source objects are moving to demonstrate the versatility of the -field computation. - -```{code-cell} ipython3 -import numpy as np -import magpylib as magpy - -# Reset defaults set in previous example -magpy.defaults.reset() - - -# Define sensor with path -sensor = magpy.Sensor(pixel=[(0, 0, -0.0005), (0, 0, 0.0005)], style_size=1.5) -sensor.position = np.linspace((0, 0, -0.003), (0, 0, 0.003), 37) - -angles = np.linspace(0, 360, 37) -sensor.rotate_from_angax(angles, "z", start=0) - -# Define source with path -cyl1 = magpy.magnet.Cylinder( - polarization=(0.1, 0, 0), dimension=(0.001, 0.002), position=(0.003, 0, 0) -) -cyl2 = cyl1.copy(position=(-0.003, 0, 0)) -coll = magpy.Collection(cyl1, cyl2) -coll.rotate_from_angax(-angles, "z", start=0) - -# Display system and field at sensor -with magpy.show_context(sensor, coll, animation=True, backend="plotly"): - magpy.show(col=1) - magpy.show(output="Bx", col=2, pixel_agg=None) -``` - -## Multiple Inputs - -When `getBHJM` receive multiple inputs for sources and observers they will -compute all possible combinations. It is still beneficial to call the field -computation only a single time, because similar sources will be grouped, and the -computation will be vectorized automatically. - -```{code-cell} ipython3 -import magpylib as magpy - -# Three sources -cube1 = magpy.magnet.Cuboid(polarization=(0, 0, 1), dimension=(0.1, 0.1, 0.1)) -cube2 = cube1.copy() -cube3 = cube1.copy() - -# Two sensors with 4x5 pixel each -pixel = [[[(i / 1000, j / 1000, 0)] for i in range(4)] for j in range(5)] -sens1 = magpy.Sensor(pixel=pixel) -sens2 = sens1.copy() - -# Compute field -B = magpy.getB([cube1, cube2, cube3], [sens1, sens2]) - -# The result includes all combinations -B.shape -``` - -Select the second cube (first index), the first sensor (second index), pixel 3-4 -(index three and four) and the Bz-component of the field (index five) - -```{code-cell} ipython3 -# Continuation from above - ensure previous code is executed - -B[1, 0, 2, 3, 2] -``` - -A path will add another index. Every higher pixel dimension will add another -index as well. - -## Field as Pandas Dataframe - -Instead of a NumPy `ndarray`, the field computation can also return a -[pandas](https://pandas.pydata.org/).[dataframe](https://pandas.pydata.org/docs/user_guide/dsintro.html#dataframe) -using the `output='dataframe'` kwarg. - -```{code-cell} ipython3 -import numpy as np -import magpylib as magpy - -cube = magpy.magnet.Cuboid( - polarization=(0, 0, 1), dimension=(0.01, 0.01, 0.01), style_label="cube" -) -loop = magpy.current.Circle( - current=200, - diameter=0.02, - style_label="loop", -) -sens1 = magpy.Sensor( - pixel=[(0, 0, 0), (0.005, 0, 0)], - position=np.linspace((-0.04, 0, 0.02), (0.04, 0, 0.02), 30), - style_label="sens1", -) -sens2 = sens1.copy(style_label="sens2").move((0, 0, 0.01)) - -B = magpy.getB( - [cube, loop], - [sens1, sens2], - output="dataframe", -) - -B -``` - -Plotting libraries such as [plotly](https://plotly.com/python/plotly-express/) -or [seaborn](https://seaborn.pydata.org/introduction.html) can take advantage of -this feature, as they can deal with `dataframes` directly. - -```{code-cell} ipython3 -# Continuation from above - ensure previous code is executed - -import plotly.express as px - -fig = px.line( - B, - x="path", - y="Bx", - color="pixel", - line_group="source", - facet_col="source", - symbol="sensor", -) -fig.show() -``` - -(examples-tutorial-field-computation-functional-interface)= - -## Functional Interface - -All above computations demonstrate the convenient object-oriented interface of -Magpylib. However, there are instances when it is better to work with the -functional interface instead. - -1. Reduce overhead of Python objects -2. Complex computation instances - -In the following example we show how complex instances are computed using the -functional interface. - -```{important} -The functional interface will only outperform the object oriented interface if you use NumPy operations for input array creation, such as `tile`, `repeat`, `reshape`, ... ! -``` - -```{code-cell} ipython3 -import numpy as np -import magpylib as magpy - -# Two different magnet dimensions -dim1 = (0.02, 0.04, 0.04) -dim2 = (0.04, 0.02, 0.02) -DIM = np.vstack( - ( - np.tile(dim1, (6, 1)), - np.tile(dim2, (6, 1)), - ) -) - -# Sweep through different polarizations for each magnet type -pol = np.linspace((0, 0, 0.5), (0, 0, 1), 6) -POL = np.tile(pol, (2, 1)) - -# Airgap must stay the same -pos1 = (0, 0, 0.03) -pos2 = (0, 0, 0.02) -POS = np.vstack( - ( - np.tile(pos1, (6, 1)), - np.tile(pos2, (6, 1)), - ) -) - -# Compute all instances with the functional interface -B = magpy.getB( - sources="Cuboid", - observers=POS, - polarization=POL, - dimension=DIM, -) - -B.round(decimals=2) -``` diff --git a/docs/_pages/user_guide/examples/examples_tutorial_modeling_magnets.md b/docs/_pages/user_guide/examples/examples_tutorial_modeling_magnets.md deleted file mode 100644 index 6f8ad96db..000000000 --- a/docs/_pages/user_guide/examples/examples_tutorial_modeling_magnets.md +++ /dev/null @@ -1,194 +0,0 @@ -(examples-tutorial-modeling-magnets)= - -# Modeling a real magnet - -Whenever you wish to compare Magpylib simulations with experimental data -obtained using a real permanent magnet, you might wonder how to properly set up -a Magpylib magnet object to reflect the physical permanent magnet in question. -The goal of this tutorial is to explain how to extract this information from -respective datasheets, to provide better understanding of permanent magnets, and -show how to align Magpylib simulations with experimental measurements. - -This tutorial was supported by [BOMATEC](https://www.bomatec.com/de) by -providing excellent data sheets and by supplying magnets for the experimental -demonstration below. - -## Short summary - -In a magnet data sheet, you should find B-H curves and J-H curves. These curves -coincide at H=0, which gives the intrinsic material remanence $B_r$. As a result -of material response and self-interaction, the magnet "demagnetizes" itself so -that the mean magnetic polarization of a real magnet is always below the -remanence. How much below depends strongly on the shape of the magnet and is -expressed in the data sheet through the permeance coefficient lines (grey -lines). The numbers at the end indicate the typical magnet length to diameter -ratio (L/D). - -To obtain the correct magnetic polarization of a magnet from the data sheet, one -must find the crossing between B-H curve and respective permeance coefficient -line. This gives the "working point" which corresponds to the mean demagnetizing -H-field inside the magnet. The correct polarization to use in the Magpylib -simulation is the J-value at the working point which can be read off from the -J-H curve. - -![data sheet snippet](../../../_static/images/examples_tutorial_magnet_datasheet2.png) - -The following sections provide further explanation on the matter. - -## Hysteresis loop - -If you've worked with magnetism, chances are very high that you have seen a -magnetic hysteresis loop. Hysteresis loops describe the connection between the -**mean values** of an externally applied H-field and the resulting B-field, -polarization J or magnetization M **within a defined volume**. This connection -depends strongly on the size and shape of this volume and what is inside and -what is outside. - -The B-H curve is called the "normal loop", while J-H and M-H curves are called -"intrinsic loops". Hereon we only make use of the J-H loops, but the discussion -is similar for M-H. Normal and intrinsic loops are connected via -$B = \mu_0 H + J$. In free space the B-H connection is just a straight line -defined via $B = \mu_0 H$. When the whole space is filled with magnetic material -you will see something like this within an arbitrary volume: - -::::{grid} 2 :::{grid-item} :columns: 3 ::: :::{grid-item} :columns: 6 -![hysteresis loops](../../../_static/images/examples_tutorial_magnet_hysteresis.png) -::: :::: - -**1st quadrant**: Initially we have $J=0$ and $H=0$. The magnetic material is -not magnetized, and no external H-field is applied. When increasing the H-field, -the material polarization will follow the "virgin curve" and will increase until -it reaches its maximum possible value, the saturation polarization $J_S$. Higher -values of $H$ will not affect $J$, while $B$ will keep increasing linearly. Now -we are on the "major loop" - we will never return to the virgin curve. After -reaching a large H-value we slowly turn the H-field off. As it drops to zero the -material will retain its strong polarization at saturation level while the -resulting $B$ decreases. At $H = 0$ the B-field then approaches the "remanence -field" $B_r$, and its only contribution is $J_S$. - -**2nd quadrant**: Now the H-field becomes negative. Its amplitude increases but -it is oriented opposite to the initial direction. Therefore, it is also opposite -to the magnetic polarization. In the 2nd quadrant we are now trying to actively -demagnetize the material. This part of the hysteresis loop is often referred to -as the "demagnetization curve". With increasing negative H, the B-field -continues to become smaller until it reaches zero at the "coercive field" $H_c$. -At this point the net B-field inside the volume is zero, however, the material -is still magnetized! In the example loop above, the polarization at $H_c$ is -still at the $J_S$ level. By increasing the H-field further, a point will be -reached where the material will start to demagnetize. This can be seen by the -non-linear drop of $J$. The point where $J$ reaches zero is called the -"intrinsic coercive field" $H_{ci}$. At this point the net polarization in the -observed volume is zero. The material is demagnetized. The intrinsic coercive -field is a measure of how well a magnetized material can resist a demagnetizing -field. Having large values of $H_{ci}$ is a property of "hard magnets", as they -can keep their magnetization $J$ even for strong external fields in the opposite -direction. - -**3rd and 4th quadrants**: Moving to the third quadrant the behavior is now -mirrored. As $H$ increases past $H_{ci}$, polarization quickly aligns with the -external field and the material becomes saturated $J=-J_S$. By turning the field -around again, we move through the fourth quadrant to complete the hysteresis -loop. - -Hysteresis in magnetism as presented here is a macroscopic model that is the -result of a complex interplay between dipole and exchange interaction, material -texture and resulting domain formation at a microscopic level. Details can be -found, for example, in Aharoni's classical textbook "Introduction to the Theory -of Ferromagnetism". - -## The demagnetizing field - -If in an application the applied external H-field is zero, it seems intuitive to -use the remanence $B_r$ for the magnetic polarization in the Magpylib -simulation. It is a value that you will find in the data sheet. - -![data sheet snippet](../../../_static/images/examples_tutorial_magnet_table.png) - -However, if considering $J=B_r$, you will quickly see that the experimental -results are up to ~30 % below of what you would expect. The reason for this is -the self-induced demagnetizing field of the magnet which is generated by the -magnetic polarization itself. Just like $J$ generates an H-field on the outside -of the magnet, it also generates an H-field inside the magnet, along the -opposite direction of the polarization. The H-field outside the magnet is known -as the stray field, and the H-field inside the magnet is called the -demagnetizing field (as it opposes the magnetic polarization). This is -demonstrated by the following figure: - -![demagnetization field simulation](../../../_static/images/examples_tutorial_magnet_fieldcomparison.png) - -Making use of the [streamplot example](examples-vis-mpl-streamplot), on the left -side we show the cross-section of a Cuboid magnet and its homogeneous -polarization. And on the right, we see the H-field generated by it. Inside the -magnet the generated H-field opposes the polarization. As a result, the -polarization of a magnet will not be $B_r$, but instead will be some value of -$J$ in the 2nd quadrant of the J-H loop that corresponds to the mean H-field -inside the magnet. This H-value is often referred to as the "working point". - -## Finding the correct polarization - -As explained above, the hysteresis loop depends strongly on the chosen -observation volume geometry, the material inside, and what is outside of the -volume. Magnet manufacturers provide such loops (usually only the 2nd quadrant) -for their magnets, meaning that the observation volume is the whole magnet with -air outside. - -To obtain the correct mean polarization of a magnet we simply must compute the -mean demagnetizing field (= working point) and read the resulting $J$ off the -provided J-H loop. Computing the mean demagnetizing field, however, is not a -simple task. In addition to the material response (permeability), it depends -strongly on the magnet geometry. Fortunately, the working points can be read off -from well written data sheets. - -![data sheet snippet](../../../_static/images/examples_tutorial_magnet_datasheet.png) - -This datasheet snippet shows the second quadrant of the B-H and J-H loops, even -for two different temperatures. The working point is given by the intersection -between the "permeance coefficient" lines (gray) and the B-H curve. The number -at the end of these lines indicate the length to diameter ratio (L/D) of the -magnet, which is the critical geometric factor. Different lines are for -different L/D values, which allows one to select the correct working point for -different magnets made from this specific material. Once the working point is -found, the correct magnetic polarization, here denoted by $J_W$ (the magnetic -polarization at the working point), can be read off. The following figure -exemplifies the changes in $J_W$ for different L/D values, considering a -cylinder magnet: - -![finding the working point](../../../_static/images/examples_tutorial_magnet_LDratio.png) - -Permanent magnets with different geometries, such as a parallelepiped shape, -will have different behavior in terms of L/D values. Make sure you are reading -the data from the correct part number. - -## Warning - -Keep in mind that there are still many reasons why your simulation might not fit -well to your experiment. Here are some of the most common problems: - -1. Small position errors of less than 100 um can have a large impact on the - measurement result. The reference should be the sensitive element inside a - sensor package. These elements can be displaced by 10-100 um and even rotated - by a few degrees. The sensor might also not be well calibrated. -2. There are external stray fields, like the earth magnetic field, that - influence the measurements. Those might also come from other nearby - electronic equipment or magnetic parts. -3. Off-the-shelf magnets often do not hold what is promised in the datasheet - - Magnetic polarization amplitude can be off by 5-10 %. - - The direction of polarization often varies by up to a few degrees. - - Worst-case: the polarization can be inhomogeneous which is often a problem - in injection-mold magnets. - -## Example - -::::{grid} 2 :::{grid-item} :columns: 3 ::: :::{grid-item} :columns: 6 -![](../../../_static/images/examples_icon_WIP.png) ::: :::: - -coming soon: - -1. Magpylib simulation code -2. Experimental data -3. Comparison and discussion - -**Exterior reference** G. Martinek, S. Ruoho and U. Wyss. (2021). _Magnetic -Properties of Permanents Magnets & Measuring Techniques_ [White paper]. Arnold -Magnetic Technologies. -https://www.arnoldmagnetics.com/blog/measuring-permanent-magnets-white-paper/ diff --git a/docs/_pages/user_guide/examples/examples_tutorial_paths.md b/docs/_pages/user_guide/examples/examples_tutorial_paths.md deleted file mode 100644 index 952b13528..000000000 --- a/docs/_pages/user_guide/examples/examples_tutorial_paths.md +++ /dev/null @@ -1,220 +0,0 @@ ---- -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.0 -kernelspec: - display_name: Python 3 - language: python - name: python3 -orphan: true ---- - -(examples-tutorial-paths)= - -# Working with Paths - -The position and orientation attributes are key elements of Magpylib. The -documentation section {ref}`docs-position` describes how they work in detail. -Wile these definitions can seem abstract, the interface was constructed as -intuitively as possible which is demonstrated in this tutorial. - -```{important} -Always make use of paths when computing with multiple Magpylib object position and orientation instances. This enables vectorized computation. Avoid Python loops at all costs! -``` - -In this tutorial we show some good practice examples. - -## Assigning Absolute Paths - -Absolute object paths are assigned at initialization or through the object -properties. - -```{code-cell} ipython3 -import numpy as np -from scipy.spatial.transform import Rotation as R -import magpylib as magpy - -# Create paths -ts = np.linspace(0, 10, 31) -pos = np.array([(0.1 * t, 0, 0.1 * np.sin(t)) for t in ts]) -ori = R.from_rotvec(np.array([(0, -0.1 * np.cos(t) * 0.785, 0) for t in ts])) - -# Set path at initialization -sensor = magpy.Sensor(position=pos, orientation=ori) - -# Set path through properties -cube = magpy.magnet.Cuboid(polarization=(0, 0, 1), dimension=(0.01, 0.01, 0.01)) -cube.position = pos + np.array((0, 0, 0.3)) -cube.orientation = ori - -# Display as animation -magpy.show(sensor, cube, animation=True, backend="plotly") -``` - -## Relative Paths - -`move` and `rotate` input is interpreted relative to the existing path. When the -input is scalar the whole existing path is moved. - -```{code-cell} ipython3 -import numpy as np -from scipy.spatial.transform import Rotation as R -import magpylib as magpy - -# Create paths -ts = np.linspace(0, 10, 21) -pos = np.array([(0.1 * t, 0, 0.1 * np.sin(t)) for t in ts]) -ori = R.from_rotvec(np.array([(0, -0.1 * np.cos(t) * 0.785, 0) for t in ts])) - -# Set path at initialization -sens1 = magpy.Sensor(position=pos, orientation=ori, style_label="sens1") - -# Apply move operation to whole path with scalar input -sens2 = sens1.copy(style_label="sens2") -sens2.move((0, 0, 0.05)) - -# Apply rotate operation to whole path with scalar input -sens3 = sens1.copy(style_label="sens3") -sens3.rotate_from_angax(angle=90, axis="y", anchor=0) - -# Display paths -magpy.show(sens1, sens2, sens3) -``` - -When the input is a vector, the path is by default appended. - -```{code-cell} ipython3 -import numpy as np -from magpylib.magnet import Sphere - -# Create paths -x_path = np.linspace((0, 0, 0), (0.1, 0, 0), 10)[1:] -z_path = np.linspace((0, 0, 0), (0, 0, 0.1), 10)[1:] - -# Create sphere object -sphere = Sphere(polarization=(0, 0, 1), diameter=0.03) - -# Apply paths subsequently -for _ in range(3): - sphere.move(x_path).move(z_path) - -# Display paths -sphere.show() -``` - -## Merging paths - -Complex paths can be created by merging multiple path operations. This is done -with vector input for the `move` and `rotate` methods and choosing values for -`start` that will make the paths overlap. In the following example we combine a -linear path with a rotation about self (`anchor=None`) until path index 30. -Thereon, a second rotation about the origin is applied, creating a spiral. - -```{code-cell} ipython3 -import numpy as np -from magpylib.magnet import Cuboid - -# Create cube and set linear path -cube = Cuboid(polarization=(0, 0, 0.1), dimension=(0.02, 0.02, 0.02)) -cube.position = np.linspace((0, 0, 0), (0.1, 0, 0), 60) - -# Apply rotation about self - starting at index 0 -cube.rotate_from_rotvec(np.linspace((0, 0, 0), (0, 0, 360), 30), start=0) - -# Apply rotation about origin - starting at index 30 -cube.rotate_from_rotvec(np.linspace((0, 0, 0), (0, 0, 360), 30), anchor=0, start=30) - -# Display paths as animation -cube.show(backend="plotly", animation=True) -``` - -## Reset path - -The `reset_path()` method allows users to reset an object path to -`position=(0,0,0)` and `orientation=None`. - -```{code-cell} ipython3 -import magpylib as magpy - -# Create sensor object with complex path -sensor = magpy.Sensor().rotate_from_angax( - [1, 2, 3, 4], (1, 2, 3), anchor=(0, 0.03, 0.05) -) - -# Reset path -sensor.reset_path() - -print(sensor.position) -print(sensor.orientation.as_quat()) -``` - -(examples-tutorial-paths-edge-padding-end-slicing)= - -## Edge-padding and end-slicing - -Magpylib will always make sure that object paths are in the right format, i.e., -`position` and `orientation` attributes are of the same length. In addition, -when objects with different path lengths are combined, e.g., when computing the -field, the shorter paths are treated as static beyond their end to make the -computation sensible. Internally, Magpylib follows a philosophy of edge-padding -and end-slicing when adjusting paths. - -The idea behind **edge-padding** is that, whenever path entries beyond the -existing path length are needed, the edge-entries of the existing path are -returned. This means that the object is static beyond its existing path. - -In the following example the orientation attribute is padded by its edge value -`(0,0,.2)` as the position attribute length is increased. - -```{code-cell} ipython3 -from scipy.spatial.transform import Rotation as R -import magpylib as magpy - -sensor = magpy.Sensor( - position=[(0, 0, 0), (0.01, 0.01, 0.01)], - orientation=R.from_rotvec([(0, 0, 0.1), (0, 0, 0.2)]), -) -sensor.position = [(i / 100, i / 100, i / 100) for i in range(4)] -print(sensor.position) -print(sensor.orientation.as_rotvec()) -``` - -When the field is computed of `loop1` with path length 4 and `loop2` with path -length 2, `loop2` will remain in position (= edge padding) while the other -object is still in motion. - -```{code-cell} ipython3 -from magpylib.current import Circle - -loop1 = Circle(current=1, diameter=1, position=[(0, 0, i) for i in range(4)]) -loop2 = Circle(current=1, diameter=1, position=[(0, 0, i) for i in range(2)]) - -B = magpy.getB([loop1, loop2], (0, 0, 0)) -print(B) -``` - -The idea behind **end-slicing** is that, whenever a path is automatically -reduced in length, Magpylib will slice to keep the ending of the path. While -this occurs rarely, the following example shows how the `orientation` attribute -is automatically end-sliced, keeping the values `[(0,0,.3), (0,0,.4)]`, when the -`position` attribute is reduced in length: - -```{code-cell} ipython3 -from scipy.spatial.transform import Rotation as R -from magpylib import Sensor - -sensor = Sensor( - position=[(0, 0, 0), (0.01, 0.01, 0.01), (0.02, 0.02, 2), (0.03, 0.03, 0.03)], - orientation=R.from_rotvec([(0, 0, 0.1), (0, 0, 0.2), (0, 0, 0.3), (0, 0, 0.4)]), -) -sensor.position = [(0.01, 0.02, 0.03), (0.02, 0.03, 0.04)] -print(sensor.position) -print(sensor.orientation.as_rotvec()) -``` - -```{code-cell} ipython3 - -``` diff --git a/docs/_pages/user_guide/examples/examples_vis_animations.md b/docs/_pages/user_guide/examples/examples_vis_animations.md deleted file mode 100644 index b43333515..000000000 --- a/docs/_pages/user_guide/examples/examples_vis_animations.md +++ /dev/null @@ -1,316 +0,0 @@ ---- -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.1 -kernelspec: - display_name: Python 3 (ipykernel) - language: python - name: python3 -orphan: true ---- - -(examples-vis-animations)= - -# Animations - -Magpylib can display the motion of objects along paths in the form of -animations. - -```{hint} -1. Animations work best with the [plotly backend](guide-graphic-backends). - -2. If your browser window opens, but your animation does not load, reload the page. - -3. Avoid rendering too many frames. -``` - -Detailed information about how to tune animations can be found in the -[graphics documentation](guide-graphic-animations). - -## Simple Animations - -Animations are created with `show` by setting `animation=True`. It is also -possible to hand over the animation time with this parameter. - -```{code-cell} ipython3 -import magpylib as magpy -import numpy as np - -# Define magnet with path -magnet = magpy.magnet.Cylinder( - polarization=(1, 0, 0), - dimension=(2, 1), - position=(4, 0, 0), - style_label="magnet", -) -magnet.rotate_from_angax(angle=np.linspace(0, 300, 40), start=0, axis="z", anchor=0) - -# Define sensor with path -sensor = magpy.Sensor( - pixel=[(-0.2, 0, 0), (0.2, 0, 0)], - position=np.linspace((0, 0, -3), (0, 0, 3), 40), - style_label="sensor", -) - -# Display as animation - prefers plotly backend -magpy.show(sensor, magnet, animation=True, backend="plotly") -``` - -(examples-vis-animated-subplots)= - -## Animated Subplots - -[Subplots](examples-vis-subplots) are a powerful tool to see the field along a -path while viewing the 3D models at the same time. This is specifically -illustrative as an animation where the field at the respective path position is -indicated by a marker. - -```{code-cell} ipython3 -# Continuation from above - ensure previous code is executed - -magpy.show( - dict(objects=[magnet, sensor], output=["Bx", "By", "Bz"], col=1), - dict(objects=[magnet, sensor], output="model3d", col=2), - backend="plotly", - animation=True, -) -``` - -It is also possible to use the [show_context](guide-graphics-show_context) -context manager. - -```{code-cell} ipython3 -# Continuation from above - ensure previous code is executed - -with magpy.show_context([magnet, sensor], backend="plotly", animation=True) as sc: - sc.show(output="Bx", col=1, row=1) - sc.show(output="By", col=1, row=2) - sc.show(output="Bz", col=2, row=1) - sc.show(output="model3d", col=2, row=2) -``` - -(examples-vis-exporting-animations)= - -## Exporting Animations - -Animations are wonderful but can be quite difficult to export when they are -needed, for example, in a presentation. Here we show how to creat and export -animations using the \*.gif format. - -### Built-in export - -The easiest way to export an animation is via the Magpylib built-in command -`animation_output` in the `show` function. It works only with the Pyvista -backend. The following code will create a file "test4.gif". - -```python -import magpylib as magpy -import numpy as np - -# Create magnets with Paths -path = [(np.sin(t) + 1.5, 0, 0) for t in np.linspace(0, 2 * np.pi, 30)] -cube1 = magpy.magnet.Cuboid(dimension=(1, 1, 1), polarization=(1, 0, 0), position=path) -cube2 = cube1.copy(position=-np.array(path), polarization=(-1, 0, 0)) - -# Store gif with animation_output using Pyvista -magpy.show( - cube1, - cube2, - style_legend_show=False, - animation=3, - animation_output="my.gif", - backend="pyvista", - style_path_show=False, -) -``` - - - -### Custom export Pyvista - -For customizing videos it is best to work directly in the respective graphic -backends. Here we show how to transfer the Magpylib graphic objects to a Pyvista -plotter, customize the plotting scene, export screen shots, and combine them in -a \*.gif. The following example also shows how to achieve transparency. - -```python -import magpylib as magpy -import pyvista as pv -from PIL import Image - - -def create_gif(images, frame_time, output_file): - """Create a GIF from images""" - frames = [Image.fromarray(img) for img in images] - if frames: - frames[0].save( - output_file, - format="GIF", - append_images=frames[1:], - save_all=True, - duration=frame_time, - loop=0, # Infinite loop - disposal=2, # Remove previous frames for transparency - ) - - -def init_plotter(): - """Init Pyvista plotter with custom scene layout""" - pl = pv.Plotter(notebook=False, off_screen=True, window_size=[300, 300]) - pl.camera_position = [ - (5, 5, 5), # Position of the camera - (0, 0, 0), # Focal point (what the camera is looking at) - (0, 0, 1), # View up direction - ] - pl.camera.zoom(0.5) - pl.set_background("k") # For better transparency - return pl - - -def create_frames(frames): - """Create frames with Pyvista.""" - - # Create Magpylib objects - mag1 = magpy.magnet.CylinderSegment( - dimension=(3, 4, 1, 0, 45), polarization=(0, 0, 1) - ) - mag2 = magpy.magnet.CylinderSegment( - dimension=(2, 3, 1, 0, 45), polarization=(0, 0, -1) - ) - - images = [] - pl = init_plotter() - for i in range(frames): - - # Modify object positions - mag1.rotate_from_angax(360 / frames, axis="z") - mag2.rotate_from_angax(-360 / frames, axis="z") - - # Transfer Magpylib objects to Pyvista plotter - pl.clear() - magpy.show(mag1, mag2, canvas=pl, style_legend_show=False) - - # Edit figure in Pyvista - pl.add_mesh(pv.Line(mag1.barycenter, mag2.barycenter), color="cyan") - - # Screenshot - print(f"Writing frame {i+1:3d}/{frames}") - ss = pl.screenshot(transparent_background=True, return_img=True) - images.append(ss) - - pl.close() - return images - - -def main(): - frames = 100 - frame_time = 40 - output_file = "my.gif" - - images = create_frames(frames) - create_gif(images, frame_time, output_file) - - -if __name__ == "__main__": - main() -``` - - - -Notice that when providing a canvas, no update to its layout is performed by -Magpylib, unless explicitly specified by setting `canvas_update=True` in -`show()`. By default `canvas_update="auto"` only updates the canvas if is not -provided by the user. Details can be found in the -[graphics documentation](guide-graphics-canvas). - -### Custom export Plotly - -The following examples shows how to work in the Plotly backend. - -```python -import magpylib as magpy -from PIL import Image -import io - - -def create_gif(images, frame_time, output_file): - """Create GIF from frames in the temporary directory.""" - frames = [Image.open(io.BytesIO(data)) for data in images] - if frames: - frames[0].save( - output_file, - format="GIF", - append_images=frames[1:], - save_all=True, - duration=frame_time, - loop=0, # Infinite loop - ) - - -def create_frames(frames): - """Create frames with Pyvista.""" - - # Create Magpylib objects - mag1 = magpy.magnet.CylinderSegment( - dimension=(3, 4, 1, 0, 45), polarization=(0, 0, 1) - ) - mag2 = magpy.magnet.CylinderSegment( - dimension=(2, 3, 1, 0, 45), polarization=(0, 0, -1) - ) - - images = [] - for i in range(frames): - # Set object position - mag1.rotate_from_angax(360 / frames, axis="z") - mag2.rotate_from_angax(-360 / frames, axis="z") - - fig = magpy.show( - mag1, mag2, return_fig=True, backend="plotly", style_legend_show=False - ) - - # Edit figure in Plotly - fig.add_scatter3d( - x=(0, 0, 4, 4, 0), - y=(0, 0, 0, 0, 0), - z=(-2, 2, 2, -2, -2), - mode="lines", - line_color="black", - ) - - # Customize layout - fig.update_layout( - scene=dict( - camera_eye={"x": 1.5, "y": 1.5, "z": 1.5}, - camera_up={"x": 0, "y": 0, "z": 1}, - xaxis_range=(-5, 5), - yaxis_range=(-5, 5), - zaxis_range=(-5, 5), - ), - showlegend=False, - margin=dict(l=0, r=0, t=0, b=0), - ) - - # Screenshot (requires kaleido package) - print(f"Writing frame {i+1:3d}/{frames}") - img = fig.to_image(format="png", width=500, height=500) - images.append(img) - return images - - -def main(): - frames = 50 - frame_time = 50 - output_file = "my.gif" - - images = create_frames(frames) - create_gif(images, frame_time, output_file) - - -if __name__ == "__main__": - main() -``` - - diff --git a/docs/_pages/user_guide/examples/examples_vis_magnet_colors.md b/docs/_pages/user_guide/examples/examples_vis_magnet_colors.md deleted file mode 100644 index 5b833f569..000000000 --- a/docs/_pages/user_guide/examples/examples_vis_magnet_colors.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -orphan: true -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.14.5 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -(examples-vis-magnet-colors)= - -# Magnet colors - -The polarization direction of a permanent magnet is often graphically displayed -with the help of colors. However, there is no unified color scheme that everyone -agrees on. The following image shows some color-examples from the web. - -![](../../../_static/images/examples_vis_magnet_colors.png) - -Magpylib uses the DIN Specification 91411 (soon 91479) standard as default -setting. The tri-color scheme has the advantage that for multi-pole elements it -becomes clear which north is "connected" to which south. - -```{hint} -The color schemes often seem to represent homogeneous polarizations, referred to as "ideal typical" magnets in DIN Specification 91479. However, they often just represent general "pole patterns", i.e. rough sketches where the field goes in and where it comes out, that are not the result of homogeneous polarizations. On this topic review also the examples example {ref}`examples-misc-inhom`, and the tutorial {ref}`examples-tutorial-modeling-magnets`. -``` - -With Magpylib users can easily tune the magnet color schemes. The `style` -options are `tricolor` with north, middle and south colors, and `bicolor` with -north and south colors. - -```{code-cell} ipython -import magpylib as magpy - -# Create a magnetization style dictionary -mstyle = dict( - mode="color+arrow", - color=dict(north="magenta", middle="white", south="turquoise"), - arrow=dict(width=2, color="k") -) - -# Create magnet and apply style -sphere = magpy.magnet.Sphere( - polarization=(1, 1, 1), - diameter=1, - position=(-1, 1, 0), - style_magnetization=mstyle, -) - -# Create a second magnet with different style -cube = magpy.magnet.Cuboid( - polarization=(1, 0, 0), - dimension=(1, .2, .2), - position=(1, 1, 0), - style_magnetization_color_mode="bicolor", - style_magnetization_color_north="r", - style_magnetization_color_south="g", - style_magnetization_color_transition=0, -) - -# Create a third magnet with different style -cyl = magpy.magnet.CylinderSegment( - polarization=(1, 0, 0), - dimension=(1.7, 2, .3, -145, -35), -) -cyl.style.magnetization.color.north = "cornflowerblue" -cyl.style.magnetization.color.south = "orange" - -# Show all three -magpy.show(sphere, cube, cyl, backend='plotly', style_legend_show=False) -``` - -More information about styles and how to apply them is given in the user-guide -[style section](guide-graphic-styles). diff --git a/docs/_pages/user_guide/examples/examples_vis_mpl_streamplot.md b/docs/_pages/user_guide/examples/examples_vis_mpl_streamplot.md deleted file mode 100644 index f37416f2f..000000000 --- a/docs/_pages/user_guide/examples/examples_vis_mpl_streamplot.md +++ /dev/null @@ -1,143 +0,0 @@ ---- -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.0 -kernelspec: - display_name: Python 3 - language: python - name: python3 -orphan: true ---- - -(examples-vis-mpl-streamplot)= - -# Matplotlib Streamplot - -## Example 1: Cuboid Magnet - -In this example we show the B-field of a cuboid magnet using Matplotlib -streamlines. Streamlines are not magnetic field lines in the sense that the -field amplitude cannot be derived from their density. However, Matplotlib -streamlines can show the field amplitude via color and line thickness. One must -be careful that streamlines can only display two components of the field. In the -following example the third field component is always zero - but this is -generally not the case. - -In the example we make use of the -[scaling property](guide-docs-io-scale-invariance). We assume that all length -inputs are in units of mm, and that the polarization input is in units of -millitesla. The resulting `getB` output will also be in millitesla. One must be -careful with scaling - the conversion to H would ofc give units of mA/m. - -```{code-cell} ipython3 -import matplotlib.pyplot as plt -import numpy as np - -import magpylib as magpy - -# Create a Matplotlib figure -fig, ax = plt.subplots() - -# Create an observer grid in the xz-symmetry plane -ts = np.linspace(-5, 5, 40) -grid = np.array([[(x, 0, z) for x in ts] for z in ts]) -X, _, Z = np.moveaxis(grid, 2, 0) - -# Compute the B-field of a cube magnet on the grid -cube = magpy.magnet.Cuboid(polarization=(500,0,500), dimension=(2,2,2)) -B = cube.getB(grid) -Bx, _, Bz = np.moveaxis(B, 2, 0) -log10_norm_B = np.log10(np.linalg.norm(B, axis=2)) - -# Display the B-field with streamplot using log10-scaled -# color function and linewidth -splt = ax.streamplot(X, Z, Bx, Bz, - density=1.5, - color=log10_norm_B, - linewidth=log10_norm_B, - cmap="autumn", -) - -# Add colorbar with logarithmic labels -cb = fig.colorbar(splt.lines, ax=ax, label="|B| (mT)") -ticks = np.array([3, 10, 30, 100, 300]) -cb.set_ticks(np.log10(ticks)) -cb.set_ticklabels(ticks) - -# Outline magnet boundary -ax.plot( - [1, 1, -1, -1, 1], - [1, -1, -1, 1, 1], - "k--", - lw=2, -) - -# Figure styling -ax.set( - xlabel="x-position (mm)", - ylabel="z-position (mm)", -) - -plt.tight_layout() -plt.show() -``` - -```{note} -Be aware that the above code is not very performant, but quite readable. The following example creates the grid with NumPy commands only instead of Python loops and uses the {ref}`examples-tutorial-field-computation-functional-interface` for field computation. -``` - -## Example 2 - Hollow Cylinder Magnet - -A nice visualization is achieved by combining `streamplot` with `contourf`. In -this example we show the B-field of a hollow Cylinder magnet with diametral -polarization in the xy-symmetry plane. - -```{code-cell} ipython3 -import matplotlib.pyplot as plt -import numpy as np - -import magpylib as magpy - -# Create a Matplotlib figure -fig, ax = plt.subplots() - -# Create an observer grid in the xy-symmetry plane - using pure numpy -grid = np.mgrid[-.05:.05:100j, -.05:.05:100j, 0:0:1j].T[0] -X, Y, _ = np.moveaxis(grid, 2, 0) - -# Compute magnetic field on grid - using the functional interface -B = magpy.getB( - "CylinderSegment", - observers=grid.reshape(-1, 3), - dimension=(0.02, 0.03, 0.05, 0, 360), - polarization=(0.1, 0, 0), -) -B = B.reshape(grid.shape) -Bx, By, _ = np.moveaxis(B, 2, 0) -normB = np.linalg.norm(B, axis=2) - -# Combine streamplot with contourf -cp = ax.contourf(X, Y, normB, cmap="rainbow", levels=100) -splt = ax.streamplot(X, Y, Bx, By, color="k", density=1.5, linewidth=1) - -# Add colorbar -fig.colorbar(cp, ax=ax, label="|B| (T)") - -# Outline magnet boundary -ts = np.linspace(0, 2 * np.pi, 50) -ax.plot(.03*np.cos(ts), .03*np.sin(ts), "w-", lw=2, zorder=2) -ax.plot(.02*np.cos(ts), .02*np.sin(ts), "w-", lw=2, zorder=2) - -# Figure styling -ax.set( - xlabel="x-position (m)", - ylabel="z-position (m)", - aspect=1, -) - -plt.tight_layout() -plt.show() -``` diff --git a/docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md b/docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md deleted file mode 100644 index 807d21be9..000000000 --- a/docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.16.0 -kernelspec: - display_name: Python 3 - language: python - name: python3 -orphan: true ---- - -(examples-vis-pv-streamlines)= - -# Pyvista 3D field lines - -Pyvista offers field-line computation and visualization in 3D. In addition to -the field computation, Magpylib offers magnet visualization that seamlessly -integrates into a Pyvista plotting scene. - -```{code-cell} ipython3 -import magpylib as magpy -import pyvista as pv - -# Create a magnet with Magpylib -magnet = magpy.magnet.Cylinder(polarization=(0, 0, 1), dimension=(0.010, 0.004)) - -# Create a 3D grid with Pyvista -grid = pv.ImageData( - dimensions=(41, 41, 41), - spacing=(0.001, 0.001, 0.001), - origin=(-0.02, -0.02, -0.02), -) - -# Compute B-field and add as data to grid -grid["B"] = magnet.getB(grid.points) * 1000 # T -> mT - -# Compute the field lines -seed = pv.Disc(inner=0.001, outer=0.003, r_res=1, c_res=9) -strl = grid.streamlines_from_source( - seed, - vectors="B", - max_step_length=0.1, - max_time=.02, - integration_direction="both", -) - -# Create a Pyvista plotting scene -pl = pv.Plotter() - -# Add magnet to scene - streamlines units are assumed to be meters -magpy.show(magnet, canvas=pl, units_length="m", backend="pyvista") - -# Prepare legend parameters -legend_args = { - "title": "B (mT)", - "title_font_size": 20, - "color": "black", - "position_y": 0.25, - "vertical": True, -} - -# Add streamlines and legend to scene -pl.add_mesh( - strl.tube(radius=0.0002), - cmap="bwr", - scalar_bar_args=legend_args, -) - -# Prepare and show scene -pl.camera.position = (0.03, 0.03, 0.03) -pl.show() -``` diff --git a/docs/_pages/user_guide/examples/examples_vis_subplots.md b/docs/_pages/user_guide/examples/examples_vis_subplots.md deleted file mode 100644 index caeaefdcc..000000000 --- a/docs/_pages/user_guide/examples/examples_vis_subplots.md +++ /dev/null @@ -1,110 +0,0 @@ ---- -orphan: true -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.14.5 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -(examples-vis-subplots)= - -# Subplots - -It is very illustrative to combine 2D and 3D subplots when viewing the field -along paths. Consider the following system of a sensor and a magnet, both -endowed with paths. - -```{code-cell} ipython3 -import numpy as np -import magpylib as magpy - -# Define sensor with path -cyl = magpy.magnet.Cylinder( - polarization=(1, 0, 0), - dimension=(2, 1), - position=(4,0,0), -) -cyl.rotate_from_angax(angle=np.linspace(0, 300, 40), start=0, axis="z", anchor=0) - -# Define magnet with path -sens = magpy.Sensor( - pixel=[(-.2, 0, 0), (.2, 0, 0)], - position = np.linspace((0, 0, -3), (0, 0, 3), 40) -) -``` - -In the following, we demonstrate various ways how to generate 2D/3D subplot -combinations for this system. - -# Plotting canvas with own figure - -Customization is best done by adding the -[Magpylib 3D-model](guide-graphics-show) to your own figure using the `canvas` -kwarg. - -```{code-cell} ipython3 -# Continuation from above - ensure previous code is executed - -import matplotlib.pyplot as plt -fig = plt.figure() -ax1 = fig.add_subplot(121) -ax2 = fig.add_subplot(122, projection='3d') - -# Show pixel1 field on ax1 -B = sens.getB(cyl) -ax1.plot(B[:,0]) - -# Place 3D plot on ax2 -magpy.show(sens, cyl, canvas=ax2) - -plt.show() -``` - -How to add and modify subplots in all three supported backends is demonstrated -in the [canvas documentation](guide-graphics-canvas). It is also possible to -customize the Magpylib 3D output by returning and editing the respective canvas -using the `return_fig` kwarg, see [return figures](guide-graphics-return_fig). - -# Built-in subplots - -For maximal efficiency, Magpylib offers auto-generated subplots of 3D models and -the field along paths by providing the `show` function with proper input -dictionaries. - -```{code-cell} ipython3 -# Continuation from above - ensure previous code is executed - -magpy.show( - {"objects": [cyl, sens], "output": "Bx", "col": 1}, - {"objects": [cyl, sens], "output": "model3d", "col": 2}, - backend='plotly', -) -``` - -Detailed information on built-in subplots is provided in the -[user guide](guide-graphics-subplots). - -# show_context - -With a built-in context manager this functionality can be accessed with maximal -ease - -```{code-cell} ipython3 -# Continuation from above - ensure previous code is executed - -with magpy.show_context([cyl, sens], backend='plotly') as sc: - sc.show(output="Bx", col=1, row=1) - sc.show(output="By", col=1, row=2) - sc.show(output="Bz", col=2, row=1) - sc.show(output="model3d", col=2, row=2) -``` - -```{hint} -A very powerful subplot-feature are the built-in [animated subplots](examples-vis-animated-subplots). -``` diff --git a/docs/_pages/user_guide/examples/logo.stl b/docs/_pages/user_guide/examples/logo.stl deleted file mode 100644 index a9905648c94bd9646fec833a4b49e18a4cd73c79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57384 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 [-0.01 0. 0. ] print(sensor.orientation.as_rotvec(degrees=True)) # -> [ 0. 0. -45.] ``` -Find detailed information on position and orientation attributes and how to -manipulate them [here](docs-position). +Find detailed information on position and orientation attributes and how to manipulate them [here](docs-position). ### 3D view of objects -In-built 3D graphic output helps to see if all Magpylib objects are positioned -properly. The magnet polarization is represented by default by a 3-color scheme, -the sensor by an axes cross. +In-built 3D graphic output helps to see if all Magpylib objects are positioned properly. The magnet polarization is represented by default by a 3-color scheme, the sensor by an axes cross. ```python # Use the `show` function to view your system @@ -89,13 +78,11 @@ magpy.show(cube, sensor, backend="plotly") -Detailed information on the graphical output with `show` is given -[here](guide-graphics). +Detailed information on the graphical output with `show` is given [here](guide-graphics). ### Computing the field -The field can be computed at sensor objects, or simply by specifying a position -of interest. +The field can be computed at sensor objects, or simply by specifying a position of interest. ```python # Compute the B-field for some positions. @@ -122,14 +109,11 @@ Detailed information on field computation is provided [here](docs-fieldcomp). ## Advanced features -While most things can be achieved with the above, the following features will -make your live much easier. +While most things can be achieved with the above, the following features will make your live much easier. ### Paths -Magpylib position and orientation attributes can store multiple values that are -referred to as paths. The field will automatically be computed for all path -positions. Use this feature to model objects that move to multiple locations. +Magpylib position and orientation attributes can store multiple values that are referred to as paths. The field will automatically be computed for all path positions. Use this feature to model objects that move to multiple locations. ```python import numpy as np @@ -155,10 +139,7 @@ print(B.round(3)) # ->[[ 0.004 0. -0.001] More information on paths is provided [here](docs-position). ### Collections - -Magpylib objects can be grouped into Collections. An operation applied to a -Collection is applied to every object in it. The Collection itself behaves like -a single source object. +Magpylib objects can be grouped into Collections. An operation applied to a Collection is applied to every object in it. The Collection itself behaves like a single source object. ```python import magpylib as magpy @@ -180,10 +161,7 @@ print(obj2.position) # -> [0.001 0.002 0.003] Collections are dicussed in detail [here](guide-docs-classes-collections). ### Complex Magnet Shapes - -There most convenient way to create a magnet with complex shape is by using the -convex hull of a point cloud (= simplest geometric form that includes all given -points) and transform it into a triangular surface mesh. +There most convenient way to create a magnet with complex shape is by using the convex hull of a point cloud (= simplest geometric form that includes all given points) and transform it into a triangular surface mesh. ```python import numpy as np @@ -208,14 +186,12 @@ pyramid = magpy.magnet.TriangularMesh.from_ConvexHull( # Display the magnet graphically pyramid.show() ``` - -There are several other possibilities to create complex magnet shapes. Some can -be found in the [examples](examples-complex-magnet-shapes). +There are several other possibilities to create complex magnet shapes. Some can be found in the [examples](examples-complex-magnet-shapes). -### Graphic Styles +### Graphic Styles Magpylib offers many ways to customize the graphic output. ```python @@ -240,15 +216,12 @@ cyl = magpy.magnet.Cylinder( ) magpy.show(cube, cyl) ``` - The many options for graphic styling can be found [here](guide-graphic-styles). ### Animation - -Object paths can be animated. For this feature the plotly graphic backend is -recommended. +Object paths can be animated. For this feature the plotly graphic backend is recommended. ```python import numpy as np @@ -265,18 +238,12 @@ cube.rotate_from_angax(angle=np.linspace(10, 360, 18), axis="x") # Generate an animation with `show` cube.show(animation=True, backend="plotly") ``` - -Nice animation examples are shown [here](examples-vis-animations), and a -detailed discussion is provided [here](guide-graphic-animations). +Nice animation examples are shown [here](examples-vis-animations), and a detailed discussion is provided [here](guide-graphic-animations). ### Functional interface - -Magpylib's object oriented interface is convenient to work with but is also -slowed down by object initialization and handling. The functional interface -bypasses this load and enables fast field computation for an arbitrary set of -input parameters. +Magpylib's object oriented interface is convenient to work with but is also slowed down by object initialization and handling. The functional interface bypasses this load and enables fast field computation for an arbitrary set of input parameters. ```python import magpylib as magpy diff --git a/docs/_static/custom.css b/docs/_static/custom.css index b53294376..d699c9c38 100644 --- a/docs/_static/custom.css +++ b/docs/_static/custom.css @@ -1,35 +1,39 @@ #galleryimg { - background: red; + background: red; } /* fix image transparency in docu WTF? */ -html[data-theme="dark"] .bd-content img:not(.only-dark):not(.dark-light) { - background: none; +html[data-theme=dark] .bd-content img:not(.only-dark):not(.dark-light) { + background: none; } /* custom padding for index page*/ .sectiontext { - margin-top: -40px; + margin-top:-40px; } + /* hide vertical scrollbar - it always appears unwanted when there is no content */ .bd-sidebar { - overflow-y: auto; /* Change to auto to only show scrollbar when necessary */ + overflow-y: auto; /* Change to auto to only show scrollbar when necessary */ } + + /* Adjust the height to ensure it fits within the viewport */ /* .bd-sidebar { max-height: calc(100vh - var(--header-height, 0px)); } */ + /* Target the logo text */ .navbar-brand { - font-weight: bold; - font-size: 1.6em; + font-weight: bold; + font-size: 1.6em; } diff --git a/docs/_static/switcher.json b/docs/_static/switcher.json index 291b20eba..d042c09c1 100644 --- a/docs/_static/switcher.json +++ b/docs/_static/switcher.json @@ -1,24 +1,24 @@ [ - { - "version": "dev", - "url": "https://magpylib.readthedocs.io/en/latest/" - }, - { - "name": "5.1.1 (stable)", - "version": "5.1.1", - "url": "https://magpylib.readthedocs.io/en/stable", - "preferred": true - }, - { - "version": "4.5.1", - "url": "https://magpylib.readthedocs.io/en/4.5.1/" - }, - { - "version": "3.0.5", - "url": "https://magpylib.readthedocs.io/en/3.0.5/" - }, - { - "version": "2.3.0-beta", - "url": "https://magpylib.readthedocs.io/en/2.3.0-beta/" - } + { + "version": "dev", + "url": "https://magpylib.readthedocs.io/en/latest/" + }, + { + "name": "5.1.1 (stable)", + "version": "5.1.1", + "url": "https://magpylib.readthedocs.io/en/stable", + "preferred": true + }, + { + "version": "4.5.1", + "url": "https://magpylib.readthedocs.io/en/4.5.1/" + }, + { + "version": "3.0.5", + "url": "https://magpylib.readthedocs.io/en/3.0.5/" + }, + { + "version": "2.3.0-beta", + "url": "https://magpylib.readthedocs.io/en/2.3.0-beta/" + } ] diff --git a/docs/_static/webcode/copybutton.js b/docs/_static/webcode/copybutton.js index 87baea833..6ade74927 100644 --- a/docs/_static/webcode/copybutton.js +++ b/docs/_static/webcode/copybutton.js @@ -1,89 +1,65 @@ // Copyright 2014 PSF. Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 // File originates from the cpython source found in https://docs.python.org/3/_static/copybutton.js -$(document).ready(function () { - /* Add a [>>>] button on the top-right corner of code samples to hide - * the >>> and ... prompts and the output and thus make the code - * copyable. */ - var div = $( - ".highlight-python .highlight," + - ".highlight-default .highlight," + - ".highlight-python3 .highlight", - ); - var pre = div.find("pre"); +$(document).ready(function() { + /* Add a [>>>] button on the top-right corner of code samples to hide + * the >>> and ... prompts and the output and thus make the code + * copyable. */ + var div = $('.highlight-python .highlight,' + + '.highlight-default .highlight,' + + '.highlight-python3 .highlight') + var pre = div.find('pre'); - // get the styles from the current theme - pre.parent().parent().css("position", "relative"); - var hide_text = "Hide the prompts and output"; - var show_text = "Show the prompts and output"; - var border_width = pre.css("border-top-width"); - var border_style = pre.css("border-top-style"); - var border_color = pre.css("border-top-color"); - var button_styles = { - cursor: "pointer", - position: "absolute", - top: "0", - right: "0", - "border-color": border_color, - "border-style": border_style, - "border-width": border_width, - color: border_color, - "text-size": "75%", - "font-family": "monospace", - "padding-left": "0.2em", - "padding-right": "0.2em", - "border-radius": "0 3px 0 0", - }; - - // create and add the button to all the code blocks that contain >>> - div.each(function (index) { - var jthis = $(this); - if (jthis.find(".gp").length > 0) { - var button = $( - 'Click to Hide >>>', - ); - button.css(button_styles); - button.attr("title", hide_text); - button.data("hidden", "false"); - jthis.prepend(button); + // get the styles from the current theme + pre.parent().parent().css('position', 'relative'); + var hide_text = 'Hide the prompts and output'; + var show_text = 'Show the prompts and output'; + var border_width = pre.css('border-top-width'); + var border_style = pre.css('border-top-style'); + var border_color = pre.css('border-top-color'); + var button_styles = { + 'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0', + 'border-color': border_color, 'border-style': border_style, + 'border-width': border_width, 'color': border_color, 'text-size': '75%', + 'font-family': 'monospace', 'padding-left': '0.2em', 'padding-right': '0.2em', + 'border-radius': '0 3px 0 0' } - // tracebacks (.gt) contain bare text elements that need to be - // wrapped in a span to work with .nextUntil() (see later) - jthis - .find("pre:has(.gt)") - .contents() - .filter(function () { - return this.nodeType == 3 && this.data.trim().length > 0; - }) - .wrap(""); - }); - // define the behavior of the button when it's clicked - $(".copybutton").click(function (e) { - e.preventDefault(); - var button = $(this); - if (button.data("hidden") === "false") { - // hide the code output - button.parent().find(".go, .gp, .gt").hide(); - button - .next("pre") - .find(".gt") - .nextUntil(".gp, .go") - .css("visibility", "hidden"); - button.css("text-decoration", "line-through"); - button.attr("title", show_text); - button.data("hidden", "true"); - } else { - // show the code output - button.parent().find(".go, .gp, .gt").show(); - button - .next("pre") - .find(".gt") - .nextUntil(".gp, .go") - .css("visibility", "visible"); - button.css("text-decoration", "none"); - button.attr("title", hide_text); - button.data("hidden", "false"); - } - }); + // create and add the button to all the code blocks that contain >>> + div.each(function(index) { + var jthis = $(this); + if (jthis.find('.gp').length > 0) { + var button = $('Click to Hide >>>'); + button.css(button_styles) + button.attr('title', hide_text); + button.data('hidden', 'false'); + jthis.prepend(button); + } + // tracebacks (.gt) contain bare text elements that need to be + // wrapped in a span to work with .nextUntil() (see later) + jthis.find('pre:has(.gt)').contents().filter(function() { + return ((this.nodeType == 3) && (this.data.trim().length > 0)); + }).wrap(''); + }); + + // define the behavior of the button when it's clicked + $('.copybutton').click(function(e){ + e.preventDefault(); + var button = $(this); + if (button.data('hidden') === 'false') { + // hide the code output + button.parent().find('.go, .gp, .gt').hide(); + button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden'); + button.css('text-decoration', 'line-through'); + button.attr('title', show_text); + button.data('hidden', 'true'); + } else { + // show the code output + button.parent().find('.go, .gp, .gt').show(); + button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible'); + button.css('text-decoration', 'none'); + button.attr('title', hide_text); + button.data('hidden', 'false'); + } + }); }); diff --git a/docs/_static/webcode/summaryOpen.js b/docs/_static/webcode/summaryOpen.js index 878cec8c1..1139cee9f 100644 --- a/docs/_static/webcode/summaryOpen.js +++ b/docs/_static/webcode/summaryOpen.js @@ -1,22 +1,16 @@ -$(document).ready(function () { - $('a[href^="#"]').on("click", function (e) { - e.preventDefault(); - var target = this.hash, - $target = $(target); - $(target + " details").attr("open", true); +$(document).ready(function() { + $('a[href^="#"]').on('click', function(e) { + e.preventDefault(); + var target = this.hash, + $target = $(target); + $(target + ' details').attr('open', true); - $("html, body") - .stop() - .animate( - { - scrollTop: $target.offset().top, - }, - 500, - "swing", - function () { - window.location.hash = target; - }, - ); + $('html, body').stop().animate({ + 'scrollTop': $target.offset().top + }, 500, 'swing', function() { + window.location.hash = target; + }); + + }); }); -}); //https://stackoverflow.com/a/48258026/11028959 diff --git a/docs/index.md b/docs/index.md index 7bde09b9f..677fceb72 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,27 +1,38 @@ # Magpylib Documentation -Magpylib is an **open-source Python package** for calculating static **magnetic -fields** of magnets, currents, and other sources. It uses **analytical -expressions**, solutions to macroscopic magnetostatic problems, implemented in -**vectorized** form which makes the computation **extremely fast** and leverages -the open-source Python ecosystem for spectacular visualizations! +Magpylib is an **open-source Python package** for calculating static **magnetic fields** of magnets, currents, and other sources. It uses **analytical expressions**, solutions to macroscopic magnetostatic problems, implemented in **vectorized** form which makes the computation **extremely fast** and leverages the open-source Python ecosystem for spectacular visualizations!

Resources

-::::{grid} 1 2 3 3 :margin: 4 4 0 0 :gutter: 2 - -:::{grid-item-card} :link: getting-started :link-type: ref :link-alt: link to -Getting Started :img-top: \_static/images/index_icon_get_started.png -:text-align: center **Getting Started** ::: - -:::{grid-item-card} :link: examples :link-type: ref :link-alt: link to Examples -:img-top: \_static/images/index_icon_examples.png :text-align: center -**Examples** ::: - -:::{grid-item-card} :link: -https://www.sciencedirect.com/science/article/pii/S2352711020300170 :link-alt: -link to Journal :img-top: \_static/images/index_icon_academic.png :text-align: -center **Scientific Reference** ::: +::::{grid} 1 2 3 3 +:margin: 4 4 0 0 +:gutter: 2 + +:::{grid-item-card} +:link: getting-started +:link-type: ref +:link-alt: link to Getting Started +:img-top: _static/images/index_icon_get_started.png +:text-align: center +**Getting Started** +::: + +:::{grid-item-card} +:link: examples +:link-type: ref +:link-alt: link to Examples +:img-top: _static/images/index_icon_examples.png +:text-align: center +**Examples** +::: + +:::{grid-item-card} +:link: https://www.sciencedirect.com/science/article/pii/S2352711020300170 +:link-alt: link to Journal +:img-top: _static/images/index_icon_academic.png +:text-align: center +**Scientific Reference** +::: :::: @@ -29,12 +40,8 @@ center **Scientific Reference** ::: ![](_static/images/index_flowchart.png) -In Magpylib, **sources** (magnets, currents, ...) and **observers** (sensors, -position grids, ...) are created as Python objects with position and orientation -attributes. These objects can be **grouped** and **moved** around. The system -can be **viewed** graphically through various backends. The **magnetic field** -is computed in the observer reference frame. Magpylib collects all inputs, and -vectorizes the computation for maximal performance. +In Magpylib, **sources** (magnets, currents, ...) and **observers** (sensors, position grids, ...) are created as Python objects with position and orientation attributes. These objects can be **grouped** and **moved** around. The system can be **viewed** graphically through various backends. The **magnetic field** is computed in the observer reference frame. Magpylib collects all inputs, and vectorizes the computation for maximal performance. + ```{toctree} :maxdepth: 2 From 3fe8135dfb1e1726d5ec82adb4314fe4f9964b10 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sat, 26 Apr 2025 23:35:21 +0200 Subject: [PATCH 141/211] add back examples --- docs/README.md | 1 + docs/_pages/API_reference.md | 2 +- docs/_pages/changelog_.md | 2 +- docs/_pages/user_guide/docs/docs_classes.md | 38 +-- docs/_pages/user_guide/docs/docs_fieldcomp.md | 20 +- .../user_guide/docs/docs_magpylib_force.md | 7 +- docs/_pages/user_guide/docs/docs_pos_ori.md | 21 +- docs/_pages/user_guide/docs/docs_styles.md | 2 +- .../user_guide/docs/docs_units_types.md | 2 +- .../user_guide/examples/examples_app_coils.md | 162 ++++++++++ .../examples/examples_app_end_of_shaft.md | 92 ++++++ .../examples/examples_app_halbach.md | 85 ++++++ .../examples/examples_app_scales.md | 23 ++ .../examples/examples_force_floating.md | 239 +++++++++++++++ .../examples/examples_force_force.md | 60 ++++ .../examples/examples_force_holding_force.md | 40 +++ .../user_guide/examples/examples_index.md | 288 +++++++++++++++++ .../examples/examples_misc_compound.md | 206 +++++++++++++ .../examples_misc_field_interpolation.md | 164 ++++++++++ .../examples/examples_misc_inhom.md | 141 +++++++++ .../examples/examples_shapes_cad.md | 43 +++ .../examples/examples_shapes_convex_hull.md | 45 +++ .../examples/examples_shapes_pyvista.md | 118 +++++++ .../examples/examples_shapes_superpos.md | 195 ++++++++++++ .../examples/examples_shapes_triangle.md | 196 ++++++++++++ .../examples/examples_tutorial_collection.md | 263 ++++++++++++++++ .../examples/examples_tutorial_custom.md | 252 +++++++++++++++ .../examples_tutorial_field_computation.md | 265 ++++++++++++++++ .../examples_tutorial_modeling_magnets.md | 97 ++++++ .../examples/examples_tutorial_paths.md | 195 ++++++++++++ .../examples/examples_vis_animations.md | 289 ++++++++++++++++++ .../examples/examples_vis_magnet_colors.md | 71 +++++ .../examples/examples_vis_mpl_streamplot.md | 131 ++++++++ .../examples/examples_vis_pv_streamlines.md | 73 +++++ .../examples/examples_vis_subplots.md | 99 ++++++ docs/_pages/user_guide/examples/logo.stl | Bin 0 -> 57384 bytes .../user_guide/guide_start_02_fundamentals.md | 117 +++---- docs/_static/switcher.json | 2 +- docs/_static/webcode/summaryOpen.js | 2 +- 39 files changed, 3931 insertions(+), 117 deletions(-) create mode 100644 docs/_pages/user_guide/examples/examples_app_coils.md create mode 100644 docs/_pages/user_guide/examples/examples_app_end_of_shaft.md create mode 100644 docs/_pages/user_guide/examples/examples_app_halbach.md create mode 100644 docs/_pages/user_guide/examples/examples_app_scales.md create mode 100644 docs/_pages/user_guide/examples/examples_force_floating.md create mode 100644 docs/_pages/user_guide/examples/examples_force_force.md create mode 100644 docs/_pages/user_guide/examples/examples_force_holding_force.md create mode 100644 docs/_pages/user_guide/examples/examples_index.md create mode 100644 docs/_pages/user_guide/examples/examples_misc_compound.md create mode 100644 docs/_pages/user_guide/examples/examples_misc_field_interpolation.md create mode 100644 docs/_pages/user_guide/examples/examples_misc_inhom.md create mode 100644 docs/_pages/user_guide/examples/examples_shapes_cad.md create mode 100644 docs/_pages/user_guide/examples/examples_shapes_convex_hull.md create mode 100644 docs/_pages/user_guide/examples/examples_shapes_pyvista.md create mode 100644 docs/_pages/user_guide/examples/examples_shapes_superpos.md create mode 100644 docs/_pages/user_guide/examples/examples_shapes_triangle.md create mode 100644 docs/_pages/user_guide/examples/examples_tutorial_collection.md create mode 100644 docs/_pages/user_guide/examples/examples_tutorial_custom.md create mode 100644 docs/_pages/user_guide/examples/examples_tutorial_field_computation.md create mode 100644 docs/_pages/user_guide/examples/examples_tutorial_modeling_magnets.md create mode 100644 docs/_pages/user_guide/examples/examples_tutorial_paths.md create mode 100644 docs/_pages/user_guide/examples/examples_vis_animations.md create mode 100644 docs/_pages/user_guide/examples/examples_vis_magnet_colors.md create mode 100644 docs/_pages/user_guide/examples/examples_vis_mpl_streamplot.md create mode 100644 docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md create mode 100644 docs/_pages/user_guide/examples/examples_vis_subplots.md create mode 100644 docs/_pages/user_guide/examples/logo.stl diff --git a/docs/README.md b/docs/README.md index bc95c1e35..0a0ba2474 100644 --- a/docs/README.md +++ b/docs/README.md @@ -7,3 +7,4 @@ The Documentation is built with [Sphinx](http://www.sphinx-doc.org/en/main/) and ### Handwritten documents Handwritten pages and guides are kept in the [_pages](./_pages) folder. They are all written in [Markdown](https://www.markdownguide.org/) using [myst-parser](https://github.com/executablebooks/MyST-Parser) as interface. Some documents like in the examples folder are dynamically computed with [myst-nb](https://github.com/executablebooks/myst-nb) as jupyter notebooks. With the help of the [jupytext](https://github.com/mwouts/jupytext) library ands its jupyterlab extension, examples can be written and executed within the jupyterlab ecosystem and saved as markdown file. It is recommended to use the [jupyterlab-myst](https://github.com/executablebooks/jupyterlab-myst) extension to be able to work with the full set of myst markdown flavor within jupyterlab. When editing the docs with vscode, use the [MyST-Markdown](https://marketplace.visualstudio.com/items?itemName=ExecutableBookProject.myst-highlight) extension to visualize the rendered document. + diff --git a/docs/_pages/API_reference.md b/docs/_pages/API_reference.md index b44c5a2bc..9c7ec255d 100644 --- a/docs/_pages/API_reference.md +++ b/docs/_pages/API_reference.md @@ -7,4 +7,4 @@ The API reference includes all Magpylib docstrings. :maxdepth: 2 ../../_autogen/magpylib.rst -``` +``` \ No newline at end of file diff --git a/docs/_pages/changelog_.md b/docs/_pages/changelog_.md index 33ac9e8e5..76a8f304f 100644 --- a/docs/_pages/changelog_.md +++ b/docs/_pages/changelog_.md @@ -9,4 +9,4 @@ The changelog provides a compressed history of the Magpylib development since it :relative-docs: docs/ :relative-images: :start-line: 2 -``` +``` \ No newline at end of file diff --git a/docs/_pages/user_guide/docs/docs_classes.md b/docs/_pages/user_guide/docs/docs_classes.md index 4c3839971..c7e8d00eb 100644 --- a/docs/_pages/user_guide/docs/docs_classes.md +++ b/docs/_pages/user_guide/docs/docs_classes.md @@ -64,9 +64,7 @@ All magnets are sources. They have the **polarizatio ### Cuboid ```python -magpylib.magnet.Cuboid( - position, orientation, dimension, polarization, magnetization, style -) +magpylib.magnet.Cuboid(position, orientation, dimension, polarization, magnetization, style) ``` ::::{grid} 2 @@ -83,9 +81,7 @@ magpylib.magnet.Cuboid( ### Cylinder ```python -magpylib.magnet.Cylinder( - position, orientation, dimension, polarization, magnetization, style -) +magpylib.magnet.Cylinder(position, orientation, dimension, polarization, magnetization, style) ``` ::::{grid} 2 @@ -102,9 +98,7 @@ magpylib.magnet.Cylinder( ### CylinderSegment ```python -magpylib.magnet.CylinderSegment( - position, orientation, dimension, polarization, magnetization, style -) +magpylib.magnet.CylinderSegment(position, orientation, dimension, polarization, magnetization, style) ``` ::::{grid} 2 @@ -125,9 +119,7 @@ magpylib.magnet.CylinderSegment( ### Sphere ```python -magpylib.magnet.Sphere( - position, orientation, diameter, polarization, magnetization, style -) +magpylib.magnet.Sphere(position, orientation, diameter, polarization, magnetization, style) ``` ::::{grid} 2 @@ -144,9 +136,7 @@ magpylib.magnet.Sphere( ### Tetrahedron ```python -magpylib.magnet.Tetrahedron( - position, orientation, vertices, polarization, magnetization, style -) +magpylib.magnet.Tetrahedron(position, orientation, vertices, polarization, magnetization, style) ``` ::::{grid} 2 @@ -168,19 +158,7 @@ magpylib.magnet.Tetrahedron( ### TriangularMesh ```python -magpylib.magnet.TriangularMesh( - position, - orientation, - vertices, - faces, - polarization, - magnetization, - check_open, - check_disconnected, - check_selfintersecting, - reorient_faces, - style, -) +magpylib.magnet.TriangularMesh(position, orientation, vertices, faces, polarization, magnetization, check_open, check_disconnected, check_selfintersecting, reorient_faces, style) ``` ::::{grid} 2 @@ -300,9 +278,7 @@ magpylib.misc.Dipole(position, orientation, moment, style) ### Triangle ```python -magpylib.misc.Triangle( - position, orientation, vertices, polarization, magnetization, style -) +magpylib.misc.Triangle(position, orientation, vertices, polarization, magnetization, style) ``` ::::{grid} 2 diff --git a/docs/_pages/user_guide/docs/docs_fieldcomp.md b/docs/_pages/user_guide/docs/docs_fieldcomp.md index 0169fd07c..c1632f3cf 100644 --- a/docs/_pages/user_guide/docs/docs_fieldcomp.md +++ b/docs/_pages/user_guide/docs/docs_fieldcomp.md @@ -22,7 +22,7 @@ that compute the respective fields B (B-field), H (H-field), J (polarization) or import magpylib as magpy # Define source and observer objects -loop = magpy.current.Circle(current=1, diameter=0.001) +loop = magpy.current.Circle(current=1, diameter=.001) sens = magpy.Sensor() # Compute field @@ -78,16 +78,15 @@ All "scalar" inputs of shape (x,) are automatically tiled up to shape (n,x) to c ```python import numpy as np import magpylib as magpy - # All inputs and outputs in SI units # Compute the cuboid field for 3 input instances -N = 3 # number of instances +N = 3 # number of instances B = magpy.getB( - sources="Cuboid", - observers=np.linspace((0, 0, 1), (0, 0, 3), N), - dimension=np.linspace((1, 1, 1), (3, 3, 3), 3, N), - polarization=(0, 0, 1), + sources='Cuboid', + observers=np.linspace((0,0,1), (0,0,3), N), + dimension=np.linspace((1,1,1), (3,3,3),3, N), + polarization=(0,0,1), ) # This example demonstrates the scale invariance @@ -154,13 +153,12 @@ All inputs must be NumPy ndarrays of shape (n,x). Details can be found in the re ```python import numpy as np import magpylib as magpy - # All inputs and outputs in SI units # Prepare input -z0 = np.array([1, 1]) -r = np.array([1, 1]) -z = np.array([2, 2]) +z0 = np.array([1,1]) +r = np.array([1,1]) +z = np.array([2,2]) # Compute field with core functions B = magpy.core.magnet_cylinder_axial_Bfield(z0=z0, r=r, z=z).T diff --git a/docs/_pages/user_guide/docs/docs_magpylib_force.md b/docs/_pages/user_guide/docs/docs_magpylib_force.md index fedc88b7d..71536f4af 100644 --- a/docs/_pages/user_guide/docs/docs_magpylib_force.md +++ b/docs/_pages/user_guide/docs/docs_magpylib_force.md @@ -31,7 +31,6 @@ The package provides only a single top-level function m +cuboc = magpy.Collection() +for t in triangles: + cuboc.add( + magpy.misc.Triangle( + polarization=(0.1, 0.2, 0.3), + vertices=t, + ) + ) + +# Display collection of triangles +magpy.show( + cuboc, + backend="pyvista", + style_magnetization_mode="arrow", + style_orientation_color="yellow", +) +``` + +## Triangular Prism Magnet + +Consider a prism with triangular base that is magnetized orthogonal to the base. All surface normals of the sides of the prism are orthogonal to the magnetization vector. As a result, the sides do not contribute to the magnetic field because their charge density disappears. Only the top and bottom surfaces contribute. One must be very careful when defining those surfaces in such a way that the surface normals point outwards. + +Leaving out parts of the surface that do not contribute to the field is beneficial for computation speed. + +```{code-cell} ipython3 +import magpylib as magpy + +# Create prism magnet as triangle collection +top = magpy.misc.Triangle( + polarization=(0, 0, 1), + vertices=((-0.01, -0.01, 0.01), (0.01, -0.01, 0.01), (0, 0.02, 0.01)), + style_label="top", +) +bott = magpy.misc.Triangle( + polarization=(0, 0, 1), + vertices=((-0.01, -0.01, -0.01), (0, 0.02, -0.01), (0.01, -0.01, -0.01)), + style_label="bottom", +) +prism = magpy.Collection(top, bott) + +# Display graphically +magpy.show(*prism, backend="plotly", style_opacity=0.5, style_magnetization_show=False) +``` + +## TriangularMesh class + +While `Triangle` simply provides the field of a charged triangle and can be used to construct complex forms, it is prone to error and tedious to work with when meshes become large. For this purpose, the `TriangularMesh` class ensures proper and convenient magnet creation by automatically checking mesh integrity and by orienting the faces at initialization. + +```{attention} +Automatic face reorientation of `TriangularMesh` may fail when the mesh is open. +``` + +In this example we revisit the cuboctahedron but generate it through the `TriangularMesh` class. + +```{code-cell} ipython3 +import magpylib as magpy +import numpy as np + +# Create cuboctahedron magnet (vertices and faces are transposed here for more compact display) +vertices_cm = [ + [0, -1, 1, 0, -1, 0, 1, 1, 0, -1, -1, 1], + [1, 1, 1, 1, 0, -1, 0, 0, -1, 0, -1, -1], + [-1, 0, 0, 1, 1, 1, 1, -1, -1, -1, 0, 0], +] +vertices = np.array(vertices_cm).T / 100 # cm -> m +faces = [ + [0, 3, 3, 3, 0, 0, 5, 8, 1, 10, 2, 11, 3, 3, 0, 0, 8, 8, 5, 5], + [1, 2, 4, 5, 7, 8, 10, 11, 9, 4, 6, 7, 1, 6, 9, 2, 10, 7, 4, 11], + [2, 1, 5, 6, 8, 9, 11, 10, 4, 9, 7, 6, 4, 2, 1, 7, 9, 11, 10, 6], +] +faces = np.array(faces).T +cuboc = magpy.magnet.TriangularMesh( + polarization=(0.1, 0.2, 0.3), vertices=vertices, faces=faces +) + +# Display TriangularMesh body +magpy.show( + cuboc, backend="plotly", style_mesh_grid_show=True, style_mesh_grid_line_width=4 +) +``` + +The `TriangularMesh` class is extremely powerful as it enables almost arbitrary magnet shapes. It is described in detail in {ref}`docu-magpylib-api-trimesh`. There are many ways to generate such triangular meshes. An example thereof is shown in {ref}`examples-shapes-pyvista`. + +```{caution} +* `getB` and `getH` compute the fields correctly only if the mesh is closed, not self-intersecting, and all faces are properly oriented outwards. + +* Input checks and face reorientation can be computationally expensive. The checks can individually be deactivated by setting `reorient_faces="skip"`, `check_open="skip"`, `check_disconnected="skip"`, and `check_selfintersecting="skip"` at initialization of `TriangularMesh` objects. The checks can also be performed by hand after initialization. + +* Meshing tools such as the [Pyvista](https://docs.pyvista.org/) library can be very convenient for building complex shapes, but often do not guarantee that the mesh is properly closed or connected - see {ref}`examples-shapes-pyvista`. + +* Meshing tools often create meshes with a lot of faces, especially when working with curved surfaces. Keep in mind that field computation takes of the order of a few microseconds per observer position per face, and that RAM is a limited resource. +``` + +## Open TriangularMesh + +In some cases, it may be desirable to generate a `TriangularMesh` object from an open mesh (see Prism example above). In this case one must be extremely careful because one cannot rely on the checks. Not to generate warnings or error messages, these checks can be disabled with `"skip"` or their outcome can be ignored with `"ignore"`. The `show` function can be used to view open edges and disconnected parts. In the following example we generate such an open mesh directly from `Triangle` objects. + +```{code-cell} ipython3 +import magpylib as magpy +import numpy as np + +# Create top and bottom faces of a prism magnet +top = magpy.misc.Triangle( + polarization=(1, 0, 0), + vertices=((-0.01, -0.01, 0.01), (0.01, -0.01, 0.01), (0, 0.02, 0.01)), +) +bottom = magpy.misc.Triangle( + polarization=(1, 0, 0), + vertices=((-0.01, -0.01, -0.01), (0, 0.02, -0.01), (0.01, -0.01, -0.01)), +) + +# Create prism with open edges +prism = magpy.magnet.TriangularMesh.from_triangles( + polarization=(0, 0, 1), # overrides triangles magnetization + triangles=[top, bottom], + check_open="ignore", # check but ignore open mesh + check_disconnected="ignore", # check but ignore disconnected mesh + reorient_faces="ignore", # check but ignore non-orientable mesh +) +prism.style.label = "Open Prism" +prism.style.magnetization.mode = "arrow" + +print("mesh status open:", prism.status_open) +print("mesh status disconnected:", prism.status_disconnected) +print("mesh status self-intersecting:", prism.status_selfintersecting) +print("mesh status reoriented:", prism.status_reoriented) + +prism.show( + backend="plotly", + style_mesh_open_show=True, + style_mesh_disconnected_show=True, +) +``` + +```{caution} +Keep in mind that the inside-outside check will fail, so that `getB` may yield wrong results on the inside of the prism where the polarization vector should be added. +``` diff --git a/docs/_pages/user_guide/examples/examples_tutorial_collection.md b/docs/_pages/user_guide/examples/examples_tutorial_collection.md new file mode 100644 index 000000000..ac1a81d3b --- /dev/null +++ b/docs/_pages/user_guide/examples/examples_tutorial_collection.md @@ -0,0 +1,263 @@ +--- +jupytext: + text_representation: + extension: .md + format_name: myst + format_version: 0.13 + jupytext_version: 1.16.0 +kernelspec: + display_name: Python 3 + language: python + name: python3 +orphan: true +--- + +(examples-tutorial-collection)= + +# Working with Collections + +The top-level class `Collection` allows users to group objects by reference for common manipulation. The following concepts apply to Magpylib Collections: + +1. A collection spans its own local frame of reference with position and orientation, to which the children are added. Thus, any operation applied to the collection is individually applied to all its children. +2. The collection itself behaves like a single Magpylib object (can be source and/or observer). +3. All children inside the collection can be individually addressed and manipulated, which will automatically manipulate their state inside the parent collection. +4. Collections have their own `style` attributes, their paths are displayed in `show`, and all children are automatically assigned their parent color. + +## Constructing Collections + +Collections have the attributes `children`, `sources`, `sensors` and `collections`. These attributes are ordered lists that contain objects that are added to the collection by reference (not copied). `children` returns a list of all objects in the collection. `sources` returns a list of the sources, `sensors` a list of the sensors and `collections` a list of "sub-collections" within the collection. + +```{code-cell} ipython3 +import magpylib as magpy + +x1 = magpy.Sensor(style_label="x1") +s1 = magpy.magnet.Cuboid(style_label="s1") +c1 = magpy.Collection(style_label="c1") + +coll = magpy.Collection(x1, s1, c1, style_label="coll") + +print(f"children: {coll.children}") +print(f"sources: {coll.sources}") +print(f"sensors: {coll.sensors}") +print(f"collections: {coll.collections}") +``` + +New additions are always added at the end. Use the **`add`** method or the parameters. + +```{code-cell} ipython3 +# Continuation from above - ensure previous code is executed + +# Copy adjusts object label automatically +x2 = x1.copy() +s2 = s1.copy() +c2 = c1.copy() + +# Add objects with add method +coll.add(x2, s2) + +# Add objects with parameters +coll.collections += [c2] + +print(f"children: {coll.children}") +print(f"sources: {coll.sources}") +print(f"sensors: {coll.sensors}") +print(f"collections: {coll.collections}") +``` + +The **`describe`** method is a very convenient way to view a Collection structure, especially when the collection is nested, i.e., when containing other collections. + +```{code-cell} ipython3 +# Continuation from above - ensure previous code is executed + +# Add more objects +c1.add(x2.copy()) +c2.add(s2.copy()) + +coll.describe(format="label+type") +``` + +The parameter `format` can be any combination of `"type"`, `"label"`, `"id"` and `"properties"`. + +For convenience, any two Magpylib objects can be added up with `+` to form a collection. + +```{code-cell} ipython3 +import magpylib as magpy + +x1 = magpy.Sensor(style_label="x1") +s1 = magpy.magnet.Cuboid(style_label="s1") + +coll = x1 + s1 + +coll.describe(format="label") +``` + +## Child-Parent Relations + +Objects that are part of a collection become children of that collection, and the collection itself becomes their parent. Every Magpylib object has the `parent` attribute, which is `None` by default. + +```{code-cell} ipython3 +import magpylib as magpy + +x1 = magpy.Sensor() +c1 = magpy.Collection(x1) + +print(f"x1.parent: {x1.parent}") +print(f"c1.parent: {c1.parent}") +print(f"c1.children: {c1.children}") +``` + +Rather than adding objects to a collection, as described above, one can also set the `parent` parameter. A Magpylib object can only have a single parent, i.e., it can only be part of a single collection. As a result, changing the parent will automatically remove the object from its previous collection. + +```{code-cell} ipython3 +import magpylib as magpy + +x1 = magpy.Sensor(style_label="x1") +c1 = magpy.Collection(style_label="c1") +c2 = magpy.Collection(c1, style_label="c2") + +print("Two empty, nested collections") +c2.describe(format="label") + +print("\nSet x1 parent to c1") +x1.parent = c1 +c2.describe(format="label") + +print("\nChange x1 parent to c2") +x1.parent = c2 +c2.describe(format="label") +``` + +## Accessing Children + +Collections have `__getitem__` through the attribute `children` defined which enables using collections directly as iterators, + +```{code-cell} ipython3 +import magpylib as magpy + +x1 = magpy.Sensor() +x2 = magpy.Sensor() + +coll = x1 + x2 + +for child in coll: + print(child) +``` + +and makes it possible to directly reference to a child object by index: + +```{code-cell} ipython3 +# Continuation from above - ensure previous code is executed + +print(coll[0]) +``` + +Collection nesting is powerful to create a self-consistent hierarchical structure, however, it is often in the way of quick child access in nested trees. For this, the `children_all`, `sources_all`, `sensors_all` and `collections_all` read-only parameters, return all objects in the tree: + +```{code-cell} ipython3 +import magpylib as magpy + +s1 = magpy.Sensor(style_label="s1") +s2 = s1.copy() +s3 = s2.copy() + +# This creates a nested collection +coll = s1 + s2 + s3 +coll.describe(format="label") + +# _all gives access to the whole tree +print([s.style.label for s in coll.sensors_all]) +``` + +## Practical Example + +The following example demonstrates how collections enable user-friendly manipulation of groups, sub-groups, and individual objects. + +```{code-cell} ipython3 +import numpy as np +import magpylib as magpy + +# Construct two coils from windings +coil1 = magpy.Collection(style_label="coil1") +for z in np.linspace(-0.0005, 0.0005, 5): + coil1.add(magpy.current.Circle(current=1, diameter=0.02, position=(0, 0, z))) +coil1.position = (0, 0, -0.005) +coil2 = coil1.copy(position=(0, 0, 0.005)) + +# Helmholtz consists of two coils +helmholtz = coil1 + coil2 + +# Move the helmholtz +helmholtz.position = np.linspace((0, 0, 0), (0.01, 0, 0), 15) +helmholtz.rotate_from_angax(np.linspace(0, 180, 15), "x", start=0) + +# Move the coils +coil1.move(np.linspace((0, 0, 0), (0.005, 0, 0), 15)) +coil2.move(np.linspace((0, 0, 0), (-0.005, 0, 0), 15)) + +# Move the windings +for coil in [coil1, coil2]: + for i, wind in enumerate(coil): + wind.move(np.linspace((0, 0, 0), (0, 0, (2 - i) * 0.001), 15)) + +# Display as animation +magpy.show(*helmholtz, animation=True, style_path_show=False) +``` + +For magnetic field computation, a collection with source children behaves like a single source object, and a collection with sensor children behaves like a flat list of its sensors when provided as `sources` and `observers` input respectively. + +```{code-cell} ipython3 +# Continuation from above - ensure previous code is executed + +import matplotlib.pyplot as plt + +B = magpy.getB(helmholtz, (0.01, 0, 0)) +plt.plot( + B * 1000, # T -> mT + label=["Bx", "By", "Bz"], +) + +plt.gca().set( + title="B-field (mT) at position x=10mm", xlabel="helmholtz path position index" +) +plt.gca().grid(color=".9") +plt.gca().legend() +plt.show() +``` + +## Efficient 3D Models + +The graphical backend libraries were not designed for complex 3D graphic output. As a result, it often becomes inconvenient and slow when attempting to display many 3D objects. One solution to this problem when dealing with large collections is to represent the latter by a single encompassing body, and to deactivate the individual 3D models of all children. + +```{code-cell} ipython3 +import magpylib as magpy + +# Create collection +coll = magpy.Collection() +for index in range(10): + cuboid = magpy.magnet.Cuboid( + polarization=(0, 0, (index % 2 - 0.5)), + dimension=(0.01, 0.01, 0.01), + position=(index * 0.01, 0, 0), + ) + coll.add(cuboid) + +# Add an encompassing 3D-trace +trace = magpy.graphics.model3d.make_Cuboid( + dimension=(0.104, 0.012, 0.012), + position=(0.045, 0, 0), + opacity=0.5, +) +coll.style.model3d.add_trace(trace) + +coll.style.label = "Collection with visible children" +coll.show() + +# Hide the children default 3D representation +coll.set_children_styles(model3d_showdefault=False) +coll.style.label = "Collection with hidden children" +coll.show() +``` + +## Compound Objects + +Collections can be subclassed to form dynamic groups that seamlessly integrate into Magpylib. Such classes are referred to as **compounds**. An example of how this is done is shown in {ref}`examples-misc-compound`. diff --git a/docs/_pages/user_guide/examples/examples_tutorial_custom.md b/docs/_pages/user_guide/examples/examples_tutorial_custom.md new file mode 100644 index 000000000..ea9983b84 --- /dev/null +++ b/docs/_pages/user_guide/examples/examples_tutorial_custom.md @@ -0,0 +1,252 @@ +--- +jupytext: + text_representation: + extension: .md + format_name: myst + format_version: 0.13 + jupytext_version: 1.16.0 +kernelspec: + display_name: Python 3 + language: python + name: python3 +orphan: true +--- + +(examples-tutorial-custom)= + +# CustomSource + +The {ref}`guide-docs-classes-custom-source` class was implemented to offer easy integration of user field implementations into Magpylib's object-oriented interface. + +```{note} +Obviously, any field implementation can be integrated. Specifically, fields where superposition holds and interactions do not disturb the sources (e.g. electric, gravitational, ...) can benefit from Magpylib's position and orientation interface. +``` + +## Magnetic Monopole + +In this example we create a class that represents the elusive magnetic monopole, which would have a magnetic field like this + +$$ +{\bf B} = Q_m \frac{{\bf r}}{|{\bf r}|^3}. +$$ + +Here the monopole lies in the origin of the local coordinates, $Q_m$ is the monopole charge and ${\bf r}$ is the observer position. + +We create this field as a Python function and hand it over to a CustomSource `field_func` argument. The `field_func` input must be a callable with two positional arguments `field` (can be `'B'` or `'H'`) and `observers` (must accept ndarrays of shape (n,3)), and return the respective fields in units of T and A/m in the same shape. + +```{code-cell} ipython3 +import numpy as np +import magpylib as magpy + +# Create monopole field +def mono_field(field, observers): + """ + Monopole field + + field: string, "B" or "H + return B or H-field + + observers: array_like of shape (n,3) + Observer positions + + Returns: np.ndarray, shape (n,3) + Magnetic monopole field + """ + Qm = 1 # unit T·m² + obs = np.array(observers).T # unit m + B = Qm * (obs / np.linalg.norm(obs, axis=0) ** 3).T # unit T + if field == "B": + return B # unit T + elif field == "H": + H = B / magpy.mu_0 # unit A/m + return H + else: + raise ValueError("Field Value must be either B or H") + +# Create CustomSource with monopole field +mono = magpy.misc.CustomSource(field_func=mono_field) + +# Compute field +print(mono.getB((1, 0, 0))) +print(mono.getH((1, 0, 0))) +``` + +Multiple of these sources can now be combined, making use of the Magpylib position/orientation interface. + +```{code-cell} ipython3 +# Continuation from above - ensure previous code is executed + +import matplotlib.pyplot as plt + +# Create two monopole charges +mono1 = magpy.misc.CustomSource(field_func=mono_field, position=(2, 2, 0)) +mono2 = magpy.misc.CustomSource(field_func=mono_field, position=(-2, -2, 0)) + +# Compute field on observer-grid +grid = np.mgrid[-5:5:100j, -5:5:100j, 0:0:1j].T[0] +X, Y, _ = np.moveaxis(grid, 2, 0) + +B = magpy.getB([mono1, mono2], grid, sumup=True) +Bx, By, _ = np.moveaxis(B, 2, 0) +normB = np.linalg.norm(B, axis=2) + +# Plot field in x-y symmetry plane +cp = plt.contourf(X, Y, np.log10(normB), cmap="gray_r", levels=10) +plt.streamplot(X, Y, Bx, By, color="k", density=1) + +plt.title("Field of two Monopoles") +plt.xlabel("x-position (m)") +plt.ylabel("y-position (m)") + +plt.tight_layout() +plt.show() +``` + +## Adding a 3D model + +While `CustomSource` is graphically represented by a simple marker by default, we can easily add a 3D model as described in {ref}`examples-own-3d-models`. + +```{code-cell} ipython3 +# Continuation from above - ensure previous code is executed + +# Load Sphere model +trace_pole = magpy.graphics.model3d.make_Ellipsoid( + dimension=np.array([.3, .3, .3]), +) + +for mono in [mono1, mono2]: + # Turn off default model + mono.style.model3d.showdefault = False + + # Add sphere model + mono.style.model3d.add_trace(trace_pole) + +# Display models +magpy.show(mono1, mono2) +``` + +## Subclassing CustomSource + +In the above example it would be nice to make the `CustomSource` dynamic, so that it would have a property `charge` that can be changed at will, rather than having to redefine the `field_func` and initialize a new object every time. In the following example we show how to sub-class `CustomSource` to achieve this. The problem is reminiscent of {ref}`examples-misc-compound`. + +```{code-cell} ipython3 +import numpy as np +import magpylib as magpy + +class Monopole(magpy.misc.CustomSource): + """Magnetic Monopole class + + Parameters + ---------- + charge: float + Monopole charge in units of T·m² + """ + + def __init__(self, charge, **kwargs): + super().__init__(**kwargs) # hand over style kwargs + self._charge = charge + + # Add spherical 3d model + trace_pole = magpy.graphics.model3d.make_Ellipsoid( + dimension=np.array([.3, .3, .3]), + ) + self.style.model3d.showdefault = False + self.style.model3d.add_trace(trace_pole) + + # Add monopole field_func + self._update() + + def _update(self): + """Apply monopole field function""" + + def mono_field(field, observers): + """monopole field""" + Qm = self._charge # unit T·m² + obs = np.array(observers).T # unit m + B = Qm * (obs / np.linalg.norm(obs, axis=0) ** 3).T # unit T + if field == "B": + return B # unit T + elif field == "H": + H = B / magpy.mu_0 # unit A/m + return H + else: + raise ValueError("Field Value must be either B or H") + + self.style.label = f"Monopole (charge={self._charge} T·m²)" + self.field_func = mono_field + + @property + def charge(self): + """Return charge""" + return self._charge + + @charge.setter + def charge(self, input): + """Set charge""" + self._charge = input + self._update() + +# Use new class +mono = Monopole(charge=1) +print(mono.getB((1, 0, 0))) + +# Change property charge of object +mono.charge = -1 +print(mono.getB((1, 0, 0))) +``` + +The new class seamlessly integrates into the Magpylib interface as we show in the following example where we have a look at the Quadrupole field. + +```{code-cell} ipython3 +# Continuation from above - ensure previous code is executed + +import matplotlib.pyplot as plt + +# Create a quadrupole from four monopoles +mono1 = Monopole(charge=1, style_color="r", position=(1, 0, 0)) +mono2 = Monopole(charge=1, style_color="r", position=(-1, 0, 0)) +mono3 = Monopole(charge=-1, style_color="b", position=(0, 0, 1)) +mono4 = Monopole(charge=-1, style_color="b", position=(0, 0, -1)) +qpole = magpy.Collection(mono1, mono2, mono3, mono4) + +# Matplotlib figure with 3d and 2d axis +fig = plt.figure(figsize=(10, 5)) +ax1 = fig.add_subplot(121, projection="3d", azim=-80, elev=15) +ax2 = fig.add_subplot(122) + +# Show 3D model in ax1 +magpy.show(*qpole, canvas=ax1, style_legend_show=False) + +# Compute B-field on xz-grid and display in ax2 +grid = np.mgrid[-2:2:100j, 0:0:1j, -2:2:100j].T[:,0] +X, _, Z = np.moveaxis(grid, 2, 0) + +B = qpole.getB(grid) +Bx, _, Bz = np.moveaxis(B, 2, 0) +scale = np.linalg.norm(B, axis=2)**.3 + +cp = ax2.contourf(X, Z, np.log(scale), levels=100, cmap="rainbow") +ax2.streamplot(X, Z, Bx, Bz, density=2, color="k", linewidth=scale) + +# Display pole position in ax2 +ppos = np.array([mono.position for mono in qpole]) +ax2.plot(ppos[:, 0], ppos[:, 2], marker="o", ms=10, mfc="k", mec="w", ls="") + +# Figure styling +ax1.set( + title="3D model", + xlabel="x-position (m)", + ylabel="y-position (m)", + zlabel="z-position (m)", +) +ax2.set( + title="Quadrupole field", + xlabel="x-position (m)", + ylabel="z-position (m)", + aspect=1, +) +fig.colorbar(cp, ax=ax2) + +plt.tight_layout() +plt.show() +``` diff --git a/docs/_pages/user_guide/examples/examples_tutorial_field_computation.md b/docs/_pages/user_guide/examples/examples_tutorial_field_computation.md new file mode 100644 index 000000000..0e54212ee --- /dev/null +++ b/docs/_pages/user_guide/examples/examples_tutorial_field_computation.md @@ -0,0 +1,265 @@ +--- +jupytext: + text_representation: + extension: .md + format_name: myst + format_version: 0.13 + jupytext_version: 1.16.0 +kernelspec: + display_name: Python 3 + language: python + name: python3 +orphan: true +--- + +(examples-tutorial-field-computation)= + +# Computing the Field + +## Most basic Example + +The v2 slogan was *"The magnetic field is only three lines of code away"*, which is demonstrated by the following most fundamental and self-explanatory example, + +```{code-cell} ipython3 +import magpylib as magpy +loop = magpy.current.Circle(current=1, diameter=1) +B = loop.getB((0, 0, 0)) + +print(B) +``` + +## Field on a Grid + +There are four field computation functions: `getB` will compute the B-field in T. `getH` computes the H-field in A/m. `getJ` computes the magnetic polarization in units of T. `getM` computes the magnetization in units of A/m. + +All these functions will return the field in the shape of the input. In the following example, BHJM-fields of a diametrically magnetized cylinder magnet are computed on a position grid in the symmetry plane and are then displayed using Matplotlib. + +```{code-cell} ipython3 +import matplotlib.pyplot as plt +import numpy as np +from numpy.linalg import norm +import magpylib as magpy + +fig, [[ax1,ax2], [ax3,ax4]] = plt.subplots(2, 2, figsize=(10, 10)) + +# Create an observer grid in the xy-symmetry plane +grid = np.mgrid[-50:50:100j, -50:50:100j, 0:0:1j].T[0] +X, Y, _ = np.moveaxis(grid, 2, 0) + +# Compute BHJM-fields of a cylinder magnet on the grid +cyl = magpy.magnet.Cylinder(polarization=(0.5, 0.5, 0), dimension=(40, 20)) + +B = cyl.getB(grid) +Bx, By, _ = np.moveaxis(B, 2, 0) + +H = cyl.getH(grid) +Hx, Hy, _ = np.moveaxis(H, 2, 0) + +J = cyl.getJ(grid) +Jx, Jy, _ = np.moveaxis(J, 2, 0) + +M = cyl.getM(grid) +Mx, My, _ = np.moveaxis(M, 2, 0) + +# Display field with Pyplot +ax1.streamplot(X, Y, Bx, By, color=np.log(norm(B, axis=2)), cmap="spring_r") +ax2.streamplot(X, Y, Hx, Hy, color=np.log(norm(H, axis=2)), cmap="winter_r") +ax3.streamplot(X, Y, Jx, Jy, color=norm(J, axis=2), cmap="summer_r") +ax4.streamplot(X, Y, Mx, My, color=norm(M, axis=2), cmap="autumn_r") + +ax1.set_title("B-Field") +ax2.set_title("H-Field") +ax3.set_title("J-Field") +ax4.set_title("M-Field") + +for ax in [ax1,ax2,ax3,ax4]: + ax.set( + xlabel="x-position", + ylabel="y-position", + aspect=1, + xlim=(-50,50), + ylim=(-50,50), + ) + # Outline magnet boundary + ts = np.linspace(0, 2 * np.pi, 50) + ax.plot(20 * np.sin(ts), 20 * np.cos(ts), "k--") + +plt.tight_layout() +plt.show() +``` + +(examples-tutorial-field-computation-sensors)= + +## Using Sensors + +The `Sensor` class enables relative positioning of observer grids in the global coordinate system. The observer grid is stored in the `pixel` parameter of the sensor object which is `(0,0,0)` by default (sensor position = observer position). + +The following example shows a moving and rotating sensor with two pixels. At the same time, the source objects are moving to demonstrate the versatility of the field computation. + +```{code-cell} ipython3 +import numpy as np +import magpylib as magpy + +# Reset defaults set in previous example +magpy.defaults.reset() + + +# Define sensor with path +sensor = magpy.Sensor(pixel=[(0, 0, -0.0005), (0, 0, 0.0005)], style_size=1.5) +sensor.position = np.linspace((0, 0, -0.003), (0, 0, 0.003), 37) + +angles = np.linspace(0, 360, 37) +sensor.rotate_from_angax(angles, "z", start=0) + +# Define source with path +cyl1 = magpy.magnet.Cylinder( + polarization=(0.1, 0, 0), dimension=(0.001, 0.002), position=(0.003, 0, 0) +) +cyl2 = cyl1.copy(position=(-0.003, 0, 0)) +coll = magpy.Collection(cyl1, cyl2) +coll.rotate_from_angax(-angles, "z", start=0) + +# Display system and field at sensor +with magpy.show_context(sensor, coll, animation=True, backend="plotly"): + magpy.show(col=1) + magpy.show(output="Bx", col=2, pixel_agg=None) +``` + +## Multiple Inputs + +When `getBHJM` receive multiple inputs for sources and observers they will compute all possible combinations. It is still beneficial to call the field computation only a single time, because similar sources will be grouped, and the computation will be vectorized automatically. + +```{code-cell} ipython3 +import magpylib as magpy + +# Three sources +cube1 = magpy.magnet.Cuboid(polarization=(0, 0, 1), dimension=(0.1, 0.1, 0.1)) +cube2 = cube1.copy() +cube3 = cube1.copy() + +# Two sensors with 4x5 pixel each +pixel = [[[(i / 1000, j / 1000, 0)] for i in range(4)] for j in range(5)] +sens1 = magpy.Sensor(pixel=pixel) +sens2 = sens1.copy() + +# Compute field +B = magpy.getB([cube1, cube2, cube3], [sens1, sens2]) + +# The result includes all combinations +B.shape +``` + +Select the second cube (first index), the first sensor (second index), pixel 3-4 (index three and four) and the Bz-component of the field (index five) + +```{code-cell} ipython3 +# Continuation from above - ensure previous code is executed + +B[1, 0, 2, 3, 2] +``` + +A path will add another index. Every higher pixel dimension will add another index as well. + +## Field as Pandas Dataframe + +Instead of a NumPy `ndarray`, the field computation can also return a [pandas](https://pandas.pydata.org/).[dataframe](https://pandas.pydata.org/docs/user_guide/dsintro.html#dataframe) using the `output='dataframe'` kwarg. + +```{code-cell} ipython3 +import numpy as np +import magpylib as magpy + +cube = magpy.magnet.Cuboid( + polarization=(0, 0, 1), dimension=(0.01, 0.01, 0.01), style_label="cube" +) +loop = magpy.current.Circle( + current=200, + diameter=0.02, + style_label="loop", +) +sens1 = magpy.Sensor( + pixel=[(0, 0, 0), (0.005, 0, 0)], + position=np.linspace((-0.04, 0, 0.02), (0.04, 0, 0.02), 30), + style_label="sens1", +) +sens2 = sens1.copy(style_label="sens2").move((0, 0, 0.01)) + +B = magpy.getB( + [cube, loop], + [sens1, sens2], + output="dataframe", +) + +B +``` + +Plotting libraries such as [plotly](https://plotly.com/python/plotly-express/) or [seaborn](https://seaborn.pydata.org/introduction.html) can take advantage of this feature, as they can deal with `dataframes` directly. + +```{code-cell} ipython3 +# Continuation from above - ensure previous code is executed + +import plotly.express as px + +fig = px.line( + B, + x="path", + y="Bx", + color="pixel", + line_group="source", + facet_col="source", + symbol="sensor", +) +fig.show() +``` + +(examples-tutorial-field-computation-functional-interface)= + +## Functional Interface + +All above computations demonstrate the convenient object-oriented interface of Magpylib. However, there are instances when it is better to work with the functional interface instead. + +1. Reduce overhead of Python objects +2. Complex computation instances + +In the following example we show how complex instances are computed using the functional interface. + +```{important} +The functional interface will only outperform the object oriented interface if you use NumPy operations for input array creation, such as `tile`, `repeat`, `reshape`, ... ! +``` + +```{code-cell} ipython3 +import numpy as np +import magpylib as magpy + +# Two different magnet dimensions +dim1 = (0.02, 0.04, 0.04) +dim2 = (0.04, 0.02, 0.02) +DIM = np.vstack( + ( + np.tile(dim1, (6, 1)), + np.tile(dim2, (6, 1)), + ) +) + +# Sweep through different polarizations for each magnet type +pol = np.linspace((0, 0, 0.5), (0, 0, 1), 6) +POL = np.tile(pol, (2, 1)) + +# Airgap must stay the same +pos1 = (0, 0, 0.03) +pos2 = (0, 0, 0.02) +POS = np.vstack( + ( + np.tile(pos1, (6, 1)), + np.tile(pos2, (6, 1)), + ) +) + +# Compute all instances with the functional interface +B = magpy.getB( + sources="Cuboid", + observers=POS, + polarization=POL, + dimension=DIM, +) + +B.round(decimals=2) +``` diff --git a/docs/_pages/user_guide/examples/examples_tutorial_modeling_magnets.md b/docs/_pages/user_guide/examples/examples_tutorial_modeling_magnets.md new file mode 100644 index 000000000..fc00f1099 --- /dev/null +++ b/docs/_pages/user_guide/examples/examples_tutorial_modeling_magnets.md @@ -0,0 +1,97 @@ +(examples-tutorial-modeling-magnets)= + +# Modeling a real magnet + +Whenever you wish to compare Magpylib simulations with experimental data obtained using a real permanent magnet, you might wonder how to properly set up a Magpylib magnet object to reflect the physical permanent magnet in question. The goal of this tutorial is to explain how to extract this information from respective datasheets, to provide better understanding of permanent magnets, and show how to align Magpylib simulations with experimental measurements. + +This tutorial was supported by [BOMATEC](https://www.bomatec.com/de) by providing excellent data sheets and by supplying magnets for the experimental demonstration below. + +## Short summary + +In a magnet data sheet, you should find B-H curves and J-H curves. These curves coincide at H=0, which gives the intrinsic material remanence $B_r$. As a result of material response and self-interaction, the magnet "demagnetizes" itself so that the mean magnetic polarization of a real magnet is always below the remanence. How much below depends strongly on the shape of the magnet and is expressed in the data sheet through the permeance coefficient lines (grey lines). The numbers at the end indicate the typical magnet length to diameter ratio (L/D). + +To obtain the correct magnetic polarization of a magnet from the data sheet, one must find the crossing between B-H curve and respective permeance coefficient line. This gives the "working point" which corresponds to the mean demagnetizing H-field inside the magnet. The correct polarization to use in the Magpylib simulation is the J-value at the working point which can be read off from the J-H curve. + +![data sheet snippet](../../../_static/images/examples_tutorial_magnet_datasheet2.png) + +The following sections provide further explanation on the matter. + +## Hysteresis loop + +If you've worked with magnetism, chances are very high that you have seen a magnetic hysteresis loop. Hysteresis loops describe the connection between the **mean values** of an externally applied H-field and the resulting B-field, polarization J or magnetization M **within a defined volume**. This connection depends strongly on the size and shape of this volume and what is inside and what is outside. + +The B-H curve is called the "normal loop", while J-H and M-H curves are called "intrinsic loops". Hereon we only make use of the J-H loops, but the discussion is similar for M-H. Normal and intrinsic loops are connected via $B = \mu_0 H + J$. In free space the B-H connection is just a straight line defined via $B = \mu_0 H$. When the whole space is filled with magnetic material you will see something like this within an arbitrary volume: + +::::{grid} 2 +:::{grid-item} +:columns: 3 +::: +:::{grid-item} +:columns: 6 +![hysteresis loops](../../../_static/images/examples_tutorial_magnet_hysteresis.png) +::: +:::: + +**1st quadrant**: Initially we have $J=0$ and $H=0$. The magnetic material is not magnetized, and no external H-field is applied. When increasing the H-field, the material polarization will follow the "virgin curve" and will increase until it reaches its maximum possible value, the saturation polarization $J_S$. Higher values of $H$ will not affect $J$, while $B$ will keep increasing linearly. Now we are on the "major loop" - we will never return to the virgin curve. After reaching a large H-value we slowly turn the H-field off. As it drops to zero the material will retain its strong polarization at saturation level while the resulting $B$ decreases. At $H = 0$ the B-field then approaches the "remanence field" $B_r$, and its only contribution is $J_S$. + +**2nd quadrant**: Now the H-field becomes negative. Its amplitude increases but it is oriented opposite to the initial direction. Therefore, it is also opposite to the magnetic polarization. In the 2nd quadrant we are now trying to actively demagnetize the material. This part of the hysteresis loop is often referred to as the "demagnetization curve". With increasing negative H, the B-field continues to become smaller until it reaches zero at the "coercive field" $H_c$. At this point the net B-field inside the volume is zero, however, the material is still magnetized! In the example loop above, the polarization at $H_c$ is still at the $J_S$ level. By increasing the H-field further, a point will be reached where the material will start to demagnetize. This can be seen by the non-linear drop of $J$. The point where $J$ reaches zero is called the "intrinsic coercive field" $H_{ci}$. At this point the net polarization in the observed volume is zero. The material is demagnetized. The intrinsic coercive field is a measure of how well a magnetized material can resist a demagnetizing field. Having large values of $H_{ci}$ is a property of "hard magnets", as they can keep their magnetization $J$ even for strong external fields in the opposite direction. + +**3rd and 4th quadrants**: Moving to the third quadrant the behavior is now mirrored. As $H$ increases past $H_{ci}$, polarization quickly aligns with the external field and the material becomes saturated $J=-J_S$. By turning the field around again, we move through the fourth quadrant to complete the hysteresis loop. + +Hysteresis in magnetism as presented here is a macroscopic model that is the result of a complex interplay between dipole and exchange interaction, material texture and resulting domain formation at a microscopic level. Details can be found, for example, in Aharoni's classical textbook "Introduction to the Theory of Ferromagnetism". + +## The demagnetizing field + +If in an application the applied external H-field is zero, it seems intuitive to use the remanence $B_r$ for the magnetic polarization in the Magpylib simulation. It is a value that you will find in the data sheet. + +![data sheet snippet](../../../_static/images/examples_tutorial_magnet_table.png) + +However, if considering $J=B_r$, you will quickly see that the experimental results are up to ~30 % below of what you would expect. The reason for this is the self-induced demagnetizing field of the magnet which is generated by the magnetic polarization itself. Just like $J$ generates an H-field on the outside of the magnet, it also generates an H-field inside the magnet, along the opposite direction of the polarization. The H-field outside the magnet is known as the stray field, and the H-field inside the magnet is called the demagnetizing field (as it opposes the magnetic polarization). This is demonstrated by the following figure: + +![demagnetization field simulation](../../../_static/images/examples_tutorial_magnet_fieldcomparison.png) + +Making use of the [streamplot example](examples-vis-mpl-streamplot), on the left side we show the cross-section of a Cuboid magnet and its homogeneous polarization. And on the right, we see the H-field generated by it. Inside the magnet the generated H-field opposes the polarization. As a result, the polarization of a magnet will not be $B_r$, but instead will be some value of $J$ in the 2nd quadrant of the J-H loop that corresponds to the mean H-field inside the magnet. This H-value is often referred to as the "working point". + +## Finding the correct polarization + +As explained above, the hysteresis loop depends strongly on the chosen observation volume geometry, the material inside, and what is outside of the volume. Magnet manufacturers provide such loops (usually only the 2nd quadrant) for their magnets, meaning that the observation volume is the whole magnet with air outside. + +To obtain the correct mean polarization of a magnet we simply must compute the mean demagnetizing field (= working point) and read the resulting $J$ off the provided J-H loop. Computing the mean demagnetizing field, however, is not a simple task. In addition to the material response (permeability), it depends strongly on the magnet geometry. Fortunately, the working points can be read off from well written data sheets. + +![data sheet snippet](../../../_static/images/examples_tutorial_magnet_datasheet.png) + +This datasheet snippet shows the second quadrant of the B-H and J-H loops, even for two different temperatures. The working point is given by the intersection between the "permeance coefficient" lines (gray) and the B-H curve. The number at the end of these lines indicate the length to diameter ratio (L/D) of the magnet, which is the critical geometric factor. Different lines are for different L/D values, which allows one to select the correct working point for different magnets made from this specific material. Once the working point is found, the correct magnetic polarization, here denoted by $J_W$ (the magnetic polarization at the working point), can be read off. The following figure exemplifies the changes in $J_W$ for different L/D values, considering a cylinder magnet: + +![finding the working point](../../../_static/images/examples_tutorial_magnet_LDratio.png) + +Permanent magnets with different geometries, such as a parallelepiped shape, will have different behavior in terms of L/D values. Make sure you are reading the data from the correct part number. +## Warning + +Keep in mind that there are still many reasons why your simulation might not fit well to your experiment. Here are some of the most common problems: + +1. Small position errors of less than 100 um can have a large impact on the measurement result. The reference should be the sensitive element inside a sensor package. These elements can be displaced by 10-100 um and even rotated by a few degrees. The sensor might also not be well calibrated. +2. There are external stray fields, like the earth magnetic field, that influence the measurements. Those might also come from other nearby electronic equipment or magnetic parts. +3. Off-the-shelf magnets often do not hold what is promised in the datasheet + - Magnetic polarization amplitude can be off by 5-10 %. + - The direction of polarization often varies by up to a few degrees. + - Worst-case: the polarization can be inhomogeneous which is often a problem in injection-mold magnets. + +## Example + +::::{grid} 2 +:::{grid-item} +:columns: 3 +::: +:::{grid-item} +:columns: 6 +![](../../../_static/images/examples_icon_WIP.png) +::: +:::: + +coming soon: +1. Magpylib simulation code +2. Experimental data +3. Comparison and discussion + +**Exterior reference** +G. Martinek, S. Ruoho and U. Wyss. (2021). *Magnetic Properties of Permanents Magnets & Measuring Techniques* [White paper]. Arnold Magnetic Technologies. https://www.arnoldmagnetics.com/blog/measuring-permanent-magnets-white-paper/ \ No newline at end of file diff --git a/docs/_pages/user_guide/examples/examples_tutorial_paths.md b/docs/_pages/user_guide/examples/examples_tutorial_paths.md new file mode 100644 index 000000000..0da674d36 --- /dev/null +++ b/docs/_pages/user_guide/examples/examples_tutorial_paths.md @@ -0,0 +1,195 @@ +--- +jupytext: + text_representation: + extension: .md + format_name: myst + format_version: 0.13 + jupytext_version: 1.16.0 +kernelspec: + display_name: Python 3 + language: python + name: python3 +orphan: true +--- + +(examples-tutorial-paths)= + +# Working with Paths + +The position and orientation attributes are key elements of Magpylib. The documentation section {ref}`docs-position` describes how they work in detail. Wile these definitions can seem abstract, the interface was constructed as intuitively as possible which is demonstrated in this tutorial. + +```{important} +Always make use of paths when computing with multiple Magpylib object position and orientation instances. This enables vectorized computation. Avoid Python loops at all costs! +``` + +In this tutorial we show some good practice examples. + +## Assigning Absolute Paths + +Absolute object paths are assigned at initialization or through the object properties. + +```{code-cell} ipython3 +import numpy as np +from scipy.spatial.transform import Rotation as R +import magpylib as magpy + +# Create paths +ts = np.linspace(0, 10, 31) +pos = np.array([(0.1 * t, 0, 0.1 * np.sin(t)) for t in ts]) +ori = R.from_rotvec(np.array([(0, -0.1 * np.cos(t) * 0.785, 0) for t in ts])) + +# Set path at initialization +sensor = magpy.Sensor(position=pos, orientation=ori) + +# Set path through properties +cube = magpy.magnet.Cuboid(polarization=(0, 0, 1), dimension=(0.01, 0.01, 0.01)) +cube.position = pos + np.array((0, 0, 0.3)) +cube.orientation = ori + +# Display as animation +magpy.show(sensor, cube, animation=True, backend="plotly") +``` + +## Relative Paths + +`move` and `rotate` input is interpreted relative to the existing path. When the input is scalar the whole existing path is moved. + +```{code-cell} ipython3 +import numpy as np +from scipy.spatial.transform import Rotation as R +import magpylib as magpy + +# Create paths +ts = np.linspace(0, 10, 21) +pos = np.array([(0.1 * t, 0, 0.1 * np.sin(t)) for t in ts]) +ori = R.from_rotvec(np.array([(0, -0.1 * np.cos(t) * 0.785, 0) for t in ts])) + +# Set path at initialization +sens1 = magpy.Sensor(position=pos, orientation=ori, style_label="sens1") + +# Apply move operation to whole path with scalar input +sens2 = sens1.copy(style_label="sens2") +sens2.move((0, 0, 0.05)) + +# Apply rotate operation to whole path with scalar input +sens3 = sens1.copy(style_label="sens3") +sens3.rotate_from_angax(angle=90, axis="y", anchor=0) + +# Display paths +magpy.show(sens1, sens2, sens3) +``` + +When the input is a vector, the path is by default appended. + +```{code-cell} ipython3 +import numpy as np +from magpylib.magnet import Sphere + +# Create paths +x_path = np.linspace((0, 0, 0), (0.1, 0, 0), 10)[1:] +z_path = np.linspace((0, 0, 0), (0, 0, 0.1), 10)[1:] + +# Create sphere object +sphere = Sphere(polarization=(0, 0, 1), diameter=0.03) + +# Apply paths subsequently +for _ in range(3): + sphere.move(x_path).move(z_path) + +# Display paths +sphere.show() +``` + +## Merging paths + +Complex paths can be created by merging multiple path operations. This is done with vector input for the `move` and `rotate` methods and choosing values for `start` that will make the paths overlap. In the following example we combine a linear path with a rotation about self (`anchor=None`) until path index 30. Thereon, a second rotation about the origin is applied, creating a spiral. + +```{code-cell} ipython3 +import numpy as np +from magpylib.magnet import Cuboid + +# Create cube and set linear path +cube = Cuboid(polarization=(0, 0, 0.1), dimension=(0.02, 0.02, 0.02)) +cube.position = np.linspace((0, 0, 0), (0.1, 0, 0), 60) + +# Apply rotation about self - starting at index 0 +cube.rotate_from_rotvec(np.linspace((0, 0, 0), (0, 0, 360), 30), start=0) + +# Apply rotation about origin - starting at index 30 +cube.rotate_from_rotvec(np.linspace((0, 0, 0), (0, 0, 360), 30), anchor=0, start=30) + +# Display paths as animation +cube.show(backend="plotly", animation=True) +``` + +## Reset path + +The `reset_path()` method allows users to reset an object path to `position=(0,0,0)` and `orientation=None`. + +```{code-cell} ipython3 +import magpylib as magpy + +# Create sensor object with complex path +sensor = magpy.Sensor().rotate_from_angax( + [1, 2, 3, 4], (1, 2, 3), anchor=(0, 0.03, 0.05) +) + +# Reset path +sensor.reset_path() + +print(sensor.position) +print(sensor.orientation.as_quat()) +``` + +(examples-tutorial-paths-edge-padding-end-slicing)= +## Edge-padding and end-slicing + +Magpylib will always make sure that object paths are in the right format, i.e., `position` and `orientation` attributes are of the same length. In addition, when objects with different path lengths are combined, e.g., when computing the field, the shorter paths are treated as static beyond their end to make the computation sensible. Internally, Magpylib follows a philosophy of edge-padding and end-slicing when adjusting paths. + +The idea behind **edge-padding** is that, whenever path entries beyond the existing path length are needed, the edge-entries of the existing path are returned. This means that the object is static beyond its existing path. + +In the following example the orientation attribute is padded by its edge value `(0,0,.2)` as the position attribute length is increased. + +```{code-cell} ipython3 +from scipy.spatial.transform import Rotation as R +import magpylib as magpy + +sensor = magpy.Sensor( + position=[(0, 0, 0), (0.01, 0.01, 0.01)], + orientation=R.from_rotvec([(0, 0, 0.1), (0, 0, 0.2)]), +) +sensor.position = [(i / 100, i / 100, i / 100) for i in range(4)] +print(sensor.position) +print(sensor.orientation.as_rotvec()) +``` + +When the field is computed of `loop1` with path length 4 and `loop2` with path length 2, `loop2` will remain in position (= edge padding) while the other object is still in motion. + +```{code-cell} ipython3 +from magpylib.current import Circle + +loop1 = Circle(current=1, diameter=1, position=[(0, 0, i) for i in range(4)]) +loop2 = Circle(current=1, diameter=1, position=[(0, 0, i) for i in range(2)]) + +B = magpy.getB([loop1, loop2], (0, 0, 0)) +print(B) +``` + +The idea behind **end-slicing** is that, whenever a path is automatically reduced in length, Magpylib will slice to keep the ending of the path. While this occurs rarely, the following example shows how the `orientation` attribute is automatically end-sliced, keeping the values `[(0,0,.3), (0,0,.4)]`, when the `position` attribute is reduced in length: + +```{code-cell} ipython3 +from scipy.spatial.transform import Rotation as R +from magpylib import Sensor + +sensor = Sensor( + position=[(0, 0, 0), (0.01, 0.01, 0.01), (0.02, 0.02, 2), (0.03, 0.03, 0.03)], + orientation=R.from_rotvec([(0, 0, 0.1), (0, 0, 0.2), (0, 0, 0.3), (0, 0, 0.4)]), +) +sensor.position = [(0.01, 0.02, 0.03), (0.02, 0.03, 0.04)] +print(sensor.position) +print(sensor.orientation.as_rotvec()) +``` + +```{code-cell} ipython3 + +``` diff --git a/docs/_pages/user_guide/examples/examples_vis_animations.md b/docs/_pages/user_guide/examples/examples_vis_animations.md new file mode 100644 index 000000000..87c560685 --- /dev/null +++ b/docs/_pages/user_guide/examples/examples_vis_animations.md @@ -0,0 +1,289 @@ +--- +jupytext: + text_representation: + extension: .md + format_name: myst + format_version: 0.13 + jupytext_version: 1.16.1 +kernelspec: + display_name: Python 3 (ipykernel) + language: python + name: python3 +orphan: true +--- + +(examples-vis-animations)= + +# Animations + +Magpylib can display the motion of objects along paths in the form of animations. + +```{hint} +1. Animations work best with the [plotly backend](guide-graphic-backends). + +2. If your browser window opens, but your animation does not load, reload the page. + +3. Avoid rendering too many frames. +``` + +Detailed information about how to tune animations can be found in the [graphics documentation](guide-graphic-animations). + +## Simple Animations + +Animations are created with `show` by setting `animation=True`. It is also possible to hand over the animation time with this parameter. + +```{code-cell} ipython3 +import magpylib as magpy +import numpy as np + +# Define magnet with path +magnet = magpy.magnet.Cylinder( + polarization=(1, 0, 0), + dimension=(2, 1), + position=(4, 0, 0), + style_label="magnet", +) +magnet.rotate_from_angax(angle=np.linspace(0, 300, 40), start=0, axis="z", anchor=0) + +# Define sensor with path +sensor = magpy.Sensor( + pixel=[(-0.2, 0, 0), (0.2, 0, 0)], + position=np.linspace((0, 0, -3), (0, 0, 3), 40), + style_label="sensor", +) + +# Display as animation - prefers plotly backend +magpy.show(sensor, magnet, animation=True, backend="plotly") +``` + +(examples-vis-animated-subplots)= + +## Animated Subplots + +[Subplots](examples-vis-subplots) are a powerful tool to see the field along a path while viewing the 3D models at the same time. This is specifically illustrative as an animation where the field at the respective path position is indicated by a marker. + +```{code-cell} ipython3 +# Continuation from above - ensure previous code is executed + +magpy.show( + dict(objects=[magnet, sensor], output=["Bx", "By", "Bz"], col=1), + dict(objects=[magnet, sensor], output="model3d", col=2), + backend="plotly", + animation=True, +) +``` + +It is also possible to use the [show_context](guide-graphics-show_context) context manager. + +```{code-cell} ipython3 +# Continuation from above - ensure previous code is executed + +with magpy.show_context([magnet, sensor], backend="plotly", animation=True) as sc: + sc.show(output="Bx", col=1, row=1) + sc.show(output="By", col=1, row=2) + sc.show(output="Bz", col=2, row=1) + sc.show(output="model3d", col=2, row=2) +``` + +(examples-vis-exporting-animations)= + +## Exporting Animations + +Animations are wonderful but can be quite difficult to export when they are needed, for example, in a presentation. Here we show how to creat and export animations using the *.gif format. + +### Built-in export + +The easiest way to export an animation is via the Magpylib built-in command `animation_output` in the `show` function. It works only with the Pyvista backend. The following code will create a file "test4.gif". + +```python +import magpylib as magpy +import numpy as np + +# Create magnets with Paths +path = [(np.sin(t)+1.5,0,0) for t in np.linspace(0, 2*np.pi, 30)] +cube1 = magpy.magnet.Cuboid(dimension=(1,1,1), polarization=(1,0,0), position= path) +cube2 = cube1.copy(position=-np.array(path), polarization=(-1,0,0)) + +# Store gif with animation_output using Pyvista +magpy.show( + cube1, + cube2, + style_legend_show=False, + animation=3, + animation_output="my.gif", + backend="pyvista", + style_path_show=False, +) +``` + + + +### Custom export Pyvista + +For customizing videos it is best to work directly in the respective graphic backends. Here we show how to transfer the Magpylib graphic objects to a Pyvista plotter, customize the plotting scene, export screen shots, and combine them in a *.gif. The following example also shows how to achieve transparency. + +```python +import magpylib as magpy +import pyvista as pv +from PIL import Image + +def create_gif(images, frame_time, output_file): + """Create a GIF from images""" + frames = [Image.fromarray(img) for img in images] + if frames: + frames[0].save( + output_file, + format="GIF", + append_images=frames[1:], + save_all=True, + duration=frame_time, + loop=0, # Infinite loop + disposal=2, # Remove previous frames for transparency + ) + + +def init_plotter(): + """ Init Pyvista plotter with custom scene layout""" + pl = pv.Plotter(notebook=False, off_screen=True, window_size=[300, 300]) + pl.camera_position = [ + (5, 5, 5), # Position of the camera + (0, 0, 0), # Focal point (what the camera is looking at) + (0, 0, 1) # View up direction + ] + pl.camera.zoom(0.5) + pl.set_background("k") # For better transparency + return pl + + +def create_frames(frames): + """Create frames with Pyvista.""" + + # Create Magpylib objects + mag1 = magpy.magnet.CylinderSegment(dimension=(3, 4, 1, 0, 45), polarization=(0, 0, 1)) + mag2 = magpy.magnet.CylinderSegment(dimension=(2, 3, 1, 0, 45), polarization=(0, 0, -1)) + + images = [] + pl = init_plotter() + for i in range(frames): + + # Modify object positions + mag1.rotate_from_angax(360 / frames, axis='z') + mag2.rotate_from_angax(-360 / frames, axis='z') + + # Transfer Magpylib objects to Pyvista plotter + pl.clear() + magpy.show(mag1, mag2, canvas=pl, style_legend_show=False) + + # Edit figure in Pyvista + pl.add_mesh(pv.Line(mag1.barycenter, mag2.barycenter), color="cyan") + + # Screenshot + print(f"Writing frame {i+1:3d}/{frames}") + ss = pl.screenshot(transparent_background=True, return_img=True) + images.append(ss) + + pl.close() + return images + + +def main(): + frames = 100 + frame_time = 40 + output_file = "my.gif" + + images = create_frames(frames) + create_gif(images, frame_time, output_file) + + +if __name__ == "__main__": + main() +``` + + + +Notice that when providing a canvas, no update to its layout is performed by Magpylib, unless explicitly specified by setting `canvas_update=True` in `show()`. By default `canvas_update="auto"` only updates the canvas if is not provided by the user. Details can be found in the [graphics documentation](guide-graphics-canvas). + +### Custom export Plotly + +The following examples shows how to work in the Plotly backend. + +```python +import magpylib as magpy +from PIL import Image +import io + + +def create_gif(images, frame_time, output_file): + """Create GIF from frames in the temporary directory.""" + frames = [Image.open(io.BytesIO(data)) for data in images] + if frames: + frames[0].save( + output_file, + format="GIF", + append_images=frames[1:], + save_all=True, + duration=frame_time, + loop=0, # Infinite loop + ) + + +def create_frames(frames): + """Create frames with Pyvista.""" + + # Create Magpylib objects + mag1 = magpy.magnet.CylinderSegment(dimension=(3, 4, 1, 0, 45), polarization=(0, 0, 1)) + mag2 = magpy.magnet.CylinderSegment(dimension=(2, 3, 1, 0, 45), polarization=(0, 0, -1)) + + images = [] + for i in range(frames): + # Set object position + mag1.rotate_from_angax(360 / frames, axis="z") + mag2.rotate_from_angax(-360 / frames, axis="z") + + fig = magpy.show( + mag1, mag2, return_fig=True, backend="plotly", style_legend_show=False + ) + + # Edit figure in Plotly + fig.add_scatter3d( + x=(0, 0, 4, 4, 0), + y=(0, 0, 0, 0, 0), + z=(-2, 2, 2, -2, -2), + mode="lines", + line_color="black", + ) + + # Customize layout + fig.update_layout( + scene=dict( + camera_eye={"x": 1.5, "y": 1.5, "z": 1.5}, + camera_up={"x": 0, "y": 0, "z": 1}, + xaxis_range=(-5, 5), + yaxis_range=(-5, 5), + zaxis_range=(-5, 5), + ), + showlegend=False, + margin=dict(l=0, r=0, t=0, b=0), + ) + + # Screenshot (requires kaleido package) + print(f"Writing frame {i+1:3d}/{frames}") + img = fig.to_image(format="png", width=500, height=500) + images.append(img) + return images + + +def main(): + frames = 50 + frame_time = 50 + output_file = "my.gif" + + images = create_frames(frames) + create_gif(images, frame_time, output_file) + + +if __name__ == "__main__": + main() +``` + + diff --git a/docs/_pages/user_guide/examples/examples_vis_magnet_colors.md b/docs/_pages/user_guide/examples/examples_vis_magnet_colors.md new file mode 100644 index 000000000..bf0218a58 --- /dev/null +++ b/docs/_pages/user_guide/examples/examples_vis_magnet_colors.md @@ -0,0 +1,71 @@ +--- +orphan: true +jupytext: + text_representation: + extension: .md + format_name: myst + format_version: 0.13 + jupytext_version: 1.14.5 +kernelspec: + display_name: Python 3 + language: python + name: python3 +--- + +(examples-vis-magnet-colors)= +# Magnet colors + +The polarization direction of a permanent magnet is often graphically displayed with the help of colors. However, there is no unified color scheme that everyone agrees on. The following image shows some color-examples from the web. + +![](../../../_static/images/examples_vis_magnet_colors.png) + +Magpylib uses the DIN Specification 91411 (soon 91479) standard as default setting. The tri-color scheme has the advantage that for multi-pole elements it becomes clear which north is "connected" to which south. + +```{hint} +The color schemes often seem to represent homogeneous polarizations, referred to as "ideal typical" magnets in DIN Specification 91479. However, they often just represent general "pole patterns", i.e. rough sketches where the field goes in and where it comes out, that are not the result of homogeneous polarizations. On this topic review also the examples example {ref}`examples-misc-inhom`, and the tutorial {ref}`examples-tutorial-modeling-magnets`. +``` + +With Magpylib users can easily tune the magnet color schemes. The `style` options are `tricolor` with north, middle and south colors, and `bicolor` with north and south colors. + +```{code-cell} ipython +import magpylib as magpy + +# Create a magnetization style dictionary +mstyle = dict( + mode="color+arrow", + color=dict(north="magenta", middle="white", south="turquoise"), + arrow=dict(width=2, color="k") +) + +# Create magnet and apply style +sphere = magpy.magnet.Sphere( + polarization=(1, 1, 1), + diameter=1, + position=(-1, 1, 0), + style_magnetization=mstyle, +) + +# Create a second magnet with different style +cube = magpy.magnet.Cuboid( + polarization=(1, 0, 0), + dimension=(1, .2, .2), + position=(1, 1, 0), + style_magnetization_color_mode="bicolor", + style_magnetization_color_north="r", + style_magnetization_color_south="g", + style_magnetization_color_transition=0, +) + +# Create a third magnet with different style +cyl = magpy.magnet.CylinderSegment( + polarization=(1, 0, 0), + dimension=(1.7, 2, .3, -145, -35), +) +cyl.style.magnetization.color.north = "cornflowerblue" +cyl.style.magnetization.color.south = "orange" + +# Show all three +magpy.show(sphere, cube, cyl, backend='plotly', style_legend_show=False) +``` + +More information about styles and how to apply them is given in the user-guide [style section](guide-graphic-styles). diff --git a/docs/_pages/user_guide/examples/examples_vis_mpl_streamplot.md b/docs/_pages/user_guide/examples/examples_vis_mpl_streamplot.md new file mode 100644 index 000000000..223a214a6 --- /dev/null +++ b/docs/_pages/user_guide/examples/examples_vis_mpl_streamplot.md @@ -0,0 +1,131 @@ +--- +jupytext: + text_representation: + extension: .md + format_name: myst + format_version: 0.13 + jupytext_version: 1.16.0 +kernelspec: + display_name: Python 3 + language: python + name: python3 +orphan: true +--- + +(examples-vis-mpl-streamplot)= + +# Matplotlib Streamplot + +## Example 1: Cuboid Magnet + +In this example we show the B-field of a cuboid magnet using Matplotlib streamlines. Streamlines are not magnetic field lines in the sense that the field amplitude cannot be derived from their density. However, Matplotlib streamlines can show the field amplitude via color and line thickness. One must be careful that streamlines can only display two components of the field. In the following example the third field component is always zero - but this is generally not the case. + +In the example we make use of the [scaling property](guide-docs-io-scale-invariance). We assume that all length inputs are in units of mm, and that the polarization input is in units of millitesla. The resulting `getB` output will also be in millitesla. One must be careful with scaling - the conversion to H would ofc give units of mA/m. + +```{code-cell} ipython3 +import matplotlib.pyplot as plt +import numpy as np + +import magpylib as magpy + +# Create a Matplotlib figure +fig, ax = plt.subplots() + +# Create an observer grid in the xz-symmetry plane +ts = np.linspace(-5, 5, 40) +grid = np.array([[(x, 0, z) for x in ts] for z in ts]) +X, _, Z = np.moveaxis(grid, 2, 0) + +# Compute the B-field of a cube magnet on the grid +cube = magpy.magnet.Cuboid(polarization=(500,0,500), dimension=(2,2,2)) +B = cube.getB(grid) +Bx, _, Bz = np.moveaxis(B, 2, 0) +log10_norm_B = np.log10(np.linalg.norm(B, axis=2)) + +# Display the B-field with streamplot using log10-scaled +# color function and linewidth +splt = ax.streamplot(X, Z, Bx, Bz, + density=1.5, + color=log10_norm_B, + linewidth=log10_norm_B, + cmap="autumn", +) + +# Add colorbar with logarithmic labels +cb = fig.colorbar(splt.lines, ax=ax, label="|B| (mT)") +ticks = np.array([3, 10, 30, 100, 300]) +cb.set_ticks(np.log10(ticks)) +cb.set_ticklabels(ticks) + +# Outline magnet boundary +ax.plot( + [1, 1, -1, -1, 1], + [1, -1, -1, 1, 1], + "k--", + lw=2, +) + +# Figure styling +ax.set( + xlabel="x-position (mm)", + ylabel="z-position (mm)", +) + +plt.tight_layout() +plt.show() +``` + +```{note} +Be aware that the above code is not very performant, but quite readable. The following example creates the grid with NumPy commands only instead of Python loops and uses the {ref}`examples-tutorial-field-computation-functional-interface` for field computation. +``` + +## Example 2 - Hollow Cylinder Magnet + +A nice visualization is achieved by combining `streamplot` with `contourf`. In this example we show the B-field of a hollow Cylinder magnet with diametral polarization in the xy-symmetry plane. + +```{code-cell} ipython3 +import matplotlib.pyplot as plt +import numpy as np + +import magpylib as magpy + +# Create a Matplotlib figure +fig, ax = plt.subplots() + +# Create an observer grid in the xy-symmetry plane - using pure numpy +grid = np.mgrid[-.05:.05:100j, -.05:.05:100j, 0:0:1j].T[0] +X, Y, _ = np.moveaxis(grid, 2, 0) + +# Compute magnetic field on grid - using the functional interface +B = magpy.getB( + "CylinderSegment", + observers=grid.reshape(-1, 3), + dimension=(0.02, 0.03, 0.05, 0, 360), + polarization=(0.1, 0, 0), +) +B = B.reshape(grid.shape) +Bx, By, _ = np.moveaxis(B, 2, 0) +normB = np.linalg.norm(B, axis=2) + +# Combine streamplot with contourf +cp = ax.contourf(X, Y, normB, cmap="rainbow", levels=100) +splt = ax.streamplot(X, Y, Bx, By, color="k", density=1.5, linewidth=1) + +# Add colorbar +fig.colorbar(cp, ax=ax, label="|B| (T)") + +# Outline magnet boundary +ts = np.linspace(0, 2 * np.pi, 50) +ax.plot(.03*np.cos(ts), .03*np.sin(ts), "w-", lw=2, zorder=2) +ax.plot(.02*np.cos(ts), .02*np.sin(ts), "w-", lw=2, zorder=2) + +# Figure styling +ax.set( + xlabel="x-position (m)", + ylabel="z-position (m)", + aspect=1, +) + +plt.tight_layout() +plt.show() +``` diff --git a/docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md b/docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md new file mode 100644 index 000000000..8fc2fd30a --- /dev/null +++ b/docs/_pages/user_guide/examples/examples_vis_pv_streamlines.md @@ -0,0 +1,73 @@ +--- +jupytext: + text_representation: + extension: .md + format_name: myst + format_version: 0.13 + jupytext_version: 1.16.0 +kernelspec: + display_name: Python 3 + language: python + name: python3 +orphan: true +--- + +(examples-vis-pv-streamlines)= + +# Pyvista 3D field lines + +Pyvista offers field-line computation and visualization in 3D. In addition to the field computation, Magpylib offers magnet visualization that seamlessly integrates into a Pyvista plotting scene. + +```{code-cell} ipython3 +import magpylib as magpy +import pyvista as pv + +# Create a magnet with Magpylib +magnet = magpy.magnet.Cylinder(polarization=(0, 0, 1), dimension=(0.010, 0.004)) + +# Create a 3D grid with Pyvista +grid = pv.ImageData( + dimensions=(41, 41, 41), + spacing=(0.001, 0.001, 0.001), + origin=(-0.02, -0.02, -0.02), +) + +# Compute B-field and add as data to grid +grid["B"] = magnet.getB(grid.points) * 1000 # T -> mT + +# Compute the field lines +seed = pv.Disc(inner=0.001, outer=0.003, r_res=1, c_res=9) +strl = grid.streamlines_from_source( + seed, + vectors="B", + max_step_length=0.1, + max_time=.02, + integration_direction="both", +) + +# Create a Pyvista plotting scene +pl = pv.Plotter() + +# Add magnet to scene - streamlines units are assumed to be meters +magpy.show(magnet, canvas=pl, units_length="m", backend="pyvista") + +# Prepare legend parameters +legend_args = { + "title": "B (mT)", + "title_font_size": 20, + "color": "black", + "position_y": 0.25, + "vertical": True, +} + +# Add streamlines and legend to scene +pl.add_mesh( + strl.tube(radius=0.0002), + cmap="bwr", + scalar_bar_args=legend_args, +) + +# Prepare and show scene +pl.camera.position = (0.03, 0.03, 0.03) +pl.show() +``` \ No newline at end of file diff --git a/docs/_pages/user_guide/examples/examples_vis_subplots.md b/docs/_pages/user_guide/examples/examples_vis_subplots.md new file mode 100644 index 000000000..9f926ed03 --- /dev/null +++ b/docs/_pages/user_guide/examples/examples_vis_subplots.md @@ -0,0 +1,99 @@ +--- +orphan: true +jupytext: + text_representation: + extension: .md + format_name: myst + format_version: 0.13 + jupytext_version: 1.14.5 +kernelspec: + display_name: Python 3 + language: python + name: python3 +--- + +(examples-vis-subplots)= + +# Subplots + +It is very illustrative to combine 2D and 3D subplots when viewing the field along paths. Consider the following system of a sensor and a magnet, both endowed with paths. + +```{code-cell} ipython3 +import numpy as np +import magpylib as magpy + +# Define sensor with path +cyl = magpy.magnet.Cylinder( + polarization=(1, 0, 0), + dimension=(2, 1), + position=(4,0,0), +) +cyl.rotate_from_angax(angle=np.linspace(0, 300, 40), start=0, axis="z", anchor=0) + +# Define magnet with path +sens = magpy.Sensor( + pixel=[(-.2, 0, 0), (.2, 0, 0)], + position = np.linspace((0, 0, -3), (0, 0, 3), 40) +) +``` + +In the following, we demonstrate various ways how to generate 2D/3D subplot combinations for this system. + +# Plotting canvas with own figure + +Customization is best done by adding the [Magpylib 3D-model](guide-graphics-show) to your own figure using the `canvas` kwarg. + +```{code-cell} ipython3 +# Continuation from above - ensure previous code is executed + +import matplotlib.pyplot as plt +fig = plt.figure() +ax1 = fig.add_subplot(121) +ax2 = fig.add_subplot(122, projection='3d') + +# Show pixel1 field on ax1 +B = sens.getB(cyl) +ax1.plot(B[:,0]) + +# Place 3D plot on ax2 +magpy.show(sens, cyl, canvas=ax2) + +plt.show() +``` + +How to add and modify subplots in all three supported backends is demonstrated in the [canvas documentation](guide-graphics-canvas). It is also possible to customize the Magpylib 3D output by returning and editing the respective canvas using the `return_fig` kwarg, see [return figures](guide-graphics-return_fig). + + +# Built-in subplots + +For maximal efficiency, Magpylib offers auto-generated subplots of 3D models and the field along paths by providing the `show` function with proper input dictionaries. + +```{code-cell} ipython3 +# Continuation from above - ensure previous code is executed + +magpy.show( + {"objects": [cyl, sens], "output": "Bx", "col": 1}, + {"objects": [cyl, sens], "output": "model3d", "col": 2}, + backend='plotly', +) +``` + +Detailed information on built-in subplots is provided in the [user guide](guide-graphics-subplots). + +# show_context + +With a built-in context manager this functionality can be accessed with maximal ease + +```{code-cell} ipython3 +# Continuation from above - ensure previous code is executed + +with magpy.show_context([cyl, sens], backend='plotly') as sc: + sc.show(output="Bx", col=1, row=1) + sc.show(output="By", col=1, row=2) + sc.show(output="Bz", col=2, row=1) + sc.show(output="model3d", col=2, row=2) +``` + +```{hint} +A very powerful subplot-feature are the built-in [animated subplots](examples-vis-animated-subplots). +``` diff --git a/docs/_pages/user_guide/examples/logo.stl b/docs/_pages/user_guide/examples/logo.stl new file mode 100644 index 0000000000000000000000000000000000000000..a9905648c94bd9646fec833a4b49e18a4cd73c79 GIT binary patch literal 57384 zcmb__dAwiK)&41wYO024siu`9D3v!gL`q(A&pn3JtkjUA1ZkuwA%u|OOGHc&nkXUW z;YCwLBaM)I?lG&PQ9}(8W7Ry?5Z?5+pS|zC&$CYMx%a-G&+q$3?#e#vS!?ZiUOP$t z|Nc(tktA20dtCAHWj8fJ@|3slC|4hLe-8Qw2i#q5*z-@GW_arU-|L9OvagoD=Mlf# zeo8rX-W1P8I?Z=k<&1L7sL3uIh*h^fGJEf)$0~?4Cn8BsyXeev@Z7V!qimVGuo&&wj6=0qTdir^Q^rRXHNddK6k>o)#HpD$;l3eM(XlcK6Rt$$# ziXc~-lTH#MpyO|=j4k>eIIW@sCH$dsh5qMweHJn7%t_h$W5+FozGY8ND^I%!^)Ail zuX}#E>Ec@)t>O6JsasCWX07wlatNYP5~r05cAoFiw$^IxB%LH$AL~+AQ&efh{H+NS zvnRe-JOmbMx|2?l;jd3~8FOELbr!G@8Nrnx6tla74Bb{8- zV5W4EY;woMY}u4YeOmo&+SkfUjyb;>TE+q*_22_*rs-uM%;o1eV6 z1@tAyyw$qTtBacBs#F&_m}L(2$clH6|eQnHlDDf*D>e&{aO!OeK)T|^^xu# zB1tF-h&^`yq-n&`;a?pgq`QYeend$?eDwJ(O}qbYbOw6Z;M2>4 z7o6sGkWP|ydQ2|Y>2bOX$FB~dT%=K>c06uGamRPw@TL8ctDh}5+WdQ7*2||XE}#FR zSB35#BF!lYh%b8os`%%HuX!C)-hQR*vEN(GD7)05G~&^99klf^Nsb$HQt{NF$zBI* zYLeV~{NKx`PTtoK#$VUeKYkNV{>xfPa*~d84n_SC3FG($Mjn z-Xn_b&i&VN`JpLF1ky?o{F3IRlSI);^33(SXJ?Q7t}j>GI+IRwmJ;Yt1ix4=MJLH> zfB8lB)_FaB{TMUquJWqyUDk{|Z@KcJ^4Q+rbaaw19RK^qRfDtMyKd$YMaeB-X&eCqN`nv+hFA-!&L);{BO<5!1JF4D-sZ)`Zexb~Zy zdma3OntHSAYg?Nkm2~$IX--K%jQPogqW|q{c^#CMBx^r=bGdZl&0YuT?jewy(Lx{| z-(X^~c)+K=ucfRc=|A=N<>o8T^g2j)50U1S1jOR!CKi7mUwR#szuYxhSJ?bq&X!4p)ECAXUyATtF1H; z*F5m6V)eUU_9aodRvqwWdBBK2`Fy!WK1K_HSn`ii#efH%^g1ZZrTS-|loPTIy$;gdL!>z+0dfD)M;EIebf4EjSxIu? zyPua+-oDMZ$E3T5NOMX8;>5d7EEb(N-Rqz%j3$>l9h-X{q`QYmb4mhY>hq@*KiO)x zmc;#37HQWjz41kP*y>>(RF6B%9tp?}&n+hWx|UWfLtq|;pW)gzRPG<0;`pWD7YNwzp~SaIDg zD|@S$x9FojD{uMf%L|cf3`Y)Lckp)E_Lu(9BbZZZzG2U2%3*`IbciHjIQ|!Y4Uaf@ z!3C~WzN|#pLDQFZKto6Pb%scDN)ki{B;>ySw*_7YxR$58he&fu3W$c64;_zOy;c6k zmydfLq%o%6DnD-F*Y5#O`~?)bTpN?VRCI)HNBFdw_woJBBS+rvb&!TthqZ-EJeET! z7wM=WNkZyAJhopRb&yW;1v`IGqk~*YqFkhd4yF|lG0#b-IVDw7mt0ArT%;u)K2Kh~ z{`r=ugEU%(Z#Bp8hzXYQi{(LeyIYTlTtEj}tnzU|sg7SrhcXt?G0s5`xk6crTqucAl0{H^C`%E6^7em0gnF(B z#vE3~v?3j9ZPaH|mt3JWh+G;!i$Lv+I!K3F8_}I3A{WqsZYx*q^@FJx@*wC_x_b!C zn<|3o9`YmVKzNLwk4L*z9V0?LXFR$dU)iyi87(t+mxP_Sma29Q-}k z|DEcNc^|**c6e{9(3n9+YhhI#Lb*u8l85p&v*uBIdAaxg`^ECxw@j_jXjh_c z=%_;|7is7i`1EGkkI*ffI8vKD9l#YZ+ zhw$zpBA4p(Ix_r=A6tO16Bo-X!ec7|K3dgr39pv+Dk6@lfR6J)&>fF`s6EuEXcZ7@ z6)o!+5#qNT!p9y6wPbl(a7Im0D&y=5wkBUwcY!siD{b?oVN z^uq99mAA|z$Q5c)*JB@*1v-vPNVnxjd+K(K2z5SM8|?}ythuIjf^_7MDcmt4l=fJ9 zh(T%OI+deid>4Y`v$}`GF`jZHFn*{BR^u!od&z|Uysl)nrkY_ z>d>`NMXQAtq4}(GRi8z0Ro1Sz*6ZL}v0VkW`v%m~$hiJ#*QUFNP%gV~pgMH5U&kf& z2(J9=$fCM$pgMHrS9Pc)@`w7tnTaA)l0{$zB9>jOImEse;gPlo9m#->Txj_sZ4q24 z3Uk0PF3}aQYRjMq%zhQou@1}!;}_5ofth}!tyPLpF3?euMQ}|9@!-l0!ebw75#Wkn zluOYT!G2KJWR@Q@L{uZ|c-3I}*>=YW&h7(3XWK*|P2v~Ou_xm!yqbfGP%h9>Qk0Ls zjZAlPwdK?n)gtgE=9F@wJ&xfPpQ6oogtKqbI#5X%EcLEX9(rue6TZwa&dOo8A7?VeYE+Z{fD;a^$2bI zK*ttG+e)hgB_p;BD3wao5PyknDlK z_V*+GQ5W9rRywZrI!I&e8+Aip9YVQCLkHvo1)6ek9_kPIDl6RX^^t~-t`TWYNkAZ- z5PRsLtR(sT=d<%Y4r}o`NOuo`vr*APAWk@H#q4Ld9q4sX7UFb{i^s!W2kGu1(wvfj zc=+k(npPftL|a->?z4{_n=gBEk=H@GdkCael;jcRoTfj16;6Lr7EX)o?P4GG>D@h*Q z_5J2?Z@%PpknSEL%_#|p=D+PcwzU+07?j9n|DG7)fmpy;? z@&5`sC=2%(4r+ep+Mt7U_Yi4LNkB|q{))cyH+ zI4O_Tpbnv2q@m-|KTj+Uy6><4RET~dog^5ShOrNH)FG6MG<3M0rog}W;Y%2KDIIn# zsiTUBBQMIeXm`@dm0Ofw=;%N73s-2duZkyujAI^-*Tm{$?G7EGs00fbkre~i!^ln{)8j4P40cp>u9<1Wp_sDaIb?j zPG&~k&{2m_F4E9}{t5jQXv)R^*y}SKIut=J^!m|4a1rg!+|7D)$lG%#`tplbX4v4- zjw8))xNMc?DQ_QDp`p8LL}*ciq&CFDsN=$SKWLY$`bc*VfgUbO0s`#_S_jY@ZH~J) z;id(-(Bu5y5Go0B-EEGRc$;JK20OTV9&U`NKGNMoxYNz;l7MixQi^yh<*AbocXtcI z%@=Z|IqB{pl7y0gfPCly%`a(A+MRUWb3z_&_H>3&F48DtNGGHh(E5dRl4v_$k5Des z(BbmDDdsuv#H6mj;Qbga#}>gauD6rYuIMDW?~apPe|MU%=ePWHVe7mxJ+?!f-uUv- z*1Jzwr9#81t`TWYNkFWA%Td`&|9a5t_;lmfT0i;U-d-;0)SdN<`Z_}>7irkrddU9S zpu>9kwq)&Rm$mlU^t)aM=`>e;^$6u64IMK#8Jzv*fz2v9a9V)+rd_;h`N2lt_qr`Y zzmQfmVm`WO@9fGQ_VzlauGP2fyHZ~#E6o+ba9E`Xa=CV_9i1c$hmH?kdZcNMCy%V? zz+HgN+^wC|+fKTBh%~1@Ao{#KqUnn%aa`%mfY*(K9&U!vh3ZZoda0M+fF*oH`;te`S@oj3(x^> zhw`JP3E5ud4Sl}jzl^$YuX5x+1I=)x?rCm(wc%g?>c=Je1&Aeke%tF~ICMDfg+KvK zOWe)SXMWjk3B!RH@#tAC``k9x$GrFC9VLq-La69q_h!qDsz3}==CVIp+ zOAd7L=;tlbv|>0AM=c(-@ZchhspozC^K!rzKwyP7(n(?wfBW*2miPWL+{YsuG_2fi zcu2*aUOu2aZegGqj@b5|)~^_Hf4FhD&60h~;jgdltsUGNW`ON9bnMh;$86aF>-*HzFQk*?(~XaA zD+@qeyVd&H1zYdv%Wkh{eqHu@W({9T!1c~v=ov8Uj^RMKyl8TH;t_BD@QCvHaREU( z)bo>?5DtWkLlfeHlvXa%sE?`xCEb;H-$x;DkNxeMUKZ(4N`CW3u+UnCRwimEt-4`} zTBX`MwhD;0vg_l4G8(jpavajC1FKqMTA`+fv_gvhvdzNK5=Cp<+pD(xh+Gzd_Ufx2 z#nf$lKB>6z>682&tU2F5y?pQyj2Up#H_{kco?gEB!xh@{qwC(l_6+VG{(7elnR`aH zy$Z37Z5R6zq?IE0CCy1&v~5M%a;CYqgA9ib?W45TlEywx?7M)_c9(K(TdQrb^J~yy zyX$J2w7aCCL;EQ9OKHwF5vywKui9HUU)uS_aV}TGmYN7{sl}=m(9j-xmX2F$aA`}eZLOk71EDRow#bTRI1otL zn1g7eLa&dy9miCmg^Qzs_O{*UxynLo7sd}Yy@5xN3uATm84QP2ZLR2X2<4)+(i?aL zzgXK9ZAX?GTaMc_6`sm9+CS z^u5XDyfHo75O@AyX3HbrI?>0x&!*>;TYaOK|3VsPG^UmPry?Bjc<`0p#rrph6Q(1! znOZ)w-Z%W0SFb;-y#FfDZoJwaj{ohyS^whR{hPcFeo1rENpkPMr<4axU)iHwJnq}O zsr8IgJYq<%OUrS;4%)Lpv)$M?Sjceb7}ngk>55mviQflzz1Ue&<--0)lmx{6{olUp zXUise9Unb$K{=raI#%dE)7_#BXodqZa^)T^AH6WaBQ#COrD;_~kPEjOV~RRo6rwvx zdW_kp*y*WNy$U(lgx!gRAcu@Qm4jRJeWalM^q8}wW+ z_)gyR@}>dTj`8K{k*nvHvv&wB!*;{(C|}($&Vbx=MoKPI`S-4^S$^X9A`sv0``7|HW>;2Y6{T_96nlqgF5%h5Xth%G9E2-Wn z|4*aP^-o=I0?)&iD?v&8~0CDuIeLyD8Jl;;NFC; z6e~XvT=}(JidIac&@Z~LqLM5^xpcRu9-+I4%B5(lL%-;*l}fS*<frve-P`7Bz4D`!Xc^TSthGxqjY9V$luPTTMc6Ma$12Gp`cApHwg1$=`gR0CsGZA8XN8kPR>wiphq)8j!QZ2DDcX6{ykbJO?(lE=`QSm*=e1t5 z<1(M_q_M&_zjfT3iSLOlf?q6`qODcj=WsqpX1vt;ql5nAV{Z2*h-nn>?DbAN*P?!F zIxkSL(C)V+$+Itv&wl?zUmp*(YI5s>);@m>t11ky_G-Ex!8HKg1)xQs8ijIU79ZBa zJ40}_-*PEhwKNLdOVO1AwbmkZT|`%L?5Y7VjY8#Woa%LO)mc|5bTx|dK{X1sggY3z zwp>MMnqa*o%o!vVRGy^9V=NuXQi>fTr@TFJRf9UFvt}Trjb%9&=?c?>? zn5*{r>&`5fE(<$mcKwQ&Mxm=iOZJ>x_MVLWNL|GtH>gIT>8|;qB}OrgLceGkKC{-d1O+y z_vj7$9^|HrZ*3hp@*Ur+k;aYXpyxx7n zpIR4h@R{dgc(v?uz15aoEz^tz@4}`8+=!ysOBkWC75nS=Gt6cR6 ztrJ?pwdAXoMxk69TN{s||D0ItecQt2Mtuu*exY^fynp+Y))Ao9fmSB&<8bx7IszcZ z_MAGhP&E0Gy81=?MD2s!xr~03ii?l9(Z_?fW5t88X|ywC&69K_!Wf zYOGaiyK-rYxY^IYCuMuAc!A$t(h^P@r?+lxoqo^1d`epczgR9sTdTCZa>c8&va9t2 zH8rM!)&h5$>g-9`=cC3}>L6CqSW{UC)h6VimTI)3VfPI!5!V0}gHl3E(Bi~>RcjS7 zjY9Y9RIchHKdeF@9_6-N`D5qX5c8Taa*DgM7NPr&bH2Zm>pwp62&-f1PD5I*_}!^~ zRZV9_Em!_`u|j{Gz{Wklcrq6y@xC9AX-WSO&TK2!s0&wW?LGN9uY+{8>}m_3y`{Do zHXh2wHT~*74l#{FcVD!pRy6sMy81=;3RIFsXz#3Cina*-a?OrsmOY+c*Z1ct$s)9m zQZ7YXg!Y`;_h}Dj5z3`~pGExP%o!~gZg8S6C7fqs*D~gLnll_46hSWZYMiAqyjn_h z&qG^@`WmIX3%XCSVCO5`xh0%0vcE=gQp>gFso%y~1FW83RSy4EI8$VIGl*&w+)+pp z)o1sL6rrt}qHV9H2(?6Q*Eo?MWf$X}*aB$VRi9Sc>noR{ljQlY#udM~@*qDG<~nYY zkWTYczx|>+Q}}{!C9G9b*P2`Q+CQ#G&n+jnhCL763$X~@8Bs2->4SgzBjdBLrmW}Z z2G2hBr`Fg17H)}<#wpf$ZZ#S$QMFvDEX{w_ZLQLsG38RUyNR^(#O(Cr-tql8ErHMW z+gl$Vi@O=P`4X+ITBUibrBBO(wMx0vLTeQSE@&iVf9KIRNp4bY+WTuY+vU@8W4PWG=_@)d0nx&x|Qy7O0$P)ihT z5h_c$w5BD=wy&L>t#Zw=zU=O|>Yc8)eA=Z?l8{dG6KCAry8iP|bWnD2$F=v0tNHdy z>&N8QTgo}Jztuqtr#oYcP)Rl(T0az_lHB>-RZh*akvsW#XkF8IkcNh0*_@Wv55rwD z?E$!csr^T_evBM>n|l`^oQPJd+>TUxyJF*^X`%>~6cJ&6kn0S(o|xvkYG@JsV!0>@ z@wnrFJBFOMESyOt!g=OzUyV$29g#;J_}eHhoi*R(dDy*QWrg|W$dQ4zyM4qo3f&)6 zE=7|cI`qrANB`OF2?iZ1$s#)5sl-bgL|cS@nez6$a?~2(JcCNI2<<)pHBFN6XvGssUE%7v7_;-h(6x{YSiQz5M-i-ke$vvqOb z&f%2^>Oc#}F)nFX)ipw`0^-y`n-yox9qi+w^Ccbok_JLgo-wxWOkw-UGu)7lC(?l6 z4<`rWY*a`3&W`rEGr2)E3eK=CmmO0Rg_6kG1ZNOBS0{JSp;q}{pI z_IU~NToL?YxfE@!;;A{CYnnF}q4OxNr0I=QVYOVFQpe>PNu&W=}_i#@G+2C2(cc^zfiktH$MX^1y< zAeT3Ix~D_Au&*B10I31-&@YP6-2sdEbmOmDFMRht-x_GHX>K~-2|Xq^EgN@I0W9ZE zxPuckCp6sJM$l2AXP3!Tf{D_{J5Nb-<94fMb{(ri=HV{Nmj>(J+~=meD_kXL%9@f z5qjE8(e((esak`-y6LQP(81y4h`Uks?p{UnWW3vimu=$;3trWYH1<;C%)6TBOZL2` zJoo4~eLNQIe3si${!3eK-dGMCh_zn(YZR9pbD3LJ!3hDBtJBJsE5j*0m82N7yEEOZ z(_z0(5h}?dKHd0yw-y%8Kq^8dS%jvQZHekyI8D)k1IM_Rzboy~5oCm1GghHT@peR4qLgpx%KR-*l+f2ex-;x==R&%*B0T&t8UFw--qW*^ZG_^)hgvu3$0Z|q3rVAd8;qJg-vcy zjY4Jd#cb!R<-@7&w%d6f)N_3wUiB&3j(v2zLt4i~Rjai1(RahOjZsXauw44myuRa3 zOrubHRj$4p?{+O^e8s%QegykIhC{xNmN-JvaWp(=bL2#ukRS95j=Q$;opSr4t3~L& zE70*S0Pbc*+9LD|y^33XNwP-2p~aFu{rm_(_a;bJOXKl5UM8_pM z{veHXy=8Z+rpT2!1 zy&ge7{YgR({MJHyJ5&2`?w{gDcI?|xKk7zH%r)nwM)uomJm>@4-bJNfZ{WUt(3VpXD#;?WbyiChZ4sL8+8gkN3gt&U_!0%~KJt}xMJvW4luLUeix@VT zB~e=gt^XFGay3pCp*M0_@AO8l&JCbJ$B9~gSW~rJsZB^Lz6F7`KE7Yf7Z|Dt{lXU` z@R|!>CRR+N;L9hLOVJjgU-(XkdryAUUGB~M%bJxNbfZu%t%LOlt>>B_idH>XxqHan z2K#0+LN!imZ9PJ{>aEf|pbvEWhPc&1@936G(H5a!=uh3gA#M?TX~S|U+9LQqhJ81@ z9>Mo9Fbd-<;1+TJpam_foqUWRm+xWgN7c38CYUo!v6mX%%@ z<#mt?Gi;v5Wq5TYgZrn^AAsIbwf9n)TG+db?^pz%yTK2AxXBu6@}soVd;Ie6FvoYE zECPNFqE+x~pmgw*ul&#f&kgYl=!k%)he#{NB9sesl$0bt-e7~`#W6eh)YVhodUlX> zHFe<~BFX|CErD-{NL#BEp4Sm&$o+*e5X%)X9 zbt3|46>0Lv{D=tU0v*HMKHx>)EnYo8c&^ve>Uuh!bVsQhWg*?7B}l7CTdTko5y}NR zh9}97F6&#&+Gr=A=hW`r43ryg42M;}+^~Of^`T83!856NbCCXa7!I3e{(L~O^jF(f z5cbSA5zukZ=t)KYeW&`>D4rZhbJBR3G@hBLrWIe;aQ-^w9ZkN7p(%wNR4%^%0pB}( zCsHwug70yl6^$=bc81{V8kS4-SsnU?@0h@|QGDG|`4JCok(Eo)im?dgs=k*RQ5KzQHb5%Q_X9Vo;_Es#|1CoEmfk_CZ}1S)$mm1H`s`P9-K}^n zuS!>APLDA56$I7oM&b8P%x10e@DNzXGn;sufj6WX4lYHIOVOAi5e-cIH8Og+K`D%H zepKI^i2TTNdeX57l|+6Z=-)@*7_q5f5%eKs5h}?d__{)xYp$szi_qB8-%e*S*S40P zd-RQwYMv`Xb#R6Rgr29?yw%gV46o|Y_Cs3lcJw5mhL)H*^UZO7Nv zDyE`+Z-8gSt5)&8e46u4y+tQU$747hw3XQ{9)`9{Wsee zBk1L*nz~wEwH&LYx_k8Sb>GpM%c>6KdGwo4zd^|VeZ}MZlkj%B+*!t++!TM}caqBH-cz+peGf=MBe(>Zn(n=BhqNm_3+FC{5 zO}3_L4YmmVLN8G2nZ25W%B5vVbz2>pAIha@i_o&GIjEBC{c}A@t|!zPj(Dg?QkGHd z6|uA{+FC^q6lu=&EA=oA9nbWgSZsUZXMXg`987c4_RM}gg0?FHI`ob^PulCfc6*1y z#)IA{(wr-WAs(^!u?YH>P*2&xmwU&xmR>b5#*IF&u$#r#G3>2)JKmN1Zljd5by0*ty1mUlc}}#rZ;a|=MuSn&F_rrppvTFU{jU$UtNvfrh z@fMX$D@{X-;4LbvgFe=(R%wZ&x0dRwR@BnS(BH+JqIa0^Zc2Pb%liG$RHQ!u8z*W& z{Xkz7--%M&c|Wci5Bi`>b9%f9LqOW5i|q7hA8?D?=LS z7t-#nEV=(xk5Des(6QSJdlkQUVok3@zmSHHPTv2jM<^HRYJSjbogL}v2+-!a&N*~0 zqLM5^XAnBGP)Qb{^D~`us3eQflPB6Et0aq{_bt4{9$&t}>R0qAS4}IPVMud&$--Ol z(HAQa+phKB#V(I+>T^)joiuK9@IGEWLb*so$JP@!F7CLi+3V0Rr13%~@8i`Yl#4WU z+%URNvFWH?y$=0C8t3}dt9%_oxky)2S8v$U6I+_|4u2J)U+6InD=g95UlpNwOV4O} zI;D!B2Qxd~(Q#0coc+KW#YdyV+p-!%(l`}HKl}9v`~1)^q~R%@ z_X6q>%0;>wbFD>M!nNcl$y#goEdJR00B@DbB3(UoUx(1sxTIlKam|XwzzYuaI`sT5 z=`<$-wOkSWV!0G;TLyYiw&MgHKe$)fXKqsL^=dfj#Cb-N=sif%h)355?A^t?=+*qt zURcKuYHgCNcgHHldoS$k(@M3I##%3LZPp`{i*(g0tp_?!(9)A6zI>)@9p(L1%IyNAH+K3Y|cxsDBW%&09!lDu%#fa0n> z!|66^$0=6cGA0cjT_f;LdAxB9#9JrsTpakx4}8oi3u6@CgCyNO1Xhirh1Hnr_*2KF znj*GF(SM>Hv8p7C(7L8$c$MVNG%p)o^c)i2mSqgxxkb4%N*eL#8jK+?vkr zCuYrKe(Tqkcw08jd0Q5vCEk!vl4IT)k!`r;>lK8(6;A}LQiQINC>O)Ej9?z6eUXmN zv~O2TBhxQB8qgGRHEP1d?1?WH`&|Iu&P;Q?+ex~by7X*>vj)+#5mrC=W}vl7x#;nv zGlcpkQhoJ0RId6+v4}gbpOiiL)_y+bymPKGR~oVC8qvwkd$$GvvhjZ= zWn1ri!(GtFTk6;`i8uO{23OYzl?23AeaB~OUa+|@yDZ_jeHL%8r@7u^Q&w!I)#7IjubHqCYtftY4mAZo2puPrJP)=i6}BI^pFL zTBUvl(p=GQK6&nO#mAT3_8e0VoH>~kxP zn7em)i}+%??jm-)y9gbMAXj)vIlc_UaOh}zd)eo?>L9Ie(?f@QuXrI|g$Av=$UF_9 z;ox#<)&5$uB1qf!k=(x8N7u9*e(UkRKj$t9R_o$j8Qn314n^o53u%kCZ!ha=Hfh&J znBBe+kDk@C&uwG9Rg|l{GPwT}_witrzWk1K536b+pW_M}QaY@v1JU+Ex7VTThPqP7 z@G62__T2=ABhPnu;?W^^M;d4yN9&3g!@;Epaw!_K?f8-ebm)8AIyNMYv^rK|e(hH4 zXBTX}qqj=OR9s09F9XFFFmw4IN!0!WkB>q_(vT6&-fPTy-bOXPeAwaW&T?SQ^rtbf|-T?WV2PdIZ-$HP@6z zJU;)?xZ=3gj`A&ou4d{ijNvFHiXfNu{KatSXna1Yxbf+e{P_~Dq@rBKJuh8Jg$}*p z#uYlf;bwPx-N5fEM9sIuoL>TWw(tL%EB-gcsP^ygedWH_wq__mX-S?SFu zAWj=UpxC83%pf_sw_F^uyvpx(vqdJ?QB{wJ~5B;L^Wriaj!DEPC0rGfVZ$NiOf1yWM9$!;x0} zH8Pfx>g<>L$d5Gu_1>uHdL7#KF%_!%sKx3~??6_cBIqkh%dYwps>YnYchp0V`hch+ z=obfj&C$P$Mbjpvm2#=i33}40>QJlH<4LWbqKsZntoIA`Wn-<p4{^G3;%|T5cm1GebL(NUie~Zvt8+ukv z&o)?u-tFO?pH5!r&Ukau-hEX`RtIkh*tZ#Y@3LBU`C5UsL@l&BH0Fw~N9Y&6Lx2-> z@y+V0Rm!C|k?Il3r8jNr5qfKfH(&I2Zq+LKv`6alB~+euuOjpdPe<$9kX3}9z*T*U zw)vrXtGA`KELeozMdlq7-0Z0F2axfGi{(KDzA`f{bGWA%h7cgCwR*S&bZv!2P#tp5UuFNI#HiPOsv)(-O}uRS`T*gLTSyng(7y?`<9adhZTm zu3UQ7q#i-faaOLPZR)D+ng^QF7NN5Aq>Jjd2$jV%UN+qxx!=)+#+sp%$t>i_lXcimpfSq>DXMQjgFt+IFcV zYn8T9%B5(F(3VVFA8nN^LU&ws-;w)+)f`kV-FK`%Mapp;jqc^;xUbc171C=vy20?lI>F^hn=E(MN05Dy_Bjzlu{G z(aUNTK~LH6ml3^jr#by>R}u7wYY{4`8gpt_+ci!WK@YlChw8Qnm8I!MU**+!&||OF zp}MUOO&`@)pH_N~L~ECpF{`8F6De5tiT=Vni-)2+Lr|8+NmImHML(%H#rS*oqRz}_ z^ak)v6?}PDtk(R0wFcMswOWg`ZmT3~6+NB8ThIHhEjhgzIY [0. 0. 0.] -print(cube.orientation.as_rotvec()) # -> [0. 0. 0.] +print(cube.position) # -> [0. 0. 0.] +print(cube.orientation.as_rotvec()) # -> [0. 0. 0.] # Manipulate object position and orientation through # the respective attributes (move 10 mm and rotate 45 deg): from scipy.spatial.transform import Rotation as R +cube.position = (0.01,0,0) +cube.orientation = R.from_rotvec((0,0,45), degrees=True) -cube.position = (0.01, 0, 0) -cube.orientation = R.from_rotvec((0, 0, 45), degrees=True) - -print(cube.position) # -> [0.01 0. 0. ] -print(cube.orientation.as_rotvec(degrees=True)) # -> [0. 0. 45.] +print(cube.position) # -> [0.01 0. 0. ] +print(cube.orientation.as_rotvec(degrees=True)) # -> [0. 0. 45.] # Apply relative motion with the powerful `move` # and `rotate` methods. -sensor.move((-0.01, 0, 0)) -sensor.rotate_from_angax(angle=-45, axis="z") +sensor.move((-0.01,0,0)) +sensor.rotate_from_angax(angle=-45, axis='z') -print(sensor.position) # -> [-0.01 0. 0. ] -print(sensor.orientation.as_rotvec(degrees=True)) # -> [ 0. 0. -45.] +print(sensor.position) # -> [-0.01 0. 0. ] +print(sensor.orientation.as_rotvec(degrees=True)) # -> [ 0. 0. -45.] ``` Find detailed information on position and orientation attributes and how to manipulate them [here](docs-position). @@ -73,7 +72,7 @@ In-built 3D graphic output helps to see if all Magpylib objects are positioned p # Use the `show` function to view your system # through Matplotlib, Plotly or Pyvista backends. -magpy.show(cube, sensor, backend="plotly") +magpy.show(cube, sensor, backend='plotly') ``` @@ -87,18 +86,18 @@ The field can be computed at sensor objects, or simply by specifying a position ```python # Compute the B-field for some positions. -points = [(0, 0, -0.01), (0, 0, 0), (0, 0, 0.01)] # in SI Units (m) +points = [(0,0,-.01), (0,0,0), (0,0,.01)] # in SI Units (m) B = magpy.getB(cube, points) -print(B.round(2)) # -> [[ 0.26 0.07 0.08] -# [ 0.28 0.05 0. ] -# [ 0.26 0.07 -0.08]] # in SI Units (T) +print(B.round(2)) # -> [[ 0.26 0.07 0.08] + # [ 0.28 0.05 0. ] + # [ 0.26 0.07 -0.08]] # in SI Units (T) # Compute the H-field at the sensor. H = magpy.getH(cube, sensor) -print(H.round()) # -> [51017. 24210. 0.] # in SI Units (A/m) +print(H.round()) # -> [51017. 24210. 0.] # in SI Units (A/m) ``` ```{hint} @@ -120,20 +119,23 @@ import numpy as np import magpylib as magpy # Create magnet -sphere = magpy.magnet.Sphere(diameter=0.01, polarization=(0, 0, 1)) +sphere = magpy.magnet.Sphere( + diameter=.01, + polarization=(0,0,1) +) # Assign a path -sphere.position = np.linspace((-0.02, 0, 0), (0.02, 0, 0), 7) +sphere.position = np.linspace((-.02,0,0), (.02,0,0), 7) # The field is automatically computed for every path position -B = sphere.getB((0, 0, 0.01)) +B = sphere.getB((0,0,.01)) print(B.round(3)) # ->[[ 0.004 0. -0.001] -# [ 0.013 0. 0.001] -# [ 0.033 0. 0.026] -# [ 0. 0. 0.083] -# [-0.033 0. 0.026] -# [-0.013 0. 0.001] -# [-0.004 0. -0.001]] + # [ 0.013 0. 0.001] + # [ 0.033 0. 0.026] + # [ 0. 0. 0.083] + # [-0.033 0. 0.026] + # [-0.013 0. 0.001] + # [-0.004 0. -0.001]] ``` More information on paths is provided [here](docs-position). @@ -146,16 +148,18 @@ import magpylib as magpy # Create objects obj1 = magpy.Sensor() -obj2 = magpy.magnet.Cuboid(polarization=(0, 0, 1), dimension=(0.01, 0.02, 0.03)) +obj2 = magpy.magnet.Cuboid( + polarization=(0,0,1), + dimension=(.01,.02,.03)) # Group objects coll = magpy.Collection(obj1, obj2) # Manipulate Collection -coll.move((0.001, 0.002, 0.003)) +coll.move((.001,.002,.003)) -print(obj1.position) # -> [0.001 0.002 0.003] -print(obj2.position) # -> [0.001 0.002 0.003] +print(obj1.position) # -> [0.001 0.002 0.003] +print(obj2.position) # -> [0.001 0.002 0.003] ``` Collections are dicussed in detail [here](guide-docs-classes-collections). @@ -169,14 +173,16 @@ import numpy as np import magpylib as magpy # Create a Pyramid magnet -points = np.array( - [ - (-1, -1, 0), - (-1, 1, 0), - (1, -1, 0), - (1, 1, 0), - (0, 0, 2), - ] +points = ( + np.array( + [ + (-1, -1, 0), + (-1, 1, 0), + (1, -1, 0), + (1, 1, 0), + (0, 0, 2), + ] + ) ) pyramid = magpy.magnet.TriangularMesh.from_ConvexHull( magnetization=(0, 0, 1e6), @@ -199,20 +205,20 @@ import magpylib as magpy # Create Cuboid magnet with custom style cube = magpy.magnet.Cuboid( - polarization=(0, 0, 1), - dimension=(0.01, 0.01, 0.01), - style_color="r", - style_magnetization_mode="arrow", + polarization=(0,0,1), + dimension=(.01,.01,.01), + style_color='r', + style_magnetization_mode='arrow' ) # Create Cylinder magnet with custom style cyl = magpy.magnet.Cylinder( - polarization=(0, 0, 1), - dimension=(0.01, 0.01), - position=(0.02, 0, 0), - style_magnetization_color_mode="bicolor", - style_magnetization_color_north="m", - style_magnetization_color_south="c", + polarization=(0,0,1), + dimension=(.01,.01), + position=(.02,0,0), + style_magnetization_color_mode='bicolor', + style_magnetization_color_north='m', + style_magnetization_color_south='c', ) magpy.show(cube, cyl) ``` @@ -230,10 +236,13 @@ import magpylib as magpy # Create magnet with path cube = magpy.magnet.Cuboid( - magnetization=(0, 0, 1), - dimension=(1, 1, 1), + magnetization=(0,0,1), + dimension=(1,1,1), +) +cube.rotate_from_angax( + angle=np.linspace(10,360,18), + axis='x' ) -cube.rotate_from_angax(angle=np.linspace(10, 360, 18), axis="x") # Generate an animation with `show` cube.show(animation=True, backend="plotly") @@ -257,8 +266,8 @@ B = magpy.getB( ) print(B.round(3)) # -> [[-0.043 0. 0.014] -# [ 0. 0. 0.135] -# [ 0.043 0. 0.014]] + # [ 0. 0. 0.135] + # [ 0.043 0. 0.014]] ``` Details on the functional interface are found [here](docs-field-functional). diff --git a/docs/_static/switcher.json b/docs/_static/switcher.json index d042c09c1..6fa25f9fd 100644 --- a/docs/_static/switcher.json +++ b/docs/_static/switcher.json @@ -21,4 +21,4 @@ "version": "2.3.0-beta", "url": "https://magpylib.readthedocs.io/en/2.3.0-beta/" } -] +] \ No newline at end of file diff --git a/docs/_static/webcode/summaryOpen.js b/docs/_static/webcode/summaryOpen.js index 1139cee9f..5fe9aa024 100644 --- a/docs/_static/webcode/summaryOpen.js +++ b/docs/_static/webcode/summaryOpen.js @@ -10,7 +10,7 @@ $(document).ready(function() { }, 500, 'swing', function() { window.location.hash = target; }); - + }); }); //https://stackoverflow.com/a/48258026/11028959 From baa2c24bc9a6405908319cc7f3bfc809161da47f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 26 Apr 2025 21:35:40 +0000 Subject: [PATCH 142/211] style: pre-commit fixes --- docs/README.md | 1 - docs/_pages/API_reference.md | 2 +- docs/_pages/changelog_.md | 2 +- docs/_pages/user_guide/docs/docs_classes.md | 38 ++++-- docs/_pages/user_guide/docs/docs_fieldcomp.md | 20 +-- .../user_guide/docs/docs_magpylib_force.md | 7 +- docs/_pages/user_guide/docs/docs_pos_ori.md | 21 ++-- docs/_pages/user_guide/docs/docs_styles.md | 2 +- .../user_guide/docs/docs_units_types.md | 2 +- .../user_guide/examples/examples_app_coils.md | 2 +- .../examples/examples_force_floating.md | 16 +-- .../examples/examples_force_force.md | 2 +- .../user_guide/examples/examples_index.md | 1 - .../examples/examples_shapes_superpos.md | 2 +- .../examples_tutorial_modeling_magnets.md | 2 +- .../examples/examples_vis_animations.md | 37 +++--- .../examples/examples_vis_pv_streamlines.md | 2 +- .../user_guide/guide_start_02_fundamentals.md | 117 ++++++++---------- docs/_static/switcher.json | 2 +- docs/_static/webcode/summaryOpen.js | 2 +- 20 files changed, 153 insertions(+), 127 deletions(-) diff --git a/docs/README.md b/docs/README.md index 0a0ba2474..bc95c1e35 100644 --- a/docs/README.md +++ b/docs/README.md @@ -7,4 +7,3 @@ The Documentation is built with [Sphinx](http://www.sphinx-doc.org/en/main/) and ### Handwritten documents Handwritten pages and guides are kept in the [_pages](./_pages) folder. They are all written in [Markdown](https://www.markdownguide.org/) using [myst-parser](https://github.com/executablebooks/MyST-Parser) as interface. Some documents like in the examples folder are dynamically computed with [myst-nb](https://github.com/executablebooks/myst-nb) as jupyter notebooks. With the help of the [jupytext](https://github.com/mwouts/jupytext) library ands its jupyterlab extension, examples can be written and executed within the jupyterlab ecosystem and saved as markdown file. It is recommended to use the [jupyterlab-myst](https://github.com/executablebooks/jupyterlab-myst) extension to be able to work with the full set of myst markdown flavor within jupyterlab. When editing the docs with vscode, use the [MyST-Markdown](https://marketplace.visualstudio.com/items?itemName=ExecutableBookProject.myst-highlight) extension to visualize the rendered document. - diff --git a/docs/_pages/API_reference.md b/docs/_pages/API_reference.md index 9c7ec255d..b44c5a2bc 100644 --- a/docs/_pages/API_reference.md +++ b/docs/_pages/API_reference.md @@ -7,4 +7,4 @@ The API reference includes all Magpylib docstrings. :maxdepth: 2 ../../_autogen/magpylib.rst -``` \ No newline at end of file +``` diff --git a/docs/_pages/changelog_.md b/docs/_pages/changelog_.md index 76a8f304f..33ac9e8e5 100644 --- a/docs/_pages/changelog_.md +++ b/docs/_pages/changelog_.md @@ -9,4 +9,4 @@ The changelog provides a compressed history of the Magpylib development since it :relative-docs: docs/ :relative-images: :start-line: 2 -``` \ No newline at end of file +``` diff --git a/docs/_pages/user_guide/docs/docs_classes.md b/docs/_pages/user_guide/docs/docs_classes.md index c7e8d00eb..4c3839971 100644 --- a/docs/_pages/user_guide/docs/docs_classes.md +++ b/docs/_pages/user_guide/docs/docs_classes.md @@ -64,7 +64,9 @@ All magnets are sources. They have the **polarizatio ### Cuboid ```python -magpylib.magnet.Cuboid(position, orientation, dimension, polarization, magnetization, style) +magpylib.magnet.Cuboid( + position, orientation, dimension, polarization, magnetization, style +) ``` ::::{grid} 2 @@ -81,7 +83,9 @@ magpylib.magnet.Cuboid(position, orientation, dimension, polarization, magnetiza ### Cylinder ```python -magpylib.magnet.Cylinder(position, orientation, dimension, polarization, magnetization, style) +magpylib.magnet.Cylinder( + position, orientation, dimension, polarization, magnetization, style +) ``` ::::{grid} 2 @@ -98,7 +102,9 @@ magpylib.magnet.Cylinder(position, orientation, dimension, polarization, magneti ### CylinderSegment ```python -magpylib.magnet.CylinderSegment(position, orientation, dimension, polarization, magnetization, style) +magpylib.magnet.CylinderSegment( + position, orientation, dimension, polarization, magnetization, style +) ``` ::::{grid} 2 @@ -119,7 +125,9 @@ magpylib.magnet.CylinderSegment(position, orientation, dimension, polarization, ### Sphere ```python -magpylib.magnet.Sphere(position, orientation, diameter, polarization, magnetization, style) +magpylib.magnet.Sphere( + position, orientation, diameter, polarization, magnetization, style +) ``` ::::{grid} 2 @@ -136,7 +144,9 @@ magpylib.magnet.Sphere(position, orientation, diameter, polarization, magnetizat ### Tetrahedron ```python -magpylib.magnet.Tetrahedron(position, orientation, vertices, polarization, magnetization, style) +magpylib.magnet.Tetrahedron( + position, orientation, vertices, polarization, magnetization, style +) ``` ::::{grid} 2 @@ -158,7 +168,19 @@ magpylib.magnet.Tetrahedron(position, orientation, vertices, polarization, magne ### TriangularMesh ```python -magpylib.magnet.TriangularMesh(position, orientation, vertices, faces, polarization, magnetization, check_open, check_disconnected, check_selfintersecting, reorient_faces, style) +magpylib.magnet.TriangularMesh( + position, + orientation, + vertices, + faces, + polarization, + magnetization, + check_open, + check_disconnected, + check_selfintersecting, + reorient_faces, + style, +) ``` ::::{grid} 2 @@ -278,7 +300,9 @@ magpylib.misc.Dipole(position, orientation, moment, style) ### Triangle ```python -magpylib.misc.Triangle(position, orientation, vertices, polarization, magnetization, style) +magpylib.misc.Triangle( + position, orientation, vertices, polarization, magnetization, style +) ``` ::::{grid} 2 diff --git a/docs/_pages/user_guide/docs/docs_fieldcomp.md b/docs/_pages/user_guide/docs/docs_fieldcomp.md index c1632f3cf..0169fd07c 100644 --- a/docs/_pages/user_guide/docs/docs_fieldcomp.md +++ b/docs/_pages/user_guide/docs/docs_fieldcomp.md @@ -22,7 +22,7 @@ that compute the respective fields B (B-field), H (H-field), J (polarization) or import magpylib as magpy # Define source and observer objects -loop = magpy.current.Circle(current=1, diameter=.001) +loop = magpy.current.Circle(current=1, diameter=0.001) sens = magpy.Sensor() # Compute field @@ -78,15 +78,16 @@ All "scalar" inputs of shape (x,) are automatically tiled up to shape (n,x) to c ```python import numpy as np import magpylib as magpy + # All inputs and outputs in SI units # Compute the cuboid field for 3 input instances -N = 3 # number of instances +N = 3 # number of instances B = magpy.getB( - sources='Cuboid', - observers=np.linspace((0,0,1), (0,0,3), N), - dimension=np.linspace((1,1,1), (3,3,3),3, N), - polarization=(0,0,1), + sources="Cuboid", + observers=np.linspace((0, 0, 1), (0, 0, 3), N), + dimension=np.linspace((1, 1, 1), (3, 3, 3), 3, N), + polarization=(0, 0, 1), ) # This example demonstrates the scale invariance @@ -153,12 +154,13 @@ All inputs must be NumPy ndarrays of shape (n,x). Details can be found in the re ```python import numpy as np import magpylib as magpy + # All inputs and outputs in SI units # Prepare input -z0 = np.array([1,1]) -r = np.array([1,1]) -z = np.array([2,2]) +z0 = np.array([1, 1]) +r = np.array([1, 1]) +z = np.array([2, 2]) # Compute field with core functions B = magpy.core.magnet_cylinder_axial_Bfield(z0=z0, r=r, z=z).T diff --git a/docs/_pages/user_guide/docs/docs_magpylib_force.md b/docs/_pages/user_guide/docs/docs_magpylib_force.md index 71536f4af..fedc88b7d 100644 --- a/docs/_pages/user_guide/docs/docs_magpylib_force.md +++ b/docs/_pages/user_guide/docs/docs_magpylib_force.md @@ -31,6 +31,7 @@ The package provides only a single top-level function [0. 0. 0.] -print(cube.orientation.as_rotvec()) # -> [0. 0. 0.] +print(cube.position) # -> [0. 0. 0.] +print(cube.orientation.as_rotvec()) # -> [0. 0. 0.] # Manipulate object position and orientation through # the respective attributes (move 10 mm and rotate 45 deg): from scipy.spatial.transform import Rotation as R -cube.position = (0.01,0,0) -cube.orientation = R.from_rotvec((0,0,45), degrees=True) -print(cube.position) # -> [0.01 0. 0. ] -print(cube.orientation.as_rotvec(degrees=True)) # -> [0. 0. 45.] +cube.position = (0.01, 0, 0) +cube.orientation = R.from_rotvec((0, 0, 45), degrees=True) + +print(cube.position) # -> [0.01 0. 0. ] +print(cube.orientation.as_rotvec(degrees=True)) # -> [0. 0. 45.] # Apply relative motion with the powerful `move` # and `rotate` methods. -sensor.move((-0.01,0,0)) -sensor.rotate_from_angax(angle=-45, axis='z') +sensor.move((-0.01, 0, 0)) +sensor.rotate_from_angax(angle=-45, axis="z") -print(sensor.position) # -> [-0.01 0. 0. ] -print(sensor.orientation.as_rotvec(degrees=True)) # -> [ 0. 0. -45.] +print(sensor.position) # -> [-0.01 0. 0. ] +print(sensor.orientation.as_rotvec(degrees=True)) # -> [ 0. 0. -45.] ``` Find detailed information on position and orientation attributes and how to manipulate them [here](docs-position). @@ -72,7 +73,7 @@ In-built 3D graphic output helps to see if all Magpylib objects are positioned p # Use the `show` function to view your system # through Matplotlib, Plotly or Pyvista backends. -magpy.show(cube, sensor, backend='plotly') +magpy.show(cube, sensor, backend="plotly") ``` @@ -86,18 +87,18 @@ The field can be computed at sensor objects, or simply by specifying a position ```python # Compute the B-field for some positions. -points = [(0,0,-.01), (0,0,0), (0,0,.01)] # in SI Units (m) +points = [(0, 0, -0.01), (0, 0, 0), (0, 0, 0.01)] # in SI Units (m) B = magpy.getB(cube, points) -print(B.round(2)) # -> [[ 0.26 0.07 0.08] - # [ 0.28 0.05 0. ] - # [ 0.26 0.07 -0.08]] # in SI Units (T) +print(B.round(2)) # -> [[ 0.26 0.07 0.08] +# [ 0.28 0.05 0. ] +# [ 0.26 0.07 -0.08]] # in SI Units (T) # Compute the H-field at the sensor. H = magpy.getH(cube, sensor) -print(H.round()) # -> [51017. 24210. 0.] # in SI Units (A/m) +print(H.round()) # -> [51017. 24210. 0.] # in SI Units (A/m) ``` ```{hint} @@ -119,23 +120,20 @@ import numpy as np import magpylib as magpy # Create magnet -sphere = magpy.magnet.Sphere( - diameter=.01, - polarization=(0,0,1) -) +sphere = magpy.magnet.Sphere(diameter=0.01, polarization=(0, 0, 1)) # Assign a path -sphere.position = np.linspace((-.02,0,0), (.02,0,0), 7) +sphere.position = np.linspace((-0.02, 0, 0), (0.02, 0, 0), 7) # The field is automatically computed for every path position -B = sphere.getB((0,0,.01)) +B = sphere.getB((0, 0, 0.01)) print(B.round(3)) # ->[[ 0.004 0. -0.001] - # [ 0.013 0. 0.001] - # [ 0.033 0. 0.026] - # [ 0. 0. 0.083] - # [-0.033 0. 0.026] - # [-0.013 0. 0.001] - # [-0.004 0. -0.001]] +# [ 0.013 0. 0.001] +# [ 0.033 0. 0.026] +# [ 0. 0. 0.083] +# [-0.033 0. 0.026] +# [-0.013 0. 0.001] +# [-0.004 0. -0.001]] ``` More information on paths is provided [here](docs-position). @@ -148,18 +146,16 @@ import magpylib as magpy # Create objects obj1 = magpy.Sensor() -obj2 = magpy.magnet.Cuboid( - polarization=(0,0,1), - dimension=(.01,.02,.03)) +obj2 = magpy.magnet.Cuboid(polarization=(0, 0, 1), dimension=(0.01, 0.02, 0.03)) # Group objects coll = magpy.Collection(obj1, obj2) # Manipulate Collection -coll.move((.001,.002,.003)) +coll.move((0.001, 0.002, 0.003)) -print(obj1.position) # -> [0.001 0.002 0.003] -print(obj2.position) # -> [0.001 0.002 0.003] +print(obj1.position) # -> [0.001 0.002 0.003] +print(obj2.position) # -> [0.001 0.002 0.003] ``` Collections are dicussed in detail [here](guide-docs-classes-collections). @@ -173,16 +169,14 @@ import numpy as np import magpylib as magpy # Create a Pyramid magnet -points = ( - np.array( - [ - (-1, -1, 0), - (-1, 1, 0), - (1, -1, 0), - (1, 1, 0), - (0, 0, 2), - ] - ) +points = np.array( + [ + (-1, -1, 0), + (-1, 1, 0), + (1, -1, 0), + (1, 1, 0), + (0, 0, 2), + ] ) pyramid = magpy.magnet.TriangularMesh.from_ConvexHull( magnetization=(0, 0, 1e6), @@ -205,20 +199,20 @@ import magpylib as magpy # Create Cuboid magnet with custom style cube = magpy.magnet.Cuboid( - polarization=(0,0,1), - dimension=(.01,.01,.01), - style_color='r', - style_magnetization_mode='arrow' + polarization=(0, 0, 1), + dimension=(0.01, 0.01, 0.01), + style_color="r", + style_magnetization_mode="arrow", ) # Create Cylinder magnet with custom style cyl = magpy.magnet.Cylinder( - polarization=(0,0,1), - dimension=(.01,.01), - position=(.02,0,0), - style_magnetization_color_mode='bicolor', - style_magnetization_color_north='m', - style_magnetization_color_south='c', + polarization=(0, 0, 1), + dimension=(0.01, 0.01), + position=(0.02, 0, 0), + style_magnetization_color_mode="bicolor", + style_magnetization_color_north="m", + style_magnetization_color_south="c", ) magpy.show(cube, cyl) ``` @@ -236,13 +230,10 @@ import magpylib as magpy # Create magnet with path cube = magpy.magnet.Cuboid( - magnetization=(0,0,1), - dimension=(1,1,1), -) -cube.rotate_from_angax( - angle=np.linspace(10,360,18), - axis='x' + magnetization=(0, 0, 1), + dimension=(1, 1, 1), ) +cube.rotate_from_angax(angle=np.linspace(10, 360, 18), axis="x") # Generate an animation with `show` cube.show(animation=True, backend="plotly") @@ -266,8 +257,8 @@ B = magpy.getB( ) print(B.round(3)) # -> [[-0.043 0. 0.014] - # [ 0. 0. 0.135] - # [ 0.043 0. 0.014]] +# [ 0. 0. 0.135] +# [ 0.043 0. 0.014]] ``` Details on the functional interface are found [here](docs-field-functional). diff --git a/docs/_static/switcher.json b/docs/_static/switcher.json index 6fa25f9fd..d042c09c1 100644 --- a/docs/_static/switcher.json +++ b/docs/_static/switcher.json @@ -21,4 +21,4 @@ "version": "2.3.0-beta", "url": "https://magpylib.readthedocs.io/en/2.3.0-beta/" } -] \ No newline at end of file +] diff --git a/docs/_static/webcode/summaryOpen.js b/docs/_static/webcode/summaryOpen.js index 5fe9aa024..1139cee9f 100644 --- a/docs/_static/webcode/summaryOpen.js +++ b/docs/_static/webcode/summaryOpen.js @@ -10,7 +10,7 @@ $(document).ready(function() { }, 500, 'swing', function() { window.location.hash = target; }); - + }); }); //https://stackoverflow.com/a/48258026/11028959 From 75901ba83d92917dd9c58abf767ae7ecfa3e19fc Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sat, 26 Apr 2025 23:35:47 +0200 Subject: [PATCH 143/211] add back examples --- docs/README.md | 1 - docs/_pages/API_reference.md | 2 +- docs/_pages/changelog_.md | 2 +- docs/_pages/user_guide/docs/docs_classes.md | 38 ++++-- docs/_pages/user_guide/docs/docs_fieldcomp.md | 20 +-- .../user_guide/docs/docs_magpylib_force.md | 7 +- docs/_pages/user_guide/docs/docs_pos_ori.md | 21 ++-- docs/_pages/user_guide/docs/docs_styles.md | 2 +- .../user_guide/docs/docs_units_types.md | 2 +- .../user_guide/examples/examples_app_coils.md | 2 +- .../examples/examples_force_floating.md | 16 +-- .../examples/examples_force_force.md | 2 +- .../user_guide/examples/examples_index.md | 1 - .../examples/examples_shapes_superpos.md | 2 +- .../examples_tutorial_modeling_magnets.md | 2 +- .../examples/examples_vis_animations.md | 37 +++--- .../examples/examples_vis_pv_streamlines.md | 2 +- .../user_guide/guide_start_02_fundamentals.md | 117 ++++++++---------- docs/_static/switcher.json | 2 +- docs/_static/webcode/summaryOpen.js | 2 +- 20 files changed, 153 insertions(+), 127 deletions(-) diff --git a/docs/README.md b/docs/README.md index 0a0ba2474..bc95c1e35 100644 --- a/docs/README.md +++ b/docs/README.md @@ -7,4 +7,3 @@ The Documentation is built with [Sphinx](http://www.sphinx-doc.org/en/main/) and ### Handwritten documents Handwritten pages and guides are kept in the [_pages](./_pages) folder. They are all written in [Markdown](https://www.markdownguide.org/) using [myst-parser](https://github.com/executablebooks/MyST-Parser) as interface. Some documents like in the examples folder are dynamically computed with [myst-nb](https://github.com/executablebooks/myst-nb) as jupyter notebooks. With the help of the [jupytext](https://github.com/mwouts/jupytext) library ands its jupyterlab extension, examples can be written and executed within the jupyterlab ecosystem and saved as markdown file. It is recommended to use the [jupyterlab-myst](https://github.com/executablebooks/jupyterlab-myst) extension to be able to work with the full set of myst markdown flavor within jupyterlab. When editing the docs with vscode, use the [MyST-Markdown](https://marketplace.visualstudio.com/items?itemName=ExecutableBookProject.myst-highlight) extension to visualize the rendered document. - diff --git a/docs/_pages/API_reference.md b/docs/_pages/API_reference.md index 9c7ec255d..b44c5a2bc 100644 --- a/docs/_pages/API_reference.md +++ b/docs/_pages/API_reference.md @@ -7,4 +7,4 @@ The API reference includes all Magpylib docstrings. :maxdepth: 2 ../../_autogen/magpylib.rst -``` \ No newline at end of file +``` diff --git a/docs/_pages/changelog_.md b/docs/_pages/changelog_.md index 76a8f304f..33ac9e8e5 100644 --- a/docs/_pages/changelog_.md +++ b/docs/_pages/changelog_.md @@ -9,4 +9,4 @@ The changelog provides a compressed history of the Magpylib development since it :relative-docs: docs/ :relative-images: :start-line: 2 -``` \ No newline at end of file +``` diff --git a/docs/_pages/user_guide/docs/docs_classes.md b/docs/_pages/user_guide/docs/docs_classes.md index c7e8d00eb..4c3839971 100644 --- a/docs/_pages/user_guide/docs/docs_classes.md +++ b/docs/_pages/user_guide/docs/docs_classes.md @@ -64,7 +64,9 @@ All magnets are sources. They have the **polarizatio ### Cuboid ```python -magpylib.magnet.Cuboid(position, orientation, dimension, polarization, magnetization, style) +magpylib.magnet.Cuboid( + position, orientation, dimension, polarization, magnetization, style +) ``` ::::{grid} 2 @@ -81,7 +83,9 @@ magpylib.magnet.Cuboid(position, orientation, dimension, polarization, magnetiza ### Cylinder ```python -magpylib.magnet.Cylinder(position, orientation, dimension, polarization, magnetization, style) +magpylib.magnet.Cylinder( + position, orientation, dimension, polarization, magnetization, style +) ``` ::::{grid} 2 @@ -98,7 +102,9 @@ magpylib.magnet.Cylinder(position, orientation, dimension, polarization, magneti ### CylinderSegment ```python -magpylib.magnet.CylinderSegment(position, orientation, dimension, polarization, magnetization, style) +magpylib.magnet.CylinderSegment( + position, orientation, dimension, polarization, magnetization, style +) ``` ::::{grid} 2 @@ -119,7 +125,9 @@ magpylib.magnet.CylinderSegment(position, orientation, dimension, polarization, ### Sphere ```python -magpylib.magnet.Sphere(position, orientation, diameter, polarization, magnetization, style) +magpylib.magnet.Sphere( + position, orientation, diameter, polarization, magnetization, style +) ``` ::::{grid} 2 @@ -136,7 +144,9 @@ magpylib.magnet.Sphere(position, orientation, diameter, polarization, magnetizat ### Tetrahedron ```python -magpylib.magnet.Tetrahedron(position, orientation, vertices, polarization, magnetization, style) +magpylib.magnet.Tetrahedron( + position, orientation, vertices, polarization, magnetization, style +) ``` ::::{grid} 2 @@ -158,7 +168,19 @@ magpylib.magnet.Tetrahedron(position, orientation, vertices, polarization, magne ### TriangularMesh ```python -magpylib.magnet.TriangularMesh(position, orientation, vertices, faces, polarization, magnetization, check_open, check_disconnected, check_selfintersecting, reorient_faces, style) +magpylib.magnet.TriangularMesh( + position, + orientation, + vertices, + faces, + polarization, + magnetization, + check_open, + check_disconnected, + check_selfintersecting, + reorient_faces, + style, +) ``` ::::{grid} 2 @@ -278,7 +300,9 @@ magpylib.misc.Dipole(position, orientation, moment, style) ### Triangle ```python -magpylib.misc.Triangle(position, orientation, vertices, polarization, magnetization, style) +magpylib.misc.Triangle( + position, orientation, vertices, polarization, magnetization, style +) ``` ::::{grid} 2 diff --git a/docs/_pages/user_guide/docs/docs_fieldcomp.md b/docs/_pages/user_guide/docs/docs_fieldcomp.md index c1632f3cf..0169fd07c 100644 --- a/docs/_pages/user_guide/docs/docs_fieldcomp.md +++ b/docs/_pages/user_guide/docs/docs_fieldcomp.md @@ -22,7 +22,7 @@ that compute the respective fields B (B-field), H (H-field), J (polarization) or import magpylib as magpy # Define source and observer objects -loop = magpy.current.Circle(current=1, diameter=.001) +loop = magpy.current.Circle(current=1, diameter=0.001) sens = magpy.Sensor() # Compute field @@ -78,15 +78,16 @@ All "scalar" inputs of shape (x,) are automatically tiled up to shape (n,x) to c ```python import numpy as np import magpylib as magpy + # All inputs and outputs in SI units # Compute the cuboid field for 3 input instances -N = 3 # number of instances +N = 3 # number of instances B = magpy.getB( - sources='Cuboid', - observers=np.linspace((0,0,1), (0,0,3), N), - dimension=np.linspace((1,1,1), (3,3,3),3, N), - polarization=(0,0,1), + sources="Cuboid", + observers=np.linspace((0, 0, 1), (0, 0, 3), N), + dimension=np.linspace((1, 1, 1), (3, 3, 3), 3, N), + polarization=(0, 0, 1), ) # This example demonstrates the scale invariance @@ -153,12 +154,13 @@ All inputs must be NumPy ndarrays of shape (n,x). Details can be found in the re ```python import numpy as np import magpylib as magpy + # All inputs and outputs in SI units # Prepare input -z0 = np.array([1,1]) -r = np.array([1,1]) -z = np.array([2,2]) +z0 = np.array([1, 1]) +r = np.array([1, 1]) +z = np.array([2, 2]) # Compute field with core functions B = magpy.core.magnet_cylinder_axial_Bfield(z0=z0, r=r, z=z).T diff --git a/docs/_pages/user_guide/docs/docs_magpylib_force.md b/docs/_pages/user_guide/docs/docs_magpylib_force.md index 71536f4af..fedc88b7d 100644 --- a/docs/_pages/user_guide/docs/docs_magpylib_force.md +++ b/docs/_pages/user_guide/docs/docs_magpylib_force.md @@ -31,6 +31,7 @@ The package provides only a single top-level function [0. 0. 0.] -print(cube.orientation.as_rotvec()) # -> [0. 0. 0.] +print(cube.position) # -> [0. 0. 0.] +print(cube.orientation.as_rotvec()) # -> [0. 0. 0.] # Manipulate object position and orientation through # the respective attributes (move 10 mm and rotate 45 deg): from scipy.spatial.transform import Rotation as R -cube.position = (0.01,0,0) -cube.orientation = R.from_rotvec((0,0,45), degrees=True) -print(cube.position) # -> [0.01 0. 0. ] -print(cube.orientation.as_rotvec(degrees=True)) # -> [0. 0. 45.] +cube.position = (0.01, 0, 0) +cube.orientation = R.from_rotvec((0, 0, 45), degrees=True) + +print(cube.position) # -> [0.01 0. 0. ] +print(cube.orientation.as_rotvec(degrees=True)) # -> [0. 0. 45.] # Apply relative motion with the powerful `move` # and `rotate` methods. -sensor.move((-0.01,0,0)) -sensor.rotate_from_angax(angle=-45, axis='z') +sensor.move((-0.01, 0, 0)) +sensor.rotate_from_angax(angle=-45, axis="z") -print(sensor.position) # -> [-0.01 0. 0. ] -print(sensor.orientation.as_rotvec(degrees=True)) # -> [ 0. 0. -45.] +print(sensor.position) # -> [-0.01 0. 0. ] +print(sensor.orientation.as_rotvec(degrees=True)) # -> [ 0. 0. -45.] ``` Find detailed information on position and orientation attributes and how to manipulate them [here](docs-position). @@ -72,7 +73,7 @@ In-built 3D graphic output helps to see if all Magpylib objects are positioned p # Use the `show` function to view your system # through Matplotlib, Plotly or Pyvista backends. -magpy.show(cube, sensor, backend='plotly') +magpy.show(cube, sensor, backend="plotly") ``` @@ -86,18 +87,18 @@ The field can be computed at sensor objects, or simply by specifying a position ```python # Compute the B-field for some positions. -points = [(0,0,-.01), (0,0,0), (0,0,.01)] # in SI Units (m) +points = [(0, 0, -0.01), (0, 0, 0), (0, 0, 0.01)] # in SI Units (m) B = magpy.getB(cube, points) -print(B.round(2)) # -> [[ 0.26 0.07 0.08] - # [ 0.28 0.05 0. ] - # [ 0.26 0.07 -0.08]] # in SI Units (T) +print(B.round(2)) # -> [[ 0.26 0.07 0.08] +# [ 0.28 0.05 0. ] +# [ 0.26 0.07 -0.08]] # in SI Units (T) # Compute the H-field at the sensor. H = magpy.getH(cube, sensor) -print(H.round()) # -> [51017. 24210. 0.] # in SI Units (A/m) +print(H.round()) # -> [51017. 24210. 0.] # in SI Units (A/m) ``` ```{hint} @@ -119,23 +120,20 @@ import numpy as np import magpylib as magpy # Create magnet -sphere = magpy.magnet.Sphere( - diameter=.01, - polarization=(0,0,1) -) +sphere = magpy.magnet.Sphere(diameter=0.01, polarization=(0, 0, 1)) # Assign a path -sphere.position = np.linspace((-.02,0,0), (.02,0,0), 7) +sphere.position = np.linspace((-0.02, 0, 0), (0.02, 0, 0), 7) # The field is automatically computed for every path position -B = sphere.getB((0,0,.01)) +B = sphere.getB((0, 0, 0.01)) print(B.round(3)) # ->[[ 0.004 0. -0.001] - # [ 0.013 0. 0.001] - # [ 0.033 0. 0.026] - # [ 0. 0. 0.083] - # [-0.033 0. 0.026] - # [-0.013 0. 0.001] - # [-0.004 0. -0.001]] +# [ 0.013 0. 0.001] +# [ 0.033 0. 0.026] +# [ 0. 0. 0.083] +# [-0.033 0. 0.026] +# [-0.013 0. 0.001] +# [-0.004 0. -0.001]] ``` More information on paths is provided [here](docs-position). @@ -148,18 +146,16 @@ import magpylib as magpy # Create objects obj1 = magpy.Sensor() -obj2 = magpy.magnet.Cuboid( - polarization=(0,0,1), - dimension=(.01,.02,.03)) +obj2 = magpy.magnet.Cuboid(polarization=(0, 0, 1), dimension=(0.01, 0.02, 0.03)) # Group objects coll = magpy.Collection(obj1, obj2) # Manipulate Collection -coll.move((.001,.002,.003)) +coll.move((0.001, 0.002, 0.003)) -print(obj1.position) # -> [0.001 0.002 0.003] -print(obj2.position) # -> [0.001 0.002 0.003] +print(obj1.position) # -> [0.001 0.002 0.003] +print(obj2.position) # -> [0.001 0.002 0.003] ``` Collections are dicussed in detail [here](guide-docs-classes-collections). @@ -173,16 +169,14 @@ import numpy as np import magpylib as magpy # Create a Pyramid magnet -points = ( - np.array( - [ - (-1, -1, 0), - (-1, 1, 0), - (1, -1, 0), - (1, 1, 0), - (0, 0, 2), - ] - ) +points = np.array( + [ + (-1, -1, 0), + (-1, 1, 0), + (1, -1, 0), + (1, 1, 0), + (0, 0, 2), + ] ) pyramid = magpy.magnet.TriangularMesh.from_ConvexHull( magnetization=(0, 0, 1e6), @@ -205,20 +199,20 @@ import magpylib as magpy # Create Cuboid magnet with custom style cube = magpy.magnet.Cuboid( - polarization=(0,0,1), - dimension=(.01,.01,.01), - style_color='r', - style_magnetization_mode='arrow' + polarization=(0, 0, 1), + dimension=(0.01, 0.01, 0.01), + style_color="r", + style_magnetization_mode="arrow", ) # Create Cylinder magnet with custom style cyl = magpy.magnet.Cylinder( - polarization=(0,0,1), - dimension=(.01,.01), - position=(.02,0,0), - style_magnetization_color_mode='bicolor', - style_magnetization_color_north='m', - style_magnetization_color_south='c', + polarization=(0, 0, 1), + dimension=(0.01, 0.01), + position=(0.02, 0, 0), + style_magnetization_color_mode="bicolor", + style_magnetization_color_north="m", + style_magnetization_color_south="c", ) magpy.show(cube, cyl) ``` @@ -236,13 +230,10 @@ import magpylib as magpy # Create magnet with path cube = magpy.magnet.Cuboid( - magnetization=(0,0,1), - dimension=(1,1,1), -) -cube.rotate_from_angax( - angle=np.linspace(10,360,18), - axis='x' + magnetization=(0, 0, 1), + dimension=(1, 1, 1), ) +cube.rotate_from_angax(angle=np.linspace(10, 360, 18), axis="x") # Generate an animation with `show` cube.show(animation=True, backend="plotly") @@ -266,8 +257,8 @@ B = magpy.getB( ) print(B.round(3)) # -> [[-0.043 0. 0.014] - # [ 0. 0. 0.135] - # [ 0.043 0. 0.014]] +# [ 0. 0. 0.135] +# [ 0.043 0. 0.014]] ``` Details on the functional interface are found [here](docs-field-functional). diff --git a/docs/_static/switcher.json b/docs/_static/switcher.json index 6fa25f9fd..d042c09c1 100644 --- a/docs/_static/switcher.json +++ b/docs/_static/switcher.json @@ -21,4 +21,4 @@ "version": "2.3.0-beta", "url": "https://magpylib.readthedocs.io/en/2.3.0-beta/" } -] \ No newline at end of file +] diff --git a/docs/_static/webcode/summaryOpen.js b/docs/_static/webcode/summaryOpen.js index 5fe9aa024..1139cee9f 100644 --- a/docs/_static/webcode/summaryOpen.js +++ b/docs/_static/webcode/summaryOpen.js @@ -10,7 +10,7 @@ $(document).ready(function() { }, 500, 'swing', function() { window.location.hash = target; }); - + }); }); //https://stackoverflow.com/a/48258026/11028959 From 7fc6597688b4441640908a7aa2dbc5d368d9da8d Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sun, 27 Apr 2025 00:13:57 +0200 Subject: [PATCH 144/211] code spell --- docs/_pages/user_guide/docs/docs_pos_ori.md | 2 +- docs/_pages/user_guide/docs/docs_styles.md | 2 +- docs/_pages/user_guide/examples/examples_force_floating.md | 2 +- .../user_guide/examples/examples_force_holding_force.md | 2 +- docs/_pages/user_guide/examples/examples_misc_inhom.md | 2 +- docs/_pages/user_guide/examples/examples_tutorial_paths.md | 2 +- docs/_pages/user_guide/guide_resources_01_physics.md | 2 +- docs/_pages/user_guide/guide_start_02_fundamentals.md | 4 ++-- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/_pages/user_guide/docs/docs_pos_ori.md b/docs/_pages/user_guide/docs/docs_pos_ori.md index 13dfd20b8..61319a0de 100644 --- a/docs/_pages/user_guide/docs/docs_pos_ori.md +++ b/docs/_pages/user_guide/docs/docs_pos_ori.md @@ -1,7 +1,7 @@ (docs-position)= # Position, Orientation, and Paths -The following secions are detiled technical documentations of the Magpylib position and orientation interface. Practical examples and good practice usage is demonstrated in the tutorial {ref}`examples-tutorial-paths`. +The following sections are detailed technical documentations of the Magpylib position and orientation interface. Practical examples and good practice usage is demonstrated in the tutorial {ref}`examples-tutorial-paths`. ::::{grid} 2 :gutter: 2 diff --git a/docs/_pages/user_guide/docs/docs_styles.md b/docs/_pages/user_guide/docs/docs_styles.md index 942954f55..ea3abb8c8 100644 --- a/docs/_pages/user_guide/docs/docs_styles.md +++ b/docs/_pages/user_guide/docs/docs_styles.md @@ -142,7 +142,7 @@ magpy.defaults.display.style.magnet.update( Any Magpylib object can have its own individual style that will take precedence over the default values when `show` is called. When setting individual styles, the object family specifier such as `magnet` or `current` can be omitted. ```{note} -Users should be aware that the individual object style is organized in classes that take much longer to initialize than bare Magpylib objects, i.e. objects without individual style. This can lead to a computational bottleneck when setting individual styles of many Magpylib objects. For this reason Magpylib automatically defers style initialization until it is needed the first time, e.g. when calling the `show` function, so that object creatin time is not affected. However, this works only if style properties are set at initialization (e.g.: `magpy.magnet.Cuboid(..., style_label="MyCuboid")`). While this effect may not be noticeable for a small number of objects, it is best to avoid setting styles until it is plotting time. +Users should be aware that the individual object style is organized in classes that take much longer to initialize than bare Magpylib objects, i.e. objects without individual style. This can lead to a computational bottleneck when setting individual styles of many Magpylib objects. For this reason Magpylib automatically defers style initialization until it is needed the first time, e.g. when calling the `show` function, so that object creation time is not affected. However, this works only if style properties are set at initialization (e.g.: `magpy.magnet.Cuboid(..., style_label="MyCuboid")`). While this effect may not be noticeable for a small number of objects, it is best to avoid setting styles until it is plotting time. ``` In the following example `cube` has no individual style, so the default style is used. `cylinder` has an individual style set for `magnetization` which is a tricolor scheme that will display the object color in the middle. The individual style is set at object initialization (good practice), and it will be applied only when `show` is called at the end of the example. Finally, `sphere` is also given an individual style for `magnetization` that displays the latter using a 2-color scheme. In this case, however, the individual style is applied after object initialization (bad practice), which results in style initialization before it is needed. diff --git a/docs/_pages/user_guide/examples/examples_force_floating.md b/docs/_pages/user_guide/examples/examples_force_floating.md index 3f1799b6b..0a1aa452c 100644 --- a/docs/_pages/user_guide/examples/examples_force_floating.md +++ b/docs/_pages/user_guide/examples/examples_force_floating.md @@ -16,7 +16,7 @@ kernelspec: # Floating Magnets -The examples here require installaion of the [magpylib-force package](https://pypi.org/project/magpylib-force/). See also the [magpylib-force documentation](docs-magpylib-force). +The examples here require installation of the [magpylib-force package](https://pypi.org/project/magpylib-force/). See also the [magpylib-force documentation](docs-magpylib-force). ## Formalism diff --git a/docs/_pages/user_guide/examples/examples_force_holding_force.md b/docs/_pages/user_guide/examples/examples_force_holding_force.md index d755e1d07..631f5326c 100644 --- a/docs/_pages/user_guide/examples/examples_force_holding_force.md +++ b/docs/_pages/user_guide/examples/examples_force_holding_force.md @@ -2,7 +2,7 @@ # Magnetic Holding Force -The examples here require installaion of the [magpylib-force package](https://pypi.org/project/magpylib-force/). See also the [magpylib-force documentation](docs-magpylib-force). +The examples here require installation of the [magpylib-force package](https://pypi.org/project/magpylib-force/). See also the [magpylib-force documentation](docs-magpylib-force). With Magpylib-force it is possible to compute the holding force of a magnet attached magnetically to a soft-ferromagnetic plate. The "pull-force" is the opposing force that is required to detach the magnet from the surface. diff --git a/docs/_pages/user_guide/examples/examples_misc_inhom.md b/docs/_pages/user_guide/examples/examples_misc_inhom.md index 4f12f9669..a65f3ecd2 100644 --- a/docs/_pages/user_guide/examples/examples_misc_inhom.md +++ b/docs/_pages/user_guide/examples/examples_misc_inhom.md @@ -20,7 +20,7 @@ The analytical expressions implemented in Magpylib treat only simple homogeneous Here we show how to deal with inhomogeneous polarization based on a commonly misunderstood example of a cylindrical quadrupol magnet. While graphical representations of such magnets usually depict only four poles, see {ref}`examples-vis-magnet-colors`, such magnets exhibit complex polarization given by the magnetization device that is used to magnetize them. -The following code shows how the field of such a magnetization device would look like and what magnetization field it produces. To relize a Cylindrical Quadrupole magnert there are four coils with ferromagnetic cores involved, arranged in circle around the magnet. In the example, coils and cores are modeled by Cuboid magnets. +The following code shows how the field of such a magnetization device would look like and what magnetization field it produces. To realize a Cylindrical Quadrupole magnert there are four coils with ferromagnetic cores involved, arranged in circle around the magnet. In the example, coils and cores are modeled by Cuboid magnets. ```{note} While Magpylib uses SI units by default, in this example we make use of [scaling invariance](guide-docs-io-scale-invariance) and consider arbitrary input length units. For this example millimeters are sensible. diff --git a/docs/_pages/user_guide/examples/examples_tutorial_paths.md b/docs/_pages/user_guide/examples/examples_tutorial_paths.md index 0da674d36..8b836721f 100644 --- a/docs/_pages/user_guide/examples/examples_tutorial_paths.md +++ b/docs/_pages/user_guide/examples/examples_tutorial_paths.md @@ -16,7 +16,7 @@ orphan: true # Working with Paths -The position and orientation attributes are key elements of Magpylib. The documentation section {ref}`docs-position` describes how they work in detail. Wile these definitions can seem abstract, the interface was constructed as intuitively as possible which is demonstrated in this tutorial. +The position and orientation attributes are key elements of Magpylib. The documentation section {ref}`docs-position` describes how they work in detail. While these definitions can seem abstract, the interface was constructed as intuitively as possible which is demonstrated in this tutorial. ```{important} Always make use of paths when computing with multiple Magpylib object position and orientation instances. This enables vectorized computation. Avoid Python loops at all costs! diff --git a/docs/_pages/user_guide/guide_resources_01_physics.md b/docs/_pages/user_guide/guide_resources_01_physics.md index 9c0b2821a..07a0d2337 100644 --- a/docs/_pages/user_guide/guide_resources_01_physics.md +++ b/docs/_pages/user_guide/guide_resources_01_physics.md @@ -64,7 +64,7 @@ For example, a cube with 1 mm sides has a demagnetization factor is 0.333, see [ A [tutorial](examples-tutorial-modeling-magnets) explains how to deal with demagnetization effects and how real magnets can be modeled using datasheet values. -It must be understood that the change in magnetization resulting from self-interaction has a homogeneous contribution which is approximated by the demagnetization factor, and an inhomogeneous contribution which cannot be modeled easily with analytical solutions. The inhomogeneous part, however, is typically an order of magnitude lower than the homogenous part. You can use the Magpylib extension [Magpylib material response](https://github.com/magpylib/magpylib-material-response) to model the self-interactions. +It must be understood that the change in magnetization resulting from self-interaction has a homogeneous contribution which is approximated by the demagnetization factor, and an inhomogeneous contribution which cannot be modeled easily with analytical solutions. The inhomogeneous part, however, is typically an order of magnitude lower than the homogeneous part. You can use the Magpylib extension [Magpylib material response](https://github.com/magpylib/magpylib-material-response) to model the self-interactions. ### Soft-Magnetic Materials diff --git a/docs/_pages/user_guide/guide_start_02_fundamentals.md b/docs/_pages/user_guide/guide_start_02_fundamentals.md index 362175fa2..1d2dba684 100644 --- a/docs/_pages/user_guide/guide_start_02_fundamentals.md +++ b/docs/_pages/user_guide/guide_start_02_fundamentals.md @@ -8,7 +8,7 @@ In this section we present the most important Magpylib features, focussing on th Learn the Magpylib fundamentals (create magnets, view system, compute field) in 5 minutes. This requires a basic understanding of the Python programming language, the [NumPy array class](https://numpy.org/doc/stable/) and the [Scipy Rotation class](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html). ```{hint} -Since v5 all Magpylib inputs and ouputs are by default in SI-units. See {ref}`guide-docs-io-scale-invariance` for convenient use. +Since v5 all Magpylib inputs and outputs are by default in SI-units. See {ref}`guide-docs-io-scale-invariance` for convenient use. ``` ### Create sources and observers as Python objects @@ -158,7 +158,7 @@ print(obj1.position) # -> [0.001 0.002 0.003] print(obj2.position) # -> [0.001 0.002 0.003] ``` -Collections are dicussed in detail [here](guide-docs-classes-collections). +Collections are discussed in detail [here](guide-docs-classes-collections). ### Complex Magnet Shapes There most convenient way to create a magnet with complex shape is by using the convex hull of a point cloud (= simplest geometric form that includes all given points) and transform it into a triangular surface mesh. From c26453c30b42d23bc8fdf8948a04f7bc3ffb110c Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sun, 27 Apr 2025 00:18:22 +0200 Subject: [PATCH 145/211] blacken-docs --- docs/_pages/user_guide/docs/docs_styles.md | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/docs/_pages/user_guide/docs/docs_styles.md b/docs/_pages/user_guide/docs/docs_styles.md index ea3abb8c8..bdbd3a7ab 100644 --- a/docs/_pages/user_guide/docs/docs_styles.md +++ b/docs/_pages/user_guide/docs/docs_styles.md @@ -36,15 +36,15 @@ The default styles can be modified in three ways: ```python magpy.defaults.display.style.magnet.magnetization.show = True -magpy.defaults.display.style.magnet.magnetization.color.mode = 'bicolor' -magpy.defaults.display.style.magnet.magnetization.color.north = 'grey' +magpy.defaults.display.style.magnet.magnetization.color.mode = "bicolor" +magpy.defaults.display.style.magnet.magnetization.color.north = "grey" ``` 2. By assigning a style dictionary with equivalent keys, ```python magpy.defaults.display.style.magnet = { - 'magnetization': {'show': True, 'color': {'north': 'grey', 'mode': 'tricolor'}} + "magnetization": {"show": True, "color": {"north": "grey", "mode": "tricolor"}} } ``` @@ -52,8 +52,7 @@ magpy.defaults.display.style.magnet = { ```python magpy.defaults.display.style.magnet.magnetization.update( - 'show': True, - 'color': {'north'='grey', mode='tricolor',} + show=True, color={"north": "grey", "mode": "tricolor"} ) ``` @@ -119,10 +118,11 @@ With magic underscore notation, the previous examples can be written as: ```python import magpylib as magpy + magpy.defaults.display.style.magnet = { - 'magnetization_show': True, - 'magnetization_color_middle': 'grey', - 'magnetization_color_mode': 'tricolor', + "magnetization_show": True, + "magnetization_color_middle": "grey", + "magnetization_color_mode": "tricolor", } ``` @@ -130,10 +130,11 @@ or directly as named keywords in the `update` method as: ```python import magpylib as magpy + magpy.defaults.display.style.magnet.update( magnetization_show=True, - magnetization_color_middle='grey', - magnetization_color_mode='tricolor', + magnetization_color_middle="grey", + magnetization_color_mode="tricolor", ) ``` From 25c1d00a4b2cf4a3aa04f54cc1756b884e179a17 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sun, 27 Apr 2025 00:40:03 +0200 Subject: [PATCH 146/211] fix autogen docs --- .gitignore | 1 + docs/conf.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d3c456207..8d6fc047f 100644 --- a/.gitignore +++ b/.gitignore @@ -70,6 +70,7 @@ instance/ # Sphinx documentation docs/_build/ +docs/_autogen/ # PyBuilder .pybuilder/ diff --git a/docs/conf.py b/docs/conf.py index 2a5eacb03..808535e81 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -42,7 +42,7 @@ def setup(app): "-E", # user docstring headers "-M", # Modules first "-o", # Output the files to: - "./_autogen/", # Output Directory + "./docs/_autogen/", # Output Directory "./src/magpylib", # Main Module directory ] ) From 95793ac241849c642be8abb7b4d03c225d10fa76 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 29 Apr 2025 13:53:20 +0000 Subject: [PATCH 147/211] style: pre-commit fixes --- .../_src/display/backend_matplotlib.py | 10 +++-- src/magpylib/_src/display/backend_pyvista.py | 6 +-- src/magpylib/_src/display/display.py | 22 ++++++----- src/magpylib/_src/display/traces_base.py | 13 +++++-- src/magpylib/_src/display/traces_core.py | 36 ++++++++++-------- src/magpylib/_src/display/traces_generic.py | 38 ++++++++++--------- src/magpylib/_src/display/traces_utility.py | 14 ++++--- src/magpylib/_src/style.py | 12 +++--- tests/test_display_utility.py | 8 ++-- 9 files changed, 91 insertions(+), 68 deletions(-) diff --git a/src/magpylib/_src/display/backend_matplotlib.py b/src/magpylib/_src/display/backend_matplotlib.py index a5b8c8421..36d791dcf 100644 --- a/src/magpylib/_src/display/backend_matplotlib.py +++ b/src/magpylib/_src/display/backend_matplotlib.py @@ -17,9 +17,11 @@ from matplotlib import patches from matplotlib.animation import FuncAnimation -from magpylib._src.display.traces_utility import get_trace_kw -from magpylib._src.display.traces_utility import split_input_arrays -from magpylib._src.display.traces_utility import subdivide_mesh_by_facecolor +from magpylib._src.display.traces_utility import ( + get_trace_kw, + split_input_arrays, + subdivide_mesh_by_facecolor, +) from magpylib._src.utility import is_array_like if os.getenv("MAGPYLIB_MPL_SVG") == "true": # pragma: no cover @@ -184,7 +186,7 @@ def scatter_to_matplotlib(trace): if "text" in mode and trace.get("text", False) and len(coords) > 0: txt = trace["text"] txt = [txt] * len(coords[0]) if isinstance(txt, str) else txt - for *coords_s, txt in zip(*coords, txt): + for *coords_s, txt in zip(*coords, txt, strict=False): traces.append({"constructor": "text", "args": (*coords_s, txt)}) return traces diff --git a/src/magpylib/_src/display/backend_pyvista.py b/src/magpylib/_src/display/backend_pyvista.py index 8715cb0b6..4aa3e4ac9 100644 --- a/src/magpylib/_src/display/backend_pyvista.py +++ b/src/magpylib/_src/display/backend_pyvista.py @@ -23,10 +23,8 @@ from matplotlib.colors import LinearSegmentedColormap from pyvista.plotting.colors import Color # pylint: disable=import-error -from magpylib._src.display.traces_utility import get_trace_kw -from magpylib._src.display.traces_utility import split_input_arrays -from magpylib._src.utility import is_array_like -from magpylib._src.utility import open_animation +from magpylib._src.display.traces_utility import get_trace_kw, split_input_arrays +from magpylib._src.utility import is_array_like, open_animation # from magpylib._src.utility import format_obj_input diff --git a/src/magpylib/_src/display/display.py b/src/magpylib/_src/display/display.py index 59f6abb2e..79477976b 100644 --- a/src/magpylib/_src/display/display.py +++ b/src/magpylib/_src/display/display.py @@ -10,16 +10,18 @@ from matplotlib.axes import Axes as mplAxes from matplotlib.figure import Figure as mplFig -from magpylib._src.defaults.defaults_utility import _DefaultValue -from magpylib._src.defaults.defaults_utility import get_defaults_dict -from magpylib._src.display.traces_generic import MagpyMarkers -from magpylib._src.display.traces_generic import get_frames -from magpylib._src.display.traces_utility import DEFAULT_ROW_COL_PARAMS -from magpylib._src.display.traces_utility import process_show_input_objs -from magpylib._src.input_checks import check_format_input_backend -from magpylib._src.input_checks import check_format_input_vector -from magpylib._src.input_checks import check_input_animation -from magpylib._src.input_checks import check_input_canvas_update +from magpylib._src.defaults.defaults_utility import _DefaultValue, get_defaults_dict +from magpylib._src.display.traces_generic import MagpyMarkers, get_frames +from magpylib._src.display.traces_utility import ( + DEFAULT_ROW_COL_PARAMS, + process_show_input_objs, +) +from magpylib._src.input_checks import ( + check_format_input_backend, + check_format_input_vector, + check_input_animation, + check_input_canvas_update, +) from magpylib._src.utility import check_path_format disp_args = set(get_defaults_dict("display")) diff --git a/src/magpylib/_src/display/traces_base.py b/src/magpylib/_src/display/traces_base.py index 0d51d46be..2b7cd8821 100644 --- a/src/magpylib/_src/display/traces_base.py +++ b/src/magpylib/_src/display/traces_base.py @@ -8,9 +8,11 @@ import numpy as np from scipy.spatial import ConvexHull # pylint: disable=no-name-in-module -from magpylib._src.display.traces_utility import draw_zarrow -from magpylib._src.display.traces_utility import merge_mesh3d -from magpylib._src.display.traces_utility import place_and_orient_model3d +from magpylib._src.display.traces_utility import ( + draw_zarrow, + merge_mesh3d, + place_and_orient_model3d, +) from magpylib._src.fields.field_BH_tetrahedron import check_chirality @@ -610,7 +612,10 @@ def make_Tetrahedron( # create triangles implying right vertices chirality triangles = np.array([[0, 2, 1], [0, 3, 2], [1, 3, 0], [1, 2, 3]]) points = check_chirality(np.array([vertices]))[0] - trace = {"type": "mesh3d", **dict(zip("xyzijk", [*points.T, *triangles.T]))} + trace = { + "type": "mesh3d", + **dict(zip("xyzijk", [*points.T, *triangles.T], strict=False)), + } trace = place_and_orient_model3d(trace, orientation=orientation, position=position) return get_model(trace, backend=backend, show=show, scale=scale, kwargs=kwargs) diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index 3803d8ce0..987ad9f7a 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -29,16 +29,18 @@ from magpylib._src.display.traces_base import ( make_TriangularMesh as make_BaseTriangularMesh, ) -from magpylib._src.display.traces_utility import create_null_dim_trace -from magpylib._src.display.traces_utility import draw_arrow_from_vertices -from magpylib._src.display.traces_utility import draw_arrow_on_circle -from magpylib._src.display.traces_utility import get_hexcolors_from_scale -from magpylib._src.display.traces_utility import get_legend_label -from magpylib._src.display.traces_utility import get_orientation_from_vec -from magpylib._src.display.traces_utility import group_traces -from magpylib._src.display.traces_utility import merge_mesh3d -from magpylib._src.display.traces_utility import place_and_orient_model3d -from magpylib._src.display.traces_utility import triangles_area +from magpylib._src.display.traces_utility import ( + create_null_dim_trace, + draw_arrow_from_vertices, + draw_arrow_on_circle, + get_hexcolors_from_scale, + get_legend_label, + get_orientation_from_vec, + group_traces, + merge_mesh3d, + place_and_orient_model3d, + triangles_area, +) from magpylib._src.utility import is_array_like @@ -552,7 +554,9 @@ def make_Pixels( return { "type": "scatter3d", "mode": "markers", - **{"x": x, "y": y, "z": z}, + "x": x, + "y": y, + "z": z, "marker_symbol": symbol, "marker_color": colors, "marker_size": sizes * sizes_2dfactor, @@ -594,7 +598,9 @@ def make_Pixels( if field_symbol == "arrow": x, y, z = pos[:, None] pix = { - **{"x": x, "y": y, "z": z}, + "x": x, + "y": y, + "z": z, "marker_size": [size * sizes_2dfactor], **kw2d, } @@ -654,9 +660,9 @@ def make_Sensor( ) vertices = np.array([sens_mesh[k] for k in "xyz"]).T if style.color is not None: - sens_mesh["facecolor"][ - sens_mesh["facecolor"] == "rgb(238,238,238)" - ] = style.color + sens_mesh["facecolor"][sens_mesh["facecolor"] == "rgb(238,238,238)"] = ( + style.color + ) cube_mask = (abs(vertices) < 1).all(axis=1) vertices[cube_mask] = 0 * vertices[cube_mask] vertices[~cube_mask] = dim_ext * vertices[~cube_mask] diff --git a/src/magpylib/_src/display/traces_generic.py b/src/magpylib/_src/display/traces_generic.py index 7ef0ecfc9..9945c9958 100644 --- a/src/magpylib/_src/display/traces_generic.py +++ b/src/magpylib/_src/display/traces_generic.py @@ -17,20 +17,24 @@ import magpylib as magpy from magpylib._src.defaults.defaults_classes import default_settings -from magpylib._src.defaults.defaults_utility import ALLOWED_LINESTYLES -from magpylib._src.defaults.defaults_utility import ALLOWED_SYMBOLS -from magpylib._src.defaults.defaults_utility import linearize_dict -from magpylib._src.display.traces_utility import draw_arrowed_line -from magpylib._src.display.traces_utility import get_legend_label -from magpylib._src.display.traces_utility import get_objects_props_by_row_col -from magpylib._src.display.traces_utility import get_scene_ranges -from magpylib._src.display.traces_utility import getColorscale -from magpylib._src.display.traces_utility import getIntensity -from magpylib._src.display.traces_utility import group_traces -from magpylib._src.display.traces_utility import path_frames_to_indices -from magpylib._src.display.traces_utility import place_and_orient_model3d -from magpylib._src.display.traces_utility import rescale_traces -from magpylib._src.display.traces_utility import slice_mesh_from_colorscale +from magpylib._src.defaults.defaults_utility import ( + ALLOWED_LINESTYLES, + ALLOWED_SYMBOLS, + linearize_dict, +) +from magpylib._src.display.traces_utility import ( + draw_arrowed_line, + get_legend_label, + get_objects_props_by_row_col, + get_scene_ranges, + getColorscale, + getIntensity, + group_traces, + path_frames_to_indices, + place_and_orient_model3d, + rescale_traces, + slice_mesh_from_colorscale, +) from magpylib._src.style import DefaultMarkers from magpylib._src.utility import ( format_obj_input, @@ -993,11 +997,11 @@ def get_frames(objs, *, title, supports_colorgradient, backend, **kwargs): rc_params = None with style_temp_edit(*styles, styles_temp=styles): field_by_sens = get_sensor_pixel_field(list(props["objects"])) - for frame, path_ind in zip(frames, path_indices): + for frame, path_ind in zip(frames, path_indices, strict=False): if is_animation: style_kwargs["style_path_frames"] = [path_ind] title = "Animation 3D - " if title is None else title - title_str = f"""{title}path index: {path_ind+1:0{path_digits}d}""" + title_str = f"""{title}path index: {path_ind + 1:0{path_digits}d}""" traces, extra_backend_traces, rc_params = draw_frame( props, field_by_sens=field_by_sens, @@ -1017,7 +1021,7 @@ def get_frames(objs, *, title, supports_colorgradient, backend, **kwargs): ] zoom = {rc: v["rc_params"]["zoom"] for rc, v in objs_rc.items()} ranges_rc = get_scene_ranges(*all_traces, zoom=zoom) - labels_rc = {(1, 1): {k: "" for k in "xyz"}} + labels_rc = {(1, 1): dict.fromkeys("xyz", "")} scale_factors_rc = {} for rc, props in objs_rc.items(): params = props["rc_params"] diff --git a/src/magpylib/_src/display/traces_utility.py b/src/magpylib/_src/display/traces_utility.py index cc30a53e5..3e4ce9d52 100644 --- a/src/magpylib/_src/display/traces_utility.py +++ b/src/magpylib/_src/display/traces_utility.py @@ -17,9 +17,11 @@ from magpylib._src.defaults.defaults_utility import linearize_dict from magpylib._src.input_checks import check_input_zoom from magpylib._src.style import get_style -from magpylib._src.utility import format_obj_input -from magpylib._src.utility import is_array_like -from magpylib._src.utility import merge_dicts_with_conflict_check +from magpylib._src.utility import ( + format_obj_input, + is_array_like, + merge_dicts_with_conflict_check, +) DEFAULT_ROW_COL_PARAMS = { "row": 1, @@ -213,7 +215,9 @@ def draw_zarrow( anchor = ( (0, -0.5, 0) if pivot == "tip" - else (0, 0.5, 0) if pivot == "tail" else (0, 0, 0) + else (0, 0.5, 0) + if pivot == "tail" + else (0, 0, 0) ) arrow = [ [0, 0, shift], @@ -953,7 +957,7 @@ def split_input_arrays(*input_arrays, ordered=True): input_arrays = [ [inp] * max_length if not is_array_like(inp) else inp for inp in input_arrays ] - input_array = list(zip(*input_arrays)) + input_array = list(zip(*input_arrays, strict=False)) if ordered: input_split = [] prev_inp = next(iter(input_array)) diff --git a/src/magpylib/_src/style.py b/src/magpylib/_src/style.py index db2b4e91c..f6a050115 100644 --- a/src/magpylib/_src/style.py +++ b/src/magpylib/_src/style.py @@ -1717,7 +1717,7 @@ def vectorsource(self, val): assert val is None or val in self._allowed_vectorsources, ( f"The `vectorsource` property of {type(self).__name__} must be one of" f"{self._allowed_vectorsources},\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._vectorsource = val @@ -1738,7 +1738,7 @@ def colorsource(self, val): assert valid, ( f"The `colorsource` property of {type(self).__name__} must be None or False or start" f" with either {self._allowed_vectorsources} and be followed by a combination of" - f" 'x', 'y', 'z' (e.g. 'Bxy' or ('Bxy', 'Bz') ) but received {repr(val)} instead." + f" 'x', 'y', 'z' (e.g. 'Bxy' or ('Bxy', 'Bz') ) but received {val!r} instead." ) self._colorsource = val @@ -1752,7 +1752,7 @@ def colorscale(self, val): assert val is None or val in self._allowed_colorscales, ( f"The `colorscale` property of {type(self).__name__} must be one of" f"{self._allowed_colorscales},\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._colorscale = val @@ -1765,7 +1765,7 @@ def shownull(self): def shownull(self, val): assert val is None or isinstance(val, bool), ( f"The `shownull` property of {type(self).__name__} must be either True or False," - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._shownull = val @@ -1779,7 +1779,7 @@ def symbol(self, val): assert val is None or val in self._allowed_symbols, ( f"The `symbol` property of {type(self).__name__} must be one of" f"{self._allowed_symbols},\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._symbol = val @@ -1793,7 +1793,7 @@ def sizemode(self, val): assert val is None or val in self._allowed_sizemodes, ( f"The `sizemode` property of {type(self).__name__} must be one of" f"{self._allowed_sizemodes},\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._sizemode = val diff --git a/tests/test_display_utility.py b/tests/test_display_utility.py index a6e490091..88457c3e4 100644 --- a/tests/test_display_utility.py +++ b/tests/test_display_utility.py @@ -9,9 +9,11 @@ import pyvista import magpylib as magpy -from magpylib._src.display.traces_utility import draw_arrow_from_vertices -from magpylib._src.display.traces_utility import get_orientation_from_vec -from magpylib._src.display.traces_utility import merge_scatter3d +from magpylib._src.display.traces_utility import ( + draw_arrow_from_vertices, + get_orientation_from_vec, + merge_scatter3d, +) from magpylib._src.exceptions import MagpylibBadUserInput From c732ef3ed65202d05a9bb6e4ac344c7652b7b5e5 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 29 Apr 2025 15:53:48 +0200 Subject: [PATCH 148/211] linting --- .../_src/display/backend_matplotlib.py | 10 +++-- src/magpylib/_src/display/backend_pyvista.py | 6 +-- src/magpylib/_src/display/display.py | 22 ++++++----- src/magpylib/_src/display/traces_base.py | 13 +++++-- src/magpylib/_src/display/traces_core.py | 36 ++++++++++-------- src/magpylib/_src/display/traces_generic.py | 38 ++++++++++--------- src/magpylib/_src/display/traces_utility.py | 14 ++++--- src/magpylib/_src/style.py | 12 +++--- tests/test_display_utility.py | 8 ++-- 9 files changed, 91 insertions(+), 68 deletions(-) diff --git a/src/magpylib/_src/display/backend_matplotlib.py b/src/magpylib/_src/display/backend_matplotlib.py index a5b8c8421..36d791dcf 100644 --- a/src/magpylib/_src/display/backend_matplotlib.py +++ b/src/magpylib/_src/display/backend_matplotlib.py @@ -17,9 +17,11 @@ from matplotlib import patches from matplotlib.animation import FuncAnimation -from magpylib._src.display.traces_utility import get_trace_kw -from magpylib._src.display.traces_utility import split_input_arrays -from magpylib._src.display.traces_utility import subdivide_mesh_by_facecolor +from magpylib._src.display.traces_utility import ( + get_trace_kw, + split_input_arrays, + subdivide_mesh_by_facecolor, +) from magpylib._src.utility import is_array_like if os.getenv("MAGPYLIB_MPL_SVG") == "true": # pragma: no cover @@ -184,7 +186,7 @@ def scatter_to_matplotlib(trace): if "text" in mode and trace.get("text", False) and len(coords) > 0: txt = trace["text"] txt = [txt] * len(coords[0]) if isinstance(txt, str) else txt - for *coords_s, txt in zip(*coords, txt): + for *coords_s, txt in zip(*coords, txt, strict=False): traces.append({"constructor": "text", "args": (*coords_s, txt)}) return traces diff --git a/src/magpylib/_src/display/backend_pyvista.py b/src/magpylib/_src/display/backend_pyvista.py index 8715cb0b6..4aa3e4ac9 100644 --- a/src/magpylib/_src/display/backend_pyvista.py +++ b/src/magpylib/_src/display/backend_pyvista.py @@ -23,10 +23,8 @@ from matplotlib.colors import LinearSegmentedColormap from pyvista.plotting.colors import Color # pylint: disable=import-error -from magpylib._src.display.traces_utility import get_trace_kw -from magpylib._src.display.traces_utility import split_input_arrays -from magpylib._src.utility import is_array_like -from magpylib._src.utility import open_animation +from magpylib._src.display.traces_utility import get_trace_kw, split_input_arrays +from magpylib._src.utility import is_array_like, open_animation # from magpylib._src.utility import format_obj_input diff --git a/src/magpylib/_src/display/display.py b/src/magpylib/_src/display/display.py index 59f6abb2e..79477976b 100644 --- a/src/magpylib/_src/display/display.py +++ b/src/magpylib/_src/display/display.py @@ -10,16 +10,18 @@ from matplotlib.axes import Axes as mplAxes from matplotlib.figure import Figure as mplFig -from magpylib._src.defaults.defaults_utility import _DefaultValue -from magpylib._src.defaults.defaults_utility import get_defaults_dict -from magpylib._src.display.traces_generic import MagpyMarkers -from magpylib._src.display.traces_generic import get_frames -from magpylib._src.display.traces_utility import DEFAULT_ROW_COL_PARAMS -from magpylib._src.display.traces_utility import process_show_input_objs -from magpylib._src.input_checks import check_format_input_backend -from magpylib._src.input_checks import check_format_input_vector -from magpylib._src.input_checks import check_input_animation -from magpylib._src.input_checks import check_input_canvas_update +from magpylib._src.defaults.defaults_utility import _DefaultValue, get_defaults_dict +from magpylib._src.display.traces_generic import MagpyMarkers, get_frames +from magpylib._src.display.traces_utility import ( + DEFAULT_ROW_COL_PARAMS, + process_show_input_objs, +) +from magpylib._src.input_checks import ( + check_format_input_backend, + check_format_input_vector, + check_input_animation, + check_input_canvas_update, +) from magpylib._src.utility import check_path_format disp_args = set(get_defaults_dict("display")) diff --git a/src/magpylib/_src/display/traces_base.py b/src/magpylib/_src/display/traces_base.py index 0d51d46be..2b7cd8821 100644 --- a/src/magpylib/_src/display/traces_base.py +++ b/src/magpylib/_src/display/traces_base.py @@ -8,9 +8,11 @@ import numpy as np from scipy.spatial import ConvexHull # pylint: disable=no-name-in-module -from magpylib._src.display.traces_utility import draw_zarrow -from magpylib._src.display.traces_utility import merge_mesh3d -from magpylib._src.display.traces_utility import place_and_orient_model3d +from magpylib._src.display.traces_utility import ( + draw_zarrow, + merge_mesh3d, + place_and_orient_model3d, +) from magpylib._src.fields.field_BH_tetrahedron import check_chirality @@ -610,7 +612,10 @@ def make_Tetrahedron( # create triangles implying right vertices chirality triangles = np.array([[0, 2, 1], [0, 3, 2], [1, 3, 0], [1, 2, 3]]) points = check_chirality(np.array([vertices]))[0] - trace = {"type": "mesh3d", **dict(zip("xyzijk", [*points.T, *triangles.T]))} + trace = { + "type": "mesh3d", + **dict(zip("xyzijk", [*points.T, *triangles.T], strict=False)), + } trace = place_and_orient_model3d(trace, orientation=orientation, position=position) return get_model(trace, backend=backend, show=show, scale=scale, kwargs=kwargs) diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index 3803d8ce0..987ad9f7a 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -29,16 +29,18 @@ from magpylib._src.display.traces_base import ( make_TriangularMesh as make_BaseTriangularMesh, ) -from magpylib._src.display.traces_utility import create_null_dim_trace -from magpylib._src.display.traces_utility import draw_arrow_from_vertices -from magpylib._src.display.traces_utility import draw_arrow_on_circle -from magpylib._src.display.traces_utility import get_hexcolors_from_scale -from magpylib._src.display.traces_utility import get_legend_label -from magpylib._src.display.traces_utility import get_orientation_from_vec -from magpylib._src.display.traces_utility import group_traces -from magpylib._src.display.traces_utility import merge_mesh3d -from magpylib._src.display.traces_utility import place_and_orient_model3d -from magpylib._src.display.traces_utility import triangles_area +from magpylib._src.display.traces_utility import ( + create_null_dim_trace, + draw_arrow_from_vertices, + draw_arrow_on_circle, + get_hexcolors_from_scale, + get_legend_label, + get_orientation_from_vec, + group_traces, + merge_mesh3d, + place_and_orient_model3d, + triangles_area, +) from magpylib._src.utility import is_array_like @@ -552,7 +554,9 @@ def make_Pixels( return { "type": "scatter3d", "mode": "markers", - **{"x": x, "y": y, "z": z}, + "x": x, + "y": y, + "z": z, "marker_symbol": symbol, "marker_color": colors, "marker_size": sizes * sizes_2dfactor, @@ -594,7 +598,9 @@ def make_Pixels( if field_symbol == "arrow": x, y, z = pos[:, None] pix = { - **{"x": x, "y": y, "z": z}, + "x": x, + "y": y, + "z": z, "marker_size": [size * sizes_2dfactor], **kw2d, } @@ -654,9 +660,9 @@ def make_Sensor( ) vertices = np.array([sens_mesh[k] for k in "xyz"]).T if style.color is not None: - sens_mesh["facecolor"][ - sens_mesh["facecolor"] == "rgb(238,238,238)" - ] = style.color + sens_mesh["facecolor"][sens_mesh["facecolor"] == "rgb(238,238,238)"] = ( + style.color + ) cube_mask = (abs(vertices) < 1).all(axis=1) vertices[cube_mask] = 0 * vertices[cube_mask] vertices[~cube_mask] = dim_ext * vertices[~cube_mask] diff --git a/src/magpylib/_src/display/traces_generic.py b/src/magpylib/_src/display/traces_generic.py index 7ef0ecfc9..9945c9958 100644 --- a/src/magpylib/_src/display/traces_generic.py +++ b/src/magpylib/_src/display/traces_generic.py @@ -17,20 +17,24 @@ import magpylib as magpy from magpylib._src.defaults.defaults_classes import default_settings -from magpylib._src.defaults.defaults_utility import ALLOWED_LINESTYLES -from magpylib._src.defaults.defaults_utility import ALLOWED_SYMBOLS -from magpylib._src.defaults.defaults_utility import linearize_dict -from magpylib._src.display.traces_utility import draw_arrowed_line -from magpylib._src.display.traces_utility import get_legend_label -from magpylib._src.display.traces_utility import get_objects_props_by_row_col -from magpylib._src.display.traces_utility import get_scene_ranges -from magpylib._src.display.traces_utility import getColorscale -from magpylib._src.display.traces_utility import getIntensity -from magpylib._src.display.traces_utility import group_traces -from magpylib._src.display.traces_utility import path_frames_to_indices -from magpylib._src.display.traces_utility import place_and_orient_model3d -from magpylib._src.display.traces_utility import rescale_traces -from magpylib._src.display.traces_utility import slice_mesh_from_colorscale +from magpylib._src.defaults.defaults_utility import ( + ALLOWED_LINESTYLES, + ALLOWED_SYMBOLS, + linearize_dict, +) +from magpylib._src.display.traces_utility import ( + draw_arrowed_line, + get_legend_label, + get_objects_props_by_row_col, + get_scene_ranges, + getColorscale, + getIntensity, + group_traces, + path_frames_to_indices, + place_and_orient_model3d, + rescale_traces, + slice_mesh_from_colorscale, +) from magpylib._src.style import DefaultMarkers from magpylib._src.utility import ( format_obj_input, @@ -993,11 +997,11 @@ def get_frames(objs, *, title, supports_colorgradient, backend, **kwargs): rc_params = None with style_temp_edit(*styles, styles_temp=styles): field_by_sens = get_sensor_pixel_field(list(props["objects"])) - for frame, path_ind in zip(frames, path_indices): + for frame, path_ind in zip(frames, path_indices, strict=False): if is_animation: style_kwargs["style_path_frames"] = [path_ind] title = "Animation 3D - " if title is None else title - title_str = f"""{title}path index: {path_ind+1:0{path_digits}d}""" + title_str = f"""{title}path index: {path_ind + 1:0{path_digits}d}""" traces, extra_backend_traces, rc_params = draw_frame( props, field_by_sens=field_by_sens, @@ -1017,7 +1021,7 @@ def get_frames(objs, *, title, supports_colorgradient, backend, **kwargs): ] zoom = {rc: v["rc_params"]["zoom"] for rc, v in objs_rc.items()} ranges_rc = get_scene_ranges(*all_traces, zoom=zoom) - labels_rc = {(1, 1): {k: "" for k in "xyz"}} + labels_rc = {(1, 1): dict.fromkeys("xyz", "")} scale_factors_rc = {} for rc, props in objs_rc.items(): params = props["rc_params"] diff --git a/src/magpylib/_src/display/traces_utility.py b/src/magpylib/_src/display/traces_utility.py index cc30a53e5..3e4ce9d52 100644 --- a/src/magpylib/_src/display/traces_utility.py +++ b/src/magpylib/_src/display/traces_utility.py @@ -17,9 +17,11 @@ from magpylib._src.defaults.defaults_utility import linearize_dict from magpylib._src.input_checks import check_input_zoom from magpylib._src.style import get_style -from magpylib._src.utility import format_obj_input -from magpylib._src.utility import is_array_like -from magpylib._src.utility import merge_dicts_with_conflict_check +from magpylib._src.utility import ( + format_obj_input, + is_array_like, + merge_dicts_with_conflict_check, +) DEFAULT_ROW_COL_PARAMS = { "row": 1, @@ -213,7 +215,9 @@ def draw_zarrow( anchor = ( (0, -0.5, 0) if pivot == "tip" - else (0, 0.5, 0) if pivot == "tail" else (0, 0, 0) + else (0, 0.5, 0) + if pivot == "tail" + else (0, 0, 0) ) arrow = [ [0, 0, shift], @@ -953,7 +957,7 @@ def split_input_arrays(*input_arrays, ordered=True): input_arrays = [ [inp] * max_length if not is_array_like(inp) else inp for inp in input_arrays ] - input_array = list(zip(*input_arrays)) + input_array = list(zip(*input_arrays, strict=False)) if ordered: input_split = [] prev_inp = next(iter(input_array)) diff --git a/src/magpylib/_src/style.py b/src/magpylib/_src/style.py index db2b4e91c..f6a050115 100644 --- a/src/magpylib/_src/style.py +++ b/src/magpylib/_src/style.py @@ -1717,7 +1717,7 @@ def vectorsource(self, val): assert val is None or val in self._allowed_vectorsources, ( f"The `vectorsource` property of {type(self).__name__} must be one of" f"{self._allowed_vectorsources},\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._vectorsource = val @@ -1738,7 +1738,7 @@ def colorsource(self, val): assert valid, ( f"The `colorsource` property of {type(self).__name__} must be None or False or start" f" with either {self._allowed_vectorsources} and be followed by a combination of" - f" 'x', 'y', 'z' (e.g. 'Bxy' or ('Bxy', 'Bz') ) but received {repr(val)} instead." + f" 'x', 'y', 'z' (e.g. 'Bxy' or ('Bxy', 'Bz') ) but received {val!r} instead." ) self._colorsource = val @@ -1752,7 +1752,7 @@ def colorscale(self, val): assert val is None or val in self._allowed_colorscales, ( f"The `colorscale` property of {type(self).__name__} must be one of" f"{self._allowed_colorscales},\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._colorscale = val @@ -1765,7 +1765,7 @@ def shownull(self): def shownull(self, val): assert val is None or isinstance(val, bool), ( f"The `shownull` property of {type(self).__name__} must be either True or False," - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._shownull = val @@ -1779,7 +1779,7 @@ def symbol(self, val): assert val is None or val in self._allowed_symbols, ( f"The `symbol` property of {type(self).__name__} must be one of" f"{self._allowed_symbols},\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._symbol = val @@ -1793,7 +1793,7 @@ def sizemode(self, val): assert val is None or val in self._allowed_sizemodes, ( f"The `sizemode` property of {type(self).__name__} must be one of" f"{self._allowed_sizemodes},\n" - f"but received {repr(val)} instead." + f"but received {val!r} instead." ) self._sizemode = val diff --git a/tests/test_display_utility.py b/tests/test_display_utility.py index a6e490091..88457c3e4 100644 --- a/tests/test_display_utility.py +++ b/tests/test_display_utility.py @@ -9,9 +9,11 @@ import pyvista import magpylib as magpy -from magpylib._src.display.traces_utility import draw_arrow_from_vertices -from magpylib._src.display.traces_utility import get_orientation_from_vec -from magpylib._src.display.traces_utility import merge_scatter3d +from magpylib._src.display.traces_utility import ( + draw_arrow_from_vertices, + get_orientation_from_vec, + merge_scatter3d, +) from magpylib._src.exceptions import MagpylibBadUserInput From 23d1d11a5f4dd26d9e5190a66c83446b35fc7d91 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 29 Apr 2025 16:13:24 +0200 Subject: [PATCH 149/211] remove binder --- .binder/apt.txt | 2 -- .binder/labconfig/default_setting_overrides.json | 8 -------- .binder/postBuild | 6 ------ .binder/requirements.txt | 1 - .binder/start | 10 ---------- 5 files changed, 27 deletions(-) delete mode 100644 .binder/apt.txt delete mode 100644 .binder/labconfig/default_setting_overrides.json delete mode 100644 .binder/postBuild delete mode 100644 .binder/requirements.txt delete mode 100644 .binder/start diff --git a/.binder/apt.txt b/.binder/apt.txt deleted file mode 100644 index e5f2b6eb1..000000000 --- a/.binder/apt.txt +++ /dev/null @@ -1,2 +0,0 @@ -libgl1-mesa-dev -xvfb diff --git a/.binder/labconfig/default_setting_overrides.json b/.binder/labconfig/default_setting_overrides.json deleted file mode 100644 index 84c367341..000000000 --- a/.binder/labconfig/default_setting_overrides.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "@jupyterlab/docmanager-extension:plugin": { - "defaultViewers": { - "markdown": "Jupytext Notebook", - "myst": "Jupytext Notebook" - } - } -} diff --git a/.binder/postBuild b/.binder/postBuild deleted file mode 100644 index 2514e5133..000000000 --- a/.binder/postBuild +++ /dev/null @@ -1,6 +0,0 @@ -# Stop everything if one command fails -set -e - -# See https://github.com/mwouts/jupytext/issues/803#issuecomment-982170660 -mkdir -p ${HOME}/.jupyter/labconfig -cp .binder/labconfig/* ${HOME}/.jupyter/labconfig diff --git a/.binder/requirements.txt b/.binder/requirements.txt deleted file mode 100644 index e9704b8eb..000000000 --- a/.binder/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -.[docs] diff --git a/.binder/start b/.binder/start deleted file mode 100644 index ba526b95f..000000000 --- a/.binder/start +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -set -x -export DISPLAY=:99.0 -export PYVISTA_OFF_SCREEN=true -export PYVISTA_USE_IPYVTK=true -which Xvfb -Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & -sleep 3 -set +x -exec "$@" From f57893a9f888aa356b58cce83ba06664878c969a Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 29 Apr 2025 16:19:31 +0200 Subject: [PATCH 150/211] linting --- src/magpylib/_src/display/backend_matplotlib.py | 5 +++-- src/magpylib/_src/display/backend_pyvista.py | 17 ++++++++--------- src/magpylib/_src/display/traces_core.py | 3 ++- src/magpylib/_src/display/traces_generic.py | 6 +++--- src/magpylib/_src/display/traces_utility.py | 6 +++--- src/magpylib/_src/style.py | 4 ++-- src/magpylib/_src/utility.py | 2 +- 7 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/magpylib/_src/display/backend_matplotlib.py b/src/magpylib/_src/display/backend_matplotlib.py index 36d791dcf..b674b4aa5 100644 --- a/src/magpylib/_src/display/backend_matplotlib.py +++ b/src/magpylib/_src/display/backend_matplotlib.py @@ -89,7 +89,7 @@ def legend_artist(self, legend, orig_handle, fontsize, handlebox): # noqa: ARG0 def mesh3d_to_matplotlib(trace, antialiased): """Convert mesh3d trace input to a list of plot_trisurf constructor dicts Note: plot_trisurf does not accept different facecolors on the same trace - so they need to be splitted into multiple traces + so they need to be split into multiple traces """ traces = [] subtraces = [trace] @@ -199,7 +199,8 @@ def generic_trace_to_matplotlib(trace, antialiased=True): elif trace["type"] in ("scatter", "scatter3d"): traces_mpl.extend(scatter_to_matplotlib(trace)) else: # pragma: no cover - raise ValueError(f"{trace['type']!r} trace type conversion not supported") + msg = f"{trace['type']!r} trace type conversion not supported" + raise ValueError(msg) for tr in traces_mpl: tr["row"] = trace.get("row", 1) tr["col"] = trace.get("col", 1) diff --git a/src/magpylib/_src/display/backend_pyvista.py b/src/magpylib/_src/display/backend_pyvista.py index 4aa3e4ac9..11eb836a9 100644 --- a/src/magpylib/_src/display/backend_pyvista.py +++ b/src/magpylib/_src/display/backend_pyvista.py @@ -207,20 +207,19 @@ def generic_trace_to_pyvista(trace): elif trace["type"] in ("scatter", "scatter3d"): traces_pv.extend(scatter_to_pyvista(trace)) else: # pragma: no cover - msg = f"Trace type {trace['type']!r} cannot be transformed into pyvista trace" + msg = f"{trace['type']!r} trace type conversion not supported" raise ValueError(msg) showlegend = trace.get("showlegend", False) for tr in traces_pv: tr["row"] = trace.get("row", 1) - 1 tr["col"] = trace.get("col", 1) - 1 - if tr["type"] != "point_labels": - if showlegend: - showlegend = False # show only first subtrace - if "label" not in tr: - tr["label"] = trace.get("name", "") - leg_title = trace.get("legendgrouptitle_text", None) - if leg_title is not None: - tr["label"] += f" ({leg_title})" + if tr["type"] != "point_labels" and showlegend: + showlegend = False # show only first subtrace + if "label" not in tr: + tr["label"] = trace.get("name", "") + leg_title = trace.get("legendgrouptitle_text", None) + if leg_title is not None: + tr["label"] += f" ({leg_title})" if not tr.get("label", ""): tr.pop("label", None) return traces_pv diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index 987ad9f7a..9c2a81fb1 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -566,10 +566,11 @@ def make_Pixels( is_null_vec = None allowed_symbols = ("cone", "arrow", "arrow3d") if field_symbol not in allowed_symbols: # pragma: no cover - raise ValueError( + msg = ( f"Invalid pixel field symbol (must be one of {allowed_symbols})" f", got {field_symbol!r}" ) + raise ValueError(msg) if vectors is not None: orientations = get_orientation_from_vec(vectors) is_null_vec = (np.abs(vectors) < null_thresh).all(axis=1) diff --git a/src/magpylib/_src/display/traces_generic.py b/src/magpylib/_src/display/traces_generic.py index 9945c9958..e18438f30 100644 --- a/src/magpylib/_src/display/traces_generic.py +++ b/src/magpylib/_src/display/traces_generic.py @@ -492,8 +492,7 @@ def get_generic_traces3D( def make_func(*args, **kwargs): out = get_trace_method(*args, **kwargs) # can return multiple traces - out = list(out) if isinstance(out, (list, tuple)) else [out] - return out + return list(out) if isinstance(out, list | tuple) else [out] else: make_func = None @@ -965,7 +964,8 @@ def get_frames(objs, *, title, supports_colorgradient, backend, **kwargs): kwargs = {k: v for k, v in kwargs.items() if not k.startswith("animation")} if kwargs: - raise TypeError(f"`show` got unexpected keyword argument(s) {kwargs!r}") + msg = f"`show` got unexpected keyword argument(s) {kwargs!r}" + raise TypeError(msg) # infer title if necessary if objs: diff --git a/src/magpylib/_src/display/traces_utility.py b/src/magpylib/_src/display/traces_utility.py index 3e4ce9d52..9be5b5967 100644 --- a/src/magpylib/_src/display/traces_utility.py +++ b/src/magpylib/_src/display/traces_utility.py @@ -230,8 +230,7 @@ def draw_zarrow( arrow = [[0, 0, -0.5], *arrow, [0, 0, 0.5]] else: arrow = [[0, 0, -0.5], [np.nan] * 3, *arrow, [np.nan] * 3, [0, 0, 0.5]] - arrow = (np.array(arrow) + np.array(anchor)) * height - return arrow + return (np.array(arrow) + np.array(anchor)) * height def draw_arrowed_line( @@ -347,7 +346,8 @@ def path_frames_to_indices(frames, path_len): elif hasattr(frames, "__iter__") and not isinstance(frames, str): inds = np.array(frames) else: # pragma: no cover - raise ValueError(f"Invalid show_path value ({frames})") + msg = f"Invalid show_path value ({frames})" + raise ValueError(msg) inds = inds[inds < path_len] if inds.size == 0: inds = np.array([path_len - 1]) diff --git a/src/magpylib/_src/style.py b/src/magpylib/_src/style.py index f6a050115..a3f3de87c 100644 --- a/src/magpylib/_src/style.py +++ b/src/magpylib/_src/style.py @@ -1662,7 +1662,7 @@ class PixelField(MagicProperties): The pixel orientation vector source (one of "B", "H", "M", "J") colorsource: str, default=None - The pixel color source (e.g. "Bx", "Hxy", "J", etc.). If not specfied, + The pixel color source (e.g. "Bx", "Hxy", "J", etc.). If not specified, the amplitude of the `vectorsource` value is used. colorscale: str, default="Inferno", @@ -1675,7 +1675,7 @@ class PixelField(MagicProperties): Orientation symbol for field vector. sizemode: {"constant", "linear", "log"} - Symbol size mode releative the the field magnitude. + Symbol size mode relative the the field magnitude. """ _allowed_vectorsources = ("B", "H", "J", "M") diff --git a/src/magpylib/_src/utility.py b/src/magpylib/_src/utility.py index 4526ee3a6..222b35242 100644 --- a/src/magpylib/_src/utility.py +++ b/src/magpylib/_src/utility.py @@ -518,4 +518,4 @@ def style_temp_edit(*objs, styles_temp=None): def is_array_like(inp): """Return boolean on wether input is an array, list or tuple""" - return isinstance(inp, (list, tuple, np.ndarray)) + return isinstance(inp, list | tuple | np.ndarray) From f5eadaffb7f9bca81a0fca920e3a2eb55d967016 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 29 Apr 2025 16:37:33 +0200 Subject: [PATCH 151/211] lint --- pyproject.toml | 1 + src/magpylib/_src/display/backend_matplotlib.py | 8 ++++---- src/magpylib/_src/display/traces_core.py | 1 + src/magpylib/_src/display/traces_generic.py | 11 ++++++----- src/magpylib/_src/display/traces_utility.py | 6 +++--- src/magpylib/_src/style.py | 4 ++-- src/magpylib/_src/utility.py | 2 +- 7 files changed, 18 insertions(+), 15 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 1e87d5cae..5e4905fec 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -139,6 +139,7 @@ disallow_incomplete_defs = true [tool.ruff] +target-version = "py311" [tool.ruff.lint] extend-select = [ diff --git a/src/magpylib/_src/display/backend_matplotlib.py b/src/magpylib/_src/display/backend_matplotlib.py index b674b4aa5..20eb8c66a 100644 --- a/src/magpylib/_src/display/backend_matplotlib.py +++ b/src/magpylib/_src/display/backend_matplotlib.py @@ -153,8 +153,8 @@ def scatter_to_matplotlib(trace): # plot the marker part with `scatter` constructor if "markers" in mode: - for (msymb,), inds in split_input_arrays(marker_symbol, ordered=False): - msymb = SYMBOLS_TO_MATPLOTLIB.get(msymb, msymb) + for (msymb_item,), inds in split_input_arrays(marker_symbol, ordered=False): + msymb = SYMBOLS_TO_MATPLOTLIB.get(msymb_item, msymb_item) kw = {"s": marker_size, "color": marker_color} for k, v in kw.items(): if is_array_like(v): @@ -186,8 +186,8 @@ def scatter_to_matplotlib(trace): if "text" in mode and trace.get("text", False) and len(coords) > 0: txt = trace["text"] txt = [txt] * len(coords[0]) if isinstance(txt, str) else txt - for *coords_s, txt in zip(*coords, txt, strict=False): - traces.append({"constructor": "text", "args": (*coords_s, txt)}) + for *coords_s, t in zip(*coords, txt, strict=False): + traces.append({"constructor": "text", "args": (*coords_s, t)}) return traces diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index 9c2a81fb1..ef6d4c88d 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -8,6 +8,7 @@ from __future__ import annotations import warnings +from collections.abc import Dict from itertools import cycle from typing import Any diff --git a/src/magpylib/_src/display/traces_generic.py b/src/magpylib/_src/display/traces_generic.py index e18438f30..96ddc4e56 100644 --- a/src/magpylib/_src/display/traces_generic.py +++ b/src/magpylib/_src/display/traces_generic.py @@ -533,7 +533,8 @@ def get_traces_func(**extra_kwargs): traces_generic_temp = [] if style.model3d.showdefault and make_func is not None: p_trs = make_func(**make_func_kwargs, **extra_kwargs) - for p_tr in p_trs: + for p_tr_item in p_trs: + p_tr = p_tr_item.copy() is_mag = p_tr.pop("ismagnet", is_mag) if is_mag and p_tr.get("type", "") == "mesh3d": p_tr = update_magnet_mesh( @@ -810,8 +811,8 @@ def get_traces_3D(flat_objs_props, extra_backend=False, autosize=None, **kwargs) extra_backend_traces = [] traces_dict = {} field_by_sens = kwargs.pop("field_by_sens", {}) - for obj, params in flat_objs_props.items(): - params = {**params, **kwargs} + for obj, params_item in flat_objs_props.items(): + params = {**params_item, **kwargs} if autosize is None and getattr(obj, "_autosize", False): # temporary coordinates to be able to calculate ranges # pylint: disable=protected-access @@ -882,7 +883,7 @@ def get_sensor_pixel_field(objects): return field_by_sens -def draw_frame(objs, *, rc_params, style_kwargs, **kwargs) -> Tuple: +def draw_frame(objs, *, rc_params, style_kwargs, **kwargs): """ Creates traces from input `objs` and provided parameters, updates the size of objects like Sensors and Dipoles in `kwargs` depending on the canvas size. @@ -992,7 +993,7 @@ def get_frames(objs, *, title, supports_colorgradient, backend, **kwargs): } for path_ind in path_indices ] - for rc, props in objs_rc.items(): + for props in objs_rc.values(): styles = {obj: prop["style"] for obj, prop in props["objects"].items()} rc_params = None with style_temp_edit(*styles, styles_temp=styles): diff --git a/src/magpylib/_src/display/traces_utility.py b/src/magpylib/_src/display/traces_utility.py index 9be5b5967..7ce68fc31 100644 --- a/src/magpylib/_src/display/traces_utility.py +++ b/src/magpylib/_src/display/traces_utility.py @@ -706,8 +706,8 @@ def group_traces(*traces): "mode", ], } - for tr in traces: - tr = linearize_dict(tr, separator="_") + for tr_item in traces: + tr = linearize_dict(tr_item, separator="_") tr_typ = tr["type"] gr = [tr_typ] for k in [*common_keys, *spec_keys.get(tr_typ, [])]: @@ -947,7 +947,7 @@ def split_input_arrays(*input_arrays, ordered=True): """splits input_arrays into chunks of same values. Use case: Unlike plotly, matplotlib and pyvista cannot display line plots with an array of colors. - The argument order=True is necessary for line arrays wher the order is important. + The argument order=True is necessary for line arrays where the order is important. For markers, the order is not important and unique combinations with their respective indices are returned. """ diff --git a/src/magpylib/_src/style.py b/src/magpylib/_src/style.py index a3f3de87c..f2082da3b 100644 --- a/src/magpylib/_src/style.py +++ b/src/magpylib/_src/style.py @@ -1681,7 +1681,7 @@ class PixelField(MagicProperties): _allowed_vectorsources = ("B", "H", "J", "M") _allowed_symbols = ("cone", "arrow", "arrow3d") _allowed_sizemodes = ("constant", "linear", "log") - _allowed_colorscales = [ + _allowed_colorscales = ( "Viridis", "Plasma", "Inferno", @@ -1705,7 +1705,7 @@ class PixelField(MagicProperties): "PuBuGn", "BuGn", "YlGn", - ] + ) @property def vectorsource(self): diff --git a/src/magpylib/_src/utility.py b/src/magpylib/_src/utility.py index 222b35242..1481bde57 100644 --- a/src/magpylib/_src/utility.py +++ b/src/magpylib/_src/utility.py @@ -517,5 +517,5 @@ def style_temp_edit(*objs, styles_temp=None): def is_array_like(inp): - """Return boolean on wether input is an array, list or tuple""" + """Return boolean on whether input is an array, list or tuple""" return isinstance(inp, list | tuple | np.ndarray) From cd8f99c55552f6d008fd018dc3e25f3f48af41e0 Mon Sep 17 00:00:00 2001 From: "Boisselet Alexandre (IFAT DC ATV SC D TE2)" Date: Tue, 29 Apr 2025 16:54:11 +0200 Subject: [PATCH 152/211] pylint --- src/magpylib/_src/display/traces_core.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index ef6d4c88d..bfeff7931 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -8,7 +8,6 @@ from __future__ import annotations import warnings -from collections.abc import Dict from itertools import cycle from typing import Any @@ -538,7 +537,7 @@ def make_Pixels( sizes, marker2d_default_size, null_thresh=1e-12, -) -> Dict[str, Any]: +) -> dict[str, Any]: """ Create the plotly dict for Sensor pixels based on pixel positions and chosen size For now, only "cube" shape is provided. @@ -624,7 +623,7 @@ def make_Pixels( def make_Sensor( obj, *, autosize, path_ind=None, field_values, **kwargs -) -> Dict[str, Any]: +) -> dict[str, Any]: """ Create the plotly mesh3d parameters for a Sensor object in a dictionary based on the provided arguments. From d87b8667811045dce1d3d26381307299368e6c6f Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 6 May 2025 00:41:11 +0200 Subject: [PATCH 153/211] add docs examples --- .../user_guide/examples/examples_index.md | 9 + .../examples/examples_vis_vectorfield.md | 362 ++++++++++++++++++ .../images/examples_icon_vis_vectorfield.png | Bin 0 -> 69178 bytes 3 files changed, 371 insertions(+) create mode 100644 docs/_pages/user_guide/examples/examples_vis_vectorfield.md create mode 100644 docs/_static/images/examples_icon_vis_vectorfield.png diff --git a/docs/_pages/user_guide/examples/examples_index.md b/docs/_pages/user_guide/examples/examples_index.md index 9ccd92131..58bf10f6f 100644 --- a/docs/_pages/user_guide/examples/examples_index.md +++ b/docs/_pages/user_guide/examples/examples_index.md @@ -94,6 +94,14 @@ :img-bottom: ../../../_static/images/examples_icon_vis_pv_streamlines.png ::: +:::{grid-item-card} {ref}`examples-vis-vectorfield` +:text-align: center +:link: examples-vis-vectorfield +:link-type: ref +:link-alt: link to example +:img-bottom: ../../../_static/images/examples_icon_vis_vectorfield.png +::: + :::: @@ -265,6 +273,7 @@ examples_vis_animations.md examples_vis_subplots.md examples_vis_mpl_streamplot.md examples_vis_pv_streamlines.md +examples_vis_vectorfield.md examples_shapes_superpos.md examples_shapes_convex_hull.md diff --git a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md new file mode 100644 index 000000000..0817bb175 --- /dev/null +++ b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md @@ -0,0 +1,362 @@ +--- +jupytext: + formats: md:myst + text_representation: + extension: .md + format_name: myst + format_version: 0.13 + jupytext_version: 1.17.1 +kernelspec: + name: python3 + display_name: Python 3 (ipykernel) + language: python +--- + +:::{versionadded} 5.2 +Pixel Vector Field +::: + +The `Sensor` object with its `pixel` can be conveniently used for visualizing vector fields! +With this new capability, you can display the vector field for `"B"`, `"H"`, `"M"`, or `"J"` and overlay a magnitude (e.g., `"Bxy"`, `"Hz"`, etc.). + +This notebook provides examples of how to use these features effectively, along with explanations of the relevant parameters. + + +# Parameter Overview + +## `style.pixel.field` Parameters + +- **`vectorsource`** (default=`None`): Defines the field source for vector visualization: + - `None`: No field direction is shown. + - `"B"`, `"H"`, `"J"`, `"M"`: Corresponding field vectors are displayed. + +- **`colorsource`** (default=`None`): Defines the field source for the color scale: + - `None`: Field magnitude coloring is taken from the `vectorsource` input and shown via the magnitude of individual pixels. + - `"B"`, `"Hxy"`, `"Jxyz"`, etc.: Corresponding field magnitude is shown via magnitude coloring of individual pixels. + - `False`: No magnitude coloring is applied. Symbols are displayed with `pixel.color` if defined, otherwise `"black"`. + +- **`symbol`** (default=`"cone"`): Defines the symbol used to represent valid and non-null vectors: + - `"cone"`: 3D cone representation. + - `"arrow3d"`: 3D arrow representation. + - `"arrow"`: 3D line representation. + - Null or invalid vectors are displayed as: + - A point (when `field.symbol` is `"arrow"`). + - A cuboid pixel (when `field.symbol` is `"cone"` or `"arrow3d"`). + +- **`shownull`** (default=`True`): Toggles the visibility of null vectors: + - `True`: Null vectors are displayed. + - `False`: Null vectors are hidden. + +- **`sizemode`** (default=`"constant"`): Defines how arrows are sized relative to the `vectorsource` magnitude: + - `"constant"`: Uniform size. + - `"linear"`: Proportional to the magnitude. + - `"log"`: Proportional to the normalized logarithm of the magnitude. + + +## Additional Features + +- **Color Scales**: Supports predefined color scales (e.g., `"Viridis"`, `"Inferno"`, `"Jet"`) or which are common to both `Plotly` and `Matplotlib`. +- **Normalization**: Field vectors and magnitude normalization are applied per sensor path for each sensor individually. +- **`style.pixel.symbol`** (default=`None`): Accepts valid scatter symbols (e.g., `"."`). Only applies if `pixel.field.vectorsource` is `None` or for invalid/null vectors. +- **Pixel Hulls**: Hulls over pixels are shown only if no field values are provided. +- **Backend Compatibility**: Works seamlessly with all supported backends: + - Matplotlib + - Plotly + - PyVista + ++++ + +# Examples + +## Animated B-field + +```{note} +Default is `"cone"` (can be set globally like any other style). +``` + +```{code-cell} ipython3 +:tags: [hide-input] + +import numpy as np + +import magpylib as magpy + +path_len = 51 +pix_per_dim = 12 + +c1 = magpy.magnet.Cuboid(polarization=(0, 0, 1), dimension=(1, 1, 1), style_opacity=0.2) +c1.rotate_from_angax(np.linspace(0, 180, path_len), "z", start=0) +c1.rotate_from_angax(np.linspace(0, 180, path_len), "x", start=0) + +ls = np.linspace(-1, 1, pix_per_dim) +s1 = magpy.Sensor(pixel=[[x, y, 0] for x in ls for y in ls], position=(0, 0, 0)) + +magpy.show( + c1, + s1, + animation=True, + style_pixel_field_symbol="arrow3d", + style_pixel_field_vectorsource="B", +) +``` + +## Display B, H, J, or M Field + +```{note} +Null or NaN field values are not displayed via a directional symbol but are visible by default. +``` + +```{code-cell} ipython3 +:tags: [hide-input] + +import numpy as np + +import magpylib as magpy + +path_len = 1 +pix_per_dim = 10 + +c1 = magpy.magnet.Cuboid( + polarization=(1, 0, 0), + dimension=(1, 1, 1), + style_opacity=0.2, +) +ls = np.linspace(-1, 1, pix_per_dim) +s0 = magpy.Sensor( + pixel=[[x, y, 0] for x in ls for y in ls], + position=(0, 0, 0), +) +objects = [] +for i, vectorsource in enumerate("BHJM"): + s1 = s0.copy( + style_pixel_field_vectorsource=vectorsource, + ) + s1.style.label = f"{vectorsource}-field" + objects.append({"objects": (c1, s1), "col": i + 1}) + +magpy.show( + *objects, + style_arrows_x_show=False, + style_arrows_y_show=False, + style_arrows_z_show=False, +) +``` + +## Display Field Magnitude via Coloring + +```{note} +Field coloring can be set independently of the field vector source. If not specified, it refers to the vector source magnitude. If set to `False`, no coloring is used, and symbols are displayed in black. +``` + +```{code-cell} ipython3 +:tags: [hide-input] + +import numpy as np + +import magpylib as magpy + +path_len = 1 +pix_per_dim = 10 + +c1 = magpy.magnet.Cuboid( + polarization=(1, 0, 0), + dimension=(1, 1, 1), + style_opacity=0.2, +) +ls = np.linspace(-1, 1, pix_per_dim) +s0 = magpy.Sensor( + pixel=[[x, y, 0] for x in ls for y in ls], + position=(0, 0, 0), +) +objects = [] +for i, colorsource in enumerate(("H", "Jxy", "Bz", False)): + s1 = s0.copy( + style_pixel_field_vectorsource="B", + style_pixel_field_colorsource=colorsource, + ) + s1.style.label = f"B-field, color: {colorsource}" + objects.append({"objects": (c1, s1), "col": i + 1}) + +magpy.show( + *objects, + style_arrows_x_show=False, + style_arrows_y_show=False, + style_arrows_z_show=False, +) +``` + +## Use Different Directional Symbols + +```{note} +Default is `"cone"` (can be set globally like any other style). +``` + +```{code-cell} ipython3 +:tags: [hide-input] + +import numpy as np + +import magpylib as magpy + +path_len = 1 +pix_per_dim = 10 + +c1 = magpy.magnet.Cuboid( + polarization=(1, 0, 0), + dimension=(1, 1, 1), + style_opacity=0.2, +) +ls = np.linspace(-1, 1, pix_per_dim) +s0 = magpy.Sensor( + pixel=[[x, y, 0] for x in ls for y in ls], + position=(0, 0, 0), +) +objects = [] +for i, symbol in enumerate(("cone", "arrow3d", "arrow")): + s1 = s0.copy( + style_pixel_field_vectorsource="B", + style_pixel_field_symbol=symbol, + ) + s1.style.label = f"B-field, symbol: {symbol}" + objects.append({"objects": (c1, s1), "col": i + 1}) + +magpy.show( + *objects, + style_arrows_x_show=False, + style_arrows_y_show=False, + style_arrows_z_show=False, +) +``` + +## Set the Sizing Modes of Directional Symbols + +```{note} +Default is `"constant"` (can be set globally like any other style). +Like for coloring, sizing is normalized for the min-max values of the field values over the whole sensor path, but for each sensor individually. +``` + +```{code-cell} ipython3 +:tags: [hide-input] + +import numpy as np + +import magpylib as magpy + +path_len = 1 +pix_per_dim = 10 + +c1 = magpy.magnet.Cuboid( + polarization=(1, 0, 0), + dimension=(1, 1, 1), + style_opacity=0.2, +) +ls = np.linspace(-1, 1, pix_per_dim) +s0 = magpy.Sensor( + pixel=[[x, y, 0] for x in ls for y in ls], + position=(0, 0, 0), +) +objects = [] +for i, sizemode in enumerate(("constant", "log", "linear")): + s1 = s0.copy( + style_pixel_field_vectorsource="B", + style_pixel_field_sizemode=sizemode, + ) + s1.style.label = f"B-field, sizemode: {sizemode}" + objects.append({"objects": (c1, s1), "col": i + 1}) + +magpy.show( + *objects, + style_arrows_x_show=False, + style_arrows_y_show=False, + style_arrows_z_show=False, +) +``` + +## Edge Cases: Hide `Null` or `NaN` Values + +```{note} +Null and NaN values are treated the same. These pixels can be hidden if desired. +``` + +```{code-cell} ipython3 +:tags: [hide-input] + +import numpy as np + +import magpylib as magpy + +path_len = 1 +pix_per_dim = 5 + +c1 = magpy.magnet.Cuboid( + polarization=(1, 0, 0), + dimension=(1, 1, 1), + style_opacity=0.2, +) +ls = np.linspace(-1, 1, pix_per_dim) +s0 = magpy.Sensor( + pixel=[[x, y, 0] for x in ls for y in ls], + position=(0, 0, 0), +) +objects = [] +col = 0 +for vectorsource in "BJ": + for shownull in (True, False): + col += 1 + s1 = s0.copy( + style_pixel_field_vectorsource=vectorsource, + style_pixel_field_shownull=shownull, + ) + s1.style.label = f"{vectorsource}-field, shownull: {shownull}" + objects.append({"objects": (c1, s1), "col": col}) + +magpy.show( + *objects, + style_arrows_x_show=False, + style_arrows_y_show=False, + style_arrows_z_show=False, +) +``` + +## Color Scales + +```{note} +Other color scales are available (a curated list of common sequential colors between Matplotlib and Plotly). +``` + +```{code-cell} ipython3 +:tags: [hide-input] + +import numpy as np + +import magpylib as magpy + +path_len = 1 +pix_per_dim = 10 + +c1 = magpy.magnet.Cuboid( + polarization=(1, 0, 0), + dimension=(1, 1, 1), + style_opacity=0.2, +) +ls = np.linspace(-1, 1, pix_per_dim) +s0 = magpy.Sensor( + pixel=[[x, y, 1] for x in ls for y in ls], + position=(0, 0, 0), +) +objects = [] +for i, colorscale in enumerate(("Viridis", "Inferno", "Oranges", "RdPu", "Greys")): + s1 = s0.copy( + style_pixel_field_vectorsource="B", + style_pixel_field_colorscale=colorscale, + ) + s1.style.label = f"B-field, colorscale: {colorscale}" + objects.append({"objects": (c1, s1), "col": i + 1}) + +magpy.show( + *objects, + style_arrows_x_show=False, + style_arrows_y_show=False, + style_arrows_z_show=False, +) +``` diff --git a/docs/_static/images/examples_icon_vis_vectorfield.png b/docs/_static/images/examples_icon_vis_vectorfield.png new file mode 100644 index 0000000000000000000000000000000000000000..8b9dfd401297302134ae7cf6ad450162658ee544 GIT binary patch literal 69178 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 M07*qoM6N<$f-4YwVE_OC literal 0 HcmV?d00001 From 70da7433a51a35af361bea472c3a86b9044cc311 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 6 May 2025 00:50:34 +0200 Subject: [PATCH 154/211] update changelog --- CHANGELOG.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee98a5d3a..d108f4f0a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,12 +2,13 @@ ## [Unreleased] - YYYY-MM-DD +- Added new `style.pixel.field` parameters to quickly represent vector fields ([#793](https://github.com/magpylib/magpylib/pull/793)) +- Input `in_out` is now by default set to `"auto"` for collections to avoiding + ambiguities. +- Fixed a bug where a core getH would return the B-field - Improved docstrings by adding examples where missing and by using rounding in all examples to avoid doctest fails -- Fixed a bug where a core getH would return the B-field -- Input `in_out` is by default set to `"auto"` for collections to avoiding - ambiguities. -- Improve documentation +- Improved documentation ([#829](https://github.com/magpylib/magpylib/issues/829)) ## [5.1.1] - 2024-10-31 From 8cb9572dc8bb148bc074ad56e68f367fbcbafb26 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 5 May 2025 22:50:54 +0000 Subject: [PATCH 155/211] style: pre-commit fixes --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d108f4f0a..398e030ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,8 @@ ## [Unreleased] - YYYY-MM-DD -- Added new `style.pixel.field` parameters to quickly represent vector fields ([#793](https://github.com/magpylib/magpylib/pull/793)) +- Added new `style.pixel.field` parameters to quickly represent vector fields + ([#793](https://github.com/magpylib/magpylib/pull/793)) - Input `in_out` is now by default set to `"auto"` for collections to avoiding ambiguities. - Fixed a bug where a core getH would return the B-field From 794973c9190db226130d9b7eae19a005bb4bfd1b Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 6 May 2025 01:15:04 +0200 Subject: [PATCH 156/211] fix links --- docs/_pages/user_guide/examples/examples_vis_vectorfield.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md index 0817bb175..29166b889 100644 --- a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md +++ b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md @@ -12,6 +12,11 @@ kernelspec: language: python --- +(examples-vis-vectorfield)= + +# Pixel Vector Field + + :::{versionadded} 5.2 Pixel Vector Field ::: From fbc5b132ad13886cef24f0f43747f7f3c4c8978d Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 6 May 2025 01:16:20 +0200 Subject: [PATCH 157/211] change examples depth --- docs/_pages/user_guide/guide_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_pages/user_guide/guide_index.md b/docs/_pages/user_guide/guide_index.md index a63482e3d..c75ebae78 100644 --- a/docs/_pages/user_guide/guide_index.md +++ b/docs/_pages/user_guide/guide_index.md @@ -23,7 +23,7 @@ docs/docs_magpylib_force.md ``` ```{toctree} -:maxdepth: 2 +:maxdepth: 1 :caption: Resources guide_resources_01_physics.md examples/examples_index.md From a527f90b861315d91bcc31b23845dcf9bd00ccc7 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 6 May 2025 01:24:10 +0200 Subject: [PATCH 158/211] fix numbering --- .../examples/examples_vis_vectorfield.md | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md index 29166b889..55ba88e7f 100644 --- a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md +++ b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md @@ -27,9 +27,9 @@ With this new capability, you can display the vector field for `"B"`, `"H"`, `"M This notebook provides examples of how to use these features effectively, along with explanations of the relevant parameters. -# Parameter Overview +## Parameter Overview -## `style.pixel.field` Parameters +### `style.pixel.field` Parameters - **`vectorsource`** (default=`None`): Defines the field source for vector visualization: - `None`: No field direction is shown. @@ -58,7 +58,7 @@ This notebook provides examples of how to use these features effectively, along - `"log"`: Proportional to the normalized logarithm of the magnitude. -## Additional Features +### Additional Features - **Color Scales**: Supports predefined color scales (e.g., `"Viridis"`, `"Inferno"`, `"Jet"`) or which are common to both `Plotly` and `Matplotlib`. - **Normalization**: Field vectors and magnitude normalization are applied per sensor path for each sensor individually. @@ -71,9 +71,9 @@ This notebook provides examples of how to use these features effectively, along +++ -# Examples +## Examples -## Animated B-field +### Animated B-field ```{note} Default is `"cone"` (can be set globally like any other style). @@ -105,7 +105,7 @@ magpy.show( ) ``` -## Display B, H, J, or M Field +### Display B, H, J, or M Field ```{note} Null or NaN field values are not displayed via a directional symbol but are visible by default. @@ -147,7 +147,7 @@ magpy.show( ) ``` -## Display Field Magnitude via Coloring +### Display Field Magnitude via Coloring ```{note} Field coloring can be set independently of the field vector source. If not specified, it refers to the vector source magnitude. If set to `False`, no coloring is used, and symbols are displayed in black. @@ -190,7 +190,7 @@ magpy.show( ) ``` -## Use Different Directional Symbols +### Use Different Directional Symbols ```{note} Default is `"cone"` (can be set globally like any other style). @@ -233,7 +233,7 @@ magpy.show( ) ``` -## Set the Sizing Modes of Directional Symbols +### Set the Sizing Modes of Directional Symbols ```{note} Default is `"constant"` (can be set globally like any other style). @@ -277,7 +277,7 @@ magpy.show( ) ``` -## Edge Cases: Hide `Null` or `NaN` Values +### Edge Cases: Hide `Null` or `NaN` Values ```{note} Null and NaN values are treated the same. These pixels can be hidden if desired. @@ -323,7 +323,7 @@ magpy.show( ) ``` -## Color Scales +### Color Scales ```{note} Other color scales are available (a curated list of common sequential colors between Matplotlib and Plotly). From 5b18572444a90ebcf73daeb6583a4c048e02fd58 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 6 May 2025 02:14:17 +0200 Subject: [PATCH 159/211] improve docs --- .../examples/examples_vis_vectorfield.md | 15 ++++++++++++++- pyproject.toml | 1 + 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md index 55ba88e7f..63501f514 100644 --- a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md +++ b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md @@ -111,6 +111,19 @@ magpy.show( Null or NaN field values are not displayed via a directional symbol but are visible by default. ``` +```{code-cell} ipython3 +# Only 10 interactive 3d plots (Webgl contexts) can be displayed at time +# The following will display subsequent plots as non-interative png images +import plotly.io as pio +pio.renderers.default = 'png' +pio.templates["custom"] = pio.templates["plotly"] +pio.templates["custom"].layout.update( + width=1400, # Set default width + height=600 # Set default height +) +pio.templates.default = "custom" +``` + ```{code-cell} ipython3 :tags: [hide-input] @@ -350,7 +363,7 @@ s0 = magpy.Sensor( position=(0, 0, 0), ) objects = [] -for i, colorscale in enumerate(("Viridis", "Inferno", "Oranges", "RdPu", "Greys")): +for i, colorscale in enumerate(("Viridis", "Inferno", "Oranges", "RdPu")): s1 = s0.copy( style_pixel_field_vectorsource="B", style_pixel_field_colorscale=colorscale, diff --git a/pyproject.toml b/pyproject.toml index 5e4905fec..5982ca7d6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,6 +58,7 @@ docs = [ "pyvista", "magpylib-material-response", "magpylib-force", + "kaleido", ] test = [ "tox>=4.11", From 6384d55438b10620fa89bd6a2cc1f4bf91839d8a Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Fri, 16 May 2025 16:58:38 +0200 Subject: [PATCH 160/211] try image regression --- tests/test_display_plotly_pixel_field.py | 123 +++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 tests/test_display_plotly_pixel_field.py diff --git a/tests/test_display_plotly_pixel_field.py b/tests/test_display_plotly_pixel_field.py new file mode 100644 index 000000000..3f7136be3 --- /dev/null +++ b/tests/test_display_plotly_pixel_field.py @@ -0,0 +1,123 @@ +from __future__ import annotations + +import warnings + +import numpy as np +import pytest + +import magpylib as magpy + +# pylint: disable=assignment-from-no-return +# pylint: disable=no-member + + +@pytest.fixture +def image_regression_helper(image_regression): + """Extended image_regression fixture to include helper functionality.""" + + def check_image(fig, basename, diff_threshold=0.1, scale=1): + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=DeprecationWarning) + image_bytes = fig.to_image(format="png", scale=scale) + image_regression.check( + image_data=image_bytes, + diff_threshold=diff_threshold, + basename=basename, + ) + + return check_image + + +@pytest.mark.parametrize( + "vectorsource", + ["B", "H", "J", "M"], +) +def test_display_vector_fields(vectorsource, image_regression_helper): + """Test displaying vector fields.""" + c1 = magpy.magnet.Cuboid( + polarization=(1, 0, 0), dimension=(1, 1, 1), style_opacity=0.2 + ) + ls = np.linspace(-1, 1, 10) + s0 = magpy.Sensor(pixel=[[x, y, 0] for x in ls for y in ls], position=(0, 0, 0)) + s1 = s0.copy(style_pixel_field_vectorsource=vectorsource) + fig = magpy.show(c1, s1, backend="plotly", return_fig=True) + + image_regression_helper(fig, f"vector_field_{vectorsource}") + + +@pytest.mark.parametrize("colorsource", ["H", "Jxy", "Bz", False]) +def test_field_coloring(colorsource, image_regression_helper): + """Test field coloring.""" + c1 = magpy.magnet.Cuboid( + polarization=(1, 0, 0), dimension=(1, 1, 1), style_opacity=0.2 + ) + ls = np.linspace(-1, 1, 10) + s0 = magpy.Sensor(pixel=[[x, y, 0] for x in ls for y in ls], position=(0, 0, 0)) + s1 = s0.copy( + style_pixel_field_vectorsource="B", style_pixel_field_colorsource=colorsource + ) + fig = magpy.show(c1, s1, backend="plotly", return_fig=True) + + image_regression_helper(fig, f"field_coloring_{colorsource}") + + +@pytest.mark.parametrize("symbol", ["cone", "arrow3d", "arrow"]) +def test_directional_symbols(symbol, image_regression_helper): + """Test different directional symbols.""" + c1 = magpy.magnet.Cuboid( + polarization=(1, 0, 0), dimension=(1, 1, 1), style_opacity=0.2 + ) + ls = np.linspace(-1, 1, 10) + s0 = magpy.Sensor(pixel=[[x, y, 0] for x in ls for y in ls], position=(0, 0, 0)) + s1 = s0.copy(style_pixel_field_vectorsource="B", style_pixel_field_symbol=symbol) + fig = magpy.show(c1, s1, backend="plotly", return_fig=True) + + image_regression_helper(fig, f"directional_symbol_{symbol}") + + +@pytest.mark.parametrize("sizemode", ["constant", "log", "linear"]) +def test_sizing_modes(sizemode, image_regression_helper): + """Test sizing modes of directional symbols.""" + c1 = magpy.magnet.Cuboid( + polarization=(1, 0, 0), dimension=(1, 1, 1), style_opacity=0.2 + ) + ls = np.linspace(-1, 1, 10) + s0 = magpy.Sensor(pixel=[[x, y, 0] for x in ls for y in ls], position=(0, 0, 0)) + s1 = s0.copy( + style_pixel_field_vectorsource="B", style_pixel_field_sizemode=sizemode + ) + fig = magpy.show(c1, s1, backend="plotly", return_fig=True) + + image_regression_helper(fig, f"sizing_mode_{sizemode}") + + +@pytest.mark.parametrize("shownull", [True, False]) +def test_null_values(shownull, image_regression_helper): + """Test handling of null or NaN values.""" + c1 = magpy.magnet.Cuboid( + polarization=(1, 0, 0), dimension=(1, 1, 1), style_opacity=0.2 + ) + ls = np.linspace(-1, 1, 5) + s0 = magpy.Sensor(pixel=[[x, y, 0] for x in ls for y in ls], position=(0, 0, 0)) + s1 = s0.copy( + style_pixel_field_vectorsource="B", style_pixel_field_shownull=shownull + ) + fig = magpy.show(c1, s1, backend="plotly", return_fig=True) + + image_regression_helper(fig, f"sizing_null_values_{shownull}") + + +@pytest.mark.parametrize("colorscale", ["Viridis", "Inferno", "Oranges", "RdPu"]) +def test_color_scales(colorscale, image_regression_helper): + """Test different color scales.""" + c1 = magpy.magnet.Cuboid( + polarization=(1, 0, 0), dimension=(1, 1, 1), style_opacity=0.2 + ) + ls = np.linspace(-1, 1, 10) + s0 = magpy.Sensor(pixel=[[x, y, 1] for x in ls for y in ls], position=(0, 0, 0)) + s1 = s0.copy( + style_pixel_field_vectorsource="B", style_pixel_field_colorscale=colorscale + ) + fig = magpy.show(c1, s1, backend="plotly", return_fig=True) + + image_regression_helper(fig, f"color_scales_{colorscale}") From aa5b5502c738690482cd7a9a2bc5cd21f96b7646 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Fri, 16 May 2025 21:37:58 +0200 Subject: [PATCH 161/211] add image-regression for pixel_field display --- pyproject.toml | 9 +- tests/conftest.py | 22 ++++ tests/test_display_plotly.py | 105 ++++++++++++++- .../color_scales_subplot.png | Bin 0 -> 123491 bytes .../directional_symbols_subplot.png | Bin 0 -> 114515 bytes .../field_coloring_subplot.png | Bin 0 -> 115441 bytes .../null_values_subplot.png | Bin 0 -> 83207 bytes .../sizing_modes_subplot.png | Bin 0 -> 119939 bytes tests/test_display_plotly_pixel_field.py | 123 ------------------ 9 files changed, 128 insertions(+), 131 deletions(-) create mode 100644 tests/conftest.py create mode 100644 tests/test_display_plotly/color_scales_subplot.png create mode 100644 tests/test_display_plotly/directional_symbols_subplot.png create mode 100644 tests/test_display_plotly/field_coloring_subplot.png create mode 100644 tests/test_display_plotly/null_values_subplot.png create mode 100644 tests/test_display_plotly/sizing_modes_subplot.png delete mode 100644 tests/test_display_plotly_pixel_field.py diff --git a/pyproject.toml b/pyproject.toml index 5982ca7d6..14b64a445 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,8 +41,9 @@ dependencies = [ [project.optional-dependencies] dev = [ - "pytest >=6", + "pytest>=7.4", "pytest-cov >=3", + "pytest-regressions", ] docs = [ "pydata-sphinx-theme", @@ -61,11 +62,9 @@ docs = [ "kaleido", ] test = [ - "tox>=4.11", - "pytest >=6", - "pytest-cov >=3", "pytest>=7.4", - "coverage", + "pytest-cov >=3", + "pytest-regressions", "pandas", "pyvista", "ipywidgets", # for plotly FigureWidget diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 000000000..6670330ab --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,22 @@ +from __future__ import annotations + +import warnings + +import pytest + + +@pytest.fixture +def image_regression_helper(image_regression): + """Extended image_regression fixture to include helper functionality.""" + + def check_image(fig, basename, diff_threshold=0.1, scale=1): + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=DeprecationWarning) + image_bytes = fig.to_image(format="png", scale=scale) + image_regression.check( + image_data=image_bytes, + diff_threshold=diff_threshold, + basename=basename, + ) + + return check_image diff --git a/tests/test_display_plotly.py b/tests/test_display_plotly.py index 33050a33a..6f8640ae2 100644 --- a/tests/test_display_plotly.py +++ b/tests/test_display_plotly.py @@ -1,5 +1,7 @@ from __future__ import annotations +# pylint: disable=assignment-from-no-return +# pylint: disable=no-member import numpy as np import plotly.graph_objects as go import pytest @@ -8,9 +10,6 @@ from magpylib._src.exceptions import MagpylibBadUserInput from magpylib._src.utility import get_unit_factor -# pylint: disable=assignment-from-no-return -# pylint: disable=no-member - def test_Cylinder_display(): """testing display""" @@ -486,3 +485,103 @@ def test_units_length(): factor = get_unit_factor(inp["units_length"], target_unit="m") r = (inp["zoom"] + 1) / 2 * factor * max(dims) assert ax.range == (-r, r) + + +def test_field_coloring_subplot(image_regression_helper): + """Test field coloring in subplots for all colorsource options.""" + c1 = magpy.magnet.Cuboid( + polarization=(1, 0, 0), dimension=(1, 1, 1), style_opacity=0.2 + ) + ls = np.linspace(-1, 1, 10) + s0 = magpy.Sensor(pixel=[[x, y, 0] for x in ls for y in ls], position=(0, 0, 0)) + colorsources = ["H", "Jxy", "Bz", False] + subplots = [] + for i, cs in enumerate(colorsources, 1): + s = s0.copy( + style_pixel_field_vectorsource="B", + style_pixel_field_colorsource=cs, + style_description=str(cs), + ) + subplots.append({"objects": [c1, s], "col": i}) + fig = magpy.show(*subplots, backend="plotly", return_fig=True) + image_regression_helper(fig, "field_coloring_subplot") + + +def test_pixel_field_directional_symbols(image_regression_helper): + """Test different directional symbols in subplots for all symbol options.""" + c1 = magpy.magnet.Cuboid( + polarization=(1, 0, 0), dimension=(1, 1, 1), style_opacity=0.2 + ) + ls = np.linspace(-1, 1, 10) + s0 = magpy.Sensor(pixel=[[x, y, 0] for x in ls for y in ls], position=(0, 0, 0)) + symbols = ["cone", "arrow3d", "arrow"] + subplots = [] + for i, sym in enumerate(symbols, 1): + s = s0.copy( + style_pixel_field_vectorsource="B", + style_pixel_field_symbol=sym, + style_description=str(sym), + ) + subplots.append({"objects": [c1, s], "col": i}) + fig = magpy.show(*subplots, backend="plotly", return_fig=True) + image_regression_helper(fig, "directional_symbols_subplot") + + +def test_pixel_field_sizing_modes(image_regression_helper): + """Test sizing modes of directional symbols in subplots for all sizemode options.""" + c1 = magpy.magnet.Cuboid( + polarization=(1, 0, 0), dimension=(1, 1, 1), style_opacity=0.2 + ) + ls = np.linspace(-1, 1, 10) + s0 = magpy.Sensor(pixel=[[x, y, 0] for x in ls for y in ls], position=(0, 0, 0)) + sizemodes = ["constant", "log", "linear"] + subplots = [] + for i, sm in enumerate(sizemodes, 1): + s = s0.copy( + style_pixel_field_vectorsource="B", + style_pixel_field_sizemode=sm, + style_description=str(sm), + ) + subplots.append({"objects": [c1, s], "col": i}) + fig = magpy.show(*subplots, backend="plotly", return_fig=True) + image_regression_helper(fig, "sizing_modes_subplot") + + +def test_pixel_field_null_values(image_regression_helper): + """Test handling of null or NaN values in subplots for both shownull options.""" + c1 = magpy.magnet.Cuboid( + polarization=(1, 0, 0), dimension=(1, 1, 1), style_opacity=0.2 + ) + ls = np.linspace(-1, 1, 5) + s0 = magpy.Sensor(pixel=[[x, y, 0] for x in ls for y in ls], position=(0, 0, 0)) + shownulls = [True, False] + subplots = [] + for i, sn in enumerate(shownulls, 1): + s = s0.copy( + style_pixel_field_vectorsource="B", + style_pixel_field_shownull=sn, + style_description=str(sn), + ) + subplots.append({"objects": [c1, s], "col": i}) + fig = magpy.show(*subplots, backend="plotly", return_fig=True) + image_regression_helper(fig, "null_values_subplot") + + +def test_pixel_field_color_scales(image_regression_helper): + """Test different color scales in subplots for all colorscale options.""" + c1 = magpy.magnet.Cuboid( + polarization=(1, 0, 0), dimension=(1, 1, 1), style_opacity=0.2 + ) + ls = np.linspace(-1, 1, 10) + s0 = magpy.Sensor(pixel=[[x, y, 1] for x in ls for y in ls], position=(0, 0, 0)) + colorscales = ["Viridis", "Inferno", "Oranges", "RdPu"] + subplots = [] + for i, cs in enumerate(colorscales, 1): + s = s0.copy( + style_pixel_field_vectorsource="B", + style_pixel_field_colorscale=cs, + style_description=str(cs), + ) + subplots.append({"objects": [c1, s], "col": i}) + fig = magpy.show(*subplots, backend="plotly", return_fig=True) + image_regression_helper(fig, "color_scales_subplot") diff --git a/tests/test_display_plotly/color_scales_subplot.png b/tests/test_display_plotly/color_scales_subplot.png new file mode 100644 index 0000000000000000000000000000000000000000..1fc4d9416591a38232b84cacdcc177ac6ef9bce9 GIT binary patch literal 123491 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 literal 0 HcmV?d00001 diff --git a/tests/test_display_plotly/directional_symbols_subplot.png b/tests/test_display_plotly/directional_symbols_subplot.png new file mode 100644 index 0000000000000000000000000000000000000000..a41e475f7d7e6234a6c9a4756ec728468c16c4e1 GIT binary patch literal 114515 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�HoGqiiV6AqghE$zODtqU=(`~ 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 inzip&75d1Rpds+9@FjN!1?I55u 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 z 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�UJz- z`RmY2U9qS7eWfJhfg%+09GY036iptk>E!6ba)dy5wgnpIwwH5}hV<{0h*p

)`8c>(KS!mQlW&CW|ZePvOEoyFE9iF@u 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

7F@=4hxtZEV5u{#-Rx z_lNpt*WJ3|}x5fu``K+ zaE8u+8<n{nhhKtLU0 zpAUMQ%WYmm;#yO~0a{{EJ;$4W7>nh#fPoWX*j;(&A<*?Y44$d9KmBX(rq2$}U=?6n zo)4IzvF{IWkS+T%e!lU~2Fh?&r;A#LN}qnKTdojBSQcBmOdeYgxBLJgV-NHzn)Gm@ zbD3AXBH_^+m+Qm)5)WMiW+TXv>PL3w3$;KR)R`XQvR8euUVN`#GpCXP*&T5ebjX+T z_QCJklEzKcVQ^9ZBj&bX?7Q2zG))@euH4sm`~^ciQi%Mo4#bjFm7TiElqaN>19~|4 z3xDr6&oAfaR`z~6=?-!ln0t(cKOw)#D9KrVo7VAdCi-zM*Djsv{pCftHWVpqc`vF^ z7+2O|X1v@WazgF*?*!8V)`ax3;e}c)vr{YfH&?!N>JIA{i>1)Rn$`jAG)g>UTACi+ z(ghovvYcN2+vfSTOU^SQ!Yy)UL_u^^pxbHP<@k8e^>~#ZBIqdC#_2R`0BQwEV#$Cy=VI}gpeXi&tpzAKR67&Q))l4vD@G^fMHiGhHD|N z9`TIvkf@3o3OA)3d)%xxnmvLH1N!a+M{j@qE3O~I*~HOL<8v^awZq;g9R?u;j!^#o z$9ET7&jY80E)N>SHso^eh;fv@P8@*5*6zd*JBQMJ1zIlJ106YYkfnBf%C`C}nkije7ngyTxtkPrLRHO)yDS zR38($%_pGnOpyzkW#hi>-y3snOnP#%d%I7&ENDUkzX32;oK2QJs3IQx_jA~H&va=Q zW?=#oYr{eftFK=BV<-&2UsrQ7`JKTozl#MUUj!fPi;6oP1Pc6o`7R;kI3T=R`{tzW zZ&=P4nEl>Wot@Lty`)J)1IN8mF`Wr{$zYtoB`3I@B1!mWS#F&HqbxJaR-AA}i@LRi z9NpC!NSf(ya7UCG#HXW`l4Kl=W@&gX1cAQZ|87fTLKGz%9|w{G5WWY#4=>bx9ShJ@yZ`G5RNuA^N+$nX_>vvB2(aLUI!V079Q+O*P^!uhln>n}fZg@#!&{9(k!pH? z>PK2hNEcfqVf(}5=5GA&XU32fNq!Vi^v`d&LI4`Z-q_h3a`We0wRrT2!HH}KV39^; z`(*izz(F@#1Z(Z?UtMHLN4_7b~%?-&FDiLbH|7U-ojmTmg&8ss1anq)ruE*2&dD*V4%X7l2fF zhVK3Nu@8B0bd;F*kK!EN5REud@ZkNIp)4bW$45}{vbQRPPI*^%*<>NQKWqrlU6}m9EVc}>*y+tmd-aU-=+CDQix-o zbtKa4}!m`&HRf=`-xme+`ieG&;aI*?ChCWYd4ev()7}QS5|0f&w)J5 z4kYWhp%$cvvB`^h$iL;47Er09A%a1_cAL;47KZF%HLr`QkZOAPJCk#DkRjx#mUP>d zi&O9c_Q)Z8Af$cUBP(PM50o-*{Bvu-)2SfK-e|A`P#6rvpgyqRyR!1@<=NFx#c;K@ z=uUXv`1-$H@2|g`T0ou1djqbfQR5*ujE0T&tCf$_N-5%g(^7;l%41ct;D!Rn#DwUM zP3`}_v&23LH6X!~0SnylLak%FHPLW`t(WG6x|FvQf6=n6q{_ku!Qt|)N zdbdvbUvm;VIsiTAzvi-XZ2ynw{~Oc)$5Q`SqU^2jq~SKdm1WUxYWIMTih`zmm8?bR F{|CY7J=OpK literal 0 HcmV?d00001 diff --git a/tests/test_display_plotly/null_values_subplot.png b/tests/test_display_plotly/null_values_subplot.png new file mode 100644 index 0000000000000000000000000000000000000000..895e81bb5c7fa7769b404f445bdef234318adfbd GIT binary patch literal 83207 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%0AVzSV=)tJKZ!yVQbW@=!; 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 literal 0 HcmV?d00001 diff --git a/tests/test_display_plotly/sizing_modes_subplot.png b/tests/test_display_plotly/sizing_modes_subplot.png new file mode 100644 index 0000000000000000000000000000000000000000..82c5687bb5d32ec4b32095615b7ef89d2142d526 GIT binary patch literal 119939 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 Date: Fri, 16 May 2025 21:42:47 +0200 Subject: [PATCH 162/211] add kaleido for testing --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 14b64a445..2640177dd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -71,6 +71,7 @@ test = [ "imageio[tifffile, ffmpeg]", "jupyterlab", "anywidget", + "kaleido", ] binder = [ "jupytext", From f437012db902df74e19eb81dfb749c66609ba900 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Fri, 16 May 2025 21:53:57 +0200 Subject: [PATCH 163/211] pin kaleido --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 2640177dd..78fd4962e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,7 +59,7 @@ docs = [ "pyvista", "magpylib-material-response", "magpylib-force", - "kaleido", + "kaleido==1.0.0rc13", ] test = [ "pytest>=7.4", @@ -71,7 +71,7 @@ test = [ "imageio[tifffile, ffmpeg]", "jupyterlab", "anywidget", - "kaleido", + "kaleido==1.0.0rc13", ] binder = [ "jupytext", From f4a26733be0ed867f103f5dac88d658295832dfe Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sat, 17 May 2025 21:30:25 +0200 Subject: [PATCH 164/211] regenerate figs with kaleido-1.0.0rc13 --- .../color_scales_subplot.png | Bin 123491 -> 125921 bytes .../directional_symbols_subplot.png | Bin 114515 -> 116028 bytes .../field_coloring_subplot.png | Bin 115441 -> 116887 bytes .../null_values_subplot.png | Bin 83207 -> 83890 bytes .../sizing_modes_subplot.png | Bin 119939 -> 120677 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/test_display_plotly/color_scales_subplot.png b/tests/test_display_plotly/color_scales_subplot.png index 1fc4d9416591a38232b84cacdcc177ac6ef9bce9..25eeca1082861f91fe30d294d6d83039e120729c 100644 GIT binary patch literal 125921 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�lT} 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

YaQH5QYhW-*3lBfeR@ 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 Qym%Jf2Zovz8cxsu4?&33k^lez literal 123491 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 diff --git a/tests/test_display_plotly/directional_symbols_subplot.png b/tests/test_display_plotly/directional_symbols_subplot.png index a41e475f7d7e6234a6c9a4756ec728468c16c4e1..7063789a0dcdf47fedcbd40076df76102840f6a7 100644 GIT binary patch literal 116028 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

IRdRS+$KHTl&iFlu(VmL6qzQpStc!? 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 SmVhU~M_OFrOZg{#zyAX!xXAbb literal 114515 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�HoGqiiV6AqghE$zODtqU=(`~ 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 inzip&75d1Rpds+9@FjN!1?I55u zi7<PvzKj~0lSQI z=#b^4l}oOGp=j_G4X$noMF*-U2y0uG(<})@NXew5QM+~oLGX|$h0TCoJ|aMe`Xa7K zj^K#$5sW(>A`|#ZB7_Q0ZG)Cv1>e~#jVGKCPSMAd0KatkQIJY2u&fGd?)~t>A!HJt zgQiL8slxRtTY)b<{0v5>@_7Fx7h+v+7sh=Z<6d4!z@06Gb*P{3C)M4=a5RTK%uZp z=s_n^E1+4uNTgQ6N-ct-<;3_F88FopSvqR#QU)q-R?y{t6FKiOB$c&z2_Jxub2sMT zLe9?f>7as&S4K9}&;nI#rpos2sAArH&C9hfL)E%r>KE0se*{P5ru&YRESvor%K#Kbgq$I@x1Ga1dvF;Sh57kY!<2E zVT``;G9Ip#@uyl1m-sGz5B%F%;Fe|Wwz-uKe_{JkRNpS>sYD8zTFXE$|{G5B|p)i~urjPMhZ~oKr}8 z0!Ot9Qz7t`34?0rgS~eNjy1u{4iM00JIb_&J~Q}|t4+|#d9yq^>X3PX7*yLuL(VH+Z`T?q66YZ@2@}1UBx)%W*RNlLTr!FA($t*C z*{+M{Up|H9OWV-XmK7PgnX4zikozdg`&I@m-S3Cd@)nqS28u$B-)Lhcz>K7J#Pp8% zYp0P#m-ltRe@yUiTa~@oWZsWm&dmsBxu~5seDcMCN@O&kgtA;sF+AG(o;v9W{(3US z%p3WTaxpKKzks&PpCOm&MIlF@Sw70> zQHwTi8e&jqH@R}9__x;81$%Kn{^$4q4ZaiNImN?&_44@t(9#5Y*-WIh&o~FhL7GKO zXZUFhW^9GAK@cLVC1I&XUE`K<==cPjVt_TPJ78udxMR#nV25HZq%{b$ySyiS&Uza_ zeSE2?dNvAf6>WMNJ*gIyd|Np4#jh7uM#%Gndas}3Il@1MT*0W z%0kv`6Vr=oSy1Q(RH;CzR;7Gmw2_O0iGWN>pBMBRYuDAA))rzR7UImY0C-5+ zVd_0FGnYbVhw`!zhT@@G*^lYM0io0 zC@GC_od9JaXG^Il^4$r33rJ}9pey$YsQkOgemT%MPUKjN`RJqWNpu@a=FR#N{91-C zfDD1O0K}1PD>s&ncCvapJ@fZLfIANCLD8|rIq?b*^!}kYh2QjZ$XREmcCf77*?Ri> zcfNx>R&ul%+xcWk?g281%-QV_G`LfKo`IMdQne#+Obr z3^o{&mrPKp$*gVcrdBtV;AbHy!w3(+P_xh!=^z-teQJ!0@kP+fq=d$EXr?}q`|Ohb z!s}pY!tyu?O=QN&Hzu=;V~S%iAjqZVv1uZ?X%npOZqyDP5;1;G0%gPqA(|7fS7vqD zxIzA03s>*?UNg!@SYBDkBXOdx)3z{HdEpQg zf@Mwjllk+$o_4HTy#zg7ZCJXv8*5iD!IHl7XF2@Tk&_rJRPaaddl%O9umpeltj>-- zL!v^kc|{-mf`j|NeHhy=@4?bl?E;9T6EZ7DXm>gVRN0&uV%VO-h&_c2L9doXkJTbf z2NdT7Lcb=O7h`n}j>C=mkFm>Z!DP4vimD@RkvmIXtaJk;Fk+UCT=f|6lJjW>0ZdgD zrVy-7ScygG>Uwki{Sa8hRCrZsMbg|1Z5EX%?u^&jh@^XXY4Qa;R{Q}rCNIaf^bK>) zkuq=GKp_H6q(&r@lDqACo&X)fPL{?JnMVG3fc+C=O(4fpfal=j58WyJN3@|Okq{LM zUhlb9#_ZUaJZ4ey_N9Rc-+O1v`N{kWIXW*usVcku&jhL37OUuK&tTY=8qv(u+I9eX za&Ycp^B4KwQd4|>YhgLQVx4hWwc_|8_?@r|Nb3o7nK|^Q+Ju=z!KVgaL32tjgAWNt5MYI5>Eyl`!j;V#LR(OP77QTpE6{2qu-pM4%CIu~n@T9iWi@C<0w=?3 z;b|+d(fS@VWlCm{*%gna*ysE#9JC0hBmsDX5GLKN{7__e71t965@=APXw0;5QlGAj z;d?KA86)-ySZPD(>#`ZBG3ZX;Yc9hT*|#Be8VliYo`YHMiAou}MowaIdIE#R0)}{v zohpj6muY5gbRCLmLQPmm>jthd)A*p-foG2taL0fR)6lVDRWEM4VJkMTJu_v2nZUN} zxpP!si{QeQuejp1^JRCAY!c&v(dUH@D#Nb=-}$$lxb3oS_~hHJ77OjK{P(YjOx!KE zZ$@uN7NMuW_kgxk0=3h0r8fpC0L+9EY)~h()5sy5_z{%+T}YZWq>{Yv(o{n72UFM+ zeiE*+9DS({RDD~374pp41W7<5GjJ*lA7X5AjA`7waeRp}HaDBj1|E(tf?qM-8k&J- z$BwBd@bLIubr5oW?!8!SHE&2~kFA(r%X4L+KxJl;j(v_R#yr6f!ALcm!PQ^=I~09S zjxBO6_?`%i6$M*71%H@oM}J=rTHf}ysELZ!F=vsP@Zc{m!z3Px#r;ecOAfoKD1Vpzql~!f=Ah$0XSW-ET~wE z;9ASzgcnHuVoq}8L@R_ljJB|d@!Bz{(^Kd`5eeLdz8(Vz)X24yASHx_qu6NtEspyi zfs0iX%!x9)0d$4UB*9r}2+VfaUJa+FkBXmrRa*MiV5SV10{rSC`$G=$kaHA2nf?YY z$=-|}bJ?8do2*sv!uSw+Q#q_{>x#9C)v6dV zbd0LNXt98*>j)jq(NYB?Sq1+!AHpA%*&6Dh?%aD414C1I^VOU1rpwl&HT%=EC`^|L zlzahr&!uta`CX?_3k*EAe-O7^S;D%-o%p>^z8k;r=l=xHb%k>pyVmqj@_NO+Kg&2H zAR#Z&p;VsZV>%o|%j97ssx{GgBst^cauYDHiP6Ej6}@oGKBV=O_#G7AxDyU13m2yV>9-&_(mu%*MlyHri^y zCOo-upACFdrjAlTjcPd-V}Q$ZAXk_fX~Ei|*$6)}wl69h7U?{(&O!*}D|CSKk>Nba z`I8ym@o|yi72vn43pal7!zj28l7*t!&~ua3nlWJ+J_?oQO)+2pd>Wf9#6tWu#RA}c zl|it}5c-T~#}4&qvvU~4g!uRLgo{1Tl(2SNMu6SMjKG<)yJynat&7zdeV9f+V679+ zRTSOHQ&^<_xyV=uaR>2#vcbZ@FqSKSi_!1{aFwe>NstpNdBSH4AaWlwENU>>4Q@W`?e6I;Jp+M+t z!rYQTIw9mf7FnaK?%xG)HG^p0tKxF(2~%CBvMKr zTGWIbV|*UPz+$rXR|{yAPwR>rX^*N-W?C^EeKOVOO=24XWq z+7or3S;;w_x(Tldfh{)#LU&fU3D(=*#J`0C4YxvJ0LP^ZUl}LiVnc2z`iwN%bQcp& z=6P!|006%ZNkl>Q7fd|S!H9s4*QU`KtmFhZJSA;( z>(3H30y0J>3i$H(AIH-#9l^V9+J-G_n?d&Z3Z4TSvt~TZ=El+E(-;~rpjIto!=~j( zHURdwU%3S*L9-HOsN{1nG0Fv!N(r{>%>lh>i?UNJb$fGoole)!V&pXMgVm0b?;}IU zsfI>3UT5+uEv7jrfR#m;Q?>|)?U4Lqb0 zCib7)gL0)RHdZr={Ez^<4}MT6zc z?+APeN}1s`xycd+HC`R~#)cBq3K3(}p`AMC)yVQU428Lb6>814!qND0T_2hfiudl@ zo@lg-|BmB}T-?TJJ9!F9d%MW?&R6zf4~V$#5m+baRW%RA%Gsq07h)m)Z;l1P`x*sz z;hY#}%}pY@thpW8!xPi6va;mK;FqT!p1|_=b-+l;iI9Hrge`_#!K5Df9qZ4eBQ_zyrgu(+m;U(}bBNcuVdT;{e@MFpq;! z4IrUz!-E3s#+hnh#I^B{69X7XCGq}j=ZpqY1jHqvl3B}|XwnGeB18XrDm+m2fv!xp zjj@qIR7)W=-Gru@P&7j{CdFYp9(L|Ki37(*aMkwJ_|UDFqBWPo`3wO_)VY9!(W+-q z@~Y_UPGH5_H1<0lE?U(mlo;Z;>(sMo>oo*FoN`UPuI!+n7%am~Dad9LP;{*h-ZDu; zfEzB*EXTf*5k`J#YDd$2jXO>k~`wkn(4g!Ql| zz!@{hjpK_Ua1J@hjt3{wOC?AmxDeK_k*WyKF9sT?i<<4?;b#xlfls+&;~PJIR@fqc z^z9epe1ypMtBSZ+v6J7N$B4!@I{V4Z_Oa540K`JJ%y-577g9+fx^#m_%GmSNC^lTw zjuq?Mpr~5Ck&2mmQ&XjD-z;t0vqgM$)sT&2F2?-40KPdrRaasW9u85~nm}Dra%QVK zL%8S>K$EvSAJ}EE>B}dl-1AVQT0(-A6FHUz@Qs@#4Ff0b<2X`1fbH#6Dw(O)F)V}E zR~6Y-ZqR3b8O?OjhO5eo6&(+`d9tK-G~E(8zQj7CDyZ(=D>qM@Hr17B8iSjG#>m!H zS{7m<-ng;wDR_;7^ViuHx;Vt+1aO(*fU)^(vY5v`KPuz4_jBQw|CP!v?)b{fSh}(u z+pg+IYc46&5SVEo_wE%d)QHY#7n-#gzC9pB){A8dn-j2m$fQ&OeyQ%DsWlkE!^n8U zD21Ow7)nJ2G0_Jj7$|-oc5n(c{}6zmhl<{FxK2FrB)XHUusF8{Z(7AJXAi^0F&vpX zgj2;4JT&$!f>6ohOs%{CFH3HyD&B1+7?7<6rPT;LqZ^GNJ-~75a zt<79FId0~&zi2bF7`7*oO(t;JrHim-Yd7AqVFPv?8p2CQ2Qe^SK)MT9xjrefPEKv+ zZy&w)Fb?jX6x_==*k!+ZZ5mg+c>^+CNdbgjNr(+d08Be2l$G>F(d@|lM+}kWG40OgT3SwQ1fK7W?g;2_Qeqv9I?SEwoVC< z(wNI7=xtfE2KMwc)RU($Rk86+w+MB58Xrls>ca6gQx@m_;AWG6Oo{QoY^HJ$b`qKd*Mv_JsXX}g4;L@O-1 z67qu-l8;Me74l^OJ9Kc%%^R_K%_58j6Uf_TajoL`KLNW8f^vmCbgD22b6!mV!E#U& z?roN)!_aiuWF{yZp~!f8LWLoE4wVgdYW@8ntQ!|>=@pp^f`C`FUZ^I#%q5u0UM@VbO#3Lb>VCi-L{K}9 z>Ea~vr9d*bI7K_ur3?p(` zJ6mx2XGWL@d2-#^9`v^KVlbb_OD7+OGcg1;l@xAhwrOIjB_|exlJDW(!kDl={%p1f z8C4UVMl4tc%r4KfV)4g5v%7A9gr;F#cMdNNNdB~pP?$~dfGxR-G++>!U){v8Q^PlY z{Is}lzwz;#a6W=yV{C9z-0xgR7P>LNEE&f{Piqp-oZ64S{`LzP9;2@D;`InAdA*Et~u!4;LzXj;kR1+D?fEmeF z(MgYhMKu1LWrvs2v-p+E{;a7U!OSB+cZQ)!88A9qHPBcHR8p%}K})BhXS2}zdhw4B z-ixme96$mJ)8t=xv&UDQmE$4R1|l%RQuk?S4WdzU_d&7AV%AfPwRy61uV*mh zc*nm!hM|EeT=({ESh~9RwBw8C$PD7NTSk%qQ=!rd(L7VSooKdDJ`~Ki|F>ot`JD60?jU z=&&^D1X!Gk8cYE6B@O)H70Y2Qz6zNuuSBI<#mHD5qf;e}P82XPRS+8v+jcQBK8@)@ z3AW?N-;IspdN>lMuL`|eM+uO(ZPccxP#$*#cb6a|p#{jAzWAyKN1+8@MY8o1FzEdnfnnZt zHm0Q`4br&T?sU;uMi!ZVVHHbBsz7i%DR0J7H1&D~&?FZ#GM1=$9)A0wd-21=`{efs z@mKZ~wlO0}Pv+U@OLc*Ww@=Vku93DwLkkPpKvEwhmt2D4!1M6b3kTs;rt8lkL9YtC z{rov*?cR9;7hb#)@A*hCJVh019`QBoPjn#flmw@rU{`AA%1kS>ynU%Q6x<3*E;H*= zr&cgy!VsNH(-;mXP@Ae?ZTk`!s)nKRWF7PpK#Qi^h!S$P4Na`!9M55DKnXNjN&^)F zU^9S9ap#EtE9O9-N*+W_0=etn+UiUn1+vY_J-L22QlK*IhY< z6*MNm+1 zi(FL0b66~BEKwI{m;a`r0L&g}W)FZXBu&6`5mb-EE9^nBd=T#NzaX!V!cw_dgbjAb z9?ISU3|9UT{h80gP-e7s8)*i!!ASjx7EwP?(4T8V#jyqW;9^m$R^g6}ifpfzPC-p1 zU~3wl@T+jjBly)s4vQ)G(_krEusz&=qJ(=!d|cIS;)5$v0_-$yP|9{7C=4r>^~f=Yxw&=`5`|2JMU-$z1&O%YACE%3E(pA2?4yk zs??3@YRkfOrQrm#Q65Xl(Vf_Gc^{s*e-Q7x?IJwC^EjS*{wV(Nw{Js7dm0yCw-Uz- zBk@1s__sOuO5()nMHzLX5Pr#jhoY69vi_A4(@F_ zuW_e_KUVVi{f05kVAh$uTY|M}13={1p}z6RR82gFssZF;a-%UeY2&4R$C@u(7$BQY zVD*wNoUhopc@bJN7A#9TJaR5#<5+x7eD4(hBFB|;9qAi1nbm=PjJG?gD_ z`E!>0%btw`Qzx+~(}|7k%W$kPEGP~P;Yb!yLg?@o8*Vn-?bv~!R+F03bpETkO*9vNPC35#Ubz8@Wh$kig%3Y(BjqWgL02>Y8d6DR zzTn@G4nfz-g;n~h}-}@j(xv|4| ze(Z?&*~t?H+R?2T!N|M<>Sc^29KnuN1MfG=&O9 z*~LZGpe7U0QYq+`g^fl6pF;xcHJMePtT?#y;56=@h_qH!;Ia-KA6}J0Iw?!@YHuIR z%dTvCO=kYMzz_^knuzKc($VSs8BdH(*Rb=M1Nh>fejD9gZP8F~(b#k^d|H7=AI%9R@Szch@Lm&B6IEof;=3Vl@9W;+edA5>&a6FNft z<$t^np`S!LrQ?@B^JZLm$tqYRWD1G6GImcKi}Yz{y2r_nj&TW}D+V8pK$qi;TuZ^b z6r9~E!XP3M3%)`SE%-Cpu9VpV!*=Rp3bVcrR369S>AwLDTUWLG84R@*Oj%PWS3K=G zjxo`F9~l88TXWERd+?S0yYc5wJqpEa-jJG5@Jp#q-0CwMOY2-6>Ar69#MDV8m>@u` z+uJ5nu-<&j%xgt-2Q~we(s0isJCRBz(c9C7u8x-TW;`)fbVLS`ng9HF0g04}TuVxv z2h9w~vz_#(aIkU`BjvmRys>pKuU%sh@RFzPIg(>bZf!1UA)z;GNH1^cMT?o9Lvd&f zZb;cgCRrrXh^KMRY6QA5*p*5%4O62;tWct{#jiQ%`_Rp+5QMUkm?NC(3qeGCkYk0} zV5y7CjJ?RP+EUr&w4nDi<4foks|tiV8Nqjy)lDo~gw*QQuuq&ob=NM0wVLEKN1JwT zl(-3q$DphpFaa?0D%P#$}g0 zulrs+j(t0iWAjDJg&=s5E;zNB?BkN9IehAK8*%Dz4LhG7$H-JsIIdlOeHT_OZxa)^ z$SNpOVulSF%-m+ONxbV5m*DGPcpS-0Ge3}%ak)5+NA5a~$M4;R%WqnXH@$r`5{V=N zUlG80HqebTaqJvEZ8R)Yib8-hAr_%Z$wRdaB$6s}tvalvl$287qUh|xK@bdUD zp0lf{l*i#226kE&{@5__OGXRUTRA*9P!V7^zAm*u!IR@I9Jhdvug@XV)d6kMT(N&j zyRqw=Rc>bGxPWjai?hDxD}M0x2QfWf#D_j{6W;o+OT;)BpB%-|@j)c7TQ3${E{1Vd zj0<$J62Q<5Y`c7!Xma5N7m`R`AY7W=TJ?*IXmAhn1IJ0uCGiy$bj_ zpRX(*(;fJGg2lI9e~~Cl6O4%FH@Xp=r;wXG1>Jo!YBDjXL9MUZY?H@&S@u_MXM56v}!T-ADYDSWjSGK8V9*p6sl(?jTJf0eQdT^vZf1{ z+^`(aK6DJpv;@5~Y7epj#`kAVk=rlxAeG;_E{-u4juXoKq@3vp9qHT<)~z%9mtzi-#ylC#3w;D{K#ZP2#@q zJ&99?r=TGLrz-W385du10Uo&PDNIgP;A`f*V~jw<6~LFkir|s=UlsPb*|Y&m<6`KG z?(~bUTZw^V`{4UIOiWehJl{R{?886(>l3*2raoMG-3n3quGRu14IR0R0mWCuSlIj0 z7{b8DW!qK@K4T*oIc=~xliHyOP$|36Da5Y;KIsO`w(-3KI5hn=43vHx|B2i*dApIf zUqDW~U{2PJS?;(Cza>QuvdqHP&#Ym5ky~4H92~C7iVZ$`bRV?Y9Y2*xJjal0lfRSU199HtA zowHaE|9gR5W+LZvisZEul5~!N(4SihCs^lagy+FVKq`1M)6a%i-cN!pZWPI{74w%h zBbQZiPfu}(qh<#J5Vs~w={_0FU(6g608^IioW@tAO-n7^TGbQIe6iLogIC>A6d?n~ z-wALVfnLtJx)zAv#~I%E;M@?q!O@(NO>ZL0-}upK7+*Y0oz<17s=+b0Z=X0amtT&y z+it^W@Aw8j<7?O!0;%;Iq@6JNzERdW9f4l$(krCP8kHwzeO3u@tBx%=@?ztjln3A2 zLM+4^ITir#YZUumJlQnyK63XiACOb$;Yk&;;%VPR^fpc{0zs^Ox`mY^k*5#>c&Wp+bDCS^+C>k=B1#xRo= zIUCqb89FKz8%c99E?)b)@ZAyy#~#6CX)lH*9z(SnqFQxfSspSiI+7_Hd3z@`<)6`) z{z!e1U^)Cmc^ZGW_gM_pX52W+o`c6mj-kU!;kv$+QFcZy7EBw7vZNn@kdUrKz$z<) z^{Fh>u0B*97so19+&f*v?txM0R!ZpX#=+~u68w&VY5ZL_i%)G(K&JB9BJRLvl9c7> z*V}yUp&!18Qr;F|V$H^WSV{Q?uDW3p?!DtV6p9YA9cO-y88Z|)w$dp>lt6{^lP}BA zeM{T1^~yf)lHe*@EpKyspJR|e$q)Qz9+MMnry@)=$)(_ZQ}LD zpSF|5zsB11e}kr&_1ED7PpeyI?_xJBf|Iy`tUkVinejzS*UgC(w)Za=UGvqNi$bj; zKo2wj{9Z`~=)3tQDf-`d8is-NwrxmXcp)mI6WE{k@fUydBedmG_`T1*ZQfHSP$^Vs z2;d(VBH7|k9C^!RgWYD4aKYy?9Wz%aCN zaO#wxI4sXe6^G*!qo~*pk^|%(48QdeT%>INSIVTFwODY^*KI@fEtf z-@X9f9AgCbd>X!0!Rc>*YObJqi1(~O7)%KBj^pF_{m0lyLr${^-AY3<6QT>g z5x{R=y9gh9*Hu{7e-^aZ5a)x#`?r625AOcX)1rg^mwx9R=<1bxPsR_w`3$<3b)j!r z7hWtL!a!{dJ{Q^31UEP>DGLeBfMatpRs?w9c$l3fBQWmI<DHp5o9ar$gW4>i$ z5cuBx>_?$!RirX1k|_;39Rj1@cj>pG+j_frO_qL{UDoKL5(PC`S<2@7Vc9nnK(~2( zk*{vhqS^pTC0m+VM8Sqff&u9*XRV~}`qcpAU+`5)lusR`kBN2}`hz4h$+ zy61z#ORg;M^?VxQJQqpF^6>1`ew?U`z;!)1H5Vpb_#%#X944tA7Aprj0#^}Wm*Y!Z zvsrovqCrgXfTLzH!@~X-CUD=6_v4DoSKyK>mq0Tm9U<;zm}!8N2>=4;)2TWLGY|r6 zjdtk)s%0Ba%@JI0d9RzZoiXn{*1Bdso0}}LNvBg>r6y?sVJNf3k>eWG7er%R6dYd! zn4&^b?|qmVW2O=!#pcqgEt)pt<(J@@<7?2+uwvC3c!v(vo9&VtHi!yBb^m_xGk)J_ zHbFWQ$Mm_x0*7}Y-pH|#;e8FFT&&>G%R|s+NsaA%;$RctjiWGK!o=<=thj2)+^%m^ zL!s){7mE4H=#(nUb|>-Hk6eWB{{0iMlI$Lr3x}>7=;&%eD(BzM zTWDv-=}qR%_=@eh0B?Kq7OY;@jfAd9uzLpnm#(GI-*J^VJims?!fp&rJ|@1Fic_c* z?}gW{V{z-Pf^K0KOTvbe&Rz@(!WYvi0oI0`3LdCT;MPQk06$WzQXT|G1m89no(8@g z*9>OurriL$N;BCe-?PP`R0)pQ;Fc1m5?qXS?i)bipC7=--gPB5pT<6T=)?qeJ#!eV zHZ8)+4U2F-;`UEohox(Jux?!sTHB>`Rvd46_eGd0$;CA`pWrndePRqw-b3%w4wPDL zWV%zZESAoN@El527fQhLvot`NFL=L)i$xR@6>Pt386LcE7Zxw?!>zY($9+HCiGzD- zENsFsvrj(+R{cs_!Z1ZEvcshFLyl%TO$?r`Lpao9Vn=)1NPi7h!X7g5!Lss!ioG7wskQ9gB^+{aeEy0?eZY*x;L}yD*NOjd58?NVyxkIDAZUmso z4?bP6Vb>D$fe_WQ8#xG`evC=}?Tmb3W42dlMQa6kp^Y%$T-!X)Q{GPSg5%A%N#3)K zFdAF&7$Z%G0Nk!Qa2gb4#QXK6MRk`6cn1zN{f^mP9+|7JhS}FQM|+oJhz)AYEYA*Z z{s{aV6>Jt_A>OF50C-=6c=pjT_g@a zaF8z@#_-gWI5GYtf*^sUbqP8(3q#`*(6VWIjG|_la3YP}Y2U*=twJ+9hbZC9}SUg(Cyw_`7dD zf)Cts39i0qP1AD?ofyX*UwsVEKC~B$S9IaspS%uNTo>^+U+1{|x(ztCX8?cxrEkNr zeUat8^2W8;c;Rxf=vSTQkurFE0>k%>;>Gg*`p?Xyf|g4X*l_y>boI5vq*=gOZYe>4 z>neEj2e#t+cWpw#G{oPnUb6^4`o{Bk_$M!+S{a97q@hO*hxb0T2Os~y745pfTcdf8+aV zU)6%e-OI7xeyESMveu*`znJI>z-$%7Gu%qKLiuGZTh)z? z7xZDt($;!YTBfrDpZ>&KaQi#1!uRfY3XeUp3!Ybjs+v*OH&M^}%J?urFOUPMCQBL;rMR;L|iN5X`%T|Ok%Uhkqt$I$B z0m-ej6siGGX`y+s;3k6$rx`W;F++DzPgWfK-M9xl8>F#kcoKULoy5dc5x!f4!pygo z#EC&0|9alrMyl8^e$ zFF$~npBt!K0B72CtXkI(!%ED_4t6hY!Gt*pzbs|kZg|I51ZoZU|L{pny)cQ*w{OO( zn^r(is%HfP6^Fo4X0ZrWAr|#sD78e-v2$G4lDK;Fe`^B3wl@vODZp{_s8ojF`epb5<)dUKoC*x2HN;?- zanIB+e(%WhD7y~+Ig!Pu91GW2ErQ12*&b}_7|)8?cFr;zCtg8h0TVSJhR6VWcwzTJ zIMpI_!xBz?ay|e?CW`pV_n*YCed5jHb4H-cLp;Aiz+#He+v^=1U)8Byn?NtCRHEU_ljnW5yUWUq$fQPg#KJlkI$ZIs0$=q}^{a4e zHcHH<(l*#IkVquN*E0cN_CTBq*k$lBq%6cCn(QL=3I5v(*F#kvMk(BlY{-oMOtp-! zo9ycoE^6-dw4g7fv=D)%z@|2D5Jcn46;!O*Abs}u5*s!eNjOqT!szZo$K_WEImXik z-z!1yWWf>7mA14x*k$C>q#!N0vMt0LI~D-%s|?DHJ@Mc!7+Ru<9uQAzJ09PMx4!QR z@$XKv1>=rf9IS+i4If^P7rt~5_9+Js{`Vc|=xxEe_pLzBHJuVPM_Jy};a<@loJ-+n ze(~}q!GFPXQ)ko|mh^Vwmw)csyA$3H_v<3U>R-bP<`CET1CZk@WS9R1m!B+u?c9o zEYyT4j5j6&58o}1;-&=KWgtv0*sL}?^EOls@Gl2zI5}3tTNW9(ZfRO@Oyf{Z3w^7X z;ys(U;yr@L>0^9i5-;pJgePA(fE~M!qE;;8NVR~ke5Z&?wSp_Rti{tm*^Nip??1;!pRVC`{3nx&nK?N z{oj89zxQXK#g1oo;i3Cqz~U?WkxcTr&khHwRX^fR$_C0{(6I3P$GzCsAjIvrX__p#D8xJ2D#o^uiaAIUi{CrVo>%4$B4qel*y0ZtLyX;0h zb@C9ty?-YL9T)!O6v9*rYNUHQrFyv6p2Yi7ZKA>NTUuaj-a2znR1IBSUAXn8ZoKE#Yv6k>b{{;6$DZ4VN1xk^FMs21 z?0M-35|cAjk0xUfy#B$(mu2PF&Lq48W#N!U@z7$ih=AF!NZWK}rXNQuL$CwcP}IGl z4Flt2ShHynzW671BAK@Eu8&=X8{WPRSB+hYlhYIM+!>iAajs_>U(I6w^55Gxufm`F z!N>4F{`yV~jrsV*hp!cO&E>Ko)kY#J17m1-5=W07!moVhD%89Xx^Qn(5Ng2RJh&H| z`rC1FZ%chria{>3k9q^YbUvV&41DD~_u=AAi_n&p zK>d8j>@xoB;Q0#^hK7jo@3d3K(_{Mu=w%S}N~bYNF%b&NXF;0tkFS|=MpHgs^Hc%? z=#i^RelGdKd~dS>a2(8*v$>bjdnSpqCIoLget(T1Hy&T{X$lI*89wYn>BEVd;tW;1 zFQK)2>J+jYHlXbLaE68=(+eNI>!MO=2D=?)RIl`||Bv%8pOc9&px zc6T&o%`Vx#7MnLM$D@z$!X0-#Er4$rQh+}|!ZL9AMJv#fO9~B5x{Xoni6Z%ys$*ol zf_wL#!j9vk*gKk+CBM*wm2E?U%_Y8%$zlcV*_rdH>zy`4(lBwuiVe7U(MsGscm)4C zb{ylSA_ChM*1?kr6F)IRyh~5PZ{VoXzhlP~@b$w!@|77`B5~cS0UkYB6@XXCwLsr| z;k@^Z3l+Q1x#(Q5euV&Szxs){V|b!~AK&#f?zrax*sdowGR%6P&tQWYGdI8ehabnc z|M`Br@XUT(a@8ih|D!jdwJjsS*KDxDO-lckR*deL!e9NzZ;3JZSO5Bp$hFFQvL@Fr z8gV9SCAdxy32w}-BXE2*RSjkVlUUuMvpt9Z?>F9qZ+!oGT(XVo42me>Gy7aBmtmQv z$iAICHHsUq*@Vva7SZiaqmQ4wcpP7S_(e>Ws%W(oT(hKAYONYGnytdnB;It8Qz;sy z&c6L1Fk<(*S)IVYJ^LusY(_Ln5S>* zOVmRq*uCOvs2wu~Fs->X{>!iZtaK?W*H9`~Fg8^XfQr=;>hdykIIB18ypJzlVe&oa zQ)&=fB4rj(BL#v0k(*w(0rV=sk>aobpb0~VPP=Q5%5QYo!)fQQ`8HB@b()A0QmOi4 z!@+6MnSG9dZ{s{59upm*9|-q8o*K*iYzOvKZnj8|m;t$sp`PRT67vX^V<`Km z1K!jWN-w>H%$6;}D%&}AN>aCkjd#O&M_@M|-;Ke~x=_$T*aUXtm@3)zbB(Q(rJl1~ z%HRE_El4KhW^*AHVj-Gi0r0-c=B6csfiA&z4y6T2rXxTX>C5?J^?21{k!aeNqkEjg@iZ@~%;$QnA{*S8XH zY469k#*X8gBS%p!mJrkooJ@H5uA}3&^h_80@q&YYcwtIpdgAL8F920P#DTnr!=8l= z+b@RNGUFUIUl4;cd&Gl)q`M=Fb&I<(JtjNs9j_#s@C+>}@6CBo@Z-YEM#e-ciBJFP z?R6O^2D9Gzid)}Hs8QLH>tl9HJCvj>9ZcrO@aVlSpm*_`gmr9(l|@JQdh8rOjBzCo z)nds$5d7${(TcjshI+0Qb=)lbX?crf@i1((c@F^>H8qHM#&KMYR+&PYi9@WCo$e5@g zs0mBx=F%a-hl;&^tv(Y9er?i#Y8cW)VvSF^e5yvO|PG85mJ%#=-b($vFHXphd# ze57MeJ82@+hUTu>!SmvC&&Rdph9`dQczn5zhrm*y@!#X)C_VQaG8bJ05cCcV)TPd5 zG<>Dm2P3g|t#DZjT}cPwV`gy*9~!t)e2LWAV^n3q)hVk*pMWfqZ;4C zxU1rkatfQy0(NHy7t_h9G7cOXnmISH1X>Y?s+e#IjLuV#-&f1q0??7~7uz3qWGzt! zC7{Tp3=}*^G~eh63s%}dg-t$zg`5T-de}mvyekf&4&&bDE?eNYxkWgey&R7pqg$hNg8e zv-@;BllTA3CpN3SUGysi)hfJFNo4%vR}SX^ z!u1V7!}zL}Lxj{Qr_`eF3um;_lTQlwG(JXTdKH51_-f3AH!*?qrI(`e{PPGRT1L9J z8`X8|&)B3kJ9wJYWfyHNnL6KjAr@jGnqvX*zJ@{C!fhXuS)tfIl#@Jpgv{>rwy(iU zyN)(nPeu)F7yis9JpH#XAZ5;!R;gr}HrwI&RRl^EE7va-V0I>x+YEI1{cMwpGlfZh zTf|FbcIu+-D{8qW=c;3zDbkrFZh6nO*ml_lJpaUQ?A~z@2lpOF zVXA~6bj~Z_jia%XoL0D8fJu+Zr4;nIEf}9Di&8#g+3icwdZ38THErl!)dnRY7s7I} zhR^^0ck%Rt`$Tr?`d_>d+upJoDtUyornUo|cwq>`hbM64nIQ}wAHwBtTaVj5egibq zdIexN0wYza#&FkDFXO8}eiZqt3(ZPEr6CB%RDX9Qt;p2KejicE%3>Bv&P_Z3x@D2K!j=Wh$OENv9uo8x%`KVE2 zm!LOy!wn)EdjI{quy$3ipmV&^jn(jERm=;_e*Uy&d>i#z`Cge374m6G4Q5qCHF6#l zzjr+N%#sU`NRX-FrKzL1uzdyAwJyQo{3+yZslyy+lL3jYWk$4W2N=tjF*I4inkAj+@5s(%I3r-1V1K|o0MeeA5SG8^61+`Pt~{b> zMFti^LB@7K%@Zv$G@)Ew>G8*bOE1Q=L&vd#QjgJRhSy6I<6Z(@0%U^T@-xpsO{bB$ z>MH1=E{!hEQN<(!%Dn%Q$vMv6W z3pe@0?C9r&*So9(+pb1h`Y4+l;Rqhi~_A?;ih zLTh#czCG8pw;F`lJCE!VGruoPmvFQ-g*ApMw05f%2kQd`f7r4Fk6SrBJ~@n{T@@u& z%8xON5l&9PsTJY-4or*Y2Q#Vw6H_HT{rurq40sv3p=0riK5^Xkk(28XA~UG5 zYvU}ZwV4+rFP2I*bc$;pU@>o*Z&FJp5tK@T-%X8hn<_HC2kt4U70$yXu%c-&;?d**50WdH~_u99qG$2htb(7Hepn2Cg+&dz%m=~ULl*R>d=Tn&e~LV z;Qcdy$~IREu@J9!ELaP_2G+vmLIvquGiNo9)=XrmP?8+22{(^p_5h~6!W`f`v2OzR z{?>hHNzQa|i%CAHBGYbQe0WlDNp;nNu31o7Zazaa?&?E$ShcMi|L-6FOcU5W>GoPa5c{nfR`~|aqyizBe;9Nyg&fo_^$~NmbbR!&fk3iFF$oqC_Z%cwn5W1 zj1L!}!GfVCnlrBd`Q6xj$qMu>X-5zSO`4~(gTS_2^^i_BgWbj$%NOyzho8l>dyisp zd}xfY<7a< zdlOD@ejtns#;YY9s|;b(8%L=4;^)lv#CJ0z!H5%-U8X~9}}A>PQb zkl}p|f?)TLKKSRj?!DLG>i5dV9nNE&IZJ>JPBw9L7%k!uz*lbuzHDGyam6x>?kEa{ zfVd$mmCEAA&t8h|-W;Cz_Vak|ftR8B%y3xZahf6p?oSJLLmy>l3YAjk+`(=X%s4IT zYR96s9IjryxXBluKyYX(kHh&Yjt`HaY}+V00W#?nDvl=>rj)5*EcCIz0od2UZVkBELNb*VNbHrgz`Nz6Ln|G#HY6Qh;;P#GA z6!72^d$3~Zb@QIr^mq{uegApf`;DjI)Lb0fKZG3*@5OsQcO$y`+r;8cK*^O$@B`0d z{MYyW1y1cBMBl1jti5q+whTJ zybQY~yzWH*L zMkY{-0Cg;j#U>vPX)fOUtnj%LhK5|)l;4N0$nMS#Dl2fT(&>t#|FgB63A8ro)VxYG zjn8VtQ%wvE!F%XoJg0TxFaGX6lq*it7!KGdd6YKG&B0F}Ij{tce9xqu@cZea122#! zFXZ?$<2F&4yK#KIV*k?zkc)+0IU|KFEvry)`vmYE z3CCe1{W>t@J>fMoRoNp}aI3iD7dFB^=D=(>#OFP2B+;Gb=SxG?u89q`=W;GN`)7=~ zUh>wN;hhicGWb0u!w3MG%rw*xrZU6Hrsl8DN|S&3@x}AuH6UmvfagZfuliCc#P^Zx z=@DFVzgVnij0tvaTN>lcP9beklGxJhtSzpWv_Dp1ni{f~Uk)`nKNux#iSKRp^Aa>u z2VSWDBy~Y!m@c|-qR$fNFFuAE(F<9vg;?WkNSWDJ1a{9Bv^QSd*(MIGY6cseb6K+GqT_fT zPEARj-Z%ug&RI|IV{D5 z9%!&a10VdI+wj7Vci~50dJxr80jeT_@95AZT#>OlO_n*8!mj6!;rm~E6rcR{n_(pM z(}LaEv1(B_R=x90`0TCM;)$2{@qICWg8CfI10N$J~-{oXMPu}UCdGxtOMV?+l!;+L5!)Bb>PeD zjHl5^Ledn-&CM*yVj`%bI_V-yT1?b%n@OZ#XgadlY~7ld)dQMG%x4?S>ngLn^Ml>l zA;u1?06sIiJ`BOn#yO8Kx}EX$gcBVRv*$x&23AqvO;01VZNcH?_#)V?Rp+{>ohf*I zIp?bvT?)0gUr6rFHv@LJY$XEcpuTfn5 z=IvN>*$Nzb`WU|S>tDh5KmQ}V^OtYMHSe7frau?pn=}i!=>Oe}OeTZgH62K)CeqC0 zimrJnLDs*d6QB8=_u}0jyAgMMQXo>9%qs%B zuIuB#%ct<-lZWx1k6Z*MJYQ)rQ!-I;v9lN{H*nDje0b#&RHufE`@8TvYnLI*2BLXl zxai}~Jrx9wgB9&MR&|+J)M~(FCx5O5?b|QLyIWdu-7VMPhj%}L@89`2YIX&I@8Hy6 zhzA~d5i5Uo2Jns#P2;!_uiO^j;T$oqBPnD&j!c*9Y5!!L9m*z5DT#oG8O>uYZ#yWFCW5h zzWKjER}74uoWMW)#@BGqKR$rZ{I`!`*~X>k417DTZiVC9P(2NL*r>`d)9k?suy08h ze(rbQk9U3SM*QesAHpMdJr6Ii#X%mXrbzH>XqL#JELz!lPGFZ!V~^amO8}X}dxnr} zP2%bsR%7XsmREK`1P9p1bfJK9sVJn)!Z3hWE<(4fxGa~#?=J0vF%Q^f_T%Vi760s!$&t` z)e4z`=E6BKHZJ6`W@p3s+(XC5@yMM!v2OeFS0oGc?-`q}SdV0u<<2Sm-j{ztP%b|I z%U{ErKXNtx=MS&OcmLrYSi&ZF{)mC^gk8X-o5zqdij=8C^QnvxjjPDGWbLNq__aU( z7{2LbBHa3L_lyh5PncZaKiaMzRG_Xz&l?Mm@x|$t2;0Q8wY9Rl}ww^+EpDFT^+4* z>^f!mZWWqlN(*kygl(%hd1_1oUO|&M{d*Pw+tTYafuD+?MBA%qW@-e!$I3&<2L<6k zMkztfYn-=qD1i#s1`Jc$V)KFtJ=-7@4R36GhSvT z9R)sl*RSBb2>8WSp+>Ij3L_FBUp79DkPUEjZKKY!XetZmr?n*Xx^{Ns_~JQN5?QF7 zUBXVC-=C?%MMpLQesNv6d1%y9;P&43%eSI)amP6U-@IEu-k*jN1`_xNa>0m2*&8S2-X)#*)UUrs z0N?L_+1o+jpE*Pect8d+M+Sla-T9~Tf!5_YeNAKQ^TEtc4q{<0>?~4Pk z4Dd$MP8G+&?&%_eS`~rjh)k{NJGiE!1;4Rw8M2lo07Bg0#^9niFjm1oJUE20YO^LQ z-zU#GkxR`nmJq`K7p%nkwM+2a&I9>hu{6e zYLR{8A{R@N%@-Y3P8@5n1cTKvl$2?t4HKHDLk%>c_Q3`st0jZ~=Rbc058wF$?)=Kr z_`uJ<1kt-MtB_9a|ECJt#=_%)TWa019$Ai($(EqxxQD>Uz7;w zGW%4&r9psXHVfBr;l4u3!99ES&-qylJihqgQ}}NyI^nw>a%rQf!HvOB5S#1xzC>f% z)mOtE9Tjp?)qVS+_H@DAa%o*DpsRCctclN-$Butn$o1K}hvO$lux;}y0jSP!3uKTh z$}wNIh2``44wmd2t()iL@e6Kt7|JHKGXUQUTUVpxRxw(efUDGm0G~i$zhj*l8gdR3 z8oRRU#O5<@kStTJn^N$?5Tx>F+>FGw!Ep%ViiQ^_&zQG6&iG2JVA%{-7rTi5p5=a5 z0Nz(Xo1#Jl|DJ%C?s0v6sL>>X8EL*Zk1lGmNt0Cp+mrK0-2^2`usi>CRomNPZoUMe zY1O65=6W4Aycgb|D8nwm@mU)Dc)s%~nJmOYypdx8@V*AYh5=5pbhmWV{<`;|w50OFO@sr@#nqR%|dGGh!bM1aO7>FO@Ng(yl^Q1gsQu8q3Yn%k^*k{oc zG)?fNwk@pMhDYvMiM1;RQxt|Yf%t-W@!2RC&2J6*)ZEBfhkFAA}jB7GR|n(tyMud!GEZclhx4|E&kD72o1d1%>ZX zhcCgx`7?3fgU?~z`YqV7X~%%*H69|9A9@gu2H~`M2CBVe@9rKfe`F079x?~h_c3C< zN(I*y{d!9dor@I@t-(|Gy@0kUtvKfcCyCfi{5gK*B7DhIH`6QH&=crE%pO3U)gfEX z##mE>YF_x3=Pj=41rEBTy|zS8zrkNuQ?MFXG{>!HtB5l;!i(*5F6IM zg=0@&ihUPOg2!cr+hvRxCZC*LT37EB|ax7sr zkP%!IciFb~TN<1qI=%7gVY>IK&hAE?eLDQ%0Q!P`uv&~MZmjNdeVHPRw`HtT(_2eH zZH%0DJB>KBf$Jhh*~P27JQkS$ZX~+IjKg^qc{CR|rk;mqB&H8;b4*pUc@2QLuWWXF7F3VwdB zm!zXs}U$2NzF+ z2d7?j62h_J)hZsWAH3}$eCVi;;uoL#6?Sjko$+t>0+=lh9>_9XU z#p>rbqGP)kZLKY6Y;2S!H-06GUE*%2mnv4y7gUi5n%pi#`n=No81ehW7ar`~gHTVG zs1}bQONLwQ2kk!(SG?;~T>pbl;;+B^ zGXCF(-XRxPKA*WxAtK03ok)iEiihu6fp35ER_xy1iC3TBfNxxR173L4@RW}=tdjCU z=eh-M3SVZsvQnQ3m(7XR+7{G1nh}jMC%Z;od+vq}4#XSYNXE5iZre*@LVTUk(m+8d zLoniN#Y|G*^GGFjt@H$YJQBTUOog-LyuPAr)(nMU^LXH%Ia9=Ll&K`~Mm4c2Bs8DN zYsi!e$8hmY!E2v5Q7+Cnfi33brT=g!_L;rAr#pb1d;RF_4dC(%m*F>mc}$ukd0!ON zjD*W(?T}p6?$i>%Oh{tY!0=}I_^G#yrtR-elLVNU% z$K~srfBzbmE*qNvnhKsjBe2T>+-VEJ>0ot%UH8K)Ev#O#V&iUXz?GjqUz#d7&5ifp z-RZ?ccP_^h_pg>l4o*>%xmg)b1pGaobb9)tXvr|KcW*}@?z{UH)YZFC>v3TE^hR{~ zcB8$g2lWm+E}SaZ3YzytzP; zGI?T)d=bWKoqgHcvFyZy@xUFA9447uEUvE9goJ=dJ(@} z-k@wBC%@i%cXpz&jg4r=>uR%eYt@NBh#lS`85}{6DJ!Ch#bUlU9uAdYN&*|yxTXVu z-yg(Ze)$MqdTOHxU6YR8UOfNA>p1A}xv&=DXd_iLiGGS<)`VtE*|8hj_I4V%xbf|e zI+qIV_I+J-JxiUn4{jbSiWxSa9WvJ_-1i1GfK8tZV{Nr%fF6)|Rp z{WIe2A2&XMTd#j)=+FCtc;T@%IP&e;j|0WV%y4G4wXw#q6yzcbDL6SInIex#G|8`5 z;&!^#O6v&otc^Tvn$jk9|G5xM7Sj!*Z97r6t)R|Uz^P~@b|Ep zy&LyWXM@EAX6^E!*F=m_!OnPfSHv#UBP312NIXe=-XcbW91IkRTPrw-W9UUe-Lhp8 zKNgJ-g~$enN6eZr2_L-tL`<8~9FI+lVNX{;V#wGanad6r>aT^j*GtKf@^SU{ z2JpzE8}amW+XoN6RttiYYS6fk6PGQVi_0fApuaDeb!rg*nOmTz96TL=dTbNIVILfh zx`7LaY?g*xm@uUUmwn=VoO#Ldc;wC}ao_DvqPw#fk!UDB*u#Nc+uHH`!>?fBA+yog zGW2~ME4urG1E~imUUobVKi!K1PFjjxTi-%cT+sFR`tYNV-H7KOSS9gl9E5VwC(nSV z$s{|mjHLCJ<@I*5!Pj<179?^}t9QyTG(%a4XVv2!O08BU$S)*$gv ztan?YoG5@x-gYP!9dZCJ{lWDEzeAz>o*9$ja%3J5B6+E7lu9Fb`EMhEzs*DxelFV@ zog!-Q`}?!_%da0ECQdl5Y{Tkp#)QN%9z4NnqT!!4rb5zJ%L<|l#qc;p*rvmnzGnDp zC2b=<%9fQ+E)C{GCl1!3D79MMB7FNpL0AzHam(N5`eN#Z>|P~^UE}vGvg^PKy(ZT$?ndsp6`{CsjG;^mZ{$&h5Pc``5fRCLS!ZjQ;fe66H*4kS69ge7u_Vr0b zpFf9@zr2v30QR_zoL^cQI5N1#WxT&ks>z2#_M4q%npyypn)n*Xt)>;eG9gj-bCq$9 z3f@uTh*J;4f+P0Drsuc9USn)Uo3MSO)>4nlK6R;xll~qKTo`(wYTwo|>^5aoaE}kZ z-gu0UwFV21n2WZ_4XCpk+qFE?m|~Yr6)!!r4iDY^4A#87Y4CPfBV-P)gaqYAIBZ3K zpD|=08HV}4{(1)zAryWe6(eR5sC$|?!`BxLcQ*VH}Tr@ zZy?Zb>_XHwxKL9U!9Gi7NkdVpZE4y1bs85ojEssz{Zg%@u;AP0^%-$(fj|&9{`f9D z_xNfNKXM^u2^f)h+&Pe3(HiXS^y1Nnp2azr95F=jhRo_)Gzx!Dk0D0VtPfVPTvkq0 zGyIekFt)}<9675ACm*yF;XQkB>C{P>lR;1?L)(FDmj}bR;a3l1%jP|pyYD2-oi`cN z_nDOQMGimOvbCM`&?S%8Z4+U#V~-abHg1D2)B}gjEf<@{2wmfI9}0%CY29|roR()2 zN)e%@A<@=A0nFlbVwG~sYdghCGh_Y~G)$5AQ*2{UXIlaptH zsB5m3+w=NE0~O!n&t8Uq-1r|n_vlJ_EqCt<;iV^E!9hna#QdbutEI-}kB#DCLIZo{oVxf6B^6EKXeUGswK{EwW93$H$1rlREn1&=@IfZHC8=cO7!{H(~W zU$Yf;4Q}y8_jL6c7gDjH2pAT~Oj;*3VdlI^=8KCkpnqT&!4SSyu^nw(yA8*k zG}LQfN__r^tS_r$@bmPS@86A{j$T~xl?%`^sS)Wk6vZnASY|kK*#>_wEV~Jj2rt@W z#zj~tg8$vW8UbGrO-;3!G_3)_pg-jWk=f8@!uQee>*n@6B~igdrJ$vZ|xBqLmqP_1}sUgX>G7goH*q8M=JuwDeWL$|IksysYVCe;_HjMd9;18 z3eT#yJKjGc=^$CE&f?crlyQs--ce-ElG!-^oyX#ZyH>$gV;|g-XUP9)N8+5TPs87T za=UnWYhnS|Ir&ON%J8#@DI`tN?2qoH|!8;(8uNX%X^9Y6TwZ?N*IR}l^cVYhJnv{7;OG`R7ZGrofv z^QPe9YtF>1MN5V?;(Pd!^RfTIbMc;!osFGa+wuJWR%7F9 z+p+Sw*QDZWvh4W%aQ@{dqMKXx$*>ciqgi7SL=(-N2}q`Ety?O)iDH+q>5R=pg`CR$ zp$LBQ@J6iN8j@Vyb||F?G=pNpZeS<;9M zWF?%UH|+Ic`Qxi_<;PD!xgY~df?-K{kqT(76CeHFWir}4!ij33u-K(W0%Ph}-Hk*Y z=<4;O-|v$#y}YQp>gp3k*hwaGFald7CIZ_`FEF9yh8Ot58x3h`h>8!FU-W*bx;l2+ z04p0-<3g8To`nl#l3L)cx8Ps54zb?8jCP20cqX@@{%wO+hD7McUIhrs2So z_s82VI1;rDwfMx3KPF9Xrtl5M{8E);b&i$a#Ee)I{@p4QvREZ>!WKX92^7Q@C&Dqu z5aFAuxh)qY0;tw$94wQjU~wyW)rxIc_0nL%L*irP7q{5=bb0Zg=lXEizDwY6=IFh( zT2V7)3Z~3ifD=2zxbfHbAQbLHH0DGs7J}7o6aOKFE(Hb~Xc%$CZu~79cHy?4{u?VE zUNfxXEU*&i3&HCfdV(?G5Ql?~T7ty~&BK}%>qYpkd1*bKePjhrKes%xc};qKVN9Jf z6~DaiTT&%r_cnc#pZ?9Kar-at!~-`!h`#P#*x`a5P8mzwzI`v=czH9Hop}(Z&zqc5 z@P7Awzrh8cI1T$Oogu=S-Qv`+cF7HOig%F0mrZ2+{K80X`Mb=`}bKo&aLO=k!I{lI=z=~XbEkyXTlb*W^>9&u#;&=hd*UVgByy!gX z+@oQ4*seYz#_R5qsz6RVu$j91UH+3SKk2?ldH;2Zg zhR1CR*Lt^I5?MH*j%$o-j(rU2;OioBV+kFlJQfmG$R))h;n?Tx@!_$1U&dMQIx_bs zpeR*_3f@tMF=ZeA;rrxIid~A_WG2p-I86A4V?oqV)JoOYusd*D+7xa49tTk%!UJCl zFK!0m%SuQvXe2ijid1g5cjBJ=2gCoRy)8b5Q#`OyRv$uWsXPcCz~+`|(_!E5K=3#AKX^VCEuD?Eue>R-Yc|K=L7pcdQ~0t{#Ei^UkG+Ve9(Wo~ zt4Cg^#HmE$gYFAp_gh`E?VO2Z;oH-Zo6TdaVcZsxG=Y9Sdtp4I}(Y~h}{y@(_=CfISn>r)j6c~ue7exp!u9~y>gvH8}Pbc=g5gcx}}N$%ZaRr25D-1@Sx&exD6%{2rUz%xQJ` zB4XETq(mfQ<0v+}Bc<@=kMdY18NM0Q4pKiR3QQ-nz3u$a#67#A(16(WuV0VQwr$3M ziFo-`V$otbt}p(7Q!^q59FB{DnXc{tZhv?SRBa*@D9 zi$u}u?drp}^=~0pOyOIuTY|}AA(3OxKL-2mKNr`3>34YJg^gIhd<$$G6YL10kAoYS zshi{nSo8b_^!j?xI<-kWgPDAbb_cg=T?4|Gl~9TpR?&L;;*FGf;O*|misf4d|G&qF zJ8ympM;^Zr2OPFfO0jGDX4An7A=AIe3U~xoIQQER&bmf?>e|ckt!sae{yslA;o4zm zvtEr<4yVNhuZbyq#aGFk;|vJ~SqC{d?Kt4b#qxFjm8VK`WnVW_P|6PxmT3l=up$}i z2}pI)oRDS;KWXO6Cfq_s18q8zg|A%H#+$hKUL;mHbAg%C4jU`FhJ9h6K`q`?=3BQ8 z;hj4Nrm4yEX9`Y;)!o$h<#O2IpvOFJGvY7|=aNMTJM8G{4T|lGW0R9#3-R10+@>LX zgYw+?JLX8@RLI)P;<4aP1RL6zaZXOWXjxvbm7-J|>S8ZLD11Np^H1RC5C0f%JLhP_ z^A`)j7xkh)+Ji8Hav+>Is}0M}9hw1}a%6CO5AOTj!}!j-e~s^5`8zyu`}64Q>__L; zjywi!4*sOS-;e)2x*DrjZh&mYE$)$O?F-ZyZ|ckafE55FQm=XN`>Xuml)=&%LSi05)=7U^v>CgRk0 zarj3V!3a|ZhUOvDf5-s<I4(F4^db=K zMI_db3obb+4f7fKbXoB#G;5z-Pnqy;9sPzek~* z$*7U<`XbXxJT+2LN{v={%M?~`r_Y-%!uO*8cL8qu**~P>8-;OpusLiv@|?k#s$^I( zTKmlFcgr8d_f|o!We8s z;Z=0Zf_8eJ-;Jm6@!(&l~1h2QD+}4%`#J_O~4uFz74kO?m9O<@ZBpg zYyQJneDp%pHn>G((F4rNI6Z`B#xBR*e(DLQJMw!vzi-I%1--`|g#U>LRxNK(%_S8yq!G%B}?SXgcm<BQyiM3tx_}w>9$-cdM(y4Izs&SAZndP5E<8( zDTW3yZe#PN-FR!;F3Eh3Sd54&R^y^F`6`Ov{`3ya{_qi)(U`mU+^p^{= zi{OIfG5ie$6!nCRJ2nAb{$03b59Aj*DdhgoSfxmq7 zcD($^D^m3$%rpM#c|X8!pSce1>8Y(MiPN1pQZ`m&Lm(2CR0pZpSq#78kk>pG!&8s0 zLNF9SIBaYHr;;u0Z*^iuSnfR%k6zub$RUI|MUAyfG{h+JPfcBoC~}S2b(8r?1slT9E4Lw`cn8trRqEIlE-3j zfDvV3cxKI#LW1x0*ToBNie2&S((aHWe8>Y<)fot+?vk`17Bh zKxbzk_E|g~ZIhbBQ=AEo26sC+a3l5S*5z=@>&Pr#t@bKPW>oN&IXuoa))`G#-F;y> zP*0gN1(Rn_Mpt_`9=Yu?+s%CLvX-e6NSeX zLWC8M0O!Vs5$q3O%;mex8Pf6#OsdEj)+Y<8lyhRFvEg)ij!rHWmPO2UK1 z5`)t{m|w{%@04k6@|6obiSB>UKKSIfufn&l{Krg*7gGBS8_=yl;+a z4Tg*nuv@ox!CmV{Zx4r94Cliq&c;Ctaud6WBv*G$C`=RkrP#oE_2=G&*Vb&#`L;a{ zE7q=j6F>dT&Di!v`#?^1;(ah_Vp5A+)*376LoOu8nb8-W#uL$_Uk|%DrL{T?mhE$koVTf|NpBc5tV_h%;Uf1P&9HZDx92-1@*x++x zyyH7AISO~*{wzMaU}{d!o0HUxCeX~U6O$eI*`;Ti&3uZY3`YfTxmR}UjPbD)yJlr{ z)l;wF-ap=tmmXb_@Us?JV)5+7VF&EQ1Lfd9*2Yp<4=e~pxrJ5(o0ZiUKf;~exat4y z#f$%4gF1@^wV@CWn?D&dn_Z~2#$+2X*YNYih81tm@KMDS3vAE}Tl_fiu>EoV`_Dij z@Lb4~EvrB?mh6M~fBD_`)t7#cfY0zU_xt+L+0i`^A4LJiVG8thju+vZO6<1p?7$zs z@n@`fWF?{jBmRy`U(~uIv3x&=d*C77)X+iMB&Sd95bX{t{OO+T5-eQ zzG#ep1@Q69zK_?}ZpF-IJEk={uxLgTjyxd0Np}?EtnS)5AdS>+yYVwayw+7}Y5 zy2T_>_;PRrlgBK9AUgJjG5O$qU_}^xufB?CZ|{KE4Fx&k+PDzON9=N~TAQ2Gid~6Z z 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�UJz- z`RmY2U9qS7eWfJhfg%+09GY036iptk>E!6ba)dy5wgnpIwwH5}hV<{0h*p

)`8c>(KS!mQlW&CW|ZePvOEoyFE9iF@u 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 literal 115441 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

7F@=4hxtZEV5u{#-Rx z_lNpt*WJ3|}x5fu``K+ zaE8u+8<n{nhhKtLU0 zpAUMQ%WYmm;#yO~0a{{EJ;$4W7>nh#fPoWX*j;(&A<*?Y44$d9KmBX(rq2$}U=?6n zo)4IzvF{IWkS+T%e!lU~2Fh?&r;A#LN}qnKTdojBSQcBmOdeYgxBLJgV-NHzn)Gm@ zbD3AXBH_^+m+Qm)5)WMiW+TXv>PL3w3$;KR)R`XQvR8euUVN`#GpCXP*&T5ebjX+T z_QCJklEzKcVQ^9ZBj&bX?7Q2zG))@euH4sm`~^ciQi%Mo4#bjFm7TiElqaN>19~|4 z3xDr6&oAfaR`z~6=?-!ln0t(cKOw)#D9KrVo7VAdCi-zM*Djsv{pCftHWVpqc`vF^ z7+2O|X1v@WazgF*?*!8V)`ax3;e}c)vr{YfH&?!N>JIA{i>1)Rn$`jAG)g>UTACi+ z(ghovvYcN2+vfSTOU^SQ!Yy)UL_u^^pxbHP<@k8e^>~#ZBIqdC#_2R`0BQwEV#$Cy=VI}gpeXi&tpzAKR67&Q))l4vD@G^fMHiGhHD|N z9`TIvkf@3o3OA)3d)%xxnmvLH1N!a+M{j@qE3O~I*~HOL<8v^awZq;g9R?u;j!^#o z$9ET7&jY80E)N>SHso^eh;fv@P8@*5*6zd*JBQMJ1zIlJ106YYkfnBf%C`C}nkije7ngyTxtkPrLRHO)yDS zR38($%_pGnOpyzkW#hi>-y3snOnP#%d%I7&ENDUkzX32;oK2QJs3IQx_jA~H&va=Q zW?=#oYr{eftFK=BV<-&2UsrQ7`JKTozl#MUUj!fPi;6oP1Pc6o`7R;kI3T=R`{tzW zZ&=P4nEl>Wot@Lty`)J)1IN8mF`Wr{$zYtoB`3I@B1!mWS#F&HqbxJaR-AA}i@LRi z9NpC!NSf(ya7UCG#HXW`l4Kl=W@&gX1cAQZ|87fTLKGz%9|w{G5WWY#4=>bx9ShJ@yZ`G5RNuA^N+$nX_>vvB2(aLUI!V079Q+O*P^!uhln>n}fZg@#!&{9(k!pH? z>PK2hNEcfqVf(}5=5GA&XU32fNq!Vi^v`d&LI4`Z-q_h3a`We0wRrT2!HH}KV39^; z`(*izz(F@#1Z(Z?UtMHLN4_7b~%?-&FDiLbH|7U-ojmTmg&8ss1anq)ruE*2&dD*V4%X7l2fF zhVK3Nu@8B0bd;F*kK!EN5REud@ZkNIp)4bW$45}{vbQRPPI*^%*<>NQKWqrlU6}m9EVc}>*y+tmd-aU-=+CDQix-o zbtKa4}!m`&HRf=`-xme+`ieG&;aI*?ChCWYd4ev()7}QS5|0f&w)J5 z4kYWhp%$cvvB`^h$iL;47Er09A%a1_cAL;47KZF%HLr`QkZOAPJCk#DkRjx#mUP>d zi&O9c_Q)Z8Af$cUBP(PM50o-*{Bvu-)2SfK-e|A`P#6rvpgyqRyR!1@<=NFx#c;K@ z=uUXv`1-$H@2|g`T0ou1djqbfQR5*ujE0T&tCf$_N-5%g(^7;l%41ct;D!Rn#DwUM zP3`}_v&23LH6X!~0SnylLak%FHPLW`t(WG6x|FvQf6=n6q{_ku!Qt|)N zdbdvbUvm;VIsiTAzvi-XZ2ynw{~Oc)$5Q`SqU^2jq~SKdm1WUxYWIMTih`zmm8?bR F{|CY7J=OpK diff --git a/tests/test_display_plotly/null_values_subplot.png b/tests/test_display_plotly/null_values_subplot.png index 895e81bb5c7fa7769b404f445bdef234318adfbd..23590c39a66a4cedc77146a1de7319841f1bc1fb 100644 GIT binary patch literal 83890 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Ó=_ct1{? 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 literal 83207 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%0AVzSV=)tJKZ!yVQbW@=!; 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 diff --git a/tests/test_display_plotly/sizing_modes_subplot.png b/tests/test_display_plotly/sizing_modes_subplot.png index 82c5687bb5d32ec4b32095615b7ef89d2142d526..063ff752f22bd51df27866b8680e892e80a30172 100644 GIT binary patch literal 120677 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 Date: Sun, 18 May 2025 10:19:27 +0200 Subject: [PATCH 165/211] move to data_regression for fig comparison --- tests/conftest.py | 56 +- tests/test_display_plotly.py | 28 +- .../color_scales_subplot.png | Bin 125921 -> 0 bytes .../directional_symbols_subplot.png | Bin 116028 -> 0 bytes .../field_coloring_subplot.png | Bin 116887 -> 0 bytes .../null_values_subplot.png | Bin 83890 -> 0 bytes .../sizing_modes_subplot.png | Bin 120677 -> 0 bytes .../test_field_coloring_subplot.yml | 1780 +++++++++++++++++ .../test_pixel_field_color_scales.yml | 1780 +++++++++++++++++ .../test_pixel_field_directional_symbols.yml | 1751 ++++++++++++++++ .../test_pixel_field_null_values.yml | 1286 ++++++++++++ .../test_pixel_field_sizing_modes.yml | 1449 ++++++++++++++ 12 files changed, 8105 insertions(+), 25 deletions(-) delete mode 100644 tests/test_display_plotly/color_scales_subplot.png delete mode 100644 tests/test_display_plotly/directional_symbols_subplot.png delete mode 100644 tests/test_display_plotly/field_coloring_subplot.png delete mode 100644 tests/test_display_plotly/null_values_subplot.png delete mode 100644 tests/test_display_plotly/sizing_modes_subplot.png create mode 100644 tests/test_display_plotly/test_field_coloring_subplot.yml create mode 100644 tests/test_display_plotly/test_pixel_field_color_scales.yml create mode 100644 tests/test_display_plotly/test_pixel_field_directional_symbols.yml create mode 100644 tests/test_display_plotly/test_pixel_field_null_values.yml create mode 100644 tests/test_display_plotly/test_pixel_field_sizing_modes.yml diff --git a/tests/conftest.py b/tests/conftest.py index 6670330ab..fccf2154a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,22 +1,56 @@ from __future__ import annotations +import re import warnings +import numpy as np import pytest +def _convert_ndarray_to_list(obj): + """Recursively convert numpy arrays in dicts/lists to lists.""" + if isinstance(obj, np.ndarray): + return obj.tolist() + if isinstance(obj, dict): + return {k: _convert_ndarray_to_list(v) for k, v in obj.items()} + if isinstance(obj, list): + return [_convert_ndarray_to_list(i) for i in obj] + return obj + + +def _sanitize_ids(obj): + """Recursively replace random id fields (e.g., id=12345678) with a constant value.""" + if isinstance(obj, dict): + return {k: _sanitize_ids(v) for k, v in obj.items()} + if isinstance(obj, list): + return [_sanitize_ids(i) for i in obj] + if isinstance(obj, str): + # Replace patterns like 'id=12345678' or 'Sensor(id=12345678)' + return re.sub(r"id=\d+", "id=ID", obj) + return obj + + @pytest.fixture -def image_regression_helper(image_regression): - """Extended image_regression fixture to include helper functionality.""" +def fig_regression_helper(data_regression, image_regression): + """Regression helper for Plotly figures using to_plotly_json().""" - def check_image(fig, basename, diff_threshold=0.1, scale=1): + def check_fig(fig, mode="data"): with warnings.catch_warnings(): warnings.filterwarnings("ignore", category=DeprecationWarning) - image_bytes = fig.to_image(format="png", scale=scale) - image_regression.check( - image_data=image_bytes, - diff_threshold=diff_threshold, - basename=basename, - ) - - return check_image + if mode == "data": + fig_data = fig.to_plotly_json() + fig_data = _convert_ndarray_to_list(fig_data) + fig_data = _sanitize_ids(fig_data) + data_regression.check( + fig_data, + # basename=basename, + ) + elif mode == "image": + image_bytes = fig.to_image(format="png", scale=1) + image_regression.check( + image_data=image_bytes, + diff_threshold=0.1, + # basename=basename, + ) + + return check_fig diff --git a/tests/test_display_plotly.py b/tests/test_display_plotly.py index 6f8640ae2..0d810531e 100644 --- a/tests/test_display_plotly.py +++ b/tests/test_display_plotly.py @@ -487,12 +487,12 @@ def test_units_length(): assert ax.range == (-r, r) -def test_field_coloring_subplot(image_regression_helper): +def test_field_coloring_subplot(fig_regression_helper): """Test field coloring in subplots for all colorsource options.""" c1 = magpy.magnet.Cuboid( polarization=(1, 0, 0), dimension=(1, 1, 1), style_opacity=0.2 ) - ls = np.linspace(-1, 1, 10) + ls = np.linspace(-1, 1, 3) s0 = magpy.Sensor(pixel=[[x, y, 0] for x in ls for y in ls], position=(0, 0, 0)) colorsources = ["H", "Jxy", "Bz", False] subplots = [] @@ -504,15 +504,15 @@ def test_field_coloring_subplot(image_regression_helper): ) subplots.append({"objects": [c1, s], "col": i}) fig = magpy.show(*subplots, backend="plotly", return_fig=True) - image_regression_helper(fig, "field_coloring_subplot") + fig_regression_helper(fig) -def test_pixel_field_directional_symbols(image_regression_helper): +def test_pixel_field_directional_symbols(fig_regression_helper): """Test different directional symbols in subplots for all symbol options.""" c1 = magpy.magnet.Cuboid( polarization=(1, 0, 0), dimension=(1, 1, 1), style_opacity=0.2 ) - ls = np.linspace(-1, 1, 10) + ls = np.linspace(-1, 1, 3) s0 = magpy.Sensor(pixel=[[x, y, 0] for x in ls for y in ls], position=(0, 0, 0)) symbols = ["cone", "arrow3d", "arrow"] subplots = [] @@ -524,15 +524,15 @@ def test_pixel_field_directional_symbols(image_regression_helper): ) subplots.append({"objects": [c1, s], "col": i}) fig = magpy.show(*subplots, backend="plotly", return_fig=True) - image_regression_helper(fig, "directional_symbols_subplot") + fig_regression_helper(fig) -def test_pixel_field_sizing_modes(image_regression_helper): +def test_pixel_field_sizing_modes(fig_regression_helper): """Test sizing modes of directional symbols in subplots for all sizemode options.""" c1 = magpy.magnet.Cuboid( polarization=(1, 0, 0), dimension=(1, 1, 1), style_opacity=0.2 ) - ls = np.linspace(-1, 1, 10) + ls = np.linspace(-1, 1, 3) s0 = magpy.Sensor(pixel=[[x, y, 0] for x in ls for y in ls], position=(0, 0, 0)) sizemodes = ["constant", "log", "linear"] subplots = [] @@ -544,10 +544,10 @@ def test_pixel_field_sizing_modes(image_regression_helper): ) subplots.append({"objects": [c1, s], "col": i}) fig = magpy.show(*subplots, backend="plotly", return_fig=True) - image_regression_helper(fig, "sizing_modes_subplot") + fig_regression_helper(fig) -def test_pixel_field_null_values(image_regression_helper): +def test_pixel_field_null_values(fig_regression_helper): """Test handling of null or NaN values in subplots for both shownull options.""" c1 = magpy.magnet.Cuboid( polarization=(1, 0, 0), dimension=(1, 1, 1), style_opacity=0.2 @@ -564,15 +564,15 @@ def test_pixel_field_null_values(image_regression_helper): ) subplots.append({"objects": [c1, s], "col": i}) fig = magpy.show(*subplots, backend="plotly", return_fig=True) - image_regression_helper(fig, "null_values_subplot") + fig_regression_helper(fig) -def test_pixel_field_color_scales(image_regression_helper): +def test_pixel_field_color_scales(fig_regression_helper): """Test different color scales in subplots for all colorscale options.""" c1 = magpy.magnet.Cuboid( polarization=(1, 0, 0), dimension=(1, 1, 1), style_opacity=0.2 ) - ls = np.linspace(-1, 1, 10) + ls = np.linspace(-1, 1, 3) s0 = magpy.Sensor(pixel=[[x, y, 1] for x in ls for y in ls], position=(0, 0, 0)) colorscales = ["Viridis", "Inferno", "Oranges", "RdPu"] subplots = [] @@ -584,4 +584,4 @@ def test_pixel_field_color_scales(image_regression_helper): ) subplots.append({"objects": [c1, s], "col": i}) fig = magpy.show(*subplots, backend="plotly", return_fig=True) - image_regression_helper(fig, "color_scales_subplot") + fig_regression_helper(fig) diff --git a/tests/test_display_plotly/color_scales_subplot.png b/tests/test_display_plotly/color_scales_subplot.png deleted file mode 100644 index 25eeca1082861f91fe30d294d6d83039e120729c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125921 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�lT} zE$83$G*eH#7-vCozt5$+iLS`cE4C;UnKK0-gcokU4);(oV#Y#F`sz<{7L`Z`iS~p+ zAZbVk4KX>2r81?73rCD){ITcA?>NhsQ44bzI&&Ub*lVW8h z!#hR$iB+p;Bub>ScX`;MMBE?a{d-?WkN0->5Cl;~W9`_esIJZ>uN@2uYJ8mh#Z$QD z-S5jPZe?}l1L$!D%@w+Pp=|fy#)ktpHXM?mejMER$PLs^tRbc9vJ7#UU@nTBGISzF zW(DBH>v~)&=A1np&5|kLBS`Q4H#|ZjGH@{(fl>3v5H-b!B4i@n{~5wXB28Pvz*QiJ zF^vBe3`ckmBZSYQ7>YKvJVY#>kq|gMChTq#W~+*37Lo&1MiGk!sAM+S{)C=TRCF_o zlCmiaF2{9JY7p?hOY^=v@ptvs<_gj)B3(|Gl3PF)_EpLFRj8(;P)+-HSr`ba>SoH6 zzp#4sMMR?wbakZ&h0+xGL?k2=gmJm&NI669{2g995ph z>~3Cxzbz@93tV1}lrADaN$TA_HNJ-mVo6#?wA$Yx(Y0PKLp!Vr9;b>^$VSX67A;fG zS9cZ>u{zNYVt)#TOsKM3Or)_8bI!rxok=XxM5Nr^N(Op)>k9H~w`o#$E09i$ z$MAb3=_Jl%boS%2FaQ+H6jq!_DwUMZAfa%aXjI4Viet5!h{bd?YZ+G87);%^aVAX= zUJt2s0F#=Qq}Q&0Kq@wcw9&uhq{%x4!}2m+p)M(VDe`D?lAy;Gl;Sx#B0W@4y8B9? zwSm1aKO&RS1RWA&Q|MnavV+XT#p1N#F5dt7^myMIQj_hn3n_?|0`EMkr_3hM*23nO z9%uE#chkBpqumt{{XxX$<#DoFW>Fwx!#lk7z00XtdM4#_jv3TtVIY_^Gou$A$8lf! zG0)!mHNu^31XB=88`8s9)Kjo~3#plPq?9uVIDEyFPn?CtTSUU&E=lj22Y)3A?38n_ z?RN}YQ8~T|b7CvG;cFbFS--prG~c#`$6ivHd+Arrk#{+^@} zSa%;J%^xrP6O&Gu#H!lT zpG#sJKYt8`H9je8$dX=Bfa20$oQHLQNN?S-li2dwdP1qN+^3iri1Usb2}HDR@XzTbDE#%!$Jk_K_b1?DFp&VZ!1tRVA1 zO(hK(<&6q?gzpOKN*XYmUt%aBbc2GRsz!`R(`zLB+vV$VT@X(bURUM;luM{P$o3Q2 z{#LU_+DOwL6w(Dnk|&?jjNz;$;j6;L3ADGYqHW)sBx8+ItJ@Wb<8oPX3AQF4g^E)e z$XnBEaH#K+NEZ?_#*9u*P&@66Q;j1f@CMF626feV9G>sxpGn%P?+1JAb z@jI6~>~xC2?oI6Mj_yi5wn*IR&MC}Kh&-4k6ahq$!7rpH{zy{ZJFBMRw3_hNR#A5G zHOx8v0vcAm$(#SUkDc$lC?x>r*HgGmZ(zWum)T*nCA4)J zMwi;R4G#ih%oLNANL(kDNXi69F@}2VR=mefV%m}kbZl+miF;q-jlaG@s6A7xMMO#6 zN{{z=VO0UKP@Jc4d4{LH`!u!lYMFK345pks8D~+CGsFH+SY5#N4_?ph7u+sMuhh}Y zA{ll`>rcM!lztw>_47wcSwp(pM|Z_PKahV8M0zVG)JTU4og@(O9Vd%Rpv)T7x=iSk(Kn)L^^6|#Yc_AZRBDO6UQI@<-JXjv znfp5kgpAYhA(CE<1Crh%+YD?LH<-gr9&tMJYpx+0EhG}TnW2U}Jp&T0Zxd}_CnKQ( zBJr=ypTe+|V{wllZ5u_}J_f@vmbA5YzXaN5HsLU-gra($J()o`o|2o07K`??YK4?k z9!=Ukm7OhbVGe#kG}cTcn#Ad}kWy+0EAxmcm00w*ahg_RF?C?!EesL$P5X!$6Nxhp zLn$24x=avT)f7cBnQ@mcBb|;A?p%%2VU|g3x>|>c$r$u*|5&^jyR8wkIhH9Cyg$-w zug7Gsz;64H!m8O6jJuMUZ5kxr7gI2X8nVDeTLZgaeuQ{;f>@Tk1vMwdbrZ2yj>b7^ z3a+{-I7dv_&%QGHRpH(tEaQTa9(%G_GA%a|!4>W2DJZ~m^r@81S<31)ue0*u-xGaz zIk7-HF0+cetcua6T}jQc=hMDr4J+^X3bB2=+5P;3?0M;7?8Oz7&N_-wCtO6qn5hF= zmx(@>j0B0aw^MiIiNr&GUi6yr|1n4;0WEy^;oh9#2l<~()>A-xuF zG2Z%V*lZ5m1%*sL=UPUdd@1{O?PkrEHT(3O9DgJ64)bVfudgQAGU#1VLF3n`dX zPVwY&iYHZI>K-HaH-?IK6z&gMdotnLkc{fG%ABwS6m2+SN+nnPS&oGAZzldR5vcqIcCYQS{Q666Y1vJG)p=&Hf z&M|nLRTS9A9MV3s5(Y6~3x8dKL^@1+dg%aLD$}tL@btoo_{H(`rCZtDrzkLfW@lM(9YCOOQQ!_5R1)pmXE^}r% zGM$cNgr32vt;J~*Nm{-Ab>rzuVoV~bjOpdCE25MZt&MoHg?O?QJszf`;ZaIF`*0Uc zC&J=xnM8k>)#bQdBFf%+viR$$t;m63~1V9wGDYL7m9z-tkX5-)uBQ|SJ-UVTuI;YsIzj;VR1H{ow1(zFv-#R%LbWoRaq zt;=8Mz1zM>?Zl~^@ZQv2Lt9t1(E9g16izDR z;?JFh#hM|OqT1RoPr03rja?{)($8Oa+;L-=b>1vVe)Gwz*QxQwL+`U=(>_l8?9ps| zZ4P{R{564`06vuw$m_aMdee=j4)4Z`Qm%o>7!`Wv|?MHg|zOw^QxtD^G1$f<7 zImZ3|qCc?XrJejS@$-+;M8g=ye+7mK@5jWZ#tz(8dpAkV5VVg2vHWJWCuoUoV|!o? z`=Z;37_D^bJLLe^x-(2XtW)co#-dT5q^@W>tHbNr(w50a7v~|CU#%83quUh`;bfX3 ztCte1j|tw9B;pP1+Ho0PPct5mn#qhFz+YE0pW01;XUm6&*pEGUJSlAs9qAj0#$LwZ z7>}avU)vXM_&O!_Cvdwm`sLoF_hh2BTl#%REIA58e?j>D{*$rW14BZ1+uHoZbOn>e zEJ><}o(q!mQ6cWX)11T--;Lh(9(wyK)W{CZ(XFVupXRO<&0V6_>u8+gF2YrJ8ckY~ z^__bN#$)pS2%VvrK*^|{o|c+kyU8xwZ$$6--6eZmWgv2U2>N67Ic%|!d~AI zzd_M{v3Lq4@+dCThgb_PI_!iu8jaD`5yWJ3Ns?+cn+QaDym${4;+|Vo1531xu64_4 z|KLp`JJzA^+lt<@TPAZg$H8zFQE}uM)SZ3}N^K2m1KVf{W;Cbbo{D}fCX_<{Of;gX=S!Hm>HiJHA2d%GVKjkIDf^uYfoo(Feu-*!ueOy#2#Z zQNQq*AtAhbc6XvWthq5%5VVi;P?C}bJx#~jee8O58!amviR|*@UzaJ$&`KvU;#AJ9 zWA2wuVAN6LSr^~J=JsYeSrONs9YckTC_9E0SUj>1j`xnBYi}pN{=~28*wlsD$ha*G z}gCmaRT*=MpNju%7o&tE%*u56RSAu+b6O0_03d_t)y~t#eNC>Jzu$>xBl`z zB(pxgJ!AE(GpBOdZT;m9qCbc}C<7jvd!wGBr_BY{DUJ#(EFf*}sQE4lqu|<+%t; z;xWo>zn783cI9^i7R~63RODT{wtteUaxFu!`|Q6nc}hRhD;h`wWK>%V~=mdO*3}0jtK5#lAbb%CJgqr zr3glQx?Fh7d9>9nqf^N|4D*qF@QO`9ka1m4Q*JGy%I3t<^#)q(LkheKK5xcmEdRb{ z{~nDggkn|b<~gWV4WD}#W-U%2Jf3*6wqMbVe%F}lAmo1ux64mqp$m&8vrL?Qz(;bC z-X78`2%jMBA_A+$9>uACh{bpK32(=mSJ?5y-IRRd$Jh$XWOcMdA-sAtL}=%Ff_pa6 z`Qh8dcC5v;Z!_jZSh_0YcR|rS{-kh7=y}aNZW@lOZXjGyO0UM3Ta;LnOTI>l^9X)keeH+vxbPk?4o*(3$E^Z|f=aAP^@Z32#=O zBQWu}4_ta5t(#l17`B|vSYP5R_v2BSef|^{ zUAcsJ9$(GVzjzgQiIdMga5+`u%KH_~=!=c-Y~hFJ{{q6oEx6}6+5L-1?`5~0-;4AL zxrP`+g>>V#CAZPKv2B>}4s!y4X?iG86Cu6ycENqWnCgIA&&2tuZ?t@ACG?|g)4 zB9kZ~AQF!?i;Bfz!s^uI--WwFXJda)*c}l+b*}#QNCIM6PEVy|luazzi-?UNwR;kc zG^RDQ!mnd*`5}?rjd_ZIhyLY#dPCv}_nV%+}KAog~H&(5YlJqC& z(0@Tno4w!bG&$yyR;p;&*C-zvK0$i(e0HU#H%2egn|)7y-_(d<42@yB9_*s|Wl=U5 zJj+f;(J~2!2ZdCWRL3g9AKpu}^#hDl5|J|4DwfwZq3=|1+k{S6kx@LM1rEo0Kgt`E zF(N`Qto61i6Oa$sWQKqX;w2-Pc8!1$AQ%Z@*6JuCNVs{c^zs!&B|ILhB$~N>h=^93 zsMyv@L1jG_%M_A&D^^PYuk%BKkr=UL-F_pyCX*ntUOL*F<&tVqQHJzp3Tr4h932>} zC7efkbM+bwQKmR5ZT!V|4?d^;;9w-9MAyGc>)&pq>XM&gDyuvs`?7fRE*hTs6MJ5H zxL08au@Eg>9ULZP8E|n+1)uHg;|LWdg`apI<#YG`#WK2#@Mbdp#ge_uO`( z=e|!--QW`m;nq+wX%=Q*F`=$DoMap;#NI_elbYTKe`Z z=tXt~c9}aE!N7^T!nh%o$W&m=*bTkL7x1V70Q6i6G@WfN$)=*ko#NLff zQmihVe7koo+c2x?%_qH?F*Nfr|DHfE7mCA;*h&b$c<`UM&jH8MAv>L63}ZkH`|utn z(tE{Yw;uBMEUJ?wBQNEqO`YyG{c13YN6CqN%`m>W3yG$NVu_Nt2K)9U zWf6WCz3;p3bCTvN?1ls#NsLqO#yc2 z`Rj@{?CgpX2qbX%CgSvrLetzN^fHpV1651o^K8LoUxljd-=ouJuOe;OXm1PB))pcj z*JbexL5Kt_79EqRhe*f*9$C%tN2m~YC@}Omkq=*_^?|P(()SdThHKO$W`6nCocR0K z8FkX7IkyCH#=>QxJqe95Xo^Be7jlP;$8NR@s%8sj=Yd^L#Jvz&?r>Bm88@&h8ij5* z6BZxKoNK;Rct%TOcP8er3P z_mSF<$Lv6`cx}wT;W(~ecMD6tbq3Djo~ef@!4M`&JAPW}ppyU^qNxqv%Zery#xiT2gd$rD=!= zt*MKE`W4zuf9Umj5s{Xr_uV#YLp@+yipnv$26m_z48mT_>(EFkHq^=!DLC!{3K#we zv#-A2gVJVEs4g-wwo+q!mByG#6SXBO4)ej63>Fb8(SD>9k_jPIFi7YY%!NyE6i!D` ztpq~}8XAM_-s`8WJ&HdNCz(=l7fi+KsF3?f=#}VcZ_b$Bqz`;9R(lO5 z%_EoOJKBSi_y*hek&Gt@M@P~XoJUeG>N!`b1u!Jx?YX|8YeUuQL@OD2NZ%3X=&@_q zZ5EWWu}u8@?JWGob5tF9dautJ-2~oefoeO{+M&h{6pokUviS%k8i|SMjv~2t`GWmZ)U~a z-(mHGzZ#UBddsUBHD^iAwL*~Iq=*!n&6G@-#p18u$?U7YnftuBUa<<363KeqRpo|S z`(__ihLWGfcMxz1%Rr}@gr+g$x?}m|JKtpPb;~e`6^J~DQqRJZwwMCSD3V(V1$c3j zis}b_aaqEgKZZKXom};oOR1hvB}*9#GAf8~gb)cSqKIL0+gNt>F_=Y!A2{i{V{!#0 z#P-~;UgwWrc!}oKc-?&Umb-a< zd1iIse*wdU_hZ6RQ6#se6X!_Vn}e~26c5@WPiEPv)gRAUjtS?5V@7|P&n|j^X;sJf z`c9}rWTIz^9*9V<&86WiuwZlln~uc8q?HfQje#G$LPshdv;%EoH9Z(Dpsf1#T=h1Q zXyf;%u-R2cjj}LeR^bqv|+PrQeqGgQS)xgF;%nUs6Uso zlm0=`{BL9S^du4mBL*UXBihem7Is%Eg)S2(B%a~)hMzH~TTlpB#5sdvz6s8YDbL6=@t_*Q#X0D6HAnlOgeI;*J1CX*!Lke z%We!~ph%M&i=`0NWR|42y*)&*D@3Rr!l6o1X;+_fR%BFKc>NA#gx6_S8ST>;Sy4jK z_<6a$bRdYf^EgD3qCrzapG(4lHG5u@zu;^z`Q8GPKrA$D`x`n^6XnP^47BUC7 z2Gu*)G3l3Ir{s^f;{M>BLCLT1cpj+zOoIGkp?KCY%)R;>x$13#_$Cc-XbLqI71YgG zfM#=MR#t2dO2^NjeCCn4J}6`fAN=W7-o5i1ga;_6Y;}1l89f1a_x?qsS0v!M%4?W> z#^sDybYkx>bdO`nL=t_7BfKMRC5*C_QhUTy(yEvi92jCgRp>U$F|jSsV>xE^I#~Fv z)42Sdo0)d$k*Imq2}81ww|MBOvWSHZD=zF5T(h0nm1{8F-+=BHzt{f1p-h#&fydCa z=+_<_m;e4!D#lcH>uL>2bOkwfQ^4%w=HV`M=OhNjHHFMOHxuQ}wxN(E{OW>xY1p(+ zuFmvD?W8KoYfCdyg>KR-3S=xkdj`i|ePoVI=gzr%42=b%Lmn{5MtMy=bKU`=SRwH- zgOh*%_sjhH-beY$XFkEZPu<0H58ldGKYIbY8iwBb@Z;kCho8l6vvSSFr}ldN&v)F! zGk^UlH{WnMe|+$1{_^m1hqPbu{ipu&6Rx@BRDSlG2l>}?ZyxYFwN<5j|7%z9om>A% zBsz2+>Hn87On5&gRJ#?A+r#lS({h!4_6LzQD>9LVU6n{C7ziFq87GbV3fCQTCv~MW zatUjxgs7k<^shqJpy0KZqWnz}Qh$@egR928On&c>L>P3_^`KP6O%S3!L zNgb(lG1axd!eYrpIXxZ|7K@6*QH{&-NjlnFiN&Ha;v?YKg{*;Iq}QC@NC_8W#NQk6 zy6nDV750iBV)dMfqCJGJ_b(eP2X#Ssb+JsxkilkBaXB0~CeFrGS|ukV`8RhWN0O}R6u@C>-B)ua_uL!j51M0Pg^m2kHYGngrb^oILtWh7Hl>z zChKHE5gVaU06h_x57TJ0fP^5tqW!x6GnpcI9c!^@TQQ9OD+d;91tyadRkdSt&cx!F zh1;?ZjXfAf@8!A7GvB~SB`^$q$R4n_Ke(2*ZR`78m#es(%E_}aTkVWqa4bh({{xDvYH57!QKFr#eLkHL zHKdXW64A(z1_+%dD=xPi+fier-Y2selnQ`q{5if6Nr= zfRGR+ER>Xt!e-mhRb7Df)GCrI{OGrB$8^-YaP3-*-|dE#eyJtu9WWSt40V(``P4m^ zQ&66<=@b6CqEegC-X8mzBM3(P#9|S7PepspIeVIn^5(bU-t|pV*ZaYX>q!j|<(si= zx+KX(RfSyjvrAZd$q}si+ZtN8xAr5+*)dc^c(Z+cC?SS`14Vg7bT=hzygvq3ez2J% z=1k_uc~fvYY*dvObM7fi`OcRv&3$IYnoXR4&39$w_og5Hp0yiy!igjT{xZhR&SC~VsQ_Igd&UI-1ivw=aK2-m(G=u=BHkKhyMi( z6W)&rF{m6-G6t7sBazGurh`F51>JTtU7>_bf;bRr-BYP3y@sx%H^f(U@fChN`NZ!HCXir`dyE! z^itdvpQC)ri`^23ZnDhp`+ZhS97NE@powTiSaS{0U@ewzYsaCKk3i&g3tJ*(KN1Gf zhQcN+98F27!v3JT>)AWzGB(csCM_dRrd{_CPi7`9JKgj7XVEo0UUVUAOD>?xGFslt zBE5kr!528b^-eC{a}&q!`!!?2D{$+6gqK3L4YTc+Z*ZR$MM}L#VRKK$YO#`5Ty(|f z6F0`8nXITric}&>EaWGdFyr^zi9|BXp4tCYEk&_!6K=;kRHY}8Qo!!0!|k0%amD#~ z3l?KCx#V}8>Uzvdd+%$P{Xjt_OgtWw+3g1zd_8nH3Q3Kek70I5myN+HUI`*4+Rq}~ zKf=k3Kk|NH_7-D5_8byl`3YS91(MZuQVJm2FIhE;-JiIgHCKL>=F=}Dz2GFo+{Ya9 z<6HR(l@Hy)*q?rmF+cqRMXx-DW8Yp(da73+6q8X|JuI8aZ?!S@|{c5|JQiW=bZ_##S}D*TgfOOwjo5OT7BMtJw9%)4i^zpn4QX zeDZou`_6B;_}7mzYR+Q$ozU*hG`#%C0A-a$ExER_cP!2&l>|+Z?v*kX(`QG~^}Er8zf?u(S0<6Rc9X*Q z{BYMUjH^CCJ^EeJKii77GK3ON9dHcwR=BzP-YY4nC_qy*ibof6$sf<9YC^GedQehH zlJN+UU>BpNS5Y&oRAxxZBX_r9q$|pAF8VXi{Q4D=eVikXzwBtv{mSXwvHT}2yZmTO zLgHW;y#A}#(PMhQF;x6Ey7qRFObbo%&}!)q6y-e}(OrS13uo}=dmr-SU;mYN-d|5g zSMOE8-3={Vdi{?${-`b={;WxZUYpq82OG9AYif_x=g)ro5U(v?!;PQ2kYE4s3)GDm zTs|pC^`3?n3cN0ibea!0?I0TKiQevQYNffYcfQ8y$1h^jw%zn7EMCJkdJ-Q08Z5`y?p!PmFCs7#r>Ggl~h$;NIcenk=y}^sVJ&P zMt}r#(-ey0Ng6`WV0W9Pude9aNx~?mm2@bpu$Y~M^fEk*qkvhMu#zH1dvXO8mSc0r z6qVEj=}jhnNg{a*ic&zF6dp%rna(blt*~$#v*cjN&mS6)xO937A=hGZnN^AT>I;>^1+Qtas zsU+N6?Gq7!#=3@oP@3F^)gpXZ6--8y5s{UQjINRia(=CfHv43nyi15%N1-Y@w&+Go z=5nyqbYGAcyKfm5V2wsQ)0&BTA(l%G z+>Sk9#0W*lVo-=8mTnCjcIV`N_t3%)G<_wydIYGxo_ixS*m|6BC`LkwWA>&v6cdbt zLE2kMa^?jjC!Uy_y=VHM(NDr4BEcdm7)|6613ius=_F-!OC4}NMBiH<+=kz3fCyPh#1-g_4G?DF6N=MnM_z zQBz3GI0_~$MAbABZ9C9A+OSMMQXW$zz>PWPEF4ZZUE9|&{=(}q>>io0C?;I8)UmV+ zGw_sGQZe@!*6rGg)uc$lO12MnZePzkzq*NFYZGHnIA2z86HfMgrOJO!lZsFS=D-F5`Y4?EFc>q0-P1WTzCtJtvuu}>D`N{plJjt{UV%sD%= zlsML38;Sg_39}&N6I?hKm0>w^BqpyaNoMnl+ZlD@c+n9g%Ey&*&AnIg^beln%paVB zr^-hpp2pp+YZrQcMN!dHNfuo+lg;mK$B1TDYO<~iq75Ja;j?r!ba3jIm&s%|@p@5B z0cU-&_c$rA=AR!>Gq;Ah7tck@(=UtPiAY*Y8gcah0O8F>d857Ozq#mc^e_Yxmo1%5 zJaHv={rO+HXr+kwe&sV4FlJOWPdxvYjCL-VH3?l$v1GwCsrlWsZ4cw?Gu1J_`<2U? zF*y^CK6=p%Nt}V9xXjoOtwH`Fb*`^Y?$f%q?HN zLPl=|rc9_~ylN|JkH(( z%4(~ER8__^sSkAP6q2DXBAu_}Dz->FGZAIW&T54P8tQgp$_`q11`lKKr0Yl~H=tWr zQmUU#k!4bj^lDnB^k@!>BJHu#iHyIm*a}Nepmob##1oB_m6)*G@~VCb(rbB;gt3xV z{pV8m+ZS0*nfdeg==#!JY2z&CjK>2618MXjdfKXsPD9OG*3Mt@NXKKSfex(k5aH$q zV$IDYni?=V+rZzB(cVHR6rwe)V4XgXic`+RHF^Rel6=s)RoaK8@|GE6jxshm$_Di2 z+Tj_`&gdzO+4WCGM|M--%xHbp>?9%;#h2cOFR_g=fqxOUjG)UgjZ|94VTllNEFk7M z63hicP)LHloGG8b2`chhxgFZ+)6=V3XjK*mNyu?ovqkyVY))&NhB*! z`uO$AX6tT4hq|7mF$&!f)vL7JCF**VNGOVG#PRBB4l~~+T|SZc(LG6mnW75WH+7U~ zC-zt?ws&T(JQ>|=Wmjk)8$#Q29>@|d zH?bK<5EHVAKIaiFEu-b6vrvo#C2zfi&kWWq@fAO0J&DrRfUT_oWyP}?t^yc8kEExB z$lje8t6#%+?8TU?#$s{08FkEAAh!H#HAH2(%iq_Y*f=$C2_ z(GNE6VCCI6)4AmXW?pp@&cf0`?_*&1W_G{uAVm{q^(t+wCzC{@5n?GZh73)J*YxRm zy{0GmW2h01qjg1br3?aFT1a-rN$qM!4eKavVM%s7;sN$4VG2%}N%84((R@zY;{o1m z`v8Ys_~-WQ-8{JfCKvRoaF<2&qB4S(Dgr;>iYG1r2Q3}tzouI26cf3X3_ z+!CB~O6geNLdU=MFy`uMRLvbBpQ;t(%DCdsmkcn5W>z}HineIOC8y8e-@kf}hV?CI zX*)t7k$*E@|I>SHe|Ha8-u($G$CeG?*W2^q*MI#66ONyNuhQ4;lbv}t91IgTV$wC@ zKY?tNH`RXlqq_nkihAaWN6M|Wy-Ug!es#|yeDlZm@X+1gVRvH-t?hn(aQk0!-x1_i zI64djkIO-%I|_Q;m1lF~5AWuvbG{%6?o}6^Eaei7&F##X(xcZXD)3NNQoz2J9({(( zx&P5^PgARu9t?!K+Da*Nc=nZdId1W+T!eUEYi9q`yUF=r_;Ay93Vj|H&!5U|-~B8l zMZTOA<3K3zy4bZhQwjCI9m9n8FhV5Eys>u!zkKBhnu48#(g{p<8>-8JV$CF2v#3(f!ld-?xZRS>Jbzz9K77puSJJ-syCjkZm1P<( zr-@6Ew?%i7ZrDnjUO`b!31!Cp#FMM= zyU!XmG_zw z2-gPD!s5I%C5%0_iilE3S}E^2mL4LJh)a7bvHzijboB^z5_$h|nqIn}w7&^UDvH;t z;|!CF>>zGoA$wQo>-+Gp`CI2F}AuvK05bYu~Wl!3K$ zB=t*9)+p|{fYM}J?{wKo|7b{Wi<0S9H0%w+m+`|qFvGGxOFX-xCs}I9P!OKfc3Ot zXn8Z+-d>M$Y7wT0gLf`}nlYD6Wzw~?vH1E&oAbv|>F+Cw0VQ=#xcV6W@YM&1#X?wd z=6rm!ZP>73A9sA>UT%EiGZb`_*(?gHigFR*u0376eETb$`rT77+eMy12Az95(94KdvYZ1$^PIEgsJZH-Tzh$ zYj_VM1OZw)ViI3I>TG;Yr(lMpf?<*^?dYwYq{2~2aC(&8$Vdn4Ra}UY{Ht|r) zMrCpY;Xm=PHNajsmXYUvlG5q3M5vo!GDTw~&Ynn&_IQ%0E+RCUlj%$(3FWn?k%+T> z`x@Fh8hb|@58^?qshPwkqj(mr<3357V=RpwX?8THXz9ur-;3jB+psH~!XHkPa@W)8 zJ%^B~9%uYr%Gz`oPc3{~`|#C# z-JyWfycLbT2xF%1JjR~S{s-Dmx{^A4xaXct*)dn3*<6U6rsi;(9e$mLpiUr>&Ph^Y zdYXNL>}Ge6P7&y8VB7BZ4ypa}T^MX-H8@Yd9R1kS@aq{5-_|(tJftSQyZz#+G=9M% zJ;itzpN(Vjxg?sl({#^`?ELAagf|^rRY7M_DYY{f;wUJVNp&GHkx9`np;S0fsFndp zbY33}H}0VEl}Dv!H#6xRT+cp~W2kFx9d*|nkE6sx(n!&f46!TH!k$FKz789HAS;G^@{)O$2ZXhj;xBFnAZZPfWiIk5lBdrLLnOGl+%V=zV|B}H2 z$3XF^-hFVzeJf-FoAhyzZJ)im|19#gyoWQoD{$Sn?%MRTXfBsCF% z6~4dsJ(SVMi(?)vMvtguH7oNr? z=+R8L?k2`wa|6zrks0&$RGQ{kg1zAwP0<*g@dSx%s6mq29}H zKMJQ2n0OV@!bwCE(A1G;dvl8B&NR_@MwZYON)bz2NtZ1|FIi03aU=;-1*#FFAo@6^ zo!`YCdKTq?wr(agtq9fRASpEFEdiRF1H@t(QlaY>0>QCFf;J){Ke0%N^Z)~P_MvM_ zzKDh07~Q7#3PNxBpNTAGCrA!&0VPW>q~^2t;hla$#(OpeZBc`rT{=4hI?Z97a3T}O z&hLRjTd9cX>LIkBi2mjGL0d@`o>MQwcG3m%%Cp3`B@Pi?kUFGmN7&G?*N($?)LFP^ z9fNJ+0;&6rZg_`1w_i)+Uv44ZvSQE}u*YR(#qVpd7|sziC_DbifK{qB7c~MWWK0Dig~x zq&JqEaF&fO1pt3SYYUH`4d_zP~@q9k*O3Bg_YjnyOOixbWVp zjr%>1n{T*GMsu(I+ApMg#O3Fo$h)gHa^gi_FjPKb&N!kbU22QOtPSEG)Iid%o<&GO;$%63_@Kd2I>Nbl|QS>;MG{RzXkH}Cv1 z$8^}fhue92?s%fwS~#?l38VXXg&qcU1`|1JDv=cAuxT>6FdENz>n0j@)9~SIP&s_#F&nT_&%$n=HAk7U{=oq(tIT zPaE0-n{jRUBj)zCxzAfIP~yqVQ`>CQ3D;eXRxlNFDo$ze0erESFcHn&%b;a0e%E#bw@tM|%^q z((^PE$4r>!V_1(Ql5ojo_jD>wGP;}6;%c1EOzGjn1<_U=!9*@OR3xT}^Y@1nnTTpM zKzz-Uv^{+X$v}_wmeZ^-$|tnO2Jw_ZSX4NRrwKZW*ggL=+9xfN`x8li`*Q;jebACXwHMbhZ(B=0QSF{WbS_AvAGmnUclv!bJG3vxJ*=u=#JlpyAcWbKjGRQRAjF=ei$KK4Y;wo{*yi_U%SZgqSclGr2vSXlfU> zSv@WcVhk1iGV86ISl`I*JDwo2r>z%*9qX!;W2uCU{>D;CnwOQ+ergSdS;c7+ z_H%%^kVqGqKfQIhD!R%%-HuO)#Pl$UTD{A-=lw`$R)Mc7PV_OqoA{i+^?+ zWg`k@!m!}Z*)bH=#9MbQ=at)DMHe%=>@_J0=iPP&M_w^6H>r#GBW!tR3nyN9_}fpQ z>uzZMcAtA|0aLNeeeFkheV>Ao?|-~wib$)7TnZ9rwe-#}5D?TxM0W*2^tuneG`)!E z27-|R^|s=@whlk#rG-*Ue5eq1Xs^BVf%MJIIN2N=gi}OITPNiuh5ane4g?wH?g&WD zabG<5>I!bT?N2=O*Pls?xBqqwM|ckd#DlTKn^`Ut1SjA8en#m?{(R1txL{`QBqAf) zZ82ssV{$n#mla|zE27P;@?m=$U5V(R8Oyz+N&|1=y=u>FW{U=v z%N7sX{k5Orn@Duhr%6{V$doMZZbPBzE%BOgRZYR-Qi)bRa%}`ukfp^lJ%ssMLaMn%1J$qSiZ{4QtG~fGmcK`e;Lfh63d>&>i zCH0f2o4Z8nhD&VVt*K|;XTQ&k%f5zcb7wqj!=k)(THY(S(}c}wNAncPdzHOkvU1z5 z&20YHp9!>O3RsxTW(sOXQ$C@`jplGeJo`m49?@U=j-i%`mDKnn6&-tllQEY~!6Zc6d2P7$o)38PxChwrgK5WSyyAxf zwpmd4<=$Jtbx`mb@LtjXJ?Fuj2n-6h%OSO{1Cd<;@mmsP_)y5MycVlv(Bv}lo=9f< zC}daQvhz-$qbtBYe|z$fz9-}f;#v=t>}!)`_q$)d{C|S%3JgbhKPEbY zahx_Y;aJ8Ovdm|rxohBZzxmN#L3FJ(ndF`vSxBXEn#_caOf(J#=Wdy2+AfAHF_T66JsVM4i-S%-2iY6uFmBkq1DcP3d;UdU+U*t!7)p(3brwxzA zoNGTxl+6|tBZZnuVOT7*)>aazt)aDUB%z8j6!E@%(Dt-p-w3btXO&sjnR{W5x8d4& z4@%?f6gg9r6_{u(I*!KTPk?Piul94d{|QgzNi0gFR~w2gs*a$`bsjOtTv0Klcbh0l z!ofEvZ22dKT1LF|Vz3Whs#j*28@tgGFQ6Lxu-nbpteNPlJXUH15%qXdYL926u;vq! zio*$!cqho5MN^5yMD#2ZFsGhDd7+?Sd#@U6~$0Bx;$m< ztQb#6@o09Hj}axy`N|U z#3@${df&tz_OjrTf{csf*-NS!d*0_6d-k=t@7OISX$>|MW2nO_ zEaP-JhKk@pTR>Di>;KvOXs=Dt7~`&#_d45#dOC$+*D%F|+z8Tk6I-X4NR&C*I#na> z6LJ-i1ezhc*)gEeTH{!M6~Ult^GDRzp!F^!7zCSbEzdiBAl&;A>M zwIV;G`(Eeu!J_#U%({6A-cbep{DwOl{e1oSA91Xy2ItZWj{V`OGWl$OeQ@2=>v-r( zkCTih(ehj+#IdHFHHC9-I~$9mr_CydU<@6`p+RVmKiIIH6OW!J3H1M8Sg~f4bh!}c z@xOv$!uv6i)YEcFH5-u-gLPl8-F)l_HFM9Z7kF{qDs0tdsJ2XGSTw^VUkNh`3s~FK z#>zkoN}t)B%VeR(5PrlKrtyvdUxE8s4!dSI*n50NI5|F zCA_gz8?U!rfzzvD$|IopgLXyY!OX+}0PCDdL_t*Q0?L$=&`iB&g+?mMyO9TI)Rr?# z`4qL*jF;eG2!@`aqw@!d$+F#{QdDHh5hj6j`}eU~XQLLE3>o1SR$U@`DG097ElUxE zS6HwOgh05HeQ!KN*S{a7u(OR~n+3Cwrik*c)zxfRG#6`UklMH3!`a#1E4q|6TWA|m zO}MrefBk3@6;+rmHe6P-jP{CoPWEBdw+*wTw=((`>8eFElzoDjbyUChGo?aU8g9pv zctb9M=HJhp%)z>lPRH5k*3l?xj~>iO>)2ZUMRD6733`tuSo#SJ%i!6&srU|3p=VIj z`{XioL4ggsP0JmpqhluV)KpY&1&Y-=B!pK)uteJhBAN2Qq7t5vrTD`G%Wsl;jP^aN zh`#hY9Gl)?l+S|QoN2$f&CRCKN3yYO9COybKy}mVURA%+N`?UMuAE4)WDNT%CZgFq z*fkBi*(^)U3i0wleK1RUV}HMc!pbVNGe3hd{isa)OFbmVgT6 zWDZsJ6rOP%-dW2qN4ZPD-DD5qDD~R#PTon?>$kTCDi1D@lzWL$rPjvGQuL+6QeziyopR zww0ho_=O7nV*mCNktu!O(-`~yhELmv*JYAA)coU$_S01_e&-p49LJG1`Eu=N4J@a) z>6cjJ+h{Mmm_X?T1Cw4OjUL@jr2T19$wui{D+q5$p;x08l~6K$ zB96j?Px3fa4X?od2(MTI7wxw@(u|gfQoUm}Ggm)_&1SH6%#rM^UrcBBDvCSQ#kBXH zq-^`ExXfxV;+rEVCNm*-DXmqLNmNXtxnu%qd*Pt%rzGN-n|7jx1H>lIk(Idm5?-;C z9@xH)O@I16kq_U*ttn*Z2>E@`WOL%2wv^JdzlgP}KG%N9mR$s&yp!1L4`CiT71v;- zS5#PQX<*I6zhmv=_sJ!6QB%fcQlyQVEYYl4s2R7AX(xROrMMVZ-AIbZ)iIPB-UAWd zO@ZCA4aEY!XIGS|54BU#X=39{GtEbr(po6=<(bb;d?iBhzjos_tY~WHHMI6oL!&v4{(1-6X=Ru!+Q4I|qVUSiPqFdA)!385)GV{AlYd;f zVpip5_79d&IP;m3=q8jSQBX;%JwHGjMDA0%T*Nv`cU zuwcuP-oiqKYri)QYh|en9E><}@Cnc`hVkEyVISVZh?cG(HX+nkGdi?{xwoxh#+flNk#Ai(3@ zCDfX1EUp^e@BCE7Ey?bIFs1BrTDGpCwPBwmy&~G1?{_Yi|3z}!M&p}Qr!J$ybaL*! zf^=Q?IV!AF{s3|MlV0I(l}cf^WtO|8n?%B(qg_WcnQ^&AbOO}k08U#QMpz@cJpe;M zc=HkM45LO&XijT)#j)NG+O46z#AO%{;>Cq*I%64|5{o5q6;g$K>>EFlX7f@?o_wCt zJxzGcCafk?u8@R8B93>*PS~*%<;54kY#~`ygTHnZq3JV8mG}7B%8zR<8eAExoc&E~ z%*9KH2Dh-U2k1Gn?J0CW~BM5EZaGyJFJiqQGavY*w*&72NJPv6cXdyxGW9G7b# zEFkAIol4^NH_A=f@I2!c6A5=YZ55N*S23Ny$l1O2X;`czM)Z^n9SrW8F;p+Rm=AYu zqCL=t$E;+kx8?mJQ?W3?cb_8OxQ&u?zk+w>F`096`cTV6xnYCk&JPGZbPJsSt=^

YaQH5QYhW-*3lBfeR@ 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 Qym%Jf2Zovz8cxsu4?&33k^lez diff --git a/tests/test_display_plotly/directional_symbols_subplot.png b/tests/test_display_plotly/directional_symbols_subplot.png deleted file mode 100644 index 7063789a0dcdf47fedcbd40076df76102840f6a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116028 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

IRdRS+$KHTl&iFlu(VmL6qzQpStc!? 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 SmVhU~M_OFrOZg{#zyAX!xXAbb diff --git a/tests/test_display_plotly/field_coloring_subplot.png b/tests/test_display_plotly/field_coloring_subplot.png deleted file mode 100644 index cf0371de684c334c119a0daa206e1712de566f5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116887 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 diff --git a/tests/test_display_plotly/null_values_subplot.png b/tests/test_display_plotly/null_values_subplot.png deleted file mode 100644 index 23590c39a66a4cedc77146a1de7319841f1bc1fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83890 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Ó=_ct1{? zGZ!b%or`9FKwOx*9l=B@gKmo4U9YOZACNGZ+yPzR2UXezMOq-b8H(aOa#<+l{fSn= zH_l2#-gu?+kv}VEcRH-!vJ`D|8}Y*9`;h7mj~TCYaY5%t-AZBWc^jdO z>&*=8eRe;N?Cum7qOQn|hx08bOCPUSy!V1>zek3d&9LCDAV>E1hz1dD^BV1CKaVn@ z-Ply1REAOt*Ty9)MHUz>2gKwWPWM5M^*}L?LRG&H%X1bi-?fn8 z&xz~~OKDr|=ALZspvM*4Fnxm?jJ!{hZ~;fi_KbjJFk+c~zs z6Tkk}@A1@~+u>J2P?gcoC|^X6J*;Ctu?4H<;F|YdjBOWfLM<@VA3-vaMpH{2d`$rn z&7>vyiR{KE3ypm@rJ)?-HKl1Vatwn<$ErnzVnz~X%7CG$ki4orR%zVIvhenG#jZ=* zGVo|mClaQP)8;Qg&@9~ z)p5=RtH?>F7Uj+-;Po~`#};@3o1wb7&?H)EQ~C%b?GQ|@8?jU$;>kY9#!-0WKS5Go zf*E)VBx!L@dlsKphM!hpCipCTYt}%btKJegx~~TsU6^N)J-(=mp2siaysOWIN>|fG z`0aQ8h~Iwuk5CLBJc@6O5BFrp>&0(56W4wCs*>IV!_+D)cq_;~zkLRe-Sr|ub$*2E z{n)T=De7D5(K@dYi&xGO(STsx_#M+qfg-8Y&1u@u{9#(?kHzxu&RQ0A3SwwEjtZu! zeWjG7Ha?Jj9_W;tOUr|l2bgs-P8tU8I&uj6hlX(8k|k)!>a<2DXamErtosnhLHkb0 zgoX}i_yv6OMNs6Eos)YJ`C&R@*QAaCl07RMS(B*KJ&pD&6LFz=S*E;0vp~lu5(o1D zbuLstS&wB|4p|yt3_`XjibJ2DC0r^ZW)g9IY}@CI*p+4I!65X;23RzK7MPgwConq9 zMgjlk%#t)@%$q+KTh87n3J;65C_cRB2%ft48KkMm%}m2@h2T@jUsN75DHr-ZoB7My zaP9jq#<{OO9ks%q9Y^q|n;yeJcUX+o#VgveaQPh3WoyBbR?J=0f`+D$=%6f(qot$0wnCoH4=ocvwc9`4tMfX#& z9qmUMiAR&-9GZ{&K2*tzGcVtOhGuGHQTR&`8;Rl1zqlI-Y9fL-d}aUvl^#Eub}^ap zdj56W@UG9l9(vY=4a1y>u;8sA?xYrrCdIAyPg$t~4y|)X#V-lrMJw9H&+YTcAG35X z-tlbDia`<1H4RI!H*z#{pQl2-P}|mhUtWCSQhq;gb_b*5SK1pj^L8)@7IMY65Ca%;Ym zNNe{ZVMXEboCdGQBi?V0eVZe8B~x~8qk`9s@MeokchaEBYhkaY*do}D7}@^{=L^x5 zjoxp5#D-eA&9T*}Q;bIKLNzUwRUR~YXxvDZ9t;SvYi5bvF#g~k!qP_zBu96G#)e7D z2QU>=B&|~fQ$&C%{l*cRy{QE5J8}f)Ed-V~H^HMQ(99@O*4>bB5E2z+=8adwcnRN^@S(!BQ4MH|ZxPjX#%s3VwIjT_-*-E8$Fahr3s$!v&l#hp<%m5Rr>=8K z_Vd+7SXP5$X=aaC+jg$}d9VH5VHkPmi)^TA$SLP+8n@N-Uw&~PMg~S*YEotb>2wMq zwJ{UzEp@!kU)6?pe(pNa{ASE~n_*5cSnyT=*KUj|m-7WoKKL?MjhNm9^|J!&TP!B7+&i;duydtSo1ixy&QI~B#;4n_DSIPc$eFmNVP3u%P4 zM`5K8qS13Dyq*^Ly^_c$r2JMAwPNDT+-$)sxlyAc=Xu*NpC(gh+0?aOqll8zf|#N; z);Q6VOv(a9sl@?s_TS12XsIeRitJK_P4=@LkIsTyCJ)nuhR9&N$o@-cYzpDzGgf2S z+C@TG2EQ+-KRXLnQhn6{L-n@bx9po4s5*X7aQwcmfK}c=Zcpptl_IDF_AVn2e2@WfKj@vG+x~jb0$qN&NE>?m4gc1WE!s|wzJ2pBY5q|t~Ksh72;PUCX9|(8mktKJ=28cjODT8HLGAv?5pj! zTyFZiM@0MP!tX)Cx|5gS0y~eDAL@XF&@FB2Jz+!<@jd;4L%Rc4JhKmCbks1^IuYr7`Nbb!6YzrV5l3EX42p zCM;Ps4@+0hMPL;*lPLWZPOleFL~ykG0Fq`Le&47EC+$h5(^Qt9Cru=zt6M|$SWwq2 zBE$k&f+?98O2#n|izA*$Ae@Y$dnkgQ;V_bk6hJr1^Hpu}oA9W3Ax53g8~ zBoAU*?sQTha&FlN%H31T6oS`syoC#kUEicWA5s0DNFzElHci5%c}@e?oV>)Y{x3ks zfi669+moXUK(hp!f5cZycBGYXGm zk0+XeqzuuCs+94Xe?PSV?(G;9x91<*oAbB2Mv4lzVeVoQ!R=VGaxPY{nS(%mU{d3i z#vQHV(Ed^eQN~hMI4xvZj%CKH{a?uIL$fa=I<47h3--ohdI|&aI3jdQ#?cpvqI)nb zgt3_-@k`2?gs&}rU+CzB$J~L9^Nu3m)h8UUs*-?a-Gz9(0|E6k_|*pZBEnUMJ;fJhDA9a>i?#^7eIcVM_a5%6P35{awRF#{joLNWUVn?Ywm&08otI zfA0>&29xkfA#qVEgl*n$;SQh1qW$)DJ#Fkm2x6i-!#3;IMDQK;0z{2Jx5!ogiHnJ_Ef2oQ*o=Br7 z97gBJ5aNjx`l3-J)6q;CL!s9iy=yc&V_^V_`~Zw(3{i7Eyzn3-NobH&)O%DhnaZNS zaEZBj`G=d9S}9GzDF~zGQ^{E}bt6ai%~=t3R*WgKWKxNEj#ox$f~HU|o_pW?rE~E5 zk1T~mk@Et~ncs-br>{h!z}qFUeE6kK9C-Q|{7PM3sz~Ae7}M2_s_j)BTQ1##H-6%^ zXliY+Q!VnAoo5sD-6nf2Dq2dVO-Jlbe!Q0Q*l0K*BEs2GVOI!?u{yT_3zxNH-lEo` zQDL$(q;8C4k4Dkx#*kM;^Yc4?6&$Z31Zs<5aeeAEkO=wwXrv}C!e)@hDYXwaMW@3= zO2fcN6rJHgj3g2mjKE_=C<>*;g&YfBhGD^54oKiN z)p<*{8=GpUrSZ23^mT>BjXXq;?eE39ElUxs_vHv)(=>3TV;_dX-8oIqNWDekgNP-< zsIO~8U4RO7LZjQymYqWAiX>oXtHK`w?8B2Iyqz3dBZ9bgH=w@=zjO^WD};n;K!%P+Sw)bR3l$lfW>4gWu-|vy zgyMF3az7s@x?&gKNcPfcR{o$R+ikf-M9ngx8)+dbY|E*vHzLb0^HLd#e~zP*n3hh% zAE?9D%eTNI#PnE5xRDS_6i6>1Q~UNsEof|QL}V~p(raga2IWQ?FclrAT)GKw{N#0L zXd$s{AG^smIhiTY1t~QQpwB59*C%Y{U5T;k3Sqh(-rJ2sySuP*!$L7Oo7(Df1TS?m zYY2LTZC}0!c745Rl|tC2Ir}l z=0RgMJ70F(@oE>1y5m(GjuJmwrL|Rz;Zj(C`bw-W@|~h9`1nlWcl zoAAY+@Ozin9EEx@ zkvIFKXFCkgYV>L6t;d#g)?wY|rD&ViTrh>9v-<#|@$hKj7Gx~(wBU#~=xo@1@S!E0BN zQ#PQX>lhrMV`w1|48Z5}L2-)pM3GK1Wf!aEzrU={C;R6li1oOo4v1#sCfO z69bpnNCF9}u&>C)sOy+Og3k7+UA|@>ww=2k8&6${#mnc8DSES07(614AzN!LtDlPz zEsk*7&g-W3zLcawqBX4>NYnUpFSdl(%^j(8WVKgHql~)B2zovFd$Rc z!xG0UiBVcD(KRS~94|ll5=M?L#F^)M5Ny+swoJsRHozIHbpb^P_%t=Gn8>;@U+k7L zUY+-Emz7!-X;?De*M~j=x6rN_@BiA{@a4CB6UlhKHDqzt-}RZo`P+suMsEI zXmac%K--ALBRFvQMHu8}FwSybqbGz$kCV?!Ijr$Gtat*ZKM13)-p-LzBzq#I&S^45 z8C8+5oIOcdZY6Y)Xa@=Pcp{9U-W0rk1-_sxB0Yt~FCq4rmgchBj;6w1y!?=Y0G`3N z)4QQ5TcAmP_=9aCszEn8?Nc<1+6Gf3EI;ZiUT0jfo4Xh8p|j^wX9A^(%ruZlP_C^d z{-x-O*XKnb5P+w?9tO1+&ihOXL83htiJ`y0AF8S%6dH}P=OY4Eq5!J+eh2FVSbN$^ ztUF^Bc0akVxZt*TN_@{WD<#D4%FWC0hL2o_b*HY)dQG}Sk|vCd&Qu}^t?c_=c&wV4 zu_|&Z8-rM}b}`PpXfw{bU=!NsHj0bGLJckGqiG0v#6@JOwWy-QnO6k`hed_}<;K#t zUmhK+^qB`T7p9~B!b0y((ETl?M-lFi3rjvfja9!4)oIvJaJx}stwvLNTWL9Q3$c?^(pX$NGy(u-^{UdZ)8lb>u74~ z$J;*oYe+*te>{wykv~Az&c(GG-ah*NX|mQR-_h>o<|Y44FSUBM_t>O=OA@=I@61Iw zdfHWAPIY-!;Rr>W6G?G1;z^`E9ufJao7d|V(che{(z3L!BRn*W;bA*J+voGc=M5A; zhQeWj#OL^v==>FPao+W3p!1b(M22ET-xt}HrOhNXD}iO}m*9pEUW=2@-I)8DncPs! zI+FQzc2gd!u9zMDx6oK!xO6VIowWg*PhW@CCoM&NV<;1qb?U3eK;x-C;1R-as@=cn z0?(^>M1{X(QJZaw0NblDl&7124D5F{{%fgv7^bcvl{Sz{7-B`qze^h5^}03&=?U$$qBr2cKMocf5f?9rj4?PV^1D`hAyT@3RNcwZC^rjU)Un~?Locx|zJP>5X{si0``DPFY8jqqo6-^!0w(C>z! z!=I9nG=|aKSP!2nBc7aECn^#OkyNe&1$oXUbRCJ9Eq*ED>kBGE{0e(eXHT5!B2gA& z_%%pv8fbc7)Fi<#A4EiZ1&yAyV~>%D`ckehMBb}M28L5H+<9~_e2{V3qOs4(J_3dA z5_y0Ve2(-vP}EmMeurfE1AY;?rRXnpTOyH=N~JI~Fo;-e)PhWw6{w!#xxa2o=0x>l zl*_yJ)Rj2>s;#*9rbmjtJ&OLPtvHsiUy3(;^ah-M*|ssSN5{@}wx}fXG3KC_?;tg!r}7Z8Bq(?At60 zb3%$JGV`fEwEFu2c^7oE6&|^+fK{*w>UvG$pK1bRUB`Xh2hbG>RAzYv~A!vEUNq*SroHTa(P6ae1w0i5r)E`Y0Pmd7A;p0W9 zEUL~f7Hzb}uc1>uF-@ox`IRZ17#?y=ekBXwg?+qZ8Od~uL5qWuZ!ISBz<|y7$1Sn0S=U#U@I`(zvq&A3s%zA$N z{5D+qw#&zeU9mr+CGPA^XBdw~%iGaB*N;6rCob;GrfqH$)^1vfZD()5$)~SFb8ACM z&&&S)(#J?qUCP&;FsPd)ARSM+v0~S)naoO65G|66jY+4v%`UbqB8W|Dmt8pCN#Zwc zm`Ep0NMT$2`u((;Vu2)Bv2rgv8>^Z@F@j6#+|6Iq^Iym*8%+g&`u1e zlh`vdfHyDSj3s1`IHsVi(0g#>*v`#4F772q{>^l5!8L0jm)KU=zK{X>dxu~eCIUg9 z7_XEDM9{yK>tD*~IqRBJu`&uN@DG-|LYQf3172wytDcF9j7g};egu8Zh^L0eeJrINBx5>~ z5fh3|(OeCF#ehe$pqdu-ddNYyBIr#10STi6OX^++uUenCK@;J46n{Fp3-@;&5O<|a z1CRF|MMr!D?_GBa76qFeVOQjhWX+B=g_;GbxQi{7ioZF>F<<1mP&&h+h08F1{$f1& z;0yTL-+dpd;zM%-H8yA!R#pp_v|{Djd1zhGf`*nl5y>5odCTYE>{p+P11}uObY08- zJ~TEr;JoWj$0cvLpy2cEZdXnkNR2UnaXaQOY8S18shP=mtXQ*HjMpt^oP;GS=9k=M zEgN_FpQ5m2XGqcAQZg8tymg`hj4gWU197f&-Bxj~l5^K+Bnip13E8B!yu~k0C&G|u zADfU&k>z4>CmPXwFl9nZP&;lNs;R*z>+s4ZJmkMy;I)SJXRvp;A4}`rggWmsVR4v) zrs3YM{o>*@tl3fKL$P6eednWi$C@qJ*18C?MGYtH_g#3$3WRYTvV|{w@^k??QEqQO zlxr+fyDZ@IANV@@x(8A3Z%6CgW-MMY5A6$@ux|Z4%vsWo<~fa`Yu`jED_6bu61;H# zP7L;pHYUm*uNzJ|2_O8Icfwbsr8q^#OLb>tm=ggOycLF05uSQz$C&%)%x@Ed_@b-N zC^?EdE@WUJ@<>gLj0_bNyAvTS#NZX8HwYC8Xh>KZlF;p959dDK+ z#De+P+qtV&0?E`6RJ{-3cqdZY5LBaotPrMUMru=<){#o5A?q5vmIkkC!sEBCmS}mE z-iL`42GWlsK70hr8{Ua}?^1gkrir0g1h*dCfhYTq=5=%f4#&dy_Z^Smx~1!I#nLr) zH#fr+ORU+)I(r7CCGdoiD+1iV>WYF?uy7hm(PN`}uyn~PtY5n&@9mR&LmC|i`^7CA zk5|QT&t2Fey7Q5*YjazDMhMftYffE(OWt}eI$r5Q>%tZh`E6U!jOMwGXlidn z`{LH3`{i0g73(B5+abZ*I;R;u9l6K0zOhcEDx7uE7MyaA# ztJ4~NA^51ZHGKq*Endc3(7k2IS9nDPueg{QKa01mhyM#p>)(Pl|0z&pXO%_M z@RuXI@#l^`i0bK_@tQOZe0TS=xL|G{-n4o%>Q$eJG><6+%p0%bQ0KSib;WMh5fj%C z6MrP)^@bwpF)lEMWnj2JhVX!WQGI`wQ3~15kw-dtrPEklykd@MBowOmXN0hw+HeV; zyZ1#jwl|31#duxVf>1+H6u41a^kS%rj6|`N2!=TUVZmErC~E5pUbo=vf(tjIelB%J zD<48!=_WiX8R`eddSzxmcASuo8+i&!J_IZ;;#L}6)`%^29nnk6@)NmImKq(Q*YZd~ zcmgB}7a~xlpTqdyZbDNa;5a81t0tRNVyLo6Q6Os(`#TH2JT(56JFm~H;NML22wR`Ij0>7qTbdsK_%k!ooj z#}4#~+gKsojD^eEgdg+Vh0QqaHQVr-MQsyCg!8ezTBTyf8?&AzD;Hqi!Zsmz=Phc- zY3FXjITvokvNcQK3FN1_OkeQQ@ua-Zi5$3!CXZ*2?JO&UOlL&b2CD=Uu2OeFk-P}` z+5lf00-?2VFOLjrPmCy3a}Yz3qlhN@ASZf|(mP-x4T~CEkdsSVN1QtMsS;Gm(f2#< zEFLPXOW{!LCy1pFV^RIp@R~u~cJM{q*R>BZF~$pz*9Uu!;7B}zx2@ca)lJlPoLVZI zV!WF9@6Iu0p~?gCeWv5@2wgY2Yj1n>HXd{_Ok&q{N}<&}_xx&ax$uR?aDNm-eUUNu zH?`G^_S7VVse#bqHS_R+tG1RD5gz+lNziLB-=1Nn3Jcx}Ls8t1e&Ovo1!wJzKJ<^I z%3kU2wi%TbHIuJ9k*!X?FfNqmD-@1w7x4(YCE01CORY!8*)~~b)%#VX$RBi)UXb)Y z0)cucQUhYCd6++UqwR!{PQgfpA;tP(M30IHt{Lw^BH4jNYFI3%#v>3DC^=ry0SraK04ykW&AtZQl$kvPAX{7Y#v)icHnsw`uE zun}|A0QzHL919PiPfOazXfk3#QLteC5}dN_9QeGpz@j##6x9{`M`FgL_Qj=rrf%EY zqx*ZrE%&u#G`5DYc-34iS~f>au5%ZVFm6Xy!q;AS7}qV`fOF?BMT6IiP(ZbPeKmvDs4|gW8kf2xntEQq=Z%Wthprg15rVncpgI+0djy;z^jqmk~P8(so0E zP;v2^N3jU-sF6H{MC>S(5WA8g1g}NQi>ep0l}5YrES9P-VQ2a(L^GY#?4mY0@lx?b zLqHOS|MZ?GItSA$Q%)m2E|$tm&5&fMN*%ny-fI!&H=GHd0eGN5Hd9Ea`!NzfjBvaI zu|zjU!bcEA7#^>VwEQCWjF5P=J4h9ag4Y+i$;m8QOVi61$sMH_(Iml>horjY*oiWCWjQmt3%4?+d z#cuSdq*koOA45WVus0%ZFFdv{M+i4G2Qg<+GnTBJ=d`_T5tD1kUuU-|tx?EjVe@IZ zP8}4vqtDgRre%XZM-N5drXosQPqR$EZeH(Q5^u6=q2>x|JJMJu?Z*oBF$@~3&~2U! z9ri^y3HlW5^AZ)$QF;^!#Zo?Q8V^*^m`oXCEU;vm8rQVJtF)puxDmc~a%)ha(#5kD zMl^8@;rLNR5?vUHAHhhZ7m8{k>D`ByV-^wyS(bT98m~#qz%LK(!2WPQUbkX1ntcJs z*H?jGCf5bJ@TPPp`)JTbZQK9?emg)whmmFsL1=7K4%upwTO1 zx#wXl@jfih>RWw3#@^Ir=)swp?T|>IrW7g13al=mipietD>Ru>tb!&edQ73NZS*dv zSk5O&@JbeZBtT{RK9A~0owpe+b*r=92X$GCA(rgMf#E~AueWE+g+R_RDpXXXCGp!M zJ8>{NBwQRCy?$Y=uNnrtvIMVRMcUMn)O8_X6iG(NX^VWfc_|IBIZ)BA)*)^g=&bXg$0K2IXtXe@ zp`jVuPCg5bjV%Q~2XSnvGC%8csRVAfFuFCi1V!81ZRf7V+RaPQ*47}}G?Tqmt=W>1 zV@2=L0Wn6q5A~sIe-8$_hS7VZAF*&;2;58GelE6MzPT)7*NqU0^dp&U)(=SE@i|the2l|XPLl+TG z616^$?ID{jY=h1!Oi{5bEAWwk%#2lA@Ct8WO0y`CFhCb~^??QOdfSn}fXM%y%6RQc zM)0j&PvDxxYjOU(X}A+bx56EEDTE=`;!e6r=(9gR+S#Yh`Ex`qZ|#1fFH8IBSvHr}n z(BI#ULx=Vu8XLyiwI`#!eLkv%J4xD&6)0Urha_7fFL2Xot8vP?8?bWSA~ZCO=JJv# zAc23hhWNi2HhAyEQqRNiN+ZyWkQlF~=@H+_26+$Gd;72_eFehidPtHtXE$gSCZ00H zU2eJqooDF#K;H!teucgg6v4Hlxw&JN#IG=ynBcv3hlh}iL}8}WkZ480@ql)ZS1IE) zWf{2j$W9!M4CB@FSD{VuIni7)4%VQ;KIc$CfLbo6oJckyR+!Qj1|lipia{w>bTLk1 zI7Xhvs2*;2KXLIwoj6S$zMzWro0s8~^EP0^)|Eo!X6N!!N6Dx@d8ZzRsbyI3PLmIx z@%NK@{A)gZIj;N2m6+S)N6&DwBKssc1z&`wX&4$D#_&)We!m|LjrC54uPmeT0v&>c zOM+owI2^|CKtGbE-OX%a>maT_^?tO3$e^DlA?lhmEGn!M=~hSdnrOjZoa*@jUP`|K zNqMoDM8zbRHP5-}4!ReQXm(O0>F+d`l8~fa zSbDU`^%eCyqe9-JdNF_A63m;sSVZ6Q+YIOIcS=KKI9_nFFNQ0i-1gL&*3~8z+PST( zO?Z7O7Oj{onkJlm@mAqdP!y+NZ8jId-1Oz&;?F;SwB*Ncxp)I!`;jZK>6GPSnZHue zGAgXH>>kx+r9n+%jeH9hC{Mv7l8PjFlo(_wjfB<=!}N*ol~3x&M)fy1pk0C<^K_U} zV9a=R(;X;>n?x^N{803l#%q4M1Lf1(X-CKzt0a7>rSHU^5kSY#08+yvFj6s*LL+%S zkbPcAsv=Shij9Xts*@reZ_6`j#}Y-;1xy$GeTO0RE^S6A?o%gRYxR^fsxPZzD_6*?Bh;FiJ+GX@sC zRibr46W;yhH{ql+?4lToj#Q%RT`Z^5vSGHMbxx{ods`A%!C(Lljg9d6eL0Z<5%Ck< zz+xC091=$JNy}b3^{5)I+xmzjc1MfbB$~{WI6VFYl3D`{(+|_~At3c&i|>bcDRmV_ zq*Lw3(!`!MnX0k`zehnNp$U=eraRCcQM6arEvQhPJU|&fb2L)qk!bQPt%yo94D>~* z`k6wq7AzwLE17~xks~jOUoT`jX6mT;b>E}-*SRGRL8-ne*T>h5_PE7JqphnQK}*%) znYOs*n8K`+Pv3}bXP<<1n^s`%LOXwRJVv9twOg>3O|T(=3*UGqF8iwsgg3G4nOkmL zK{XjCkI8V7=T0n=w*yuxXS^!1hB{v_(s}@z5ftN9LISHie}be9q1(Iwy3{ykywb3s zyk5F+qYF6MNq6vjBxt5>+b3IeVM=3_(itcP$&T*QSfxwAQe}N#EDVjj#Dz19CRR`k zYP;=m#4oK@Q88$i_;uf7_A%{lZa^g9#|Sk1efR+0Zq?x`r5<$|hX*^ogw8c|nzKc` zESiDPg*UZjo{W=ib9;lh*v;La(F;&oC$h(?BWQ(_!>9vJ{x@O$=9M`0{7u-nbv2f+ zU7WM+VvumB&xZ@v7$z4Mywju<>n}=Sc<;Zx1?^elg8IZ)#HqnF;q|C!X)f;bOOe}1 zB#LM>CWLQ&V}pqL(tAlIQy3l|Ml2f3ObGSxA%c_;wyh1h%^jrWJmVil(3!Fl2G_m{KNE zq-LBmOCzbJv9GtIzyY&hCDY<2#4k;#8SzWvR30mKDJm>p-NJ4&iGPz#yiskzH7OH5 zvV_Z8vbHk$kOq`c2z5)AqAuh?cjqvE`|GFB*c!wImz|72k#0#;Fg9;dt1zYSr=@o@ zjg%G@6Q&!%ooHrjZfz9)&!?Qd5vxyHR?v2AJX|w?+1_trqGfcVeQ^t}e9uKV>UtV}KMbI$phMLfjJR2Bfu+XeYB=c?6ACROH|% z<+*lVujBqg{4KHUt73~^TUG)+j@Y%F3)qCIHv%_Qmr zYu2EyJ^4%{(dCW_0SEU zh;A%U?}FFZhuzxiAuEmWc~xN<6pd@6*^6#2vABqkU}_T5hJ`w>g1Vp&iYY<(2pL+* zkzIl!C;z{_vw(B!y0-oj!)P=-hB32aJ8^6W8+Mo)PSZfs1`27@rp$fqE9QIUv}uzx zg*0u_Fg45!cG%1?hG7uX_gm-cY9x(DBh6e5dH?(L?8r0H)zv-sth3MBd;7vcvoZEw;^G%Af~nudw<`}@i1-)?82&q4WGA9#JD)mUvKe3QA2URb3-#8 z{Lia+;pq=mE8A7?ZO6q|9E))iawn~^?9lwhQ}IG$3!DEcY{S~<8St5A!C`a4X*DAh zj;6$J_IQo6>OnkNiN)c7gDnq(%;4m`gX6Vuf{_SX{XQi;`$VlIqew)e%9pQpW|BKK ztPdWy^px<+=ILNFRz;%tYS|kaTlvPnH@C^nu-OXl45jQ2{(yR9qoOykB4&zUMrC_p8PiFd zgUdlbn^{GBk+7rAya68DKe54d0ix#dD%&}^Uz#j2l-zPvo?UK>T46O=k%(GA`(&Bb z0=Lr)2A#r*7`u)Z1QXsGDynhCp~qo&M>BS`w_|Htb6x?gtR2a%RO)O_qT%u~1ij@j znWLKTH%&Bz%qF~Gj-fHU3s*<%IMkh6ytX!XKy zj*6P4IjeoEj=RjM+TT*-vi&U^Cm01IOw6etYtzQwIOf8`vHYSV zQIliQK}&L%`2j(oEnjxfFi`Q<;y+u9{=*jbgHGV_r?25zX)JpagHkrmy=4?VJ zQm&%5rf3}V5;x$3?o$ynAJh{mQqdy%3r%VQWtlOR{G$G@Js5cIjznRNMpgY=r`v`| zAdW~po@(vc7ZpwyPTy~Tgn|*3d_(cr9SUM=M+>&KHKWQNkf!Zuv->E&u0)*p#KdW}@KiYA+tZTa$6b2(0vvYSk^xy23MIV< z$ykDZ=ZUlHaq_2*!$HR%2zR-w-x6Yj>8reJOOyI8D{9L#gtS&E0|wA@J^B4j=uG%v zv&Z4ECy%{=@#?gyE(^jldRXqMHSAlNFIfTrKkQeO$iB5i@2XHfbt?v@j%C`YeLR?sjZxZ9-Fb zCw6qTVN2^?bOZycdP-`nCTmG|*?=&U-uwYA^6Rws^8M1{aDxlj>WJWyU;;H}o7QeP z$;#I^;?Adcs0KRe=ZoC=&sXvGTbuBW@12d>`UBc z@Cs~SyC*~NQb=1ICRK%D`LSnU@~8lygJ#xYuz2sUysS(FD*7rXj{6DgyK3gCJK9kZB5Nu;z@+UxA*Z|RkDp4pxwVCAKJiQJHf`s_ zW(mL_s=`d$E2xb6u`zKX0^n{9ON()F+9P(;$0{3+oAjm{aSj)DSd7B1@)k_W@2lE# z=V)fZ-=jE=(f=BzPhET7VY6X+Rh@e1@Si$E0c`JV!;X$N?CfmC#*P;3?rcXlL$+!_ z$5iw;!Ir;F__EoOi&ctWn_8$o)V&ugV=;WuIvxikY^qLhV^;$AzSaa^FxuyMUAJZr zzIyF#_{3Gm;E1Egq^^c#&wE1j>Sr|252U@#A1B#qIb=NDn>o`BMEmGV-xmq938AT#sHpd1ZtE}M zjc!f-8|M!te#_0M@R;F96Tf}FUc!`$_OdimQ*1x1jh+sxrCK$W(6YO2$p@QE*i8TczBGSw#&KmmR4e7Q z_)Ihw!=8{IYr{S?wl!m8XDi-``q0wd)pO!0e)Xg`yA2kr6|-Q+i!;tW2q&JhI9atKfo^{oag#*}7Pq6PvPCJO_~K%L=Of!{L3kXM9^>lM zmXcpx_YXXL+jDSwZ8+uf<8Z=7$G}@%SS@VTZnuwyD20gKdv16VHRCIB#udk4;*4>r ze=Bz}5v=ERnYUJ6rqz8_y}J4kNYC$n58M6CImIq(#ZGL$8})$~VN3XXIuzQG62ER& zrugj(+8Y?{4M*MRh)%`2=*bA0X2E85CdaBZW4uxTt7GPPjmFeiRbw|vl##l`ouR2}90M|*01=yLb^iwUzDt*+QzT6g)i8Z-*F$7^>Kq9<@BpC0)(&Y!>^6z{c^^^LpjF5|g zR%+O~b|>z;;VBhIaV0a!Q!pZzb~9$OOw*gD^9|}CoF}#y#K^boq<+rXx`O^Xa4g#Hh;Ji6Q!$XIst?Qh)Er0I*Gr|{gQietMz=L~R@0(;3AhuTuqDEo$){mH;%IAUB^SWsF{{OD zO8n*!cInYx*4JKax*OYKXQJD50IViwa;#d_SY^~#ja3y%>3h6#lO-0?t|z#$+tDs*>u=6s*>ib`P41VkMPH7VH= z?U=Xis|6h+^Dp$sueYr4$Sp}5@J%HOONoTqDIL` zZ-gDrw9-iW=O^)K2zz#ILRa$hS*><>%d6qCyHMsX&l%NCkL>n3P}ay~=OVsea`I%B zIG;1cdcHr3B1W!SLSbw*Lq&u)?{3Am4vxY~<+H00i^g%*r+!rd!!te;E09c=nL@cdIeadE7R(yiTl@Lt;%RjGkL z%a+e-0c|$HYK~%Z(;wmWzt`_Es&0qL$S=ohSyKGwx-Mfen;Nf?xEH%3r@?1F9#&Je z8mrue$+R(%857Hs^$kM>PWmhC^Xn~lS1#mBEW7Ka@*9}ZfbOxjK! zKN}f8i-iqRwB49Os#SEhb>qGppTujAzKc*m zJ9n3S;|v^i)-qVrqP&c5QpobF4~Ak&@b>lUjPz0<)8ew-rwQKnh+m1_jEH|cgsQ;n zn2^|t^2lZ&yqjeV`aNdVNFq)Ax|7MNxvtCZKpi?FA3?x+Ax!28y?;ilk=Qd{^|8vo zCl6GK-L!L{Kc`3vR%LGpYXUAkF-;$@y-;H{mJ+zV#%tDe#|U~bYY}tfle_TVjzC7; z>0-z05y#HQSsyzb6DCxm(&Io|cUXyD3VTLj`I)+dT0)+Y)K@sr+!g9oIYLJSudpv8 zmWE-Zm`V-VVwbqfoxL*4^?NX1yFHm*+!xFeW{cZ#^^?%lybG(>yn_yN2$88(Ftd(k z+KVPEUhMQn=1!DH8e#S~A{y9?n%EjdLYin!hjUMtFM%#!40|mxP5gSy zC{Gi=n&mGBk8?X5v45j0vK2n-H9%VTvQ%6r*}^w{reNxeKJ`Q+VI_8b6uWvyw=|f1 z)fMPe4_X~O6Q-gXHY7}zKE$pHL-&Z=v`4nsW%P{`H+_`)WXwfHM|Tk0+k&cye_v&x zvY*SQX-_Bay6t7`+}47NFFy(um1XMCDB$>@7~o*K7(K~ctq2cv|(sFr}q-|J;JF+0#!b`&~I^rhNRW(}h}-ULUm z5mEm(ltnJ-Zs4*6+a=zIG~H^R$-T{C?ZIwd=v-v?y`P=U4@z zuZV0h@X}1i1q4CJfe7AVq|izYxx_9D)>n_O%=kIJR#mxO-H40XHly&Zt($;aM;NW$ z+xzso5|z9ZP9SQkMBH8vca2tBY&*LjMg6ESwZa~HA3=X3+|l*0GP)G^^%B1}i{|;I zkI>`Rsy*0jA=s=TIBk!@8f-;7z6_J4Cg*YJH+EBo*wrGtK3|t!E;Q9{Koh>&-&K^z z?m%eDBm@vc8xklB#!+r&J7jC7*ri<|X`#@gMA~GU87b7g!>Wiw+T_LR42_)u_yeu5 zSZuIb9I#mIeTv_F+or4q`t0NHVe7^{_~?a);(%qdGsIB4j|p)}%Y(-@=%_En29G6g z1Au*mLMt`o61#*p28XLB63&<5;)K@>$7(Seh2J%!`+8-Ee8Gb;hiMXTKwhTRr{!@d&s z;Lp(#zXnnB0Wg_zNBgw`D?LJ&54SFM`#7Z;76z6v)w&SVumKv*ljMuC& z=Fp?+S@w~goe^~V*-||Li^Tz}8mrbm#V_gWn%KF$1wZ`89XS1*r8wb?gW+=bl#1*Q zGQ!LIph>kcwwP^$j{0)3t*!?Vyn>Ju5xm0;qj346Xud9gFR`nO)Jd~?yt~?s)23}b zQ+y@22n&URu*P0k#<~`xVR8wJy|c`a87@_ts}c!RpxHDT2`9k%1#E$9iZ-Jrwi@x^ z7C2%pu!T1v64`@Dw)id6N+&rT36$Gjfhn{bK3su_RvZE8ZL_%)}AU+ozCp0OB>TEBKTZvEraIPr{D zEI;KyIGsHr!^o&FKNla;wW();n(w;_1wwe}mS=j2UBbm_S%tP6!(2{^J&F^G999@9 zwpf+dR;DT=bR)l|DtXl_k?4;_VYgV6<)+-`hS^kx&TuWlww@|4@mLosV;f)zt%ohr z40~iNV&U!Z2gC5Ei(j`kR$VSL9M(;!j{gMRvGWkLoQ8y{D(whze=!j2DqAG)VHu7rIw_jskvAq{)-_qiC%{x;v+*rYnWvD;)U7D5>2tg)IY ze$_GNxh4XE2=2Q5HEiD0jE{Zt7}V8QW>m&tgtxWJn5Zv5m$VcXguW5MJIrt*>Z?)% z#qKY1h~1tDZ-x51=IgVdwKJq5j1<5092Nt&Yik_Z>*XUQ9MhiTP1X`iz;4k5yw^=% zoK|Xykxbaeq0KfPb{9LgX{E>Pi6ES@EkJMs5}_>!hTcTi-aV;=H;+38r(-S3EdPs+ z$mamZ>3tqk)D*|=m>*ryAWTjtqO)eGGDwy^dteTQGbT|bcE{BN4oB}*hRFoKB@RCV zusBVq4Vh4py)CK|)Y7*%H7_>*%;gUaM&sC%+{R3u!#>5YEh&EcU#zq?cj2DfU%|Rn zJ8|yCAHkGqJ*BRUiu&r?*Znp1*jI?@wuT&)8Yp%jxaAqVnnUc8@=7X_2oUE9&kYrawCFw zn9;f|2mOq-u(=LVpCyr?H_wlFv>A!eduR`AfH|}t*2H?)?Y~Am zvK0x}6)HO@u#BRK-9Nq2)G2;s21tvc+Iln@Y-k73!eX6cIn9c{jv4Fb$P0Au(fv>;jq>c-OL){ zsj+J9SNyiO`tXPAAHkUy9E!6pJPfuRe(u3UeR*wmXXObcggtec!k^YfNm?3w^4D+Dka9ZKs+#KjWz?(wLs)un5;`v@53o> zcce2z?CR$zHSw6uNK|+cttiZ{f$Ry|l7PcxLMRqTI4fGj+PoA$6q3D?ZoC!1{6*+^ zcU!^lr#@?p4=urs6KX2*YqqF}QUEYP&%Q2pY-`3Xzk3X;j@^ng&N~#9m3_AuE+*g&_zSy%6c$Lmz0C0kH2QW=YzN-lO8+0-ipq(|+! z%ftu8V5Q5Ux*c-7n&Rx5rj1owa;&EAM`j1C=6b+Z4{O;`sn?3dx`60Dy!4V{H$9r`0Bd}kz}NwIm(s6h6-lSq4M#JoFX-5o9*n(V zOA(!;S@SrIa6Ak|D1NQUvFb>T)xN~~Ft|u`?MaE*-9co8cBzHuukZODVMZx*m z{JseIjt;9r zZF{kH^)|G(=B|OP9X~yUeCX93SkB0v7WvJbP`kT=c=oaP(Y&`4=UsdRCQq%;``PkE zeOYr?U2n-&%R-NT+GNkH)bPrqEAhnbFQa*9duqI9k5%IKx)C?ix0@*18*Buu$4y~P z&ugx?QY{~1CWM2mG-83rZdaYt5;5*>@Lx51OMlQ30n3t9Su(^~_ZBE~ux)r8rUH_x zw1m_G#jfhKs0rSHFN9bq44WygBI*3T7*OCiW&}G-zi*Dq*)n4$%;Uykip`Ec{QX;K zZfeKYjg8p6aVK`~YQgIFw_sOe6XJa)2vYn;)FTq%qKD$wuEwht`PIg1`gq;2W;g!d z5AMMyuQ>txA2>r`3XF8#~W($Opg|2PoUgo zcUPC^ePM1L8c^*f`-L^{oYSgqxbbLQYyF!Ao8j7$76$$=9yKErOTcY2p`1xpYWq~1 zkcvJ6Qykqx&(k0B6C7U{Q{;dXF=($f-EhgRL)AvrI_LK|ORRW;;84nh@sXx?u-4Z=@LBt=g()9w$Xg4B>c4i4SvfLRF8n2~}Af zUfYQ6o11aQc?aXzlNJ|r9>n>-&z6>ypvgH_ zk$~OffYsTT=a$~!Qj~zBS0bTyVR%ej%$V5`Elasl&a!!g-Zc#|3&KIb!bP6L2CLny zY)KSW#R_xPJ;jrNFN zZLHcd#BWU^<^}i$)%!q1)*<5@Q$EL4fp=(2|RT3 z^BH27Y%8XxC7V6W@l3|L?(Kd447c%_bfOBuM-wUmt=G@M0=qfO z2dKoaMMZYm35YjqhusX9Nh`|~Qtd?hKUTiK&0$5GFWI&+{&OVUJ2^%V%-uE9%Q~Szfmd6>fSyO$db9+(4#NJsP{>xexHbP0wKGhP_$sfqReD z@`^GzU5>tAlR_+2O{8!px$4jr^`kqQyHW#>#bvi9+x4>Q2)EiZf5r^6mPDEqyy;`r zlAzx;4y!qlY}aj3i(IxR)^02Lk5*4mGsPmRAA}*M4Muj;qPi)u%fF{}JR}t9cB^(T zWB`@okk@c)s}B#o-Hq2)wW~z8nGZMOfWv0v@DmoIvZg$vih_>2%$ZuW9<}_y)bq_v z9oV{Q7k2Mz(xSo}w8(HYx$D*A(f21k`srg;^Zh>e`1{zfdKW(TwbRfrIlslBuc$9O ztg(RycWVO4gh)XUG7-T$0^kk#nLA(3DR#5bC)9?Sy|ePu;f6Gm7}$ZyC^!$W8blx* zRl=2%WA>ECND)1{+T=;$+w*rTqZ`R-k2mW`K+jU=WNKC-S`)rKpQ7i3YmsoL#SC9} zES2P!T@b#I2vjehZ`Qx*|DK(g#P_$`Eb6`W z2{jo>ipD~C?unJyv1K>Tz4$0BTs$4c!YyEmUnVtGxNVvs4zn9r?rrgXMeu(3`g%P2 zw-5w-#Lbp zkx0;A%!LrWw=8|d-5srALyz#)$xP@}wt_IX`Qvb!63Fd9FM=%3ZhCWxgz7YxdG2Uq z&`X!;{}eRYaof{-@Zt8L^7@jEt9D}3>PFmm>+_f~f1+BX9)9AYKE-c3wRIKh0nE#I ze*2c)Xxh0Kt5L@jqYvJ3jV_V{q(AOJL2B z*O3n{&RaS{>KmZ2r$vc@1U4y=Dl3AZA%b@V@WkD(;kN7lo0>fPs_~dE=xQeP9pUY1 zYGK?la$ArQ1l~ZoEox^nn0}1O1TPBO%&2aU_@(V3SG7^zi@9yCRdSi~kDAN;p z_*s~c67+}F0zun4%#83F;e$*UyxE_h$H({9#V)&Cy}GI$kF4lKD7TeZ`3m29VGZ7V zel;4V)#0-1PR5)?Q;I&W3a=Xz4w-{x2hUMW2MD7`tt}l|R7qJP8kGocY3@KU7*k1a zAHKg4&A)BO8Rs5`qn00#H`3UvLW9|)Elgs%@YTG&+GHA2k)(Z%58vE~yZ`tUHhr)& zwK(mo8<+my<&|X_O((Kp=P;NPhA&L%>Etd9#cO)KTV3pCM|D%ShGeyY?D5Lq4Mh_O zMPn)9%gAjwrZ<5|M!8kXX)|Jxs1jY4?0RDci(U2TC3ZEjpDuPcZ12K&Er`T|D#^=cal&fpX-1H1tgkg$Vig8=Ay^VnC1}MG%CewdQC*&zB-O-j+IY>_g~=^;vtjF9CaWrIl8yHVt*aZ~ zlaXbX17u0U0e_nG@zkH#)hmf4-%M4#NoY-A^snL7wOx4Nr9J5Ajut##-+ya^vLzKO zc$px`dv9BJI3og1Tg1Et)6^rKraf)=@V!k+{BGU63va)*1}ooKgKNKe0p`q`((f2k zxf(H+bMCa}Po>A7b$^>=w6{fDqS`L-KjKs{4uXa#hc$ zOKrIg@4vknZ@<0<)8|dWl-ZL|=5^=%9SYO=-l^*Ex{p_z%rvo^IeGPnT}Fl+X%+@8 zs$00&&3;wQ)2lVmP#!>&mf*(Eqr-E=#4mbb2P1qll8cgmr{}J#tpnAJlJc{pwG8I_ z?rM+Xzwi06^4-?FubX`=Y)G(YXWze*3l;fJCf=lr-F!HlcFdYPSv_{Bnocs zr{P3A&Fjl3Uu9W-o5on6c~=`A{rd}8y>cCb5x=@Fn1xSx9ps`^S;`>5AC*{xOLSlzW%`FQEybSA|v$A2c;e{(!?TspFL zU{aQ&0>o}Q`VIg!8Lw0B!tlDGAnq%QS}^J&jA@Tl=d?&Kv8z5^Qt{gLmcdD}8xBSA z+@?65e7OnTzGzY7wQ)-`qFJ32`-9@s<7CInaKToBx^Y!F=7gSdi-cp9k3w!|v>fG2 z{!RD#PORzMS|bQ!9TB|4#Fn+&@r$c(MoZfsO;jndYfnu!ya7{Okz5n$q?wr>&s=cp zyW0fJm^TSqR&B-iF27#Yha5M#9t)Sv!?gL6F>lFC)Q+!8iC|8M3oE8$KkroRh%}-# z+JVh&Exp99zDt?g1E_6}7AtnM(Yh;Xlc$y2=@u)(!8jtJ1OkB|cJ15+Pk9;2JRaC= zww&9_h0qh#O&}7Apt-pjQJ){9@LUf(qE&$_X`Ch z*t?@0(Qp`6dtoAxVw*yuI~XY@|F9Q~23HiAyryi6?8H?_1&w{c9@xCA1$X}Tzj*Db zw^Y*sD{IiQ-fEgBontjUaV?!1wiWi~7aHtL7>tBbUR!}FQ|ocV4{yV|54NJRx&pHo z&BUyQ(=cc8bTrHu4{wzxC4wn>`Dl)|pgG!#ZCx!0XEh(tTY+n0H$AGWTNsj-qawv_ zI=of!Hz~YS$wH?EQFd_iYh}rbMlU^Vo?!pRVpySQhk2h`sik? z-Ni0)wqCnA{f*b%+uIQI1(2xm6nrnK@HpTLMFt(IFY~z6qYzkIS@pyj)H@2o*hd8K zFwoT4f?r;DGn(2OVKq5Yk=^vkray10%Tt&alfO#K=b@(`hW|Hx0)BAyud!>}F6`aj z4C@0nSWGOLW5txY6ES7Z1WcVb33HcB!<6YYIIwmGnma=nZ*Iey&TVLo^wf=I=i;8| zQ1%2mc(Kcfk?Kmt>Hx_g3$w-P9rn6xTDPcRP(9jO+u(M)QSSA^;dJzh`s!p)S{c#Z zI7M^-d-v>B5ncyNkXfx6ErWMqN|6JQdUDj>nAg zb!dpyVS=R#8@qR+G0==~Lfe($p;6Fgj#WK5ZSZ1O^X%$22HJwOMUyRAk_?dq%*9?y z=~3KdRfc??UG9MJ;qymQ%_BHgKiCsMG@|7*(9@o8eC8Uj+t=;H{JG;1H=9+nhkRwJ zD?K(9UDvzl4HXOqu=0%{2>B7gI}F_L-CMD1hc0$qdBtuz`b1hgp%U)$;5hXZAvGI%^?u-WYe zCADcaaXZo4+NvcG>CaOHrwLM)r=4CN$7Xg{N}+XDN`H@h@7dKE#QX2=L<6lQ4lC*^ zSP(z1I@P5|g}6P%NgfAHGVD-jKbm1o{!PM~RLD_R;m@Xm8fVWK% z1d}@z{00gUz3IHSayu3rIuG@A9@LaO)R^ExmA0#NXh)%iga0x6ULj>2&u0r`#4;mJaL)onHu$O6LHQlp2Q2G+Px$2DD3#~%YUxHd6 zAy$r=YzNMPlRbFYVN!{f(07ScLT3N=2L1cnxpfaBk*MlE$On^0Y1d%aMUGY8rTyc_fb4}({lxj-EgW z=4&@$)!XY*2_KC1T3Hx9M>7e+$#(0iMt~0hFPYv_^+m@`ufmK44VW}zJZ3IxKvliB zWMa2a=&AJk{P6qzD(YKaUJiGeTM1u%G7E>oXlZFtKiBJ6U_yneRnUXg>BOXkbFg@i z8SlKlIw^XSZe|tv%P)FKz!%20b$b!;2jOx%mB^*n+7#5X%gbF%hBB+IQ3~RrM(g;+ z=&p2FBi^cV9DVv>Xm1Q)`?}plkJoDYck|TX?T?D;a$NrP3*hmVsc3U&yHDGNP|;pq zr#+%K8(jpGH~*noE2<}YF?HT}OrAAfjoAs)YSr_l61zo_6uTyNOiQ;h=+WLh*Ccmo zvippcPnw8Bm)r2zqbt$f#rn5ByC><3g?!_6%bLCDZ0&}(vP|7ODRTK>LM=rv$E)g^ z))g9-9T6t1NlRftC=3z2!^GL2J`o*zyYa#UD~b}k{JGkR`71OO@*36SD)HT$zJ!1L z-`#lZ&S#W(W8{b-3e^oLE0UG#HHfbxfKBi4(U^MP?R8=qoC zVtJxqNImSGc6iFl;3{(?9*Zjr1E0^v6$ci?OsGyTC1th2GGz)T&RKwCoi$4ECcsE< zT9MHlqE|mB>070Gly~~rNB;H#_H1t{c)apw%B$S{HXG>=MtCp2?i@^*Iu7^V@(6Zs->WT9ll6Ob@z&pX zjfA4uv$<70-oPsLyb{3^yqGp`0w&EGhnf3N!uTmQs+*y)Vz;03m24MGvD>Q>LqB4d zwjbUz(vQPbQ3>0!LvYf9C|-MGgGykFCBj-s447cGAgAcfHC}gY-HY*)YhiboGb$f+ z_#&uMHisB0JzBlnTy}?2qL;E0y(#aNnY;bAjz z#kbEdNo1Fkf5;buuO)(5GyzAM1r-xA6Z;s^Z4HHC?WBFdq>|IJaoX%yP&EM)+qyEI zH&;}^wrH{Xd&AW6m^QlsTh`MO5=S(iCYrNEuR6A@@6_KN#*U3m8G@HEYQ!X;?m$$X z3(d!CL4}8%)3oC8dWX4E!Af|vB*%tu(jMtJZDt&K%Kq5Cb{Af3=|(7!?%~c4+Y09^ zNmdNUpZgJ1R=Dub-`|gI8ymH{(Q2$FU@=+gIVyU*QUo_{Zo-a@yAWfNTOtm-%Z5p_ z>Tu~-KZ?mSCzK?z%lB>B+kxhe7|e+TW=`|MX->8c&T1X3BD{T|dEB*yVmh`1m%{Av zpxOh>T{Iodds-0;gb_=m*&A|*Uj1C9vw8Jy9B{~7*ja2i4T{`QIHvsf{FPjGhf=Ro z*$gKTlCdfXg&=}=h~bL7y4frW5N7Ash)CB6j&cR;xDo zgt}wc_)0q(-|t2&q8)?TVnX#)CzhPA)hW$JZzz$C!)n9a@>(=xiCvSo0@g(br2f06 zz7mHWyI2Wc_1Oy$z3KS71K7G@7mmc@wDVw6#p-z;_)y0g>#;jf_S_z zF)bhe{O!Hiwtfc^@sJv;3A0`KdX*Wc0MXksURe&U6Opv*H`EOTgPx28&cTaa?T24` zc`F{c`#o&m+@f|_cno#5E_~ygM`2=}tGD3IBX(K4m^&cZV%K`W5}3+*O7I;GuS`F+>(Mx+nelPQeRof5=(_ZAvNK)hY)Wt5zWq05rwZG~P1BKrOkD8)e5QP5O zciJS404OMGybe{0N^cK4Z|QV=^y=gK{GD7kVz;N~#ygmsrPpIeOJ@kMSaIg%C*V7O z_!8V6H{uB`DT|X}G{HoSSP_jI5(uka@tH77y!F|8}uOYGW~EQ7hC$426<^x&wI55aM#9oF;N zlcF~o3n3QEf6n~fA?(=Dlu-tZ=Yjs&TxH65TKRl)XBh3ih^ot5U*Uk)ZB=zgjX-N~ zVOG~@zEWxXme|$&-V`hpHxs7S;n;HyD#}C8s9>Qb$@+W^s~Ht#b_61E_1!EvdVgGZ z{nc1}_(GViCMDo_?M2jBr2tD5JYG4*8QIOIeo`$QX_lVBh+Uq$rsi(^=BH2K&%b^i zTQ@W*F|Ci+=9VBuEp{!FCc|XyiRCO@Iu~bOb}}lf zdu&zeoW+7_ymGAOJ7DaC{jB%dBxX zsMD9-5J(V&z7WAXM6lf?Z+c8_V1zE6Gp{-hH90z`i2u7iIAuVh zm&fb(1+jVkP9?0kWzIykLOQ8YJW%wuc8Aq@rrm+{KLJ_V8Q+ZhaWTPi zcl=J$D}o$&%zl`E@Ju*z_;U63!a6pG4V86XI0s>A;C+MRmEVgV`6rWSO~lpTy99?U zUkV$ejfpU#@nBNGvTR?x;PI-B)y#zx7j?E|DYe1c7&fhG#7)0^4l7^Zflw%#bG$zO z{7$sDYJyky@%DvY%|vUIoL}tfoOssZxbUje^N8NQ7Yf|rTKC~r)wNC8jvN%4kzQ3H za>2?Dd)q@Q(o4HTjn}TC!-FV}p{VfK)jTp(-hM$C3y7s*2;hXp?P^9-`^x0~!9PET zNFc0M?HkuKDMiEI6@GP+u-~I-kz3*M^-TK9gvWit<0?7sEKU}osC)@5&@6>ksxO-6SIptVqBO2L>5rpCp!CPXyZkrMmO&!6!H#Rns zFnL|5E_cA{Ei1{fsFGJ!6Iwd^PP*YXBNJ7A^3QMLC!hVT@(F6bUaf3d!W>t=-h3Wa zP8dw0p*M~d9})>hH$0d;s{v(hH@xl&w6u33l4r{@n^-iCZR>a8Kfikl+g57}f__{1 z`eN9&vI|vHoUo;3Sf_v1I;RIq!U;I+R=CYtr>jW91anO-%vII>9vA(*=UslXs`Y#C zZI9*l^ky}u(1rWvRoigV>5J9GRYSSgCMDiQm- z*yZBEAI>c>Q$Odjs|STkWqn0Svhpc*c`R%x9gZaOmM#1A4=zzY;pZQERr$kvjnzD* z%LvCZA8deQPq0*86ceXTfVa|%YOfRiKmdU*f5ABh#Mc$T!+(7dZ$7a`)ekOYygvEj z4lHi4plqUByD+n$SC`i{Z8sjLMYS9cMPf*JD`Bp!%PV$ujy!1@Ty7U`{^gx2ku6j7 z>dh&7pRW(zT95NDJzV)^!-Md*>vjji&p>Mu$7q*7TF_#Xg4t=eXjU{q5Q;)94JCp% z<+=)onj~7gwC(5q;LjN4$xMf@SXoAq3bb|gzirN&ea*Nk{OtB`1&duh z%G=!(#_mHds=2hpxiy4)llGZ5H^Fp7MP;IgJ97*FmA3 z?evaxM&o891Di!%kNL!IdfBoozWs4r^!c+T2xh6 zD6vbgY$R@h!(9%W!v(XYe^I$}(;ocw#}DI`hd(G-?CMe87vF0`r$3jEJ)stGtjfSh zX@@_mcFVjI>rr#mM_{igN1-e`asj^n^Q$p^&Xm+~@f`Jx)!vqnUEA8>4@5JP)CNm; zFs6LI{5&3)W_REYU%pdCD+BEm;$#qn;t|0+M9FD|!qq-k@kT+>#v3UoE>04~z$n&d ze|Q_-Aidgh0TcrO>WqOJxOYDvjw5r@d(ac zq@txOr{jD;K0huWE;^&J{hqA;jZ7q9Yzlprxq`8#nBR(dc#u z3SSBYin&^^9WHz3`L$WKWH}1%ebo!dOO#P@ZryWxxtOhL3NEcthjGWFTaGApi`_Oq z<>KRT*>&fmVLFrQ63Jw?2P|S_}6dmQBe;@kF;&mcxv0!lH3N&p4j-D&1S*4hN=v)o2$&2 z#ll3PD5BvYVv#6zZ*Rh#zk3qvSL{%c;%o|;L}Sqyc5G_Fx;GOzdHGaydA!&X3S)dA z47V-qoLDTdG)#i+z-7u_z{NpVFp4s#O--iUZd6GkdA?I7Cw=7j15xI2;m_CKf%evp zl;}+!F~Ih;YS<-|KYRP8y_hh$4y7QU-GSTijPC07efLFpPMAo`o$l8aNl z_`eZVAt<0#RfqvDKn_1;nX04vuivq3*-oaO_8zOO*~@rtALF%td+tuc+yr%eF6XX?OU*6%~n+=jiOi6lL@Vrv?}$c z{r9HTjhMIpv{W*m(Qv+?@Xcj+;I+y#+BFQ_7X@LgAQ4^z;i}y0wyVh6K|Ozk3;6Wm-*96+KGmk=|I&iV`}k08u}sw%@Jd zl<>7WvF^Pc`0ZE!jrA*7$zX7osV^AEiZ$Ix_`~q}V^|oqpw^aI8`b1=!ZK|}#&fKl z$qA-e)ew%WXm7t30f!BX51ofkfBj>qtggt6^v04E9GDoCh@rcy8(Y?CwR}rWy4`{B zv+(-bS0lUp4q4ZhC7GE?KakTv|0sQ>JeTEes}jD0D}k02yMq+Z%Z@n!pZdnfF@MP% zHTG1+6+PO^U70>A!06O8R3l-v_Ipk!eCrWrT^Y^~nr`Roq73+QIXb-?2 zh^X&I3D>M+;aKIEO@|9NdRy56&FQe9+G~f~X;IBo`l6=30$=^<91`)glCa1BlIg`@{(^H+l+uj{Pd$(4} zfZKG8#1$)cDa^W=HEvKQFYD+Yf8G)J>aRYFnsHh(7bgLFQ>|IPzVr!?wumFoT#94P zSgh(%vVLVge4T#$>o@n|m)HIc-OXXcJdzZ9&#Y|DIf+kuVmZbi@+ zO11r^SPX?VivaBo{C6f z(&RKQ2nRY^d0kMDal9&@yvLTRr(CRmnAZnw41*QBItve(i!c22Q#j=KrK+Q%=If29 zof3MFGmoL?zZV@g8^@o!3^S(JsHD99KFf0tyn^emxfvh6vI+5I;};`%c0~(XJ99@f zvnw*t_QbKuG0U;57I)ndC471Btn)fhp%x@Xh+agKW0ebfP4Mp6+JxvpTR{#Gy;2CT zGj@jS%kCfuLjQ=R!NAUG`gW8Na0{K)6nMjC^oSIa$*a1jd9-@JMq9l&87w?_F23@s z&*GO~z7Z{ZTIm#2qL+4rY$$e*KKCG;d+o{UvruSI5LCFeBr)E^)2#>FHZfB#|0MqSv)i$IM^nmIsbz%65eu2IYey4yZEq@>tsxt| zT`?opj3(;OrQ03&y%e%&PXnU%>PCya`_$h4kQ>Yv?d1fd6w>IAO`L(9czV?6pT$;(hU z-EWc_t5fDpRJD+4b*T36v+(+6!dq|A`~Ba39>4tVUsP8%c4MUI)k~I{Ocu24ZNt_L zJK?P=E19h!8(yz$uECuq{p=5*sDINhCna{zIS3bg>6Bi-Pl3f7IV0jcZ(Y7HHhi!J zzy8`SDypmMhbFVeQ+s%se`M|LY44fHC}tm1le<=gKZ*%84t(R{{ZU<4nOE#GLd0m% zudexCd?RzIZLKv#==RMw|J^b%HuXLg-*IKV9n6YYqsOIKir28 z-rkTpcC(4TXA34ysl#PoI0K6hn~ze%s1PdvSgmFi{pw2$Gii#xRz|h^D!HXfL%FOf zt9-OTVX6sw<07fK(1kCr@4keu-O8V_DO-frM4@zaw07Z+8}7%;kG_FmcL;8KC2STg zfm6S(DRwXT;whLqZ(_#pGQ!Jy3a=Yo_%`in$IU;!9jjj5ghYfT?aYH5ubE?&(bTV8 zupbuAo1k`<@`+tWcR5x!y|*pZ3ORecvUJ?61E;C6I_H3?n7?=mTorBvBib%UIssn@ z|NO&!c=pjZ5DF&8Ke$NJEGHL#_Eem3_ThtSCQ>N$hf}1s^l?Au{hm1^{Jh+?;ljJG z*_^?KYOg~a5yC!=2;M=`)E+b}QdFq$zK?Y%${D0?_a*G=a(D~Sm(}%b^6SV*Xn5M#QirsrlPxrY|rv% zDr(Dd^5sY4{A*5BVlh3zje>!qkP+Tr|M(8P{o04A&%>x#WlaT6z2Hcked+NiHClw- zs-i{tyt_PRCQj1-sBPQ#F4e{8AH9W^eoD%XB>1`eO2jIa@Kv?1EvD2t39Sly|p?A)c(asC%i?j?3}3E$VBT8UeJaS!%vYga;d zVB=LEtNbpshc1E%#pDk@bucE6^Q4}$Oq~wvy#0FlcAvfDW!#^P?iM;;7azL-SN-Tb zOqy1w?j5v}=)#u*(&Mz@w?DfJ|GnpV1Ov&kYOtu!d+0Iy=KHpz3o9II9U3O|IM2lOH2)w z*wvdhu+!70zkdnbWiGt%z#H&590iMA3g(?VTJg_c-;LLwd`H#)jK?F%xiL9yCVD2% zj7X75i`=kQrY>$diS~uVYQf~1v~Fw6G9Nd-m)K>!-z{sl6mENWu#bq28MgB|Gb zN0P0AEh@=`Tany4&Sg!+Tq#}g_Yy~>Ye)85>U$8UcUA%94fSu2!CD1u#^_h8%VotQGeA!!AOsR${v z?_^RLh>9-8O{0)Zg5ZfZnZO9!fI^aMBKBaO5wP=FU(f{ZOp*%^x07(W9i zVyoG#Dv1cioWrn+_A=T}5fY8(FPT*;jyvZgaF#jn&`r;xx~{q)vD@Crma>L=CZ6}$B7t$lj~-hBFP zxGjYXPu(-z-qeZrUtFyOFJU7CMpal$o{>If5pY=HcGTg5D>Fqew@r8NXfB!Hr45D& zTb+Zb;Yrc17FBUt86;X%EcC!ql(lqmF=bK_b6ywh+(kh=RM47m>N$sDzlGCb_qgD$ zNZa|y!D~;h#N9VNjBOisD1ZAJ7n2JlW{LiUo5g;4@!28?|*6_|M-SgTE_)E$eq+{sEa53!}s?#Wt^p!R`R) zwg`%Op>Xud5PFSW=GzCuVHJfNO5w||jpY;hel?S8dQ~b&C+H91nR{Qx1Al)MEqmHZ zay+y@O`0(g)8z+24FtBPaYhT}hfD*7( z>YmAlk-EQ|5qREDnRv)56_;FbJSH|&<99!~9i8pnSoh&(9D3YhIGn~;Jz#|oT8WIP zkF7lRvJ)c+DMav&*0#mLNH0N4FRw0q8T}nsX;uGiR4v|oVmDt?3C+T=EoosGeBD`= z{NhAeQRBswSrai~$~eqjI1RJ+Yd|<*$q;slXcY0?yAa#8vsYt@bm+@#Z|ca%@-8GQ zqUU__GdAsP#`={Tu;e52lql@0+?lj6ypKqD z@TC^VPp(5%Z6zj7ACK{q>oH^QWGp&x8tmnsUZoS`ZLNrISO?35hF+fCjALx-P-E84 zvC3FzB6kywzQ!wem)?J6HKxq0htp151DnBQ{w)3Kd{FqFbow&2h`r(ZJF#Kac0@wa zl9eE1q4IAKHC=`|ot&Yqr{P#>bCE{lscK^~f8Dg~PDejfom@ z?su?`X;N$r7FGapJH*ORitcIjRWl(_)u=ABrK)_e)89~w-FII45dXg6er#T=wc0IK z*p8nv4pU||VA|YCm@;EL7A%?uo71j#I=Jv+?o@@_jzG9~T(xO^F~A*-qq2<05LeY*7{R2)#|UAkl|?IVyt3n5C?3FTPrZpvo6f<+ znGG-%aBYVo2~>=$#aDlJB`Pc2sPozprnlXI#R;1Q(eH0W;;~d^5QN-_;2k8qzm~d^ zF~tibKP;Cs5V4xxwar^*Qxn5Lg>NBZS6LW7+=5?z<C?fHoit~np5wz^> z!1$^41;2;W<-mlg;}JJ$wPLjdH;WR!fdNG2RkX-fSP8Oy%E~YV!7kO1!)Zk{Hn8q# zde=5)>9fiQyEqP1_!cU5+gm#EkN^7*UVD0_>c&Q#E+-mhj924z+~hhXXs6Gctm;M= zo2^O7m20(N>0M^TyU-3{MvhmOM+?UTS{F3{dv~^B+|&uM7SURJ(ll)$uI@p0 z&F8Bp4-Z86vh8u9CCK_itPFzCHzIfk3A-urW>qREd^|3j+UhE#-D@d@FDI-1#BMYa z#k%)4=w7kVv5_LFTY1Ut_T)$i}*r zf#-&SJfo}v*%;Y9EjmcyTd3IGyR#WDJp4Lb9v3dY_H0a?K0%4w${MesRS0PBh|nh= zilr9t96u_m9T{j8JNF7E-+1N1R4;*e^qEIs_Tm|^+6Oib@&Hk2aR2~EZAnByRK6Jr zL{kZFtn3isLMO=jw~2!9@0>$gyNWMCmJ6{m2twb8;2k865(-`>F|b^Y5n?x&@MWZh zH%M+Zrgv@21t(r+5clT=W-HMBmd;j>l6J6iTh-*RZ~Zgc(iM!V1RzFzIq?ic_~x4? zvYQf8RMN^2MHpq}ZX9;{L1^G9usC_y$>tqeA^2^NzH zrKo^gs_tpJ@a<_{q3vXFQDlUTfp&!RK7ATW3AfneNpZ_#VwXscTSwA+PeISm#Kg*C z&Rc(yE_=Mvw;N6b)wrFxa0br5_H1|z>X??E;HKSEGdsBTSAtBe41!R4MDPw0Rn$9B znv7jNiNQ#*+dE4;l<&x~L)a>q%B z&r_%sFMK(L78V(yZ#S9N8+8y71-a=JinFu_@njF5yd26XVMwyeXjE56; z{^FRTJtzA<#$yjf!m6tpkGag17?AKS1hyQfm4O}8oMldY{LAN~ZbFU0@6scD*~o$m zAbPp`622VEMwK8FD}x~Pj|kpDLNRDGjLtB!*UXIFA(*lBiCQIsc{6MH>SCAv;o%m$ zJk=}>#0U*1(EbvDbm7Z{8BQvLvpS@|egd(iZ#x;z?Nf#|gWnF0+M-WEo^v|Tq zSb1!!6cfKI3L9Q8JU6jeV$dbX#+sEO!_r{zaOEO|f|peYj5zNF?ap+ul$lwLSC?H& zn&Ne>i`__cWQbi}r&g<3jk|n{cJ7e1L_(>EZMW+dcVX$79BVsROn$ z6ao|6LXk+SbusVhY-G{R$}({+putPgh!SK(tPFzCKO%SsNhr$pzV=k#^1;A+6{C`z zyo~a66-s&yU%hz+Ed!i{MvB<6!5y>{Yn?UbzX;>Cm5-3GN=TZSQ!MNFl3Yr5_(@LcDcf4 zVhIJ=K;Z8&y2|ZpBm9?x6}}X?j2O}n$|%-wLV-eIM{!Z8*iDC%3O$dlonZt+F(rH% zwdTZ{pQteL{9y}jsUwt};8eRA{cZQYVqV>RP*0$CM6U8)*K`Vm}MQ*2$ ziC|{sN2e$=4e%W4B4aqjZaNgVtoh9EoX10p)o^#$QdLG&?eD^qw|d!lx+5wf)#7)zTK+2DqQlF3s5)Fcq>Dp!ndg-1iMNG)I8Y(oiB96${+}ZBN1K$ z;EH{3dr*n89!o&9U^{}|P=bvVjEK+;7TOqC#X&EE&IGYicWvtnQ(7i7MfhOQg)gH> z*%9BKH%ushE>%r-v^U+iOB!ZQ#Ce}P3(m6sYwnf`igqpp==0@biP3pRk_t(1%LUIf z&-Yk`-#2SEGs4F4%EV2I)n|r*b`*z7iUpfzyXE!L%{cyn`0(WN^`Q~}5_1e`K9q0}r ztLBJ_K@bW<1h0W;4FmMHzD_l`yLO8vcGGPPYSLjzGLKE&u)Bg0gbeK3 zmiKt9Y>#V2Ygfpy8oRlKFMYn6{f$}tF_;qUQpTu~DW`9jCCE-V|2RzBZwiJB&f6+V zncSi$dSwUYUG`{Qy9yP)s??iPvyF^(cwWNYTBQ<>SLN}hK+Gdxi|L*=RNsGgf*LJ6 zycQ@Bx#L73>`VGahvIlxDv-OlCtDR2DBK$5LZmYg=_L?Y%8J5FPjJ)x%zX-k@zlu?>5HVHRD6O-*LgIRc~PMq_6Lb z?XT5C1T18$OpGW=PaIui>^Bl!--ykj1yyD;wwABjhW%) z%z)3)!OfOj$n1;g(KenFT0*MIEouRzml(4pBj2hVTnRUQv|TEz?Q> zmZGFsF5%0Fwe}g}G&J-qPEA~}>N_zB716!odzWI|q&f^IyjSviVk_dl;61dpE0Pkv z9w+T_S_il6@2j%hE(I9`p-A@48E%;Uz0|z??^4#-Err+}D&ecduE(x~*-%HmX;)y> zNE5q^8kvz`H#HS4Vxj)Jl9wRs4_Xe`I=IjhWV-Oxqe!aslao;-p5K_t?%!9e48{0+ zd2RE0W}VoO!3`x!Ep~@W`08Sp@4?b+LwP&nSWT#?uD&=mE8$DAt63d}rUY4ku+BNp zQ@)68F5yecla(E~6Q$QO7Au1w3=9#xL+tOR=w)J1m%k_4JKDr%%ZjA;f!M!24yTey`#<@Pf;AJodb67(=&x~~K(u{^$++^d9ew@m_ zMp%u1m%uSAK<(7Rxc1Dl_Ae&^t0Yp}5z|GfNWZi38nW2_uNKL%n$O}fwxO}z2=@DB zr~TB%F?w|aW$uE8T0RsR91dSZO~eNM7iC5Z2@%Xb0mgoxhmLb*@%EP1L^JxFxww9? z8WBYdnt`Bc!8Y4I!Rqp-6tabjv%BgtJ>-{&{*8*DKKa=DuhD#r8>3|t?@_FMfc312 zsDZlGV(Ut#Mu{BGU<`{$pTtl=X)1J%7{$DIJA3}mbc`?`qs8LiGZF{$w5f^9V>>aO zxNA3meTElIGk0XVerHYtyiA?bD^PSNT$vj8#t_-clcxq7;cJt3vZ<(rt;0QKSTdri z=v_WkV)*-7jb`y9`JTcbQ$OWng298ajqG&eIQVSHzfB8V)zG!un~1LXQ-myk1tC#H z)5NL1KTZ7}u<{4Vpv#*+dc{Ks+Y_mPo0vJ^Y5;G!YUd;#!=p4-3$?cNf~oAJyg|uf zYXsG)B%BMd=%)ms)`CZ?ZCz_rWM>`cBPAb?g4)~c>FilYTu(QAZ)Y3QOw04;0=93` zjrAf55^!B}_<~MU$%(BsWQeGG-*`RjFKYk#TW4z+*w`7)MGQZj+Mf_X*PWUoZhVDj z>6In}8iIvw))z15AF{~237{1CD2K``0}*T1b7DxBH=t>HJiz5QCLYa>R59?{NQrtD zx(&k(*N8z`#eF<4&aXoC%(GsX%M?0%RD+?a&2 z8{O9K235@Yz{=8SHi_DB@!wXd~u!Qig6O=oX0YLFaMXh`#Or1<4oT z$}NN?eZLn^&_UDWbd3MqA;aPI=Zr}beFrDP>2YL#^pf`vg4N z{f%g|2RE9Bzt=`kYH+s-B9#uUV`Z+tx!gpgsFUbyX(ee;{rS8=suET-h{ho`Ffp*p zCP^OXRbN7qw5;ujTC1r?O0p7ok;Dcre$ z5rTUGaci>{CH>1&^Q#{mZA6*yAty1l@(bQt10fdS6@P1NMiRlt(71xmXsb8)s8*h* zkd=gdE-CG}l>GT!&cOpFE-}4$z26H*)Q_)Gq0Dj!RXyBwnY1autMZ3c_vXgUE#Jr7 z(jzZo;6o@7WKQKfr*g*D(T1kJp12VB3ie;V9V(3?GzuM+hh-Xvj+Qk3fv@5HV&rd7 z?fbwvnlbxn?;~T$j{c%Zwbc@5oc5@KDCQnjA5q8gNzv^VoT||Te2L#XA&lXbUN)~k zumrdWu5SwIhGl7dH9q6tziHPu|ggV zV`%wyG5&B6FU%}OQUtiR^$|;-Kshk{&OHr}vay143}R#d@lPgPX{TG>I&tG~AqWem6&Un*(fRG8@uVO5 zYm@|>?fS~tw9Vd{t9aFIgpM$C{XD<%ikP8Ic{WBf=~SyR7X*k>=T_M8^ zw`p9TMm8xf9S)#6z5!SE6bfpVog;m_z-!mQYnevpaImW#yw==+i!JfYYp9AWNAAbO ze_T)t&dc8AiSryqxxF3sZ?MzDc_-Gv?inT zUB|A{j@kJk(#*AgwfgP3M(Uyb;E4>VaCgVp(gU?NMB8eJ^Fy&9e9LBt&FLbuQ5IUL z25?)3;CJ1UJ3-aQCo=~(0~@Ye)T39abQ*_lUpIJaV)ZLge7xoaQq=Ldo&Bq;q9ZnJ z)ZC;uQ+E}JDHGFUi%IV#_N4PAVFq7;@znF~j%M?dj$G%)E*<+(R8<&8TqigavONC= z?O4=zU;L6K{Dy8vy57PyQ&jZe&yoLwTY2_mjNvojy^xgW1v*bLLS;PewlpbhrIrL0 zkC{bsebF1PASj`%M0kK$rP5eHfwzV(Af8i7U=o6{XLxq@2mFg)a^Ppzvyzt2$mxc| z3G5X&W4H z>75VAF?aB-3;6aQuQSO{D=vaRhoy4$qy<0tCIgw7<|mEapJ~Bvi{CL_KpKH``&s)c z__un<@ZY8-44V)qy3P|6!-Xw>1+eSAMJ_~4Py;}&X|mzSH}8of170rgJLo`%+NpL^ z{nBkE8j}}(+dItlzOpr^#@!E;-pZXmi%mFKa%W?bMp2QZ;sTkPQo!=|^F(4V+P^)D zTPnR`BMgb*;*9V7SzPz~kAWd)2LmQ+wcKz%wR;rDS=a#{3rcT1igDQF@W+UhL>Fca zPe&sG&|70!nu0T2CNGd1(7ESlK~NfWPReX(TxTHl0qCvm0J`TCtXfEr40<36*c{-> zZ>QU3qz#yPEt0ay|PW2i#s!u7`;Hm z{B^>6PMpVi%mFRB2UWiP@9?0_2fgQ!akRlZ7Lw4rxvYqYs6!ofP^2cRNsuw8aR8FG zRY{qLy~I{hDk(EcAq5~K>P2CUI8o09l`Z@jrqy`odJs@Tr~8EJmh+{@L&G9m7geT= z2dcBSVN)-^fT=HfwyH$EKE#JT2+qSBwvDf;Lr9;sU;MmVX&r0^m+<$ebzx&EX51*D zAY;8X!(}Ig6@~6cbQmPoX{ztov{I5Tf~%jpzw$U@o2}z^oo)W*b3_SqEo+ztI3N0u z)Zh2uG+*sdvgkk!F39+=TGarq-f84}hH@0zB8df{gq-D3R zYb|~_zrkW?f8KQ|-s&wGz-yg(qchhiZFWT@*Y}`wNugN(nJ@5Gqd}fwPdf@$&x;cJ zg&f$2!xzTNC-m$yWjH6CO`cctiP{be1}rBpHD-E+c+zb;MAhA_`At{G$3DNn zs5qLU_8deslg1D$1$H#Md@zZE4X?3TPF-Ahv35oKYh~`pe*vN`7od_S=f3Wd~nz8&zdyLB) zZJ+vb2d~$xo`D9=gJ~^}GP8h%&+Yy%`UR*?9fmD5DPBr$_^}jSU;nL-;nS1h8>mi- zzWYLQwiHS8m=x$2w{1Cre!LWyJK$I;UiK6X?ScBkCo0WgQPKJ*at7SlnD7U9E@`mP zj>}Es+Mw13(6*DnM*MXe=6H5fr-4FSpj4f?K^Wu5<@a8DZOSply%SGe;gH&;3B zA*KLQ(0OZxqEMJ$QY z@7w?|fOEe6F%F-F+G~!%6Lls6B6F)#L^L%I_V>3jz|DySM0$mj+ufPATQrJ^DZ^`J zA0%&EA|XopYX#~`uL?>2ZiLdh(leA6H8o*I@W0sd{6IHBvqB@1gZ2%Zid{~-J&3%0 zmDy{0aOn1W@N<>%?}?Jnb+f!ameVf{1}tb!`h_X#>|;$5ZeOQ?)-983V-ETA7b(DW zkY1f}0vr&D2*5b;A;V4rf6HgXIe;>zRb z+2ENZI7M!ml)hjld%%?V2S$Uvp77(S%i_Y_%86J-;vHFg5VL0IrSLn$&gy~uwW>$f z#nBRDPRqgdcm`aa0Gwfv_$0;2D6B0C2&%2%T5h+m-k?Ay|1oz96dpB8i-f%Fq4wcj zP4k@gG7*rWZUp=?)H7Y$g?8zYaw_LbXZ!L6$8eN61Nw_M+L5p(;pBp_3~jSMNWpE` z+0F08UbgVu-p~3Ia#B)z)tR`ljO+4pzIxea&4?}5HDHof_kIW#y8|O8BZAp3P%NbA zh*gBswzo^ABZm@ucC#PU2CSM_LrhH{uE@IO1gl66i7J!y&gwsK+Ye5#VN{LfPalQ0 z$QPY9(05ez-x_{^%x`^P7ygK;^Yum$)T=X7G)q+aFK!98;D(ks+uz@G`+uTAk%Ev#QY7Bq0s2zi6 z*$;JES8T#0vZEF&7eJQt=g&QwWDF(TIN9<9TnVCA%xoQ#uo<0YS*-O~Xs3c}Imjh! zbKNbIY1mR1(W3mE0Nw*SNekS?ZjL)x31{Aezpp`Y$qb@5i#`%Lsnk^}q0ZgAHC3xx zWgep?MWfJioW5c1TGKri4m9EVCeX^-h{I^^*2#>4_C>RzrxUidgNdX|L>6zLPIQtz z-{7ROCz#3)izpV6iK2zz1GU#HL)EDK6FwqRdHyKPdw*ZR z1*>@4Xc{SWyJoKS9g%;fP>vQ{ZbU_YgV(ZLj+1um`lt{9*WQ(5@EiYZRU=ifX`=3G z+2eFv?Ie#S9)~jQWPREnc8jJ#mnN!378w=0_&ppH9I1ChpmddjH4|c2Vg^+9*^uPR zOFIo}SbBOSve%6Gi!yo1Wycb>g;Pf)WzCLP$Ar5=Eml-i%flkpsF}QTxagel+liX{ z9q5y63Dmlp;UpiPx+Z6iqUJUSOpb54Dql7!Z4Y*#oum7nfMR%#U*}io@XuJ^9P9-1K!uAAIw@+(NGUX%%{$JC zNidp4I%TA$o4omsZG*0XSeN!h`0LE*8*QgP+1v*c$NAqS`YGsu4JW}Ngh1!19?) zdbXX~)Ei1D9%ygG9>tD>{`v+S9&QP3&C8fJZFPC-k1iAP^jbAxHQV)@y1&wm;lhb! zdF{-fiEPw0$E@|+_P06DynY)1!O?XR+yU7DlGf@(K0_OsFNCCeUA%iY?;smnB9>#x zdvn$#7@qH^YWRZVfL`uBC*XvK^@lN0hY~1!AnBeI>zA=g$0W4U=GP;JpNL9AB(=U25022 z?>_j4CowGfU?!(@H;wEbQ{IS2xT}hzeIy@XsVS4EpIkZ82?jRhf99%0ZJ3)5Gwv?! zbx37`j%>I59+@&mMKUYuN*rEgS}qUrkUnDkd3}*yR{K6?W~M)|UGHvs{>Ggd{R6V# zu$}fnr@2{YXO|51kH^eDWf_A5ztTb%a*g#s4ft_%SHMZ&O6 zmg5y;Tv<;iyO)|Ij61m{Yrfuzc-5c-^(cDYn-i7OLhQhOw@`qKQM&h@lv zd6J|kG5jPnDAP_as@0CHzV1Hix8mh#!s;QV`XWi}tsF_dr;Q}us?_x~IIfRn;D$Re zbUeN?_MN{Y|HCWv&^#QaUYy=c-2UTsy^qQBTfrvJMY)Bp-gWmk4xEzcxowZ-p~kTa zsO{-oIujJt^6rAk>x&xbtgLo-&tX?7Wm?JJzX}%S=hl6juVdV~-Sy$0Pt?32 zHN%Me*j@Juk0*0g>ao+oD>upd1Oz5b`gOu2Euy_O69uBrK?n@QrONp0w+uPE& z#Mf?ZgjL3xCXh_I>a%9QKWYD6$De`~nx%y7H&RboKF?guyIa20OnKD+;$~ViT`4~D zIgQob*8m;ybBu@jU*$v->U&ODpOUz2s@Jmke>zm zISc8ZJPrStX`ZUz`M21vH}ovt<>?@}??7h3mQ4 z&G5-)`L{&%sns4{^~^99P}J7~=k=+N&e?9X*3*4MvstB$J-u27Z;4rzmhC_V$%6!H z&eY_0_eIX!xG0gQ=b6;&f`V%mth~*JSXr)6nBwUbef3f1+j6SQqNGMU7 z{NH!cO=wCgKa}-{l0JNQX;MG)pOcx`jNV!6E85A`RZp)q&(H=tbWC1%mCr-vU7Msh z!dmh+pd5G>ZGU?n{9C}YT8X#@kR}4yLPQLkiOL)`}Q&$3pNazK!XND$PxY z<`}!At5`YIHT&lqRQp{fcdgBei*cl0^!(CPBP&Q0PO-GEV}^-NZWAiLZ*yXeVM>+TYR!e=t^{z`0yHoPUetFC%$5T!Pc|2v8<)+O zR=>$iqdj*-5R+IeXyzVEdH<7Ws~$VOexENQ2AYBIk`bDo zKB;bCi22Pq*E7cL!Whd`n^&&@C@9XLWbN^BFzWDDcPs=h4*xqRjS4CUZx4_^F)-F0 z+}wxhXO9|!;Wlc#$d-@)Fkj+X#tm$VNN{qKP+DwYNg^Mi!fY{&o^4krER<%I2o-ye ziv@s)*1(r~K`LH5QYLkDklMLJ2i5H7pGwHb>I({Tw`w!#Kqm&Gu}mJzLHVR#{UyEj zioVcvN7;OUM3H$NA>a)Hn$d=3j#MsCxN$6Aa=Nfv*@g#q5ZIcF6|?gFmFAz>Gk0)B z3)G&H&-+8X=PekM%`AI}1|5>6ZD*+F%et+pf@oTlH|7=Y9|xV;G#@^G(~M`(4T`fG zip=z(&DY<>(s|36+m%)nrYn?#KP|7M`KM6C>KA>kbf$@|)krzSi`M|F&e^{4l#s1= za-MWvo|YhCoi8mrI{hOPWas8>6U)@n5%$Ku(zrSyiEcw^?4QN`7?_0PjPw%mP?s(% z!`)*?T-Jb`?N>4uZ+$b(q-*rO|lbEnwb5iJJ1Nr7Y~t6!=z^p@)WW& zzW7z=YNG!!I*G;$^<*ke1o)CXZ9!ZPi@cDsuhUrq;n0D`ZGJQ=YP!a(cd>hy#e!9~ zM_9e)y!ox|-WO=8=>;@IiXV#R!g^CVyDK|5d|(YXlSk+!JA*UYu+eV`pCoY<`BO~O zTK-)?^r%Jyj##$$b=6hsIF530IHaLs?&OMFfp1~Ui9W`t@nho>2gDQ16E)a>y?Xtn zR`OJ04|JWdssh$3hR~qU5v6M=bqjtaLhRuCHeTC*k-YNesU_*tlnNVC%%b8UMi~lG zVJrKv3$H`aX42=?$AS@RfqGv6Og&B~P#ig@OIy!_-!4tC^A>*$P`p&l(8Z4JFBo7Q zsgI}k$b|1_EKKah1^qBRJhh9}xUPQucY zz7D3%5_?+b)2cYBG4(A8kx59-yTwyd#tF(^(d3>iCX{<83eR+YeT*X{ z?uzF*xkmmu0mT8H&QY1d{M`pGDQf~{i~?-Uf;O3*O{^$3iNrd>M>7Kuq$MUaj^V@Mz{X{S4JJd zY)e2}T)xoZVj~Npi-}dYVze>*%x>tt-zFNzoh%7j&BKI$PTw1)>)yMc)R=1N=oZld zz-6TGMpg7%>J5|rm>=Av!fn3>>kQdWsbKSa=hIiSp%en`c#wDi?_yXH)HnWH+Ehhg z1G@_wJ5j}hhQwvLt(?woJ|#q;m!K%XBqrJ%!b=dUOB$I_!|4?T-Of95`;Km(Ip$zs z@Z;L3tBC+yt{=lLrHx_^2z{rbQH z^8x49AE2HE%B-!pznYh090(qDQ({XLE-vN-4kwkAo|E~pTVw~y9;W`@?uKAccvHCd z&m)}A0Jm=iuKzq(4*d}LFGo{oR)W&F`0Ki2LFTSz8kAlj>ymO?T2Wi4_Li)f_`KrS z44UVW=PJwjF)Pxo>LLR>vBFeSoh|>tJrBVMtKqG7>xOt5xE^#-OKlz#8TvgdK$N~O zZS7vU9|#GV}qgjieVkd;D zW>U8Bq=*pU0ZRn=?{NcI$`1we{Lt-5ov->emJj|j0+mwk*~hXN$$75_-c?|Pn4(lw z8CDG2Mo7aj0O`iVW7!FeIQW*BaayMg%bac1BnqB*ya&6>Pxu-%Pb-9jR#@3;o{Qfm z2W%eb1tzMwesvj!!)GQ>PLy5b-Nv%al z#|4otingBJUbt*XVoQ{TA6>0I#MO!~pU(M%{vINmv{05)NLW^2{LJ}a|Yl=_9k{(H~HjoZa2)Q86krHWrjK`F2m5cv$PXMdZ+X&+^m7J8M* zng{W5;9uY6`%D)I&uA)O9dRytd;XKFTVarjT>wRj8$|(?y8pcekJ#0tLGwla4tGO7 zl}*kiEgFH9rYB+oMhsQIC{Yz;>z%igj0A!k@_S7&JP zp%ezT#W}WR&q}4yl$D>ZL-`W>O95*Cnll%#d!oG^kG$y^y2B~SwsmIpH*HRd#`JIp z2hHZHwW9eUX=m#9YBU|Tad;uNftce_%vCX=)i~4=Bs0 zc-4Z&rAKwy(Zvw0W@OWS5s6C-d)|dH=w;KP#_Nw)a~9UjdbmJl?6?HgKd7M$o}BnB zNKrIAybz&B=*RjFbHZf%-HziWds)W4< zEE{%x0Ad|hzXYDr8!@Z1yHPU6zg(Hf;ZaBl#7F2Mp@)hpqDJ)IZmv;v^XG~n>jXZ& z1;!KdJeK=NdLVGpO&#Qw9YcVDoK-L6?S`Ig&bPGPEnhw23{tQ!ifnK*5bYga0}N2| zpN&=B2-@Pb$&DnFwUHQ)lM4_QfJlKg{pcHUc7~$*5&)bS8`YpG5shgV2$75TIBlj5 z1WMFYXo&#{e@R)X*229bS0%!!iZ^UYvJKIs{oIgU(v9U%p@(l8(5%2Ew~-nt(<{{p zgW(I4V+YIHGvQh3XcuPsc?hZ~&u5Uf4)bKLedNcLMybmo8E zK-gTrvxNI9x=`$MpNx8&TNQ{G#bNNt;3R;+rM<(i8CzpThUBQC0$ftUSp}+Esw5i^ zS7i74lMi+}!YZ>A=#Yu!(^P~p4Rq$^fz_iDyI zycAw?DgN#|VG|HHo1eyyo{!txZBxHzOWl}(Hi3Yy94OEH8F5j(S-eCox0yq9Me$^! z?037+RH=o(i(b_kn-p3rtRB!$b`G{pr*5;FJU0e!~Vaj^2 zEG3C#dxb-B+b;)@huQ8o$WJy))3i5!SYT=6J5=r-FUBv`I6XKA-0=~c-z6!XUXVKv z+H{?<@|jewfPEpE>E!51hS4#oDPnUPGpngu2Y{NS9p%^qdwfZlO zIe@X{ws5<62vS6ESlDn3o_*lx?|r!??et!;0t+27h{{Qku*vJyYGAk|vy#6UbVdF# z)8W@9=K3BHZ$R$4l~y%4SJh(s9-WvjLmML%Kuylx!%dO&3y+kMl5=R}nEnLG7Dk3v zI!g+i%vVjbj$m3RKAgdFhvPVPsV@o&kMYZ_yd8nh@*qfcxSLH6VF)!aUdBCV%w zUCU+d*E>001mmJdwuJp{&)6^8oqKAAV6@`5(-!p5_tmP@PxUf3PD2sLC;aIxqDh}- z;P|!UD~I1HeE_u->b!5!sKEv0-qeK;H4jm zr9?+65#o2q5P!TK2EC5#T1lL3#CqI4(6OYi+FMzA4p@@0H@Lh%3DkFLLN7Wye?A%? zJUv0q(O4Nc^dh%b$qg^#lu(iVH0TDzqxoB(R|xe6;%4c>(E0K@p+F{gKKQo z*TeRe)}7fAi?M^Uv^R9N5LT!(b{rHN-qfA%ZF8uB=!$1T)2(R`Jc7{Ul z_|{$9PVbk>Tu(zTPFJ{$A+7IFrQd*wElYrigrgL^G?`?9n{j-?Q6JGJT@#8cU5-$z*mw2Xg$ibjWLoSHSs9H2xhWu9#+ zFl5^E(8=g1_lXo#aLX~U-OcVTt|*2#MXtJhvl|Q1@2!R3-Z=c2pxi)56mIT_#ePT3 zEXA>W=_=0#PuF%=(99lE^4Os<=3=-@n?e=jrA1!4sNo`Xc0UY)B(Kb*WrdV}tM}>y zUW7yxW3%pR*?oYM>_0A^l^8K5l`3__%Aje0$g97ZvXuM69KiDR0l%~Ohe~Lu4vrk$ zf#69uvV%Zb#Ms~HtHR0*_(6MGGfmpYFaCgyu8{HG$r0A}T6TU){=fl6Ed(gS#sK8@ z1W51S67}w5E`guoy^|k1biM03hl_^&ND-L?7D<|y*``H$P{2`Kpl1Wmz;ytKyO>t5}Ui+nu;TcXxem8!Lo0m8j2e|H8*y5hX4 zG)_3|140#d-hJ1S_i_J3(2ZJvIkj@Q%SztL4HcO$DXk?C zW@i<4qPgDg9USpts)W9|p#xgSeE}v6ESBhjwJ_RY?wl(1O^=x5q6Tsl;!JJlV#1yJQ8?HWu; z`BeAIYeshQml*lT_%#E8*%&OG=uE(#b?zY~&W_aMBh#E(ojGXQ_})uYcKEWGf!4d0 zhTa*&TgQ6FPm&2woSe@rN{zM5*t3#8dkh|4JCMKk*CTFoM0oH*l;Xxhl|lu2DQ6mp z0$VSL*fD^@BxUh}bXg}QY?BhFZ`{`lMF}PGg0^@mOZ}8&TGU2KJWxav$3i|j++iON$m}^gW9Dv>&5`MfzoD-@v zA*#VIbh~%*T*@2sav95ot@0J@S!TGv+)*sU85-Q)(gF@N$rP;#Xdn1~y$$Xs+ zf4uVY=7$x{t@Q$QDYyTCrH{CCoPbXRpZ?n~8EsEeFJMr*N)Mbq z|7W=p&nW0Io(?-B_6pspkN zW1-0tWoFZn91ThM$W|YSS`w35d=EuS+lLpze<&G@q$+k#;}hvhTr8>Uo_6#}FJZKV zG)5aK(FYh|t}IkDEF6{E0yCz!gX8G-`KoDyc&&v@ZS_t`?6fI24{8tzSjD9^A00D& zl|=UNx|@D~e+-Ey`SnA`-SivE0ga7#4R4$T^W(BJ(*T*WMBCX3w&_$mY4gGMOAo&H zqb6W-=JC*bd*~jdZE#e`y;k3eo9E9e!`W;|dC%p+NHkPJ#lJNPO=Tk)<7p zX+Y-sYbQAF;pHA*nc}Av7-*dLxL@1`ezD+!0rG#%qM_Tm^55K9IV&OEmL%3u-pB>; zmBZ>r&N>>#bhgVYaX*dqqr-?N$iImqN$;(PUSvwPpfXX_DSN883sdgjeE=f$;M=9A zeZLK#EiBA_p0c-b0%c+Q<-3Wdd1JGX;Uh>xwZ`M-F%!4NFap1^UW^7#coOjKqCVLG zXP!bR%m-i*`!crEwVx(R;uGYeOyhN`5^%vC7aE7o_9`Gd5-0VawaR*d5i$+r97r*S zUY~ds40je|&~Cev!+`@fZCC;jj&gYaRLS|oW#qY9B2x7a1|w1gbR=rB z?w*~`UBQ~Mb4nAEu0sb$sc?;m*7bq}dy>ma2bv9Y8XiiU((8fQH#h$ek3-=UeW6b| z>8AOF6$ZE5;VMGu6MV%;7-D0i2*|y1rkbXy5xEP_|8a{(MiM|yUkXtW4Ni9YxKvJ* z<-ItydyRPd0012go%iOpO&c;ajvG_U!zi0_ zgU>6d&#-NW-TFX&<8w%a9pmKTf;>{B?d!>(FH?0MH^rRyn>)S+azkneHJPig*bK^ksM~Ilu{P$g>*6VU_ znFq)yupF%bq|9i+&(pzuNvq~DKd+;Z{G?(PC2FM-LFN9!TjCbO*l#m1;AJFN{m3k0 z0|pI&bKOEdaJ^!%SqHL4s;LxoG_%1<#;v+wi!IheL4UHv)>a-Xb8!jxz4Y(m7KcVm z?UFSa@Z`gm6PES77*-$n8IPTpT98K)hn7=d7jr>3-nZL3k_lTM*l{PSXfW_;eJ~q& zvi$pRrd8rKT5I6Ak^uf*?DlqKzSSKY%b<1bdo?cs5CPE2FXEWVMh^3mkM?Hmcbq?6 z-L9A%Yv8s!R0(`KHsV;ulC*s@fTpbMzcq$^y4~i$-PuXTMD2h2 z?_3t{>o`RzJ=Q#!{$ndu&%1JOo4nRvI$!jxIB*fnd~lS)LIQSnn)2G)G1hLO{TiE~YxgG=mU(2hoy`@Tl6AA2Dw zqebV{s)!+YyGGZqdpRz+5YcqY|A4!)lMG<+`)tFe`T?O6gz5opK>+!<@3aM0DSZvd zyf$VCsW)uaTG0rNE2wJ!!^Vxn@;=03FOs-<(iM^vujDUpYNI+9)>tfbq9AfM$+lqg zE}IMD#Y2=I1=ozjl*T1-zcEf@9srH(n~z3o{3c(!*F4fGY4OE)Q2E~TFJDeXX=NV9 zPKdw$!=(0Ug|TUP>J`4CUQ&qE3Q*LqZ2!<}a`JI*{x!OFX*-ZwMPj$al7}0goagml z_&t%6^Q#}$<{V7~2e;vMDSO>6Z`oju)S&f$XpVB%N!BnzGny3(0?-HUzdNe&lJ#X=8Mwz7-TSo++i0axju`v@mE-r-q^S!5yb6%(4h$AW zv_fa19GXmj6$q0m@JRpTls>{)256_?-uu}R=ObU+taXxciG$&To+Rf=YBgV4Pgoq6 zgj@G7(0bv^=9V8PqRyH`sX<9At@|-?npQvxfz6AC`RUov*<>r`6_03I=W1@i#qhK{ zwfG&%6%*nK^@~^6qA_830Ea7=#16vamX66_Qq*DMha5k`iH`GeF!gLn__JZc%y5hw zAcwJeTnc;%#I35-ji^%-{|CM0<%oi(9F^@#bfQBY8==Qm%J1;PJB3WU(wnd5*3=2L zBy{UYo7Nua1D@Bx)TuOw7l8NXt7a!z-57StS!+v`RYwyp4lEJ1u6j*be^SclmBgyC zTVc7V7JkMclMv+`-9(q*GdvJam{U$f2&!>Tn_?AHA=UmzuFCFSwT_tHG>)OutIqT7 zD9D(AUV}3_Rq!>YmX7aPf7y8NR20>h^Xo=Wk5W86imHtp!Y|6K;;`MYYJZp5WLo@i z+)v32_y|%s!0*6YbGv_k|2w4hLHzG1oChfR`0oh8OqmWy;{N*p$)C^bg#Y{K|7PHS iGw}bJf!7x4FW3me4o=o~e?GnfeiUR?-&abThW;NO1HzU7 diff --git a/tests/test_display_plotly/sizing_modes_subplot.png b/tests/test_display_plotly/sizing_modes_subplot.png deleted file mode 100644 index 063ff752f22bd51df27866b8680e892e80a30172..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120677 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 Date: Sun, 18 May 2025 08:19:45 +0000 Subject: [PATCH 166/211] style: pre-commit fixes --- .../test_field_coloring_subplot.yml | 3102 ++++++++--------- .../test_pixel_field_color_scales.yml | 3102 ++++++++--------- .../test_pixel_field_directional_symbols.yml | 3100 ++++++++-------- .../test_pixel_field_null_values.yml | 2230 ++++++------ .../test_pixel_field_sizing_modes.yml | 2498 ++++++------- 5 files changed, 7016 insertions(+), 7016 deletions(-) diff --git a/tests/test_display_plotly/test_field_coloring_subplot.yml b/tests/test_display_plotly/test_field_coloring_subplot.yml index 77a5ed01a..84a4659f1 100644 --- a/tests/test_display_plotly/test_field_coloring_subplot.yml +++ b/tests/test_display_plotly/test_field_coloring_subplot.yml @@ -1,1172 +1,1172 @@ data: -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene - showlegend: true - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#34628d' - - '#34628d' - - '#34628d' - - '#34628d' - - '#34628d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#471c6d' - - '#471c6d' - - '#471c6d' - - '#471c6d' - - '#471c6d' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#471c6d' - - '#471c6d' - - '#471c6d' - - '#471c6d' - - '#471c6d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#34628d' - - '#34628d' - - '#34628d' - - '#34628d' - - '#34628d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (H) - opacity: 1 - scene: scene - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene2 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (Jxy) - opacity: 1 - scene: scene2 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene3 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (Bz) - opacity: 1 - scene: scene3 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene4 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (False) - opacity: 1 - scene: scene4 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 + - color: "#2e91e5" + colorscale: + - - 0.0 + - "#00b050" + - - 0.16 + - "#00b050" + - - 0.26 + - "#dddddd" + - - 0.74 + - "#dddddd" + - - 0.8400000000000001 + - "#e71111" + - - 1.0 + - "#e71111" + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene + showlegend: true + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + - facecolor: + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#34628d" + - "#34628d" + - "#34628d" + - "#34628d" + - "#34628d" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#471c6d" + - "#471c6d" + - "#471c6d" + - "#471c6d" + - "#471c6d" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#471c6d" + - "#471c6d" + - "#471c6d" + - "#471c6d" + - "#471c6d" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#34628d" + - "#34628d" + - "#34628d" + - "#34628d" + - "#34628d" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (H) + opacity: 1 + scene: scene + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== + dtype: f8 + - color: "#2e91e5" + colorscale: + - - 0.0 + - "#00b050" + - - 0.16 + - "#00b050" + - - 0.26 + - "#dddddd" + - - 0.74 + - "#dddddd" + - - 0.8400000000000001 + - "#e71111" + - - 1.0 + - "#e71111" + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene2 + showlegend: false + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + - facecolor: + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (Jxy) + opacity: 1 + scene: scene2 + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== + dtype: f8 + - color: "#2e91e5" + colorscale: + - - 0.0 + - "#00b050" + - - 0.16 + - "#00b050" + - - 0.26 + - "#dddddd" + - - 0.74 + - "#dddddd" + - - 0.8400000000000001 + - "#e71111" + - - 1.0 + - "#e71111" + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene3 + showlegend: false + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + - facecolor: + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (Bz) + opacity: 1 + scene: scene3 + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== + dtype: f8 + - color: "#2e91e5" + colorscale: + - - 0.0 + - "#00b050" + - - 0.16 + - "#00b050" + - - 0.26 + - "#dddddd" + - - 0.74 + - "#dddddd" + - - 0.8400000000000001 + - "#e71111" + - - 1.0 + - "#e71111" + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene4 + showlegend: false + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + - facecolor: + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (False) + opacity: 1 + scene: scene4 + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== + dtype: f8 layout: legend: itemsizing: constant @@ -1183,30 +1183,30 @@ layout: z: 1.4 domain: x: - - 0.0 - - 0.2125 + - 0.0 + - 0.2125 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: x (m) yaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: y (m) zaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: z (m) scene2: @@ -1222,30 +1222,30 @@ layout: z: 1.4 domain: x: - - 0.2625 - - 0.475 + - 0.2625 + - 0.475 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: x (m) yaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: y (m) zaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: z (m) scene3: @@ -1261,30 +1261,30 @@ layout: z: 1.4 domain: x: - - 0.525 - - 0.7375 + - 0.525 + - 0.7375 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: x (m) yaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: y (m) zaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: z (m) scene4: @@ -1300,402 +1300,402 @@ layout: z: 1.4 domain: x: - - 0.7875 - - 1.0 + - 0.7875 + - 1.0 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: x (m) yaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: y (m) zaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: z (m) template: data: bar: - - error_x: - color: '#2a3f5f' - error_y: - color: '#2a3f5f' - marker: - line: - color: '#E5ECF6' - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: bar + - error_x: + color: "#2a3f5f" + error_y: + color: "#2a3f5f" + marker: + line: + color: "#E5ECF6" + width: 0.5 + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: bar barpolar: - - marker: - line: - color: '#E5ECF6' - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: barpolar + - marker: + line: + color: "#E5ECF6" + width: 0.5 + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: barpolar carpet: - - aaxis: - endlinecolor: '#2a3f5f' - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: '#2a3f5f' - baxis: - endlinecolor: '#2a3f5f' - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: '#2a3f5f' - type: carpet + - aaxis: + endlinecolor: "#2a3f5f" + gridcolor: white + linecolor: white + minorgridcolor: white + startlinecolor: "#2a3f5f" + baxis: + endlinecolor: "#2a3f5f" + gridcolor: white + linecolor: white + minorgridcolor: white + startlinecolor: "#2a3f5f" + type: carpet choropleth: - - colorbar: - outlinewidth: 0 - ticks: '' - type: choropleth + - colorbar: + outlinewidth: 0 + ticks: "" + type: choropleth contour: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: contour + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: contour contourcarpet: - - colorbar: - outlinewidth: 0 - ticks: '' - type: contourcarpet + - colorbar: + outlinewidth: 0 + ticks: "" + type: contourcarpet heatmap: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: heatmap + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: heatmap histogram: - - marker: - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: histogram + - marker: + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: histogram histogram2d: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: histogram2d + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: histogram2d histogram2dcontour: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: histogram2dcontour + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: histogram2dcontour mesh3d: - - colorbar: - outlinewidth: 0 - ticks: '' - type: mesh3d - parcoords: - - line: - colorbar: + - colorbar: outlinewidth: 0 - ticks: '' - type: parcoords + ticks: "" + type: mesh3d + parcoords: + - line: + colorbar: + outlinewidth: 0 + ticks: "" + type: parcoords pie: - - automargin: true - type: pie + - automargin: true + type: pie scatter: - - fillpattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: scatter + - fillpattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: scatter scatter3d: - - line: - colorbar: - outlinewidth: 0 - ticks: '' - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatter3d + - line: + colorbar: + outlinewidth: 0 + ticks: "" + marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scatter3d scattercarpet: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattercarpet + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattercarpet scattergeo: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattergeo + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattergeo scattergl: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattergl + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattergl scattermap: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattermap + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattermap scattermapbox: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattermapbox + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattermapbox scatterpolar: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterpolar + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scatterpolar scatterpolargl: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterpolargl + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scatterpolargl scatterternary: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterternary + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scatterternary surface: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: surface + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: surface table: - - cells: - fill: - color: '#EBF0F8' - line: - color: white - header: - fill: - color: '#C8D4E3' - line: - color: white - type: table + - cells: + fill: + color: "#EBF0F8" + line: + color: white + header: + fill: + color: "#C8D4E3" + line: + color: white + type: table layout: annotationdefaults: - arrowcolor: '#2a3f5f' + arrowcolor: "#2a3f5f" arrowhead: 0 arrowwidth: 1 autotypenumbers: strict coloraxis: colorbar: outlinewidth: 0 - ticks: '' + ticks: "" colorscale: diverging: - - - 0 - - '#8e0152' - - - 0.1 - - '#c51b7d' - - - 0.2 - - '#de77ae' - - - 0.3 - - '#f1b6da' - - - 0.4 - - '#fde0ef' - - - 0.5 - - '#f7f7f7' - - - 0.6 - - '#e6f5d0' - - - 0.7 - - '#b8e186' - - - 0.8 - - '#7fbc41' - - - 0.9 - - '#4d9221' - - - 1 - - '#276419' + - - 0 + - "#8e0152" + - - 0.1 + - "#c51b7d" + - - 0.2 + - "#de77ae" + - - 0.3 + - "#f1b6da" + - - 0.4 + - "#fde0ef" + - - 0.5 + - "#f7f7f7" + - - 0.6 + - "#e6f5d0" + - - 0.7 + - "#b8e186" + - - 0.8 + - "#7fbc41" + - - 0.9 + - "#4d9221" + - - 1 + - "#276419" sequential: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" sequentialminus: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" colorway: - - '#636efa' - - '#EF553B' - - '#00cc96' - - '#ab63fa' - - '#FFA15A' - - '#19d3f3' - - '#FF6692' - - '#B6E880' - - '#FF97FF' - - '#FECB52' + - "#636efa" + - "#EF553B" + - "#00cc96" + - "#ab63fa" + - "#FFA15A" + - "#19d3f3" + - "#FF6692" + - "#B6E880" + - "#FF97FF" + - "#FECB52" font: - color: '#2a3f5f' + color: "#2a3f5f" geo: bgcolor: white lakecolor: white - landcolor: '#E5ECF6' + landcolor: "#E5ECF6" showlakes: true showland: true subunitcolor: white @@ -1705,66 +1705,66 @@ layout: mapbox: style: light paper_bgcolor: white - plot_bgcolor: '#E5ECF6' + plot_bgcolor: "#E5ECF6" polar: angularaxis: gridcolor: white linecolor: white - ticks: '' - bgcolor: '#E5ECF6' + ticks: "" + bgcolor: "#E5ECF6" radialaxis: gridcolor: white linecolor: white - ticks: '' + ticks: "" scene: xaxis: - backgroundcolor: '#E5ECF6' + backgroundcolor: "#E5ECF6" gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: '' + ticks: "" zerolinecolor: white yaxis: - backgroundcolor: '#E5ECF6' + backgroundcolor: "#E5ECF6" gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: '' + ticks: "" zerolinecolor: white zaxis: - backgroundcolor: '#E5ECF6' + backgroundcolor: "#E5ECF6" gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: '' + ticks: "" zerolinecolor: white shapedefaults: line: - color: '#2a3f5f' + color: "#2a3f5f" ternary: aaxis: gridcolor: white linecolor: white - ticks: '' + ticks: "" baxis: gridcolor: white linecolor: white - ticks: '' - bgcolor: '#E5ECF6' + ticks: "" + bgcolor: "#E5ECF6" caxis: gridcolor: white linecolor: white - ticks: '' + ticks: "" title: x: 0.05 xaxis: automargin: true gridcolor: white linecolor: white - ticks: '' + ticks: "" title: standoff: 15 zerolinecolor: white @@ -1773,7 +1773,7 @@ layout: automargin: true gridcolor: white linecolor: white - ticks: '' + ticks: "" title: standoff: 15 zerolinecolor: white diff --git a/tests/test_display_plotly/test_pixel_field_color_scales.yml b/tests/test_display_plotly/test_pixel_field_color_scales.yml index 48f4aeb62..094286610 100644 --- a/tests/test_display_plotly/test_pixel_field_color_scales.yml +++ b/tests/test_display_plotly/test_pixel_field_color_scales.yml @@ -1,1172 +1,1172 @@ data: -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene - showlegend: true - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#22928b' - - '#22928b' - - '#22928b' - - '#22928b' - - '#22928b' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#472a79' - - '#472a79' - - '#472a79' - - '#472a79' - - '#472a79' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#472a79' - - '#472a79' - - '#472a79' - - '#472a79' - - '#472a79' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#22928b' - - '#22928b' - - '#22928b' - - '#22928b' - - '#22928b' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (Viridis) - opacity: 1 - scene: scene - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== - dtype: f8 -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene2 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#000004' - - '#000004' - - '#000004' - - '#000004' - - '#000004' - - '#bd3a51' - - '#bd3a51' - - '#bd3a51' - - '#bd3a51' - - '#bd3a51' - - '#000004' - - '#000004' - - '#000004' - - '#000004' - - '#000004' - - '#1f0c44' - - '#1f0c44' - - '#1f0c44' - - '#1f0c44' - - '#1f0c44' - - '#fcffa4' - - '#fcffa4' - - '#fcffa4' - - '#fcffa4' - - '#fcffa4' - - '#1f0c44' - - '#1f0c44' - - '#1f0c44' - - '#1f0c44' - - '#1f0c44' - - '#000004' - - '#000004' - - '#000004' - - '#000004' - - '#000004' - - '#bd3a51' - - '#bd3a51' - - '#bd3a51' - - '#bd3a51' - - '#bd3a51' - - '#000004' - - '#000004' - - '#000004' - - '#000004' - - '#000004' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (Inferno) - opacity: 1 - scene: scene2 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== - dtype: f8 -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene3 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - - '#fc8b3a' - - '#fc8b3a' - - '#fc8b3a' - - '#fc8b3a' - - '#fc8b3a' - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - - '#fee7cf' - - '#fee7cf' - - '#fee7cf' - - '#fee7cf' - - '#fee7cf' - - '#7f2704' - - '#7f2704' - - '#7f2704' - - '#7f2704' - - '#7f2704' - - '#fee7cf' - - '#fee7cf' - - '#fee7cf' - - '#fee7cf' - - '#fee7cf' - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - - '#fc8b3a' - - '#fc8b3a' - - '#fc8b3a' - - '#fc8b3a' - - '#fc8b3a' - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (Oranges) - opacity: 1 - scene: scene3 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== - dtype: f8 -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene4 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - - '#f565a0' - - '#f565a0' - - '#f565a0' - - '#f565a0' - - '#f565a0' - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - - '#fde1de' - - '#fde1de' - - '#fde1de' - - '#fde1de' - - '#fde1de' - - '#49006a' - - '#49006a' - - '#49006a' - - '#49006a' - - '#49006a' - - '#fde1de' - - '#fde1de' - - '#fde1de' - - '#fde1de' - - '#fde1de' - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - - '#f565a0' - - '#f565a0' - - '#f565a0' - - '#f565a0' - - '#f565a0' - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (RdPu) - opacity: 1 - scene: scene4 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== - dtype: f8 + - color: "#2e91e5" + colorscale: + - - 0.0 + - "#00b050" + - - 0.16 + - "#00b050" + - - 0.26 + - "#dddddd" + - - 0.74 + - "#dddddd" + - - 0.8400000000000001 + - "#e71111" + - - 1.0 + - "#e71111" + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene + showlegend: true + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + - facecolor: + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#22928b" + - "#22928b" + - "#22928b" + - "#22928b" + - "#22928b" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#472a79" + - "#472a79" + - "#472a79" + - "#472a79" + - "#472a79" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#472a79" + - "#472a79" + - "#472a79" + - "#472a79" + - "#472a79" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#22928b" + - "#22928b" + - "#22928b" + - "#22928b" + - "#22928b" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (Viridis) + opacity: 1 + scene: scene + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== + dtype: f8 + - color: "#2e91e5" + colorscale: + - - 0.0 + - "#00b050" + - - 0.16 + - "#00b050" + - - 0.26 + - "#dddddd" + - - 0.74 + - "#dddddd" + - - 0.8400000000000001 + - "#e71111" + - - 1.0 + - "#e71111" + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene2 + showlegend: false + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + - facecolor: + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - "#000004" + - "#000004" + - "#000004" + - "#000004" + - "#000004" + - "#bd3a51" + - "#bd3a51" + - "#bd3a51" + - "#bd3a51" + - "#bd3a51" + - "#000004" + - "#000004" + - "#000004" + - "#000004" + - "#000004" + - "#1f0c44" + - "#1f0c44" + - "#1f0c44" + - "#1f0c44" + - "#1f0c44" + - "#fcffa4" + - "#fcffa4" + - "#fcffa4" + - "#fcffa4" + - "#fcffa4" + - "#1f0c44" + - "#1f0c44" + - "#1f0c44" + - "#1f0c44" + - "#1f0c44" + - "#000004" + - "#000004" + - "#000004" + - "#000004" + - "#000004" + - "#bd3a51" + - "#bd3a51" + - "#bd3a51" + - "#bd3a51" + - "#bd3a51" + - "#000004" + - "#000004" + - "#000004" + - "#000004" + - "#000004" + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (Inferno) + opacity: 1 + scene: scene2 + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== + dtype: f8 + - color: "#2e91e5" + colorscale: + - - 0.0 + - "#00b050" + - - 0.16 + - "#00b050" + - - 0.26 + - "#dddddd" + - - 0.74 + - "#dddddd" + - - 0.8400000000000001 + - "#e71111" + - - 1.0 + - "#e71111" + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene3 + showlegend: false + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + - facecolor: + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - "#fff5eb" + - "#fff5eb" + - "#fff5eb" + - "#fff5eb" + - "#fff5eb" + - "#fc8b3a" + - "#fc8b3a" + - "#fc8b3a" + - "#fc8b3a" + - "#fc8b3a" + - "#fff5eb" + - "#fff5eb" + - "#fff5eb" + - "#fff5eb" + - "#fff5eb" + - "#fee7cf" + - "#fee7cf" + - "#fee7cf" + - "#fee7cf" + - "#fee7cf" + - "#7f2704" + - "#7f2704" + - "#7f2704" + - "#7f2704" + - "#7f2704" + - "#fee7cf" + - "#fee7cf" + - "#fee7cf" + - "#fee7cf" + - "#fee7cf" + - "#fff5eb" + - "#fff5eb" + - "#fff5eb" + - "#fff5eb" + - "#fff5eb" + - "#fc8b3a" + - "#fc8b3a" + - "#fc8b3a" + - "#fc8b3a" + - "#fc8b3a" + - "#fff5eb" + - "#fff5eb" + - "#fff5eb" + - "#fff5eb" + - "#fff5eb" + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (Oranges) + opacity: 1 + scene: scene3 + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== + dtype: f8 + - color: "#2e91e5" + colorscale: + - - 0.0 + - "#00b050" + - - 0.16 + - "#00b050" + - - 0.26 + - "#dddddd" + - - 0.74 + - "#dddddd" + - - 0.8400000000000001 + - "#e71111" + - - 1.0 + - "#e71111" + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene4 + showlegend: false + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + - facecolor: + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - "#da16ff" + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - "#fff7f3" + - "#fff7f3" + - "#fff7f3" + - "#fff7f3" + - "#fff7f3" + - "#f565a0" + - "#f565a0" + - "#f565a0" + - "#f565a0" + - "#f565a0" + - "#fff7f3" + - "#fff7f3" + - "#fff7f3" + - "#fff7f3" + - "#fff7f3" + - "#fde1de" + - "#fde1de" + - "#fde1de" + - "#fde1de" + - "#fde1de" + - "#49006a" + - "#49006a" + - "#49006a" + - "#49006a" + - "#49006a" + - "#fde1de" + - "#fde1de" + - "#fde1de" + - "#fde1de" + - "#fde1de" + - "#fff7f3" + - "#fff7f3" + - "#fff7f3" + - "#fff7f3" + - "#fff7f3" + - "#f565a0" + - "#f565a0" + - "#f565a0" + - "#f565a0" + - "#f565a0" + - "#fff7f3" + - "#fff7f3" + - "#fff7f3" + - "#fff7f3" + - "#fff7f3" + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (RdPu) + opacity: 1 + scene: scene4 + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== + dtype: f8 layout: legend: itemsizing: constant @@ -1183,30 +1183,30 @@ layout: z: 1.4 domain: x: - - 0.0 - - 0.2125 + - 0.0 + - 0.2125 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.5919715007276833 - - 1.4513845364408429 + - -1.5919715007276833 + - 1.4513845364408429 title: text: x (m) yaxis: autorange: false range: - - -1.521678018584263 - - 1.521678018584263 + - -1.521678018584263 + - 1.521678018584263 title: text: y (m) zaxis: autorange: false range: - - -1.0027462143297536 - - 2.0406098228387726 + - -1.0027462143297536 + - 2.0406098228387726 title: text: z (m) scene2: @@ -1222,30 +1222,30 @@ layout: z: 1.4 domain: x: - - 0.2625 - - 0.475 + - 0.2625 + - 0.475 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.5919715007276833 - - 1.4513845364408429 + - -1.5919715007276833 + - 1.4513845364408429 title: text: x (m) yaxis: autorange: false range: - - -1.521678018584263 - - 1.521678018584263 + - -1.521678018584263 + - 1.521678018584263 title: text: y (m) zaxis: autorange: false range: - - -1.0027462143297536 - - 2.0406098228387726 + - -1.0027462143297536 + - 2.0406098228387726 title: text: z (m) scene3: @@ -1261,30 +1261,30 @@ layout: z: 1.4 domain: x: - - 0.525 - - 0.7375 + - 0.525 + - 0.7375 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.5919715007276833 - - 1.4513845364408429 + - -1.5919715007276833 + - 1.4513845364408429 title: text: x (m) yaxis: autorange: false range: - - -1.521678018584263 - - 1.521678018584263 + - -1.521678018584263 + - 1.521678018584263 title: text: y (m) zaxis: autorange: false range: - - -1.0027462143297536 - - 2.0406098228387726 + - -1.0027462143297536 + - 2.0406098228387726 title: text: z (m) scene4: @@ -1300,402 +1300,402 @@ layout: z: 1.4 domain: x: - - 0.7875 - - 1.0 + - 0.7875 + - 1.0 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.5919715007276833 - - 1.4513845364408429 + - -1.5919715007276833 + - 1.4513845364408429 title: text: x (m) yaxis: autorange: false range: - - -1.521678018584263 - - 1.521678018584263 + - -1.521678018584263 + - 1.521678018584263 title: text: y (m) zaxis: autorange: false range: - - -1.0027462143297536 - - 2.0406098228387726 + - -1.0027462143297536 + - 2.0406098228387726 title: text: z (m) template: data: bar: - - error_x: - color: '#2a3f5f' - error_y: - color: '#2a3f5f' - marker: - line: - color: '#E5ECF6' - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: bar + - error_x: + color: "#2a3f5f" + error_y: + color: "#2a3f5f" + marker: + line: + color: "#E5ECF6" + width: 0.5 + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: bar barpolar: - - marker: - line: - color: '#E5ECF6' - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: barpolar + - marker: + line: + color: "#E5ECF6" + width: 0.5 + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: barpolar carpet: - - aaxis: - endlinecolor: '#2a3f5f' - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: '#2a3f5f' - baxis: - endlinecolor: '#2a3f5f' - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: '#2a3f5f' - type: carpet + - aaxis: + endlinecolor: "#2a3f5f" + gridcolor: white + linecolor: white + minorgridcolor: white + startlinecolor: "#2a3f5f" + baxis: + endlinecolor: "#2a3f5f" + gridcolor: white + linecolor: white + minorgridcolor: white + startlinecolor: "#2a3f5f" + type: carpet choropleth: - - colorbar: - outlinewidth: 0 - ticks: '' - type: choropleth + - colorbar: + outlinewidth: 0 + ticks: "" + type: choropleth contour: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: contour + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: contour contourcarpet: - - colorbar: - outlinewidth: 0 - ticks: '' - type: contourcarpet + - colorbar: + outlinewidth: 0 + ticks: "" + type: contourcarpet heatmap: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: heatmap + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: heatmap histogram: - - marker: - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: histogram + - marker: + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: histogram histogram2d: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: histogram2d + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: histogram2d histogram2dcontour: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: histogram2dcontour + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: histogram2dcontour mesh3d: - - colorbar: - outlinewidth: 0 - ticks: '' - type: mesh3d - parcoords: - - line: - colorbar: + - colorbar: outlinewidth: 0 - ticks: '' - type: parcoords + ticks: "" + type: mesh3d + parcoords: + - line: + colorbar: + outlinewidth: 0 + ticks: "" + type: parcoords pie: - - automargin: true - type: pie + - automargin: true + type: pie scatter: - - fillpattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: scatter + - fillpattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: scatter scatter3d: - - line: - colorbar: - outlinewidth: 0 - ticks: '' - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatter3d + - line: + colorbar: + outlinewidth: 0 + ticks: "" + marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scatter3d scattercarpet: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattercarpet + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattercarpet scattergeo: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattergeo + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattergeo scattergl: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattergl + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattergl scattermap: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattermap + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattermap scattermapbox: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattermapbox + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattermapbox scatterpolar: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterpolar + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scatterpolar scatterpolargl: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterpolargl + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scatterpolargl scatterternary: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterternary + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scatterternary surface: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: surface + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: surface table: - - cells: - fill: - color: '#EBF0F8' - line: - color: white - header: - fill: - color: '#C8D4E3' - line: - color: white - type: table + - cells: + fill: + color: "#EBF0F8" + line: + color: white + header: + fill: + color: "#C8D4E3" + line: + color: white + type: table layout: annotationdefaults: - arrowcolor: '#2a3f5f' + arrowcolor: "#2a3f5f" arrowhead: 0 arrowwidth: 1 autotypenumbers: strict coloraxis: colorbar: outlinewidth: 0 - ticks: '' + ticks: "" colorscale: diverging: - - - 0 - - '#8e0152' - - - 0.1 - - '#c51b7d' - - - 0.2 - - '#de77ae' - - - 0.3 - - '#f1b6da' - - - 0.4 - - '#fde0ef' - - - 0.5 - - '#f7f7f7' - - - 0.6 - - '#e6f5d0' - - - 0.7 - - '#b8e186' - - - 0.8 - - '#7fbc41' - - - 0.9 - - '#4d9221' - - - 1 - - '#276419' + - - 0 + - "#8e0152" + - - 0.1 + - "#c51b7d" + - - 0.2 + - "#de77ae" + - - 0.3 + - "#f1b6da" + - - 0.4 + - "#fde0ef" + - - 0.5 + - "#f7f7f7" + - - 0.6 + - "#e6f5d0" + - - 0.7 + - "#b8e186" + - - 0.8 + - "#7fbc41" + - - 0.9 + - "#4d9221" + - - 1 + - "#276419" sequential: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" sequentialminus: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" colorway: - - '#636efa' - - '#EF553B' - - '#00cc96' - - '#ab63fa' - - '#FFA15A' - - '#19d3f3' - - '#FF6692' - - '#B6E880' - - '#FF97FF' - - '#FECB52' + - "#636efa" + - "#EF553B" + - "#00cc96" + - "#ab63fa" + - "#FFA15A" + - "#19d3f3" + - "#FF6692" + - "#B6E880" + - "#FF97FF" + - "#FECB52" font: - color: '#2a3f5f' + color: "#2a3f5f" geo: bgcolor: white lakecolor: white - landcolor: '#E5ECF6' + landcolor: "#E5ECF6" showlakes: true showland: true subunitcolor: white @@ -1705,66 +1705,66 @@ layout: mapbox: style: light paper_bgcolor: white - plot_bgcolor: '#E5ECF6' + plot_bgcolor: "#E5ECF6" polar: angularaxis: gridcolor: white linecolor: white - ticks: '' - bgcolor: '#E5ECF6' + ticks: "" + bgcolor: "#E5ECF6" radialaxis: gridcolor: white linecolor: white - ticks: '' + ticks: "" scene: xaxis: - backgroundcolor: '#E5ECF6' + backgroundcolor: "#E5ECF6" gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: '' + ticks: "" zerolinecolor: white yaxis: - backgroundcolor: '#E5ECF6' + backgroundcolor: "#E5ECF6" gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: '' + ticks: "" zerolinecolor: white zaxis: - backgroundcolor: '#E5ECF6' + backgroundcolor: "#E5ECF6" gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: '' + ticks: "" zerolinecolor: white shapedefaults: line: - color: '#2a3f5f' + color: "#2a3f5f" ternary: aaxis: gridcolor: white linecolor: white - ticks: '' + ticks: "" baxis: gridcolor: white linecolor: white - ticks: '' - bgcolor: '#E5ECF6' + ticks: "" + bgcolor: "#E5ECF6" caxis: gridcolor: white linecolor: white - ticks: '' + ticks: "" title: x: 0.05 xaxis: automargin: true gridcolor: white linecolor: white - ticks: '' + ticks: "" title: standoff: 15 zerolinecolor: white @@ -1773,7 +1773,7 @@ layout: automargin: true gridcolor: white linecolor: white - ticks: '' + ticks: "" title: standoff: 15 zerolinecolor: white diff --git a/tests/test_display_plotly/test_pixel_field_directional_symbols.yml b/tests/test_display_plotly/test_pixel_field_directional_symbols.yml index dbbcf5ada..ed7baf475 100644 --- a/tests/test_display_plotly/test_pixel_field_directional_symbols.yml +++ b/tests/test_display_plotly/test_pixel_field_directional_symbols.yml @@ -1,1182 +1,1182 @@ data: -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene - showlegend: true - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (cone) - opacity: 1 - scene: scene - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene2 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABtAG4AbwBwAHEAaABpAGoAawBsAG0AbgBvAHAAcQB0AHUAdgB3AHgAegB7AHwAfQB+AH8AgACBAIIAgwB6AHsAfAB9AH4AfwCAAIEAggCDAIYAhwCIAIkAigCMAI0AjgCPAJAAkQCSAJMAlACVAIwAjQCOAI8AkACRAJIAkwCUAJUAmACZAJoAmwCcAJ4AnwCgAKEAogCjAKQApQCmAKcAngCfAKAAoQCiAKMApAClAKYApwCqAKsArACtAK4AsACxALIAswC0ALUAtgC3ALgAuQCwALEAsgCzALQAtQC2ALcAuAC5ALwAvQC+AL8AwADCAMMAxADFAMYAxwDIAMkAygDLAMIAwwDEAMUAxgDHAMgAyQDKAMsAzgDPANAA0QDSANQA1QDWANcA2ADZANoA2wDcAN0A1ADVANYA1wDYANkA2gDbANwA3QDgAOEA4gDjAOQA5gDnAOgA6QDqAOsA7ADtAO4A7wDmAOcA6ADpAOoA6wDsAO0A7gDvAPIA8wD0APUA9gD4APkA+gD7APwA/QD+AP8AAAEBAfgA+QD6APsA/AD9AP4A/wAAAQEB - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABpAGoAawBsAGgAcgByAHIAcgByAG4AbwBwAHEAbQB1AHYAdwB4AHQAewB8AH0AfgB6AHsAfAB9AH4AegCEAIQAhACEAIQAgACBAIIAgwB/AIcAiACJAIoAhgCNAI4AjwCQAIwAjQCOAI8AkACMAJYAlgCWAJYAlgCSAJMAlACVAJEAmQCaAJsAnACYAJ8AoAChAKIAngCfAKAAoQCiAJ4AqACoAKgAqACoAKQApQCmAKcAowCrAKwArQCuAKoAsQCyALMAtACwALEAsgCzALQAsAC6ALoAugC6ALoAtgC3ALgAuQC1AL0AvgC/AMAAvADDAMQAxQDGAMIAwwDEAMUAxgDCAMwAzADMAMwAzADIAMkAygDLAMcAzwDQANEA0gDOANUA1gDXANgA1ADVANYA1wDYANQA3gDeAN4A3gDeANoA2wDcAN0A2QDhAOIA4wDkAOAA5wDoAOkA6gDmAOcA6ADpAOoA5gDwAPAA8ADwAPAA7ADtAO4A7wDrAPMA9AD1APYA8gD5APoA+wD8APgA+QD6APsA/AD4AAIBAgECAQIBAgH+AP8AAAEBAf0A - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbgBvAHAAcQBuAG8AcABxAG0AaQBqAGsAbABoAHMAcwBzAHMAcwB5AHkAeQB5AHkAfwCAAIEAggCDAIAAgQCCAIMAfwB7AHwAfQB+AHoAhQCFAIUAhQCFAIsAiwCLAIsAiwCRAJIAkwCUAJUAkgCTAJQAlQCRAI0AjgCPAJAAjACXAJcAlwCXAJcAnQCdAJ0AnQCdAKMApAClAKYApwCkAKUApgCnAKMAnwCgAKEAogCeAKkAqQCpAKkAqQCvAK8ArwCvAK8AtQC2ALcAuAC5ALYAtwC4ALkAtQCxALIAswC0ALAAuwC7ALsAuwC7AMEAwQDBAMEAwQDHAMgAyQDKAMsAyADJAMoAywDHAMMAxADFAMYAwgDNAM0AzQDNAM0A0wDTANMA0wDTANkA2gDbANwA3QDaANsA3ADdANkA1QDWANcA2ADUAN8A3wDfAN8A3wDlAOUA5QDlAOUA6wDsAO0A7gDvAOwA7QDuAO8A6wDnAOgA6QDqAOYA8QDxAPEA8QDxAPcA9wD3APcA9wD9AP4A/wAAAQEB/gD/AAABAQH9APkA+gD7APwA+AADAQMBAwEDAQMB - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (arrow3d) - opacity: 1 - scene: scene2 - showlegend: true - type: mesh3d - x: - bdata: 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 - dtype: f8 - y: - bdata: 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 - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vKvG3X8ThbO/7thWS+3/z78r1WXPswi0vycGtRsSz8k/saBD1773yT8AAAAAAACYPLfG3X8ThaO/9NhWS+3/v7831WXPswikvyEGtRsSz7k/q6BD1773uT+rxt1/E4Wjv+7YVkvt/7+/K9Vlz7MIpL8nBrUbEs+5P7GgQ9e+97k/AAAAAAAAmLwAAAAAAAAAAAAAAAAAANC/UOkvN+/Gs7+n9Jebd+PJP6j0l5t348k/TOkvN+/Gs78AAAAAAACgPAQAAAAAAMC/YOkvN+/Go7+f9Jebd+O5P6D0l5t347k/XOkvN+/Go78AAAAAAADAv1DpLzfvxqO/p/SXm3fjuT+o9Jebd+O5P0zpLzfvxqO/AAAAAAAAoLwAAAAAAAAAAKvG3X8ThbO/sKBD1773yT8pBrUbEs/JPyfVZc+zCLS/79hWS+3/z78AAAAAAACYPLfG3X8ThaO/qqBD1773uT8jBrUbEs+5PzPVZc+zCKS/9dhWS+3/v7+rxt1/E4Wjv7CgQ9e+97k/KQa1GxLPuT8n1WXPswikv+/YVkvt/7+/AAAAAAAAmLwAAAAAAAAAAAAAAAAAANA/UOkvN+/Gsz+n9Jebd+PJv6j0l5t348m/TOkvN+/Gsz8AAAAAAACgPPj//////78/QOkvN+/Goz+v9Jebd+O5v7D0l5t347m/POkvN+/Goz8AAAAAAADAP1DpLzfvxqM/p/SXm3fjub+o9Jebd+O5v0zpLzfvxqM/AAAAAAAAoLwAAAAAAAAAAAAAAAAAANC/UOkvN+/Gs7+n9Jebd+PJP6j0l5t348k/TOkvN+/Gs78AAAAAAACgPAQAAAAAAMC/YOkvN+/Go7+f9Jebd+O5P6D0l5t347k/XOkvN+/Go78AAAAAAADAv1DpLzfvxqO/p/SXm3fjuT+o9Jebd+O5P0zpLzfvxqO/AAAAAAAAoLwAAAAAAAAAAAAAAAAAANA/UOkvN+/Gsz+n9Jebd+PJv6j0l5t348m/TOkvN+/Gsz8AAAAAAACgPPj//////78/QOkvN+/Goz+v9Jebd+O5v7D0l5t347m/POkvN+/Goz8AAAAAAADAP1DpLzfvxqM/p/SXm3fjub+o9Jebd+O5v0zpLzfvxqM/AAAAAAAAoLwAAAAAAAAAAKvG3X8ThbO/sKBD1773yT8pBrUbEs/JPyfVZc+zCLS/79hWS+3/z78AAAAAAACYPLfG3X8ThaO/qqBD1773uT8jBrUbEs+5PzPVZc+zCKS/9dhWS+3/v7+rxt1/E4Wjv7CgQ9e+97k/KQa1GxLPuT8n1WXPswikv+/YVkvt/7+/AAAAAAAAmLwAAAAAAAAAAAAAAAAAANC/UOkvN+/Gs7+n9Jebd+PJP6j0l5t348k/TOkvN+/Gs78AAAAAAACgPAQAAAAAAMC/YOkvN+/Go7+f9Jebd+O5P6D0l5t347k/XOkvN+/Go78AAAAAAADAv1DpLzfvxqO/p/SXm3fjuT+o9Jebd+O5P0zpLzfvxqO/AAAAAAAAoLwAAAAAAAAAAKvG3X8ThbO/7thWS+3/z78r1WXPswi0vycGtRsSz8k/saBD1773yT8AAAAAAACYPLfG3X8ThaO/9NhWS+3/v7831WXPswikvyEGtRsSz7k/q6BD1773uT+rxt1/E4Wjv+7YVkvt/7+/K9Vlz7MIpL8nBrUbEs+5P7GgQ9e+97k/AAAAAAAAmLwAAAAAAAAAAA== - dtype: f8 -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene3 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - i: - bdata: S0ACS0xBQUACAAEAVFZWWlpcXFtbV1dVVVNTUlJUXlZWVFRSUlNTVVVXV1dbW1xcWlpeX1hOT1FQXWBZTUZISEpKSUkyNDQsLCAgFhYODhQUHh4pKTI5NDQyMikpHh4UFA4ODhYWICAsLDkLBAw6PggHJz0qMysrHx8VFTA2Ni8vJSUZGREREhIaGiYmMDs2NjAwJiYaGhISERERGRklJS8vOxsFCjg8Bgk3Pxw1LS0jIxcX - dtype: i1 - j: - bdata: TEwDAwMDAQFLSwMDRkZISEpKSUlHR0VFQ0NCQkREWVlRUU9PTU1OTlBQWF1dX19gYF5hYWFhYWFhYWFhYUREQkJDQ0UzMysrHx8VFQ0NExMdHSgoMTE9PT4+OjoqKgwMCAgEBwcLCycnOSIiIiIiIiIiIiIiMTEoKB0dEzU1LS0jIxcXDw8QEBgYJCQuLj8/PDw4OBwcCgoGBgUJCRsbNzc7ISEhISEhISEhISEuLiQkGBgQ - dtype: i1 - k: - bdata: QEFLTEEBQAAAQAACVkhaSlxJW0dXRVVDU0JSRFRGVlFUT1JNU05VUFdYXVtfXGBaXlZZYF1QTU9YX15RTkhCSkNJRUc0KywfIBUWDQ4TFB0eKCkxMjM0PjI6KSoeDBQIDgQHFgsgJyw5ND0nBwgqOgQLOT4MKygfHRUTDTYtLyMlFxkPERASGBokJi4wNTY8MDgmHBoKEgYRBQkZGyU3Lzs2PzcJBhw4BRs7PAotJCMYFxAP - dtype: i1 - legendgroup: Sensor(id=ID) - name: Sensor (arrow) - opacity: 1 - scene: scene3 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5Pw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPA== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vA== - dtype: f8 -- legendgroup: Sensor(id=ID) - line: - color: - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - marker: - color: - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - size: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + - color: "#2e91e5" + colorscale: + - - 0.0 + - "#00b050" + - - 0.16 + - "#00b050" + - - 0.26 + - "#dddddd" + - - 0.74 + - "#dddddd" + - - 0.8400000000000001 + - "#e71111" + - - 1.0 + - "#e71111" + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene + showlegend: true + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + - facecolor: + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (cone) + opacity: 1 + scene: scene + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== + dtype: f8 + - color: "#2e91e5" + colorscale: + - - 0.0 + - "#00b050" + - - 0.16 + - "#00b050" + - - 0.26 + - "#dddddd" + - - 0.74 + - "#dddddd" + - - 0.8400000000000001 + - "#e71111" + - - 1.0 + - "#e71111" + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene2 + showlegend: false + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + - facecolor: + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABtAG4AbwBwAHEAaABpAGoAawBsAG0AbgBvAHAAcQB0AHUAdgB3AHgAegB7AHwAfQB+AH8AgACBAIIAgwB6AHsAfAB9AH4AfwCAAIEAggCDAIYAhwCIAIkAigCMAI0AjgCPAJAAkQCSAJMAlACVAIwAjQCOAI8AkACRAJIAkwCUAJUAmACZAJoAmwCcAJ4AnwCgAKEAogCjAKQApQCmAKcAngCfAKAAoQCiAKMApAClAKYApwCqAKsArACtAK4AsACxALIAswC0ALUAtgC3ALgAuQCwALEAsgCzALQAtQC2ALcAuAC5ALwAvQC+AL8AwADCAMMAxADFAMYAxwDIAMkAygDLAMIAwwDEAMUAxgDHAMgAyQDKAMsAzgDPANAA0QDSANQA1QDWANcA2ADZANoA2wDcAN0A1ADVANYA1wDYANkA2gDbANwA3QDgAOEA4gDjAOQA5gDnAOgA6QDqAOsA7ADtAO4A7wDmAOcA6ADpAOoA6wDsAO0A7gDvAPIA8wD0APUA9gD4APkA+gD7APwA/QD+AP8AAAEBAfgA+QD6APsA/AD9AP4A/wAAAQEB + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABpAGoAawBsAGgAcgByAHIAcgByAG4AbwBwAHEAbQB1AHYAdwB4AHQAewB8AH0AfgB6AHsAfAB9AH4AegCEAIQAhACEAIQAgACBAIIAgwB/AIcAiACJAIoAhgCNAI4AjwCQAIwAjQCOAI8AkACMAJYAlgCWAJYAlgCSAJMAlACVAJEAmQCaAJsAnACYAJ8AoAChAKIAngCfAKAAoQCiAJ4AqACoAKgAqACoAKQApQCmAKcAowCrAKwArQCuAKoAsQCyALMAtACwALEAsgCzALQAsAC6ALoAugC6ALoAtgC3ALgAuQC1AL0AvgC/AMAAvADDAMQAxQDGAMIAwwDEAMUAxgDCAMwAzADMAMwAzADIAMkAygDLAMcAzwDQANEA0gDOANUA1gDXANgA1ADVANYA1wDYANQA3gDeAN4A3gDeANoA2wDcAN0A2QDhAOIA4wDkAOAA5wDoAOkA6gDmAOcA6ADpAOoA5gDwAPAA8ADwAPAA7ADtAO4A7wDrAPMA9AD1APYA8gD5APoA+wD8APgA+QD6APsA/AD4AAIBAgECAQIBAgH+AP8AAAEBAf0A + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbgBvAHAAcQBuAG8AcABxAG0AaQBqAGsAbABoAHMAcwBzAHMAcwB5AHkAeQB5AHkAfwCAAIEAggCDAIAAgQCCAIMAfwB7AHwAfQB+AHoAhQCFAIUAhQCFAIsAiwCLAIsAiwCRAJIAkwCUAJUAkgCTAJQAlQCRAI0AjgCPAJAAjACXAJcAlwCXAJcAnQCdAJ0AnQCdAKMApAClAKYApwCkAKUApgCnAKMAnwCgAKEAogCeAKkAqQCpAKkAqQCvAK8ArwCvAK8AtQC2ALcAuAC5ALYAtwC4ALkAtQCxALIAswC0ALAAuwC7ALsAuwC7AMEAwQDBAMEAwQDHAMgAyQDKAMsAyADJAMoAywDHAMMAxADFAMYAwgDNAM0AzQDNAM0A0wDTANMA0wDTANkA2gDbANwA3QDaANsA3ADdANkA1QDWANcA2ADUAN8A3wDfAN8A3wDlAOUA5QDlAOUA6wDsAO0A7gDvAOwA7QDuAO8A6wDnAOgA6QDqAOYA8QDxAPEA8QDxAPcA9wD3APcA9wD9AP4A/wAAAQEB/gD/AAABAQH9APkA+gD7APwA+AADAQMBAwEDAQMB + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (arrow3d) + opacity: 1 + scene: scene2 + showlegend: true + type: mesh3d + x: + bdata: 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 + dtype: f8 + y: + bdata: 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 + dtype: f8 + z: + bdata: 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 + dtype: f8 + - color: "#2e91e5" + colorscale: + - - 0.0 + - "#00b050" + - - 0.16 + - "#00b050" + - - 0.26 + - "#dddddd" + - - 0.74 + - "#dddddd" + - - 0.8400000000000001 + - "#e71111" + - - 1.0 + - "#e71111" + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene3 + showlegend: false + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + - facecolor: + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + i: + bdata: S0ACS0xBQUACAAEAVFZWWlpcXFtbV1dVVVNTUlJUXlZWVFRSUlNTVVVXV1dbW1xcWlpeX1hOT1FQXWBZTUZISEpKSUkyNDQsLCAgFhYODhQUHh4pKTI5NDQyMikpHh4UFA4ODhYWICAsLDkLBAw6PggHJz0qMysrHx8VFTA2Ni8vJSUZGREREhIaGiYmMDs2NjAwJiYaGhISERERGRklJS8vOxsFCjg8Bgk3Pxw1LS0jIxcX + dtype: i1 + j: + bdata: TEwDAwMDAQFLSwMDRkZISEpKSUlHR0VFQ0NCQkREWVlRUU9PTU1OTlBQWF1dX19gYF5hYWFhYWFhYWFhYUREQkJDQ0UzMysrHx8VFQ0NExMdHSgoMTE9PT4+OjoqKgwMCAgEBwcLCycnOSIiIiIiIiIiIiIiMTEoKB0dEzU1LS0jIxcXDw8QEBgYJCQuLj8/PDw4OBwcCgoGBgUJCRsbNzc7ISEhISEhISEhISEuLiQkGBgQ + dtype: i1 + k: + bdata: QEFLTEEBQAAAQAACVkhaSlxJW0dXRVVDU0JSRFRGVlFUT1JNU05VUFdYXVtfXGBaXlZZYF1QTU9YX15RTkhCSkNJRUc0KywfIBUWDQ4TFB0eKCkxMjM0PjI6KSoeDBQIDgQHFgsgJyw5ND0nBwgqOgQLOT4MKygfHRUTDTYtLyMlFxkPERASGBokJi4wNTY8MDgmHBoKEgYRBQkZGyU3Lzs2PzcJBhw4BRs7PAotJCMYFxAP + dtype: i1 + legendgroup: Sensor(id=ID) + name: Sensor (arrow) + opacity: 1 + scene: scene3 + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5Pw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPA== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vA== + dtype: f8 + - legendgroup: Sensor(id=ID) + line: + color: + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + marker: + color: + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + size: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + dtype: f8 + mode: markers+lines + name: Sensor (arrow) + opacity: 1 + scene: scene3 + showlegend: false + type: scatter3d + x: + bdata: 1bj7b6Jw8r9Vjgggux7rv/TRuS1+WvS/VY4IILse678YXIykA0vnv1WOCCC7Huu/VY4IILse678AAAAAAAD4fwAAAAAAAPi/AAAAAAAA4L8AAAAAAADwvwAAAAAAAOC/////////778AAAAAAADgvwAAAAAAAOC/AAAAAAAA+H/VuPtvonDyv1WOCCC7Huu/9NG5LX5a9L9Vjgggux7rvxhcjKQDS+e/VY4IILse679Vjgggux7rvwAAAAAAAPh/AAAAAAAA4D8AAAAAAADgvzMzMzMzM5O8AAAAAAAA4L8zMzMzMzOTPAAAAAAAAOC/AAAAAAAA4L8AAAAAAAD4fwAAAAAAAOC/AAAAAAAA4D8zMzMzMzOTvAAAAAAAAOA/MzMzMzMzkzwAAAAAAADgPwAAAAAAAOA/AAAAAAAA+H8AAAAAAADgPwAAAAAAAOC/MzMzMzMzk7wAAAAAAADgvzMzMzMzM5M8AAAAAAAA4L8AAAAAAADgvwAAAAAAAPh/VY4IILse6z/VuPtvonDyPxhcjKQDS+c/1bj7b6Jw8j/00bktflr0P9W4+2+icPI/1bj7b6Jw8j8AAAAAAAD4fwAAAAAAAOA/AAAAAAAA+D/////////vPwAAAAAAAPg/AAAAAAAA8D8AAAAAAAD4PwAAAAAAAPg/AAAAAAAA+H9Vjgggux7rP9W4+2+icPI/GFyMpANL5z/VuPtvonDyP/TRuS1+WvQ/1bj7b6Jw8j/VuPtvonDyPwAAAAAAAPh/ + dtype: f8 + y: + bdata: 3vHDW2ue979EHHhIKcPgvzuXFBwnNu2/RBx4SCnD4L9jtPVx7GTxv0QceEgpw+C/RBx4SCnD4L8AAAAAAAD4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+H/e8cNba573P0QceEgpw+A/O5cUHCc27T9EHHhIKcPgP2O09XHsZPE/RBx4SCnD4D9EHHhIKcPgPwAAAAAAAPh/AAAAAAAA8L8AAAAAAADwvwAAAAAAAPC/AAAAAAAA8L8AAAAAAADwvwAAAAAAAPC/AAAAAAAA8L8AAAAAAAD4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+H8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPh/RBx4SCnD4L/e8cNba573v2O09XHsZPG/3vHDW2ue9787lxQcJzbtv97xw1trnve/3vHDW2ue978AAAAAAAD4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+H9EHHhIKcPgP97xw1trnvc/Y7T1cexk8T/e8cNba573PzuXFBwnNu0/3vHDW2ue9z/e8cNba573PwAAAAAAAPh/ + dtype: f8 + z: + bdata: AAAAAAAAmLwAAAAAAACYPDO7o8x9bLc/AAAAAAAAmDwzu6PMfWy3vwAAAAAAAJg8AAAAAAAAmDwAAAAAAAD4fwAAAAAAAKC8AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8MzMzMzMz078AAAAAAACgPAAAAAAAAKA8AAAAAAAA+H8AAAAAAACYvAAAAAAAAJg8M7ujzH1stz8AAAAAAACYPDO7o8x9bLe/AAAAAAAAmDwAAAAAAACYPAAAAAAAAPh/AAAAAAAAoLwAAAAAAACgPDMzMzMzM9O/AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8AAAAAAAAoDwAAAAAAAD4fwAAAAAAAKC8AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8MzMzMzMz078AAAAAAACgPAAAAAAAAKA8AAAAAAAA+H8AAAAAAACgvAAAAAAAAKA8MzMzMzMz078AAAAAAACgPDMzMzMzM9M/AAAAAAAAoDwAAAAAAACgPAAAAAAAAPh/AAAAAAAAmLwAAAAAAACYPDO7o8x9bLc/AAAAAAAAmDwzu6PMfWy3vwAAAAAAAJg8AAAAAAAAmDwAAAAAAAD4fwAAAAAAAKC8AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8MzMzMzMz078AAAAAAACgPAAAAAAAAKA8AAAAAAAA+H8AAAAAAACYvAAAAAAAAJg8M7ujzH1stz8AAAAAAACYPDO7o8x9bLe/AAAAAAAAmDwAAAAAAACYPAAAAAAAAPh/ dtype: f8 - mode: markers+lines - name: Sensor (arrow) - opacity: 1 - scene: scene3 - showlegend: false - type: scatter3d - x: - bdata: 1bj7b6Jw8r9Vjgggux7rv/TRuS1+WvS/VY4IILse678YXIykA0vnv1WOCCC7Huu/VY4IILse678AAAAAAAD4fwAAAAAAAPi/AAAAAAAA4L8AAAAAAADwvwAAAAAAAOC/////////778AAAAAAADgvwAAAAAAAOC/AAAAAAAA+H/VuPtvonDyv1WOCCC7Huu/9NG5LX5a9L9Vjgggux7rvxhcjKQDS+e/VY4IILse679Vjgggux7rvwAAAAAAAPh/AAAAAAAA4D8AAAAAAADgvzMzMzMzM5O8AAAAAAAA4L8zMzMzMzOTPAAAAAAAAOC/AAAAAAAA4L8AAAAAAAD4fwAAAAAAAOC/AAAAAAAA4D8zMzMzMzOTvAAAAAAAAOA/MzMzMzMzkzwAAAAAAADgPwAAAAAAAOA/AAAAAAAA+H8AAAAAAADgPwAAAAAAAOC/MzMzMzMzk7wAAAAAAADgvzMzMzMzM5M8AAAAAAAA4L8AAAAAAADgvwAAAAAAAPh/VY4IILse6z/VuPtvonDyPxhcjKQDS+c/1bj7b6Jw8j/00bktflr0P9W4+2+icPI/1bj7b6Jw8j8AAAAAAAD4fwAAAAAAAOA/AAAAAAAA+D/////////vPwAAAAAAAPg/AAAAAAAA8D8AAAAAAAD4PwAAAAAAAPg/AAAAAAAA+H9Vjgggux7rP9W4+2+icPI/GFyMpANL5z/VuPtvonDyP/TRuS1+WvQ/1bj7b6Jw8j/VuPtvonDyPwAAAAAAAPh/ - dtype: f8 - y: - bdata: 3vHDW2ue979EHHhIKcPgvzuXFBwnNu2/RBx4SCnD4L9jtPVx7GTxv0QceEgpw+C/RBx4SCnD4L8AAAAAAAD4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+H/e8cNba573P0QceEgpw+A/O5cUHCc27T9EHHhIKcPgP2O09XHsZPE/RBx4SCnD4D9EHHhIKcPgPwAAAAAAAPh/AAAAAAAA8L8AAAAAAADwvwAAAAAAAPC/AAAAAAAA8L8AAAAAAADwvwAAAAAAAPC/AAAAAAAA8L8AAAAAAAD4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+H8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPh/RBx4SCnD4L/e8cNba573v2O09XHsZPG/3vHDW2ue9787lxQcJzbtv97xw1trnve/3vHDW2ue978AAAAAAAD4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+H9EHHhIKcPgP97xw1trnvc/Y7T1cexk8T/e8cNba573PzuXFBwnNu0/3vHDW2ue9z/e8cNba573PwAAAAAAAPh/ - dtype: f8 - z: - bdata: AAAAAAAAmLwAAAAAAACYPDO7o8x9bLc/AAAAAAAAmDwzu6PMfWy3vwAAAAAAAJg8AAAAAAAAmDwAAAAAAAD4fwAAAAAAAKC8AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8MzMzMzMz078AAAAAAACgPAAAAAAAAKA8AAAAAAAA+H8AAAAAAACYvAAAAAAAAJg8M7ujzH1stz8AAAAAAACYPDO7o8x9bLe/AAAAAAAAmDwAAAAAAACYPAAAAAAAAPh/AAAAAAAAoLwAAAAAAACgPDMzMzMzM9O/AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8AAAAAAAAoDwAAAAAAAD4fwAAAAAAAKC8AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8MzMzMzMz078AAAAAAACgPAAAAAAAAKA8AAAAAAAA+H8AAAAAAACgvAAAAAAAAKA8MzMzMzMz078AAAAAAACgPDMzMzMzM9M/AAAAAAAAoDwAAAAAAACgPAAAAAAAAPh/AAAAAAAAmLwAAAAAAACYPDO7o8x9bLc/AAAAAAAAmDwzu6PMfWy3vwAAAAAAAJg8AAAAAAAAmDwAAAAAAAD4fwAAAAAAAKC8AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8MzMzMzMz078AAAAAAACgPAAAAAAAAKA8AAAAAAAA+H8AAAAAAACYvAAAAAAAAJg8M7ujzH1stz8AAAAAAACYPDO7o8x9bLe/AAAAAAAAmDwAAAAAAACYPAAAAAAAAPh/ - dtype: f8 layout: legend: itemsizing: constant @@ -1193,30 +1193,30 @@ layout: z: 1.4 domain: x: - - 0.0 - - 0.2888888888888889 + - 0.0 + - 0.2888888888888889 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: x (m) yaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: y (m) zaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: z (m) scene2: @@ -1232,30 +1232,30 @@ layout: z: 1.4 domain: x: - - 0.35555555555555557 - - 0.6444444444444445 + - 0.35555555555555557 + - 0.6444444444444445 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.5124847513262898 - - 1.5124847513262898 + - -1.5124847513262898 + - 1.5124847513262898 title: text: x (m) yaxis: autorange: false range: - - -1.5124847513262898 - - 1.5124847513262898 + - -1.5124847513262898 + - 1.5124847513262898 title: text: y (m) zaxis: autorange: false range: - - -1.5124847513262898 - - 1.5124847513262898 + - -1.5124847513262898 + - 1.5124847513262898 title: text: z (m) scene3: @@ -1271,402 +1271,402 @@ layout: z: 1.4 domain: x: - - 0.7111111111111111 - - 1.0 + - 0.7111111111111111 + - 1.0 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.5 - - 1.5 + - -1.5 + - 1.5 title: text: x (m) yaxis: autorange: false range: - - -1.5 - - 1.5 + - -1.5 + - 1.5 title: text: y (m) zaxis: autorange: false range: - - -1.5 - - 1.5 + - -1.5 + - 1.5 title: text: z (m) template: data: bar: - - error_x: - color: '#2a3f5f' - error_y: - color: '#2a3f5f' - marker: - line: - color: '#E5ECF6' - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: bar + - error_x: + color: "#2a3f5f" + error_y: + color: "#2a3f5f" + marker: + line: + color: "#E5ECF6" + width: 0.5 + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: bar barpolar: - - marker: - line: - color: '#E5ECF6' - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: barpolar + - marker: + line: + color: "#E5ECF6" + width: 0.5 + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: barpolar carpet: - - aaxis: - endlinecolor: '#2a3f5f' - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: '#2a3f5f' - baxis: - endlinecolor: '#2a3f5f' - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: '#2a3f5f' - type: carpet + - aaxis: + endlinecolor: "#2a3f5f" + gridcolor: white + linecolor: white + minorgridcolor: white + startlinecolor: "#2a3f5f" + baxis: + endlinecolor: "#2a3f5f" + gridcolor: white + linecolor: white + minorgridcolor: white + startlinecolor: "#2a3f5f" + type: carpet choropleth: - - colorbar: - outlinewidth: 0 - ticks: '' - type: choropleth + - colorbar: + outlinewidth: 0 + ticks: "" + type: choropleth contour: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: contour + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: contour contourcarpet: - - colorbar: - outlinewidth: 0 - ticks: '' - type: contourcarpet + - colorbar: + outlinewidth: 0 + ticks: "" + type: contourcarpet heatmap: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: heatmap + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: heatmap histogram: - - marker: - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: histogram + - marker: + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: histogram histogram2d: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: histogram2d + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: histogram2d histogram2dcontour: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: histogram2dcontour + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: histogram2dcontour mesh3d: - - colorbar: - outlinewidth: 0 - ticks: '' - type: mesh3d - parcoords: - - line: - colorbar: + - colorbar: outlinewidth: 0 - ticks: '' - type: parcoords + ticks: "" + type: mesh3d + parcoords: + - line: + colorbar: + outlinewidth: 0 + ticks: "" + type: parcoords pie: - - automargin: true - type: pie + - automargin: true + type: pie scatter: - - fillpattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: scatter + - fillpattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: scatter scatter3d: - - line: - colorbar: - outlinewidth: 0 - ticks: '' - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatter3d + - line: + colorbar: + outlinewidth: 0 + ticks: "" + marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scatter3d scattercarpet: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattercarpet + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattercarpet scattergeo: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattergeo + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattergeo scattergl: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattergl + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattergl scattermap: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattermap + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattermap scattermapbox: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattermapbox + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattermapbox scatterpolar: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterpolar + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scatterpolar scatterpolargl: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterpolargl + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scatterpolargl scatterternary: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterternary + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scatterternary surface: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: surface + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: surface table: - - cells: - fill: - color: '#EBF0F8' - line: - color: white - header: - fill: - color: '#C8D4E3' - line: - color: white - type: table + - cells: + fill: + color: "#EBF0F8" + line: + color: white + header: + fill: + color: "#C8D4E3" + line: + color: white + type: table layout: annotationdefaults: - arrowcolor: '#2a3f5f' + arrowcolor: "#2a3f5f" arrowhead: 0 arrowwidth: 1 autotypenumbers: strict coloraxis: colorbar: outlinewidth: 0 - ticks: '' + ticks: "" colorscale: diverging: - - - 0 - - '#8e0152' - - - 0.1 - - '#c51b7d' - - - 0.2 - - '#de77ae' - - - 0.3 - - '#f1b6da' - - - 0.4 - - '#fde0ef' - - - 0.5 - - '#f7f7f7' - - - 0.6 - - '#e6f5d0' - - - 0.7 - - '#b8e186' - - - 0.8 - - '#7fbc41' - - - 0.9 - - '#4d9221' - - - 1 - - '#276419' + - - 0 + - "#8e0152" + - - 0.1 + - "#c51b7d" + - - 0.2 + - "#de77ae" + - - 0.3 + - "#f1b6da" + - - 0.4 + - "#fde0ef" + - - 0.5 + - "#f7f7f7" + - - 0.6 + - "#e6f5d0" + - - 0.7 + - "#b8e186" + - - 0.8 + - "#7fbc41" + - - 0.9 + - "#4d9221" + - - 1 + - "#276419" sequential: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" sequentialminus: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" colorway: - - '#636efa' - - '#EF553B' - - '#00cc96' - - '#ab63fa' - - '#FFA15A' - - '#19d3f3' - - '#FF6692' - - '#B6E880' - - '#FF97FF' - - '#FECB52' + - "#636efa" + - "#EF553B" + - "#00cc96" + - "#ab63fa" + - "#FFA15A" + - "#19d3f3" + - "#FF6692" + - "#B6E880" + - "#FF97FF" + - "#FECB52" font: - color: '#2a3f5f' + color: "#2a3f5f" geo: bgcolor: white lakecolor: white - landcolor: '#E5ECF6' + landcolor: "#E5ECF6" showlakes: true showland: true subunitcolor: white @@ -1676,66 +1676,66 @@ layout: mapbox: style: light paper_bgcolor: white - plot_bgcolor: '#E5ECF6' + plot_bgcolor: "#E5ECF6" polar: angularaxis: gridcolor: white linecolor: white - ticks: '' - bgcolor: '#E5ECF6' + ticks: "" + bgcolor: "#E5ECF6" radialaxis: gridcolor: white linecolor: white - ticks: '' + ticks: "" scene: xaxis: - backgroundcolor: '#E5ECF6' + backgroundcolor: "#E5ECF6" gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: '' + ticks: "" zerolinecolor: white yaxis: - backgroundcolor: '#E5ECF6' + backgroundcolor: "#E5ECF6" gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: '' + ticks: "" zerolinecolor: white zaxis: - backgroundcolor: '#E5ECF6' + backgroundcolor: "#E5ECF6" gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: '' + ticks: "" zerolinecolor: white shapedefaults: line: - color: '#2a3f5f' + color: "#2a3f5f" ternary: aaxis: gridcolor: white linecolor: white - ticks: '' + ticks: "" baxis: gridcolor: white linecolor: white - ticks: '' - bgcolor: '#E5ECF6' + ticks: "" + bgcolor: "#E5ECF6" caxis: gridcolor: white linecolor: white - ticks: '' + ticks: "" title: x: 0.05 xaxis: automargin: true gridcolor: white linecolor: white - ticks: '' + ticks: "" title: standoff: 15 zerolinecolor: white @@ -1744,7 +1744,7 @@ layout: automargin: true gridcolor: white linecolor: white - ticks: '' + ticks: "" title: standoff: 15 zerolinecolor: white diff --git a/tests/test_display_plotly/test_pixel_field_null_values.yml b/tests/test_display_plotly/test_pixel_field_null_values.yml index 9dfad2981..98969e7e2 100644 --- a/tests/test_display_plotly/test_pixel_field_null_values.yml +++ b/tests/test_display_plotly/test_pixel_field_null_values.yml @@ -1,756 +1,756 @@ data: -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene - showlegend: true - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#423a81' - - '#423a81' - - '#423a81' - - '#423a81' - - '#423a81' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#471f70' - - '#471f70' - - '#471f70' - - '#471f70' - - '#471f70' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#9ed93a' - - '#9ed93a' - - '#9ed93a' - - '#9ed93a' - - '#9ed93a' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#471f70' - - '#471f70' - - '#471f70' - - '#471f70' - - '#471f70' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#423a81' - - '#423a81' - - '#423a81' - - '#423a81' - - '#423a81' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAjQCGAIYAhgCKAIoAiACMAIoAhgCJAI0AjgCPAJAAkQCSAJsAlACUAJQAmACYAJYAmgCYAJQAlwCbAJwAnQCeAJ8AoACiAKMApAClAKYAqACpAKoAqwCsAK4ArwCwALEAsgC0ALUAtgC3ALgAugC7ALwAvQC+AMAAwQDCAMMAxADNAMYAxgDGAMoAygDIAMwAygDGAMkAzQDOAM8A0ADRANIA2wDUANQA1ADYANgA1gDaANgA1ADXANsA3ADdAN4A3wDgAOIA4wDkAOUA5gDoAOkA6gDrAOwA7gDvAPAA8QDyAPQA9QD2APcA+AD6APsA/AD9AP4A - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhgCNAIcAiACMAI0AhwCIAIsAiwCIAIgAjwCQAJEAkgCOAJQAmwCVAJYAmgCbAJUAlgCZAJkAlgCWAJ0AngCfAKAAnACjAKQApQCmAKIAqQCqAKsArACoAK8AsACxALIArgC1ALYAtwC4ALQAuwC8AL0AvgC6AMEAwgDDAMQAwADGAM0AxwDIAMwAzQDHAMgAywDLAMgAyADPANAA0QDSAM4A1ADbANUA1gDaANsA1QDWANkA2QDWANYA3QDeAN8A4ADcAOMA5ADlAOYA4gDpAOoA6wDsAOgA7wDwAPEA8gDuAPUA9gD3APgA9AD7APwA/QD+APoA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiQCKAIgAiQCLAIwAiwCLAIYAhwCNAIwAkwCTAJMAkwCTAJcAmACWAJcAmQCaAJkAmQCUAJUAmwCaAKEAoQChAKEAoQCnAKcApwCnAKcArQCtAK0ArQCtALMAswCzALMAswC5ALkAuQC5ALkAvwC/AL8AvwC/AMUAxQDFAMUAxQDJAMoAyADJAMsAzADLAMsAxgDHAM0AzADTANMA0wDTANMA1wDYANYA1wDZANoA2QDZANQA1QDbANoA4QDhAOEA4QDhAOcA5wDnAOcA5wDtAO0A7QDtAO0A8wDzAPMA8wDzAPkA+QD5APkA+QD/AP8A/wD/AP8A - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (True) - opacity: 1 - scene: scene - showlegend: true - type: mesh3d - x: - bdata: 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 - dtype: f8 - y: - bdata: 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 - dtype: f8 - z: - bdata: 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 - dtype: f8 -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene2 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#423a81' - - '#423a81' - - '#423a81' - - '#423a81' - - '#423a81' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#471f70' - - '#471f70' - - '#471f70' - - '#471f70' - - '#471f70' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#9ed93a' - - '#9ed93a' - - '#9ed93a' - - '#9ed93a' - - '#9ed93a' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#471f70' - - '#471f70' - - '#471f70' - - '#471f70' - - '#471f70' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#423a81' - - '#423a81' - - '#423a81' - - '#423a81' - - '#423a81' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYAmACZAJoAmwCcAJ4AnwCgAKEAogCkAKUApgCnAKgAqgCrAKwArQCuALAAsQCyALMAtAC2ALcAuAC5ALoAvAC9AL4AvwDAAMIAwwDEAMUAxgDIAMkAygDLAMwAzgDPANAA0QDSANQA1QDWANcA2ADaANsA3ADdAN4A - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIAmQCaAJsAnACYAJ8AoAChAKIAngClAKYApwCoAKQAqwCsAK0ArgCqALEAsgCzALQAsAC3ALgAuQC6ALYAvQC+AL8AwAC8AMMAxADFAMYAwgDJAMoAywDMAMgAzwDQANEA0gDOANUA1gDXANgA1ADbANwA3QDeANoA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcAnQCdAJ0AnQCdAKMAowCjAKMAowCpAKkAqQCpAKkArwCvAK8ArwCvALUAtQC1ALUAtQC7ALsAuwC7ALsAwQDBAMEAwQDBAMcAxwDHAMcAxwDNAM0AzQDNAM0A0wDTANMA0wDTANkA2QDZANkA2QDfAN8A3wDfAN8A - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (False) - opacity: 1 - scene: scene2 - showlegend: true - type: mesh3d - x: - bdata: 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 - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPG1ZCIjtY/S/ub6Wht7P878fAhIu5jrzv4hYsaDjcvO/3WkHiHYq9L8iDjyklGHovxTxn/cX1+a/RWzYTl0g47++2BkSL97hvzxjQ2DLzeS/yOM19X7g57/Cmi6HoDHWvwAAAAAAAAAA/1REEw5vvj9fWnUEI8+yP11adQQjz7K/AFVEEw5vvr8AAAAAAAAAABTxn/cX1+Y/yOM19X7g5z88Y0Ngy83kP77YGRIv3uE/RGzYTl0g4z/Cmi6HoDHWP21ZCIjtY/Q/3WkHiHYq9D+IWLGg43LzPx8CEi7mOvM/uL6Wht7P8z8iDjyklGHoP7uerNRB4vK/r53QlPUT87/oAXovLwz0v1zgMcfkc/S/cYp/ucO787/zVYnCxrjovwAAAAAAAAAA/1REEw5vvj9fWnUEI8+yP11adQQjz7K/AFVEEw5vvr8AAAAAAAAAALuerNRB4vI/cYp/ucO78z9c4DHH5HP0P+gBei8vDPQ/r53QlPUT8z/zVYnCxrjoPwAAAAAAAPC/YHWXPR4y7L+0VHGfG6btv6ZVRzDyLPG/UEU04fDm8b8AAAAAAADwvwAAAAAAAOC/wOouezxk2L9oqeI+N0zbv0yrjmDkWeK/oIpowuHN478AAAAAAADgvwAAAAAAAAAA/1REEw5vvj9fWnUEI8+yP11adQQjz7K/AFVEEw5vvr8AAAAAAAAAAAAAAAAAAOA/oIpowuHN4z9Mq45g5FniP2mp4j43TNs/wOouezxk2D8AAAAAAADgPwAAAAAAAPA/UEU04fDm8T+mVUcw8izxP7RUcZ8bpu0/YHWXPR4y7D8AAAAAAADwP4rCplZ8O+q/HusAjXiI6L9HP5xxNhjnvzD8C6Gh5+e/o8Re1hTY6b8GVbuenKPzvwAAAAAAAAAA/1REEw5vvj9fWnUEI8+yP11adQQjz7K/AFVEEw5vvr8AAAAAAAAAAIrCplZ8O+o/o8Re1hTY6T8w/AuhoefnP0c/nHE2GOc/HesAjXiI6D8GVbuenKPzPyZN7+8kOOe/Rizx7xKr57/wTp2+OBrpv8H726Mzium/j4LS8kJg6L/v+OGtNc/zv9cdwBDQUdK/cDiUFQI/0L+KOXk/aWTWv4VOzNuhQ9y/dydPYkW/2b+fsmi8L+fkvwAAAAAAAAAA/1REEw5vvj9fWnUEI8+yP11adQQjz7K/AFVEEw5vvr8AAAAAAAAAANcdwBDQUdI/didPYkW/2T+GTszboUPcP4o5eT9pZNY/cDiUFQI/0D+fsmi8L+fkPyZN7+8kOOc/j4LS8kJg6D/B+9ujM4rpP/BOnb44Guk/Rizx7xKr5z/v+OGtNc/zPw== - dtype: f8 - z: - bdata: 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 - dtype: f8 + - color: "#2e91e5" + colorscale: + - - 0.0 + - "#00b050" + - - 0.16 + - "#00b050" + - - 0.26 + - "#dddddd" + - - 0.74 + - "#dddddd" + - - 0.8400000000000001 + - "#e71111" + - - 1.0 + - "#e71111" + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene + showlegend: true + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + - facecolor: + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - "#461567" + - "#461567" + - "#461567" + - "#461567" + - "#461567" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#423a81" + - "#423a81" + - "#423a81" + - "#423a81" + - "#423a81" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#461567" + - "#461567" + - "#461567" + - "#461567" + - "#461567" + - "#472071" + - "#472071" + - "#472071" + - "#472071" + - "#472071" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#1f9e89" + - "#1f9e89" + - "#1f9e89" + - "#1f9e89" + - "#1f9e89" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#472071" + - "#472071" + - "#472071" + - "#472071" + - "#472071" + - "#471f70" + - "#471f70" + - "#471f70" + - "#471f70" + - "#471f70" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#9ed93a" + - "#9ed93a" + - "#9ed93a" + - "#9ed93a" + - "#9ed93a" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#471f70" + - "#471f70" + - "#471f70" + - "#471f70" + - "#471f70" + - "#472071" + - "#472071" + - "#472071" + - "#472071" + - "#472071" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#1f9e89" + - "#1f9e89" + - "#1f9e89" + - "#1f9e89" + - "#1f9e89" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#b2beb5" + - "#472071" + - "#472071" + - "#472071" + - "#472071" + - "#472071" + - "#461567" + - "#461567" + - "#461567" + - "#461567" + - "#461567" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#423a81" + - "#423a81" + - "#423a81" + - "#423a81" + - "#423a81" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#461567" + - "#461567" + - "#461567" + - "#461567" + - "#461567" + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAjQCGAIYAhgCKAIoAiACMAIoAhgCJAI0AjgCPAJAAkQCSAJsAlACUAJQAmACYAJYAmgCYAJQAlwCbAJwAnQCeAJ8AoACiAKMApAClAKYAqACpAKoAqwCsAK4ArwCwALEAsgC0ALUAtgC3ALgAugC7ALwAvQC+AMAAwQDCAMMAxADNAMYAxgDGAMoAygDIAMwAygDGAMkAzQDOAM8A0ADRANIA2wDUANQA1ADYANgA1gDaANgA1ADXANsA3ADdAN4A3wDgAOIA4wDkAOUA5gDoAOkA6gDrAOwA7gDvAPAA8QDyAPQA9QD2APcA+AD6APsA/AD9AP4A + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhgCNAIcAiACMAI0AhwCIAIsAiwCIAIgAjwCQAJEAkgCOAJQAmwCVAJYAmgCbAJUAlgCZAJkAlgCWAJ0AngCfAKAAnACjAKQApQCmAKIAqQCqAKsArACoAK8AsACxALIArgC1ALYAtwC4ALQAuwC8AL0AvgC6AMEAwgDDAMQAwADGAM0AxwDIAMwAzQDHAMgAywDLAMgAyADPANAA0QDSAM4A1ADbANUA1gDaANsA1QDWANkA2QDWANYA3QDeAN8A4ADcAOMA5ADlAOYA4gDpAOoA6wDsAOgA7wDwAPEA8gDuAPUA9gD3APgA9AD7APwA/QD+APoA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiQCKAIgAiQCLAIwAiwCLAIYAhwCNAIwAkwCTAJMAkwCTAJcAmACWAJcAmQCaAJkAmQCUAJUAmwCaAKEAoQChAKEAoQCnAKcApwCnAKcArQCtAK0ArQCtALMAswCzALMAswC5ALkAuQC5ALkAvwC/AL8AvwC/AMUAxQDFAMUAxQDJAMoAyADJAMsAzADLAMsAxgDHAM0AzADTANMA0wDTANMA1wDYANYA1wDZANoA2QDZANQA1QDbANoA4QDhAOEA4QDhAOcA5wDnAOcA5wDtAO0A7QDtAO0A8wDzAPMA8wDzAPkA+QD5APkA+QD/AP8A/wD/AP8A + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (True) + opacity: 1 + scene: scene + showlegend: true + type: mesh3d + x: + bdata: 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 + dtype: f8 + y: + bdata: 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 + dtype: f8 + z: + bdata: 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 + dtype: f8 + - color: "#2e91e5" + colorscale: + - - 0.0 + - "#00b050" + - - 0.16 + - "#00b050" + - - 0.26 + - "#dddddd" + - - 0.74 + - "#dddddd" + - - 0.8400000000000001 + - "#e71111" + - - 1.0 + - "#e71111" + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene2 + showlegend: false + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + - facecolor: + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - "#461567" + - "#461567" + - "#461567" + - "#461567" + - "#461567" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#423a81" + - "#423a81" + - "#423a81" + - "#423a81" + - "#423a81" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#461567" + - "#461567" + - "#461567" + - "#461567" + - "#461567" + - "#472071" + - "#472071" + - "#472071" + - "#472071" + - "#472071" + - "#1f9e89" + - "#1f9e89" + - "#1f9e89" + - "#1f9e89" + - "#1f9e89" + - "#472071" + - "#472071" + - "#472071" + - "#472071" + - "#472071" + - "#471f70" + - "#471f70" + - "#471f70" + - "#471f70" + - "#471f70" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#9ed93a" + - "#9ed93a" + - "#9ed93a" + - "#9ed93a" + - "#9ed93a" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#471f70" + - "#471f70" + - "#471f70" + - "#471f70" + - "#471f70" + - "#472071" + - "#472071" + - "#472071" + - "#472071" + - "#472071" + - "#1f9e89" + - "#1f9e89" + - "#1f9e89" + - "#1f9e89" + - "#1f9e89" + - "#472071" + - "#472071" + - "#472071" + - "#472071" + - "#472071" + - "#461567" + - "#461567" + - "#461567" + - "#461567" + - "#461567" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#423a81" + - "#423a81" + - "#423a81" + - "#423a81" + - "#423a81" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#462e7b" + - "#461567" + - "#461567" + - "#461567" + - "#461567" + - "#461567" + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYAmACZAJoAmwCcAJ4AnwCgAKEAogCkAKUApgCnAKgAqgCrAKwArQCuALAAsQCyALMAtAC2ALcAuAC5ALoAvAC9AL4AvwDAAMIAwwDEAMUAxgDIAMkAygDLAMwAzgDPANAA0QDSANQA1QDWANcA2ADaANsA3ADdAN4A + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIAmQCaAJsAnACYAJ8AoAChAKIAngClAKYApwCoAKQAqwCsAK0ArgCqALEAsgCzALQAsAC3ALgAuQC6ALYAvQC+AL8AwAC8AMMAxADFAMYAwgDJAMoAywDMAMgAzwDQANEA0gDOANUA1gDXANgA1ADbANwA3QDeANoA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcAnQCdAJ0AnQCdAKMAowCjAKMAowCpAKkAqQCpAKkArwCvAK8ArwCvALUAtQC1ALUAtQC7ALsAuwC7ALsAwQDBAMEAwQDBAMcAxwDHAMcAxwDNAM0AzQDNAM0A0wDTANMA0wDTANkA2QDZANkA2QDfAN8A3wDfAN8A + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (False) + opacity: 1 + scene: scene2 + showlegend: true + type: mesh3d + x: + bdata: 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 + dtype: f8 + y: + bdata: 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 + dtype: f8 + z: + bdata: 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 + dtype: f8 layout: legend: itemsizing: constant @@ -767,30 +767,30 @@ layout: z: 1.4 domain: x: - - 0.0 - - 0.45 + - 0.0 + - 0.45 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.288849940910414 - - 1.2677387624450005 + - -1.288849940910414 + - 1.2677387624450005 title: text: x (m) yaxis: autorange: false range: - - -1.2782943516777072 - - 1.2782943516777072 + - -1.2782943516777072 + - 1.2782943516777072 title: text: y (m) zaxis: autorange: false range: - - -1.2782943516777072 - - 1.2782943516777072 + - -1.2782943516777072 + - 1.2782943516777072 title: text: z (m) scene2: @@ -806,402 +806,402 @@ layout: z: 1.4 domain: x: - - 0.55 - - 1.0 + - 0.55 + - 1.0 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.288849940910414 - - 1.2677387624450005 + - -1.288849940910414 + - 1.2677387624450005 title: text: x (m) yaxis: autorange: false range: - - -1.2782943516777072 - - 1.2782943516777072 + - -1.2782943516777072 + - 1.2782943516777072 title: text: y (m) zaxis: autorange: false range: - - -1.2782943516777072 - - 1.2782943516777072 + - -1.2782943516777072 + - 1.2782943516777072 title: text: z (m) template: data: bar: - - error_x: - color: '#2a3f5f' - error_y: - color: '#2a3f5f' - marker: - line: - color: '#E5ECF6' - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: bar + - error_x: + color: "#2a3f5f" + error_y: + color: "#2a3f5f" + marker: + line: + color: "#E5ECF6" + width: 0.5 + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: bar barpolar: - - marker: - line: - color: '#E5ECF6' - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: barpolar + - marker: + line: + color: "#E5ECF6" + width: 0.5 + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: barpolar carpet: - - aaxis: - endlinecolor: '#2a3f5f' - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: '#2a3f5f' - baxis: - endlinecolor: '#2a3f5f' - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: '#2a3f5f' - type: carpet + - aaxis: + endlinecolor: "#2a3f5f" + gridcolor: white + linecolor: white + minorgridcolor: white + startlinecolor: "#2a3f5f" + baxis: + endlinecolor: "#2a3f5f" + gridcolor: white + linecolor: white + minorgridcolor: white + startlinecolor: "#2a3f5f" + type: carpet choropleth: - - colorbar: - outlinewidth: 0 - ticks: '' - type: choropleth + - colorbar: + outlinewidth: 0 + ticks: "" + type: choropleth contour: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: contour + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: contour contourcarpet: - - colorbar: - outlinewidth: 0 - ticks: '' - type: contourcarpet + - colorbar: + outlinewidth: 0 + ticks: "" + type: contourcarpet heatmap: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: heatmap + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: heatmap histogram: - - marker: - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: histogram + - marker: + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: histogram histogram2d: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: histogram2d + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: histogram2d histogram2dcontour: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: histogram2dcontour + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: histogram2dcontour mesh3d: - - colorbar: - outlinewidth: 0 - ticks: '' - type: mesh3d - parcoords: - - line: - colorbar: + - colorbar: outlinewidth: 0 - ticks: '' - type: parcoords + ticks: "" + type: mesh3d + parcoords: + - line: + colorbar: + outlinewidth: 0 + ticks: "" + type: parcoords pie: - - automargin: true - type: pie + - automargin: true + type: pie scatter: - - fillpattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: scatter + - fillpattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: scatter scatter3d: - - line: - colorbar: - outlinewidth: 0 - ticks: '' - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatter3d + - line: + colorbar: + outlinewidth: 0 + ticks: "" + marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scatter3d scattercarpet: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattercarpet + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattercarpet scattergeo: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattergeo + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattergeo scattergl: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattergl + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattergl scattermap: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattermap + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattermap scattermapbox: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattermapbox + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattermapbox scatterpolar: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterpolar + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scatterpolar scatterpolargl: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterpolargl + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scatterpolargl scatterternary: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterternary + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scatterternary surface: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: surface + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: surface table: - - cells: - fill: - color: '#EBF0F8' - line: - color: white - header: - fill: - color: '#C8D4E3' - line: - color: white - type: table + - cells: + fill: + color: "#EBF0F8" + line: + color: white + header: + fill: + color: "#C8D4E3" + line: + color: white + type: table layout: annotationdefaults: - arrowcolor: '#2a3f5f' + arrowcolor: "#2a3f5f" arrowhead: 0 arrowwidth: 1 autotypenumbers: strict coloraxis: colorbar: outlinewidth: 0 - ticks: '' + ticks: "" colorscale: diverging: - - - 0 - - '#8e0152' - - - 0.1 - - '#c51b7d' - - - 0.2 - - '#de77ae' - - - 0.3 - - '#f1b6da' - - - 0.4 - - '#fde0ef' - - - 0.5 - - '#f7f7f7' - - - 0.6 - - '#e6f5d0' - - - 0.7 - - '#b8e186' - - - 0.8 - - '#7fbc41' - - - 0.9 - - '#4d9221' - - - 1 - - '#276419' + - - 0 + - "#8e0152" + - - 0.1 + - "#c51b7d" + - - 0.2 + - "#de77ae" + - - 0.3 + - "#f1b6da" + - - 0.4 + - "#fde0ef" + - - 0.5 + - "#f7f7f7" + - - 0.6 + - "#e6f5d0" + - - 0.7 + - "#b8e186" + - - 0.8 + - "#7fbc41" + - - 0.9 + - "#4d9221" + - - 1 + - "#276419" sequential: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" sequentialminus: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" colorway: - - '#636efa' - - '#EF553B' - - '#00cc96' - - '#ab63fa' - - '#FFA15A' - - '#19d3f3' - - '#FF6692' - - '#B6E880' - - '#FF97FF' - - '#FECB52' + - "#636efa" + - "#EF553B" + - "#00cc96" + - "#ab63fa" + - "#FFA15A" + - "#19d3f3" + - "#FF6692" + - "#B6E880" + - "#FF97FF" + - "#FECB52" font: - color: '#2a3f5f' + color: "#2a3f5f" geo: bgcolor: white lakecolor: white - landcolor: '#E5ECF6' + landcolor: "#E5ECF6" showlakes: true showland: true subunitcolor: white @@ -1211,66 +1211,66 @@ layout: mapbox: style: light paper_bgcolor: white - plot_bgcolor: '#E5ECF6' + plot_bgcolor: "#E5ECF6" polar: angularaxis: gridcolor: white linecolor: white - ticks: '' - bgcolor: '#E5ECF6' + ticks: "" + bgcolor: "#E5ECF6" radialaxis: gridcolor: white linecolor: white - ticks: '' + ticks: "" scene: xaxis: - backgroundcolor: '#E5ECF6' + backgroundcolor: "#E5ECF6" gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: '' + ticks: "" zerolinecolor: white yaxis: - backgroundcolor: '#E5ECF6' + backgroundcolor: "#E5ECF6" gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: '' + ticks: "" zerolinecolor: white zaxis: - backgroundcolor: '#E5ECF6' + backgroundcolor: "#E5ECF6" gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: '' + ticks: "" zerolinecolor: white shapedefaults: line: - color: '#2a3f5f' + color: "#2a3f5f" ternary: aaxis: gridcolor: white linecolor: white - ticks: '' + ticks: "" baxis: gridcolor: white linecolor: white - ticks: '' - bgcolor: '#E5ECF6' + ticks: "" + bgcolor: "#E5ECF6" caxis: gridcolor: white linecolor: white - ticks: '' + ticks: "" title: x: 0.05 xaxis: automargin: true gridcolor: white linecolor: white - ticks: '' + ticks: "" title: standoff: 15 zerolinecolor: white @@ -1279,7 +1279,7 @@ layout: automargin: true gridcolor: white linecolor: white - ticks: '' + ticks: "" title: standoff: 15 zerolinecolor: white diff --git a/tests/test_display_plotly/test_pixel_field_sizing_modes.yml b/tests/test_display_plotly/test_pixel_field_sizing_modes.yml index adcd92af0..123d7c0d4 100644 --- a/tests/test_display_plotly/test_pixel_field_sizing_modes.yml +++ b/tests/test_display_plotly/test_pixel_field_sizing_modes.yml @@ -1,880 +1,880 @@ data: -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene - showlegend: true - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (constant) - opacity: 1 - scene: scene - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene2 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (log) - opacity: 1 - scene: scene2 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P2yOkLu35+6/PRjq5fId8b9H9mtyqcryv7BpE/yHKfK/n+W43TsZ8L/JighgTsDtvwWRxrHDcPW/BZHGscNw9b8Gkcaxw3D1vwaRxrHDcPW/BZHGscNw9b/23XKceB7lv2yOkLu35+6/n+W43TsZ8L+waRP8hynyv0f2a3KpyvK/PRjq5fId8b/JighgTsDtv0oyfKGlUtE/STJ8oaVS0T9JMnyhpVLRP0kyfKGlUtE/STJ8oaVS0T9JMnyhpVLRv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgP0oyfKGlUtE/STJ8oaVS0T9JMnyhpVLRP0kyfKGlUtE/STJ8oaVS0T9JMnyhpVLRv8q4NyIkjPA/wjSORIjN7z+gLNkH8KzrP3ITKButauo/hc8rNBrE7T+cuvvP2B/xP/bdcpx4HuU/9t1ynHge5T/13XKceB7lP/Xdcpx4HuU/9t1ynHge5T8Fkcaxw3D1P8q4NyIkjPA/hs8rNBrE7T9yEygbrWrqP58s2QfwrOs/wjSORIjN7z+cuvvP2B/xPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPBK0dPrdC/S/5uYGtWiD87+a5dFgHPryv1tUmMm2LfO/aLAtmefW878RMfjRZfrovwAAAAAAAAAAHgNcCGSyxD/qJO7PK5W5P+ck7s8rlbm/HwNcCGSyxL8AAAAAAAAAABK0dPrdC/Q/aLAtmefW8z9bVJjJti3zP5rl0WAc+vI/5uYGtWiD8z8RMfjRZfroPwAAAAAAAPC/2zjfmpnh67/5oDtQWHTtv4Mv4tfTRfG/k2OQMjMP8r8AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/kmOQMjMP8j+EL+LX00XxP/mgO1BYdO0/2zjfmpnh6z8AAAAAAADwP9yXFgtE6Oe/MJ+kzTBS6L9KV89skqTpv8w0XD7HC+q/MzLylS756L945wMXzYLzvwAAAAAAAAAAHgNcCGSyxD/qJO7PK5W5P+ck7s8rlbm/HwNcCGSyxL8AAAAAAAAAANyXFgtE6Oc/MzLylS756D/MNFw+xwvqP0pXz2ySpOk/MJ+kzTBS6D945wMXzYLzPw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vL6pu/+M/aG/xXLTBRV+vb/7Rmss3Xaivz9DlJxmybc/1KdSf+Putz+O2HeynB6GPBhEGscOw8W/JIELwDTmqr9NApCTFJvBP04CkJMUm8E/H4ELwDTmqr8VRBrHDsOVPL6pu/+M/aG/0qdSf+Putz9BQ5ScZsm3P/dGayzddqK/xnLTBRV+vb+O2HeynB6GPEcyfKGlUsE/h/G7b4ZppT8UK1rZaAe8vxUrWtloB7y/g/G7b4ZppT9JMnyhpVKRPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPEcyfKGlUsE/h/G7b4ZppT8UK1rZaAe8vxUrWtloB7y/g/G7b4ZppT9JMnyhpVKRPL6pu/+M/aG/0qdSf+Putz9BQ5ScZsm3P/dGayzddqK/xnLTBRV+vb+O2HeynB6GPBhEGscOw8W/JIELwDTmqr9NApCTFJvBP04CkJMUm8E/H4ELwDTmqr8VRBrHDsOVPL6pu/+M/aG/xXLTBRV+vb/7Rmss3Xaivz9DlJxmybc/1KdSf+Putz+O2HeynB6GPA== - dtype: f8 -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene3 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (linear) - opacity: 1 - scene: scene3 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P+gO76zh1u+/5iMtI/Mp8L8E13vz12jwvx1HZ4A0UfC/gMe2r7MD8L/PkoAni6vvvxmZey4NnvG/GZl7Lg2e8b8ZmXsuDZ7xvxmZey4NnvG/GZl7Lg2e8b/PzQij5cPsv+gO76zh1u+/gMe2r7MD8L8dR2eANFHwvwTXe/PXaPC/5iMtI/Mp8L/PkoAni6vvv4uRuefS4Kk/ipG559LgqT+Jkbnn0uCpP4mRuefS4Kk/ipG559LgqT+Kkbnn0uCpv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgP4uRuefS4Kk/ipG559LgqT+Jkbnn0uCpP4mRuefS4Kk/ipG559LgqT+Kkbnn0uCpv4x4iCmPFPA/AXGSoJj47z/GcTH/ll3vP/hRCBlQLu8/NbiluRms7z+Ytj9sOirwP8/NCKPlw+w/z80Io+XD7D/PzQij5cPsP8/NCKPlw+w/z80Io+XD7D8ZmXsuDZ7xP4x4iCmPFPA/NbiluRms7z/4UQgZUC7vP8ZxMf+WXe8/AXGSoJj47z+Ytj9sOirwPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPI5qty73l/C/pR14V/KD8L9oMXvzzW/wv5odn/dfd/C/k5kiHjKQ8L+wn9T5SPjuvwAAAAAAAAAAOsnC9pScqD9XEkqQ8mueP1MSSpDya56/OsnC9pScqL8AAAAAAAAAAI5qty73l/A/k5kiHjKQ8D+aHZ/3X3fwP2gxe/PNb/A/pR14V/KD8D+wn9T5SPjuPwAAAAAAAPC/tulJWBs777+31741UIbvvyWUIOXXPPC/JQvbU3Ji8L8AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/JQvbU3Ji8D8llCDl1zzwP7fXvjVQhu8/tulJWBs77z8AAAAAAADwP+QqkaIR0O6/2sy6w5vf7r/MxMEQQBHvvy+dCRlkIO+/tcQPURv47r8osBWD24PwvwAAAAAAAAAAOsnC9pScqD9XEkqQ8mueP1MSSpDya56/OsnC9pScqL8AAAAAAAAAAOQqkaIR0O4/tcQPURv47j8vnQkZZCDvP8zEwRBAEe8/2sy6w5vf7j8osBWD24PwPw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vD5M2x82HXW/WmBbIYBOkb+NiS6Tlqt1v9Wbt7Wz6os/tA+E5rIWjD83nt1ez/VZPI2RuefS4Km/ca2wjLv8j78a9AhXmO+kPxv0CFeY76Q/a62wjLv8j7+Kkbnn0uB5PD5M2x82HXW/sQ+E5rIWjD/Xm7e1s+qLP4mJLpOWq3W/WmBbIYBOkb83nt1ez/VZPIeRuefS4Jk/V62wjLv8fz8g9AhXmO+UvyH0CFeY75S/Ua2wjLv8fz+Kkbnn0uBpPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPIeRuefS4Jk/V62wjLv8fz8g9AhXmO+UvyH0CFeY75S/Ua2wjLv8fz+Kkbnn0uBpPD5M2x82HXW/sQ+E5rIWjD/Xm7e1s+qLP4mJLpOWq3W/WmBbIYBOkb83nt1ez/VZPI2RuefS4Km/ca2wjLv8j78a9AhXmO+kPxv0CFeY76Q/a62wjLv8j7+Kkbnn0uB5PD5M2x82HXW/WmBbIYBOkb+NiS6Tlqt1v9Wbt7Wz6os/tA+E5rIWjD83nt1ez/VZPA== - dtype: f8 + - color: "#2e91e5" + colorscale: + - - 0.0 + - "#00b050" + - - 0.16 + - "#00b050" + - - 0.26 + - "#dddddd" + - - 0.74 + - "#dddddd" + - - 0.8400000000000001 + - "#e71111" + - - 1.0 + - "#e71111" + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene + showlegend: true + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + - facecolor: + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - "#e15f99" + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (constant) + opacity: 1 + scene: scene + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== + dtype: f8 + - color: "#2e91e5" + colorscale: + - - 0.0 + - "#00b050" + - - 0.16 + - "#00b050" + - - 0.26 + - "#dddddd" + - - 0.74 + - "#dddddd" + - - 0.8400000000000001 + - "#e71111" + - - 1.0 + - "#e71111" + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene2 + showlegend: false + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + - facecolor: + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - "#1ca71c" + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (log) + opacity: 1 + scene: scene2 + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P2yOkLu35+6/PRjq5fId8b9H9mtyqcryv7BpE/yHKfK/n+W43TsZ8L/JighgTsDtvwWRxrHDcPW/BZHGscNw9b8Gkcaxw3D1vwaRxrHDcPW/BZHGscNw9b/23XKceB7lv2yOkLu35+6/n+W43TsZ8L+waRP8hynyv0f2a3KpyvK/PRjq5fId8b/JighgTsDtv0oyfKGlUtE/STJ8oaVS0T9JMnyhpVLRP0kyfKGlUtE/STJ8oaVS0T9JMnyhpVLRv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgP0oyfKGlUtE/STJ8oaVS0T9JMnyhpVLRP0kyfKGlUtE/STJ8oaVS0T9JMnyhpVLRv8q4NyIkjPA/wjSORIjN7z+gLNkH8KzrP3ITKButauo/hc8rNBrE7T+cuvvP2B/xP/bdcpx4HuU/9t1ynHge5T/13XKceB7lP/Xdcpx4HuU/9t1ynHge5T8Fkcaxw3D1P8q4NyIkjPA/hs8rNBrE7T9yEygbrWrqP58s2QfwrOs/wjSORIjN7z+cuvvP2B/xPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPBK0dPrdC/S/5uYGtWiD87+a5dFgHPryv1tUmMm2LfO/aLAtmefW878RMfjRZfrovwAAAAAAAAAAHgNcCGSyxD/qJO7PK5W5P+ck7s8rlbm/HwNcCGSyxL8AAAAAAAAAABK0dPrdC/Q/aLAtmefW8z9bVJjJti3zP5rl0WAc+vI/5uYGtWiD8z8RMfjRZfroPwAAAAAAAPC/2zjfmpnh67/5oDtQWHTtv4Mv4tfTRfG/k2OQMjMP8r8AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/kmOQMjMP8j+EL+LX00XxP/mgO1BYdO0/2zjfmpnh6z8AAAAAAADwP9yXFgtE6Oe/MJ+kzTBS6L9KV89skqTpv8w0XD7HC+q/MzLylS756L945wMXzYLzvwAAAAAAAAAAHgNcCGSyxD/qJO7PK5W5P+ck7s8rlbm/HwNcCGSyxL8AAAAAAAAAANyXFgtE6Oc/MzLylS756D/MNFw+xwvqP0pXz2ySpOk/MJ+kzTBS6D945wMXzYLzPw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vL6pu/+M/aG/xXLTBRV+vb/7Rmss3Xaivz9DlJxmybc/1KdSf+Putz+O2HeynB6GPBhEGscOw8W/JIELwDTmqr9NApCTFJvBP04CkJMUm8E/H4ELwDTmqr8VRBrHDsOVPL6pu/+M/aG/0qdSf+Putz9BQ5ScZsm3P/dGayzddqK/xnLTBRV+vb+O2HeynB6GPEcyfKGlUsE/h/G7b4ZppT8UK1rZaAe8vxUrWtloB7y/g/G7b4ZppT9JMnyhpVKRPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPEcyfKGlUsE/h/G7b4ZppT8UK1rZaAe8vxUrWtloB7y/g/G7b4ZppT9JMnyhpVKRPL6pu/+M/aG/0qdSf+Putz9BQ5ScZsm3P/dGayzddqK/xnLTBRV+vb+O2HeynB6GPBhEGscOw8W/JIELwDTmqr9NApCTFJvBP04CkJMUm8E/H4ELwDTmqr8VRBrHDsOVPL6pu/+M/aG/xXLTBRV+vb/7Rmss3Xaivz9DlJxmybc/1KdSf+Putz+O2HeynB6GPA== + dtype: f8 + - color: "#2e91e5" + colorscale: + - - 0.0 + - "#00b050" + - - 0.16 + - "#00b050" + - - 0.26 + - "#dddddd" + - - 0.74 + - "#dddddd" + - - 0.8400000000000001 + - "#e71111" + - - 1.0 + - "#e71111" + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene3 + showlegend: false + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + - facecolor: + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - "#fb0d0d" + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#fde725" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#450e60" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#45327d" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + - "#440154" + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (linear) + opacity: 1 + scene: scene3 + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P+gO76zh1u+/5iMtI/Mp8L8E13vz12jwvx1HZ4A0UfC/gMe2r7MD8L/PkoAni6vvvxmZey4NnvG/GZl7Lg2e8b8ZmXsuDZ7xvxmZey4NnvG/GZl7Lg2e8b/PzQij5cPsv+gO76zh1u+/gMe2r7MD8L8dR2eANFHwvwTXe/PXaPC/5iMtI/Mp8L/PkoAni6vvv4uRuefS4Kk/ipG559LgqT+Jkbnn0uCpP4mRuefS4Kk/ipG559LgqT+Kkbnn0uCpv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgP4uRuefS4Kk/ipG559LgqT+Jkbnn0uCpP4mRuefS4Kk/ipG559LgqT+Kkbnn0uCpv4x4iCmPFPA/AXGSoJj47z/GcTH/ll3vP/hRCBlQLu8/NbiluRms7z+Ytj9sOirwP8/NCKPlw+w/z80Io+XD7D/PzQij5cPsP8/NCKPlw+w/z80Io+XD7D8ZmXsuDZ7xP4x4iCmPFPA/NbiluRms7z/4UQgZUC7vP8ZxMf+WXe8/AXGSoJj47z+Ytj9sOirwPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPI5qty73l/C/pR14V/KD8L9oMXvzzW/wv5odn/dfd/C/k5kiHjKQ8L+wn9T5SPjuvwAAAAAAAAAAOsnC9pScqD9XEkqQ8mueP1MSSpDya56/OsnC9pScqL8AAAAAAAAAAI5qty73l/A/k5kiHjKQ8D+aHZ/3X3fwP2gxe/PNb/A/pR14V/KD8D+wn9T5SPjuPwAAAAAAAPC/tulJWBs777+31741UIbvvyWUIOXXPPC/JQvbU3Ji8L8AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/JQvbU3Ji8D8llCDl1zzwP7fXvjVQhu8/tulJWBs77z8AAAAAAADwP+QqkaIR0O6/2sy6w5vf7r/MxMEQQBHvvy+dCRlkIO+/tcQPURv47r8osBWD24PwvwAAAAAAAAAAOsnC9pScqD9XEkqQ8mueP1MSSpDya56/OsnC9pScqL8AAAAAAAAAAOQqkaIR0O4/tcQPURv47j8vnQkZZCDvP8zEwRBAEe8/2sy6w5vf7j8osBWD24PwPw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vD5M2x82HXW/WmBbIYBOkb+NiS6Tlqt1v9Wbt7Wz6os/tA+E5rIWjD83nt1ez/VZPI2RuefS4Km/ca2wjLv8j78a9AhXmO+kPxv0CFeY76Q/a62wjLv8j7+Kkbnn0uB5PD5M2x82HXW/sQ+E5rIWjD/Xm7e1s+qLP4mJLpOWq3W/WmBbIYBOkb83nt1ez/VZPIeRuefS4Jk/V62wjLv8fz8g9AhXmO+UvyH0CFeY75S/Ua2wjLv8fz+Kkbnn0uBpPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPIeRuefS4Jk/V62wjLv8fz8g9AhXmO+UvyH0CFeY75S/Ua2wjLv8fz+Kkbnn0uBpPD5M2x82HXW/sQ+E5rIWjD/Xm7e1s+qLP4mJLpOWq3W/WmBbIYBOkb83nt1ez/VZPI2RuefS4Km/ca2wjLv8j78a9AhXmO+kPxv0CFeY76Q/a62wjLv8j7+Kkbnn0uB5PD5M2x82HXW/WmBbIYBOkb+NiS6Tlqt1v9Wbt7Wz6os/tA+E5rIWjD83nt1ez/VZPA== + dtype: f8 layout: legend: itemsizing: constant @@ -891,30 +891,30 @@ layout: z: 1.4 domain: x: - - 0.0 - - 0.2888888888888889 + - 0.0 + - 0.2888888888888889 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: x (m) yaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: y (m) zaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: z (m) scene2: @@ -930,30 +930,30 @@ layout: z: 1.4 domain: x: - - 0.35555555555555557 - - 0.6444444444444445 + - 0.35555555555555557 + - 0.6444444444444445 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.340030378757605 - - 1.340030378757605 + - -1.340030378757605 + - 1.340030378757605 title: text: x (m) yaxis: autorange: false range: - - -1.340030378757605 - - 1.340030378757605 + - -1.340030378757605 + - 1.340030378757605 title: text: y (m) zaxis: autorange: false range: - - -1.340030378757605 - - 1.340030378757605 + - -1.340030378757605 + - 1.340030378757605 title: text: z (m) scene3: @@ -969,402 +969,402 @@ layout: z: 1.4 domain: x: - - 0.7111111111111111 - - 1.0 + - 0.7111111111111111 + - 1.0 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.1010867896780552 - - 1.1010867896780552 + - -1.1010867896780552 + - 1.1010867896780552 title: text: x (m) yaxis: autorange: false range: - - -1.1010867896780552 - - 1.1010867896780552 + - -1.1010867896780552 + - 1.1010867896780552 title: text: y (m) zaxis: autorange: false range: - - -1.1010867896780552 - - 1.1010867896780552 + - -1.1010867896780552 + - 1.1010867896780552 title: text: z (m) template: data: bar: - - error_x: - color: '#2a3f5f' - error_y: - color: '#2a3f5f' - marker: - line: - color: '#E5ECF6' - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: bar + - error_x: + color: "#2a3f5f" + error_y: + color: "#2a3f5f" + marker: + line: + color: "#E5ECF6" + width: 0.5 + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: bar barpolar: - - marker: - line: - color: '#E5ECF6' - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: barpolar + - marker: + line: + color: "#E5ECF6" + width: 0.5 + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: barpolar carpet: - - aaxis: - endlinecolor: '#2a3f5f' - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: '#2a3f5f' - baxis: - endlinecolor: '#2a3f5f' - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: '#2a3f5f' - type: carpet + - aaxis: + endlinecolor: "#2a3f5f" + gridcolor: white + linecolor: white + minorgridcolor: white + startlinecolor: "#2a3f5f" + baxis: + endlinecolor: "#2a3f5f" + gridcolor: white + linecolor: white + minorgridcolor: white + startlinecolor: "#2a3f5f" + type: carpet choropleth: - - colorbar: - outlinewidth: 0 - ticks: '' - type: choropleth + - colorbar: + outlinewidth: 0 + ticks: "" + type: choropleth contour: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: contour + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: contour contourcarpet: - - colorbar: - outlinewidth: 0 - ticks: '' - type: contourcarpet + - colorbar: + outlinewidth: 0 + ticks: "" + type: contourcarpet heatmap: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: heatmap + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: heatmap histogram: - - marker: - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: histogram + - marker: + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: histogram histogram2d: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: histogram2d + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: histogram2d histogram2dcontour: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: histogram2dcontour + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: histogram2dcontour mesh3d: - - colorbar: - outlinewidth: 0 - ticks: '' - type: mesh3d - parcoords: - - line: - colorbar: + - colorbar: outlinewidth: 0 - ticks: '' - type: parcoords + ticks: "" + type: mesh3d + parcoords: + - line: + colorbar: + outlinewidth: 0 + ticks: "" + type: parcoords pie: - - automargin: true - type: pie + - automargin: true + type: pie scatter: - - fillpattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: scatter + - fillpattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: scatter scatter3d: - - line: - colorbar: - outlinewidth: 0 - ticks: '' - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatter3d + - line: + colorbar: + outlinewidth: 0 + ticks: "" + marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scatter3d scattercarpet: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattercarpet + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattercarpet scattergeo: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattergeo + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattergeo scattergl: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattergl + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattergl scattermap: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattermap + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattermap scattermapbox: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattermapbox + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scattermapbox scatterpolar: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterpolar + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scatterpolar scatterpolargl: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterpolargl + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scatterpolargl scatterternary: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterternary + - marker: + colorbar: + outlinewidth: 0 + ticks: "" + type: scatterternary surface: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: surface + - colorbar: + outlinewidth: 0 + ticks: "" + colorscale: + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" + type: surface table: - - cells: - fill: - color: '#EBF0F8' - line: - color: white - header: - fill: - color: '#C8D4E3' - line: - color: white - type: table + - cells: + fill: + color: "#EBF0F8" + line: + color: white + header: + fill: + color: "#C8D4E3" + line: + color: white + type: table layout: annotationdefaults: - arrowcolor: '#2a3f5f' + arrowcolor: "#2a3f5f" arrowhead: 0 arrowwidth: 1 autotypenumbers: strict coloraxis: colorbar: outlinewidth: 0 - ticks: '' + ticks: "" colorscale: diverging: - - - 0 - - '#8e0152' - - - 0.1 - - '#c51b7d' - - - 0.2 - - '#de77ae' - - - 0.3 - - '#f1b6da' - - - 0.4 - - '#fde0ef' - - - 0.5 - - '#f7f7f7' - - - 0.6 - - '#e6f5d0' - - - 0.7 - - '#b8e186' - - - 0.8 - - '#7fbc41' - - - 0.9 - - '#4d9221' - - - 1 - - '#276419' + - - 0 + - "#8e0152" + - - 0.1 + - "#c51b7d" + - - 0.2 + - "#de77ae" + - - 0.3 + - "#f1b6da" + - - 0.4 + - "#fde0ef" + - - 0.5 + - "#f7f7f7" + - - 0.6 + - "#e6f5d0" + - - 0.7 + - "#b8e186" + - - 0.8 + - "#7fbc41" + - - 0.9 + - "#4d9221" + - - 1 + - "#276419" sequential: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" sequentialminus: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' + - - 0.0 + - "#0d0887" + - - 0.1111111111111111 + - "#46039f" + - - 0.2222222222222222 + - "#7201a8" + - - 0.3333333333333333 + - "#9c179e" + - - 0.4444444444444444 + - "#bd3786" + - - 0.5555555555555556 + - "#d8576b" + - - 0.6666666666666666 + - "#ed7953" + - - 0.7777777777777778 + - "#fb9f3a" + - - 0.8888888888888888 + - "#fdca26" + - - 1.0 + - "#f0f921" colorway: - - '#636efa' - - '#EF553B' - - '#00cc96' - - '#ab63fa' - - '#FFA15A' - - '#19d3f3' - - '#FF6692' - - '#B6E880' - - '#FF97FF' - - '#FECB52' + - "#636efa" + - "#EF553B" + - "#00cc96" + - "#ab63fa" + - "#FFA15A" + - "#19d3f3" + - "#FF6692" + - "#B6E880" + - "#FF97FF" + - "#FECB52" font: - color: '#2a3f5f' + color: "#2a3f5f" geo: bgcolor: white lakecolor: white - landcolor: '#E5ECF6' + landcolor: "#E5ECF6" showlakes: true showland: true subunitcolor: white @@ -1374,66 +1374,66 @@ layout: mapbox: style: light paper_bgcolor: white - plot_bgcolor: '#E5ECF6' + plot_bgcolor: "#E5ECF6" polar: angularaxis: gridcolor: white linecolor: white - ticks: '' - bgcolor: '#E5ECF6' + ticks: "" + bgcolor: "#E5ECF6" radialaxis: gridcolor: white linecolor: white - ticks: '' + ticks: "" scene: xaxis: - backgroundcolor: '#E5ECF6' + backgroundcolor: "#E5ECF6" gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: '' + ticks: "" zerolinecolor: white yaxis: - backgroundcolor: '#E5ECF6' + backgroundcolor: "#E5ECF6" gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: '' + ticks: "" zerolinecolor: white zaxis: - backgroundcolor: '#E5ECF6' + backgroundcolor: "#E5ECF6" gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: '' + ticks: "" zerolinecolor: white shapedefaults: line: - color: '#2a3f5f' + color: "#2a3f5f" ternary: aaxis: gridcolor: white linecolor: white - ticks: '' + ticks: "" baxis: gridcolor: white linecolor: white - ticks: '' - bgcolor: '#E5ECF6' + ticks: "" + bgcolor: "#E5ECF6" caxis: gridcolor: white linecolor: white - ticks: '' + ticks: "" title: x: 0.05 xaxis: automargin: true gridcolor: white linecolor: white - ticks: '' + ticks: "" title: standoff: 15 zerolinecolor: white @@ -1442,7 +1442,7 @@ layout: automargin: true gridcolor: white linecolor: white - ticks: '' + ticks: "" title: standoff: 15 zerolinecolor: white From ccb448126aeb2d0604839e39fc0885e7883827b7 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sun, 18 May 2025 10:39:10 +0200 Subject: [PATCH 167/211] prevent prettier from formatting fig data regression files --- .pre-commit-config.yaml | 4 +- .../test_field_coloring_subplot.yml | 3102 ++++++++--------- .../test_pixel_field_color_scales.yml | 3102 ++++++++--------- .../test_pixel_field_directional_symbols.yml | 3100 ++++++++-------- .../test_pixel_field_null_values.yml | 2230 ++++++------ .../test_pixel_field_sizing_modes.yml | 2498 ++++++------- 6 files changed, 7019 insertions(+), 7017 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 245c50e1e..123e08ba1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -40,7 +40,9 @@ repos: - id: prettier types_or: [yaml, markdown, html, css, scss, javascript, json] args: [--prose-wrap=always] - exclude: ^docs/ # messes up colon fences for grids in docs + # Exclude docs (messes up colon fences for grids) + # Excclude test YAML files from formatting (messes up fig data diffs) + exclude: ^docs/|^tests/.*\.ya?ml$ - repo: https://github.com/astral-sh/ruff-pre-commit rev: "v0.11.5" diff --git a/tests/test_display_plotly/test_field_coloring_subplot.yml b/tests/test_display_plotly/test_field_coloring_subplot.yml index 84a4659f1..77a5ed01a 100644 --- a/tests/test_display_plotly/test_field_coloring_subplot.yml +++ b/tests/test_display_plotly/test_field_coloring_subplot.yml @@ -1,1172 +1,1172 @@ data: - - color: "#2e91e5" - colorscale: - - - 0.0 - - "#00b050" - - - 0.16 - - "#00b050" - - - 0.26 - - "#dddddd" - - - 0.74 - - "#dddddd" - - - 0.8400000000000001 - - "#e71111" - - - 1.0 - - "#e71111" - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene - showlegend: true - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - - facecolor: - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#34628d" - - "#34628d" - - "#34628d" - - "#34628d" - - "#34628d" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#471c6d" - - "#471c6d" - - "#471c6d" - - "#471c6d" - - "#471c6d" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#471c6d" - - "#471c6d" - - "#471c6d" - - "#471c6d" - - "#471c6d" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#34628d" - - "#34628d" - - "#34628d" - - "#34628d" - - "#34628d" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (H) - opacity: 1 - scene: scene - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 - - color: "#2e91e5" - colorscale: - - - 0.0 - - "#00b050" - - - 0.16 - - "#00b050" - - - 0.26 - - "#dddddd" - - - 0.74 - - "#dddddd" - - - 0.8400000000000001 - - "#e71111" - - - 1.0 - - "#e71111" - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene2 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - - facecolor: - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (Jxy) - opacity: 1 - scene: scene2 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 - - color: "#2e91e5" - colorscale: - - - 0.0 - - "#00b050" - - - 0.16 - - "#00b050" - - - 0.26 - - "#dddddd" - - - 0.74 - - "#dddddd" - - - 0.8400000000000001 - - "#e71111" - - - 1.0 - - "#e71111" - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene3 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - - facecolor: - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (Bz) - opacity: 1 - scene: scene3 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 - - color: "#2e91e5" - colorscale: - - - 0.0 - - "#00b050" - - - 0.16 - - "#00b050" - - - 0.26 - - "#dddddd" - - - 0.74 - - "#dddddd" - - - 0.8400000000000001 - - "#e71111" - - - 1.0 - - "#e71111" - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene4 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - - facecolor: - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (False) - opacity: 1 - scene: scene4 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 +- color: '#2e91e5' + colorscale: + - - 0.0 + - '#00b050' + - - 0.16 + - '#00b050' + - - 0.26 + - '#dddddd' + - - 0.74 + - '#dddddd' + - - 0.8400000000000001 + - '#e71111' + - - 1.0 + - '#e71111' + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene + showlegend: true + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 +- facecolor: + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#34628d' + - '#34628d' + - '#34628d' + - '#34628d' + - '#34628d' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#471c6d' + - '#471c6d' + - '#471c6d' + - '#471c6d' + - '#471c6d' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#471c6d' + - '#471c6d' + - '#471c6d' + - '#471c6d' + - '#471c6d' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#34628d' + - '#34628d' + - '#34628d' + - '#34628d' + - '#34628d' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (H) + opacity: 1 + scene: scene + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== + dtype: f8 +- color: '#2e91e5' + colorscale: + - - 0.0 + - '#00b050' + - - 0.16 + - '#00b050' + - - 0.26 + - '#dddddd' + - - 0.74 + - '#dddddd' + - - 0.8400000000000001 + - '#e71111' + - - 1.0 + - '#e71111' + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene2 + showlegend: false + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 +- facecolor: + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (Jxy) + opacity: 1 + scene: scene2 + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== + dtype: f8 +- color: '#2e91e5' + colorscale: + - - 0.0 + - '#00b050' + - - 0.16 + - '#00b050' + - - 0.26 + - '#dddddd' + - - 0.74 + - '#dddddd' + - - 0.8400000000000001 + - '#e71111' + - - 1.0 + - '#e71111' + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene3 + showlegend: false + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 +- facecolor: + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (Bz) + opacity: 1 + scene: scene3 + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== + dtype: f8 +- color: '#2e91e5' + colorscale: + - - 0.0 + - '#00b050' + - - 0.16 + - '#00b050' + - - 0.26 + - '#dddddd' + - - 0.74 + - '#dddddd' + - - 0.8400000000000001 + - '#e71111' + - - 1.0 + - '#e71111' + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene4 + showlegend: false + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 +- facecolor: + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + - black + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (False) + opacity: 1 + scene: scene4 + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== + dtype: f8 layout: legend: itemsizing: constant @@ -1183,30 +1183,30 @@ layout: z: 1.4 domain: x: - - 0.0 - - 0.2125 + - 0.0 + - 0.2125 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: x (m) yaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: y (m) zaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: z (m) scene2: @@ -1222,30 +1222,30 @@ layout: z: 1.4 domain: x: - - 0.2625 - - 0.475 + - 0.2625 + - 0.475 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: x (m) yaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: y (m) zaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: z (m) scene3: @@ -1261,30 +1261,30 @@ layout: z: 1.4 domain: x: - - 0.525 - - 0.7375 + - 0.525 + - 0.7375 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: x (m) yaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: y (m) zaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: z (m) scene4: @@ -1300,402 +1300,402 @@ layout: z: 1.4 domain: x: - - 0.7875 - - 1.0 + - 0.7875 + - 1.0 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: x (m) yaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: y (m) zaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: z (m) template: data: bar: - - error_x: - color: "#2a3f5f" - error_y: - color: "#2a3f5f" - marker: - line: - color: "#E5ECF6" - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: bar + - error_x: + color: '#2a3f5f' + error_y: + color: '#2a3f5f' + marker: + line: + color: '#E5ECF6' + width: 0.5 + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: bar barpolar: - - marker: - line: - color: "#E5ECF6" - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: barpolar + - marker: + line: + color: '#E5ECF6' + width: 0.5 + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: barpolar carpet: - - aaxis: - endlinecolor: "#2a3f5f" - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: "#2a3f5f" - baxis: - endlinecolor: "#2a3f5f" - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: "#2a3f5f" - type: carpet + - aaxis: + endlinecolor: '#2a3f5f' + gridcolor: white + linecolor: white + minorgridcolor: white + startlinecolor: '#2a3f5f' + baxis: + endlinecolor: '#2a3f5f' + gridcolor: white + linecolor: white + minorgridcolor: white + startlinecolor: '#2a3f5f' + type: carpet choropleth: - - colorbar: - outlinewidth: 0 - ticks: "" - type: choropleth + - colorbar: + outlinewidth: 0 + ticks: '' + type: choropleth contour: - - colorbar: - outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: contour + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: contour contourcarpet: - - colorbar: - outlinewidth: 0 - ticks: "" - type: contourcarpet + - colorbar: + outlinewidth: 0 + ticks: '' + type: contourcarpet heatmap: - - colorbar: - outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: heatmap + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: heatmap histogram: - - marker: - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: histogram + - marker: + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: histogram histogram2d: - - colorbar: - outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: histogram2d + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: histogram2d histogram2dcontour: - - colorbar: - outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: histogram2dcontour + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: histogram2dcontour mesh3d: - - colorbar: - outlinewidth: 0 - ticks: "" - type: mesh3d + - colorbar: + outlinewidth: 0 + ticks: '' + type: mesh3d parcoords: - - line: - colorbar: - outlinewidth: 0 - ticks: "" - type: parcoords + - line: + colorbar: + outlinewidth: 0 + ticks: '' + type: parcoords pie: - - automargin: true - type: pie + - automargin: true + type: pie scatter: - - fillpattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: scatter + - fillpattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: scatter scatter3d: - - line: - colorbar: - outlinewidth: 0 - ticks: "" - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scatter3d + - line: + colorbar: + outlinewidth: 0 + ticks: '' + marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scatter3d scattercarpet: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattercarpet + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattercarpet scattergeo: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattergeo + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattergeo scattergl: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattergl + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattergl scattermap: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattermap + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattermap scattermapbox: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattermapbox + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattermapbox scatterpolar: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scatterpolar + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scatterpolar scatterpolargl: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scatterpolargl + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scatterpolargl scatterternary: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scatterternary - surface: - - colorbar: + - marker: + colorbar: outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: surface + ticks: '' + type: scatterternary + surface: + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: surface table: - - cells: - fill: - color: "#EBF0F8" - line: - color: white - header: - fill: - color: "#C8D4E3" - line: - color: white - type: table + - cells: + fill: + color: '#EBF0F8' + line: + color: white + header: + fill: + color: '#C8D4E3' + line: + color: white + type: table layout: annotationdefaults: - arrowcolor: "#2a3f5f" + arrowcolor: '#2a3f5f' arrowhead: 0 arrowwidth: 1 autotypenumbers: strict coloraxis: colorbar: outlinewidth: 0 - ticks: "" + ticks: '' colorscale: diverging: - - - 0 - - "#8e0152" - - - 0.1 - - "#c51b7d" - - - 0.2 - - "#de77ae" - - - 0.3 - - "#f1b6da" - - - 0.4 - - "#fde0ef" - - - 0.5 - - "#f7f7f7" - - - 0.6 - - "#e6f5d0" - - - 0.7 - - "#b8e186" - - - 0.8 - - "#7fbc41" - - - 0.9 - - "#4d9221" - - - 1 - - "#276419" + - - 0 + - '#8e0152' + - - 0.1 + - '#c51b7d' + - - 0.2 + - '#de77ae' + - - 0.3 + - '#f1b6da' + - - 0.4 + - '#fde0ef' + - - 0.5 + - '#f7f7f7' + - - 0.6 + - '#e6f5d0' + - - 0.7 + - '#b8e186' + - - 0.8 + - '#7fbc41' + - - 0.9 + - '#4d9221' + - - 1 + - '#276419' sequential: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' sequentialminus: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' colorway: - - "#636efa" - - "#EF553B" - - "#00cc96" - - "#ab63fa" - - "#FFA15A" - - "#19d3f3" - - "#FF6692" - - "#B6E880" - - "#FF97FF" - - "#FECB52" + - '#636efa' + - '#EF553B' + - '#00cc96' + - '#ab63fa' + - '#FFA15A' + - '#19d3f3' + - '#FF6692' + - '#B6E880' + - '#FF97FF' + - '#FECB52' font: - color: "#2a3f5f" + color: '#2a3f5f' geo: bgcolor: white lakecolor: white - landcolor: "#E5ECF6" + landcolor: '#E5ECF6' showlakes: true showland: true subunitcolor: white @@ -1705,66 +1705,66 @@ layout: mapbox: style: light paper_bgcolor: white - plot_bgcolor: "#E5ECF6" + plot_bgcolor: '#E5ECF6' polar: angularaxis: gridcolor: white linecolor: white - ticks: "" - bgcolor: "#E5ECF6" + ticks: '' + bgcolor: '#E5ECF6' radialaxis: gridcolor: white linecolor: white - ticks: "" + ticks: '' scene: xaxis: - backgroundcolor: "#E5ECF6" + backgroundcolor: '#E5ECF6' gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: "" + ticks: '' zerolinecolor: white yaxis: - backgroundcolor: "#E5ECF6" + backgroundcolor: '#E5ECF6' gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: "" + ticks: '' zerolinecolor: white zaxis: - backgroundcolor: "#E5ECF6" + backgroundcolor: '#E5ECF6' gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: "" + ticks: '' zerolinecolor: white shapedefaults: line: - color: "#2a3f5f" + color: '#2a3f5f' ternary: aaxis: gridcolor: white linecolor: white - ticks: "" + ticks: '' baxis: gridcolor: white linecolor: white - ticks: "" - bgcolor: "#E5ECF6" + ticks: '' + bgcolor: '#E5ECF6' caxis: gridcolor: white linecolor: white - ticks: "" + ticks: '' title: x: 0.05 xaxis: automargin: true gridcolor: white linecolor: white - ticks: "" + ticks: '' title: standoff: 15 zerolinecolor: white @@ -1773,7 +1773,7 @@ layout: automargin: true gridcolor: white linecolor: white - ticks: "" + ticks: '' title: standoff: 15 zerolinecolor: white diff --git a/tests/test_display_plotly/test_pixel_field_color_scales.yml b/tests/test_display_plotly/test_pixel_field_color_scales.yml index 094286610..48f4aeb62 100644 --- a/tests/test_display_plotly/test_pixel_field_color_scales.yml +++ b/tests/test_display_plotly/test_pixel_field_color_scales.yml @@ -1,1172 +1,1172 @@ data: - - color: "#2e91e5" - colorscale: - - - 0.0 - - "#00b050" - - - 0.16 - - "#00b050" - - - 0.26 - - "#dddddd" - - - 0.74 - - "#dddddd" - - - 0.8400000000000001 - - "#e71111" - - - 1.0 - - "#e71111" - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene - showlegend: true - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - - facecolor: - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#22928b" - - "#22928b" - - "#22928b" - - "#22928b" - - "#22928b" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#472a79" - - "#472a79" - - "#472a79" - - "#472a79" - - "#472a79" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#472a79" - - "#472a79" - - "#472a79" - - "#472a79" - - "#472a79" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#22928b" - - "#22928b" - - "#22928b" - - "#22928b" - - "#22928b" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (Viridis) - opacity: 1 - scene: scene - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== - dtype: f8 - - color: "#2e91e5" - colorscale: - - - 0.0 - - "#00b050" - - - 0.16 - - "#00b050" - - - 0.26 - - "#dddddd" - - - 0.74 - - "#dddddd" - - - 0.8400000000000001 - - "#e71111" - - - 1.0 - - "#e71111" - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene2 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - - facecolor: - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - "#000004" - - "#000004" - - "#000004" - - "#000004" - - "#000004" - - "#bd3a51" - - "#bd3a51" - - "#bd3a51" - - "#bd3a51" - - "#bd3a51" - - "#000004" - - "#000004" - - "#000004" - - "#000004" - - "#000004" - - "#1f0c44" - - "#1f0c44" - - "#1f0c44" - - "#1f0c44" - - "#1f0c44" - - "#fcffa4" - - "#fcffa4" - - "#fcffa4" - - "#fcffa4" - - "#fcffa4" - - "#1f0c44" - - "#1f0c44" - - "#1f0c44" - - "#1f0c44" - - "#1f0c44" - - "#000004" - - "#000004" - - "#000004" - - "#000004" - - "#000004" - - "#bd3a51" - - "#bd3a51" - - "#bd3a51" - - "#bd3a51" - - "#bd3a51" - - "#000004" - - "#000004" - - "#000004" - - "#000004" - - "#000004" - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (Inferno) - opacity: 1 - scene: scene2 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== - dtype: f8 - - color: "#2e91e5" - colorscale: - - - 0.0 - - "#00b050" - - - 0.16 - - "#00b050" - - - 0.26 - - "#dddddd" - - - 0.74 - - "#dddddd" - - - 0.8400000000000001 - - "#e71111" - - - 1.0 - - "#e71111" - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene3 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - - facecolor: - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - "#fff5eb" - - "#fff5eb" - - "#fff5eb" - - "#fff5eb" - - "#fff5eb" - - "#fc8b3a" - - "#fc8b3a" - - "#fc8b3a" - - "#fc8b3a" - - "#fc8b3a" - - "#fff5eb" - - "#fff5eb" - - "#fff5eb" - - "#fff5eb" - - "#fff5eb" - - "#fee7cf" - - "#fee7cf" - - "#fee7cf" - - "#fee7cf" - - "#fee7cf" - - "#7f2704" - - "#7f2704" - - "#7f2704" - - "#7f2704" - - "#7f2704" - - "#fee7cf" - - "#fee7cf" - - "#fee7cf" - - "#fee7cf" - - "#fee7cf" - - "#fff5eb" - - "#fff5eb" - - "#fff5eb" - - "#fff5eb" - - "#fff5eb" - - "#fc8b3a" - - "#fc8b3a" - - "#fc8b3a" - - "#fc8b3a" - - "#fc8b3a" - - "#fff5eb" - - "#fff5eb" - - "#fff5eb" - - "#fff5eb" - - "#fff5eb" - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (Oranges) - opacity: 1 - scene: scene3 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== - dtype: f8 - - color: "#2e91e5" - colorscale: - - - 0.0 - - "#00b050" - - - 0.16 - - "#00b050" - - - 0.26 - - "#dddddd" - - - 0.74 - - "#dddddd" - - - 0.8400000000000001 - - "#e71111" - - - 1.0 - - "#e71111" - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene4 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - - facecolor: - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - "#da16ff" - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - "#fff7f3" - - "#fff7f3" - - "#fff7f3" - - "#fff7f3" - - "#fff7f3" - - "#f565a0" - - "#f565a0" - - "#f565a0" - - "#f565a0" - - "#f565a0" - - "#fff7f3" - - "#fff7f3" - - "#fff7f3" - - "#fff7f3" - - "#fff7f3" - - "#fde1de" - - "#fde1de" - - "#fde1de" - - "#fde1de" - - "#fde1de" - - "#49006a" - - "#49006a" - - "#49006a" - - "#49006a" - - "#49006a" - - "#fde1de" - - "#fde1de" - - "#fde1de" - - "#fde1de" - - "#fde1de" - - "#fff7f3" - - "#fff7f3" - - "#fff7f3" - - "#fff7f3" - - "#fff7f3" - - "#f565a0" - - "#f565a0" - - "#f565a0" - - "#f565a0" - - "#f565a0" - - "#fff7f3" - - "#fff7f3" - - "#fff7f3" - - "#fff7f3" - - "#fff7f3" - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (RdPu) - opacity: 1 - scene: scene4 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== - dtype: f8 +- color: '#2e91e5' + colorscale: + - - 0.0 + - '#00b050' + - - 0.16 + - '#00b050' + - - 0.26 + - '#dddddd' + - - 0.74 + - '#dddddd' + - - 0.8400000000000001 + - '#e71111' + - - 1.0 + - '#e71111' + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene + showlegend: true + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 +- facecolor: + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#22928b' + - '#22928b' + - '#22928b' + - '#22928b' + - '#22928b' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#472a79' + - '#472a79' + - '#472a79' + - '#472a79' + - '#472a79' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#472a79' + - '#472a79' + - '#472a79' + - '#472a79' + - '#472a79' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#22928b' + - '#22928b' + - '#22928b' + - '#22928b' + - '#22928b' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (Viridis) + opacity: 1 + scene: scene + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== + dtype: f8 +- color: '#2e91e5' + colorscale: + - - 0.0 + - '#00b050' + - - 0.16 + - '#00b050' + - - 0.26 + - '#dddddd' + - - 0.74 + - '#dddddd' + - - 0.8400000000000001 + - '#e71111' + - - 1.0 + - '#e71111' + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene2 + showlegend: false + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 +- facecolor: + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - '#000004' + - '#000004' + - '#000004' + - '#000004' + - '#000004' + - '#bd3a51' + - '#bd3a51' + - '#bd3a51' + - '#bd3a51' + - '#bd3a51' + - '#000004' + - '#000004' + - '#000004' + - '#000004' + - '#000004' + - '#1f0c44' + - '#1f0c44' + - '#1f0c44' + - '#1f0c44' + - '#1f0c44' + - '#fcffa4' + - '#fcffa4' + - '#fcffa4' + - '#fcffa4' + - '#fcffa4' + - '#1f0c44' + - '#1f0c44' + - '#1f0c44' + - '#1f0c44' + - '#1f0c44' + - '#000004' + - '#000004' + - '#000004' + - '#000004' + - '#000004' + - '#bd3a51' + - '#bd3a51' + - '#bd3a51' + - '#bd3a51' + - '#bd3a51' + - '#000004' + - '#000004' + - '#000004' + - '#000004' + - '#000004' + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (Inferno) + opacity: 1 + scene: scene2 + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== + dtype: f8 +- color: '#2e91e5' + colorscale: + - - 0.0 + - '#00b050' + - - 0.16 + - '#00b050' + - - 0.26 + - '#dddddd' + - - 0.74 + - '#dddddd' + - - 0.8400000000000001 + - '#e71111' + - - 1.0 + - '#e71111' + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene3 + showlegend: false + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 +- facecolor: + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - '#fff5eb' + - '#fff5eb' + - '#fff5eb' + - '#fff5eb' + - '#fff5eb' + - '#fc8b3a' + - '#fc8b3a' + - '#fc8b3a' + - '#fc8b3a' + - '#fc8b3a' + - '#fff5eb' + - '#fff5eb' + - '#fff5eb' + - '#fff5eb' + - '#fff5eb' + - '#fee7cf' + - '#fee7cf' + - '#fee7cf' + - '#fee7cf' + - '#fee7cf' + - '#7f2704' + - '#7f2704' + - '#7f2704' + - '#7f2704' + - '#7f2704' + - '#fee7cf' + - '#fee7cf' + - '#fee7cf' + - '#fee7cf' + - '#fee7cf' + - '#fff5eb' + - '#fff5eb' + - '#fff5eb' + - '#fff5eb' + - '#fff5eb' + - '#fc8b3a' + - '#fc8b3a' + - '#fc8b3a' + - '#fc8b3a' + - '#fc8b3a' + - '#fff5eb' + - '#fff5eb' + - '#fff5eb' + - '#fff5eb' + - '#fff5eb' + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (Oranges) + opacity: 1 + scene: scene3 + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== + dtype: f8 +- color: '#2e91e5' + colorscale: + - - 0.0 + - '#00b050' + - - 0.16 + - '#00b050' + - - 0.26 + - '#dddddd' + - - 0.74 + - '#dddddd' + - - 0.8400000000000001 + - '#e71111' + - - 1.0 + - '#e71111' + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene4 + showlegend: false + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 +- facecolor: + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - '#da16ff' + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - '#fff7f3' + - '#fff7f3' + - '#fff7f3' + - '#fff7f3' + - '#fff7f3' + - '#f565a0' + - '#f565a0' + - '#f565a0' + - '#f565a0' + - '#f565a0' + - '#fff7f3' + - '#fff7f3' + - '#fff7f3' + - '#fff7f3' + - '#fff7f3' + - '#fde1de' + - '#fde1de' + - '#fde1de' + - '#fde1de' + - '#fde1de' + - '#49006a' + - '#49006a' + - '#49006a' + - '#49006a' + - '#49006a' + - '#fde1de' + - '#fde1de' + - '#fde1de' + - '#fde1de' + - '#fde1de' + - '#fff7f3' + - '#fff7f3' + - '#fff7f3' + - '#fff7f3' + - '#fff7f3' + - '#f565a0' + - '#f565a0' + - '#f565a0' + - '#f565a0' + - '#f565a0' + - '#fff7f3' + - '#fff7f3' + - '#fff7f3' + - '#fff7f3' + - '#fff7f3' + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (RdPu) + opacity: 1 + scene: scene4 + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== + dtype: f8 layout: legend: itemsizing: constant @@ -1183,30 +1183,30 @@ layout: z: 1.4 domain: x: - - 0.0 - - 0.2125 + - 0.0 + - 0.2125 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.5919715007276833 - - 1.4513845364408429 + - -1.5919715007276833 + - 1.4513845364408429 title: text: x (m) yaxis: autorange: false range: - - -1.521678018584263 - - 1.521678018584263 + - -1.521678018584263 + - 1.521678018584263 title: text: y (m) zaxis: autorange: false range: - - -1.0027462143297536 - - 2.0406098228387726 + - -1.0027462143297536 + - 2.0406098228387726 title: text: z (m) scene2: @@ -1222,30 +1222,30 @@ layout: z: 1.4 domain: x: - - 0.2625 - - 0.475 + - 0.2625 + - 0.475 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.5919715007276833 - - 1.4513845364408429 + - -1.5919715007276833 + - 1.4513845364408429 title: text: x (m) yaxis: autorange: false range: - - -1.521678018584263 - - 1.521678018584263 + - -1.521678018584263 + - 1.521678018584263 title: text: y (m) zaxis: autorange: false range: - - -1.0027462143297536 - - 2.0406098228387726 + - -1.0027462143297536 + - 2.0406098228387726 title: text: z (m) scene3: @@ -1261,30 +1261,30 @@ layout: z: 1.4 domain: x: - - 0.525 - - 0.7375 + - 0.525 + - 0.7375 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.5919715007276833 - - 1.4513845364408429 + - -1.5919715007276833 + - 1.4513845364408429 title: text: x (m) yaxis: autorange: false range: - - -1.521678018584263 - - 1.521678018584263 + - -1.521678018584263 + - 1.521678018584263 title: text: y (m) zaxis: autorange: false range: - - -1.0027462143297536 - - 2.0406098228387726 + - -1.0027462143297536 + - 2.0406098228387726 title: text: z (m) scene4: @@ -1300,402 +1300,402 @@ layout: z: 1.4 domain: x: - - 0.7875 - - 1.0 + - 0.7875 + - 1.0 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.5919715007276833 - - 1.4513845364408429 + - -1.5919715007276833 + - 1.4513845364408429 title: text: x (m) yaxis: autorange: false range: - - -1.521678018584263 - - 1.521678018584263 + - -1.521678018584263 + - 1.521678018584263 title: text: y (m) zaxis: autorange: false range: - - -1.0027462143297536 - - 2.0406098228387726 + - -1.0027462143297536 + - 2.0406098228387726 title: text: z (m) template: data: bar: - - error_x: - color: "#2a3f5f" - error_y: - color: "#2a3f5f" - marker: - line: - color: "#E5ECF6" - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: bar + - error_x: + color: '#2a3f5f' + error_y: + color: '#2a3f5f' + marker: + line: + color: '#E5ECF6' + width: 0.5 + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: bar barpolar: - - marker: - line: - color: "#E5ECF6" - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: barpolar + - marker: + line: + color: '#E5ECF6' + width: 0.5 + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: barpolar carpet: - - aaxis: - endlinecolor: "#2a3f5f" - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: "#2a3f5f" - baxis: - endlinecolor: "#2a3f5f" - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: "#2a3f5f" - type: carpet + - aaxis: + endlinecolor: '#2a3f5f' + gridcolor: white + linecolor: white + minorgridcolor: white + startlinecolor: '#2a3f5f' + baxis: + endlinecolor: '#2a3f5f' + gridcolor: white + linecolor: white + minorgridcolor: white + startlinecolor: '#2a3f5f' + type: carpet choropleth: - - colorbar: - outlinewidth: 0 - ticks: "" - type: choropleth + - colorbar: + outlinewidth: 0 + ticks: '' + type: choropleth contour: - - colorbar: - outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: contour + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: contour contourcarpet: - - colorbar: - outlinewidth: 0 - ticks: "" - type: contourcarpet + - colorbar: + outlinewidth: 0 + ticks: '' + type: contourcarpet heatmap: - - colorbar: - outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: heatmap + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: heatmap histogram: - - marker: - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: histogram + - marker: + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: histogram histogram2d: - - colorbar: - outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: histogram2d + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: histogram2d histogram2dcontour: - - colorbar: - outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: histogram2dcontour + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: histogram2dcontour mesh3d: - - colorbar: - outlinewidth: 0 - ticks: "" - type: mesh3d + - colorbar: + outlinewidth: 0 + ticks: '' + type: mesh3d parcoords: - - line: - colorbar: - outlinewidth: 0 - ticks: "" - type: parcoords + - line: + colorbar: + outlinewidth: 0 + ticks: '' + type: parcoords pie: - - automargin: true - type: pie + - automargin: true + type: pie scatter: - - fillpattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: scatter + - fillpattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: scatter scatter3d: - - line: - colorbar: - outlinewidth: 0 - ticks: "" - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scatter3d + - line: + colorbar: + outlinewidth: 0 + ticks: '' + marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scatter3d scattercarpet: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattercarpet + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattercarpet scattergeo: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattergeo + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattergeo scattergl: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattergl + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattergl scattermap: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattermap + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattermap scattermapbox: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattermapbox + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattermapbox scatterpolar: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scatterpolar + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scatterpolar scatterpolargl: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scatterpolargl + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scatterpolargl scatterternary: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scatterternary - surface: - - colorbar: + - marker: + colorbar: outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: surface + ticks: '' + type: scatterternary + surface: + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: surface table: - - cells: - fill: - color: "#EBF0F8" - line: - color: white - header: - fill: - color: "#C8D4E3" - line: - color: white - type: table + - cells: + fill: + color: '#EBF0F8' + line: + color: white + header: + fill: + color: '#C8D4E3' + line: + color: white + type: table layout: annotationdefaults: - arrowcolor: "#2a3f5f" + arrowcolor: '#2a3f5f' arrowhead: 0 arrowwidth: 1 autotypenumbers: strict coloraxis: colorbar: outlinewidth: 0 - ticks: "" + ticks: '' colorscale: diverging: - - - 0 - - "#8e0152" - - - 0.1 - - "#c51b7d" - - - 0.2 - - "#de77ae" - - - 0.3 - - "#f1b6da" - - - 0.4 - - "#fde0ef" - - - 0.5 - - "#f7f7f7" - - - 0.6 - - "#e6f5d0" - - - 0.7 - - "#b8e186" - - - 0.8 - - "#7fbc41" - - - 0.9 - - "#4d9221" - - - 1 - - "#276419" + - - 0 + - '#8e0152' + - - 0.1 + - '#c51b7d' + - - 0.2 + - '#de77ae' + - - 0.3 + - '#f1b6da' + - - 0.4 + - '#fde0ef' + - - 0.5 + - '#f7f7f7' + - - 0.6 + - '#e6f5d0' + - - 0.7 + - '#b8e186' + - - 0.8 + - '#7fbc41' + - - 0.9 + - '#4d9221' + - - 1 + - '#276419' sequential: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' sequentialminus: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' colorway: - - "#636efa" - - "#EF553B" - - "#00cc96" - - "#ab63fa" - - "#FFA15A" - - "#19d3f3" - - "#FF6692" - - "#B6E880" - - "#FF97FF" - - "#FECB52" + - '#636efa' + - '#EF553B' + - '#00cc96' + - '#ab63fa' + - '#FFA15A' + - '#19d3f3' + - '#FF6692' + - '#B6E880' + - '#FF97FF' + - '#FECB52' font: - color: "#2a3f5f" + color: '#2a3f5f' geo: bgcolor: white lakecolor: white - landcolor: "#E5ECF6" + landcolor: '#E5ECF6' showlakes: true showland: true subunitcolor: white @@ -1705,66 +1705,66 @@ layout: mapbox: style: light paper_bgcolor: white - plot_bgcolor: "#E5ECF6" + plot_bgcolor: '#E5ECF6' polar: angularaxis: gridcolor: white linecolor: white - ticks: "" - bgcolor: "#E5ECF6" + ticks: '' + bgcolor: '#E5ECF6' radialaxis: gridcolor: white linecolor: white - ticks: "" + ticks: '' scene: xaxis: - backgroundcolor: "#E5ECF6" + backgroundcolor: '#E5ECF6' gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: "" + ticks: '' zerolinecolor: white yaxis: - backgroundcolor: "#E5ECF6" + backgroundcolor: '#E5ECF6' gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: "" + ticks: '' zerolinecolor: white zaxis: - backgroundcolor: "#E5ECF6" + backgroundcolor: '#E5ECF6' gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: "" + ticks: '' zerolinecolor: white shapedefaults: line: - color: "#2a3f5f" + color: '#2a3f5f' ternary: aaxis: gridcolor: white linecolor: white - ticks: "" + ticks: '' baxis: gridcolor: white linecolor: white - ticks: "" - bgcolor: "#E5ECF6" + ticks: '' + bgcolor: '#E5ECF6' caxis: gridcolor: white linecolor: white - ticks: "" + ticks: '' title: x: 0.05 xaxis: automargin: true gridcolor: white linecolor: white - ticks: "" + ticks: '' title: standoff: 15 zerolinecolor: white @@ -1773,7 +1773,7 @@ layout: automargin: true gridcolor: white linecolor: white - ticks: "" + ticks: '' title: standoff: 15 zerolinecolor: white diff --git a/tests/test_display_plotly/test_pixel_field_directional_symbols.yml b/tests/test_display_plotly/test_pixel_field_directional_symbols.yml index ed7baf475..dbbcf5ada 100644 --- a/tests/test_display_plotly/test_pixel_field_directional_symbols.yml +++ b/tests/test_display_plotly/test_pixel_field_directional_symbols.yml @@ -1,1182 +1,1182 @@ data: - - color: "#2e91e5" - colorscale: - - - 0.0 - - "#00b050" - - - 0.16 - - "#00b050" - - - 0.26 - - "#dddddd" - - - 0.74 - - "#dddddd" - - - 0.8400000000000001 - - "#e71111" - - - 1.0 - - "#e71111" - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene - showlegend: true - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - - facecolor: - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (cone) - opacity: 1 - scene: scene - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 - - color: "#2e91e5" - colorscale: - - - 0.0 - - "#00b050" - - - 0.16 - - "#00b050" - - - 0.26 - - "#dddddd" - - - 0.74 - - "#dddddd" - - - 0.8400000000000001 - - "#e71111" - - - 1.0 - - "#e71111" - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene2 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - - facecolor: - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABtAG4AbwBwAHEAaABpAGoAawBsAG0AbgBvAHAAcQB0AHUAdgB3AHgAegB7AHwAfQB+AH8AgACBAIIAgwB6AHsAfAB9AH4AfwCAAIEAggCDAIYAhwCIAIkAigCMAI0AjgCPAJAAkQCSAJMAlACVAIwAjQCOAI8AkACRAJIAkwCUAJUAmACZAJoAmwCcAJ4AnwCgAKEAogCjAKQApQCmAKcAngCfAKAAoQCiAKMApAClAKYApwCqAKsArACtAK4AsACxALIAswC0ALUAtgC3ALgAuQCwALEAsgCzALQAtQC2ALcAuAC5ALwAvQC+AL8AwADCAMMAxADFAMYAxwDIAMkAygDLAMIAwwDEAMUAxgDHAMgAyQDKAMsAzgDPANAA0QDSANQA1QDWANcA2ADZANoA2wDcAN0A1ADVANYA1wDYANkA2gDbANwA3QDgAOEA4gDjAOQA5gDnAOgA6QDqAOsA7ADtAO4A7wDmAOcA6ADpAOoA6wDsAO0A7gDvAPIA8wD0APUA9gD4APkA+gD7APwA/QD+AP8AAAEBAfgA+QD6APsA/AD9AP4A/wAAAQEB - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABpAGoAawBsAGgAcgByAHIAcgByAG4AbwBwAHEAbQB1AHYAdwB4AHQAewB8AH0AfgB6AHsAfAB9AH4AegCEAIQAhACEAIQAgACBAIIAgwB/AIcAiACJAIoAhgCNAI4AjwCQAIwAjQCOAI8AkACMAJYAlgCWAJYAlgCSAJMAlACVAJEAmQCaAJsAnACYAJ8AoAChAKIAngCfAKAAoQCiAJ4AqACoAKgAqACoAKQApQCmAKcAowCrAKwArQCuAKoAsQCyALMAtACwALEAsgCzALQAsAC6ALoAugC6ALoAtgC3ALgAuQC1AL0AvgC/AMAAvADDAMQAxQDGAMIAwwDEAMUAxgDCAMwAzADMAMwAzADIAMkAygDLAMcAzwDQANEA0gDOANUA1gDXANgA1ADVANYA1wDYANQA3gDeAN4A3gDeANoA2wDcAN0A2QDhAOIA4wDkAOAA5wDoAOkA6gDmAOcA6ADpAOoA5gDwAPAA8ADwAPAA7ADtAO4A7wDrAPMA9AD1APYA8gD5APoA+wD8APgA+QD6APsA/AD4AAIBAgECAQIBAgH+AP8AAAEBAf0A - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbgBvAHAAcQBuAG8AcABxAG0AaQBqAGsAbABoAHMAcwBzAHMAcwB5AHkAeQB5AHkAfwCAAIEAggCDAIAAgQCCAIMAfwB7AHwAfQB+AHoAhQCFAIUAhQCFAIsAiwCLAIsAiwCRAJIAkwCUAJUAkgCTAJQAlQCRAI0AjgCPAJAAjACXAJcAlwCXAJcAnQCdAJ0AnQCdAKMApAClAKYApwCkAKUApgCnAKMAnwCgAKEAogCeAKkAqQCpAKkAqQCvAK8ArwCvAK8AtQC2ALcAuAC5ALYAtwC4ALkAtQCxALIAswC0ALAAuwC7ALsAuwC7AMEAwQDBAMEAwQDHAMgAyQDKAMsAyADJAMoAywDHAMMAxADFAMYAwgDNAM0AzQDNAM0A0wDTANMA0wDTANkA2gDbANwA3QDaANsA3ADdANkA1QDWANcA2ADUAN8A3wDfAN8A3wDlAOUA5QDlAOUA6wDsAO0A7gDvAOwA7QDuAO8A6wDnAOgA6QDqAOYA8QDxAPEA8QDxAPcA9wD3APcA9wD9AP4A/wAAAQEB/gD/AAABAQH9APkA+gD7APwA+AADAQMBAwEDAQMB - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (arrow3d) - opacity: 1 - scene: scene2 - showlegend: true - type: mesh3d - x: - bdata: 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 - dtype: f8 - y: - bdata: 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 - dtype: f8 - z: - bdata: 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 - dtype: f8 - - color: "#2e91e5" - colorscale: - - - 0.0 - - "#00b050" - - - 0.16 - - "#00b050" - - - 0.26 - - "#dddddd" - - - 0.74 - - "#dddddd" - - - 0.8400000000000001 - - "#e71111" - - - 1.0 - - "#e71111" - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene3 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - - facecolor: - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - i: - bdata: S0ACS0xBQUACAAEAVFZWWlpcXFtbV1dVVVNTUlJUXlZWVFRSUlNTVVVXV1dbW1xcWlpeX1hOT1FQXWBZTUZISEpKSUkyNDQsLCAgFhYODhQUHh4pKTI5NDQyMikpHh4UFA4ODhYWICAsLDkLBAw6PggHJz0qMysrHx8VFTA2Ni8vJSUZGREREhIaGiYmMDs2NjAwJiYaGhISERERGRklJS8vOxsFCjg8Bgk3Pxw1LS0jIxcX - dtype: i1 - j: - bdata: TEwDAwMDAQFLSwMDRkZISEpKSUlHR0VFQ0NCQkREWVlRUU9PTU1OTlBQWF1dX19gYF5hYWFhYWFhYWFhYUREQkJDQ0UzMysrHx8VFQ0NExMdHSgoMTE9PT4+OjoqKgwMCAgEBwcLCycnOSIiIiIiIiIiIiIiMTEoKB0dEzU1LS0jIxcXDw8QEBgYJCQuLj8/PDw4OBwcCgoGBgUJCRsbNzc7ISEhISEhISEhISEuLiQkGBgQ - dtype: i1 - k: - bdata: QEFLTEEBQAAAQAACVkhaSlxJW0dXRVVDU0JSRFRGVlFUT1JNU05VUFdYXVtfXGBaXlZZYF1QTU9YX15RTkhCSkNJRUc0KywfIBUWDQ4TFB0eKCkxMjM0PjI6KSoeDBQIDgQHFgsgJyw5ND0nBwgqOgQLOT4MKygfHRUTDTYtLyMlFxkPERASGBokJi4wNTY8MDgmHBoKEgYRBQkZGyU3Lzs2PzcJBhw4BRs7PAotJCMYFxAP - dtype: i1 - legendgroup: Sensor(id=ID) - name: Sensor (arrow) - opacity: 1 - scene: scene3 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5Pw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPA== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vA== - dtype: f8 - - legendgroup: Sensor(id=ID) - line: - color: - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - marker: - color: - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - size: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - dtype: f8 - mode: markers+lines - name: Sensor (arrow) - opacity: 1 - scene: scene3 - showlegend: false - type: scatter3d - x: - bdata: 1bj7b6Jw8r9Vjgggux7rv/TRuS1+WvS/VY4IILse678YXIykA0vnv1WOCCC7Huu/VY4IILse678AAAAAAAD4fwAAAAAAAPi/AAAAAAAA4L8AAAAAAADwvwAAAAAAAOC/////////778AAAAAAADgvwAAAAAAAOC/AAAAAAAA+H/VuPtvonDyv1WOCCC7Huu/9NG5LX5a9L9Vjgggux7rvxhcjKQDS+e/VY4IILse679Vjgggux7rvwAAAAAAAPh/AAAAAAAA4D8AAAAAAADgvzMzMzMzM5O8AAAAAAAA4L8zMzMzMzOTPAAAAAAAAOC/AAAAAAAA4L8AAAAAAAD4fwAAAAAAAOC/AAAAAAAA4D8zMzMzMzOTvAAAAAAAAOA/MzMzMzMzkzwAAAAAAADgPwAAAAAAAOA/AAAAAAAA+H8AAAAAAADgPwAAAAAAAOC/MzMzMzMzk7wAAAAAAADgvzMzMzMzM5M8AAAAAAAA4L8AAAAAAADgvwAAAAAAAPh/VY4IILse6z/VuPtvonDyPxhcjKQDS+c/1bj7b6Jw8j/00bktflr0P9W4+2+icPI/1bj7b6Jw8j8AAAAAAAD4fwAAAAAAAOA/AAAAAAAA+D/////////vPwAAAAAAAPg/AAAAAAAA8D8AAAAAAAD4PwAAAAAAAPg/AAAAAAAA+H9Vjgggux7rP9W4+2+icPI/GFyMpANL5z/VuPtvonDyP/TRuS1+WvQ/1bj7b6Jw8j/VuPtvonDyPwAAAAAAAPh/ - dtype: f8 - y: - bdata: 3vHDW2ue979EHHhIKcPgvzuXFBwnNu2/RBx4SCnD4L9jtPVx7GTxv0QceEgpw+C/RBx4SCnD4L8AAAAAAAD4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+H/e8cNba573P0QceEgpw+A/O5cUHCc27T9EHHhIKcPgP2O09XHsZPE/RBx4SCnD4D9EHHhIKcPgPwAAAAAAAPh/AAAAAAAA8L8AAAAAAADwvwAAAAAAAPC/AAAAAAAA8L8AAAAAAADwvwAAAAAAAPC/AAAAAAAA8L8AAAAAAAD4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+H8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPh/RBx4SCnD4L/e8cNba573v2O09XHsZPG/3vHDW2ue9787lxQcJzbtv97xw1trnve/3vHDW2ue978AAAAAAAD4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+H9EHHhIKcPgP97xw1trnvc/Y7T1cexk8T/e8cNba573PzuXFBwnNu0/3vHDW2ue9z/e8cNba573PwAAAAAAAPh/ - dtype: f8 - z: - bdata: AAAAAAAAmLwAAAAAAACYPDO7o8x9bLc/AAAAAAAAmDwzu6PMfWy3vwAAAAAAAJg8AAAAAAAAmDwAAAAAAAD4fwAAAAAAAKC8AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8MzMzMzMz078AAAAAAACgPAAAAAAAAKA8AAAAAAAA+H8AAAAAAACYvAAAAAAAAJg8M7ujzH1stz8AAAAAAACYPDO7o8x9bLe/AAAAAAAAmDwAAAAAAACYPAAAAAAAAPh/AAAAAAAAoLwAAAAAAACgPDMzMzMzM9O/AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8AAAAAAAAoDwAAAAAAAD4fwAAAAAAAKC8AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8MzMzMzMz078AAAAAAACgPAAAAAAAAKA8AAAAAAAA+H8AAAAAAACgvAAAAAAAAKA8MzMzMzMz078AAAAAAACgPDMzMzMzM9M/AAAAAAAAoDwAAAAAAACgPAAAAAAAAPh/AAAAAAAAmLwAAAAAAACYPDO7o8x9bLc/AAAAAAAAmDwzu6PMfWy3vwAAAAAAAJg8AAAAAAAAmDwAAAAAAAD4fwAAAAAAAKC8AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8MzMzMzMz078AAAAAAACgPAAAAAAAAKA8AAAAAAAA+H8AAAAAAACYvAAAAAAAAJg8M7ujzH1stz8AAAAAAACYPDO7o8x9bLe/AAAAAAAAmDwAAAAAAACYPAAAAAAAAPh/ +- color: '#2e91e5' + colorscale: + - - 0.0 + - '#00b050' + - - 0.16 + - '#00b050' + - - 0.26 + - '#dddddd' + - - 0.74 + - '#dddddd' + - - 0.8400000000000001 + - '#e71111' + - - 1.0 + - '#e71111' + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene + showlegend: true + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 +- facecolor: + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (cone) + opacity: 1 + scene: scene + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== + dtype: f8 +- color: '#2e91e5' + colorscale: + - - 0.0 + - '#00b050' + - - 0.16 + - '#00b050' + - - 0.26 + - '#dddddd' + - - 0.74 + - '#dddddd' + - - 0.8400000000000001 + - '#e71111' + - - 1.0 + - '#e71111' + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene2 + showlegend: false + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 +- facecolor: + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABtAG4AbwBwAHEAaABpAGoAawBsAG0AbgBvAHAAcQB0AHUAdgB3AHgAegB7AHwAfQB+AH8AgACBAIIAgwB6AHsAfAB9AH4AfwCAAIEAggCDAIYAhwCIAIkAigCMAI0AjgCPAJAAkQCSAJMAlACVAIwAjQCOAI8AkACRAJIAkwCUAJUAmACZAJoAmwCcAJ4AnwCgAKEAogCjAKQApQCmAKcAngCfAKAAoQCiAKMApAClAKYApwCqAKsArACtAK4AsACxALIAswC0ALUAtgC3ALgAuQCwALEAsgCzALQAtQC2ALcAuAC5ALwAvQC+AL8AwADCAMMAxADFAMYAxwDIAMkAygDLAMIAwwDEAMUAxgDHAMgAyQDKAMsAzgDPANAA0QDSANQA1QDWANcA2ADZANoA2wDcAN0A1ADVANYA1wDYANkA2gDbANwA3QDgAOEA4gDjAOQA5gDnAOgA6QDqAOsA7ADtAO4A7wDmAOcA6ADpAOoA6wDsAO0A7gDvAPIA8wD0APUA9gD4APkA+gD7APwA/QD+AP8AAAEBAfgA+QD6APsA/AD9AP4A/wAAAQEB + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABpAGoAawBsAGgAcgByAHIAcgByAG4AbwBwAHEAbQB1AHYAdwB4AHQAewB8AH0AfgB6AHsAfAB9AH4AegCEAIQAhACEAIQAgACBAIIAgwB/AIcAiACJAIoAhgCNAI4AjwCQAIwAjQCOAI8AkACMAJYAlgCWAJYAlgCSAJMAlACVAJEAmQCaAJsAnACYAJ8AoAChAKIAngCfAKAAoQCiAJ4AqACoAKgAqACoAKQApQCmAKcAowCrAKwArQCuAKoAsQCyALMAtACwALEAsgCzALQAsAC6ALoAugC6ALoAtgC3ALgAuQC1AL0AvgC/AMAAvADDAMQAxQDGAMIAwwDEAMUAxgDCAMwAzADMAMwAzADIAMkAygDLAMcAzwDQANEA0gDOANUA1gDXANgA1ADVANYA1wDYANQA3gDeAN4A3gDeANoA2wDcAN0A2QDhAOIA4wDkAOAA5wDoAOkA6gDmAOcA6ADpAOoA5gDwAPAA8ADwAPAA7ADtAO4A7wDrAPMA9AD1APYA8gD5APoA+wD8APgA+QD6APsA/AD4AAIBAgECAQIBAgH+AP8AAAEBAf0A + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbgBvAHAAcQBuAG8AcABxAG0AaQBqAGsAbABoAHMAcwBzAHMAcwB5AHkAeQB5AHkAfwCAAIEAggCDAIAAgQCCAIMAfwB7AHwAfQB+AHoAhQCFAIUAhQCFAIsAiwCLAIsAiwCRAJIAkwCUAJUAkgCTAJQAlQCRAI0AjgCPAJAAjACXAJcAlwCXAJcAnQCdAJ0AnQCdAKMApAClAKYApwCkAKUApgCnAKMAnwCgAKEAogCeAKkAqQCpAKkAqQCvAK8ArwCvAK8AtQC2ALcAuAC5ALYAtwC4ALkAtQCxALIAswC0ALAAuwC7ALsAuwC7AMEAwQDBAMEAwQDHAMgAyQDKAMsAyADJAMoAywDHAMMAxADFAMYAwgDNAM0AzQDNAM0A0wDTANMA0wDTANkA2gDbANwA3QDaANsA3ADdANkA1QDWANcA2ADUAN8A3wDfAN8A3wDlAOUA5QDlAOUA6wDsAO0A7gDvAOwA7QDuAO8A6wDnAOgA6QDqAOYA8QDxAPEA8QDxAPcA9wD3APcA9wD9AP4A/wAAAQEB/gD/AAABAQH9APkA+gD7APwA+AADAQMBAwEDAQMB + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (arrow3d) + opacity: 1 + scene: scene2 + showlegend: true + type: mesh3d + x: + bdata: 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 + dtype: f8 + y: + bdata: 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 + dtype: f8 + z: + bdata: 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 + dtype: f8 +- color: '#2e91e5' + colorscale: + - - 0.0 + - '#00b050' + - - 0.16 + - '#00b050' + - - 0.26 + - '#dddddd' + - - 0.74 + - '#dddddd' + - - 0.8400000000000001 + - '#e71111' + - - 1.0 + - '#e71111' + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene3 + showlegend: false + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 +- facecolor: + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + i: + bdata: S0ACS0xBQUACAAEAVFZWWlpcXFtbV1dVVVNTUlJUXlZWVFRSUlNTVVVXV1dbW1xcWlpeX1hOT1FQXWBZTUZISEpKSUkyNDQsLCAgFhYODhQUHh4pKTI5NDQyMikpHh4UFA4ODhYWICAsLDkLBAw6PggHJz0qMysrHx8VFTA2Ni8vJSUZGREREhIaGiYmMDs2NjAwJiYaGhISERERGRklJS8vOxsFCjg8Bgk3Pxw1LS0jIxcX + dtype: i1 + j: + bdata: TEwDAwMDAQFLSwMDRkZISEpKSUlHR0VFQ0NCQkREWVlRUU9PTU1OTlBQWF1dX19gYF5hYWFhYWFhYWFhYUREQkJDQ0UzMysrHx8VFQ0NExMdHSgoMTE9PT4+OjoqKgwMCAgEBwcLCycnOSIiIiIiIiIiIiIiMTEoKB0dEzU1LS0jIxcXDw8QEBgYJCQuLj8/PDw4OBwcCgoGBgUJCRsbNzc7ISEhISEhISEhISEuLiQkGBgQ + dtype: i1 + k: + bdata: QEFLTEEBQAAAQAACVkhaSlxJW0dXRVVDU0JSRFRGVlFUT1JNU05VUFdYXVtfXGBaXlZZYF1QTU9YX15RTkhCSkNJRUc0KywfIBUWDQ4TFB0eKCkxMjM0PjI6KSoeDBQIDgQHFgsgJyw5ND0nBwgqOgQLOT4MKygfHRUTDTYtLyMlFxkPERASGBokJi4wNTY8MDgmHBoKEgYRBQkZGyU3Lzs2PzcJBhw4BRs7PAotJCMYFxAP + dtype: i1 + legendgroup: Sensor(id=ID) + name: Sensor (arrow) + opacity: 1 + scene: scene3 + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5Pw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPA== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vA== + dtype: f8 +- legendgroup: Sensor(id=ID) + line: + color: + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + marker: + color: + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + size: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA dtype: f8 + mode: markers+lines + name: Sensor (arrow) + opacity: 1 + scene: scene3 + showlegend: false + type: scatter3d + x: + bdata: 1bj7b6Jw8r9Vjgggux7rv/TRuS1+WvS/VY4IILse678YXIykA0vnv1WOCCC7Huu/VY4IILse678AAAAAAAD4fwAAAAAAAPi/AAAAAAAA4L8AAAAAAADwvwAAAAAAAOC/////////778AAAAAAADgvwAAAAAAAOC/AAAAAAAA+H/VuPtvonDyv1WOCCC7Huu/9NG5LX5a9L9Vjgggux7rvxhcjKQDS+e/VY4IILse679Vjgggux7rvwAAAAAAAPh/AAAAAAAA4D8AAAAAAADgvzMzMzMzM5O8AAAAAAAA4L8zMzMzMzOTPAAAAAAAAOC/AAAAAAAA4L8AAAAAAAD4fwAAAAAAAOC/AAAAAAAA4D8zMzMzMzOTvAAAAAAAAOA/MzMzMzMzkzwAAAAAAADgPwAAAAAAAOA/AAAAAAAA+H8AAAAAAADgPwAAAAAAAOC/MzMzMzMzk7wAAAAAAADgvzMzMzMzM5M8AAAAAAAA4L8AAAAAAADgvwAAAAAAAPh/VY4IILse6z/VuPtvonDyPxhcjKQDS+c/1bj7b6Jw8j/00bktflr0P9W4+2+icPI/1bj7b6Jw8j8AAAAAAAD4fwAAAAAAAOA/AAAAAAAA+D/////////vPwAAAAAAAPg/AAAAAAAA8D8AAAAAAAD4PwAAAAAAAPg/AAAAAAAA+H9Vjgggux7rP9W4+2+icPI/GFyMpANL5z/VuPtvonDyP/TRuS1+WvQ/1bj7b6Jw8j/VuPtvonDyPwAAAAAAAPh/ + dtype: f8 + y: + bdata: 3vHDW2ue979EHHhIKcPgvzuXFBwnNu2/RBx4SCnD4L9jtPVx7GTxv0QceEgpw+C/RBx4SCnD4L8AAAAAAAD4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+H/e8cNba573P0QceEgpw+A/O5cUHCc27T9EHHhIKcPgP2O09XHsZPE/RBx4SCnD4D9EHHhIKcPgPwAAAAAAAPh/AAAAAAAA8L8AAAAAAADwvwAAAAAAAPC/AAAAAAAA8L8AAAAAAADwvwAAAAAAAPC/AAAAAAAA8L8AAAAAAAD4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+H8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPh/RBx4SCnD4L/e8cNba573v2O09XHsZPG/3vHDW2ue9787lxQcJzbtv97xw1trnve/3vHDW2ue978AAAAAAAD4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+H9EHHhIKcPgP97xw1trnvc/Y7T1cexk8T/e8cNba573PzuXFBwnNu0/3vHDW2ue9z/e8cNba573PwAAAAAAAPh/ + dtype: f8 + z: + bdata: AAAAAAAAmLwAAAAAAACYPDO7o8x9bLc/AAAAAAAAmDwzu6PMfWy3vwAAAAAAAJg8AAAAAAAAmDwAAAAAAAD4fwAAAAAAAKC8AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8MzMzMzMz078AAAAAAACgPAAAAAAAAKA8AAAAAAAA+H8AAAAAAACYvAAAAAAAAJg8M7ujzH1stz8AAAAAAACYPDO7o8x9bLe/AAAAAAAAmDwAAAAAAACYPAAAAAAAAPh/AAAAAAAAoLwAAAAAAACgPDMzMzMzM9O/AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8AAAAAAAAoDwAAAAAAAD4fwAAAAAAAKC8AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8MzMzMzMz078AAAAAAACgPAAAAAAAAKA8AAAAAAAA+H8AAAAAAACgvAAAAAAAAKA8MzMzMzMz078AAAAAAACgPDMzMzMzM9M/AAAAAAAAoDwAAAAAAACgPAAAAAAAAPh/AAAAAAAAmLwAAAAAAACYPDO7o8x9bLc/AAAAAAAAmDwzu6PMfWy3vwAAAAAAAJg8AAAAAAAAmDwAAAAAAAD4fwAAAAAAAKC8AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8MzMzMzMz078AAAAAAACgPAAAAAAAAKA8AAAAAAAA+H8AAAAAAACYvAAAAAAAAJg8M7ujzH1stz8AAAAAAACYPDO7o8x9bLe/AAAAAAAAmDwAAAAAAACYPAAAAAAAAPh/ + dtype: f8 layout: legend: itemsizing: constant @@ -1193,30 +1193,30 @@ layout: z: 1.4 domain: x: - - 0.0 - - 0.2888888888888889 + - 0.0 + - 0.2888888888888889 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: x (m) yaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: y (m) zaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: z (m) scene2: @@ -1232,30 +1232,30 @@ layout: z: 1.4 domain: x: - - 0.35555555555555557 - - 0.6444444444444445 + - 0.35555555555555557 + - 0.6444444444444445 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.5124847513262898 - - 1.5124847513262898 + - -1.5124847513262898 + - 1.5124847513262898 title: text: x (m) yaxis: autorange: false range: - - -1.5124847513262898 - - 1.5124847513262898 + - -1.5124847513262898 + - 1.5124847513262898 title: text: y (m) zaxis: autorange: false range: - - -1.5124847513262898 - - 1.5124847513262898 + - -1.5124847513262898 + - 1.5124847513262898 title: text: z (m) scene3: @@ -1271,402 +1271,402 @@ layout: z: 1.4 domain: x: - - 0.7111111111111111 - - 1.0 + - 0.7111111111111111 + - 1.0 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.5 - - 1.5 + - -1.5 + - 1.5 title: text: x (m) yaxis: autorange: false range: - - -1.5 - - 1.5 + - -1.5 + - 1.5 title: text: y (m) zaxis: autorange: false range: - - -1.5 - - 1.5 + - -1.5 + - 1.5 title: text: z (m) template: data: bar: - - error_x: - color: "#2a3f5f" - error_y: - color: "#2a3f5f" - marker: - line: - color: "#E5ECF6" - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: bar + - error_x: + color: '#2a3f5f' + error_y: + color: '#2a3f5f' + marker: + line: + color: '#E5ECF6' + width: 0.5 + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: bar barpolar: - - marker: - line: - color: "#E5ECF6" - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: barpolar + - marker: + line: + color: '#E5ECF6' + width: 0.5 + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: barpolar carpet: - - aaxis: - endlinecolor: "#2a3f5f" - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: "#2a3f5f" - baxis: - endlinecolor: "#2a3f5f" - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: "#2a3f5f" - type: carpet + - aaxis: + endlinecolor: '#2a3f5f' + gridcolor: white + linecolor: white + minorgridcolor: white + startlinecolor: '#2a3f5f' + baxis: + endlinecolor: '#2a3f5f' + gridcolor: white + linecolor: white + minorgridcolor: white + startlinecolor: '#2a3f5f' + type: carpet choropleth: - - colorbar: - outlinewidth: 0 - ticks: "" - type: choropleth + - colorbar: + outlinewidth: 0 + ticks: '' + type: choropleth contour: - - colorbar: - outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: contour + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: contour contourcarpet: - - colorbar: - outlinewidth: 0 - ticks: "" - type: contourcarpet + - colorbar: + outlinewidth: 0 + ticks: '' + type: contourcarpet heatmap: - - colorbar: - outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: heatmap + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: heatmap histogram: - - marker: - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: histogram + - marker: + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: histogram histogram2d: - - colorbar: - outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: histogram2d + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: histogram2d histogram2dcontour: - - colorbar: - outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: histogram2dcontour + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: histogram2dcontour mesh3d: - - colorbar: - outlinewidth: 0 - ticks: "" - type: mesh3d + - colorbar: + outlinewidth: 0 + ticks: '' + type: mesh3d parcoords: - - line: - colorbar: - outlinewidth: 0 - ticks: "" - type: parcoords + - line: + colorbar: + outlinewidth: 0 + ticks: '' + type: parcoords pie: - - automargin: true - type: pie + - automargin: true + type: pie scatter: - - fillpattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: scatter + - fillpattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: scatter scatter3d: - - line: - colorbar: - outlinewidth: 0 - ticks: "" - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scatter3d + - line: + colorbar: + outlinewidth: 0 + ticks: '' + marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scatter3d scattercarpet: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattercarpet + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattercarpet scattergeo: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattergeo + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattergeo scattergl: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattergl + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattergl scattermap: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattermap + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattermap scattermapbox: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattermapbox + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattermapbox scatterpolar: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scatterpolar + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scatterpolar scatterpolargl: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scatterpolargl + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scatterpolargl scatterternary: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scatterternary - surface: - - colorbar: + - marker: + colorbar: outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: surface + ticks: '' + type: scatterternary + surface: + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: surface table: - - cells: - fill: - color: "#EBF0F8" - line: - color: white - header: - fill: - color: "#C8D4E3" - line: - color: white - type: table + - cells: + fill: + color: '#EBF0F8' + line: + color: white + header: + fill: + color: '#C8D4E3' + line: + color: white + type: table layout: annotationdefaults: - arrowcolor: "#2a3f5f" + arrowcolor: '#2a3f5f' arrowhead: 0 arrowwidth: 1 autotypenumbers: strict coloraxis: colorbar: outlinewidth: 0 - ticks: "" + ticks: '' colorscale: diverging: - - - 0 - - "#8e0152" - - - 0.1 - - "#c51b7d" - - - 0.2 - - "#de77ae" - - - 0.3 - - "#f1b6da" - - - 0.4 - - "#fde0ef" - - - 0.5 - - "#f7f7f7" - - - 0.6 - - "#e6f5d0" - - - 0.7 - - "#b8e186" - - - 0.8 - - "#7fbc41" - - - 0.9 - - "#4d9221" - - - 1 - - "#276419" + - - 0 + - '#8e0152' + - - 0.1 + - '#c51b7d' + - - 0.2 + - '#de77ae' + - - 0.3 + - '#f1b6da' + - - 0.4 + - '#fde0ef' + - - 0.5 + - '#f7f7f7' + - - 0.6 + - '#e6f5d0' + - - 0.7 + - '#b8e186' + - - 0.8 + - '#7fbc41' + - - 0.9 + - '#4d9221' + - - 1 + - '#276419' sequential: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' sequentialminus: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' colorway: - - "#636efa" - - "#EF553B" - - "#00cc96" - - "#ab63fa" - - "#FFA15A" - - "#19d3f3" - - "#FF6692" - - "#B6E880" - - "#FF97FF" - - "#FECB52" + - '#636efa' + - '#EF553B' + - '#00cc96' + - '#ab63fa' + - '#FFA15A' + - '#19d3f3' + - '#FF6692' + - '#B6E880' + - '#FF97FF' + - '#FECB52' font: - color: "#2a3f5f" + color: '#2a3f5f' geo: bgcolor: white lakecolor: white - landcolor: "#E5ECF6" + landcolor: '#E5ECF6' showlakes: true showland: true subunitcolor: white @@ -1676,66 +1676,66 @@ layout: mapbox: style: light paper_bgcolor: white - plot_bgcolor: "#E5ECF6" + plot_bgcolor: '#E5ECF6' polar: angularaxis: gridcolor: white linecolor: white - ticks: "" - bgcolor: "#E5ECF6" + ticks: '' + bgcolor: '#E5ECF6' radialaxis: gridcolor: white linecolor: white - ticks: "" + ticks: '' scene: xaxis: - backgroundcolor: "#E5ECF6" + backgroundcolor: '#E5ECF6' gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: "" + ticks: '' zerolinecolor: white yaxis: - backgroundcolor: "#E5ECF6" + backgroundcolor: '#E5ECF6' gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: "" + ticks: '' zerolinecolor: white zaxis: - backgroundcolor: "#E5ECF6" + backgroundcolor: '#E5ECF6' gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: "" + ticks: '' zerolinecolor: white shapedefaults: line: - color: "#2a3f5f" + color: '#2a3f5f' ternary: aaxis: gridcolor: white linecolor: white - ticks: "" + ticks: '' baxis: gridcolor: white linecolor: white - ticks: "" - bgcolor: "#E5ECF6" + ticks: '' + bgcolor: '#E5ECF6' caxis: gridcolor: white linecolor: white - ticks: "" + ticks: '' title: x: 0.05 xaxis: automargin: true gridcolor: white linecolor: white - ticks: "" + ticks: '' title: standoff: 15 zerolinecolor: white @@ -1744,7 +1744,7 @@ layout: automargin: true gridcolor: white linecolor: white - ticks: "" + ticks: '' title: standoff: 15 zerolinecolor: white diff --git a/tests/test_display_plotly/test_pixel_field_null_values.yml b/tests/test_display_plotly/test_pixel_field_null_values.yml index 98969e7e2..9dfad2981 100644 --- a/tests/test_display_plotly/test_pixel_field_null_values.yml +++ b/tests/test_display_plotly/test_pixel_field_null_values.yml @@ -1,756 +1,756 @@ data: - - color: "#2e91e5" - colorscale: - - - 0.0 - - "#00b050" - - - 0.16 - - "#00b050" - - - 0.26 - - "#dddddd" - - - 0.74 - - "#dddddd" - - - 0.8400000000000001 - - "#e71111" - - - 1.0 - - "#e71111" - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene - showlegend: true - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - - facecolor: - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - "#461567" - - "#461567" - - "#461567" - - "#461567" - - "#461567" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#423a81" - - "#423a81" - - "#423a81" - - "#423a81" - - "#423a81" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#461567" - - "#461567" - - "#461567" - - "#461567" - - "#461567" - - "#472071" - - "#472071" - - "#472071" - - "#472071" - - "#472071" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#1f9e89" - - "#1f9e89" - - "#1f9e89" - - "#1f9e89" - - "#1f9e89" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#472071" - - "#472071" - - "#472071" - - "#472071" - - "#472071" - - "#471f70" - - "#471f70" - - "#471f70" - - "#471f70" - - "#471f70" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#9ed93a" - - "#9ed93a" - - "#9ed93a" - - "#9ed93a" - - "#9ed93a" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#471f70" - - "#471f70" - - "#471f70" - - "#471f70" - - "#471f70" - - "#472071" - - "#472071" - - "#472071" - - "#472071" - - "#472071" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#1f9e89" - - "#1f9e89" - - "#1f9e89" - - "#1f9e89" - - "#1f9e89" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#b2beb5" - - "#472071" - - "#472071" - - "#472071" - - "#472071" - - "#472071" - - "#461567" - - "#461567" - - "#461567" - - "#461567" - - "#461567" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#423a81" - - "#423a81" - - "#423a81" - - "#423a81" - - "#423a81" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#461567" - - "#461567" - - "#461567" - - "#461567" - - "#461567" - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAjQCGAIYAhgCKAIoAiACMAIoAhgCJAI0AjgCPAJAAkQCSAJsAlACUAJQAmACYAJYAmgCYAJQAlwCbAJwAnQCeAJ8AoACiAKMApAClAKYAqACpAKoAqwCsAK4ArwCwALEAsgC0ALUAtgC3ALgAugC7ALwAvQC+AMAAwQDCAMMAxADNAMYAxgDGAMoAygDIAMwAygDGAMkAzQDOAM8A0ADRANIA2wDUANQA1ADYANgA1gDaANgA1ADXANsA3ADdAN4A3wDgAOIA4wDkAOUA5gDoAOkA6gDrAOwA7gDvAPAA8QDyAPQA9QD2APcA+AD6APsA/AD9AP4A - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhgCNAIcAiACMAI0AhwCIAIsAiwCIAIgAjwCQAJEAkgCOAJQAmwCVAJYAmgCbAJUAlgCZAJkAlgCWAJ0AngCfAKAAnACjAKQApQCmAKIAqQCqAKsArACoAK8AsACxALIArgC1ALYAtwC4ALQAuwC8AL0AvgC6AMEAwgDDAMQAwADGAM0AxwDIAMwAzQDHAMgAywDLAMgAyADPANAA0QDSAM4A1ADbANUA1gDaANsA1QDWANkA2QDWANYA3QDeAN8A4ADcAOMA5ADlAOYA4gDpAOoA6wDsAOgA7wDwAPEA8gDuAPUA9gD3APgA9AD7APwA/QD+APoA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiQCKAIgAiQCLAIwAiwCLAIYAhwCNAIwAkwCTAJMAkwCTAJcAmACWAJcAmQCaAJkAmQCUAJUAmwCaAKEAoQChAKEAoQCnAKcApwCnAKcArQCtAK0ArQCtALMAswCzALMAswC5ALkAuQC5ALkAvwC/AL8AvwC/AMUAxQDFAMUAxQDJAMoAyADJAMsAzADLAMsAxgDHAM0AzADTANMA0wDTANMA1wDYANYA1wDZANoA2QDZANQA1QDbANoA4QDhAOEA4QDhAOcA5wDnAOcA5wDtAO0A7QDtAO0A8wDzAPMA8wDzAPkA+QD5APkA+QD/AP8A/wD/AP8A - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (True) - opacity: 1 - scene: scene - showlegend: true - type: mesh3d - x: - bdata: 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 - dtype: f8 - y: - bdata: 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 - dtype: f8 - z: - bdata: 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 - dtype: f8 - - color: "#2e91e5" - colorscale: - - - 0.0 - - "#00b050" - - - 0.16 - - "#00b050" - - - 0.26 - - "#dddddd" - - - 0.74 - - "#dddddd" - - - 0.8400000000000001 - - "#e71111" - - - 1.0 - - "#e71111" - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene2 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - - facecolor: - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - "#461567" - - "#461567" - - "#461567" - - "#461567" - - "#461567" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#423a81" - - "#423a81" - - "#423a81" - - "#423a81" - - "#423a81" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#461567" - - "#461567" - - "#461567" - - "#461567" - - "#461567" - - "#472071" - - "#472071" - - "#472071" - - "#472071" - - "#472071" - - "#1f9e89" - - "#1f9e89" - - "#1f9e89" - - "#1f9e89" - - "#1f9e89" - - "#472071" - - "#472071" - - "#472071" - - "#472071" - - "#472071" - - "#471f70" - - "#471f70" - - "#471f70" - - "#471f70" - - "#471f70" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#9ed93a" - - "#9ed93a" - - "#9ed93a" - - "#9ed93a" - - "#9ed93a" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#471f70" - - "#471f70" - - "#471f70" - - "#471f70" - - "#471f70" - - "#472071" - - "#472071" - - "#472071" - - "#472071" - - "#472071" - - "#1f9e89" - - "#1f9e89" - - "#1f9e89" - - "#1f9e89" - - "#1f9e89" - - "#472071" - - "#472071" - - "#472071" - - "#472071" - - "#472071" - - "#461567" - - "#461567" - - "#461567" - - "#461567" - - "#461567" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#423a81" - - "#423a81" - - "#423a81" - - "#423a81" - - "#423a81" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#462e7b" - - "#461567" - - "#461567" - - "#461567" - - "#461567" - - "#461567" - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYAmACZAJoAmwCcAJ4AnwCgAKEAogCkAKUApgCnAKgAqgCrAKwArQCuALAAsQCyALMAtAC2ALcAuAC5ALoAvAC9AL4AvwDAAMIAwwDEAMUAxgDIAMkAygDLAMwAzgDPANAA0QDSANQA1QDWANcA2ADaANsA3ADdAN4A - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIAmQCaAJsAnACYAJ8AoAChAKIAngClAKYApwCoAKQAqwCsAK0ArgCqALEAsgCzALQAsAC3ALgAuQC6ALYAvQC+AL8AwAC8AMMAxADFAMYAwgDJAMoAywDMAMgAzwDQANEA0gDOANUA1gDXANgA1ADbANwA3QDeANoA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcAnQCdAJ0AnQCdAKMAowCjAKMAowCpAKkAqQCpAKkArwCvAK8ArwCvALUAtQC1ALUAtQC7ALsAuwC7ALsAwQDBAMEAwQDBAMcAxwDHAMcAxwDNAM0AzQDNAM0A0wDTANMA0wDTANkA2QDZANkA2QDfAN8A3wDfAN8A - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (False) - opacity: 1 - scene: scene2 - showlegend: true - type: mesh3d - x: - bdata: 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 - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPG1ZCIjtY/S/ub6Wht7P878fAhIu5jrzv4hYsaDjcvO/3WkHiHYq9L8iDjyklGHovxTxn/cX1+a/RWzYTl0g47++2BkSL97hvzxjQ2DLzeS/yOM19X7g57/Cmi6HoDHWvwAAAAAAAAAA/1REEw5vvj9fWnUEI8+yP11adQQjz7K/AFVEEw5vvr8AAAAAAAAAABTxn/cX1+Y/yOM19X7g5z88Y0Ngy83kP77YGRIv3uE/RGzYTl0g4z/Cmi6HoDHWP21ZCIjtY/Q/3WkHiHYq9D+IWLGg43LzPx8CEi7mOvM/uL6Wht7P8z8iDjyklGHoP7uerNRB4vK/r53QlPUT87/oAXovLwz0v1zgMcfkc/S/cYp/ucO787/zVYnCxrjovwAAAAAAAAAA/1REEw5vvj9fWnUEI8+yP11adQQjz7K/AFVEEw5vvr8AAAAAAAAAALuerNRB4vI/cYp/ucO78z9c4DHH5HP0P+gBei8vDPQ/r53QlPUT8z/zVYnCxrjoPwAAAAAAAPC/YHWXPR4y7L+0VHGfG6btv6ZVRzDyLPG/UEU04fDm8b8AAAAAAADwvwAAAAAAAOC/wOouezxk2L9oqeI+N0zbv0yrjmDkWeK/oIpowuHN478AAAAAAADgvwAAAAAAAAAA/1REEw5vvj9fWnUEI8+yP11adQQjz7K/AFVEEw5vvr8AAAAAAAAAAAAAAAAAAOA/oIpowuHN4z9Mq45g5FniP2mp4j43TNs/wOouezxk2D8AAAAAAADgPwAAAAAAAPA/UEU04fDm8T+mVUcw8izxP7RUcZ8bpu0/YHWXPR4y7D8AAAAAAADwP4rCplZ8O+q/HusAjXiI6L9HP5xxNhjnvzD8C6Gh5+e/o8Re1hTY6b8GVbuenKPzvwAAAAAAAAAA/1REEw5vvj9fWnUEI8+yP11adQQjz7K/AFVEEw5vvr8AAAAAAAAAAIrCplZ8O+o/o8Re1hTY6T8w/AuhoefnP0c/nHE2GOc/HesAjXiI6D8GVbuenKPzPyZN7+8kOOe/Rizx7xKr57/wTp2+OBrpv8H726Mzium/j4LS8kJg6L/v+OGtNc/zv9cdwBDQUdK/cDiUFQI/0L+KOXk/aWTWv4VOzNuhQ9y/dydPYkW/2b+fsmi8L+fkvwAAAAAAAAAA/1REEw5vvj9fWnUEI8+yP11adQQjz7K/AFVEEw5vvr8AAAAAAAAAANcdwBDQUdI/didPYkW/2T+GTszboUPcP4o5eT9pZNY/cDiUFQI/0D+fsmi8L+fkPyZN7+8kOOc/j4LS8kJg6D/B+9ujM4rpP/BOnb44Guk/Rizx7xKr5z/v+OGtNc/zPw== - dtype: f8 - z: - bdata: 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 - dtype: f8 +- color: '#2e91e5' + colorscale: + - - 0.0 + - '#00b050' + - - 0.16 + - '#00b050' + - - 0.26 + - '#dddddd' + - - 0.74 + - '#dddddd' + - - 0.8400000000000001 + - '#e71111' + - - 1.0 + - '#e71111' + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene + showlegend: true + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 +- facecolor: + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - '#461567' + - '#461567' + - '#461567' + - '#461567' + - '#461567' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#423a81' + - '#423a81' + - '#423a81' + - '#423a81' + - '#423a81' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#461567' + - '#461567' + - '#461567' + - '#461567' + - '#461567' + - '#472071' + - '#472071' + - '#472071' + - '#472071' + - '#472071' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#1f9e89' + - '#1f9e89' + - '#1f9e89' + - '#1f9e89' + - '#1f9e89' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#472071' + - '#472071' + - '#472071' + - '#472071' + - '#472071' + - '#471f70' + - '#471f70' + - '#471f70' + - '#471f70' + - '#471f70' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#9ed93a' + - '#9ed93a' + - '#9ed93a' + - '#9ed93a' + - '#9ed93a' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#471f70' + - '#471f70' + - '#471f70' + - '#471f70' + - '#471f70' + - '#472071' + - '#472071' + - '#472071' + - '#472071' + - '#472071' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#1f9e89' + - '#1f9e89' + - '#1f9e89' + - '#1f9e89' + - '#1f9e89' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#b2beb5' + - '#472071' + - '#472071' + - '#472071' + - '#472071' + - '#472071' + - '#461567' + - '#461567' + - '#461567' + - '#461567' + - '#461567' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#423a81' + - '#423a81' + - '#423a81' + - '#423a81' + - '#423a81' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#461567' + - '#461567' + - '#461567' + - '#461567' + - '#461567' + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAjQCGAIYAhgCKAIoAiACMAIoAhgCJAI0AjgCPAJAAkQCSAJsAlACUAJQAmACYAJYAmgCYAJQAlwCbAJwAnQCeAJ8AoACiAKMApAClAKYAqACpAKoAqwCsAK4ArwCwALEAsgC0ALUAtgC3ALgAugC7ALwAvQC+AMAAwQDCAMMAxADNAMYAxgDGAMoAygDIAMwAygDGAMkAzQDOAM8A0ADRANIA2wDUANQA1ADYANgA1gDaANgA1ADXANsA3ADdAN4A3wDgAOIA4wDkAOUA5gDoAOkA6gDrAOwA7gDvAPAA8QDyAPQA9QD2APcA+AD6APsA/AD9AP4A + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhgCNAIcAiACMAI0AhwCIAIsAiwCIAIgAjwCQAJEAkgCOAJQAmwCVAJYAmgCbAJUAlgCZAJkAlgCWAJ0AngCfAKAAnACjAKQApQCmAKIAqQCqAKsArACoAK8AsACxALIArgC1ALYAtwC4ALQAuwC8AL0AvgC6AMEAwgDDAMQAwADGAM0AxwDIAMwAzQDHAMgAywDLAMgAyADPANAA0QDSAM4A1ADbANUA1gDaANsA1QDWANkA2QDWANYA3QDeAN8A4ADcAOMA5ADlAOYA4gDpAOoA6wDsAOgA7wDwAPEA8gDuAPUA9gD3APgA9AD7APwA/QD+APoA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiQCKAIgAiQCLAIwAiwCLAIYAhwCNAIwAkwCTAJMAkwCTAJcAmACWAJcAmQCaAJkAmQCUAJUAmwCaAKEAoQChAKEAoQCnAKcApwCnAKcArQCtAK0ArQCtALMAswCzALMAswC5ALkAuQC5ALkAvwC/AL8AvwC/AMUAxQDFAMUAxQDJAMoAyADJAMsAzADLAMsAxgDHAM0AzADTANMA0wDTANMA1wDYANYA1wDZANoA2QDZANQA1QDbANoA4QDhAOEA4QDhAOcA5wDnAOcA5wDtAO0A7QDtAO0A8wDzAPMA8wDzAPkA+QD5APkA+QD/AP8A/wD/AP8A + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (True) + opacity: 1 + scene: scene + showlegend: true + type: mesh3d + x: + bdata: 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 + dtype: f8 + y: + bdata: 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 + dtype: f8 + z: + bdata: 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 + dtype: f8 +- color: '#2e91e5' + colorscale: + - - 0.0 + - '#00b050' + - - 0.16 + - '#00b050' + - - 0.26 + - '#dddddd' + - - 0.74 + - '#dddddd' + - - 0.8400000000000001 + - '#e71111' + - - 1.0 + - '#e71111' + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene2 + showlegend: false + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 +- facecolor: + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - '#461567' + - '#461567' + - '#461567' + - '#461567' + - '#461567' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#423a81' + - '#423a81' + - '#423a81' + - '#423a81' + - '#423a81' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#461567' + - '#461567' + - '#461567' + - '#461567' + - '#461567' + - '#472071' + - '#472071' + - '#472071' + - '#472071' + - '#472071' + - '#1f9e89' + - '#1f9e89' + - '#1f9e89' + - '#1f9e89' + - '#1f9e89' + - '#472071' + - '#472071' + - '#472071' + - '#472071' + - '#472071' + - '#471f70' + - '#471f70' + - '#471f70' + - '#471f70' + - '#471f70' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#9ed93a' + - '#9ed93a' + - '#9ed93a' + - '#9ed93a' + - '#9ed93a' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#471f70' + - '#471f70' + - '#471f70' + - '#471f70' + - '#471f70' + - '#472071' + - '#472071' + - '#472071' + - '#472071' + - '#472071' + - '#1f9e89' + - '#1f9e89' + - '#1f9e89' + - '#1f9e89' + - '#1f9e89' + - '#472071' + - '#472071' + - '#472071' + - '#472071' + - '#472071' + - '#461567' + - '#461567' + - '#461567' + - '#461567' + - '#461567' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#423a81' + - '#423a81' + - '#423a81' + - '#423a81' + - '#423a81' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#462e7b' + - '#461567' + - '#461567' + - '#461567' + - '#461567' + - '#461567' + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYAmACZAJoAmwCcAJ4AnwCgAKEAogCkAKUApgCnAKgAqgCrAKwArQCuALAAsQCyALMAtAC2ALcAuAC5ALoAvAC9AL4AvwDAAMIAwwDEAMUAxgDIAMkAygDLAMwAzgDPANAA0QDSANQA1QDWANcA2ADaANsA3ADdAN4A + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIAmQCaAJsAnACYAJ8AoAChAKIAngClAKYApwCoAKQAqwCsAK0ArgCqALEAsgCzALQAsAC3ALgAuQC6ALYAvQC+AL8AwAC8AMMAxADFAMYAwgDJAMoAywDMAMgAzwDQANEA0gDOANUA1gDXANgA1ADbANwA3QDeANoA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcAnQCdAJ0AnQCdAKMAowCjAKMAowCpAKkAqQCpAKkArwCvAK8ArwCvALUAtQC1ALUAtQC7ALsAuwC7ALsAwQDBAMEAwQDBAMcAxwDHAMcAxwDNAM0AzQDNAM0A0wDTANMA0wDTANkA2QDZANkA2QDfAN8A3wDfAN8A + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (False) + opacity: 1 + scene: scene2 + showlegend: true + type: mesh3d + x: + bdata: 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 + dtype: f8 + y: + bdata: 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 + dtype: f8 + z: + bdata: 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 + dtype: f8 layout: legend: itemsizing: constant @@ -767,30 +767,30 @@ layout: z: 1.4 domain: x: - - 0.0 - - 0.45 + - 0.0 + - 0.45 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.288849940910414 - - 1.2677387624450005 + - -1.288849940910414 + - 1.2677387624450005 title: text: x (m) yaxis: autorange: false range: - - -1.2782943516777072 - - 1.2782943516777072 + - -1.2782943516777072 + - 1.2782943516777072 title: text: y (m) zaxis: autorange: false range: - - -1.2782943516777072 - - 1.2782943516777072 + - -1.2782943516777072 + - 1.2782943516777072 title: text: z (m) scene2: @@ -806,402 +806,402 @@ layout: z: 1.4 domain: x: - - 0.55 - - 1.0 + - 0.55 + - 1.0 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.288849940910414 - - 1.2677387624450005 + - -1.288849940910414 + - 1.2677387624450005 title: text: x (m) yaxis: autorange: false range: - - -1.2782943516777072 - - 1.2782943516777072 + - -1.2782943516777072 + - 1.2782943516777072 title: text: y (m) zaxis: autorange: false range: - - -1.2782943516777072 - - 1.2782943516777072 + - -1.2782943516777072 + - 1.2782943516777072 title: text: z (m) template: data: bar: - - error_x: - color: "#2a3f5f" - error_y: - color: "#2a3f5f" - marker: - line: - color: "#E5ECF6" - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: bar + - error_x: + color: '#2a3f5f' + error_y: + color: '#2a3f5f' + marker: + line: + color: '#E5ECF6' + width: 0.5 + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: bar barpolar: - - marker: - line: - color: "#E5ECF6" - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: barpolar + - marker: + line: + color: '#E5ECF6' + width: 0.5 + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: barpolar carpet: - - aaxis: - endlinecolor: "#2a3f5f" - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: "#2a3f5f" - baxis: - endlinecolor: "#2a3f5f" - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: "#2a3f5f" - type: carpet + - aaxis: + endlinecolor: '#2a3f5f' + gridcolor: white + linecolor: white + minorgridcolor: white + startlinecolor: '#2a3f5f' + baxis: + endlinecolor: '#2a3f5f' + gridcolor: white + linecolor: white + minorgridcolor: white + startlinecolor: '#2a3f5f' + type: carpet choropleth: - - colorbar: - outlinewidth: 0 - ticks: "" - type: choropleth + - colorbar: + outlinewidth: 0 + ticks: '' + type: choropleth contour: - - colorbar: - outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: contour + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: contour contourcarpet: - - colorbar: - outlinewidth: 0 - ticks: "" - type: contourcarpet + - colorbar: + outlinewidth: 0 + ticks: '' + type: contourcarpet heatmap: - - colorbar: - outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: heatmap + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: heatmap histogram: - - marker: - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: histogram + - marker: + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: histogram histogram2d: - - colorbar: - outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: histogram2d + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: histogram2d histogram2dcontour: - - colorbar: - outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: histogram2dcontour + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: histogram2dcontour mesh3d: - - colorbar: - outlinewidth: 0 - ticks: "" - type: mesh3d + - colorbar: + outlinewidth: 0 + ticks: '' + type: mesh3d parcoords: - - line: - colorbar: - outlinewidth: 0 - ticks: "" - type: parcoords + - line: + colorbar: + outlinewidth: 0 + ticks: '' + type: parcoords pie: - - automargin: true - type: pie + - automargin: true + type: pie scatter: - - fillpattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: scatter + - fillpattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: scatter scatter3d: - - line: - colorbar: - outlinewidth: 0 - ticks: "" - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scatter3d + - line: + colorbar: + outlinewidth: 0 + ticks: '' + marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scatter3d scattercarpet: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattercarpet + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattercarpet scattergeo: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattergeo + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattergeo scattergl: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattergl + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattergl scattermap: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattermap + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattermap scattermapbox: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattermapbox + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattermapbox scatterpolar: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scatterpolar + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scatterpolar scatterpolargl: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scatterpolargl + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scatterpolargl scatterternary: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scatterternary - surface: - - colorbar: + - marker: + colorbar: outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: surface + ticks: '' + type: scatterternary + surface: + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: surface table: - - cells: - fill: - color: "#EBF0F8" - line: - color: white - header: - fill: - color: "#C8D4E3" - line: - color: white - type: table + - cells: + fill: + color: '#EBF0F8' + line: + color: white + header: + fill: + color: '#C8D4E3' + line: + color: white + type: table layout: annotationdefaults: - arrowcolor: "#2a3f5f" + arrowcolor: '#2a3f5f' arrowhead: 0 arrowwidth: 1 autotypenumbers: strict coloraxis: colorbar: outlinewidth: 0 - ticks: "" + ticks: '' colorscale: diverging: - - - 0 - - "#8e0152" - - - 0.1 - - "#c51b7d" - - - 0.2 - - "#de77ae" - - - 0.3 - - "#f1b6da" - - - 0.4 - - "#fde0ef" - - - 0.5 - - "#f7f7f7" - - - 0.6 - - "#e6f5d0" - - - 0.7 - - "#b8e186" - - - 0.8 - - "#7fbc41" - - - 0.9 - - "#4d9221" - - - 1 - - "#276419" + - - 0 + - '#8e0152' + - - 0.1 + - '#c51b7d' + - - 0.2 + - '#de77ae' + - - 0.3 + - '#f1b6da' + - - 0.4 + - '#fde0ef' + - - 0.5 + - '#f7f7f7' + - - 0.6 + - '#e6f5d0' + - - 0.7 + - '#b8e186' + - - 0.8 + - '#7fbc41' + - - 0.9 + - '#4d9221' + - - 1 + - '#276419' sequential: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' sequentialminus: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' colorway: - - "#636efa" - - "#EF553B" - - "#00cc96" - - "#ab63fa" - - "#FFA15A" - - "#19d3f3" - - "#FF6692" - - "#B6E880" - - "#FF97FF" - - "#FECB52" + - '#636efa' + - '#EF553B' + - '#00cc96' + - '#ab63fa' + - '#FFA15A' + - '#19d3f3' + - '#FF6692' + - '#B6E880' + - '#FF97FF' + - '#FECB52' font: - color: "#2a3f5f" + color: '#2a3f5f' geo: bgcolor: white lakecolor: white - landcolor: "#E5ECF6" + landcolor: '#E5ECF6' showlakes: true showland: true subunitcolor: white @@ -1211,66 +1211,66 @@ layout: mapbox: style: light paper_bgcolor: white - plot_bgcolor: "#E5ECF6" + plot_bgcolor: '#E5ECF6' polar: angularaxis: gridcolor: white linecolor: white - ticks: "" - bgcolor: "#E5ECF6" + ticks: '' + bgcolor: '#E5ECF6' radialaxis: gridcolor: white linecolor: white - ticks: "" + ticks: '' scene: xaxis: - backgroundcolor: "#E5ECF6" + backgroundcolor: '#E5ECF6' gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: "" + ticks: '' zerolinecolor: white yaxis: - backgroundcolor: "#E5ECF6" + backgroundcolor: '#E5ECF6' gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: "" + ticks: '' zerolinecolor: white zaxis: - backgroundcolor: "#E5ECF6" + backgroundcolor: '#E5ECF6' gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: "" + ticks: '' zerolinecolor: white shapedefaults: line: - color: "#2a3f5f" + color: '#2a3f5f' ternary: aaxis: gridcolor: white linecolor: white - ticks: "" + ticks: '' baxis: gridcolor: white linecolor: white - ticks: "" - bgcolor: "#E5ECF6" + ticks: '' + bgcolor: '#E5ECF6' caxis: gridcolor: white linecolor: white - ticks: "" + ticks: '' title: x: 0.05 xaxis: automargin: true gridcolor: white linecolor: white - ticks: "" + ticks: '' title: standoff: 15 zerolinecolor: white @@ -1279,7 +1279,7 @@ layout: automargin: true gridcolor: white linecolor: white - ticks: "" + ticks: '' title: standoff: 15 zerolinecolor: white diff --git a/tests/test_display_plotly/test_pixel_field_sizing_modes.yml b/tests/test_display_plotly/test_pixel_field_sizing_modes.yml index 123d7c0d4..adcd92af0 100644 --- a/tests/test_display_plotly/test_pixel_field_sizing_modes.yml +++ b/tests/test_display_plotly/test_pixel_field_sizing_modes.yml @@ -1,880 +1,880 @@ data: - - color: "#2e91e5" - colorscale: - - - 0.0 - - "#00b050" - - - 0.16 - - "#00b050" - - - 0.26 - - "#dddddd" - - - 0.74 - - "#dddddd" - - - 0.8400000000000001 - - "#e71111" - - - 1.0 - - "#e71111" - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene - showlegend: true - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - - facecolor: - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - "#e15f99" - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (constant) - opacity: 1 - scene: scene - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 - - color: "#2e91e5" - colorscale: - - - 0.0 - - "#00b050" - - - 0.16 - - "#00b050" - - - 0.26 - - "#dddddd" - - - 0.74 - - "#dddddd" - - - 0.8400000000000001 - - "#e71111" - - - 1.0 - - "#e71111" - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene2 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - - facecolor: - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - "#1ca71c" - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (log) - opacity: 1 - scene: scene2 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P2yOkLu35+6/PRjq5fId8b9H9mtyqcryv7BpE/yHKfK/n+W43TsZ8L/JighgTsDtvwWRxrHDcPW/BZHGscNw9b8Gkcaxw3D1vwaRxrHDcPW/BZHGscNw9b/23XKceB7lv2yOkLu35+6/n+W43TsZ8L+waRP8hynyv0f2a3KpyvK/PRjq5fId8b/JighgTsDtv0oyfKGlUtE/STJ8oaVS0T9JMnyhpVLRP0kyfKGlUtE/STJ8oaVS0T9JMnyhpVLRv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgP0oyfKGlUtE/STJ8oaVS0T9JMnyhpVLRP0kyfKGlUtE/STJ8oaVS0T9JMnyhpVLRv8q4NyIkjPA/wjSORIjN7z+gLNkH8KzrP3ITKButauo/hc8rNBrE7T+cuvvP2B/xP/bdcpx4HuU/9t1ynHge5T/13XKceB7lP/Xdcpx4HuU/9t1ynHge5T8Fkcaxw3D1P8q4NyIkjPA/hs8rNBrE7T9yEygbrWrqP58s2QfwrOs/wjSORIjN7z+cuvvP2B/xPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPBK0dPrdC/S/5uYGtWiD87+a5dFgHPryv1tUmMm2LfO/aLAtmefW878RMfjRZfrovwAAAAAAAAAAHgNcCGSyxD/qJO7PK5W5P+ck7s8rlbm/HwNcCGSyxL8AAAAAAAAAABK0dPrdC/Q/aLAtmefW8z9bVJjJti3zP5rl0WAc+vI/5uYGtWiD8z8RMfjRZfroPwAAAAAAAPC/2zjfmpnh67/5oDtQWHTtv4Mv4tfTRfG/k2OQMjMP8r8AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/kmOQMjMP8j+EL+LX00XxP/mgO1BYdO0/2zjfmpnh6z8AAAAAAADwP9yXFgtE6Oe/MJ+kzTBS6L9KV89skqTpv8w0XD7HC+q/MzLylS756L945wMXzYLzvwAAAAAAAAAAHgNcCGSyxD/qJO7PK5W5P+ck7s8rlbm/HwNcCGSyxL8AAAAAAAAAANyXFgtE6Oc/MzLylS756D/MNFw+xwvqP0pXz2ySpOk/MJ+kzTBS6D945wMXzYLzPw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vL6pu/+M/aG/xXLTBRV+vb/7Rmss3Xaivz9DlJxmybc/1KdSf+Putz+O2HeynB6GPBhEGscOw8W/JIELwDTmqr9NApCTFJvBP04CkJMUm8E/H4ELwDTmqr8VRBrHDsOVPL6pu/+M/aG/0qdSf+Putz9BQ5ScZsm3P/dGayzddqK/xnLTBRV+vb+O2HeynB6GPEcyfKGlUsE/h/G7b4ZppT8UK1rZaAe8vxUrWtloB7y/g/G7b4ZppT9JMnyhpVKRPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPEcyfKGlUsE/h/G7b4ZppT8UK1rZaAe8vxUrWtloB7y/g/G7b4ZppT9JMnyhpVKRPL6pu/+M/aG/0qdSf+Putz9BQ5ScZsm3P/dGayzddqK/xnLTBRV+vb+O2HeynB6GPBhEGscOw8W/JIELwDTmqr9NApCTFJvBP04CkJMUm8E/H4ELwDTmqr8VRBrHDsOVPL6pu/+M/aG/xXLTBRV+vb/7Rmss3Xaivz9DlJxmybc/1KdSf+Putz+O2HeynB6GPA== - dtype: f8 - - color: "#2e91e5" - colorscale: - - - 0.0 - - "#00b050" - - - 0.16 - - "#00b050" - - - 0.26 - - "#dddddd" - - - 0.74 - - "#dddddd" - - - 0.8400000000000001 - - "#e71111" - - - 1.0 - - "#e71111" - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene3 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - - facecolor: - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - "#fb0d0d" - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#fde725" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#450e60" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#45327d" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - - "#440154" - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (linear) - opacity: 1 - scene: scene3 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P+gO76zh1u+/5iMtI/Mp8L8E13vz12jwvx1HZ4A0UfC/gMe2r7MD8L/PkoAni6vvvxmZey4NnvG/GZl7Lg2e8b8ZmXsuDZ7xvxmZey4NnvG/GZl7Lg2e8b/PzQij5cPsv+gO76zh1u+/gMe2r7MD8L8dR2eANFHwvwTXe/PXaPC/5iMtI/Mp8L/PkoAni6vvv4uRuefS4Kk/ipG559LgqT+Jkbnn0uCpP4mRuefS4Kk/ipG559LgqT+Kkbnn0uCpv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgP4uRuefS4Kk/ipG559LgqT+Jkbnn0uCpP4mRuefS4Kk/ipG559LgqT+Kkbnn0uCpv4x4iCmPFPA/AXGSoJj47z/GcTH/ll3vP/hRCBlQLu8/NbiluRms7z+Ytj9sOirwP8/NCKPlw+w/z80Io+XD7D/PzQij5cPsP8/NCKPlw+w/z80Io+XD7D8ZmXsuDZ7xP4x4iCmPFPA/NbiluRms7z/4UQgZUC7vP8ZxMf+WXe8/AXGSoJj47z+Ytj9sOirwPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPI5qty73l/C/pR14V/KD8L9oMXvzzW/wv5odn/dfd/C/k5kiHjKQ8L+wn9T5SPjuvwAAAAAAAAAAOsnC9pScqD9XEkqQ8mueP1MSSpDya56/OsnC9pScqL8AAAAAAAAAAI5qty73l/A/k5kiHjKQ8D+aHZ/3X3fwP2gxe/PNb/A/pR14V/KD8D+wn9T5SPjuPwAAAAAAAPC/tulJWBs777+31741UIbvvyWUIOXXPPC/JQvbU3Ji8L8AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/JQvbU3Ji8D8llCDl1zzwP7fXvjVQhu8/tulJWBs77z8AAAAAAADwP+QqkaIR0O6/2sy6w5vf7r/MxMEQQBHvvy+dCRlkIO+/tcQPURv47r8osBWD24PwvwAAAAAAAAAAOsnC9pScqD9XEkqQ8mueP1MSSpDya56/OsnC9pScqL8AAAAAAAAAAOQqkaIR0O4/tcQPURv47j8vnQkZZCDvP8zEwRBAEe8/2sy6w5vf7j8osBWD24PwPw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vD5M2x82HXW/WmBbIYBOkb+NiS6Tlqt1v9Wbt7Wz6os/tA+E5rIWjD83nt1ez/VZPI2RuefS4Km/ca2wjLv8j78a9AhXmO+kPxv0CFeY76Q/a62wjLv8j7+Kkbnn0uB5PD5M2x82HXW/sQ+E5rIWjD/Xm7e1s+qLP4mJLpOWq3W/WmBbIYBOkb83nt1ez/VZPIeRuefS4Jk/V62wjLv8fz8g9AhXmO+UvyH0CFeY75S/Ua2wjLv8fz+Kkbnn0uBpPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPIeRuefS4Jk/V62wjLv8fz8g9AhXmO+UvyH0CFeY75S/Ua2wjLv8fz+Kkbnn0uBpPD5M2x82HXW/sQ+E5rIWjD/Xm7e1s+qLP4mJLpOWq3W/WmBbIYBOkb83nt1ez/VZPI2RuefS4Km/ca2wjLv8j78a9AhXmO+kPxv0CFeY76Q/a62wjLv8j7+Kkbnn0uB5PD5M2x82HXW/WmBbIYBOkb+NiS6Tlqt1v9Wbt7Wz6os/tA+E5rIWjD83nt1ez/VZPA== - dtype: f8 +- color: '#2e91e5' + colorscale: + - - 0.0 + - '#00b050' + - - 0.16 + - '#00b050' + - - 0.26 + - '#dddddd' + - - 0.74 + - '#dddddd' + - - 0.8400000000000001 + - '#e71111' + - - 1.0 + - '#e71111' + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene + showlegend: true + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 +- facecolor: + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - '#e15f99' + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (constant) + opacity: 1 + scene: scene + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== + dtype: f8 +- color: '#2e91e5' + colorscale: + - - 0.0 + - '#00b050' + - - 0.16 + - '#00b050' + - - 0.26 + - '#dddddd' + - - 0.74 + - '#dddddd' + - - 0.8400000000000001 + - '#e71111' + - - 1.0 + - '#e71111' + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene2 + showlegend: false + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 +- facecolor: + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - '#1ca71c' + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (log) + opacity: 1 + scene: scene2 + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P2yOkLu35+6/PRjq5fId8b9H9mtyqcryv7BpE/yHKfK/n+W43TsZ8L/JighgTsDtvwWRxrHDcPW/BZHGscNw9b8Gkcaxw3D1vwaRxrHDcPW/BZHGscNw9b/23XKceB7lv2yOkLu35+6/n+W43TsZ8L+waRP8hynyv0f2a3KpyvK/PRjq5fId8b/JighgTsDtv0oyfKGlUtE/STJ8oaVS0T9JMnyhpVLRP0kyfKGlUtE/STJ8oaVS0T9JMnyhpVLRv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgP0oyfKGlUtE/STJ8oaVS0T9JMnyhpVLRP0kyfKGlUtE/STJ8oaVS0T9JMnyhpVLRv8q4NyIkjPA/wjSORIjN7z+gLNkH8KzrP3ITKButauo/hc8rNBrE7T+cuvvP2B/xP/bdcpx4HuU/9t1ynHge5T/13XKceB7lP/Xdcpx4HuU/9t1ynHge5T8Fkcaxw3D1P8q4NyIkjPA/hs8rNBrE7T9yEygbrWrqP58s2QfwrOs/wjSORIjN7z+cuvvP2B/xPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPBK0dPrdC/S/5uYGtWiD87+a5dFgHPryv1tUmMm2LfO/aLAtmefW878RMfjRZfrovwAAAAAAAAAAHgNcCGSyxD/qJO7PK5W5P+ck7s8rlbm/HwNcCGSyxL8AAAAAAAAAABK0dPrdC/Q/aLAtmefW8z9bVJjJti3zP5rl0WAc+vI/5uYGtWiD8z8RMfjRZfroPwAAAAAAAPC/2zjfmpnh67/5oDtQWHTtv4Mv4tfTRfG/k2OQMjMP8r8AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/kmOQMjMP8j+EL+LX00XxP/mgO1BYdO0/2zjfmpnh6z8AAAAAAADwP9yXFgtE6Oe/MJ+kzTBS6L9KV89skqTpv8w0XD7HC+q/MzLylS756L945wMXzYLzvwAAAAAAAAAAHgNcCGSyxD/qJO7PK5W5P+ck7s8rlbm/HwNcCGSyxL8AAAAAAAAAANyXFgtE6Oc/MzLylS756D/MNFw+xwvqP0pXz2ySpOk/MJ+kzTBS6D945wMXzYLzPw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vL6pu/+M/aG/xXLTBRV+vb/7Rmss3Xaivz9DlJxmybc/1KdSf+Putz+O2HeynB6GPBhEGscOw8W/JIELwDTmqr9NApCTFJvBP04CkJMUm8E/H4ELwDTmqr8VRBrHDsOVPL6pu/+M/aG/0qdSf+Putz9BQ5ScZsm3P/dGayzddqK/xnLTBRV+vb+O2HeynB6GPEcyfKGlUsE/h/G7b4ZppT8UK1rZaAe8vxUrWtloB7y/g/G7b4ZppT9JMnyhpVKRPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPEcyfKGlUsE/h/G7b4ZppT8UK1rZaAe8vxUrWtloB7y/g/G7b4ZppT9JMnyhpVKRPL6pu/+M/aG/0qdSf+Putz9BQ5ScZsm3P/dGayzddqK/xnLTBRV+vb+O2HeynB6GPBhEGscOw8W/JIELwDTmqr9NApCTFJvBP04CkJMUm8E/H4ELwDTmqr8VRBrHDsOVPL6pu/+M/aG/xXLTBRV+vb/7Rmss3Xaivz9DlJxmybc/1KdSf+Putz+O2HeynB6GPA== + dtype: f8 +- color: '#2e91e5' + colorscale: + - - 0.0 + - '#00b050' + - - 0.16 + - '#00b050' + - - 0.26 + - '#dddddd' + - - 0.74 + - '#dddddd' + - - 0.8400000000000001 + - '#e71111' + - - 1.0 + - '#e71111' + i: + bdata: BwAAAAQEAgYEAAMH + dtype: i1 + intensity: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 + j: + bdata: AAcBAgYHAQIFBQIC + dtype: i1 + k: + bdata: AwQCAwUGBQUAAQcG + dtype: i1 + legendgroup: Cuboid(id=ID) + name: Cuboid (1m|1m|1m) + opacity: 0.2 + scene: scene3 + showlegend: false + showscale: false + type: mesh3d + x: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 + y: + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 + z: + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 +- facecolor: + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - red + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - green + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - '#fb0d0d' + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - blue + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#fde725' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#450e60' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#45327d' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + - '#440154' + i: + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 + j: + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 + k: + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 + legendgroup: Sensor(id=ID) + name: Sensor (linear) + opacity: 1 + scene: scene3 + showlegend: true + type: mesh3d + x: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P+gO76zh1u+/5iMtI/Mp8L8E13vz12jwvx1HZ4A0UfC/gMe2r7MD8L/PkoAni6vvvxmZey4NnvG/GZl7Lg2e8b8ZmXsuDZ7xvxmZey4NnvG/GZl7Lg2e8b/PzQij5cPsv+gO76zh1u+/gMe2r7MD8L8dR2eANFHwvwTXe/PXaPC/5iMtI/Mp8L/PkoAni6vvv4uRuefS4Kk/ipG559LgqT+Jkbnn0uCpP4mRuefS4Kk/ipG559LgqT+Kkbnn0uCpv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgP4uRuefS4Kk/ipG559LgqT+Jkbnn0uCpP4mRuefS4Kk/ipG559LgqT+Kkbnn0uCpv4x4iCmPFPA/AXGSoJj47z/GcTH/ll3vP/hRCBlQLu8/NbiluRms7z+Ytj9sOirwP8/NCKPlw+w/z80Io+XD7D/PzQij5cPsP8/NCKPlw+w/z80Io+XD7D8ZmXsuDZ7xP4x4iCmPFPA/NbiluRms7z/4UQgZUC7vP8ZxMf+WXe8/AXGSoJj47z+Ytj9sOirwPw== + dtype: f8 + y: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPI5qty73l/C/pR14V/KD8L9oMXvzzW/wv5odn/dfd/C/k5kiHjKQ8L+wn9T5SPjuvwAAAAAAAAAAOsnC9pScqD9XEkqQ8mueP1MSSpDya56/OsnC9pScqL8AAAAAAAAAAI5qty73l/A/k5kiHjKQ8D+aHZ/3X3fwP2gxe/PNb/A/pR14V/KD8D+wn9T5SPjuPwAAAAAAAPC/tulJWBs777+31741UIbvvyWUIOXXPPC/JQvbU3Ji8L8AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/JQvbU3Ji8D8llCDl1zzwP7fXvjVQhu8/tulJWBs77z8AAAAAAADwP+QqkaIR0O6/2sy6w5vf7r/MxMEQQBHvvy+dCRlkIO+/tcQPURv47r8osBWD24PwvwAAAAAAAAAAOsnC9pScqD9XEkqQ8mueP1MSSpDya56/OsnC9pScqL8AAAAAAAAAAOQqkaIR0O4/tcQPURv47j8vnQkZZCDvP8zEwRBAEe8/2sy6w5vf7j8osBWD24PwPw== + dtype: f8 + z: + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vD5M2x82HXW/WmBbIYBOkb+NiS6Tlqt1v9Wbt7Wz6os/tA+E5rIWjD83nt1ez/VZPI2RuefS4Km/ca2wjLv8j78a9AhXmO+kPxv0CFeY76Q/a62wjLv8j7+Kkbnn0uB5PD5M2x82HXW/sQ+E5rIWjD/Xm7e1s+qLP4mJLpOWq3W/WmBbIYBOkb83nt1ez/VZPIeRuefS4Jk/V62wjLv8fz8g9AhXmO+UvyH0CFeY75S/Ua2wjLv8fz+Kkbnn0uBpPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPIeRuefS4Jk/V62wjLv8fz8g9AhXmO+UvyH0CFeY75S/Ua2wjLv8fz+Kkbnn0uBpPD5M2x82HXW/sQ+E5rIWjD/Xm7e1s+qLP4mJLpOWq3W/WmBbIYBOkb83nt1ez/VZPI2RuefS4Km/ca2wjLv8j78a9AhXmO+kPxv0CFeY76Q/a62wjLv8j7+Kkbnn0uB5PD5M2x82HXW/WmBbIYBOkb+NiS6Tlqt1v9Wbt7Wz6os/tA+E5rIWjD83nt1ez/VZPA== + dtype: f8 layout: legend: itemsizing: constant @@ -891,30 +891,30 @@ layout: z: 1.4 domain: x: - - 0.0 - - 0.2888888888888889 + - 0.0 + - 0.2888888888888889 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: x (m) yaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: y (m) zaxis: autorange: false range: - - -1.548792898897935 - - 1.548792898897935 + - -1.548792898897935 + - 1.548792898897935 title: text: z (m) scene2: @@ -930,30 +930,30 @@ layout: z: 1.4 domain: x: - - 0.35555555555555557 - - 0.6444444444444445 + - 0.35555555555555557 + - 0.6444444444444445 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.340030378757605 - - 1.340030378757605 + - -1.340030378757605 + - 1.340030378757605 title: text: x (m) yaxis: autorange: false range: - - -1.340030378757605 - - 1.340030378757605 + - -1.340030378757605 + - 1.340030378757605 title: text: y (m) zaxis: autorange: false range: - - -1.340030378757605 - - 1.340030378757605 + - -1.340030378757605 + - 1.340030378757605 title: text: z (m) scene3: @@ -969,402 +969,402 @@ layout: z: 1.4 domain: x: - - 0.7111111111111111 - - 1.0 + - 0.7111111111111111 + - 1.0 y: - - 0.0 - - 1.0 + - 0.0 + - 1.0 xaxis: autorange: false range: - - -1.1010867896780552 - - 1.1010867896780552 + - -1.1010867896780552 + - 1.1010867896780552 title: text: x (m) yaxis: autorange: false range: - - -1.1010867896780552 - - 1.1010867896780552 + - -1.1010867896780552 + - 1.1010867896780552 title: text: y (m) zaxis: autorange: false range: - - -1.1010867896780552 - - 1.1010867896780552 + - -1.1010867896780552 + - 1.1010867896780552 title: text: z (m) template: data: bar: - - error_x: - color: "#2a3f5f" - error_y: - color: "#2a3f5f" - marker: - line: - color: "#E5ECF6" - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: bar + - error_x: + color: '#2a3f5f' + error_y: + color: '#2a3f5f' + marker: + line: + color: '#E5ECF6' + width: 0.5 + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: bar barpolar: - - marker: - line: - color: "#E5ECF6" - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: barpolar + - marker: + line: + color: '#E5ECF6' + width: 0.5 + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: barpolar carpet: - - aaxis: - endlinecolor: "#2a3f5f" - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: "#2a3f5f" - baxis: - endlinecolor: "#2a3f5f" - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: "#2a3f5f" - type: carpet + - aaxis: + endlinecolor: '#2a3f5f' + gridcolor: white + linecolor: white + minorgridcolor: white + startlinecolor: '#2a3f5f' + baxis: + endlinecolor: '#2a3f5f' + gridcolor: white + linecolor: white + minorgridcolor: white + startlinecolor: '#2a3f5f' + type: carpet choropleth: - - colorbar: - outlinewidth: 0 - ticks: "" - type: choropleth + - colorbar: + outlinewidth: 0 + ticks: '' + type: choropleth contour: - - colorbar: - outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: contour + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: contour contourcarpet: - - colorbar: - outlinewidth: 0 - ticks: "" - type: contourcarpet + - colorbar: + outlinewidth: 0 + ticks: '' + type: contourcarpet heatmap: - - colorbar: - outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: heatmap + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: heatmap histogram: - - marker: - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: histogram + - marker: + pattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: histogram histogram2d: - - colorbar: - outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: histogram2d + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: histogram2d histogram2dcontour: - - colorbar: - outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: histogram2dcontour + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: histogram2dcontour mesh3d: - - colorbar: - outlinewidth: 0 - ticks: "" - type: mesh3d + - colorbar: + outlinewidth: 0 + ticks: '' + type: mesh3d parcoords: - - line: - colorbar: - outlinewidth: 0 - ticks: "" - type: parcoords + - line: + colorbar: + outlinewidth: 0 + ticks: '' + type: parcoords pie: - - automargin: true - type: pie + - automargin: true + type: pie scatter: - - fillpattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: scatter + - fillpattern: + fillmode: overlay + size: 10 + solidity: 0.2 + type: scatter scatter3d: - - line: - colorbar: - outlinewidth: 0 - ticks: "" - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scatter3d + - line: + colorbar: + outlinewidth: 0 + ticks: '' + marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scatter3d scattercarpet: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattercarpet + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattercarpet scattergeo: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattergeo + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattergeo scattergl: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattergl + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattergl scattermap: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattermap + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattermap scattermapbox: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scattermapbox + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scattermapbox scatterpolar: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scatterpolar + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scatterpolar scatterpolargl: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scatterpolargl + - marker: + colorbar: + outlinewidth: 0 + ticks: '' + type: scatterpolargl scatterternary: - - marker: - colorbar: - outlinewidth: 0 - ticks: "" - type: scatterternary - surface: - - colorbar: + - marker: + colorbar: outlinewidth: 0 - ticks: "" - colorscale: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" - type: surface + ticks: '' + type: scatterternary + surface: + - colorbar: + outlinewidth: 0 + ticks: '' + colorscale: + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' + type: surface table: - - cells: - fill: - color: "#EBF0F8" - line: - color: white - header: - fill: - color: "#C8D4E3" - line: - color: white - type: table + - cells: + fill: + color: '#EBF0F8' + line: + color: white + header: + fill: + color: '#C8D4E3' + line: + color: white + type: table layout: annotationdefaults: - arrowcolor: "#2a3f5f" + arrowcolor: '#2a3f5f' arrowhead: 0 arrowwidth: 1 autotypenumbers: strict coloraxis: colorbar: outlinewidth: 0 - ticks: "" + ticks: '' colorscale: diverging: - - - 0 - - "#8e0152" - - - 0.1 - - "#c51b7d" - - - 0.2 - - "#de77ae" - - - 0.3 - - "#f1b6da" - - - 0.4 - - "#fde0ef" - - - 0.5 - - "#f7f7f7" - - - 0.6 - - "#e6f5d0" - - - 0.7 - - "#b8e186" - - - 0.8 - - "#7fbc41" - - - 0.9 - - "#4d9221" - - - 1 - - "#276419" + - - 0 + - '#8e0152' + - - 0.1 + - '#c51b7d' + - - 0.2 + - '#de77ae' + - - 0.3 + - '#f1b6da' + - - 0.4 + - '#fde0ef' + - - 0.5 + - '#f7f7f7' + - - 0.6 + - '#e6f5d0' + - - 0.7 + - '#b8e186' + - - 0.8 + - '#7fbc41' + - - 0.9 + - '#4d9221' + - - 1 + - '#276419' sequential: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' sequentialminus: - - - 0.0 - - "#0d0887" - - - 0.1111111111111111 - - "#46039f" - - - 0.2222222222222222 - - "#7201a8" - - - 0.3333333333333333 - - "#9c179e" - - - 0.4444444444444444 - - "#bd3786" - - - 0.5555555555555556 - - "#d8576b" - - - 0.6666666666666666 - - "#ed7953" - - - 0.7777777777777778 - - "#fb9f3a" - - - 0.8888888888888888 - - "#fdca26" - - - 1.0 - - "#f0f921" + - - 0.0 + - '#0d0887' + - - 0.1111111111111111 + - '#46039f' + - - 0.2222222222222222 + - '#7201a8' + - - 0.3333333333333333 + - '#9c179e' + - - 0.4444444444444444 + - '#bd3786' + - - 0.5555555555555556 + - '#d8576b' + - - 0.6666666666666666 + - '#ed7953' + - - 0.7777777777777778 + - '#fb9f3a' + - - 0.8888888888888888 + - '#fdca26' + - - 1.0 + - '#f0f921' colorway: - - "#636efa" - - "#EF553B" - - "#00cc96" - - "#ab63fa" - - "#FFA15A" - - "#19d3f3" - - "#FF6692" - - "#B6E880" - - "#FF97FF" - - "#FECB52" + - '#636efa' + - '#EF553B' + - '#00cc96' + - '#ab63fa' + - '#FFA15A' + - '#19d3f3' + - '#FF6692' + - '#B6E880' + - '#FF97FF' + - '#FECB52' font: - color: "#2a3f5f" + color: '#2a3f5f' geo: bgcolor: white lakecolor: white - landcolor: "#E5ECF6" + landcolor: '#E5ECF6' showlakes: true showland: true subunitcolor: white @@ -1374,66 +1374,66 @@ layout: mapbox: style: light paper_bgcolor: white - plot_bgcolor: "#E5ECF6" + plot_bgcolor: '#E5ECF6' polar: angularaxis: gridcolor: white linecolor: white - ticks: "" - bgcolor: "#E5ECF6" + ticks: '' + bgcolor: '#E5ECF6' radialaxis: gridcolor: white linecolor: white - ticks: "" + ticks: '' scene: xaxis: - backgroundcolor: "#E5ECF6" + backgroundcolor: '#E5ECF6' gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: "" + ticks: '' zerolinecolor: white yaxis: - backgroundcolor: "#E5ECF6" + backgroundcolor: '#E5ECF6' gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: "" + ticks: '' zerolinecolor: white zaxis: - backgroundcolor: "#E5ECF6" + backgroundcolor: '#E5ECF6' gridcolor: white gridwidth: 2 linecolor: white showbackground: true - ticks: "" + ticks: '' zerolinecolor: white shapedefaults: line: - color: "#2a3f5f" + color: '#2a3f5f' ternary: aaxis: gridcolor: white linecolor: white - ticks: "" + ticks: '' baxis: gridcolor: white linecolor: white - ticks: "" - bgcolor: "#E5ECF6" + ticks: '' + bgcolor: '#E5ECF6' caxis: gridcolor: white linecolor: white - ticks: "" + ticks: '' title: x: 0.05 xaxis: automargin: true gridcolor: white linecolor: white - ticks: "" + ticks: '' title: standoff: 15 zerolinecolor: white @@ -1442,7 +1442,7 @@ layout: automargin: true gridcolor: white linecolor: white - ticks: "" + ticks: '' title: standoff: 15 zerolinecolor: white From 7fb380771d700a7eba7b26d2bafe729f8afbdf41 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sun, 18 May 2025 10:54:03 +0200 Subject: [PATCH 168/211] normalize bdata for crossplatform compat --- tests/conftest.py | 30 +- .../test_field_coloring_subplot.yml | 4900 ++++++++++++++++- .../test_pixel_field_color_scales.yml | 4900 ++++++++++++++++- .../test_pixel_field_directional_symbols.yml | 4538 ++++++++++++++- .../test_pixel_field_null_values.yml | 3482 +++++++++++- .../test_pixel_field_sizing_modes.yml | 3675 ++++++++++++- 6 files changed, 21092 insertions(+), 433 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index fccf2154a..c5ec80814 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,6 +2,7 @@ import re import warnings +import base64 import numpy as np import pytest @@ -30,6 +31,23 @@ def _sanitize_ids(obj): return obj +def _normalize_bdata(obj): + """Recursively decode bdata fields and convert to lists with canonical endianness.""" + if isinstance(obj, dict): + # If both bdata and dtype are present, decode and replace with list + if "bdata" in obj and "dtype" in obj: + b = base64.b64decode(obj["bdata"]) + dtype = np.dtype(obj["dtype"]) + # Always use little-endian for comparison + dtype_le = dtype.newbyteorder("<") + arr = np.frombuffer(b, dtype=dtype_le) + return arr.tolist() + return {k: _normalize_bdata(v) for k, v in obj.items()} + if isinstance(obj, list): + return [_normalize_bdata(i) for i in obj] + return obj + + @pytest.fixture def fig_regression_helper(data_regression, image_regression): """Regression helper for Plotly figures using to_plotly_json().""" @@ -41,16 +59,10 @@ def check_fig(fig, mode="data"): fig_data = fig.to_plotly_json() fig_data = _convert_ndarray_to_list(fig_data) fig_data = _sanitize_ids(fig_data) - data_regression.check( - fig_data, - # basename=basename, - ) + fig_data = _normalize_bdata(fig_data) + data_regression.check(fig_data) elif mode == "image": image_bytes = fig.to_image(format="png", scale=1) - image_regression.check( - image_data=image_bytes, - diff_threshold=0.1, - # basename=basename, - ) + image_regression.check(image_data=image_bytes, diff_threshold=0.1) return check_fig diff --git a/tests/test_display_plotly/test_field_coloring_subplot.yml b/tests/test_display_plotly/test_field_coloring_subplot.yml index 77a5ed01a..a24850dd7 100644 --- a/tests/test_display_plotly/test_field_coloring_subplot.yml +++ b/tests/test_display_plotly/test_field_coloring_subplot.yml @@ -14,17 +14,53 @@ data: - - 1.0 - '#e71111' i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 + - 7 + - 0 + - 0 + - 0 + - 4 + - 4 + - 2 + - 6 + - 4 + - 0 + - 3 + - 7 intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 + - 0.0 + - 0.0 + - 1.0 + - 1.0 + - 0.0 + - 0.0 + - 1.0 + - 1.0 j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 + - 0 + - 7 + - 1 + - 2 + - 6 + - 7 + - 1 + - 2 + - 5 + - 5 + - 2 + - 2 k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 + - 3 + - 4 + - 2 + - 3 + - 5 + - 6 + - 5 + - 5 + - 0 + - 1 + - 7 + - 6 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -33,14 +69,32 @@ data: showscale: false type: mesh3d x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 - facecolor: - '#e15f99' - '#e15f99' @@ -268,14 +322,683 @@ data: - '#440154' - '#440154' i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 + - 75 + - 64 + - 2 + - 75 + - 76 + - 65 + - 65 + - 64 + - 2 + - 0 + - 1 + - 0 + - 84 + - 86 + - 86 + - 90 + - 90 + - 92 + - 92 + - 91 + - 91 + - 87 + - 87 + - 85 + - 85 + - 83 + - 83 + - 82 + - 82 + - 84 + - 94 + - 86 + - 86 + - 84 + - 84 + - 82 + - 82 + - 83 + - 83 + - 85 + - 85 + - 87 + - 87 + - 87 + - 91 + - 91 + - 92 + - 92 + - 90 + - 90 + - 94 + - 95 + - 88 + - 78 + - 79 + - 81 + - 80 + - 93 + - 96 + - 89 + - 77 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 50 + - 52 + - 52 + - 44 + - 44 + - 32 + - 32 + - 22 + - 22 + - 14 + - 14 + - 20 + - 20 + - 30 + - 30 + - 41 + - 41 + - 50 + - 57 + - 52 + - 52 + - 50 + - 50 + - 41 + - 41 + - 30 + - 30 + - 20 + - 20 + - 14 + - 14 + - 14 + - 22 + - 22 + - 32 + - 32 + - 44 + - 44 + - 57 + - 11 + - 4 + - 12 + - 58 + - 62 + - 8 + - 7 + - 39 + - 61 + - 42 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 48 + - 54 + - 54 + - 47 + - 47 + - 37 + - 37 + - 25 + - 25 + - 17 + - 17 + - 18 + - 18 + - 26 + - 26 + - 38 + - 38 + - 48 + - 59 + - 54 + - 54 + - 48 + - 48 + - 38 + - 38 + - 26 + - 26 + - 18 + - 18 + - 17 + - 17 + - 17 + - 25 + - 25 + - 37 + - 37 + - 47 + - 47 + - 59 + - 27 + - 5 + - 10 + - 56 + - 60 + - 6 + - 9 + - 55 + - 63 + - 28 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 98 + - 99 + - 100 + - 101 + - 102 + - 104 + - 105 + - 106 + - 107 + - 108 + - 110 + - 111 + - 112 + - 113 + - 114 + - 116 + - 117 + - 118 + - 119 + - 120 + - 122 + - 123 + - 124 + - 125 + - 126 + - 128 + - 129 + - 130 + - 131 + - 132 + - 134 + - 135 + - 136 + - 137 + - 138 + - 140 + - 141 + - 142 + - 143 + - 144 + - 146 + - 147 + - 148 + - 149 + - 150 j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 + - 76 + - 76 + - 3 + - 3 + - 3 + - 3 + - 1 + - 1 + - 75 + - 75 + - 3 + - 3 + - 70 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 71 + - 71 + - 69 + - 69 + - 67 + - 67 + - 66 + - 66 + - 68 + - 68 + - 89 + - 89 + - 81 + - 81 + - 79 + - 79 + - 77 + - 77 + - 78 + - 78 + - 80 + - 80 + - 88 + - 93 + - 93 + - 95 + - 95 + - 96 + - 96 + - 94 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 68 + - 68 + - 66 + - 66 + - 67 + - 67 + - 69 + - 51 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 13 + - 13 + - 19 + - 19 + - 29 + - 29 + - 40 + - 40 + - 49 + - 49 + - 61 + - 61 + - 62 + - 62 + - 58 + - 58 + - 42 + - 42 + - 12 + - 12 + - 8 + - 8 + - 4 + - 7 + - 7 + - 11 + - 11 + - 39 + - 39 + - 57 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 49 + - 49 + - 40 + - 40 + - 29 + - 29 + - 19 + - 53 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 15 + - 15 + - 16 + - 16 + - 24 + - 24 + - 36 + - 36 + - 46 + - 46 + - 63 + - 63 + - 60 + - 60 + - 56 + - 56 + - 28 + - 28 + - 10 + - 10 + - 6 + - 6 + - 5 + - 9 + - 9 + - 27 + - 27 + - 55 + - 55 + - 59 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 46 + - 46 + - 36 + - 36 + - 24 + - 24 + - 16 + - 99 + - 100 + - 101 + - 102 + - 98 + - 105 + - 106 + - 107 + - 108 + - 104 + - 111 + - 112 + - 113 + - 114 + - 110 + - 117 + - 118 + - 119 + - 120 + - 116 + - 123 + - 124 + - 125 + - 126 + - 122 + - 129 + - 130 + - 131 + - 132 + - 128 + - 135 + - 136 + - 137 + - 138 + - 134 + - 141 + - 142 + - 143 + - 144 + - 140 + - 147 + - 148 + - 149 + - 150 + - 146 k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 + - 64 + - 65 + - 75 + - 76 + - 65 + - 1 + - 64 + - 0 + - 0 + - 64 + - 0 + - 2 + - 86 + - 72 + - 90 + - 74 + - 92 + - 73 + - 91 + - 71 + - 87 + - 69 + - 85 + - 67 + - 83 + - 66 + - 82 + - 68 + - 84 + - 70 + - 86 + - 81 + - 84 + - 79 + - 82 + - 77 + - 83 + - 78 + - 85 + - 80 + - 87 + - 88 + - 93 + - 91 + - 95 + - 92 + - 96 + - 90 + - 94 + - 86 + - 89 + - 96 + - 93 + - 80 + - 77 + - 79 + - 88 + - 95 + - 94 + - 81 + - 78 + - 72 + - 66 + - 74 + - 67 + - 73 + - 69 + - 71 + - 52 + - 43 + - 44 + - 31 + - 32 + - 21 + - 22 + - 13 + - 14 + - 19 + - 20 + - 29 + - 30 + - 40 + - 41 + - 49 + - 50 + - 51 + - 52 + - 62 + - 50 + - 58 + - 41 + - 42 + - 30 + - 12 + - 20 + - 8 + - 14 + - 4 + - 7 + - 22 + - 11 + - 32 + - 39 + - 44 + - 57 + - 52 + - 61 + - 39 + - 7 + - 8 + - 42 + - 58 + - 4 + - 11 + - 57 + - 62 + - 12 + - 43 + - 40 + - 31 + - 29 + - 21 + - 19 + - 13 + - 54 + - 45 + - 47 + - 35 + - 37 + - 23 + - 25 + - 15 + - 17 + - 16 + - 18 + - 24 + - 26 + - 36 + - 38 + - 46 + - 48 + - 53 + - 54 + - 60 + - 48 + - 56 + - 38 + - 28 + - 26 + - 10 + - 18 + - 6 + - 17 + - 5 + - 9 + - 25 + - 27 + - 37 + - 55 + - 47 + - 59 + - 54 + - 63 + - 55 + - 9 + - 6 + - 28 + - 56 + - 5 + - 27 + - 59 + - 60 + - 10 + - 45 + - 36 + - 35 + - 24 + - 23 + - 16 + - 15 + - 103 + - 103 + - 103 + - 103 + - 103 + - 109 + - 109 + - 109 + - 109 + - 109 + - 115 + - 115 + - 115 + - 115 + - 115 + - 121 + - 121 + - 121 + - 121 + - 121 + - 127 + - 127 + - 127 + - 127 + - 127 + - 133 + - 133 + - 133 + - 133 + - 133 + - 139 + - 139 + - 139 + - 139 + - 139 + - 145 + - 145 + - 145 + - 145 + - 145 + - 151 + - 151 + - 151 + - 151 + - 151 legendgroup: Sensor(id=ID) name: Sensor (H) opacity: 1 @@ -283,14 +1006,464 @@ data: showlegend: true type: mesh3d x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014992463600000002 + - -0.014392395300000003 + - -0.014392395300000003 + - -0.012869499600000002 + - -0.012355425950000002 + - -0.009822911000000002 + - -0.009822911000000002 + - -0.0066605612500000005 + - -0.005795627850000001 + - 0.0 + - -0.004997477680000001 + - 0.0 + - 0.0 + - -0.0046984631550000015 + - -0.0046984631550000015 + - 0.0 + - -0.003930366410000001 + - 0.0 + - -0.003726213425000001 + - 0.0 + - 0.0 + - -0.0025000000350000003 + - -0.0025000000350000003 + - -0.0021347226600000008 + - -0.0021347226600000008 + - 0.0 + - -0.0010241928500000002 + - 0.0 + - -0.0007114128200000001 + - -1.0408340850000002e-17 + - -9.553993650000002e-18 + - 0.0 + - 0.0 + - 0.0008682409300000002 + - 0.0008682409300000002 + - 0.0016630589950000004 + - 0.0 + - 0.0023612117400000003 + - 0.0026042407400000004 + - 0.0 + - 0.0026362657550000005 + - 0.0 + - 0.0 + - 0.003830222040000001 + - 0.003830222040000001 + - 0.0 + - 0.004641779140000001 + - 0.0 + - 0.004750406370000001 + - 0.0 + - 0.0049999997000000004 + - 0.006231224900000001 + - 0.006231224900000001 + - 0.00945867 + - 0.010177281500000003 + - 0.012618804000000003 + - 0.012618804000000003 + - 0.014251218750000003 + - 0.014519108850000004 + - 0.014999999100000003 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.10000000000000002 + - -0.9257545044462104 + - -1.151493064908857 + - -1.3786213269384155 + - -1.2932557522157282 + - -1.01336866353838 + - -0.8475013375904817 + - -1.5 + - -1.5 + - -1.5 + - -1.5 + - -1.5 + - -0.5 + - -0.9257545044462104 + - -1.01336866353838 + - -1.2932557522157282 + - -1.3786213269384155 + - -1.151493064908857 + - -0.8475013375904817 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - -0.49999999999999994 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - 1.0742454955537897 + - 0.9866313364616199 + - 0.7067442477842719 + - 0.6213786730615845 + - 0.8485069350911429 + - 1.1524986624095181 + - 0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 + - 1.5 + - 1.0742454955537897 + - 0.8485069350911429 + - 0.6213786730615845 + - 0.7067442477842718 + - 0.9866313364616199 + - 1.1524986624095181 y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - -0.004225988315000001 + - 0.004225988315000001 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.011336243900000001 + - 0.011336243900000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0017101006600000004 + - 0.0017101006600000004 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.004330126940000001 + - 0.004330126940000001 + - -0.014847321800000002 + - 0.014847321800000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.10000000000000002 + - 0.0 + - 0.0 + - -0.0049240388000000015 + - 0.0049240388000000015 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0032139379550000006 + - 0.0032139379550000006 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.013644480700000003 + - 0.013644480700000003 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.008109612750000002 + - 0.008109612750000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.00028137136250000006 + - 0.0078714803 + - -0.008344890200000002 + - 0.013525193950000004 + - -0.013758964850000003 + - -0.0016490003100000004 + - 0.0017709132300000002 + - -0.0042973283700000016 + - 0.0043621968500000005 + - -0.004934888705000001 + - 0.004912360015000001 + - 0.014884752050000002 + - -0.014804665750000005 + - -0.0032633595150000005 + - 0.0031639754750000006 + - -6.486846850000001e-05 + - 0.011518507450000002 + - -0.011149990550000002 + - 0.004495218770000001 + - -0.0039552707250000005 + - 9.925023200000001e-18 + - -1.548792898897935 + - -1.4764986529115414 + - -1.4037593459363646 + - -1.4310982278939868 + - -1.5207338931333951 + - -0.5238233962453553 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 1.548792898897935 + - 1.5207338931333951 + - 1.4310982278939868 + - 1.4037593459363646 + - 1.4764986529115414 + - 0.5238233962453553 + - -1.0 + - -0.7622358709262116 + - -0.8530536869268817 + - -1.1469463130731183 + - -1.2377641290737884 + - -1.0 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 1.0 + - 1.2377641290737884 + - 1.1469463130731183 + - 0.8530536869268818 + - 0.7622358709262116 + - 1.0 + - -0.45120710110206497 + - -0.47926610686660476 + - -0.5689017721060132 + - -0.5962406540636354 + - -0.5235013470884586 + - -1.4761766037546447 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 0.45120710110206497 + - 0.5235013470884586 + - 0.5962406540636354 + - 0.5689017721060132 + - 0.47926610686660476 + - 1.4761766037546447 z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.0004754300695000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.007705580450000002 + - -0.008505494900000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.013440123200000004 + - -0.013835124650000002 + - 0.0 + - 0.00015880254800000005 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.003090666795000001 + - 0.0 + - 0.0033339664350000007 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0048939786850000005 + - 0.0 + - 0.004949130490000001 + - 0.10000000000000002 + - -3.1374891150000003e-18 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.014907522500000003 + - 0.0 + - -0.004407344015000001 + - -0.014772200600000002 + - 0.0 + - 0.0042485412200000015 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0018584636950000003 + - 0.0 + - 0.0015600122500000005 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.011641889050000001 + - -0.011019207550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.004680036755000001 + - -0.003767693415000001 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014997360100000004 + - -0.012768703700000003 + - -0.012464462200000002 + - -0.006486073150000001 + - -0.005974184350000002 + - -0.004720254240000001 + - -0.004675881190000001 + - -0.0025559673100000006 + - -0.0024436118100000007 + - 0.0008042847750000002 + - 0.0009320507750000002 + - 0.0018558396050000002 + - 0.0024128545100000004 + - 0.003788203375000001 + - 0.0038715966050000008 + - 0.004999579490000001 + - 0.009608536200000002 + - 0.0100338295 + - 0.014310590900000003 + - 0.014469133300000003 + - -1.6175736900000002e-18 + - -0.0762493312047592 + - -0.24999777010606963 + - -0.0782577878324744 + - 0.20163179734122239 + - 0.2028730918020804 + - 8.326672684688674e-17 + - -0.2500000000000001 + - -0.07725424859373697 + - 0.20225424859373672 + - 0.20225424859373675 + - -0.07725424859373692 + - 1.1102230246251565e-16 + - -0.0762493312047592 + - 0.20287309180208038 + - 0.20163179734122244 + - -0.07825778783247435 + - -0.24999777010606966 + - 8.326672684688674e-17 + - 0.2499999999999999 + - 0.07725424859373675 + - -0.20225424859373695 + - -0.20225424859373697 + - 0.0772542485937367 + - 1.1102230246251565e-16 + - -0.2500000000000001 + - -0.07725424859373697 + - 0.20225424859373672 + - 0.20225424859373675 + - -0.07725424859373692 + - 1.1102230246251565e-16 + - 0.2499999999999999 + - 0.07725424859373675 + - -0.20225424859373695 + - -0.20225424859373697 + - 0.0772542485937367 + - 1.1102230246251565e-16 + - -0.0762493312047592 + - 0.20287309180208038 + - 0.20163179734122244 + - -0.07825778783247435 + - -0.24999777010606966 + - 8.326672684688674e-17 + - -0.2500000000000001 + - -0.07725424859373697 + - 0.20225424859373672 + - 0.20225424859373675 + - -0.07725424859373692 + - 1.1102230246251565e-16 + - -0.0762493312047592 + - -0.24999777010606963 + - -0.0782577878324744 + - 0.20163179734122239 + - 0.2028730918020804 + - 8.326672684688674e-17 - color: '#2e91e5' colorscale: - - 0.0 @@ -306,17 +1479,53 @@ data: - - 1.0 - '#e71111' i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 + - 7 + - 0 + - 0 + - 0 + - 4 + - 4 + - 2 + - 6 + - 4 + - 0 + - 3 + - 7 intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 + - 0.0 + - 0.0 + - 1.0 + - 1.0 + - 0.0 + - 0.0 + - 1.0 + - 1.0 j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 + - 0 + - 7 + - 1 + - 2 + - 6 + - 7 + - 1 + - 2 + - 5 + - 5 + - 2 + - 2 k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 + - 3 + - 4 + - 2 + - 3 + - 5 + - 6 + - 5 + - 5 + - 0 + - 1 + - 7 + - 6 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -325,14 +1534,32 @@ data: showscale: false type: mesh3d x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 - facecolor: - '#1ca71c' - '#1ca71c' @@ -560,14 +1787,683 @@ data: - '#b2beb5' - '#b2beb5' i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 + - 75 + - 64 + - 2 + - 75 + - 76 + - 65 + - 65 + - 64 + - 2 + - 0 + - 1 + - 0 + - 84 + - 86 + - 86 + - 90 + - 90 + - 92 + - 92 + - 91 + - 91 + - 87 + - 87 + - 85 + - 85 + - 83 + - 83 + - 82 + - 82 + - 84 + - 94 + - 86 + - 86 + - 84 + - 84 + - 82 + - 82 + - 83 + - 83 + - 85 + - 85 + - 87 + - 87 + - 87 + - 91 + - 91 + - 92 + - 92 + - 90 + - 90 + - 94 + - 95 + - 88 + - 78 + - 79 + - 81 + - 80 + - 93 + - 96 + - 89 + - 77 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 50 + - 52 + - 52 + - 44 + - 44 + - 32 + - 32 + - 22 + - 22 + - 14 + - 14 + - 20 + - 20 + - 30 + - 30 + - 41 + - 41 + - 50 + - 57 + - 52 + - 52 + - 50 + - 50 + - 41 + - 41 + - 30 + - 30 + - 20 + - 20 + - 14 + - 14 + - 14 + - 22 + - 22 + - 32 + - 32 + - 44 + - 44 + - 57 + - 11 + - 4 + - 12 + - 58 + - 62 + - 8 + - 7 + - 39 + - 61 + - 42 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 48 + - 54 + - 54 + - 47 + - 47 + - 37 + - 37 + - 25 + - 25 + - 17 + - 17 + - 18 + - 18 + - 26 + - 26 + - 38 + - 38 + - 48 + - 59 + - 54 + - 54 + - 48 + - 48 + - 38 + - 38 + - 26 + - 26 + - 18 + - 18 + - 17 + - 17 + - 17 + - 25 + - 25 + - 37 + - 37 + - 47 + - 47 + - 59 + - 27 + - 5 + - 10 + - 56 + - 60 + - 6 + - 9 + - 55 + - 63 + - 28 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 98 + - 99 + - 100 + - 101 + - 102 + - 104 + - 105 + - 106 + - 107 + - 108 + - 110 + - 111 + - 112 + - 113 + - 114 + - 116 + - 117 + - 118 + - 119 + - 120 + - 122 + - 123 + - 124 + - 125 + - 126 + - 128 + - 129 + - 130 + - 131 + - 132 + - 134 + - 135 + - 136 + - 137 + - 138 + - 140 + - 141 + - 142 + - 143 + - 144 + - 146 + - 147 + - 148 + - 149 + - 150 j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 + - 76 + - 76 + - 3 + - 3 + - 3 + - 3 + - 1 + - 1 + - 75 + - 75 + - 3 + - 3 + - 70 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 71 + - 71 + - 69 + - 69 + - 67 + - 67 + - 66 + - 66 + - 68 + - 68 + - 89 + - 89 + - 81 + - 81 + - 79 + - 79 + - 77 + - 77 + - 78 + - 78 + - 80 + - 80 + - 88 + - 93 + - 93 + - 95 + - 95 + - 96 + - 96 + - 94 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 68 + - 68 + - 66 + - 66 + - 67 + - 67 + - 69 + - 51 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 13 + - 13 + - 19 + - 19 + - 29 + - 29 + - 40 + - 40 + - 49 + - 49 + - 61 + - 61 + - 62 + - 62 + - 58 + - 58 + - 42 + - 42 + - 12 + - 12 + - 8 + - 8 + - 4 + - 7 + - 7 + - 11 + - 11 + - 39 + - 39 + - 57 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 49 + - 49 + - 40 + - 40 + - 29 + - 29 + - 19 + - 53 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 15 + - 15 + - 16 + - 16 + - 24 + - 24 + - 36 + - 36 + - 46 + - 46 + - 63 + - 63 + - 60 + - 60 + - 56 + - 56 + - 28 + - 28 + - 10 + - 10 + - 6 + - 6 + - 5 + - 9 + - 9 + - 27 + - 27 + - 55 + - 55 + - 59 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 46 + - 46 + - 36 + - 36 + - 24 + - 24 + - 16 + - 99 + - 100 + - 101 + - 102 + - 98 + - 105 + - 106 + - 107 + - 108 + - 104 + - 111 + - 112 + - 113 + - 114 + - 110 + - 117 + - 118 + - 119 + - 120 + - 116 + - 123 + - 124 + - 125 + - 126 + - 122 + - 129 + - 130 + - 131 + - 132 + - 128 + - 135 + - 136 + - 137 + - 138 + - 134 + - 141 + - 142 + - 143 + - 144 + - 140 + - 147 + - 148 + - 149 + - 150 + - 146 k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 + - 64 + - 65 + - 75 + - 76 + - 65 + - 1 + - 64 + - 0 + - 0 + - 64 + - 0 + - 2 + - 86 + - 72 + - 90 + - 74 + - 92 + - 73 + - 91 + - 71 + - 87 + - 69 + - 85 + - 67 + - 83 + - 66 + - 82 + - 68 + - 84 + - 70 + - 86 + - 81 + - 84 + - 79 + - 82 + - 77 + - 83 + - 78 + - 85 + - 80 + - 87 + - 88 + - 93 + - 91 + - 95 + - 92 + - 96 + - 90 + - 94 + - 86 + - 89 + - 96 + - 93 + - 80 + - 77 + - 79 + - 88 + - 95 + - 94 + - 81 + - 78 + - 72 + - 66 + - 74 + - 67 + - 73 + - 69 + - 71 + - 52 + - 43 + - 44 + - 31 + - 32 + - 21 + - 22 + - 13 + - 14 + - 19 + - 20 + - 29 + - 30 + - 40 + - 41 + - 49 + - 50 + - 51 + - 52 + - 62 + - 50 + - 58 + - 41 + - 42 + - 30 + - 12 + - 20 + - 8 + - 14 + - 4 + - 7 + - 22 + - 11 + - 32 + - 39 + - 44 + - 57 + - 52 + - 61 + - 39 + - 7 + - 8 + - 42 + - 58 + - 4 + - 11 + - 57 + - 62 + - 12 + - 43 + - 40 + - 31 + - 29 + - 21 + - 19 + - 13 + - 54 + - 45 + - 47 + - 35 + - 37 + - 23 + - 25 + - 15 + - 17 + - 16 + - 18 + - 24 + - 26 + - 36 + - 38 + - 46 + - 48 + - 53 + - 54 + - 60 + - 48 + - 56 + - 38 + - 28 + - 26 + - 10 + - 18 + - 6 + - 17 + - 5 + - 9 + - 25 + - 27 + - 37 + - 55 + - 47 + - 59 + - 54 + - 63 + - 55 + - 9 + - 6 + - 28 + - 56 + - 5 + - 27 + - 59 + - 60 + - 10 + - 45 + - 36 + - 35 + - 24 + - 23 + - 16 + - 15 + - 103 + - 103 + - 103 + - 103 + - 103 + - 109 + - 109 + - 109 + - 109 + - 109 + - 115 + - 115 + - 115 + - 115 + - 115 + - 121 + - 121 + - 121 + - 121 + - 121 + - 127 + - 127 + - 127 + - 127 + - 127 + - 133 + - 133 + - 133 + - 133 + - 133 + - 139 + - 139 + - 139 + - 139 + - 139 + - 145 + - 145 + - 145 + - 145 + - 145 + - 151 + - 151 + - 151 + - 151 + - 151 legendgroup: Sensor(id=ID) name: Sensor (Jxy) opacity: 1 @@ -575,14 +2471,464 @@ data: showlegend: true type: mesh3d x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014992463600000002 + - -0.014392395300000003 + - -0.014392395300000003 + - -0.012869499600000002 + - -0.012355425950000002 + - -0.009822911000000002 + - -0.009822911000000002 + - -0.0066605612500000005 + - -0.005795627850000001 + - 0.0 + - -0.004997477680000001 + - 0.0 + - 0.0 + - -0.0046984631550000015 + - -0.0046984631550000015 + - 0.0 + - -0.003930366410000001 + - 0.0 + - -0.003726213425000001 + - 0.0 + - 0.0 + - -0.0025000000350000003 + - -0.0025000000350000003 + - -0.0021347226600000008 + - -0.0021347226600000008 + - 0.0 + - -0.0010241928500000002 + - 0.0 + - -0.0007114128200000001 + - -1.0408340850000002e-17 + - -9.553993650000002e-18 + - 0.0 + - 0.0 + - 0.0008682409300000002 + - 0.0008682409300000002 + - 0.0016630589950000004 + - 0.0 + - 0.0023612117400000003 + - 0.0026042407400000004 + - 0.0 + - 0.0026362657550000005 + - 0.0 + - 0.0 + - 0.003830222040000001 + - 0.003830222040000001 + - 0.0 + - 0.004641779140000001 + - 0.0 + - 0.004750406370000001 + - 0.0 + - 0.0049999997000000004 + - 0.006231224900000001 + - 0.006231224900000001 + - 0.00945867 + - 0.010177281500000003 + - 0.012618804000000003 + - 0.012618804000000003 + - 0.014251218750000003 + - 0.014519108850000004 + - 0.014999999100000003 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.10000000000000002 + - -0.9257545044462104 + - -1.151493064908857 + - -1.3786213269384155 + - -1.2932557522157282 + - -1.01336866353838 + - -0.8475013375904817 + - -1.5 + - -1.5 + - -1.5 + - -1.5 + - -1.5 + - -0.5 + - -0.9257545044462104 + - -1.01336866353838 + - -1.2932557522157282 + - -1.3786213269384155 + - -1.151493064908857 + - -0.8475013375904817 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - -0.49999999999999994 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - 1.0742454955537897 + - 0.9866313364616199 + - 0.7067442477842719 + - 0.6213786730615845 + - 0.8485069350911429 + - 1.1524986624095181 + - 0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 + - 1.5 + - 1.0742454955537897 + - 0.8485069350911429 + - 0.6213786730615845 + - 0.7067442477842718 + - 0.9866313364616199 + - 1.1524986624095181 y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - -0.004225988315000001 + - 0.004225988315000001 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.011336243900000001 + - 0.011336243900000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0017101006600000004 + - 0.0017101006600000004 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.004330126940000001 + - 0.004330126940000001 + - -0.014847321800000002 + - 0.014847321800000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.10000000000000002 + - 0.0 + - 0.0 + - -0.0049240388000000015 + - 0.0049240388000000015 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0032139379550000006 + - 0.0032139379550000006 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.013644480700000003 + - 0.013644480700000003 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.008109612750000002 + - 0.008109612750000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.00028137136250000006 + - 0.0078714803 + - -0.008344890200000002 + - 0.013525193950000004 + - -0.013758964850000003 + - -0.0016490003100000004 + - 0.0017709132300000002 + - -0.0042973283700000016 + - 0.0043621968500000005 + - -0.004934888705000001 + - 0.004912360015000001 + - 0.014884752050000002 + - -0.014804665750000005 + - -0.0032633595150000005 + - 0.0031639754750000006 + - -6.486846850000001e-05 + - 0.011518507450000002 + - -0.011149990550000002 + - 0.004495218770000001 + - -0.0039552707250000005 + - 9.925023200000001e-18 + - -1.548792898897935 + - -1.4764986529115414 + - -1.4037593459363646 + - -1.4310982278939868 + - -1.5207338931333951 + - -0.5238233962453553 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 1.548792898897935 + - 1.5207338931333951 + - 1.4310982278939868 + - 1.4037593459363646 + - 1.4764986529115414 + - 0.5238233962453553 + - -1.0 + - -0.7622358709262116 + - -0.8530536869268817 + - -1.1469463130731183 + - -1.2377641290737884 + - -1.0 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 1.0 + - 1.2377641290737884 + - 1.1469463130731183 + - 0.8530536869268818 + - 0.7622358709262116 + - 1.0 + - -0.45120710110206497 + - -0.47926610686660476 + - -0.5689017721060132 + - -0.5962406540636354 + - -0.5235013470884586 + - -1.4761766037546447 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 0.45120710110206497 + - 0.5235013470884586 + - 0.5962406540636354 + - 0.5689017721060132 + - 0.47926610686660476 + - 1.4761766037546447 z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.0004754300695000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.007705580450000002 + - -0.008505494900000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.013440123200000004 + - -0.013835124650000002 + - 0.0 + - 0.00015880254800000005 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.003090666795000001 + - 0.0 + - 0.0033339664350000007 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0048939786850000005 + - 0.0 + - 0.004949130490000001 + - 0.10000000000000002 + - -3.1374891150000003e-18 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.014907522500000003 + - 0.0 + - -0.004407344015000001 + - -0.014772200600000002 + - 0.0 + - 0.0042485412200000015 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0018584636950000003 + - 0.0 + - 0.0015600122500000005 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.011641889050000001 + - -0.011019207550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.004680036755000001 + - -0.003767693415000001 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014997360100000004 + - -0.012768703700000003 + - -0.012464462200000002 + - -0.006486073150000001 + - -0.005974184350000002 + - -0.004720254240000001 + - -0.004675881190000001 + - -0.0025559673100000006 + - -0.0024436118100000007 + - 0.0008042847750000002 + - 0.0009320507750000002 + - 0.0018558396050000002 + - 0.0024128545100000004 + - 0.003788203375000001 + - 0.0038715966050000008 + - 0.004999579490000001 + - 0.009608536200000002 + - 0.0100338295 + - 0.014310590900000003 + - 0.014469133300000003 + - -1.6175736900000002e-18 + - -0.0762493312047592 + - -0.24999777010606963 + - -0.0782577878324744 + - 0.20163179734122239 + - 0.2028730918020804 + - 8.326672684688674e-17 + - -0.2500000000000001 + - -0.07725424859373697 + - 0.20225424859373672 + - 0.20225424859373675 + - -0.07725424859373692 + - 1.1102230246251565e-16 + - -0.0762493312047592 + - 0.20287309180208038 + - 0.20163179734122244 + - -0.07825778783247435 + - -0.24999777010606966 + - 8.326672684688674e-17 + - 0.2499999999999999 + - 0.07725424859373675 + - -0.20225424859373695 + - -0.20225424859373697 + - 0.0772542485937367 + - 1.1102230246251565e-16 + - -0.2500000000000001 + - -0.07725424859373697 + - 0.20225424859373672 + - 0.20225424859373675 + - -0.07725424859373692 + - 1.1102230246251565e-16 + - 0.2499999999999999 + - 0.07725424859373675 + - -0.20225424859373695 + - -0.20225424859373697 + - 0.0772542485937367 + - 1.1102230246251565e-16 + - -0.0762493312047592 + - 0.20287309180208038 + - 0.20163179734122244 + - -0.07825778783247435 + - -0.24999777010606966 + - 8.326672684688674e-17 + - -0.2500000000000001 + - -0.07725424859373697 + - 0.20225424859373672 + - 0.20225424859373675 + - -0.07725424859373692 + - 1.1102230246251565e-16 + - -0.0762493312047592 + - -0.24999777010606963 + - -0.0782577878324744 + - 0.20163179734122239 + - 0.2028730918020804 + - 8.326672684688674e-17 - color: '#2e91e5' colorscale: - - 0.0 @@ -598,17 +2944,53 @@ data: - - 1.0 - '#e71111' i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 + - 7 + - 0 + - 0 + - 0 + - 4 + - 4 + - 2 + - 6 + - 4 + - 0 + - 3 + - 7 intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 + - 0.0 + - 0.0 + - 1.0 + - 1.0 + - 0.0 + - 0.0 + - 1.0 + - 1.0 j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 + - 0 + - 7 + - 1 + - 2 + - 6 + - 7 + - 1 + - 2 + - 5 + - 5 + - 2 + - 2 k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 + - 3 + - 4 + - 2 + - 3 + - 5 + - 6 + - 5 + - 5 + - 0 + - 1 + - 7 + - 6 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -617,14 +2999,32 @@ data: showscale: false type: mesh3d x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 - facecolor: - '#fb0d0d' - '#fb0d0d' @@ -852,14 +3252,683 @@ data: - '#b2beb5' - '#b2beb5' i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 + - 75 + - 64 + - 2 + - 75 + - 76 + - 65 + - 65 + - 64 + - 2 + - 0 + - 1 + - 0 + - 84 + - 86 + - 86 + - 90 + - 90 + - 92 + - 92 + - 91 + - 91 + - 87 + - 87 + - 85 + - 85 + - 83 + - 83 + - 82 + - 82 + - 84 + - 94 + - 86 + - 86 + - 84 + - 84 + - 82 + - 82 + - 83 + - 83 + - 85 + - 85 + - 87 + - 87 + - 87 + - 91 + - 91 + - 92 + - 92 + - 90 + - 90 + - 94 + - 95 + - 88 + - 78 + - 79 + - 81 + - 80 + - 93 + - 96 + - 89 + - 77 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 50 + - 52 + - 52 + - 44 + - 44 + - 32 + - 32 + - 22 + - 22 + - 14 + - 14 + - 20 + - 20 + - 30 + - 30 + - 41 + - 41 + - 50 + - 57 + - 52 + - 52 + - 50 + - 50 + - 41 + - 41 + - 30 + - 30 + - 20 + - 20 + - 14 + - 14 + - 14 + - 22 + - 22 + - 32 + - 32 + - 44 + - 44 + - 57 + - 11 + - 4 + - 12 + - 58 + - 62 + - 8 + - 7 + - 39 + - 61 + - 42 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 48 + - 54 + - 54 + - 47 + - 47 + - 37 + - 37 + - 25 + - 25 + - 17 + - 17 + - 18 + - 18 + - 26 + - 26 + - 38 + - 38 + - 48 + - 59 + - 54 + - 54 + - 48 + - 48 + - 38 + - 38 + - 26 + - 26 + - 18 + - 18 + - 17 + - 17 + - 17 + - 25 + - 25 + - 37 + - 37 + - 47 + - 47 + - 59 + - 27 + - 5 + - 10 + - 56 + - 60 + - 6 + - 9 + - 55 + - 63 + - 28 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 98 + - 99 + - 100 + - 101 + - 102 + - 104 + - 105 + - 106 + - 107 + - 108 + - 110 + - 111 + - 112 + - 113 + - 114 + - 116 + - 117 + - 118 + - 119 + - 120 + - 122 + - 123 + - 124 + - 125 + - 126 + - 128 + - 129 + - 130 + - 131 + - 132 + - 134 + - 135 + - 136 + - 137 + - 138 + - 140 + - 141 + - 142 + - 143 + - 144 + - 146 + - 147 + - 148 + - 149 + - 150 j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 + - 76 + - 76 + - 3 + - 3 + - 3 + - 3 + - 1 + - 1 + - 75 + - 75 + - 3 + - 3 + - 70 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 71 + - 71 + - 69 + - 69 + - 67 + - 67 + - 66 + - 66 + - 68 + - 68 + - 89 + - 89 + - 81 + - 81 + - 79 + - 79 + - 77 + - 77 + - 78 + - 78 + - 80 + - 80 + - 88 + - 93 + - 93 + - 95 + - 95 + - 96 + - 96 + - 94 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 68 + - 68 + - 66 + - 66 + - 67 + - 67 + - 69 + - 51 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 13 + - 13 + - 19 + - 19 + - 29 + - 29 + - 40 + - 40 + - 49 + - 49 + - 61 + - 61 + - 62 + - 62 + - 58 + - 58 + - 42 + - 42 + - 12 + - 12 + - 8 + - 8 + - 4 + - 7 + - 7 + - 11 + - 11 + - 39 + - 39 + - 57 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 49 + - 49 + - 40 + - 40 + - 29 + - 29 + - 19 + - 53 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 15 + - 15 + - 16 + - 16 + - 24 + - 24 + - 36 + - 36 + - 46 + - 46 + - 63 + - 63 + - 60 + - 60 + - 56 + - 56 + - 28 + - 28 + - 10 + - 10 + - 6 + - 6 + - 5 + - 9 + - 9 + - 27 + - 27 + - 55 + - 55 + - 59 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 46 + - 46 + - 36 + - 36 + - 24 + - 24 + - 16 + - 99 + - 100 + - 101 + - 102 + - 98 + - 105 + - 106 + - 107 + - 108 + - 104 + - 111 + - 112 + - 113 + - 114 + - 110 + - 117 + - 118 + - 119 + - 120 + - 116 + - 123 + - 124 + - 125 + - 126 + - 122 + - 129 + - 130 + - 131 + - 132 + - 128 + - 135 + - 136 + - 137 + - 138 + - 134 + - 141 + - 142 + - 143 + - 144 + - 140 + - 147 + - 148 + - 149 + - 150 + - 146 k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 + - 64 + - 65 + - 75 + - 76 + - 65 + - 1 + - 64 + - 0 + - 0 + - 64 + - 0 + - 2 + - 86 + - 72 + - 90 + - 74 + - 92 + - 73 + - 91 + - 71 + - 87 + - 69 + - 85 + - 67 + - 83 + - 66 + - 82 + - 68 + - 84 + - 70 + - 86 + - 81 + - 84 + - 79 + - 82 + - 77 + - 83 + - 78 + - 85 + - 80 + - 87 + - 88 + - 93 + - 91 + - 95 + - 92 + - 96 + - 90 + - 94 + - 86 + - 89 + - 96 + - 93 + - 80 + - 77 + - 79 + - 88 + - 95 + - 94 + - 81 + - 78 + - 72 + - 66 + - 74 + - 67 + - 73 + - 69 + - 71 + - 52 + - 43 + - 44 + - 31 + - 32 + - 21 + - 22 + - 13 + - 14 + - 19 + - 20 + - 29 + - 30 + - 40 + - 41 + - 49 + - 50 + - 51 + - 52 + - 62 + - 50 + - 58 + - 41 + - 42 + - 30 + - 12 + - 20 + - 8 + - 14 + - 4 + - 7 + - 22 + - 11 + - 32 + - 39 + - 44 + - 57 + - 52 + - 61 + - 39 + - 7 + - 8 + - 42 + - 58 + - 4 + - 11 + - 57 + - 62 + - 12 + - 43 + - 40 + - 31 + - 29 + - 21 + - 19 + - 13 + - 54 + - 45 + - 47 + - 35 + - 37 + - 23 + - 25 + - 15 + - 17 + - 16 + - 18 + - 24 + - 26 + - 36 + - 38 + - 46 + - 48 + - 53 + - 54 + - 60 + - 48 + - 56 + - 38 + - 28 + - 26 + - 10 + - 18 + - 6 + - 17 + - 5 + - 9 + - 25 + - 27 + - 37 + - 55 + - 47 + - 59 + - 54 + - 63 + - 55 + - 9 + - 6 + - 28 + - 56 + - 5 + - 27 + - 59 + - 60 + - 10 + - 45 + - 36 + - 35 + - 24 + - 23 + - 16 + - 15 + - 103 + - 103 + - 103 + - 103 + - 103 + - 109 + - 109 + - 109 + - 109 + - 109 + - 115 + - 115 + - 115 + - 115 + - 115 + - 121 + - 121 + - 121 + - 121 + - 121 + - 127 + - 127 + - 127 + - 127 + - 127 + - 133 + - 133 + - 133 + - 133 + - 133 + - 139 + - 139 + - 139 + - 139 + - 139 + - 145 + - 145 + - 145 + - 145 + - 145 + - 151 + - 151 + - 151 + - 151 + - 151 legendgroup: Sensor(id=ID) name: Sensor (Bz) opacity: 1 @@ -867,14 +3936,464 @@ data: showlegend: true type: mesh3d x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014992463600000002 + - -0.014392395300000003 + - -0.014392395300000003 + - -0.012869499600000002 + - -0.012355425950000002 + - -0.009822911000000002 + - -0.009822911000000002 + - -0.0066605612500000005 + - -0.005795627850000001 + - 0.0 + - -0.004997477680000001 + - 0.0 + - 0.0 + - -0.0046984631550000015 + - -0.0046984631550000015 + - 0.0 + - -0.003930366410000001 + - 0.0 + - -0.003726213425000001 + - 0.0 + - 0.0 + - -0.0025000000350000003 + - -0.0025000000350000003 + - -0.0021347226600000008 + - -0.0021347226600000008 + - 0.0 + - -0.0010241928500000002 + - 0.0 + - -0.0007114128200000001 + - -1.0408340850000002e-17 + - -9.553993650000002e-18 + - 0.0 + - 0.0 + - 0.0008682409300000002 + - 0.0008682409300000002 + - 0.0016630589950000004 + - 0.0 + - 0.0023612117400000003 + - 0.0026042407400000004 + - 0.0 + - 0.0026362657550000005 + - 0.0 + - 0.0 + - 0.003830222040000001 + - 0.003830222040000001 + - 0.0 + - 0.004641779140000001 + - 0.0 + - 0.004750406370000001 + - 0.0 + - 0.0049999997000000004 + - 0.006231224900000001 + - 0.006231224900000001 + - 0.00945867 + - 0.010177281500000003 + - 0.012618804000000003 + - 0.012618804000000003 + - 0.014251218750000003 + - 0.014519108850000004 + - 0.014999999100000003 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.10000000000000002 + - -0.9257545044462104 + - -1.151493064908857 + - -1.3786213269384155 + - -1.2932557522157282 + - -1.01336866353838 + - -0.8475013375904817 + - -1.5 + - -1.5 + - -1.5 + - -1.5 + - -1.5 + - -0.5 + - -0.9257545044462104 + - -1.01336866353838 + - -1.2932557522157282 + - -1.3786213269384155 + - -1.151493064908857 + - -0.8475013375904817 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - -0.49999999999999994 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - 1.0742454955537897 + - 0.9866313364616199 + - 0.7067442477842719 + - 0.6213786730615845 + - 0.8485069350911429 + - 1.1524986624095181 + - 0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 + - 1.5 + - 1.0742454955537897 + - 0.8485069350911429 + - 0.6213786730615845 + - 0.7067442477842718 + - 0.9866313364616199 + - 1.1524986624095181 y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - -0.004225988315000001 + - 0.004225988315000001 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.011336243900000001 + - 0.011336243900000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0017101006600000004 + - 0.0017101006600000004 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.004330126940000001 + - 0.004330126940000001 + - -0.014847321800000002 + - 0.014847321800000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.10000000000000002 + - 0.0 + - 0.0 + - -0.0049240388000000015 + - 0.0049240388000000015 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0032139379550000006 + - 0.0032139379550000006 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.013644480700000003 + - 0.013644480700000003 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.008109612750000002 + - 0.008109612750000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.00028137136250000006 + - 0.0078714803 + - -0.008344890200000002 + - 0.013525193950000004 + - -0.013758964850000003 + - -0.0016490003100000004 + - 0.0017709132300000002 + - -0.0042973283700000016 + - 0.0043621968500000005 + - -0.004934888705000001 + - 0.004912360015000001 + - 0.014884752050000002 + - -0.014804665750000005 + - -0.0032633595150000005 + - 0.0031639754750000006 + - -6.486846850000001e-05 + - 0.011518507450000002 + - -0.011149990550000002 + - 0.004495218770000001 + - -0.0039552707250000005 + - 9.925023200000001e-18 + - -1.548792898897935 + - -1.4764986529115414 + - -1.4037593459363646 + - -1.4310982278939868 + - -1.5207338931333951 + - -0.5238233962453553 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 1.548792898897935 + - 1.5207338931333951 + - 1.4310982278939868 + - 1.4037593459363646 + - 1.4764986529115414 + - 0.5238233962453553 + - -1.0 + - -0.7622358709262116 + - -0.8530536869268817 + - -1.1469463130731183 + - -1.2377641290737884 + - -1.0 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 1.0 + - 1.2377641290737884 + - 1.1469463130731183 + - 0.8530536869268818 + - 0.7622358709262116 + - 1.0 + - -0.45120710110206497 + - -0.47926610686660476 + - -0.5689017721060132 + - -0.5962406540636354 + - -0.5235013470884586 + - -1.4761766037546447 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 0.45120710110206497 + - 0.5235013470884586 + - 0.5962406540636354 + - 0.5689017721060132 + - 0.47926610686660476 + - 1.4761766037546447 z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.0004754300695000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.007705580450000002 + - -0.008505494900000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.013440123200000004 + - -0.013835124650000002 + - 0.0 + - 0.00015880254800000005 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.003090666795000001 + - 0.0 + - 0.0033339664350000007 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0048939786850000005 + - 0.0 + - 0.004949130490000001 + - 0.10000000000000002 + - -3.1374891150000003e-18 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.014907522500000003 + - 0.0 + - -0.004407344015000001 + - -0.014772200600000002 + - 0.0 + - 0.0042485412200000015 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0018584636950000003 + - 0.0 + - 0.0015600122500000005 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.011641889050000001 + - -0.011019207550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.004680036755000001 + - -0.003767693415000001 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014997360100000004 + - -0.012768703700000003 + - -0.012464462200000002 + - -0.006486073150000001 + - -0.005974184350000002 + - -0.004720254240000001 + - -0.004675881190000001 + - -0.0025559673100000006 + - -0.0024436118100000007 + - 0.0008042847750000002 + - 0.0009320507750000002 + - 0.0018558396050000002 + - 0.0024128545100000004 + - 0.003788203375000001 + - 0.0038715966050000008 + - 0.004999579490000001 + - 0.009608536200000002 + - 0.0100338295 + - 0.014310590900000003 + - 0.014469133300000003 + - -1.6175736900000002e-18 + - -0.0762493312047592 + - -0.24999777010606963 + - -0.0782577878324744 + - 0.20163179734122239 + - 0.2028730918020804 + - 8.326672684688674e-17 + - -0.2500000000000001 + - -0.07725424859373697 + - 0.20225424859373672 + - 0.20225424859373675 + - -0.07725424859373692 + - 1.1102230246251565e-16 + - -0.0762493312047592 + - 0.20287309180208038 + - 0.20163179734122244 + - -0.07825778783247435 + - -0.24999777010606966 + - 8.326672684688674e-17 + - 0.2499999999999999 + - 0.07725424859373675 + - -0.20225424859373695 + - -0.20225424859373697 + - 0.0772542485937367 + - 1.1102230246251565e-16 + - -0.2500000000000001 + - -0.07725424859373697 + - 0.20225424859373672 + - 0.20225424859373675 + - -0.07725424859373692 + - 1.1102230246251565e-16 + - 0.2499999999999999 + - 0.07725424859373675 + - -0.20225424859373695 + - -0.20225424859373697 + - 0.0772542485937367 + - 1.1102230246251565e-16 + - -0.0762493312047592 + - 0.20287309180208038 + - 0.20163179734122244 + - -0.07825778783247435 + - -0.24999777010606966 + - 8.326672684688674e-17 + - -0.2500000000000001 + - -0.07725424859373697 + - 0.20225424859373672 + - 0.20225424859373675 + - -0.07725424859373692 + - 1.1102230246251565e-16 + - -0.0762493312047592 + - -0.24999777010606963 + - -0.0782577878324744 + - 0.20163179734122239 + - 0.2028730918020804 + - 8.326672684688674e-17 - color: '#2e91e5' colorscale: - - 0.0 @@ -890,17 +4409,53 @@ data: - - 1.0 - '#e71111' i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 + - 7 + - 0 + - 0 + - 0 + - 4 + - 4 + - 2 + - 6 + - 4 + - 0 + - 3 + - 7 intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 + - 0.0 + - 0.0 + - 1.0 + - 1.0 + - 0.0 + - 0.0 + - 1.0 + - 1.0 j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 + - 0 + - 7 + - 1 + - 2 + - 6 + - 7 + - 1 + - 2 + - 5 + - 5 + - 2 + - 2 k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 + - 3 + - 4 + - 2 + - 3 + - 5 + - 6 + - 5 + - 5 + - 0 + - 1 + - 7 + - 6 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -909,14 +4464,32 @@ data: showscale: false type: mesh3d x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 - facecolor: - '#da16ff' - '#da16ff' @@ -1144,14 +4717,683 @@ data: - black - black i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 + - 75 + - 64 + - 2 + - 75 + - 76 + - 65 + - 65 + - 64 + - 2 + - 0 + - 1 + - 0 + - 84 + - 86 + - 86 + - 90 + - 90 + - 92 + - 92 + - 91 + - 91 + - 87 + - 87 + - 85 + - 85 + - 83 + - 83 + - 82 + - 82 + - 84 + - 94 + - 86 + - 86 + - 84 + - 84 + - 82 + - 82 + - 83 + - 83 + - 85 + - 85 + - 87 + - 87 + - 87 + - 91 + - 91 + - 92 + - 92 + - 90 + - 90 + - 94 + - 95 + - 88 + - 78 + - 79 + - 81 + - 80 + - 93 + - 96 + - 89 + - 77 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 50 + - 52 + - 52 + - 44 + - 44 + - 32 + - 32 + - 22 + - 22 + - 14 + - 14 + - 20 + - 20 + - 30 + - 30 + - 41 + - 41 + - 50 + - 57 + - 52 + - 52 + - 50 + - 50 + - 41 + - 41 + - 30 + - 30 + - 20 + - 20 + - 14 + - 14 + - 14 + - 22 + - 22 + - 32 + - 32 + - 44 + - 44 + - 57 + - 11 + - 4 + - 12 + - 58 + - 62 + - 8 + - 7 + - 39 + - 61 + - 42 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 48 + - 54 + - 54 + - 47 + - 47 + - 37 + - 37 + - 25 + - 25 + - 17 + - 17 + - 18 + - 18 + - 26 + - 26 + - 38 + - 38 + - 48 + - 59 + - 54 + - 54 + - 48 + - 48 + - 38 + - 38 + - 26 + - 26 + - 18 + - 18 + - 17 + - 17 + - 17 + - 25 + - 25 + - 37 + - 37 + - 47 + - 47 + - 59 + - 27 + - 5 + - 10 + - 56 + - 60 + - 6 + - 9 + - 55 + - 63 + - 28 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 98 + - 99 + - 100 + - 101 + - 102 + - 104 + - 105 + - 106 + - 107 + - 108 + - 110 + - 111 + - 112 + - 113 + - 114 + - 116 + - 117 + - 118 + - 119 + - 120 + - 122 + - 123 + - 124 + - 125 + - 126 + - 128 + - 129 + - 130 + - 131 + - 132 + - 134 + - 135 + - 136 + - 137 + - 138 + - 140 + - 141 + - 142 + - 143 + - 144 + - 146 + - 147 + - 148 + - 149 + - 150 j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 + - 76 + - 76 + - 3 + - 3 + - 3 + - 3 + - 1 + - 1 + - 75 + - 75 + - 3 + - 3 + - 70 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 71 + - 71 + - 69 + - 69 + - 67 + - 67 + - 66 + - 66 + - 68 + - 68 + - 89 + - 89 + - 81 + - 81 + - 79 + - 79 + - 77 + - 77 + - 78 + - 78 + - 80 + - 80 + - 88 + - 93 + - 93 + - 95 + - 95 + - 96 + - 96 + - 94 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 68 + - 68 + - 66 + - 66 + - 67 + - 67 + - 69 + - 51 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 13 + - 13 + - 19 + - 19 + - 29 + - 29 + - 40 + - 40 + - 49 + - 49 + - 61 + - 61 + - 62 + - 62 + - 58 + - 58 + - 42 + - 42 + - 12 + - 12 + - 8 + - 8 + - 4 + - 7 + - 7 + - 11 + - 11 + - 39 + - 39 + - 57 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 49 + - 49 + - 40 + - 40 + - 29 + - 29 + - 19 + - 53 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 15 + - 15 + - 16 + - 16 + - 24 + - 24 + - 36 + - 36 + - 46 + - 46 + - 63 + - 63 + - 60 + - 60 + - 56 + - 56 + - 28 + - 28 + - 10 + - 10 + - 6 + - 6 + - 5 + - 9 + - 9 + - 27 + - 27 + - 55 + - 55 + - 59 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 46 + - 46 + - 36 + - 36 + - 24 + - 24 + - 16 + - 99 + - 100 + - 101 + - 102 + - 98 + - 105 + - 106 + - 107 + - 108 + - 104 + - 111 + - 112 + - 113 + - 114 + - 110 + - 117 + - 118 + - 119 + - 120 + - 116 + - 123 + - 124 + - 125 + - 126 + - 122 + - 129 + - 130 + - 131 + - 132 + - 128 + - 135 + - 136 + - 137 + - 138 + - 134 + - 141 + - 142 + - 143 + - 144 + - 140 + - 147 + - 148 + - 149 + - 150 + - 146 k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 + - 64 + - 65 + - 75 + - 76 + - 65 + - 1 + - 64 + - 0 + - 0 + - 64 + - 0 + - 2 + - 86 + - 72 + - 90 + - 74 + - 92 + - 73 + - 91 + - 71 + - 87 + - 69 + - 85 + - 67 + - 83 + - 66 + - 82 + - 68 + - 84 + - 70 + - 86 + - 81 + - 84 + - 79 + - 82 + - 77 + - 83 + - 78 + - 85 + - 80 + - 87 + - 88 + - 93 + - 91 + - 95 + - 92 + - 96 + - 90 + - 94 + - 86 + - 89 + - 96 + - 93 + - 80 + - 77 + - 79 + - 88 + - 95 + - 94 + - 81 + - 78 + - 72 + - 66 + - 74 + - 67 + - 73 + - 69 + - 71 + - 52 + - 43 + - 44 + - 31 + - 32 + - 21 + - 22 + - 13 + - 14 + - 19 + - 20 + - 29 + - 30 + - 40 + - 41 + - 49 + - 50 + - 51 + - 52 + - 62 + - 50 + - 58 + - 41 + - 42 + - 30 + - 12 + - 20 + - 8 + - 14 + - 4 + - 7 + - 22 + - 11 + - 32 + - 39 + - 44 + - 57 + - 52 + - 61 + - 39 + - 7 + - 8 + - 42 + - 58 + - 4 + - 11 + - 57 + - 62 + - 12 + - 43 + - 40 + - 31 + - 29 + - 21 + - 19 + - 13 + - 54 + - 45 + - 47 + - 35 + - 37 + - 23 + - 25 + - 15 + - 17 + - 16 + - 18 + - 24 + - 26 + - 36 + - 38 + - 46 + - 48 + - 53 + - 54 + - 60 + - 48 + - 56 + - 38 + - 28 + - 26 + - 10 + - 18 + - 6 + - 17 + - 5 + - 9 + - 25 + - 27 + - 37 + - 55 + - 47 + - 59 + - 54 + - 63 + - 55 + - 9 + - 6 + - 28 + - 56 + - 5 + - 27 + - 59 + - 60 + - 10 + - 45 + - 36 + - 35 + - 24 + - 23 + - 16 + - 15 + - 103 + - 103 + - 103 + - 103 + - 103 + - 109 + - 109 + - 109 + - 109 + - 109 + - 115 + - 115 + - 115 + - 115 + - 115 + - 121 + - 121 + - 121 + - 121 + - 121 + - 127 + - 127 + - 127 + - 127 + - 127 + - 133 + - 133 + - 133 + - 133 + - 133 + - 139 + - 139 + - 139 + - 139 + - 139 + - 145 + - 145 + - 145 + - 145 + - 145 + - 151 + - 151 + - 151 + - 151 + - 151 legendgroup: Sensor(id=ID) name: Sensor (False) opacity: 1 @@ -1159,14 +5401,464 @@ data: showlegend: true type: mesh3d x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014992463600000002 + - -0.014392395300000003 + - -0.014392395300000003 + - -0.012869499600000002 + - -0.012355425950000002 + - -0.009822911000000002 + - -0.009822911000000002 + - -0.0066605612500000005 + - -0.005795627850000001 + - 0.0 + - -0.004997477680000001 + - 0.0 + - 0.0 + - -0.0046984631550000015 + - -0.0046984631550000015 + - 0.0 + - -0.003930366410000001 + - 0.0 + - -0.003726213425000001 + - 0.0 + - 0.0 + - -0.0025000000350000003 + - -0.0025000000350000003 + - -0.0021347226600000008 + - -0.0021347226600000008 + - 0.0 + - -0.0010241928500000002 + - 0.0 + - -0.0007114128200000001 + - -1.0408340850000002e-17 + - -9.553993650000002e-18 + - 0.0 + - 0.0 + - 0.0008682409300000002 + - 0.0008682409300000002 + - 0.0016630589950000004 + - 0.0 + - 0.0023612117400000003 + - 0.0026042407400000004 + - 0.0 + - 0.0026362657550000005 + - 0.0 + - 0.0 + - 0.003830222040000001 + - 0.003830222040000001 + - 0.0 + - 0.004641779140000001 + - 0.0 + - 0.004750406370000001 + - 0.0 + - 0.0049999997000000004 + - 0.006231224900000001 + - 0.006231224900000001 + - 0.00945867 + - 0.010177281500000003 + - 0.012618804000000003 + - 0.012618804000000003 + - 0.014251218750000003 + - 0.014519108850000004 + - 0.014999999100000003 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.10000000000000002 + - -0.9257545044462104 + - -1.151493064908857 + - -1.3786213269384155 + - -1.2932557522157282 + - -1.01336866353838 + - -0.8475013375904817 + - -1.5 + - -1.5 + - -1.5 + - -1.5 + - -1.5 + - -0.5 + - -0.9257545044462104 + - -1.01336866353838 + - -1.2932557522157282 + - -1.3786213269384155 + - -1.151493064908857 + - -0.8475013375904817 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - -0.49999999999999994 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - 1.0742454955537897 + - 0.9866313364616199 + - 0.7067442477842719 + - 0.6213786730615845 + - 0.8485069350911429 + - 1.1524986624095181 + - 0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 + - 1.5 + - 1.0742454955537897 + - 0.8485069350911429 + - 0.6213786730615845 + - 0.7067442477842718 + - 0.9866313364616199 + - 1.1524986624095181 y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - -0.004225988315000001 + - 0.004225988315000001 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.011336243900000001 + - 0.011336243900000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0017101006600000004 + - 0.0017101006600000004 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.004330126940000001 + - 0.004330126940000001 + - -0.014847321800000002 + - 0.014847321800000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.10000000000000002 + - 0.0 + - 0.0 + - -0.0049240388000000015 + - 0.0049240388000000015 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0032139379550000006 + - 0.0032139379550000006 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.013644480700000003 + - 0.013644480700000003 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.008109612750000002 + - 0.008109612750000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.00028137136250000006 + - 0.0078714803 + - -0.008344890200000002 + - 0.013525193950000004 + - -0.013758964850000003 + - -0.0016490003100000004 + - 0.0017709132300000002 + - -0.0042973283700000016 + - 0.0043621968500000005 + - -0.004934888705000001 + - 0.004912360015000001 + - 0.014884752050000002 + - -0.014804665750000005 + - -0.0032633595150000005 + - 0.0031639754750000006 + - -6.486846850000001e-05 + - 0.011518507450000002 + - -0.011149990550000002 + - 0.004495218770000001 + - -0.0039552707250000005 + - 9.925023200000001e-18 + - -1.548792898897935 + - -1.4764986529115414 + - -1.4037593459363646 + - -1.4310982278939868 + - -1.5207338931333951 + - -0.5238233962453553 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 1.548792898897935 + - 1.5207338931333951 + - 1.4310982278939868 + - 1.4037593459363646 + - 1.4764986529115414 + - 0.5238233962453553 + - -1.0 + - -0.7622358709262116 + - -0.8530536869268817 + - -1.1469463130731183 + - -1.2377641290737884 + - -1.0 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 1.0 + - 1.2377641290737884 + - 1.1469463130731183 + - 0.8530536869268818 + - 0.7622358709262116 + - 1.0 + - -0.45120710110206497 + - -0.47926610686660476 + - -0.5689017721060132 + - -0.5962406540636354 + - -0.5235013470884586 + - -1.4761766037546447 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 0.45120710110206497 + - 0.5235013470884586 + - 0.5962406540636354 + - 0.5689017721060132 + - 0.47926610686660476 + - 1.4761766037546447 z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.0004754300695000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.007705580450000002 + - -0.008505494900000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.013440123200000004 + - -0.013835124650000002 + - 0.0 + - 0.00015880254800000005 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.003090666795000001 + - 0.0 + - 0.0033339664350000007 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0048939786850000005 + - 0.0 + - 0.004949130490000001 + - 0.10000000000000002 + - -3.1374891150000003e-18 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.014907522500000003 + - 0.0 + - -0.004407344015000001 + - -0.014772200600000002 + - 0.0 + - 0.0042485412200000015 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0018584636950000003 + - 0.0 + - 0.0015600122500000005 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.011641889050000001 + - -0.011019207550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.004680036755000001 + - -0.003767693415000001 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014997360100000004 + - -0.012768703700000003 + - -0.012464462200000002 + - -0.006486073150000001 + - -0.005974184350000002 + - -0.004720254240000001 + - -0.004675881190000001 + - -0.0025559673100000006 + - -0.0024436118100000007 + - 0.0008042847750000002 + - 0.0009320507750000002 + - 0.0018558396050000002 + - 0.0024128545100000004 + - 0.003788203375000001 + - 0.0038715966050000008 + - 0.004999579490000001 + - 0.009608536200000002 + - 0.0100338295 + - 0.014310590900000003 + - 0.014469133300000003 + - -1.6175736900000002e-18 + - -0.0762493312047592 + - -0.24999777010606963 + - -0.0782577878324744 + - 0.20163179734122239 + - 0.2028730918020804 + - 8.326672684688674e-17 + - -0.2500000000000001 + - -0.07725424859373697 + - 0.20225424859373672 + - 0.20225424859373675 + - -0.07725424859373692 + - 1.1102230246251565e-16 + - -0.0762493312047592 + - 0.20287309180208038 + - 0.20163179734122244 + - -0.07825778783247435 + - -0.24999777010606966 + - 8.326672684688674e-17 + - 0.2499999999999999 + - 0.07725424859373675 + - -0.20225424859373695 + - -0.20225424859373697 + - 0.0772542485937367 + - 1.1102230246251565e-16 + - -0.2500000000000001 + - -0.07725424859373697 + - 0.20225424859373672 + - 0.20225424859373675 + - -0.07725424859373692 + - 1.1102230246251565e-16 + - 0.2499999999999999 + - 0.07725424859373675 + - -0.20225424859373695 + - -0.20225424859373697 + - 0.0772542485937367 + - 1.1102230246251565e-16 + - -0.0762493312047592 + - 0.20287309180208038 + - 0.20163179734122244 + - -0.07825778783247435 + - -0.24999777010606966 + - 8.326672684688674e-17 + - -0.2500000000000001 + - -0.07725424859373697 + - 0.20225424859373672 + - 0.20225424859373675 + - -0.07725424859373692 + - 1.1102230246251565e-16 + - -0.0762493312047592 + - -0.24999777010606963 + - -0.0782577878324744 + - 0.20163179734122239 + - 0.2028730918020804 + - 8.326672684688674e-17 layout: legend: itemsizing: constant diff --git a/tests/test_display_plotly/test_pixel_field_color_scales.yml b/tests/test_display_plotly/test_pixel_field_color_scales.yml index 48f4aeb62..0067b6320 100644 --- a/tests/test_display_plotly/test_pixel_field_color_scales.yml +++ b/tests/test_display_plotly/test_pixel_field_color_scales.yml @@ -14,17 +14,53 @@ data: - - 1.0 - '#e71111' i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 + - 7 + - 0 + - 0 + - 0 + - 4 + - 4 + - 2 + - 6 + - 4 + - 0 + - 3 + - 7 intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 + - 0.0 + - 0.0 + - 1.0 + - 1.0 + - 0.0 + - 0.0 + - 1.0 + - 1.0 j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 + - 0 + - 7 + - 1 + - 2 + - 6 + - 7 + - 1 + - 2 + - 5 + - 5 + - 2 + - 2 k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 + - 3 + - 4 + - 2 + - 3 + - 5 + - 6 + - 5 + - 5 + - 0 + - 1 + - 7 + - 6 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -33,14 +69,32 @@ data: showscale: false type: mesh3d x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 - facecolor: - '#e15f99' - '#e15f99' @@ -268,14 +322,683 @@ data: - '#440154' - '#440154' i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 + - 75 + - 64 + - 2 + - 75 + - 76 + - 65 + - 65 + - 64 + - 2 + - 0 + - 1 + - 0 + - 84 + - 86 + - 86 + - 90 + - 90 + - 92 + - 92 + - 91 + - 91 + - 87 + - 87 + - 85 + - 85 + - 83 + - 83 + - 82 + - 82 + - 84 + - 94 + - 86 + - 86 + - 84 + - 84 + - 82 + - 82 + - 83 + - 83 + - 85 + - 85 + - 87 + - 87 + - 87 + - 91 + - 91 + - 92 + - 92 + - 90 + - 90 + - 94 + - 95 + - 88 + - 78 + - 79 + - 81 + - 80 + - 93 + - 96 + - 89 + - 77 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 50 + - 52 + - 52 + - 44 + - 44 + - 32 + - 32 + - 22 + - 22 + - 14 + - 14 + - 20 + - 20 + - 30 + - 30 + - 41 + - 41 + - 50 + - 57 + - 52 + - 52 + - 50 + - 50 + - 41 + - 41 + - 30 + - 30 + - 20 + - 20 + - 14 + - 14 + - 14 + - 22 + - 22 + - 32 + - 32 + - 44 + - 44 + - 57 + - 11 + - 4 + - 12 + - 58 + - 62 + - 8 + - 7 + - 39 + - 61 + - 42 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 48 + - 54 + - 54 + - 47 + - 47 + - 37 + - 37 + - 25 + - 25 + - 17 + - 17 + - 18 + - 18 + - 26 + - 26 + - 38 + - 38 + - 48 + - 59 + - 54 + - 54 + - 48 + - 48 + - 38 + - 38 + - 26 + - 26 + - 18 + - 18 + - 17 + - 17 + - 17 + - 25 + - 25 + - 37 + - 37 + - 47 + - 47 + - 59 + - 27 + - 5 + - 10 + - 56 + - 60 + - 6 + - 9 + - 55 + - 63 + - 28 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 98 + - 99 + - 100 + - 101 + - 102 + - 104 + - 105 + - 106 + - 107 + - 108 + - 110 + - 111 + - 112 + - 113 + - 114 + - 116 + - 117 + - 118 + - 119 + - 120 + - 122 + - 123 + - 124 + - 125 + - 126 + - 128 + - 129 + - 130 + - 131 + - 132 + - 134 + - 135 + - 136 + - 137 + - 138 + - 140 + - 141 + - 142 + - 143 + - 144 + - 146 + - 147 + - 148 + - 149 + - 150 j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 + - 76 + - 76 + - 3 + - 3 + - 3 + - 3 + - 1 + - 1 + - 75 + - 75 + - 3 + - 3 + - 70 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 71 + - 71 + - 69 + - 69 + - 67 + - 67 + - 66 + - 66 + - 68 + - 68 + - 89 + - 89 + - 81 + - 81 + - 79 + - 79 + - 77 + - 77 + - 78 + - 78 + - 80 + - 80 + - 88 + - 93 + - 93 + - 95 + - 95 + - 96 + - 96 + - 94 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 68 + - 68 + - 66 + - 66 + - 67 + - 67 + - 69 + - 51 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 13 + - 13 + - 19 + - 19 + - 29 + - 29 + - 40 + - 40 + - 49 + - 49 + - 61 + - 61 + - 62 + - 62 + - 58 + - 58 + - 42 + - 42 + - 12 + - 12 + - 8 + - 8 + - 4 + - 7 + - 7 + - 11 + - 11 + - 39 + - 39 + - 57 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 49 + - 49 + - 40 + - 40 + - 29 + - 29 + - 19 + - 53 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 15 + - 15 + - 16 + - 16 + - 24 + - 24 + - 36 + - 36 + - 46 + - 46 + - 63 + - 63 + - 60 + - 60 + - 56 + - 56 + - 28 + - 28 + - 10 + - 10 + - 6 + - 6 + - 5 + - 9 + - 9 + - 27 + - 27 + - 55 + - 55 + - 59 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 46 + - 46 + - 36 + - 36 + - 24 + - 24 + - 16 + - 99 + - 100 + - 101 + - 102 + - 98 + - 105 + - 106 + - 107 + - 108 + - 104 + - 111 + - 112 + - 113 + - 114 + - 110 + - 117 + - 118 + - 119 + - 120 + - 116 + - 123 + - 124 + - 125 + - 126 + - 122 + - 129 + - 130 + - 131 + - 132 + - 128 + - 135 + - 136 + - 137 + - 138 + - 134 + - 141 + - 142 + - 143 + - 144 + - 140 + - 147 + - 148 + - 149 + - 150 + - 146 k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 + - 64 + - 65 + - 75 + - 76 + - 65 + - 1 + - 64 + - 0 + - 0 + - 64 + - 0 + - 2 + - 86 + - 72 + - 90 + - 74 + - 92 + - 73 + - 91 + - 71 + - 87 + - 69 + - 85 + - 67 + - 83 + - 66 + - 82 + - 68 + - 84 + - 70 + - 86 + - 81 + - 84 + - 79 + - 82 + - 77 + - 83 + - 78 + - 85 + - 80 + - 87 + - 88 + - 93 + - 91 + - 95 + - 92 + - 96 + - 90 + - 94 + - 86 + - 89 + - 96 + - 93 + - 80 + - 77 + - 79 + - 88 + - 95 + - 94 + - 81 + - 78 + - 72 + - 66 + - 74 + - 67 + - 73 + - 69 + - 71 + - 52 + - 43 + - 44 + - 31 + - 32 + - 21 + - 22 + - 13 + - 14 + - 19 + - 20 + - 29 + - 30 + - 40 + - 41 + - 49 + - 50 + - 51 + - 52 + - 62 + - 50 + - 58 + - 41 + - 42 + - 30 + - 12 + - 20 + - 8 + - 14 + - 4 + - 7 + - 22 + - 11 + - 32 + - 39 + - 44 + - 57 + - 52 + - 61 + - 39 + - 7 + - 8 + - 42 + - 58 + - 4 + - 11 + - 57 + - 62 + - 12 + - 43 + - 40 + - 31 + - 29 + - 21 + - 19 + - 13 + - 54 + - 45 + - 47 + - 35 + - 37 + - 23 + - 25 + - 15 + - 17 + - 16 + - 18 + - 24 + - 26 + - 36 + - 38 + - 46 + - 48 + - 53 + - 54 + - 60 + - 48 + - 56 + - 38 + - 28 + - 26 + - 10 + - 18 + - 6 + - 17 + - 5 + - 9 + - 25 + - 27 + - 37 + - 55 + - 47 + - 59 + - 54 + - 63 + - 55 + - 9 + - 6 + - 28 + - 56 + - 5 + - 27 + - 59 + - 60 + - 10 + - 45 + - 36 + - 35 + - 24 + - 23 + - 16 + - 15 + - 103 + - 103 + - 103 + - 103 + - 103 + - 109 + - 109 + - 109 + - 109 + - 109 + - 115 + - 115 + - 115 + - 115 + - 115 + - 121 + - 121 + - 121 + - 121 + - 121 + - 127 + - 127 + - 127 + - 127 + - 127 + - 133 + - 133 + - 133 + - 133 + - 133 + - 139 + - 139 + - 139 + - 139 + - 139 + - 145 + - 145 + - 145 + - 145 + - 145 + - 151 + - 151 + - 151 + - 151 + - 151 legendgroup: Sensor(id=ID) name: Sensor (Viridis) opacity: 1 @@ -283,14 +1006,464 @@ data: showlegend: true type: mesh3d x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014992463600000002 + - -0.014392395300000003 + - -0.014392395300000003 + - -0.012869499600000002 + - -0.012355425950000002 + - -0.009822911000000002 + - -0.009822911000000002 + - -0.0066605612500000005 + - -0.005795627850000001 + - 0.0 + - -0.004997477680000001 + - 0.0 + - 0.0 + - -0.0046984631550000015 + - -0.0046984631550000015 + - 0.0 + - -0.003930366410000001 + - 0.0 + - -0.003726213425000001 + - 0.0 + - 0.0 + - -0.0025000000350000003 + - -0.0025000000350000003 + - -0.0021347226600000008 + - -0.0021347226600000008 + - 0.0 + - -0.0010241928500000002 + - 0.0 + - -0.0007114128200000001 + - -1.0408340850000002e-17 + - -9.553993650000002e-18 + - 0.0 + - 0.0 + - 0.0008682409300000002 + - 0.0008682409300000002 + - 0.0016630589950000004 + - 0.0 + - 0.0023612117400000003 + - 0.0026042407400000004 + - 0.0 + - 0.0026362657550000005 + - 0.0 + - 0.0 + - 0.003830222040000001 + - 0.003830222040000001 + - 0.0 + - 0.004641779140000001 + - 0.0 + - 0.004750406370000001 + - 0.0 + - 0.0049999997000000004 + - 0.006231224900000001 + - 0.006231224900000001 + - 0.00945867 + - 0.010177281500000003 + - 0.012618804000000003 + - 0.012618804000000003 + - 0.014251218750000003 + - 0.014519108850000004 + - 0.014999999100000003 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.10000000000000002 + - -0.7500000000000001 + - -0.9227457514062634 + - -1.202254248593737 + - -1.2022542485937369 + - -0.9227457514062631 + - -0.9999999999999999 + - -1.3905869642868405 + - -1.2260719938514835 + - -0.9598811800288918 + - -0.9598811800288918 + - -1.2260719938514835 + - -0.8475013375904817 + - -0.7500000000000001 + - -0.9227457514062631 + - -1.2022542485937369 + - -1.202254248593737 + - -0.9227457514062634 + - -0.9999999999999999 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - 1.25 + - 1.0772542485937369 + - 0.797745751406263 + - 0.797745751406263 + - 1.0772542485937366 + - 1.0 + - 1.0855896394678042 + - 0.9210746690324472 + - 0.6548838552098555 + - 0.6548838552098555 + - 0.9210746690324471 + - 1.1524986624095181 + - 1.25 + - 1.0772542485937366 + - 0.797745751406263 + - 0.797745751406263 + - 1.0772542485937366 + - 1.0 y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - -0.004225988315000001 + - 0.004225988315000001 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.011336243900000001 + - 0.011336243900000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0017101006600000004 + - 0.0017101006600000004 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.004330126940000001 + - 0.004330126940000001 + - -0.014847321800000002 + - 0.014847321800000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.10000000000000002 + - 0.0 + - 0.0 + - -0.0049240388000000015 + - 0.0049240388000000015 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0032139379550000006 + - 0.0032139379550000006 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.013644480700000003 + - 0.013644480700000003 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.008109612750000002 + - 0.008109612750000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.00028137136250000006 + - 0.0078714803 + - -0.008344890200000002 + - 0.013525193950000004 + - -0.013758964850000003 + - -0.0016490003100000004 + - 0.0017709132300000002 + - -0.0042973283700000016 + - 0.0043621968500000005 + - -0.004934888705000001 + - 0.004912360015000001 + - 0.014884752050000002 + - -0.014804665750000005 + - -0.0032633595150000005 + - 0.0031639754750000006 + - -6.486846850000001e-05 + - 0.011518507450000002 + - -0.011149990550000002 + - 0.004495218770000001 + - -0.0039552707250000005 + - 9.925023200000001e-18 + - -1.353553390593274 + - -1.521678018584263 + - -1.457460125037637 + - -1.2496466561489104 + - -1.1854287626022846 + - -0.6464466094067262 + - 0.0 + - 0.23776412907378844 + - 0.14694631307311834 + - -0.14694631307311828 + - -0.23776412907378847 + - 0.0 + - 1.353553390593274 + - 1.1854287626022846 + - 1.2496466561489104 + - 1.457460125037637 + - 1.521678018584263 + - 0.6464466094067262 + - -1.0 + - -0.7622358709262116 + - -0.8530536869268817 + - -1.1469463130731183 + - -1.2377641290737884 + - -1.0 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 1.0 + - 1.2377641290737884 + - 1.1469463130731183 + - 0.8530536869268818 + - 0.7622358709262116 + - 1.0 + - -0.6464466094067262 + - -0.4783219814157369 + - -0.5425398749623628 + - -0.7503533438510895 + - -0.8145712373977154 + - -1.353553390593274 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 0.6464466094067262 + - 0.8145712373977154 + - 0.7503533438510895 + - 0.5425398749623629 + - 0.4783219814157368 + - 1.353553390593274 z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.0004754300695000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.007705580450000002 + - -0.008505494900000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.013440123200000004 + - -0.013835124650000002 + - 0.0 + - 0.00015880254800000005 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.003090666795000001 + - 0.0 + - 0.0033339664350000007 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0048939786850000005 + - 0.0 + - 0.004949130490000001 + - 0.10000000000000002 + - -3.1374891150000003e-18 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.014907522500000003 + - 0.0 + - -0.004407344015000001 + - -0.014772200600000002 + - 0.0 + - 0.0042485412200000015 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0018584636950000003 + - 0.0 + - 0.0015600122500000005 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.011641889050000001 + - -0.011019207550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.004680036755000001 + - -0.003767693415000001 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014997360100000004 + - -0.012768703700000003 + - -0.012464462200000002 + - -0.006486073150000001 + - -0.005974184350000002 + - -0.004720254240000001 + - -0.004675881190000001 + - -0.0025559673100000006 + - -0.0024436118100000007 + - 0.0008042847750000002 + - 0.0009320507750000002 + - 0.0018558396050000002 + - 0.0024128545100000004 + - 0.003788203375000001 + - 0.0038715966050000008 + - 0.004999579490000001 + - 0.009608536200000002 + - 0.0100338295 + - 0.014310590900000003 + - 0.014469133300000003 + - -1.6175736900000002e-18 + - 1.3535533905932737 + - 1.1854287626022844 + - 1.2496466561489104 + - 1.457460125037637 + - 1.521678018584263 + - 0.6464466094067263 + - 1.3999272725498855 + - 1.45261426460265 + - 1.5378636085090187 + - 1.5378636085090187 + - 1.45261426460265 + - 0.5238233962453553 + - 1.3535533905932737 + - 1.521678018584263 + - 1.457460125037637 + - 1.2496466561489104 + - 1.1854287626022844 + - 0.6464466094067263 + - 1.25 + - 1.0772542485937366 + - 0.797745751406263 + - 0.797745751406263 + - 1.0772542485937366 + - 1.0 + - 1.25 + - 1.0772542485937366 + - 0.797745751406263 + - 0.797745751406263 + - 1.0772542485937366 + - 1.0 + - 1.25 + - 1.0772542485937366 + - 0.797745751406263 + - 0.797745751406263 + - 1.0772542485937366 + - 1.0 + - 0.6464466094067263 + - 0.8145712373977156 + - 0.7503533438510896 + - 0.5425398749623629 + - 0.4783219814157369 + - 1.3535533905932737 + - 0.4475740650405964 + - 0.500261057093361 + - 0.5855104009997295 + - 0.5855104009997295 + - 0.500261057093361 + - 1.4761766037546447 + - 0.6464466094067263 + - 0.4783219814157369 + - 0.5425398749623629 + - 0.7503533438510896 + - 0.8145712373977156 + - 1.3535533905932737 - color: '#2e91e5' colorscale: - - 0.0 @@ -306,17 +1479,53 @@ data: - - 1.0 - '#e71111' i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 + - 7 + - 0 + - 0 + - 0 + - 4 + - 4 + - 2 + - 6 + - 4 + - 0 + - 3 + - 7 intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 + - 0.0 + - 0.0 + - 1.0 + - 1.0 + - 0.0 + - 0.0 + - 1.0 + - 1.0 j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 + - 0 + - 7 + - 1 + - 2 + - 6 + - 7 + - 1 + - 2 + - 5 + - 5 + - 2 + - 2 k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 + - 3 + - 4 + - 2 + - 3 + - 5 + - 6 + - 5 + - 5 + - 0 + - 1 + - 7 + - 6 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -325,14 +1534,32 @@ data: showscale: false type: mesh3d x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 - facecolor: - '#1ca71c' - '#1ca71c' @@ -560,14 +1787,683 @@ data: - '#000004' - '#000004' i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 + - 75 + - 64 + - 2 + - 75 + - 76 + - 65 + - 65 + - 64 + - 2 + - 0 + - 1 + - 0 + - 84 + - 86 + - 86 + - 90 + - 90 + - 92 + - 92 + - 91 + - 91 + - 87 + - 87 + - 85 + - 85 + - 83 + - 83 + - 82 + - 82 + - 84 + - 94 + - 86 + - 86 + - 84 + - 84 + - 82 + - 82 + - 83 + - 83 + - 85 + - 85 + - 87 + - 87 + - 87 + - 91 + - 91 + - 92 + - 92 + - 90 + - 90 + - 94 + - 95 + - 88 + - 78 + - 79 + - 81 + - 80 + - 93 + - 96 + - 89 + - 77 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 50 + - 52 + - 52 + - 44 + - 44 + - 32 + - 32 + - 22 + - 22 + - 14 + - 14 + - 20 + - 20 + - 30 + - 30 + - 41 + - 41 + - 50 + - 57 + - 52 + - 52 + - 50 + - 50 + - 41 + - 41 + - 30 + - 30 + - 20 + - 20 + - 14 + - 14 + - 14 + - 22 + - 22 + - 32 + - 32 + - 44 + - 44 + - 57 + - 11 + - 4 + - 12 + - 58 + - 62 + - 8 + - 7 + - 39 + - 61 + - 42 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 48 + - 54 + - 54 + - 47 + - 47 + - 37 + - 37 + - 25 + - 25 + - 17 + - 17 + - 18 + - 18 + - 26 + - 26 + - 38 + - 38 + - 48 + - 59 + - 54 + - 54 + - 48 + - 48 + - 38 + - 38 + - 26 + - 26 + - 18 + - 18 + - 17 + - 17 + - 17 + - 25 + - 25 + - 37 + - 37 + - 47 + - 47 + - 59 + - 27 + - 5 + - 10 + - 56 + - 60 + - 6 + - 9 + - 55 + - 63 + - 28 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 98 + - 99 + - 100 + - 101 + - 102 + - 104 + - 105 + - 106 + - 107 + - 108 + - 110 + - 111 + - 112 + - 113 + - 114 + - 116 + - 117 + - 118 + - 119 + - 120 + - 122 + - 123 + - 124 + - 125 + - 126 + - 128 + - 129 + - 130 + - 131 + - 132 + - 134 + - 135 + - 136 + - 137 + - 138 + - 140 + - 141 + - 142 + - 143 + - 144 + - 146 + - 147 + - 148 + - 149 + - 150 j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 + - 76 + - 76 + - 3 + - 3 + - 3 + - 3 + - 1 + - 1 + - 75 + - 75 + - 3 + - 3 + - 70 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 71 + - 71 + - 69 + - 69 + - 67 + - 67 + - 66 + - 66 + - 68 + - 68 + - 89 + - 89 + - 81 + - 81 + - 79 + - 79 + - 77 + - 77 + - 78 + - 78 + - 80 + - 80 + - 88 + - 93 + - 93 + - 95 + - 95 + - 96 + - 96 + - 94 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 68 + - 68 + - 66 + - 66 + - 67 + - 67 + - 69 + - 51 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 13 + - 13 + - 19 + - 19 + - 29 + - 29 + - 40 + - 40 + - 49 + - 49 + - 61 + - 61 + - 62 + - 62 + - 58 + - 58 + - 42 + - 42 + - 12 + - 12 + - 8 + - 8 + - 4 + - 7 + - 7 + - 11 + - 11 + - 39 + - 39 + - 57 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 49 + - 49 + - 40 + - 40 + - 29 + - 29 + - 19 + - 53 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 15 + - 15 + - 16 + - 16 + - 24 + - 24 + - 36 + - 36 + - 46 + - 46 + - 63 + - 63 + - 60 + - 60 + - 56 + - 56 + - 28 + - 28 + - 10 + - 10 + - 6 + - 6 + - 5 + - 9 + - 9 + - 27 + - 27 + - 55 + - 55 + - 59 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 46 + - 46 + - 36 + - 36 + - 24 + - 24 + - 16 + - 99 + - 100 + - 101 + - 102 + - 98 + - 105 + - 106 + - 107 + - 108 + - 104 + - 111 + - 112 + - 113 + - 114 + - 110 + - 117 + - 118 + - 119 + - 120 + - 116 + - 123 + - 124 + - 125 + - 126 + - 122 + - 129 + - 130 + - 131 + - 132 + - 128 + - 135 + - 136 + - 137 + - 138 + - 134 + - 141 + - 142 + - 143 + - 144 + - 140 + - 147 + - 148 + - 149 + - 150 + - 146 k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 + - 64 + - 65 + - 75 + - 76 + - 65 + - 1 + - 64 + - 0 + - 0 + - 64 + - 0 + - 2 + - 86 + - 72 + - 90 + - 74 + - 92 + - 73 + - 91 + - 71 + - 87 + - 69 + - 85 + - 67 + - 83 + - 66 + - 82 + - 68 + - 84 + - 70 + - 86 + - 81 + - 84 + - 79 + - 82 + - 77 + - 83 + - 78 + - 85 + - 80 + - 87 + - 88 + - 93 + - 91 + - 95 + - 92 + - 96 + - 90 + - 94 + - 86 + - 89 + - 96 + - 93 + - 80 + - 77 + - 79 + - 88 + - 95 + - 94 + - 81 + - 78 + - 72 + - 66 + - 74 + - 67 + - 73 + - 69 + - 71 + - 52 + - 43 + - 44 + - 31 + - 32 + - 21 + - 22 + - 13 + - 14 + - 19 + - 20 + - 29 + - 30 + - 40 + - 41 + - 49 + - 50 + - 51 + - 52 + - 62 + - 50 + - 58 + - 41 + - 42 + - 30 + - 12 + - 20 + - 8 + - 14 + - 4 + - 7 + - 22 + - 11 + - 32 + - 39 + - 44 + - 57 + - 52 + - 61 + - 39 + - 7 + - 8 + - 42 + - 58 + - 4 + - 11 + - 57 + - 62 + - 12 + - 43 + - 40 + - 31 + - 29 + - 21 + - 19 + - 13 + - 54 + - 45 + - 47 + - 35 + - 37 + - 23 + - 25 + - 15 + - 17 + - 16 + - 18 + - 24 + - 26 + - 36 + - 38 + - 46 + - 48 + - 53 + - 54 + - 60 + - 48 + - 56 + - 38 + - 28 + - 26 + - 10 + - 18 + - 6 + - 17 + - 5 + - 9 + - 25 + - 27 + - 37 + - 55 + - 47 + - 59 + - 54 + - 63 + - 55 + - 9 + - 6 + - 28 + - 56 + - 5 + - 27 + - 59 + - 60 + - 10 + - 45 + - 36 + - 35 + - 24 + - 23 + - 16 + - 15 + - 103 + - 103 + - 103 + - 103 + - 103 + - 109 + - 109 + - 109 + - 109 + - 109 + - 115 + - 115 + - 115 + - 115 + - 115 + - 121 + - 121 + - 121 + - 121 + - 121 + - 127 + - 127 + - 127 + - 127 + - 127 + - 133 + - 133 + - 133 + - 133 + - 133 + - 139 + - 139 + - 139 + - 139 + - 139 + - 145 + - 145 + - 145 + - 145 + - 145 + - 151 + - 151 + - 151 + - 151 + - 151 legendgroup: Sensor(id=ID) name: Sensor (Inferno) opacity: 1 @@ -575,14 +2471,464 @@ data: showlegend: true type: mesh3d x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014992463600000002 + - -0.014392395300000003 + - -0.014392395300000003 + - -0.012869499600000002 + - -0.012355425950000002 + - -0.009822911000000002 + - -0.009822911000000002 + - -0.0066605612500000005 + - -0.005795627850000001 + - 0.0 + - -0.004997477680000001 + - 0.0 + - 0.0 + - -0.0046984631550000015 + - -0.0046984631550000015 + - 0.0 + - -0.003930366410000001 + - 0.0 + - -0.003726213425000001 + - 0.0 + - 0.0 + - -0.0025000000350000003 + - -0.0025000000350000003 + - -0.0021347226600000008 + - -0.0021347226600000008 + - 0.0 + - -0.0010241928500000002 + - 0.0 + - -0.0007114128200000001 + - -1.0408340850000002e-17 + - -9.553993650000002e-18 + - 0.0 + - 0.0 + - 0.0008682409300000002 + - 0.0008682409300000002 + - 0.0016630589950000004 + - 0.0 + - 0.0023612117400000003 + - 0.0026042407400000004 + - 0.0 + - 0.0026362657550000005 + - 0.0 + - 0.0 + - 0.003830222040000001 + - 0.003830222040000001 + - 0.0 + - 0.004641779140000001 + - 0.0 + - 0.004750406370000001 + - 0.0 + - 0.0049999997000000004 + - 0.006231224900000001 + - 0.006231224900000001 + - 0.00945867 + - 0.010177281500000003 + - 0.012618804000000003 + - 0.012618804000000003 + - 0.014251218750000003 + - 0.014519108850000004 + - 0.014999999100000003 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.10000000000000002 + - -0.7500000000000001 + - -0.9227457514062634 + - -1.202254248593737 + - -1.2022542485937369 + - -0.9227457514062631 + - -0.9999999999999999 + - -1.3905869642868405 + - -1.2260719938514835 + - -0.9598811800288918 + - -0.9598811800288918 + - -1.2260719938514835 + - -0.8475013375904817 + - -0.7500000000000001 + - -0.9227457514062631 + - -1.2022542485937369 + - -1.202254248593737 + - -0.9227457514062634 + - -0.9999999999999999 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - 1.25 + - 1.0772542485937369 + - 0.797745751406263 + - 0.797745751406263 + - 1.0772542485937366 + - 1.0 + - 1.0855896394678042 + - 0.9210746690324472 + - 0.6548838552098555 + - 0.6548838552098555 + - 0.9210746690324471 + - 1.1524986624095181 + - 1.25 + - 1.0772542485937366 + - 0.797745751406263 + - 0.797745751406263 + - 1.0772542485937366 + - 1.0 y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - -0.004225988315000001 + - 0.004225988315000001 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.011336243900000001 + - 0.011336243900000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0017101006600000004 + - 0.0017101006600000004 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.004330126940000001 + - 0.004330126940000001 + - -0.014847321800000002 + - 0.014847321800000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.10000000000000002 + - 0.0 + - 0.0 + - -0.0049240388000000015 + - 0.0049240388000000015 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0032139379550000006 + - 0.0032139379550000006 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.013644480700000003 + - 0.013644480700000003 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.008109612750000002 + - 0.008109612750000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.00028137136250000006 + - 0.0078714803 + - -0.008344890200000002 + - 0.013525193950000004 + - -0.013758964850000003 + - -0.0016490003100000004 + - 0.0017709132300000002 + - -0.0042973283700000016 + - 0.0043621968500000005 + - -0.004934888705000001 + - 0.004912360015000001 + - 0.014884752050000002 + - -0.014804665750000005 + - -0.0032633595150000005 + - 0.0031639754750000006 + - -6.486846850000001e-05 + - 0.011518507450000002 + - -0.011149990550000002 + - 0.004495218770000001 + - -0.0039552707250000005 + - 9.925023200000001e-18 + - -1.353553390593274 + - -1.521678018584263 + - -1.457460125037637 + - -1.2496466561489104 + - -1.1854287626022846 + - -0.6464466094067262 + - 0.0 + - 0.23776412907378844 + - 0.14694631307311834 + - -0.14694631307311828 + - -0.23776412907378847 + - 0.0 + - 1.353553390593274 + - 1.1854287626022846 + - 1.2496466561489104 + - 1.457460125037637 + - 1.521678018584263 + - 0.6464466094067262 + - -1.0 + - -0.7622358709262116 + - -0.8530536869268817 + - -1.1469463130731183 + - -1.2377641290737884 + - -1.0 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 1.0 + - 1.2377641290737884 + - 1.1469463130731183 + - 0.8530536869268818 + - 0.7622358709262116 + - 1.0 + - -0.6464466094067262 + - -0.4783219814157369 + - -0.5425398749623628 + - -0.7503533438510895 + - -0.8145712373977154 + - -1.353553390593274 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 0.6464466094067262 + - 0.8145712373977154 + - 0.7503533438510895 + - 0.5425398749623629 + - 0.4783219814157368 + - 1.353553390593274 z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.0004754300695000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.007705580450000002 + - -0.008505494900000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.013440123200000004 + - -0.013835124650000002 + - 0.0 + - 0.00015880254800000005 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.003090666795000001 + - 0.0 + - 0.0033339664350000007 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0048939786850000005 + - 0.0 + - 0.004949130490000001 + - 0.10000000000000002 + - -3.1374891150000003e-18 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.014907522500000003 + - 0.0 + - -0.004407344015000001 + - -0.014772200600000002 + - 0.0 + - 0.0042485412200000015 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0018584636950000003 + - 0.0 + - 0.0015600122500000005 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.011641889050000001 + - -0.011019207550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.004680036755000001 + - -0.003767693415000001 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014997360100000004 + - -0.012768703700000003 + - -0.012464462200000002 + - -0.006486073150000001 + - -0.005974184350000002 + - -0.004720254240000001 + - -0.004675881190000001 + - -0.0025559673100000006 + - -0.0024436118100000007 + - 0.0008042847750000002 + - 0.0009320507750000002 + - 0.0018558396050000002 + - 0.0024128545100000004 + - 0.003788203375000001 + - 0.0038715966050000008 + - 0.004999579490000001 + - 0.009608536200000002 + - 0.0100338295 + - 0.014310590900000003 + - 0.014469133300000003 + - -1.6175736900000002e-18 + - 1.3535533905932737 + - 1.1854287626022844 + - 1.2496466561489104 + - 1.457460125037637 + - 1.521678018584263 + - 0.6464466094067263 + - 1.3999272725498855 + - 1.45261426460265 + - 1.5378636085090187 + - 1.5378636085090187 + - 1.45261426460265 + - 0.5238233962453553 + - 1.3535533905932737 + - 1.521678018584263 + - 1.457460125037637 + - 1.2496466561489104 + - 1.1854287626022844 + - 0.6464466094067263 + - 1.25 + - 1.0772542485937366 + - 0.797745751406263 + - 0.797745751406263 + - 1.0772542485937366 + - 1.0 + - 1.25 + - 1.0772542485937366 + - 0.797745751406263 + - 0.797745751406263 + - 1.0772542485937366 + - 1.0 + - 1.25 + - 1.0772542485937366 + - 0.797745751406263 + - 0.797745751406263 + - 1.0772542485937366 + - 1.0 + - 0.6464466094067263 + - 0.8145712373977156 + - 0.7503533438510896 + - 0.5425398749623629 + - 0.4783219814157369 + - 1.3535533905932737 + - 0.4475740650405964 + - 0.500261057093361 + - 0.5855104009997295 + - 0.5855104009997295 + - 0.500261057093361 + - 1.4761766037546447 + - 0.6464466094067263 + - 0.4783219814157369 + - 0.5425398749623629 + - 0.7503533438510896 + - 0.8145712373977156 + - 1.3535533905932737 - color: '#2e91e5' colorscale: - - 0.0 @@ -598,17 +2944,53 @@ data: - - 1.0 - '#e71111' i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 + - 7 + - 0 + - 0 + - 0 + - 4 + - 4 + - 2 + - 6 + - 4 + - 0 + - 3 + - 7 intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 + - 0.0 + - 0.0 + - 1.0 + - 1.0 + - 0.0 + - 0.0 + - 1.0 + - 1.0 j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 + - 0 + - 7 + - 1 + - 2 + - 6 + - 7 + - 1 + - 2 + - 5 + - 5 + - 2 + - 2 k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 + - 3 + - 4 + - 2 + - 3 + - 5 + - 6 + - 5 + - 5 + - 0 + - 1 + - 7 + - 6 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -617,14 +2999,32 @@ data: showscale: false type: mesh3d x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 - facecolor: - '#fb0d0d' - '#fb0d0d' @@ -852,14 +3252,683 @@ data: - '#fff5eb' - '#fff5eb' i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 + - 75 + - 64 + - 2 + - 75 + - 76 + - 65 + - 65 + - 64 + - 2 + - 0 + - 1 + - 0 + - 84 + - 86 + - 86 + - 90 + - 90 + - 92 + - 92 + - 91 + - 91 + - 87 + - 87 + - 85 + - 85 + - 83 + - 83 + - 82 + - 82 + - 84 + - 94 + - 86 + - 86 + - 84 + - 84 + - 82 + - 82 + - 83 + - 83 + - 85 + - 85 + - 87 + - 87 + - 87 + - 91 + - 91 + - 92 + - 92 + - 90 + - 90 + - 94 + - 95 + - 88 + - 78 + - 79 + - 81 + - 80 + - 93 + - 96 + - 89 + - 77 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 50 + - 52 + - 52 + - 44 + - 44 + - 32 + - 32 + - 22 + - 22 + - 14 + - 14 + - 20 + - 20 + - 30 + - 30 + - 41 + - 41 + - 50 + - 57 + - 52 + - 52 + - 50 + - 50 + - 41 + - 41 + - 30 + - 30 + - 20 + - 20 + - 14 + - 14 + - 14 + - 22 + - 22 + - 32 + - 32 + - 44 + - 44 + - 57 + - 11 + - 4 + - 12 + - 58 + - 62 + - 8 + - 7 + - 39 + - 61 + - 42 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 48 + - 54 + - 54 + - 47 + - 47 + - 37 + - 37 + - 25 + - 25 + - 17 + - 17 + - 18 + - 18 + - 26 + - 26 + - 38 + - 38 + - 48 + - 59 + - 54 + - 54 + - 48 + - 48 + - 38 + - 38 + - 26 + - 26 + - 18 + - 18 + - 17 + - 17 + - 17 + - 25 + - 25 + - 37 + - 37 + - 47 + - 47 + - 59 + - 27 + - 5 + - 10 + - 56 + - 60 + - 6 + - 9 + - 55 + - 63 + - 28 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 98 + - 99 + - 100 + - 101 + - 102 + - 104 + - 105 + - 106 + - 107 + - 108 + - 110 + - 111 + - 112 + - 113 + - 114 + - 116 + - 117 + - 118 + - 119 + - 120 + - 122 + - 123 + - 124 + - 125 + - 126 + - 128 + - 129 + - 130 + - 131 + - 132 + - 134 + - 135 + - 136 + - 137 + - 138 + - 140 + - 141 + - 142 + - 143 + - 144 + - 146 + - 147 + - 148 + - 149 + - 150 j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 + - 76 + - 76 + - 3 + - 3 + - 3 + - 3 + - 1 + - 1 + - 75 + - 75 + - 3 + - 3 + - 70 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 71 + - 71 + - 69 + - 69 + - 67 + - 67 + - 66 + - 66 + - 68 + - 68 + - 89 + - 89 + - 81 + - 81 + - 79 + - 79 + - 77 + - 77 + - 78 + - 78 + - 80 + - 80 + - 88 + - 93 + - 93 + - 95 + - 95 + - 96 + - 96 + - 94 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 68 + - 68 + - 66 + - 66 + - 67 + - 67 + - 69 + - 51 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 13 + - 13 + - 19 + - 19 + - 29 + - 29 + - 40 + - 40 + - 49 + - 49 + - 61 + - 61 + - 62 + - 62 + - 58 + - 58 + - 42 + - 42 + - 12 + - 12 + - 8 + - 8 + - 4 + - 7 + - 7 + - 11 + - 11 + - 39 + - 39 + - 57 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 49 + - 49 + - 40 + - 40 + - 29 + - 29 + - 19 + - 53 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 15 + - 15 + - 16 + - 16 + - 24 + - 24 + - 36 + - 36 + - 46 + - 46 + - 63 + - 63 + - 60 + - 60 + - 56 + - 56 + - 28 + - 28 + - 10 + - 10 + - 6 + - 6 + - 5 + - 9 + - 9 + - 27 + - 27 + - 55 + - 55 + - 59 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 46 + - 46 + - 36 + - 36 + - 24 + - 24 + - 16 + - 99 + - 100 + - 101 + - 102 + - 98 + - 105 + - 106 + - 107 + - 108 + - 104 + - 111 + - 112 + - 113 + - 114 + - 110 + - 117 + - 118 + - 119 + - 120 + - 116 + - 123 + - 124 + - 125 + - 126 + - 122 + - 129 + - 130 + - 131 + - 132 + - 128 + - 135 + - 136 + - 137 + - 138 + - 134 + - 141 + - 142 + - 143 + - 144 + - 140 + - 147 + - 148 + - 149 + - 150 + - 146 k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 + - 64 + - 65 + - 75 + - 76 + - 65 + - 1 + - 64 + - 0 + - 0 + - 64 + - 0 + - 2 + - 86 + - 72 + - 90 + - 74 + - 92 + - 73 + - 91 + - 71 + - 87 + - 69 + - 85 + - 67 + - 83 + - 66 + - 82 + - 68 + - 84 + - 70 + - 86 + - 81 + - 84 + - 79 + - 82 + - 77 + - 83 + - 78 + - 85 + - 80 + - 87 + - 88 + - 93 + - 91 + - 95 + - 92 + - 96 + - 90 + - 94 + - 86 + - 89 + - 96 + - 93 + - 80 + - 77 + - 79 + - 88 + - 95 + - 94 + - 81 + - 78 + - 72 + - 66 + - 74 + - 67 + - 73 + - 69 + - 71 + - 52 + - 43 + - 44 + - 31 + - 32 + - 21 + - 22 + - 13 + - 14 + - 19 + - 20 + - 29 + - 30 + - 40 + - 41 + - 49 + - 50 + - 51 + - 52 + - 62 + - 50 + - 58 + - 41 + - 42 + - 30 + - 12 + - 20 + - 8 + - 14 + - 4 + - 7 + - 22 + - 11 + - 32 + - 39 + - 44 + - 57 + - 52 + - 61 + - 39 + - 7 + - 8 + - 42 + - 58 + - 4 + - 11 + - 57 + - 62 + - 12 + - 43 + - 40 + - 31 + - 29 + - 21 + - 19 + - 13 + - 54 + - 45 + - 47 + - 35 + - 37 + - 23 + - 25 + - 15 + - 17 + - 16 + - 18 + - 24 + - 26 + - 36 + - 38 + - 46 + - 48 + - 53 + - 54 + - 60 + - 48 + - 56 + - 38 + - 28 + - 26 + - 10 + - 18 + - 6 + - 17 + - 5 + - 9 + - 25 + - 27 + - 37 + - 55 + - 47 + - 59 + - 54 + - 63 + - 55 + - 9 + - 6 + - 28 + - 56 + - 5 + - 27 + - 59 + - 60 + - 10 + - 45 + - 36 + - 35 + - 24 + - 23 + - 16 + - 15 + - 103 + - 103 + - 103 + - 103 + - 103 + - 109 + - 109 + - 109 + - 109 + - 109 + - 115 + - 115 + - 115 + - 115 + - 115 + - 121 + - 121 + - 121 + - 121 + - 121 + - 127 + - 127 + - 127 + - 127 + - 127 + - 133 + - 133 + - 133 + - 133 + - 133 + - 139 + - 139 + - 139 + - 139 + - 139 + - 145 + - 145 + - 145 + - 145 + - 145 + - 151 + - 151 + - 151 + - 151 + - 151 legendgroup: Sensor(id=ID) name: Sensor (Oranges) opacity: 1 @@ -867,14 +3936,464 @@ data: showlegend: true type: mesh3d x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014992463600000002 + - -0.014392395300000003 + - -0.014392395300000003 + - -0.012869499600000002 + - -0.012355425950000002 + - -0.009822911000000002 + - -0.009822911000000002 + - -0.0066605612500000005 + - -0.005795627850000001 + - 0.0 + - -0.004997477680000001 + - 0.0 + - 0.0 + - -0.0046984631550000015 + - -0.0046984631550000015 + - 0.0 + - -0.003930366410000001 + - 0.0 + - -0.003726213425000001 + - 0.0 + - 0.0 + - -0.0025000000350000003 + - -0.0025000000350000003 + - -0.0021347226600000008 + - -0.0021347226600000008 + - 0.0 + - -0.0010241928500000002 + - 0.0 + - -0.0007114128200000001 + - -1.0408340850000002e-17 + - -9.553993650000002e-18 + - 0.0 + - 0.0 + - 0.0008682409300000002 + - 0.0008682409300000002 + - 0.0016630589950000004 + - 0.0 + - 0.0023612117400000003 + - 0.0026042407400000004 + - 0.0 + - 0.0026362657550000005 + - 0.0 + - 0.0 + - 0.003830222040000001 + - 0.003830222040000001 + - 0.0 + - 0.004641779140000001 + - 0.0 + - 0.004750406370000001 + - 0.0 + - 0.0049999997000000004 + - 0.006231224900000001 + - 0.006231224900000001 + - 0.00945867 + - 0.010177281500000003 + - 0.012618804000000003 + - 0.012618804000000003 + - 0.014251218750000003 + - 0.014519108850000004 + - 0.014999999100000003 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.10000000000000002 + - -0.7500000000000001 + - -0.9227457514062634 + - -1.202254248593737 + - -1.2022542485937369 + - -0.9227457514062631 + - -0.9999999999999999 + - -1.3905869642868405 + - -1.2260719938514835 + - -0.9598811800288918 + - -0.9598811800288918 + - -1.2260719938514835 + - -0.8475013375904817 + - -0.7500000000000001 + - -0.9227457514062631 + - -1.2022542485937369 + - -1.202254248593737 + - -0.9227457514062634 + - -0.9999999999999999 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - 1.25 + - 1.0772542485937369 + - 0.797745751406263 + - 0.797745751406263 + - 1.0772542485937366 + - 1.0 + - 1.0855896394678042 + - 0.9210746690324472 + - 0.6548838552098555 + - 0.6548838552098555 + - 0.9210746690324471 + - 1.1524986624095181 + - 1.25 + - 1.0772542485937366 + - 0.797745751406263 + - 0.797745751406263 + - 1.0772542485937366 + - 1.0 y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - -0.004225988315000001 + - 0.004225988315000001 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.011336243900000001 + - 0.011336243900000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0017101006600000004 + - 0.0017101006600000004 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.004330126940000001 + - 0.004330126940000001 + - -0.014847321800000002 + - 0.014847321800000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.10000000000000002 + - 0.0 + - 0.0 + - -0.0049240388000000015 + - 0.0049240388000000015 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0032139379550000006 + - 0.0032139379550000006 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.013644480700000003 + - 0.013644480700000003 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.008109612750000002 + - 0.008109612750000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.00028137136250000006 + - 0.0078714803 + - -0.008344890200000002 + - 0.013525193950000004 + - -0.013758964850000003 + - -0.0016490003100000004 + - 0.0017709132300000002 + - -0.0042973283700000016 + - 0.0043621968500000005 + - -0.004934888705000001 + - 0.004912360015000001 + - 0.014884752050000002 + - -0.014804665750000005 + - -0.0032633595150000005 + - 0.0031639754750000006 + - -6.486846850000001e-05 + - 0.011518507450000002 + - -0.011149990550000002 + - 0.004495218770000001 + - -0.0039552707250000005 + - 9.925023200000001e-18 + - -1.353553390593274 + - -1.521678018584263 + - -1.457460125037637 + - -1.2496466561489104 + - -1.1854287626022846 + - -0.6464466094067262 + - 0.0 + - 0.23776412907378844 + - 0.14694631307311834 + - -0.14694631307311828 + - -0.23776412907378847 + - 0.0 + - 1.353553390593274 + - 1.1854287626022846 + - 1.2496466561489104 + - 1.457460125037637 + - 1.521678018584263 + - 0.6464466094067262 + - -1.0 + - -0.7622358709262116 + - -0.8530536869268817 + - -1.1469463130731183 + - -1.2377641290737884 + - -1.0 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 1.0 + - 1.2377641290737884 + - 1.1469463130731183 + - 0.8530536869268818 + - 0.7622358709262116 + - 1.0 + - -0.6464466094067262 + - -0.4783219814157369 + - -0.5425398749623628 + - -0.7503533438510895 + - -0.8145712373977154 + - -1.353553390593274 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 0.6464466094067262 + - 0.8145712373977154 + - 0.7503533438510895 + - 0.5425398749623629 + - 0.4783219814157368 + - 1.353553390593274 z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.0004754300695000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.007705580450000002 + - -0.008505494900000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.013440123200000004 + - -0.013835124650000002 + - 0.0 + - 0.00015880254800000005 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.003090666795000001 + - 0.0 + - 0.0033339664350000007 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0048939786850000005 + - 0.0 + - 0.004949130490000001 + - 0.10000000000000002 + - -3.1374891150000003e-18 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.014907522500000003 + - 0.0 + - -0.004407344015000001 + - -0.014772200600000002 + - 0.0 + - 0.0042485412200000015 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0018584636950000003 + - 0.0 + - 0.0015600122500000005 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.011641889050000001 + - -0.011019207550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.004680036755000001 + - -0.003767693415000001 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014997360100000004 + - -0.012768703700000003 + - -0.012464462200000002 + - -0.006486073150000001 + - -0.005974184350000002 + - -0.004720254240000001 + - -0.004675881190000001 + - -0.0025559673100000006 + - -0.0024436118100000007 + - 0.0008042847750000002 + - 0.0009320507750000002 + - 0.0018558396050000002 + - 0.0024128545100000004 + - 0.003788203375000001 + - 0.0038715966050000008 + - 0.004999579490000001 + - 0.009608536200000002 + - 0.0100338295 + - 0.014310590900000003 + - 0.014469133300000003 + - -1.6175736900000002e-18 + - 1.3535533905932737 + - 1.1854287626022844 + - 1.2496466561489104 + - 1.457460125037637 + - 1.521678018584263 + - 0.6464466094067263 + - 1.3999272725498855 + - 1.45261426460265 + - 1.5378636085090187 + - 1.5378636085090187 + - 1.45261426460265 + - 0.5238233962453553 + - 1.3535533905932737 + - 1.521678018584263 + - 1.457460125037637 + - 1.2496466561489104 + - 1.1854287626022844 + - 0.6464466094067263 + - 1.25 + - 1.0772542485937366 + - 0.797745751406263 + - 0.797745751406263 + - 1.0772542485937366 + - 1.0 + - 1.25 + - 1.0772542485937366 + - 0.797745751406263 + - 0.797745751406263 + - 1.0772542485937366 + - 1.0 + - 1.25 + - 1.0772542485937366 + - 0.797745751406263 + - 0.797745751406263 + - 1.0772542485937366 + - 1.0 + - 0.6464466094067263 + - 0.8145712373977156 + - 0.7503533438510896 + - 0.5425398749623629 + - 0.4783219814157369 + - 1.3535533905932737 + - 0.4475740650405964 + - 0.500261057093361 + - 0.5855104009997295 + - 0.5855104009997295 + - 0.500261057093361 + - 1.4761766037546447 + - 0.6464466094067263 + - 0.4783219814157369 + - 0.5425398749623629 + - 0.7503533438510896 + - 0.8145712373977156 + - 1.3535533905932737 - color: '#2e91e5' colorscale: - - 0.0 @@ -890,17 +4409,53 @@ data: - - 1.0 - '#e71111' i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 + - 7 + - 0 + - 0 + - 0 + - 4 + - 4 + - 2 + - 6 + - 4 + - 0 + - 3 + - 7 intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 + - 0.0 + - 0.0 + - 1.0 + - 1.0 + - 0.0 + - 0.0 + - 1.0 + - 1.0 j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 + - 0 + - 7 + - 1 + - 2 + - 6 + - 7 + - 1 + - 2 + - 5 + - 5 + - 2 + - 2 k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 + - 3 + - 4 + - 2 + - 3 + - 5 + - 6 + - 5 + - 5 + - 0 + - 1 + - 7 + - 6 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -909,14 +4464,32 @@ data: showscale: false type: mesh3d x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 - facecolor: - '#da16ff' - '#da16ff' @@ -1144,14 +4717,683 @@ data: - '#fff7f3' - '#fff7f3' i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 + - 75 + - 64 + - 2 + - 75 + - 76 + - 65 + - 65 + - 64 + - 2 + - 0 + - 1 + - 0 + - 84 + - 86 + - 86 + - 90 + - 90 + - 92 + - 92 + - 91 + - 91 + - 87 + - 87 + - 85 + - 85 + - 83 + - 83 + - 82 + - 82 + - 84 + - 94 + - 86 + - 86 + - 84 + - 84 + - 82 + - 82 + - 83 + - 83 + - 85 + - 85 + - 87 + - 87 + - 87 + - 91 + - 91 + - 92 + - 92 + - 90 + - 90 + - 94 + - 95 + - 88 + - 78 + - 79 + - 81 + - 80 + - 93 + - 96 + - 89 + - 77 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 50 + - 52 + - 52 + - 44 + - 44 + - 32 + - 32 + - 22 + - 22 + - 14 + - 14 + - 20 + - 20 + - 30 + - 30 + - 41 + - 41 + - 50 + - 57 + - 52 + - 52 + - 50 + - 50 + - 41 + - 41 + - 30 + - 30 + - 20 + - 20 + - 14 + - 14 + - 14 + - 22 + - 22 + - 32 + - 32 + - 44 + - 44 + - 57 + - 11 + - 4 + - 12 + - 58 + - 62 + - 8 + - 7 + - 39 + - 61 + - 42 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 48 + - 54 + - 54 + - 47 + - 47 + - 37 + - 37 + - 25 + - 25 + - 17 + - 17 + - 18 + - 18 + - 26 + - 26 + - 38 + - 38 + - 48 + - 59 + - 54 + - 54 + - 48 + - 48 + - 38 + - 38 + - 26 + - 26 + - 18 + - 18 + - 17 + - 17 + - 17 + - 25 + - 25 + - 37 + - 37 + - 47 + - 47 + - 59 + - 27 + - 5 + - 10 + - 56 + - 60 + - 6 + - 9 + - 55 + - 63 + - 28 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 98 + - 99 + - 100 + - 101 + - 102 + - 104 + - 105 + - 106 + - 107 + - 108 + - 110 + - 111 + - 112 + - 113 + - 114 + - 116 + - 117 + - 118 + - 119 + - 120 + - 122 + - 123 + - 124 + - 125 + - 126 + - 128 + - 129 + - 130 + - 131 + - 132 + - 134 + - 135 + - 136 + - 137 + - 138 + - 140 + - 141 + - 142 + - 143 + - 144 + - 146 + - 147 + - 148 + - 149 + - 150 j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 + - 76 + - 76 + - 3 + - 3 + - 3 + - 3 + - 1 + - 1 + - 75 + - 75 + - 3 + - 3 + - 70 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 71 + - 71 + - 69 + - 69 + - 67 + - 67 + - 66 + - 66 + - 68 + - 68 + - 89 + - 89 + - 81 + - 81 + - 79 + - 79 + - 77 + - 77 + - 78 + - 78 + - 80 + - 80 + - 88 + - 93 + - 93 + - 95 + - 95 + - 96 + - 96 + - 94 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 68 + - 68 + - 66 + - 66 + - 67 + - 67 + - 69 + - 51 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 13 + - 13 + - 19 + - 19 + - 29 + - 29 + - 40 + - 40 + - 49 + - 49 + - 61 + - 61 + - 62 + - 62 + - 58 + - 58 + - 42 + - 42 + - 12 + - 12 + - 8 + - 8 + - 4 + - 7 + - 7 + - 11 + - 11 + - 39 + - 39 + - 57 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 49 + - 49 + - 40 + - 40 + - 29 + - 29 + - 19 + - 53 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 15 + - 15 + - 16 + - 16 + - 24 + - 24 + - 36 + - 36 + - 46 + - 46 + - 63 + - 63 + - 60 + - 60 + - 56 + - 56 + - 28 + - 28 + - 10 + - 10 + - 6 + - 6 + - 5 + - 9 + - 9 + - 27 + - 27 + - 55 + - 55 + - 59 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 46 + - 46 + - 36 + - 36 + - 24 + - 24 + - 16 + - 99 + - 100 + - 101 + - 102 + - 98 + - 105 + - 106 + - 107 + - 108 + - 104 + - 111 + - 112 + - 113 + - 114 + - 110 + - 117 + - 118 + - 119 + - 120 + - 116 + - 123 + - 124 + - 125 + - 126 + - 122 + - 129 + - 130 + - 131 + - 132 + - 128 + - 135 + - 136 + - 137 + - 138 + - 134 + - 141 + - 142 + - 143 + - 144 + - 140 + - 147 + - 148 + - 149 + - 150 + - 146 k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 + - 64 + - 65 + - 75 + - 76 + - 65 + - 1 + - 64 + - 0 + - 0 + - 64 + - 0 + - 2 + - 86 + - 72 + - 90 + - 74 + - 92 + - 73 + - 91 + - 71 + - 87 + - 69 + - 85 + - 67 + - 83 + - 66 + - 82 + - 68 + - 84 + - 70 + - 86 + - 81 + - 84 + - 79 + - 82 + - 77 + - 83 + - 78 + - 85 + - 80 + - 87 + - 88 + - 93 + - 91 + - 95 + - 92 + - 96 + - 90 + - 94 + - 86 + - 89 + - 96 + - 93 + - 80 + - 77 + - 79 + - 88 + - 95 + - 94 + - 81 + - 78 + - 72 + - 66 + - 74 + - 67 + - 73 + - 69 + - 71 + - 52 + - 43 + - 44 + - 31 + - 32 + - 21 + - 22 + - 13 + - 14 + - 19 + - 20 + - 29 + - 30 + - 40 + - 41 + - 49 + - 50 + - 51 + - 52 + - 62 + - 50 + - 58 + - 41 + - 42 + - 30 + - 12 + - 20 + - 8 + - 14 + - 4 + - 7 + - 22 + - 11 + - 32 + - 39 + - 44 + - 57 + - 52 + - 61 + - 39 + - 7 + - 8 + - 42 + - 58 + - 4 + - 11 + - 57 + - 62 + - 12 + - 43 + - 40 + - 31 + - 29 + - 21 + - 19 + - 13 + - 54 + - 45 + - 47 + - 35 + - 37 + - 23 + - 25 + - 15 + - 17 + - 16 + - 18 + - 24 + - 26 + - 36 + - 38 + - 46 + - 48 + - 53 + - 54 + - 60 + - 48 + - 56 + - 38 + - 28 + - 26 + - 10 + - 18 + - 6 + - 17 + - 5 + - 9 + - 25 + - 27 + - 37 + - 55 + - 47 + - 59 + - 54 + - 63 + - 55 + - 9 + - 6 + - 28 + - 56 + - 5 + - 27 + - 59 + - 60 + - 10 + - 45 + - 36 + - 35 + - 24 + - 23 + - 16 + - 15 + - 103 + - 103 + - 103 + - 103 + - 103 + - 109 + - 109 + - 109 + - 109 + - 109 + - 115 + - 115 + - 115 + - 115 + - 115 + - 121 + - 121 + - 121 + - 121 + - 121 + - 127 + - 127 + - 127 + - 127 + - 127 + - 133 + - 133 + - 133 + - 133 + - 133 + - 139 + - 139 + - 139 + - 139 + - 139 + - 145 + - 145 + - 145 + - 145 + - 145 + - 151 + - 151 + - 151 + - 151 + - 151 legendgroup: Sensor(id=ID) name: Sensor (RdPu) opacity: 1 @@ -1159,14 +5401,464 @@ data: showlegend: true type: mesh3d x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014992463600000002 + - -0.014392395300000003 + - -0.014392395300000003 + - -0.012869499600000002 + - -0.012355425950000002 + - -0.009822911000000002 + - -0.009822911000000002 + - -0.0066605612500000005 + - -0.005795627850000001 + - 0.0 + - -0.004997477680000001 + - 0.0 + - 0.0 + - -0.0046984631550000015 + - -0.0046984631550000015 + - 0.0 + - -0.003930366410000001 + - 0.0 + - -0.003726213425000001 + - 0.0 + - 0.0 + - -0.0025000000350000003 + - -0.0025000000350000003 + - -0.0021347226600000008 + - -0.0021347226600000008 + - 0.0 + - -0.0010241928500000002 + - 0.0 + - -0.0007114128200000001 + - -1.0408340850000002e-17 + - -9.553993650000002e-18 + - 0.0 + - 0.0 + - 0.0008682409300000002 + - 0.0008682409300000002 + - 0.0016630589950000004 + - 0.0 + - 0.0023612117400000003 + - 0.0026042407400000004 + - 0.0 + - 0.0026362657550000005 + - 0.0 + - 0.0 + - 0.003830222040000001 + - 0.003830222040000001 + - 0.0 + - 0.004641779140000001 + - 0.0 + - 0.004750406370000001 + - 0.0 + - 0.0049999997000000004 + - 0.006231224900000001 + - 0.006231224900000001 + - 0.00945867 + - 0.010177281500000003 + - 0.012618804000000003 + - 0.012618804000000003 + - 0.014251218750000003 + - 0.014519108850000004 + - 0.014999999100000003 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.10000000000000002 + - -0.7500000000000001 + - -0.9227457514062634 + - -1.202254248593737 + - -1.2022542485937369 + - -0.9227457514062631 + - -0.9999999999999999 + - -1.3905869642868405 + - -1.2260719938514835 + - -0.9598811800288918 + - -0.9598811800288918 + - -1.2260719938514835 + - -0.8475013375904817 + - -0.7500000000000001 + - -0.9227457514062631 + - -1.2022542485937369 + - -1.202254248593737 + - -0.9227457514062634 + - -0.9999999999999999 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - 1.25 + - 1.0772542485937369 + - 0.797745751406263 + - 0.797745751406263 + - 1.0772542485937366 + - 1.0 + - 1.0855896394678042 + - 0.9210746690324472 + - 0.6548838552098555 + - 0.6548838552098555 + - 0.9210746690324471 + - 1.1524986624095181 + - 1.25 + - 1.0772542485937366 + - 0.797745751406263 + - 0.797745751406263 + - 1.0772542485937366 + - 1.0 y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - -0.004225988315000001 + - 0.004225988315000001 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.011336243900000001 + - 0.011336243900000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0017101006600000004 + - 0.0017101006600000004 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.004330126940000001 + - 0.004330126940000001 + - -0.014847321800000002 + - 0.014847321800000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.10000000000000002 + - 0.0 + - 0.0 + - -0.0049240388000000015 + - 0.0049240388000000015 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0032139379550000006 + - 0.0032139379550000006 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.013644480700000003 + - 0.013644480700000003 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.008109612750000002 + - 0.008109612750000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.00028137136250000006 + - 0.0078714803 + - -0.008344890200000002 + - 0.013525193950000004 + - -0.013758964850000003 + - -0.0016490003100000004 + - 0.0017709132300000002 + - -0.0042973283700000016 + - 0.0043621968500000005 + - -0.004934888705000001 + - 0.004912360015000001 + - 0.014884752050000002 + - -0.014804665750000005 + - -0.0032633595150000005 + - 0.0031639754750000006 + - -6.486846850000001e-05 + - 0.011518507450000002 + - -0.011149990550000002 + - 0.004495218770000001 + - -0.0039552707250000005 + - 9.925023200000001e-18 + - -1.353553390593274 + - -1.521678018584263 + - -1.457460125037637 + - -1.2496466561489104 + - -1.1854287626022846 + - -0.6464466094067262 + - 0.0 + - 0.23776412907378844 + - 0.14694631307311834 + - -0.14694631307311828 + - -0.23776412907378847 + - 0.0 + - 1.353553390593274 + - 1.1854287626022846 + - 1.2496466561489104 + - 1.457460125037637 + - 1.521678018584263 + - 0.6464466094067262 + - -1.0 + - -0.7622358709262116 + - -0.8530536869268817 + - -1.1469463130731183 + - -1.2377641290737884 + - -1.0 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 1.0 + - 1.2377641290737884 + - 1.1469463130731183 + - 0.8530536869268818 + - 0.7622358709262116 + - 1.0 + - -0.6464466094067262 + - -0.4783219814157369 + - -0.5425398749623628 + - -0.7503533438510895 + - -0.8145712373977154 + - -1.353553390593274 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 0.6464466094067262 + - 0.8145712373977154 + - 0.7503533438510895 + - 0.5425398749623629 + - 0.4783219814157368 + - 1.353553390593274 z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.0004754300695000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.007705580450000002 + - -0.008505494900000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.013440123200000004 + - -0.013835124650000002 + - 0.0 + - 0.00015880254800000005 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.003090666795000001 + - 0.0 + - 0.0033339664350000007 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0048939786850000005 + - 0.0 + - 0.004949130490000001 + - 0.10000000000000002 + - -3.1374891150000003e-18 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.014907522500000003 + - 0.0 + - -0.004407344015000001 + - -0.014772200600000002 + - 0.0 + - 0.0042485412200000015 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0018584636950000003 + - 0.0 + - 0.0015600122500000005 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.011641889050000001 + - -0.011019207550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.004680036755000001 + - -0.003767693415000001 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014997360100000004 + - -0.012768703700000003 + - -0.012464462200000002 + - -0.006486073150000001 + - -0.005974184350000002 + - -0.004720254240000001 + - -0.004675881190000001 + - -0.0025559673100000006 + - -0.0024436118100000007 + - 0.0008042847750000002 + - 0.0009320507750000002 + - 0.0018558396050000002 + - 0.0024128545100000004 + - 0.003788203375000001 + - 0.0038715966050000008 + - 0.004999579490000001 + - 0.009608536200000002 + - 0.0100338295 + - 0.014310590900000003 + - 0.014469133300000003 + - -1.6175736900000002e-18 + - 1.3535533905932737 + - 1.1854287626022844 + - 1.2496466561489104 + - 1.457460125037637 + - 1.521678018584263 + - 0.6464466094067263 + - 1.3999272725498855 + - 1.45261426460265 + - 1.5378636085090187 + - 1.5378636085090187 + - 1.45261426460265 + - 0.5238233962453553 + - 1.3535533905932737 + - 1.521678018584263 + - 1.457460125037637 + - 1.2496466561489104 + - 1.1854287626022844 + - 0.6464466094067263 + - 1.25 + - 1.0772542485937366 + - 0.797745751406263 + - 0.797745751406263 + - 1.0772542485937366 + - 1.0 + - 1.25 + - 1.0772542485937366 + - 0.797745751406263 + - 0.797745751406263 + - 1.0772542485937366 + - 1.0 + - 1.25 + - 1.0772542485937366 + - 0.797745751406263 + - 0.797745751406263 + - 1.0772542485937366 + - 1.0 + - 0.6464466094067263 + - 0.8145712373977156 + - 0.7503533438510896 + - 0.5425398749623629 + - 0.4783219814157369 + - 1.3535533905932737 + - 0.4475740650405964 + - 0.500261057093361 + - 0.5855104009997295 + - 0.5855104009997295 + - 0.500261057093361 + - 1.4761766037546447 + - 0.6464466094067263 + - 0.4783219814157369 + - 0.5425398749623629 + - 0.7503533438510896 + - 0.8145712373977156 + - 1.3535533905932737 layout: legend: itemsizing: constant diff --git a/tests/test_display_plotly/test_pixel_field_directional_symbols.yml b/tests/test_display_plotly/test_pixel_field_directional_symbols.yml index dbbcf5ada..be4304b85 100644 --- a/tests/test_display_plotly/test_pixel_field_directional_symbols.yml +++ b/tests/test_display_plotly/test_pixel_field_directional_symbols.yml @@ -14,17 +14,53 @@ data: - - 1.0 - '#e71111' i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 + - 7 + - 0 + - 0 + - 0 + - 4 + - 4 + - 2 + - 6 + - 4 + - 0 + - 3 + - 7 intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 + - 0.0 + - 0.0 + - 1.0 + - 1.0 + - 0.0 + - 0.0 + - 1.0 + - 1.0 j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 + - 0 + - 7 + - 1 + - 2 + - 6 + - 7 + - 1 + - 2 + - 5 + - 5 + - 2 + - 2 k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 + - 3 + - 4 + - 2 + - 3 + - 5 + - 6 + - 5 + - 5 + - 0 + - 1 + - 7 + - 6 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -33,14 +69,32 @@ data: showscale: false type: mesh3d x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 - facecolor: - '#e15f99' - '#e15f99' @@ -268,14 +322,683 @@ data: - '#440154' - '#440154' i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 + - 75 + - 64 + - 2 + - 75 + - 76 + - 65 + - 65 + - 64 + - 2 + - 0 + - 1 + - 0 + - 84 + - 86 + - 86 + - 90 + - 90 + - 92 + - 92 + - 91 + - 91 + - 87 + - 87 + - 85 + - 85 + - 83 + - 83 + - 82 + - 82 + - 84 + - 94 + - 86 + - 86 + - 84 + - 84 + - 82 + - 82 + - 83 + - 83 + - 85 + - 85 + - 87 + - 87 + - 87 + - 91 + - 91 + - 92 + - 92 + - 90 + - 90 + - 94 + - 95 + - 88 + - 78 + - 79 + - 81 + - 80 + - 93 + - 96 + - 89 + - 77 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 50 + - 52 + - 52 + - 44 + - 44 + - 32 + - 32 + - 22 + - 22 + - 14 + - 14 + - 20 + - 20 + - 30 + - 30 + - 41 + - 41 + - 50 + - 57 + - 52 + - 52 + - 50 + - 50 + - 41 + - 41 + - 30 + - 30 + - 20 + - 20 + - 14 + - 14 + - 14 + - 22 + - 22 + - 32 + - 32 + - 44 + - 44 + - 57 + - 11 + - 4 + - 12 + - 58 + - 62 + - 8 + - 7 + - 39 + - 61 + - 42 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 48 + - 54 + - 54 + - 47 + - 47 + - 37 + - 37 + - 25 + - 25 + - 17 + - 17 + - 18 + - 18 + - 26 + - 26 + - 38 + - 38 + - 48 + - 59 + - 54 + - 54 + - 48 + - 48 + - 38 + - 38 + - 26 + - 26 + - 18 + - 18 + - 17 + - 17 + - 17 + - 25 + - 25 + - 37 + - 37 + - 47 + - 47 + - 59 + - 27 + - 5 + - 10 + - 56 + - 60 + - 6 + - 9 + - 55 + - 63 + - 28 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 98 + - 99 + - 100 + - 101 + - 102 + - 104 + - 105 + - 106 + - 107 + - 108 + - 110 + - 111 + - 112 + - 113 + - 114 + - 116 + - 117 + - 118 + - 119 + - 120 + - 122 + - 123 + - 124 + - 125 + - 126 + - 128 + - 129 + - 130 + - 131 + - 132 + - 134 + - 135 + - 136 + - 137 + - 138 + - 140 + - 141 + - 142 + - 143 + - 144 + - 146 + - 147 + - 148 + - 149 + - 150 j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 + - 76 + - 76 + - 3 + - 3 + - 3 + - 3 + - 1 + - 1 + - 75 + - 75 + - 3 + - 3 + - 70 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 71 + - 71 + - 69 + - 69 + - 67 + - 67 + - 66 + - 66 + - 68 + - 68 + - 89 + - 89 + - 81 + - 81 + - 79 + - 79 + - 77 + - 77 + - 78 + - 78 + - 80 + - 80 + - 88 + - 93 + - 93 + - 95 + - 95 + - 96 + - 96 + - 94 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 68 + - 68 + - 66 + - 66 + - 67 + - 67 + - 69 + - 51 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 13 + - 13 + - 19 + - 19 + - 29 + - 29 + - 40 + - 40 + - 49 + - 49 + - 61 + - 61 + - 62 + - 62 + - 58 + - 58 + - 42 + - 42 + - 12 + - 12 + - 8 + - 8 + - 4 + - 7 + - 7 + - 11 + - 11 + - 39 + - 39 + - 57 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 49 + - 49 + - 40 + - 40 + - 29 + - 29 + - 19 + - 53 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 15 + - 15 + - 16 + - 16 + - 24 + - 24 + - 36 + - 36 + - 46 + - 46 + - 63 + - 63 + - 60 + - 60 + - 56 + - 56 + - 28 + - 28 + - 10 + - 10 + - 6 + - 6 + - 5 + - 9 + - 9 + - 27 + - 27 + - 55 + - 55 + - 59 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 46 + - 46 + - 36 + - 36 + - 24 + - 24 + - 16 + - 99 + - 100 + - 101 + - 102 + - 98 + - 105 + - 106 + - 107 + - 108 + - 104 + - 111 + - 112 + - 113 + - 114 + - 110 + - 117 + - 118 + - 119 + - 120 + - 116 + - 123 + - 124 + - 125 + - 126 + - 122 + - 129 + - 130 + - 131 + - 132 + - 128 + - 135 + - 136 + - 137 + - 138 + - 134 + - 141 + - 142 + - 143 + - 144 + - 140 + - 147 + - 148 + - 149 + - 150 + - 146 k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 + - 64 + - 65 + - 75 + - 76 + - 65 + - 1 + - 64 + - 0 + - 0 + - 64 + - 0 + - 2 + - 86 + - 72 + - 90 + - 74 + - 92 + - 73 + - 91 + - 71 + - 87 + - 69 + - 85 + - 67 + - 83 + - 66 + - 82 + - 68 + - 84 + - 70 + - 86 + - 81 + - 84 + - 79 + - 82 + - 77 + - 83 + - 78 + - 85 + - 80 + - 87 + - 88 + - 93 + - 91 + - 95 + - 92 + - 96 + - 90 + - 94 + - 86 + - 89 + - 96 + - 93 + - 80 + - 77 + - 79 + - 88 + - 95 + - 94 + - 81 + - 78 + - 72 + - 66 + - 74 + - 67 + - 73 + - 69 + - 71 + - 52 + - 43 + - 44 + - 31 + - 32 + - 21 + - 22 + - 13 + - 14 + - 19 + - 20 + - 29 + - 30 + - 40 + - 41 + - 49 + - 50 + - 51 + - 52 + - 62 + - 50 + - 58 + - 41 + - 42 + - 30 + - 12 + - 20 + - 8 + - 14 + - 4 + - 7 + - 22 + - 11 + - 32 + - 39 + - 44 + - 57 + - 52 + - 61 + - 39 + - 7 + - 8 + - 42 + - 58 + - 4 + - 11 + - 57 + - 62 + - 12 + - 43 + - 40 + - 31 + - 29 + - 21 + - 19 + - 13 + - 54 + - 45 + - 47 + - 35 + - 37 + - 23 + - 25 + - 15 + - 17 + - 16 + - 18 + - 24 + - 26 + - 36 + - 38 + - 46 + - 48 + - 53 + - 54 + - 60 + - 48 + - 56 + - 38 + - 28 + - 26 + - 10 + - 18 + - 6 + - 17 + - 5 + - 9 + - 25 + - 27 + - 37 + - 55 + - 47 + - 59 + - 54 + - 63 + - 55 + - 9 + - 6 + - 28 + - 56 + - 5 + - 27 + - 59 + - 60 + - 10 + - 45 + - 36 + - 35 + - 24 + - 23 + - 16 + - 15 + - 103 + - 103 + - 103 + - 103 + - 103 + - 109 + - 109 + - 109 + - 109 + - 109 + - 115 + - 115 + - 115 + - 115 + - 115 + - 121 + - 121 + - 121 + - 121 + - 121 + - 127 + - 127 + - 127 + - 127 + - 127 + - 133 + - 133 + - 133 + - 133 + - 133 + - 139 + - 139 + - 139 + - 139 + - 139 + - 145 + - 145 + - 145 + - 145 + - 145 + - 151 + - 151 + - 151 + - 151 + - 151 legendgroup: Sensor(id=ID) name: Sensor (cone) opacity: 1 @@ -283,14 +1006,464 @@ data: showlegend: true type: mesh3d x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014992463600000002 + - -0.014392395300000003 + - -0.014392395300000003 + - -0.012869499600000002 + - -0.012355425950000002 + - -0.009822911000000002 + - -0.009822911000000002 + - -0.0066605612500000005 + - -0.005795627850000001 + - 0.0 + - -0.004997477680000001 + - 0.0 + - 0.0 + - -0.0046984631550000015 + - -0.0046984631550000015 + - 0.0 + - -0.003930366410000001 + - 0.0 + - -0.003726213425000001 + - 0.0 + - 0.0 + - -0.0025000000350000003 + - -0.0025000000350000003 + - -0.0021347226600000008 + - -0.0021347226600000008 + - 0.0 + - -0.0010241928500000002 + - 0.0 + - -0.0007114128200000001 + - -1.0408340850000002e-17 + - -9.553993650000002e-18 + - 0.0 + - 0.0 + - 0.0008682409300000002 + - 0.0008682409300000002 + - 0.0016630589950000004 + - 0.0 + - 0.0023612117400000003 + - 0.0026042407400000004 + - 0.0 + - 0.0026362657550000005 + - 0.0 + - 0.0 + - 0.003830222040000001 + - 0.003830222040000001 + - 0.0 + - 0.004641779140000001 + - 0.0 + - 0.004750406370000001 + - 0.0 + - 0.0049999997000000004 + - 0.006231224900000001 + - 0.006231224900000001 + - 0.00945867 + - 0.010177281500000003 + - 0.012618804000000003 + - 0.012618804000000003 + - 0.014251218750000003 + - 0.014519108850000004 + - 0.014999999100000003 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.10000000000000002 + - -0.9257545044462104 + - -1.151493064908857 + - -1.3786213269384155 + - -1.2932557522157282 + - -1.01336866353838 + - -0.8475013375904817 + - -1.5 + - -1.5 + - -1.5 + - -1.5 + - -1.5 + - -0.5 + - -0.9257545044462104 + - -1.01336866353838 + - -1.2932557522157282 + - -1.3786213269384155 + - -1.151493064908857 + - -0.8475013375904817 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - -0.49999999999999994 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - 1.0742454955537897 + - 0.9866313364616199 + - 0.7067442477842719 + - 0.6213786730615845 + - 0.8485069350911429 + - 1.1524986624095181 + - 0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 + - 1.5 + - 1.0742454955537897 + - 0.8485069350911429 + - 0.6213786730615845 + - 0.7067442477842718 + - 0.9866313364616199 + - 1.1524986624095181 y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - -0.004225988315000001 + - 0.004225988315000001 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.011336243900000001 + - 0.011336243900000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0017101006600000004 + - 0.0017101006600000004 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.004330126940000001 + - 0.004330126940000001 + - -0.014847321800000002 + - 0.014847321800000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.10000000000000002 + - 0.0 + - 0.0 + - -0.0049240388000000015 + - 0.0049240388000000015 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0032139379550000006 + - 0.0032139379550000006 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.013644480700000003 + - 0.013644480700000003 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.008109612750000002 + - 0.008109612750000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.00028137136250000006 + - 0.0078714803 + - -0.008344890200000002 + - 0.013525193950000004 + - -0.013758964850000003 + - -0.0016490003100000004 + - 0.0017709132300000002 + - -0.0042973283700000016 + - 0.0043621968500000005 + - -0.004934888705000001 + - 0.004912360015000001 + - 0.014884752050000002 + - -0.014804665750000005 + - -0.0032633595150000005 + - 0.0031639754750000006 + - -6.486846850000001e-05 + - 0.011518507450000002 + - -0.011149990550000002 + - 0.004495218770000001 + - -0.0039552707250000005 + - 9.925023200000001e-18 + - -1.548792898897935 + - -1.4764986529115414 + - -1.4037593459363646 + - -1.4310982278939868 + - -1.5207338931333951 + - -0.5238233962453553 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 1.548792898897935 + - 1.5207338931333951 + - 1.4310982278939868 + - 1.4037593459363646 + - 1.4764986529115414 + - 0.5238233962453553 + - -1.0 + - -0.7622358709262116 + - -0.8530536869268817 + - -1.1469463130731183 + - -1.2377641290737884 + - -1.0 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 1.0 + - 1.2377641290737884 + - 1.1469463130731183 + - 0.8530536869268818 + - 0.7622358709262116 + - 1.0 + - -0.45120710110206497 + - -0.47926610686660476 + - -0.5689017721060132 + - -0.5962406540636354 + - -0.5235013470884586 + - -1.4761766037546447 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 0.45120710110206497 + - 0.5235013470884586 + - 0.5962406540636354 + - 0.5689017721060132 + - 0.47926610686660476 + - 1.4761766037546447 z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.0004754300695000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.007705580450000002 + - -0.008505494900000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.013440123200000004 + - -0.013835124650000002 + - 0.0 + - 0.00015880254800000005 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.003090666795000001 + - 0.0 + - 0.0033339664350000007 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0048939786850000005 + - 0.0 + - 0.004949130490000001 + - 0.10000000000000002 + - -3.1374891150000003e-18 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.014907522500000003 + - 0.0 + - -0.004407344015000001 + - -0.014772200600000002 + - 0.0 + - 0.0042485412200000015 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0018584636950000003 + - 0.0 + - 0.0015600122500000005 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.011641889050000001 + - -0.011019207550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.004680036755000001 + - -0.003767693415000001 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014997360100000004 + - -0.012768703700000003 + - -0.012464462200000002 + - -0.006486073150000001 + - -0.005974184350000002 + - -0.004720254240000001 + - -0.004675881190000001 + - -0.0025559673100000006 + - -0.0024436118100000007 + - 0.0008042847750000002 + - 0.0009320507750000002 + - 0.0018558396050000002 + - 0.0024128545100000004 + - 0.003788203375000001 + - 0.0038715966050000008 + - 0.004999579490000001 + - 0.009608536200000002 + - 0.0100338295 + - 0.014310590900000003 + - 0.014469133300000003 + - -1.6175736900000002e-18 + - -0.0762493312047592 + - -0.24999777010606963 + - -0.0782577878324744 + - 0.20163179734122239 + - 0.2028730918020804 + - 8.326672684688674e-17 + - -0.2500000000000001 + - -0.07725424859373697 + - 0.20225424859373672 + - 0.20225424859373675 + - -0.07725424859373692 + - 1.1102230246251565e-16 + - -0.0762493312047592 + - 0.20287309180208038 + - 0.20163179734122244 + - -0.07825778783247435 + - -0.24999777010606966 + - 8.326672684688674e-17 + - 0.2499999999999999 + - 0.07725424859373675 + - -0.20225424859373695 + - -0.20225424859373697 + - 0.0772542485937367 + - 1.1102230246251565e-16 + - -0.2500000000000001 + - -0.07725424859373697 + - 0.20225424859373672 + - 0.20225424859373675 + - -0.07725424859373692 + - 1.1102230246251565e-16 + - 0.2499999999999999 + - 0.07725424859373675 + - -0.20225424859373695 + - -0.20225424859373697 + - 0.0772542485937367 + - 1.1102230246251565e-16 + - -0.0762493312047592 + - 0.20287309180208038 + - 0.20163179734122244 + - -0.07825778783247435 + - -0.24999777010606966 + - 8.326672684688674e-17 + - -0.2500000000000001 + - -0.07725424859373697 + - 0.20225424859373672 + - 0.20225424859373675 + - -0.07725424859373692 + - 1.1102230246251565e-16 + - -0.0762493312047592 + - -0.24999777010606963 + - -0.0782577878324744 + - 0.20163179734122239 + - 0.2028730918020804 + - 8.326672684688674e-17 - color: '#2e91e5' colorscale: - - 0.0 @@ -306,17 +1479,53 @@ data: - - 1.0 - '#e71111' i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 + - 7 + - 0 + - 0 + - 0 + - 4 + - 4 + - 2 + - 6 + - 4 + - 0 + - 3 + - 7 intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 + - 0.0 + - 0.0 + - 1.0 + - 1.0 + - 0.0 + - 0.0 + - 1.0 + - 1.0 j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 + - 0 + - 7 + - 1 + - 2 + - 6 + - 7 + - 1 + - 2 + - 5 + - 5 + - 2 + - 2 k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 + - 3 + - 4 + - 2 + - 3 + - 5 + - 6 + - 5 + - 5 + - 0 + - 1 + - 7 + - 6 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -325,14 +1534,32 @@ data: showscale: false type: mesh3d x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 - facecolor: - '#1ca71c' - '#1ca71c' @@ -740,14 +1967,1223 @@ data: - '#440154' - '#440154' i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABtAG4AbwBwAHEAaABpAGoAawBsAG0AbgBvAHAAcQB0AHUAdgB3AHgAegB7AHwAfQB+AH8AgACBAIIAgwB6AHsAfAB9AH4AfwCAAIEAggCDAIYAhwCIAIkAigCMAI0AjgCPAJAAkQCSAJMAlACVAIwAjQCOAI8AkACRAJIAkwCUAJUAmACZAJoAmwCcAJ4AnwCgAKEAogCjAKQApQCmAKcAngCfAKAAoQCiAKMApAClAKYApwCqAKsArACtAK4AsACxALIAswC0ALUAtgC3ALgAuQCwALEAsgCzALQAtQC2ALcAuAC5ALwAvQC+AL8AwADCAMMAxADFAMYAxwDIAMkAygDLAMIAwwDEAMUAxgDHAMgAyQDKAMsAzgDPANAA0QDSANQA1QDWANcA2ADZANoA2wDcAN0A1ADVANYA1wDYANkA2gDbANwA3QDgAOEA4gDjAOQA5gDnAOgA6QDqAOsA7ADtAO4A7wDmAOcA6ADpAOoA6wDsAO0A7gDvAPIA8wD0APUA9gD4APkA+gD7APwA/QD+AP8AAAEBAfgA+QD6APsA/AD9AP4A/wAAAQEB - dtype: i2 + - 75 + - 64 + - 2 + - 75 + - 76 + - 65 + - 65 + - 64 + - 2 + - 0 + - 1 + - 0 + - 84 + - 86 + - 86 + - 90 + - 90 + - 92 + - 92 + - 91 + - 91 + - 87 + - 87 + - 85 + - 85 + - 83 + - 83 + - 82 + - 82 + - 84 + - 94 + - 86 + - 86 + - 84 + - 84 + - 82 + - 82 + - 83 + - 83 + - 85 + - 85 + - 87 + - 87 + - 87 + - 91 + - 91 + - 92 + - 92 + - 90 + - 90 + - 94 + - 95 + - 88 + - 78 + - 79 + - 81 + - 80 + - 93 + - 96 + - 89 + - 77 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 50 + - 52 + - 52 + - 44 + - 44 + - 32 + - 32 + - 22 + - 22 + - 14 + - 14 + - 20 + - 20 + - 30 + - 30 + - 41 + - 41 + - 50 + - 57 + - 52 + - 52 + - 50 + - 50 + - 41 + - 41 + - 30 + - 30 + - 20 + - 20 + - 14 + - 14 + - 14 + - 22 + - 22 + - 32 + - 32 + - 44 + - 44 + - 57 + - 11 + - 4 + - 12 + - 58 + - 62 + - 8 + - 7 + - 39 + - 61 + - 42 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 48 + - 54 + - 54 + - 47 + - 47 + - 37 + - 37 + - 25 + - 25 + - 17 + - 17 + - 18 + - 18 + - 26 + - 26 + - 38 + - 38 + - 48 + - 59 + - 54 + - 54 + - 48 + - 48 + - 38 + - 38 + - 26 + - 26 + - 18 + - 18 + - 17 + - 17 + - 17 + - 25 + - 25 + - 37 + - 37 + - 47 + - 47 + - 59 + - 27 + - 5 + - 10 + - 56 + - 60 + - 6 + - 9 + - 55 + - 63 + - 28 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 98 + - 99 + - 100 + - 101 + - 102 + - 104 + - 105 + - 106 + - 107 + - 108 + - 109 + - 110 + - 111 + - 112 + - 113 + - 104 + - 105 + - 106 + - 107 + - 108 + - 109 + - 110 + - 111 + - 112 + - 113 + - 116 + - 117 + - 118 + - 119 + - 120 + - 122 + - 123 + - 124 + - 125 + - 126 + - 127 + - 128 + - 129 + - 130 + - 131 + - 122 + - 123 + - 124 + - 125 + - 126 + - 127 + - 128 + - 129 + - 130 + - 131 + - 134 + - 135 + - 136 + - 137 + - 138 + - 140 + - 141 + - 142 + - 143 + - 144 + - 145 + - 146 + - 147 + - 148 + - 149 + - 140 + - 141 + - 142 + - 143 + - 144 + - 145 + - 146 + - 147 + - 148 + - 149 + - 152 + - 153 + - 154 + - 155 + - 156 + - 158 + - 159 + - 160 + - 161 + - 162 + - 163 + - 164 + - 165 + - 166 + - 167 + - 158 + - 159 + - 160 + - 161 + - 162 + - 163 + - 164 + - 165 + - 166 + - 167 + - 170 + - 171 + - 172 + - 173 + - 174 + - 176 + - 177 + - 178 + - 179 + - 180 + - 181 + - 182 + - 183 + - 184 + - 185 + - 176 + - 177 + - 178 + - 179 + - 180 + - 181 + - 182 + - 183 + - 184 + - 185 + - 188 + - 189 + - 190 + - 191 + - 192 + - 194 + - 195 + - 196 + - 197 + - 198 + - 199 + - 200 + - 201 + - 202 + - 203 + - 194 + - 195 + - 196 + - 197 + - 198 + - 199 + - 200 + - 201 + - 202 + - 203 + - 206 + - 207 + - 208 + - 209 + - 210 + - 212 + - 213 + - 214 + - 215 + - 216 + - 217 + - 218 + - 219 + - 220 + - 221 + - 212 + - 213 + - 214 + - 215 + - 216 + - 217 + - 218 + - 219 + - 220 + - 221 + - 224 + - 225 + - 226 + - 227 + - 228 + - 230 + - 231 + - 232 + - 233 + - 234 + - 235 + - 236 + - 237 + - 238 + - 239 + - 230 + - 231 + - 232 + - 233 + - 234 + - 235 + - 236 + - 237 + - 238 + - 239 + - 242 + - 243 + - 244 + - 245 + - 246 + - 248 + - 249 + - 250 + - 251 + - 252 + - 253 + - 254 + - 255 + - 256 + - 257 + - 248 + - 249 + - 250 + - 251 + - 252 + - 253 + - 254 + - 255 + - 256 + - 257 j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABpAGoAawBsAGgAcgByAHIAcgByAG4AbwBwAHEAbQB1AHYAdwB4AHQAewB8AH0AfgB6AHsAfAB9AH4AegCEAIQAhACEAIQAgACBAIIAgwB/AIcAiACJAIoAhgCNAI4AjwCQAIwAjQCOAI8AkACMAJYAlgCWAJYAlgCSAJMAlACVAJEAmQCaAJsAnACYAJ8AoAChAKIAngCfAKAAoQCiAJ4AqACoAKgAqACoAKQApQCmAKcAowCrAKwArQCuAKoAsQCyALMAtACwALEAsgCzALQAsAC6ALoAugC6ALoAtgC3ALgAuQC1AL0AvgC/AMAAvADDAMQAxQDGAMIAwwDEAMUAxgDCAMwAzADMAMwAzADIAMkAygDLAMcAzwDQANEA0gDOANUA1gDXANgA1ADVANYA1wDYANQA3gDeAN4A3gDeANoA2wDcAN0A2QDhAOIA4wDkAOAA5wDoAOkA6gDmAOcA6ADpAOoA5gDwAPAA8ADwAPAA7ADtAO4A7wDrAPMA9AD1APYA8gD5APoA+wD8APgA+QD6APsA/AD4AAIBAgECAQIBAgH+AP8AAAEBAf0A - dtype: i2 + - 76 + - 76 + - 3 + - 3 + - 3 + - 3 + - 1 + - 1 + - 75 + - 75 + - 3 + - 3 + - 70 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 71 + - 71 + - 69 + - 69 + - 67 + - 67 + - 66 + - 66 + - 68 + - 68 + - 89 + - 89 + - 81 + - 81 + - 79 + - 79 + - 77 + - 77 + - 78 + - 78 + - 80 + - 80 + - 88 + - 93 + - 93 + - 95 + - 95 + - 96 + - 96 + - 94 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 68 + - 68 + - 66 + - 66 + - 67 + - 67 + - 69 + - 51 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 13 + - 13 + - 19 + - 19 + - 29 + - 29 + - 40 + - 40 + - 49 + - 49 + - 61 + - 61 + - 62 + - 62 + - 58 + - 58 + - 42 + - 42 + - 12 + - 12 + - 8 + - 8 + - 4 + - 7 + - 7 + - 11 + - 11 + - 39 + - 39 + - 57 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 49 + - 49 + - 40 + - 40 + - 29 + - 29 + - 19 + - 53 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 15 + - 15 + - 16 + - 16 + - 24 + - 24 + - 36 + - 36 + - 46 + - 46 + - 63 + - 63 + - 60 + - 60 + - 56 + - 56 + - 28 + - 28 + - 10 + - 10 + - 6 + - 6 + - 5 + - 9 + - 9 + - 27 + - 27 + - 55 + - 55 + - 59 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 46 + - 46 + - 36 + - 36 + - 24 + - 24 + - 16 + - 99 + - 100 + - 101 + - 102 + - 98 + - 105 + - 106 + - 107 + - 108 + - 104 + - 105 + - 106 + - 107 + - 108 + - 104 + - 114 + - 114 + - 114 + - 114 + - 114 + - 110 + - 111 + - 112 + - 113 + - 109 + - 117 + - 118 + - 119 + - 120 + - 116 + - 123 + - 124 + - 125 + - 126 + - 122 + - 123 + - 124 + - 125 + - 126 + - 122 + - 132 + - 132 + - 132 + - 132 + - 132 + - 128 + - 129 + - 130 + - 131 + - 127 + - 135 + - 136 + - 137 + - 138 + - 134 + - 141 + - 142 + - 143 + - 144 + - 140 + - 141 + - 142 + - 143 + - 144 + - 140 + - 150 + - 150 + - 150 + - 150 + - 150 + - 146 + - 147 + - 148 + - 149 + - 145 + - 153 + - 154 + - 155 + - 156 + - 152 + - 159 + - 160 + - 161 + - 162 + - 158 + - 159 + - 160 + - 161 + - 162 + - 158 + - 168 + - 168 + - 168 + - 168 + - 168 + - 164 + - 165 + - 166 + - 167 + - 163 + - 171 + - 172 + - 173 + - 174 + - 170 + - 177 + - 178 + - 179 + - 180 + - 176 + - 177 + - 178 + - 179 + - 180 + - 176 + - 186 + - 186 + - 186 + - 186 + - 186 + - 182 + - 183 + - 184 + - 185 + - 181 + - 189 + - 190 + - 191 + - 192 + - 188 + - 195 + - 196 + - 197 + - 198 + - 194 + - 195 + - 196 + - 197 + - 198 + - 194 + - 204 + - 204 + - 204 + - 204 + - 204 + - 200 + - 201 + - 202 + - 203 + - 199 + - 207 + - 208 + - 209 + - 210 + - 206 + - 213 + - 214 + - 215 + - 216 + - 212 + - 213 + - 214 + - 215 + - 216 + - 212 + - 222 + - 222 + - 222 + - 222 + - 222 + - 218 + - 219 + - 220 + - 221 + - 217 + - 225 + - 226 + - 227 + - 228 + - 224 + - 231 + - 232 + - 233 + - 234 + - 230 + - 231 + - 232 + - 233 + - 234 + - 230 + - 240 + - 240 + - 240 + - 240 + - 240 + - 236 + - 237 + - 238 + - 239 + - 235 + - 243 + - 244 + - 245 + - 246 + - 242 + - 249 + - 250 + - 251 + - 252 + - 248 + - 249 + - 250 + - 251 + - 252 + - 248 + - 258 + - 258 + - 258 + - 258 + - 258 + - 254 + - 255 + - 256 + - 257 + - 253 k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbgBvAHAAcQBuAG8AcABxAG0AaQBqAGsAbABoAHMAcwBzAHMAcwB5AHkAeQB5AHkAfwCAAIEAggCDAIAAgQCCAIMAfwB7AHwAfQB+AHoAhQCFAIUAhQCFAIsAiwCLAIsAiwCRAJIAkwCUAJUAkgCTAJQAlQCRAI0AjgCPAJAAjACXAJcAlwCXAJcAnQCdAJ0AnQCdAKMApAClAKYApwCkAKUApgCnAKMAnwCgAKEAogCeAKkAqQCpAKkAqQCvAK8ArwCvAK8AtQC2ALcAuAC5ALYAtwC4ALkAtQCxALIAswC0ALAAuwC7ALsAuwC7AMEAwQDBAMEAwQDHAMgAyQDKAMsAyADJAMoAywDHAMMAxADFAMYAwgDNAM0AzQDNAM0A0wDTANMA0wDTANkA2gDbANwA3QDaANsA3ADdANkA1QDWANcA2ADUAN8A3wDfAN8A3wDlAOUA5QDlAOUA6wDsAO0A7gDvAOwA7QDuAO8A6wDnAOgA6QDqAOYA8QDxAPEA8QDxAPcA9wD3APcA9wD9AP4A/wAAAQEB/gD/AAABAQH9APkA+gD7APwA+AADAQMBAwEDAQMB - dtype: i2 + - 64 + - 65 + - 75 + - 76 + - 65 + - 1 + - 64 + - 0 + - 0 + - 64 + - 0 + - 2 + - 86 + - 72 + - 90 + - 74 + - 92 + - 73 + - 91 + - 71 + - 87 + - 69 + - 85 + - 67 + - 83 + - 66 + - 82 + - 68 + - 84 + - 70 + - 86 + - 81 + - 84 + - 79 + - 82 + - 77 + - 83 + - 78 + - 85 + - 80 + - 87 + - 88 + - 93 + - 91 + - 95 + - 92 + - 96 + - 90 + - 94 + - 86 + - 89 + - 96 + - 93 + - 80 + - 77 + - 79 + - 88 + - 95 + - 94 + - 81 + - 78 + - 72 + - 66 + - 74 + - 67 + - 73 + - 69 + - 71 + - 52 + - 43 + - 44 + - 31 + - 32 + - 21 + - 22 + - 13 + - 14 + - 19 + - 20 + - 29 + - 30 + - 40 + - 41 + - 49 + - 50 + - 51 + - 52 + - 62 + - 50 + - 58 + - 41 + - 42 + - 30 + - 12 + - 20 + - 8 + - 14 + - 4 + - 7 + - 22 + - 11 + - 32 + - 39 + - 44 + - 57 + - 52 + - 61 + - 39 + - 7 + - 8 + - 42 + - 58 + - 4 + - 11 + - 57 + - 62 + - 12 + - 43 + - 40 + - 31 + - 29 + - 21 + - 19 + - 13 + - 54 + - 45 + - 47 + - 35 + - 37 + - 23 + - 25 + - 15 + - 17 + - 16 + - 18 + - 24 + - 26 + - 36 + - 38 + - 46 + - 48 + - 53 + - 54 + - 60 + - 48 + - 56 + - 38 + - 28 + - 26 + - 10 + - 18 + - 6 + - 17 + - 5 + - 9 + - 25 + - 27 + - 37 + - 55 + - 47 + - 59 + - 54 + - 63 + - 55 + - 9 + - 6 + - 28 + - 56 + - 5 + - 27 + - 59 + - 60 + - 10 + - 45 + - 36 + - 35 + - 24 + - 23 + - 16 + - 15 + - 103 + - 103 + - 103 + - 103 + - 103 + - 109 + - 110 + - 111 + - 112 + - 113 + - 110 + - 111 + - 112 + - 113 + - 109 + - 105 + - 106 + - 107 + - 108 + - 104 + - 115 + - 115 + - 115 + - 115 + - 115 + - 121 + - 121 + - 121 + - 121 + - 121 + - 127 + - 128 + - 129 + - 130 + - 131 + - 128 + - 129 + - 130 + - 131 + - 127 + - 123 + - 124 + - 125 + - 126 + - 122 + - 133 + - 133 + - 133 + - 133 + - 133 + - 139 + - 139 + - 139 + - 139 + - 139 + - 145 + - 146 + - 147 + - 148 + - 149 + - 146 + - 147 + - 148 + - 149 + - 145 + - 141 + - 142 + - 143 + - 144 + - 140 + - 151 + - 151 + - 151 + - 151 + - 151 + - 157 + - 157 + - 157 + - 157 + - 157 + - 163 + - 164 + - 165 + - 166 + - 167 + - 164 + - 165 + - 166 + - 167 + - 163 + - 159 + - 160 + - 161 + - 162 + - 158 + - 169 + - 169 + - 169 + - 169 + - 169 + - 175 + - 175 + - 175 + - 175 + - 175 + - 181 + - 182 + - 183 + - 184 + - 185 + - 182 + - 183 + - 184 + - 185 + - 181 + - 177 + - 178 + - 179 + - 180 + - 176 + - 187 + - 187 + - 187 + - 187 + - 187 + - 193 + - 193 + - 193 + - 193 + - 193 + - 199 + - 200 + - 201 + - 202 + - 203 + - 200 + - 201 + - 202 + - 203 + - 199 + - 195 + - 196 + - 197 + - 198 + - 194 + - 205 + - 205 + - 205 + - 205 + - 205 + - 211 + - 211 + - 211 + - 211 + - 211 + - 217 + - 218 + - 219 + - 220 + - 221 + - 218 + - 219 + - 220 + - 221 + - 217 + - 213 + - 214 + - 215 + - 216 + - 212 + - 223 + - 223 + - 223 + - 223 + - 223 + - 229 + - 229 + - 229 + - 229 + - 229 + - 235 + - 236 + - 237 + - 238 + - 239 + - 236 + - 237 + - 238 + - 239 + - 235 + - 231 + - 232 + - 233 + - 234 + - 230 + - 241 + - 241 + - 241 + - 241 + - 241 + - 247 + - 247 + - 247 + - 247 + - 247 + - 253 + - 254 + - 255 + - 256 + - 257 + - 254 + - 255 + - 256 + - 257 + - 253 + - 249 + - 250 + - 251 + - 252 + - 248 + - 259 + - 259 + - 259 + - 259 + - 259 legendgroup: Sensor(id=ID) name: Sensor (arrow3d) opacity: 1 @@ -755,14 +3191,788 @@ data: showlegend: true type: mesh3d x: - bdata: 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 - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014992463600000002 + - -0.014392395300000003 + - -0.014392395300000003 + - -0.012869499600000002 + - -0.012355425950000002 + - -0.009822911000000002 + - -0.009822911000000002 + - -0.0066605612500000005 + - -0.005795627850000001 + - 0.0 + - -0.004997477680000001 + - 0.0 + - 0.0 + - -0.0046984631550000015 + - -0.0046984631550000015 + - 0.0 + - -0.003930366410000001 + - 0.0 + - -0.003726213425000001 + - 0.0 + - 0.0 + - -0.0025000000350000003 + - -0.0025000000350000003 + - -0.0021347226600000008 + - -0.0021347226600000008 + - 0.0 + - -0.0010241928500000002 + - 0.0 + - -0.0007114128200000001 + - -1.0408340850000002e-17 + - -9.553993650000002e-18 + - 0.0 + - 0.0 + - 0.0008682409300000002 + - 0.0008682409300000002 + - 0.0016630589950000004 + - 0.0 + - 0.0023612117400000003 + - 0.0026042407400000004 + - 0.0 + - 0.0026362657550000005 + - 0.0 + - 0.0 + - 0.003830222040000001 + - 0.003830222040000001 + - 0.0 + - 0.004641779140000001 + - 0.0 + - 0.004750406370000001 + - 0.0 + - 0.0049999997000000004 + - 0.006231224900000001 + - 0.006231224900000001 + - 0.00945867 + - 0.010177281500000003 + - 0.012618804000000003 + - 0.012618804000000003 + - 0.014251218750000003 + - 0.014519108850000004 + - 0.014999999100000003 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.10000000000000002 + - -0.7732558420366922 + - -0.9989944024993388 + - -1.2261226645288974 + - -1.1407570898062098 + - -0.8608700011288618 + - -0.8475013375904817 + - -1.0391265834278642 + - -1.1519958636591876 + - -1.2655599946739668 + - -1.2228772073126233 + - -1.0829336629739492 + - -0.8866279210183461 + - -0.9994972012496695 + - -1.1130613322644487 + - -1.070378544903105 + - -0.930435000564431 + - -1.1524986624095181 + - -1.0 + - -1.0 + - -1.0 + - -1.0 + - -1.0 + - -1.0 + - -0.5 + - -1.5 + - -1.5 + - -1.5 + - -1.5 + - -1.5 + - -1.0 + - -1.0 + - -1.0 + - -1.0 + - -1.0 + - -1.5 + - -1.0 + - -0.7732558420366922 + - -0.8608700011288618 + - -1.1407570898062098 + - -1.2261226645288974 + - -0.9989944024993389 + - -0.8475013375904817 + - -1.0391265834278642 + - -1.0829336629739492 + - -1.222877207312623 + - -1.2655599946739668 + - -1.1519958636591876 + - -0.8866279210183461 + - -0.9304350005644308 + - -1.070378544903105 + - -1.1130613322644487 + - -0.9994972012496695 + - -1.1524986624095181 + - -1.0 + - 5.551115123125783e-17 + - 1.7153889107776457e-17 + - -4.4909464723405365e-17 + - -4.490946472340537e-17 + - 1.7153889107776445e-17 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 + - 2.7755575615628914e-17 + - 8.576944553888229e-18 + - -2.2454732361702682e-17 + - -2.2454732361702685e-17 + - 8.576944553888222e-18 + - 0.5 + - 0.0 + - 5.551115123125783e-17 + - 1.7153889107776457e-17 + - -4.4909464723405365e-17 + - -4.490946472340537e-17 + - 1.7153889107776445e-17 + - 0.5 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 2.7755575615628914e-17 + - 8.576944553888229e-18 + - -2.2454732361702682e-17 + - -2.2454732361702685e-17 + - 8.576944553888222e-18 + - -0.5 + - 0.0 + - 5.551115123125783e-17 + - 1.7153889107776457e-17 + - -4.4909464723405365e-17 + - -4.490946472340537e-17 + - 1.7153889107776445e-17 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 + - 2.7755575615628914e-17 + - 8.576944553888229e-18 + - -2.2454732361702682e-17 + - -2.2454732361702685e-17 + - 8.576944553888222e-18 + - 0.5 + - 0.0 + - 1.2267441579633078 + - 1.1391299988711383 + - 0.8592429101937902 + - 0.7738773354711027 + - 1.001005597500661 + - 1.1524986624095181 + - 0.9608734165721357 + - 0.9170663370260509 + - 0.7771227926873768 + - 0.7344400053260332 + - 0.8480041363408123 + - 1.113372078981654 + - 1.0695649994355692 + - 0.9296214550968951 + - 0.8869386677355513 + - 1.0005027987503305 + - 0.8475013375904817 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 0.5 + - 1.0 + - 1.2267441579633078 + - 1.001005597500661 + - 0.7738773354711027 + - 0.8592429101937901 + - 1.139129998871138 + - 1.1524986624095181 + - 0.9608734165721357 + - 0.8480041363408124 + - 0.7344400053260332 + - 0.7771227926873768 + - 0.9170663370260509 + - 1.113372078981654 + - 1.0005027987503305 + - 0.8869386677355513 + - 0.9296214550968951 + - 1.0695649994355692 + - 0.8475013375904817 + - 1.0 y: - bdata: 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 - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - -0.004225988315000001 + - 0.004225988315000001 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.011336243900000001 + - 0.011336243900000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0017101006600000004 + - 0.0017101006600000004 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.004330126940000001 + - 0.004330126940000001 + - -0.014847321800000002 + - 0.014847321800000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.10000000000000002 + - 0.0 + - 0.0 + - -0.0049240388000000015 + - 0.0049240388000000015 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0032139379550000006 + - 0.0032139379550000006 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.013644480700000003 + - 0.013644480700000003 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.008109612750000002 + - 0.008109612750000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.00028137136250000006 + - 0.0078714803 + - -0.008344890200000002 + - 0.013525193950000004 + - -0.013758964850000003 + - -0.0016490003100000004 + - 0.0017709132300000002 + - -0.0042973283700000016 + - 0.0043621968500000005 + - -0.004934888705000001 + - 0.004912360015000001 + - 0.014884752050000002 + - -0.014804665750000005 + - -0.0032633595150000005 + - 0.0031639754750000006 + - -6.486846850000001e-05 + - 0.011518507450000002 + - -0.011149990550000002 + - 0.004495218770000001 + - -0.0039552707250000005 + - 9.925023200000001e-18 + - -1.0726162951432905 + - -1.0003220491568967 + - -0.92758274218172 + - -0.9549216241393421 + - -1.0445572893787507 + - -0.5238233962453553 + - -1.5124847513262898 + - -1.4763376283330931 + - -1.4399679748455045 + - -1.4536374158243157 + - -1.49845524844402 + - -1.0363081475716451 + - -1.0001610245784485 + - -0.96379137109086 + - -0.9774608120696711 + - -1.0222786446893752 + - -1.4761766037546447 + - -1.0 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 0.0 + - 0.11888206453689419 + - 0.07347315653655916 + - -0.07347315653655913 + - -0.1188820645368942 + - 0.0 + - 0.11888206453689419 + - 0.07347315653655916 + - -0.07347315653655913 + - -0.1188820645368942 + - 0.0 + - 0.0 + - 1.0726162951432905 + - 1.0445572893787507 + - 0.9549216241393421 + - 0.92758274218172 + - 1.0003220491568967 + - 0.5238233962453553 + - 1.5124847513262898 + - 1.49845524844402 + - 1.4536374158243157 + - 1.4399679748455045 + - 1.4763376283330931 + - 1.0363081475716451 + - 1.0222786446893752 + - 0.9774608120696711 + - 0.96379137109086 + - 1.0001610245784485 + - 1.4761766037546447 + - 1.0 + - -1.0 + - -0.7622358709262116 + - -0.8530536869268817 + - -1.1469463130731183 + - -1.2377641290737884 + - -1.0 + - -1.0 + - -0.8811179354631058 + - -0.9265268434634408 + - -1.0734731565365592 + - -1.1188820645368942 + - -1.0 + - -0.8811179354631058 + - -0.9265268434634408 + - -1.0734731565365592 + - -1.1188820645368942 + - -1.0 + - -1.0 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 0.0 + - 0.11888206453689419 + - 0.07347315653655916 + - -0.07347315653655913 + - -0.1188820645368942 + - 0.0 + - 0.11888206453689419 + - 0.07347315653655916 + - -0.07347315653655913 + - -0.1188820645368942 + - 0.0 + - 0.0 + - 1.0 + - 1.2377641290737884 + - 1.1469463130731183 + - 0.8530536869268818 + - 0.7622358709262116 + - 1.0 + - 1.0 + - 1.1188820645368942 + - 1.0734731565365592 + - 0.9265268434634408 + - 0.8811179354631058 + - 1.0 + - 1.1188820645368942 + - 1.0734731565365592 + - 0.9265268434634408 + - 0.8811179354631058 + - 1.0 + - 1.0 + - -0.9273837048567095 + - -0.9554427106212494 + - -1.0450783758606579 + - -1.07241725781828 + - -0.9996779508431032 + - -1.4761766037546447 + - -0.4875152486737102 + - -0.5015447515559801 + - -0.5463625841756843 + - -0.5600320251544955 + - -0.523662371666907 + - -0.9636918524283548 + - -0.9777213553106247 + - -1.022539187930329 + - -1.0362086289091401 + - -0.9998389754215516 + - -0.5238233962453553 + - -1.0 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 0.0 + - 0.11888206453689419 + - 0.07347315653655916 + - -0.07347315653655913 + - -0.1188820645368942 + - 0.0 + - 0.11888206453689419 + - 0.07347315653655916 + - -0.07347315653655913 + - -0.1188820645368942 + - 0.0 + - 0.0 + - 0.9273837048567095 + - 0.9996779508431032 + - 1.07241725781828 + - 1.0450783758606579 + - 0.9554427106212494 + - 1.4761766037546447 + - 0.4875152486737102 + - 0.523662371666907 + - 0.5600320251544955 + - 0.5463625841756843 + - 0.5015447515559801 + - 0.9636918524283548 + - 0.9998389754215516 + - 1.03620862890914 + - 1.022539187930329 + - 0.9777213553106247 + - 0.5238233962453553 + - 1.0 z: - bdata: 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 - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.0004754300695000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.007705580450000002 + - -0.008505494900000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.013440123200000004 + - -0.013835124650000002 + - 0.0 + - 0.00015880254800000005 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.003090666795000001 + - 0.0 + - 0.0033339664350000007 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0048939786850000005 + - 0.0 + - 0.004949130490000001 + - 0.10000000000000002 + - -3.1374891150000003e-18 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.014907522500000003 + - 0.0 + - -0.004407344015000001 + - -0.014772200600000002 + - 0.0 + - 0.0042485412200000015 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0018584636950000003 + - 0.0 + - 0.0015600122500000005 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.011641889050000001 + - -0.011019207550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.004680036755000001 + - -0.003767693415000001 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014997360100000004 + - -0.012768703700000003 + - -0.012464462200000002 + - -0.006486073150000001 + - -0.005974184350000002 + - -0.004720254240000001 + - -0.004675881190000001 + - -0.0025559673100000006 + - -0.0024436118100000007 + - 0.0008042847750000002 + - 0.0009320507750000002 + - 0.0018558396050000002 + - 0.0024128545100000004 + - 0.003788203375000001 + - 0.0038715966050000008 + - 0.004999579490000001 + - 0.009608536200000002 + - 0.0100338295 + - 0.014310590900000003 + - 0.014469133300000003 + - -1.6175736900000002e-18 + - -0.07624933120475912 + - -0.24999777010606955 + - -0.07825778783247432 + - 0.20163179734122247 + - 0.2028730918020805 + - 8.326672684688674e-17 + - -0.03812466560237964 + - -0.12499888505303486 + - -0.039128893916237244 + - 0.10081589867061115 + - 0.10143654590104016 + - -0.03812466560237956 + - -0.12499888505303478 + - -0.03912889391623716 + - 0.10081589867061123 + - 0.10143654590104025 + - -8.326672684688674e-17 + - 0.0 + - -0.25 + - -0.07725424859373686 + - 0.20225424859373684 + - 0.20225424859373686 + - -0.07725424859373681 + - 1.1102230246251565e-16 + - -0.1250000000000001 + - -0.03862712429686854 + - 0.1011271242968683 + - 0.10112712429686832 + - -0.038627124296868515 + - -0.125 + - -0.03862712429686843 + - 0.10112712429686842 + - 0.10112712429686843 + - -0.038627124296868404 + - -1.1102230246251565e-16 + - 0.0 + - -0.07624933120475912 + - 0.20287309180208046 + - 0.20163179734122252 + - -0.07825778783247427 + - -0.24999777010606958 + - 8.326672684688674e-17 + - -0.03812466560237964 + - 0.10143654590104015 + - 0.10081589867061118 + - -0.039128893916237216 + - -0.12499888505303487 + - -0.03812466560237956 + - 0.10143654590104023 + - 0.10081589867061126 + - -0.03912889391623713 + - -0.12499888505303479 + - -8.326672684688674e-17 + - 0.0 + - 0.25 + - 0.07725424859373686 + - -0.20225424859373684 + - -0.20225424859373686 + - 0.07725424859373681 + - 1.1102230246251565e-16 + - 0.12499999999999989 + - 0.03862712429686832 + - -0.10112712429686853 + - -0.10112712429686854 + - 0.03862712429686829 + - 0.125 + - 0.03862712429686843 + - -0.10112712429686842 + - -0.10112712429686843 + - 0.038627124296868404 + - -1.1102230246251565e-16 + - 0.0 + - -0.25 + - -0.07725424859373686 + - 0.20225424859373684 + - 0.20225424859373686 + - -0.07725424859373681 + - 1.1102230246251565e-16 + - -0.1250000000000001 + - -0.03862712429686854 + - 0.1011271242968683 + - 0.10112712429686832 + - -0.038627124296868515 + - -0.125 + - -0.03862712429686843 + - 0.10112712429686842 + - 0.10112712429686843 + - -0.038627124296868404 + - -1.1102230246251565e-16 + - 0.0 + - 0.25 + - 0.07725424859373686 + - -0.20225424859373684 + - -0.20225424859373686 + - 0.07725424859373681 + - 1.1102230246251565e-16 + - 0.12499999999999989 + - 0.03862712429686832 + - -0.10112712429686853 + - -0.10112712429686854 + - 0.03862712429686829 + - 0.125 + - 0.03862712429686843 + - -0.10112712429686842 + - -0.10112712429686843 + - 0.038627124296868404 + - -1.1102230246251565e-16 + - 0.0 + - -0.07624933120475912 + - 0.20287309180208046 + - 0.20163179734122252 + - -0.07825778783247427 + - -0.24999777010606958 + - 8.326672684688674e-17 + - -0.03812466560237964 + - 0.10143654590104015 + - 0.10081589867061118 + - -0.039128893916237216 + - -0.12499888505303487 + - -0.03812466560237956 + - 0.10143654590104023 + - 0.10081589867061126 + - -0.03912889391623713 + - -0.12499888505303479 + - -8.326672684688674e-17 + - 0.0 + - -0.25 + - -0.07725424859373686 + - 0.20225424859373684 + - 0.20225424859373686 + - -0.07725424859373681 + - 1.1102230246251565e-16 + - -0.1250000000000001 + - -0.03862712429686854 + - 0.1011271242968683 + - 0.10112712429686832 + - -0.038627124296868515 + - -0.125 + - -0.03862712429686843 + - 0.10112712429686842 + - 0.10112712429686843 + - -0.038627124296868404 + - -1.1102230246251565e-16 + - 0.0 + - -0.07624933120475912 + - -0.24999777010606955 + - -0.07825778783247432 + - 0.20163179734122247 + - 0.2028730918020805 + - 8.326672684688674e-17 + - -0.03812466560237964 + - -0.12499888505303486 + - -0.039128893916237244 + - 0.10081589867061115 + - 0.10143654590104016 + - -0.03812466560237956 + - -0.12499888505303478 + - -0.03912889391623716 + - 0.10081589867061123 + - 0.10143654590104025 + - -8.326672684688674e-17 + - 0.0 - color: '#2e91e5' colorscale: - - 0.0 @@ -778,17 +3988,53 @@ data: - - 1.0 - '#e71111' i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 + - 7 + - 0 + - 0 + - 0 + - 4 + - 4 + - 2 + - 6 + - 4 + - 0 + - 3 + - 7 intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 + - 0.0 + - 0.0 + - 1.0 + - 1.0 + - 0.0 + - 0.0 + - 1.0 + - 1.0 j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 + - 0 + - 7 + - 1 + - 2 + - 6 + - 7 + - 1 + - 2 + - 5 + - 5 + - 2 + - 2 k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 + - 3 + - 4 + - 2 + - 3 + - 5 + - 6 + - 5 + - 5 + - 0 + - 1 + - 7 + - 6 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -797,14 +4043,32 @@ data: showscale: false type: mesh3d x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 - facecolor: - '#fb0d0d' - '#fb0d0d' @@ -987,14 +4251,548 @@ data: - blue - blue i: - bdata: S0ACS0xBQUACAAEAVFZWWlpcXFtbV1dVVVNTUlJUXlZWVFRSUlNTVVVXV1dbW1xcWlpeX1hOT1FQXWBZTUZISEpKSUkyNDQsLCAgFhYODhQUHh4pKTI5NDQyMikpHh4UFA4ODhYWICAsLDkLBAw6PggHJz0qMysrHx8VFTA2Ni8vJSUZGREREhIaGiYmMDs2NjAwJiYaGhISERERGRklJS8vOxsFCjg8Bgk3Pxw1LS0jIxcX - dtype: i1 + - 75 + - 64 + - 2 + - 75 + - 76 + - 65 + - 65 + - 64 + - 2 + - 0 + - 1 + - 0 + - 84 + - 86 + - 86 + - 90 + - 90 + - 92 + - 92 + - 91 + - 91 + - 87 + - 87 + - 85 + - 85 + - 83 + - 83 + - 82 + - 82 + - 84 + - 94 + - 86 + - 86 + - 84 + - 84 + - 82 + - 82 + - 83 + - 83 + - 85 + - 85 + - 87 + - 87 + - 87 + - 91 + - 91 + - 92 + - 92 + - 90 + - 90 + - 94 + - 95 + - 88 + - 78 + - 79 + - 81 + - 80 + - 93 + - 96 + - 89 + - 77 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 50 + - 52 + - 52 + - 44 + - 44 + - 32 + - 32 + - 22 + - 22 + - 14 + - 14 + - 20 + - 20 + - 30 + - 30 + - 41 + - 41 + - 50 + - 57 + - 52 + - 52 + - 50 + - 50 + - 41 + - 41 + - 30 + - 30 + - 20 + - 20 + - 14 + - 14 + - 14 + - 22 + - 22 + - 32 + - 32 + - 44 + - 44 + - 57 + - 11 + - 4 + - 12 + - 58 + - 62 + - 8 + - 7 + - 39 + - 61 + - 42 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 48 + - 54 + - 54 + - 47 + - 47 + - 37 + - 37 + - 25 + - 25 + - 17 + - 17 + - 18 + - 18 + - 26 + - 26 + - 38 + - 38 + - 48 + - 59 + - 54 + - 54 + - 48 + - 48 + - 38 + - 38 + - 26 + - 26 + - 18 + - 18 + - 17 + - 17 + - 17 + - 25 + - 25 + - 37 + - 37 + - 47 + - 47 + - 59 + - 27 + - 5 + - 10 + - 56 + - 60 + - 6 + - 9 + - 55 + - 63 + - 28 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 j: - bdata: TEwDAwMDAQFLSwMDRkZISEpKSUlHR0VFQ0NCQkREWVlRUU9PTU1OTlBQWF1dX19gYF5hYWFhYWFhYWFhYUREQkJDQ0UzMysrHx8VFQ0NExMdHSgoMTE9PT4+OjoqKgwMCAgEBwcLCycnOSIiIiIiIiIiIiIiMTEoKB0dEzU1LS0jIxcXDw8QEBgYJCQuLj8/PDw4OBwcCgoGBgUJCRsbNzc7ISEhISEhISEhISEuLiQkGBgQ - dtype: i1 + - 76 + - 76 + - 3 + - 3 + - 3 + - 3 + - 1 + - 1 + - 75 + - 75 + - 3 + - 3 + - 70 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 71 + - 71 + - 69 + - 69 + - 67 + - 67 + - 66 + - 66 + - 68 + - 68 + - 89 + - 89 + - 81 + - 81 + - 79 + - 79 + - 77 + - 77 + - 78 + - 78 + - 80 + - 80 + - 88 + - 93 + - 93 + - 95 + - 95 + - 96 + - 96 + - 94 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 68 + - 68 + - 66 + - 66 + - 67 + - 67 + - 69 + - 51 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 13 + - 13 + - 19 + - 19 + - 29 + - 29 + - 40 + - 40 + - 49 + - 49 + - 61 + - 61 + - 62 + - 62 + - 58 + - 58 + - 42 + - 42 + - 12 + - 12 + - 8 + - 8 + - 4 + - 7 + - 7 + - 11 + - 11 + - 39 + - 39 + - 57 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 49 + - 49 + - 40 + - 40 + - 29 + - 29 + - 19 + - 53 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 15 + - 15 + - 16 + - 16 + - 24 + - 24 + - 36 + - 36 + - 46 + - 46 + - 63 + - 63 + - 60 + - 60 + - 56 + - 56 + - 28 + - 28 + - 10 + - 10 + - 6 + - 6 + - 5 + - 9 + - 9 + - 27 + - 27 + - 55 + - 55 + - 59 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 46 + - 46 + - 36 + - 36 + - 24 + - 24 + - 16 k: - bdata: QEFLTEEBQAAAQAACVkhaSlxJW0dXRVVDU0JSRFRGVlFUT1JNU05VUFdYXVtfXGBaXlZZYF1QTU9YX15RTkhCSkNJRUc0KywfIBUWDQ4TFB0eKCkxMjM0PjI6KSoeDBQIDgQHFgsgJyw5ND0nBwgqOgQLOT4MKygfHRUTDTYtLyMlFxkPERASGBokJi4wNTY8MDgmHBoKEgYRBQkZGyU3Lzs2PzcJBhw4BRs7PAotJCMYFxAP - dtype: i1 + - 64 + - 65 + - 75 + - 76 + - 65 + - 1 + - 64 + - 0 + - 0 + - 64 + - 0 + - 2 + - 86 + - 72 + - 90 + - 74 + - 92 + - 73 + - 91 + - 71 + - 87 + - 69 + - 85 + - 67 + - 83 + - 66 + - 82 + - 68 + - 84 + - 70 + - 86 + - 81 + - 84 + - 79 + - 82 + - 77 + - 83 + - 78 + - 85 + - 80 + - 87 + - 88 + - 93 + - 91 + - 95 + - 92 + - 96 + - 90 + - 94 + - 86 + - 89 + - 96 + - 93 + - 80 + - 77 + - 79 + - 88 + - 95 + - 94 + - 81 + - 78 + - 72 + - 66 + - 74 + - 67 + - 73 + - 69 + - 71 + - 52 + - 43 + - 44 + - 31 + - 32 + - 21 + - 22 + - 13 + - 14 + - 19 + - 20 + - 29 + - 30 + - 40 + - 41 + - 49 + - 50 + - 51 + - 52 + - 62 + - 50 + - 58 + - 41 + - 42 + - 30 + - 12 + - 20 + - 8 + - 14 + - 4 + - 7 + - 22 + - 11 + - 32 + - 39 + - 44 + - 57 + - 52 + - 61 + - 39 + - 7 + - 8 + - 42 + - 58 + - 4 + - 11 + - 57 + - 62 + - 12 + - 43 + - 40 + - 31 + - 29 + - 21 + - 19 + - 13 + - 54 + - 45 + - 47 + - 35 + - 37 + - 23 + - 25 + - 15 + - 17 + - 16 + - 18 + - 24 + - 26 + - 36 + - 38 + - 46 + - 48 + - 53 + - 54 + - 60 + - 48 + - 56 + - 38 + - 28 + - 26 + - 10 + - 18 + - 6 + - 17 + - 5 + - 9 + - 25 + - 27 + - 37 + - 55 + - 47 + - 59 + - 54 + - 63 + - 55 + - 9 + - 6 + - 28 + - 56 + - 5 + - 27 + - 59 + - 60 + - 10 + - 45 + - 36 + - 35 + - 24 + - 23 + - 16 + - 15 legendgroup: Sensor(id=ID) name: Sensor (arrow) opacity: 1 @@ -1002,14 +4800,302 @@ data: showlegend: true type: mesh3d x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5Pw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014992463600000002 + - -0.014392395300000003 + - -0.014392395300000003 + - -0.012869499600000002 + - -0.012355425950000002 + - -0.009822911000000002 + - -0.009822911000000002 + - -0.0066605612500000005 + - -0.005795627850000001 + - 0.0 + - -0.004997477680000001 + - 0.0 + - 0.0 + - -0.0046984631550000015 + - -0.0046984631550000015 + - 0.0 + - -0.003930366410000001 + - 0.0 + - -0.003726213425000001 + - 0.0 + - 0.0 + - -0.0025000000350000003 + - -0.0025000000350000003 + - -0.0021347226600000008 + - -0.0021347226600000008 + - 0.0 + - -0.0010241928500000002 + - 0.0 + - -0.0007114128200000001 + - -1.0408340850000002e-17 + - -9.553993650000002e-18 + - 0.0 + - 0.0 + - 0.0008682409300000002 + - 0.0008682409300000002 + - 0.0016630589950000004 + - 0.0 + - 0.0023612117400000003 + - 0.0026042407400000004 + - 0.0 + - 0.0026362657550000005 + - 0.0 + - 0.0 + - 0.003830222040000001 + - 0.003830222040000001 + - 0.0 + - 0.004641779140000001 + - 0.0 + - 0.004750406370000001 + - 0.0 + - 0.0049999997000000004 + - 0.006231224900000001 + - 0.006231224900000001 + - 0.00945867 + - 0.010177281500000003 + - 0.012618804000000003 + - 0.012618804000000003 + - 0.014251218750000003 + - 0.014519108850000004 + - 0.014999999100000003 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.10000000000000002 y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPA== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - -0.004225988315000001 + - 0.004225988315000001 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.011336243900000001 + - 0.011336243900000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0017101006600000004 + - 0.0017101006600000004 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.004330126940000001 + - 0.004330126940000001 + - -0.014847321800000002 + - 0.014847321800000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.10000000000000002 + - 0.0 + - 0.0 + - -0.0049240388000000015 + - 0.0049240388000000015 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0032139379550000006 + - 0.0032139379550000006 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.013644480700000003 + - 0.013644480700000003 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.008109612750000002 + - 0.008109612750000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.00028137136250000006 + - 0.0078714803 + - -0.008344890200000002 + - 0.013525193950000004 + - -0.013758964850000003 + - -0.0016490003100000004 + - 0.0017709132300000002 + - -0.0042973283700000016 + - 0.0043621968500000005 + - -0.004934888705000001 + - 0.004912360015000001 + - 0.014884752050000002 + - -0.014804665750000005 + - -0.0032633595150000005 + - 0.0031639754750000006 + - -6.486846850000001e-05 + - 0.011518507450000002 + - -0.011149990550000002 + - 0.004495218770000001 + - -0.0039552707250000005 + - 9.925023200000001e-18 z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vA== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.0004754300695000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.007705580450000002 + - -0.008505494900000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.013440123200000004 + - -0.013835124650000002 + - 0.0 + - 0.00015880254800000005 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.003090666795000001 + - 0.0 + - 0.0033339664350000007 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0048939786850000005 + - 0.0 + - 0.004949130490000001 + - 0.10000000000000002 + - -3.1374891150000003e-18 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.014907522500000003 + - 0.0 + - -0.004407344015000001 + - -0.014772200600000002 + - 0.0 + - 0.0042485412200000015 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0018584636950000003 + - 0.0 + - 0.0015600122500000005 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.011641889050000001 + - -0.011019207550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.004680036755000001 + - -0.003767693415000001 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014997360100000004 + - -0.012768703700000003 + - -0.012464462200000002 + - -0.006486073150000001 + - -0.005974184350000002 + - -0.004720254240000001 + - -0.004675881190000001 + - -0.0025559673100000006 + - -0.0024436118100000007 + - 0.0008042847750000002 + - 0.0009320507750000002 + - 0.0018558396050000002 + - 0.0024128545100000004 + - 0.003788203375000001 + - 0.0038715966050000008 + - 0.004999579490000001 + - 0.009608536200000002 + - 0.0100338295 + - 0.014310590900000003 + - 0.014469133300000003 + - -1.6175736900000002e-18 - legendgroup: Sensor(id=ID) line: color: @@ -1160,8 +5246,78 @@ data: - '#440154' - '#440154' size: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 mode: markers+lines name: Sensor (arrow) opacity: 1 @@ -1169,14 +5325,224 @@ data: showlegend: false type: scatter3d x: - bdata: 1bj7b6Jw8r9Vjgggux7rv/TRuS1+WvS/VY4IILse678YXIykA0vnv1WOCCC7Huu/VY4IILse678AAAAAAAD4fwAAAAAAAPi/AAAAAAAA4L8AAAAAAADwvwAAAAAAAOC/////////778AAAAAAADgvwAAAAAAAOC/AAAAAAAA+H/VuPtvonDyv1WOCCC7Huu/9NG5LX5a9L9Vjgggux7rvxhcjKQDS+e/VY4IILse679Vjgggux7rvwAAAAAAAPh/AAAAAAAA4D8AAAAAAADgvzMzMzMzM5O8AAAAAAAA4L8zMzMzMzOTPAAAAAAAAOC/AAAAAAAA4L8AAAAAAAD4fwAAAAAAAOC/AAAAAAAA4D8zMzMzMzOTvAAAAAAAAOA/MzMzMzMzkzwAAAAAAADgPwAAAAAAAOA/AAAAAAAA+H8AAAAAAADgPwAAAAAAAOC/MzMzMzMzk7wAAAAAAADgvzMzMzMzM5M8AAAAAAAA4L8AAAAAAADgvwAAAAAAAPh/VY4IILse6z/VuPtvonDyPxhcjKQDS+c/1bj7b6Jw8j/00bktflr0P9W4+2+icPI/1bj7b6Jw8j8AAAAAAAD4fwAAAAAAAOA/AAAAAAAA+D/////////vPwAAAAAAAPg/AAAAAAAA8D8AAAAAAAD4PwAAAAAAAPg/AAAAAAAA+H9Vjgggux7rP9W4+2+icPI/GFyMpANL5z/VuPtvonDyP/TRuS1+WvQ/1bj7b6Jw8j/VuPtvonDyPwAAAAAAAPh/ - dtype: f8 + - -1.1524986624095181 + - -0.8475013375904817 + - -1.2720929895559694 + - -0.8475013375904817 + - -0.7279070104440306 + - -0.8475013375904817 + - -0.8475013375904817 + - .nan + - -1.5 + - -0.5 + - -1.0 + - -0.5 + - -0.9999999999999999 + - -0.5 + - -0.5 + - .nan + - -1.1524986624095181 + - -0.8475013375904817 + - -1.2720929895559694 + - -0.8475013375904817 + - -0.7279070104440306 + - -0.8475013375904817 + - -0.8475013375904817 + - .nan + - 0.5 + - -0.5 + - -6.661338147750939e-17 + - -0.5 + - 6.661338147750939e-17 + - -0.5 + - -0.5 + - .nan + - -0.5 + - 0.5 + - -6.661338147750939e-17 + - 0.5 + - 6.661338147750939e-17 + - 0.5 + - 0.5 + - .nan + - 0.5 + - -0.5 + - -6.661338147750939e-17 + - -0.5 + - 6.661338147750939e-17 + - -0.5 + - -0.5 + - .nan + - 0.8475013375904817 + - 1.1524986624095181 + - 0.7279070104440306 + - 1.1524986624095181 + - 1.2720929895559694 + - 1.1524986624095181 + - 1.1524986624095181 + - .nan + - 0.5 + - 1.5 + - 0.9999999999999999 + - 1.5 + - 1.0 + - 1.5 + - 1.5 + - .nan + - 0.8475013375904817 + - 1.1524986624095181 + - 0.7279070104440306 + - 1.1524986624095181 + - 1.2720929895559694 + - 1.1524986624095181 + - 1.1524986624095181 + - .nan y: - bdata: 3vHDW2ue979EHHhIKcPgvzuXFBwnNu2/RBx4SCnD4L9jtPVx7GTxv0QceEgpw+C/RBx4SCnD4L8AAAAAAAD4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+H/e8cNba573P0QceEgpw+A/O5cUHCc27T9EHHhIKcPgP2O09XHsZPE/RBx4SCnD4D9EHHhIKcPgPwAAAAAAAPh/AAAAAAAA8L8AAAAAAADwvwAAAAAAAPC/AAAAAAAA8L8AAAAAAADwvwAAAAAAAPC/AAAAAAAA8L8AAAAAAAD4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+H8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPh/RBx4SCnD4L/e8cNba573v2O09XHsZPG/3vHDW2ue9787lxQcJzbtv97xw1trnve/3vHDW2ue978AAAAAAAD4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+H9EHHhIKcPgP97xw1trnvc/Y7T1cexk8T/e8cNba573PzuXFBwnNu0/3vHDW2ue9z/e8cNba573PwAAAAAAAPh/ - dtype: f8 + - -1.4761766037546447 + - -0.5238233962453553 + - -0.9128604458280515 + - -0.5238233962453553 + - -1.0871395541719486 + - -0.5238233962453553 + - -0.5238233962453553 + - .nan + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - .nan + - 1.4761766037546447 + - 0.5238233962453553 + - 0.9128604458280515 + - 0.5238233962453553 + - 1.0871395541719486 + - 0.5238233962453553 + - 0.5238233962453553 + - .nan + - -1.0 + - -1.0 + - -1.0 + - -1.0 + - -1.0 + - -1.0 + - -1.0 + - .nan + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - .nan + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - .nan + - -0.5238233962453553 + - -1.4761766037546447 + - -1.0871395541719486 + - -1.4761766037546447 + - -0.9128604458280515 + - -1.4761766037546447 + - -1.4761766037546447 + - .nan + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - .nan + - 0.5238233962453553 + - 1.4761766037546447 + - 1.0871395541719486 + - 1.4761766037546447 + - 0.9128604458280515 + - 1.4761766037546447 + - 1.4761766037546447 + - .nan z: - bdata: AAAAAAAAmLwAAAAAAACYPDO7o8x9bLc/AAAAAAAAmDwzu6PMfWy3vwAAAAAAAJg8AAAAAAAAmDwAAAAAAAD4fwAAAAAAAKC8AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8MzMzMzMz078AAAAAAACgPAAAAAAAAKA8AAAAAAAA+H8AAAAAAACYvAAAAAAAAJg8M7ujzH1stz8AAAAAAACYPDO7o8x9bLe/AAAAAAAAmDwAAAAAAACYPAAAAAAAAPh/AAAAAAAAoLwAAAAAAACgPDMzMzMzM9O/AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8AAAAAAAAoDwAAAAAAAD4fwAAAAAAAKC8AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8MzMzMzMz078AAAAAAACgPAAAAAAAAKA8AAAAAAAA+H8AAAAAAACgvAAAAAAAAKA8MzMzMzMz078AAAAAAACgPDMzMzMzM9M/AAAAAAAAoDwAAAAAAACgPAAAAAAAAPh/AAAAAAAAmLwAAAAAAACYPDO7o8x9bLc/AAAAAAAAmDwzu6PMfWy3vwAAAAAAAJg8AAAAAAAAmDwAAAAAAAD4fwAAAAAAAKC8AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8MzMzMzMz078AAAAAAACgPAAAAAAAAKA8AAAAAAAA+H8AAAAAAACYvAAAAAAAAJg8M7ujzH1stz8AAAAAAACYPDO7o8x9bLe/AAAAAAAAmDwAAAAAAACYPAAAAAAAAPh/ - dtype: f8 + - -8.326672684688674e-17 + - 8.326672684688674e-17 + - 0.09149919744571093 + - 8.326672684688674e-17 + - -0.09149919744571093 + - 8.326672684688674e-17 + - 8.326672684688674e-17 + - .nan + - -1.1102230246251565e-16 + - 1.1102230246251565e-16 + - 0.3 + - 1.1102230246251565e-16 + - -0.3 + - 1.1102230246251565e-16 + - 1.1102230246251565e-16 + - .nan + - -8.326672684688674e-17 + - 8.326672684688674e-17 + - 0.09149919744571093 + - 8.326672684688674e-17 + - -0.09149919744571093 + - 8.326672684688674e-17 + - 8.326672684688674e-17 + - .nan + - -1.1102230246251565e-16 + - 1.1102230246251565e-16 + - -0.3 + - 1.1102230246251565e-16 + - 0.3 + - 1.1102230246251565e-16 + - 1.1102230246251565e-16 + - .nan + - -1.1102230246251565e-16 + - 1.1102230246251565e-16 + - 0.3 + - 1.1102230246251565e-16 + - -0.3 + - 1.1102230246251565e-16 + - 1.1102230246251565e-16 + - .nan + - -1.1102230246251565e-16 + - 1.1102230246251565e-16 + - -0.3 + - 1.1102230246251565e-16 + - 0.3 + - 1.1102230246251565e-16 + - 1.1102230246251565e-16 + - .nan + - -8.326672684688674e-17 + - 8.326672684688674e-17 + - 0.09149919744571093 + - 8.326672684688674e-17 + - -0.09149919744571093 + - 8.326672684688674e-17 + - 8.326672684688674e-17 + - .nan + - -1.1102230246251565e-16 + - 1.1102230246251565e-16 + - 0.3 + - 1.1102230246251565e-16 + - -0.3 + - 1.1102230246251565e-16 + - 1.1102230246251565e-16 + - .nan + - -8.326672684688674e-17 + - 8.326672684688674e-17 + - 0.09149919744571093 + - 8.326672684688674e-17 + - -0.09149919744571093 + - 8.326672684688674e-17 + - 8.326672684688674e-17 + - .nan layout: legend: itemsizing: constant diff --git a/tests/test_display_plotly/test_pixel_field_null_values.yml b/tests/test_display_plotly/test_pixel_field_null_values.yml index 9dfad2981..cd196b36c 100644 --- a/tests/test_display_plotly/test_pixel_field_null_values.yml +++ b/tests/test_display_plotly/test_pixel_field_null_values.yml @@ -14,17 +14,53 @@ data: - - 1.0 - '#e71111' i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 + - 7 + - 0 + - 0 + - 0 + - 4 + - 4 + - 2 + - 6 + - 4 + - 0 + - 3 + - 7 intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 + - 0.0 + - 0.0 + - 1.0 + - 1.0 + - 0.0 + - 0.0 + - 1.0 + - 1.0 j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 + - 0 + - 7 + - 1 + - 2 + - 6 + - 7 + - 1 + - 2 + - 5 + - 5 + - 2 + - 2 k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 + - 3 + - 4 + - 2 + - 3 + - 5 + - 6 + - 5 + - 5 + - 0 + - 1 + - 7 + - 6 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -33,14 +69,32 @@ data: showscale: false type: mesh3d x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 - facecolor: - '#e15f99' - '#e15f99' @@ -376,14 +430,1007 @@ data: - '#461567' - '#461567' i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAjQCGAIYAhgCKAIoAiACMAIoAhgCJAI0AjgCPAJAAkQCSAJsAlACUAJQAmACYAJYAmgCYAJQAlwCbAJwAnQCeAJ8AoACiAKMApAClAKYAqACpAKoAqwCsAK4ArwCwALEAsgC0ALUAtgC3ALgAugC7ALwAvQC+AMAAwQDCAMMAxADNAMYAxgDGAMoAygDIAMwAygDGAMkAzQDOAM8A0ADRANIA2wDUANQA1ADYANgA1gDaANgA1ADXANsA3ADdAN4A3wDgAOIA4wDkAOUA5gDoAOkA6gDrAOwA7gDvAPAA8QDyAPQA9QD2APcA+AD6APsA/AD9AP4A - dtype: i2 + - 75 + - 64 + - 2 + - 75 + - 76 + - 65 + - 65 + - 64 + - 2 + - 0 + - 1 + - 0 + - 84 + - 86 + - 86 + - 90 + - 90 + - 92 + - 92 + - 91 + - 91 + - 87 + - 87 + - 85 + - 85 + - 83 + - 83 + - 82 + - 82 + - 84 + - 94 + - 86 + - 86 + - 84 + - 84 + - 82 + - 82 + - 83 + - 83 + - 85 + - 85 + - 87 + - 87 + - 87 + - 91 + - 91 + - 92 + - 92 + - 90 + - 90 + - 94 + - 95 + - 88 + - 78 + - 79 + - 81 + - 80 + - 93 + - 96 + - 89 + - 77 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 50 + - 52 + - 52 + - 44 + - 44 + - 32 + - 32 + - 22 + - 22 + - 14 + - 14 + - 20 + - 20 + - 30 + - 30 + - 41 + - 41 + - 50 + - 57 + - 52 + - 52 + - 50 + - 50 + - 41 + - 41 + - 30 + - 30 + - 20 + - 20 + - 14 + - 14 + - 14 + - 22 + - 22 + - 32 + - 32 + - 44 + - 44 + - 57 + - 11 + - 4 + - 12 + - 58 + - 62 + - 8 + - 7 + - 39 + - 61 + - 42 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 48 + - 54 + - 54 + - 47 + - 47 + - 37 + - 37 + - 25 + - 25 + - 17 + - 17 + - 18 + - 18 + - 26 + - 26 + - 38 + - 38 + - 48 + - 59 + - 54 + - 54 + - 48 + - 48 + - 38 + - 38 + - 26 + - 26 + - 18 + - 18 + - 17 + - 17 + - 17 + - 25 + - 25 + - 37 + - 37 + - 47 + - 47 + - 59 + - 27 + - 5 + - 10 + - 56 + - 60 + - 6 + - 9 + - 55 + - 63 + - 28 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 98 + - 99 + - 100 + - 101 + - 102 + - 104 + - 105 + - 106 + - 107 + - 108 + - 110 + - 111 + - 112 + - 113 + - 114 + - 116 + - 117 + - 118 + - 119 + - 120 + - 122 + - 123 + - 124 + - 125 + - 126 + - 128 + - 129 + - 130 + - 131 + - 132 + - 141 + - 134 + - 134 + - 134 + - 138 + - 138 + - 136 + - 140 + - 138 + - 134 + - 137 + - 141 + - 142 + - 143 + - 144 + - 145 + - 146 + - 155 + - 148 + - 148 + - 148 + - 152 + - 152 + - 150 + - 154 + - 152 + - 148 + - 151 + - 155 + - 156 + - 157 + - 158 + - 159 + - 160 + - 162 + - 163 + - 164 + - 165 + - 166 + - 168 + - 169 + - 170 + - 171 + - 172 + - 174 + - 175 + - 176 + - 177 + - 178 + - 180 + - 181 + - 182 + - 183 + - 184 + - 186 + - 187 + - 188 + - 189 + - 190 + - 192 + - 193 + - 194 + - 195 + - 196 + - 205 + - 198 + - 198 + - 198 + - 202 + - 202 + - 200 + - 204 + - 202 + - 198 + - 201 + - 205 + - 206 + - 207 + - 208 + - 209 + - 210 + - 219 + - 212 + - 212 + - 212 + - 216 + - 216 + - 214 + - 218 + - 216 + - 212 + - 215 + - 219 + - 220 + - 221 + - 222 + - 223 + - 224 + - 226 + - 227 + - 228 + - 229 + - 230 + - 232 + - 233 + - 234 + - 235 + - 236 + - 238 + - 239 + - 240 + - 241 + - 242 + - 244 + - 245 + - 246 + - 247 + - 248 + - 250 + - 251 + - 252 + - 253 + - 254 j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhgCNAIcAiACMAI0AhwCIAIsAiwCIAIgAjwCQAJEAkgCOAJQAmwCVAJYAmgCbAJUAlgCZAJkAlgCWAJ0AngCfAKAAnACjAKQApQCmAKIAqQCqAKsArACoAK8AsACxALIArgC1ALYAtwC4ALQAuwC8AL0AvgC6AMEAwgDDAMQAwADGAM0AxwDIAMwAzQDHAMgAywDLAMgAyADPANAA0QDSAM4A1ADbANUA1gDaANsA1QDWANkA2QDWANYA3QDeAN8A4ADcAOMA5ADlAOYA4gDpAOoA6wDsAOgA7wDwAPEA8gDuAPUA9gD3APgA9AD7APwA/QD+APoA - dtype: i2 + - 76 + - 76 + - 3 + - 3 + - 3 + - 3 + - 1 + - 1 + - 75 + - 75 + - 3 + - 3 + - 70 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 71 + - 71 + - 69 + - 69 + - 67 + - 67 + - 66 + - 66 + - 68 + - 68 + - 89 + - 89 + - 81 + - 81 + - 79 + - 79 + - 77 + - 77 + - 78 + - 78 + - 80 + - 80 + - 88 + - 93 + - 93 + - 95 + - 95 + - 96 + - 96 + - 94 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 68 + - 68 + - 66 + - 66 + - 67 + - 67 + - 69 + - 51 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 13 + - 13 + - 19 + - 19 + - 29 + - 29 + - 40 + - 40 + - 49 + - 49 + - 61 + - 61 + - 62 + - 62 + - 58 + - 58 + - 42 + - 42 + - 12 + - 12 + - 8 + - 8 + - 4 + - 7 + - 7 + - 11 + - 11 + - 39 + - 39 + - 57 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 49 + - 49 + - 40 + - 40 + - 29 + - 29 + - 19 + - 53 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 15 + - 15 + - 16 + - 16 + - 24 + - 24 + - 36 + - 36 + - 46 + - 46 + - 63 + - 63 + - 60 + - 60 + - 56 + - 56 + - 28 + - 28 + - 10 + - 10 + - 6 + - 6 + - 5 + - 9 + - 9 + - 27 + - 27 + - 55 + - 55 + - 59 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 46 + - 46 + - 36 + - 36 + - 24 + - 24 + - 16 + - 99 + - 100 + - 101 + - 102 + - 98 + - 105 + - 106 + - 107 + - 108 + - 104 + - 111 + - 112 + - 113 + - 114 + - 110 + - 117 + - 118 + - 119 + - 120 + - 116 + - 123 + - 124 + - 125 + - 126 + - 122 + - 129 + - 130 + - 131 + - 132 + - 128 + - 134 + - 141 + - 135 + - 136 + - 140 + - 141 + - 135 + - 136 + - 139 + - 139 + - 136 + - 136 + - 143 + - 144 + - 145 + - 146 + - 142 + - 148 + - 155 + - 149 + - 150 + - 154 + - 155 + - 149 + - 150 + - 153 + - 153 + - 150 + - 150 + - 157 + - 158 + - 159 + - 160 + - 156 + - 163 + - 164 + - 165 + - 166 + - 162 + - 169 + - 170 + - 171 + - 172 + - 168 + - 175 + - 176 + - 177 + - 178 + - 174 + - 181 + - 182 + - 183 + - 184 + - 180 + - 187 + - 188 + - 189 + - 190 + - 186 + - 193 + - 194 + - 195 + - 196 + - 192 + - 198 + - 205 + - 199 + - 200 + - 204 + - 205 + - 199 + - 200 + - 203 + - 203 + - 200 + - 200 + - 207 + - 208 + - 209 + - 210 + - 206 + - 212 + - 219 + - 213 + - 214 + - 218 + - 219 + - 213 + - 214 + - 217 + - 217 + - 214 + - 214 + - 221 + - 222 + - 223 + - 224 + - 220 + - 227 + - 228 + - 229 + - 230 + - 226 + - 233 + - 234 + - 235 + - 236 + - 232 + - 239 + - 240 + - 241 + - 242 + - 238 + - 245 + - 246 + - 247 + - 248 + - 244 + - 251 + - 252 + - 253 + - 254 + - 250 k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiQCKAIgAiQCLAIwAiwCLAIYAhwCNAIwAkwCTAJMAkwCTAJcAmACWAJcAmQCaAJkAmQCUAJUAmwCaAKEAoQChAKEAoQCnAKcApwCnAKcArQCtAK0ArQCtALMAswCzALMAswC5ALkAuQC5ALkAvwC/AL8AvwC/AMUAxQDFAMUAxQDJAMoAyADJAMsAzADLAMsAxgDHAM0AzADTANMA0wDTANMA1wDYANYA1wDZANoA2QDZANQA1QDbANoA4QDhAOEA4QDhAOcA5wDnAOcA5wDtAO0A7QDtAO0A8wDzAPMA8wDzAPkA+QD5APkA+QD/AP8A/wD/AP8A - dtype: i2 + - 64 + - 65 + - 75 + - 76 + - 65 + - 1 + - 64 + - 0 + - 0 + - 64 + - 0 + - 2 + - 86 + - 72 + - 90 + - 74 + - 92 + - 73 + - 91 + - 71 + - 87 + - 69 + - 85 + - 67 + - 83 + - 66 + - 82 + - 68 + - 84 + - 70 + - 86 + - 81 + - 84 + - 79 + - 82 + - 77 + - 83 + - 78 + - 85 + - 80 + - 87 + - 88 + - 93 + - 91 + - 95 + - 92 + - 96 + - 90 + - 94 + - 86 + - 89 + - 96 + - 93 + - 80 + - 77 + - 79 + - 88 + - 95 + - 94 + - 81 + - 78 + - 72 + - 66 + - 74 + - 67 + - 73 + - 69 + - 71 + - 52 + - 43 + - 44 + - 31 + - 32 + - 21 + - 22 + - 13 + - 14 + - 19 + - 20 + - 29 + - 30 + - 40 + - 41 + - 49 + - 50 + - 51 + - 52 + - 62 + - 50 + - 58 + - 41 + - 42 + - 30 + - 12 + - 20 + - 8 + - 14 + - 4 + - 7 + - 22 + - 11 + - 32 + - 39 + - 44 + - 57 + - 52 + - 61 + - 39 + - 7 + - 8 + - 42 + - 58 + - 4 + - 11 + - 57 + - 62 + - 12 + - 43 + - 40 + - 31 + - 29 + - 21 + - 19 + - 13 + - 54 + - 45 + - 47 + - 35 + - 37 + - 23 + - 25 + - 15 + - 17 + - 16 + - 18 + - 24 + - 26 + - 36 + - 38 + - 46 + - 48 + - 53 + - 54 + - 60 + - 48 + - 56 + - 38 + - 28 + - 26 + - 10 + - 18 + - 6 + - 17 + - 5 + - 9 + - 25 + - 27 + - 37 + - 55 + - 47 + - 59 + - 54 + - 63 + - 55 + - 9 + - 6 + - 28 + - 56 + - 5 + - 27 + - 59 + - 60 + - 10 + - 45 + - 36 + - 35 + - 24 + - 23 + - 16 + - 15 + - 103 + - 103 + - 103 + - 103 + - 103 + - 109 + - 109 + - 109 + - 109 + - 109 + - 115 + - 115 + - 115 + - 115 + - 115 + - 121 + - 121 + - 121 + - 121 + - 121 + - 127 + - 127 + - 127 + - 127 + - 127 + - 133 + - 133 + - 133 + - 133 + - 133 + - 137 + - 138 + - 136 + - 137 + - 139 + - 140 + - 139 + - 139 + - 134 + - 135 + - 141 + - 140 + - 147 + - 147 + - 147 + - 147 + - 147 + - 151 + - 152 + - 150 + - 151 + - 153 + - 154 + - 153 + - 153 + - 148 + - 149 + - 155 + - 154 + - 161 + - 161 + - 161 + - 161 + - 161 + - 167 + - 167 + - 167 + - 167 + - 167 + - 173 + - 173 + - 173 + - 173 + - 173 + - 179 + - 179 + - 179 + - 179 + - 179 + - 185 + - 185 + - 185 + - 185 + - 185 + - 191 + - 191 + - 191 + - 191 + - 191 + - 197 + - 197 + - 197 + - 197 + - 197 + - 201 + - 202 + - 200 + - 201 + - 203 + - 204 + - 203 + - 203 + - 198 + - 199 + - 205 + - 204 + - 211 + - 211 + - 211 + - 211 + - 211 + - 215 + - 216 + - 214 + - 215 + - 217 + - 218 + - 217 + - 217 + - 212 + - 213 + - 219 + - 218 + - 225 + - 225 + - 225 + - 225 + - 225 + - 231 + - 231 + - 231 + - 231 + - 231 + - 237 + - 237 + - 237 + - 237 + - 237 + - 243 + - 243 + - 243 + - 243 + - 243 + - 249 + - 249 + - 249 + - 249 + - 249 + - 255 + - 255 + - 255 + - 255 + - 255 legendgroup: Sensor(id=ID) name: Sensor (True) opacity: 1 @@ -391,14 +1438,776 @@ data: showlegend: true type: mesh3d x: - bdata: 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 - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014992463600000002 + - -0.014392395300000003 + - -0.014392395300000003 + - -0.012869499600000002 + - -0.012355425950000002 + - -0.009822911000000002 + - -0.009822911000000002 + - -0.0066605612500000005 + - -0.005795627850000001 + - 0.0 + - -0.004997477680000001 + - 0.0 + - 0.0 + - -0.0046984631550000015 + - -0.0046984631550000015 + - 0.0 + - -0.003930366410000001 + - 0.0 + - -0.003726213425000001 + - 0.0 + - 0.0 + - -0.0025000000350000003 + - -0.0025000000350000003 + - -0.0021347226600000008 + - -0.0021347226600000008 + - 0.0 + - -0.0010241928500000002 + - 0.0 + - -0.0007114128200000001 + - -1.0408340850000002e-17 + - -9.553993650000002e-18 + - 0.0 + - 0.0 + - 0.0008682409300000002 + - 0.0008682409300000002 + - 0.0016630589950000004 + - 0.0 + - 0.0023612117400000003 + - 0.0026042407400000004 + - 0.0 + - 0.0026362657550000005 + - 0.0 + - 0.0 + - 0.003830222040000001 + - 0.003830222040000001 + - 0.0 + - 0.004641779140000001 + - 0.0 + - 0.004750406370000001 + - 0.0 + - 0.0049999997000000004 + - 0.006231224900000001 + - 0.006231224900000001 + - 0.00945867 + - 0.010177281500000003 + - 0.012618804000000003 + - 0.012618804000000003 + - 0.014251218750000003 + - 0.014519108850000004 + - 0.014999999100000003 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.10000000000000002 + - -0.9628772522231052 + - -1.0757465324544286 + - -1.1893106634692079 + - -1.146627876107864 + - -1.00668433176919 + - -0.9237506687952409 + - -1.1505898676279929 + - -1.240606557141336 + - -1.2711111784654134 + - -1.199947381744295 + - -1.125461115278078 + - -0.8024567799485769 + - -1.25 + - -1.25 + - -1.25 + - -1.25 + - -1.25 + - -0.75 + - -1.1505898676279929 + - -1.1254611152780778 + - -1.199947381744295 + - -1.2711111784654134 + - -1.240606557141336 + - -0.8024567799485769 + - -0.9628772522231052 + - -1.00668433176919 + - -1.146627876107864 + - -1.1893106634692079 + - -1.0757465324544286 + - -0.9237506687952409 + - -0.29276393534561734 + - -0.3193589741406161 + - -0.45218127374517486 + - -0.5076749305697151 + - -0.40914959704274484 + - -0.6037742578312263 + - -0.625 + - -0.625 + - -0.375 + - -0.375 + - -0.625 + - -0.625 + - -0.375 + - -0.375 + - -0.75 + - -0.75 + - -0.75 + - -0.75 + - -0.75 + - -0.25 + - -0.625 + - -0.625 + - -0.375 + - -0.375 + - -0.625 + - -0.625 + - -0.375 + - -0.375 + - -0.29276393534561734 + - -0.40914959704274484 + - -0.5076749305697151 + - -0.4521812737451749 + - -0.31935897414061615 + - -0.6037742578312263 + - 0.25 + - 0.25 + - 0.24999999999999997 + - 0.24999999999999997 + - 0.25 + - -0.25 + - -0.24999999999999997 + - -0.25 + - -0.25 + - -0.25 + - -0.25 + - 0.25 + - -0.24999999999999997 + - -0.25 + - -0.25 + - -0.25 + - -0.25 + - 0.25 + - -0.24999999999999997 + - -0.25 + - -0.25 + - -0.25 + - -0.25 + - 0.25 + - 0.25 + - 0.25 + - 0.24999999999999997 + - 0.24999999999999997 + - 0.25 + - -0.25 + - 0.7072360646543827 + - 0.5908504029572552 + - 0.49232506943028487 + - 0.5478187262548251 + - 0.6806410258593838 + - 0.39622574216877365 + - 0.375 + - 0.375 + - 0.625 + - 0.625 + - 0.375 + - 0.375 + - 0.625 + - 0.625 + - 0.25 + - 0.25 + - 0.25 + - 0.25 + - 0.25 + - 0.75 + - 0.375 + - 0.375 + - 0.625 + - 0.625 + - 0.375 + - 0.375 + - 0.625 + - 0.625 + - 0.7072360646543827 + - 0.6806410258593839 + - 0.5478187262548251 + - 0.49232506943028487 + - 0.5908504029572551 + - 0.39622574216877365 + - 1.0371227477768947 + - 0.99331566823081 + - 0.8533721238921359 + - 0.8106893365307922 + - 0.9242534675455715 + - 1.0762493312047592 + - 0.849410132372007 + - 0.874538884721922 + - 0.8000526182557052 + - 0.7288888215345866 + - 0.7593934428586637 + - 1.197543220051423 + - 0.75 + - 0.75 + - 0.75 + - 0.75 + - 0.75 + - 1.25 + - 0.849410132372007 + - 0.7593934428586638 + - 0.7288888215345866 + - 0.8000526182557052 + - 0.874538884721922 + - 1.197543220051423 + - 1.0371227477768947 + - 0.9242534675455715 + - 0.8106893365307922 + - 0.8533721238921359 + - 0.99331566823081 + - 1.0762493312047592 y: - bdata: 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 - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - -0.004225988315000001 + - 0.004225988315000001 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.011336243900000001 + - 0.011336243900000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0017101006600000004 + - 0.0017101006600000004 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.004330126940000001 + - 0.004330126940000001 + - -0.014847321800000002 + - 0.014847321800000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.10000000000000002 + - 0.0 + - 0.0 + - -0.0049240388000000015 + - 0.0049240388000000015 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0032139379550000006 + - 0.0032139379550000006 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.013644480700000003 + - 0.013644480700000003 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.008109612750000002 + - 0.008109612750000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.00028137136250000006 + - 0.0078714803 + - -0.008344890200000002 + - 0.013525193950000004 + - -0.013758964850000003 + - -0.0016490003100000004 + - 0.0017709132300000002 + - -0.0042973283700000016 + - 0.0043621968500000005 + - -0.004934888705000001 + - 0.004912360015000001 + - 0.014884752050000002 + - -0.014804665750000005 + - -0.0032633595150000005 + - 0.0031639754750000006 + - -6.486846850000001e-05 + - 0.011518507450000002 + - -0.011149990550000002 + - 0.004495218770000001 + - -0.0039552707250000005 + - 9.925023200000001e-18 + - -1.2743964494489675 + - -1.2382493264557708 + - -1.2018796729681822 + - -1.2155491139469934 + - -1.2603669465666976 + - -0.7619116981226777 + - -0.7137565456792196 + - -0.5977007427167186 + - -0.5583720544371074 + - -0.6501213913098591 + - -0.7461542882220948 + - -0.3467789955270001 + - 0.0 + - 0.11888206453689419 + - 0.07347315653655916 + - -0.07347315653655913 + - -0.1188820645368942 + - 0.0 + - 0.7137565456792196 + - 0.7461542882220948 + - 0.6501213913098591 + - 0.5583720544371074 + - 0.5977007427167185 + - 0.3467789955270001 + - 1.2743964494489675 + - 1.2603669465666976 + - 1.2155491139469934 + - 1.2018796729681822 + - 1.2382493264557706 + - 0.7619116981226777 + - -1.1802385623540619 + - -1.1923728764612453 + - -1.2529746870569571 + - -1.2782943516777072 + - -1.2333409544013672 + - -0.7725557136097322 + - -0.625 + - -0.375 + - -0.375 + - -0.625 + - -0.625 + - -0.375 + - -0.375 + - -0.625 + - 0.0 + - 0.11888206453689419 + - 0.07347315653655916 + - -0.07347315653655913 + - -0.1188820645368942 + - 0.0 + - 0.375 + - 0.625 + - 0.625 + - 0.375 + - 0.375 + - 0.625 + - 0.625 + - 0.375 + - 1.1802385623540619 + - 1.2333409544013672 + - 1.2782943516777072 + - 1.2529746870569571 + - 1.1923728764612453 + - 0.7725557136097322 + - -1.0 + - -0.8811179354631058 + - -0.9265268434634408 + - -1.0734731565365592 + - -1.1188820645368942 + - -1.0 + - -0.5 + - -0.3811179354631058 + - -0.42652684346344083 + - -0.5734731565365592 + - -0.6188820645368942 + - -0.5 + - 0.0 + - 0.11888206453689419 + - 0.07347315653655916 + - -0.07347315653655913 + - -0.1188820645368942 + - 0.0 + - 0.5 + - 0.6188820645368942 + - 0.5734731565365592 + - 0.4265268434634409 + - 0.3811179354631058 + - 0.5 + - 1.0 + - 1.1188820645368942 + - 1.0734731565365592 + - 0.9265268434634408 + - 0.8811179354631058 + - 1.0 + - -0.8197614376459381 + - -0.7666590455986328 + - -0.7217056483222927 + - -0.7470253129430429 + - -0.8076271235387548 + - -1.2274442863902677 + - -0.625 + - -0.375 + - -0.375 + - -0.625 + - -0.625 + - -0.375 + - -0.375 + - -0.625 + - 0.0 + - 0.11888206453689419 + - 0.07347315653655916 + - -0.07347315653655913 + - -0.1188820645368942 + - 0.0 + - 0.375 + - 0.625 + - 0.625 + - 0.375 + - 0.375 + - 0.625 + - 0.625 + - 0.375 + - 0.8197614376459381 + - 0.8076271235387548 + - 0.7470253129430429 + - 0.7217056483222927 + - 0.7666590455986327 + - 1.2274442863902677 + - -0.7256035505510325 + - -0.7396330534333024 + - -0.7844508860530066 + - -0.7981203270318177 + - -0.7617506735442293 + - -1.2380883018773223 + - -0.2862434543207803 + - -0.25384571177790516 + - -0.349878608690141 + - -0.4416279455628927 + - -0.4022992572832815 + - -0.6532210044729999 + - 0.0 + - 0.11888206453689419 + - 0.07347315653655916 + - -0.07347315653655913 + - -0.1188820645368942 + - 0.0 + - 0.2862434543207803 + - 0.4022992572832814 + - 0.44162794556289275 + - 0.349878608690141 + - 0.25384571177790516 + - 0.6532210044729999 + - 0.7256035505510325 + - 0.7617506735442293 + - 0.7981203270318177 + - 0.7844508860530066 + - 0.7396330534333024 + - 1.2380883018773223 z: - bdata: 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 - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.0004754300695000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.007705580450000002 + - -0.008505494900000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.013440123200000004 + - -0.013835124650000002 + - 0.0 + - 0.00015880254800000005 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.003090666795000001 + - 0.0 + - 0.0033339664350000007 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0048939786850000005 + - 0.0 + - 0.004949130490000001 + - 0.10000000000000002 + - -3.1374891150000003e-18 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.014907522500000003 + - 0.0 + - -0.004407344015000001 + - -0.014772200600000002 + - 0.0 + - 0.0042485412200000015 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0018584636950000003 + - 0.0 + - 0.0015600122500000005 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.011641889050000001 + - -0.011019207550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.004680036755000001 + - -0.003767693415000001 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014997360100000004 + - -0.012768703700000003 + - -0.012464462200000002 + - -0.006486073150000001 + - -0.005974184350000002 + - -0.004720254240000001 + - -0.004675881190000001 + - -0.0025559673100000006 + - -0.0024436118100000007 + - 0.0008042847750000002 + - 0.0009320507750000002 + - 0.0018558396050000002 + - 0.0024128545100000004 + - 0.003788203375000001 + - 0.0038715966050000008 + - 0.004999579490000001 + - 0.009608536200000002 + - 0.0100338295 + - 0.014310590900000003 + - 0.014469133300000003 + - -1.6175736900000002e-18 + - -0.0381246656023796 + - -0.12499888505303482 + - -0.0391288939162372 + - 0.10081589867061119 + - 0.1014365459010402 + - 4.163336342344337e-17 + - -0.09877161002571161 + - -0.10338302342838761 + - 0.03487738768724126 + - 0.12493843445790968 + - 0.04233881130894786 + - 8.326672684688674e-17 + - -0.12500000000000006 + - -0.03862712429686849 + - 0.10112712429686836 + - 0.10112712429686838 + - -0.03862712429686846 + - 5.551115123125783e-17 + - -0.09877161002571161 + - 0.04233881130894783 + - 0.12493843445790968 + - 0.03487738768724129 + - -0.1033830234283876 + - 8.326672684688674e-17 + - -0.0381246656023796 + - 0.10143654590104019 + - 0.10081589867061122 + - -0.039128893916237174 + - -0.12499888505303483 + - 4.163336342344337e-17 + - 0.051887128915613194 + - -0.09212218070853441 + - -0.1088217677112473 + - 0.024866629547137756 + - 0.12419018995703088 + - -2.7755575615628914e-17 + - -0.125 + - -0.125 + - -0.125 + - -0.125 + - 0.125 + - 0.125 + - 0.125 + - 0.125 + - -0.12500000000000006 + - -0.03862712429686849 + - 0.10112712429686836 + - 0.10112712429686838 + - -0.03862712429686846 + - 5.551115123125783e-17 + - -0.125 + - -0.125 + - -0.125 + - -0.125 + - 0.125 + - 0.125 + - 0.125 + - 0.125 + - 0.051887128915613194 + - 0.12419018995703088 + - 0.024866629547137788 + - -0.10882176771124728 + - -0.09212218070853442 + - -2.7755575615628914e-17 + - 0.12499999999999994 + - 0.038627124296868376 + - -0.10112712429686847 + - -0.10112712429686849 + - 0.03862712429686835 + - 5.551115123125783e-17 + - -0.12500000000000006 + - -0.03862712429686849 + - 0.10112712429686836 + - 0.10112712429686838 + - -0.03862712429686846 + - 5.551115123125783e-17 + - -0.12500000000000006 + - -0.03862712429686849 + - 0.10112712429686836 + - 0.10112712429686838 + - -0.03862712429686846 + - 5.551115123125783e-17 + - -0.12500000000000006 + - -0.03862712429686849 + - 0.10112712429686836 + - 0.10112712429686838 + - -0.03862712429686846 + - 5.551115123125783e-17 + - 0.12499999999999994 + - 0.038627124296868376 + - -0.10112712429686847 + - -0.10112712429686849 + - 0.03862712429686835 + - 5.551115123125783e-17 + - 0.051887128915613194 + - 0.12419018995703088 + - 0.024866629547137788 + - -0.10882176771124728 + - -0.09212218070853442 + - -2.7755575615628914e-17 + - -0.125 + - -0.125 + - -0.125 + - -0.125 + - 0.125 + - 0.125 + - 0.125 + - 0.125 + - -0.12500000000000006 + - -0.03862712429686849 + - 0.10112712429686836 + - 0.10112712429686838 + - -0.03862712429686846 + - 5.551115123125783e-17 + - -0.125 + - -0.125 + - -0.125 + - -0.125 + - 0.125 + - 0.125 + - 0.125 + - 0.125 + - 0.051887128915613194 + - -0.09212218070853441 + - -0.1088217677112473 + - 0.024866629547137756 + - 0.12419018995703088 + - -2.7755575615628914e-17 + - -0.0381246656023796 + - 0.10143654590104019 + - 0.10081589867061122 + - -0.039128893916237174 + - -0.12499888505303483 + - 4.163336342344337e-17 + - -0.09877161002571146 + - 0.04233881130894798 + - 0.12493843445790985 + - 0.03487738768724148 + - -0.10338302342838741 + - -8.326672684688674e-17 + - -0.12500000000000006 + - -0.03862712429686849 + - 0.10112712429686836 + - 0.10112712429686838 + - -0.03862712429686846 + - 5.551115123125783e-17 + - -0.09877161002571146 + - -0.10338302342838743 + - 0.03487738768724145 + - 0.12493843445790985 + - 0.04233881130894801 + - -8.326672684688674e-17 + - -0.0381246656023796 + - -0.12499888505303482 + - -0.0391288939162372 + - 0.10081589867061119 + - 0.1014365459010402 + - 4.163336342344337e-17 - color: '#2e91e5' colorscale: - - 0.0 @@ -414,17 +2223,53 @@ data: - - 1.0 - '#e71111' i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 + - 7 + - 0 + - 0 + - 0 + - 4 + - 4 + - 2 + - 6 + - 4 + - 0 + - 3 + - 7 intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 + - 0.0 + - 0.0 + - 1.0 + - 1.0 + - 0.0 + - 0.0 + - 1.0 + - 1.0 j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 + - 0 + - 7 + - 1 + - 2 + - 6 + - 7 + - 1 + - 2 + - 5 + - 5 + - 2 + - 2 k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 + - 3 + - 4 + - 2 + - 3 + - 5 + - 6 + - 5 + - 5 + - 0 + - 1 + - 7 + - 6 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -433,14 +2278,32 @@ data: showscale: false type: mesh3d x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 - facecolor: - '#1ca71c' - '#1ca71c' @@ -728,14 +2591,863 @@ data: - '#461567' - '#461567' i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYAmACZAJoAmwCcAJ4AnwCgAKEAogCkAKUApgCnAKgAqgCrAKwArQCuALAAsQCyALMAtAC2ALcAuAC5ALoAvAC9AL4AvwDAAMIAwwDEAMUAxgDIAMkAygDLAMwAzgDPANAA0QDSANQA1QDWANcA2ADaANsA3ADdAN4A - dtype: i2 + - 75 + - 64 + - 2 + - 75 + - 76 + - 65 + - 65 + - 64 + - 2 + - 0 + - 1 + - 0 + - 84 + - 86 + - 86 + - 90 + - 90 + - 92 + - 92 + - 91 + - 91 + - 87 + - 87 + - 85 + - 85 + - 83 + - 83 + - 82 + - 82 + - 84 + - 94 + - 86 + - 86 + - 84 + - 84 + - 82 + - 82 + - 83 + - 83 + - 85 + - 85 + - 87 + - 87 + - 87 + - 91 + - 91 + - 92 + - 92 + - 90 + - 90 + - 94 + - 95 + - 88 + - 78 + - 79 + - 81 + - 80 + - 93 + - 96 + - 89 + - 77 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 50 + - 52 + - 52 + - 44 + - 44 + - 32 + - 32 + - 22 + - 22 + - 14 + - 14 + - 20 + - 20 + - 30 + - 30 + - 41 + - 41 + - 50 + - 57 + - 52 + - 52 + - 50 + - 50 + - 41 + - 41 + - 30 + - 30 + - 20 + - 20 + - 14 + - 14 + - 14 + - 22 + - 22 + - 32 + - 32 + - 44 + - 44 + - 57 + - 11 + - 4 + - 12 + - 58 + - 62 + - 8 + - 7 + - 39 + - 61 + - 42 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 48 + - 54 + - 54 + - 47 + - 47 + - 37 + - 37 + - 25 + - 25 + - 17 + - 17 + - 18 + - 18 + - 26 + - 26 + - 38 + - 38 + - 48 + - 59 + - 54 + - 54 + - 48 + - 48 + - 38 + - 38 + - 26 + - 26 + - 18 + - 18 + - 17 + - 17 + - 17 + - 25 + - 25 + - 37 + - 37 + - 47 + - 47 + - 59 + - 27 + - 5 + - 10 + - 56 + - 60 + - 6 + - 9 + - 55 + - 63 + - 28 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 98 + - 99 + - 100 + - 101 + - 102 + - 104 + - 105 + - 106 + - 107 + - 108 + - 110 + - 111 + - 112 + - 113 + - 114 + - 116 + - 117 + - 118 + - 119 + - 120 + - 122 + - 123 + - 124 + - 125 + - 126 + - 128 + - 129 + - 130 + - 131 + - 132 + - 134 + - 135 + - 136 + - 137 + - 138 + - 140 + - 141 + - 142 + - 143 + - 144 + - 146 + - 147 + - 148 + - 149 + - 150 + - 152 + - 153 + - 154 + - 155 + - 156 + - 158 + - 159 + - 160 + - 161 + - 162 + - 164 + - 165 + - 166 + - 167 + - 168 + - 170 + - 171 + - 172 + - 173 + - 174 + - 176 + - 177 + - 178 + - 179 + - 180 + - 182 + - 183 + - 184 + - 185 + - 186 + - 188 + - 189 + - 190 + - 191 + - 192 + - 194 + - 195 + - 196 + - 197 + - 198 + - 200 + - 201 + - 202 + - 203 + - 204 + - 206 + - 207 + - 208 + - 209 + - 210 + - 212 + - 213 + - 214 + - 215 + - 216 + - 218 + - 219 + - 220 + - 221 + - 222 j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIAmQCaAJsAnACYAJ8AoAChAKIAngClAKYApwCoAKQAqwCsAK0ArgCqALEAsgCzALQAsAC3ALgAuQC6ALYAvQC+AL8AwAC8AMMAxADFAMYAwgDJAMoAywDMAMgAzwDQANEA0gDOANUA1gDXANgA1ADbANwA3QDeANoA - dtype: i2 + - 76 + - 76 + - 3 + - 3 + - 3 + - 3 + - 1 + - 1 + - 75 + - 75 + - 3 + - 3 + - 70 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 71 + - 71 + - 69 + - 69 + - 67 + - 67 + - 66 + - 66 + - 68 + - 68 + - 89 + - 89 + - 81 + - 81 + - 79 + - 79 + - 77 + - 77 + - 78 + - 78 + - 80 + - 80 + - 88 + - 93 + - 93 + - 95 + - 95 + - 96 + - 96 + - 94 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 68 + - 68 + - 66 + - 66 + - 67 + - 67 + - 69 + - 51 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 13 + - 13 + - 19 + - 19 + - 29 + - 29 + - 40 + - 40 + - 49 + - 49 + - 61 + - 61 + - 62 + - 62 + - 58 + - 58 + - 42 + - 42 + - 12 + - 12 + - 8 + - 8 + - 4 + - 7 + - 7 + - 11 + - 11 + - 39 + - 39 + - 57 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 49 + - 49 + - 40 + - 40 + - 29 + - 29 + - 19 + - 53 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 15 + - 15 + - 16 + - 16 + - 24 + - 24 + - 36 + - 36 + - 46 + - 46 + - 63 + - 63 + - 60 + - 60 + - 56 + - 56 + - 28 + - 28 + - 10 + - 10 + - 6 + - 6 + - 5 + - 9 + - 9 + - 27 + - 27 + - 55 + - 55 + - 59 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 46 + - 46 + - 36 + - 36 + - 24 + - 24 + - 16 + - 99 + - 100 + - 101 + - 102 + - 98 + - 105 + - 106 + - 107 + - 108 + - 104 + - 111 + - 112 + - 113 + - 114 + - 110 + - 117 + - 118 + - 119 + - 120 + - 116 + - 123 + - 124 + - 125 + - 126 + - 122 + - 129 + - 130 + - 131 + - 132 + - 128 + - 135 + - 136 + - 137 + - 138 + - 134 + - 141 + - 142 + - 143 + - 144 + - 140 + - 147 + - 148 + - 149 + - 150 + - 146 + - 153 + - 154 + - 155 + - 156 + - 152 + - 159 + - 160 + - 161 + - 162 + - 158 + - 165 + - 166 + - 167 + - 168 + - 164 + - 171 + - 172 + - 173 + - 174 + - 170 + - 177 + - 178 + - 179 + - 180 + - 176 + - 183 + - 184 + - 185 + - 186 + - 182 + - 189 + - 190 + - 191 + - 192 + - 188 + - 195 + - 196 + - 197 + - 198 + - 194 + - 201 + - 202 + - 203 + - 204 + - 200 + - 207 + - 208 + - 209 + - 210 + - 206 + - 213 + - 214 + - 215 + - 216 + - 212 + - 219 + - 220 + - 221 + - 222 + - 218 k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcAnQCdAJ0AnQCdAKMAowCjAKMAowCpAKkAqQCpAKkArwCvAK8ArwCvALUAtQC1ALUAtQC7ALsAuwC7ALsAwQDBAMEAwQDBAMcAxwDHAMcAxwDNAM0AzQDNAM0A0wDTANMA0wDTANkA2QDZANkA2QDfAN8A3wDfAN8A - dtype: i2 + - 64 + - 65 + - 75 + - 76 + - 65 + - 1 + - 64 + - 0 + - 0 + - 64 + - 0 + - 2 + - 86 + - 72 + - 90 + - 74 + - 92 + - 73 + - 91 + - 71 + - 87 + - 69 + - 85 + - 67 + - 83 + - 66 + - 82 + - 68 + - 84 + - 70 + - 86 + - 81 + - 84 + - 79 + - 82 + - 77 + - 83 + - 78 + - 85 + - 80 + - 87 + - 88 + - 93 + - 91 + - 95 + - 92 + - 96 + - 90 + - 94 + - 86 + - 89 + - 96 + - 93 + - 80 + - 77 + - 79 + - 88 + - 95 + - 94 + - 81 + - 78 + - 72 + - 66 + - 74 + - 67 + - 73 + - 69 + - 71 + - 52 + - 43 + - 44 + - 31 + - 32 + - 21 + - 22 + - 13 + - 14 + - 19 + - 20 + - 29 + - 30 + - 40 + - 41 + - 49 + - 50 + - 51 + - 52 + - 62 + - 50 + - 58 + - 41 + - 42 + - 30 + - 12 + - 20 + - 8 + - 14 + - 4 + - 7 + - 22 + - 11 + - 32 + - 39 + - 44 + - 57 + - 52 + - 61 + - 39 + - 7 + - 8 + - 42 + - 58 + - 4 + - 11 + - 57 + - 62 + - 12 + - 43 + - 40 + - 31 + - 29 + - 21 + - 19 + - 13 + - 54 + - 45 + - 47 + - 35 + - 37 + - 23 + - 25 + - 15 + - 17 + - 16 + - 18 + - 24 + - 26 + - 36 + - 38 + - 46 + - 48 + - 53 + - 54 + - 60 + - 48 + - 56 + - 38 + - 28 + - 26 + - 10 + - 18 + - 6 + - 17 + - 5 + - 9 + - 25 + - 27 + - 37 + - 55 + - 47 + - 59 + - 54 + - 63 + - 55 + - 9 + - 6 + - 28 + - 56 + - 5 + - 27 + - 59 + - 60 + - 10 + - 45 + - 36 + - 35 + - 24 + - 23 + - 16 + - 15 + - 103 + - 103 + - 103 + - 103 + - 103 + - 109 + - 109 + - 109 + - 109 + - 109 + - 115 + - 115 + - 115 + - 115 + - 115 + - 121 + - 121 + - 121 + - 121 + - 121 + - 127 + - 127 + - 127 + - 127 + - 127 + - 133 + - 133 + - 133 + - 133 + - 133 + - 139 + - 139 + - 139 + - 139 + - 139 + - 145 + - 145 + - 145 + - 145 + - 145 + - 151 + - 151 + - 151 + - 151 + - 151 + - 157 + - 157 + - 157 + - 157 + - 157 + - 163 + - 163 + - 163 + - 163 + - 163 + - 169 + - 169 + - 169 + - 169 + - 169 + - 175 + - 175 + - 175 + - 175 + - 175 + - 181 + - 181 + - 181 + - 181 + - 181 + - 187 + - 187 + - 187 + - 187 + - 187 + - 193 + - 193 + - 193 + - 193 + - 193 + - 199 + - 199 + - 199 + - 199 + - 199 + - 205 + - 205 + - 205 + - 205 + - 205 + - 211 + - 211 + - 211 + - 211 + - 211 + - 217 + - 217 + - 217 + - 217 + - 217 + - 223 + - 223 + - 223 + - 223 + - 223 legendgroup: Sensor(id=ID) name: Sensor (False) opacity: 1 @@ -743,14 +3455,680 @@ data: showlegend: true type: mesh3d x: - bdata: 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 - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014992463600000002 + - -0.014392395300000003 + - -0.014392395300000003 + - -0.012869499600000002 + - -0.012355425950000002 + - -0.009822911000000002 + - -0.009822911000000002 + - -0.0066605612500000005 + - -0.005795627850000001 + - 0.0 + - -0.004997477680000001 + - 0.0 + - 0.0 + - -0.0046984631550000015 + - -0.0046984631550000015 + - 0.0 + - -0.003930366410000001 + - 0.0 + - -0.003726213425000001 + - 0.0 + - 0.0 + - -0.0025000000350000003 + - -0.0025000000350000003 + - -0.0021347226600000008 + - -0.0021347226600000008 + - 0.0 + - -0.0010241928500000002 + - 0.0 + - -0.0007114128200000001 + - -1.0408340850000002e-17 + - -9.553993650000002e-18 + - 0.0 + - 0.0 + - 0.0008682409300000002 + - 0.0008682409300000002 + - 0.0016630589950000004 + - 0.0 + - 0.0023612117400000003 + - 0.0026042407400000004 + - 0.0 + - 0.0026362657550000005 + - 0.0 + - 0.0 + - 0.003830222040000001 + - 0.003830222040000001 + - 0.0 + - 0.004641779140000001 + - 0.0 + - 0.004750406370000001 + - 0.0 + - 0.0049999997000000004 + - 0.006231224900000001 + - 0.006231224900000001 + - 0.00945867 + - 0.010177281500000003 + - 0.012618804000000003 + - 0.012618804000000003 + - 0.014251218750000003 + - 0.014519108850000004 + - 0.014999999100000003 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.10000000000000002 + - -0.9628772522231052 + - -1.0757465324544286 + - -1.1893106634692079 + - -1.146627876107864 + - -1.00668433176919 + - -0.9237506687952409 + - -1.1505898676279929 + - -1.240606557141336 + - -1.2711111784654134 + - -1.199947381744295 + - -1.125461115278078 + - -0.8024567799485769 + - -1.25 + - -1.25 + - -1.25 + - -1.25 + - -1.25 + - -0.75 + - -1.1505898676279929 + - -1.1254611152780778 + - -1.199947381744295 + - -1.2711111784654134 + - -1.240606557141336 + - -0.8024567799485769 + - -0.9628772522231052 + - -1.00668433176919 + - -1.146627876107864 + - -1.1893106634692079 + - -1.0757465324544286 + - -0.9237506687952409 + - -0.29276393534561734 + - -0.3193589741406161 + - -0.45218127374517486 + - -0.5076749305697151 + - -0.40914959704274484 + - -0.6037742578312263 + - -0.75 + - -0.75 + - -0.75 + - -0.75 + - -0.75 + - -0.25 + - -0.29276393534561734 + - -0.40914959704274484 + - -0.5076749305697151 + - -0.4521812737451749 + - -0.31935897414061615 + - -0.6037742578312263 + - 0.25 + - 0.25 + - 0.24999999999999997 + - 0.24999999999999997 + - 0.25 + - -0.25 + - -0.24999999999999997 + - -0.25 + - -0.25 + - -0.25 + - -0.25 + - 0.25 + - -0.24999999999999997 + - -0.25 + - -0.25 + - -0.25 + - -0.25 + - 0.25 + - -0.24999999999999997 + - -0.25 + - -0.25 + - -0.25 + - -0.25 + - 0.25 + - 0.25 + - 0.25 + - 0.24999999999999997 + - 0.24999999999999997 + - 0.25 + - -0.25 + - 0.7072360646543827 + - 0.5908504029572552 + - 0.49232506943028487 + - 0.5478187262548251 + - 0.6806410258593838 + - 0.39622574216877365 + - 0.25 + - 0.25 + - 0.25 + - 0.25 + - 0.25 + - 0.75 + - 0.7072360646543827 + - 0.6806410258593839 + - 0.5478187262548251 + - 0.49232506943028487 + - 0.5908504029572551 + - 0.39622574216877365 + - 1.0371227477768947 + - 0.99331566823081 + - 0.8533721238921359 + - 0.8106893365307922 + - 0.9242534675455715 + - 1.0762493312047592 + - 0.849410132372007 + - 0.874538884721922 + - 0.8000526182557052 + - 0.7288888215345866 + - 0.7593934428586637 + - 1.197543220051423 + - 0.75 + - 0.75 + - 0.75 + - 0.75 + - 0.75 + - 1.25 + - 0.849410132372007 + - 0.7593934428586638 + - 0.7288888215345866 + - 0.8000526182557052 + - 0.874538884721922 + - 1.197543220051423 + - 1.0371227477768947 + - 0.9242534675455715 + - 0.8106893365307922 + - 0.8533721238921359 + - 0.99331566823081 + - 1.0762493312047592 y: - bdata: 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 - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - -0.004225988315000001 + - 0.004225988315000001 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.011336243900000001 + - 0.011336243900000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0017101006600000004 + - 0.0017101006600000004 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.004330126940000001 + - 0.004330126940000001 + - -0.014847321800000002 + - 0.014847321800000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.10000000000000002 + - 0.0 + - 0.0 + - -0.0049240388000000015 + - 0.0049240388000000015 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0032139379550000006 + - 0.0032139379550000006 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.013644480700000003 + - 0.013644480700000003 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.008109612750000002 + - 0.008109612750000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.00028137136250000006 + - 0.0078714803 + - -0.008344890200000002 + - 0.013525193950000004 + - -0.013758964850000003 + - -0.0016490003100000004 + - 0.0017709132300000002 + - -0.0042973283700000016 + - 0.0043621968500000005 + - -0.004934888705000001 + - 0.004912360015000001 + - 0.014884752050000002 + - -0.014804665750000005 + - -0.0032633595150000005 + - 0.0031639754750000006 + - -6.486846850000001e-05 + - 0.011518507450000002 + - -0.011149990550000002 + - 0.004495218770000001 + - -0.0039552707250000005 + - 9.925023200000001e-18 + - -1.2743964494489675 + - -1.2382493264557708 + - -1.2018796729681822 + - -1.2155491139469934 + - -1.2603669465666976 + - -0.7619116981226777 + - -0.7137565456792196 + - -0.5977007427167186 + - -0.5583720544371074 + - -0.6501213913098591 + - -0.7461542882220948 + - -0.3467789955270001 + - 0.0 + - 0.11888206453689419 + - 0.07347315653655916 + - -0.07347315653655913 + - -0.1188820645368942 + - 0.0 + - 0.7137565456792196 + - 0.7461542882220948 + - 0.6501213913098591 + - 0.5583720544371074 + - 0.5977007427167185 + - 0.3467789955270001 + - 1.2743964494489675 + - 1.2603669465666976 + - 1.2155491139469934 + - 1.2018796729681822 + - 1.2382493264557706 + - 0.7619116981226777 + - -1.1802385623540619 + - -1.1923728764612453 + - -1.2529746870569571 + - -1.2782943516777072 + - -1.2333409544013672 + - -0.7725557136097322 + - 0.0 + - 0.11888206453689419 + - 0.07347315653655916 + - -0.07347315653655913 + - -0.1188820645368942 + - 0.0 + - 1.1802385623540619 + - 1.2333409544013672 + - 1.2782943516777072 + - 1.2529746870569571 + - 1.1923728764612453 + - 0.7725557136097322 + - -1.0 + - -0.8811179354631058 + - -0.9265268434634408 + - -1.0734731565365592 + - -1.1188820645368942 + - -1.0 + - -0.5 + - -0.3811179354631058 + - -0.42652684346344083 + - -0.5734731565365592 + - -0.6188820645368942 + - -0.5 + - 0.0 + - 0.11888206453689419 + - 0.07347315653655916 + - -0.07347315653655913 + - -0.1188820645368942 + - 0.0 + - 0.5 + - 0.6188820645368942 + - 0.5734731565365592 + - 0.4265268434634409 + - 0.3811179354631058 + - 0.5 + - 1.0 + - 1.1188820645368942 + - 1.0734731565365592 + - 0.9265268434634408 + - 0.8811179354631058 + - 1.0 + - -0.8197614376459381 + - -0.7666590455986328 + - -0.7217056483222927 + - -0.7470253129430429 + - -0.8076271235387548 + - -1.2274442863902677 + - 0.0 + - 0.11888206453689419 + - 0.07347315653655916 + - -0.07347315653655913 + - -0.1188820645368942 + - 0.0 + - 0.8197614376459381 + - 0.8076271235387548 + - 0.7470253129430429 + - 0.7217056483222927 + - 0.7666590455986327 + - 1.2274442863902677 + - -0.7256035505510325 + - -0.7396330534333024 + - -0.7844508860530066 + - -0.7981203270318177 + - -0.7617506735442293 + - -1.2380883018773223 + - -0.2862434543207803 + - -0.25384571177790516 + - -0.349878608690141 + - -0.4416279455628927 + - -0.4022992572832815 + - -0.6532210044729999 + - 0.0 + - 0.11888206453689419 + - 0.07347315653655916 + - -0.07347315653655913 + - -0.1188820645368942 + - 0.0 + - 0.2862434543207803 + - 0.4022992572832814 + - 0.44162794556289275 + - 0.349878608690141 + - 0.25384571177790516 + - 0.6532210044729999 + - 0.7256035505510325 + - 0.7617506735442293 + - 0.7981203270318177 + - 0.7844508860530066 + - 0.7396330534333024 + - 1.2380883018773223 z: - bdata: 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 - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.0004754300695000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.007705580450000002 + - -0.008505494900000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.013440123200000004 + - -0.013835124650000002 + - 0.0 + - 0.00015880254800000005 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.003090666795000001 + - 0.0 + - 0.0033339664350000007 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0048939786850000005 + - 0.0 + - 0.004949130490000001 + - 0.10000000000000002 + - -3.1374891150000003e-18 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.014907522500000003 + - 0.0 + - -0.004407344015000001 + - -0.014772200600000002 + - 0.0 + - 0.0042485412200000015 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0018584636950000003 + - 0.0 + - 0.0015600122500000005 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.011641889050000001 + - -0.011019207550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.004680036755000001 + - -0.003767693415000001 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014997360100000004 + - -0.012768703700000003 + - -0.012464462200000002 + - -0.006486073150000001 + - -0.005974184350000002 + - -0.004720254240000001 + - -0.004675881190000001 + - -0.0025559673100000006 + - -0.0024436118100000007 + - 0.0008042847750000002 + - 0.0009320507750000002 + - 0.0018558396050000002 + - 0.0024128545100000004 + - 0.003788203375000001 + - 0.0038715966050000008 + - 0.004999579490000001 + - 0.009608536200000002 + - 0.0100338295 + - 0.014310590900000003 + - 0.014469133300000003 + - -1.6175736900000002e-18 + - -0.0381246656023796 + - -0.12499888505303482 + - -0.0391288939162372 + - 0.10081589867061119 + - 0.1014365459010402 + - 4.163336342344337e-17 + - -0.09877161002571161 + - -0.10338302342838761 + - 0.03487738768724126 + - 0.12493843445790968 + - 0.04233881130894786 + - 8.326672684688674e-17 + - -0.12500000000000006 + - -0.03862712429686849 + - 0.10112712429686836 + - 0.10112712429686838 + - -0.03862712429686846 + - 5.551115123125783e-17 + - -0.09877161002571161 + - 0.04233881130894783 + - 0.12493843445790968 + - 0.03487738768724129 + - -0.1033830234283876 + - 8.326672684688674e-17 + - -0.0381246656023796 + - 0.10143654590104019 + - 0.10081589867061122 + - -0.039128893916237174 + - -0.12499888505303483 + - 4.163336342344337e-17 + - 0.051887128915613194 + - -0.09212218070853441 + - -0.1088217677112473 + - 0.024866629547137756 + - 0.12419018995703088 + - -2.7755575615628914e-17 + - -0.12500000000000006 + - -0.03862712429686849 + - 0.10112712429686836 + - 0.10112712429686838 + - -0.03862712429686846 + - 5.551115123125783e-17 + - 0.051887128915613194 + - 0.12419018995703088 + - 0.024866629547137788 + - -0.10882176771124728 + - -0.09212218070853442 + - -2.7755575615628914e-17 + - 0.12499999999999994 + - 0.038627124296868376 + - -0.10112712429686847 + - -0.10112712429686849 + - 0.03862712429686835 + - 5.551115123125783e-17 + - -0.12500000000000006 + - -0.03862712429686849 + - 0.10112712429686836 + - 0.10112712429686838 + - -0.03862712429686846 + - 5.551115123125783e-17 + - -0.12500000000000006 + - -0.03862712429686849 + - 0.10112712429686836 + - 0.10112712429686838 + - -0.03862712429686846 + - 5.551115123125783e-17 + - -0.12500000000000006 + - -0.03862712429686849 + - 0.10112712429686836 + - 0.10112712429686838 + - -0.03862712429686846 + - 5.551115123125783e-17 + - 0.12499999999999994 + - 0.038627124296868376 + - -0.10112712429686847 + - -0.10112712429686849 + - 0.03862712429686835 + - 5.551115123125783e-17 + - 0.051887128915613194 + - 0.12419018995703088 + - 0.024866629547137788 + - -0.10882176771124728 + - -0.09212218070853442 + - -2.7755575615628914e-17 + - -0.12500000000000006 + - -0.03862712429686849 + - 0.10112712429686836 + - 0.10112712429686838 + - -0.03862712429686846 + - 5.551115123125783e-17 + - 0.051887128915613194 + - -0.09212218070853441 + - -0.1088217677112473 + - 0.024866629547137756 + - 0.12419018995703088 + - -2.7755575615628914e-17 + - -0.0381246656023796 + - 0.10143654590104019 + - 0.10081589867061122 + - -0.039128893916237174 + - -0.12499888505303483 + - 4.163336342344337e-17 + - -0.09877161002571146 + - 0.04233881130894798 + - 0.12493843445790985 + - 0.03487738768724148 + - -0.10338302342838741 + - -8.326672684688674e-17 + - -0.12500000000000006 + - -0.03862712429686849 + - 0.10112712429686836 + - 0.10112712429686838 + - -0.03862712429686846 + - 5.551115123125783e-17 + - -0.09877161002571146 + - -0.10338302342838743 + - 0.03487738768724145 + - 0.12493843445790985 + - 0.04233881130894801 + - -8.326672684688674e-17 + - -0.0381246656023796 + - -0.12499888505303482 + - -0.0391288939162372 + - 0.10081589867061119 + - 0.1014365459010402 + - 4.163336342344337e-17 layout: legend: itemsizing: constant diff --git a/tests/test_display_plotly/test_pixel_field_sizing_modes.yml b/tests/test_display_plotly/test_pixel_field_sizing_modes.yml index adcd92af0..25205f2a5 100644 --- a/tests/test_display_plotly/test_pixel_field_sizing_modes.yml +++ b/tests/test_display_plotly/test_pixel_field_sizing_modes.yml @@ -14,17 +14,53 @@ data: - - 1.0 - '#e71111' i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 + - 7 + - 0 + - 0 + - 0 + - 4 + - 4 + - 2 + - 6 + - 4 + - 0 + - 3 + - 7 intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 + - 0.0 + - 0.0 + - 1.0 + - 1.0 + - 0.0 + - 0.0 + - 1.0 + - 1.0 j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 + - 0 + - 7 + - 1 + - 2 + - 6 + - 7 + - 1 + - 2 + - 5 + - 5 + - 2 + - 2 k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 + - 3 + - 4 + - 2 + - 3 + - 5 + - 6 + - 5 + - 5 + - 0 + - 1 + - 7 + - 6 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -33,14 +69,32 @@ data: showscale: false type: mesh3d x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 - facecolor: - '#e15f99' - '#e15f99' @@ -268,14 +322,683 @@ data: - '#440154' - '#440154' i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 + - 75 + - 64 + - 2 + - 75 + - 76 + - 65 + - 65 + - 64 + - 2 + - 0 + - 1 + - 0 + - 84 + - 86 + - 86 + - 90 + - 90 + - 92 + - 92 + - 91 + - 91 + - 87 + - 87 + - 85 + - 85 + - 83 + - 83 + - 82 + - 82 + - 84 + - 94 + - 86 + - 86 + - 84 + - 84 + - 82 + - 82 + - 83 + - 83 + - 85 + - 85 + - 87 + - 87 + - 87 + - 91 + - 91 + - 92 + - 92 + - 90 + - 90 + - 94 + - 95 + - 88 + - 78 + - 79 + - 81 + - 80 + - 93 + - 96 + - 89 + - 77 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 50 + - 52 + - 52 + - 44 + - 44 + - 32 + - 32 + - 22 + - 22 + - 14 + - 14 + - 20 + - 20 + - 30 + - 30 + - 41 + - 41 + - 50 + - 57 + - 52 + - 52 + - 50 + - 50 + - 41 + - 41 + - 30 + - 30 + - 20 + - 20 + - 14 + - 14 + - 14 + - 22 + - 22 + - 32 + - 32 + - 44 + - 44 + - 57 + - 11 + - 4 + - 12 + - 58 + - 62 + - 8 + - 7 + - 39 + - 61 + - 42 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 48 + - 54 + - 54 + - 47 + - 47 + - 37 + - 37 + - 25 + - 25 + - 17 + - 17 + - 18 + - 18 + - 26 + - 26 + - 38 + - 38 + - 48 + - 59 + - 54 + - 54 + - 48 + - 48 + - 38 + - 38 + - 26 + - 26 + - 18 + - 18 + - 17 + - 17 + - 17 + - 25 + - 25 + - 37 + - 37 + - 47 + - 47 + - 59 + - 27 + - 5 + - 10 + - 56 + - 60 + - 6 + - 9 + - 55 + - 63 + - 28 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 98 + - 99 + - 100 + - 101 + - 102 + - 104 + - 105 + - 106 + - 107 + - 108 + - 110 + - 111 + - 112 + - 113 + - 114 + - 116 + - 117 + - 118 + - 119 + - 120 + - 122 + - 123 + - 124 + - 125 + - 126 + - 128 + - 129 + - 130 + - 131 + - 132 + - 134 + - 135 + - 136 + - 137 + - 138 + - 140 + - 141 + - 142 + - 143 + - 144 + - 146 + - 147 + - 148 + - 149 + - 150 j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 + - 76 + - 76 + - 3 + - 3 + - 3 + - 3 + - 1 + - 1 + - 75 + - 75 + - 3 + - 3 + - 70 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 71 + - 71 + - 69 + - 69 + - 67 + - 67 + - 66 + - 66 + - 68 + - 68 + - 89 + - 89 + - 81 + - 81 + - 79 + - 79 + - 77 + - 77 + - 78 + - 78 + - 80 + - 80 + - 88 + - 93 + - 93 + - 95 + - 95 + - 96 + - 96 + - 94 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 68 + - 68 + - 66 + - 66 + - 67 + - 67 + - 69 + - 51 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 13 + - 13 + - 19 + - 19 + - 29 + - 29 + - 40 + - 40 + - 49 + - 49 + - 61 + - 61 + - 62 + - 62 + - 58 + - 58 + - 42 + - 42 + - 12 + - 12 + - 8 + - 8 + - 4 + - 7 + - 7 + - 11 + - 11 + - 39 + - 39 + - 57 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 49 + - 49 + - 40 + - 40 + - 29 + - 29 + - 19 + - 53 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 15 + - 15 + - 16 + - 16 + - 24 + - 24 + - 36 + - 36 + - 46 + - 46 + - 63 + - 63 + - 60 + - 60 + - 56 + - 56 + - 28 + - 28 + - 10 + - 10 + - 6 + - 6 + - 5 + - 9 + - 9 + - 27 + - 27 + - 55 + - 55 + - 59 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 46 + - 46 + - 36 + - 36 + - 24 + - 24 + - 16 + - 99 + - 100 + - 101 + - 102 + - 98 + - 105 + - 106 + - 107 + - 108 + - 104 + - 111 + - 112 + - 113 + - 114 + - 110 + - 117 + - 118 + - 119 + - 120 + - 116 + - 123 + - 124 + - 125 + - 126 + - 122 + - 129 + - 130 + - 131 + - 132 + - 128 + - 135 + - 136 + - 137 + - 138 + - 134 + - 141 + - 142 + - 143 + - 144 + - 140 + - 147 + - 148 + - 149 + - 150 + - 146 k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 + - 64 + - 65 + - 75 + - 76 + - 65 + - 1 + - 64 + - 0 + - 0 + - 64 + - 0 + - 2 + - 86 + - 72 + - 90 + - 74 + - 92 + - 73 + - 91 + - 71 + - 87 + - 69 + - 85 + - 67 + - 83 + - 66 + - 82 + - 68 + - 84 + - 70 + - 86 + - 81 + - 84 + - 79 + - 82 + - 77 + - 83 + - 78 + - 85 + - 80 + - 87 + - 88 + - 93 + - 91 + - 95 + - 92 + - 96 + - 90 + - 94 + - 86 + - 89 + - 96 + - 93 + - 80 + - 77 + - 79 + - 88 + - 95 + - 94 + - 81 + - 78 + - 72 + - 66 + - 74 + - 67 + - 73 + - 69 + - 71 + - 52 + - 43 + - 44 + - 31 + - 32 + - 21 + - 22 + - 13 + - 14 + - 19 + - 20 + - 29 + - 30 + - 40 + - 41 + - 49 + - 50 + - 51 + - 52 + - 62 + - 50 + - 58 + - 41 + - 42 + - 30 + - 12 + - 20 + - 8 + - 14 + - 4 + - 7 + - 22 + - 11 + - 32 + - 39 + - 44 + - 57 + - 52 + - 61 + - 39 + - 7 + - 8 + - 42 + - 58 + - 4 + - 11 + - 57 + - 62 + - 12 + - 43 + - 40 + - 31 + - 29 + - 21 + - 19 + - 13 + - 54 + - 45 + - 47 + - 35 + - 37 + - 23 + - 25 + - 15 + - 17 + - 16 + - 18 + - 24 + - 26 + - 36 + - 38 + - 46 + - 48 + - 53 + - 54 + - 60 + - 48 + - 56 + - 38 + - 28 + - 26 + - 10 + - 18 + - 6 + - 17 + - 5 + - 9 + - 25 + - 27 + - 37 + - 55 + - 47 + - 59 + - 54 + - 63 + - 55 + - 9 + - 6 + - 28 + - 56 + - 5 + - 27 + - 59 + - 60 + - 10 + - 45 + - 36 + - 35 + - 24 + - 23 + - 16 + - 15 + - 103 + - 103 + - 103 + - 103 + - 103 + - 109 + - 109 + - 109 + - 109 + - 109 + - 115 + - 115 + - 115 + - 115 + - 115 + - 121 + - 121 + - 121 + - 121 + - 121 + - 127 + - 127 + - 127 + - 127 + - 127 + - 133 + - 133 + - 133 + - 133 + - 133 + - 139 + - 139 + - 139 + - 139 + - 139 + - 145 + - 145 + - 145 + - 145 + - 145 + - 151 + - 151 + - 151 + - 151 + - 151 legendgroup: Sensor(id=ID) name: Sensor (constant) opacity: 1 @@ -283,14 +1006,464 @@ data: showlegend: true type: mesh3d x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014992463600000002 + - -0.014392395300000003 + - -0.014392395300000003 + - -0.012869499600000002 + - -0.012355425950000002 + - -0.009822911000000002 + - -0.009822911000000002 + - -0.0066605612500000005 + - -0.005795627850000001 + - 0.0 + - -0.004997477680000001 + - 0.0 + - 0.0 + - -0.0046984631550000015 + - -0.0046984631550000015 + - 0.0 + - -0.003930366410000001 + - 0.0 + - -0.003726213425000001 + - 0.0 + - 0.0 + - -0.0025000000350000003 + - -0.0025000000350000003 + - -0.0021347226600000008 + - -0.0021347226600000008 + - 0.0 + - -0.0010241928500000002 + - 0.0 + - -0.0007114128200000001 + - -1.0408340850000002e-17 + - -9.553993650000002e-18 + - 0.0 + - 0.0 + - 0.0008682409300000002 + - 0.0008682409300000002 + - 0.0016630589950000004 + - 0.0 + - 0.0023612117400000003 + - 0.0026042407400000004 + - 0.0 + - 0.0026362657550000005 + - 0.0 + - 0.0 + - 0.003830222040000001 + - 0.003830222040000001 + - 0.0 + - 0.004641779140000001 + - 0.0 + - 0.004750406370000001 + - 0.0 + - 0.0049999997000000004 + - 0.006231224900000001 + - 0.006231224900000001 + - 0.00945867 + - 0.010177281500000003 + - 0.012618804000000003 + - 0.012618804000000003 + - 0.014251218750000003 + - 0.014519108850000004 + - 0.014999999100000003 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.10000000000000002 + - -0.9257545044462104 + - -1.151493064908857 + - -1.3786213269384155 + - -1.2932557522157282 + - -1.01336866353838 + - -0.8475013375904817 + - -1.5 + - -1.5 + - -1.5 + - -1.5 + - -1.5 + - -0.5 + - -0.9257545044462104 + - -1.01336866353838 + - -1.2932557522157282 + - -1.3786213269384155 + - -1.151493064908857 + - -0.8475013375904817 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - -0.49999999999999994 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.49999999999999994 + - 0.49999999999999994 + - 0.5 + - -0.5 + - 1.0742454955537897 + - 0.9866313364616199 + - 0.7067442477842719 + - 0.6213786730615845 + - 0.8485069350911429 + - 1.1524986624095181 + - 0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 + - 1.5 + - 1.0742454955537897 + - 0.8485069350911429 + - 0.6213786730615845 + - 0.7067442477842718 + - 0.9866313364616199 + - 1.1524986624095181 y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - -0.004225988315000001 + - 0.004225988315000001 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.011336243900000001 + - 0.011336243900000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0017101006600000004 + - 0.0017101006600000004 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.004330126940000001 + - 0.004330126940000001 + - -0.014847321800000002 + - 0.014847321800000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.10000000000000002 + - 0.0 + - 0.0 + - -0.0049240388000000015 + - 0.0049240388000000015 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0032139379550000006 + - 0.0032139379550000006 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.013644480700000003 + - 0.013644480700000003 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.008109612750000002 + - 0.008109612750000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.00028137136250000006 + - 0.0078714803 + - -0.008344890200000002 + - 0.013525193950000004 + - -0.013758964850000003 + - -0.0016490003100000004 + - 0.0017709132300000002 + - -0.0042973283700000016 + - 0.0043621968500000005 + - -0.004934888705000001 + - 0.004912360015000001 + - 0.014884752050000002 + - -0.014804665750000005 + - -0.0032633595150000005 + - 0.0031639754750000006 + - -6.486846850000001e-05 + - 0.011518507450000002 + - -0.011149990550000002 + - 0.004495218770000001 + - -0.0039552707250000005 + - 9.925023200000001e-18 + - -1.548792898897935 + - -1.4764986529115414 + - -1.4037593459363646 + - -1.4310982278939868 + - -1.5207338931333951 + - -0.5238233962453553 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 1.548792898897935 + - 1.5207338931333951 + - 1.4310982278939868 + - 1.4037593459363646 + - 1.4764986529115414 + - 0.5238233962453553 + - -1.0 + - -0.7622358709262116 + - -0.8530536869268817 + - -1.1469463130731183 + - -1.2377641290737884 + - -1.0 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 1.0 + - 1.2377641290737884 + - 1.1469463130731183 + - 0.8530536869268818 + - 0.7622358709262116 + - 1.0 + - -0.45120710110206497 + - -0.47926610686660476 + - -0.5689017721060132 + - -0.5962406540636354 + - -0.5235013470884586 + - -1.4761766037546447 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 0.45120710110206497 + - 0.5235013470884586 + - 0.5962406540636354 + - 0.5689017721060132 + - 0.47926610686660476 + - 1.4761766037546447 z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.0004754300695000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.007705580450000002 + - -0.008505494900000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.013440123200000004 + - -0.013835124650000002 + - 0.0 + - 0.00015880254800000005 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.003090666795000001 + - 0.0 + - 0.0033339664350000007 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0048939786850000005 + - 0.0 + - 0.004949130490000001 + - 0.10000000000000002 + - -3.1374891150000003e-18 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.014907522500000003 + - 0.0 + - -0.004407344015000001 + - -0.014772200600000002 + - 0.0 + - 0.0042485412200000015 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0018584636950000003 + - 0.0 + - 0.0015600122500000005 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.011641889050000001 + - -0.011019207550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.004680036755000001 + - -0.003767693415000001 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014997360100000004 + - -0.012768703700000003 + - -0.012464462200000002 + - -0.006486073150000001 + - -0.005974184350000002 + - -0.004720254240000001 + - -0.004675881190000001 + - -0.0025559673100000006 + - -0.0024436118100000007 + - 0.0008042847750000002 + - 0.0009320507750000002 + - 0.0018558396050000002 + - 0.0024128545100000004 + - 0.003788203375000001 + - 0.0038715966050000008 + - 0.004999579490000001 + - 0.009608536200000002 + - 0.0100338295 + - 0.014310590900000003 + - 0.014469133300000003 + - -1.6175736900000002e-18 + - -0.0762493312047592 + - -0.24999777010606963 + - -0.0782577878324744 + - 0.20163179734122239 + - 0.2028730918020804 + - 8.326672684688674e-17 + - -0.2500000000000001 + - -0.07725424859373697 + - 0.20225424859373672 + - 0.20225424859373675 + - -0.07725424859373692 + - 1.1102230246251565e-16 + - -0.0762493312047592 + - 0.20287309180208038 + - 0.20163179734122244 + - -0.07825778783247435 + - -0.24999777010606966 + - 8.326672684688674e-17 + - 0.2499999999999999 + - 0.07725424859373675 + - -0.20225424859373695 + - -0.20225424859373697 + - 0.0772542485937367 + - 1.1102230246251565e-16 + - -0.2500000000000001 + - -0.07725424859373697 + - 0.20225424859373672 + - 0.20225424859373675 + - -0.07725424859373692 + - 1.1102230246251565e-16 + - 0.2499999999999999 + - 0.07725424859373675 + - -0.20225424859373695 + - -0.20225424859373697 + - 0.0772542485937367 + - 1.1102230246251565e-16 + - -0.0762493312047592 + - 0.20287309180208038 + - 0.20163179734122244 + - -0.07825778783247435 + - -0.24999777010606966 + - 8.326672684688674e-17 + - -0.2500000000000001 + - -0.07725424859373697 + - 0.20225424859373672 + - 0.20225424859373675 + - -0.07725424859373692 + - 1.1102230246251565e-16 + - -0.0762493312047592 + - -0.24999777010606963 + - -0.0782577878324744 + - 0.20163179734122239 + - 0.2028730918020804 + - 8.326672684688674e-17 - color: '#2e91e5' colorscale: - - 0.0 @@ -306,17 +1479,53 @@ data: - - 1.0 - '#e71111' i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 + - 7 + - 0 + - 0 + - 0 + - 4 + - 4 + - 2 + - 6 + - 4 + - 0 + - 3 + - 7 intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 + - 0.0 + - 0.0 + - 1.0 + - 1.0 + - 0.0 + - 0.0 + - 1.0 + - 1.0 j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 + - 0 + - 7 + - 1 + - 2 + - 6 + - 7 + - 1 + - 2 + - 5 + - 5 + - 2 + - 2 k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 + - 3 + - 4 + - 2 + - 3 + - 5 + - 6 + - 5 + - 5 + - 0 + - 1 + - 7 + - 6 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -325,14 +1534,32 @@ data: showscale: false type: mesh3d x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 - facecolor: - '#1ca71c' - '#1ca71c' @@ -560,14 +1787,683 @@ data: - '#440154' - '#440154' i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 + - 75 + - 64 + - 2 + - 75 + - 76 + - 65 + - 65 + - 64 + - 2 + - 0 + - 1 + - 0 + - 84 + - 86 + - 86 + - 90 + - 90 + - 92 + - 92 + - 91 + - 91 + - 87 + - 87 + - 85 + - 85 + - 83 + - 83 + - 82 + - 82 + - 84 + - 94 + - 86 + - 86 + - 84 + - 84 + - 82 + - 82 + - 83 + - 83 + - 85 + - 85 + - 87 + - 87 + - 87 + - 91 + - 91 + - 92 + - 92 + - 90 + - 90 + - 94 + - 95 + - 88 + - 78 + - 79 + - 81 + - 80 + - 93 + - 96 + - 89 + - 77 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 50 + - 52 + - 52 + - 44 + - 44 + - 32 + - 32 + - 22 + - 22 + - 14 + - 14 + - 20 + - 20 + - 30 + - 30 + - 41 + - 41 + - 50 + - 57 + - 52 + - 52 + - 50 + - 50 + - 41 + - 41 + - 30 + - 30 + - 20 + - 20 + - 14 + - 14 + - 14 + - 22 + - 22 + - 32 + - 32 + - 44 + - 44 + - 57 + - 11 + - 4 + - 12 + - 58 + - 62 + - 8 + - 7 + - 39 + - 61 + - 42 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 48 + - 54 + - 54 + - 47 + - 47 + - 37 + - 37 + - 25 + - 25 + - 17 + - 17 + - 18 + - 18 + - 26 + - 26 + - 38 + - 38 + - 48 + - 59 + - 54 + - 54 + - 48 + - 48 + - 38 + - 38 + - 26 + - 26 + - 18 + - 18 + - 17 + - 17 + - 17 + - 25 + - 25 + - 37 + - 37 + - 47 + - 47 + - 59 + - 27 + - 5 + - 10 + - 56 + - 60 + - 6 + - 9 + - 55 + - 63 + - 28 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 98 + - 99 + - 100 + - 101 + - 102 + - 104 + - 105 + - 106 + - 107 + - 108 + - 110 + - 111 + - 112 + - 113 + - 114 + - 116 + - 117 + - 118 + - 119 + - 120 + - 122 + - 123 + - 124 + - 125 + - 126 + - 128 + - 129 + - 130 + - 131 + - 132 + - 134 + - 135 + - 136 + - 137 + - 138 + - 140 + - 141 + - 142 + - 143 + - 144 + - 146 + - 147 + - 148 + - 149 + - 150 j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 + - 76 + - 76 + - 3 + - 3 + - 3 + - 3 + - 1 + - 1 + - 75 + - 75 + - 3 + - 3 + - 70 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 71 + - 71 + - 69 + - 69 + - 67 + - 67 + - 66 + - 66 + - 68 + - 68 + - 89 + - 89 + - 81 + - 81 + - 79 + - 79 + - 77 + - 77 + - 78 + - 78 + - 80 + - 80 + - 88 + - 93 + - 93 + - 95 + - 95 + - 96 + - 96 + - 94 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 68 + - 68 + - 66 + - 66 + - 67 + - 67 + - 69 + - 51 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 13 + - 13 + - 19 + - 19 + - 29 + - 29 + - 40 + - 40 + - 49 + - 49 + - 61 + - 61 + - 62 + - 62 + - 58 + - 58 + - 42 + - 42 + - 12 + - 12 + - 8 + - 8 + - 4 + - 7 + - 7 + - 11 + - 11 + - 39 + - 39 + - 57 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 49 + - 49 + - 40 + - 40 + - 29 + - 29 + - 19 + - 53 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 15 + - 15 + - 16 + - 16 + - 24 + - 24 + - 36 + - 36 + - 46 + - 46 + - 63 + - 63 + - 60 + - 60 + - 56 + - 56 + - 28 + - 28 + - 10 + - 10 + - 6 + - 6 + - 5 + - 9 + - 9 + - 27 + - 27 + - 55 + - 55 + - 59 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 46 + - 46 + - 36 + - 36 + - 24 + - 24 + - 16 + - 99 + - 100 + - 101 + - 102 + - 98 + - 105 + - 106 + - 107 + - 108 + - 104 + - 111 + - 112 + - 113 + - 114 + - 110 + - 117 + - 118 + - 119 + - 120 + - 116 + - 123 + - 124 + - 125 + - 126 + - 122 + - 129 + - 130 + - 131 + - 132 + - 128 + - 135 + - 136 + - 137 + - 138 + - 134 + - 141 + - 142 + - 143 + - 144 + - 140 + - 147 + - 148 + - 149 + - 150 + - 146 k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 + - 64 + - 65 + - 75 + - 76 + - 65 + - 1 + - 64 + - 0 + - 0 + - 64 + - 0 + - 2 + - 86 + - 72 + - 90 + - 74 + - 92 + - 73 + - 91 + - 71 + - 87 + - 69 + - 85 + - 67 + - 83 + - 66 + - 82 + - 68 + - 84 + - 70 + - 86 + - 81 + - 84 + - 79 + - 82 + - 77 + - 83 + - 78 + - 85 + - 80 + - 87 + - 88 + - 93 + - 91 + - 95 + - 92 + - 96 + - 90 + - 94 + - 86 + - 89 + - 96 + - 93 + - 80 + - 77 + - 79 + - 88 + - 95 + - 94 + - 81 + - 78 + - 72 + - 66 + - 74 + - 67 + - 73 + - 69 + - 71 + - 52 + - 43 + - 44 + - 31 + - 32 + - 21 + - 22 + - 13 + - 14 + - 19 + - 20 + - 29 + - 30 + - 40 + - 41 + - 49 + - 50 + - 51 + - 52 + - 62 + - 50 + - 58 + - 41 + - 42 + - 30 + - 12 + - 20 + - 8 + - 14 + - 4 + - 7 + - 22 + - 11 + - 32 + - 39 + - 44 + - 57 + - 52 + - 61 + - 39 + - 7 + - 8 + - 42 + - 58 + - 4 + - 11 + - 57 + - 62 + - 12 + - 43 + - 40 + - 31 + - 29 + - 21 + - 19 + - 13 + - 54 + - 45 + - 47 + - 35 + - 37 + - 23 + - 25 + - 15 + - 17 + - 16 + - 18 + - 24 + - 26 + - 36 + - 38 + - 46 + - 48 + - 53 + - 54 + - 60 + - 48 + - 56 + - 38 + - 28 + - 26 + - 10 + - 18 + - 6 + - 17 + - 5 + - 9 + - 25 + - 27 + - 37 + - 55 + - 47 + - 59 + - 54 + - 63 + - 55 + - 9 + - 6 + - 28 + - 56 + - 5 + - 27 + - 59 + - 60 + - 10 + - 45 + - 36 + - 35 + - 24 + - 23 + - 16 + - 15 + - 103 + - 103 + - 103 + - 103 + - 103 + - 109 + - 109 + - 109 + - 109 + - 109 + - 115 + - 115 + - 115 + - 115 + - 115 + - 121 + - 121 + - 121 + - 121 + - 121 + - 127 + - 127 + - 127 + - 127 + - 127 + - 133 + - 133 + - 133 + - 133 + - 133 + - 139 + - 139 + - 139 + - 139 + - 139 + - 145 + - 145 + - 145 + - 145 + - 145 + - 151 + - 151 + - 151 + - 151 + - 151 legendgroup: Sensor(id=ID) name: Sensor (log) opacity: 1 @@ -575,14 +2471,464 @@ data: showlegend: true type: mesh3d x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P2yOkLu35+6/PRjq5fId8b9H9mtyqcryv7BpE/yHKfK/n+W43TsZ8L/JighgTsDtvwWRxrHDcPW/BZHGscNw9b8Gkcaxw3D1vwaRxrHDcPW/BZHGscNw9b/23XKceB7lv2yOkLu35+6/n+W43TsZ8L+waRP8hynyv0f2a3KpyvK/PRjq5fId8b/JighgTsDtv0oyfKGlUtE/STJ8oaVS0T9JMnyhpVLRP0kyfKGlUtE/STJ8oaVS0T9JMnyhpVLRv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgP0oyfKGlUtE/STJ8oaVS0T9JMnyhpVLRP0kyfKGlUtE/STJ8oaVS0T9JMnyhpVLRv8q4NyIkjPA/wjSORIjN7z+gLNkH8KzrP3ITKButauo/hc8rNBrE7T+cuvvP2B/xP/bdcpx4HuU/9t1ynHge5T/13XKceB7lP/Xdcpx4HuU/9t1ynHge5T8Fkcaxw3D1P8q4NyIkjPA/hs8rNBrE7T9yEygbrWrqP58s2QfwrOs/wjSORIjN7z+cuvvP2B/xPw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014992463600000002 + - -0.014392395300000003 + - -0.014392395300000003 + - -0.012869499600000002 + - -0.012355425950000002 + - -0.009822911000000002 + - -0.009822911000000002 + - -0.0066605612500000005 + - -0.005795627850000001 + - 0.0 + - -0.004997477680000001 + - 0.0 + - 0.0 + - -0.0046984631550000015 + - -0.0046984631550000015 + - 0.0 + - -0.003930366410000001 + - 0.0 + - -0.003726213425000001 + - 0.0 + - 0.0 + - -0.0025000000350000003 + - -0.0025000000350000003 + - -0.0021347226600000008 + - -0.0021347226600000008 + - 0.0 + - -0.0010241928500000002 + - 0.0 + - -0.0007114128200000001 + - -1.0408340850000002e-17 + - -9.553993650000002e-18 + - 0.0 + - 0.0 + - 0.0008682409300000002 + - 0.0008682409300000002 + - 0.0016630589950000004 + - 0.0 + - 0.0023612117400000003 + - 0.0026042407400000004 + - 0.0 + - 0.0026362657550000005 + - 0.0 + - 0.0 + - 0.003830222040000001 + - 0.003830222040000001 + - 0.0 + - 0.004641779140000001 + - 0.0 + - 0.004750406370000001 + - 0.0 + - 0.0049999997000000004 + - 0.006231224900000001 + - 0.006231224900000001 + - 0.00945867 + - 0.010177281500000003 + - 0.012618804000000003 + - 0.012618804000000003 + - 0.014251218750000003 + - 0.014519108850000004 + - 0.014999999100000003 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.10000000000000002 + - -0.9657858527538798 + - -1.0698117238075746 + - -1.1744780034636209 + - -1.135139450713364 + - -1.0061606083894288 + - -0.9297248721744263 + - -1.3400303787576047 + - -1.3400303787576047 + - -1.340030378757605 + - -1.340030378757605 + - -1.3400303787576047 + - -0.6599696212423953 + - -0.9657858527538798 + - -1.0061606083894288 + - -1.135139450713364 + - -1.1744780034636209 + - -1.0698117238075746 + - -0.9297248721744263 + - 0.2706693722728103 + - 0.27066937227281024 + - 0.27066937227281024 + - 0.27066937227281024 + - 0.27066937227281024 + - -0.27066937227281024 + - -0.49999999999999994 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.2706693722728103 + - 0.27066937227281024 + - 0.27066937227281024 + - 0.27066937227281024 + - 0.27066937227281024 + - -0.27066937227281024 + - 1.0342141472461202 + - 0.9938393916105712 + - 0.8648605492866359 + - 0.8255219965363791 + - 0.9301882761924253 + - 1.0702751278255738 + - 0.6599696212423953 + - 0.6599696212423953 + - 0.6599696212423952 + - 0.6599696212423952 + - 0.6599696212423953 + - 1.3400303787576047 + - 1.0342141472461202 + - 0.9301882761924254 + - 0.8255219965363791 + - 0.8648605492866358 + - 0.9938393916105712 + - 1.0702751278255738 y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPBK0dPrdC/S/5uYGtWiD87+a5dFgHPryv1tUmMm2LfO/aLAtmefW878RMfjRZfrovwAAAAAAAAAAHgNcCGSyxD/qJO7PK5W5P+ck7s8rlbm/HwNcCGSyxL8AAAAAAAAAABK0dPrdC/Q/aLAtmefW8z9bVJjJti3zP5rl0WAc+vI/5uYGtWiD8z8RMfjRZfroPwAAAAAAAPC/2zjfmpnh67/5oDtQWHTtv4Mv4tfTRfG/k2OQMjMP8r8AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/kmOQMjMP8j+EL+LX00XxP/mgO1BYdO0/2zjfmpnh6z8AAAAAAADwP9yXFgtE6Oe/MJ+kzTBS6L9KV89skqTpv8w0XD7HC+q/MzLylS756L945wMXzYLzvwAAAAAAAAAAHgNcCGSyxD/qJO7PK5W5P+ck7s8rlbm/HwNcCGSyxL8AAAAAAAAAANyXFgtE6Oc/MzLylS756D/MNFw+xwvqP0pXz2ySpOk/MJ+kzTBS6D945wMXzYLzPw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - -0.004225988315000001 + - 0.004225988315000001 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.011336243900000001 + - 0.011336243900000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0017101006600000004 + - 0.0017101006600000004 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.004330126940000001 + - 0.004330126940000001 + - -0.014847321800000002 + - 0.014847321800000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.10000000000000002 + - 0.0 + - 0.0 + - -0.0049240388000000015 + - 0.0049240388000000015 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0032139379550000006 + - 0.0032139379550000006 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.013644480700000003 + - 0.013644480700000003 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.008109612750000002 + - 0.008109612750000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.00028137136250000006 + - 0.0078714803 + - -0.008344890200000002 + - 0.013525193950000004 + - -0.013758964850000003 + - -0.0016490003100000004 + - 0.0017709132300000002 + - -0.0042973283700000016 + - 0.0043621968500000005 + - -0.004934888705000001 + - 0.004912360015000001 + - 0.014884752050000002 + - -0.014804665750000005 + - -0.0032633595150000005 + - 0.0031639754750000006 + - -6.486846850000001e-05 + - 0.011518507450000002 + - -0.011149990550000002 + - 0.004495218770000001 + - -0.0039552707250000005 + - 9.925023200000001e-18 + - -1.2528972419197584 + - -1.2195822783818868 + - -1.1860622198131296 + - -1.198660647850622 + - -1.2399669631513692 + - -0.7805661297766467 + - 0.0 + - 0.16169405372786455 + - 0.09993242098257196 + - -0.09993242098257192 + - -0.16169405372786458 + - 0.0 + - 1.2528972419197584 + - 1.2399669631513692 + - 1.198660647850622 + - 1.1860622198131296 + - 1.2195822783818868 + - 0.7805661297766467 + - -1.0 + - -0.8712890648692125 + - -0.9204522673653904 + - -1.0795477326346095 + - -1.1287109351307876 + - -1.0 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 1.0 + - 1.1287109351307874 + - 1.0795477326346097 + - 0.9204522673653904 + - 0.8712890648692125 + - 1.0 + - -0.7471027580802416 + - -0.7600330368486308 + - -0.8013393521493779 + - -0.8139377801868704 + - -0.7804177216181131 + - -1.2194338702233534 + - 0.0 + - 0.16169405372786455 + - 0.09993242098257196 + - -0.09993242098257192 + - -0.16169405372786458 + - 0.0 + - 0.7471027580802416 + - 0.7804177216181131 + - 0.8139377801868704 + - 0.8013393521493779 + - 0.7600330368486308 + - 1.2194338702233534 z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vL6pu/+M/aG/xXLTBRV+vb/7Rmss3Xaivz9DlJxmybc/1KdSf+Putz+O2HeynB6GPBhEGscOw8W/JIELwDTmqr9NApCTFJvBP04CkJMUm8E/H4ELwDTmqr8VRBrHDsOVPL6pu/+M/aG/0qdSf+Putz9BQ5ScZsm3P/dGayzddqK/xnLTBRV+vb+O2HeynB6GPEcyfKGlUsE/h/G7b4ZppT8UK1rZaAe8vxUrWtloB7y/g/G7b4ZppT9JMnyhpVKRPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPEcyfKGlUsE/h/G7b4ZppT8UK1rZaAe8vxUrWtloB7y/g/G7b4ZppT9JMnyhpVKRPL6pu/+M/aG/0qdSf+Putz9BQ5ScZsm3P/dGayzddqK/xnLTBRV+vb+O2HeynB6GPBhEGscOw8W/JIELwDTmqr9NApCTFJvBP04CkJMUm8E/H4ELwDTmqr8VRBrHDsOVPL6pu/+M/aG/xXLTBRV+vb/7Rmss3Xaivz9DlJxmybc/1KdSf+Putz+O2HeynB6GPA== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.0004754300695000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.007705580450000002 + - -0.008505494900000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.013440123200000004 + - -0.013835124650000002 + - 0.0 + - 0.00015880254800000005 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.003090666795000001 + - 0.0 + - 0.0033339664350000007 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0048939786850000005 + - 0.0 + - 0.004949130490000001 + - 0.10000000000000002 + - -3.1374891150000003e-18 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.014907522500000003 + - 0.0 + - -0.004407344015000001 + - -0.014772200600000002 + - 0.0 + - 0.0042485412200000015 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0018584636950000003 + - 0.0 + - 0.0015600122500000005 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.011641889050000001 + - -0.011019207550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.004680036755000001 + - -0.003767693415000001 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014997360100000004 + - -0.012768703700000003 + - -0.012464462200000002 + - -0.006486073150000001 + - -0.005974184350000002 + - -0.004720254240000001 + - -0.004675881190000001 + - -0.0025559673100000006 + - -0.0024436118100000007 + - 0.0008042847750000002 + - 0.0009320507750000002 + - 0.0018558396050000002 + - 0.0024128545100000004 + - 0.003788203375000001 + - 0.0038715966050000008 + - 0.004999579490000001 + - 0.009608536200000002 + - 0.0100338295 + - 0.014310590900000003 + - 0.014469133300000003 + - -1.6175736900000002e-18 + - -0.03513756391278687 + - -0.11520511047587963 + - -0.036063110038993394 + - 0.09291688273175412 + - 0.09348890169590557 + - 3.837135211762266e-17 + - -0.17001518937880244 + - -0.05253758281992507 + - 0.13754517750932607 + - 0.1375451775093261 + - -0.05253758281992504 + - 7.55019111137411e-17 + - -0.03513756391278687 + - 0.09348890169590554 + - 0.09291688273175415 + - -0.036063110038993366 + - -0.11520511047587964 + - 3.837135211762266e-17 + - 0.13533468613640506 + - 0.04182071794454872 + - -0.10948806101275138 + - -0.1094880610127514 + - 0.04182071794454869 + - 6.010067383162237e-17 + - -0.2500000000000001 + - -0.07725424859373697 + - 0.20225424859373672 + - 0.20225424859373675 + - -0.07725424859373692 + - 1.1102230246251565e-16 + - 0.13533468613640506 + - 0.04182071794454872 + - -0.10948806101275138 + - -0.1094880610127514 + - 0.04182071794454869 + - 6.010067383162237e-17 + - -0.03513756391278687 + - 0.09348890169590554 + - 0.09291688273175415 + - -0.036063110038993366 + - -0.11520511047587964 + - 3.837135211762266e-17 + - -0.17001518937880244 + - -0.05253758281992507 + - 0.13754517750932607 + - 0.1375451775093261 + - -0.05253758281992504 + - 7.55019111137411e-17 + - -0.03513756391278687 + - -0.11520511047587963 + - -0.036063110038993394 + - 0.09291688273175412 + - 0.09348890169590557 + - 3.837135211762266e-17 - color: '#2e91e5' colorscale: - - 0.0 @@ -598,17 +2944,53 @@ data: - - 1.0 - '#e71111' i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 + - 7 + - 0 + - 0 + - 0 + - 4 + - 4 + - 2 + - 6 + - 4 + - 0 + - 3 + - 7 intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 + - 0.0 + - 0.0 + - 1.0 + - 1.0 + - 0.0 + - 0.0 + - 1.0 + - 1.0 j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 + - 0 + - 7 + - 1 + - 2 + - 6 + - 7 + - 1 + - 2 + - 5 + - 5 + - 2 + - 2 k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 + - 3 + - 4 + - 2 + - 3 + - 5 + - 6 + - 5 + - 5 + - 0 + - 1 + - 7 + - 6 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -617,14 +2999,32 @@ data: showscale: false type: mesh3d x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 + - -0.5 + - 0.5 + - 0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - -0.5 z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.5 + - 0.5 + - 0.5 - facecolor: - '#fb0d0d' - '#fb0d0d' @@ -852,14 +3252,683 @@ data: - '#440154' - '#440154' i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 + - 75 + - 64 + - 2 + - 75 + - 76 + - 65 + - 65 + - 64 + - 2 + - 0 + - 1 + - 0 + - 84 + - 86 + - 86 + - 90 + - 90 + - 92 + - 92 + - 91 + - 91 + - 87 + - 87 + - 85 + - 85 + - 83 + - 83 + - 82 + - 82 + - 84 + - 94 + - 86 + - 86 + - 84 + - 84 + - 82 + - 82 + - 83 + - 83 + - 85 + - 85 + - 87 + - 87 + - 87 + - 91 + - 91 + - 92 + - 92 + - 90 + - 90 + - 94 + - 95 + - 88 + - 78 + - 79 + - 81 + - 80 + - 93 + - 96 + - 89 + - 77 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 50 + - 52 + - 52 + - 44 + - 44 + - 32 + - 32 + - 22 + - 22 + - 14 + - 14 + - 20 + - 20 + - 30 + - 30 + - 41 + - 41 + - 50 + - 57 + - 52 + - 52 + - 50 + - 50 + - 41 + - 41 + - 30 + - 30 + - 20 + - 20 + - 14 + - 14 + - 14 + - 22 + - 22 + - 32 + - 32 + - 44 + - 44 + - 57 + - 11 + - 4 + - 12 + - 58 + - 62 + - 8 + - 7 + - 39 + - 61 + - 42 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 48 + - 54 + - 54 + - 47 + - 47 + - 37 + - 37 + - 25 + - 25 + - 17 + - 17 + - 18 + - 18 + - 26 + - 26 + - 38 + - 38 + - 48 + - 59 + - 54 + - 54 + - 48 + - 48 + - 38 + - 38 + - 26 + - 26 + - 18 + - 18 + - 17 + - 17 + - 17 + - 25 + - 25 + - 37 + - 37 + - 47 + - 47 + - 59 + - 27 + - 5 + - 10 + - 56 + - 60 + - 6 + - 9 + - 55 + - 63 + - 28 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 98 + - 99 + - 100 + - 101 + - 102 + - 104 + - 105 + - 106 + - 107 + - 108 + - 110 + - 111 + - 112 + - 113 + - 114 + - 116 + - 117 + - 118 + - 119 + - 120 + - 122 + - 123 + - 124 + - 125 + - 126 + - 128 + - 129 + - 130 + - 131 + - 132 + - 134 + - 135 + - 136 + - 137 + - 138 + - 140 + - 141 + - 142 + - 143 + - 144 + - 146 + - 147 + - 148 + - 149 + - 150 j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 + - 76 + - 76 + - 3 + - 3 + - 3 + - 3 + - 1 + - 1 + - 75 + - 75 + - 3 + - 3 + - 70 + - 70 + - 72 + - 72 + - 74 + - 74 + - 73 + - 73 + - 71 + - 71 + - 69 + - 69 + - 67 + - 67 + - 66 + - 66 + - 68 + - 68 + - 89 + - 89 + - 81 + - 81 + - 79 + - 79 + - 77 + - 77 + - 78 + - 78 + - 80 + - 80 + - 88 + - 93 + - 93 + - 95 + - 95 + - 96 + - 96 + - 94 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 97 + - 68 + - 68 + - 66 + - 66 + - 67 + - 67 + - 69 + - 51 + - 51 + - 43 + - 43 + - 31 + - 31 + - 21 + - 21 + - 13 + - 13 + - 19 + - 19 + - 29 + - 29 + - 40 + - 40 + - 49 + - 49 + - 61 + - 61 + - 62 + - 62 + - 58 + - 58 + - 42 + - 42 + - 12 + - 12 + - 8 + - 8 + - 4 + - 7 + - 7 + - 11 + - 11 + - 39 + - 39 + - 57 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 34 + - 49 + - 49 + - 40 + - 40 + - 29 + - 29 + - 19 + - 53 + - 53 + - 45 + - 45 + - 35 + - 35 + - 23 + - 23 + - 15 + - 15 + - 16 + - 16 + - 24 + - 24 + - 36 + - 36 + - 46 + - 46 + - 63 + - 63 + - 60 + - 60 + - 56 + - 56 + - 28 + - 28 + - 10 + - 10 + - 6 + - 6 + - 5 + - 9 + - 9 + - 27 + - 27 + - 55 + - 55 + - 59 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 33 + - 46 + - 46 + - 36 + - 36 + - 24 + - 24 + - 16 + - 99 + - 100 + - 101 + - 102 + - 98 + - 105 + - 106 + - 107 + - 108 + - 104 + - 111 + - 112 + - 113 + - 114 + - 110 + - 117 + - 118 + - 119 + - 120 + - 116 + - 123 + - 124 + - 125 + - 126 + - 122 + - 129 + - 130 + - 131 + - 132 + - 128 + - 135 + - 136 + - 137 + - 138 + - 134 + - 141 + - 142 + - 143 + - 144 + - 140 + - 147 + - 148 + - 149 + - 150 + - 146 k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 + - 64 + - 65 + - 75 + - 76 + - 65 + - 1 + - 64 + - 0 + - 0 + - 64 + - 0 + - 2 + - 86 + - 72 + - 90 + - 74 + - 92 + - 73 + - 91 + - 71 + - 87 + - 69 + - 85 + - 67 + - 83 + - 66 + - 82 + - 68 + - 84 + - 70 + - 86 + - 81 + - 84 + - 79 + - 82 + - 77 + - 83 + - 78 + - 85 + - 80 + - 87 + - 88 + - 93 + - 91 + - 95 + - 92 + - 96 + - 90 + - 94 + - 86 + - 89 + - 96 + - 93 + - 80 + - 77 + - 79 + - 88 + - 95 + - 94 + - 81 + - 78 + - 72 + - 66 + - 74 + - 67 + - 73 + - 69 + - 71 + - 52 + - 43 + - 44 + - 31 + - 32 + - 21 + - 22 + - 13 + - 14 + - 19 + - 20 + - 29 + - 30 + - 40 + - 41 + - 49 + - 50 + - 51 + - 52 + - 62 + - 50 + - 58 + - 41 + - 42 + - 30 + - 12 + - 20 + - 8 + - 14 + - 4 + - 7 + - 22 + - 11 + - 32 + - 39 + - 44 + - 57 + - 52 + - 61 + - 39 + - 7 + - 8 + - 42 + - 58 + - 4 + - 11 + - 57 + - 62 + - 12 + - 43 + - 40 + - 31 + - 29 + - 21 + - 19 + - 13 + - 54 + - 45 + - 47 + - 35 + - 37 + - 23 + - 25 + - 15 + - 17 + - 16 + - 18 + - 24 + - 26 + - 36 + - 38 + - 46 + - 48 + - 53 + - 54 + - 60 + - 48 + - 56 + - 38 + - 28 + - 26 + - 10 + - 18 + - 6 + - 17 + - 5 + - 9 + - 25 + - 27 + - 37 + - 55 + - 47 + - 59 + - 54 + - 63 + - 55 + - 9 + - 6 + - 28 + - 56 + - 5 + - 27 + - 59 + - 60 + - 10 + - 45 + - 36 + - 35 + - 24 + - 23 + - 16 + - 15 + - 103 + - 103 + - 103 + - 103 + - 103 + - 109 + - 109 + - 109 + - 109 + - 109 + - 115 + - 115 + - 115 + - 115 + - 115 + - 121 + - 121 + - 121 + - 121 + - 121 + - 127 + - 127 + - 127 + - 127 + - 127 + - 133 + - 133 + - 133 + - 133 + - 133 + - 139 + - 139 + - 139 + - 139 + - 139 + - 145 + - 145 + - 145 + - 145 + - 145 + - 151 + - 151 + - 151 + - 151 + - 151 legendgroup: Sensor(id=ID) name: Sensor (linear) opacity: 1 @@ -867,14 +3936,464 @@ data: showlegend: true type: mesh3d x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P+gO76zh1u+/5iMtI/Mp8L8E13vz12jwvx1HZ4A0UfC/gMe2r7MD8L/PkoAni6vvvxmZey4NnvG/GZl7Lg2e8b8ZmXsuDZ7xvxmZey4NnvG/GZl7Lg2e8b/PzQij5cPsv+gO76zh1u+/gMe2r7MD8L8dR2eANFHwvwTXe/PXaPC/5iMtI/Mp8L/PkoAni6vvv4uRuefS4Kk/ipG559LgqT+Jkbnn0uCpP4mRuefS4Kk/ipG559LgqT+Kkbnn0uCpv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgP4uRuefS4Kk/ipG559LgqT+Jkbnn0uCpP4mRuefS4Kk/ipG559LgqT+Kkbnn0uCpv4x4iCmPFPA/AXGSoJj47z/GcTH/ll3vP/hRCBlQLu8/NbiluRms7z+Ytj9sOirwP8/NCKPlw+w/z80Io+XD7D/PzQij5cPsP8/NCKPlw+w/z80Io+XD7D8ZmXsuDZ7xP4x4iCmPFPA/NbiluRms7z/4UQgZUC7vP8ZxMf+WXe8/AXGSoJj47z+Ytj9sOirwPw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014992463600000002 + - -0.014392395300000003 + - -0.014392395300000003 + - -0.012869499600000002 + - -0.012355425950000002 + - -0.009822911000000002 + - -0.009822911000000002 + - -0.0066605612500000005 + - -0.005795627850000001 + - 0.0 + - -0.004997477680000001 + - 0.0 + - 0.0 + - -0.0046984631550000015 + - -0.0046984631550000015 + - 0.0 + - -0.003930366410000001 + - 0.0 + - -0.003726213425000001 + - 0.0 + - 0.0 + - -0.0025000000350000003 + - -0.0025000000350000003 + - -0.0021347226600000008 + - -0.0021347226600000008 + - 0.0 + - -0.0010241928500000002 + - 0.0 + - -0.0007114128200000001 + - -1.0408340850000002e-17 + - -9.553993650000002e-18 + - 0.0 + - 0.0 + - 0.0008682409300000002 + - 0.0008682409300000002 + - 0.0016630589950000004 + - 0.0 + - 0.0023612117400000003 + - 0.0026042407400000004 + - 0.0 + - 0.0026362657550000005 + - 0.0 + - 0.0 + - 0.003830222040000001 + - 0.003830222040000001 + - 0.0 + - 0.004641779140000001 + - 0.0 + - 0.004750406370000001 + - 0.0 + - 0.0049999997000000004 + - 0.006231224900000001 + - 0.006231224900000001 + - 0.00945867 + - 0.010177281500000003 + - 0.012618804000000003 + - 0.012618804000000003 + - 0.014251218750000003 + - 0.014519108850000004 + - 0.014999999100000003 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.10000000000000002 + - -0.9949806573499389 + - -1.010241639525924 + - -1.0255965720256777 + - -1.019825460029501 + - -1.0009037841632278 + - -0.9896903773811462 + - -1.1010867896780552 + - -1.1010867896780552 + - -1.1010867896780552 + - -1.1010867896780552 + - -1.1010867896780552 + - -0.8989132103219449 + - -0.9949806573499389 + - -1.0009037841632278 + - -1.019825460029501 + - -1.0255965720256777 + - -1.010241639525924 + - -0.9896903773811462 + - 0.050543394839027554 + - 0.05054339483902755 + - 0.05054339483902754 + - 0.05054339483902754 + - 0.05054339483902755 + - -0.05054339483902755 + - -0.49999999999999994 + - -0.5 + - -0.5 + - -0.5 + - -0.5 + - 0.5 + - 0.050543394839027554 + - 0.05054339483902755 + - 0.05054339483902754 + - 0.05054339483902754 + - 0.05054339483902755 + - -0.05054339483902755 + - 1.005019342650061 + - 0.9990962158367723 + - 0.9801745399704991 + - 0.9744034279743223 + - 0.9897583604740762 + - 1.0103096226188537 + - 0.8989132103219449 + - 0.8989132103219449 + - 0.8989132103219449 + - 0.8989132103219449 + - 0.8989132103219449 + - 1.1010867896780552 + - 1.005019342650061 + - 0.9897583604740762 + - 0.9744034279743223 + - 0.9801745399704991 + - 0.9990962158367723 + - 1.0103096226188537 y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPI5qty73l/C/pR14V/KD8L9oMXvzzW/wv5odn/dfd/C/k5kiHjKQ8L+wn9T5SPjuvwAAAAAAAAAAOsnC9pScqD9XEkqQ8mueP1MSSpDya56/OsnC9pScqL8AAAAAAAAAAI5qty73l/A/k5kiHjKQ8D+aHZ/3X3fwP2gxe/PNb/A/pR14V/KD8D+wn9T5SPjuPwAAAAAAAPC/tulJWBs777+31741UIbvvyWUIOXXPPC/JQvbU3Ji8L8AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/JQvbU3Ji8D8llCDl1zzwP7fXvjVQhu8/tulJWBs77z8AAAAAAADwP+QqkaIR0O6/2sy6w5vf7r/MxMEQQBHvvy+dCRlkIO+/tcQPURv47r8osBWD24PwvwAAAAAAAAAAOsnC9pScqD9XEkqQ8mueP1MSSpDya56/OsnC9pScqL8AAAAAAAAAAOQqkaIR0O4/tcQPURv47j8vnQkZZCDvP8zEwRBAEe8/2sy6w5vf7j8osBWD24PwPw== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.07401923550000002 + - -0.004225988315000001 + - 0.004225988315000001 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.011336243900000001 + - 0.011336243900000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0017101006600000004 + - 0.0017101006600000004 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.004330126940000001 + - 0.004330126940000001 + - -0.014847321800000002 + - 0.014847321800000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.10000000000000002 + - 0.0 + - 0.0 + - -0.0049240388000000015 + - 0.0049240388000000015 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.0032139379550000006 + - 0.0032139379550000006 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.07401923550000002 + - 0.0 + - 0.0 + - -0.013644480700000003 + - 0.013644480700000003 + - 0.07401923550000002 + - 0.07401923550000002 + - -0.008109612750000002 + - 0.008109612750000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.00028137136250000006 + - 0.0078714803 + - -0.008344890200000002 + - 0.013525193950000004 + - -0.013758964850000003 + - -0.0016490003100000004 + - 0.0017709132300000002 + - -0.0042973283700000016 + - 0.0043621968500000005 + - -0.004934888705000001 + - 0.004912360015000001 + - 0.014884752050000002 + - -0.014804665750000005 + - -0.0032633595150000005 + - 0.0031639754750000006 + - -6.486846850000001e-05 + - 0.011518507450000002 + - -0.011149990550000002 + - 0.004495218770000001 + - -0.0039552707250000005 + - 9.925023200000001e-18 + - -1.0371009659635635 + - -1.0322135369077412 + - -1.0272960196480998 + - -1.0291442558971995 + - -1.035204045978024 + - -0.9678082351210744 + - 0.0 + - 0.048069625017335985 + - 0.0297086620871759 + - -0.029708662087175885 + - -0.048069625017335985 + - 0.0 + - 1.0371009659635635 + - 1.035204045978024 + - 1.0291442558971995 + - 1.0272960196480998 + - 1.0322135369077412 + - 0.9678082351210744 + - -1.0 + - -0.975965187491332 + - -0.9851456689564121 + - -1.014854331043588 + - -1.024034812508668 + - -1.0 + - 0.0 + - 0.23776412907378838 + - 0.1469463130731183 + - -0.14694631307311826 + - -0.2377641290737884 + - 0.0 + - 1.0 + - 1.024034812508668 + - 1.014854331043588 + - 0.9851456689564121 + - 0.975965187491332 + - 1.0 + - -0.9628990340364365 + - -0.9647959540219759 + - -0.9708557441028005 + - -0.9727039803519001 + - -0.9677864630922587 + - -1.0321917648789256 + - 0.0 + - 0.048069625017335985 + - 0.0297086620871759 + - -0.029708662087175885 + - -0.048069625017335985 + - 0.0 + - 0.9628990340364365 + - 0.9677864630922587 + - 0.9727039803519001 + - 0.9708557441028005 + - 0.9647959540219759 + - 1.0321917648789256 z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vD5M2x82HXW/WmBbIYBOkb+NiS6Tlqt1v9Wbt7Wz6os/tA+E5rIWjD83nt1ez/VZPI2RuefS4Km/ca2wjLv8j78a9AhXmO+kPxv0CFeY76Q/a62wjLv8j7+Kkbnn0uB5PD5M2x82HXW/sQ+E5rIWjD/Xm7e1s+qLP4mJLpOWq3W/WmBbIYBOkb83nt1ez/VZPIeRuefS4Jk/V62wjLv8fz8g9AhXmO+UvyH0CFeY75S/Ua2wjLv8fz+Kkbnn0uBpPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPIeRuefS4Jk/V62wjLv8fz8g9AhXmO+UvyH0CFeY75S/Ua2wjLv8fz+Kkbnn0uBpPD5M2x82HXW/sQ+E5rIWjD/Xm7e1s+qLP4mJLpOWq3W/WmBbIYBOkb83nt1ez/VZPI2RuefS4Km/ca2wjLv8j78a9AhXmO+kPxv0CFeY76Q/a62wjLv8j7+Kkbnn0uB5PD5M2x82HXW/WmBbIYBOkb+NiS6Tlqt1v9Wbt7Wz6os/tA+E5rIWjD83nt1ez/VZPA== - dtype: f8 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.0004754300695000001 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.007705580450000002 + - -0.008505494900000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.013440123200000004 + - -0.013835124650000002 + - 0.0 + - 0.00015880254800000005 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.003090666795000001 + - 0.0 + - 0.0033339664350000007 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0048939786850000005 + - 0.0 + - 0.004949130490000001 + - 0.10000000000000002 + - -3.1374891150000003e-18 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.014907522500000003 + - 0.0 + - -0.004407344015000001 + - -0.014772200600000002 + - 0.0 + - 0.0042485412200000015 + - 0.0 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.0 + - -0.0018584636950000003 + - 0.0 + - 0.0015600122500000005 + - 0.0 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.011641889050000001 + - -0.011019207550000002 + - 0.07401923550000002 + - 0.07401923550000002 + - 0.004680036755000001 + - -0.003767693415000001 + - 0.07401923550000002 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - -0.014997360100000004 + - -0.012768703700000003 + - -0.012464462200000002 + - -0.006486073150000001 + - -0.005974184350000002 + - -0.004720254240000001 + - -0.004675881190000001 + - -0.0025559673100000006 + - -0.0024436118100000007 + - 0.0008042847750000002 + - 0.0009320507750000002 + - 0.0018558396050000002 + - 0.0024128545100000004 + - 0.003788203375000001 + - 0.0038715966050000008 + - 0.004999579490000001 + - 0.009608536200000002 + - 0.0100338295 + - 0.014310590900000003 + - 0.014469133300000003 + - -1.6175736900000002e-18 + - -0.005154811309426908 + - -0.016901018176980954 + - -0.005290592368427116 + - 0.013631252272672182 + - 0.013715169582162769 + - 5.629220066162395e-18 + - -0.05054339483902757 + - -0.015618767958662546 + - 0.04089046537817627 + - 0.040890465378176276 + - -0.015618767958662535 + - 2.2445776277203476e-17 + - -0.005154811309426908 + - 0.013715169582162763 + - 0.013631252272672185 + - -0.005290592368427113 + - -0.016901018176980954 + - 5.629220066162395e-18 + - 0.025271697419513763 + - 0.00780938397933125 + - -0.020445232689088155 + - -0.02044523268908816 + - 0.007809383979331245 + - 1.1222888138601738e-17 + - -0.2500000000000001 + - -0.07725424859373697 + - 0.20225424859373672 + - 0.20225424859373675 + - -0.07725424859373692 + - 1.1102230246251565e-16 + - 0.025271697419513763 + - 0.00780938397933125 + - -0.020445232689088155 + - -0.02044523268908816 + - 0.007809383979331245 + - 1.1222888138601738e-17 + - -0.005154811309426908 + - 0.013715169582162763 + - 0.013631252272672185 + - -0.005290592368427113 + - -0.016901018176980954 + - 5.629220066162395e-18 + - -0.05054339483902757 + - -0.015618767958662546 + - 0.04089046537817627 + - 0.040890465378176276 + - -0.015618767958662535 + - 2.2445776277203476e-17 + - -0.005154811309426908 + - -0.016901018176980954 + - -0.005290592368427116 + - 0.013631252272672182 + - 0.013715169582162769 + - 5.629220066162395e-18 layout: legend: itemsizing: constant From 4087c334525caad82df96958f1eccba2d53876a9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 18 May 2025 08:54:18 +0000 Subject: [PATCH 169/211] style: pre-commit fixes --- tests/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index c5ec80814..e468cccb8 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,8 +1,8 @@ from __future__ import annotations +import base64 import re import warnings -import base64 import numpy as np import pytest From b9526eed928b95331a37c42868c9d265149f5437 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sun, 18 May 2025 11:18:19 +0200 Subject: [PATCH 170/211] reencode bdata --- tests/conftest.py | 4 +- .../test_field_coloring_subplot.yml | 4900 +---------------- .../test_pixel_field_color_scales.yml | 4900 +---------------- .../test_pixel_field_directional_symbols.yml | 4538 +-------------- .../test_pixel_field_null_values.yml | 3482 +----------- .../test_pixel_field_sizing_modes.yml | 3675 +------------ 6 files changed, 427 insertions(+), 21072 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index e468cccb8..a5c4551fe 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -41,7 +41,9 @@ def _normalize_bdata(obj): # Always use little-endian for comparison dtype_le = dtype.newbyteorder("<") arr = np.frombuffer(b, dtype=dtype_le) - return arr.tolist() + # Re-encode to bdata for platform-independent storage + bdata_str = base64.b64encode(arr.astype(dtype_le).tobytes()).decode("ascii") + return {"bdata": bdata_str, "dtype": obj["dtype"]} return {k: _normalize_bdata(v) for k, v in obj.items()} if isinstance(obj, list): return [_normalize_bdata(i) for i in obj] diff --git a/tests/test_display_plotly/test_field_coloring_subplot.yml b/tests/test_display_plotly/test_field_coloring_subplot.yml index a24850dd7..77a5ed01a 100644 --- a/tests/test_display_plotly/test_field_coloring_subplot.yml +++ b/tests/test_display_plotly/test_field_coloring_subplot.yml @@ -14,53 +14,17 @@ data: - - 1.0 - '#e71111' i: - - 7 - - 0 - - 0 - - 0 - - 4 - - 4 - - 2 - - 6 - - 4 - - 0 - - 3 - - 7 + bdata: BwAAAAQEAgYEAAMH + dtype: i1 intensity: - - 0.0 - - 0.0 - - 1.0 - - 1.0 - - 0.0 - - 0.0 - - 1.0 - - 1.0 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 j: - - 0 - - 7 - - 1 - - 2 - - 6 - - 7 - - 1 - - 2 - - 5 - - 5 - - 2 - - 2 + bdata: AAcBAgYHAQIFBQIC + dtype: i1 k: - - 3 - - 4 - - 2 - - 3 - - 5 - - 6 - - 5 - - 5 - - 0 - - 1 - - 7 - - 6 + bdata: AwQCAwUGBQUAAQcG + dtype: i1 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -69,32 +33,14 @@ data: showscale: false type: mesh3d x: - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 y: - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 z: - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 - facecolor: - '#e15f99' - '#e15f99' @@ -322,683 +268,14 @@ data: - '#440154' - '#440154' i: - - 75 - - 64 - - 2 - - 75 - - 76 - - 65 - - 65 - - 64 - - 2 - - 0 - - 1 - - 0 - - 84 - - 86 - - 86 - - 90 - - 90 - - 92 - - 92 - - 91 - - 91 - - 87 - - 87 - - 85 - - 85 - - 83 - - 83 - - 82 - - 82 - - 84 - - 94 - - 86 - - 86 - - 84 - - 84 - - 82 - - 82 - - 83 - - 83 - - 85 - - 85 - - 87 - - 87 - - 87 - - 91 - - 91 - - 92 - - 92 - - 90 - - 90 - - 94 - - 95 - - 88 - - 78 - - 79 - - 81 - - 80 - - 93 - - 96 - - 89 - - 77 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 50 - - 52 - - 52 - - 44 - - 44 - - 32 - - 32 - - 22 - - 22 - - 14 - - 14 - - 20 - - 20 - - 30 - - 30 - - 41 - - 41 - - 50 - - 57 - - 52 - - 52 - - 50 - - 50 - - 41 - - 41 - - 30 - - 30 - - 20 - - 20 - - 14 - - 14 - - 14 - - 22 - - 22 - - 32 - - 32 - - 44 - - 44 - - 57 - - 11 - - 4 - - 12 - - 58 - - 62 - - 8 - - 7 - - 39 - - 61 - - 42 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 48 - - 54 - - 54 - - 47 - - 47 - - 37 - - 37 - - 25 - - 25 - - 17 - - 17 - - 18 - - 18 - - 26 - - 26 - - 38 - - 38 - - 48 - - 59 - - 54 - - 54 - - 48 - - 48 - - 38 - - 38 - - 26 - - 26 - - 18 - - 18 - - 17 - - 17 - - 17 - - 25 - - 25 - - 37 - - 37 - - 47 - - 47 - - 59 - - 27 - - 5 - - 10 - - 56 - - 60 - - 6 - - 9 - - 55 - - 63 - - 28 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 98 - - 99 - - 100 - - 101 - - 102 - - 104 - - 105 - - 106 - - 107 - - 108 - - 110 - - 111 - - 112 - - 113 - - 114 - - 116 - - 117 - - 118 - - 119 - - 120 - - 122 - - 123 - - 124 - - 125 - - 126 - - 128 - - 129 - - 130 - - 131 - - 132 - - 134 - - 135 - - 136 - - 137 - - 138 - - 140 - - 141 - - 142 - - 143 - - 144 - - 146 - - 147 - - 148 - - 149 - - 150 + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 j: - - 76 - - 76 - - 3 - - 3 - - 3 - - 3 - - 1 - - 1 - - 75 - - 75 - - 3 - - 3 - - 70 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 71 - - 71 - - 69 - - 69 - - 67 - - 67 - - 66 - - 66 - - 68 - - 68 - - 89 - - 89 - - 81 - - 81 - - 79 - - 79 - - 77 - - 77 - - 78 - - 78 - - 80 - - 80 - - 88 - - 93 - - 93 - - 95 - - 95 - - 96 - - 96 - - 94 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 68 - - 68 - - 66 - - 66 - - 67 - - 67 - - 69 - - 51 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 13 - - 13 - - 19 - - 19 - - 29 - - 29 - - 40 - - 40 - - 49 - - 49 - - 61 - - 61 - - 62 - - 62 - - 58 - - 58 - - 42 - - 42 - - 12 - - 12 - - 8 - - 8 - - 4 - - 7 - - 7 - - 11 - - 11 - - 39 - - 39 - - 57 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 49 - - 49 - - 40 - - 40 - - 29 - - 29 - - 19 - - 53 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 15 - - 15 - - 16 - - 16 - - 24 - - 24 - - 36 - - 36 - - 46 - - 46 - - 63 - - 63 - - 60 - - 60 - - 56 - - 56 - - 28 - - 28 - - 10 - - 10 - - 6 - - 6 - - 5 - - 9 - - 9 - - 27 - - 27 - - 55 - - 55 - - 59 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 46 - - 46 - - 36 - - 36 - - 24 - - 24 - - 16 - - 99 - - 100 - - 101 - - 102 - - 98 - - 105 - - 106 - - 107 - - 108 - - 104 - - 111 - - 112 - - 113 - - 114 - - 110 - - 117 - - 118 - - 119 - - 120 - - 116 - - 123 - - 124 - - 125 - - 126 - - 122 - - 129 - - 130 - - 131 - - 132 - - 128 - - 135 - - 136 - - 137 - - 138 - - 134 - - 141 - - 142 - - 143 - - 144 - - 140 - - 147 - - 148 - - 149 - - 150 - - 146 + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 k: - - 64 - - 65 - - 75 - - 76 - - 65 - - 1 - - 64 - - 0 - - 0 - - 64 - - 0 - - 2 - - 86 - - 72 - - 90 - - 74 - - 92 - - 73 - - 91 - - 71 - - 87 - - 69 - - 85 - - 67 - - 83 - - 66 - - 82 - - 68 - - 84 - - 70 - - 86 - - 81 - - 84 - - 79 - - 82 - - 77 - - 83 - - 78 - - 85 - - 80 - - 87 - - 88 - - 93 - - 91 - - 95 - - 92 - - 96 - - 90 - - 94 - - 86 - - 89 - - 96 - - 93 - - 80 - - 77 - - 79 - - 88 - - 95 - - 94 - - 81 - - 78 - - 72 - - 66 - - 74 - - 67 - - 73 - - 69 - - 71 - - 52 - - 43 - - 44 - - 31 - - 32 - - 21 - - 22 - - 13 - - 14 - - 19 - - 20 - - 29 - - 30 - - 40 - - 41 - - 49 - - 50 - - 51 - - 52 - - 62 - - 50 - - 58 - - 41 - - 42 - - 30 - - 12 - - 20 - - 8 - - 14 - - 4 - - 7 - - 22 - - 11 - - 32 - - 39 - - 44 - - 57 - - 52 - - 61 - - 39 - - 7 - - 8 - - 42 - - 58 - - 4 - - 11 - - 57 - - 62 - - 12 - - 43 - - 40 - - 31 - - 29 - - 21 - - 19 - - 13 - - 54 - - 45 - - 47 - - 35 - - 37 - - 23 - - 25 - - 15 - - 17 - - 16 - - 18 - - 24 - - 26 - - 36 - - 38 - - 46 - - 48 - - 53 - - 54 - - 60 - - 48 - - 56 - - 38 - - 28 - - 26 - - 10 - - 18 - - 6 - - 17 - - 5 - - 9 - - 25 - - 27 - - 37 - - 55 - - 47 - - 59 - - 54 - - 63 - - 55 - - 9 - - 6 - - 28 - - 56 - - 5 - - 27 - - 59 - - 60 - - 10 - - 45 - - 36 - - 35 - - 24 - - 23 - - 16 - - 15 - - 103 - - 103 - - 103 - - 103 - - 103 - - 109 - - 109 - - 109 - - 109 - - 109 - - 115 - - 115 - - 115 - - 115 - - 115 - - 121 - - 121 - - 121 - - 121 - - 121 - - 127 - - 127 - - 127 - - 127 - - 127 - - 133 - - 133 - - 133 - - 133 - - 133 - - 139 - - 139 - - 139 - - 139 - - 139 - - 145 - - 145 - - 145 - - 145 - - 145 - - 151 - - 151 - - 151 - - 151 - - 151 + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 legendgroup: Sensor(id=ID) name: Sensor (H) opacity: 1 @@ -1006,464 +283,14 @@ data: showlegend: true type: mesh3d x: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014992463600000002 - - -0.014392395300000003 - - -0.014392395300000003 - - -0.012869499600000002 - - -0.012355425950000002 - - -0.009822911000000002 - - -0.009822911000000002 - - -0.0066605612500000005 - - -0.005795627850000001 - - 0.0 - - -0.004997477680000001 - - 0.0 - - 0.0 - - -0.0046984631550000015 - - -0.0046984631550000015 - - 0.0 - - -0.003930366410000001 - - 0.0 - - -0.003726213425000001 - - 0.0 - - 0.0 - - -0.0025000000350000003 - - -0.0025000000350000003 - - -0.0021347226600000008 - - -0.0021347226600000008 - - 0.0 - - -0.0010241928500000002 - - 0.0 - - -0.0007114128200000001 - - -1.0408340850000002e-17 - - -9.553993650000002e-18 - - 0.0 - - 0.0 - - 0.0008682409300000002 - - 0.0008682409300000002 - - 0.0016630589950000004 - - 0.0 - - 0.0023612117400000003 - - 0.0026042407400000004 - - 0.0 - - 0.0026362657550000005 - - 0.0 - - 0.0 - - 0.003830222040000001 - - 0.003830222040000001 - - 0.0 - - 0.004641779140000001 - - 0.0 - - 0.004750406370000001 - - 0.0 - - 0.0049999997000000004 - - 0.006231224900000001 - - 0.006231224900000001 - - 0.00945867 - - 0.010177281500000003 - - 0.012618804000000003 - - 0.012618804000000003 - - 0.014251218750000003 - - 0.014519108850000004 - - 0.014999999100000003 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.10000000000000002 - - -0.9257545044462104 - - -1.151493064908857 - - -1.3786213269384155 - - -1.2932557522157282 - - -1.01336866353838 - - -0.8475013375904817 - - -1.5 - - -1.5 - - -1.5 - - -1.5 - - -1.5 - - -0.5 - - -0.9257545044462104 - - -1.01336866353838 - - -1.2932557522157282 - - -1.3786213269384155 - - -1.151493064908857 - - -0.8475013375904817 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - -0.49999999999999994 - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - 1.0742454955537897 - - 0.9866313364616199 - - 0.7067442477842719 - - 0.6213786730615845 - - 0.8485069350911429 - - 1.1524986624095181 - - 0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 - - 1.5 - - 1.0742454955537897 - - 0.8485069350911429 - - 0.6213786730615845 - - 0.7067442477842718 - - 0.9866313364616199 - - 1.1524986624095181 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== + dtype: f8 y: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - -0.004225988315000001 - - 0.004225988315000001 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.011336243900000001 - - 0.011336243900000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0017101006600000004 - - 0.0017101006600000004 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.004330126940000001 - - 0.004330126940000001 - - -0.014847321800000002 - - 0.014847321800000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.10000000000000002 - - 0.0 - - 0.0 - - -0.0049240388000000015 - - 0.0049240388000000015 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0032139379550000006 - - 0.0032139379550000006 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.013644480700000003 - - 0.013644480700000003 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.008109612750000002 - - 0.008109612750000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.00028137136250000006 - - 0.0078714803 - - -0.008344890200000002 - - 0.013525193950000004 - - -0.013758964850000003 - - -0.0016490003100000004 - - 0.0017709132300000002 - - -0.0042973283700000016 - - 0.0043621968500000005 - - -0.004934888705000001 - - 0.004912360015000001 - - 0.014884752050000002 - - -0.014804665750000005 - - -0.0032633595150000005 - - 0.0031639754750000006 - - -6.486846850000001e-05 - - 0.011518507450000002 - - -0.011149990550000002 - - 0.004495218770000001 - - -0.0039552707250000005 - - 9.925023200000001e-18 - - -1.548792898897935 - - -1.4764986529115414 - - -1.4037593459363646 - - -1.4310982278939868 - - -1.5207338931333951 - - -0.5238233962453553 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 1.548792898897935 - - 1.5207338931333951 - - 1.4310982278939868 - - 1.4037593459363646 - - 1.4764986529115414 - - 0.5238233962453553 - - -1.0 - - -0.7622358709262116 - - -0.8530536869268817 - - -1.1469463130731183 - - -1.2377641290737884 - - -1.0 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 1.0 - - 1.2377641290737884 - - 1.1469463130731183 - - 0.8530536869268818 - - 0.7622358709262116 - - 1.0 - - -0.45120710110206497 - - -0.47926610686660476 - - -0.5689017721060132 - - -0.5962406540636354 - - -0.5235013470884586 - - -1.4761766037546447 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 0.45120710110206497 - - 0.5235013470884586 - - 0.5962406540636354 - - 0.5689017721060132 - - 0.47926610686660476 - - 1.4761766037546447 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== + dtype: f8 z: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.0004754300695000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.007705580450000002 - - -0.008505494900000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.013440123200000004 - - -0.013835124650000002 - - 0.0 - - 0.00015880254800000005 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.003090666795000001 - - 0.0 - - 0.0033339664350000007 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0048939786850000005 - - 0.0 - - 0.004949130490000001 - - 0.10000000000000002 - - -3.1374891150000003e-18 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.014907522500000003 - - 0.0 - - -0.004407344015000001 - - -0.014772200600000002 - - 0.0 - - 0.0042485412200000015 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0018584636950000003 - - 0.0 - - 0.0015600122500000005 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.011641889050000001 - - -0.011019207550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.004680036755000001 - - -0.003767693415000001 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014997360100000004 - - -0.012768703700000003 - - -0.012464462200000002 - - -0.006486073150000001 - - -0.005974184350000002 - - -0.004720254240000001 - - -0.004675881190000001 - - -0.0025559673100000006 - - -0.0024436118100000007 - - 0.0008042847750000002 - - 0.0009320507750000002 - - 0.0018558396050000002 - - 0.0024128545100000004 - - 0.003788203375000001 - - 0.0038715966050000008 - - 0.004999579490000001 - - 0.009608536200000002 - - 0.0100338295 - - 0.014310590900000003 - - 0.014469133300000003 - - -1.6175736900000002e-18 - - -0.0762493312047592 - - -0.24999777010606963 - - -0.0782577878324744 - - 0.20163179734122239 - - 0.2028730918020804 - - 8.326672684688674e-17 - - -0.2500000000000001 - - -0.07725424859373697 - - 0.20225424859373672 - - 0.20225424859373675 - - -0.07725424859373692 - - 1.1102230246251565e-16 - - -0.0762493312047592 - - 0.20287309180208038 - - 0.20163179734122244 - - -0.07825778783247435 - - -0.24999777010606966 - - 8.326672684688674e-17 - - 0.2499999999999999 - - 0.07725424859373675 - - -0.20225424859373695 - - -0.20225424859373697 - - 0.0772542485937367 - - 1.1102230246251565e-16 - - -0.2500000000000001 - - -0.07725424859373697 - - 0.20225424859373672 - - 0.20225424859373675 - - -0.07725424859373692 - - 1.1102230246251565e-16 - - 0.2499999999999999 - - 0.07725424859373675 - - -0.20225424859373695 - - -0.20225424859373697 - - 0.0772542485937367 - - 1.1102230246251565e-16 - - -0.0762493312047592 - - 0.20287309180208038 - - 0.20163179734122244 - - -0.07825778783247435 - - -0.24999777010606966 - - 8.326672684688674e-17 - - -0.2500000000000001 - - -0.07725424859373697 - - 0.20225424859373672 - - 0.20225424859373675 - - -0.07725424859373692 - - 1.1102230246251565e-16 - - -0.0762493312047592 - - -0.24999777010606963 - - -0.0782577878324744 - - 0.20163179734122239 - - 0.2028730918020804 - - 8.326672684688674e-17 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== + dtype: f8 - color: '#2e91e5' colorscale: - - 0.0 @@ -1479,53 +306,17 @@ data: - - 1.0 - '#e71111' i: - - 7 - - 0 - - 0 - - 0 - - 4 - - 4 - - 2 - - 6 - - 4 - - 0 - - 3 - - 7 + bdata: BwAAAAQEAgYEAAMH + dtype: i1 intensity: - - 0.0 - - 0.0 - - 1.0 - - 1.0 - - 0.0 - - 0.0 - - 1.0 - - 1.0 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 j: - - 0 - - 7 - - 1 - - 2 - - 6 - - 7 - - 1 - - 2 - - 5 - - 5 - - 2 - - 2 + bdata: AAcBAgYHAQIFBQIC + dtype: i1 k: - - 3 - - 4 - - 2 - - 3 - - 5 - - 6 - - 5 - - 5 - - 0 - - 1 - - 7 - - 6 + bdata: AwQCAwUGBQUAAQcG + dtype: i1 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -1534,32 +325,14 @@ data: showscale: false type: mesh3d x: - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 y: - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 z: - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 - facecolor: - '#1ca71c' - '#1ca71c' @@ -1787,683 +560,14 @@ data: - '#b2beb5' - '#b2beb5' i: - - 75 - - 64 - - 2 - - 75 - - 76 - - 65 - - 65 - - 64 - - 2 - - 0 - - 1 - - 0 - - 84 - - 86 - - 86 - - 90 - - 90 - - 92 - - 92 - - 91 - - 91 - - 87 - - 87 - - 85 - - 85 - - 83 - - 83 - - 82 - - 82 - - 84 - - 94 - - 86 - - 86 - - 84 - - 84 - - 82 - - 82 - - 83 - - 83 - - 85 - - 85 - - 87 - - 87 - - 87 - - 91 - - 91 - - 92 - - 92 - - 90 - - 90 - - 94 - - 95 - - 88 - - 78 - - 79 - - 81 - - 80 - - 93 - - 96 - - 89 - - 77 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 50 - - 52 - - 52 - - 44 - - 44 - - 32 - - 32 - - 22 - - 22 - - 14 - - 14 - - 20 - - 20 - - 30 - - 30 - - 41 - - 41 - - 50 - - 57 - - 52 - - 52 - - 50 - - 50 - - 41 - - 41 - - 30 - - 30 - - 20 - - 20 - - 14 - - 14 - - 14 - - 22 - - 22 - - 32 - - 32 - - 44 - - 44 - - 57 - - 11 - - 4 - - 12 - - 58 - - 62 - - 8 - - 7 - - 39 - - 61 - - 42 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 48 - - 54 - - 54 - - 47 - - 47 - - 37 - - 37 - - 25 - - 25 - - 17 - - 17 - - 18 - - 18 - - 26 - - 26 - - 38 - - 38 - - 48 - - 59 - - 54 - - 54 - - 48 - - 48 - - 38 - - 38 - - 26 - - 26 - - 18 - - 18 - - 17 - - 17 - - 17 - - 25 - - 25 - - 37 - - 37 - - 47 - - 47 - - 59 - - 27 - - 5 - - 10 - - 56 - - 60 - - 6 - - 9 - - 55 - - 63 - - 28 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 98 - - 99 - - 100 - - 101 - - 102 - - 104 - - 105 - - 106 - - 107 - - 108 - - 110 - - 111 - - 112 - - 113 - - 114 - - 116 - - 117 - - 118 - - 119 - - 120 - - 122 - - 123 - - 124 - - 125 - - 126 - - 128 - - 129 - - 130 - - 131 - - 132 - - 134 - - 135 - - 136 - - 137 - - 138 - - 140 - - 141 - - 142 - - 143 - - 144 - - 146 - - 147 - - 148 - - 149 - - 150 + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 j: - - 76 - - 76 - - 3 - - 3 - - 3 - - 3 - - 1 - - 1 - - 75 - - 75 - - 3 - - 3 - - 70 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 71 - - 71 - - 69 - - 69 - - 67 - - 67 - - 66 - - 66 - - 68 - - 68 - - 89 - - 89 - - 81 - - 81 - - 79 - - 79 - - 77 - - 77 - - 78 - - 78 - - 80 - - 80 - - 88 - - 93 - - 93 - - 95 - - 95 - - 96 - - 96 - - 94 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 68 - - 68 - - 66 - - 66 - - 67 - - 67 - - 69 - - 51 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 13 - - 13 - - 19 - - 19 - - 29 - - 29 - - 40 - - 40 - - 49 - - 49 - - 61 - - 61 - - 62 - - 62 - - 58 - - 58 - - 42 - - 42 - - 12 - - 12 - - 8 - - 8 - - 4 - - 7 - - 7 - - 11 - - 11 - - 39 - - 39 - - 57 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 49 - - 49 - - 40 - - 40 - - 29 - - 29 - - 19 - - 53 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 15 - - 15 - - 16 - - 16 - - 24 - - 24 - - 36 - - 36 - - 46 - - 46 - - 63 - - 63 - - 60 - - 60 - - 56 - - 56 - - 28 - - 28 - - 10 - - 10 - - 6 - - 6 - - 5 - - 9 - - 9 - - 27 - - 27 - - 55 - - 55 - - 59 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 46 - - 46 - - 36 - - 36 - - 24 - - 24 - - 16 - - 99 - - 100 - - 101 - - 102 - - 98 - - 105 - - 106 - - 107 - - 108 - - 104 - - 111 - - 112 - - 113 - - 114 - - 110 - - 117 - - 118 - - 119 - - 120 - - 116 - - 123 - - 124 - - 125 - - 126 - - 122 - - 129 - - 130 - - 131 - - 132 - - 128 - - 135 - - 136 - - 137 - - 138 - - 134 - - 141 - - 142 - - 143 - - 144 - - 140 - - 147 - - 148 - - 149 - - 150 - - 146 + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 k: - - 64 - - 65 - - 75 - - 76 - - 65 - - 1 - - 64 - - 0 - - 0 - - 64 - - 0 - - 2 - - 86 - - 72 - - 90 - - 74 - - 92 - - 73 - - 91 - - 71 - - 87 - - 69 - - 85 - - 67 - - 83 - - 66 - - 82 - - 68 - - 84 - - 70 - - 86 - - 81 - - 84 - - 79 - - 82 - - 77 - - 83 - - 78 - - 85 - - 80 - - 87 - - 88 - - 93 - - 91 - - 95 - - 92 - - 96 - - 90 - - 94 - - 86 - - 89 - - 96 - - 93 - - 80 - - 77 - - 79 - - 88 - - 95 - - 94 - - 81 - - 78 - - 72 - - 66 - - 74 - - 67 - - 73 - - 69 - - 71 - - 52 - - 43 - - 44 - - 31 - - 32 - - 21 - - 22 - - 13 - - 14 - - 19 - - 20 - - 29 - - 30 - - 40 - - 41 - - 49 - - 50 - - 51 - - 52 - - 62 - - 50 - - 58 - - 41 - - 42 - - 30 - - 12 - - 20 - - 8 - - 14 - - 4 - - 7 - - 22 - - 11 - - 32 - - 39 - - 44 - - 57 - - 52 - - 61 - - 39 - - 7 - - 8 - - 42 - - 58 - - 4 - - 11 - - 57 - - 62 - - 12 - - 43 - - 40 - - 31 - - 29 - - 21 - - 19 - - 13 - - 54 - - 45 - - 47 - - 35 - - 37 - - 23 - - 25 - - 15 - - 17 - - 16 - - 18 - - 24 - - 26 - - 36 - - 38 - - 46 - - 48 - - 53 - - 54 - - 60 - - 48 - - 56 - - 38 - - 28 - - 26 - - 10 - - 18 - - 6 - - 17 - - 5 - - 9 - - 25 - - 27 - - 37 - - 55 - - 47 - - 59 - - 54 - - 63 - - 55 - - 9 - - 6 - - 28 - - 56 - - 5 - - 27 - - 59 - - 60 - - 10 - - 45 - - 36 - - 35 - - 24 - - 23 - - 16 - - 15 - - 103 - - 103 - - 103 - - 103 - - 103 - - 109 - - 109 - - 109 - - 109 - - 109 - - 115 - - 115 - - 115 - - 115 - - 115 - - 121 - - 121 - - 121 - - 121 - - 121 - - 127 - - 127 - - 127 - - 127 - - 127 - - 133 - - 133 - - 133 - - 133 - - 133 - - 139 - - 139 - - 139 - - 139 - - 139 - - 145 - - 145 - - 145 - - 145 - - 145 - - 151 - - 151 - - 151 - - 151 - - 151 + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 legendgroup: Sensor(id=ID) name: Sensor (Jxy) opacity: 1 @@ -2471,464 +575,14 @@ data: showlegend: true type: mesh3d x: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014992463600000002 - - -0.014392395300000003 - - -0.014392395300000003 - - -0.012869499600000002 - - -0.012355425950000002 - - -0.009822911000000002 - - -0.009822911000000002 - - -0.0066605612500000005 - - -0.005795627850000001 - - 0.0 - - -0.004997477680000001 - - 0.0 - - 0.0 - - -0.0046984631550000015 - - -0.0046984631550000015 - - 0.0 - - -0.003930366410000001 - - 0.0 - - -0.003726213425000001 - - 0.0 - - 0.0 - - -0.0025000000350000003 - - -0.0025000000350000003 - - -0.0021347226600000008 - - -0.0021347226600000008 - - 0.0 - - -0.0010241928500000002 - - 0.0 - - -0.0007114128200000001 - - -1.0408340850000002e-17 - - -9.553993650000002e-18 - - 0.0 - - 0.0 - - 0.0008682409300000002 - - 0.0008682409300000002 - - 0.0016630589950000004 - - 0.0 - - 0.0023612117400000003 - - 0.0026042407400000004 - - 0.0 - - 0.0026362657550000005 - - 0.0 - - 0.0 - - 0.003830222040000001 - - 0.003830222040000001 - - 0.0 - - 0.004641779140000001 - - 0.0 - - 0.004750406370000001 - - 0.0 - - 0.0049999997000000004 - - 0.006231224900000001 - - 0.006231224900000001 - - 0.00945867 - - 0.010177281500000003 - - 0.012618804000000003 - - 0.012618804000000003 - - 0.014251218750000003 - - 0.014519108850000004 - - 0.014999999100000003 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.10000000000000002 - - -0.9257545044462104 - - -1.151493064908857 - - -1.3786213269384155 - - -1.2932557522157282 - - -1.01336866353838 - - -0.8475013375904817 - - -1.5 - - -1.5 - - -1.5 - - -1.5 - - -1.5 - - -0.5 - - -0.9257545044462104 - - -1.01336866353838 - - -1.2932557522157282 - - -1.3786213269384155 - - -1.151493064908857 - - -0.8475013375904817 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - -0.49999999999999994 - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - 1.0742454955537897 - - 0.9866313364616199 - - 0.7067442477842719 - - 0.6213786730615845 - - 0.8485069350911429 - - 1.1524986624095181 - - 0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 - - 1.5 - - 1.0742454955537897 - - 0.8485069350911429 - - 0.6213786730615845 - - 0.7067442477842718 - - 0.9866313364616199 - - 1.1524986624095181 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== + dtype: f8 y: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - -0.004225988315000001 - - 0.004225988315000001 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.011336243900000001 - - 0.011336243900000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0017101006600000004 - - 0.0017101006600000004 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.004330126940000001 - - 0.004330126940000001 - - -0.014847321800000002 - - 0.014847321800000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.10000000000000002 - - 0.0 - - 0.0 - - -0.0049240388000000015 - - 0.0049240388000000015 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0032139379550000006 - - 0.0032139379550000006 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.013644480700000003 - - 0.013644480700000003 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.008109612750000002 - - 0.008109612750000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.00028137136250000006 - - 0.0078714803 - - -0.008344890200000002 - - 0.013525193950000004 - - -0.013758964850000003 - - -0.0016490003100000004 - - 0.0017709132300000002 - - -0.0042973283700000016 - - 0.0043621968500000005 - - -0.004934888705000001 - - 0.004912360015000001 - - 0.014884752050000002 - - -0.014804665750000005 - - -0.0032633595150000005 - - 0.0031639754750000006 - - -6.486846850000001e-05 - - 0.011518507450000002 - - -0.011149990550000002 - - 0.004495218770000001 - - -0.0039552707250000005 - - 9.925023200000001e-18 - - -1.548792898897935 - - -1.4764986529115414 - - -1.4037593459363646 - - -1.4310982278939868 - - -1.5207338931333951 - - -0.5238233962453553 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 1.548792898897935 - - 1.5207338931333951 - - 1.4310982278939868 - - 1.4037593459363646 - - 1.4764986529115414 - - 0.5238233962453553 - - -1.0 - - -0.7622358709262116 - - -0.8530536869268817 - - -1.1469463130731183 - - -1.2377641290737884 - - -1.0 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 1.0 - - 1.2377641290737884 - - 1.1469463130731183 - - 0.8530536869268818 - - 0.7622358709262116 - - 1.0 - - -0.45120710110206497 - - -0.47926610686660476 - - -0.5689017721060132 - - -0.5962406540636354 - - -0.5235013470884586 - - -1.4761766037546447 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 0.45120710110206497 - - 0.5235013470884586 - - 0.5962406540636354 - - 0.5689017721060132 - - 0.47926610686660476 - - 1.4761766037546447 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== + dtype: f8 z: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.0004754300695000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.007705580450000002 - - -0.008505494900000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.013440123200000004 - - -0.013835124650000002 - - 0.0 - - 0.00015880254800000005 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.003090666795000001 - - 0.0 - - 0.0033339664350000007 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0048939786850000005 - - 0.0 - - 0.004949130490000001 - - 0.10000000000000002 - - -3.1374891150000003e-18 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.014907522500000003 - - 0.0 - - -0.004407344015000001 - - -0.014772200600000002 - - 0.0 - - 0.0042485412200000015 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0018584636950000003 - - 0.0 - - 0.0015600122500000005 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.011641889050000001 - - -0.011019207550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.004680036755000001 - - -0.003767693415000001 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014997360100000004 - - -0.012768703700000003 - - -0.012464462200000002 - - -0.006486073150000001 - - -0.005974184350000002 - - -0.004720254240000001 - - -0.004675881190000001 - - -0.0025559673100000006 - - -0.0024436118100000007 - - 0.0008042847750000002 - - 0.0009320507750000002 - - 0.0018558396050000002 - - 0.0024128545100000004 - - 0.003788203375000001 - - 0.0038715966050000008 - - 0.004999579490000001 - - 0.009608536200000002 - - 0.0100338295 - - 0.014310590900000003 - - 0.014469133300000003 - - -1.6175736900000002e-18 - - -0.0762493312047592 - - -0.24999777010606963 - - -0.0782577878324744 - - 0.20163179734122239 - - 0.2028730918020804 - - 8.326672684688674e-17 - - -0.2500000000000001 - - -0.07725424859373697 - - 0.20225424859373672 - - 0.20225424859373675 - - -0.07725424859373692 - - 1.1102230246251565e-16 - - -0.0762493312047592 - - 0.20287309180208038 - - 0.20163179734122244 - - -0.07825778783247435 - - -0.24999777010606966 - - 8.326672684688674e-17 - - 0.2499999999999999 - - 0.07725424859373675 - - -0.20225424859373695 - - -0.20225424859373697 - - 0.0772542485937367 - - 1.1102230246251565e-16 - - -0.2500000000000001 - - -0.07725424859373697 - - 0.20225424859373672 - - 0.20225424859373675 - - -0.07725424859373692 - - 1.1102230246251565e-16 - - 0.2499999999999999 - - 0.07725424859373675 - - -0.20225424859373695 - - -0.20225424859373697 - - 0.0772542485937367 - - 1.1102230246251565e-16 - - -0.0762493312047592 - - 0.20287309180208038 - - 0.20163179734122244 - - -0.07825778783247435 - - -0.24999777010606966 - - 8.326672684688674e-17 - - -0.2500000000000001 - - -0.07725424859373697 - - 0.20225424859373672 - - 0.20225424859373675 - - -0.07725424859373692 - - 1.1102230246251565e-16 - - -0.0762493312047592 - - -0.24999777010606963 - - -0.0782577878324744 - - 0.20163179734122239 - - 0.2028730918020804 - - 8.326672684688674e-17 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== + dtype: f8 - color: '#2e91e5' colorscale: - - 0.0 @@ -2944,53 +598,17 @@ data: - - 1.0 - '#e71111' i: - - 7 - - 0 - - 0 - - 0 - - 4 - - 4 - - 2 - - 6 - - 4 - - 0 - - 3 - - 7 + bdata: BwAAAAQEAgYEAAMH + dtype: i1 intensity: - - 0.0 - - 0.0 - - 1.0 - - 1.0 - - 0.0 - - 0.0 - - 1.0 - - 1.0 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 j: - - 0 - - 7 - - 1 - - 2 - - 6 - - 7 - - 1 - - 2 - - 5 - - 5 - - 2 - - 2 + bdata: AAcBAgYHAQIFBQIC + dtype: i1 k: - - 3 - - 4 - - 2 - - 3 - - 5 - - 6 - - 5 - - 5 - - 0 - - 1 - - 7 - - 6 + bdata: AwQCAwUGBQUAAQcG + dtype: i1 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -2999,32 +617,14 @@ data: showscale: false type: mesh3d x: - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 y: - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 z: - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 - facecolor: - '#fb0d0d' - '#fb0d0d' @@ -3252,683 +852,14 @@ data: - '#b2beb5' - '#b2beb5' i: - - 75 - - 64 - - 2 - - 75 - - 76 - - 65 - - 65 - - 64 - - 2 - - 0 - - 1 - - 0 - - 84 - - 86 - - 86 - - 90 - - 90 - - 92 - - 92 - - 91 - - 91 - - 87 - - 87 - - 85 - - 85 - - 83 - - 83 - - 82 - - 82 - - 84 - - 94 - - 86 - - 86 - - 84 - - 84 - - 82 - - 82 - - 83 - - 83 - - 85 - - 85 - - 87 - - 87 - - 87 - - 91 - - 91 - - 92 - - 92 - - 90 - - 90 - - 94 - - 95 - - 88 - - 78 - - 79 - - 81 - - 80 - - 93 - - 96 - - 89 - - 77 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 50 - - 52 - - 52 - - 44 - - 44 - - 32 - - 32 - - 22 - - 22 - - 14 - - 14 - - 20 - - 20 - - 30 - - 30 - - 41 - - 41 - - 50 - - 57 - - 52 - - 52 - - 50 - - 50 - - 41 - - 41 - - 30 - - 30 - - 20 - - 20 - - 14 - - 14 - - 14 - - 22 - - 22 - - 32 - - 32 - - 44 - - 44 - - 57 - - 11 - - 4 - - 12 - - 58 - - 62 - - 8 - - 7 - - 39 - - 61 - - 42 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 48 - - 54 - - 54 - - 47 - - 47 - - 37 - - 37 - - 25 - - 25 - - 17 - - 17 - - 18 - - 18 - - 26 - - 26 - - 38 - - 38 - - 48 - - 59 - - 54 - - 54 - - 48 - - 48 - - 38 - - 38 - - 26 - - 26 - - 18 - - 18 - - 17 - - 17 - - 17 - - 25 - - 25 - - 37 - - 37 - - 47 - - 47 - - 59 - - 27 - - 5 - - 10 - - 56 - - 60 - - 6 - - 9 - - 55 - - 63 - - 28 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 98 - - 99 - - 100 - - 101 - - 102 - - 104 - - 105 - - 106 - - 107 - - 108 - - 110 - - 111 - - 112 - - 113 - - 114 - - 116 - - 117 - - 118 - - 119 - - 120 - - 122 - - 123 - - 124 - - 125 - - 126 - - 128 - - 129 - - 130 - - 131 - - 132 - - 134 - - 135 - - 136 - - 137 - - 138 - - 140 - - 141 - - 142 - - 143 - - 144 - - 146 - - 147 - - 148 - - 149 - - 150 + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 j: - - 76 - - 76 - - 3 - - 3 - - 3 - - 3 - - 1 - - 1 - - 75 - - 75 - - 3 - - 3 - - 70 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 71 - - 71 - - 69 - - 69 - - 67 - - 67 - - 66 - - 66 - - 68 - - 68 - - 89 - - 89 - - 81 - - 81 - - 79 - - 79 - - 77 - - 77 - - 78 - - 78 - - 80 - - 80 - - 88 - - 93 - - 93 - - 95 - - 95 - - 96 - - 96 - - 94 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 68 - - 68 - - 66 - - 66 - - 67 - - 67 - - 69 - - 51 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 13 - - 13 - - 19 - - 19 - - 29 - - 29 - - 40 - - 40 - - 49 - - 49 - - 61 - - 61 - - 62 - - 62 - - 58 - - 58 - - 42 - - 42 - - 12 - - 12 - - 8 - - 8 - - 4 - - 7 - - 7 - - 11 - - 11 - - 39 - - 39 - - 57 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 49 - - 49 - - 40 - - 40 - - 29 - - 29 - - 19 - - 53 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 15 - - 15 - - 16 - - 16 - - 24 - - 24 - - 36 - - 36 - - 46 - - 46 - - 63 - - 63 - - 60 - - 60 - - 56 - - 56 - - 28 - - 28 - - 10 - - 10 - - 6 - - 6 - - 5 - - 9 - - 9 - - 27 - - 27 - - 55 - - 55 - - 59 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 46 - - 46 - - 36 - - 36 - - 24 - - 24 - - 16 - - 99 - - 100 - - 101 - - 102 - - 98 - - 105 - - 106 - - 107 - - 108 - - 104 - - 111 - - 112 - - 113 - - 114 - - 110 - - 117 - - 118 - - 119 - - 120 - - 116 - - 123 - - 124 - - 125 - - 126 - - 122 - - 129 - - 130 - - 131 - - 132 - - 128 - - 135 - - 136 - - 137 - - 138 - - 134 - - 141 - - 142 - - 143 - - 144 - - 140 - - 147 - - 148 - - 149 - - 150 - - 146 + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 k: - - 64 - - 65 - - 75 - - 76 - - 65 - - 1 - - 64 - - 0 - - 0 - - 64 - - 0 - - 2 - - 86 - - 72 - - 90 - - 74 - - 92 - - 73 - - 91 - - 71 - - 87 - - 69 - - 85 - - 67 - - 83 - - 66 - - 82 - - 68 - - 84 - - 70 - - 86 - - 81 - - 84 - - 79 - - 82 - - 77 - - 83 - - 78 - - 85 - - 80 - - 87 - - 88 - - 93 - - 91 - - 95 - - 92 - - 96 - - 90 - - 94 - - 86 - - 89 - - 96 - - 93 - - 80 - - 77 - - 79 - - 88 - - 95 - - 94 - - 81 - - 78 - - 72 - - 66 - - 74 - - 67 - - 73 - - 69 - - 71 - - 52 - - 43 - - 44 - - 31 - - 32 - - 21 - - 22 - - 13 - - 14 - - 19 - - 20 - - 29 - - 30 - - 40 - - 41 - - 49 - - 50 - - 51 - - 52 - - 62 - - 50 - - 58 - - 41 - - 42 - - 30 - - 12 - - 20 - - 8 - - 14 - - 4 - - 7 - - 22 - - 11 - - 32 - - 39 - - 44 - - 57 - - 52 - - 61 - - 39 - - 7 - - 8 - - 42 - - 58 - - 4 - - 11 - - 57 - - 62 - - 12 - - 43 - - 40 - - 31 - - 29 - - 21 - - 19 - - 13 - - 54 - - 45 - - 47 - - 35 - - 37 - - 23 - - 25 - - 15 - - 17 - - 16 - - 18 - - 24 - - 26 - - 36 - - 38 - - 46 - - 48 - - 53 - - 54 - - 60 - - 48 - - 56 - - 38 - - 28 - - 26 - - 10 - - 18 - - 6 - - 17 - - 5 - - 9 - - 25 - - 27 - - 37 - - 55 - - 47 - - 59 - - 54 - - 63 - - 55 - - 9 - - 6 - - 28 - - 56 - - 5 - - 27 - - 59 - - 60 - - 10 - - 45 - - 36 - - 35 - - 24 - - 23 - - 16 - - 15 - - 103 - - 103 - - 103 - - 103 - - 103 - - 109 - - 109 - - 109 - - 109 - - 109 - - 115 - - 115 - - 115 - - 115 - - 115 - - 121 - - 121 - - 121 - - 121 - - 121 - - 127 - - 127 - - 127 - - 127 - - 127 - - 133 - - 133 - - 133 - - 133 - - 133 - - 139 - - 139 - - 139 - - 139 - - 139 - - 145 - - 145 - - 145 - - 145 - - 145 - - 151 - - 151 - - 151 - - 151 - - 151 + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 legendgroup: Sensor(id=ID) name: Sensor (Bz) opacity: 1 @@ -3936,464 +867,14 @@ data: showlegend: true type: mesh3d x: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014992463600000002 - - -0.014392395300000003 - - -0.014392395300000003 - - -0.012869499600000002 - - -0.012355425950000002 - - -0.009822911000000002 - - -0.009822911000000002 - - -0.0066605612500000005 - - -0.005795627850000001 - - 0.0 - - -0.004997477680000001 - - 0.0 - - 0.0 - - -0.0046984631550000015 - - -0.0046984631550000015 - - 0.0 - - -0.003930366410000001 - - 0.0 - - -0.003726213425000001 - - 0.0 - - 0.0 - - -0.0025000000350000003 - - -0.0025000000350000003 - - -0.0021347226600000008 - - -0.0021347226600000008 - - 0.0 - - -0.0010241928500000002 - - 0.0 - - -0.0007114128200000001 - - -1.0408340850000002e-17 - - -9.553993650000002e-18 - - 0.0 - - 0.0 - - 0.0008682409300000002 - - 0.0008682409300000002 - - 0.0016630589950000004 - - 0.0 - - 0.0023612117400000003 - - 0.0026042407400000004 - - 0.0 - - 0.0026362657550000005 - - 0.0 - - 0.0 - - 0.003830222040000001 - - 0.003830222040000001 - - 0.0 - - 0.004641779140000001 - - 0.0 - - 0.004750406370000001 - - 0.0 - - 0.0049999997000000004 - - 0.006231224900000001 - - 0.006231224900000001 - - 0.00945867 - - 0.010177281500000003 - - 0.012618804000000003 - - 0.012618804000000003 - - 0.014251218750000003 - - 0.014519108850000004 - - 0.014999999100000003 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.10000000000000002 - - -0.9257545044462104 - - -1.151493064908857 - - -1.3786213269384155 - - -1.2932557522157282 - - -1.01336866353838 - - -0.8475013375904817 - - -1.5 - - -1.5 - - -1.5 - - -1.5 - - -1.5 - - -0.5 - - -0.9257545044462104 - - -1.01336866353838 - - -1.2932557522157282 - - -1.3786213269384155 - - -1.151493064908857 - - -0.8475013375904817 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - -0.49999999999999994 - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - 1.0742454955537897 - - 0.9866313364616199 - - 0.7067442477842719 - - 0.6213786730615845 - - 0.8485069350911429 - - 1.1524986624095181 - - 0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 - - 1.5 - - 1.0742454955537897 - - 0.8485069350911429 - - 0.6213786730615845 - - 0.7067442477842718 - - 0.9866313364616199 - - 1.1524986624095181 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== + dtype: f8 y: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - -0.004225988315000001 - - 0.004225988315000001 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.011336243900000001 - - 0.011336243900000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0017101006600000004 - - 0.0017101006600000004 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.004330126940000001 - - 0.004330126940000001 - - -0.014847321800000002 - - 0.014847321800000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.10000000000000002 - - 0.0 - - 0.0 - - -0.0049240388000000015 - - 0.0049240388000000015 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0032139379550000006 - - 0.0032139379550000006 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.013644480700000003 - - 0.013644480700000003 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.008109612750000002 - - 0.008109612750000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.00028137136250000006 - - 0.0078714803 - - -0.008344890200000002 - - 0.013525193950000004 - - -0.013758964850000003 - - -0.0016490003100000004 - - 0.0017709132300000002 - - -0.0042973283700000016 - - 0.0043621968500000005 - - -0.004934888705000001 - - 0.004912360015000001 - - 0.014884752050000002 - - -0.014804665750000005 - - -0.0032633595150000005 - - 0.0031639754750000006 - - -6.486846850000001e-05 - - 0.011518507450000002 - - -0.011149990550000002 - - 0.004495218770000001 - - -0.0039552707250000005 - - 9.925023200000001e-18 - - -1.548792898897935 - - -1.4764986529115414 - - -1.4037593459363646 - - -1.4310982278939868 - - -1.5207338931333951 - - -0.5238233962453553 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 1.548792898897935 - - 1.5207338931333951 - - 1.4310982278939868 - - 1.4037593459363646 - - 1.4764986529115414 - - 0.5238233962453553 - - -1.0 - - -0.7622358709262116 - - -0.8530536869268817 - - -1.1469463130731183 - - -1.2377641290737884 - - -1.0 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 1.0 - - 1.2377641290737884 - - 1.1469463130731183 - - 0.8530536869268818 - - 0.7622358709262116 - - 1.0 - - -0.45120710110206497 - - -0.47926610686660476 - - -0.5689017721060132 - - -0.5962406540636354 - - -0.5235013470884586 - - -1.4761766037546447 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 0.45120710110206497 - - 0.5235013470884586 - - 0.5962406540636354 - - 0.5689017721060132 - - 0.47926610686660476 - - 1.4761766037546447 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== + dtype: f8 z: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.0004754300695000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.007705580450000002 - - -0.008505494900000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.013440123200000004 - - -0.013835124650000002 - - 0.0 - - 0.00015880254800000005 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.003090666795000001 - - 0.0 - - 0.0033339664350000007 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0048939786850000005 - - 0.0 - - 0.004949130490000001 - - 0.10000000000000002 - - -3.1374891150000003e-18 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.014907522500000003 - - 0.0 - - -0.004407344015000001 - - -0.014772200600000002 - - 0.0 - - 0.0042485412200000015 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0018584636950000003 - - 0.0 - - 0.0015600122500000005 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.011641889050000001 - - -0.011019207550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.004680036755000001 - - -0.003767693415000001 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014997360100000004 - - -0.012768703700000003 - - -0.012464462200000002 - - -0.006486073150000001 - - -0.005974184350000002 - - -0.004720254240000001 - - -0.004675881190000001 - - -0.0025559673100000006 - - -0.0024436118100000007 - - 0.0008042847750000002 - - 0.0009320507750000002 - - 0.0018558396050000002 - - 0.0024128545100000004 - - 0.003788203375000001 - - 0.0038715966050000008 - - 0.004999579490000001 - - 0.009608536200000002 - - 0.0100338295 - - 0.014310590900000003 - - 0.014469133300000003 - - -1.6175736900000002e-18 - - -0.0762493312047592 - - -0.24999777010606963 - - -0.0782577878324744 - - 0.20163179734122239 - - 0.2028730918020804 - - 8.326672684688674e-17 - - -0.2500000000000001 - - -0.07725424859373697 - - 0.20225424859373672 - - 0.20225424859373675 - - -0.07725424859373692 - - 1.1102230246251565e-16 - - -0.0762493312047592 - - 0.20287309180208038 - - 0.20163179734122244 - - -0.07825778783247435 - - -0.24999777010606966 - - 8.326672684688674e-17 - - 0.2499999999999999 - - 0.07725424859373675 - - -0.20225424859373695 - - -0.20225424859373697 - - 0.0772542485937367 - - 1.1102230246251565e-16 - - -0.2500000000000001 - - -0.07725424859373697 - - 0.20225424859373672 - - 0.20225424859373675 - - -0.07725424859373692 - - 1.1102230246251565e-16 - - 0.2499999999999999 - - 0.07725424859373675 - - -0.20225424859373695 - - -0.20225424859373697 - - 0.0772542485937367 - - 1.1102230246251565e-16 - - -0.0762493312047592 - - 0.20287309180208038 - - 0.20163179734122244 - - -0.07825778783247435 - - -0.24999777010606966 - - 8.326672684688674e-17 - - -0.2500000000000001 - - -0.07725424859373697 - - 0.20225424859373672 - - 0.20225424859373675 - - -0.07725424859373692 - - 1.1102230246251565e-16 - - -0.0762493312047592 - - -0.24999777010606963 - - -0.0782577878324744 - - 0.20163179734122239 - - 0.2028730918020804 - - 8.326672684688674e-17 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== + dtype: f8 - color: '#2e91e5' colorscale: - - 0.0 @@ -4409,53 +890,17 @@ data: - - 1.0 - '#e71111' i: - - 7 - - 0 - - 0 - - 0 - - 4 - - 4 - - 2 - - 6 - - 4 - - 0 - - 3 - - 7 + bdata: BwAAAAQEAgYEAAMH + dtype: i1 intensity: - - 0.0 - - 0.0 - - 1.0 - - 1.0 - - 0.0 - - 0.0 - - 1.0 - - 1.0 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 j: - - 0 - - 7 - - 1 - - 2 - - 6 - - 7 - - 1 - - 2 - - 5 - - 5 - - 2 - - 2 + bdata: AAcBAgYHAQIFBQIC + dtype: i1 k: - - 3 - - 4 - - 2 - - 3 - - 5 - - 6 - - 5 - - 5 - - 0 - - 1 - - 7 - - 6 + bdata: AwQCAwUGBQUAAQcG + dtype: i1 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -4464,32 +909,14 @@ data: showscale: false type: mesh3d x: - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 y: - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 z: - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 - facecolor: - '#da16ff' - '#da16ff' @@ -4717,683 +1144,14 @@ data: - black - black i: - - 75 - - 64 - - 2 - - 75 - - 76 - - 65 - - 65 - - 64 - - 2 - - 0 - - 1 - - 0 - - 84 - - 86 - - 86 - - 90 - - 90 - - 92 - - 92 - - 91 - - 91 - - 87 - - 87 - - 85 - - 85 - - 83 - - 83 - - 82 - - 82 - - 84 - - 94 - - 86 - - 86 - - 84 - - 84 - - 82 - - 82 - - 83 - - 83 - - 85 - - 85 - - 87 - - 87 - - 87 - - 91 - - 91 - - 92 - - 92 - - 90 - - 90 - - 94 - - 95 - - 88 - - 78 - - 79 - - 81 - - 80 - - 93 - - 96 - - 89 - - 77 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 50 - - 52 - - 52 - - 44 - - 44 - - 32 - - 32 - - 22 - - 22 - - 14 - - 14 - - 20 - - 20 - - 30 - - 30 - - 41 - - 41 - - 50 - - 57 - - 52 - - 52 - - 50 - - 50 - - 41 - - 41 - - 30 - - 30 - - 20 - - 20 - - 14 - - 14 - - 14 - - 22 - - 22 - - 32 - - 32 - - 44 - - 44 - - 57 - - 11 - - 4 - - 12 - - 58 - - 62 - - 8 - - 7 - - 39 - - 61 - - 42 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 48 - - 54 - - 54 - - 47 - - 47 - - 37 - - 37 - - 25 - - 25 - - 17 - - 17 - - 18 - - 18 - - 26 - - 26 - - 38 - - 38 - - 48 - - 59 - - 54 - - 54 - - 48 - - 48 - - 38 - - 38 - - 26 - - 26 - - 18 - - 18 - - 17 - - 17 - - 17 - - 25 - - 25 - - 37 - - 37 - - 47 - - 47 - - 59 - - 27 - - 5 - - 10 - - 56 - - 60 - - 6 - - 9 - - 55 - - 63 - - 28 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 98 - - 99 - - 100 - - 101 - - 102 - - 104 - - 105 - - 106 - - 107 - - 108 - - 110 - - 111 - - 112 - - 113 - - 114 - - 116 - - 117 - - 118 - - 119 - - 120 - - 122 - - 123 - - 124 - - 125 - - 126 - - 128 - - 129 - - 130 - - 131 - - 132 - - 134 - - 135 - - 136 - - 137 - - 138 - - 140 - - 141 - - 142 - - 143 - - 144 - - 146 - - 147 - - 148 - - 149 - - 150 + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 j: - - 76 - - 76 - - 3 - - 3 - - 3 - - 3 - - 1 - - 1 - - 75 - - 75 - - 3 - - 3 - - 70 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 71 - - 71 - - 69 - - 69 - - 67 - - 67 - - 66 - - 66 - - 68 - - 68 - - 89 - - 89 - - 81 - - 81 - - 79 - - 79 - - 77 - - 77 - - 78 - - 78 - - 80 - - 80 - - 88 - - 93 - - 93 - - 95 - - 95 - - 96 - - 96 - - 94 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 68 - - 68 - - 66 - - 66 - - 67 - - 67 - - 69 - - 51 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 13 - - 13 - - 19 - - 19 - - 29 - - 29 - - 40 - - 40 - - 49 - - 49 - - 61 - - 61 - - 62 - - 62 - - 58 - - 58 - - 42 - - 42 - - 12 - - 12 - - 8 - - 8 - - 4 - - 7 - - 7 - - 11 - - 11 - - 39 - - 39 - - 57 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 49 - - 49 - - 40 - - 40 - - 29 - - 29 - - 19 - - 53 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 15 - - 15 - - 16 - - 16 - - 24 - - 24 - - 36 - - 36 - - 46 - - 46 - - 63 - - 63 - - 60 - - 60 - - 56 - - 56 - - 28 - - 28 - - 10 - - 10 - - 6 - - 6 - - 5 - - 9 - - 9 - - 27 - - 27 - - 55 - - 55 - - 59 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 46 - - 46 - - 36 - - 36 - - 24 - - 24 - - 16 - - 99 - - 100 - - 101 - - 102 - - 98 - - 105 - - 106 - - 107 - - 108 - - 104 - - 111 - - 112 - - 113 - - 114 - - 110 - - 117 - - 118 - - 119 - - 120 - - 116 - - 123 - - 124 - - 125 - - 126 - - 122 - - 129 - - 130 - - 131 - - 132 - - 128 - - 135 - - 136 - - 137 - - 138 - - 134 - - 141 - - 142 - - 143 - - 144 - - 140 - - 147 - - 148 - - 149 - - 150 - - 146 + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 k: - - 64 - - 65 - - 75 - - 76 - - 65 - - 1 - - 64 - - 0 - - 0 - - 64 - - 0 - - 2 - - 86 - - 72 - - 90 - - 74 - - 92 - - 73 - - 91 - - 71 - - 87 - - 69 - - 85 - - 67 - - 83 - - 66 - - 82 - - 68 - - 84 - - 70 - - 86 - - 81 - - 84 - - 79 - - 82 - - 77 - - 83 - - 78 - - 85 - - 80 - - 87 - - 88 - - 93 - - 91 - - 95 - - 92 - - 96 - - 90 - - 94 - - 86 - - 89 - - 96 - - 93 - - 80 - - 77 - - 79 - - 88 - - 95 - - 94 - - 81 - - 78 - - 72 - - 66 - - 74 - - 67 - - 73 - - 69 - - 71 - - 52 - - 43 - - 44 - - 31 - - 32 - - 21 - - 22 - - 13 - - 14 - - 19 - - 20 - - 29 - - 30 - - 40 - - 41 - - 49 - - 50 - - 51 - - 52 - - 62 - - 50 - - 58 - - 41 - - 42 - - 30 - - 12 - - 20 - - 8 - - 14 - - 4 - - 7 - - 22 - - 11 - - 32 - - 39 - - 44 - - 57 - - 52 - - 61 - - 39 - - 7 - - 8 - - 42 - - 58 - - 4 - - 11 - - 57 - - 62 - - 12 - - 43 - - 40 - - 31 - - 29 - - 21 - - 19 - - 13 - - 54 - - 45 - - 47 - - 35 - - 37 - - 23 - - 25 - - 15 - - 17 - - 16 - - 18 - - 24 - - 26 - - 36 - - 38 - - 46 - - 48 - - 53 - - 54 - - 60 - - 48 - - 56 - - 38 - - 28 - - 26 - - 10 - - 18 - - 6 - - 17 - - 5 - - 9 - - 25 - - 27 - - 37 - - 55 - - 47 - - 59 - - 54 - - 63 - - 55 - - 9 - - 6 - - 28 - - 56 - - 5 - - 27 - - 59 - - 60 - - 10 - - 45 - - 36 - - 35 - - 24 - - 23 - - 16 - - 15 - - 103 - - 103 - - 103 - - 103 - - 103 - - 109 - - 109 - - 109 - - 109 - - 109 - - 115 - - 115 - - 115 - - 115 - - 115 - - 121 - - 121 - - 121 - - 121 - - 121 - - 127 - - 127 - - 127 - - 127 - - 127 - - 133 - - 133 - - 133 - - 133 - - 133 - - 139 - - 139 - - 139 - - 139 - - 139 - - 145 - - 145 - - 145 - - 145 - - 145 - - 151 - - 151 - - 151 - - 151 - - 151 + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 legendgroup: Sensor(id=ID) name: Sensor (False) opacity: 1 @@ -5401,464 +1159,14 @@ data: showlegend: true type: mesh3d x: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014992463600000002 - - -0.014392395300000003 - - -0.014392395300000003 - - -0.012869499600000002 - - -0.012355425950000002 - - -0.009822911000000002 - - -0.009822911000000002 - - -0.0066605612500000005 - - -0.005795627850000001 - - 0.0 - - -0.004997477680000001 - - 0.0 - - 0.0 - - -0.0046984631550000015 - - -0.0046984631550000015 - - 0.0 - - -0.003930366410000001 - - 0.0 - - -0.003726213425000001 - - 0.0 - - 0.0 - - -0.0025000000350000003 - - -0.0025000000350000003 - - -0.0021347226600000008 - - -0.0021347226600000008 - - 0.0 - - -0.0010241928500000002 - - 0.0 - - -0.0007114128200000001 - - -1.0408340850000002e-17 - - -9.553993650000002e-18 - - 0.0 - - 0.0 - - 0.0008682409300000002 - - 0.0008682409300000002 - - 0.0016630589950000004 - - 0.0 - - 0.0023612117400000003 - - 0.0026042407400000004 - - 0.0 - - 0.0026362657550000005 - - 0.0 - - 0.0 - - 0.003830222040000001 - - 0.003830222040000001 - - 0.0 - - 0.004641779140000001 - - 0.0 - - 0.004750406370000001 - - 0.0 - - 0.0049999997000000004 - - 0.006231224900000001 - - 0.006231224900000001 - - 0.00945867 - - 0.010177281500000003 - - 0.012618804000000003 - - 0.012618804000000003 - - 0.014251218750000003 - - 0.014519108850000004 - - 0.014999999100000003 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.10000000000000002 - - -0.9257545044462104 - - -1.151493064908857 - - -1.3786213269384155 - - -1.2932557522157282 - - -1.01336866353838 - - -0.8475013375904817 - - -1.5 - - -1.5 - - -1.5 - - -1.5 - - -1.5 - - -0.5 - - -0.9257545044462104 - - -1.01336866353838 - - -1.2932557522157282 - - -1.3786213269384155 - - -1.151493064908857 - - -0.8475013375904817 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - -0.49999999999999994 - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - 1.0742454955537897 - - 0.9866313364616199 - - 0.7067442477842719 - - 0.6213786730615845 - - 0.8485069350911429 - - 1.1524986624095181 - - 0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 - - 1.5 - - 1.0742454955537897 - - 0.8485069350911429 - - 0.6213786730615845 - - 0.7067442477842718 - - 0.9866313364616199 - - 1.1524986624095181 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== + dtype: f8 y: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - -0.004225988315000001 - - 0.004225988315000001 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.011336243900000001 - - 0.011336243900000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0017101006600000004 - - 0.0017101006600000004 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.004330126940000001 - - 0.004330126940000001 - - -0.014847321800000002 - - 0.014847321800000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.10000000000000002 - - 0.0 - - 0.0 - - -0.0049240388000000015 - - 0.0049240388000000015 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0032139379550000006 - - 0.0032139379550000006 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.013644480700000003 - - 0.013644480700000003 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.008109612750000002 - - 0.008109612750000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.00028137136250000006 - - 0.0078714803 - - -0.008344890200000002 - - 0.013525193950000004 - - -0.013758964850000003 - - -0.0016490003100000004 - - 0.0017709132300000002 - - -0.0042973283700000016 - - 0.0043621968500000005 - - -0.004934888705000001 - - 0.004912360015000001 - - 0.014884752050000002 - - -0.014804665750000005 - - -0.0032633595150000005 - - 0.0031639754750000006 - - -6.486846850000001e-05 - - 0.011518507450000002 - - -0.011149990550000002 - - 0.004495218770000001 - - -0.0039552707250000005 - - 9.925023200000001e-18 - - -1.548792898897935 - - -1.4764986529115414 - - -1.4037593459363646 - - -1.4310982278939868 - - -1.5207338931333951 - - -0.5238233962453553 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 1.548792898897935 - - 1.5207338931333951 - - 1.4310982278939868 - - 1.4037593459363646 - - 1.4764986529115414 - - 0.5238233962453553 - - -1.0 - - -0.7622358709262116 - - -0.8530536869268817 - - -1.1469463130731183 - - -1.2377641290737884 - - -1.0 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 1.0 - - 1.2377641290737884 - - 1.1469463130731183 - - 0.8530536869268818 - - 0.7622358709262116 - - 1.0 - - -0.45120710110206497 - - -0.47926610686660476 - - -0.5689017721060132 - - -0.5962406540636354 - - -0.5235013470884586 - - -1.4761766037546447 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 0.45120710110206497 - - 0.5235013470884586 - - 0.5962406540636354 - - 0.5689017721060132 - - 0.47926610686660476 - - 1.4761766037546447 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== + dtype: f8 z: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.0004754300695000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.007705580450000002 - - -0.008505494900000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.013440123200000004 - - -0.013835124650000002 - - 0.0 - - 0.00015880254800000005 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.003090666795000001 - - 0.0 - - 0.0033339664350000007 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0048939786850000005 - - 0.0 - - 0.004949130490000001 - - 0.10000000000000002 - - -3.1374891150000003e-18 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.014907522500000003 - - 0.0 - - -0.004407344015000001 - - -0.014772200600000002 - - 0.0 - - 0.0042485412200000015 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0018584636950000003 - - 0.0 - - 0.0015600122500000005 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.011641889050000001 - - -0.011019207550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.004680036755000001 - - -0.003767693415000001 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014997360100000004 - - -0.012768703700000003 - - -0.012464462200000002 - - -0.006486073150000001 - - -0.005974184350000002 - - -0.004720254240000001 - - -0.004675881190000001 - - -0.0025559673100000006 - - -0.0024436118100000007 - - 0.0008042847750000002 - - 0.0009320507750000002 - - 0.0018558396050000002 - - 0.0024128545100000004 - - 0.003788203375000001 - - 0.0038715966050000008 - - 0.004999579490000001 - - 0.009608536200000002 - - 0.0100338295 - - 0.014310590900000003 - - 0.014469133300000003 - - -1.6175736900000002e-18 - - -0.0762493312047592 - - -0.24999777010606963 - - -0.0782577878324744 - - 0.20163179734122239 - - 0.2028730918020804 - - 8.326672684688674e-17 - - -0.2500000000000001 - - -0.07725424859373697 - - 0.20225424859373672 - - 0.20225424859373675 - - -0.07725424859373692 - - 1.1102230246251565e-16 - - -0.0762493312047592 - - 0.20287309180208038 - - 0.20163179734122244 - - -0.07825778783247435 - - -0.24999777010606966 - - 8.326672684688674e-17 - - 0.2499999999999999 - - 0.07725424859373675 - - -0.20225424859373695 - - -0.20225424859373697 - - 0.0772542485937367 - - 1.1102230246251565e-16 - - -0.2500000000000001 - - -0.07725424859373697 - - 0.20225424859373672 - - 0.20225424859373675 - - -0.07725424859373692 - - 1.1102230246251565e-16 - - 0.2499999999999999 - - 0.07725424859373675 - - -0.20225424859373695 - - -0.20225424859373697 - - 0.0772542485937367 - - 1.1102230246251565e-16 - - -0.0762493312047592 - - 0.20287309180208038 - - 0.20163179734122244 - - -0.07825778783247435 - - -0.24999777010606966 - - 8.326672684688674e-17 - - -0.2500000000000001 - - -0.07725424859373697 - - 0.20225424859373672 - - 0.20225424859373675 - - -0.07725424859373692 - - 1.1102230246251565e-16 - - -0.0762493312047592 - - -0.24999777010606963 - - -0.0782577878324744 - - 0.20163179734122239 - - 0.2028730918020804 - - 8.326672684688674e-17 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== + dtype: f8 layout: legend: itemsizing: constant diff --git a/tests/test_display_plotly/test_pixel_field_color_scales.yml b/tests/test_display_plotly/test_pixel_field_color_scales.yml index 0067b6320..48f4aeb62 100644 --- a/tests/test_display_plotly/test_pixel_field_color_scales.yml +++ b/tests/test_display_plotly/test_pixel_field_color_scales.yml @@ -14,53 +14,17 @@ data: - - 1.0 - '#e71111' i: - - 7 - - 0 - - 0 - - 0 - - 4 - - 4 - - 2 - - 6 - - 4 - - 0 - - 3 - - 7 + bdata: BwAAAAQEAgYEAAMH + dtype: i1 intensity: - - 0.0 - - 0.0 - - 1.0 - - 1.0 - - 0.0 - - 0.0 - - 1.0 - - 1.0 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 j: - - 0 - - 7 - - 1 - - 2 - - 6 - - 7 - - 1 - - 2 - - 5 - - 5 - - 2 - - 2 + bdata: AAcBAgYHAQIFBQIC + dtype: i1 k: - - 3 - - 4 - - 2 - - 3 - - 5 - - 6 - - 5 - - 5 - - 0 - - 1 - - 7 - - 6 + bdata: AwQCAwUGBQUAAQcG + dtype: i1 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -69,32 +33,14 @@ data: showscale: false type: mesh3d x: - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 y: - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 z: - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 - facecolor: - '#e15f99' - '#e15f99' @@ -322,683 +268,14 @@ data: - '#440154' - '#440154' i: - - 75 - - 64 - - 2 - - 75 - - 76 - - 65 - - 65 - - 64 - - 2 - - 0 - - 1 - - 0 - - 84 - - 86 - - 86 - - 90 - - 90 - - 92 - - 92 - - 91 - - 91 - - 87 - - 87 - - 85 - - 85 - - 83 - - 83 - - 82 - - 82 - - 84 - - 94 - - 86 - - 86 - - 84 - - 84 - - 82 - - 82 - - 83 - - 83 - - 85 - - 85 - - 87 - - 87 - - 87 - - 91 - - 91 - - 92 - - 92 - - 90 - - 90 - - 94 - - 95 - - 88 - - 78 - - 79 - - 81 - - 80 - - 93 - - 96 - - 89 - - 77 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 50 - - 52 - - 52 - - 44 - - 44 - - 32 - - 32 - - 22 - - 22 - - 14 - - 14 - - 20 - - 20 - - 30 - - 30 - - 41 - - 41 - - 50 - - 57 - - 52 - - 52 - - 50 - - 50 - - 41 - - 41 - - 30 - - 30 - - 20 - - 20 - - 14 - - 14 - - 14 - - 22 - - 22 - - 32 - - 32 - - 44 - - 44 - - 57 - - 11 - - 4 - - 12 - - 58 - - 62 - - 8 - - 7 - - 39 - - 61 - - 42 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 48 - - 54 - - 54 - - 47 - - 47 - - 37 - - 37 - - 25 - - 25 - - 17 - - 17 - - 18 - - 18 - - 26 - - 26 - - 38 - - 38 - - 48 - - 59 - - 54 - - 54 - - 48 - - 48 - - 38 - - 38 - - 26 - - 26 - - 18 - - 18 - - 17 - - 17 - - 17 - - 25 - - 25 - - 37 - - 37 - - 47 - - 47 - - 59 - - 27 - - 5 - - 10 - - 56 - - 60 - - 6 - - 9 - - 55 - - 63 - - 28 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 98 - - 99 - - 100 - - 101 - - 102 - - 104 - - 105 - - 106 - - 107 - - 108 - - 110 - - 111 - - 112 - - 113 - - 114 - - 116 - - 117 - - 118 - - 119 - - 120 - - 122 - - 123 - - 124 - - 125 - - 126 - - 128 - - 129 - - 130 - - 131 - - 132 - - 134 - - 135 - - 136 - - 137 - - 138 - - 140 - - 141 - - 142 - - 143 - - 144 - - 146 - - 147 - - 148 - - 149 - - 150 + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 j: - - 76 - - 76 - - 3 - - 3 - - 3 - - 3 - - 1 - - 1 - - 75 - - 75 - - 3 - - 3 - - 70 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 71 - - 71 - - 69 - - 69 - - 67 - - 67 - - 66 - - 66 - - 68 - - 68 - - 89 - - 89 - - 81 - - 81 - - 79 - - 79 - - 77 - - 77 - - 78 - - 78 - - 80 - - 80 - - 88 - - 93 - - 93 - - 95 - - 95 - - 96 - - 96 - - 94 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 68 - - 68 - - 66 - - 66 - - 67 - - 67 - - 69 - - 51 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 13 - - 13 - - 19 - - 19 - - 29 - - 29 - - 40 - - 40 - - 49 - - 49 - - 61 - - 61 - - 62 - - 62 - - 58 - - 58 - - 42 - - 42 - - 12 - - 12 - - 8 - - 8 - - 4 - - 7 - - 7 - - 11 - - 11 - - 39 - - 39 - - 57 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 49 - - 49 - - 40 - - 40 - - 29 - - 29 - - 19 - - 53 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 15 - - 15 - - 16 - - 16 - - 24 - - 24 - - 36 - - 36 - - 46 - - 46 - - 63 - - 63 - - 60 - - 60 - - 56 - - 56 - - 28 - - 28 - - 10 - - 10 - - 6 - - 6 - - 5 - - 9 - - 9 - - 27 - - 27 - - 55 - - 55 - - 59 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 46 - - 46 - - 36 - - 36 - - 24 - - 24 - - 16 - - 99 - - 100 - - 101 - - 102 - - 98 - - 105 - - 106 - - 107 - - 108 - - 104 - - 111 - - 112 - - 113 - - 114 - - 110 - - 117 - - 118 - - 119 - - 120 - - 116 - - 123 - - 124 - - 125 - - 126 - - 122 - - 129 - - 130 - - 131 - - 132 - - 128 - - 135 - - 136 - - 137 - - 138 - - 134 - - 141 - - 142 - - 143 - - 144 - - 140 - - 147 - - 148 - - 149 - - 150 - - 146 + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 k: - - 64 - - 65 - - 75 - - 76 - - 65 - - 1 - - 64 - - 0 - - 0 - - 64 - - 0 - - 2 - - 86 - - 72 - - 90 - - 74 - - 92 - - 73 - - 91 - - 71 - - 87 - - 69 - - 85 - - 67 - - 83 - - 66 - - 82 - - 68 - - 84 - - 70 - - 86 - - 81 - - 84 - - 79 - - 82 - - 77 - - 83 - - 78 - - 85 - - 80 - - 87 - - 88 - - 93 - - 91 - - 95 - - 92 - - 96 - - 90 - - 94 - - 86 - - 89 - - 96 - - 93 - - 80 - - 77 - - 79 - - 88 - - 95 - - 94 - - 81 - - 78 - - 72 - - 66 - - 74 - - 67 - - 73 - - 69 - - 71 - - 52 - - 43 - - 44 - - 31 - - 32 - - 21 - - 22 - - 13 - - 14 - - 19 - - 20 - - 29 - - 30 - - 40 - - 41 - - 49 - - 50 - - 51 - - 52 - - 62 - - 50 - - 58 - - 41 - - 42 - - 30 - - 12 - - 20 - - 8 - - 14 - - 4 - - 7 - - 22 - - 11 - - 32 - - 39 - - 44 - - 57 - - 52 - - 61 - - 39 - - 7 - - 8 - - 42 - - 58 - - 4 - - 11 - - 57 - - 62 - - 12 - - 43 - - 40 - - 31 - - 29 - - 21 - - 19 - - 13 - - 54 - - 45 - - 47 - - 35 - - 37 - - 23 - - 25 - - 15 - - 17 - - 16 - - 18 - - 24 - - 26 - - 36 - - 38 - - 46 - - 48 - - 53 - - 54 - - 60 - - 48 - - 56 - - 38 - - 28 - - 26 - - 10 - - 18 - - 6 - - 17 - - 5 - - 9 - - 25 - - 27 - - 37 - - 55 - - 47 - - 59 - - 54 - - 63 - - 55 - - 9 - - 6 - - 28 - - 56 - - 5 - - 27 - - 59 - - 60 - - 10 - - 45 - - 36 - - 35 - - 24 - - 23 - - 16 - - 15 - - 103 - - 103 - - 103 - - 103 - - 103 - - 109 - - 109 - - 109 - - 109 - - 109 - - 115 - - 115 - - 115 - - 115 - - 115 - - 121 - - 121 - - 121 - - 121 - - 121 - - 127 - - 127 - - 127 - - 127 - - 127 - - 133 - - 133 - - 133 - - 133 - - 133 - - 139 - - 139 - - 139 - - 139 - - 139 - - 145 - - 145 - - 145 - - 145 - - 145 - - 151 - - 151 - - 151 - - 151 - - 151 + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 legendgroup: Sensor(id=ID) name: Sensor (Viridis) opacity: 1 @@ -1006,464 +283,14 @@ data: showlegend: true type: mesh3d x: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014992463600000002 - - -0.014392395300000003 - - -0.014392395300000003 - - -0.012869499600000002 - - -0.012355425950000002 - - -0.009822911000000002 - - -0.009822911000000002 - - -0.0066605612500000005 - - -0.005795627850000001 - - 0.0 - - -0.004997477680000001 - - 0.0 - - 0.0 - - -0.0046984631550000015 - - -0.0046984631550000015 - - 0.0 - - -0.003930366410000001 - - 0.0 - - -0.003726213425000001 - - 0.0 - - 0.0 - - -0.0025000000350000003 - - -0.0025000000350000003 - - -0.0021347226600000008 - - -0.0021347226600000008 - - 0.0 - - -0.0010241928500000002 - - 0.0 - - -0.0007114128200000001 - - -1.0408340850000002e-17 - - -9.553993650000002e-18 - - 0.0 - - 0.0 - - 0.0008682409300000002 - - 0.0008682409300000002 - - 0.0016630589950000004 - - 0.0 - - 0.0023612117400000003 - - 0.0026042407400000004 - - 0.0 - - 0.0026362657550000005 - - 0.0 - - 0.0 - - 0.003830222040000001 - - 0.003830222040000001 - - 0.0 - - 0.004641779140000001 - - 0.0 - - 0.004750406370000001 - - 0.0 - - 0.0049999997000000004 - - 0.006231224900000001 - - 0.006231224900000001 - - 0.00945867 - - 0.010177281500000003 - - 0.012618804000000003 - - 0.012618804000000003 - - 0.014251218750000003 - - 0.014519108850000004 - - 0.014999999100000003 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.10000000000000002 - - -0.7500000000000001 - - -0.9227457514062634 - - -1.202254248593737 - - -1.2022542485937369 - - -0.9227457514062631 - - -0.9999999999999999 - - -1.3905869642868405 - - -1.2260719938514835 - - -0.9598811800288918 - - -0.9598811800288918 - - -1.2260719938514835 - - -0.8475013375904817 - - -0.7500000000000001 - - -0.9227457514062631 - - -1.2022542485937369 - - -1.202254248593737 - - -0.9227457514062634 - - -0.9999999999999999 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - 1.25 - - 1.0772542485937369 - - 0.797745751406263 - - 0.797745751406263 - - 1.0772542485937366 - - 1.0 - - 1.0855896394678042 - - 0.9210746690324472 - - 0.6548838552098555 - - 0.6548838552098555 - - 0.9210746690324471 - - 1.1524986624095181 - - 1.25 - - 1.0772542485937366 - - 0.797745751406263 - - 0.797745751406263 - - 1.0772542485937366 - - 1.0 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== + dtype: f8 y: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - -0.004225988315000001 - - 0.004225988315000001 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.011336243900000001 - - 0.011336243900000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0017101006600000004 - - 0.0017101006600000004 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.004330126940000001 - - 0.004330126940000001 - - -0.014847321800000002 - - 0.014847321800000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.10000000000000002 - - 0.0 - - 0.0 - - -0.0049240388000000015 - - 0.0049240388000000015 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0032139379550000006 - - 0.0032139379550000006 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.013644480700000003 - - 0.013644480700000003 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.008109612750000002 - - 0.008109612750000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.00028137136250000006 - - 0.0078714803 - - -0.008344890200000002 - - 0.013525193950000004 - - -0.013758964850000003 - - -0.0016490003100000004 - - 0.0017709132300000002 - - -0.0042973283700000016 - - 0.0043621968500000005 - - -0.004934888705000001 - - 0.004912360015000001 - - 0.014884752050000002 - - -0.014804665750000005 - - -0.0032633595150000005 - - 0.0031639754750000006 - - -6.486846850000001e-05 - - 0.011518507450000002 - - -0.011149990550000002 - - 0.004495218770000001 - - -0.0039552707250000005 - - 9.925023200000001e-18 - - -1.353553390593274 - - -1.521678018584263 - - -1.457460125037637 - - -1.2496466561489104 - - -1.1854287626022846 - - -0.6464466094067262 - - 0.0 - - 0.23776412907378844 - - 0.14694631307311834 - - -0.14694631307311828 - - -0.23776412907378847 - - 0.0 - - 1.353553390593274 - - 1.1854287626022846 - - 1.2496466561489104 - - 1.457460125037637 - - 1.521678018584263 - - 0.6464466094067262 - - -1.0 - - -0.7622358709262116 - - -0.8530536869268817 - - -1.1469463130731183 - - -1.2377641290737884 - - -1.0 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 1.0 - - 1.2377641290737884 - - 1.1469463130731183 - - 0.8530536869268818 - - 0.7622358709262116 - - 1.0 - - -0.6464466094067262 - - -0.4783219814157369 - - -0.5425398749623628 - - -0.7503533438510895 - - -0.8145712373977154 - - -1.353553390593274 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 0.6464466094067262 - - 0.8145712373977154 - - 0.7503533438510895 - - 0.5425398749623629 - - 0.4783219814157368 - - 1.353553390593274 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== + dtype: f8 z: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.0004754300695000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.007705580450000002 - - -0.008505494900000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.013440123200000004 - - -0.013835124650000002 - - 0.0 - - 0.00015880254800000005 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.003090666795000001 - - 0.0 - - 0.0033339664350000007 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0048939786850000005 - - 0.0 - - 0.004949130490000001 - - 0.10000000000000002 - - -3.1374891150000003e-18 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.014907522500000003 - - 0.0 - - -0.004407344015000001 - - -0.014772200600000002 - - 0.0 - - 0.0042485412200000015 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0018584636950000003 - - 0.0 - - 0.0015600122500000005 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.011641889050000001 - - -0.011019207550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.004680036755000001 - - -0.003767693415000001 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014997360100000004 - - -0.012768703700000003 - - -0.012464462200000002 - - -0.006486073150000001 - - -0.005974184350000002 - - -0.004720254240000001 - - -0.004675881190000001 - - -0.0025559673100000006 - - -0.0024436118100000007 - - 0.0008042847750000002 - - 0.0009320507750000002 - - 0.0018558396050000002 - - 0.0024128545100000004 - - 0.003788203375000001 - - 0.0038715966050000008 - - 0.004999579490000001 - - 0.009608536200000002 - - 0.0100338295 - - 0.014310590900000003 - - 0.014469133300000003 - - -1.6175736900000002e-18 - - 1.3535533905932737 - - 1.1854287626022844 - - 1.2496466561489104 - - 1.457460125037637 - - 1.521678018584263 - - 0.6464466094067263 - - 1.3999272725498855 - - 1.45261426460265 - - 1.5378636085090187 - - 1.5378636085090187 - - 1.45261426460265 - - 0.5238233962453553 - - 1.3535533905932737 - - 1.521678018584263 - - 1.457460125037637 - - 1.2496466561489104 - - 1.1854287626022844 - - 0.6464466094067263 - - 1.25 - - 1.0772542485937366 - - 0.797745751406263 - - 0.797745751406263 - - 1.0772542485937366 - - 1.0 - - 1.25 - - 1.0772542485937366 - - 0.797745751406263 - - 0.797745751406263 - - 1.0772542485937366 - - 1.0 - - 1.25 - - 1.0772542485937366 - - 0.797745751406263 - - 0.797745751406263 - - 1.0772542485937366 - - 1.0 - - 0.6464466094067263 - - 0.8145712373977156 - - 0.7503533438510896 - - 0.5425398749623629 - - 0.4783219814157369 - - 1.3535533905932737 - - 0.4475740650405964 - - 0.500261057093361 - - 0.5855104009997295 - - 0.5855104009997295 - - 0.500261057093361 - - 1.4761766037546447 - - 0.6464466094067263 - - 0.4783219814157369 - - 0.5425398749623629 - - 0.7503533438510896 - - 0.8145712373977156 - - 1.3535533905932737 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== + dtype: f8 - color: '#2e91e5' colorscale: - - 0.0 @@ -1479,53 +306,17 @@ data: - - 1.0 - '#e71111' i: - - 7 - - 0 - - 0 - - 0 - - 4 - - 4 - - 2 - - 6 - - 4 - - 0 - - 3 - - 7 + bdata: BwAAAAQEAgYEAAMH + dtype: i1 intensity: - - 0.0 - - 0.0 - - 1.0 - - 1.0 - - 0.0 - - 0.0 - - 1.0 - - 1.0 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 j: - - 0 - - 7 - - 1 - - 2 - - 6 - - 7 - - 1 - - 2 - - 5 - - 5 - - 2 - - 2 + bdata: AAcBAgYHAQIFBQIC + dtype: i1 k: - - 3 - - 4 - - 2 - - 3 - - 5 - - 6 - - 5 - - 5 - - 0 - - 1 - - 7 - - 6 + bdata: AwQCAwUGBQUAAQcG + dtype: i1 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -1534,32 +325,14 @@ data: showscale: false type: mesh3d x: - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 y: - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 z: - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 - facecolor: - '#1ca71c' - '#1ca71c' @@ -1787,683 +560,14 @@ data: - '#000004' - '#000004' i: - - 75 - - 64 - - 2 - - 75 - - 76 - - 65 - - 65 - - 64 - - 2 - - 0 - - 1 - - 0 - - 84 - - 86 - - 86 - - 90 - - 90 - - 92 - - 92 - - 91 - - 91 - - 87 - - 87 - - 85 - - 85 - - 83 - - 83 - - 82 - - 82 - - 84 - - 94 - - 86 - - 86 - - 84 - - 84 - - 82 - - 82 - - 83 - - 83 - - 85 - - 85 - - 87 - - 87 - - 87 - - 91 - - 91 - - 92 - - 92 - - 90 - - 90 - - 94 - - 95 - - 88 - - 78 - - 79 - - 81 - - 80 - - 93 - - 96 - - 89 - - 77 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 50 - - 52 - - 52 - - 44 - - 44 - - 32 - - 32 - - 22 - - 22 - - 14 - - 14 - - 20 - - 20 - - 30 - - 30 - - 41 - - 41 - - 50 - - 57 - - 52 - - 52 - - 50 - - 50 - - 41 - - 41 - - 30 - - 30 - - 20 - - 20 - - 14 - - 14 - - 14 - - 22 - - 22 - - 32 - - 32 - - 44 - - 44 - - 57 - - 11 - - 4 - - 12 - - 58 - - 62 - - 8 - - 7 - - 39 - - 61 - - 42 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 48 - - 54 - - 54 - - 47 - - 47 - - 37 - - 37 - - 25 - - 25 - - 17 - - 17 - - 18 - - 18 - - 26 - - 26 - - 38 - - 38 - - 48 - - 59 - - 54 - - 54 - - 48 - - 48 - - 38 - - 38 - - 26 - - 26 - - 18 - - 18 - - 17 - - 17 - - 17 - - 25 - - 25 - - 37 - - 37 - - 47 - - 47 - - 59 - - 27 - - 5 - - 10 - - 56 - - 60 - - 6 - - 9 - - 55 - - 63 - - 28 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 98 - - 99 - - 100 - - 101 - - 102 - - 104 - - 105 - - 106 - - 107 - - 108 - - 110 - - 111 - - 112 - - 113 - - 114 - - 116 - - 117 - - 118 - - 119 - - 120 - - 122 - - 123 - - 124 - - 125 - - 126 - - 128 - - 129 - - 130 - - 131 - - 132 - - 134 - - 135 - - 136 - - 137 - - 138 - - 140 - - 141 - - 142 - - 143 - - 144 - - 146 - - 147 - - 148 - - 149 - - 150 + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 j: - - 76 - - 76 - - 3 - - 3 - - 3 - - 3 - - 1 - - 1 - - 75 - - 75 - - 3 - - 3 - - 70 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 71 - - 71 - - 69 - - 69 - - 67 - - 67 - - 66 - - 66 - - 68 - - 68 - - 89 - - 89 - - 81 - - 81 - - 79 - - 79 - - 77 - - 77 - - 78 - - 78 - - 80 - - 80 - - 88 - - 93 - - 93 - - 95 - - 95 - - 96 - - 96 - - 94 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 68 - - 68 - - 66 - - 66 - - 67 - - 67 - - 69 - - 51 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 13 - - 13 - - 19 - - 19 - - 29 - - 29 - - 40 - - 40 - - 49 - - 49 - - 61 - - 61 - - 62 - - 62 - - 58 - - 58 - - 42 - - 42 - - 12 - - 12 - - 8 - - 8 - - 4 - - 7 - - 7 - - 11 - - 11 - - 39 - - 39 - - 57 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 49 - - 49 - - 40 - - 40 - - 29 - - 29 - - 19 - - 53 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 15 - - 15 - - 16 - - 16 - - 24 - - 24 - - 36 - - 36 - - 46 - - 46 - - 63 - - 63 - - 60 - - 60 - - 56 - - 56 - - 28 - - 28 - - 10 - - 10 - - 6 - - 6 - - 5 - - 9 - - 9 - - 27 - - 27 - - 55 - - 55 - - 59 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 46 - - 46 - - 36 - - 36 - - 24 - - 24 - - 16 - - 99 - - 100 - - 101 - - 102 - - 98 - - 105 - - 106 - - 107 - - 108 - - 104 - - 111 - - 112 - - 113 - - 114 - - 110 - - 117 - - 118 - - 119 - - 120 - - 116 - - 123 - - 124 - - 125 - - 126 - - 122 - - 129 - - 130 - - 131 - - 132 - - 128 - - 135 - - 136 - - 137 - - 138 - - 134 - - 141 - - 142 - - 143 - - 144 - - 140 - - 147 - - 148 - - 149 - - 150 - - 146 + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 k: - - 64 - - 65 - - 75 - - 76 - - 65 - - 1 - - 64 - - 0 - - 0 - - 64 - - 0 - - 2 - - 86 - - 72 - - 90 - - 74 - - 92 - - 73 - - 91 - - 71 - - 87 - - 69 - - 85 - - 67 - - 83 - - 66 - - 82 - - 68 - - 84 - - 70 - - 86 - - 81 - - 84 - - 79 - - 82 - - 77 - - 83 - - 78 - - 85 - - 80 - - 87 - - 88 - - 93 - - 91 - - 95 - - 92 - - 96 - - 90 - - 94 - - 86 - - 89 - - 96 - - 93 - - 80 - - 77 - - 79 - - 88 - - 95 - - 94 - - 81 - - 78 - - 72 - - 66 - - 74 - - 67 - - 73 - - 69 - - 71 - - 52 - - 43 - - 44 - - 31 - - 32 - - 21 - - 22 - - 13 - - 14 - - 19 - - 20 - - 29 - - 30 - - 40 - - 41 - - 49 - - 50 - - 51 - - 52 - - 62 - - 50 - - 58 - - 41 - - 42 - - 30 - - 12 - - 20 - - 8 - - 14 - - 4 - - 7 - - 22 - - 11 - - 32 - - 39 - - 44 - - 57 - - 52 - - 61 - - 39 - - 7 - - 8 - - 42 - - 58 - - 4 - - 11 - - 57 - - 62 - - 12 - - 43 - - 40 - - 31 - - 29 - - 21 - - 19 - - 13 - - 54 - - 45 - - 47 - - 35 - - 37 - - 23 - - 25 - - 15 - - 17 - - 16 - - 18 - - 24 - - 26 - - 36 - - 38 - - 46 - - 48 - - 53 - - 54 - - 60 - - 48 - - 56 - - 38 - - 28 - - 26 - - 10 - - 18 - - 6 - - 17 - - 5 - - 9 - - 25 - - 27 - - 37 - - 55 - - 47 - - 59 - - 54 - - 63 - - 55 - - 9 - - 6 - - 28 - - 56 - - 5 - - 27 - - 59 - - 60 - - 10 - - 45 - - 36 - - 35 - - 24 - - 23 - - 16 - - 15 - - 103 - - 103 - - 103 - - 103 - - 103 - - 109 - - 109 - - 109 - - 109 - - 109 - - 115 - - 115 - - 115 - - 115 - - 115 - - 121 - - 121 - - 121 - - 121 - - 121 - - 127 - - 127 - - 127 - - 127 - - 127 - - 133 - - 133 - - 133 - - 133 - - 133 - - 139 - - 139 - - 139 - - 139 - - 139 - - 145 - - 145 - - 145 - - 145 - - 145 - - 151 - - 151 - - 151 - - 151 - - 151 + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 legendgroup: Sensor(id=ID) name: Sensor (Inferno) opacity: 1 @@ -2471,464 +575,14 @@ data: showlegend: true type: mesh3d x: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014992463600000002 - - -0.014392395300000003 - - -0.014392395300000003 - - -0.012869499600000002 - - -0.012355425950000002 - - -0.009822911000000002 - - -0.009822911000000002 - - -0.0066605612500000005 - - -0.005795627850000001 - - 0.0 - - -0.004997477680000001 - - 0.0 - - 0.0 - - -0.0046984631550000015 - - -0.0046984631550000015 - - 0.0 - - -0.003930366410000001 - - 0.0 - - -0.003726213425000001 - - 0.0 - - 0.0 - - -0.0025000000350000003 - - -0.0025000000350000003 - - -0.0021347226600000008 - - -0.0021347226600000008 - - 0.0 - - -0.0010241928500000002 - - 0.0 - - -0.0007114128200000001 - - -1.0408340850000002e-17 - - -9.553993650000002e-18 - - 0.0 - - 0.0 - - 0.0008682409300000002 - - 0.0008682409300000002 - - 0.0016630589950000004 - - 0.0 - - 0.0023612117400000003 - - 0.0026042407400000004 - - 0.0 - - 0.0026362657550000005 - - 0.0 - - 0.0 - - 0.003830222040000001 - - 0.003830222040000001 - - 0.0 - - 0.004641779140000001 - - 0.0 - - 0.004750406370000001 - - 0.0 - - 0.0049999997000000004 - - 0.006231224900000001 - - 0.006231224900000001 - - 0.00945867 - - 0.010177281500000003 - - 0.012618804000000003 - - 0.012618804000000003 - - 0.014251218750000003 - - 0.014519108850000004 - - 0.014999999100000003 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.10000000000000002 - - -0.7500000000000001 - - -0.9227457514062634 - - -1.202254248593737 - - -1.2022542485937369 - - -0.9227457514062631 - - -0.9999999999999999 - - -1.3905869642868405 - - -1.2260719938514835 - - -0.9598811800288918 - - -0.9598811800288918 - - -1.2260719938514835 - - -0.8475013375904817 - - -0.7500000000000001 - - -0.9227457514062631 - - -1.2022542485937369 - - -1.202254248593737 - - -0.9227457514062634 - - -0.9999999999999999 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - 1.25 - - 1.0772542485937369 - - 0.797745751406263 - - 0.797745751406263 - - 1.0772542485937366 - - 1.0 - - 1.0855896394678042 - - 0.9210746690324472 - - 0.6548838552098555 - - 0.6548838552098555 - - 0.9210746690324471 - - 1.1524986624095181 - - 1.25 - - 1.0772542485937366 - - 0.797745751406263 - - 0.797745751406263 - - 1.0772542485937366 - - 1.0 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== + dtype: f8 y: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - -0.004225988315000001 - - 0.004225988315000001 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.011336243900000001 - - 0.011336243900000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0017101006600000004 - - 0.0017101006600000004 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.004330126940000001 - - 0.004330126940000001 - - -0.014847321800000002 - - 0.014847321800000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.10000000000000002 - - 0.0 - - 0.0 - - -0.0049240388000000015 - - 0.0049240388000000015 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0032139379550000006 - - 0.0032139379550000006 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.013644480700000003 - - 0.013644480700000003 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.008109612750000002 - - 0.008109612750000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.00028137136250000006 - - 0.0078714803 - - -0.008344890200000002 - - 0.013525193950000004 - - -0.013758964850000003 - - -0.0016490003100000004 - - 0.0017709132300000002 - - -0.0042973283700000016 - - 0.0043621968500000005 - - -0.004934888705000001 - - 0.004912360015000001 - - 0.014884752050000002 - - -0.014804665750000005 - - -0.0032633595150000005 - - 0.0031639754750000006 - - -6.486846850000001e-05 - - 0.011518507450000002 - - -0.011149990550000002 - - 0.004495218770000001 - - -0.0039552707250000005 - - 9.925023200000001e-18 - - -1.353553390593274 - - -1.521678018584263 - - -1.457460125037637 - - -1.2496466561489104 - - -1.1854287626022846 - - -0.6464466094067262 - - 0.0 - - 0.23776412907378844 - - 0.14694631307311834 - - -0.14694631307311828 - - -0.23776412907378847 - - 0.0 - - 1.353553390593274 - - 1.1854287626022846 - - 1.2496466561489104 - - 1.457460125037637 - - 1.521678018584263 - - 0.6464466094067262 - - -1.0 - - -0.7622358709262116 - - -0.8530536869268817 - - -1.1469463130731183 - - -1.2377641290737884 - - -1.0 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 1.0 - - 1.2377641290737884 - - 1.1469463130731183 - - 0.8530536869268818 - - 0.7622358709262116 - - 1.0 - - -0.6464466094067262 - - -0.4783219814157369 - - -0.5425398749623628 - - -0.7503533438510895 - - -0.8145712373977154 - - -1.353553390593274 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 0.6464466094067262 - - 0.8145712373977154 - - 0.7503533438510895 - - 0.5425398749623629 - - 0.4783219814157368 - - 1.353553390593274 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== + dtype: f8 z: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.0004754300695000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.007705580450000002 - - -0.008505494900000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.013440123200000004 - - -0.013835124650000002 - - 0.0 - - 0.00015880254800000005 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.003090666795000001 - - 0.0 - - 0.0033339664350000007 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0048939786850000005 - - 0.0 - - 0.004949130490000001 - - 0.10000000000000002 - - -3.1374891150000003e-18 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.014907522500000003 - - 0.0 - - -0.004407344015000001 - - -0.014772200600000002 - - 0.0 - - 0.0042485412200000015 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0018584636950000003 - - 0.0 - - 0.0015600122500000005 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.011641889050000001 - - -0.011019207550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.004680036755000001 - - -0.003767693415000001 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014997360100000004 - - -0.012768703700000003 - - -0.012464462200000002 - - -0.006486073150000001 - - -0.005974184350000002 - - -0.004720254240000001 - - -0.004675881190000001 - - -0.0025559673100000006 - - -0.0024436118100000007 - - 0.0008042847750000002 - - 0.0009320507750000002 - - 0.0018558396050000002 - - 0.0024128545100000004 - - 0.003788203375000001 - - 0.0038715966050000008 - - 0.004999579490000001 - - 0.009608536200000002 - - 0.0100338295 - - 0.014310590900000003 - - 0.014469133300000003 - - -1.6175736900000002e-18 - - 1.3535533905932737 - - 1.1854287626022844 - - 1.2496466561489104 - - 1.457460125037637 - - 1.521678018584263 - - 0.6464466094067263 - - 1.3999272725498855 - - 1.45261426460265 - - 1.5378636085090187 - - 1.5378636085090187 - - 1.45261426460265 - - 0.5238233962453553 - - 1.3535533905932737 - - 1.521678018584263 - - 1.457460125037637 - - 1.2496466561489104 - - 1.1854287626022844 - - 0.6464466094067263 - - 1.25 - - 1.0772542485937366 - - 0.797745751406263 - - 0.797745751406263 - - 1.0772542485937366 - - 1.0 - - 1.25 - - 1.0772542485937366 - - 0.797745751406263 - - 0.797745751406263 - - 1.0772542485937366 - - 1.0 - - 1.25 - - 1.0772542485937366 - - 0.797745751406263 - - 0.797745751406263 - - 1.0772542485937366 - - 1.0 - - 0.6464466094067263 - - 0.8145712373977156 - - 0.7503533438510896 - - 0.5425398749623629 - - 0.4783219814157369 - - 1.3535533905932737 - - 0.4475740650405964 - - 0.500261057093361 - - 0.5855104009997295 - - 0.5855104009997295 - - 0.500261057093361 - - 1.4761766037546447 - - 0.6464466094067263 - - 0.4783219814157369 - - 0.5425398749623629 - - 0.7503533438510896 - - 0.8145712373977156 - - 1.3535533905932737 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== + dtype: f8 - color: '#2e91e5' colorscale: - - 0.0 @@ -2944,53 +598,17 @@ data: - - 1.0 - '#e71111' i: - - 7 - - 0 - - 0 - - 0 - - 4 - - 4 - - 2 - - 6 - - 4 - - 0 - - 3 - - 7 + bdata: BwAAAAQEAgYEAAMH + dtype: i1 intensity: - - 0.0 - - 0.0 - - 1.0 - - 1.0 - - 0.0 - - 0.0 - - 1.0 - - 1.0 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 j: - - 0 - - 7 - - 1 - - 2 - - 6 - - 7 - - 1 - - 2 - - 5 - - 5 - - 2 - - 2 + bdata: AAcBAgYHAQIFBQIC + dtype: i1 k: - - 3 - - 4 - - 2 - - 3 - - 5 - - 6 - - 5 - - 5 - - 0 - - 1 - - 7 - - 6 + bdata: AwQCAwUGBQUAAQcG + dtype: i1 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -2999,32 +617,14 @@ data: showscale: false type: mesh3d x: - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 y: - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 z: - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 - facecolor: - '#fb0d0d' - '#fb0d0d' @@ -3252,683 +852,14 @@ data: - '#fff5eb' - '#fff5eb' i: - - 75 - - 64 - - 2 - - 75 - - 76 - - 65 - - 65 - - 64 - - 2 - - 0 - - 1 - - 0 - - 84 - - 86 - - 86 - - 90 - - 90 - - 92 - - 92 - - 91 - - 91 - - 87 - - 87 - - 85 - - 85 - - 83 - - 83 - - 82 - - 82 - - 84 - - 94 - - 86 - - 86 - - 84 - - 84 - - 82 - - 82 - - 83 - - 83 - - 85 - - 85 - - 87 - - 87 - - 87 - - 91 - - 91 - - 92 - - 92 - - 90 - - 90 - - 94 - - 95 - - 88 - - 78 - - 79 - - 81 - - 80 - - 93 - - 96 - - 89 - - 77 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 50 - - 52 - - 52 - - 44 - - 44 - - 32 - - 32 - - 22 - - 22 - - 14 - - 14 - - 20 - - 20 - - 30 - - 30 - - 41 - - 41 - - 50 - - 57 - - 52 - - 52 - - 50 - - 50 - - 41 - - 41 - - 30 - - 30 - - 20 - - 20 - - 14 - - 14 - - 14 - - 22 - - 22 - - 32 - - 32 - - 44 - - 44 - - 57 - - 11 - - 4 - - 12 - - 58 - - 62 - - 8 - - 7 - - 39 - - 61 - - 42 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 48 - - 54 - - 54 - - 47 - - 47 - - 37 - - 37 - - 25 - - 25 - - 17 - - 17 - - 18 - - 18 - - 26 - - 26 - - 38 - - 38 - - 48 - - 59 - - 54 - - 54 - - 48 - - 48 - - 38 - - 38 - - 26 - - 26 - - 18 - - 18 - - 17 - - 17 - - 17 - - 25 - - 25 - - 37 - - 37 - - 47 - - 47 - - 59 - - 27 - - 5 - - 10 - - 56 - - 60 - - 6 - - 9 - - 55 - - 63 - - 28 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 98 - - 99 - - 100 - - 101 - - 102 - - 104 - - 105 - - 106 - - 107 - - 108 - - 110 - - 111 - - 112 - - 113 - - 114 - - 116 - - 117 - - 118 - - 119 - - 120 - - 122 - - 123 - - 124 - - 125 - - 126 - - 128 - - 129 - - 130 - - 131 - - 132 - - 134 - - 135 - - 136 - - 137 - - 138 - - 140 - - 141 - - 142 - - 143 - - 144 - - 146 - - 147 - - 148 - - 149 - - 150 + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 j: - - 76 - - 76 - - 3 - - 3 - - 3 - - 3 - - 1 - - 1 - - 75 - - 75 - - 3 - - 3 - - 70 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 71 - - 71 - - 69 - - 69 - - 67 - - 67 - - 66 - - 66 - - 68 - - 68 - - 89 - - 89 - - 81 - - 81 - - 79 - - 79 - - 77 - - 77 - - 78 - - 78 - - 80 - - 80 - - 88 - - 93 - - 93 - - 95 - - 95 - - 96 - - 96 - - 94 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 68 - - 68 - - 66 - - 66 - - 67 - - 67 - - 69 - - 51 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 13 - - 13 - - 19 - - 19 - - 29 - - 29 - - 40 - - 40 - - 49 - - 49 - - 61 - - 61 - - 62 - - 62 - - 58 - - 58 - - 42 - - 42 - - 12 - - 12 - - 8 - - 8 - - 4 - - 7 - - 7 - - 11 - - 11 - - 39 - - 39 - - 57 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 49 - - 49 - - 40 - - 40 - - 29 - - 29 - - 19 - - 53 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 15 - - 15 - - 16 - - 16 - - 24 - - 24 - - 36 - - 36 - - 46 - - 46 - - 63 - - 63 - - 60 - - 60 - - 56 - - 56 - - 28 - - 28 - - 10 - - 10 - - 6 - - 6 - - 5 - - 9 - - 9 - - 27 - - 27 - - 55 - - 55 - - 59 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 46 - - 46 - - 36 - - 36 - - 24 - - 24 - - 16 - - 99 - - 100 - - 101 - - 102 - - 98 - - 105 - - 106 - - 107 - - 108 - - 104 - - 111 - - 112 - - 113 - - 114 - - 110 - - 117 - - 118 - - 119 - - 120 - - 116 - - 123 - - 124 - - 125 - - 126 - - 122 - - 129 - - 130 - - 131 - - 132 - - 128 - - 135 - - 136 - - 137 - - 138 - - 134 - - 141 - - 142 - - 143 - - 144 - - 140 - - 147 - - 148 - - 149 - - 150 - - 146 + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 k: - - 64 - - 65 - - 75 - - 76 - - 65 - - 1 - - 64 - - 0 - - 0 - - 64 - - 0 - - 2 - - 86 - - 72 - - 90 - - 74 - - 92 - - 73 - - 91 - - 71 - - 87 - - 69 - - 85 - - 67 - - 83 - - 66 - - 82 - - 68 - - 84 - - 70 - - 86 - - 81 - - 84 - - 79 - - 82 - - 77 - - 83 - - 78 - - 85 - - 80 - - 87 - - 88 - - 93 - - 91 - - 95 - - 92 - - 96 - - 90 - - 94 - - 86 - - 89 - - 96 - - 93 - - 80 - - 77 - - 79 - - 88 - - 95 - - 94 - - 81 - - 78 - - 72 - - 66 - - 74 - - 67 - - 73 - - 69 - - 71 - - 52 - - 43 - - 44 - - 31 - - 32 - - 21 - - 22 - - 13 - - 14 - - 19 - - 20 - - 29 - - 30 - - 40 - - 41 - - 49 - - 50 - - 51 - - 52 - - 62 - - 50 - - 58 - - 41 - - 42 - - 30 - - 12 - - 20 - - 8 - - 14 - - 4 - - 7 - - 22 - - 11 - - 32 - - 39 - - 44 - - 57 - - 52 - - 61 - - 39 - - 7 - - 8 - - 42 - - 58 - - 4 - - 11 - - 57 - - 62 - - 12 - - 43 - - 40 - - 31 - - 29 - - 21 - - 19 - - 13 - - 54 - - 45 - - 47 - - 35 - - 37 - - 23 - - 25 - - 15 - - 17 - - 16 - - 18 - - 24 - - 26 - - 36 - - 38 - - 46 - - 48 - - 53 - - 54 - - 60 - - 48 - - 56 - - 38 - - 28 - - 26 - - 10 - - 18 - - 6 - - 17 - - 5 - - 9 - - 25 - - 27 - - 37 - - 55 - - 47 - - 59 - - 54 - - 63 - - 55 - - 9 - - 6 - - 28 - - 56 - - 5 - - 27 - - 59 - - 60 - - 10 - - 45 - - 36 - - 35 - - 24 - - 23 - - 16 - - 15 - - 103 - - 103 - - 103 - - 103 - - 103 - - 109 - - 109 - - 109 - - 109 - - 109 - - 115 - - 115 - - 115 - - 115 - - 115 - - 121 - - 121 - - 121 - - 121 - - 121 - - 127 - - 127 - - 127 - - 127 - - 127 - - 133 - - 133 - - 133 - - 133 - - 133 - - 139 - - 139 - - 139 - - 139 - - 139 - - 145 - - 145 - - 145 - - 145 - - 145 - - 151 - - 151 - - 151 - - 151 - - 151 + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 legendgroup: Sensor(id=ID) name: Sensor (Oranges) opacity: 1 @@ -3936,464 +867,14 @@ data: showlegend: true type: mesh3d x: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014992463600000002 - - -0.014392395300000003 - - -0.014392395300000003 - - -0.012869499600000002 - - -0.012355425950000002 - - -0.009822911000000002 - - -0.009822911000000002 - - -0.0066605612500000005 - - -0.005795627850000001 - - 0.0 - - -0.004997477680000001 - - 0.0 - - 0.0 - - -0.0046984631550000015 - - -0.0046984631550000015 - - 0.0 - - -0.003930366410000001 - - 0.0 - - -0.003726213425000001 - - 0.0 - - 0.0 - - -0.0025000000350000003 - - -0.0025000000350000003 - - -0.0021347226600000008 - - -0.0021347226600000008 - - 0.0 - - -0.0010241928500000002 - - 0.0 - - -0.0007114128200000001 - - -1.0408340850000002e-17 - - -9.553993650000002e-18 - - 0.0 - - 0.0 - - 0.0008682409300000002 - - 0.0008682409300000002 - - 0.0016630589950000004 - - 0.0 - - 0.0023612117400000003 - - 0.0026042407400000004 - - 0.0 - - 0.0026362657550000005 - - 0.0 - - 0.0 - - 0.003830222040000001 - - 0.003830222040000001 - - 0.0 - - 0.004641779140000001 - - 0.0 - - 0.004750406370000001 - - 0.0 - - 0.0049999997000000004 - - 0.006231224900000001 - - 0.006231224900000001 - - 0.00945867 - - 0.010177281500000003 - - 0.012618804000000003 - - 0.012618804000000003 - - 0.014251218750000003 - - 0.014519108850000004 - - 0.014999999100000003 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.10000000000000002 - - -0.7500000000000001 - - -0.9227457514062634 - - -1.202254248593737 - - -1.2022542485937369 - - -0.9227457514062631 - - -0.9999999999999999 - - -1.3905869642868405 - - -1.2260719938514835 - - -0.9598811800288918 - - -0.9598811800288918 - - -1.2260719938514835 - - -0.8475013375904817 - - -0.7500000000000001 - - -0.9227457514062631 - - -1.2022542485937369 - - -1.202254248593737 - - -0.9227457514062634 - - -0.9999999999999999 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - 1.25 - - 1.0772542485937369 - - 0.797745751406263 - - 0.797745751406263 - - 1.0772542485937366 - - 1.0 - - 1.0855896394678042 - - 0.9210746690324472 - - 0.6548838552098555 - - 0.6548838552098555 - - 0.9210746690324471 - - 1.1524986624095181 - - 1.25 - - 1.0772542485937366 - - 0.797745751406263 - - 0.797745751406263 - - 1.0772542485937366 - - 1.0 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== + dtype: f8 y: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - -0.004225988315000001 - - 0.004225988315000001 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.011336243900000001 - - 0.011336243900000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0017101006600000004 - - 0.0017101006600000004 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.004330126940000001 - - 0.004330126940000001 - - -0.014847321800000002 - - 0.014847321800000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.10000000000000002 - - 0.0 - - 0.0 - - -0.0049240388000000015 - - 0.0049240388000000015 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0032139379550000006 - - 0.0032139379550000006 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.013644480700000003 - - 0.013644480700000003 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.008109612750000002 - - 0.008109612750000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.00028137136250000006 - - 0.0078714803 - - -0.008344890200000002 - - 0.013525193950000004 - - -0.013758964850000003 - - -0.0016490003100000004 - - 0.0017709132300000002 - - -0.0042973283700000016 - - 0.0043621968500000005 - - -0.004934888705000001 - - 0.004912360015000001 - - 0.014884752050000002 - - -0.014804665750000005 - - -0.0032633595150000005 - - 0.0031639754750000006 - - -6.486846850000001e-05 - - 0.011518507450000002 - - -0.011149990550000002 - - 0.004495218770000001 - - -0.0039552707250000005 - - 9.925023200000001e-18 - - -1.353553390593274 - - -1.521678018584263 - - -1.457460125037637 - - -1.2496466561489104 - - -1.1854287626022846 - - -0.6464466094067262 - - 0.0 - - 0.23776412907378844 - - 0.14694631307311834 - - -0.14694631307311828 - - -0.23776412907378847 - - 0.0 - - 1.353553390593274 - - 1.1854287626022846 - - 1.2496466561489104 - - 1.457460125037637 - - 1.521678018584263 - - 0.6464466094067262 - - -1.0 - - -0.7622358709262116 - - -0.8530536869268817 - - -1.1469463130731183 - - -1.2377641290737884 - - -1.0 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 1.0 - - 1.2377641290737884 - - 1.1469463130731183 - - 0.8530536869268818 - - 0.7622358709262116 - - 1.0 - - -0.6464466094067262 - - -0.4783219814157369 - - -0.5425398749623628 - - -0.7503533438510895 - - -0.8145712373977154 - - -1.353553390593274 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 0.6464466094067262 - - 0.8145712373977154 - - 0.7503533438510895 - - 0.5425398749623629 - - 0.4783219814157368 - - 1.353553390593274 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== + dtype: f8 z: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.0004754300695000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.007705580450000002 - - -0.008505494900000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.013440123200000004 - - -0.013835124650000002 - - 0.0 - - 0.00015880254800000005 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.003090666795000001 - - 0.0 - - 0.0033339664350000007 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0048939786850000005 - - 0.0 - - 0.004949130490000001 - - 0.10000000000000002 - - -3.1374891150000003e-18 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.014907522500000003 - - 0.0 - - -0.004407344015000001 - - -0.014772200600000002 - - 0.0 - - 0.0042485412200000015 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0018584636950000003 - - 0.0 - - 0.0015600122500000005 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.011641889050000001 - - -0.011019207550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.004680036755000001 - - -0.003767693415000001 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014997360100000004 - - -0.012768703700000003 - - -0.012464462200000002 - - -0.006486073150000001 - - -0.005974184350000002 - - -0.004720254240000001 - - -0.004675881190000001 - - -0.0025559673100000006 - - -0.0024436118100000007 - - 0.0008042847750000002 - - 0.0009320507750000002 - - 0.0018558396050000002 - - 0.0024128545100000004 - - 0.003788203375000001 - - 0.0038715966050000008 - - 0.004999579490000001 - - 0.009608536200000002 - - 0.0100338295 - - 0.014310590900000003 - - 0.014469133300000003 - - -1.6175736900000002e-18 - - 1.3535533905932737 - - 1.1854287626022844 - - 1.2496466561489104 - - 1.457460125037637 - - 1.521678018584263 - - 0.6464466094067263 - - 1.3999272725498855 - - 1.45261426460265 - - 1.5378636085090187 - - 1.5378636085090187 - - 1.45261426460265 - - 0.5238233962453553 - - 1.3535533905932737 - - 1.521678018584263 - - 1.457460125037637 - - 1.2496466561489104 - - 1.1854287626022844 - - 0.6464466094067263 - - 1.25 - - 1.0772542485937366 - - 0.797745751406263 - - 0.797745751406263 - - 1.0772542485937366 - - 1.0 - - 1.25 - - 1.0772542485937366 - - 0.797745751406263 - - 0.797745751406263 - - 1.0772542485937366 - - 1.0 - - 1.25 - - 1.0772542485937366 - - 0.797745751406263 - - 0.797745751406263 - - 1.0772542485937366 - - 1.0 - - 0.6464466094067263 - - 0.8145712373977156 - - 0.7503533438510896 - - 0.5425398749623629 - - 0.4783219814157369 - - 1.3535533905932737 - - 0.4475740650405964 - - 0.500261057093361 - - 0.5855104009997295 - - 0.5855104009997295 - - 0.500261057093361 - - 1.4761766037546447 - - 0.6464466094067263 - - 0.4783219814157369 - - 0.5425398749623629 - - 0.7503533438510896 - - 0.8145712373977156 - - 1.3535533905932737 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== + dtype: f8 - color: '#2e91e5' colorscale: - - 0.0 @@ -4409,53 +890,17 @@ data: - - 1.0 - '#e71111' i: - - 7 - - 0 - - 0 - - 0 - - 4 - - 4 - - 2 - - 6 - - 4 - - 0 - - 3 - - 7 + bdata: BwAAAAQEAgYEAAMH + dtype: i1 intensity: - - 0.0 - - 0.0 - - 1.0 - - 1.0 - - 0.0 - - 0.0 - - 1.0 - - 1.0 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 j: - - 0 - - 7 - - 1 - - 2 - - 6 - - 7 - - 1 - - 2 - - 5 - - 5 - - 2 - - 2 + bdata: AAcBAgYHAQIFBQIC + dtype: i1 k: - - 3 - - 4 - - 2 - - 3 - - 5 - - 6 - - 5 - - 5 - - 0 - - 1 - - 7 - - 6 + bdata: AwQCAwUGBQUAAQcG + dtype: i1 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -4464,32 +909,14 @@ data: showscale: false type: mesh3d x: - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 y: - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 z: - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 - facecolor: - '#da16ff' - '#da16ff' @@ -4717,683 +1144,14 @@ data: - '#fff7f3' - '#fff7f3' i: - - 75 - - 64 - - 2 - - 75 - - 76 - - 65 - - 65 - - 64 - - 2 - - 0 - - 1 - - 0 - - 84 - - 86 - - 86 - - 90 - - 90 - - 92 - - 92 - - 91 - - 91 - - 87 - - 87 - - 85 - - 85 - - 83 - - 83 - - 82 - - 82 - - 84 - - 94 - - 86 - - 86 - - 84 - - 84 - - 82 - - 82 - - 83 - - 83 - - 85 - - 85 - - 87 - - 87 - - 87 - - 91 - - 91 - - 92 - - 92 - - 90 - - 90 - - 94 - - 95 - - 88 - - 78 - - 79 - - 81 - - 80 - - 93 - - 96 - - 89 - - 77 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 50 - - 52 - - 52 - - 44 - - 44 - - 32 - - 32 - - 22 - - 22 - - 14 - - 14 - - 20 - - 20 - - 30 - - 30 - - 41 - - 41 - - 50 - - 57 - - 52 - - 52 - - 50 - - 50 - - 41 - - 41 - - 30 - - 30 - - 20 - - 20 - - 14 - - 14 - - 14 - - 22 - - 22 - - 32 - - 32 - - 44 - - 44 - - 57 - - 11 - - 4 - - 12 - - 58 - - 62 - - 8 - - 7 - - 39 - - 61 - - 42 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 48 - - 54 - - 54 - - 47 - - 47 - - 37 - - 37 - - 25 - - 25 - - 17 - - 17 - - 18 - - 18 - - 26 - - 26 - - 38 - - 38 - - 48 - - 59 - - 54 - - 54 - - 48 - - 48 - - 38 - - 38 - - 26 - - 26 - - 18 - - 18 - - 17 - - 17 - - 17 - - 25 - - 25 - - 37 - - 37 - - 47 - - 47 - - 59 - - 27 - - 5 - - 10 - - 56 - - 60 - - 6 - - 9 - - 55 - - 63 - - 28 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 98 - - 99 - - 100 - - 101 - - 102 - - 104 - - 105 - - 106 - - 107 - - 108 - - 110 - - 111 - - 112 - - 113 - - 114 - - 116 - - 117 - - 118 - - 119 - - 120 - - 122 - - 123 - - 124 - - 125 - - 126 - - 128 - - 129 - - 130 - - 131 - - 132 - - 134 - - 135 - - 136 - - 137 - - 138 - - 140 - - 141 - - 142 - - 143 - - 144 - - 146 - - 147 - - 148 - - 149 - - 150 + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 j: - - 76 - - 76 - - 3 - - 3 - - 3 - - 3 - - 1 - - 1 - - 75 - - 75 - - 3 - - 3 - - 70 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 71 - - 71 - - 69 - - 69 - - 67 - - 67 - - 66 - - 66 - - 68 - - 68 - - 89 - - 89 - - 81 - - 81 - - 79 - - 79 - - 77 - - 77 - - 78 - - 78 - - 80 - - 80 - - 88 - - 93 - - 93 - - 95 - - 95 - - 96 - - 96 - - 94 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 68 - - 68 - - 66 - - 66 - - 67 - - 67 - - 69 - - 51 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 13 - - 13 - - 19 - - 19 - - 29 - - 29 - - 40 - - 40 - - 49 - - 49 - - 61 - - 61 - - 62 - - 62 - - 58 - - 58 - - 42 - - 42 - - 12 - - 12 - - 8 - - 8 - - 4 - - 7 - - 7 - - 11 - - 11 - - 39 - - 39 - - 57 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 49 - - 49 - - 40 - - 40 - - 29 - - 29 - - 19 - - 53 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 15 - - 15 - - 16 - - 16 - - 24 - - 24 - - 36 - - 36 - - 46 - - 46 - - 63 - - 63 - - 60 - - 60 - - 56 - - 56 - - 28 - - 28 - - 10 - - 10 - - 6 - - 6 - - 5 - - 9 - - 9 - - 27 - - 27 - - 55 - - 55 - - 59 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 46 - - 46 - - 36 - - 36 - - 24 - - 24 - - 16 - - 99 - - 100 - - 101 - - 102 - - 98 - - 105 - - 106 - - 107 - - 108 - - 104 - - 111 - - 112 - - 113 - - 114 - - 110 - - 117 - - 118 - - 119 - - 120 - - 116 - - 123 - - 124 - - 125 - - 126 - - 122 - - 129 - - 130 - - 131 - - 132 - - 128 - - 135 - - 136 - - 137 - - 138 - - 134 - - 141 - - 142 - - 143 - - 144 - - 140 - - 147 - - 148 - - 149 - - 150 - - 146 + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 k: - - 64 - - 65 - - 75 - - 76 - - 65 - - 1 - - 64 - - 0 - - 0 - - 64 - - 0 - - 2 - - 86 - - 72 - - 90 - - 74 - - 92 - - 73 - - 91 - - 71 - - 87 - - 69 - - 85 - - 67 - - 83 - - 66 - - 82 - - 68 - - 84 - - 70 - - 86 - - 81 - - 84 - - 79 - - 82 - - 77 - - 83 - - 78 - - 85 - - 80 - - 87 - - 88 - - 93 - - 91 - - 95 - - 92 - - 96 - - 90 - - 94 - - 86 - - 89 - - 96 - - 93 - - 80 - - 77 - - 79 - - 88 - - 95 - - 94 - - 81 - - 78 - - 72 - - 66 - - 74 - - 67 - - 73 - - 69 - - 71 - - 52 - - 43 - - 44 - - 31 - - 32 - - 21 - - 22 - - 13 - - 14 - - 19 - - 20 - - 29 - - 30 - - 40 - - 41 - - 49 - - 50 - - 51 - - 52 - - 62 - - 50 - - 58 - - 41 - - 42 - - 30 - - 12 - - 20 - - 8 - - 14 - - 4 - - 7 - - 22 - - 11 - - 32 - - 39 - - 44 - - 57 - - 52 - - 61 - - 39 - - 7 - - 8 - - 42 - - 58 - - 4 - - 11 - - 57 - - 62 - - 12 - - 43 - - 40 - - 31 - - 29 - - 21 - - 19 - - 13 - - 54 - - 45 - - 47 - - 35 - - 37 - - 23 - - 25 - - 15 - - 17 - - 16 - - 18 - - 24 - - 26 - - 36 - - 38 - - 46 - - 48 - - 53 - - 54 - - 60 - - 48 - - 56 - - 38 - - 28 - - 26 - - 10 - - 18 - - 6 - - 17 - - 5 - - 9 - - 25 - - 27 - - 37 - - 55 - - 47 - - 59 - - 54 - - 63 - - 55 - - 9 - - 6 - - 28 - - 56 - - 5 - - 27 - - 59 - - 60 - - 10 - - 45 - - 36 - - 35 - - 24 - - 23 - - 16 - - 15 - - 103 - - 103 - - 103 - - 103 - - 103 - - 109 - - 109 - - 109 - - 109 - - 109 - - 115 - - 115 - - 115 - - 115 - - 115 - - 121 - - 121 - - 121 - - 121 - - 121 - - 127 - - 127 - - 127 - - 127 - - 127 - - 133 - - 133 - - 133 - - 133 - - 133 - - 139 - - 139 - - 139 - - 139 - - 139 - - 145 - - 145 - - 145 - - 145 - - 145 - - 151 - - 151 - - 151 - - 151 - - 151 + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 legendgroup: Sensor(id=ID) name: Sensor (RdPu) opacity: 1 @@ -5401,464 +1159,14 @@ data: showlegend: true type: mesh3d x: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014992463600000002 - - -0.014392395300000003 - - -0.014392395300000003 - - -0.012869499600000002 - - -0.012355425950000002 - - -0.009822911000000002 - - -0.009822911000000002 - - -0.0066605612500000005 - - -0.005795627850000001 - - 0.0 - - -0.004997477680000001 - - 0.0 - - 0.0 - - -0.0046984631550000015 - - -0.0046984631550000015 - - 0.0 - - -0.003930366410000001 - - 0.0 - - -0.003726213425000001 - - 0.0 - - 0.0 - - -0.0025000000350000003 - - -0.0025000000350000003 - - -0.0021347226600000008 - - -0.0021347226600000008 - - 0.0 - - -0.0010241928500000002 - - 0.0 - - -0.0007114128200000001 - - -1.0408340850000002e-17 - - -9.553993650000002e-18 - - 0.0 - - 0.0 - - 0.0008682409300000002 - - 0.0008682409300000002 - - 0.0016630589950000004 - - 0.0 - - 0.0023612117400000003 - - 0.0026042407400000004 - - 0.0 - - 0.0026362657550000005 - - 0.0 - - 0.0 - - 0.003830222040000001 - - 0.003830222040000001 - - 0.0 - - 0.004641779140000001 - - 0.0 - - 0.004750406370000001 - - 0.0 - - 0.0049999997000000004 - - 0.006231224900000001 - - 0.006231224900000001 - - 0.00945867 - - 0.010177281500000003 - - 0.012618804000000003 - - 0.012618804000000003 - - 0.014251218750000003 - - 0.014519108850000004 - - 0.014999999100000003 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.10000000000000002 - - -0.7500000000000001 - - -0.9227457514062634 - - -1.202254248593737 - - -1.2022542485937369 - - -0.9227457514062631 - - -0.9999999999999999 - - -1.3905869642868405 - - -1.2260719938514835 - - -0.9598811800288918 - - -0.9598811800288918 - - -1.2260719938514835 - - -0.8475013375904817 - - -0.7500000000000001 - - -0.9227457514062631 - - -1.2022542485937369 - - -1.202254248593737 - - -0.9227457514062634 - - -0.9999999999999999 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - 1.25 - - 1.0772542485937369 - - 0.797745751406263 - - 0.797745751406263 - - 1.0772542485937366 - - 1.0 - - 1.0855896394678042 - - 0.9210746690324472 - - 0.6548838552098555 - - 0.6548838552098555 - - 0.9210746690324471 - - 1.1524986624095181 - - 1.25 - - 1.0772542485937366 - - 0.797745751406263 - - 0.797745751406263 - - 1.0772542485937366 - - 1.0 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== + dtype: f8 y: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - -0.004225988315000001 - - 0.004225988315000001 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.011336243900000001 - - 0.011336243900000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0017101006600000004 - - 0.0017101006600000004 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.004330126940000001 - - 0.004330126940000001 - - -0.014847321800000002 - - 0.014847321800000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.10000000000000002 - - 0.0 - - 0.0 - - -0.0049240388000000015 - - 0.0049240388000000015 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0032139379550000006 - - 0.0032139379550000006 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.013644480700000003 - - 0.013644480700000003 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.008109612750000002 - - 0.008109612750000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.00028137136250000006 - - 0.0078714803 - - -0.008344890200000002 - - 0.013525193950000004 - - -0.013758964850000003 - - -0.0016490003100000004 - - 0.0017709132300000002 - - -0.0042973283700000016 - - 0.0043621968500000005 - - -0.004934888705000001 - - 0.004912360015000001 - - 0.014884752050000002 - - -0.014804665750000005 - - -0.0032633595150000005 - - 0.0031639754750000006 - - -6.486846850000001e-05 - - 0.011518507450000002 - - -0.011149990550000002 - - 0.004495218770000001 - - -0.0039552707250000005 - - 9.925023200000001e-18 - - -1.353553390593274 - - -1.521678018584263 - - -1.457460125037637 - - -1.2496466561489104 - - -1.1854287626022846 - - -0.6464466094067262 - - 0.0 - - 0.23776412907378844 - - 0.14694631307311834 - - -0.14694631307311828 - - -0.23776412907378847 - - 0.0 - - 1.353553390593274 - - 1.1854287626022846 - - 1.2496466561489104 - - 1.457460125037637 - - 1.521678018584263 - - 0.6464466094067262 - - -1.0 - - -0.7622358709262116 - - -0.8530536869268817 - - -1.1469463130731183 - - -1.2377641290737884 - - -1.0 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 1.0 - - 1.2377641290737884 - - 1.1469463130731183 - - 0.8530536869268818 - - 0.7622358709262116 - - 1.0 - - -0.6464466094067262 - - -0.4783219814157369 - - -0.5425398749623628 - - -0.7503533438510895 - - -0.8145712373977154 - - -1.353553390593274 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 0.6464466094067262 - - 0.8145712373977154 - - 0.7503533438510895 - - 0.5425398749623629 - - 0.4783219814157368 - - 1.353553390593274 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== + dtype: f8 z: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.0004754300695000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.007705580450000002 - - -0.008505494900000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.013440123200000004 - - -0.013835124650000002 - - 0.0 - - 0.00015880254800000005 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.003090666795000001 - - 0.0 - - 0.0033339664350000007 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0048939786850000005 - - 0.0 - - 0.004949130490000001 - - 0.10000000000000002 - - -3.1374891150000003e-18 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.014907522500000003 - - 0.0 - - -0.004407344015000001 - - -0.014772200600000002 - - 0.0 - - 0.0042485412200000015 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0018584636950000003 - - 0.0 - - 0.0015600122500000005 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.011641889050000001 - - -0.011019207550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.004680036755000001 - - -0.003767693415000001 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014997360100000004 - - -0.012768703700000003 - - -0.012464462200000002 - - -0.006486073150000001 - - -0.005974184350000002 - - -0.004720254240000001 - - -0.004675881190000001 - - -0.0025559673100000006 - - -0.0024436118100000007 - - 0.0008042847750000002 - - 0.0009320507750000002 - - 0.0018558396050000002 - - 0.0024128545100000004 - - 0.003788203375000001 - - 0.0038715966050000008 - - 0.004999579490000001 - - 0.009608536200000002 - - 0.0100338295 - - 0.014310590900000003 - - 0.014469133300000003 - - -1.6175736900000002e-18 - - 1.3535533905932737 - - 1.1854287626022844 - - 1.2496466561489104 - - 1.457460125037637 - - 1.521678018584263 - - 0.6464466094067263 - - 1.3999272725498855 - - 1.45261426460265 - - 1.5378636085090187 - - 1.5378636085090187 - - 1.45261426460265 - - 0.5238233962453553 - - 1.3535533905932737 - - 1.521678018584263 - - 1.457460125037637 - - 1.2496466561489104 - - 1.1854287626022844 - - 0.6464466094067263 - - 1.25 - - 1.0772542485937366 - - 0.797745751406263 - - 0.797745751406263 - - 1.0772542485937366 - - 1.0 - - 1.25 - - 1.0772542485937366 - - 0.797745751406263 - - 0.797745751406263 - - 1.0772542485937366 - - 1.0 - - 1.25 - - 1.0772542485937366 - - 0.797745751406263 - - 0.797745751406263 - - 1.0772542485937366 - - 1.0 - - 0.6464466094067263 - - 0.8145712373977156 - - 0.7503533438510896 - - 0.5425398749623629 - - 0.4783219814157369 - - 1.3535533905932737 - - 0.4475740650405964 - - 0.500261057093361 - - 0.5855104009997295 - - 0.5855104009997295 - - 0.500261057093361 - - 1.4761766037546447 - - 0.6464466094067263 - - 0.4783219814157369 - - 0.5425398749623629 - - 0.7503533438510896 - - 0.8145712373977156 - - 1.3535533905932737 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== + dtype: f8 layout: legend: itemsizing: constant diff --git a/tests/test_display_plotly/test_pixel_field_directional_symbols.yml b/tests/test_display_plotly/test_pixel_field_directional_symbols.yml index be4304b85..dbbcf5ada 100644 --- a/tests/test_display_plotly/test_pixel_field_directional_symbols.yml +++ b/tests/test_display_plotly/test_pixel_field_directional_symbols.yml @@ -14,53 +14,17 @@ data: - - 1.0 - '#e71111' i: - - 7 - - 0 - - 0 - - 0 - - 4 - - 4 - - 2 - - 6 - - 4 - - 0 - - 3 - - 7 + bdata: BwAAAAQEAgYEAAMH + dtype: i1 intensity: - - 0.0 - - 0.0 - - 1.0 - - 1.0 - - 0.0 - - 0.0 - - 1.0 - - 1.0 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 j: - - 0 - - 7 - - 1 - - 2 - - 6 - - 7 - - 1 - - 2 - - 5 - - 5 - - 2 - - 2 + bdata: AAcBAgYHAQIFBQIC + dtype: i1 k: - - 3 - - 4 - - 2 - - 3 - - 5 - - 6 - - 5 - - 5 - - 0 - - 1 - - 7 - - 6 + bdata: AwQCAwUGBQUAAQcG + dtype: i1 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -69,32 +33,14 @@ data: showscale: false type: mesh3d x: - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 y: - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 z: - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 - facecolor: - '#e15f99' - '#e15f99' @@ -322,683 +268,14 @@ data: - '#440154' - '#440154' i: - - 75 - - 64 - - 2 - - 75 - - 76 - - 65 - - 65 - - 64 - - 2 - - 0 - - 1 - - 0 - - 84 - - 86 - - 86 - - 90 - - 90 - - 92 - - 92 - - 91 - - 91 - - 87 - - 87 - - 85 - - 85 - - 83 - - 83 - - 82 - - 82 - - 84 - - 94 - - 86 - - 86 - - 84 - - 84 - - 82 - - 82 - - 83 - - 83 - - 85 - - 85 - - 87 - - 87 - - 87 - - 91 - - 91 - - 92 - - 92 - - 90 - - 90 - - 94 - - 95 - - 88 - - 78 - - 79 - - 81 - - 80 - - 93 - - 96 - - 89 - - 77 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 50 - - 52 - - 52 - - 44 - - 44 - - 32 - - 32 - - 22 - - 22 - - 14 - - 14 - - 20 - - 20 - - 30 - - 30 - - 41 - - 41 - - 50 - - 57 - - 52 - - 52 - - 50 - - 50 - - 41 - - 41 - - 30 - - 30 - - 20 - - 20 - - 14 - - 14 - - 14 - - 22 - - 22 - - 32 - - 32 - - 44 - - 44 - - 57 - - 11 - - 4 - - 12 - - 58 - - 62 - - 8 - - 7 - - 39 - - 61 - - 42 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 48 - - 54 - - 54 - - 47 - - 47 - - 37 - - 37 - - 25 - - 25 - - 17 - - 17 - - 18 - - 18 - - 26 - - 26 - - 38 - - 38 - - 48 - - 59 - - 54 - - 54 - - 48 - - 48 - - 38 - - 38 - - 26 - - 26 - - 18 - - 18 - - 17 - - 17 - - 17 - - 25 - - 25 - - 37 - - 37 - - 47 - - 47 - - 59 - - 27 - - 5 - - 10 - - 56 - - 60 - - 6 - - 9 - - 55 - - 63 - - 28 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 98 - - 99 - - 100 - - 101 - - 102 - - 104 - - 105 - - 106 - - 107 - - 108 - - 110 - - 111 - - 112 - - 113 - - 114 - - 116 - - 117 - - 118 - - 119 - - 120 - - 122 - - 123 - - 124 - - 125 - - 126 - - 128 - - 129 - - 130 - - 131 - - 132 - - 134 - - 135 - - 136 - - 137 - - 138 - - 140 - - 141 - - 142 - - 143 - - 144 - - 146 - - 147 - - 148 - - 149 - - 150 + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 j: - - 76 - - 76 - - 3 - - 3 - - 3 - - 3 - - 1 - - 1 - - 75 - - 75 - - 3 - - 3 - - 70 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 71 - - 71 - - 69 - - 69 - - 67 - - 67 - - 66 - - 66 - - 68 - - 68 - - 89 - - 89 - - 81 - - 81 - - 79 - - 79 - - 77 - - 77 - - 78 - - 78 - - 80 - - 80 - - 88 - - 93 - - 93 - - 95 - - 95 - - 96 - - 96 - - 94 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 68 - - 68 - - 66 - - 66 - - 67 - - 67 - - 69 - - 51 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 13 - - 13 - - 19 - - 19 - - 29 - - 29 - - 40 - - 40 - - 49 - - 49 - - 61 - - 61 - - 62 - - 62 - - 58 - - 58 - - 42 - - 42 - - 12 - - 12 - - 8 - - 8 - - 4 - - 7 - - 7 - - 11 - - 11 - - 39 - - 39 - - 57 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 49 - - 49 - - 40 - - 40 - - 29 - - 29 - - 19 - - 53 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 15 - - 15 - - 16 - - 16 - - 24 - - 24 - - 36 - - 36 - - 46 - - 46 - - 63 - - 63 - - 60 - - 60 - - 56 - - 56 - - 28 - - 28 - - 10 - - 10 - - 6 - - 6 - - 5 - - 9 - - 9 - - 27 - - 27 - - 55 - - 55 - - 59 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 46 - - 46 - - 36 - - 36 - - 24 - - 24 - - 16 - - 99 - - 100 - - 101 - - 102 - - 98 - - 105 - - 106 - - 107 - - 108 - - 104 - - 111 - - 112 - - 113 - - 114 - - 110 - - 117 - - 118 - - 119 - - 120 - - 116 - - 123 - - 124 - - 125 - - 126 - - 122 - - 129 - - 130 - - 131 - - 132 - - 128 - - 135 - - 136 - - 137 - - 138 - - 134 - - 141 - - 142 - - 143 - - 144 - - 140 - - 147 - - 148 - - 149 - - 150 - - 146 + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 k: - - 64 - - 65 - - 75 - - 76 - - 65 - - 1 - - 64 - - 0 - - 0 - - 64 - - 0 - - 2 - - 86 - - 72 - - 90 - - 74 - - 92 - - 73 - - 91 - - 71 - - 87 - - 69 - - 85 - - 67 - - 83 - - 66 - - 82 - - 68 - - 84 - - 70 - - 86 - - 81 - - 84 - - 79 - - 82 - - 77 - - 83 - - 78 - - 85 - - 80 - - 87 - - 88 - - 93 - - 91 - - 95 - - 92 - - 96 - - 90 - - 94 - - 86 - - 89 - - 96 - - 93 - - 80 - - 77 - - 79 - - 88 - - 95 - - 94 - - 81 - - 78 - - 72 - - 66 - - 74 - - 67 - - 73 - - 69 - - 71 - - 52 - - 43 - - 44 - - 31 - - 32 - - 21 - - 22 - - 13 - - 14 - - 19 - - 20 - - 29 - - 30 - - 40 - - 41 - - 49 - - 50 - - 51 - - 52 - - 62 - - 50 - - 58 - - 41 - - 42 - - 30 - - 12 - - 20 - - 8 - - 14 - - 4 - - 7 - - 22 - - 11 - - 32 - - 39 - - 44 - - 57 - - 52 - - 61 - - 39 - - 7 - - 8 - - 42 - - 58 - - 4 - - 11 - - 57 - - 62 - - 12 - - 43 - - 40 - - 31 - - 29 - - 21 - - 19 - - 13 - - 54 - - 45 - - 47 - - 35 - - 37 - - 23 - - 25 - - 15 - - 17 - - 16 - - 18 - - 24 - - 26 - - 36 - - 38 - - 46 - - 48 - - 53 - - 54 - - 60 - - 48 - - 56 - - 38 - - 28 - - 26 - - 10 - - 18 - - 6 - - 17 - - 5 - - 9 - - 25 - - 27 - - 37 - - 55 - - 47 - - 59 - - 54 - - 63 - - 55 - - 9 - - 6 - - 28 - - 56 - - 5 - - 27 - - 59 - - 60 - - 10 - - 45 - - 36 - - 35 - - 24 - - 23 - - 16 - - 15 - - 103 - - 103 - - 103 - - 103 - - 103 - - 109 - - 109 - - 109 - - 109 - - 109 - - 115 - - 115 - - 115 - - 115 - - 115 - - 121 - - 121 - - 121 - - 121 - - 121 - - 127 - - 127 - - 127 - - 127 - - 127 - - 133 - - 133 - - 133 - - 133 - - 133 - - 139 - - 139 - - 139 - - 139 - - 139 - - 145 - - 145 - - 145 - - 145 - - 145 - - 151 - - 151 - - 151 - - 151 - - 151 + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 legendgroup: Sensor(id=ID) name: Sensor (cone) opacity: 1 @@ -1006,464 +283,14 @@ data: showlegend: true type: mesh3d x: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014992463600000002 - - -0.014392395300000003 - - -0.014392395300000003 - - -0.012869499600000002 - - -0.012355425950000002 - - -0.009822911000000002 - - -0.009822911000000002 - - -0.0066605612500000005 - - -0.005795627850000001 - - 0.0 - - -0.004997477680000001 - - 0.0 - - 0.0 - - -0.0046984631550000015 - - -0.0046984631550000015 - - 0.0 - - -0.003930366410000001 - - 0.0 - - -0.003726213425000001 - - 0.0 - - 0.0 - - -0.0025000000350000003 - - -0.0025000000350000003 - - -0.0021347226600000008 - - -0.0021347226600000008 - - 0.0 - - -0.0010241928500000002 - - 0.0 - - -0.0007114128200000001 - - -1.0408340850000002e-17 - - -9.553993650000002e-18 - - 0.0 - - 0.0 - - 0.0008682409300000002 - - 0.0008682409300000002 - - 0.0016630589950000004 - - 0.0 - - 0.0023612117400000003 - - 0.0026042407400000004 - - 0.0 - - 0.0026362657550000005 - - 0.0 - - 0.0 - - 0.003830222040000001 - - 0.003830222040000001 - - 0.0 - - 0.004641779140000001 - - 0.0 - - 0.004750406370000001 - - 0.0 - - 0.0049999997000000004 - - 0.006231224900000001 - - 0.006231224900000001 - - 0.00945867 - - 0.010177281500000003 - - 0.012618804000000003 - - 0.012618804000000003 - - 0.014251218750000003 - - 0.014519108850000004 - - 0.014999999100000003 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.10000000000000002 - - -0.9257545044462104 - - -1.151493064908857 - - -1.3786213269384155 - - -1.2932557522157282 - - -1.01336866353838 - - -0.8475013375904817 - - -1.5 - - -1.5 - - -1.5 - - -1.5 - - -1.5 - - -0.5 - - -0.9257545044462104 - - -1.01336866353838 - - -1.2932557522157282 - - -1.3786213269384155 - - -1.151493064908857 - - -0.8475013375904817 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - -0.49999999999999994 - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - 1.0742454955537897 - - 0.9866313364616199 - - 0.7067442477842719 - - 0.6213786730615845 - - 0.8485069350911429 - - 1.1524986624095181 - - 0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 - - 1.5 - - 1.0742454955537897 - - 0.8485069350911429 - - 0.6213786730615845 - - 0.7067442477842718 - - 0.9866313364616199 - - 1.1524986624095181 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== + dtype: f8 y: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - -0.004225988315000001 - - 0.004225988315000001 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.011336243900000001 - - 0.011336243900000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0017101006600000004 - - 0.0017101006600000004 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.004330126940000001 - - 0.004330126940000001 - - -0.014847321800000002 - - 0.014847321800000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.10000000000000002 - - 0.0 - - 0.0 - - -0.0049240388000000015 - - 0.0049240388000000015 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0032139379550000006 - - 0.0032139379550000006 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.013644480700000003 - - 0.013644480700000003 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.008109612750000002 - - 0.008109612750000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.00028137136250000006 - - 0.0078714803 - - -0.008344890200000002 - - 0.013525193950000004 - - -0.013758964850000003 - - -0.0016490003100000004 - - 0.0017709132300000002 - - -0.0042973283700000016 - - 0.0043621968500000005 - - -0.004934888705000001 - - 0.004912360015000001 - - 0.014884752050000002 - - -0.014804665750000005 - - -0.0032633595150000005 - - 0.0031639754750000006 - - -6.486846850000001e-05 - - 0.011518507450000002 - - -0.011149990550000002 - - 0.004495218770000001 - - -0.0039552707250000005 - - 9.925023200000001e-18 - - -1.548792898897935 - - -1.4764986529115414 - - -1.4037593459363646 - - -1.4310982278939868 - - -1.5207338931333951 - - -0.5238233962453553 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 1.548792898897935 - - 1.5207338931333951 - - 1.4310982278939868 - - 1.4037593459363646 - - 1.4764986529115414 - - 0.5238233962453553 - - -1.0 - - -0.7622358709262116 - - -0.8530536869268817 - - -1.1469463130731183 - - -1.2377641290737884 - - -1.0 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 1.0 - - 1.2377641290737884 - - 1.1469463130731183 - - 0.8530536869268818 - - 0.7622358709262116 - - 1.0 - - -0.45120710110206497 - - -0.47926610686660476 - - -0.5689017721060132 - - -0.5962406540636354 - - -0.5235013470884586 - - -1.4761766037546447 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 0.45120710110206497 - - 0.5235013470884586 - - 0.5962406540636354 - - 0.5689017721060132 - - 0.47926610686660476 - - 1.4761766037546447 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== + dtype: f8 z: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.0004754300695000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.007705580450000002 - - -0.008505494900000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.013440123200000004 - - -0.013835124650000002 - - 0.0 - - 0.00015880254800000005 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.003090666795000001 - - 0.0 - - 0.0033339664350000007 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0048939786850000005 - - 0.0 - - 0.004949130490000001 - - 0.10000000000000002 - - -3.1374891150000003e-18 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.014907522500000003 - - 0.0 - - -0.004407344015000001 - - -0.014772200600000002 - - 0.0 - - 0.0042485412200000015 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0018584636950000003 - - 0.0 - - 0.0015600122500000005 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.011641889050000001 - - -0.011019207550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.004680036755000001 - - -0.003767693415000001 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014997360100000004 - - -0.012768703700000003 - - -0.012464462200000002 - - -0.006486073150000001 - - -0.005974184350000002 - - -0.004720254240000001 - - -0.004675881190000001 - - -0.0025559673100000006 - - -0.0024436118100000007 - - 0.0008042847750000002 - - 0.0009320507750000002 - - 0.0018558396050000002 - - 0.0024128545100000004 - - 0.003788203375000001 - - 0.0038715966050000008 - - 0.004999579490000001 - - 0.009608536200000002 - - 0.0100338295 - - 0.014310590900000003 - - 0.014469133300000003 - - -1.6175736900000002e-18 - - -0.0762493312047592 - - -0.24999777010606963 - - -0.0782577878324744 - - 0.20163179734122239 - - 0.2028730918020804 - - 8.326672684688674e-17 - - -0.2500000000000001 - - -0.07725424859373697 - - 0.20225424859373672 - - 0.20225424859373675 - - -0.07725424859373692 - - 1.1102230246251565e-16 - - -0.0762493312047592 - - 0.20287309180208038 - - 0.20163179734122244 - - -0.07825778783247435 - - -0.24999777010606966 - - 8.326672684688674e-17 - - 0.2499999999999999 - - 0.07725424859373675 - - -0.20225424859373695 - - -0.20225424859373697 - - 0.0772542485937367 - - 1.1102230246251565e-16 - - -0.2500000000000001 - - -0.07725424859373697 - - 0.20225424859373672 - - 0.20225424859373675 - - -0.07725424859373692 - - 1.1102230246251565e-16 - - 0.2499999999999999 - - 0.07725424859373675 - - -0.20225424859373695 - - -0.20225424859373697 - - 0.0772542485937367 - - 1.1102230246251565e-16 - - -0.0762493312047592 - - 0.20287309180208038 - - 0.20163179734122244 - - -0.07825778783247435 - - -0.24999777010606966 - - 8.326672684688674e-17 - - -0.2500000000000001 - - -0.07725424859373697 - - 0.20225424859373672 - - 0.20225424859373675 - - -0.07725424859373692 - - 1.1102230246251565e-16 - - -0.0762493312047592 - - -0.24999777010606963 - - -0.0782577878324744 - - 0.20163179734122239 - - 0.2028730918020804 - - 8.326672684688674e-17 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== + dtype: f8 - color: '#2e91e5' colorscale: - - 0.0 @@ -1479,53 +306,17 @@ data: - - 1.0 - '#e71111' i: - - 7 - - 0 - - 0 - - 0 - - 4 - - 4 - - 2 - - 6 - - 4 - - 0 - - 3 - - 7 + bdata: BwAAAAQEAgYEAAMH + dtype: i1 intensity: - - 0.0 - - 0.0 - - 1.0 - - 1.0 - - 0.0 - - 0.0 - - 1.0 - - 1.0 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 j: - - 0 - - 7 - - 1 - - 2 - - 6 - - 7 - - 1 - - 2 - - 5 - - 5 - - 2 - - 2 + bdata: AAcBAgYHAQIFBQIC + dtype: i1 k: - - 3 - - 4 - - 2 - - 3 - - 5 - - 6 - - 5 - - 5 - - 0 - - 1 - - 7 - - 6 + bdata: AwQCAwUGBQUAAQcG + dtype: i1 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -1534,32 +325,14 @@ data: showscale: false type: mesh3d x: - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 y: - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 z: - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 - facecolor: - '#1ca71c' - '#1ca71c' @@ -1967,1223 +740,14 @@ data: - '#440154' - '#440154' i: - - 75 - - 64 - - 2 - - 75 - - 76 - - 65 - - 65 - - 64 - - 2 - - 0 - - 1 - - 0 - - 84 - - 86 - - 86 - - 90 - - 90 - - 92 - - 92 - - 91 - - 91 - - 87 - - 87 - - 85 - - 85 - - 83 - - 83 - - 82 - - 82 - - 84 - - 94 - - 86 - - 86 - - 84 - - 84 - - 82 - - 82 - - 83 - - 83 - - 85 - - 85 - - 87 - - 87 - - 87 - - 91 - - 91 - - 92 - - 92 - - 90 - - 90 - - 94 - - 95 - - 88 - - 78 - - 79 - - 81 - - 80 - - 93 - - 96 - - 89 - - 77 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 50 - - 52 - - 52 - - 44 - - 44 - - 32 - - 32 - - 22 - - 22 - - 14 - - 14 - - 20 - - 20 - - 30 - - 30 - - 41 - - 41 - - 50 - - 57 - - 52 - - 52 - - 50 - - 50 - - 41 - - 41 - - 30 - - 30 - - 20 - - 20 - - 14 - - 14 - - 14 - - 22 - - 22 - - 32 - - 32 - - 44 - - 44 - - 57 - - 11 - - 4 - - 12 - - 58 - - 62 - - 8 - - 7 - - 39 - - 61 - - 42 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 48 - - 54 - - 54 - - 47 - - 47 - - 37 - - 37 - - 25 - - 25 - - 17 - - 17 - - 18 - - 18 - - 26 - - 26 - - 38 - - 38 - - 48 - - 59 - - 54 - - 54 - - 48 - - 48 - - 38 - - 38 - - 26 - - 26 - - 18 - - 18 - - 17 - - 17 - - 17 - - 25 - - 25 - - 37 - - 37 - - 47 - - 47 - - 59 - - 27 - - 5 - - 10 - - 56 - - 60 - - 6 - - 9 - - 55 - - 63 - - 28 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 98 - - 99 - - 100 - - 101 - - 102 - - 104 - - 105 - - 106 - - 107 - - 108 - - 109 - - 110 - - 111 - - 112 - - 113 - - 104 - - 105 - - 106 - - 107 - - 108 - - 109 - - 110 - - 111 - - 112 - - 113 - - 116 - - 117 - - 118 - - 119 - - 120 - - 122 - - 123 - - 124 - - 125 - - 126 - - 127 - - 128 - - 129 - - 130 - - 131 - - 122 - - 123 - - 124 - - 125 - - 126 - - 127 - - 128 - - 129 - - 130 - - 131 - - 134 - - 135 - - 136 - - 137 - - 138 - - 140 - - 141 - - 142 - - 143 - - 144 - - 145 - - 146 - - 147 - - 148 - - 149 - - 140 - - 141 - - 142 - - 143 - - 144 - - 145 - - 146 - - 147 - - 148 - - 149 - - 152 - - 153 - - 154 - - 155 - - 156 - - 158 - - 159 - - 160 - - 161 - - 162 - - 163 - - 164 - - 165 - - 166 - - 167 - - 158 - - 159 - - 160 - - 161 - - 162 - - 163 - - 164 - - 165 - - 166 - - 167 - - 170 - - 171 - - 172 - - 173 - - 174 - - 176 - - 177 - - 178 - - 179 - - 180 - - 181 - - 182 - - 183 - - 184 - - 185 - - 176 - - 177 - - 178 - - 179 - - 180 - - 181 - - 182 - - 183 - - 184 - - 185 - - 188 - - 189 - - 190 - - 191 - - 192 - - 194 - - 195 - - 196 - - 197 - - 198 - - 199 - - 200 - - 201 - - 202 - - 203 - - 194 - - 195 - - 196 - - 197 - - 198 - - 199 - - 200 - - 201 - - 202 - - 203 - - 206 - - 207 - - 208 - - 209 - - 210 - - 212 - - 213 - - 214 - - 215 - - 216 - - 217 - - 218 - - 219 - - 220 - - 221 - - 212 - - 213 - - 214 - - 215 - - 216 - - 217 - - 218 - - 219 - - 220 - - 221 - - 224 - - 225 - - 226 - - 227 - - 228 - - 230 - - 231 - - 232 - - 233 - - 234 - - 235 - - 236 - - 237 - - 238 - - 239 - - 230 - - 231 - - 232 - - 233 - - 234 - - 235 - - 236 - - 237 - - 238 - - 239 - - 242 - - 243 - - 244 - - 245 - - 246 - - 248 - - 249 - - 250 - - 251 - - 252 - - 253 - - 254 - - 255 - - 256 - - 257 - - 248 - - 249 - - 250 - - 251 - - 252 - - 253 - - 254 - - 255 - - 256 - - 257 + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABtAG4AbwBwAHEAaABpAGoAawBsAG0AbgBvAHAAcQB0AHUAdgB3AHgAegB7AHwAfQB+AH8AgACBAIIAgwB6AHsAfAB9AH4AfwCAAIEAggCDAIYAhwCIAIkAigCMAI0AjgCPAJAAkQCSAJMAlACVAIwAjQCOAI8AkACRAJIAkwCUAJUAmACZAJoAmwCcAJ4AnwCgAKEAogCjAKQApQCmAKcAngCfAKAAoQCiAKMApAClAKYApwCqAKsArACtAK4AsACxALIAswC0ALUAtgC3ALgAuQCwALEAsgCzALQAtQC2ALcAuAC5ALwAvQC+AL8AwADCAMMAxADFAMYAxwDIAMkAygDLAMIAwwDEAMUAxgDHAMgAyQDKAMsAzgDPANAA0QDSANQA1QDWANcA2ADZANoA2wDcAN0A1ADVANYA1wDYANkA2gDbANwA3QDgAOEA4gDjAOQA5gDnAOgA6QDqAOsA7ADtAO4A7wDmAOcA6ADpAOoA6wDsAO0A7gDvAPIA8wD0APUA9gD4APkA+gD7APwA/QD+AP8AAAEBAfgA+QD6APsA/AD9AP4A/wAAAQEB + dtype: i2 j: - - 76 - - 76 - - 3 - - 3 - - 3 - - 3 - - 1 - - 1 - - 75 - - 75 - - 3 - - 3 - - 70 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 71 - - 71 - - 69 - - 69 - - 67 - - 67 - - 66 - - 66 - - 68 - - 68 - - 89 - - 89 - - 81 - - 81 - - 79 - - 79 - - 77 - - 77 - - 78 - - 78 - - 80 - - 80 - - 88 - - 93 - - 93 - - 95 - - 95 - - 96 - - 96 - - 94 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 68 - - 68 - - 66 - - 66 - - 67 - - 67 - - 69 - - 51 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 13 - - 13 - - 19 - - 19 - - 29 - - 29 - - 40 - - 40 - - 49 - - 49 - - 61 - - 61 - - 62 - - 62 - - 58 - - 58 - - 42 - - 42 - - 12 - - 12 - - 8 - - 8 - - 4 - - 7 - - 7 - - 11 - - 11 - - 39 - - 39 - - 57 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 49 - - 49 - - 40 - - 40 - - 29 - - 29 - - 19 - - 53 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 15 - - 15 - - 16 - - 16 - - 24 - - 24 - - 36 - - 36 - - 46 - - 46 - - 63 - - 63 - - 60 - - 60 - - 56 - - 56 - - 28 - - 28 - - 10 - - 10 - - 6 - - 6 - - 5 - - 9 - - 9 - - 27 - - 27 - - 55 - - 55 - - 59 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 46 - - 46 - - 36 - - 36 - - 24 - - 24 - - 16 - - 99 - - 100 - - 101 - - 102 - - 98 - - 105 - - 106 - - 107 - - 108 - - 104 - - 105 - - 106 - - 107 - - 108 - - 104 - - 114 - - 114 - - 114 - - 114 - - 114 - - 110 - - 111 - - 112 - - 113 - - 109 - - 117 - - 118 - - 119 - - 120 - - 116 - - 123 - - 124 - - 125 - - 126 - - 122 - - 123 - - 124 - - 125 - - 126 - - 122 - - 132 - - 132 - - 132 - - 132 - - 132 - - 128 - - 129 - - 130 - - 131 - - 127 - - 135 - - 136 - - 137 - - 138 - - 134 - - 141 - - 142 - - 143 - - 144 - - 140 - - 141 - - 142 - - 143 - - 144 - - 140 - - 150 - - 150 - - 150 - - 150 - - 150 - - 146 - - 147 - - 148 - - 149 - - 145 - - 153 - - 154 - - 155 - - 156 - - 152 - - 159 - - 160 - - 161 - - 162 - - 158 - - 159 - - 160 - - 161 - - 162 - - 158 - - 168 - - 168 - - 168 - - 168 - - 168 - - 164 - - 165 - - 166 - - 167 - - 163 - - 171 - - 172 - - 173 - - 174 - - 170 - - 177 - - 178 - - 179 - - 180 - - 176 - - 177 - - 178 - - 179 - - 180 - - 176 - - 186 - - 186 - - 186 - - 186 - - 186 - - 182 - - 183 - - 184 - - 185 - - 181 - - 189 - - 190 - - 191 - - 192 - - 188 - - 195 - - 196 - - 197 - - 198 - - 194 - - 195 - - 196 - - 197 - - 198 - - 194 - - 204 - - 204 - - 204 - - 204 - - 204 - - 200 - - 201 - - 202 - - 203 - - 199 - - 207 - - 208 - - 209 - - 210 - - 206 - - 213 - - 214 - - 215 - - 216 - - 212 - - 213 - - 214 - - 215 - - 216 - - 212 - - 222 - - 222 - - 222 - - 222 - - 222 - - 218 - - 219 - - 220 - - 221 - - 217 - - 225 - - 226 - - 227 - - 228 - - 224 - - 231 - - 232 - - 233 - - 234 - - 230 - - 231 - - 232 - - 233 - - 234 - - 230 - - 240 - - 240 - - 240 - - 240 - - 240 - - 236 - - 237 - - 238 - - 239 - - 235 - - 243 - - 244 - - 245 - - 246 - - 242 - - 249 - - 250 - - 251 - - 252 - - 248 - - 249 - - 250 - - 251 - - 252 - - 248 - - 258 - - 258 - - 258 - - 258 - - 258 - - 254 - - 255 - - 256 - - 257 - - 253 + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABpAGoAawBsAGgAcgByAHIAcgByAG4AbwBwAHEAbQB1AHYAdwB4AHQAewB8AH0AfgB6AHsAfAB9AH4AegCEAIQAhACEAIQAgACBAIIAgwB/AIcAiACJAIoAhgCNAI4AjwCQAIwAjQCOAI8AkACMAJYAlgCWAJYAlgCSAJMAlACVAJEAmQCaAJsAnACYAJ8AoAChAKIAngCfAKAAoQCiAJ4AqACoAKgAqACoAKQApQCmAKcAowCrAKwArQCuAKoAsQCyALMAtACwALEAsgCzALQAsAC6ALoAugC6ALoAtgC3ALgAuQC1AL0AvgC/AMAAvADDAMQAxQDGAMIAwwDEAMUAxgDCAMwAzADMAMwAzADIAMkAygDLAMcAzwDQANEA0gDOANUA1gDXANgA1ADVANYA1wDYANQA3gDeAN4A3gDeANoA2wDcAN0A2QDhAOIA4wDkAOAA5wDoAOkA6gDmAOcA6ADpAOoA5gDwAPAA8ADwAPAA7ADtAO4A7wDrAPMA9AD1APYA8gD5APoA+wD8APgA+QD6APsA/AD4AAIBAgECAQIBAgH+AP8AAAEBAf0A + dtype: i2 k: - - 64 - - 65 - - 75 - - 76 - - 65 - - 1 - - 64 - - 0 - - 0 - - 64 - - 0 - - 2 - - 86 - - 72 - - 90 - - 74 - - 92 - - 73 - - 91 - - 71 - - 87 - - 69 - - 85 - - 67 - - 83 - - 66 - - 82 - - 68 - - 84 - - 70 - - 86 - - 81 - - 84 - - 79 - - 82 - - 77 - - 83 - - 78 - - 85 - - 80 - - 87 - - 88 - - 93 - - 91 - - 95 - - 92 - - 96 - - 90 - - 94 - - 86 - - 89 - - 96 - - 93 - - 80 - - 77 - - 79 - - 88 - - 95 - - 94 - - 81 - - 78 - - 72 - - 66 - - 74 - - 67 - - 73 - - 69 - - 71 - - 52 - - 43 - - 44 - - 31 - - 32 - - 21 - - 22 - - 13 - - 14 - - 19 - - 20 - - 29 - - 30 - - 40 - - 41 - - 49 - - 50 - - 51 - - 52 - - 62 - - 50 - - 58 - - 41 - - 42 - - 30 - - 12 - - 20 - - 8 - - 14 - - 4 - - 7 - - 22 - - 11 - - 32 - - 39 - - 44 - - 57 - - 52 - - 61 - - 39 - - 7 - - 8 - - 42 - - 58 - - 4 - - 11 - - 57 - - 62 - - 12 - - 43 - - 40 - - 31 - - 29 - - 21 - - 19 - - 13 - - 54 - - 45 - - 47 - - 35 - - 37 - - 23 - - 25 - - 15 - - 17 - - 16 - - 18 - - 24 - - 26 - - 36 - - 38 - - 46 - - 48 - - 53 - - 54 - - 60 - - 48 - - 56 - - 38 - - 28 - - 26 - - 10 - - 18 - - 6 - - 17 - - 5 - - 9 - - 25 - - 27 - - 37 - - 55 - - 47 - - 59 - - 54 - - 63 - - 55 - - 9 - - 6 - - 28 - - 56 - - 5 - - 27 - - 59 - - 60 - - 10 - - 45 - - 36 - - 35 - - 24 - - 23 - - 16 - - 15 - - 103 - - 103 - - 103 - - 103 - - 103 - - 109 - - 110 - - 111 - - 112 - - 113 - - 110 - - 111 - - 112 - - 113 - - 109 - - 105 - - 106 - - 107 - - 108 - - 104 - - 115 - - 115 - - 115 - - 115 - - 115 - - 121 - - 121 - - 121 - - 121 - - 121 - - 127 - - 128 - - 129 - - 130 - - 131 - - 128 - - 129 - - 130 - - 131 - - 127 - - 123 - - 124 - - 125 - - 126 - - 122 - - 133 - - 133 - - 133 - - 133 - - 133 - - 139 - - 139 - - 139 - - 139 - - 139 - - 145 - - 146 - - 147 - - 148 - - 149 - - 146 - - 147 - - 148 - - 149 - - 145 - - 141 - - 142 - - 143 - - 144 - - 140 - - 151 - - 151 - - 151 - - 151 - - 151 - - 157 - - 157 - - 157 - - 157 - - 157 - - 163 - - 164 - - 165 - - 166 - - 167 - - 164 - - 165 - - 166 - - 167 - - 163 - - 159 - - 160 - - 161 - - 162 - - 158 - - 169 - - 169 - - 169 - - 169 - - 169 - - 175 - - 175 - - 175 - - 175 - - 175 - - 181 - - 182 - - 183 - - 184 - - 185 - - 182 - - 183 - - 184 - - 185 - - 181 - - 177 - - 178 - - 179 - - 180 - - 176 - - 187 - - 187 - - 187 - - 187 - - 187 - - 193 - - 193 - - 193 - - 193 - - 193 - - 199 - - 200 - - 201 - - 202 - - 203 - - 200 - - 201 - - 202 - - 203 - - 199 - - 195 - - 196 - - 197 - - 198 - - 194 - - 205 - - 205 - - 205 - - 205 - - 205 - - 211 - - 211 - - 211 - - 211 - - 211 - - 217 - - 218 - - 219 - - 220 - - 221 - - 218 - - 219 - - 220 - - 221 - - 217 - - 213 - - 214 - - 215 - - 216 - - 212 - - 223 - - 223 - - 223 - - 223 - - 223 - - 229 - - 229 - - 229 - - 229 - - 229 - - 235 - - 236 - - 237 - - 238 - - 239 - - 236 - - 237 - - 238 - - 239 - - 235 - - 231 - - 232 - - 233 - - 234 - - 230 - - 241 - - 241 - - 241 - - 241 - - 241 - - 247 - - 247 - - 247 - - 247 - - 247 - - 253 - - 254 - - 255 - - 256 - - 257 - - 254 - - 255 - - 256 - - 257 - - 253 - - 249 - - 250 - - 251 - - 252 - - 248 - - 259 - - 259 - - 259 - - 259 - - 259 + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbgBvAHAAcQBuAG8AcABxAG0AaQBqAGsAbABoAHMAcwBzAHMAcwB5AHkAeQB5AHkAfwCAAIEAggCDAIAAgQCCAIMAfwB7AHwAfQB+AHoAhQCFAIUAhQCFAIsAiwCLAIsAiwCRAJIAkwCUAJUAkgCTAJQAlQCRAI0AjgCPAJAAjACXAJcAlwCXAJcAnQCdAJ0AnQCdAKMApAClAKYApwCkAKUApgCnAKMAnwCgAKEAogCeAKkAqQCpAKkAqQCvAK8ArwCvAK8AtQC2ALcAuAC5ALYAtwC4ALkAtQCxALIAswC0ALAAuwC7ALsAuwC7AMEAwQDBAMEAwQDHAMgAyQDKAMsAyADJAMoAywDHAMMAxADFAMYAwgDNAM0AzQDNAM0A0wDTANMA0wDTANkA2gDbANwA3QDaANsA3ADdANkA1QDWANcA2ADUAN8A3wDfAN8A3wDlAOUA5QDlAOUA6wDsAO0A7gDvAOwA7QDuAO8A6wDnAOgA6QDqAOYA8QDxAPEA8QDxAPcA9wD3APcA9wD9AP4A/wAAAQEB/gD/AAABAQH9APkA+gD7APwA+AADAQMBAwEDAQMB + dtype: i2 legendgroup: Sensor(id=ID) name: Sensor (arrow3d) opacity: 1 @@ -3191,788 +755,14 @@ data: showlegend: true type: mesh3d x: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014992463600000002 - - -0.014392395300000003 - - -0.014392395300000003 - - -0.012869499600000002 - - -0.012355425950000002 - - -0.009822911000000002 - - -0.009822911000000002 - - -0.0066605612500000005 - - -0.005795627850000001 - - 0.0 - - -0.004997477680000001 - - 0.0 - - 0.0 - - -0.0046984631550000015 - - -0.0046984631550000015 - - 0.0 - - -0.003930366410000001 - - 0.0 - - -0.003726213425000001 - - 0.0 - - 0.0 - - -0.0025000000350000003 - - -0.0025000000350000003 - - -0.0021347226600000008 - - -0.0021347226600000008 - - 0.0 - - -0.0010241928500000002 - - 0.0 - - -0.0007114128200000001 - - -1.0408340850000002e-17 - - -9.553993650000002e-18 - - 0.0 - - 0.0 - - 0.0008682409300000002 - - 0.0008682409300000002 - - 0.0016630589950000004 - - 0.0 - - 0.0023612117400000003 - - 0.0026042407400000004 - - 0.0 - - 0.0026362657550000005 - - 0.0 - - 0.0 - - 0.003830222040000001 - - 0.003830222040000001 - - 0.0 - - 0.004641779140000001 - - 0.0 - - 0.004750406370000001 - - 0.0 - - 0.0049999997000000004 - - 0.006231224900000001 - - 0.006231224900000001 - - 0.00945867 - - 0.010177281500000003 - - 0.012618804000000003 - - 0.012618804000000003 - - 0.014251218750000003 - - 0.014519108850000004 - - 0.014999999100000003 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.10000000000000002 - - -0.7732558420366922 - - -0.9989944024993388 - - -1.2261226645288974 - - -1.1407570898062098 - - -0.8608700011288618 - - -0.8475013375904817 - - -1.0391265834278642 - - -1.1519958636591876 - - -1.2655599946739668 - - -1.2228772073126233 - - -1.0829336629739492 - - -0.8866279210183461 - - -0.9994972012496695 - - -1.1130613322644487 - - -1.070378544903105 - - -0.930435000564431 - - -1.1524986624095181 - - -1.0 - - -1.0 - - -1.0 - - -1.0 - - -1.0 - - -1.0 - - -0.5 - - -1.5 - - -1.5 - - -1.5 - - -1.5 - - -1.5 - - -1.0 - - -1.0 - - -1.0 - - -1.0 - - -1.0 - - -1.5 - - -1.0 - - -0.7732558420366922 - - -0.8608700011288618 - - -1.1407570898062098 - - -1.2261226645288974 - - -0.9989944024993389 - - -0.8475013375904817 - - -1.0391265834278642 - - -1.0829336629739492 - - -1.222877207312623 - - -1.2655599946739668 - - -1.1519958636591876 - - -0.8866279210183461 - - -0.9304350005644308 - - -1.070378544903105 - - -1.1130613322644487 - - -0.9994972012496695 - - -1.1524986624095181 - - -1.0 - - 5.551115123125783e-17 - - 1.7153889107776457e-17 - - -4.4909464723405365e-17 - - -4.490946472340537e-17 - - 1.7153889107776445e-17 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 - - 2.7755575615628914e-17 - - 8.576944553888229e-18 - - -2.2454732361702682e-17 - - -2.2454732361702685e-17 - - 8.576944553888222e-18 - - 0.5 - - 0.0 - - 5.551115123125783e-17 - - 1.7153889107776457e-17 - - -4.4909464723405365e-17 - - -4.490946472340537e-17 - - 1.7153889107776445e-17 - - 0.5 - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 2.7755575615628914e-17 - - 8.576944553888229e-18 - - -2.2454732361702682e-17 - - -2.2454732361702685e-17 - - 8.576944553888222e-18 - - -0.5 - - 0.0 - - 5.551115123125783e-17 - - 1.7153889107776457e-17 - - -4.4909464723405365e-17 - - -4.490946472340537e-17 - - 1.7153889107776445e-17 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 - - 2.7755575615628914e-17 - - 8.576944553888229e-18 - - -2.2454732361702682e-17 - - -2.2454732361702685e-17 - - 8.576944553888222e-18 - - 0.5 - - 0.0 - - 1.2267441579633078 - - 1.1391299988711383 - - 0.8592429101937902 - - 0.7738773354711027 - - 1.001005597500661 - - 1.1524986624095181 - - 0.9608734165721357 - - 0.9170663370260509 - - 0.7771227926873768 - - 0.7344400053260332 - - 0.8480041363408123 - - 1.113372078981654 - - 1.0695649994355692 - - 0.9296214550968951 - - 0.8869386677355513 - - 1.0005027987503305 - - 0.8475013375904817 - - 1.0 - - 1.0 - - 1.0 - - 1.0 - - 1.0 - - 1.0 - - 1.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 - - 1.0 - - 1.0 - - 1.0 - - 1.0 - - 1.0 - - 0.5 - - 1.0 - - 1.2267441579633078 - - 1.001005597500661 - - 0.7738773354711027 - - 0.8592429101937901 - - 1.139129998871138 - - 1.1524986624095181 - - 0.9608734165721357 - - 0.8480041363408124 - - 0.7344400053260332 - - 0.7771227926873768 - - 0.9170663370260509 - - 1.113372078981654 - - 1.0005027987503305 - - 0.8869386677355513 - - 0.9296214550968951 - - 1.0695649994355692 - - 0.8475013375904817 - - 1.0 + bdata: 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 + dtype: f8 y: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - -0.004225988315000001 - - 0.004225988315000001 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.011336243900000001 - - 0.011336243900000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0017101006600000004 - - 0.0017101006600000004 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.004330126940000001 - - 0.004330126940000001 - - -0.014847321800000002 - - 0.014847321800000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.10000000000000002 - - 0.0 - - 0.0 - - -0.0049240388000000015 - - 0.0049240388000000015 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0032139379550000006 - - 0.0032139379550000006 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.013644480700000003 - - 0.013644480700000003 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.008109612750000002 - - 0.008109612750000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.00028137136250000006 - - 0.0078714803 - - -0.008344890200000002 - - 0.013525193950000004 - - -0.013758964850000003 - - -0.0016490003100000004 - - 0.0017709132300000002 - - -0.0042973283700000016 - - 0.0043621968500000005 - - -0.004934888705000001 - - 0.004912360015000001 - - 0.014884752050000002 - - -0.014804665750000005 - - -0.0032633595150000005 - - 0.0031639754750000006 - - -6.486846850000001e-05 - - 0.011518507450000002 - - -0.011149990550000002 - - 0.004495218770000001 - - -0.0039552707250000005 - - 9.925023200000001e-18 - - -1.0726162951432905 - - -1.0003220491568967 - - -0.92758274218172 - - -0.9549216241393421 - - -1.0445572893787507 - - -0.5238233962453553 - - -1.5124847513262898 - - -1.4763376283330931 - - -1.4399679748455045 - - -1.4536374158243157 - - -1.49845524844402 - - -1.0363081475716451 - - -1.0001610245784485 - - -0.96379137109086 - - -0.9774608120696711 - - -1.0222786446893752 - - -1.4761766037546447 - - -1.0 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 0.0 - - 0.11888206453689419 - - 0.07347315653655916 - - -0.07347315653655913 - - -0.1188820645368942 - - 0.0 - - 0.11888206453689419 - - 0.07347315653655916 - - -0.07347315653655913 - - -0.1188820645368942 - - 0.0 - - 0.0 - - 1.0726162951432905 - - 1.0445572893787507 - - 0.9549216241393421 - - 0.92758274218172 - - 1.0003220491568967 - - 0.5238233962453553 - - 1.5124847513262898 - - 1.49845524844402 - - 1.4536374158243157 - - 1.4399679748455045 - - 1.4763376283330931 - - 1.0363081475716451 - - 1.0222786446893752 - - 0.9774608120696711 - - 0.96379137109086 - - 1.0001610245784485 - - 1.4761766037546447 - - 1.0 - - -1.0 - - -0.7622358709262116 - - -0.8530536869268817 - - -1.1469463130731183 - - -1.2377641290737884 - - -1.0 - - -1.0 - - -0.8811179354631058 - - -0.9265268434634408 - - -1.0734731565365592 - - -1.1188820645368942 - - -1.0 - - -0.8811179354631058 - - -0.9265268434634408 - - -1.0734731565365592 - - -1.1188820645368942 - - -1.0 - - -1.0 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 0.0 - - 0.11888206453689419 - - 0.07347315653655916 - - -0.07347315653655913 - - -0.1188820645368942 - - 0.0 - - 0.11888206453689419 - - 0.07347315653655916 - - -0.07347315653655913 - - -0.1188820645368942 - - 0.0 - - 0.0 - - 1.0 - - 1.2377641290737884 - - 1.1469463130731183 - - 0.8530536869268818 - - 0.7622358709262116 - - 1.0 - - 1.0 - - 1.1188820645368942 - - 1.0734731565365592 - - 0.9265268434634408 - - 0.8811179354631058 - - 1.0 - - 1.1188820645368942 - - 1.0734731565365592 - - 0.9265268434634408 - - 0.8811179354631058 - - 1.0 - - 1.0 - - -0.9273837048567095 - - -0.9554427106212494 - - -1.0450783758606579 - - -1.07241725781828 - - -0.9996779508431032 - - -1.4761766037546447 - - -0.4875152486737102 - - -0.5015447515559801 - - -0.5463625841756843 - - -0.5600320251544955 - - -0.523662371666907 - - -0.9636918524283548 - - -0.9777213553106247 - - -1.022539187930329 - - -1.0362086289091401 - - -0.9998389754215516 - - -0.5238233962453553 - - -1.0 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 0.0 - - 0.11888206453689419 - - 0.07347315653655916 - - -0.07347315653655913 - - -0.1188820645368942 - - 0.0 - - 0.11888206453689419 - - 0.07347315653655916 - - -0.07347315653655913 - - -0.1188820645368942 - - 0.0 - - 0.0 - - 0.9273837048567095 - - 0.9996779508431032 - - 1.07241725781828 - - 1.0450783758606579 - - 0.9554427106212494 - - 1.4761766037546447 - - 0.4875152486737102 - - 0.523662371666907 - - 0.5600320251544955 - - 0.5463625841756843 - - 0.5015447515559801 - - 0.9636918524283548 - - 0.9998389754215516 - - 1.03620862890914 - - 1.022539187930329 - - 0.9777213553106247 - - 0.5238233962453553 - - 1.0 + bdata: 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 + dtype: f8 z: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.0004754300695000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.007705580450000002 - - -0.008505494900000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.013440123200000004 - - -0.013835124650000002 - - 0.0 - - 0.00015880254800000005 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.003090666795000001 - - 0.0 - - 0.0033339664350000007 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0048939786850000005 - - 0.0 - - 0.004949130490000001 - - 0.10000000000000002 - - -3.1374891150000003e-18 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.014907522500000003 - - 0.0 - - -0.004407344015000001 - - -0.014772200600000002 - - 0.0 - - 0.0042485412200000015 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0018584636950000003 - - 0.0 - - 0.0015600122500000005 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.011641889050000001 - - -0.011019207550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.004680036755000001 - - -0.003767693415000001 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014997360100000004 - - -0.012768703700000003 - - -0.012464462200000002 - - -0.006486073150000001 - - -0.005974184350000002 - - -0.004720254240000001 - - -0.004675881190000001 - - -0.0025559673100000006 - - -0.0024436118100000007 - - 0.0008042847750000002 - - 0.0009320507750000002 - - 0.0018558396050000002 - - 0.0024128545100000004 - - 0.003788203375000001 - - 0.0038715966050000008 - - 0.004999579490000001 - - 0.009608536200000002 - - 0.0100338295 - - 0.014310590900000003 - - 0.014469133300000003 - - -1.6175736900000002e-18 - - -0.07624933120475912 - - -0.24999777010606955 - - -0.07825778783247432 - - 0.20163179734122247 - - 0.2028730918020805 - - 8.326672684688674e-17 - - -0.03812466560237964 - - -0.12499888505303486 - - -0.039128893916237244 - - 0.10081589867061115 - - 0.10143654590104016 - - -0.03812466560237956 - - -0.12499888505303478 - - -0.03912889391623716 - - 0.10081589867061123 - - 0.10143654590104025 - - -8.326672684688674e-17 - - 0.0 - - -0.25 - - -0.07725424859373686 - - 0.20225424859373684 - - 0.20225424859373686 - - -0.07725424859373681 - - 1.1102230246251565e-16 - - -0.1250000000000001 - - -0.03862712429686854 - - 0.1011271242968683 - - 0.10112712429686832 - - -0.038627124296868515 - - -0.125 - - -0.03862712429686843 - - 0.10112712429686842 - - 0.10112712429686843 - - -0.038627124296868404 - - -1.1102230246251565e-16 - - 0.0 - - -0.07624933120475912 - - 0.20287309180208046 - - 0.20163179734122252 - - -0.07825778783247427 - - -0.24999777010606958 - - 8.326672684688674e-17 - - -0.03812466560237964 - - 0.10143654590104015 - - 0.10081589867061118 - - -0.039128893916237216 - - -0.12499888505303487 - - -0.03812466560237956 - - 0.10143654590104023 - - 0.10081589867061126 - - -0.03912889391623713 - - -0.12499888505303479 - - -8.326672684688674e-17 - - 0.0 - - 0.25 - - 0.07725424859373686 - - -0.20225424859373684 - - -0.20225424859373686 - - 0.07725424859373681 - - 1.1102230246251565e-16 - - 0.12499999999999989 - - 0.03862712429686832 - - -0.10112712429686853 - - -0.10112712429686854 - - 0.03862712429686829 - - 0.125 - - 0.03862712429686843 - - -0.10112712429686842 - - -0.10112712429686843 - - 0.038627124296868404 - - -1.1102230246251565e-16 - - 0.0 - - -0.25 - - -0.07725424859373686 - - 0.20225424859373684 - - 0.20225424859373686 - - -0.07725424859373681 - - 1.1102230246251565e-16 - - -0.1250000000000001 - - -0.03862712429686854 - - 0.1011271242968683 - - 0.10112712429686832 - - -0.038627124296868515 - - -0.125 - - -0.03862712429686843 - - 0.10112712429686842 - - 0.10112712429686843 - - -0.038627124296868404 - - -1.1102230246251565e-16 - - 0.0 - - 0.25 - - 0.07725424859373686 - - -0.20225424859373684 - - -0.20225424859373686 - - 0.07725424859373681 - - 1.1102230246251565e-16 - - 0.12499999999999989 - - 0.03862712429686832 - - -0.10112712429686853 - - -0.10112712429686854 - - 0.03862712429686829 - - 0.125 - - 0.03862712429686843 - - -0.10112712429686842 - - -0.10112712429686843 - - 0.038627124296868404 - - -1.1102230246251565e-16 - - 0.0 - - -0.07624933120475912 - - 0.20287309180208046 - - 0.20163179734122252 - - -0.07825778783247427 - - -0.24999777010606958 - - 8.326672684688674e-17 - - -0.03812466560237964 - - 0.10143654590104015 - - 0.10081589867061118 - - -0.039128893916237216 - - -0.12499888505303487 - - -0.03812466560237956 - - 0.10143654590104023 - - 0.10081589867061126 - - -0.03912889391623713 - - -0.12499888505303479 - - -8.326672684688674e-17 - - 0.0 - - -0.25 - - -0.07725424859373686 - - 0.20225424859373684 - - 0.20225424859373686 - - -0.07725424859373681 - - 1.1102230246251565e-16 - - -0.1250000000000001 - - -0.03862712429686854 - - 0.1011271242968683 - - 0.10112712429686832 - - -0.038627124296868515 - - -0.125 - - -0.03862712429686843 - - 0.10112712429686842 - - 0.10112712429686843 - - -0.038627124296868404 - - -1.1102230246251565e-16 - - 0.0 - - -0.07624933120475912 - - -0.24999777010606955 - - -0.07825778783247432 - - 0.20163179734122247 - - 0.2028730918020805 - - 8.326672684688674e-17 - - -0.03812466560237964 - - -0.12499888505303486 - - -0.039128893916237244 - - 0.10081589867061115 - - 0.10143654590104016 - - -0.03812466560237956 - - -0.12499888505303478 - - -0.03912889391623716 - - 0.10081589867061123 - - 0.10143654590104025 - - -8.326672684688674e-17 - - 0.0 + bdata: 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 + dtype: f8 - color: '#2e91e5' colorscale: - - 0.0 @@ -3988,53 +778,17 @@ data: - - 1.0 - '#e71111' i: - - 7 - - 0 - - 0 - - 0 - - 4 - - 4 - - 2 - - 6 - - 4 - - 0 - - 3 - - 7 + bdata: BwAAAAQEAgYEAAMH + dtype: i1 intensity: - - 0.0 - - 0.0 - - 1.0 - - 1.0 - - 0.0 - - 0.0 - - 1.0 - - 1.0 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 j: - - 0 - - 7 - - 1 - - 2 - - 6 - - 7 - - 1 - - 2 - - 5 - - 5 - - 2 - - 2 + bdata: AAcBAgYHAQIFBQIC + dtype: i1 k: - - 3 - - 4 - - 2 - - 3 - - 5 - - 6 - - 5 - - 5 - - 0 - - 1 - - 7 - - 6 + bdata: AwQCAwUGBQUAAQcG + dtype: i1 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -4043,32 +797,14 @@ data: showscale: false type: mesh3d x: - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 y: - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 z: - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 - facecolor: - '#fb0d0d' - '#fb0d0d' @@ -4251,548 +987,14 @@ data: - blue - blue i: - - 75 - - 64 - - 2 - - 75 - - 76 - - 65 - - 65 - - 64 - - 2 - - 0 - - 1 - - 0 - - 84 - - 86 - - 86 - - 90 - - 90 - - 92 - - 92 - - 91 - - 91 - - 87 - - 87 - - 85 - - 85 - - 83 - - 83 - - 82 - - 82 - - 84 - - 94 - - 86 - - 86 - - 84 - - 84 - - 82 - - 82 - - 83 - - 83 - - 85 - - 85 - - 87 - - 87 - - 87 - - 91 - - 91 - - 92 - - 92 - - 90 - - 90 - - 94 - - 95 - - 88 - - 78 - - 79 - - 81 - - 80 - - 93 - - 96 - - 89 - - 77 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 50 - - 52 - - 52 - - 44 - - 44 - - 32 - - 32 - - 22 - - 22 - - 14 - - 14 - - 20 - - 20 - - 30 - - 30 - - 41 - - 41 - - 50 - - 57 - - 52 - - 52 - - 50 - - 50 - - 41 - - 41 - - 30 - - 30 - - 20 - - 20 - - 14 - - 14 - - 14 - - 22 - - 22 - - 32 - - 32 - - 44 - - 44 - - 57 - - 11 - - 4 - - 12 - - 58 - - 62 - - 8 - - 7 - - 39 - - 61 - - 42 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 48 - - 54 - - 54 - - 47 - - 47 - - 37 - - 37 - - 25 - - 25 - - 17 - - 17 - - 18 - - 18 - - 26 - - 26 - - 38 - - 38 - - 48 - - 59 - - 54 - - 54 - - 48 - - 48 - - 38 - - 38 - - 26 - - 26 - - 18 - - 18 - - 17 - - 17 - - 17 - - 25 - - 25 - - 37 - - 37 - - 47 - - 47 - - 59 - - 27 - - 5 - - 10 - - 56 - - 60 - - 6 - - 9 - - 55 - - 63 - - 28 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 + bdata: S0ACS0xBQUACAAEAVFZWWlpcXFtbV1dVVVNTUlJUXlZWVFRSUlNTVVVXV1dbW1xcWlpeX1hOT1FQXWBZTUZISEpKSUkyNDQsLCAgFhYODhQUHh4pKTI5NDQyMikpHh4UFA4ODhYWICAsLDkLBAw6PggHJz0qMysrHx8VFTA2Ni8vJSUZGREREhIaGiYmMDs2NjAwJiYaGhISERERGRklJS8vOxsFCjg8Bgk3Pxw1LS0jIxcX + dtype: i1 j: - - 76 - - 76 - - 3 - - 3 - - 3 - - 3 - - 1 - - 1 - - 75 - - 75 - - 3 - - 3 - - 70 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 71 - - 71 - - 69 - - 69 - - 67 - - 67 - - 66 - - 66 - - 68 - - 68 - - 89 - - 89 - - 81 - - 81 - - 79 - - 79 - - 77 - - 77 - - 78 - - 78 - - 80 - - 80 - - 88 - - 93 - - 93 - - 95 - - 95 - - 96 - - 96 - - 94 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 68 - - 68 - - 66 - - 66 - - 67 - - 67 - - 69 - - 51 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 13 - - 13 - - 19 - - 19 - - 29 - - 29 - - 40 - - 40 - - 49 - - 49 - - 61 - - 61 - - 62 - - 62 - - 58 - - 58 - - 42 - - 42 - - 12 - - 12 - - 8 - - 8 - - 4 - - 7 - - 7 - - 11 - - 11 - - 39 - - 39 - - 57 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 49 - - 49 - - 40 - - 40 - - 29 - - 29 - - 19 - - 53 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 15 - - 15 - - 16 - - 16 - - 24 - - 24 - - 36 - - 36 - - 46 - - 46 - - 63 - - 63 - - 60 - - 60 - - 56 - - 56 - - 28 - - 28 - - 10 - - 10 - - 6 - - 6 - - 5 - - 9 - - 9 - - 27 - - 27 - - 55 - - 55 - - 59 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 46 - - 46 - - 36 - - 36 - - 24 - - 24 - - 16 + bdata: TEwDAwMDAQFLSwMDRkZISEpKSUlHR0VFQ0NCQkREWVlRUU9PTU1OTlBQWF1dX19gYF5hYWFhYWFhYWFhYUREQkJDQ0UzMysrHx8VFQ0NExMdHSgoMTE9PT4+OjoqKgwMCAgEBwcLCycnOSIiIiIiIiIiIiIiMTEoKB0dEzU1LS0jIxcXDw8QEBgYJCQuLj8/PDw4OBwcCgoGBgUJCRsbNzc7ISEhISEhISEhISEuLiQkGBgQ + dtype: i1 k: - - 64 - - 65 - - 75 - - 76 - - 65 - - 1 - - 64 - - 0 - - 0 - - 64 - - 0 - - 2 - - 86 - - 72 - - 90 - - 74 - - 92 - - 73 - - 91 - - 71 - - 87 - - 69 - - 85 - - 67 - - 83 - - 66 - - 82 - - 68 - - 84 - - 70 - - 86 - - 81 - - 84 - - 79 - - 82 - - 77 - - 83 - - 78 - - 85 - - 80 - - 87 - - 88 - - 93 - - 91 - - 95 - - 92 - - 96 - - 90 - - 94 - - 86 - - 89 - - 96 - - 93 - - 80 - - 77 - - 79 - - 88 - - 95 - - 94 - - 81 - - 78 - - 72 - - 66 - - 74 - - 67 - - 73 - - 69 - - 71 - - 52 - - 43 - - 44 - - 31 - - 32 - - 21 - - 22 - - 13 - - 14 - - 19 - - 20 - - 29 - - 30 - - 40 - - 41 - - 49 - - 50 - - 51 - - 52 - - 62 - - 50 - - 58 - - 41 - - 42 - - 30 - - 12 - - 20 - - 8 - - 14 - - 4 - - 7 - - 22 - - 11 - - 32 - - 39 - - 44 - - 57 - - 52 - - 61 - - 39 - - 7 - - 8 - - 42 - - 58 - - 4 - - 11 - - 57 - - 62 - - 12 - - 43 - - 40 - - 31 - - 29 - - 21 - - 19 - - 13 - - 54 - - 45 - - 47 - - 35 - - 37 - - 23 - - 25 - - 15 - - 17 - - 16 - - 18 - - 24 - - 26 - - 36 - - 38 - - 46 - - 48 - - 53 - - 54 - - 60 - - 48 - - 56 - - 38 - - 28 - - 26 - - 10 - - 18 - - 6 - - 17 - - 5 - - 9 - - 25 - - 27 - - 37 - - 55 - - 47 - - 59 - - 54 - - 63 - - 55 - - 9 - - 6 - - 28 - - 56 - - 5 - - 27 - - 59 - - 60 - - 10 - - 45 - - 36 - - 35 - - 24 - - 23 - - 16 - - 15 + bdata: QEFLTEEBQAAAQAACVkhaSlxJW0dXRVVDU0JSRFRGVlFUT1JNU05VUFdYXVtfXGBaXlZZYF1QTU9YX15RTkhCSkNJRUc0KywfIBUWDQ4TFB0eKCkxMjM0PjI6KSoeDBQIDgQHFgsgJyw5ND0nBwgqOgQLOT4MKygfHRUTDTYtLyMlFxkPERASGBokJi4wNTY8MDgmHBoKEgYRBQkZGyU3Lzs2PzcJBhw4BRs7PAotJCMYFxAP + dtype: i1 legendgroup: Sensor(id=ID) name: Sensor (arrow) opacity: 1 @@ -4800,302 +1002,14 @@ data: showlegend: true type: mesh3d x: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014992463600000002 - - -0.014392395300000003 - - -0.014392395300000003 - - -0.012869499600000002 - - -0.012355425950000002 - - -0.009822911000000002 - - -0.009822911000000002 - - -0.0066605612500000005 - - -0.005795627850000001 - - 0.0 - - -0.004997477680000001 - - 0.0 - - 0.0 - - -0.0046984631550000015 - - -0.0046984631550000015 - - 0.0 - - -0.003930366410000001 - - 0.0 - - -0.003726213425000001 - - 0.0 - - 0.0 - - -0.0025000000350000003 - - -0.0025000000350000003 - - -0.0021347226600000008 - - -0.0021347226600000008 - - 0.0 - - -0.0010241928500000002 - - 0.0 - - -0.0007114128200000001 - - -1.0408340850000002e-17 - - -9.553993650000002e-18 - - 0.0 - - 0.0 - - 0.0008682409300000002 - - 0.0008682409300000002 - - 0.0016630589950000004 - - 0.0 - - 0.0023612117400000003 - - 0.0026042407400000004 - - 0.0 - - 0.0026362657550000005 - - 0.0 - - 0.0 - - 0.003830222040000001 - - 0.003830222040000001 - - 0.0 - - 0.004641779140000001 - - 0.0 - - 0.004750406370000001 - - 0.0 - - 0.0049999997000000004 - - 0.006231224900000001 - - 0.006231224900000001 - - 0.00945867 - - 0.010177281500000003 - - 0.012618804000000003 - - 0.012618804000000003 - - 0.014251218750000003 - - 0.014519108850000004 - - 0.014999999100000003 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.10000000000000002 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5Pw== + dtype: f8 y: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - -0.004225988315000001 - - 0.004225988315000001 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.011336243900000001 - - 0.011336243900000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0017101006600000004 - - 0.0017101006600000004 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.004330126940000001 - - 0.004330126940000001 - - -0.014847321800000002 - - 0.014847321800000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.10000000000000002 - - 0.0 - - 0.0 - - -0.0049240388000000015 - - 0.0049240388000000015 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0032139379550000006 - - 0.0032139379550000006 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.013644480700000003 - - 0.013644480700000003 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.008109612750000002 - - 0.008109612750000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.00028137136250000006 - - 0.0078714803 - - -0.008344890200000002 - - 0.013525193950000004 - - -0.013758964850000003 - - -0.0016490003100000004 - - 0.0017709132300000002 - - -0.0042973283700000016 - - 0.0043621968500000005 - - -0.004934888705000001 - - 0.004912360015000001 - - 0.014884752050000002 - - -0.014804665750000005 - - -0.0032633595150000005 - - 0.0031639754750000006 - - -6.486846850000001e-05 - - 0.011518507450000002 - - -0.011149990550000002 - - 0.004495218770000001 - - -0.0039552707250000005 - - 9.925023200000001e-18 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPA== + dtype: f8 z: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.0004754300695000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.007705580450000002 - - -0.008505494900000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.013440123200000004 - - -0.013835124650000002 - - 0.0 - - 0.00015880254800000005 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.003090666795000001 - - 0.0 - - 0.0033339664350000007 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0048939786850000005 - - 0.0 - - 0.004949130490000001 - - 0.10000000000000002 - - -3.1374891150000003e-18 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.014907522500000003 - - 0.0 - - -0.004407344015000001 - - -0.014772200600000002 - - 0.0 - - 0.0042485412200000015 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0018584636950000003 - - 0.0 - - 0.0015600122500000005 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.011641889050000001 - - -0.011019207550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.004680036755000001 - - -0.003767693415000001 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014997360100000004 - - -0.012768703700000003 - - -0.012464462200000002 - - -0.006486073150000001 - - -0.005974184350000002 - - -0.004720254240000001 - - -0.004675881190000001 - - -0.0025559673100000006 - - -0.0024436118100000007 - - 0.0008042847750000002 - - 0.0009320507750000002 - - 0.0018558396050000002 - - 0.0024128545100000004 - - 0.003788203375000001 - - 0.0038715966050000008 - - 0.004999579490000001 - - 0.009608536200000002 - - 0.0100338295 - - 0.014310590900000003 - - 0.014469133300000003 - - -1.6175736900000002e-18 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vA== + dtype: f8 - legendgroup: Sensor(id=ID) line: color: @@ -5246,78 +1160,8 @@ data: - '#440154' - '#440154' size: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + dtype: f8 mode: markers+lines name: Sensor (arrow) opacity: 1 @@ -5325,224 +1169,14 @@ data: showlegend: false type: scatter3d x: - - -1.1524986624095181 - - -0.8475013375904817 - - -1.2720929895559694 - - -0.8475013375904817 - - -0.7279070104440306 - - -0.8475013375904817 - - -0.8475013375904817 - - .nan - - -1.5 - - -0.5 - - -1.0 - - -0.5 - - -0.9999999999999999 - - -0.5 - - -0.5 - - .nan - - -1.1524986624095181 - - -0.8475013375904817 - - -1.2720929895559694 - - -0.8475013375904817 - - -0.7279070104440306 - - -0.8475013375904817 - - -0.8475013375904817 - - .nan - - 0.5 - - -0.5 - - -6.661338147750939e-17 - - -0.5 - - 6.661338147750939e-17 - - -0.5 - - -0.5 - - .nan - - -0.5 - - 0.5 - - -6.661338147750939e-17 - - 0.5 - - 6.661338147750939e-17 - - 0.5 - - 0.5 - - .nan - - 0.5 - - -0.5 - - -6.661338147750939e-17 - - -0.5 - - 6.661338147750939e-17 - - -0.5 - - -0.5 - - .nan - - 0.8475013375904817 - - 1.1524986624095181 - - 0.7279070104440306 - - 1.1524986624095181 - - 1.2720929895559694 - - 1.1524986624095181 - - 1.1524986624095181 - - .nan - - 0.5 - - 1.5 - - 0.9999999999999999 - - 1.5 - - 1.0 - - 1.5 - - 1.5 - - .nan - - 0.8475013375904817 - - 1.1524986624095181 - - 0.7279070104440306 - - 1.1524986624095181 - - 1.2720929895559694 - - 1.1524986624095181 - - 1.1524986624095181 - - .nan + bdata: 1bj7b6Jw8r9Vjgggux7rv/TRuS1+WvS/VY4IILse678YXIykA0vnv1WOCCC7Huu/VY4IILse678AAAAAAAD4fwAAAAAAAPi/AAAAAAAA4L8AAAAAAADwvwAAAAAAAOC/////////778AAAAAAADgvwAAAAAAAOC/AAAAAAAA+H/VuPtvonDyv1WOCCC7Huu/9NG5LX5a9L9Vjgggux7rvxhcjKQDS+e/VY4IILse679Vjgggux7rvwAAAAAAAPh/AAAAAAAA4D8AAAAAAADgvzMzMzMzM5O8AAAAAAAA4L8zMzMzMzOTPAAAAAAAAOC/AAAAAAAA4L8AAAAAAAD4fwAAAAAAAOC/AAAAAAAA4D8zMzMzMzOTvAAAAAAAAOA/MzMzMzMzkzwAAAAAAADgPwAAAAAAAOA/AAAAAAAA+H8AAAAAAADgPwAAAAAAAOC/MzMzMzMzk7wAAAAAAADgvzMzMzMzM5M8AAAAAAAA4L8AAAAAAADgvwAAAAAAAPh/VY4IILse6z/VuPtvonDyPxhcjKQDS+c/1bj7b6Jw8j/00bktflr0P9W4+2+icPI/1bj7b6Jw8j8AAAAAAAD4fwAAAAAAAOA/AAAAAAAA+D/////////vPwAAAAAAAPg/AAAAAAAA8D8AAAAAAAD4PwAAAAAAAPg/AAAAAAAA+H9Vjgggux7rP9W4+2+icPI/GFyMpANL5z/VuPtvonDyP/TRuS1+WvQ/1bj7b6Jw8j/VuPtvonDyPwAAAAAAAPh/ + dtype: f8 y: - - -1.4761766037546447 - - -0.5238233962453553 - - -0.9128604458280515 - - -0.5238233962453553 - - -1.0871395541719486 - - -0.5238233962453553 - - -0.5238233962453553 - - .nan - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - .nan - - 1.4761766037546447 - - 0.5238233962453553 - - 0.9128604458280515 - - 0.5238233962453553 - - 1.0871395541719486 - - 0.5238233962453553 - - 0.5238233962453553 - - .nan - - -1.0 - - -1.0 - - -1.0 - - -1.0 - - -1.0 - - -1.0 - - -1.0 - - .nan - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - .nan - - 1.0 - - 1.0 - - 1.0 - - 1.0 - - 1.0 - - 1.0 - - 1.0 - - .nan - - -0.5238233962453553 - - -1.4761766037546447 - - -1.0871395541719486 - - -1.4761766037546447 - - -0.9128604458280515 - - -1.4761766037546447 - - -1.4761766037546447 - - .nan - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - .nan - - 0.5238233962453553 - - 1.4761766037546447 - - 1.0871395541719486 - - 1.4761766037546447 - - 0.9128604458280515 - - 1.4761766037546447 - - 1.4761766037546447 - - .nan + bdata: 3vHDW2ue979EHHhIKcPgvzuXFBwnNu2/RBx4SCnD4L9jtPVx7GTxv0QceEgpw+C/RBx4SCnD4L8AAAAAAAD4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+H/e8cNba573P0QceEgpw+A/O5cUHCc27T9EHHhIKcPgP2O09XHsZPE/RBx4SCnD4D9EHHhIKcPgPwAAAAAAAPh/AAAAAAAA8L8AAAAAAADwvwAAAAAAAPC/AAAAAAAA8L8AAAAAAADwvwAAAAAAAPC/AAAAAAAA8L8AAAAAAAD4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+H8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPh/RBx4SCnD4L/e8cNba573v2O09XHsZPG/3vHDW2ue9787lxQcJzbtv97xw1trnve/3vHDW2ue978AAAAAAAD4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+H9EHHhIKcPgP97xw1trnvc/Y7T1cexk8T/e8cNba573PzuXFBwnNu0/3vHDW2ue9z/e8cNba573PwAAAAAAAPh/ + dtype: f8 z: - - -8.326672684688674e-17 - - 8.326672684688674e-17 - - 0.09149919744571093 - - 8.326672684688674e-17 - - -0.09149919744571093 - - 8.326672684688674e-17 - - 8.326672684688674e-17 - - .nan - - -1.1102230246251565e-16 - - 1.1102230246251565e-16 - - 0.3 - - 1.1102230246251565e-16 - - -0.3 - - 1.1102230246251565e-16 - - 1.1102230246251565e-16 - - .nan - - -8.326672684688674e-17 - - 8.326672684688674e-17 - - 0.09149919744571093 - - 8.326672684688674e-17 - - -0.09149919744571093 - - 8.326672684688674e-17 - - 8.326672684688674e-17 - - .nan - - -1.1102230246251565e-16 - - 1.1102230246251565e-16 - - -0.3 - - 1.1102230246251565e-16 - - 0.3 - - 1.1102230246251565e-16 - - 1.1102230246251565e-16 - - .nan - - -1.1102230246251565e-16 - - 1.1102230246251565e-16 - - 0.3 - - 1.1102230246251565e-16 - - -0.3 - - 1.1102230246251565e-16 - - 1.1102230246251565e-16 - - .nan - - -1.1102230246251565e-16 - - 1.1102230246251565e-16 - - -0.3 - - 1.1102230246251565e-16 - - 0.3 - - 1.1102230246251565e-16 - - 1.1102230246251565e-16 - - .nan - - -8.326672684688674e-17 - - 8.326672684688674e-17 - - 0.09149919744571093 - - 8.326672684688674e-17 - - -0.09149919744571093 - - 8.326672684688674e-17 - - 8.326672684688674e-17 - - .nan - - -1.1102230246251565e-16 - - 1.1102230246251565e-16 - - 0.3 - - 1.1102230246251565e-16 - - -0.3 - - 1.1102230246251565e-16 - - 1.1102230246251565e-16 - - .nan - - -8.326672684688674e-17 - - 8.326672684688674e-17 - - 0.09149919744571093 - - 8.326672684688674e-17 - - -0.09149919744571093 - - 8.326672684688674e-17 - - 8.326672684688674e-17 - - .nan + bdata: AAAAAAAAmLwAAAAAAACYPDO7o8x9bLc/AAAAAAAAmDwzu6PMfWy3vwAAAAAAAJg8AAAAAAAAmDwAAAAAAAD4fwAAAAAAAKC8AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8MzMzMzMz078AAAAAAACgPAAAAAAAAKA8AAAAAAAA+H8AAAAAAACYvAAAAAAAAJg8M7ujzH1stz8AAAAAAACYPDO7o8x9bLe/AAAAAAAAmDwAAAAAAACYPAAAAAAAAPh/AAAAAAAAoLwAAAAAAACgPDMzMzMzM9O/AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8AAAAAAAAoDwAAAAAAAD4fwAAAAAAAKC8AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8MzMzMzMz078AAAAAAACgPAAAAAAAAKA8AAAAAAAA+H8AAAAAAACgvAAAAAAAAKA8MzMzMzMz078AAAAAAACgPDMzMzMzM9M/AAAAAAAAoDwAAAAAAACgPAAAAAAAAPh/AAAAAAAAmLwAAAAAAACYPDO7o8x9bLc/AAAAAAAAmDwzu6PMfWy3vwAAAAAAAJg8AAAAAAAAmDwAAAAAAAD4fwAAAAAAAKC8AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8MzMzMzMz078AAAAAAACgPAAAAAAAAKA8AAAAAAAA+H8AAAAAAACYvAAAAAAAAJg8M7ujzH1stz8AAAAAAACYPDO7o8x9bLe/AAAAAAAAmDwAAAAAAACYPAAAAAAAAPh/ + dtype: f8 layout: legend: itemsizing: constant diff --git a/tests/test_display_plotly/test_pixel_field_null_values.yml b/tests/test_display_plotly/test_pixel_field_null_values.yml index cd196b36c..9dfad2981 100644 --- a/tests/test_display_plotly/test_pixel_field_null_values.yml +++ b/tests/test_display_plotly/test_pixel_field_null_values.yml @@ -14,53 +14,17 @@ data: - - 1.0 - '#e71111' i: - - 7 - - 0 - - 0 - - 0 - - 4 - - 4 - - 2 - - 6 - - 4 - - 0 - - 3 - - 7 + bdata: BwAAAAQEAgYEAAMH + dtype: i1 intensity: - - 0.0 - - 0.0 - - 1.0 - - 1.0 - - 0.0 - - 0.0 - - 1.0 - - 1.0 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 j: - - 0 - - 7 - - 1 - - 2 - - 6 - - 7 - - 1 - - 2 - - 5 - - 5 - - 2 - - 2 + bdata: AAcBAgYHAQIFBQIC + dtype: i1 k: - - 3 - - 4 - - 2 - - 3 - - 5 - - 6 - - 5 - - 5 - - 0 - - 1 - - 7 - - 6 + bdata: AwQCAwUGBQUAAQcG + dtype: i1 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -69,32 +33,14 @@ data: showscale: false type: mesh3d x: - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 y: - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 z: - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 - facecolor: - '#e15f99' - '#e15f99' @@ -430,1007 +376,14 @@ data: - '#461567' - '#461567' i: - - 75 - - 64 - - 2 - - 75 - - 76 - - 65 - - 65 - - 64 - - 2 - - 0 - - 1 - - 0 - - 84 - - 86 - - 86 - - 90 - - 90 - - 92 - - 92 - - 91 - - 91 - - 87 - - 87 - - 85 - - 85 - - 83 - - 83 - - 82 - - 82 - - 84 - - 94 - - 86 - - 86 - - 84 - - 84 - - 82 - - 82 - - 83 - - 83 - - 85 - - 85 - - 87 - - 87 - - 87 - - 91 - - 91 - - 92 - - 92 - - 90 - - 90 - - 94 - - 95 - - 88 - - 78 - - 79 - - 81 - - 80 - - 93 - - 96 - - 89 - - 77 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 50 - - 52 - - 52 - - 44 - - 44 - - 32 - - 32 - - 22 - - 22 - - 14 - - 14 - - 20 - - 20 - - 30 - - 30 - - 41 - - 41 - - 50 - - 57 - - 52 - - 52 - - 50 - - 50 - - 41 - - 41 - - 30 - - 30 - - 20 - - 20 - - 14 - - 14 - - 14 - - 22 - - 22 - - 32 - - 32 - - 44 - - 44 - - 57 - - 11 - - 4 - - 12 - - 58 - - 62 - - 8 - - 7 - - 39 - - 61 - - 42 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 48 - - 54 - - 54 - - 47 - - 47 - - 37 - - 37 - - 25 - - 25 - - 17 - - 17 - - 18 - - 18 - - 26 - - 26 - - 38 - - 38 - - 48 - - 59 - - 54 - - 54 - - 48 - - 48 - - 38 - - 38 - - 26 - - 26 - - 18 - - 18 - - 17 - - 17 - - 17 - - 25 - - 25 - - 37 - - 37 - - 47 - - 47 - - 59 - - 27 - - 5 - - 10 - - 56 - - 60 - - 6 - - 9 - - 55 - - 63 - - 28 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 98 - - 99 - - 100 - - 101 - - 102 - - 104 - - 105 - - 106 - - 107 - - 108 - - 110 - - 111 - - 112 - - 113 - - 114 - - 116 - - 117 - - 118 - - 119 - - 120 - - 122 - - 123 - - 124 - - 125 - - 126 - - 128 - - 129 - - 130 - - 131 - - 132 - - 141 - - 134 - - 134 - - 134 - - 138 - - 138 - - 136 - - 140 - - 138 - - 134 - - 137 - - 141 - - 142 - - 143 - - 144 - - 145 - - 146 - - 155 - - 148 - - 148 - - 148 - - 152 - - 152 - - 150 - - 154 - - 152 - - 148 - - 151 - - 155 - - 156 - - 157 - - 158 - - 159 - - 160 - - 162 - - 163 - - 164 - - 165 - - 166 - - 168 - - 169 - - 170 - - 171 - - 172 - - 174 - - 175 - - 176 - - 177 - - 178 - - 180 - - 181 - - 182 - - 183 - - 184 - - 186 - - 187 - - 188 - - 189 - - 190 - - 192 - - 193 - - 194 - - 195 - - 196 - - 205 - - 198 - - 198 - - 198 - - 202 - - 202 - - 200 - - 204 - - 202 - - 198 - - 201 - - 205 - - 206 - - 207 - - 208 - - 209 - - 210 - - 219 - - 212 - - 212 - - 212 - - 216 - - 216 - - 214 - - 218 - - 216 - - 212 - - 215 - - 219 - - 220 - - 221 - - 222 - - 223 - - 224 - - 226 - - 227 - - 228 - - 229 - - 230 - - 232 - - 233 - - 234 - - 235 - - 236 - - 238 - - 239 - - 240 - - 241 - - 242 - - 244 - - 245 - - 246 - - 247 - - 248 - - 250 - - 251 - - 252 - - 253 - - 254 + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAjQCGAIYAhgCKAIoAiACMAIoAhgCJAI0AjgCPAJAAkQCSAJsAlACUAJQAmACYAJYAmgCYAJQAlwCbAJwAnQCeAJ8AoACiAKMApAClAKYAqACpAKoAqwCsAK4ArwCwALEAsgC0ALUAtgC3ALgAugC7ALwAvQC+AMAAwQDCAMMAxADNAMYAxgDGAMoAygDIAMwAygDGAMkAzQDOAM8A0ADRANIA2wDUANQA1ADYANgA1gDaANgA1ADXANsA3ADdAN4A3wDgAOIA4wDkAOUA5gDoAOkA6gDrAOwA7gDvAPAA8QDyAPQA9QD2APcA+AD6APsA/AD9AP4A + dtype: i2 j: - - 76 - - 76 - - 3 - - 3 - - 3 - - 3 - - 1 - - 1 - - 75 - - 75 - - 3 - - 3 - - 70 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 71 - - 71 - - 69 - - 69 - - 67 - - 67 - - 66 - - 66 - - 68 - - 68 - - 89 - - 89 - - 81 - - 81 - - 79 - - 79 - - 77 - - 77 - - 78 - - 78 - - 80 - - 80 - - 88 - - 93 - - 93 - - 95 - - 95 - - 96 - - 96 - - 94 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 68 - - 68 - - 66 - - 66 - - 67 - - 67 - - 69 - - 51 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 13 - - 13 - - 19 - - 19 - - 29 - - 29 - - 40 - - 40 - - 49 - - 49 - - 61 - - 61 - - 62 - - 62 - - 58 - - 58 - - 42 - - 42 - - 12 - - 12 - - 8 - - 8 - - 4 - - 7 - - 7 - - 11 - - 11 - - 39 - - 39 - - 57 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 49 - - 49 - - 40 - - 40 - - 29 - - 29 - - 19 - - 53 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 15 - - 15 - - 16 - - 16 - - 24 - - 24 - - 36 - - 36 - - 46 - - 46 - - 63 - - 63 - - 60 - - 60 - - 56 - - 56 - - 28 - - 28 - - 10 - - 10 - - 6 - - 6 - - 5 - - 9 - - 9 - - 27 - - 27 - - 55 - - 55 - - 59 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 46 - - 46 - - 36 - - 36 - - 24 - - 24 - - 16 - - 99 - - 100 - - 101 - - 102 - - 98 - - 105 - - 106 - - 107 - - 108 - - 104 - - 111 - - 112 - - 113 - - 114 - - 110 - - 117 - - 118 - - 119 - - 120 - - 116 - - 123 - - 124 - - 125 - - 126 - - 122 - - 129 - - 130 - - 131 - - 132 - - 128 - - 134 - - 141 - - 135 - - 136 - - 140 - - 141 - - 135 - - 136 - - 139 - - 139 - - 136 - - 136 - - 143 - - 144 - - 145 - - 146 - - 142 - - 148 - - 155 - - 149 - - 150 - - 154 - - 155 - - 149 - - 150 - - 153 - - 153 - - 150 - - 150 - - 157 - - 158 - - 159 - - 160 - - 156 - - 163 - - 164 - - 165 - - 166 - - 162 - - 169 - - 170 - - 171 - - 172 - - 168 - - 175 - - 176 - - 177 - - 178 - - 174 - - 181 - - 182 - - 183 - - 184 - - 180 - - 187 - - 188 - - 189 - - 190 - - 186 - - 193 - - 194 - - 195 - - 196 - - 192 - - 198 - - 205 - - 199 - - 200 - - 204 - - 205 - - 199 - - 200 - - 203 - - 203 - - 200 - - 200 - - 207 - - 208 - - 209 - - 210 - - 206 - - 212 - - 219 - - 213 - - 214 - - 218 - - 219 - - 213 - - 214 - - 217 - - 217 - - 214 - - 214 - - 221 - - 222 - - 223 - - 224 - - 220 - - 227 - - 228 - - 229 - - 230 - - 226 - - 233 - - 234 - - 235 - - 236 - - 232 - - 239 - - 240 - - 241 - - 242 - - 238 - - 245 - - 246 - - 247 - - 248 - - 244 - - 251 - - 252 - - 253 - - 254 - - 250 + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhgCNAIcAiACMAI0AhwCIAIsAiwCIAIgAjwCQAJEAkgCOAJQAmwCVAJYAmgCbAJUAlgCZAJkAlgCWAJ0AngCfAKAAnACjAKQApQCmAKIAqQCqAKsArACoAK8AsACxALIArgC1ALYAtwC4ALQAuwC8AL0AvgC6AMEAwgDDAMQAwADGAM0AxwDIAMwAzQDHAMgAywDLAMgAyADPANAA0QDSAM4A1ADbANUA1gDaANsA1QDWANkA2QDWANYA3QDeAN8A4ADcAOMA5ADlAOYA4gDpAOoA6wDsAOgA7wDwAPEA8gDuAPUA9gD3APgA9AD7APwA/QD+APoA + dtype: i2 k: - - 64 - - 65 - - 75 - - 76 - - 65 - - 1 - - 64 - - 0 - - 0 - - 64 - - 0 - - 2 - - 86 - - 72 - - 90 - - 74 - - 92 - - 73 - - 91 - - 71 - - 87 - - 69 - - 85 - - 67 - - 83 - - 66 - - 82 - - 68 - - 84 - - 70 - - 86 - - 81 - - 84 - - 79 - - 82 - - 77 - - 83 - - 78 - - 85 - - 80 - - 87 - - 88 - - 93 - - 91 - - 95 - - 92 - - 96 - - 90 - - 94 - - 86 - - 89 - - 96 - - 93 - - 80 - - 77 - - 79 - - 88 - - 95 - - 94 - - 81 - - 78 - - 72 - - 66 - - 74 - - 67 - - 73 - - 69 - - 71 - - 52 - - 43 - - 44 - - 31 - - 32 - - 21 - - 22 - - 13 - - 14 - - 19 - - 20 - - 29 - - 30 - - 40 - - 41 - - 49 - - 50 - - 51 - - 52 - - 62 - - 50 - - 58 - - 41 - - 42 - - 30 - - 12 - - 20 - - 8 - - 14 - - 4 - - 7 - - 22 - - 11 - - 32 - - 39 - - 44 - - 57 - - 52 - - 61 - - 39 - - 7 - - 8 - - 42 - - 58 - - 4 - - 11 - - 57 - - 62 - - 12 - - 43 - - 40 - - 31 - - 29 - - 21 - - 19 - - 13 - - 54 - - 45 - - 47 - - 35 - - 37 - - 23 - - 25 - - 15 - - 17 - - 16 - - 18 - - 24 - - 26 - - 36 - - 38 - - 46 - - 48 - - 53 - - 54 - - 60 - - 48 - - 56 - - 38 - - 28 - - 26 - - 10 - - 18 - - 6 - - 17 - - 5 - - 9 - - 25 - - 27 - - 37 - - 55 - - 47 - - 59 - - 54 - - 63 - - 55 - - 9 - - 6 - - 28 - - 56 - - 5 - - 27 - - 59 - - 60 - - 10 - - 45 - - 36 - - 35 - - 24 - - 23 - - 16 - - 15 - - 103 - - 103 - - 103 - - 103 - - 103 - - 109 - - 109 - - 109 - - 109 - - 109 - - 115 - - 115 - - 115 - - 115 - - 115 - - 121 - - 121 - - 121 - - 121 - - 121 - - 127 - - 127 - - 127 - - 127 - - 127 - - 133 - - 133 - - 133 - - 133 - - 133 - - 137 - - 138 - - 136 - - 137 - - 139 - - 140 - - 139 - - 139 - - 134 - - 135 - - 141 - - 140 - - 147 - - 147 - - 147 - - 147 - - 147 - - 151 - - 152 - - 150 - - 151 - - 153 - - 154 - - 153 - - 153 - - 148 - - 149 - - 155 - - 154 - - 161 - - 161 - - 161 - - 161 - - 161 - - 167 - - 167 - - 167 - - 167 - - 167 - - 173 - - 173 - - 173 - - 173 - - 173 - - 179 - - 179 - - 179 - - 179 - - 179 - - 185 - - 185 - - 185 - - 185 - - 185 - - 191 - - 191 - - 191 - - 191 - - 191 - - 197 - - 197 - - 197 - - 197 - - 197 - - 201 - - 202 - - 200 - - 201 - - 203 - - 204 - - 203 - - 203 - - 198 - - 199 - - 205 - - 204 - - 211 - - 211 - - 211 - - 211 - - 211 - - 215 - - 216 - - 214 - - 215 - - 217 - - 218 - - 217 - - 217 - - 212 - - 213 - - 219 - - 218 - - 225 - - 225 - - 225 - - 225 - - 225 - - 231 - - 231 - - 231 - - 231 - - 231 - - 237 - - 237 - - 237 - - 237 - - 237 - - 243 - - 243 - - 243 - - 243 - - 243 - - 249 - - 249 - - 249 - - 249 - - 249 - - 255 - - 255 - - 255 - - 255 - - 255 + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiQCKAIgAiQCLAIwAiwCLAIYAhwCNAIwAkwCTAJMAkwCTAJcAmACWAJcAmQCaAJkAmQCUAJUAmwCaAKEAoQChAKEAoQCnAKcApwCnAKcArQCtAK0ArQCtALMAswCzALMAswC5ALkAuQC5ALkAvwC/AL8AvwC/AMUAxQDFAMUAxQDJAMoAyADJAMsAzADLAMsAxgDHAM0AzADTANMA0wDTANMA1wDYANYA1wDZANoA2QDZANQA1QDbANoA4QDhAOEA4QDhAOcA5wDnAOcA5wDtAO0A7QDtAO0A8wDzAPMA8wDzAPkA+QD5APkA+QD/AP8A/wD/AP8A + dtype: i2 legendgroup: Sensor(id=ID) name: Sensor (True) opacity: 1 @@ -1438,776 +391,14 @@ data: showlegend: true type: mesh3d x: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014992463600000002 - - -0.014392395300000003 - - -0.014392395300000003 - - -0.012869499600000002 - - -0.012355425950000002 - - -0.009822911000000002 - - -0.009822911000000002 - - -0.0066605612500000005 - - -0.005795627850000001 - - 0.0 - - -0.004997477680000001 - - 0.0 - - 0.0 - - -0.0046984631550000015 - - -0.0046984631550000015 - - 0.0 - - -0.003930366410000001 - - 0.0 - - -0.003726213425000001 - - 0.0 - - 0.0 - - -0.0025000000350000003 - - -0.0025000000350000003 - - -0.0021347226600000008 - - -0.0021347226600000008 - - 0.0 - - -0.0010241928500000002 - - 0.0 - - -0.0007114128200000001 - - -1.0408340850000002e-17 - - -9.553993650000002e-18 - - 0.0 - - 0.0 - - 0.0008682409300000002 - - 0.0008682409300000002 - - 0.0016630589950000004 - - 0.0 - - 0.0023612117400000003 - - 0.0026042407400000004 - - 0.0 - - 0.0026362657550000005 - - 0.0 - - 0.0 - - 0.003830222040000001 - - 0.003830222040000001 - - 0.0 - - 0.004641779140000001 - - 0.0 - - 0.004750406370000001 - - 0.0 - - 0.0049999997000000004 - - 0.006231224900000001 - - 0.006231224900000001 - - 0.00945867 - - 0.010177281500000003 - - 0.012618804000000003 - - 0.012618804000000003 - - 0.014251218750000003 - - 0.014519108850000004 - - 0.014999999100000003 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.10000000000000002 - - -0.9628772522231052 - - -1.0757465324544286 - - -1.1893106634692079 - - -1.146627876107864 - - -1.00668433176919 - - -0.9237506687952409 - - -1.1505898676279929 - - -1.240606557141336 - - -1.2711111784654134 - - -1.199947381744295 - - -1.125461115278078 - - -0.8024567799485769 - - -1.25 - - -1.25 - - -1.25 - - -1.25 - - -1.25 - - -0.75 - - -1.1505898676279929 - - -1.1254611152780778 - - -1.199947381744295 - - -1.2711111784654134 - - -1.240606557141336 - - -0.8024567799485769 - - -0.9628772522231052 - - -1.00668433176919 - - -1.146627876107864 - - -1.1893106634692079 - - -1.0757465324544286 - - -0.9237506687952409 - - -0.29276393534561734 - - -0.3193589741406161 - - -0.45218127374517486 - - -0.5076749305697151 - - -0.40914959704274484 - - -0.6037742578312263 - - -0.625 - - -0.625 - - -0.375 - - -0.375 - - -0.625 - - -0.625 - - -0.375 - - -0.375 - - -0.75 - - -0.75 - - -0.75 - - -0.75 - - -0.75 - - -0.25 - - -0.625 - - -0.625 - - -0.375 - - -0.375 - - -0.625 - - -0.625 - - -0.375 - - -0.375 - - -0.29276393534561734 - - -0.40914959704274484 - - -0.5076749305697151 - - -0.4521812737451749 - - -0.31935897414061615 - - -0.6037742578312263 - - 0.25 - - 0.25 - - 0.24999999999999997 - - 0.24999999999999997 - - 0.25 - - -0.25 - - -0.24999999999999997 - - -0.25 - - -0.25 - - -0.25 - - -0.25 - - 0.25 - - -0.24999999999999997 - - -0.25 - - -0.25 - - -0.25 - - -0.25 - - 0.25 - - -0.24999999999999997 - - -0.25 - - -0.25 - - -0.25 - - -0.25 - - 0.25 - - 0.25 - - 0.25 - - 0.24999999999999997 - - 0.24999999999999997 - - 0.25 - - -0.25 - - 0.7072360646543827 - - 0.5908504029572552 - - 0.49232506943028487 - - 0.5478187262548251 - - 0.6806410258593838 - - 0.39622574216877365 - - 0.375 - - 0.375 - - 0.625 - - 0.625 - - 0.375 - - 0.375 - - 0.625 - - 0.625 - - 0.25 - - 0.25 - - 0.25 - - 0.25 - - 0.25 - - 0.75 - - 0.375 - - 0.375 - - 0.625 - - 0.625 - - 0.375 - - 0.375 - - 0.625 - - 0.625 - - 0.7072360646543827 - - 0.6806410258593839 - - 0.5478187262548251 - - 0.49232506943028487 - - 0.5908504029572551 - - 0.39622574216877365 - - 1.0371227477768947 - - 0.99331566823081 - - 0.8533721238921359 - - 0.8106893365307922 - - 0.9242534675455715 - - 1.0762493312047592 - - 0.849410132372007 - - 0.874538884721922 - - 0.8000526182557052 - - 0.7288888215345866 - - 0.7593934428586637 - - 1.197543220051423 - - 0.75 - - 0.75 - - 0.75 - - 0.75 - - 0.75 - - 1.25 - - 0.849410132372007 - - 0.7593934428586638 - - 0.7288888215345866 - - 0.8000526182557052 - - 0.874538884721922 - - 1.197543220051423 - - 1.0371227477768947 - - 0.9242534675455715 - - 0.8106893365307922 - - 0.8533721238921359 - - 0.99331566823081 - - 1.0762493312047592 + bdata: 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 + dtype: f8 y: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - -0.004225988315000001 - - 0.004225988315000001 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.011336243900000001 - - 0.011336243900000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0017101006600000004 - - 0.0017101006600000004 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.004330126940000001 - - 0.004330126940000001 - - -0.014847321800000002 - - 0.014847321800000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.10000000000000002 - - 0.0 - - 0.0 - - -0.0049240388000000015 - - 0.0049240388000000015 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0032139379550000006 - - 0.0032139379550000006 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.013644480700000003 - - 0.013644480700000003 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.008109612750000002 - - 0.008109612750000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.00028137136250000006 - - 0.0078714803 - - -0.008344890200000002 - - 0.013525193950000004 - - -0.013758964850000003 - - -0.0016490003100000004 - - 0.0017709132300000002 - - -0.0042973283700000016 - - 0.0043621968500000005 - - -0.004934888705000001 - - 0.004912360015000001 - - 0.014884752050000002 - - -0.014804665750000005 - - -0.0032633595150000005 - - 0.0031639754750000006 - - -6.486846850000001e-05 - - 0.011518507450000002 - - -0.011149990550000002 - - 0.004495218770000001 - - -0.0039552707250000005 - - 9.925023200000001e-18 - - -1.2743964494489675 - - -1.2382493264557708 - - -1.2018796729681822 - - -1.2155491139469934 - - -1.2603669465666976 - - -0.7619116981226777 - - -0.7137565456792196 - - -0.5977007427167186 - - -0.5583720544371074 - - -0.6501213913098591 - - -0.7461542882220948 - - -0.3467789955270001 - - 0.0 - - 0.11888206453689419 - - 0.07347315653655916 - - -0.07347315653655913 - - -0.1188820645368942 - - 0.0 - - 0.7137565456792196 - - 0.7461542882220948 - - 0.6501213913098591 - - 0.5583720544371074 - - 0.5977007427167185 - - 0.3467789955270001 - - 1.2743964494489675 - - 1.2603669465666976 - - 1.2155491139469934 - - 1.2018796729681822 - - 1.2382493264557706 - - 0.7619116981226777 - - -1.1802385623540619 - - -1.1923728764612453 - - -1.2529746870569571 - - -1.2782943516777072 - - -1.2333409544013672 - - -0.7725557136097322 - - -0.625 - - -0.375 - - -0.375 - - -0.625 - - -0.625 - - -0.375 - - -0.375 - - -0.625 - - 0.0 - - 0.11888206453689419 - - 0.07347315653655916 - - -0.07347315653655913 - - -0.1188820645368942 - - 0.0 - - 0.375 - - 0.625 - - 0.625 - - 0.375 - - 0.375 - - 0.625 - - 0.625 - - 0.375 - - 1.1802385623540619 - - 1.2333409544013672 - - 1.2782943516777072 - - 1.2529746870569571 - - 1.1923728764612453 - - 0.7725557136097322 - - -1.0 - - -0.8811179354631058 - - -0.9265268434634408 - - -1.0734731565365592 - - -1.1188820645368942 - - -1.0 - - -0.5 - - -0.3811179354631058 - - -0.42652684346344083 - - -0.5734731565365592 - - -0.6188820645368942 - - -0.5 - - 0.0 - - 0.11888206453689419 - - 0.07347315653655916 - - -0.07347315653655913 - - -0.1188820645368942 - - 0.0 - - 0.5 - - 0.6188820645368942 - - 0.5734731565365592 - - 0.4265268434634409 - - 0.3811179354631058 - - 0.5 - - 1.0 - - 1.1188820645368942 - - 1.0734731565365592 - - 0.9265268434634408 - - 0.8811179354631058 - - 1.0 - - -0.8197614376459381 - - -0.7666590455986328 - - -0.7217056483222927 - - -0.7470253129430429 - - -0.8076271235387548 - - -1.2274442863902677 - - -0.625 - - -0.375 - - -0.375 - - -0.625 - - -0.625 - - -0.375 - - -0.375 - - -0.625 - - 0.0 - - 0.11888206453689419 - - 0.07347315653655916 - - -0.07347315653655913 - - -0.1188820645368942 - - 0.0 - - 0.375 - - 0.625 - - 0.625 - - 0.375 - - 0.375 - - 0.625 - - 0.625 - - 0.375 - - 0.8197614376459381 - - 0.8076271235387548 - - 0.7470253129430429 - - 0.7217056483222927 - - 0.7666590455986327 - - 1.2274442863902677 - - -0.7256035505510325 - - -0.7396330534333024 - - -0.7844508860530066 - - -0.7981203270318177 - - -0.7617506735442293 - - -1.2380883018773223 - - -0.2862434543207803 - - -0.25384571177790516 - - -0.349878608690141 - - -0.4416279455628927 - - -0.4022992572832815 - - -0.6532210044729999 - - 0.0 - - 0.11888206453689419 - - 0.07347315653655916 - - -0.07347315653655913 - - -0.1188820645368942 - - 0.0 - - 0.2862434543207803 - - 0.4022992572832814 - - 0.44162794556289275 - - 0.349878608690141 - - 0.25384571177790516 - - 0.6532210044729999 - - 0.7256035505510325 - - 0.7617506735442293 - - 0.7981203270318177 - - 0.7844508860530066 - - 0.7396330534333024 - - 1.2380883018773223 + bdata: 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 + dtype: f8 z: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.0004754300695000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.007705580450000002 - - -0.008505494900000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.013440123200000004 - - -0.013835124650000002 - - 0.0 - - 0.00015880254800000005 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.003090666795000001 - - 0.0 - - 0.0033339664350000007 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0048939786850000005 - - 0.0 - - 0.004949130490000001 - - 0.10000000000000002 - - -3.1374891150000003e-18 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.014907522500000003 - - 0.0 - - -0.004407344015000001 - - -0.014772200600000002 - - 0.0 - - 0.0042485412200000015 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0018584636950000003 - - 0.0 - - 0.0015600122500000005 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.011641889050000001 - - -0.011019207550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.004680036755000001 - - -0.003767693415000001 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014997360100000004 - - -0.012768703700000003 - - -0.012464462200000002 - - -0.006486073150000001 - - -0.005974184350000002 - - -0.004720254240000001 - - -0.004675881190000001 - - -0.0025559673100000006 - - -0.0024436118100000007 - - 0.0008042847750000002 - - 0.0009320507750000002 - - 0.0018558396050000002 - - 0.0024128545100000004 - - 0.003788203375000001 - - 0.0038715966050000008 - - 0.004999579490000001 - - 0.009608536200000002 - - 0.0100338295 - - 0.014310590900000003 - - 0.014469133300000003 - - -1.6175736900000002e-18 - - -0.0381246656023796 - - -0.12499888505303482 - - -0.0391288939162372 - - 0.10081589867061119 - - 0.1014365459010402 - - 4.163336342344337e-17 - - -0.09877161002571161 - - -0.10338302342838761 - - 0.03487738768724126 - - 0.12493843445790968 - - 0.04233881130894786 - - 8.326672684688674e-17 - - -0.12500000000000006 - - -0.03862712429686849 - - 0.10112712429686836 - - 0.10112712429686838 - - -0.03862712429686846 - - 5.551115123125783e-17 - - -0.09877161002571161 - - 0.04233881130894783 - - 0.12493843445790968 - - 0.03487738768724129 - - -0.1033830234283876 - - 8.326672684688674e-17 - - -0.0381246656023796 - - 0.10143654590104019 - - 0.10081589867061122 - - -0.039128893916237174 - - -0.12499888505303483 - - 4.163336342344337e-17 - - 0.051887128915613194 - - -0.09212218070853441 - - -0.1088217677112473 - - 0.024866629547137756 - - 0.12419018995703088 - - -2.7755575615628914e-17 - - -0.125 - - -0.125 - - -0.125 - - -0.125 - - 0.125 - - 0.125 - - 0.125 - - 0.125 - - -0.12500000000000006 - - -0.03862712429686849 - - 0.10112712429686836 - - 0.10112712429686838 - - -0.03862712429686846 - - 5.551115123125783e-17 - - -0.125 - - -0.125 - - -0.125 - - -0.125 - - 0.125 - - 0.125 - - 0.125 - - 0.125 - - 0.051887128915613194 - - 0.12419018995703088 - - 0.024866629547137788 - - -0.10882176771124728 - - -0.09212218070853442 - - -2.7755575615628914e-17 - - 0.12499999999999994 - - 0.038627124296868376 - - -0.10112712429686847 - - -0.10112712429686849 - - 0.03862712429686835 - - 5.551115123125783e-17 - - -0.12500000000000006 - - -0.03862712429686849 - - 0.10112712429686836 - - 0.10112712429686838 - - -0.03862712429686846 - - 5.551115123125783e-17 - - -0.12500000000000006 - - -0.03862712429686849 - - 0.10112712429686836 - - 0.10112712429686838 - - -0.03862712429686846 - - 5.551115123125783e-17 - - -0.12500000000000006 - - -0.03862712429686849 - - 0.10112712429686836 - - 0.10112712429686838 - - -0.03862712429686846 - - 5.551115123125783e-17 - - 0.12499999999999994 - - 0.038627124296868376 - - -0.10112712429686847 - - -0.10112712429686849 - - 0.03862712429686835 - - 5.551115123125783e-17 - - 0.051887128915613194 - - 0.12419018995703088 - - 0.024866629547137788 - - -0.10882176771124728 - - -0.09212218070853442 - - -2.7755575615628914e-17 - - -0.125 - - -0.125 - - -0.125 - - -0.125 - - 0.125 - - 0.125 - - 0.125 - - 0.125 - - -0.12500000000000006 - - -0.03862712429686849 - - 0.10112712429686836 - - 0.10112712429686838 - - -0.03862712429686846 - - 5.551115123125783e-17 - - -0.125 - - -0.125 - - -0.125 - - -0.125 - - 0.125 - - 0.125 - - 0.125 - - 0.125 - - 0.051887128915613194 - - -0.09212218070853441 - - -0.1088217677112473 - - 0.024866629547137756 - - 0.12419018995703088 - - -2.7755575615628914e-17 - - -0.0381246656023796 - - 0.10143654590104019 - - 0.10081589867061122 - - -0.039128893916237174 - - -0.12499888505303483 - - 4.163336342344337e-17 - - -0.09877161002571146 - - 0.04233881130894798 - - 0.12493843445790985 - - 0.03487738768724148 - - -0.10338302342838741 - - -8.326672684688674e-17 - - -0.12500000000000006 - - -0.03862712429686849 - - 0.10112712429686836 - - 0.10112712429686838 - - -0.03862712429686846 - - 5.551115123125783e-17 - - -0.09877161002571146 - - -0.10338302342838743 - - 0.03487738768724145 - - 0.12493843445790985 - - 0.04233881130894801 - - -8.326672684688674e-17 - - -0.0381246656023796 - - -0.12499888505303482 - - -0.0391288939162372 - - 0.10081589867061119 - - 0.1014365459010402 - - 4.163336342344337e-17 + bdata: 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 + dtype: f8 - color: '#2e91e5' colorscale: - - 0.0 @@ -2223,53 +414,17 @@ data: - - 1.0 - '#e71111' i: - - 7 - - 0 - - 0 - - 0 - - 4 - - 4 - - 2 - - 6 - - 4 - - 0 - - 3 - - 7 + bdata: BwAAAAQEAgYEAAMH + dtype: i1 intensity: - - 0.0 - - 0.0 - - 1.0 - - 1.0 - - 0.0 - - 0.0 - - 1.0 - - 1.0 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 j: - - 0 - - 7 - - 1 - - 2 - - 6 - - 7 - - 1 - - 2 - - 5 - - 5 - - 2 - - 2 + bdata: AAcBAgYHAQIFBQIC + dtype: i1 k: - - 3 - - 4 - - 2 - - 3 - - 5 - - 6 - - 5 - - 5 - - 0 - - 1 - - 7 - - 6 + bdata: AwQCAwUGBQUAAQcG + dtype: i1 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -2278,32 +433,14 @@ data: showscale: false type: mesh3d x: - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 y: - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 z: - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 - facecolor: - '#1ca71c' - '#1ca71c' @@ -2591,863 +728,14 @@ data: - '#461567' - '#461567' i: - - 75 - - 64 - - 2 - - 75 - - 76 - - 65 - - 65 - - 64 - - 2 - - 0 - - 1 - - 0 - - 84 - - 86 - - 86 - - 90 - - 90 - - 92 - - 92 - - 91 - - 91 - - 87 - - 87 - - 85 - - 85 - - 83 - - 83 - - 82 - - 82 - - 84 - - 94 - - 86 - - 86 - - 84 - - 84 - - 82 - - 82 - - 83 - - 83 - - 85 - - 85 - - 87 - - 87 - - 87 - - 91 - - 91 - - 92 - - 92 - - 90 - - 90 - - 94 - - 95 - - 88 - - 78 - - 79 - - 81 - - 80 - - 93 - - 96 - - 89 - - 77 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 50 - - 52 - - 52 - - 44 - - 44 - - 32 - - 32 - - 22 - - 22 - - 14 - - 14 - - 20 - - 20 - - 30 - - 30 - - 41 - - 41 - - 50 - - 57 - - 52 - - 52 - - 50 - - 50 - - 41 - - 41 - - 30 - - 30 - - 20 - - 20 - - 14 - - 14 - - 14 - - 22 - - 22 - - 32 - - 32 - - 44 - - 44 - - 57 - - 11 - - 4 - - 12 - - 58 - - 62 - - 8 - - 7 - - 39 - - 61 - - 42 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 48 - - 54 - - 54 - - 47 - - 47 - - 37 - - 37 - - 25 - - 25 - - 17 - - 17 - - 18 - - 18 - - 26 - - 26 - - 38 - - 38 - - 48 - - 59 - - 54 - - 54 - - 48 - - 48 - - 38 - - 38 - - 26 - - 26 - - 18 - - 18 - - 17 - - 17 - - 17 - - 25 - - 25 - - 37 - - 37 - - 47 - - 47 - - 59 - - 27 - - 5 - - 10 - - 56 - - 60 - - 6 - - 9 - - 55 - - 63 - - 28 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 98 - - 99 - - 100 - - 101 - - 102 - - 104 - - 105 - - 106 - - 107 - - 108 - - 110 - - 111 - - 112 - - 113 - - 114 - - 116 - - 117 - - 118 - - 119 - - 120 - - 122 - - 123 - - 124 - - 125 - - 126 - - 128 - - 129 - - 130 - - 131 - - 132 - - 134 - - 135 - - 136 - - 137 - - 138 - - 140 - - 141 - - 142 - - 143 - - 144 - - 146 - - 147 - - 148 - - 149 - - 150 - - 152 - - 153 - - 154 - - 155 - - 156 - - 158 - - 159 - - 160 - - 161 - - 162 - - 164 - - 165 - - 166 - - 167 - - 168 - - 170 - - 171 - - 172 - - 173 - - 174 - - 176 - - 177 - - 178 - - 179 - - 180 - - 182 - - 183 - - 184 - - 185 - - 186 - - 188 - - 189 - - 190 - - 191 - - 192 - - 194 - - 195 - - 196 - - 197 - - 198 - - 200 - - 201 - - 202 - - 203 - - 204 - - 206 - - 207 - - 208 - - 209 - - 210 - - 212 - - 213 - - 214 - - 215 - - 216 - - 218 - - 219 - - 220 - - 221 - - 222 + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYAmACZAJoAmwCcAJ4AnwCgAKEAogCkAKUApgCnAKgAqgCrAKwArQCuALAAsQCyALMAtAC2ALcAuAC5ALoAvAC9AL4AvwDAAMIAwwDEAMUAxgDIAMkAygDLAMwAzgDPANAA0QDSANQA1QDWANcA2ADaANsA3ADdAN4A + dtype: i2 j: - - 76 - - 76 - - 3 - - 3 - - 3 - - 3 - - 1 - - 1 - - 75 - - 75 - - 3 - - 3 - - 70 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 71 - - 71 - - 69 - - 69 - - 67 - - 67 - - 66 - - 66 - - 68 - - 68 - - 89 - - 89 - - 81 - - 81 - - 79 - - 79 - - 77 - - 77 - - 78 - - 78 - - 80 - - 80 - - 88 - - 93 - - 93 - - 95 - - 95 - - 96 - - 96 - - 94 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 68 - - 68 - - 66 - - 66 - - 67 - - 67 - - 69 - - 51 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 13 - - 13 - - 19 - - 19 - - 29 - - 29 - - 40 - - 40 - - 49 - - 49 - - 61 - - 61 - - 62 - - 62 - - 58 - - 58 - - 42 - - 42 - - 12 - - 12 - - 8 - - 8 - - 4 - - 7 - - 7 - - 11 - - 11 - - 39 - - 39 - - 57 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 49 - - 49 - - 40 - - 40 - - 29 - - 29 - - 19 - - 53 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 15 - - 15 - - 16 - - 16 - - 24 - - 24 - - 36 - - 36 - - 46 - - 46 - - 63 - - 63 - - 60 - - 60 - - 56 - - 56 - - 28 - - 28 - - 10 - - 10 - - 6 - - 6 - - 5 - - 9 - - 9 - - 27 - - 27 - - 55 - - 55 - - 59 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 46 - - 46 - - 36 - - 36 - - 24 - - 24 - - 16 - - 99 - - 100 - - 101 - - 102 - - 98 - - 105 - - 106 - - 107 - - 108 - - 104 - - 111 - - 112 - - 113 - - 114 - - 110 - - 117 - - 118 - - 119 - - 120 - - 116 - - 123 - - 124 - - 125 - - 126 - - 122 - - 129 - - 130 - - 131 - - 132 - - 128 - - 135 - - 136 - - 137 - - 138 - - 134 - - 141 - - 142 - - 143 - - 144 - - 140 - - 147 - - 148 - - 149 - - 150 - - 146 - - 153 - - 154 - - 155 - - 156 - - 152 - - 159 - - 160 - - 161 - - 162 - - 158 - - 165 - - 166 - - 167 - - 168 - - 164 - - 171 - - 172 - - 173 - - 174 - - 170 - - 177 - - 178 - - 179 - - 180 - - 176 - - 183 - - 184 - - 185 - - 186 - - 182 - - 189 - - 190 - - 191 - - 192 - - 188 - - 195 - - 196 - - 197 - - 198 - - 194 - - 201 - - 202 - - 203 - - 204 - - 200 - - 207 - - 208 - - 209 - - 210 - - 206 - - 213 - - 214 - - 215 - - 216 - - 212 - - 219 - - 220 - - 221 - - 222 - - 218 + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIAmQCaAJsAnACYAJ8AoAChAKIAngClAKYApwCoAKQAqwCsAK0ArgCqALEAsgCzALQAsAC3ALgAuQC6ALYAvQC+AL8AwAC8AMMAxADFAMYAwgDJAMoAywDMAMgAzwDQANEA0gDOANUA1gDXANgA1ADbANwA3QDeANoA + dtype: i2 k: - - 64 - - 65 - - 75 - - 76 - - 65 - - 1 - - 64 - - 0 - - 0 - - 64 - - 0 - - 2 - - 86 - - 72 - - 90 - - 74 - - 92 - - 73 - - 91 - - 71 - - 87 - - 69 - - 85 - - 67 - - 83 - - 66 - - 82 - - 68 - - 84 - - 70 - - 86 - - 81 - - 84 - - 79 - - 82 - - 77 - - 83 - - 78 - - 85 - - 80 - - 87 - - 88 - - 93 - - 91 - - 95 - - 92 - - 96 - - 90 - - 94 - - 86 - - 89 - - 96 - - 93 - - 80 - - 77 - - 79 - - 88 - - 95 - - 94 - - 81 - - 78 - - 72 - - 66 - - 74 - - 67 - - 73 - - 69 - - 71 - - 52 - - 43 - - 44 - - 31 - - 32 - - 21 - - 22 - - 13 - - 14 - - 19 - - 20 - - 29 - - 30 - - 40 - - 41 - - 49 - - 50 - - 51 - - 52 - - 62 - - 50 - - 58 - - 41 - - 42 - - 30 - - 12 - - 20 - - 8 - - 14 - - 4 - - 7 - - 22 - - 11 - - 32 - - 39 - - 44 - - 57 - - 52 - - 61 - - 39 - - 7 - - 8 - - 42 - - 58 - - 4 - - 11 - - 57 - - 62 - - 12 - - 43 - - 40 - - 31 - - 29 - - 21 - - 19 - - 13 - - 54 - - 45 - - 47 - - 35 - - 37 - - 23 - - 25 - - 15 - - 17 - - 16 - - 18 - - 24 - - 26 - - 36 - - 38 - - 46 - - 48 - - 53 - - 54 - - 60 - - 48 - - 56 - - 38 - - 28 - - 26 - - 10 - - 18 - - 6 - - 17 - - 5 - - 9 - - 25 - - 27 - - 37 - - 55 - - 47 - - 59 - - 54 - - 63 - - 55 - - 9 - - 6 - - 28 - - 56 - - 5 - - 27 - - 59 - - 60 - - 10 - - 45 - - 36 - - 35 - - 24 - - 23 - - 16 - - 15 - - 103 - - 103 - - 103 - - 103 - - 103 - - 109 - - 109 - - 109 - - 109 - - 109 - - 115 - - 115 - - 115 - - 115 - - 115 - - 121 - - 121 - - 121 - - 121 - - 121 - - 127 - - 127 - - 127 - - 127 - - 127 - - 133 - - 133 - - 133 - - 133 - - 133 - - 139 - - 139 - - 139 - - 139 - - 139 - - 145 - - 145 - - 145 - - 145 - - 145 - - 151 - - 151 - - 151 - - 151 - - 151 - - 157 - - 157 - - 157 - - 157 - - 157 - - 163 - - 163 - - 163 - - 163 - - 163 - - 169 - - 169 - - 169 - - 169 - - 169 - - 175 - - 175 - - 175 - - 175 - - 175 - - 181 - - 181 - - 181 - - 181 - - 181 - - 187 - - 187 - - 187 - - 187 - - 187 - - 193 - - 193 - - 193 - - 193 - - 193 - - 199 - - 199 - - 199 - - 199 - - 199 - - 205 - - 205 - - 205 - - 205 - - 205 - - 211 - - 211 - - 211 - - 211 - - 211 - - 217 - - 217 - - 217 - - 217 - - 217 - - 223 - - 223 - - 223 - - 223 - - 223 + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcAnQCdAJ0AnQCdAKMAowCjAKMAowCpAKkAqQCpAKkArwCvAK8ArwCvALUAtQC1ALUAtQC7ALsAuwC7ALsAwQDBAMEAwQDBAMcAxwDHAMcAxwDNAM0AzQDNAM0A0wDTANMA0wDTANkA2QDZANkA2QDfAN8A3wDfAN8A + dtype: i2 legendgroup: Sensor(id=ID) name: Sensor (False) opacity: 1 @@ -3455,680 +743,14 @@ data: showlegend: true type: mesh3d x: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014992463600000002 - - -0.014392395300000003 - - -0.014392395300000003 - - -0.012869499600000002 - - -0.012355425950000002 - - -0.009822911000000002 - - -0.009822911000000002 - - -0.0066605612500000005 - - -0.005795627850000001 - - 0.0 - - -0.004997477680000001 - - 0.0 - - 0.0 - - -0.0046984631550000015 - - -0.0046984631550000015 - - 0.0 - - -0.003930366410000001 - - 0.0 - - -0.003726213425000001 - - 0.0 - - 0.0 - - -0.0025000000350000003 - - -0.0025000000350000003 - - -0.0021347226600000008 - - -0.0021347226600000008 - - 0.0 - - -0.0010241928500000002 - - 0.0 - - -0.0007114128200000001 - - -1.0408340850000002e-17 - - -9.553993650000002e-18 - - 0.0 - - 0.0 - - 0.0008682409300000002 - - 0.0008682409300000002 - - 0.0016630589950000004 - - 0.0 - - 0.0023612117400000003 - - 0.0026042407400000004 - - 0.0 - - 0.0026362657550000005 - - 0.0 - - 0.0 - - 0.003830222040000001 - - 0.003830222040000001 - - 0.0 - - 0.004641779140000001 - - 0.0 - - 0.004750406370000001 - - 0.0 - - 0.0049999997000000004 - - 0.006231224900000001 - - 0.006231224900000001 - - 0.00945867 - - 0.010177281500000003 - - 0.012618804000000003 - - 0.012618804000000003 - - 0.014251218750000003 - - 0.014519108850000004 - - 0.014999999100000003 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.10000000000000002 - - -0.9628772522231052 - - -1.0757465324544286 - - -1.1893106634692079 - - -1.146627876107864 - - -1.00668433176919 - - -0.9237506687952409 - - -1.1505898676279929 - - -1.240606557141336 - - -1.2711111784654134 - - -1.199947381744295 - - -1.125461115278078 - - -0.8024567799485769 - - -1.25 - - -1.25 - - -1.25 - - -1.25 - - -1.25 - - -0.75 - - -1.1505898676279929 - - -1.1254611152780778 - - -1.199947381744295 - - -1.2711111784654134 - - -1.240606557141336 - - -0.8024567799485769 - - -0.9628772522231052 - - -1.00668433176919 - - -1.146627876107864 - - -1.1893106634692079 - - -1.0757465324544286 - - -0.9237506687952409 - - -0.29276393534561734 - - -0.3193589741406161 - - -0.45218127374517486 - - -0.5076749305697151 - - -0.40914959704274484 - - -0.6037742578312263 - - -0.75 - - -0.75 - - -0.75 - - -0.75 - - -0.75 - - -0.25 - - -0.29276393534561734 - - -0.40914959704274484 - - -0.5076749305697151 - - -0.4521812737451749 - - -0.31935897414061615 - - -0.6037742578312263 - - 0.25 - - 0.25 - - 0.24999999999999997 - - 0.24999999999999997 - - 0.25 - - -0.25 - - -0.24999999999999997 - - -0.25 - - -0.25 - - -0.25 - - -0.25 - - 0.25 - - -0.24999999999999997 - - -0.25 - - -0.25 - - -0.25 - - -0.25 - - 0.25 - - -0.24999999999999997 - - -0.25 - - -0.25 - - -0.25 - - -0.25 - - 0.25 - - 0.25 - - 0.25 - - 0.24999999999999997 - - 0.24999999999999997 - - 0.25 - - -0.25 - - 0.7072360646543827 - - 0.5908504029572552 - - 0.49232506943028487 - - 0.5478187262548251 - - 0.6806410258593838 - - 0.39622574216877365 - - 0.25 - - 0.25 - - 0.25 - - 0.25 - - 0.25 - - 0.75 - - 0.7072360646543827 - - 0.6806410258593839 - - 0.5478187262548251 - - 0.49232506943028487 - - 0.5908504029572551 - - 0.39622574216877365 - - 1.0371227477768947 - - 0.99331566823081 - - 0.8533721238921359 - - 0.8106893365307922 - - 0.9242534675455715 - - 1.0762493312047592 - - 0.849410132372007 - - 0.874538884721922 - - 0.8000526182557052 - - 0.7288888215345866 - - 0.7593934428586637 - - 1.197543220051423 - - 0.75 - - 0.75 - - 0.75 - - 0.75 - - 0.75 - - 1.25 - - 0.849410132372007 - - 0.7593934428586638 - - 0.7288888215345866 - - 0.8000526182557052 - - 0.874538884721922 - - 1.197543220051423 - - 1.0371227477768947 - - 0.9242534675455715 - - 0.8106893365307922 - - 0.8533721238921359 - - 0.99331566823081 - - 1.0762493312047592 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P9+Ji/Tjz+6/tNX6/kE28b8iJkaeagfzvyALyXiWWPK/MYKlB2Eb8L8rRwSQXY/tv6EjyevQaPK/ywDiQobZ879sbNGseFb0v4EzmAb8MvO/35+wg+MB8r+2pErXua3pvwAAAAAAAPS/AAAAAAAA9L8AAAAAAAD0vwAAAAAAAPS/AAAAAAAA9L8AAAAAAADov6EjyevQaPK/3p+wg+MB8r+BM5gG/DLzv2xs0ax4VvS/ywDiQobZ87+2pErXua3pv9+Ji/Tjz+6/MYKlB2Eb8L8gC8l4lljyvyImRp5qB/O/tNX6/kE28b8rRwSQXY/tv+l98PGkvNK/Oo5nn2Bw1L93WKa5ifDcv894+X7fPuC/OReeyoEv2r9BqHFkHlLjvwAAAAAAAOi/AAAAAAAA6L8AAAAAAADovwAAAAAAAOi/AAAAAAAA6L8AAAAAAADQv+l98PGkvNK/OReeyoEv2r/PePl+3z7gv3hYprmJ8Ny/O45nn2Bw1L9BqHFkHlLjvwAAAAAAANA/AAAAAAAA0D/////////PP////////88/AAAAAAAA0D8AAAAAAADQv////////8+/AAAAAAAA0L8AAAAAAADQvwAAAAAAANC/AAAAAAAA0L8AAAAAAADQP////////8+/AAAAAAAA0L8AAAAAAADQvwAAAAAAANC/AAAAAAAA0L8AAAAAAADQP////////8+/AAAAAAAA0L8AAAAAAADQvwAAAAAAANC/AAAAAAAA0L8AAAAAAADQPwAAAAAAANA/AAAAAAAA0D/////////PP////////88/AAAAAAAA0D8AAAAAAADQvwzBB4etoeY/ZPSwGj/o4j9iDg0CQYLfP8TTLCO7h+E/4jhMsM/H5T99rxw3w1vZPwAAAAAAANA/AAAAAAAA0D8AAAAAAADQPwAAAAAAANA/AAAAAAAA0D8AAAAAAADoPwzBB4etoeY/4zhMsM/H5T/E0ywju4fhP2IODQJBgt8/Y/SwGj/o4j99rxw3w1vZPxA7ugUOmPA/nvu08D3J7z/A6W0O007rP72zc8Mq8ek/mVQKAnyT7T9r3P03UTjxP724bSheLus/QsCe+Dj86z//mM/yB5rpPygnXaYOU+c/aP47evNM6D+lrVoUIynzPwAAAAAAAOg/AAAAAAAA6D8AAAAAAADoPwAAAAAAAOg/AAAAAAAA6D8AAAAAAAD0P724bSheLus/af47evNM6D8oJ12mDlPnP/+Yz/IHmuk/QsCe+Dj86z+lrVoUIynzPxA7ugUOmPA/mVQKAnyT7T+9s3PDKvHpP8DpbQ7TTus/nvu08D3J7z9r3P03UTjxPw== + dtype: f8 y: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - -0.004225988315000001 - - 0.004225988315000001 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.011336243900000001 - - 0.011336243900000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0017101006600000004 - - 0.0017101006600000004 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.004330126940000001 - - 0.004330126940000001 - - -0.014847321800000002 - - 0.014847321800000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.10000000000000002 - - 0.0 - - 0.0 - - -0.0049240388000000015 - - 0.0049240388000000015 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0032139379550000006 - - 0.0032139379550000006 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.013644480700000003 - - 0.013644480700000003 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.008109612750000002 - - 0.008109612750000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.00028137136250000006 - - 0.0078714803 - - -0.008344890200000002 - - 0.013525193950000004 - - -0.013758964850000003 - - -0.0016490003100000004 - - 0.0017709132300000002 - - -0.0042973283700000016 - - 0.0043621968500000005 - - -0.004934888705000001 - - 0.004912360015000001 - - 0.014884752050000002 - - -0.014804665750000005 - - -0.0032633595150000005 - - 0.0031639754750000006 - - -6.486846850000001e-05 - - 0.011518507450000002 - - -0.011149990550000002 - - 0.004495218770000001 - - -0.0039552707250000005 - - 9.925023200000001e-18 - - -1.2743964494489675 - - -1.2382493264557708 - - -1.2018796729681822 - - -1.2155491139469934 - - -1.2603669465666976 - - -0.7619116981226777 - - -0.7137565456792196 - - -0.5977007427167186 - - -0.5583720544371074 - - -0.6501213913098591 - - -0.7461542882220948 - - -0.3467789955270001 - - 0.0 - - 0.11888206453689419 - - 0.07347315653655916 - - -0.07347315653655913 - - -0.1188820645368942 - - 0.0 - - 0.7137565456792196 - - 0.7461542882220948 - - 0.6501213913098591 - - 0.5583720544371074 - - 0.5977007427167185 - - 0.3467789955270001 - - 1.2743964494489675 - - 1.2603669465666976 - - 1.2155491139469934 - - 1.2018796729681822 - - 1.2382493264557706 - - 0.7619116981226777 - - -1.1802385623540619 - - -1.1923728764612453 - - -1.2529746870569571 - - -1.2782943516777072 - - -1.2333409544013672 - - -0.7725557136097322 - - 0.0 - - 0.11888206453689419 - - 0.07347315653655916 - - -0.07347315653655913 - - -0.1188820645368942 - - 0.0 - - 1.1802385623540619 - - 1.2333409544013672 - - 1.2782943516777072 - - 1.2529746870569571 - - 1.1923728764612453 - - 0.7725557136097322 - - -1.0 - - -0.8811179354631058 - - -0.9265268434634408 - - -1.0734731565365592 - - -1.1188820645368942 - - -1.0 - - -0.5 - - -0.3811179354631058 - - -0.42652684346344083 - - -0.5734731565365592 - - -0.6188820645368942 - - -0.5 - - 0.0 - - 0.11888206453689419 - - 0.07347315653655916 - - -0.07347315653655913 - - -0.1188820645368942 - - 0.0 - - 0.5 - - 0.6188820645368942 - - 0.5734731565365592 - - 0.4265268434634409 - - 0.3811179354631058 - - 0.5 - - 1.0 - - 1.1188820645368942 - - 1.0734731565365592 - - 0.9265268434634408 - - 0.8811179354631058 - - 1.0 - - -0.8197614376459381 - - -0.7666590455986328 - - -0.7217056483222927 - - -0.7470253129430429 - - -0.8076271235387548 - - -1.2274442863902677 - - 0.0 - - 0.11888206453689419 - - 0.07347315653655916 - - -0.07347315653655913 - - -0.1188820645368942 - - 0.0 - - 0.8197614376459381 - - 0.8076271235387548 - - 0.7470253129430429 - - 0.7217056483222927 - - 0.7666590455986327 - - 1.2274442863902677 - - -0.7256035505510325 - - -0.7396330534333024 - - -0.7844508860530066 - - -0.7981203270318177 - - -0.7617506735442293 - - -1.2380883018773223 - - -0.2862434543207803 - - -0.25384571177790516 - - -0.349878608690141 - - -0.4416279455628927 - - -0.4022992572832815 - - -0.6532210044729999 - - 0.0 - - 0.11888206453689419 - - 0.07347315653655916 - - -0.07347315653655913 - - -0.1188820645368942 - - 0.0 - - 0.2862434543207803 - - 0.4022992572832814 - - 0.44162794556289275 - - 0.349878608690141 - - 0.25384571177790516 - - 0.6532210044729999 - - 0.7256035505510325 - - 0.7617506735442293 - - 0.7981203270318177 - - 0.7844508860530066 - - 0.7396330534333024 - - 1.2380883018773223 + bdata: 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 + dtype: f8 z: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.0004754300695000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.007705580450000002 - - -0.008505494900000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.013440123200000004 - - -0.013835124650000002 - - 0.0 - - 0.00015880254800000005 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.003090666795000001 - - 0.0 - - 0.0033339664350000007 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0048939786850000005 - - 0.0 - - 0.004949130490000001 - - 0.10000000000000002 - - -3.1374891150000003e-18 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.014907522500000003 - - 0.0 - - -0.004407344015000001 - - -0.014772200600000002 - - 0.0 - - 0.0042485412200000015 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0018584636950000003 - - 0.0 - - 0.0015600122500000005 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.011641889050000001 - - -0.011019207550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.004680036755000001 - - -0.003767693415000001 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014997360100000004 - - -0.012768703700000003 - - -0.012464462200000002 - - -0.006486073150000001 - - -0.005974184350000002 - - -0.004720254240000001 - - -0.004675881190000001 - - -0.0025559673100000006 - - -0.0024436118100000007 - - 0.0008042847750000002 - - 0.0009320507750000002 - - 0.0018558396050000002 - - 0.0024128545100000004 - - 0.003788203375000001 - - 0.0038715966050000008 - - 0.004999579490000001 - - 0.009608536200000002 - - 0.0100338295 - - 0.014310590900000003 - - 0.014469133300000003 - - -1.6175736900000002e-18 - - -0.0381246656023796 - - -0.12499888505303482 - - -0.0391288939162372 - - 0.10081589867061119 - - 0.1014365459010402 - - 4.163336342344337e-17 - - -0.09877161002571161 - - -0.10338302342838761 - - 0.03487738768724126 - - 0.12493843445790968 - - 0.04233881130894786 - - 8.326672684688674e-17 - - -0.12500000000000006 - - -0.03862712429686849 - - 0.10112712429686836 - - 0.10112712429686838 - - -0.03862712429686846 - - 5.551115123125783e-17 - - -0.09877161002571161 - - 0.04233881130894783 - - 0.12493843445790968 - - 0.03487738768724129 - - -0.1033830234283876 - - 8.326672684688674e-17 - - -0.0381246656023796 - - 0.10143654590104019 - - 0.10081589867061122 - - -0.039128893916237174 - - -0.12499888505303483 - - 4.163336342344337e-17 - - 0.051887128915613194 - - -0.09212218070853441 - - -0.1088217677112473 - - 0.024866629547137756 - - 0.12419018995703088 - - -2.7755575615628914e-17 - - -0.12500000000000006 - - -0.03862712429686849 - - 0.10112712429686836 - - 0.10112712429686838 - - -0.03862712429686846 - - 5.551115123125783e-17 - - 0.051887128915613194 - - 0.12419018995703088 - - 0.024866629547137788 - - -0.10882176771124728 - - -0.09212218070853442 - - -2.7755575615628914e-17 - - 0.12499999999999994 - - 0.038627124296868376 - - -0.10112712429686847 - - -0.10112712429686849 - - 0.03862712429686835 - - 5.551115123125783e-17 - - -0.12500000000000006 - - -0.03862712429686849 - - 0.10112712429686836 - - 0.10112712429686838 - - -0.03862712429686846 - - 5.551115123125783e-17 - - -0.12500000000000006 - - -0.03862712429686849 - - 0.10112712429686836 - - 0.10112712429686838 - - -0.03862712429686846 - - 5.551115123125783e-17 - - -0.12500000000000006 - - -0.03862712429686849 - - 0.10112712429686836 - - 0.10112712429686838 - - -0.03862712429686846 - - 5.551115123125783e-17 - - 0.12499999999999994 - - 0.038627124296868376 - - -0.10112712429686847 - - -0.10112712429686849 - - 0.03862712429686835 - - 5.551115123125783e-17 - - 0.051887128915613194 - - 0.12419018995703088 - - 0.024866629547137788 - - -0.10882176771124728 - - -0.09212218070853442 - - -2.7755575615628914e-17 - - -0.12500000000000006 - - -0.03862712429686849 - - 0.10112712429686836 - - 0.10112712429686838 - - -0.03862712429686846 - - 5.551115123125783e-17 - - 0.051887128915613194 - - -0.09212218070853441 - - -0.1088217677112473 - - 0.024866629547137756 - - 0.12419018995703088 - - -2.7755575615628914e-17 - - -0.0381246656023796 - - 0.10143654590104019 - - 0.10081589867061122 - - -0.039128893916237174 - - -0.12499888505303483 - - 4.163336342344337e-17 - - -0.09877161002571146 - - 0.04233881130894798 - - 0.12493843445790985 - - 0.03487738768724148 - - -0.10338302342838741 - - -8.326672684688674e-17 - - -0.12500000000000006 - - -0.03862712429686849 - - 0.10112712429686836 - - 0.10112712429686838 - - -0.03862712429686846 - - 5.551115123125783e-17 - - -0.09877161002571146 - - -0.10338302342838743 - - 0.03487738768724145 - - 0.12493843445790985 - - 0.04233881130894801 - - -8.326672684688674e-17 - - -0.0381246656023796 - - -0.12499888505303482 - - -0.0391288939162372 - - 0.10081589867061119 - - 0.1014365459010402 - - 4.163336342344337e-17 + bdata: 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 + dtype: f8 layout: legend: itemsizing: constant diff --git a/tests/test_display_plotly/test_pixel_field_sizing_modes.yml b/tests/test_display_plotly/test_pixel_field_sizing_modes.yml index 25205f2a5..adcd92af0 100644 --- a/tests/test_display_plotly/test_pixel_field_sizing_modes.yml +++ b/tests/test_display_plotly/test_pixel_field_sizing_modes.yml @@ -14,53 +14,17 @@ data: - - 1.0 - '#e71111' i: - - 7 - - 0 - - 0 - - 0 - - 4 - - 4 - - 2 - - 6 - - 4 - - 0 - - 3 - - 7 + bdata: BwAAAAQEAgYEAAMH + dtype: i1 intensity: - - 0.0 - - 0.0 - - 1.0 - - 1.0 - - 0.0 - - 0.0 - - 1.0 - - 1.0 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 j: - - 0 - - 7 - - 1 - - 2 - - 6 - - 7 - - 1 - - 2 - - 5 - - 5 - - 2 - - 2 + bdata: AAcBAgYHAQIFBQIC + dtype: i1 k: - - 3 - - 4 - - 2 - - 3 - - 5 - - 6 - - 5 - - 5 - - 0 - - 1 - - 7 - - 6 + bdata: AwQCAwUGBQUAAQcG + dtype: i1 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -69,32 +33,14 @@ data: showscale: false type: mesh3d x: - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 y: - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 z: - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 - facecolor: - '#e15f99' - '#e15f99' @@ -322,683 +268,14 @@ data: - '#440154' - '#440154' i: - - 75 - - 64 - - 2 - - 75 - - 76 - - 65 - - 65 - - 64 - - 2 - - 0 - - 1 - - 0 - - 84 - - 86 - - 86 - - 90 - - 90 - - 92 - - 92 - - 91 - - 91 - - 87 - - 87 - - 85 - - 85 - - 83 - - 83 - - 82 - - 82 - - 84 - - 94 - - 86 - - 86 - - 84 - - 84 - - 82 - - 82 - - 83 - - 83 - - 85 - - 85 - - 87 - - 87 - - 87 - - 91 - - 91 - - 92 - - 92 - - 90 - - 90 - - 94 - - 95 - - 88 - - 78 - - 79 - - 81 - - 80 - - 93 - - 96 - - 89 - - 77 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 50 - - 52 - - 52 - - 44 - - 44 - - 32 - - 32 - - 22 - - 22 - - 14 - - 14 - - 20 - - 20 - - 30 - - 30 - - 41 - - 41 - - 50 - - 57 - - 52 - - 52 - - 50 - - 50 - - 41 - - 41 - - 30 - - 30 - - 20 - - 20 - - 14 - - 14 - - 14 - - 22 - - 22 - - 32 - - 32 - - 44 - - 44 - - 57 - - 11 - - 4 - - 12 - - 58 - - 62 - - 8 - - 7 - - 39 - - 61 - - 42 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 48 - - 54 - - 54 - - 47 - - 47 - - 37 - - 37 - - 25 - - 25 - - 17 - - 17 - - 18 - - 18 - - 26 - - 26 - - 38 - - 38 - - 48 - - 59 - - 54 - - 54 - - 48 - - 48 - - 38 - - 38 - - 26 - - 26 - - 18 - - 18 - - 17 - - 17 - - 17 - - 25 - - 25 - - 37 - - 37 - - 47 - - 47 - - 59 - - 27 - - 5 - - 10 - - 56 - - 60 - - 6 - - 9 - - 55 - - 63 - - 28 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 98 - - 99 - - 100 - - 101 - - 102 - - 104 - - 105 - - 106 - - 107 - - 108 - - 110 - - 111 - - 112 - - 113 - - 114 - - 116 - - 117 - - 118 - - 119 - - 120 - - 122 - - 123 - - 124 - - 125 - - 126 - - 128 - - 129 - - 130 - - 131 - - 132 - - 134 - - 135 - - 136 - - 137 - - 138 - - 140 - - 141 - - 142 - - 143 - - 144 - - 146 - - 147 - - 148 - - 149 - - 150 + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 j: - - 76 - - 76 - - 3 - - 3 - - 3 - - 3 - - 1 - - 1 - - 75 - - 75 - - 3 - - 3 - - 70 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 71 - - 71 - - 69 - - 69 - - 67 - - 67 - - 66 - - 66 - - 68 - - 68 - - 89 - - 89 - - 81 - - 81 - - 79 - - 79 - - 77 - - 77 - - 78 - - 78 - - 80 - - 80 - - 88 - - 93 - - 93 - - 95 - - 95 - - 96 - - 96 - - 94 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 68 - - 68 - - 66 - - 66 - - 67 - - 67 - - 69 - - 51 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 13 - - 13 - - 19 - - 19 - - 29 - - 29 - - 40 - - 40 - - 49 - - 49 - - 61 - - 61 - - 62 - - 62 - - 58 - - 58 - - 42 - - 42 - - 12 - - 12 - - 8 - - 8 - - 4 - - 7 - - 7 - - 11 - - 11 - - 39 - - 39 - - 57 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 49 - - 49 - - 40 - - 40 - - 29 - - 29 - - 19 - - 53 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 15 - - 15 - - 16 - - 16 - - 24 - - 24 - - 36 - - 36 - - 46 - - 46 - - 63 - - 63 - - 60 - - 60 - - 56 - - 56 - - 28 - - 28 - - 10 - - 10 - - 6 - - 6 - - 5 - - 9 - - 9 - - 27 - - 27 - - 55 - - 55 - - 59 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 46 - - 46 - - 36 - - 36 - - 24 - - 24 - - 16 - - 99 - - 100 - - 101 - - 102 - - 98 - - 105 - - 106 - - 107 - - 108 - - 104 - - 111 - - 112 - - 113 - - 114 - - 110 - - 117 - - 118 - - 119 - - 120 - - 116 - - 123 - - 124 - - 125 - - 126 - - 122 - - 129 - - 130 - - 131 - - 132 - - 128 - - 135 - - 136 - - 137 - - 138 - - 134 - - 141 - - 142 - - 143 - - 144 - - 140 - - 147 - - 148 - - 149 - - 150 - - 146 + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 k: - - 64 - - 65 - - 75 - - 76 - - 65 - - 1 - - 64 - - 0 - - 0 - - 64 - - 0 - - 2 - - 86 - - 72 - - 90 - - 74 - - 92 - - 73 - - 91 - - 71 - - 87 - - 69 - - 85 - - 67 - - 83 - - 66 - - 82 - - 68 - - 84 - - 70 - - 86 - - 81 - - 84 - - 79 - - 82 - - 77 - - 83 - - 78 - - 85 - - 80 - - 87 - - 88 - - 93 - - 91 - - 95 - - 92 - - 96 - - 90 - - 94 - - 86 - - 89 - - 96 - - 93 - - 80 - - 77 - - 79 - - 88 - - 95 - - 94 - - 81 - - 78 - - 72 - - 66 - - 74 - - 67 - - 73 - - 69 - - 71 - - 52 - - 43 - - 44 - - 31 - - 32 - - 21 - - 22 - - 13 - - 14 - - 19 - - 20 - - 29 - - 30 - - 40 - - 41 - - 49 - - 50 - - 51 - - 52 - - 62 - - 50 - - 58 - - 41 - - 42 - - 30 - - 12 - - 20 - - 8 - - 14 - - 4 - - 7 - - 22 - - 11 - - 32 - - 39 - - 44 - - 57 - - 52 - - 61 - - 39 - - 7 - - 8 - - 42 - - 58 - - 4 - - 11 - - 57 - - 62 - - 12 - - 43 - - 40 - - 31 - - 29 - - 21 - - 19 - - 13 - - 54 - - 45 - - 47 - - 35 - - 37 - - 23 - - 25 - - 15 - - 17 - - 16 - - 18 - - 24 - - 26 - - 36 - - 38 - - 46 - - 48 - - 53 - - 54 - - 60 - - 48 - - 56 - - 38 - - 28 - - 26 - - 10 - - 18 - - 6 - - 17 - - 5 - - 9 - - 25 - - 27 - - 37 - - 55 - - 47 - - 59 - - 54 - - 63 - - 55 - - 9 - - 6 - - 28 - - 56 - - 5 - - 27 - - 59 - - 60 - - 10 - - 45 - - 36 - - 35 - - 24 - - 23 - - 16 - - 15 - - 103 - - 103 - - 103 - - 103 - - 103 - - 109 - - 109 - - 109 - - 109 - - 109 - - 115 - - 115 - - 115 - - 115 - - 115 - - 121 - - 121 - - 121 - - 121 - - 121 - - 127 - - 127 - - 127 - - 127 - - 127 - - 133 - - 133 - - 133 - - 133 - - 133 - - 139 - - 139 - - 139 - - 139 - - 139 - - 145 - - 145 - - 145 - - 145 - - 145 - - 151 - - 151 - - 151 - - 151 - - 151 + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 legendgroup: Sensor(id=ID) name: Sensor (constant) opacity: 1 @@ -1006,464 +283,14 @@ data: showlegend: true type: mesh3d x: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014992463600000002 - - -0.014392395300000003 - - -0.014392395300000003 - - -0.012869499600000002 - - -0.012355425950000002 - - -0.009822911000000002 - - -0.009822911000000002 - - -0.0066605612500000005 - - -0.005795627850000001 - - 0.0 - - -0.004997477680000001 - - 0.0 - - 0.0 - - -0.0046984631550000015 - - -0.0046984631550000015 - - 0.0 - - -0.003930366410000001 - - 0.0 - - -0.003726213425000001 - - 0.0 - - 0.0 - - -0.0025000000350000003 - - -0.0025000000350000003 - - -0.0021347226600000008 - - -0.0021347226600000008 - - 0.0 - - -0.0010241928500000002 - - 0.0 - - -0.0007114128200000001 - - -1.0408340850000002e-17 - - -9.553993650000002e-18 - - 0.0 - - 0.0 - - 0.0008682409300000002 - - 0.0008682409300000002 - - 0.0016630589950000004 - - 0.0 - - 0.0023612117400000003 - - 0.0026042407400000004 - - 0.0 - - 0.0026362657550000005 - - 0.0 - - 0.0 - - 0.003830222040000001 - - 0.003830222040000001 - - 0.0 - - 0.004641779140000001 - - 0.0 - - 0.004750406370000001 - - 0.0 - - 0.0049999997000000004 - - 0.006231224900000001 - - 0.006231224900000001 - - 0.00945867 - - 0.010177281500000003 - - 0.012618804000000003 - - 0.012618804000000003 - - 0.014251218750000003 - - 0.014519108850000004 - - 0.014999999100000003 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.10000000000000002 - - -0.9257545044462104 - - -1.151493064908857 - - -1.3786213269384155 - - -1.2932557522157282 - - -1.01336866353838 - - -0.8475013375904817 - - -1.5 - - -1.5 - - -1.5 - - -1.5 - - -1.5 - - -0.5 - - -0.9257545044462104 - - -1.01336866353838 - - -1.2932557522157282 - - -1.3786213269384155 - - -1.151493064908857 - - -0.8475013375904817 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - -0.49999999999999994 - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.49999999999999994 - - 0.49999999999999994 - - 0.5 - - -0.5 - - 1.0742454955537897 - - 0.9866313364616199 - - 0.7067442477842719 - - 0.6213786730615845 - - 0.8485069350911429 - - 1.1524986624095181 - - 0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 - - 1.5 - - 1.0742454955537897 - - 0.8485069350911429 - - 0.6213786730615845 - - 0.7067442477842718 - - 0.9866313364616199 - - 1.1524986624095181 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== + dtype: f8 y: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - -0.004225988315000001 - - 0.004225988315000001 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.011336243900000001 - - 0.011336243900000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0017101006600000004 - - 0.0017101006600000004 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.004330126940000001 - - 0.004330126940000001 - - -0.014847321800000002 - - 0.014847321800000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.10000000000000002 - - 0.0 - - 0.0 - - -0.0049240388000000015 - - 0.0049240388000000015 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0032139379550000006 - - 0.0032139379550000006 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.013644480700000003 - - 0.013644480700000003 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.008109612750000002 - - 0.008109612750000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.00028137136250000006 - - 0.0078714803 - - -0.008344890200000002 - - 0.013525193950000004 - - -0.013758964850000003 - - -0.0016490003100000004 - - 0.0017709132300000002 - - -0.0042973283700000016 - - 0.0043621968500000005 - - -0.004934888705000001 - - 0.004912360015000001 - - 0.014884752050000002 - - -0.014804665750000005 - - -0.0032633595150000005 - - 0.0031639754750000006 - - -6.486846850000001e-05 - - 0.011518507450000002 - - -0.011149990550000002 - - 0.004495218770000001 - - -0.0039552707250000005 - - 9.925023200000001e-18 - - -1.548792898897935 - - -1.4764986529115414 - - -1.4037593459363646 - - -1.4310982278939868 - - -1.5207338931333951 - - -0.5238233962453553 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 1.548792898897935 - - 1.5207338931333951 - - 1.4310982278939868 - - 1.4037593459363646 - - 1.4764986529115414 - - 0.5238233962453553 - - -1.0 - - -0.7622358709262116 - - -0.8530536869268817 - - -1.1469463130731183 - - -1.2377641290737884 - - -1.0 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 1.0 - - 1.2377641290737884 - - 1.1469463130731183 - - 0.8530536869268818 - - 0.7622358709262116 - - 1.0 - - -0.45120710110206497 - - -0.47926610686660476 - - -0.5689017721060132 - - -0.5962406540636354 - - -0.5235013470884586 - - -1.4761766037546447 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 0.45120710110206497 - - 0.5235013470884586 - - 0.5962406540636354 - - 0.5689017721060132 - - 0.47926610686660476 - - 1.4761766037546447 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== + dtype: f8 z: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.0004754300695000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.007705580450000002 - - -0.008505494900000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.013440123200000004 - - -0.013835124650000002 - - 0.0 - - 0.00015880254800000005 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.003090666795000001 - - 0.0 - - 0.0033339664350000007 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0048939786850000005 - - 0.0 - - 0.004949130490000001 - - 0.10000000000000002 - - -3.1374891150000003e-18 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.014907522500000003 - - 0.0 - - -0.004407344015000001 - - -0.014772200600000002 - - 0.0 - - 0.0042485412200000015 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0018584636950000003 - - 0.0 - - 0.0015600122500000005 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.011641889050000001 - - -0.011019207550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.004680036755000001 - - -0.003767693415000001 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014997360100000004 - - -0.012768703700000003 - - -0.012464462200000002 - - -0.006486073150000001 - - -0.005974184350000002 - - -0.004720254240000001 - - -0.004675881190000001 - - -0.0025559673100000006 - - -0.0024436118100000007 - - 0.0008042847750000002 - - 0.0009320507750000002 - - 0.0018558396050000002 - - 0.0024128545100000004 - - 0.003788203375000001 - - 0.0038715966050000008 - - 0.004999579490000001 - - 0.009608536200000002 - - 0.0100338295 - - 0.014310590900000003 - - 0.014469133300000003 - - -1.6175736900000002e-18 - - -0.0762493312047592 - - -0.24999777010606963 - - -0.0782577878324744 - - 0.20163179734122239 - - 0.2028730918020804 - - 8.326672684688674e-17 - - -0.2500000000000001 - - -0.07725424859373697 - - 0.20225424859373672 - - 0.20225424859373675 - - -0.07725424859373692 - - 1.1102230246251565e-16 - - -0.0762493312047592 - - 0.20287309180208038 - - 0.20163179734122244 - - -0.07825778783247435 - - -0.24999777010606966 - - 8.326672684688674e-17 - - 0.2499999999999999 - - 0.07725424859373675 - - -0.20225424859373695 - - -0.20225424859373697 - - 0.0772542485937367 - - 1.1102230246251565e-16 - - -0.2500000000000001 - - -0.07725424859373697 - - 0.20225424859373672 - - 0.20225424859373675 - - -0.07725424859373692 - - 1.1102230246251565e-16 - - 0.2499999999999999 - - 0.07725424859373675 - - -0.20225424859373695 - - -0.20225424859373697 - - 0.0772542485937367 - - 1.1102230246251565e-16 - - -0.0762493312047592 - - 0.20287309180208038 - - 0.20163179734122244 - - -0.07825778783247435 - - -0.24999777010606966 - - 8.326672684688674e-17 - - -0.2500000000000001 - - -0.07725424859373697 - - 0.20225424859373672 - - 0.20225424859373675 - - -0.07725424859373692 - - 1.1102230246251565e-16 - - -0.0762493312047592 - - -0.24999777010606963 - - -0.0782577878324744 - - 0.20163179734122239 - - 0.2028730918020804 - - 8.326672684688674e-17 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== + dtype: f8 - color: '#2e91e5' colorscale: - - 0.0 @@ -1479,53 +306,17 @@ data: - - 1.0 - '#e71111' i: - - 7 - - 0 - - 0 - - 0 - - 4 - - 4 - - 2 - - 6 - - 4 - - 0 - - 3 - - 7 + bdata: BwAAAAQEAgYEAAMH + dtype: i1 intensity: - - 0.0 - - 0.0 - - 1.0 - - 1.0 - - 0.0 - - 0.0 - - 1.0 - - 1.0 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 j: - - 0 - - 7 - - 1 - - 2 - - 6 - - 7 - - 1 - - 2 - - 5 - - 5 - - 2 - - 2 + bdata: AAcBAgYHAQIFBQIC + dtype: i1 k: - - 3 - - 4 - - 2 - - 3 - - 5 - - 6 - - 5 - - 5 - - 0 - - 1 - - 7 - - 6 + bdata: AwQCAwUGBQUAAQcG + dtype: i1 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -1534,32 +325,14 @@ data: showscale: false type: mesh3d x: - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 y: - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 z: - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 - facecolor: - '#1ca71c' - '#1ca71c' @@ -1787,683 +560,14 @@ data: - '#440154' - '#440154' i: - - 75 - - 64 - - 2 - - 75 - - 76 - - 65 - - 65 - - 64 - - 2 - - 0 - - 1 - - 0 - - 84 - - 86 - - 86 - - 90 - - 90 - - 92 - - 92 - - 91 - - 91 - - 87 - - 87 - - 85 - - 85 - - 83 - - 83 - - 82 - - 82 - - 84 - - 94 - - 86 - - 86 - - 84 - - 84 - - 82 - - 82 - - 83 - - 83 - - 85 - - 85 - - 87 - - 87 - - 87 - - 91 - - 91 - - 92 - - 92 - - 90 - - 90 - - 94 - - 95 - - 88 - - 78 - - 79 - - 81 - - 80 - - 93 - - 96 - - 89 - - 77 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 50 - - 52 - - 52 - - 44 - - 44 - - 32 - - 32 - - 22 - - 22 - - 14 - - 14 - - 20 - - 20 - - 30 - - 30 - - 41 - - 41 - - 50 - - 57 - - 52 - - 52 - - 50 - - 50 - - 41 - - 41 - - 30 - - 30 - - 20 - - 20 - - 14 - - 14 - - 14 - - 22 - - 22 - - 32 - - 32 - - 44 - - 44 - - 57 - - 11 - - 4 - - 12 - - 58 - - 62 - - 8 - - 7 - - 39 - - 61 - - 42 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 48 - - 54 - - 54 - - 47 - - 47 - - 37 - - 37 - - 25 - - 25 - - 17 - - 17 - - 18 - - 18 - - 26 - - 26 - - 38 - - 38 - - 48 - - 59 - - 54 - - 54 - - 48 - - 48 - - 38 - - 38 - - 26 - - 26 - - 18 - - 18 - - 17 - - 17 - - 17 - - 25 - - 25 - - 37 - - 37 - - 47 - - 47 - - 59 - - 27 - - 5 - - 10 - - 56 - - 60 - - 6 - - 9 - - 55 - - 63 - - 28 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 98 - - 99 - - 100 - - 101 - - 102 - - 104 - - 105 - - 106 - - 107 - - 108 - - 110 - - 111 - - 112 - - 113 - - 114 - - 116 - - 117 - - 118 - - 119 - - 120 - - 122 - - 123 - - 124 - - 125 - - 126 - - 128 - - 129 - - 130 - - 131 - - 132 - - 134 - - 135 - - 136 - - 137 - - 138 - - 140 - - 141 - - 142 - - 143 - - 144 - - 146 - - 147 - - 148 - - 149 - - 150 + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 j: - - 76 - - 76 - - 3 - - 3 - - 3 - - 3 - - 1 - - 1 - - 75 - - 75 - - 3 - - 3 - - 70 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 71 - - 71 - - 69 - - 69 - - 67 - - 67 - - 66 - - 66 - - 68 - - 68 - - 89 - - 89 - - 81 - - 81 - - 79 - - 79 - - 77 - - 77 - - 78 - - 78 - - 80 - - 80 - - 88 - - 93 - - 93 - - 95 - - 95 - - 96 - - 96 - - 94 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 68 - - 68 - - 66 - - 66 - - 67 - - 67 - - 69 - - 51 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 13 - - 13 - - 19 - - 19 - - 29 - - 29 - - 40 - - 40 - - 49 - - 49 - - 61 - - 61 - - 62 - - 62 - - 58 - - 58 - - 42 - - 42 - - 12 - - 12 - - 8 - - 8 - - 4 - - 7 - - 7 - - 11 - - 11 - - 39 - - 39 - - 57 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 49 - - 49 - - 40 - - 40 - - 29 - - 29 - - 19 - - 53 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 15 - - 15 - - 16 - - 16 - - 24 - - 24 - - 36 - - 36 - - 46 - - 46 - - 63 - - 63 - - 60 - - 60 - - 56 - - 56 - - 28 - - 28 - - 10 - - 10 - - 6 - - 6 - - 5 - - 9 - - 9 - - 27 - - 27 - - 55 - - 55 - - 59 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 46 - - 46 - - 36 - - 36 - - 24 - - 24 - - 16 - - 99 - - 100 - - 101 - - 102 - - 98 - - 105 - - 106 - - 107 - - 108 - - 104 - - 111 - - 112 - - 113 - - 114 - - 110 - - 117 - - 118 - - 119 - - 120 - - 116 - - 123 - - 124 - - 125 - - 126 - - 122 - - 129 - - 130 - - 131 - - 132 - - 128 - - 135 - - 136 - - 137 - - 138 - - 134 - - 141 - - 142 - - 143 - - 144 - - 140 - - 147 - - 148 - - 149 - - 150 - - 146 + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 k: - - 64 - - 65 - - 75 - - 76 - - 65 - - 1 - - 64 - - 0 - - 0 - - 64 - - 0 - - 2 - - 86 - - 72 - - 90 - - 74 - - 92 - - 73 - - 91 - - 71 - - 87 - - 69 - - 85 - - 67 - - 83 - - 66 - - 82 - - 68 - - 84 - - 70 - - 86 - - 81 - - 84 - - 79 - - 82 - - 77 - - 83 - - 78 - - 85 - - 80 - - 87 - - 88 - - 93 - - 91 - - 95 - - 92 - - 96 - - 90 - - 94 - - 86 - - 89 - - 96 - - 93 - - 80 - - 77 - - 79 - - 88 - - 95 - - 94 - - 81 - - 78 - - 72 - - 66 - - 74 - - 67 - - 73 - - 69 - - 71 - - 52 - - 43 - - 44 - - 31 - - 32 - - 21 - - 22 - - 13 - - 14 - - 19 - - 20 - - 29 - - 30 - - 40 - - 41 - - 49 - - 50 - - 51 - - 52 - - 62 - - 50 - - 58 - - 41 - - 42 - - 30 - - 12 - - 20 - - 8 - - 14 - - 4 - - 7 - - 22 - - 11 - - 32 - - 39 - - 44 - - 57 - - 52 - - 61 - - 39 - - 7 - - 8 - - 42 - - 58 - - 4 - - 11 - - 57 - - 62 - - 12 - - 43 - - 40 - - 31 - - 29 - - 21 - - 19 - - 13 - - 54 - - 45 - - 47 - - 35 - - 37 - - 23 - - 25 - - 15 - - 17 - - 16 - - 18 - - 24 - - 26 - - 36 - - 38 - - 46 - - 48 - - 53 - - 54 - - 60 - - 48 - - 56 - - 38 - - 28 - - 26 - - 10 - - 18 - - 6 - - 17 - - 5 - - 9 - - 25 - - 27 - - 37 - - 55 - - 47 - - 59 - - 54 - - 63 - - 55 - - 9 - - 6 - - 28 - - 56 - - 5 - - 27 - - 59 - - 60 - - 10 - - 45 - - 36 - - 35 - - 24 - - 23 - - 16 - - 15 - - 103 - - 103 - - 103 - - 103 - - 103 - - 109 - - 109 - - 109 - - 109 - - 109 - - 115 - - 115 - - 115 - - 115 - - 115 - - 121 - - 121 - - 121 - - 121 - - 121 - - 127 - - 127 - - 127 - - 127 - - 127 - - 133 - - 133 - - 133 - - 133 - - 133 - - 139 - - 139 - - 139 - - 139 - - 139 - - 145 - - 145 - - 145 - - 145 - - 145 - - 151 - - 151 - - 151 - - 151 - - 151 + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 legendgroup: Sensor(id=ID) name: Sensor (log) opacity: 1 @@ -2471,464 +575,14 @@ data: showlegend: true type: mesh3d x: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014992463600000002 - - -0.014392395300000003 - - -0.014392395300000003 - - -0.012869499600000002 - - -0.012355425950000002 - - -0.009822911000000002 - - -0.009822911000000002 - - -0.0066605612500000005 - - -0.005795627850000001 - - 0.0 - - -0.004997477680000001 - - 0.0 - - 0.0 - - -0.0046984631550000015 - - -0.0046984631550000015 - - 0.0 - - -0.003930366410000001 - - 0.0 - - -0.003726213425000001 - - 0.0 - - 0.0 - - -0.0025000000350000003 - - -0.0025000000350000003 - - -0.0021347226600000008 - - -0.0021347226600000008 - - 0.0 - - -0.0010241928500000002 - - 0.0 - - -0.0007114128200000001 - - -1.0408340850000002e-17 - - -9.553993650000002e-18 - - 0.0 - - 0.0 - - 0.0008682409300000002 - - 0.0008682409300000002 - - 0.0016630589950000004 - - 0.0 - - 0.0023612117400000003 - - 0.0026042407400000004 - - 0.0 - - 0.0026362657550000005 - - 0.0 - - 0.0 - - 0.003830222040000001 - - 0.003830222040000001 - - 0.0 - - 0.004641779140000001 - - 0.0 - - 0.004750406370000001 - - 0.0 - - 0.0049999997000000004 - - 0.006231224900000001 - - 0.006231224900000001 - - 0.00945867 - - 0.010177281500000003 - - 0.012618804000000003 - - 0.012618804000000003 - - 0.014251218750000003 - - 0.014519108850000004 - - 0.014999999100000003 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.10000000000000002 - - -0.9657858527538798 - - -1.0698117238075746 - - -1.1744780034636209 - - -1.135139450713364 - - -1.0061606083894288 - - -0.9297248721744263 - - -1.3400303787576047 - - -1.3400303787576047 - - -1.340030378757605 - - -1.340030378757605 - - -1.3400303787576047 - - -0.6599696212423953 - - -0.9657858527538798 - - -1.0061606083894288 - - -1.135139450713364 - - -1.1744780034636209 - - -1.0698117238075746 - - -0.9297248721744263 - - 0.2706693722728103 - - 0.27066937227281024 - - 0.27066937227281024 - - 0.27066937227281024 - - 0.27066937227281024 - - -0.27066937227281024 - - -0.49999999999999994 - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.2706693722728103 - - 0.27066937227281024 - - 0.27066937227281024 - - 0.27066937227281024 - - 0.27066937227281024 - - -0.27066937227281024 - - 1.0342141472461202 - - 0.9938393916105712 - - 0.8648605492866359 - - 0.8255219965363791 - - 0.9301882761924253 - - 1.0702751278255738 - - 0.6599696212423953 - - 0.6599696212423953 - - 0.6599696212423952 - - 0.6599696212423952 - - 0.6599696212423953 - - 1.3400303787576047 - - 1.0342141472461202 - - 0.9301882761924254 - - 0.8255219965363791 - - 0.8648605492866358 - - 0.9938393916105712 - - 1.0702751278255738 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P2yOkLu35+6/PRjq5fId8b9H9mtyqcryv7BpE/yHKfK/n+W43TsZ8L/JighgTsDtvwWRxrHDcPW/BZHGscNw9b8Gkcaxw3D1vwaRxrHDcPW/BZHGscNw9b/23XKceB7lv2yOkLu35+6/n+W43TsZ8L+waRP8hynyv0f2a3KpyvK/PRjq5fId8b/JighgTsDtv0oyfKGlUtE/STJ8oaVS0T9JMnyhpVLRP0kyfKGlUtE/STJ8oaVS0T9JMnyhpVLRv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgP0oyfKGlUtE/STJ8oaVS0T9JMnyhpVLRP0kyfKGlUtE/STJ8oaVS0T9JMnyhpVLRv8q4NyIkjPA/wjSORIjN7z+gLNkH8KzrP3ITKButauo/hc8rNBrE7T+cuvvP2B/xP/bdcpx4HuU/9t1ynHge5T/13XKceB7lP/Xdcpx4HuU/9t1ynHge5T8Fkcaxw3D1P8q4NyIkjPA/hs8rNBrE7T9yEygbrWrqP58s2QfwrOs/wjSORIjN7z+cuvvP2B/xPw== + dtype: f8 y: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - -0.004225988315000001 - - 0.004225988315000001 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.011336243900000001 - - 0.011336243900000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0017101006600000004 - - 0.0017101006600000004 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.004330126940000001 - - 0.004330126940000001 - - -0.014847321800000002 - - 0.014847321800000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.10000000000000002 - - 0.0 - - 0.0 - - -0.0049240388000000015 - - 0.0049240388000000015 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0032139379550000006 - - 0.0032139379550000006 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.013644480700000003 - - 0.013644480700000003 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.008109612750000002 - - 0.008109612750000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.00028137136250000006 - - 0.0078714803 - - -0.008344890200000002 - - 0.013525193950000004 - - -0.013758964850000003 - - -0.0016490003100000004 - - 0.0017709132300000002 - - -0.0042973283700000016 - - 0.0043621968500000005 - - -0.004934888705000001 - - 0.004912360015000001 - - 0.014884752050000002 - - -0.014804665750000005 - - -0.0032633595150000005 - - 0.0031639754750000006 - - -6.486846850000001e-05 - - 0.011518507450000002 - - -0.011149990550000002 - - 0.004495218770000001 - - -0.0039552707250000005 - - 9.925023200000001e-18 - - -1.2528972419197584 - - -1.2195822783818868 - - -1.1860622198131296 - - -1.198660647850622 - - -1.2399669631513692 - - -0.7805661297766467 - - 0.0 - - 0.16169405372786455 - - 0.09993242098257196 - - -0.09993242098257192 - - -0.16169405372786458 - - 0.0 - - 1.2528972419197584 - - 1.2399669631513692 - - 1.198660647850622 - - 1.1860622198131296 - - 1.2195822783818868 - - 0.7805661297766467 - - -1.0 - - -0.8712890648692125 - - -0.9204522673653904 - - -1.0795477326346095 - - -1.1287109351307876 - - -1.0 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 1.0 - - 1.1287109351307874 - - 1.0795477326346097 - - 0.9204522673653904 - - 0.8712890648692125 - - 1.0 - - -0.7471027580802416 - - -0.7600330368486308 - - -0.8013393521493779 - - -0.8139377801868704 - - -0.7804177216181131 - - -1.2194338702233534 - - 0.0 - - 0.16169405372786455 - - 0.09993242098257196 - - -0.09993242098257192 - - -0.16169405372786458 - - 0.0 - - 0.7471027580802416 - - 0.7804177216181131 - - 0.8139377801868704 - - 0.8013393521493779 - - 0.7600330368486308 - - 1.2194338702233534 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPBK0dPrdC/S/5uYGtWiD87+a5dFgHPryv1tUmMm2LfO/aLAtmefW878RMfjRZfrovwAAAAAAAAAAHgNcCGSyxD/qJO7PK5W5P+ck7s8rlbm/HwNcCGSyxL8AAAAAAAAAABK0dPrdC/Q/aLAtmefW8z9bVJjJti3zP5rl0WAc+vI/5uYGtWiD8z8RMfjRZfroPwAAAAAAAPC/2zjfmpnh67/5oDtQWHTtv4Mv4tfTRfG/k2OQMjMP8r8AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/kmOQMjMP8j+EL+LX00XxP/mgO1BYdO0/2zjfmpnh6z8AAAAAAADwP9yXFgtE6Oe/MJ+kzTBS6L9KV89skqTpv8w0XD7HC+q/MzLylS756L945wMXzYLzvwAAAAAAAAAAHgNcCGSyxD/qJO7PK5W5P+ck7s8rlbm/HwNcCGSyxL8AAAAAAAAAANyXFgtE6Oc/MzLylS756D/MNFw+xwvqP0pXz2ySpOk/MJ+kzTBS6D945wMXzYLzPw== + dtype: f8 z: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.0004754300695000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.007705580450000002 - - -0.008505494900000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.013440123200000004 - - -0.013835124650000002 - - 0.0 - - 0.00015880254800000005 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.003090666795000001 - - 0.0 - - 0.0033339664350000007 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0048939786850000005 - - 0.0 - - 0.004949130490000001 - - 0.10000000000000002 - - -3.1374891150000003e-18 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.014907522500000003 - - 0.0 - - -0.004407344015000001 - - -0.014772200600000002 - - 0.0 - - 0.0042485412200000015 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0018584636950000003 - - 0.0 - - 0.0015600122500000005 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.011641889050000001 - - -0.011019207550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.004680036755000001 - - -0.003767693415000001 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014997360100000004 - - -0.012768703700000003 - - -0.012464462200000002 - - -0.006486073150000001 - - -0.005974184350000002 - - -0.004720254240000001 - - -0.004675881190000001 - - -0.0025559673100000006 - - -0.0024436118100000007 - - 0.0008042847750000002 - - 0.0009320507750000002 - - 0.0018558396050000002 - - 0.0024128545100000004 - - 0.003788203375000001 - - 0.0038715966050000008 - - 0.004999579490000001 - - 0.009608536200000002 - - 0.0100338295 - - 0.014310590900000003 - - 0.014469133300000003 - - -1.6175736900000002e-18 - - -0.03513756391278687 - - -0.11520511047587963 - - -0.036063110038993394 - - 0.09291688273175412 - - 0.09348890169590557 - - 3.837135211762266e-17 - - -0.17001518937880244 - - -0.05253758281992507 - - 0.13754517750932607 - - 0.1375451775093261 - - -0.05253758281992504 - - 7.55019111137411e-17 - - -0.03513756391278687 - - 0.09348890169590554 - - 0.09291688273175415 - - -0.036063110038993366 - - -0.11520511047587964 - - 3.837135211762266e-17 - - 0.13533468613640506 - - 0.04182071794454872 - - -0.10948806101275138 - - -0.1094880610127514 - - 0.04182071794454869 - - 6.010067383162237e-17 - - -0.2500000000000001 - - -0.07725424859373697 - - 0.20225424859373672 - - 0.20225424859373675 - - -0.07725424859373692 - - 1.1102230246251565e-16 - - 0.13533468613640506 - - 0.04182071794454872 - - -0.10948806101275138 - - -0.1094880610127514 - - 0.04182071794454869 - - 6.010067383162237e-17 - - -0.03513756391278687 - - 0.09348890169590554 - - 0.09291688273175415 - - -0.036063110038993366 - - -0.11520511047587964 - - 3.837135211762266e-17 - - -0.17001518937880244 - - -0.05253758281992507 - - 0.13754517750932607 - - 0.1375451775093261 - - -0.05253758281992504 - - 7.55019111137411e-17 - - -0.03513756391278687 - - -0.11520511047587963 - - -0.036063110038993394 - - 0.09291688273175412 - - 0.09348890169590557 - - 3.837135211762266e-17 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vL6pu/+M/aG/xXLTBRV+vb/7Rmss3Xaivz9DlJxmybc/1KdSf+Putz+O2HeynB6GPBhEGscOw8W/JIELwDTmqr9NApCTFJvBP04CkJMUm8E/H4ELwDTmqr8VRBrHDsOVPL6pu/+M/aG/0qdSf+Putz9BQ5ScZsm3P/dGayzddqK/xnLTBRV+vb+O2HeynB6GPEcyfKGlUsE/h/G7b4ZppT8UK1rZaAe8vxUrWtloB7y/g/G7b4ZppT9JMnyhpVKRPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPEcyfKGlUsE/h/G7b4ZppT8UK1rZaAe8vxUrWtloB7y/g/G7b4ZppT9JMnyhpVKRPL6pu/+M/aG/0qdSf+Putz9BQ5ScZsm3P/dGayzddqK/xnLTBRV+vb+O2HeynB6GPBhEGscOw8W/JIELwDTmqr9NApCTFJvBP04CkJMUm8E/H4ELwDTmqr8VRBrHDsOVPL6pu/+M/aG/xXLTBRV+vb/7Rmss3Xaivz9DlJxmybc/1KdSf+Putz+O2HeynB6GPA== + dtype: f8 - color: '#2e91e5' colorscale: - - 0.0 @@ -2944,53 +598,17 @@ data: - - 1.0 - '#e71111' i: - - 7 - - 0 - - 0 - - 0 - - 4 - - 4 - - 2 - - 6 - - 4 - - 0 - - 3 - - 7 + bdata: BwAAAAQEAgYEAAMH + dtype: i1 intensity: - - 0.0 - - 0.0 - - 1.0 - - 1.0 - - 0.0 - - 0.0 - - 1.0 - - 1.0 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== + dtype: f8 j: - - 0 - - 7 - - 1 - - 2 - - 6 - - 7 - - 1 - - 2 - - 5 - - 5 - - 2 - - 2 + bdata: AAcBAgYHAQIFBQIC + dtype: i1 k: - - 3 - - 4 - - 2 - - 3 - - 5 - - 6 - - 5 - - 5 - - 0 - - 1 - - 7 - - 6 + bdata: AwQCAwUGBQUAAQcG + dtype: i1 legendgroup: Cuboid(id=ID) name: Cuboid (1m|1m|1m) opacity: 0.2 @@ -2999,32 +617,14 @@ data: showscale: false type: mesh3d x: - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 y: - - -0.5 - - 0.5 - - 0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - -0.5 + bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== + dtype: f8 z: - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.5 - - 0.5 - - 0.5 + bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== + dtype: f8 - facecolor: - '#fb0d0d' - '#fb0d0d' @@ -3252,683 +852,14 @@ data: - '#440154' - '#440154' i: - - 75 - - 64 - - 2 - - 75 - - 76 - - 65 - - 65 - - 64 - - 2 - - 0 - - 1 - - 0 - - 84 - - 86 - - 86 - - 90 - - 90 - - 92 - - 92 - - 91 - - 91 - - 87 - - 87 - - 85 - - 85 - - 83 - - 83 - - 82 - - 82 - - 84 - - 94 - - 86 - - 86 - - 84 - - 84 - - 82 - - 82 - - 83 - - 83 - - 85 - - 85 - - 87 - - 87 - - 87 - - 91 - - 91 - - 92 - - 92 - - 90 - - 90 - - 94 - - 95 - - 88 - - 78 - - 79 - - 81 - - 80 - - 93 - - 96 - - 89 - - 77 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 50 - - 52 - - 52 - - 44 - - 44 - - 32 - - 32 - - 22 - - 22 - - 14 - - 14 - - 20 - - 20 - - 30 - - 30 - - 41 - - 41 - - 50 - - 57 - - 52 - - 52 - - 50 - - 50 - - 41 - - 41 - - 30 - - 30 - - 20 - - 20 - - 14 - - 14 - - 14 - - 22 - - 22 - - 32 - - 32 - - 44 - - 44 - - 57 - - 11 - - 4 - - 12 - - 58 - - 62 - - 8 - - 7 - - 39 - - 61 - - 42 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 48 - - 54 - - 54 - - 47 - - 47 - - 37 - - 37 - - 25 - - 25 - - 17 - - 17 - - 18 - - 18 - - 26 - - 26 - - 38 - - 38 - - 48 - - 59 - - 54 - - 54 - - 48 - - 48 - - 38 - - 38 - - 26 - - 26 - - 18 - - 18 - - 17 - - 17 - - 17 - - 25 - - 25 - - 37 - - 37 - - 47 - - 47 - - 59 - - 27 - - 5 - - 10 - - 56 - - 60 - - 6 - - 9 - - 55 - - 63 - - 28 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 98 - - 99 - - 100 - - 101 - - 102 - - 104 - - 105 - - 106 - - 107 - - 108 - - 110 - - 111 - - 112 - - 113 - - 114 - - 116 - - 117 - - 118 - - 119 - - 120 - - 122 - - 123 - - 124 - - 125 - - 126 - - 128 - - 129 - - 130 - - 131 - - 132 - - 134 - - 135 - - 136 - - 137 - - 138 - - 140 - - 141 - - 142 - - 143 - - 144 - - 146 - - 147 - - 148 - - 149 - - 150 + bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA + dtype: i2 j: - - 76 - - 76 - - 3 - - 3 - - 3 - - 3 - - 1 - - 1 - - 75 - - 75 - - 3 - - 3 - - 70 - - 70 - - 72 - - 72 - - 74 - - 74 - - 73 - - 73 - - 71 - - 71 - - 69 - - 69 - - 67 - - 67 - - 66 - - 66 - - 68 - - 68 - - 89 - - 89 - - 81 - - 81 - - 79 - - 79 - - 77 - - 77 - - 78 - - 78 - - 80 - - 80 - - 88 - - 93 - - 93 - - 95 - - 95 - - 96 - - 96 - - 94 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 97 - - 68 - - 68 - - 66 - - 66 - - 67 - - 67 - - 69 - - 51 - - 51 - - 43 - - 43 - - 31 - - 31 - - 21 - - 21 - - 13 - - 13 - - 19 - - 19 - - 29 - - 29 - - 40 - - 40 - - 49 - - 49 - - 61 - - 61 - - 62 - - 62 - - 58 - - 58 - - 42 - - 42 - - 12 - - 12 - - 8 - - 8 - - 4 - - 7 - - 7 - - 11 - - 11 - - 39 - - 39 - - 57 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 34 - - 49 - - 49 - - 40 - - 40 - - 29 - - 29 - - 19 - - 53 - - 53 - - 45 - - 45 - - 35 - - 35 - - 23 - - 23 - - 15 - - 15 - - 16 - - 16 - - 24 - - 24 - - 36 - - 36 - - 46 - - 46 - - 63 - - 63 - - 60 - - 60 - - 56 - - 56 - - 28 - - 28 - - 10 - - 10 - - 6 - - 6 - - 5 - - 9 - - 9 - - 27 - - 27 - - 55 - - 55 - - 59 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 33 - - 46 - - 46 - - 36 - - 36 - - 24 - - 24 - - 16 - - 99 - - 100 - - 101 - - 102 - - 98 - - 105 - - 106 - - 107 - - 108 - - 104 - - 111 - - 112 - - 113 - - 114 - - 110 - - 117 - - 118 - - 119 - - 120 - - 116 - - 123 - - 124 - - 125 - - 126 - - 122 - - 129 - - 130 - - 131 - - 132 - - 128 - - 135 - - 136 - - 137 - - 138 - - 134 - - 141 - - 142 - - 143 - - 144 - - 140 - - 147 - - 148 - - 149 - - 150 - - 146 + bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA + dtype: i2 k: - - 64 - - 65 - - 75 - - 76 - - 65 - - 1 - - 64 - - 0 - - 0 - - 64 - - 0 - - 2 - - 86 - - 72 - - 90 - - 74 - - 92 - - 73 - - 91 - - 71 - - 87 - - 69 - - 85 - - 67 - - 83 - - 66 - - 82 - - 68 - - 84 - - 70 - - 86 - - 81 - - 84 - - 79 - - 82 - - 77 - - 83 - - 78 - - 85 - - 80 - - 87 - - 88 - - 93 - - 91 - - 95 - - 92 - - 96 - - 90 - - 94 - - 86 - - 89 - - 96 - - 93 - - 80 - - 77 - - 79 - - 88 - - 95 - - 94 - - 81 - - 78 - - 72 - - 66 - - 74 - - 67 - - 73 - - 69 - - 71 - - 52 - - 43 - - 44 - - 31 - - 32 - - 21 - - 22 - - 13 - - 14 - - 19 - - 20 - - 29 - - 30 - - 40 - - 41 - - 49 - - 50 - - 51 - - 52 - - 62 - - 50 - - 58 - - 41 - - 42 - - 30 - - 12 - - 20 - - 8 - - 14 - - 4 - - 7 - - 22 - - 11 - - 32 - - 39 - - 44 - - 57 - - 52 - - 61 - - 39 - - 7 - - 8 - - 42 - - 58 - - 4 - - 11 - - 57 - - 62 - - 12 - - 43 - - 40 - - 31 - - 29 - - 21 - - 19 - - 13 - - 54 - - 45 - - 47 - - 35 - - 37 - - 23 - - 25 - - 15 - - 17 - - 16 - - 18 - - 24 - - 26 - - 36 - - 38 - - 46 - - 48 - - 53 - - 54 - - 60 - - 48 - - 56 - - 38 - - 28 - - 26 - - 10 - - 18 - - 6 - - 17 - - 5 - - 9 - - 25 - - 27 - - 37 - - 55 - - 47 - - 59 - - 54 - - 63 - - 55 - - 9 - - 6 - - 28 - - 56 - - 5 - - 27 - - 59 - - 60 - - 10 - - 45 - - 36 - - 35 - - 24 - - 23 - - 16 - - 15 - - 103 - - 103 - - 103 - - 103 - - 103 - - 109 - - 109 - - 109 - - 109 - - 109 - - 115 - - 115 - - 115 - - 115 - - 115 - - 121 - - 121 - - 121 - - 121 - - 121 - - 127 - - 127 - - 127 - - 127 - - 127 - - 133 - - 133 - - 133 - - 133 - - 133 - - 139 - - 139 - - 139 - - 139 - - 139 - - 145 - - 145 - - 145 - - 145 - - 145 - - 151 - - 151 - - 151 - - 151 - - 151 + bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA + dtype: i2 legendgroup: Sensor(id=ID) name: Sensor (linear) opacity: 1 @@ -3936,464 +867,14 @@ data: showlegend: true type: mesh3d x: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014992463600000002 - - -0.014392395300000003 - - -0.014392395300000003 - - -0.012869499600000002 - - -0.012355425950000002 - - -0.009822911000000002 - - -0.009822911000000002 - - -0.0066605612500000005 - - -0.005795627850000001 - - 0.0 - - -0.004997477680000001 - - 0.0 - - 0.0 - - -0.0046984631550000015 - - -0.0046984631550000015 - - 0.0 - - -0.003930366410000001 - - 0.0 - - -0.003726213425000001 - - 0.0 - - 0.0 - - -0.0025000000350000003 - - -0.0025000000350000003 - - -0.0021347226600000008 - - -0.0021347226600000008 - - 0.0 - - -0.0010241928500000002 - - 0.0 - - -0.0007114128200000001 - - -1.0408340850000002e-17 - - -9.553993650000002e-18 - - 0.0 - - 0.0 - - 0.0008682409300000002 - - 0.0008682409300000002 - - 0.0016630589950000004 - - 0.0 - - 0.0023612117400000003 - - 0.0026042407400000004 - - 0.0 - - 0.0026362657550000005 - - 0.0 - - 0.0 - - 0.003830222040000001 - - 0.003830222040000001 - - 0.0 - - 0.004641779140000001 - - 0.0 - - 0.004750406370000001 - - 0.0 - - 0.0049999997000000004 - - 0.006231224900000001 - - 0.006231224900000001 - - 0.00945867 - - 0.010177281500000003 - - 0.012618804000000003 - - 0.012618804000000003 - - 0.014251218750000003 - - 0.014519108850000004 - - 0.014999999100000003 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.10000000000000002 - - -0.9949806573499389 - - -1.010241639525924 - - -1.0255965720256777 - - -1.019825460029501 - - -1.0009037841632278 - - -0.9896903773811462 - - -1.1010867896780552 - - -1.1010867896780552 - - -1.1010867896780552 - - -1.1010867896780552 - - -1.1010867896780552 - - -0.8989132103219449 - - -0.9949806573499389 - - -1.0009037841632278 - - -1.019825460029501 - - -1.0255965720256777 - - -1.010241639525924 - - -0.9896903773811462 - - 0.050543394839027554 - - 0.05054339483902755 - - 0.05054339483902754 - - 0.05054339483902754 - - 0.05054339483902755 - - -0.05054339483902755 - - -0.49999999999999994 - - -0.5 - - -0.5 - - -0.5 - - -0.5 - - 0.5 - - 0.050543394839027554 - - 0.05054339483902755 - - 0.05054339483902754 - - 0.05054339483902754 - - 0.05054339483902755 - - -0.05054339483902755 - - 1.005019342650061 - - 0.9990962158367723 - - 0.9801745399704991 - - 0.9744034279743223 - - 0.9897583604740762 - - 1.0103096226188537 - - 0.8989132103219449 - - 0.8989132103219449 - - 0.8989132103219449 - - 0.8989132103219449 - - 0.8989132103219449 - - 1.1010867896780552 - - 1.005019342650061 - - 0.9897583604740762 - - 0.9744034279743223 - - 0.9801745399704991 - - 0.9990962158367723 - - 1.0103096226188537 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P+gO76zh1u+/5iMtI/Mp8L8E13vz12jwvx1HZ4A0UfC/gMe2r7MD8L/PkoAni6vvvxmZey4NnvG/GZl7Lg2e8b8ZmXsuDZ7xvxmZey4NnvG/GZl7Lg2e8b/PzQij5cPsv+gO76zh1u+/gMe2r7MD8L8dR2eANFHwvwTXe/PXaPC/5iMtI/Mp8L/PkoAni6vvv4uRuefS4Kk/ipG559LgqT+Jkbnn0uCpP4mRuefS4Kk/ipG559LgqT+Kkbnn0uCpv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgP4uRuefS4Kk/ipG559LgqT+Jkbnn0uCpP4mRuefS4Kk/ipG559LgqT+Kkbnn0uCpv4x4iCmPFPA/AXGSoJj47z/GcTH/ll3vP/hRCBlQLu8/NbiluRms7z+Ytj9sOirwP8/NCKPlw+w/z80Io+XD7D/PzQij5cPsP8/NCKPlw+w/z80Io+XD7D8ZmXsuDZ7xP4x4iCmPFPA/NbiluRms7z/4UQgZUC7vP8ZxMf+WXe8/AXGSoJj47z+Ytj9sOirwPw== + dtype: f8 y: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.07401923550000002 - - -0.004225988315000001 - - 0.004225988315000001 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.011336243900000001 - - 0.011336243900000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0017101006600000004 - - 0.0017101006600000004 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.004330126940000001 - - 0.004330126940000001 - - -0.014847321800000002 - - 0.014847321800000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.10000000000000002 - - 0.0 - - 0.0 - - -0.0049240388000000015 - - 0.0049240388000000015 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.0032139379550000006 - - 0.0032139379550000006 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.07401923550000002 - - 0.0 - - 0.0 - - -0.013644480700000003 - - 0.013644480700000003 - - 0.07401923550000002 - - 0.07401923550000002 - - -0.008109612750000002 - - 0.008109612750000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.00028137136250000006 - - 0.0078714803 - - -0.008344890200000002 - - 0.013525193950000004 - - -0.013758964850000003 - - -0.0016490003100000004 - - 0.0017709132300000002 - - -0.0042973283700000016 - - 0.0043621968500000005 - - -0.004934888705000001 - - 0.004912360015000001 - - 0.014884752050000002 - - -0.014804665750000005 - - -0.0032633595150000005 - - 0.0031639754750000006 - - -6.486846850000001e-05 - - 0.011518507450000002 - - -0.011149990550000002 - - 0.004495218770000001 - - -0.0039552707250000005 - - 9.925023200000001e-18 - - -1.0371009659635635 - - -1.0322135369077412 - - -1.0272960196480998 - - -1.0291442558971995 - - -1.035204045978024 - - -0.9678082351210744 - - 0.0 - - 0.048069625017335985 - - 0.0297086620871759 - - -0.029708662087175885 - - -0.048069625017335985 - - 0.0 - - 1.0371009659635635 - - 1.035204045978024 - - 1.0291442558971995 - - 1.0272960196480998 - - 1.0322135369077412 - - 0.9678082351210744 - - -1.0 - - -0.975965187491332 - - -0.9851456689564121 - - -1.014854331043588 - - -1.024034812508668 - - -1.0 - - 0.0 - - 0.23776412907378838 - - 0.1469463130731183 - - -0.14694631307311826 - - -0.2377641290737884 - - 0.0 - - 1.0 - - 1.024034812508668 - - 1.014854331043588 - - 0.9851456689564121 - - 0.975965187491332 - - 1.0 - - -0.9628990340364365 - - -0.9647959540219759 - - -0.9708557441028005 - - -0.9727039803519001 - - -0.9677864630922587 - - -1.0321917648789256 - - 0.0 - - 0.048069625017335985 - - 0.0297086620871759 - - -0.029708662087175885 - - -0.048069625017335985 - - 0.0 - - 0.9628990340364365 - - 0.9677864630922587 - - 0.9727039803519001 - - 0.9708557441028005 - - 0.9647959540219759 - - 1.0321917648789256 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPI5qty73l/C/pR14V/KD8L9oMXvzzW/wv5odn/dfd/C/k5kiHjKQ8L+wn9T5SPjuvwAAAAAAAAAAOsnC9pScqD9XEkqQ8mueP1MSSpDya56/OsnC9pScqL8AAAAAAAAAAI5qty73l/A/k5kiHjKQ8D+aHZ/3X3fwP2gxe/PNb/A/pR14V/KD8D+wn9T5SPjuPwAAAAAAAPC/tulJWBs777+31741UIbvvyWUIOXXPPC/JQvbU3Ji8L8AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/JQvbU3Ji8D8llCDl1zzwP7fXvjVQhu8/tulJWBs77z8AAAAAAADwP+QqkaIR0O6/2sy6w5vf7r/MxMEQQBHvvy+dCRlkIO+/tcQPURv47r8osBWD24PwvwAAAAAAAAAAOsnC9pScqD9XEkqQ8mueP1MSSpDya56/OsnC9pScqL8AAAAAAAAAAOQqkaIR0O4/tcQPURv47j8vnQkZZCDvP8zEwRBAEe8/2sy6w5vf7j8osBWD24PwPw== + dtype: f8 z: - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.0004754300695000001 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.007705580450000002 - - -0.008505494900000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.013440123200000004 - - -0.013835124650000002 - - 0.0 - - 0.00015880254800000005 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.003090666795000001 - - 0.0 - - 0.0033339664350000007 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0048939786850000005 - - 0.0 - - 0.004949130490000001 - - 0.10000000000000002 - - -3.1374891150000003e-18 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.014907522500000003 - - 0.0 - - -0.004407344015000001 - - -0.014772200600000002 - - 0.0 - - 0.0042485412200000015 - - 0.0 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.0 - - -0.0018584636950000003 - - 0.0 - - 0.0015600122500000005 - - 0.0 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.011641889050000001 - - -0.011019207550000002 - - 0.07401923550000002 - - 0.07401923550000002 - - 0.004680036755000001 - - -0.003767693415000001 - - 0.07401923550000002 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - -0.014997360100000004 - - -0.012768703700000003 - - -0.012464462200000002 - - -0.006486073150000001 - - -0.005974184350000002 - - -0.004720254240000001 - - -0.004675881190000001 - - -0.0025559673100000006 - - -0.0024436118100000007 - - 0.0008042847750000002 - - 0.0009320507750000002 - - 0.0018558396050000002 - - 0.0024128545100000004 - - 0.003788203375000001 - - 0.0038715966050000008 - - 0.004999579490000001 - - 0.009608536200000002 - - 0.0100338295 - - 0.014310590900000003 - - 0.014469133300000003 - - -1.6175736900000002e-18 - - -0.005154811309426908 - - -0.016901018176980954 - - -0.005290592368427116 - - 0.013631252272672182 - - 0.013715169582162769 - - 5.629220066162395e-18 - - -0.05054339483902757 - - -0.015618767958662546 - - 0.04089046537817627 - - 0.040890465378176276 - - -0.015618767958662535 - - 2.2445776277203476e-17 - - -0.005154811309426908 - - 0.013715169582162763 - - 0.013631252272672185 - - -0.005290592368427113 - - -0.016901018176980954 - - 5.629220066162395e-18 - - 0.025271697419513763 - - 0.00780938397933125 - - -0.020445232689088155 - - -0.02044523268908816 - - 0.007809383979331245 - - 1.1222888138601738e-17 - - -0.2500000000000001 - - -0.07725424859373697 - - 0.20225424859373672 - - 0.20225424859373675 - - -0.07725424859373692 - - 1.1102230246251565e-16 - - 0.025271697419513763 - - 0.00780938397933125 - - -0.020445232689088155 - - -0.02044523268908816 - - 0.007809383979331245 - - 1.1222888138601738e-17 - - -0.005154811309426908 - - 0.013715169582162763 - - 0.013631252272672185 - - -0.005290592368427113 - - -0.016901018176980954 - - 5.629220066162395e-18 - - -0.05054339483902757 - - -0.015618767958662546 - - 0.04089046537817627 - - 0.040890465378176276 - - -0.015618767958662535 - - 2.2445776277203476e-17 - - -0.005154811309426908 - - -0.016901018176980954 - - -0.005290592368427116 - - 0.013631252272672182 - - 0.013715169582162769 - - 5.629220066162395e-18 + bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vD5M2x82HXW/WmBbIYBOkb+NiS6Tlqt1v9Wbt7Wz6os/tA+E5rIWjD83nt1ez/VZPI2RuefS4Km/ca2wjLv8j78a9AhXmO+kPxv0CFeY76Q/a62wjLv8j7+Kkbnn0uB5PD5M2x82HXW/sQ+E5rIWjD/Xm7e1s+qLP4mJLpOWq3W/WmBbIYBOkb83nt1ez/VZPIeRuefS4Jk/V62wjLv8fz8g9AhXmO+UvyH0CFeY75S/Ua2wjLv8fz+Kkbnn0uBpPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPIeRuefS4Jk/V62wjLv8fz8g9AhXmO+UvyH0CFeY75S/Ua2wjLv8fz+Kkbnn0uBpPD5M2x82HXW/sQ+E5rIWjD/Xm7e1s+qLP4mJLpOWq3W/WmBbIYBOkb83nt1ez/VZPI2RuefS4Km/ca2wjLv8j78a9AhXmO+kPxv0CFeY76Q/a62wjLv8j7+Kkbnn0uB5PD5M2x82HXW/WmBbIYBOkb+NiS6Tlqt1v9Wbt7Wz6os/tA+E5rIWjD83nt1ez/VZPA== + dtype: f8 layout: legend: itemsizing: constant From 2bacf52dab9eaab2ad53b54bcda0344ea062a6cd Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sun, 18 May 2025 12:42:38 +0200 Subject: [PATCH 171/211] don't use data_regression for now --- tests/test_display_plotly.py | 25 +- .../test_field_coloring_subplot.yml | 1780 ----------------- .../test_pixel_field_color_scales.yml | 1780 ----------------- .../test_pixel_field_directional_symbols.yml | 1751 ---------------- .../test_pixel_field_null_values.yml | 1286 ------------ .../test_pixel_field_sizing_modes.yml | 1449 -------------- 6 files changed, 10 insertions(+), 8061 deletions(-) delete mode 100644 tests/test_display_plotly/test_field_coloring_subplot.yml delete mode 100644 tests/test_display_plotly/test_pixel_field_color_scales.yml delete mode 100644 tests/test_display_plotly/test_pixel_field_directional_symbols.yml delete mode 100644 tests/test_display_plotly/test_pixel_field_null_values.yml delete mode 100644 tests/test_display_plotly/test_pixel_field_sizing_modes.yml diff --git a/tests/test_display_plotly.py b/tests/test_display_plotly.py index 0d810531e..d6065274d 100644 --- a/tests/test_display_plotly.py +++ b/tests/test_display_plotly.py @@ -487,7 +487,7 @@ def test_units_length(): assert ax.range == (-r, r) -def test_field_coloring_subplot(fig_regression_helper): +def test_field_coloring_subplot(): """Test field coloring in subplots for all colorsource options.""" c1 = magpy.magnet.Cuboid( polarization=(1, 0, 0), dimension=(1, 1, 1), style_opacity=0.2 @@ -503,11 +503,10 @@ def test_field_coloring_subplot(fig_regression_helper): style_description=str(cs), ) subplots.append({"objects": [c1, s], "col": i}) - fig = magpy.show(*subplots, backend="plotly", return_fig=True) - fig_regression_helper(fig) + magpy.show(*subplots, backend="plotly", return_fig=True) -def test_pixel_field_directional_symbols(fig_regression_helper): +def test_pixel_field_directional_symbols(): """Test different directional symbols in subplots for all symbol options.""" c1 = magpy.magnet.Cuboid( polarization=(1, 0, 0), dimension=(1, 1, 1), style_opacity=0.2 @@ -523,11 +522,10 @@ def test_pixel_field_directional_symbols(fig_regression_helper): style_description=str(sym), ) subplots.append({"objects": [c1, s], "col": i}) - fig = magpy.show(*subplots, backend="plotly", return_fig=True) - fig_regression_helper(fig) + magpy.show(*subplots, backend="plotly", return_fig=True) -def test_pixel_field_sizing_modes(fig_regression_helper): +def test_pixel_field_sizing_modes(): """Test sizing modes of directional symbols in subplots for all sizemode options.""" c1 = magpy.magnet.Cuboid( polarization=(1, 0, 0), dimension=(1, 1, 1), style_opacity=0.2 @@ -543,11 +541,10 @@ def test_pixel_field_sizing_modes(fig_regression_helper): style_description=str(sm), ) subplots.append({"objects": [c1, s], "col": i}) - fig = magpy.show(*subplots, backend="plotly", return_fig=True) - fig_regression_helper(fig) + magpy.show(*subplots, backend="plotly", return_fig=True) -def test_pixel_field_null_values(fig_regression_helper): +def test_pixel_field_null_values(): """Test handling of null or NaN values in subplots for both shownull options.""" c1 = magpy.magnet.Cuboid( polarization=(1, 0, 0), dimension=(1, 1, 1), style_opacity=0.2 @@ -563,11 +560,10 @@ def test_pixel_field_null_values(fig_regression_helper): style_description=str(sn), ) subplots.append({"objects": [c1, s], "col": i}) - fig = magpy.show(*subplots, backend="plotly", return_fig=True) - fig_regression_helper(fig) + magpy.show(*subplots, backend="plotly", return_fig=True) -def test_pixel_field_color_scales(fig_regression_helper): +def test_pixel_field_color_scales(): """Test different color scales in subplots for all colorscale options.""" c1 = magpy.magnet.Cuboid( polarization=(1, 0, 0), dimension=(1, 1, 1), style_opacity=0.2 @@ -583,5 +579,4 @@ def test_pixel_field_color_scales(fig_regression_helper): style_description=str(cs), ) subplots.append({"objects": [c1, s], "col": i}) - fig = magpy.show(*subplots, backend="plotly", return_fig=True) - fig_regression_helper(fig) + magpy.show(*subplots, backend="plotly", return_fig=True) diff --git a/tests/test_display_plotly/test_field_coloring_subplot.yml b/tests/test_display_plotly/test_field_coloring_subplot.yml deleted file mode 100644 index 77a5ed01a..000000000 --- a/tests/test_display_plotly/test_field_coloring_subplot.yml +++ /dev/null @@ -1,1780 +0,0 @@ -data: -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene - showlegend: true - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#34628d' - - '#34628d' - - '#34628d' - - '#34628d' - - '#34628d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#471c6d' - - '#471c6d' - - '#471c6d' - - '#471c6d' - - '#471c6d' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#471c6d' - - '#471c6d' - - '#471c6d' - - '#471c6d' - - '#471c6d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#34628d' - - '#34628d' - - '#34628d' - - '#34628d' - - '#34628d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (H) - opacity: 1 - scene: scene - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene2 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (Jxy) - opacity: 1 - scene: scene2 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene3 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (Bz) - opacity: 1 - scene: scene3 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene4 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - - black - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (False) - opacity: 1 - scene: scene4 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 -layout: - legend: - itemsizing: constant - scene: - aspectmode: manual - aspectratio: - x: 1 - y: 1 - z: 1 - camera: - eye: - x: 1 - y: -1.5 - z: 1.4 - domain: - x: - - 0.0 - - 0.2125 - y: - - 0.0 - - 1.0 - xaxis: - autorange: false - range: - - -1.548792898897935 - - 1.548792898897935 - title: - text: x (m) - yaxis: - autorange: false - range: - - -1.548792898897935 - - 1.548792898897935 - title: - text: y (m) - zaxis: - autorange: false - range: - - -1.548792898897935 - - 1.548792898897935 - title: - text: z (m) - scene2: - aspectmode: manual - aspectratio: - x: 1 - y: 1 - z: 1 - camera: - eye: - x: 1 - y: -1.5 - z: 1.4 - domain: - x: - - 0.2625 - - 0.475 - y: - - 0.0 - - 1.0 - xaxis: - autorange: false - range: - - -1.548792898897935 - - 1.548792898897935 - title: - text: x (m) - yaxis: - autorange: false - range: - - -1.548792898897935 - - 1.548792898897935 - title: - text: y (m) - zaxis: - autorange: false - range: - - -1.548792898897935 - - 1.548792898897935 - title: - text: z (m) - scene3: - aspectmode: manual - aspectratio: - x: 1 - y: 1 - z: 1 - camera: - eye: - x: 1 - y: -1.5 - z: 1.4 - domain: - x: - - 0.525 - - 0.7375 - y: - - 0.0 - - 1.0 - xaxis: - autorange: false - range: - - -1.548792898897935 - - 1.548792898897935 - title: - text: x (m) - yaxis: - autorange: false - range: - - -1.548792898897935 - - 1.548792898897935 - title: - text: y (m) - zaxis: - autorange: false - range: - - -1.548792898897935 - - 1.548792898897935 - title: - text: z (m) - scene4: - aspectmode: manual - aspectratio: - x: 1 - y: 1 - z: 1 - camera: - eye: - x: 1 - y: -1.5 - z: 1.4 - domain: - x: - - 0.7875 - - 1.0 - y: - - 0.0 - - 1.0 - xaxis: - autorange: false - range: - - -1.548792898897935 - - 1.548792898897935 - title: - text: x (m) - yaxis: - autorange: false - range: - - -1.548792898897935 - - 1.548792898897935 - title: - text: y (m) - zaxis: - autorange: false - range: - - -1.548792898897935 - - 1.548792898897935 - title: - text: z (m) - template: - data: - bar: - - error_x: - color: '#2a3f5f' - error_y: - color: '#2a3f5f' - marker: - line: - color: '#E5ECF6' - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: bar - barpolar: - - marker: - line: - color: '#E5ECF6' - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: barpolar - carpet: - - aaxis: - endlinecolor: '#2a3f5f' - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: '#2a3f5f' - baxis: - endlinecolor: '#2a3f5f' - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: '#2a3f5f' - type: carpet - choropleth: - - colorbar: - outlinewidth: 0 - ticks: '' - type: choropleth - contour: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: contour - contourcarpet: - - colorbar: - outlinewidth: 0 - ticks: '' - type: contourcarpet - heatmap: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: heatmap - histogram: - - marker: - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: histogram - histogram2d: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: histogram2d - histogram2dcontour: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: histogram2dcontour - mesh3d: - - colorbar: - outlinewidth: 0 - ticks: '' - type: mesh3d - parcoords: - - line: - colorbar: - outlinewidth: 0 - ticks: '' - type: parcoords - pie: - - automargin: true - type: pie - scatter: - - fillpattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: scatter - scatter3d: - - line: - colorbar: - outlinewidth: 0 - ticks: '' - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatter3d - scattercarpet: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattercarpet - scattergeo: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattergeo - scattergl: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattergl - scattermap: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattermap - scattermapbox: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattermapbox - scatterpolar: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterpolar - scatterpolargl: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterpolargl - scatterternary: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterternary - surface: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: surface - table: - - cells: - fill: - color: '#EBF0F8' - line: - color: white - header: - fill: - color: '#C8D4E3' - line: - color: white - type: table - layout: - annotationdefaults: - arrowcolor: '#2a3f5f' - arrowhead: 0 - arrowwidth: 1 - autotypenumbers: strict - coloraxis: - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - diverging: - - - 0 - - '#8e0152' - - - 0.1 - - '#c51b7d' - - - 0.2 - - '#de77ae' - - - 0.3 - - '#f1b6da' - - - 0.4 - - '#fde0ef' - - - 0.5 - - '#f7f7f7' - - - 0.6 - - '#e6f5d0' - - - 0.7 - - '#b8e186' - - - 0.8 - - '#7fbc41' - - - 0.9 - - '#4d9221' - - - 1 - - '#276419' - sequential: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - sequentialminus: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - colorway: - - '#636efa' - - '#EF553B' - - '#00cc96' - - '#ab63fa' - - '#FFA15A' - - '#19d3f3' - - '#FF6692' - - '#B6E880' - - '#FF97FF' - - '#FECB52' - font: - color: '#2a3f5f' - geo: - bgcolor: white - lakecolor: white - landcolor: '#E5ECF6' - showlakes: true - showland: true - subunitcolor: white - hoverlabel: - align: left - hovermode: closest - mapbox: - style: light - paper_bgcolor: white - plot_bgcolor: '#E5ECF6' - polar: - angularaxis: - gridcolor: white - linecolor: white - ticks: '' - bgcolor: '#E5ECF6' - radialaxis: - gridcolor: white - linecolor: white - ticks: '' - scene: - xaxis: - backgroundcolor: '#E5ECF6' - gridcolor: white - gridwidth: 2 - linecolor: white - showbackground: true - ticks: '' - zerolinecolor: white - yaxis: - backgroundcolor: '#E5ECF6' - gridcolor: white - gridwidth: 2 - linecolor: white - showbackground: true - ticks: '' - zerolinecolor: white - zaxis: - backgroundcolor: '#E5ECF6' - gridcolor: white - gridwidth: 2 - linecolor: white - showbackground: true - ticks: '' - zerolinecolor: white - shapedefaults: - line: - color: '#2a3f5f' - ternary: - aaxis: - gridcolor: white - linecolor: white - ticks: '' - baxis: - gridcolor: white - linecolor: white - ticks: '' - bgcolor: '#E5ECF6' - caxis: - gridcolor: white - linecolor: white - ticks: '' - title: - x: 0.05 - xaxis: - automargin: true - gridcolor: white - linecolor: white - ticks: '' - title: - standoff: 15 - zerolinecolor: white - zerolinewidth: 2 - yaxis: - automargin: true - gridcolor: white - linecolor: white - ticks: '' - title: - standoff: 15 - zerolinecolor: white - zerolinewidth: 2 diff --git a/tests/test_display_plotly/test_pixel_field_color_scales.yml b/tests/test_display_plotly/test_pixel_field_color_scales.yml deleted file mode 100644 index 48f4aeb62..000000000 --- a/tests/test_display_plotly/test_pixel_field_color_scales.yml +++ /dev/null @@ -1,1780 +0,0 @@ -data: -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene - showlegend: true - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#22928b' - - '#22928b' - - '#22928b' - - '#22928b' - - '#22928b' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#472a79' - - '#472a79' - - '#472a79' - - '#472a79' - - '#472a79' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#472a79' - - '#472a79' - - '#472a79' - - '#472a79' - - '#472a79' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#22928b' - - '#22928b' - - '#22928b' - - '#22928b' - - '#22928b' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (Viridis) - opacity: 1 - scene: scene - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== - dtype: f8 -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene2 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#000004' - - '#000004' - - '#000004' - - '#000004' - - '#000004' - - '#bd3a51' - - '#bd3a51' - - '#bd3a51' - - '#bd3a51' - - '#bd3a51' - - '#000004' - - '#000004' - - '#000004' - - '#000004' - - '#000004' - - '#1f0c44' - - '#1f0c44' - - '#1f0c44' - - '#1f0c44' - - '#1f0c44' - - '#fcffa4' - - '#fcffa4' - - '#fcffa4' - - '#fcffa4' - - '#fcffa4' - - '#1f0c44' - - '#1f0c44' - - '#1f0c44' - - '#1f0c44' - - '#1f0c44' - - '#000004' - - '#000004' - - '#000004' - - '#000004' - - '#000004' - - '#bd3a51' - - '#bd3a51' - - '#bd3a51' - - '#bd3a51' - - '#bd3a51' - - '#000004' - - '#000004' - - '#000004' - - '#000004' - - '#000004' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (Inferno) - opacity: 1 - scene: scene2 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== - dtype: f8 -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene3 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - - '#fc8b3a' - - '#fc8b3a' - - '#fc8b3a' - - '#fc8b3a' - - '#fc8b3a' - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - - '#fee7cf' - - '#fee7cf' - - '#fee7cf' - - '#fee7cf' - - '#fee7cf' - - '#7f2704' - - '#7f2704' - - '#7f2704' - - '#7f2704' - - '#7f2704' - - '#fee7cf' - - '#fee7cf' - - '#fee7cf' - - '#fee7cf' - - '#fee7cf' - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - - '#fc8b3a' - - '#fc8b3a' - - '#fc8b3a' - - '#fc8b3a' - - '#fc8b3a' - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - - '#fff5eb' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (Oranges) - opacity: 1 - scene: scene3 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== - dtype: f8 -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene4 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - '#da16ff' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - - '#f565a0' - - '#f565a0' - - '#f565a0' - - '#f565a0' - - '#f565a0' - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - - '#fde1de' - - '#fde1de' - - '#fde1de' - - '#fde1de' - - '#fde1de' - - '#49006a' - - '#49006a' - - '#49006a' - - '#49006a' - - '#49006a' - - '#fde1de' - - '#fde1de' - - '#fde1de' - - '#fde1de' - - '#fde1de' - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - - '#f565a0' - - '#f565a0' - - '#f565a0' - - '#f565a0' - - '#f565a0' - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - - '#fff7f3' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (RdPu) - opacity: 1 - scene: scene4 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5PwEAAAAAAOi/2AIaGSKH7b+W/nLzbjzzv5X+cvNuPPO/1gIaGSKH7b/////////vv8Sx3R3YP/a/XiPCqv2d87+qo4i8WLfuv6qjiLxYt+6/XiPCqv2d879Vjgggux7rvwEAAAAAAOi/1gIaGSKH7b+V/nLzbjzzv5b+cvNuPPO/2AIaGSKH7b/////////vvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvwAAAAAAAPQ/lf5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpA5j2TXvE/aGOVlXF57T9WwJn8zvTkP1bAmfzO9OQ/Z2OVlXF57T/VuPtvonDyPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPPTOn5knqPW/qsjNDMtY+L/rK0S1wVH3v/tx+32N/vO/PdVxJoT38r8ZYsDMsK/kvwAAAAAAAAAAAVVEEw5vzj9gWnUEI8/CP15adQQjz8K/AlVEEw5vzr8AAAAAAAAAAPTOn5knqPU/PdVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8ZYsDMsK/kPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwPxliwMywr+S/WN3IzNOc3r8pqHeVfFzhvwkcCQTlAui/hlUcs/cQ6r/0zp+ZJ6j1vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAABliwMywr+Q/hlUcs/cQ6j8JHAkE5QLoPyqod5V8XOE/Vt3IzNOc3j/0zp+ZJ6j1Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vPPOn5knqPU/PNVxJoT38j/7cft9jf7zP+srRLXBUfc/qsjNDMtY+D8aYsDMsK/kP3MVxiMaZvY/Wr6CdOg99z+XEwTfFpv4P5cTBN8Wm/g/Wr6CdOg99z9EHHhIKcPgP/POn5knqPU/qsjNDMtY+D/rK0S1wVH3P/tx+32N/vM/PNVxJoT38j8aYsDMsK/kPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPwAAAAAAAPQ/lP5y82488T/VAhoZIofpP9UCGhkih+k/lP5y82488T8AAAAAAADwPxpiwMywr+Q/iFUcs/cQ6j8KHAkE5QLoPyqod5V8XOE/WN3IzNOc3j/zzp+ZJ6j1P+DG+LANpdw/PrX1eSMC4D+3X/hOgLziP7df+E6AvOI/PrX1eSMC4D/e8cNba573PxpiwMywr+Q/WN3IzNOc3j8qqHeVfFzhPwocCQTlAug/iFUcs/cQ6j/zzp+ZJ6j1Pw== - dtype: f8 -layout: - legend: - itemsizing: constant - scene: - aspectmode: manual - aspectratio: - x: 1 - y: 1 - z: 1 - camera: - eye: - x: 1 - y: -1.5 - z: 1.4 - domain: - x: - - 0.0 - - 0.2125 - y: - - 0.0 - - 1.0 - xaxis: - autorange: false - range: - - -1.5919715007276833 - - 1.4513845364408429 - title: - text: x (m) - yaxis: - autorange: false - range: - - -1.521678018584263 - - 1.521678018584263 - title: - text: y (m) - zaxis: - autorange: false - range: - - -1.0027462143297536 - - 2.0406098228387726 - title: - text: z (m) - scene2: - aspectmode: manual - aspectratio: - x: 1 - y: 1 - z: 1 - camera: - eye: - x: 1 - y: -1.5 - z: 1.4 - domain: - x: - - 0.2625 - - 0.475 - y: - - 0.0 - - 1.0 - xaxis: - autorange: false - range: - - -1.5919715007276833 - - 1.4513845364408429 - title: - text: x (m) - yaxis: - autorange: false - range: - - -1.521678018584263 - - 1.521678018584263 - title: - text: y (m) - zaxis: - autorange: false - range: - - -1.0027462143297536 - - 2.0406098228387726 - title: - text: z (m) - scene3: - aspectmode: manual - aspectratio: - x: 1 - y: 1 - z: 1 - camera: - eye: - x: 1 - y: -1.5 - z: 1.4 - domain: - x: - - 0.525 - - 0.7375 - y: - - 0.0 - - 1.0 - xaxis: - autorange: false - range: - - -1.5919715007276833 - - 1.4513845364408429 - title: - text: x (m) - yaxis: - autorange: false - range: - - -1.521678018584263 - - 1.521678018584263 - title: - text: y (m) - zaxis: - autorange: false - range: - - -1.0027462143297536 - - 2.0406098228387726 - title: - text: z (m) - scene4: - aspectmode: manual - aspectratio: - x: 1 - y: 1 - z: 1 - camera: - eye: - x: 1 - y: -1.5 - z: 1.4 - domain: - x: - - 0.7875 - - 1.0 - y: - - 0.0 - - 1.0 - xaxis: - autorange: false - range: - - -1.5919715007276833 - - 1.4513845364408429 - title: - text: x (m) - yaxis: - autorange: false - range: - - -1.521678018584263 - - 1.521678018584263 - title: - text: y (m) - zaxis: - autorange: false - range: - - -1.0027462143297536 - - 2.0406098228387726 - title: - text: z (m) - template: - data: - bar: - - error_x: - color: '#2a3f5f' - error_y: - color: '#2a3f5f' - marker: - line: - color: '#E5ECF6' - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: bar - barpolar: - - marker: - line: - color: '#E5ECF6' - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: barpolar - carpet: - - aaxis: - endlinecolor: '#2a3f5f' - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: '#2a3f5f' - baxis: - endlinecolor: '#2a3f5f' - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: '#2a3f5f' - type: carpet - choropleth: - - colorbar: - outlinewidth: 0 - ticks: '' - type: choropleth - contour: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: contour - contourcarpet: - - colorbar: - outlinewidth: 0 - ticks: '' - type: contourcarpet - heatmap: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: heatmap - histogram: - - marker: - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: histogram - histogram2d: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: histogram2d - histogram2dcontour: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: histogram2dcontour - mesh3d: - - colorbar: - outlinewidth: 0 - ticks: '' - type: mesh3d - parcoords: - - line: - colorbar: - outlinewidth: 0 - ticks: '' - type: parcoords - pie: - - automargin: true - type: pie - scatter: - - fillpattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: scatter - scatter3d: - - line: - colorbar: - outlinewidth: 0 - ticks: '' - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatter3d - scattercarpet: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattercarpet - scattergeo: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattergeo - scattergl: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattergl - scattermap: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattermap - scattermapbox: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattermapbox - scatterpolar: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterpolar - scatterpolargl: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterpolargl - scatterternary: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterternary - surface: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: surface - table: - - cells: - fill: - color: '#EBF0F8' - line: - color: white - header: - fill: - color: '#C8D4E3' - line: - color: white - type: table - layout: - annotationdefaults: - arrowcolor: '#2a3f5f' - arrowhead: 0 - arrowwidth: 1 - autotypenumbers: strict - coloraxis: - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - diverging: - - - 0 - - '#8e0152' - - - 0.1 - - '#c51b7d' - - - 0.2 - - '#de77ae' - - - 0.3 - - '#f1b6da' - - - 0.4 - - '#fde0ef' - - - 0.5 - - '#f7f7f7' - - - 0.6 - - '#e6f5d0' - - - 0.7 - - '#b8e186' - - - 0.8 - - '#7fbc41' - - - 0.9 - - '#4d9221' - - - 1 - - '#276419' - sequential: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - sequentialminus: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - colorway: - - '#636efa' - - '#EF553B' - - '#00cc96' - - '#ab63fa' - - '#FFA15A' - - '#19d3f3' - - '#FF6692' - - '#B6E880' - - '#FF97FF' - - '#FECB52' - font: - color: '#2a3f5f' - geo: - bgcolor: white - lakecolor: white - landcolor: '#E5ECF6' - showlakes: true - showland: true - subunitcolor: white - hoverlabel: - align: left - hovermode: closest - mapbox: - style: light - paper_bgcolor: white - plot_bgcolor: '#E5ECF6' - polar: - angularaxis: - gridcolor: white - linecolor: white - ticks: '' - bgcolor: '#E5ECF6' - radialaxis: - gridcolor: white - linecolor: white - ticks: '' - scene: - xaxis: - backgroundcolor: '#E5ECF6' - gridcolor: white - gridwidth: 2 - linecolor: white - showbackground: true - ticks: '' - zerolinecolor: white - yaxis: - backgroundcolor: '#E5ECF6' - gridcolor: white - gridwidth: 2 - linecolor: white - showbackground: true - ticks: '' - zerolinecolor: white - zaxis: - backgroundcolor: '#E5ECF6' - gridcolor: white - gridwidth: 2 - linecolor: white - showbackground: true - ticks: '' - zerolinecolor: white - shapedefaults: - line: - color: '#2a3f5f' - ternary: - aaxis: - gridcolor: white - linecolor: white - ticks: '' - baxis: - gridcolor: white - linecolor: white - ticks: '' - bgcolor: '#E5ECF6' - caxis: - gridcolor: white - linecolor: white - ticks: '' - title: - x: 0.05 - xaxis: - automargin: true - gridcolor: white - linecolor: white - ticks: '' - title: - standoff: 15 - zerolinecolor: white - zerolinewidth: 2 - yaxis: - automargin: true - gridcolor: white - linecolor: white - ticks: '' - title: - standoff: 15 - zerolinecolor: white - zerolinewidth: 2 diff --git a/tests/test_display_plotly/test_pixel_field_directional_symbols.yml b/tests/test_display_plotly/test_pixel_field_directional_symbols.yml deleted file mode 100644 index dbbcf5ada..000000000 --- a/tests/test_display_plotly/test_pixel_field_directional_symbols.yml +++ /dev/null @@ -1,1751 +0,0 @@ -data: -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene - showlegend: true - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (cone) - opacity: 1 - scene: scene - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene2 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABtAG4AbwBwAHEAaABpAGoAawBsAG0AbgBvAHAAcQB0AHUAdgB3AHgAegB7AHwAfQB+AH8AgACBAIIAgwB6AHsAfAB9AH4AfwCAAIEAggCDAIYAhwCIAIkAigCMAI0AjgCPAJAAkQCSAJMAlACVAIwAjQCOAI8AkACRAJIAkwCUAJUAmACZAJoAmwCcAJ4AnwCgAKEAogCjAKQApQCmAKcAngCfAKAAoQCiAKMApAClAKYApwCqAKsArACtAK4AsACxALIAswC0ALUAtgC3ALgAuQCwALEAsgCzALQAtQC2ALcAuAC5ALwAvQC+AL8AwADCAMMAxADFAMYAxwDIAMkAygDLAMIAwwDEAMUAxgDHAMgAyQDKAMsAzgDPANAA0QDSANQA1QDWANcA2ADZANoA2wDcAN0A1ADVANYA1wDYANkA2gDbANwA3QDgAOEA4gDjAOQA5gDnAOgA6QDqAOsA7ADtAO4A7wDmAOcA6ADpAOoA6wDsAO0A7gDvAPIA8wD0APUA9gD4APkA+gD7APwA/QD+AP8AAAEBAfgA+QD6APsA/AD9AP4A/wAAAQEB - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABpAGoAawBsAGgAcgByAHIAcgByAG4AbwBwAHEAbQB1AHYAdwB4AHQAewB8AH0AfgB6AHsAfAB9AH4AegCEAIQAhACEAIQAgACBAIIAgwB/AIcAiACJAIoAhgCNAI4AjwCQAIwAjQCOAI8AkACMAJYAlgCWAJYAlgCSAJMAlACVAJEAmQCaAJsAnACYAJ8AoAChAKIAngCfAKAAoQCiAJ4AqACoAKgAqACoAKQApQCmAKcAowCrAKwArQCuAKoAsQCyALMAtACwALEAsgCzALQAsAC6ALoAugC6ALoAtgC3ALgAuQC1AL0AvgC/AMAAvADDAMQAxQDGAMIAwwDEAMUAxgDCAMwAzADMAMwAzADIAMkAygDLAMcAzwDQANEA0gDOANUA1gDXANgA1ADVANYA1wDYANQA3gDeAN4A3gDeANoA2wDcAN0A2QDhAOIA4wDkAOAA5wDoAOkA6gDmAOcA6ADpAOoA5gDwAPAA8ADwAPAA7ADtAO4A7wDrAPMA9AD1APYA8gD5APoA+wD8APgA+QD6APsA/AD4AAIBAgECAQIBAgH+AP8AAAEBAf0A - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbgBvAHAAcQBuAG8AcABxAG0AaQBqAGsAbABoAHMAcwBzAHMAcwB5AHkAeQB5AHkAfwCAAIEAggCDAIAAgQCCAIMAfwB7AHwAfQB+AHoAhQCFAIUAhQCFAIsAiwCLAIsAiwCRAJIAkwCUAJUAkgCTAJQAlQCRAI0AjgCPAJAAjACXAJcAlwCXAJcAnQCdAJ0AnQCdAKMApAClAKYApwCkAKUApgCnAKMAnwCgAKEAogCeAKkAqQCpAKkAqQCvAK8ArwCvAK8AtQC2ALcAuAC5ALYAtwC4ALkAtQCxALIAswC0ALAAuwC7ALsAuwC7AMEAwQDBAMEAwQDHAMgAyQDKAMsAyADJAMoAywDHAMMAxADFAMYAwgDNAM0AzQDNAM0A0wDTANMA0wDTANkA2gDbANwA3QDaANsA3ADdANkA1QDWANcA2ADUAN8A3wDfAN8A3wDlAOUA5QDlAOUA6wDsAO0A7gDvAOwA7QDuAO8A6wDnAOgA6QDqAOYA8QDxAPEA8QDxAPcA9wD3APcA9wD9AP4A/wAAAQEB/gD/AAABAQH9APkA+gD7APwA+AADAQMBAwEDAQMB - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (arrow3d) - opacity: 1 - scene: scene2 - showlegend: true - type: mesh3d - x: - bdata: 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 - dtype: f8 - y: - bdata: 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 - dtype: f8 - z: - bdata: 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 - dtype: f8 -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene3 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - i: - bdata: S0ACS0xBQUACAAEAVFZWWlpcXFtbV1dVVVNTUlJUXlZWVFRSUlNTVVVXV1dbW1xcWlpeX1hOT1FQXWBZTUZISEpKSUkyNDQsLCAgFhYODhQUHh4pKTI5NDQyMikpHh4UFA4ODhYWICAsLDkLBAw6PggHJz0qMysrHx8VFTA2Ni8vJSUZGREREhIaGiYmMDs2NjAwJiYaGhISERERGRklJS8vOxsFCjg8Bgk3Pxw1LS0jIxcX - dtype: i1 - j: - bdata: TEwDAwMDAQFLSwMDRkZISEpKSUlHR0VFQ0NCQkREWVlRUU9PTU1OTlBQWF1dX19gYF5hYWFhYWFhYWFhYUREQkJDQ0UzMysrHx8VFQ0NExMdHSgoMTE9PT4+OjoqKgwMCAgEBwcLCycnOSIiIiIiIiIiIiIiMTEoKB0dEzU1LS0jIxcXDw8QEBgYJCQuLj8/PDw4OBwcCgoGBgUJCRsbNzc7ISEhISEhISEhISEuLiQkGBgQ - dtype: i1 - k: - bdata: QEFLTEEBQAAAQAACVkhaSlxJW0dXRVVDU0JSRFRGVlFUT1JNU05VUFdYXVtfXGBaXlZZYF1QTU9YX15RTkhCSkNJRUc0KywfIBUWDQ4TFB0eKCkxMjM0PjI6KSoeDBQIDgQHFgsgJyw5ND0nBwgqOgQLOT4MKygfHRUTDTYtLyMlFxkPERASGBokJi4wNTY8MDgmHBoKEgYRBQkZGyU3Lzs2PzcJBhw4BRs7PAotJCMYFxAP - dtype: i1 - legendgroup: Sensor(id=ID) - name: Sensor (arrow) - opacity: 1 - scene: scene3 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5Pw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPA== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vA== - dtype: f8 -- legendgroup: Sensor(id=ID) - line: - color: - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - marker: - color: - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - size: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - dtype: f8 - mode: markers+lines - name: Sensor (arrow) - opacity: 1 - scene: scene3 - showlegend: false - type: scatter3d - x: - bdata: 1bj7b6Jw8r9Vjgggux7rv/TRuS1+WvS/VY4IILse678YXIykA0vnv1WOCCC7Huu/VY4IILse678AAAAAAAD4fwAAAAAAAPi/AAAAAAAA4L8AAAAAAADwvwAAAAAAAOC/////////778AAAAAAADgvwAAAAAAAOC/AAAAAAAA+H/VuPtvonDyv1WOCCC7Huu/9NG5LX5a9L9Vjgggux7rvxhcjKQDS+e/VY4IILse679Vjgggux7rvwAAAAAAAPh/AAAAAAAA4D8AAAAAAADgvzMzMzMzM5O8AAAAAAAA4L8zMzMzMzOTPAAAAAAAAOC/AAAAAAAA4L8AAAAAAAD4fwAAAAAAAOC/AAAAAAAA4D8zMzMzMzOTvAAAAAAAAOA/MzMzMzMzkzwAAAAAAADgPwAAAAAAAOA/AAAAAAAA+H8AAAAAAADgPwAAAAAAAOC/MzMzMzMzk7wAAAAAAADgvzMzMzMzM5M8AAAAAAAA4L8AAAAAAADgvwAAAAAAAPh/VY4IILse6z/VuPtvonDyPxhcjKQDS+c/1bj7b6Jw8j/00bktflr0P9W4+2+icPI/1bj7b6Jw8j8AAAAAAAD4fwAAAAAAAOA/AAAAAAAA+D/////////vPwAAAAAAAPg/AAAAAAAA8D8AAAAAAAD4PwAAAAAAAPg/AAAAAAAA+H9Vjgggux7rP9W4+2+icPI/GFyMpANL5z/VuPtvonDyP/TRuS1+WvQ/1bj7b6Jw8j/VuPtvonDyPwAAAAAAAPh/ - dtype: f8 - y: - bdata: 3vHDW2ue979EHHhIKcPgvzuXFBwnNu2/RBx4SCnD4L9jtPVx7GTxv0QceEgpw+C/RBx4SCnD4L8AAAAAAAD4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+H/e8cNba573P0QceEgpw+A/O5cUHCc27T9EHHhIKcPgP2O09XHsZPE/RBx4SCnD4D9EHHhIKcPgPwAAAAAAAPh/AAAAAAAA8L8AAAAAAADwvwAAAAAAAPC/AAAAAAAA8L8AAAAAAADwvwAAAAAAAPC/AAAAAAAA8L8AAAAAAAD4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+H8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPh/RBx4SCnD4L/e8cNba573v2O09XHsZPG/3vHDW2ue9787lxQcJzbtv97xw1trnve/3vHDW2ue978AAAAAAAD4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+H9EHHhIKcPgP97xw1trnvc/Y7T1cexk8T/e8cNba573PzuXFBwnNu0/3vHDW2ue9z/e8cNba573PwAAAAAAAPh/ - dtype: f8 - z: - bdata: AAAAAAAAmLwAAAAAAACYPDO7o8x9bLc/AAAAAAAAmDwzu6PMfWy3vwAAAAAAAJg8AAAAAAAAmDwAAAAAAAD4fwAAAAAAAKC8AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8MzMzMzMz078AAAAAAACgPAAAAAAAAKA8AAAAAAAA+H8AAAAAAACYvAAAAAAAAJg8M7ujzH1stz8AAAAAAACYPDO7o8x9bLe/AAAAAAAAmDwAAAAAAACYPAAAAAAAAPh/AAAAAAAAoLwAAAAAAACgPDMzMzMzM9O/AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8AAAAAAAAoDwAAAAAAAD4fwAAAAAAAKC8AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8MzMzMzMz078AAAAAAACgPAAAAAAAAKA8AAAAAAAA+H8AAAAAAACgvAAAAAAAAKA8MzMzMzMz078AAAAAAACgPDMzMzMzM9M/AAAAAAAAoDwAAAAAAACgPAAAAAAAAPh/AAAAAAAAmLwAAAAAAACYPDO7o8x9bLc/AAAAAAAAmDwzu6PMfWy3vwAAAAAAAJg8AAAAAAAAmDwAAAAAAAD4fwAAAAAAAKC8AAAAAAAAoDwzMzMzMzPTPwAAAAAAAKA8MzMzMzMz078AAAAAAACgPAAAAAAAAKA8AAAAAAAA+H8AAAAAAACYvAAAAAAAAJg8M7ujzH1stz8AAAAAAACYPDO7o8x9bLe/AAAAAAAAmDwAAAAAAACYPAAAAAAAAPh/ - dtype: f8 -layout: - legend: - itemsizing: constant - scene: - aspectmode: manual - aspectratio: - x: 1 - y: 1 - z: 1 - camera: - eye: - x: 1 - y: -1.5 - z: 1.4 - domain: - x: - - 0.0 - - 0.2888888888888889 - y: - - 0.0 - - 1.0 - xaxis: - autorange: false - range: - - -1.548792898897935 - - 1.548792898897935 - title: - text: x (m) - yaxis: - autorange: false - range: - - -1.548792898897935 - - 1.548792898897935 - title: - text: y (m) - zaxis: - autorange: false - range: - - -1.548792898897935 - - 1.548792898897935 - title: - text: z (m) - scene2: - aspectmode: manual - aspectratio: - x: 1 - y: 1 - z: 1 - camera: - eye: - x: 1 - y: -1.5 - z: 1.4 - domain: - x: - - 0.35555555555555557 - - 0.6444444444444445 - y: - - 0.0 - - 1.0 - xaxis: - autorange: false - range: - - -1.5124847513262898 - - 1.5124847513262898 - title: - text: x (m) - yaxis: - autorange: false - range: - - -1.5124847513262898 - - 1.5124847513262898 - title: - text: y (m) - zaxis: - autorange: false - range: - - -1.5124847513262898 - - 1.5124847513262898 - title: - text: z (m) - scene3: - aspectmode: manual - aspectratio: - x: 1 - y: 1 - z: 1 - camera: - eye: - x: 1 - y: -1.5 - z: 1.4 - domain: - x: - - 0.7111111111111111 - - 1.0 - y: - - 0.0 - - 1.0 - xaxis: - autorange: false - range: - - -1.5 - - 1.5 - title: - text: x (m) - yaxis: - autorange: false - range: - - -1.5 - - 1.5 - title: - text: y (m) - zaxis: - autorange: false - range: - - -1.5 - - 1.5 - title: - text: z (m) - template: - data: - bar: - - error_x: - color: '#2a3f5f' - error_y: - color: '#2a3f5f' - marker: - line: - color: '#E5ECF6' - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: bar - barpolar: - - marker: - line: - color: '#E5ECF6' - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: barpolar - carpet: - - aaxis: - endlinecolor: '#2a3f5f' - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: '#2a3f5f' - baxis: - endlinecolor: '#2a3f5f' - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: '#2a3f5f' - type: carpet - choropleth: - - colorbar: - outlinewidth: 0 - ticks: '' - type: choropleth - contour: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: contour - contourcarpet: - - colorbar: - outlinewidth: 0 - ticks: '' - type: contourcarpet - heatmap: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: heatmap - histogram: - - marker: - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: histogram - histogram2d: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: histogram2d - histogram2dcontour: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: histogram2dcontour - mesh3d: - - colorbar: - outlinewidth: 0 - ticks: '' - type: mesh3d - parcoords: - - line: - colorbar: - outlinewidth: 0 - ticks: '' - type: parcoords - pie: - - automargin: true - type: pie - scatter: - - fillpattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: scatter - scatter3d: - - line: - colorbar: - outlinewidth: 0 - ticks: '' - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatter3d - scattercarpet: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattercarpet - scattergeo: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattergeo - scattergl: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattergl - scattermap: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattermap - scattermapbox: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattermapbox - scatterpolar: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterpolar - scatterpolargl: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterpolargl - scatterternary: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterternary - surface: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: surface - table: - - cells: - fill: - color: '#EBF0F8' - line: - color: white - header: - fill: - color: '#C8D4E3' - line: - color: white - type: table - layout: - annotationdefaults: - arrowcolor: '#2a3f5f' - arrowhead: 0 - arrowwidth: 1 - autotypenumbers: strict - coloraxis: - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - diverging: - - - 0 - - '#8e0152' - - - 0.1 - - '#c51b7d' - - - 0.2 - - '#de77ae' - - - 0.3 - - '#f1b6da' - - - 0.4 - - '#fde0ef' - - - 0.5 - - '#f7f7f7' - - - 0.6 - - '#e6f5d0' - - - 0.7 - - '#b8e186' - - - 0.8 - - '#7fbc41' - - - 0.9 - - '#4d9221' - - - 1 - - '#276419' - sequential: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - sequentialminus: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - colorway: - - '#636efa' - - '#EF553B' - - '#00cc96' - - '#ab63fa' - - '#FFA15A' - - '#19d3f3' - - '#FF6692' - - '#B6E880' - - '#FF97FF' - - '#FECB52' - font: - color: '#2a3f5f' - geo: - bgcolor: white - lakecolor: white - landcolor: '#E5ECF6' - showlakes: true - showland: true - subunitcolor: white - hoverlabel: - align: left - hovermode: closest - mapbox: - style: light - paper_bgcolor: white - plot_bgcolor: '#E5ECF6' - polar: - angularaxis: - gridcolor: white - linecolor: white - ticks: '' - bgcolor: '#E5ECF6' - radialaxis: - gridcolor: white - linecolor: white - ticks: '' - scene: - xaxis: - backgroundcolor: '#E5ECF6' - gridcolor: white - gridwidth: 2 - linecolor: white - showbackground: true - ticks: '' - zerolinecolor: white - yaxis: - backgroundcolor: '#E5ECF6' - gridcolor: white - gridwidth: 2 - linecolor: white - showbackground: true - ticks: '' - zerolinecolor: white - zaxis: - backgroundcolor: '#E5ECF6' - gridcolor: white - gridwidth: 2 - linecolor: white - showbackground: true - ticks: '' - zerolinecolor: white - shapedefaults: - line: - color: '#2a3f5f' - ternary: - aaxis: - gridcolor: white - linecolor: white - ticks: '' - baxis: - gridcolor: white - linecolor: white - ticks: '' - bgcolor: '#E5ECF6' - caxis: - gridcolor: white - linecolor: white - ticks: '' - title: - x: 0.05 - xaxis: - automargin: true - gridcolor: white - linecolor: white - ticks: '' - title: - standoff: 15 - zerolinecolor: white - zerolinewidth: 2 - yaxis: - automargin: true - gridcolor: white - linecolor: white - ticks: '' - title: - standoff: 15 - zerolinecolor: white - zerolinewidth: 2 diff --git a/tests/test_display_plotly/test_pixel_field_null_values.yml b/tests/test_display_plotly/test_pixel_field_null_values.yml deleted file mode 100644 index 9dfad2981..000000000 --- a/tests/test_display_plotly/test_pixel_field_null_values.yml +++ /dev/null @@ -1,1286 +0,0 @@ -data: -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene - showlegend: true - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#423a81' - - '#423a81' - - '#423a81' - - '#423a81' - - '#423a81' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#471f70' - - '#471f70' - - '#471f70' - - '#471f70' - - '#471f70' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#9ed93a' - - '#9ed93a' - - '#9ed93a' - - '#9ed93a' - - '#9ed93a' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#471f70' - - '#471f70' - - '#471f70' - - '#471f70' - - '#471f70' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#b2beb5' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#423a81' - - '#423a81' - - '#423a81' - - '#423a81' - - '#423a81' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAjQCGAIYAhgCKAIoAiACMAIoAhgCJAI0AjgCPAJAAkQCSAJsAlACUAJQAmACYAJYAmgCYAJQAlwCbAJwAnQCeAJ8AoACiAKMApAClAKYAqACpAKoAqwCsAK4ArwCwALEAsgC0ALUAtgC3ALgAugC7ALwAvQC+AMAAwQDCAMMAxADNAMYAxgDGAMoAygDIAMwAygDGAMkAzQDOAM8A0ADRANIA2wDUANQA1ADYANgA1gDaANgA1ADXANsA3ADdAN4A3wDgAOIA4wDkAOUA5gDoAOkA6gDrAOwA7gDvAPAA8QDyAPQA9QD2APcA+AD6APsA/AD9AP4A - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhgCNAIcAiACMAI0AhwCIAIsAiwCIAIgAjwCQAJEAkgCOAJQAmwCVAJYAmgCbAJUAlgCZAJkAlgCWAJ0AngCfAKAAnACjAKQApQCmAKIAqQCqAKsArACoAK8AsACxALIArgC1ALYAtwC4ALQAuwC8AL0AvgC6AMEAwgDDAMQAwADGAM0AxwDIAMwAzQDHAMgAywDLAMgAyADPANAA0QDSAM4A1ADbANUA1gDaANsA1QDWANkA2QDWANYA3QDeAN8A4ADcAOMA5ADlAOYA4gDpAOoA6wDsAOgA7wDwAPEA8gDuAPUA9gD3APgA9AD7APwA/QD+APoA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiQCKAIgAiQCLAIwAiwCLAIYAhwCNAIwAkwCTAJMAkwCTAJcAmACWAJcAmQCaAJkAmQCUAJUAmwCaAKEAoQChAKEAoQCnAKcApwCnAKcArQCtAK0ArQCtALMAswCzALMAswC5ALkAuQC5ALkAvwC/AL8AvwC/AMUAxQDFAMUAxQDJAMoAyADJAMsAzADLAMsAxgDHAM0AzADTANMA0wDTANMA1wDYANYA1wDZANoA2QDZANQA1QDbANoA4QDhAOEA4QDhAOcA5wDnAOcA5wDtAO0A7QDtAO0A8wDzAPMA8wDzAPkA+QD5APkA+QD/AP8A/wD/AP8A - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (True) - opacity: 1 - scene: scene - showlegend: true - type: mesh3d - x: - bdata: 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 - dtype: f8 - y: - bdata: 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 - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThaO/8dhWS+3/v78x1WXPswikvyQGtRsSz7k/rqBD1773uT8AAAAAAACIPCxt1aIYSbm/myaWUE93ur+CJfnuctuhP/OZAhr3+78/6s3Yw26tpT8AAAAAAACYPAIAAAAAAMC/WOkvN+/Go7+j9Jebd+O5P6T0l5t347k/VOkvN+/Go78AAAAAAACQPCxt1aIYSbm/5s3Yw26tpT/zmQIa9/u/P4Yl+e5y26E/miaWUE93ur8AAAAAAACYPLHG3X8ThaO/raBD1773uT8mBrUbEs+5Py3VZc+zCKS/8thWS+3/v78AAAAAAACIPA9CjSPzkKo/kR1huVGVt7/Ap2lNvtu7v3G0qkKjdpk/NndZpO3Kvz8AAAAAAACAvAAAAAAAAMC/AAAAAAAAwL8AAAAAAADAvwAAAAAAAMC/AAAAAAAAwD8AAAAAAADAPwAAAAAAAMA/AAAAAAAAwD8CAAAAAADAv1jpLzfvxqO/o/SXm3fjuT+k9Jebd+O5P1TpLzfvxqO/AAAAAAAAkDwAAAAAAADAvwAAAAAAAMC/AAAAAAAAwL8AAAAAAADAvwAAAAAAAMA/AAAAAAAAwD8AAAAAAADAPwAAAAAAAMA/D0KNI/OQqj82d1mk7cq/P3q0qkKjdpk/v6dpTb7bu7+SHWG5UZW3vwAAAAAAAIC8/P//////vz9I6S8378ajP6v0l5t347m/rPSXm3fjub9E6S8378ajPwAAAAAAAJA8AgAAAAAAwL9Y6S8378ajv6P0l5t347k/pPSXm3fjuT9U6S8378ajvwAAAAAAAJA8AgAAAAAAwL9Y6S8378ajv6P0l5t347k/pPSXm3fjuT9U6S8378ajvwAAAAAAAJA8AgAAAAAAwL9Y6S8378ajv6P0l5t347k/pPSXm3fjuT9U6S8378ajvwAAAAAAAJA8/P//////vz9I6S8378ajP6v0l5t347m/rPSXm3fjub9E6S8378ajPwAAAAAAAJA8D0KNI/OQqj82d1mk7cq/P3q0qkKjdpk/v6dpTb7bu7+SHWG5UZW3vwAAAAAAAIC8AAAAAAAAwL8AAAAAAADAvwAAAAAAAMC/AAAAAAAAwL8AAAAAAADAPwAAAAAAAMA/AAAAAAAAwD8AAAAAAADAPwIAAAAAAMC/WOkvN+/Go7+j9Jebd+O5P6T0l5t347k/VOkvN+/Go78AAAAAAACQPAAAAAAAAMC/AAAAAAAAwL8AAAAAAADAvwAAAAAAAMC/AAAAAAAAwD8AAAAAAADAPwAAAAAAAMA/AAAAAAAAwD8PQo0j85CqP5EdYblRlbe/wKdpTb7bu79xtKpCo3aZPzZ3WaTtyr8/AAAAAAAAgLyxxt1/E4Wjv62gQ9e+97k/Jga1GxLPuT8t1WXPswikv/LYVkvt/7+/AAAAAAAAiDwhbdWiGEm5v/zN2MNuraU//5kCGvf7vz+iJfnuctuhP40mllBPd7q/AAAAAAAAmLwCAAAAAADAv1jpLzfvxqO/o/SXm3fjuT+k9Jebd+O5P1TpLzfvxqO/AAAAAAAAkDwhbdWiGEm5v44mllBPd7q/nSX57nLboT//mQIa9/u/PwDO2MNuraU/AAAAAAAAmLyxxt1/E4Wjv/HYVkvt/7+/MdVlz7MIpL8kBrUbEs+5P66gQ9e+97k/AAAAAAAAiDw= - dtype: f8 -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene2 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#423a81' - - '#423a81' - - '#423a81' - - '#423a81' - - '#423a81' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#471f70' - - '#471f70' - - '#471f70' - - '#471f70' - - '#471f70' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#9ed93a' - - '#9ed93a' - - '#9ed93a' - - '#9ed93a' - - '#9ed93a' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#471f70' - - '#471f70' - - '#471f70' - - '#471f70' - - '#471f70' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#1f9e89' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#472071' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#423a81' - - '#423a81' - - '#423a81' - - '#423a81' - - '#423a81' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#462e7b' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - - '#461567' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYAmACZAJoAmwCcAJ4AnwCgAKEAogCkAKUApgCnAKgAqgCrAKwArQCuALAAsQCyALMAtAC2ALcAuAC5ALoAvAC9AL4AvwDAAMIAwwDEAMUAxgDIAMkAygDLAMwAzgDPANAA0QDSANQA1QDWANcA2ADaANsA3ADdAN4A - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIAmQCaAJsAnACYAJ8AoAChAKIAngClAKYApwCoAKQAqwCsAK0ArgCqALEAsgCzALQAsAC3ALgAuQC6ALYAvQC+AL8AwAC8AMMAxADFAMYAwgDJAMoAywDMAMgAzwDQANEA0gDOANUA1gDXANgA1ADbANwA3QDeANoA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcAnQCdAJ0AnQCdAKMAowCjAKMAowCpAKkAqQCpAKkArwCvAK8ArwCvALUAtQC1ALUAtQC7ALsAuwC7ALsAwQDBAMEAwQDBAMcAxwDHAMcAxwDNAM0AzQDNAM0A0wDTANMA0wDTANkA2QDZANkA2QDfAN8A3wDfAN8A - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (False) - opacity: 1 - scene: scene2 - showlegend: true - type: mesh3d - x: - bdata: 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 - dtype: f8 - y: - bdata: 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 - dtype: f8 - z: - bdata: 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 - dtype: f8 -layout: - legend: - itemsizing: constant - scene: - aspectmode: manual - aspectratio: - x: 1 - y: 1 - z: 1 - camera: - eye: - x: 1 - y: -1.5 - z: 1.4 - domain: - x: - - 0.0 - - 0.45 - y: - - 0.0 - - 1.0 - xaxis: - autorange: false - range: - - -1.288849940910414 - - 1.2677387624450005 - title: - text: x (m) - yaxis: - autorange: false - range: - - -1.2782943516777072 - - 1.2782943516777072 - title: - text: y (m) - zaxis: - autorange: false - range: - - -1.2782943516777072 - - 1.2782943516777072 - title: - text: z (m) - scene2: - aspectmode: manual - aspectratio: - x: 1 - y: 1 - z: 1 - camera: - eye: - x: 1 - y: -1.5 - z: 1.4 - domain: - x: - - 0.55 - - 1.0 - y: - - 0.0 - - 1.0 - xaxis: - autorange: false - range: - - -1.288849940910414 - - 1.2677387624450005 - title: - text: x (m) - yaxis: - autorange: false - range: - - -1.2782943516777072 - - 1.2782943516777072 - title: - text: y (m) - zaxis: - autorange: false - range: - - -1.2782943516777072 - - 1.2782943516777072 - title: - text: z (m) - template: - data: - bar: - - error_x: - color: '#2a3f5f' - error_y: - color: '#2a3f5f' - marker: - line: - color: '#E5ECF6' - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: bar - barpolar: - - marker: - line: - color: '#E5ECF6' - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: barpolar - carpet: - - aaxis: - endlinecolor: '#2a3f5f' - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: '#2a3f5f' - baxis: - endlinecolor: '#2a3f5f' - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: '#2a3f5f' - type: carpet - choropleth: - - colorbar: - outlinewidth: 0 - ticks: '' - type: choropleth - contour: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: contour - contourcarpet: - - colorbar: - outlinewidth: 0 - ticks: '' - type: contourcarpet - heatmap: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: heatmap - histogram: - - marker: - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: histogram - histogram2d: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: histogram2d - histogram2dcontour: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: histogram2dcontour - mesh3d: - - colorbar: - outlinewidth: 0 - ticks: '' - type: mesh3d - parcoords: - - line: - colorbar: - outlinewidth: 0 - ticks: '' - type: parcoords - pie: - - automargin: true - type: pie - scatter: - - fillpattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: scatter - scatter3d: - - line: - colorbar: - outlinewidth: 0 - ticks: '' - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatter3d - scattercarpet: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattercarpet - scattergeo: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattergeo - scattergl: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattergl - scattermap: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattermap - scattermapbox: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattermapbox - scatterpolar: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterpolar - scatterpolargl: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterpolargl - scatterternary: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterternary - surface: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: surface - table: - - cells: - fill: - color: '#EBF0F8' - line: - color: white - header: - fill: - color: '#C8D4E3' - line: - color: white - type: table - layout: - annotationdefaults: - arrowcolor: '#2a3f5f' - arrowhead: 0 - arrowwidth: 1 - autotypenumbers: strict - coloraxis: - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - diverging: - - - 0 - - '#8e0152' - - - 0.1 - - '#c51b7d' - - - 0.2 - - '#de77ae' - - - 0.3 - - '#f1b6da' - - - 0.4 - - '#fde0ef' - - - 0.5 - - '#f7f7f7' - - - 0.6 - - '#e6f5d0' - - - 0.7 - - '#b8e186' - - - 0.8 - - '#7fbc41' - - - 0.9 - - '#4d9221' - - - 1 - - '#276419' - sequential: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - sequentialminus: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - colorway: - - '#636efa' - - '#EF553B' - - '#00cc96' - - '#ab63fa' - - '#FFA15A' - - '#19d3f3' - - '#FF6692' - - '#B6E880' - - '#FF97FF' - - '#FECB52' - font: - color: '#2a3f5f' - geo: - bgcolor: white - lakecolor: white - landcolor: '#E5ECF6' - showlakes: true - showland: true - subunitcolor: white - hoverlabel: - align: left - hovermode: closest - mapbox: - style: light - paper_bgcolor: white - plot_bgcolor: '#E5ECF6' - polar: - angularaxis: - gridcolor: white - linecolor: white - ticks: '' - bgcolor: '#E5ECF6' - radialaxis: - gridcolor: white - linecolor: white - ticks: '' - scene: - xaxis: - backgroundcolor: '#E5ECF6' - gridcolor: white - gridwidth: 2 - linecolor: white - showbackground: true - ticks: '' - zerolinecolor: white - yaxis: - backgroundcolor: '#E5ECF6' - gridcolor: white - gridwidth: 2 - linecolor: white - showbackground: true - ticks: '' - zerolinecolor: white - zaxis: - backgroundcolor: '#E5ECF6' - gridcolor: white - gridwidth: 2 - linecolor: white - showbackground: true - ticks: '' - zerolinecolor: white - shapedefaults: - line: - color: '#2a3f5f' - ternary: - aaxis: - gridcolor: white - linecolor: white - ticks: '' - baxis: - gridcolor: white - linecolor: white - ticks: '' - bgcolor: '#E5ECF6' - caxis: - gridcolor: white - linecolor: white - ticks: '' - title: - x: 0.05 - xaxis: - automargin: true - gridcolor: white - linecolor: white - ticks: '' - title: - standoff: 15 - zerolinecolor: white - zerolinewidth: 2 - yaxis: - automargin: true - gridcolor: white - linecolor: white - ticks: '' - title: - standoff: 15 - zerolinecolor: white - zerolinewidth: 2 diff --git a/tests/test_display_plotly/test_pixel_field_sizing_modes.yml b/tests/test_display_plotly/test_pixel_field_sizing_modes.yml deleted file mode 100644 index adcd92af0..000000000 --- a/tests/test_display_plotly/test_pixel_field_sizing_modes.yml +++ /dev/null @@ -1,1449 +0,0 @@ -data: -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene - showlegend: true - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - '#e15f99' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (constant) - opacity: 1 - scene: scene - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P78TF+nHn+2/Z6v1/YNs8r9DTIw81Q72v0AWkvEssfS/YgRLD8I28L9Vjgggux7rvwAAAAAAAPi/AAAAAAAA+L8AAAAAAAD4vwAAAAAAAPi/AAAAAAAA+L8AAAAAAADgv78TF+nHn+2/YgRLD8I28L9AFpLxLLH0v0NMjDzVDva/Z6v1/YNs8r9Vjgggux7rvwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D/////////fP////////98/AAAAAAAA4D8AAAAAAADgvyF2dAscMPE/PPdp4XuS7z+B09scpp3mP3pn54ZV4uM/MqkUBPgm6z/VuPtvonDyPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAD4PyF2dAscMPE/MqkUBPgm6z96Z+eGVeLjP4DT2xymneY/PPdp4XuS7z/VuPtvonDyPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPNqyEBDbx/i/cX0tDb2f978/BCRczHX2vxCxYkHH5fa/utMOEO1U+L9EHHhIKcPgvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAANqyEBDbx/g/utMOEO1U+D8QsWJBx+X2Pz8EJFzMdfY/cX0tDb2f9z9EHHhIKcPgPwAAAAAAAPC/wOouezxk6L9oqeI+N0zrv0yrjmDkWfK/oIpowuHN878AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/oIpowuHN8z9Mq45g5FnyP2mp4j43TOs/wOouezxk6D8AAAAAAADwP5Y0vb+T4Ny/FrHEv0us3r/gnTp9cTTiv4L3t0dnFOO/HgWl5YXA4L/e8cNba573vwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAJY0vb+T4Nw/HgWl5YXA4D+C97dHZxTjP+CdOn1xNOI/FrHEv0us3j/e8cNba573Pw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPPz//////88/SOkvN+/Gsz+r9Jebd+PJv6z0l5t348m/ROkvN+/Gsz8AAAAAAACgPLHG3X8ThbO/raBD1773yT8mBrUbEs/JPy3VZc+zCLS/8thWS+3/z78AAAAAAACYPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPLHG3X8ThbO/8dhWS+3/z78x1WXPswi0vyQGtRsSz8k/rqBD1773yT8AAAAAAACYPA== - dtype: f8 -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene2 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - '#1ca71c' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (log) - opacity: 1 - scene: scene2 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P2yOkLu35+6/PRjq5fId8b9H9mtyqcryv7BpE/yHKfK/n+W43TsZ8L/JighgTsDtvwWRxrHDcPW/BZHGscNw9b8Gkcaxw3D1vwaRxrHDcPW/BZHGscNw9b/23XKceB7lv2yOkLu35+6/n+W43TsZ8L+waRP8hynyv0f2a3KpyvK/PRjq5fId8b/JighgTsDtv0oyfKGlUtE/STJ8oaVS0T9JMnyhpVLRP0kyfKGlUtE/STJ8oaVS0T9JMnyhpVLRv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgP0oyfKGlUtE/STJ8oaVS0T9JMnyhpVLRP0kyfKGlUtE/STJ8oaVS0T9JMnyhpVLRv8q4NyIkjPA/wjSORIjN7z+gLNkH8KzrP3ITKButauo/hc8rNBrE7T+cuvvP2B/xP/bdcpx4HuU/9t1ynHge5T/13XKceB7lP/Xdcpx4HuU/9t1ynHge5T8Fkcaxw3D1P8q4NyIkjPA/hs8rNBrE7T9yEygbrWrqP58s2QfwrOs/wjSORIjN7z+cuvvP2B/xPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPBK0dPrdC/S/5uYGtWiD87+a5dFgHPryv1tUmMm2LfO/aLAtmefW878RMfjRZfrovwAAAAAAAAAAHgNcCGSyxD/qJO7PK5W5P+ck7s8rlbm/HwNcCGSyxL8AAAAAAAAAABK0dPrdC/Q/aLAtmefW8z9bVJjJti3zP5rl0WAc+vI/5uYGtWiD8z8RMfjRZfroPwAAAAAAAPC/2zjfmpnh67/5oDtQWHTtv4Mv4tfTRfG/k2OQMjMP8r8AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/kmOQMjMP8j+EL+LX00XxP/mgO1BYdO0/2zjfmpnh6z8AAAAAAADwP9yXFgtE6Oe/MJ+kzTBS6L9KV89skqTpv8w0XD7HC+q/MzLylS756L945wMXzYLzvwAAAAAAAAAAHgNcCGSyxD/qJO7PK5W5P+ck7s8rlbm/HwNcCGSyxL8AAAAAAAAAANyXFgtE6Oc/MzLylS756D/MNFw+xwvqP0pXz2ySpOk/MJ+kzTBS6D945wMXzYLzPw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vL6pu/+M/aG/xXLTBRV+vb/7Rmss3Xaivz9DlJxmybc/1KdSf+Putz+O2HeynB6GPBhEGscOw8W/JIELwDTmqr9NApCTFJvBP04CkJMUm8E/H4ELwDTmqr8VRBrHDsOVPL6pu/+M/aG/0qdSf+Putz9BQ5ScZsm3P/dGayzddqK/xnLTBRV+vb+O2HeynB6GPEcyfKGlUsE/h/G7b4ZppT8UK1rZaAe8vxUrWtloB7y/g/G7b4ZppT9JMnyhpVKRPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPEcyfKGlUsE/h/G7b4ZppT8UK1rZaAe8vxUrWtloB7y/g/G7b4ZppT9JMnyhpVKRPL6pu/+M/aG/0qdSf+Putz9BQ5ScZsm3P/dGayzddqK/xnLTBRV+vb+O2HeynB6GPBhEGscOw8W/JIELwDTmqr9NApCTFJvBP04CkJMUm8E/H4ELwDTmqr8VRBrHDsOVPL6pu/+M/aG/xXLTBRV+vb/7Rmss3Xaivz9DlJxmybc/1KdSf+Putz+O2HeynB6GPA== - dtype: f8 -- color: '#2e91e5' - colorscale: - - - 0.0 - - '#00b050' - - - 0.16 - - '#00b050' - - - 0.26 - - '#dddddd' - - - 0.74 - - '#dddddd' - - - 0.8400000000000001 - - '#e71111' - - - 1.0 - - '#e71111' - i: - bdata: BwAAAAQEAgYEAAMH - dtype: i1 - intensity: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAADwPw== - dtype: f8 - j: - bdata: AAcBAgYHAQIFBQIC - dtype: i1 - k: - bdata: AwQCAwUGBQUAAQcG - dtype: i1 - legendgroup: Cuboid(id=ID) - name: Cuboid (1m|1m|1m) - opacity: 0.2 - scene: scene3 - showlegend: false - showscale: false - type: mesh3d - x: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 - y: - bdata: AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgvw== - dtype: f8 - z: - bdata: AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPw== - dtype: f8 -- facecolor: - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - red - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - green - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - '#fb0d0d' - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - blue - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#fde725' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#450e60' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#45327d' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - - '#440154' - i: - bdata: SwBAAAIASwBMAEEAQQBAAAIAAAABAAAAVABWAFYAWgBaAFwAXABbAFsAVwBXAFUAVQBTAFMAUgBSAFQAXgBWAFYAVABUAFIAUgBTAFMAVQBVAFcAVwBXAFsAWwBcAFwAWgBaAF4AXwBYAE4ATwBRAFAAXQBgAFkATQBGAEgASABKAEoASQBJADIANAA0ACwALAAgACAAFgAWAA4ADgAUABQAHgAeACkAKQAyADkANAA0ADIAMgApACkAHgAeABQAFAAOAA4ADgAWABYAIAAgACwALAA5AAsABAAMADoAPgAIAAcAJwA9ACoAMwArACsAHwAfABUAFQAwADYANgAvAC8AJQAlABkAGQARABEAEgASABoAGgAmACYAMAA7ADYANgAwADAAJgAmABoAGgASABIAEQARABEAGQAZACUAJQAvAC8AOwAbAAUACgA4ADwABgAJADcAPwAcADUALQAtACMAIwAXABcAYgBjAGQAZQBmAGgAaQBqAGsAbABuAG8AcABxAHIAdAB1AHYAdwB4AHoAewB8AH0AfgCAAIEAggCDAIQAhgCHAIgAiQCKAIwAjQCOAI8AkACSAJMAlACVAJYA - dtype: i2 - j: - bdata: TABMAAMAAwADAAMAAQABAEsASwADAAMARgBGAEgASABKAEoASQBJAEcARwBFAEUAQwBDAEIAQgBEAEQAWQBZAFEAUQBPAE8ATQBNAE4ATgBQAFAAWABdAF0AXwBfAGAAYABeAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQBEAEQAQgBCAEMAQwBFADMAMwArACsAHwAfABUAFQANAA0AEwATAB0AHQAoACgAMQAxAD0APQA+AD4AOgA6ACoAKgAMAAwACAAIAAQABwAHAAsACwAnACcAOQAiACIAIgAiACIAIgAiACIAIgAiACIAMQAxACgAKAAdAB0AEwA1ADUALQAtACMAIwAXABcADwAPABAAEAAYABgAJAAkAC4ALgA/AD8APAA8ADgAOAAcABwACgAKAAYABgAFAAkACQAbABsANwA3ADsAIQAhACEAIQAhACEAIQAhACEAIQAhAC4ALgAkACQAGAAYABAAYwBkAGUAZgBiAGkAagBrAGwAaABvAHAAcQByAG4AdQB2AHcAeAB0AHsAfAB9AH4AegCBAIIAgwCEAIAAhwCIAIkAigCGAI0AjgCPAJAAjACTAJQAlQCWAJIA - dtype: i2 - k: - bdata: QABBAEsATABBAAEAQAAAAAAAQAAAAAIAVgBIAFoASgBcAEkAWwBHAFcARQBVAEMAUwBCAFIARABUAEYAVgBRAFQATwBSAE0AUwBOAFUAUABXAFgAXQBbAF8AXABgAFoAXgBWAFkAYABdAFAATQBPAFgAXwBeAFEATgBIAEIASgBDAEkARQBHADQAKwAsAB8AIAAVABYADQAOABMAFAAdAB4AKAApADEAMgAzADQAPgAyADoAKQAqAB4ADAAUAAgADgAEAAcAFgALACAAJwAsADkANAA9ACcABwAIACoAOgAEAAsAOQA+AAwAKwAoAB8AHQAVABMADQA2AC0ALwAjACUAFwAZAA8AEQAQABIAGAAaACQAJgAuADAANQA2ADwAMAA4ACYAHAAaAAoAEgAGABEABQAJABkAGwAlADcALwA7ADYAPwA3AAkABgAcADgABQAbADsAPAAKAC0AJAAjABgAFwAQAA8AZwBnAGcAZwBnAG0AbQBtAG0AbQBzAHMAcwBzAHMAeQB5AHkAeQB5AH8AfwB/AH8AfwCFAIUAhQCFAIUAiwCLAIsAiwCLAJEAkQCRAJEAkQCXAJcAlwCXAJcA - dtype: i2 - legendgroup: Sensor(id=ID) - name: Sensor (linear) - opacity: 1 - scene: scene3 - showlegend: true - type: mesh3d - x: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeqslmXrSOv3Iw/5jCeY2/cjD/mMJ5jb9h3i7/UluKv+IzETPNTYm/x974ywgehL/H3vjLCB6Ev1463ssaSHu/E2Y1ASi9d78AAAAAAAAAAGBgKzM8eHS/AAAAAAAAAAAAAAAAAAAAAAOYeRmyPnO/A5h5GbI+c78AAAAAAAAAAIVxE7NJGXC/AAAAAAAAAADjmYuZb4ZuvwAAAAAAAAAAAAAAAAAAAAB1iH1M4Xpkv3WIfUzhemS/t+ZXgNZ8Yb+35leA1nxhvwAAAAAAAAAAHD7qssbHUL8AAAAAAAAAAMGU3mXDT0e/AfXF////Z7xkTlOzrgdmvAAAAAAAAAAAAAAAAAAAAACDfh8zVXNMP4N+HzNVc0w/nYSr/18/Wz8AAAAAAAAAAK+teObRV2M/Ig7lGX1VZT8AAAAAAAAAADT3cGammGU/AAAAAAAAAAAAAAAAAAAAAIg0vsyOYG8/iDS+zI5gbz8AAAAAAAAAACX4nxlCA3M/AAAAAAAAAABvngeAKXVzPwAAAAAAAAAAmGwQM+F6dD/DZY2y6YV5P8NljbLphXk/P16CMhFfgz9UMqOZ09eEP6sC9TPj14k/qwL1M+PXiT+41awzvi+NP9gpbM0xvI0/5aKYzFG4jj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj+bmZmZmZm5P+gO76zh1u+/5iMtI/Mp8L8E13vz12jwvx1HZ4A0UfC/gMe2r7MD8L/PkoAni6vvvxmZey4NnvG/GZl7Lg2e8b8ZmXsuDZ7xvxmZey4NnvG/GZl7Lg2e8b/PzQij5cPsv+gO76zh1u+/gMe2r7MD8L8dR2eANFHwvwTXe/PXaPC/5iMtI/Mp8L/PkoAni6vvv4uRuefS4Kk/ipG559LgqT+Jkbnn0uCpP4mRuefS4Kk/ipG559LgqT+Kkbnn0uCpv////////9+/AAAAAAAA4L8AAAAAAADgvwAAAAAAAOC/AAAAAAAA4L8AAAAAAADgP4uRuefS4Kk/ipG559LgqT+Jkbnn0uCpP4mRuefS4Kk/ipG559LgqT+Kkbnn0uCpv4x4iCmPFPA/AXGSoJj47z/GcTH/ll3vP/hRCBlQLu8/NbiluRms7z+Ytj9sOirwP8/NCKPlw+w/z80Io+XD7D/PzQij5cPsP8/NCKPlw+w/z80Io+XD7D8ZmXsuDZ7xP4x4iCmPFPA/NbiluRms7z/4UQgZUC7vP8ZxMf+WXe8/AXGSoJj47z+Ytj9sOirwPw== - dtype: f8 - y: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxMCsxlFT3G/EwKzGUVPcT8RV7+z7PKyPxFXv7Ps8rI/iNZ65nQ3h7+I1nrmdDeHPxFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAACqYFZquBFy/KpgVmq4EXD8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAADzaoSZd7xxv/NqhJl3vHE/7XSDzEVojr/tdIPMRWiOPwAAAAAAAAAAEVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAACbmZmZmZm5PwAAAAAAAAAAAAAAAAAAAADfhcOZOit0v9+Fw5k6K3Q/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAMsjD80dVGq/yyMPzR1Uaj8AAAAAAAAAABFXv7Ps8rI/AAAAAAAAAAARV7+z7PKyPwAAAAAAAAAAAAAAAAAAAAD46wQzo/GLv/jrBDOj8Ys/EVe/s+zysj8RV7+z7PKyP4QVW8zFm4C/hBVbzMWbgD8RV7+z7PKyPxFXv7Ps8rI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKq7ysygcDK/GketM+wegD/bT/szIBeBv9qaf80Ys4s/4uN1AKktjL9WR8OZaARbv+61Cpq/A10/q/zyTBOacb/BkPNMGN5xP+DYjhmbNnS/uwfFmfsedD8eTRya5XuOP2Kyy5noUY6/7mOLzMK7ar/IVhhmVutpP3gskc0/ARG/JTJf5gOXhz9IihpmztWGv90wsBmUaXI/bzuS5mYzcL817tAZs+JmPI5qty73l/C/pR14V/KD8L9oMXvzzW/wv5odn/dfd/C/k5kiHjKQ8L+wn9T5SPjuvwAAAAAAAAAAOsnC9pScqD9XEkqQ8mueP1MSSpDya56/OsnC9pScqL8AAAAAAAAAAI5qty73l/A/k5kiHjKQ8D+aHZ/3X3fwP2gxe/PNb/A/pR14V/KD8D+wn9T5SPjuPwAAAAAAAPC/tulJWBs777+31741UIbvvyWUIOXXPPC/JQvbU3Ji8L8AAAAAAADwvwAAAAAAAAAA/1REEw5vzj9fWnUEI8/CP11adQQjz8K/AFVEEw5vzr8AAAAAAAAAAAAAAAAAAPA/JQvbU3Ji8D8llCDl1zzwP7fXvjVQhu8/tulJWBs77z8AAAAAAADwP+QqkaIR0O6/2sy6w5vf7r/MxMEQQBHvvy+dCRlkIO+/tcQPURv47r8osBWD24PwvwAAAAAAAAAAOsnC9pScqD9XEkqQ8mueP1MSSpDya56/OsnC9pScqL8AAAAAAAAAAOQqkaIR0O4/tcQPURv47j8vnQkZZCDvP8zEwRBAEe8/2sy6w5vf7j8osBWD24PwPw== - dtype: f8 - z: - bdata: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfDpyZZCg/vxFXv7Ps8rI/EVe/s+zysj9jnXgA449/P9VQdDNUa4G/EVe/s+zysj8RV7+z7PKyP8oiycx+hos/MD5D/5ZVjL8AAAAAAAAAACPJF4CH0CQ/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAL3g1RmZUWm/AAAAAAAAAAB9t7yZ1U9rPwAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/EVe/s+zysj8RV7+z7PKyPwAAAAAAAAAAJ+1jZrULdL8AAAAAAAAAAPcrkhmKRXQ/m5mZmZmZuT9L+sjML/BMvAAAAAAAAAAAAAAAAAAAAAARV7+z7PKyPxFXv7Ps8rI/pqjQzNWHjj8AAAAAAAAAAJefgWZvDXK/HVG8M+NAjr8AAAAAAAAAADOchxnrZnE/AAAAAAAAAAAAAAAAAAAAABFXv7Ps8rI/EVe/s+zysj8AAAAAAAAAAGPunDL2cl6/AAAAAAAAAAClRRZmKo9ZPwAAAAAAAAAAEVe/s+zysj8RV7+z7PKyPxFXv7Ps8rI/VQbe5bPXhz8V0XAAPZGGvxFXv7Ps8rI/EVe/s+zysj87qujMXytzP40A9v9s3W6/EVe/s+zysj8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUmP5nvto6/JTZuZnomir/S/hbM94aJv8l98AAkkXq/qNZ05mJ4eL8CBm+Zi1Vzv7cQqEwEJ3O/WO4xgEDwZL9LtNsZoARkvx3uE2fUWko/ECNlzJuKTj+jBT+a9GdeP3IOvGYfxGM/UitmM3AIbz/DLaiZU7dvPy7tc2ZwenQ/93Pu5aOtgz+M+XLMnYyEP9ApN//eTo0/BoeZMv6hjT9GHlaZxtY9vD5M2x82HXW/WmBbIYBOkb+NiS6Tlqt1v9Wbt7Wz6os/tA+E5rIWjD83nt1ez/VZPI2RuefS4Km/ca2wjLv8j78a9AhXmO+kPxv0CFeY76Q/a62wjLv8j7+Kkbnn0uB5PD5M2x82HXW/sQ+E5rIWjD/Xm7e1s+qLP4mJLpOWq3W/WmBbIYBOkb83nt1ez/VZPIeRuefS4Jk/V62wjLv8fz8g9AhXmO+UvyH0CFeY75S/Ua2wjLv8fz+Kkbnn0uBpPAIAAAAAANC/WOkvN+/Gs7+j9Jebd+PJP6T0l5t348k/VOkvN+/Gs78AAAAAAACgPIeRuefS4Jk/V62wjLv8fz8g9AhXmO+UvyH0CFeY75S/Ua2wjLv8fz+Kkbnn0uBpPD5M2x82HXW/sQ+E5rIWjD/Xm7e1s+qLP4mJLpOWq3W/WmBbIYBOkb83nt1ez/VZPI2RuefS4Km/ca2wjLv8j78a9AhXmO+kPxv0CFeY76Q/a62wjLv8j7+Kkbnn0uB5PD5M2x82HXW/WmBbIYBOkb+NiS6Tlqt1v9Wbt7Wz6os/tA+E5rIWjD83nt1ez/VZPA== - dtype: f8 -layout: - legend: - itemsizing: constant - scene: - aspectmode: manual - aspectratio: - x: 1 - y: 1 - z: 1 - camera: - eye: - x: 1 - y: -1.5 - z: 1.4 - domain: - x: - - 0.0 - - 0.2888888888888889 - y: - - 0.0 - - 1.0 - xaxis: - autorange: false - range: - - -1.548792898897935 - - 1.548792898897935 - title: - text: x (m) - yaxis: - autorange: false - range: - - -1.548792898897935 - - 1.548792898897935 - title: - text: y (m) - zaxis: - autorange: false - range: - - -1.548792898897935 - - 1.548792898897935 - title: - text: z (m) - scene2: - aspectmode: manual - aspectratio: - x: 1 - y: 1 - z: 1 - camera: - eye: - x: 1 - y: -1.5 - z: 1.4 - domain: - x: - - 0.35555555555555557 - - 0.6444444444444445 - y: - - 0.0 - - 1.0 - xaxis: - autorange: false - range: - - -1.340030378757605 - - 1.340030378757605 - title: - text: x (m) - yaxis: - autorange: false - range: - - -1.340030378757605 - - 1.340030378757605 - title: - text: y (m) - zaxis: - autorange: false - range: - - -1.340030378757605 - - 1.340030378757605 - title: - text: z (m) - scene3: - aspectmode: manual - aspectratio: - x: 1 - y: 1 - z: 1 - camera: - eye: - x: 1 - y: -1.5 - z: 1.4 - domain: - x: - - 0.7111111111111111 - - 1.0 - y: - - 0.0 - - 1.0 - xaxis: - autorange: false - range: - - -1.1010867896780552 - - 1.1010867896780552 - title: - text: x (m) - yaxis: - autorange: false - range: - - -1.1010867896780552 - - 1.1010867896780552 - title: - text: y (m) - zaxis: - autorange: false - range: - - -1.1010867896780552 - - 1.1010867896780552 - title: - text: z (m) - template: - data: - bar: - - error_x: - color: '#2a3f5f' - error_y: - color: '#2a3f5f' - marker: - line: - color: '#E5ECF6' - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: bar - barpolar: - - marker: - line: - color: '#E5ECF6' - width: 0.5 - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: barpolar - carpet: - - aaxis: - endlinecolor: '#2a3f5f' - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: '#2a3f5f' - baxis: - endlinecolor: '#2a3f5f' - gridcolor: white - linecolor: white - minorgridcolor: white - startlinecolor: '#2a3f5f' - type: carpet - choropleth: - - colorbar: - outlinewidth: 0 - ticks: '' - type: choropleth - contour: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: contour - contourcarpet: - - colorbar: - outlinewidth: 0 - ticks: '' - type: contourcarpet - heatmap: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: heatmap - histogram: - - marker: - pattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: histogram - histogram2d: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: histogram2d - histogram2dcontour: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: histogram2dcontour - mesh3d: - - colorbar: - outlinewidth: 0 - ticks: '' - type: mesh3d - parcoords: - - line: - colorbar: - outlinewidth: 0 - ticks: '' - type: parcoords - pie: - - automargin: true - type: pie - scatter: - - fillpattern: - fillmode: overlay - size: 10 - solidity: 0.2 - type: scatter - scatter3d: - - line: - colorbar: - outlinewidth: 0 - ticks: '' - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatter3d - scattercarpet: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattercarpet - scattergeo: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattergeo - scattergl: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattergl - scattermap: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattermap - scattermapbox: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scattermapbox - scatterpolar: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterpolar - scatterpolargl: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterpolargl - scatterternary: - - marker: - colorbar: - outlinewidth: 0 - ticks: '' - type: scatterternary - surface: - - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - type: surface - table: - - cells: - fill: - color: '#EBF0F8' - line: - color: white - header: - fill: - color: '#C8D4E3' - line: - color: white - type: table - layout: - annotationdefaults: - arrowcolor: '#2a3f5f' - arrowhead: 0 - arrowwidth: 1 - autotypenumbers: strict - coloraxis: - colorbar: - outlinewidth: 0 - ticks: '' - colorscale: - diverging: - - - 0 - - '#8e0152' - - - 0.1 - - '#c51b7d' - - - 0.2 - - '#de77ae' - - - 0.3 - - '#f1b6da' - - - 0.4 - - '#fde0ef' - - - 0.5 - - '#f7f7f7' - - - 0.6 - - '#e6f5d0' - - - 0.7 - - '#b8e186' - - - 0.8 - - '#7fbc41' - - - 0.9 - - '#4d9221' - - - 1 - - '#276419' - sequential: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - sequentialminus: - - - 0.0 - - '#0d0887' - - - 0.1111111111111111 - - '#46039f' - - - 0.2222222222222222 - - '#7201a8' - - - 0.3333333333333333 - - '#9c179e' - - - 0.4444444444444444 - - '#bd3786' - - - 0.5555555555555556 - - '#d8576b' - - - 0.6666666666666666 - - '#ed7953' - - - 0.7777777777777778 - - '#fb9f3a' - - - 0.8888888888888888 - - '#fdca26' - - - 1.0 - - '#f0f921' - colorway: - - '#636efa' - - '#EF553B' - - '#00cc96' - - '#ab63fa' - - '#FFA15A' - - '#19d3f3' - - '#FF6692' - - '#B6E880' - - '#FF97FF' - - '#FECB52' - font: - color: '#2a3f5f' - geo: - bgcolor: white - lakecolor: white - landcolor: '#E5ECF6' - showlakes: true - showland: true - subunitcolor: white - hoverlabel: - align: left - hovermode: closest - mapbox: - style: light - paper_bgcolor: white - plot_bgcolor: '#E5ECF6' - polar: - angularaxis: - gridcolor: white - linecolor: white - ticks: '' - bgcolor: '#E5ECF6' - radialaxis: - gridcolor: white - linecolor: white - ticks: '' - scene: - xaxis: - backgroundcolor: '#E5ECF6' - gridcolor: white - gridwidth: 2 - linecolor: white - showbackground: true - ticks: '' - zerolinecolor: white - yaxis: - backgroundcolor: '#E5ECF6' - gridcolor: white - gridwidth: 2 - linecolor: white - showbackground: true - ticks: '' - zerolinecolor: white - zaxis: - backgroundcolor: '#E5ECF6' - gridcolor: white - gridwidth: 2 - linecolor: white - showbackground: true - ticks: '' - zerolinecolor: white - shapedefaults: - line: - color: '#2a3f5f' - ternary: - aaxis: - gridcolor: white - linecolor: white - ticks: '' - baxis: - gridcolor: white - linecolor: white - ticks: '' - bgcolor: '#E5ECF6' - caxis: - gridcolor: white - linecolor: white - ticks: '' - title: - x: 0.05 - xaxis: - automargin: true - gridcolor: white - linecolor: white - ticks: '' - title: - standoff: 15 - zerolinecolor: white - zerolinewidth: 2 - yaxis: - automargin: true - gridcolor: white - linecolor: white - ticks: '' - title: - standoff: 15 - zerolinecolor: white - zerolinewidth: 2 From 3cf7e5cafb7638554066205b7b7fdc646ca394b9 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 20 May 2025 21:56:02 +0200 Subject: [PATCH 172/211] add chrome for kaleido --- .readthedocs.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 598a3a98b..fbac0fd2e 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -11,6 +11,10 @@ build: # for pyvista - libgl1-mesa-dev commands: + - wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | gpg --dearmor > /usr/share/keyrings/google-linux-signing-keyring.gpg + - echo "deb [arch=amd64 signed-by=/usr/share/keyrings/google-linux-signing-keyring.gpg] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list + - apt-get update + - apt-get install -y google-chrome-stable - asdf plugin add uv - asdf install uv latest - asdf global uv latest From ccfe8e147246bf002e4e609513b1836342dccc9a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 20 May 2025 19:56:22 +0000 Subject: [PATCH 173/211] style: pre-commit fixes --- .readthedocs.yaml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index fbac0fd2e..e39e91b5c 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -11,8 +11,12 @@ build: # for pyvista - libgl1-mesa-dev commands: - - wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | gpg --dearmor > /usr/share/keyrings/google-linux-signing-keyring.gpg - - echo "deb [arch=amd64 signed-by=/usr/share/keyrings/google-linux-signing-keyring.gpg] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list + - wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | gpg + --dearmor > /usr/share/keyrings/google-linux-signing-keyring.gpg + - echo "deb [arch=amd64 + signed-by=/usr/share/keyrings/google-linux-signing-keyring.gpg] + http://dl.google.com/linux/chrome/deb/ stable main" > + /etc/apt/sources.list.d/google-chrome.list - apt-get update - apt-get install -y google-chrome-stable - asdf plugin add uv From 31482cc29a7614909377928230327a8c9e9ca0a3 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 20 May 2025 22:06:10 +0200 Subject: [PATCH 174/211] pin kaleido --- .readthedocs.yaml | 8 -------- pyproject.toml | 3 +-- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index e39e91b5c..598a3a98b 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -11,14 +11,6 @@ build: # for pyvista - libgl1-mesa-dev commands: - - wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | gpg - --dearmor > /usr/share/keyrings/google-linux-signing-keyring.gpg - - echo "deb [arch=amd64 - signed-by=/usr/share/keyrings/google-linux-signing-keyring.gpg] - http://dl.google.com/linux/chrome/deb/ stable main" > - /etc/apt/sources.list.d/google-chrome.list - - apt-get update - - apt-get install -y google-chrome-stable - asdf plugin add uv - asdf install uv latest - asdf global uv latest diff --git a/pyproject.toml b/pyproject.toml index 78fd4962e..204b26799 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,7 +59,7 @@ docs = [ "pyvista", "magpylib-material-response", "magpylib-force", - "kaleido==1.0.0rc13", + "kaleido==0.2.1.post1", ] test = [ "pytest>=7.4", @@ -71,7 +71,6 @@ test = [ "imageio[tifffile, ffmpeg]", "jupyterlab", "anywidget", - "kaleido==1.0.0rc13", ] binder = [ "jupytext", From 2668c89b0a7ed16d5288127b3aa84b7b34567405 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 20 May 2025 22:11:02 +0200 Subject: [PATCH 175/211] update --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 204b26799..afe40ecfc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,7 +59,7 @@ docs = [ "pyvista", "magpylib-material-response", "magpylib-force", - "kaleido==0.2.1.post1", + "kaleido==0.2.1", # ulterior versions don't ship chrome ] test = [ "pytest>=7.4", From 5b6dfd9ad8d4b955c60d075ce8ed6483fbdaaca2 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 20 May 2025 22:22:38 +0200 Subject: [PATCH 176/211] pin plotly --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index afe40ecfc..bda78f5a0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,6 +59,7 @@ docs = [ "pyvista", "magpylib-material-response", "magpylib-force", + "plotly>=5.16,<6.0", # v6 is not working properly as of 6.1.1 "kaleido==0.2.1", # ulterior versions don't ship chrome ] test = [ From 91ae8170cd9af572b302b59234cbb6832dfe5f29 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 20 May 2025 22:26:30 +0200 Subject: [PATCH 177/211] Update src/magpylib/_src/display/traces_core.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/magpylib/_src/display/traces_core.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index bfeff7931..34d3db180 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -617,7 +617,11 @@ def make_Pixels( pix["facecolor"] = np.repeat(color, len(pix["i"])) pixels.append(pix) pixels = group_traces(*pixels) - assert len(pixels) == 1 + if len(pixels) != 1: + raise ValueError( + f"Expected exactly one pixel trace after grouping, but got {len(pixels)}. " + "This may indicate an issue with the input data or the grouping logic." + ) return pixels[0] From fcafe97b1bc5478867e312132f17d6eb8eaf5461 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 20 May 2025 22:33:45 +0200 Subject: [PATCH 178/211] linting --- src/magpylib/_src/display/traces_core.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index 34d3db180..0173afe75 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -618,10 +618,11 @@ def make_Pixels( pixels.append(pix) pixels = group_traces(*pixels) if len(pixels) != 1: - raise ValueError( + msg = ( f"Expected exactly one pixel trace after grouping, but got {len(pixels)}. " "This may indicate an issue with the input data or the grouping logic." ) + raise ValueError(msg) return pixels[0] From d9f3c76543057da564b2bd688d1c441df680aaa8 Mon Sep 17 00:00:00 2001 From: mortner Date: Tue, 24 Jun 2025 07:41:04 +0200 Subject: [PATCH 179/211] add to style documentaion --- docs/_pages/user_guide/docs/docs_styles.md | 85 ++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/docs/_pages/user_guide/docs/docs_styles.md b/docs/_pages/user_guide/docs/docs_styles.md index bdbd3a7ab..87cab4feb 100644 --- a/docs/_pages/user_guide/docs/docs_styles.md +++ b/docs/_pages/user_guide/docs/docs_styles.md @@ -561,3 +561,88 @@ magpy.show(args, **kwargs, backend="plotly") ```{code-cell} ipython3 ``` + +(styles-pixel-vectorfield)= +## Pixel Vectorfield (Quiver Plot) + +:::{versionadded} 5.2 +Pixel Vector Field +::: + +The `pixel` of a `Sensor` object can be visualized as arrows representing the values of the vector fields B, H, J, or M. This allows for quick and intuitive inspection of the field distributions. + +### Parameters (`style.pixel.field`) + +- **`vectorsource`** *(default=`None`)*: + Controls whether `Sensor` pixels are visualized as arrows or as points/boxes (default). + - `None`: Pixels are rendered as points/boxes. + - `"B"`, `"H"`, `"J"`, `"M"`: Pixels are rendered as arrows representing the corresponding vector field. + +- **`colorsource`** *(default=`None`)*: + Defines the coloring of arrows. + - `None`: Colors are mapped to the magnitude of the `vectorsource` field. + - `False`: Arrows are colored using `pixel.color` if defined; otherwise, `"black"`. + - `"B"`, `"Hxy"`, `"Jxyz"`, etc.: Colors are mapped to the magnitude of the specified field. + +- **`symbol`** *(default=`"cone"`)*: + Specifies the rendering symbol for arrows. + - `"cone"`: 3D cone representation. + - `"arrow3d"`: 3D arrow representation. + - `"arrow"`: 2D line-based arrow. + +- **`shownull`** *(default=`True`)*: + Toggles the visibility of pixel with zero and invalid field vectors. + - `True`: Null vectors are displayed. + - `False`: Null vectors are hidden. + +- **`sizemode`** *(default=`"constant"`)*: + Determines how arrow size relates to the `vectorsource` magnitude. + - `"constant"`: Uniform arrow size. + - `"linear"`: Size proportional to magnitude. + - `"log"`: Size proportional to the normalized logarithm of the magnitude. + +- **`colorscale`** *(default=`"Viridis"`)*: + Specifies the colormap used for color mapping. Supports standard color maps (e.g., `"Viridis"`, `"Inferno"`, `"Magma"`, etc.) compatible with both Plotly and Matplotlib. + +````{note} +- Pixels with zero or invalid field values are rendered using the default representation (`point`/`box` or according to `style.pixel.symbol`). +- Magnitude normalization is performed individually for each sensor along its path. +```` + +### Pixel Vector Field Example +The following example demonstrates how to visualize the `Sensor` pixel array as a vector field using the `style.pixel.field` settings. + +```{code-cell} ipython3 +:tags: [hide-input] + +import numpy as np +import magpylib as magpy + +# Define a cuboid magnet +cube = magpy.magnet.Cuboid( + polarization=(0, 0, 1), + dimension=(1, 1, 1), +) + +# Create a 2D grid of pixel positions in the xy-plane at z=2 +xy_grid = np.mgrid[-2:2:15j, -2:2:15j, 2:2:1j].T[0] + +# Define pixel field style +pixel_style = { + "vectorsource" : "B", + "symbol" : "arrow3d", + "colorsource" : None, + "sizemode" : "constant", + "shownull" : True, + "colorscale" : "Magma" +} + +# Create sensor with pixel array and applied style +sens = magpy.Sensor( + pixel=xy_grid, + style_pixel_field=pixel_style, +) + +# Display the sensor and magnet using the Plotly backend +magpy.show([sens, cube], backend='plotly') +``` From b52ba830e3a871c5cfc957c1d356231359c5fa86 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 24 Jun 2025 05:41:46 +0000 Subject: [PATCH 180/211] style: pre-commit fixes --- docs/_pages/user_guide/docs/docs_styles.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/_pages/user_guide/docs/docs_styles.md b/docs/_pages/user_guide/docs/docs_styles.md index 87cab4feb..bdf39345b 100644 --- a/docs/_pages/user_guide/docs/docs_styles.md +++ b/docs/_pages/user_guide/docs/docs_styles.md @@ -573,18 +573,18 @@ The `pixel` of a `Sensor` object can be visualized as arrows representing the va ### Parameters (`style.pixel.field`) -- **`vectorsource`** *(default=`None`)*: +- **`vectorsource`** *(default=`None`)*: Controls whether `Sensor` pixels are visualized as arrows or as points/boxes (default). - `None`: Pixels are rendered as points/boxes. - `"B"`, `"H"`, `"J"`, `"M"`: Pixels are rendered as arrows representing the corresponding vector field. -- **`colorsource`** *(default=`None`)*: +- **`colorsource`** *(default=`None`)*: Defines the coloring of arrows. - `None`: Colors are mapped to the magnitude of the `vectorsource` field. - `False`: Arrows are colored using `pixel.color` if defined; otherwise, `"black"`. - `"B"`, `"Hxy"`, `"Jxyz"`, etc.: Colors are mapped to the magnitude of the specified field. -- **`symbol`** *(default=`"cone"`)*: +- **`symbol`** *(default=`"cone"`)*: Specifies the rendering symbol for arrows. - `"cone"`: 3D cone representation. - `"arrow3d"`: 3D arrow representation. @@ -595,13 +595,13 @@ The `pixel` of a `Sensor` object can be visualized as arrows representing the va - `True`: Null vectors are displayed. - `False`: Null vectors are hidden. -- **`sizemode`** *(default=`"constant"`)*: +- **`sizemode`** *(default=`"constant"`)*: Determines how arrow size relates to the `vectorsource` magnitude. - `"constant"`: Uniform arrow size. - `"linear"`: Size proportional to magnitude. - `"log"`: Size proportional to the normalized logarithm of the magnitude. -- **`colorscale`** *(default=`"Viridis"`)*: +- **`colorscale`** *(default=`"Viridis"`)*: Specifies the colormap used for color mapping. Supports standard color maps (e.g., `"Viridis"`, `"Inferno"`, `"Magma"`, etc.) compatible with both Plotly and Matplotlib. ````{note} From 891a973c69b2a0fd609e0739f909031873b71375 Mon Sep 17 00:00:00 2001 From: mortner Date: Tue, 24 Jun 2025 14:14:05 +0200 Subject: [PATCH 181/211] improve docs...add examples --- docs/_pages/user_guide/docs/docs_styles.md | 10 +- .../examples/examples_vis_vectorfield.md | 147 +++++++++++++----- 2 files changed, 111 insertions(+), 46 deletions(-) diff --git a/docs/_pages/user_guide/docs/docs_styles.md b/docs/_pages/user_guide/docs/docs_styles.md index bdf39345b..ed39572fd 100644 --- a/docs/_pages/user_guide/docs/docs_styles.md +++ b/docs/_pages/user_guide/docs/docs_styles.md @@ -563,7 +563,7 @@ magpy.show(args, **kwargs, backend="plotly") ``` (styles-pixel-vectorfield)= -## Pixel Vectorfield (Quiver Plot) +## Pixel Field :::{versionadded} 5.2 Pixel Vector Field @@ -607,9 +607,10 @@ The `pixel` of a `Sensor` object can be visualized as arrows representing the va ````{note} - Pixels with zero or invalid field values are rendered using the default representation (`point`/`box` or according to `style.pixel.symbol`). - Magnitude normalization is performed individually for each sensor along its path. +- `style.pixel.size` controls also the arrow size. ```` -### Pixel Vector Field Example +### Pixel Field Minimal Example The following example demonstrates how to visualize the `Sensor` pixel array as a vector field using the `style.pixel.field` settings. ```{code-cell} ipython3 @@ -624,8 +625,8 @@ cube = magpy.magnet.Cuboid( dimension=(1, 1, 1), ) -# Create a 2D grid of pixel positions in the xy-plane at z=2 -xy_grid = np.mgrid[-2:2:15j, -2:2:15j, 2:2:1j].T[0] +# Create a 2D grid of pixel positions in the xy-plane +xy_grid = np.mgrid[-2:2:15j, -2:2:15j, 0:0:1j].T[0] # Define pixel field style pixel_style = { @@ -640,6 +641,7 @@ pixel_style = { # Create sensor with pixel array and applied style sens = magpy.Sensor( pixel=xy_grid, + position=(0,0,2), style_pixel_field=pixel_style, ) diff --git a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md index 63501f514..18537ac48 100644 --- a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md +++ b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md @@ -14,71 +14,134 @@ kernelspec: (examples-vis-vectorfield)= -# Pixel Vector Field - +# Pixel Vector Field (Quiver Plot) :::{versionadded} 5.2 Pixel Vector Field ::: -The `Sensor` object with its `pixel` can be conveniently used for visualizing vector fields! -With this new capability, you can display the vector field for `"B"`, `"H"`, `"M"`, or `"J"` and overlay a magnitude (e.g., `"Bxy"`, `"Hz"`, etc.). -This notebook provides examples of how to use these features effectively, along with explanations of the relevant parameters. +The `Sensor` object with its `pixel` can be conveniently used for visualizing the vector fields `"B"`, `"H"`, `"M"`, or `"J"` in the form of quiver plots. A detailed documentaion of this functionlity is found in the [documentartion](styles-pixel-vectorfield). This notebook provides examples of how to use these features effectively, along with explanations of the relevant parameters. + +## Example 1: + +Simple example using pixel field functionality combined with magnet transparency displaying the B field on a surface that passes through the magnet. +```{code-cell} ipython3 +:tags: [hide-input] -## Parameter Overview +import numpy as np +import magpylib as magpy -### `style.pixel.field` Parameters +# Define a magnet with opacity +magnet = magpy.magnet.Cuboid( + polarization=(1, 1, 0), + dimension=(4e-3, 4e-3, 2e-3), + style_opacity=.5, +) -- **`vectorsource`** (default=`None`): Defines the field source for vector visualization: - - `None`: No field direction is shown. - - `"B"`, `"H"`, `"J"`, `"M"`: Corresponding field vectors are displayed. +# Create a grid of pixel positions in the xy-plane +xy_grid = np.mgrid[-4e-3:4e-3:15j, -4e-3:4e-3:15j, 0:0:1j].T[0] -- **`colorsource`** (default=`None`): Defines the field source for the color scale: - - `None`: Field magnitude coloring is taken from the `vectorsource` input and shown via the magnitude of individual pixels. - - `"B"`, `"Hxy"`, `"Jxyz"`, etc.: Corresponding field magnitude is shown via magnitude coloring of individual pixels. - - `False`: No magnitude coloring is applied. Symbols are displayed with `pixel.color` if defined, otherwise `"black"`. +# Create a sensor with pixel array and pixel field style +sens = magpy.Sensor( + pixel=xy_grid, + style_pixel_field_vectorsource="B", + style_pixel_field_sizemode="log", +) -- **`symbol`** (default=`"cone"`): Defines the symbol used to represent valid and non-null vectors: - - `"cone"`: 3D cone representation. - - `"arrow3d"`: 3D arrow representation. - - `"arrow"`: 3D line representation. - - Null or invalid vectors are displayed as: - - A point (when `field.symbol` is `"arrow"`). - - A cuboid pixel (when `field.symbol` is `"cone"` or `"arrow3d"`). +# Display the sensor and magnet using the Plotly backend +magpy.show([sens, magnet], backend='plotly') +``` -- **`shownull`** (default=`True`): Toggles the visibility of null vectors: - - `True`: Null vectors are displayed. - - `False`: Null vectors are hidden. +## Example 2: -- **`sizemode`** (default=`"constant"`): Defines how arrows are sized relative to the `vectorsource` magnitude: - - `"constant"`: Uniform size. - - `"linear"`: Proportional to the magnitude. - - `"log"`: Proportional to the normalized logarithm of the magnitude. +Sensor pixels are not restricted to any specific grid structure and can be positioned freely to represent curved surfaces, lines, or individual points of interest. +The example below demonstrates the visualization of the magnetic field of a magnetic pole wheel evaluated along curved surfaces and lines. -### Additional Features +```{code-cell} ipython3 +:tags: [hide-input] -- **Color Scales**: Supports predefined color scales (e.g., `"Viridis"`, `"Inferno"`, `"Jet"`) or which are common to both `Plotly` and `Matplotlib`. -- **Normalization**: Field vectors and magnitude normalization are applied per sensor path for each sensor individually. -- **`style.pixel.symbol`** (default=`None`): Accepts valid scatter symbols (e.g., `"."`). Only applies if `pixel.field.vectorsource` is `None` or for invalid/null vectors. -- **Pixel Hulls**: Hulls over pixels are shown only if no field values are provided. -- **Backend Compatibility**: Works seamlessly with all supported backends: - - Matplotlib - - Plotly - - PyVista +from numpy import pi, sin, cos, linspace +import magpylib as magpy -+++ +# Create a pole wheel magnet composed of 12 alternating cylinder segments +pole_wheel = magpy.Collection() +for i in range(12): + zone = magpy.magnet.CylinderSegment( + dimension=(1.8, 2, 1, -15, 15), + polarization=((-1)**i, 0, 0), + ).rotate_from_angax(30*i, axis='z') + pole_wheel.add(zone) + +# Sensor 1: Pixel line along a circle in the xz-plane +ang1 = linspace(0, 2*pi, endpoint=False) +pixel_line = [(cos(a), 0, sin(a)) for a in ang1] + +sensor1 = magpy.Sensor( + pixel=pixel_line, + style_pixel_field_vectorsource="H", +) -## Examples +# Sensor 2: Curved surface (vertical cylinder segment) +z_values = linspace(-1, 1, 10) +ang2 = linspace(-9*pi/8, -2*pi/8, 30) +pixel_grid2 = [[(3.5*cos(a), 3.5*sin(a), z) for a in ang2] for z in z_values] + +sensor2 = magpy.Sensor( + pixel=pixel_grid2, + style_pixel_field = { + "vectorsource":"H", + "sizemode" : "constant", + "colorscale" : "Blues", + "symbol" : "arrow3d", + } +) -### Animated B-field +# Sensor 3: Curved surface (horizontal annular sector) +r_values = linspace(3, 4, 5) +ang3 = linspace(-pi/8, 6*pi/8, 30) +pixel_grid3 = [[(r*cos(a), r*sin(a), 0) for a in ang3] for r in r_values] + +sensor3 = magpy.Sensor( + pixel=pixel_grid3, + style_pixel_field = { + "vectorsource":"H", + "sizemode" : "log", + "colorscale" : "Plasma", + "symbol" : "arrow3d", + } +) -```{note} -Default is `"cone"` (can be set globally like any other style). +# Display sensors and magnets using Plotly backend +magpy.show( + [sensor1, sensor2, sensor3, pole_wheel], + backend='plotly', + style_arrows_x_show=False, + style_arrows_y_show=False, + style_arrows_z_show=False, +) ``` +## Quiver Plot Animation + +animation + + + + + + + + + + + + + + + ```{code-cell} ipython3 :tags: [hide-input] From 0124c8db3a87a07ea9cd5c320c38d0cddf803923 Mon Sep 17 00:00:00 2001 From: mortner Date: Wed, 25 Jun 2025 14:09:47 +0200 Subject: [PATCH 182/211] add jet and rainbow to style.py --- src/magpylib/_src/style.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/magpylib/_src/style.py b/src/magpylib/_src/style.py index f2082da3b..33ba5c37a 100644 --- a/src/magpylib/_src/style.py +++ b/src/magpylib/_src/style.py @@ -1683,6 +1683,8 @@ class PixelField(MagicProperties): _allowed_sizemodes = ("constant", "linear", "log") _allowed_colorscales = ( "Viridis", + "Jet", + "Rainbow", "Plasma", "Inferno", "Magma", From 41c104abbc70149244666f833f63624836038556 Mon Sep 17 00:00:00 2001 From: mortner Date: Wed, 25 Jun 2025 14:16:13 +0200 Subject: [PATCH 183/211] pixel field docs --- .../examples/examples_vis_vectorfield.md | 330 ++---------------- .../images/examples_icon_vis_vectorfield.png | Bin 69178 -> 170748 bytes 2 files changed, 24 insertions(+), 306 deletions(-) diff --git a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md index 18537ac48..dba3bf269 100644 --- a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md +++ b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md @@ -14,16 +14,15 @@ kernelspec: (examples-vis-vectorfield)= -# Pixel Vector Field (Quiver Plot) +# Pixel Field (Quiver Plot) :::{versionadded} 5.2 Pixel Vector Field ::: - The `Sensor` object with its `pixel` can be conveniently used for visualizing the vector fields `"B"`, `"H"`, `"M"`, or `"J"` in the form of quiver plots. A detailed documentaion of this functionlity is found in the [documentartion](styles-pixel-vectorfield). This notebook provides examples of how to use these features effectively, along with explanations of the relevant parameters. -## Example 1: +## Example 1: Transparent Magnet Simple example using pixel field functionality combined with magnet transparency displaying the B field on a surface that passes through the magnet. @@ -54,11 +53,11 @@ sens = magpy.Sensor( magpy.show([sens, magnet], backend='plotly') ``` -## Example 2: +## Example 2: Complex Pixel Grids Sensor pixels are not restricted to any specific grid structure and can be positioned freely to represent curved surfaces, lines, or individual points of interest. -The example below demonstrates the visualization of the magnetic field of a magnetic pole wheel evaluated along curved surfaces and lines. +The example below demonstrates the visualization of the magnetic field of a magnetic pole wheel evaluated along curved surfaces and lines using different color maps and arrow shapes. ```{code-cell} ipython3 :tags: [hide-input] @@ -124,320 +123,39 @@ magpy.show( ) ``` -## Quiver Plot Animation - -animation - - - - - - - - - - - - - +## Example 3: Pixel Field Animation +The pixel field can be combined with animation to create spectacular visualizations, such as displaying the magnetic field of rotating magnets. ```{code-cell} ipython3 :tags: [hide-input] import numpy as np - import magpylib as magpy -path_len = 51 -pix_per_dim = 12 +# Create a cuboid magnet with vertical polarization +magnet = magpy.magnet.Cuboid( + polarization=(0, 0, 1), + dimension=(1, 3, 1) +) -c1 = magpy.magnet.Cuboid(polarization=(0, 0, 1), dimension=(1, 1, 1), style_opacity=0.2) -c1.rotate_from_angax(np.linspace(0, 180, path_len), "z", start=0) -c1.rotate_from_angax(np.linspace(0, 180, path_len), "x", start=0) +# Apply a rotation to the Cuboid that generates a path with 51 steps +magnet.rotate_from_angax( + angle=np.linspace(0, 360, 51), + axis="y", + start=0 +) -ls = np.linspace(-1, 1, pix_per_dim) -s1 = magpy.Sensor(pixel=[[x, y, 0] for x in ls for y in ls], position=(0, 0, 0)) +# Create a sensor with pixel grid in the xy-plane at z=1 +pixel_grid = np.mgrid[-2:2:12j, -2:2:12j, 1:1:1j].T[0] +sensor = magpy.Sensor(pixel=pixel_grid) +# Display as animation in the plotly backend magpy.show( - c1, - s1, + magnet, + sensor, animation=True, style_pixel_field_symbol="arrow3d", style_pixel_field_vectorsource="B", + backend="plotly", ) -``` - -### Display B, H, J, or M Field - -```{note} -Null or NaN field values are not displayed via a directional symbol but are visible by default. -``` - -```{code-cell} ipython3 -# Only 10 interactive 3d plots (Webgl contexts) can be displayed at time -# The following will display subsequent plots as non-interative png images -import plotly.io as pio -pio.renderers.default = 'png' -pio.templates["custom"] = pio.templates["plotly"] -pio.templates["custom"].layout.update( - width=1400, # Set default width - height=600 # Set default height -) -pio.templates.default = "custom" -``` - -```{code-cell} ipython3 -:tags: [hide-input] - -import numpy as np - -import magpylib as magpy - -path_len = 1 -pix_per_dim = 10 - -c1 = magpy.magnet.Cuboid( - polarization=(1, 0, 0), - dimension=(1, 1, 1), - style_opacity=0.2, -) -ls = np.linspace(-1, 1, pix_per_dim) -s0 = magpy.Sensor( - pixel=[[x, y, 0] for x in ls for y in ls], - position=(0, 0, 0), -) -objects = [] -for i, vectorsource in enumerate("BHJM"): - s1 = s0.copy( - style_pixel_field_vectorsource=vectorsource, - ) - s1.style.label = f"{vectorsource}-field" - objects.append({"objects": (c1, s1), "col": i + 1}) - -magpy.show( - *objects, - style_arrows_x_show=False, - style_arrows_y_show=False, - style_arrows_z_show=False, -) -``` - -### Display Field Magnitude via Coloring - -```{note} -Field coloring can be set independently of the field vector source. If not specified, it refers to the vector source magnitude. If set to `False`, no coloring is used, and symbols are displayed in black. -``` - -```{code-cell} ipython3 -:tags: [hide-input] - -import numpy as np - -import magpylib as magpy - -path_len = 1 -pix_per_dim = 10 - -c1 = magpy.magnet.Cuboid( - polarization=(1, 0, 0), - dimension=(1, 1, 1), - style_opacity=0.2, -) -ls = np.linspace(-1, 1, pix_per_dim) -s0 = magpy.Sensor( - pixel=[[x, y, 0] for x in ls for y in ls], - position=(0, 0, 0), -) -objects = [] -for i, colorsource in enumerate(("H", "Jxy", "Bz", False)): - s1 = s0.copy( - style_pixel_field_vectorsource="B", - style_pixel_field_colorsource=colorsource, - ) - s1.style.label = f"B-field, color: {colorsource}" - objects.append({"objects": (c1, s1), "col": i + 1}) - -magpy.show( - *objects, - style_arrows_x_show=False, - style_arrows_y_show=False, - style_arrows_z_show=False, -) -``` - -### Use Different Directional Symbols - -```{note} -Default is `"cone"` (can be set globally like any other style). -``` - -```{code-cell} ipython3 -:tags: [hide-input] - -import numpy as np - -import magpylib as magpy - -path_len = 1 -pix_per_dim = 10 - -c1 = magpy.magnet.Cuboid( - polarization=(1, 0, 0), - dimension=(1, 1, 1), - style_opacity=0.2, -) -ls = np.linspace(-1, 1, pix_per_dim) -s0 = magpy.Sensor( - pixel=[[x, y, 0] for x in ls for y in ls], - position=(0, 0, 0), -) -objects = [] -for i, symbol in enumerate(("cone", "arrow3d", "arrow")): - s1 = s0.copy( - style_pixel_field_vectorsource="B", - style_pixel_field_symbol=symbol, - ) - s1.style.label = f"B-field, symbol: {symbol}" - objects.append({"objects": (c1, s1), "col": i + 1}) - -magpy.show( - *objects, - style_arrows_x_show=False, - style_arrows_y_show=False, - style_arrows_z_show=False, -) -``` - -### Set the Sizing Modes of Directional Symbols - -```{note} -Default is `"constant"` (can be set globally like any other style). -Like for coloring, sizing is normalized for the min-max values of the field values over the whole sensor path, but for each sensor individually. -``` - -```{code-cell} ipython3 -:tags: [hide-input] - -import numpy as np - -import magpylib as magpy - -path_len = 1 -pix_per_dim = 10 - -c1 = magpy.magnet.Cuboid( - polarization=(1, 0, 0), - dimension=(1, 1, 1), - style_opacity=0.2, -) -ls = np.linspace(-1, 1, pix_per_dim) -s0 = magpy.Sensor( - pixel=[[x, y, 0] for x in ls for y in ls], - position=(0, 0, 0), -) -objects = [] -for i, sizemode in enumerate(("constant", "log", "linear")): - s1 = s0.copy( - style_pixel_field_vectorsource="B", - style_pixel_field_sizemode=sizemode, - ) - s1.style.label = f"B-field, sizemode: {sizemode}" - objects.append({"objects": (c1, s1), "col": i + 1}) - -magpy.show( - *objects, - style_arrows_x_show=False, - style_arrows_y_show=False, - style_arrows_z_show=False, -) -``` - -### Edge Cases: Hide `Null` or `NaN` Values - -```{note} -Null and NaN values are treated the same. These pixels can be hidden if desired. -``` - -```{code-cell} ipython3 -:tags: [hide-input] - -import numpy as np - -import magpylib as magpy - -path_len = 1 -pix_per_dim = 5 - -c1 = magpy.magnet.Cuboid( - polarization=(1, 0, 0), - dimension=(1, 1, 1), - style_opacity=0.2, -) -ls = np.linspace(-1, 1, pix_per_dim) -s0 = magpy.Sensor( - pixel=[[x, y, 0] for x in ls for y in ls], - position=(0, 0, 0), -) -objects = [] -col = 0 -for vectorsource in "BJ": - for shownull in (True, False): - col += 1 - s1 = s0.copy( - style_pixel_field_vectorsource=vectorsource, - style_pixel_field_shownull=shownull, - ) - s1.style.label = f"{vectorsource}-field, shownull: {shownull}" - objects.append({"objects": (c1, s1), "col": col}) - -magpy.show( - *objects, - style_arrows_x_show=False, - style_arrows_y_show=False, - style_arrows_z_show=False, -) -``` - -### Color Scales - -```{note} -Other color scales are available (a curated list of common sequential colors between Matplotlib and Plotly). -``` - -```{code-cell} ipython3 -:tags: [hide-input] - -import numpy as np - -import magpylib as magpy - -path_len = 1 -pix_per_dim = 10 - -c1 = magpy.magnet.Cuboid( - polarization=(1, 0, 0), - dimension=(1, 1, 1), - style_opacity=0.2, -) -ls = np.linspace(-1, 1, pix_per_dim) -s0 = magpy.Sensor( - pixel=[[x, y, 1] for x in ls for y in ls], - position=(0, 0, 0), -) -objects = [] -for i, colorscale in enumerate(("Viridis", "Inferno", "Oranges", "RdPu")): - s1 = s0.copy( - style_pixel_field_vectorsource="B", - style_pixel_field_colorscale=colorscale, - ) - s1.style.label = f"B-field, colorscale: {colorscale}" - objects.append({"objects": (c1, s1), "col": i + 1}) - -magpy.show( - *objects, - style_arrows_x_show=False, - style_arrows_y_show=False, - style_arrows_z_show=False, -) -``` diff --git a/docs/_static/images/examples_icon_vis_vectorfield.png b/docs/_static/images/examples_icon_vis_vectorfield.png index 8b9dfd401297302134ae7cf6ad450162658ee544..33b10b9d51a79993492c094a12a4e4c7ba2b0448 100644 GIT binary patch literal 170748 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%0A6wN&O*z3RI-D$t*hHQ4UDkv@NiTdh{9&QO>8U- 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 literal 69178 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 M07*qoM6N<$f-4YwVE_OC From be926d4aaadb988c4fcad735532e36f1c1f1995c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 25 Jun 2025 12:16:31 +0000 Subject: [PATCH 184/211] style: pre-commit fixes --- docs/_pages/user_guide/examples/examples_vis_vectorfield.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md index dba3bf269..e8df35068 100644 --- a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md +++ b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md @@ -55,7 +55,7 @@ magpy.show([sens, magnet], backend='plotly') ## Example 2: Complex Pixel Grids -Sensor pixels are not restricted to any specific grid structure and can be positioned freely to represent curved surfaces, lines, or individual points of interest. +Sensor pixels are not restricted to any specific grid structure and can be positioned freely to represent curved surfaces, lines, or individual points of interest. The example below demonstrates the visualization of the magnetic field of a magnetic pole wheel evaluated along curved surfaces and lines using different color maps and arrow shapes. From 4724114be0111dd994c344e6758df68a3bf1d927 Mon Sep 17 00:00:00 2001 From: mortner Date: Wed, 25 Jun 2025 20:15:59 +0200 Subject: [PATCH 185/211] fix a ruff complaint --- src/magpylib/_src/style.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/magpylib/_src/style.py b/src/magpylib/_src/style.py index 33ba5c37a..5ab1e3822 100644 --- a/src/magpylib/_src/style.py +++ b/src/magpylib/_src/style.py @@ -27,7 +27,7 @@ def get_families(obj): # pylint: disable=import-outside-toplevel # pylint: disable=possibly-unused-variable # pylint: disable=redefined-outer-name - # ruff: noqa: F401, I001, I002 + # ruff: noqa: F401, PLC0415 from magpylib._src.display.traces_generic import MagpyMarkers as Markers from magpylib._src.obj_classes.class_BaseExcitations import BaseCurrent as Current from magpylib._src.obj_classes.class_BaseExcitations import BaseMagnet as Magnet From 67453353ec9c6c1b5e943b611e296571908e0edd Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 15 Jul 2025 22:35:09 +0200 Subject: [PATCH 186/211] linting --- docs/_pages/user_guide/examples/examples_vis_vectorfield.md | 2 +- src/magpylib/_src/display/traces_generic.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md index e8df35068..97ab4ef92 100644 --- a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md +++ b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md @@ -20,7 +20,7 @@ kernelspec: Pixel Vector Field ::: -The `Sensor` object with its `pixel` can be conveniently used for visualizing the vector fields `"B"`, `"H"`, `"M"`, or `"J"` in the form of quiver plots. A detailed documentaion of this functionlity is found in the [documentartion](styles-pixel-vectorfield). This notebook provides examples of how to use these features effectively, along with explanations of the relevant parameters. +The `Sensor` object with its `pixel` can be conveniently used for visualizing the vector fields `"B"`, `"H"`, `"M"`, or `"J"` in the form of quiver plots. A detailed documentaion of this functionality is found in the [documentation](styles-pixel-vectorfield). This notebook provides examples of how to use these features effectively, along with explanations of the relevant parameters. ## Example 1: Transparent Magnet diff --git a/src/magpylib/_src/display/traces_generic.py b/src/magpylib/_src/display/traces_generic.py index 7dbbf516a..180dafcc1 100644 --- a/src/magpylib/_src/display/traces_generic.py +++ b/src/magpylib/_src/display/traces_generic.py @@ -837,7 +837,7 @@ def get_traces_3D(flat_objs_props, extra_backend=False, autosize=None, **kwargs) def get_sensor_pixel_field(objects): """get field_by_sens if sensor has style pixel field""" # pylint: disable=import-outside-toplevel - from magpylib._src.fields.field_wrap_BH import getBH_level2 + from magpylib._src.fields.field_wrap_BH import getBH_level2 # noqa: PLC0415 field_by_sens = {} sensors = format_obj_input(objects, allow="sensors+collections") From e1b14cdc258a5d819b941543d9c7aab7b8283864 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 15 Jul 2025 22:38:21 +0200 Subject: [PATCH 187/211] typo --- docs/_pages/user_guide/examples/examples_vis_vectorfield.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md index 97ab4ef92..b6182995a 100644 --- a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md +++ b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md @@ -20,7 +20,7 @@ kernelspec: Pixel Vector Field ::: -The `Sensor` object with its `pixel` can be conveniently used for visualizing the vector fields `"B"`, `"H"`, `"M"`, or `"J"` in the form of quiver plots. A detailed documentaion of this functionality is found in the [documentation](styles-pixel-vectorfield). This notebook provides examples of how to use these features effectively, along with explanations of the relevant parameters. +The `Sensor` object with its `pixel` can be conveniently used for visualizing the vector fields `"B"`, `"H"`, `"M"`, or `"J"` in the form of quiver plots. A detailed documentation of this functionality is found in the [documentation](styles-pixel-vectorfield). This notebook provides examples of how to use these features effectively, along with explanations of the relevant parameters. ## Example 1: Transparent Magnet From d90a17f39a36923441f3768a0088d64fd0eded3f Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 15 Jul 2025 22:44:27 +0200 Subject: [PATCH 188/211] improve doc example --- .../examples/examples_vis_vectorfield.md | 39 ++++++++++--------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md index b6182995a..f5e7f598a 100644 --- a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md +++ b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md @@ -20,11 +20,11 @@ kernelspec: Pixel Vector Field ::: -The `Sensor` object with its `pixel` can be conveniently used for visualizing the vector fields `"B"`, `"H"`, `"M"`, or `"J"` in the form of quiver plots. A detailed documentation of this functionality is found in the [documentation](styles-pixel-vectorfield). This notebook provides examples of how to use these features effectively, along with explanations of the relevant parameters. +The `Sensor` object with its `pixel` attribute can be conveniently used to visualize vector fields `"B"`, `"H"`, `"M"`, or `"J"` as quiver plots. Detailed documentation is available in the [styles-pixel-vectorfield](styles-pixel-vectorfield) section. This notebook provides practical examples and explanations of relevant parameters for effective usage. ## Example 1: Transparent Magnet -Simple example using pixel field functionality combined with magnet transparency displaying the B field on a surface that passes through the magnet. +A simple example using pixel field functionality, combined with magnet transparency, displays the B field on a surface passing through the magnet. ```{code-cell} ipython3 :tags: [hide-input] @@ -36,7 +36,7 @@ import magpylib as magpy magnet = magpy.magnet.Cuboid( polarization=(1, 1, 0), dimension=(4e-3, 4e-3, 2e-3), - style_opacity=.5, + style_opacity=0.5, ) # Create a grid of pixel positions in the xy-plane @@ -50,14 +50,14 @@ sens = magpy.Sensor( ) # Display the sensor and magnet using the Plotly backend -magpy.show([sens, magnet], backend='plotly') +magpy.show([sens, magnet], backend="plotly") ``` ## Example 2: Complex Pixel Grids Sensor pixels are not restricted to any specific grid structure and can be positioned freely to represent curved surfaces, lines, or individual points of interest. -The example below demonstrates the visualization of the magnetic field of a magnetic pole wheel evaluated along curved surfaces and lines using different color maps and arrow shapes. +The following example demonstrates visualization of the magnetic field of a magnetic pole wheel, evaluated along curved surfaces and lines, using different color maps and arrow shapes. ```{code-cell} ipython3 :tags: [hide-input] @@ -71,7 +71,7 @@ for i in range(12): zone = magpy.magnet.CylinderSegment( dimension=(1.8, 2, 1, -15, 15), polarization=((-1)**i, 0, 0), - ).rotate_from_angax(30*i, axis='z') + ).rotate_from_angax(30*i, axis="z") pole_wheel.add(zone) # Sensor 1: Pixel line along a circle in the xz-plane @@ -90,11 +90,11 @@ pixel_grid2 = [[(3.5*cos(a), 3.5*sin(a), z) for a in ang2] for z in z_values] sensor2 = magpy.Sensor( pixel=pixel_grid2, - style_pixel_field = { - "vectorsource":"H", - "sizemode" : "constant", - "colorscale" : "Blues", - "symbol" : "arrow3d", + style_pixel_field={ + "vectorsource": "H", + "sizemode": "constant", + "colorscale": "Blues", + "symbol": "arrow3d", } ) @@ -105,18 +105,18 @@ pixel_grid3 = [[(r*cos(a), r*sin(a), 0) for a in ang3] for r in r_values] sensor3 = magpy.Sensor( pixel=pixel_grid3, - style_pixel_field = { - "vectorsource":"H", - "sizemode" : "log", - "colorscale" : "Plasma", - "symbol" : "arrow3d", + style_pixel_field={ + "vectorsource": "H", + "sizemode": "log", + "colorscale": "Plasma", + "symbol": "arrow3d", } ) # Display sensors and magnets using Plotly backend magpy.show( [sensor1, sensor2, sensor3, pole_wheel], - backend='plotly', + backend="plotly", style_arrows_x_show=False, style_arrows_y_show=False, style_arrows_z_show=False, @@ -125,7 +125,7 @@ magpy.show( ## Example 3: Pixel Field Animation -The pixel field can be combined with animation to create spectacular visualizations, such as displaying the magnetic field of rotating magnets. +Pixel fields can be combined with animation to create spectacular visualizations, such as displaying the magnetic field of rotating magnets. ```{code-cell} ipython3 :tags: [hide-input] @@ -150,7 +150,7 @@ magnet.rotate_from_angax( pixel_grid = np.mgrid[-2:2:12j, -2:2:12j, 1:1:1j].T[0] sensor = magpy.Sensor(pixel=pixel_grid) -# Display as animation in the plotly backend +# Display as animation in the Plotly backend magpy.show( magnet, sensor, @@ -159,3 +159,4 @@ magpy.show( style_pixel_field_vectorsource="B", backend="plotly", ) +``` From 3a4079c14cc01762a0e32a34c27ccb8403b39221 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sun, 14 Sep 2025 13:34:52 +0200 Subject: [PATCH 189/211] fix: add .ipynb temporary files to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index dd6be1e84..68c4eac13 100644 --- a/.gitignore +++ b/.gitignore @@ -158,6 +158,7 @@ Thumbs.db *~ *.swp __temp*.py +__temp.ipynb # uv uv.lock From 7bd0548f193e212ded3a00c76ac300d87ce26a91 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sun, 14 Sep 2025 14:01:26 +0200 Subject: [PATCH 190/211] refactor: remove 'vectorsource' and 'colorsource' in favor of 'source' --- docs/_pages/user_guide/docs/docs_styles.md | 18 ++---- .../examples/examples_vis_vectorfield.md | 10 ++-- src/magpylib/_src/defaults/defaults_values.py | 3 +- src/magpylib/_src/display/traces_core.py | 22 ++++--- src/magpylib/_src/display/traces_generic.py | 58 ++++++++----------- src/magpylib/_src/style.py | 42 ++++---------- tests/test_display_plotly.py | 27 ++------- tests/test_obj_BaseGeo.py | 4 +- 8 files changed, 65 insertions(+), 119 deletions(-) diff --git a/docs/_pages/user_guide/docs/docs_styles.md b/docs/_pages/user_guide/docs/docs_styles.md index ed39572fd..deb59742a 100644 --- a/docs/_pages/user_guide/docs/docs_styles.md +++ b/docs/_pages/user_guide/docs/docs_styles.md @@ -573,15 +573,9 @@ The `pixel` of a `Sensor` object can be visualized as arrows representing the va ### Parameters (`style.pixel.field`) -- **`vectorsource`** *(default=`None`)*: - Controls whether `Sensor` pixels are visualized as arrows or as points/boxes (default). - - `None`: Pixels are rendered as points/boxes. - - `"B"`, `"H"`, `"J"`, `"M"`: Pixels are rendered as arrows representing the corresponding vector field. - -- **`colorsource`** *(default=`None`)*: - Defines the coloring of arrows. - - `None`: Colors are mapped to the magnitude of the `vectorsource` field. - - `False`: Arrows are colored using `pixel.color` if defined; otherwise, `"black"`. +- **`source`** *(default=`None`)*: + Defines the field source of the vector field representation. + - `None`: No field representation is shown - `"B"`, `"Hxy"`, `"Jxyz"`, etc.: Colors are mapped to the magnitude of the specified field. - **`symbol`** *(default=`"cone"`)*: @@ -596,11 +590,12 @@ The `pixel` of a `Sensor` object can be visualized as arrows representing the va - `False`: Null vectors are hidden. - **`sizemode`** *(default=`"constant"`)*: - Determines how arrow size relates to the `vectorsource` magnitude. + Determines how arrow size relates to the `source` magnitude. - `"constant"`: Uniform arrow size. - `"linear"`: Size proportional to magnitude. - `"log"`: Size proportional to the normalized logarithm of the magnitude. + - **`colorscale`** *(default=`"Viridis"`)*: Specifies the colormap used for color mapping. Supports standard color maps (e.g., `"Viridis"`, `"Inferno"`, `"Magma"`, etc.) compatible with both Plotly and Matplotlib. @@ -630,9 +625,8 @@ xy_grid = np.mgrid[-2:2:15j, -2:2:15j, 0:0:1j].T[0] # Define pixel field style pixel_style = { - "vectorsource" : "B", + "source" : "B", "symbol" : "arrow3d", - "colorsource" : None, "sizemode" : "constant", "shownull" : True, "colorscale" : "Magma" diff --git a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md index f5e7f598a..11842fafb 100644 --- a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md +++ b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md @@ -45,7 +45,7 @@ xy_grid = np.mgrid[-4e-3:4e-3:15j, -4e-3:4e-3:15j, 0:0:1j].T[0] # Create a sensor with pixel array and pixel field style sens = magpy.Sensor( pixel=xy_grid, - style_pixel_field_vectorsource="B", + style_pixel_field_source="B", style_pixel_field_sizemode="log", ) @@ -80,7 +80,7 @@ pixel_line = [(cos(a), 0, sin(a)) for a in ang1] sensor1 = magpy.Sensor( pixel=pixel_line, - style_pixel_field_vectorsource="H", + style_pixel_field_source="H", ) # Sensor 2: Curved surface (vertical cylinder segment) @@ -91,7 +91,7 @@ pixel_grid2 = [[(3.5*cos(a), 3.5*sin(a), z) for a in ang2] for z in z_values] sensor2 = magpy.Sensor( pixel=pixel_grid2, style_pixel_field={ - "vectorsource": "H", + "source": "H", "sizemode": "constant", "colorscale": "Blues", "symbol": "arrow3d", @@ -106,7 +106,7 @@ pixel_grid3 = [[(r*cos(a), r*sin(a), 0) for a in ang3] for r in r_values] sensor3 = magpy.Sensor( pixel=pixel_grid3, style_pixel_field={ - "vectorsource": "H", + "source": "H", "sizemode": "log", "colorscale": "Plasma", "symbol": "arrow3d", @@ -156,7 +156,7 @@ magpy.show( sensor, animation=True, style_pixel_field_symbol="arrow3d", - style_pixel_field_vectorsource="B", + style_pixel_field_source="B", backend="plotly", ) ``` diff --git a/src/magpylib/_src/defaults/defaults_values.py b/src/magpylib/_src/defaults/defaults_values.py index b4dd3edcc..79ea54541 100644 --- a/src/magpylib/_src/defaults/defaults_values.py +++ b/src/magpylib/_src/defaults/defaults_values.py @@ -97,8 +97,7 @@ "symbol": None, "field": { "symbol": "cone", - "vectorsource": None, - "colorsource": None, + "source": None, "colorscale": "Viridis", "shownull": True, "sizemode": "constant", diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index 050543ed9..21311de91 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -724,15 +724,17 @@ def make_Sensor( px_vectors, null_thresh = None, 1e-12 px_colors = "black" if px_color is None else px_color if field_values: - vsrc = style.pixel.field.vectorsource - csrc = style.pixel.field.colorsource + fsrc = style.pixel.field.source sizemode = style.pixel.field.sizemode - csrc = vsrc if csrc is None else csrc - if vsrc is not None: - px_vectors = field_values[vsrc][path_ind] + field, *coords_str = fsrc + field_array = field_values[field] + px_vectors = field_values[field][path_ind] + coords_str = coords_str if coords_str else "xyz" + coords = list({"xyz".index(v) for v in coords_str if v in "xyz"}) + other_coords = [i for i in range(3) if i not in coords] + field_array[..., other_coords] = 0 # set other components to zero if sizemode != "constant": - vsrc = csrc if vsrc is None else vsrc - norms = np.linalg.norm(field_values[vsrc], axis=-1) + norms = np.linalg.norm(field_array, axis=-1) if sizemode == "log": is_null_mask = np.logical_or(norms == 0, np.isnan(norms)) norms[is_null_mask] = np.min(norms[norms != 0]) @@ -748,12 +750,8 @@ def make_Sensor( px_sizes *= norms[path_ind] else: px_sizes *= norms[path_ind] / np.max(norms) - if csrc is not False: + if fsrc: # get cmin, cmax from whole path - field_str, *coords_str = csrc - coords_str = coords_str if coords_str else "xyz" - coords = list({"xyz".index(v) for v in coords_str if v in "xyz"}) - field_array = field_values[field_str][..., coords] field_mag = np.linalg.norm(field_array, axis=-1) cmin, cmax = np.amin(field_mag), np.amax(field_mag) field_mag = field_mag[path_ind] diff --git a/src/magpylib/_src/display/traces_generic.py b/src/magpylib/_src/display/traces_generic.py index 180dafcc1..79de2030f 100644 --- a/src/magpylib/_src/display/traces_generic.py +++ b/src/magpylib/_src/display/traces_generic.py @@ -509,9 +509,8 @@ def make_func(*args, **kwargs): path_inds = path_inds_minimal = path_frames_to_indices(style.path.frames, path_len) if hasattr(style, "pixel"): make_func_kwargs["field_values"] = field_values - vsrc = style.pixel.field.vectorsource - csrc = style.pixel.field.colorsource - is_frame_dependent = (vsrc or csrc) and field_values + frsc = style.pixel.field.source + is_frame_dependent = frsc and field_values if is_frame_dependent: path_len = len(next(iter(field_values.values()))) path_inds = path_frames_to_indices(style.path.frames, path_len) @@ -848,37 +847,30 @@ def get_sensor_pixel_field(objects): ] has_pix_field = False for sens in sensors: - vsrc = sens.style.pixel.field.vectorsource - csrc = sens.style.pixel.field.colorsource - csrc = vsrc if csrc == "auto" else csrc - if vsrc or csrc: + fsrc = sens.style.pixel.field.source + if fsrc: field_by_sens[sens] = {} - fields_str = [] - if vsrc: - fields_str.append(vsrc) - if csrc: - fields_str.append(csrc[0]) - for field in set(fields_str): - if not has_pix_field: - sources = format_obj_input(objects, allow="sources") - sources = list(set(sources)) # remove duplicates - if sources: - out = getBH_level2( - sources, - [sens], - sumup=True, - squeeze=False, - field=field, - pixel_agg=None, - output="ndarray", - in_out="auto", - ) - # select first source (for sumup=True there is only one) - # and path index + reshape pixel - path_len = out.shape[1] - out = out[0].reshape(path_len, -1, 3) - field_by_sens[sens][field] = out - has_pix_field = True + if not has_pix_field: + sources = format_obj_input(objects, allow="sources") + sources = list(set(sources)) # remove duplicates + if sources: + field = fsrc[0] + has_pix_field = True + out = getBH_level2( + sources, + [sens], + sumup=True, + squeeze=False, + field=field, + pixel_agg=None, + output="ndarray", + in_out="auto", + ) + # select first source (for sumup=True there is only one) + # and path index + reshape pixel + path_len = out.shape[1] + out = out[0].reshape(path_len, -1, 3) + field_by_sens[sens][field] = out return field_by_sens diff --git a/src/magpylib/_src/style.py b/src/magpylib/_src/style.py index 836c4f689..d94766e19 100644 --- a/src/magpylib/_src/style.py +++ b/src/magpylib/_src/style.py @@ -1657,15 +1657,12 @@ class PixelField(MagicProperties): Parameters ---------- - vectorsource: str, default=None - The pixel orientation vector source (one of "B", "H", "M", "J") - - colorsource: str, default=None + source: str, default=None The pixel color source (e.g. "Bx", "Hxy", "J", etc.). If not specified, - the amplitude of the `vectorsource` value is used. + the amplitude of the `source` value is used. colorscale: str, default="Inferno", - The colorscale used with `colorsource`. + The colorscale used with `source`. shownull: bool, default=True Show/hide null or invalid field values @@ -1676,8 +1673,7 @@ class PixelField(MagicProperties): sizemode: {"constant", "linear", "log"} Symbol size mode relative the the field magnitude. """ - - _allowed_vectorsources = ("B", "H", "J", "M") + _allowed_vectors = ("B", "H", "M", "J") _allowed_symbols = ("cone", "arrow", "arrow3d") _allowed_sizemodes = ("constant", "linear", "log") _allowed_colorscales = ( @@ -1709,39 +1705,25 @@ class PixelField(MagicProperties): ) @property - def vectorsource(self): - """Pixel vector source.""" - return self._vectorsource - - @vectorsource.setter - def vectorsource(self, val): - assert val is None or val in self._allowed_vectorsources, ( - f"The `vectorsource` property of {type(self).__name__} must be one of" - f"{self._allowed_vectorsources},\n" - f"but received {val!r} instead." - ) - self._vectorsource = val - - @property - def colorsource(self): + def source(self): """Pixel vector source.""" - return self._colorsource + return self._source - @colorsource.setter - def colorsource(self, val): + @source.setter + def source(self, val): valid = True if val not in (None, False): field_str, *coords_str = val if not coords_str: coords_str = list("xyz") - if field_str not in "BHMJ" and set(coords_str).difference(set("xyz")): + if field_str not in self._allowed_vectors and set(coords_str).difference(set("xyz")): valid = False assert valid, ( - f"The `colorsource` property of {type(self).__name__} must be None or False or start" - f" with either {self._allowed_vectorsources} and be followed by a combination of" + f"The `source` property of {type(self).__name__} must be None or False or start" + f" with either {self._allowed_vectors} and be followed by a combination of" f" 'x', 'y', 'z' (e.g. 'Bxy' or ('Bxy', 'Bz') ) but received {val!r} instead." ) - self._colorsource = val + self._source = val @property def colorscale(self): diff --git a/tests/test_display_plotly.py b/tests/test_display_plotly.py index 9eee85b4c..099d958e3 100644 --- a/tests/test_display_plotly.py +++ b/tests/test_display_plotly.py @@ -504,25 +504,6 @@ def test_units_length(): assert ax.range == (-r, r) -def test_field_coloring_subplot(): - """Test field coloring in subplots for all colorsource options.""" - c1 = magpy.magnet.Cuboid( - polarization=(1, 0, 0), dimension=(1, 1, 1), style_opacity=0.2 - ) - ls = np.linspace(-1, 1, 3) - s0 = magpy.Sensor(pixel=[[x, y, 0] for x in ls for y in ls], position=(0, 0, 0)) - colorsources = ["H", "Jxy", "Bz", False] - subplots = [] - for i, cs in enumerate(colorsources, 1): - s = s0.copy( - style_pixel_field_vectorsource="B", - style_pixel_field_colorsource=cs, - style_description=str(cs), - ) - subplots.append({"objects": [c1, s], "col": i}) - magpy.show(*subplots, backend="plotly", return_fig=True) - - def test_pixel_field_directional_symbols(): """Test different directional symbols in subplots for all symbol options.""" c1 = magpy.magnet.Cuboid( @@ -534,7 +515,7 @@ def test_pixel_field_directional_symbols(): subplots = [] for i, sym in enumerate(symbols, 1): s = s0.copy( - style_pixel_field_vectorsource="B", + style_pixel_field_source="B", style_pixel_field_symbol=sym, style_description=str(sym), ) @@ -553,7 +534,7 @@ def test_pixel_field_sizing_modes(): subplots = [] for i, sm in enumerate(sizemodes, 1): s = s0.copy( - style_pixel_field_vectorsource="B", + style_pixel_field_source="B", style_pixel_field_sizemode=sm, style_description=str(sm), ) @@ -572,7 +553,7 @@ def test_pixel_field_null_values(): subplots = [] for i, sn in enumerate(shownulls, 1): s = s0.copy( - style_pixel_field_vectorsource="B", + style_pixel_field_source="B", style_pixel_field_shownull=sn, style_description=str(sn), ) @@ -591,7 +572,7 @@ def test_pixel_field_color_scales(): subplots = [] for i, cs in enumerate(colorscales, 1): s = s0.copy( - style_pixel_field_vectorsource="B", + style_pixel_field_source="B", style_pixel_field_colorscale=cs, style_description=str(cs), ) diff --git a/tests/test_obj_BaseGeo.py b/tests/test_obj_BaseGeo.py index 7358c4493..44fb80106 100644 --- a/tests/test_obj_BaseGeo.py +++ b/tests/test_obj_BaseGeo.py @@ -706,8 +706,8 @@ def test_describe_with_exclude_None(): " legend=Legend(show=None, text=None), model3d=Model3d(data=[], showdefault=True)," " opacity=None, path=Path(frames=None, line=Line(color=None, style=None, width=None)," " marker=Marker(color=None, size=None, symbol=None), numbering=None, show=None)," - " pixel=Pixel(color=None, field=PixelField(colorscale=None, colorsource=None," - " shownull=None, sizemode=None, symbol=None, vectorsource=None), size=1," + " pixel=Pixel(color=None, field=PixelField(colorscale=None," + " shownull=None, sizemode=None, symbol=None, source=None), size=1," " sizemode=None, symbol=None), size=None, sizemode=None)" ), " • volume: 0.0", From aa53136279fb61a015b25f80d9aeeccbc14cccf7 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sun, 14 Sep 2025 22:22:53 +0200 Subject: [PATCH 191/211] add loglog + refactor --- docs/_pages/user_guide/docs/docs_styles.md | 1 + src/magpylib/_src/display/traces_core.py | 38 ++++++++-------------- src/magpylib/_src/style.py | 6 ++-- tests/test_display_plotly.py | 2 +- 4 files changed, 18 insertions(+), 29 deletions(-) diff --git a/docs/_pages/user_guide/docs/docs_styles.md b/docs/_pages/user_guide/docs/docs_styles.md index deb59742a..00cc76c37 100644 --- a/docs/_pages/user_guide/docs/docs_styles.md +++ b/docs/_pages/user_guide/docs/docs_styles.md @@ -594,6 +594,7 @@ The `pixel` of a `Sensor` object can be visualized as arrows representing the va - `"constant"`: Uniform arrow size. - `"linear"`: Size proportional to magnitude. - `"log"`: Size proportional to the normalized logarithm of the magnitude. + - `"loglog"`: Size proportional to the normalized logarithm of the logarithm of the magnitude. - **`colorscale`** *(default=`"Viridis"`)*: diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index 21311de91..3fcee9856 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -733,35 +733,23 @@ def make_Sensor( coords = list({"xyz".index(v) for v in coords_str if v in "xyz"}) other_coords = [i for i in range(3) if i not in coords] field_array[..., other_coords] = 0 # set other components to zero + norms = np.linalg.norm(field_array, axis=-1) + is_null_mask = np.logical_or(norms == 0, np.isnan(norms)) + norms[is_null_mask] = np.nan # avoid -inf if sizemode != "constant": - norms = np.linalg.norm(field_array, axis=-1) - if sizemode == "log": - is_null_mask = np.logical_or(norms == 0, np.isnan(norms)) - norms[is_null_mask] = np.min(norms[norms != 0]) - norms = np.log10(norms) - min_, max_ = np.min(norms), np.max(norms) - ptp = max_ - min_ - norms = ( - (norms - min_ + 1) / (ptp + 1) - if ptp != -1 - else norms * 0 + 0.5 - ) - norms[is_null_mask] = 0 - px_sizes *= norms[path_ind] - else: - px_sizes *= norms[path_ind] / np.max(norms) + snorms = norms.copy() + if "log" in sizemode: + for _ in range(sizemode.count("log")): + snorms += np.nanmin(snorms) + 1 # shift to positive range + snorms[~is_null_mask] = np.log(snorms[~is_null_mask]) + px_sizes *= snorms[path_ind] / np.nanmax(snorms) if fsrc: - # get cmin, cmax from whole path - field_mag = np.linalg.norm(field_array, axis=-1) - cmin, cmax = np.amin(field_mag), np.amax(field_mag) - field_mag = field_mag[path_ind] - is_null = (np.abs(field_array[path_ind]) < null_thresh).all(axis=1) - field_mag[is_null] = np.nan + cnorms = norms.copy() px_colors = get_hexcolors_from_scale( - values=field_mag, + values=cnorms[path_ind], colorscale=style.pixel.field.colorscale, - cmin=cmin, - cmax=cmax, + cmin=np.nanmin(cnorms), + cmax=np.nanmax(cnorms), ) pixels_trace = make_Pixels( positions=px_positions, diff --git a/src/magpylib/_src/style.py b/src/magpylib/_src/style.py index d94766e19..4de91a6cc 100644 --- a/src/magpylib/_src/style.py +++ b/src/magpylib/_src/style.py @@ -1670,12 +1670,12 @@ class PixelField(MagicProperties): symbol: {"cone", "arrow", "arrow3d"}: Orientation symbol for field vector. - sizemode: {"constant", "linear", "log"} + sizemode: {"constant", "linear", "log", "loglog"} Symbol size mode relative the the field magnitude. """ _allowed_vectors = ("B", "H", "M", "J") _allowed_symbols = ("cone", "arrow", "arrow3d") - _allowed_sizemodes = ("constant", "linear", "log") + _allowed_sizemodes = ("constant", "linear", "log", "loglog") _allowed_colorscales = ( "Viridis", "Jet", @@ -1768,7 +1768,7 @@ def symbol(self, val): @property def sizemode(self): - """Pixel sizemode. Can be one of `{"constant", "linear", "log"}`.""" + """Pixel sizemode. Can be one of `{"constant", "linear", "log", "loglog"}`.""" return self._sizemode @sizemode.setter diff --git a/tests/test_display_plotly.py b/tests/test_display_plotly.py index 099d958e3..4b16da084 100644 --- a/tests/test_display_plotly.py +++ b/tests/test_display_plotly.py @@ -530,7 +530,7 @@ def test_pixel_field_sizing_modes(): ) ls = np.linspace(-1, 1, 3) s0 = magpy.Sensor(pixel=[[x, y, 0] for x in ls for y in ls], position=(0, 0, 0)) - sizemodes = ["constant", "log", "linear"] + sizemodes = ["constant", "linear", "log", "loglog"] subplots = [] for i, sm in enumerate(sizemodes, 1): s = s0.copy( From 8550c4d70380feb10862dfabaf3d6f8c069dcd0c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 14 Sep 2025 20:23:32 +0000 Subject: [PATCH 192/211] style: pre-commit fixes --- src/magpylib/_src/display/traces_core.py | 2 +- src/magpylib/_src/style.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index 3fcee9856..c921c4219 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -732,7 +732,7 @@ def make_Sensor( coords_str = coords_str if coords_str else "xyz" coords = list({"xyz".index(v) for v in coords_str if v in "xyz"}) other_coords = [i for i in range(3) if i not in coords] - field_array[..., other_coords] = 0 # set other components to zero + field_array[..., other_coords] = 0 # set other components to zero norms = np.linalg.norm(field_array, axis=-1) is_null_mask = np.logical_or(norms == 0, np.isnan(norms)) norms[is_null_mask] = np.nan # avoid -inf diff --git a/src/magpylib/_src/style.py b/src/magpylib/_src/style.py index 4de91a6cc..b2084aaef 100644 --- a/src/magpylib/_src/style.py +++ b/src/magpylib/_src/style.py @@ -1673,6 +1673,7 @@ class PixelField(MagicProperties): sizemode: {"constant", "linear", "log", "loglog"} Symbol size mode relative the the field magnitude. """ + _allowed_vectors = ("B", "H", "M", "J") _allowed_symbols = ("cone", "arrow", "arrow3d") _allowed_sizemodes = ("constant", "linear", "log", "loglog") @@ -1716,7 +1717,9 @@ def source(self, val): field_str, *coords_str = val if not coords_str: coords_str = list("xyz") - if field_str not in self._allowed_vectors and set(coords_str).difference(set("xyz")): + if field_str not in self._allowed_vectors and set(coords_str).difference( + set("xyz") + ): valid = False assert valid, ( f"The `source` property of {type(self).__name__} must be None or False or start" From 762603ee431e21520c77fc34dc798b84fe347d14 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sun, 14 Sep 2025 22:31:17 +0200 Subject: [PATCH 193/211] refactor: rename 'sizemode' to 'sizescaling' for consistency in pixel field styling --- .../examples/examples_vis_vectorfield.md | 2 +- src/magpylib/_src/defaults/defaults_values.py | 2 +- src/magpylib/_src/display/traces_core.py | 11 +++++----- src/magpylib/_src/style.py | 22 +++++++++---------- tests/test_display_plotly.py | 2 +- 5 files changed, 19 insertions(+), 20 deletions(-) diff --git a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md index 11842fafb..b0a1985f1 100644 --- a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md +++ b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md @@ -46,7 +46,7 @@ xy_grid = np.mgrid[-4e-3:4e-3:15j, -4e-3:4e-3:15j, 0:0:1j].T[0] sens = magpy.Sensor( pixel=xy_grid, style_pixel_field_source="B", - style_pixel_field_sizemode="log", + style_pixel_field_sizescaling="log", ) # Display the sensor and magnet using the Plotly backend diff --git a/src/magpylib/_src/defaults/defaults_values.py b/src/magpylib/_src/defaults/defaults_values.py index 79ea54541..1b0fa72e9 100644 --- a/src/magpylib/_src/defaults/defaults_values.py +++ b/src/magpylib/_src/defaults/defaults_values.py @@ -100,7 +100,7 @@ "source": None, "colorscale": "Viridis", "shownull": True, - "sizemode": "constant", + "sizescaling": "constant", }, }, "arrows": { diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index c921c4219..c69772253 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -725,7 +725,7 @@ def make_Sensor( px_colors = "black" if px_color is None else px_color if field_values: fsrc = style.pixel.field.source - sizemode = style.pixel.field.sizemode + sizescaling = style.pixel.field.sizescaling field, *coords_str = fsrc field_array = field_values[field] px_vectors = field_values[field][path_ind] @@ -736,12 +736,11 @@ def make_Sensor( norms = np.linalg.norm(field_array, axis=-1) is_null_mask = np.logical_or(norms == 0, np.isnan(norms)) norms[is_null_mask] = np.nan # avoid -inf - if sizemode != "constant": + if sizescaling != "constant": snorms = norms.copy() - if "log" in sizemode: - for _ in range(sizemode.count("log")): - snorms += np.nanmin(snorms) + 1 # shift to positive range - snorms[~is_null_mask] = np.log(snorms[~is_null_mask]) + for _ in range(sizescaling.count("log")): + snorms += np.nanmin(snorms) + 1 # shift to positive range + snorms[~is_null_mask] = np.log(snorms[~is_null_mask]) px_sizes *= snorms[path_ind] / np.nanmax(snorms) if fsrc: cnorms = norms.copy() diff --git a/src/magpylib/_src/style.py b/src/magpylib/_src/style.py index b2084aaef..3727740ec 100644 --- a/src/magpylib/_src/style.py +++ b/src/magpylib/_src/style.py @@ -1670,13 +1670,13 @@ class PixelField(MagicProperties): symbol: {"cone", "arrow", "arrow3d"}: Orientation symbol for field vector. - sizemode: {"constant", "linear", "log", "loglog"} + sizescaling: {"constant", "linear", "log", "loglog"} Symbol size mode relative the the field magnitude. """ _allowed_vectors = ("B", "H", "M", "J") _allowed_symbols = ("cone", "arrow", "arrow3d") - _allowed_sizemodes = ("constant", "linear", "log", "loglog") + _allowed_scalings = ("constant", "linear", "log", "loglog") _allowed_colorscales = ( "Viridis", "Jet", @@ -1770,18 +1770,18 @@ def symbol(self, val): self._symbol = val @property - def sizemode(self): - """Pixel sizemode. Can be one of `{"constant", "linear", "log", "loglog"}`.""" - return self._sizemode + def sizescaling(self): + """Pixel sizescaling. Can be one of `{"constant", "linear", "log", "loglog"}`.""" + return self._sizescaling - @sizemode.setter - def sizemode(self, val): - assert val is None or val in self._allowed_sizemodes, ( - f"The `sizemode` property of {type(self).__name__} must be one of" - f"{self._allowed_sizemodes},\n" + @sizescaling.setter + def sizescaling(self, val): + assert val is None or val in self._allowed_scalings, ( + f"The `sizescaling` property of {type(self).__name__} must be one of" + f"{self._allowed_scalings},\n" f"but received {val!r} instead." ) - self._sizemode = val + self._sizescaling = val class Pixel(MagicProperties): diff --git a/tests/test_display_plotly.py b/tests/test_display_plotly.py index 4b16da084..ddbbb4b51 100644 --- a/tests/test_display_plotly.py +++ b/tests/test_display_plotly.py @@ -535,7 +535,7 @@ def test_pixel_field_sizing_modes(): for i, sm in enumerate(sizemodes, 1): s = s0.copy( style_pixel_field_source="B", - style_pixel_field_sizemode=sm, + style_pixel_field_sizescaling=sm, style_description=str(sm), ) subplots.append({"objects": [c1, s], "col": i}) From ad7e3bff5fb998f87cd32eea1eb39a929769c6bc Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sun, 14 Sep 2025 22:58:15 +0200 Subject: [PATCH 194/211] feat: add colorscaling property to PixelField --- src/magpylib/_src/defaults/defaults_values.py | 3 ++- src/magpylib/_src/display/traces_core.py | 9 +++++++-- src/magpylib/_src/style.py | 20 ++++++++++++++++++- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/magpylib/_src/defaults/defaults_values.py b/src/magpylib/_src/defaults/defaults_values.py index 1b0fa72e9..e41ef318c 100644 --- a/src/magpylib/_src/defaults/defaults_values.py +++ b/src/magpylib/_src/defaults/defaults_values.py @@ -98,9 +98,10 @@ "field": { "symbol": "cone", "source": None, - "colorscale": "Viridis", + "colorscale": "Rainbow", "shownull": True, "sizescaling": "constant", + "colorscaling": "linear", }, }, "arrows": { diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index c69772253..a56b74a9f 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -725,7 +725,6 @@ def make_Sensor( px_colors = "black" if px_color is None else px_color if field_values: fsrc = style.pixel.field.source - sizescaling = style.pixel.field.sizescaling field, *coords_str = fsrc field_array = field_values[field] px_vectors = field_values[field][path_ind] @@ -736,14 +735,20 @@ def make_Sensor( norms = np.linalg.norm(field_array, axis=-1) is_null_mask = np.logical_or(norms == 0, np.isnan(norms)) norms[is_null_mask] = np.nan # avoid -inf + sizescaling = style.pixel.field.sizescaling if sizescaling != "constant": snorms = norms.copy() for _ in range(sizescaling.count("log")): snorms += np.nanmin(snorms) + 1 # shift to positive range snorms[~is_null_mask] = np.log(snorms[~is_null_mask]) px_sizes *= snorms[path_ind] / np.nanmax(snorms) - if fsrc: + colorscaling = style.pixel.field.colorscaling + if colorscaling != "constant": cnorms = norms.copy() + for _ in range(colorscaling.count("log")): + cnorms += np.nanmin(cnorms) + 1 # shift to positive range + cnorms[~is_null_mask] = np.log(cnorms[~is_null_mask]) + cnorms = cnorms / np.nanmax(cnorms) px_colors = get_hexcolors_from_scale( values=cnorms[path_ind], colorscale=style.pixel.field.colorscale, diff --git a/src/magpylib/_src/style.py b/src/magpylib/_src/style.py index 3727740ec..94a743a8c 100644 --- a/src/magpylib/_src/style.py +++ b/src/magpylib/_src/style.py @@ -1671,7 +1671,10 @@ class PixelField(MagicProperties): Orientation symbol for field vector. sizescaling: {"constant", "linear", "log", "loglog"} - Symbol size mode relative the the field magnitude. + Symbol size scaling relative the the field magnitude. + + colorscaling: {"constant", "linear", "log", "loglog"} + Color scale scaling relative the the field magnitude. """ _allowed_vectors = ("B", "H", "M", "J") @@ -1784,6 +1787,21 @@ def sizescaling(self, val): self._sizescaling = val + @property + def colorscaling(self): + """Pixel colorscaling. Can be one of `{"constant", "linear", "log", "loglog"}`.""" + return self._colorscaling + + @colorscaling.setter + def colorscaling(self, val): + assert val is None or val in self._allowed_scalings, ( + f"The `colorscaling` property of {type(self).__name__} must be one of" + f"{self._allowed_scalings},\n" + f"but received {val!r} instead." + ) + self._colorscaling = val + + class Pixel(MagicProperties): """Defines the styling properties of sensor pixels. From 2d21044d1deb336d04a860911342b51bf04a7570 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 14 Sep 2025 20:58:31 +0000 Subject: [PATCH 195/211] style: pre-commit fixes --- src/magpylib/_src/style.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/magpylib/_src/style.py b/src/magpylib/_src/style.py index 94a743a8c..70e8f9287 100644 --- a/src/magpylib/_src/style.py +++ b/src/magpylib/_src/style.py @@ -1786,7 +1786,6 @@ def sizescaling(self, val): ) self._sizescaling = val - @property def colorscaling(self): """Pixel colorscaling. Can be one of `{"constant", "linear", "log", "loglog"}`.""" From 5b33823861aeafe7e521de6219f5f708d3505b79 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Sun, 14 Sep 2025 23:16:40 +0200 Subject: [PATCH 196/211] refactor: rename 'sizemode' to 'sizescaling' for consistency in pixel field styling --- docs/_pages/user_guide/examples/examples_vis_vectorfield.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md index b0a1985f1..6480fe3fe 100644 --- a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md +++ b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md @@ -92,7 +92,7 @@ sensor2 = magpy.Sensor( pixel=pixel_grid2, style_pixel_field={ "source": "H", - "sizemode": "constant", + "sizescaling": "constant", "colorscale": "Blues", "symbol": "arrow3d", } @@ -107,7 +107,7 @@ sensor3 = magpy.Sensor( pixel=pixel_grid3, style_pixel_field={ "source": "H", - "sizemode": "log", + "sizescaling": "log", "colorscale": "Plasma", "symbol": "arrow3d", } From a5c0e2ee4641a244680f795072a6593b54705e11 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Mon, 15 Sep 2025 10:32:43 +0200 Subject: [PATCH 197/211] fix: handle NaN values in normalization calculations for sensor sizes and color scales --- src/magpylib/_src/display/traces_core.py | 3 +++ src/magpylib/_src/display/traces_utility.py | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index a56b74a9f..97fd0c4b7 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -735,6 +735,9 @@ def make_Sensor( norms = np.linalg.norm(field_array, axis=-1) is_null_mask = np.logical_or(norms == 0, np.isnan(norms)) norms[is_null_mask] = np.nan # avoid -inf + nmin, nmax = np.nanmin(norms), np.nanmax(norms) + ptp = nmax - nmin + norms = (norms - nmin) / ptp if ptp != 0 else norms * 0 + 0.5 sizescaling = style.pixel.field.sizescaling if sizescaling != "constant": snorms = norms.copy() diff --git a/src/magpylib/_src/display/traces_utility.py b/src/magpylib/_src/display/traces_utility.py index 8ba1d59aa..d62518711 100644 --- a/src/magpylib/_src/display/traces_utility.py +++ b/src/magpylib/_src/display/traces_utility.py @@ -930,8 +930,8 @@ def get_hexcolors_from_scale( values = np.array(values) nan_mask = np.isnan(values) valid = values[~nan_mask] - cmin = np.min(valid) if cmin is None else cmin - cmax = np.max(valid) if cmax is None else cmax + cmin = np.nanmin(valid) if cmin is None else cmin + cmax = np.nanmax(valid) if cmax is None else cmax ptp = cmax - cmin values = (values - cmin) / ptp if ptp != 0 else values * 0 + 0.5 rgb_colors = sample_colorscale(colorscale, values[~nan_mask], colortype=None) From b93d488f2e81839327981e150bb9f0ebd97d78a8 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Mon, 15 Sep 2025 10:35:45 +0200 Subject: [PATCH 198/211] refactor: update 'sizemode' to 'uniform' for consistency across styles and defaults --- docs/_pages/user_guide/docs/docs_styles.md | 6 +++--- .../user_guide/examples/examples_vis_vectorfield.md | 2 +- src/magpylib/_src/defaults/defaults_values.py | 2 +- src/magpylib/_src/display/traces_core.py | 4 ++-- src/magpylib/_src/style.py | 10 +++++----- tests/test_display_plotly.py | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/_pages/user_guide/docs/docs_styles.md b/docs/_pages/user_guide/docs/docs_styles.md index 00cc76c37..63f282bff 100644 --- a/docs/_pages/user_guide/docs/docs_styles.md +++ b/docs/_pages/user_guide/docs/docs_styles.md @@ -589,9 +589,9 @@ The `pixel` of a `Sensor` object can be visualized as arrows representing the va - `True`: Null vectors are displayed. - `False`: Null vectors are hidden. -- **`sizemode`** *(default=`"constant"`)*: +- **`sizemode`** *(default=`"uniform"`)*: Determines how arrow size relates to the `source` magnitude. - - `"constant"`: Uniform arrow size. + - `"uniform"`: Uniform arrow size. - `"linear"`: Size proportional to magnitude. - `"log"`: Size proportional to the normalized logarithm of the magnitude. - `"loglog"`: Size proportional to the normalized logarithm of the logarithm of the magnitude. @@ -628,7 +628,7 @@ xy_grid = np.mgrid[-2:2:15j, -2:2:15j, 0:0:1j].T[0] pixel_style = { "source" : "B", "symbol" : "arrow3d", - "sizemode" : "constant", + "sizemode" : "uniform", "shownull" : True, "colorscale" : "Magma" } diff --git a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md index 6480fe3fe..1ee773df5 100644 --- a/docs/_pages/user_guide/examples/examples_vis_vectorfield.md +++ b/docs/_pages/user_guide/examples/examples_vis_vectorfield.md @@ -92,7 +92,7 @@ sensor2 = magpy.Sensor( pixel=pixel_grid2, style_pixel_field={ "source": "H", - "sizescaling": "constant", + "sizescaling": "uniform", "colorscale": "Blues", "symbol": "arrow3d", } diff --git a/src/magpylib/_src/defaults/defaults_values.py b/src/magpylib/_src/defaults/defaults_values.py index e41ef318c..cc694b34b 100644 --- a/src/magpylib/_src/defaults/defaults_values.py +++ b/src/magpylib/_src/defaults/defaults_values.py @@ -100,7 +100,7 @@ "source": None, "colorscale": "Rainbow", "shownull": True, - "sizescaling": "constant", + "sizescaling": "uniform", "colorscaling": "linear", }, }, diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index 97fd0c4b7..8b4b5e8aa 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -739,14 +739,14 @@ def make_Sensor( ptp = nmax - nmin norms = (norms - nmin) / ptp if ptp != 0 else norms * 0 + 0.5 sizescaling = style.pixel.field.sizescaling - if sizescaling != "constant": + if sizescaling != "uniform": snorms = norms.copy() for _ in range(sizescaling.count("log")): snorms += np.nanmin(snorms) + 1 # shift to positive range snorms[~is_null_mask] = np.log(snorms[~is_null_mask]) px_sizes *= snorms[path_ind] / np.nanmax(snorms) colorscaling = style.pixel.field.colorscaling - if colorscaling != "constant": + if colorscaling != "uniform": cnorms = norms.copy() for _ in range(colorscaling.count("log")): cnorms += np.nanmin(cnorms) + 1 # shift to positive range diff --git a/src/magpylib/_src/style.py b/src/magpylib/_src/style.py index 70e8f9287..b39d2d94e 100644 --- a/src/magpylib/_src/style.py +++ b/src/magpylib/_src/style.py @@ -1670,16 +1670,16 @@ class PixelField(MagicProperties): symbol: {"cone", "arrow", "arrow3d"}: Orientation symbol for field vector. - sizescaling: {"constant", "linear", "log", "loglog"} + sizescaling: {"uniform", "linear", "log", "loglog"} Symbol size scaling relative the the field magnitude. - colorscaling: {"constant", "linear", "log", "loglog"} + colorscaling: {"uniform", "linear", "log", "loglog"} Color scale scaling relative the the field magnitude. """ _allowed_vectors = ("B", "H", "M", "J") _allowed_symbols = ("cone", "arrow", "arrow3d") - _allowed_scalings = ("constant", "linear", "log", "loglog") + _allowed_scalings = ("uniform", "linear", "log", "loglog") _allowed_colorscales = ( "Viridis", "Jet", @@ -1774,7 +1774,7 @@ def symbol(self, val): @property def sizescaling(self): - """Pixel sizescaling. Can be one of `{"constant", "linear", "log", "loglog"}`.""" + """Pixel sizescaling. Can be one of `{"uniform", "linear", "log", "loglog"}`.""" return self._sizescaling @sizescaling.setter @@ -1788,7 +1788,7 @@ def sizescaling(self, val): @property def colorscaling(self): - """Pixel colorscaling. Can be one of `{"constant", "linear", "log", "loglog"}`.""" + """Pixel colorscaling. Can be one of `{"uniform", "linear", "log", "loglog"}`.""" return self._colorscaling @colorscaling.setter diff --git a/tests/test_display_plotly.py b/tests/test_display_plotly.py index ddbbb4b51..04f70e85e 100644 --- a/tests/test_display_plotly.py +++ b/tests/test_display_plotly.py @@ -530,7 +530,7 @@ def test_pixel_field_sizing_modes(): ) ls = np.linspace(-1, 1, 3) s0 = magpy.Sensor(pixel=[[x, y, 0] for x in ls for y in ls], position=(0, 0, 0)) - sizemodes = ["constant", "linear", "log", "loglog"] + sizemodes = ["uniform", "linear", "log", "loglog"] subplots = [] for i, sm in enumerate(sizemodes, 1): s = s0.copy( From 1728bb805b61a1d1a240972c2fd553dd33257396 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Mon, 15 Sep 2025 10:38:53 +0200 Subject: [PATCH 199/211] refactor: rename 'sizemode' to 'sizescaling' and add 'colorscaling' for improved clarity in Pixel Field documentation --- docs/_pages/user_guide/docs/docs_styles.md | 25 ++++++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/docs/_pages/user_guide/docs/docs_styles.md b/docs/_pages/user_guide/docs/docs_styles.md index 63f282bff..37841002a 100644 --- a/docs/_pages/user_guide/docs/docs_styles.md +++ b/docs/_pages/user_guide/docs/docs_styles.md @@ -13,6 +13,7 @@ orphan: true --- (guide-graphic-styles)= + # Graphic styles The graphic styles define how Magpylib objects are displayed visually when calling `show`. They can be fine-tuned and individualized to suit requirements and taste. @@ -26,6 +27,7 @@ Graphic styles can be defined in various ways: The following sections describe these styling options and how to customize them. (guide-graphic-styles-default)= + ## Default style The default style is stored in `magpylib.defaults.display.style`. Note that the installation default styles differ slightly between different [graphic backends](guide-graphic-backends) depending on their respective capabilities. Specifically, the magnet magnetization in Matplotlib is displayed with arrows by default, while it is displayed using a color scheme in Plotly and Pyvista. The color scheme is also implemented in Matplotlib, but it is visually unsatisfactory. @@ -109,7 +111,6 @@ The default Magpylib style abides by the tri-color scheme for ideal-typical magn A list of all style options can be found [here](examples-list-of-styles). - ## Magic underscore notation To facilitate working with deeply nested properties, all style constructors and object style methods support the "magic underscore notation". It enables referencing nested properties by joining together multiple property names with underscores. This feature mainly helps reduce the code verbosity and is heavily inspired by the [Plotly underscore notation](https://plotly.com/python/creating-and-updating-figures/#magic-underscore-notation)). @@ -246,6 +247,7 @@ magpy.defaults.display.style.as_dict(flatten=True, separator=".") ``` (examples-own-3d-models)= + ## Custom 3D models Each Magpylib object has a default 3D representation that is displayed with `show`. It is possible to disable the default model and to provide Magpylib with a custom model. @@ -471,6 +473,7 @@ obj0.show(obj1, obj2, obj3, obj4, obj5, backend="plotly") ``` ((guide-docs-style-cad))= + ## Adding a CAD model The following code sample shows how a standard CAD model (*.stl file) can be transformed into a Magpylib `Trace3d` object. @@ -563,6 +566,7 @@ magpy.show(args, **kwargs, backend="plotly") ``` (styles-pixel-vectorfield)= + ## Pixel Field :::{versionadded} 5.2 @@ -589,13 +593,19 @@ The `pixel` of a `Sensor` object can be visualized as arrows representing the va - `True`: Null vectors are displayed. - `False`: Null vectors are hidden. -- **`sizemode`** *(default=`"uniform"`)*: - Determines how arrow size relates to the `source` magnitude. - - `"uniform"`: Uniform arrow size. - - `"linear"`: Size proportional to magnitude. - - `"log"`: Size proportional to the normalized logarithm of the magnitude. - - `"loglog"`: Size proportional to the normalized logarithm of the logarithm of the magnitude. +**`sizescaling`** *(default=`"uniform"`)*: + Determines how arrow size relates to the `source` magnitude. + - `"uniform"`: Uniform arrow size. + - `"linear"`: Size proportional to magnitude. + - `"log"`: Size proportional to the normalized logarithm of the magnitude. + - `"loglog"`: Size proportional to the normalized logarithm of the logarithm of the magnitude. +**`colorscaling`** *(default=`"uniform"`)*: + Determines how arrow color relates to the `source` magnitude. + - `"uniform"`: Uniform color for all arrows. + - `"linear"`: Color proportional to magnitude. + - `"log"`: Color proportional to the normalized logarithm of the magnitude. + - `"loglog"`: Color proportional to the normalized logarithm of the logarithm of the magnitude. - **`colorscale`** *(default=`"Viridis"`)*: Specifies the colormap used for color mapping. Supports standard color maps (e.g., `"Viridis"`, `"Inferno"`, `"Magma"`, etc.) compatible with both Plotly and Matplotlib. @@ -607,6 +617,7 @@ The `pixel` of a `Sensor` object can be visualized as arrows representing the va ```` ### Pixel Field Minimal Example + The following example demonstrates how to visualize the `Sensor` pixel array as a vector field using the `style.pixel.field` settings. ```{code-cell} ipython3 From 5b30483eed6fb5d4d26fcac8a51ac4abc7451bc4 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Mon, 15 Sep 2025 10:57:21 +0200 Subject: [PATCH 200/211] refactor: rename 'colorscale' to 'colormap' for consistency in PixelField and related functions --- docs/_pages/user_guide/docs/docs_styles.md | 4 ++-- src/magpylib/_src/display/traces_core.py | 6 +++--- src/magpylib/_src/display/traces_utility.py | 6 +++--- src/magpylib/_src/style.py | 22 ++++++++++----------- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/_pages/user_guide/docs/docs_styles.md b/docs/_pages/user_guide/docs/docs_styles.md index 37841002a..fa1c2a283 100644 --- a/docs/_pages/user_guide/docs/docs_styles.md +++ b/docs/_pages/user_guide/docs/docs_styles.md @@ -607,7 +607,7 @@ The `pixel` of a `Sensor` object can be visualized as arrows representing the va - `"log"`: Color proportional to the normalized logarithm of the magnitude. - `"loglog"`: Color proportional to the normalized logarithm of the logarithm of the magnitude. -- **`colorscale`** *(default=`"Viridis"`)*: +- **`colormap`** *(default=`"Viridis"`)*: Specifies the colormap used for color mapping. Supports standard color maps (e.g., `"Viridis"`, `"Inferno"`, `"Magma"`, etc.) compatible with both Plotly and Matplotlib. ````{note} @@ -641,7 +641,7 @@ pixel_style = { "symbol" : "arrow3d", "sizemode" : "uniform", "shownull" : True, - "colorscale" : "Magma" + "colormap" : "Magma" } # Create sensor with pixel array and applied style diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index 8b4b5e8aa..ec15ec366 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -32,7 +32,7 @@ create_null_dim_trace, draw_arrow_from_vertices, draw_arrow_on_circle, - get_hexcolors_from_scale, + get_hexcolors_from_colormap, get_legend_label, get_orientation_from_vec, group_traces, @@ -752,9 +752,9 @@ def make_Sensor( cnorms += np.nanmin(cnorms) + 1 # shift to positive range cnorms[~is_null_mask] = np.log(cnorms[~is_null_mask]) cnorms = cnorms / np.nanmax(cnorms) - px_colors = get_hexcolors_from_scale( + px_colors = get_hexcolors_from_colormap( values=cnorms[path_ind], - colorscale=style.pixel.field.colorscale, + colormap=style.pixel.field.colormap, cmin=np.nanmin(cnorms), cmax=np.nanmax(cnorms), ) diff --git a/src/magpylib/_src/display/traces_utility.py b/src/magpylib/_src/display/traces_utility.py index d62518711..aa3a92d7b 100644 --- a/src/magpylib/_src/display/traces_utility.py +++ b/src/magpylib/_src/display/traces_utility.py @@ -918,9 +918,9 @@ def create_null_dim_trace(color=None, **kwargs): return {**trace, **kwargs} -def get_hexcolors_from_scale( +def get_hexcolors_from_colormap( values, - colorscale, + colormap, cmin=None, cmax=None, nan_color="#b2beb5", @@ -934,7 +934,7 @@ def get_hexcolors_from_scale( cmax = np.nanmax(valid) if cmax is None else cmax ptp = cmax - cmin values = (values - cmin) / ptp if ptp != 0 else values * 0 + 0.5 - rgb_colors = sample_colorscale(colorscale, values[~nan_mask], colortype=None) + rgb_colors = sample_colorscale(colormap, values[~nan_mask], colortype=None) hex_colors = [rgb2hex(rgb) for rgb in rgb_colors] out = np.array([""] * len(values), dtype=" Date: Mon, 15 Sep 2025 13:20:16 +0200 Subject: [PATCH 201/211] refactor: update scaling options to include 'log^n' notation for sizescaling and colorscaling --- docs/_pages/user_guide/docs/docs_styles.md | 8 ++--- src/magpylib/_src/display/traces_core.py | 36 ++++++++++++++-------- src/magpylib/_src/style.py | 30 +++++++++--------- tests/test_display_plotly.py | 2 +- 4 files changed, 43 insertions(+), 33 deletions(-) diff --git a/docs/_pages/user_guide/docs/docs_styles.md b/docs/_pages/user_guide/docs/docs_styles.md index fa1c2a283..c25d977a3 100644 --- a/docs/_pages/user_guide/docs/docs_styles.md +++ b/docs/_pages/user_guide/docs/docs_styles.md @@ -598,14 +598,14 @@ The `pixel` of a `Sensor` object can be visualized as arrows representing the va - `"uniform"`: Uniform arrow size. - `"linear"`: Size proportional to magnitude. - `"log"`: Size proportional to the normalized logarithm of the magnitude. - - `"loglog"`: Size proportional to the normalized logarithm of the logarithm of the magnitude. + - `"log^n"`: Size proportional to the normalized nth (2 to 9) logarithm of the magnitude. **`colorscaling`** *(default=`"uniform"`)*: Determines how arrow color relates to the `source` magnitude. - `"uniform"`: Uniform color for all arrows. - - `"linear"`: Color proportional to magnitude. - - `"log"`: Color proportional to the normalized logarithm of the magnitude. - - `"loglog"`: Color proportional to the normalized logarithm of the logarithm of the magnitude. + - `"linear"`: Color scaling proportional to magnitude. + - `"log"`: Color scaling proportional to the normalized logarithm of the magnitude. + - `"log^n"`: Color scaling proportional to the normalized nth (2 to 9) logarithm of the magnitude. - **`colormap`** *(default=`"Viridis"`)*: Specifies the colormap used for color mapping. Supports standard color maps (e.g., `"Viridis"`, `"Inferno"`, `"Magma"`, etc.) compatible with both Plotly and Matplotlib. diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index ec15ec366..e582168fb 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -555,6 +555,19 @@ def make_TriangularMesh(obj, **kwargs) -> dict[str, Any] | list[dict[str, Any]]: return traces +def _apply_scaling_transformation(norms, scaling_type, is_null_mask, path_ind): + scaled_norms = norms.copy() + log_iterations = ( + int(scaling_type[4]) + if scaling_type.startswith("log^") + else scaling_type.count("log") + ) + for _ in range(log_iterations): + scaled_norms += np.nanmin(scaled_norms) + 1 # shift to positive range + scaled_norms[~is_null_mask] = np.log(scaled_norms[~is_null_mask]) + return scaled_norms[path_ind] / np.nanmax(scaled_norms) + + def make_Pixels( *, positions, @@ -740,23 +753,20 @@ def make_Sensor( norms = (norms - nmin) / ptp if ptp != 0 else norms * 0 + 0.5 sizescaling = style.pixel.field.sizescaling if sizescaling != "uniform": - snorms = norms.copy() - for _ in range(sizescaling.count("log")): - snorms += np.nanmin(snorms) + 1 # shift to positive range - snorms[~is_null_mask] = np.log(snorms[~is_null_mask]) - px_sizes *= snorms[path_ind] / np.nanmax(snorms) + snorms_scaled = _apply_scaling_transformation( + norms, sizescaling, is_null_mask, path_ind + ) + px_sizes *= snorms_scaled colorscaling = style.pixel.field.colorscaling if colorscaling != "uniform": - cnorms = norms.copy() - for _ in range(colorscaling.count("log")): - cnorms += np.nanmin(cnorms) + 1 # shift to positive range - cnorms[~is_null_mask] = np.log(cnorms[~is_null_mask]) - cnorms = cnorms / np.nanmax(cnorms) + cnorms_scaled = _apply_scaling_transformation( + norms, colorscaling, is_null_mask, path_ind + ) px_colors = get_hexcolors_from_colormap( - values=cnorms[path_ind], + values=cnorms_scaled, colormap=style.pixel.field.colormap, - cmin=np.nanmin(cnorms), - cmax=np.nanmax(cnorms), + cmin=0, # scaled values are normalized to [0, 1] + cmax=1, ) pixels_trace = make_Pixels( positions=px_positions, diff --git a/src/magpylib/_src/style.py b/src/magpylib/_src/style.py index 8df3089b5..dca2c0f5e 100644 --- a/src/magpylib/_src/style.py +++ b/src/magpylib/_src/style.py @@ -5,6 +5,8 @@ # pylint: disable=cyclic-import # pylint: disable=too-many-positional-arguments +import re + import numpy as np from magpylib._src.defaults.defaults_utility import ( @@ -1670,16 +1672,16 @@ class PixelField(MagicProperties): symbol: {"cone", "arrow", "arrow3d"}: Orientation symbol for field vector. - sizescaling: {"uniform", "linear", "log", "loglog"} + sizescaling: {"uniform", "linear","log","log^[2-9]"} Symbol size scaling relative the the field magnitude. - colorscaling: {"uniform", "linear", "log", "loglog"} + colorscaling: {"uniform", "linear","log","log^[2-9]"} Color scale scaling relative the the field magnitude. """ + _allowed_scalings_pattern = r"^(uniform|linear|(log)+|log\^[2-9])$" _allowed_vectors = ("B", "H", "M", "J") _allowed_symbols = ("cone", "arrow", "arrow3d") - _allowed_scalings = ("uniform", "linear", "log", "loglog") _allowed_colormaps = ( "Viridis", "Jet", @@ -1774,31 +1776,29 @@ def symbol(self, val): @property def sizescaling(self): - """Pixel sizescaling. Can be one of `{"uniform", "linear", "log", "loglog"}`.""" + """Pixel sizescaling. Can be one of `{"uniform", "linear","log","log^[2-9]"}`.""" return self._sizescaling @sizescaling.setter def sizescaling(self, val): - assert val is None or val in self._allowed_scalings, ( - f"The `sizescaling` property of {type(self).__name__} must be one of" - f"{self._allowed_scalings},\n" - f"but received {val!r} instead." - ) - self._sizescaling = val + self._sizescaling = self._validate_scaling(val, name="sizescaling") @property def colorscaling(self): - """Pixel colorscaling. Can be one of `{"uniform", "linear", "log", "loglog"}`.""" + """Pixel colorscaling. Can be one of `{"uniform", "linear","log","log^[2-9]"}`.""" return self._colorscaling @colorscaling.setter def colorscaling(self, val): - assert val is None or val in self._allowed_scalings, ( - f"The `colorscaling` property of {type(self).__name__} must be one of" - f"{self._allowed_scalings},\n" + self._colorscaling = self._validate_scaling(val, name="colorscaling") + + def _validate_scaling(self, val, name): + assert val is None or re.match(self._allowed_scalings_pattern, str(val)), ( + f"The `{name}` property of {type(self).__name__} must match the regex pattern" + f" {self._allowed_scalings_pattern},\n" f"but received {val!r} instead." ) - self._colorscaling = val + return val class Pixel(MagicProperties): diff --git a/tests/test_display_plotly.py b/tests/test_display_plotly.py index 04f70e85e..d8fd27129 100644 --- a/tests/test_display_plotly.py +++ b/tests/test_display_plotly.py @@ -530,7 +530,7 @@ def test_pixel_field_sizing_modes(): ) ls = np.linspace(-1, 1, 3) s0 = magpy.Sensor(pixel=[[x, y, 0] for x in ls for y in ls], position=(0, 0, 0)) - sizemodes = ["uniform", "linear", "log", "loglog"] + sizemodes = ["uniform", "linear", "log", "log^2", "log^9"] subplots = [] for i, sm in enumerate(sizemodes, 1): s = s0.copy( From adeffaa28958fb45985a013903c7dd3b7c801b9a Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Mon, 15 Sep 2025 14:24:57 +0200 Subject: [PATCH 202/211] refactor: expand allowed symbols in PixelField to include 'cube' and 'none' --- docs/_pages/user_guide/docs/docs_styles.md | 4 +++- src/magpylib/_src/display/traces_core.py | 18 ++++++++++++++---- src/magpylib/_src/style.py | 2 +- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/docs/_pages/user_guide/docs/docs_styles.md b/docs/_pages/user_guide/docs/docs_styles.md index c25d977a3..d64f20f5d 100644 --- a/docs/_pages/user_guide/docs/docs_styles.md +++ b/docs/_pages/user_guide/docs/docs_styles.md @@ -583,10 +583,12 @@ The `pixel` of a `Sensor` object can be visualized as arrows representing the va - `"B"`, `"Hxy"`, `"Jxyz"`, etc.: Colors are mapped to the magnitude of the specified field. - **`symbol`** *(default=`"cone"`)*: - Specifies the rendering symbol for arrows. + Specifies the rendering symbol for field values. + - `"none"`: `pixel.symbol` representation takes precedence of `pixel.field.symbol`. - `"cone"`: 3D cone representation. - `"arrow3d"`: 3D arrow representation. - `"arrow"`: 2D line-based arrow. + - `"cube"`: 2D line-based arrow (not orientable). - **`shownull`** *(default=`True`)*: Toggles the visibility of pixel with zero and invalid field vectors. diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index e582168fb..06213fd78 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -606,7 +606,13 @@ def make_Pixels( pixels = [] orientations = None is_null_vec = None - allowed_symbols = ("cone", "arrow", "arrow3d") + allowed_symbols = { + "cone": {"type": "mesh3d", "orientable": True}, + "arrow": {"type": "scatter3d", "orientable": True}, + "arrow3d": {"type": "mesh3d", "orientable": True}, + "cube": {"type": "mesh3d", "orientable": False}, + "none": {"type": "scatter3d", "orientable": False}, + } if field_symbol not in allowed_symbols: # pragma: no cover msg = ( f"Invalid pixel field symbol (must be one of {allowed_symbols})" @@ -627,7 +633,11 @@ def make_Pixels( } pix = None size = sizes[ind] if is_array_like(sizes) else sizes - if vectors is not None and not is_null_vec[ind]: + if ( + allowed_symbols[field_symbol]["orientable"] + and vectors is not None + and not is_null_vec[ind] + ): orient = orientations[ind] kw.update(orientation=orient, base=5, diameter=size, height=size * 2) if field_symbol == "cone": @@ -638,7 +648,7 @@ def make_Pixels( pix = make_BaseArrow(**kw, **kw2d) pix["marker_size"] = np.repeat(0.0, len(pix["x"])) elif vectors is None or shownull: - if field_symbol == "arrow": + if allowed_symbols[field_symbol]["type"] == "scatter3d": x, y, z = pos[:, None] pix = { "x": x, @@ -652,7 +662,7 @@ def make_Pixels( if pix is not None: if colors is not None: color = colors[ind] if is_array_like(colors) else colors - if field_symbol == "arrow": + if allowed_symbols[field_symbol]["type"] == "scatter3d": pix["line_color"] = np.repeat(color, len(pix["x"])) pix["marker_color"] = pix["line_color"] else: diff --git a/src/magpylib/_src/style.py b/src/magpylib/_src/style.py index dca2c0f5e..73881fd1f 100644 --- a/src/magpylib/_src/style.py +++ b/src/magpylib/_src/style.py @@ -1681,7 +1681,7 @@ class PixelField(MagicProperties): _allowed_scalings_pattern = r"^(uniform|linear|(log)+|log\^[2-9])$" _allowed_vectors = ("B", "H", "M", "J") - _allowed_symbols = ("cone", "arrow", "arrow3d") + _allowed_symbols = ("cone", "arrow", "arrow3d", "cube", "none") _allowed_colormaps = ( "Viridis", "Jet", From 1433c7c11ab97841f9ddea1df037b4f135bbf264 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Mon, 15 Sep 2025 20:44:53 +0200 Subject: [PATCH 203/211] refactor: rename 'colorscale' to 'colormap' in DEFAULTS for consistency --- src/magpylib/_src/defaults/defaults_values.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/magpylib/_src/defaults/defaults_values.py b/src/magpylib/_src/defaults/defaults_values.py index cc694b34b..4513602ff 100644 --- a/src/magpylib/_src/defaults/defaults_values.py +++ b/src/magpylib/_src/defaults/defaults_values.py @@ -98,7 +98,7 @@ "field": { "symbol": "cone", "source": None, - "colorscale": "Rainbow", + "colormap": "Rainbow", "shownull": True, "sizescaling": "uniform", "colorscaling": "linear", From 99c9d471e73c38307e9f12dc7685fda63bfa4837 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Mon, 15 Sep 2025 21:38:10 +0200 Subject: [PATCH 204/211] refactor: remove 'cube' symbol from allowed symbols and update default symbol handling in PixelField --- docs/_pages/user_guide/docs/docs_styles.md | 1 - src/magpylib/_src/defaults/defaults_values.py | 2 +- src/magpylib/_src/display/traces_core.py | 18 ++++++++---------- src/magpylib/_src/style.py | 13 +++++++------ 4 files changed, 16 insertions(+), 18 deletions(-) diff --git a/docs/_pages/user_guide/docs/docs_styles.md b/docs/_pages/user_guide/docs/docs_styles.md index d64f20f5d..887fac878 100644 --- a/docs/_pages/user_guide/docs/docs_styles.md +++ b/docs/_pages/user_guide/docs/docs_styles.md @@ -588,7 +588,6 @@ The `pixel` of a `Sensor` object can be visualized as arrows representing the va - `"cone"`: 3D cone representation. - `"arrow3d"`: 3D arrow representation. - `"arrow"`: 2D line-based arrow. - - `"cube"`: 2D line-based arrow (not orientable). - **`shownull`** *(default=`True`)*: Toggles the visibility of pixel with zero and invalid field vectors. diff --git a/src/magpylib/_src/defaults/defaults_values.py b/src/magpylib/_src/defaults/defaults_values.py index 4513602ff..db6a782e1 100644 --- a/src/magpylib/_src/defaults/defaults_values.py +++ b/src/magpylib/_src/defaults/defaults_values.py @@ -94,7 +94,7 @@ "size": 1, "sizemode": "scaled", "color": None, - "symbol": None, + "symbol": "cube", "field": { "symbol": "cone", "source": None, diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index 06213fd78..33ee95d81 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -606,19 +606,16 @@ def make_Pixels( pixels = [] orientations = None is_null_vec = None + if field_symbol in ("none", None): + field_symbol = symbol if symbol is not None else "cube" allowed_symbols = { "cone": {"type": "mesh3d", "orientable": True}, "arrow": {"type": "scatter3d", "orientable": True}, "arrow3d": {"type": "mesh3d", "orientable": True}, "cube": {"type": "mesh3d", "orientable": False}, - "none": {"type": "scatter3d", "orientable": False}, } - if field_symbol not in allowed_symbols: # pragma: no cover - msg = ( - f"Invalid pixel field symbol (must be one of {allowed_symbols})" - f", got {field_symbol!r}" - ) - raise ValueError(msg) + orientable = allowed_symbols.get(field_symbol, {"orientable": False}).get("orientable") + trace_type = allowed_symbols.get(field_symbol, {"type": "scatter3d"}).get("type") if vectors is not None: orientations = get_orientation_from_vec(vectors) is_null_vec = (np.abs(vectors) < null_thresh).all(axis=1) @@ -634,7 +631,7 @@ def make_Pixels( pix = None size = sizes[ind] if is_array_like(sizes) else sizes if ( - allowed_symbols[field_symbol]["orientable"] + orientable and vectors is not None and not is_null_vec[ind] ): @@ -648,7 +645,7 @@ def make_Pixels( pix = make_BaseArrow(**kw, **kw2d) pix["marker_size"] = np.repeat(0.0, len(pix["x"])) elif vectors is None or shownull: - if allowed_symbols[field_symbol]["type"] == "scatter3d": + if trace_type == "scatter3d": x, y, z = pos[:, None] pix = { "x": x, @@ -662,7 +659,7 @@ def make_Pixels( if pix is not None: if colors is not None: color = colors[ind] if is_array_like(colors) else colors - if allowed_symbols[field_symbol]["type"] == "scatter3d": + if trace_type == "scatter3d": pix["line_color"] = np.repeat(color, len(pix["x"])) pix["marker_color"] = pix["line_color"] else: @@ -766,6 +763,7 @@ def make_Sensor( snorms_scaled = _apply_scaling_transformation( norms, sizescaling, is_null_mask, path_ind ) + snorms_scaled[is_null_mask[path_ind]] = 1 # keep null sizes unscaled px_sizes *= snorms_scaled colorscaling = style.pixel.field.colorscaling if colorscaling != "uniform": diff --git a/src/magpylib/_src/style.py b/src/magpylib/_src/style.py index 73881fd1f..5dd056c44 100644 --- a/src/magpylib/_src/style.py +++ b/src/magpylib/_src/style.py @@ -1681,7 +1681,7 @@ class PixelField(MagicProperties): _allowed_scalings_pattern = r"^(uniform|linear|(log)+|log\^[2-9])$" _allowed_vectors = ("B", "H", "M", "J") - _allowed_symbols = ("cone", "arrow", "arrow3d", "cube", "none") + _allowed_symbols = ("cone", "arrow", "arrow3d", "none") _allowed_colormaps = ( "Viridis", "Jet", @@ -1819,10 +1819,11 @@ class Pixel(MagicProperties): Defines the pixel color@property. symbol: str, default=None - Pixel symbol. Can be one of `['.', 'o', '+', 'D', 'd', 's', 'x']`. - Only applies for matplotlib plotting backend. + Pixel symbol. Can be one of `['cube', '.', 'o', '+', 'D', 'd', 's', 'x']`. """ + _allowed_symbols = ("cube", *ALLOWED_SYMBOLS) + def __init__(self, size=1, sizemode=None, color=None, symbol=None, **kwargs): super().__init__( size=size, @@ -1871,14 +1872,14 @@ def color(self, val): @property def symbol(self): - """Pixel symbol. Can be one of `['.', 'o', '+', 'D', 'd', 's', 'x']`.""" + """Pixel symbol. Can be one of `['cube', '.', 'o', '+', 'D', 'd', 's', 'x']`.""" return self._symbol @symbol.setter def symbol(self, val): - assert val is None or val in ALLOWED_SYMBOLS, ( + assert val is None or val in self._allowed_symbols, ( f"The `symbol` property of {type(self).__name__} must be one of" - f"{ALLOWED_SYMBOLS},\n" + f"{self._allowed_symbols},\n" f"but received {val!r} instead." ) self._symbol = val From 949e32050621dbcd365be6ac894b1e59b78b4aec Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 19:38:26 +0000 Subject: [PATCH 205/211] style: pre-commit fixes --- src/magpylib/_src/display/traces_core.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index 33ee95d81..b18b69a28 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -614,7 +614,9 @@ def make_Pixels( "arrow3d": {"type": "mesh3d", "orientable": True}, "cube": {"type": "mesh3d", "orientable": False}, } - orientable = allowed_symbols.get(field_symbol, {"orientable": False}).get("orientable") + orientable = allowed_symbols.get(field_symbol, {"orientable": False}).get( + "orientable" + ) trace_type = allowed_symbols.get(field_symbol, {"type": "scatter3d"}).get("type") if vectors is not None: orientations = get_orientation_from_vec(vectors) @@ -630,11 +632,7 @@ def make_Pixels( } pix = None size = sizes[ind] if is_array_like(sizes) else sizes - if ( - orientable - and vectors is not None - and not is_null_vec[ind] - ): + if orientable and vectors is not None and not is_null_vec[ind]: orient = orientations[ind] kw.update(orientation=orient, base=5, diameter=size, height=size * 2) if field_symbol == "cone": @@ -763,7 +761,9 @@ def make_Sensor( snorms_scaled = _apply_scaling_transformation( norms, sizescaling, is_null_mask, path_ind ) - snorms_scaled[is_null_mask[path_ind]] = 1 # keep null sizes unscaled + snorms_scaled[is_null_mask[path_ind]] = ( + 1 # keep null sizes unscaled + ) px_sizes *= snorms_scaled colorscaling = style.pixel.field.colorscaling if colorscaling != "uniform": From 4e5d4216e420a16792cb533171d8879e49b1ef8c Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Mon, 15 Sep 2025 22:11:47 +0200 Subject: [PATCH 206/211] refactor: add 'sizemin' property to PixelField for minimum symbol size control --- docs/_pages/user_guide/docs/docs_styles.md | 6 ++++++ src/magpylib/_src/defaults/defaults_values.py | 1 + src/magpylib/_src/display/traces_core.py | 10 +++++++--- src/magpylib/_src/style.py | 16 ++++++++++++++++ 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/docs/_pages/user_guide/docs/docs_styles.md b/docs/_pages/user_guide/docs/docs_styles.md index 887fac878..e28ea1256 100644 --- a/docs/_pages/user_guide/docs/docs_styles.md +++ b/docs/_pages/user_guide/docs/docs_styles.md @@ -601,6 +601,12 @@ The `pixel` of a `Sensor` object can be visualized as arrows representing the va - `"log"`: Size proportional to the normalized logarithm of the magnitude. - `"log^n"`: Size proportional to the normalized nth (2 to 9) logarithm of the magnitude. +**`sizemin`** *(default=`0.1`)* + Minimum relative size of field symbols. A float between 0 and 1. + When displaying field vectors this controls how small the symbols + can become relative to their maximum size. A value of 0 allows symbols to shrink to zero size, + while 0.5 ensures symbols are at least 50% of their maximum size. + **`colorscaling`** *(default=`"uniform"`)*: Determines how arrow color relates to the `source` magnitude. - `"uniform"`: Uniform color for all arrows. diff --git a/src/magpylib/_src/defaults/defaults_values.py b/src/magpylib/_src/defaults/defaults_values.py index db6a782e1..b9e90c33f 100644 --- a/src/magpylib/_src/defaults/defaults_values.py +++ b/src/magpylib/_src/defaults/defaults_values.py @@ -101,6 +101,7 @@ "colormap": "Rainbow", "shownull": True, "sizescaling": "uniform", + "sizemin": 0, "colorscaling": "linear", }, }, diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index 33ee95d81..a8458b9e6 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -555,7 +555,7 @@ def make_TriangularMesh(obj, **kwargs) -> dict[str, Any] | list[dict[str, Any]]: return traces -def _apply_scaling_transformation(norms, scaling_type, is_null_mask, path_ind): +def _apply_scaling_transformation(norms, scaling_type, is_null_mask, path_ind, min_=None): scaled_norms = norms.copy() log_iterations = ( int(scaling_type[4]) @@ -565,7 +565,10 @@ def _apply_scaling_transformation(norms, scaling_type, is_null_mask, path_ind): for _ in range(log_iterations): scaled_norms += np.nanmin(scaled_norms) + 1 # shift to positive range scaled_norms[~is_null_mask] = np.log(scaled_norms[~is_null_mask]) - return scaled_norms[path_ind] / np.nanmax(scaled_norms) + scaled_norms /= np.nanmax(scaled_norms) + if min_ is not None: + scaled_norms = min_ + scaled_norms * (1 - min_) + return scaled_norms[path_ind] def make_Pixels( @@ -759,9 +762,10 @@ def make_Sensor( ptp = nmax - nmin norms = (norms - nmin) / ptp if ptp != 0 else norms * 0 + 0.5 sizescaling = style.pixel.field.sizescaling + sizemin = style.pixel.field.sizemin if sizescaling != "uniform": snorms_scaled = _apply_scaling_transformation( - norms, sizescaling, is_null_mask, path_ind + norms, sizescaling, is_null_mask, path_ind, min_=sizemin ) snorms_scaled[is_null_mask[path_ind]] = 1 # keep null sizes unscaled px_sizes *= snorms_scaled diff --git a/src/magpylib/_src/style.py b/src/magpylib/_src/style.py index 5dd056c44..39354a396 100644 --- a/src/magpylib/_src/style.py +++ b/src/magpylib/_src/style.py @@ -1675,6 +1675,9 @@ class PixelField(MagicProperties): sizescaling: {"uniform", "linear","log","log^[2-9]"} Symbol size scaling relative the the field magnitude. + sizemin: float, default=0. + Minimum relative size of field symbols (0 to 1). + colorscaling: {"uniform", "linear","log","log^[2-9]"} Color scale scaling relative the the field magnitude. """ @@ -1783,6 +1786,19 @@ def sizescaling(self): def sizescaling(self, val): self._sizescaling = self._validate_scaling(val, name="sizescaling") + @property + def sizemin(self): + """Minimum relative size of field symbols (0 to 1).""" + return self._sizemin + + @sizemin.setter + def sizemin(self, val): + assert val is None or (isinstance(val, float | int) and 0 <= val <= 1), ( + "The `sizemin` property must be a value between 0 and 1,\n" + f"but received {val!r} instead." + ) + self._sizemin = val + @property def colorscaling(self): """Pixel colorscaling. Can be one of `{"uniform", "linear","log","log^[2-9]"}`.""" From d7942d7eaf8a60da1ba329541ca9ed1ab31b0c37 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 20:12:03 +0000 Subject: [PATCH 207/211] style: pre-commit fixes --- docs/_pages/user_guide/docs/docs_styles.md | 4 ++-- src/magpylib/_src/display/traces_core.py | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/_pages/user_guide/docs/docs_styles.md b/docs/_pages/user_guide/docs/docs_styles.md index e28ea1256..a6687e4b7 100644 --- a/docs/_pages/user_guide/docs/docs_styles.md +++ b/docs/_pages/user_guide/docs/docs_styles.md @@ -603,10 +603,10 @@ The `pixel` of a `Sensor` object can be visualized as arrows representing the va **`sizemin`** *(default=`0.1`)* Minimum relative size of field symbols. A float between 0 and 1. - When displaying field vectors this controls how small the symbols + When displaying field vectors this controls how small the symbols can become relative to their maximum size. A value of 0 allows symbols to shrink to zero size, while 0.5 ensures symbols are at least 50% of their maximum size. - + **`colorscaling`** *(default=`"uniform"`)*: Determines how arrow color relates to the `source` magnitude. - `"uniform"`: Uniform color for all arrows. diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index aa250dd64..6d49d2efd 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -555,7 +555,9 @@ def make_TriangularMesh(obj, **kwargs) -> dict[str, Any] | list[dict[str, Any]]: return traces -def _apply_scaling_transformation(norms, scaling_type, is_null_mask, path_ind, min_=None): +def _apply_scaling_transformation( + norms, scaling_type, is_null_mask, path_ind, min_=None +): scaled_norms = norms.copy() log_iterations = ( int(scaling_type[4]) From d0f14f188e9da00e76ac817de53a7a2576fd5f87 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 16 Sep 2025 09:47:51 +0200 Subject: [PATCH 208/211] docs: update formatting and descriptions in styles documentation --- docs/_pages/user_guide/docs/docs_styles.md | 26 +++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/_pages/user_guide/docs/docs_styles.md b/docs/_pages/user_guide/docs/docs_styles.md index a6687e4b7..7e93cffb8 100644 --- a/docs/_pages/user_guide/docs/docs_styles.md +++ b/docs/_pages/user_guide/docs/docs_styles.md @@ -594,34 +594,34 @@ The `pixel` of a `Sensor` object can be visualized as arrows representing the va - `True`: Null vectors are displayed. - `False`: Null vectors are hidden. -**`sizescaling`** *(default=`"uniform"`)*: +- **`sizescaling`** *(default=`"uniform"`)*: Determines how arrow size relates to the `source` magnitude. - - `"uniform"`: Uniform arrow size. - - `"linear"`: Size proportional to magnitude. - - `"log"`: Size proportional to the normalized logarithm of the magnitude. - - `"log^n"`: Size proportional to the normalized nth (2 to 9) logarithm of the magnitude. + - `"uniform"`: Uniform arrow size. + - `"linear"`: Size proportional to magnitude. + - `"log"`: Size proportional to the normalized logarithm of the magnitude. + - `"log^n"`: Size proportional to the normalized nth (2 to 9) logarithm of the magnitude. -**`sizemin`** *(default=`0.1`)* +- **`sizemin`** *(default=`0.1`)* Minimum relative size of field symbols. A float between 0 and 1. When displaying field vectors this controls how small the symbols can become relative to their maximum size. A value of 0 allows symbols to shrink to zero size, while 0.5 ensures symbols are at least 50% of their maximum size. -**`colorscaling`** *(default=`"uniform"`)*: +- **`colorscaling`** *(default=`"uniform"`)*: Determines how arrow color relates to the `source` magnitude. - - `"uniform"`: Uniform color for all arrows. - - `"linear"`: Color scaling proportional to magnitude. - - `"log"`: Color scaling proportional to the normalized logarithm of the magnitude. - - `"log^n"`: Color scaling proportional to the normalized nth (2 to 9) logarithm of the magnitude. + - `"uniform"`: Uniform color for all arrows. + - `"linear"`: Color scaling proportional to magnitude. + - `"log"`: Color scaling proportional to the normalized logarithm of the magnitude. + - `"log^n"`: Color scaling proportional to the normalized nth (2 to 9) logarithm of the magnitude. - **`colormap`** *(default=`"Viridis"`)*: Specifies the colormap used for color mapping. Supports standard color maps (e.g., `"Viridis"`, `"Inferno"`, `"Magma"`, etc.) compatible with both Plotly and Matplotlib. -````{note} +```{note} - Pixels with zero or invalid field values are rendered using the default representation (`point`/`box` or according to `style.pixel.symbol`). - Magnitude normalization is performed individually for each sensor along its path. - `style.pixel.size` controls also the arrow size. -```` +``` ### Pixel Field Minimal Example From af1f82a14159ecbdcd90fe0444f2e12872a2ab79 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 16 Sep 2025 09:48:19 +0200 Subject: [PATCH 209/211] refactor: update default colormap to 'Viridis' and adjust minimum size to 0.1 --- src/magpylib/_src/defaults/defaults_values.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/magpylib/_src/defaults/defaults_values.py b/src/magpylib/_src/defaults/defaults_values.py index b9e90c33f..fc6c8a058 100644 --- a/src/magpylib/_src/defaults/defaults_values.py +++ b/src/magpylib/_src/defaults/defaults_values.py @@ -98,10 +98,10 @@ "field": { "symbol": "cone", "source": None, - "colormap": "Rainbow", + "colormap": "Viridis", "shownull": True, "sizescaling": "uniform", - "sizemin": 0, + "sizemin": 0.1, "colorscaling": "linear", }, }, From 418ac6dc344bf2e3523451a669bc54cb67ee57ff Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 16 Sep 2025 14:34:57 +0200 Subject: [PATCH 210/211] fix tests --- src/magpylib/_src/display/traces_core.py | 30 ++++++++++++------------ tests/test_display_plotly.py | 2 +- tests/test_obj_BaseGeo.py | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/magpylib/_src/display/traces_core.py b/src/magpylib/_src/display/traces_core.py index 6d49d2efd..a0cb183b2 100644 --- a/src/magpylib/_src/display/traces_core.py +++ b/src/magpylib/_src/display/traces_core.py @@ -595,7 +595,19 @@ def make_Pixels( # markers plots must share the same kw types to be able to be merged with line plots! sizes_2dfactor = marker2d_default_size / np.max(sizes) - if symbol is not None and vectors is None: + allowed_symbols = { + "cone": {"type": "mesh3d", "orientable": True}, + "arrow": {"type": "scatter3d", "orientable": True}, + "arrow3d": {"type": "mesh3d", "orientable": True}, + "cube": {"type": "mesh3d", "orientable": False}, + } + field_symbol = symbol if field_symbol in ("none", None) else field_symbol + orientable = allowed_symbols.get(field_symbol, {"orientable": False}).get( + "orientable" + ) + ttype = allowed_symbols.get(symbol, {"type": "scatter3d"}).get("type") + ttype_field = allowed_symbols.get(field_symbol, {"type": "scatter3d"}).get("type") + if ttype == "scatter3d" and vectors is None: x, y, z = positions.T sizes = sizes if is_array_like(sizes) else np.repeat(sizes, len(x)) return { @@ -611,18 +623,6 @@ def make_Pixels( pixels = [] orientations = None is_null_vec = None - if field_symbol in ("none", None): - field_symbol = symbol if symbol is not None else "cube" - allowed_symbols = { - "cone": {"type": "mesh3d", "orientable": True}, - "arrow": {"type": "scatter3d", "orientable": True}, - "arrow3d": {"type": "mesh3d", "orientable": True}, - "cube": {"type": "mesh3d", "orientable": False}, - } - orientable = allowed_symbols.get(field_symbol, {"orientable": False}).get( - "orientable" - ) - trace_type = allowed_symbols.get(field_symbol, {"type": "scatter3d"}).get("type") if vectors is not None: orientations = get_orientation_from_vec(vectors) is_null_vec = (np.abs(vectors) < null_thresh).all(axis=1) @@ -648,7 +648,7 @@ def make_Pixels( pix = make_BaseArrow(**kw, **kw2d) pix["marker_size"] = np.repeat(0.0, len(pix["x"])) elif vectors is None or shownull: - if trace_type == "scatter3d": + if ttype_field == "scatter3d": x, y, z = pos[:, None] pix = { "x": x, @@ -662,7 +662,7 @@ def make_Pixels( if pix is not None: if colors is not None: color = colors[ind] if is_array_like(colors) else colors - if trace_type == "scatter3d": + if ttype_field == "scatter3d": pix["line_color"] = np.repeat(color, len(pix["x"])) pix["marker_color"] = pix["line_color"] else: diff --git a/tests/test_display_plotly.py b/tests/test_display_plotly.py index d8fd27129..c0d842823 100644 --- a/tests/test_display_plotly.py +++ b/tests/test_display_plotly.py @@ -573,7 +573,7 @@ def test_pixel_field_color_scales(): for i, cs in enumerate(colorscales, 1): s = s0.copy( style_pixel_field_source="B", - style_pixel_field_colorscale=cs, + style_pixel_field_colormap=cs, style_description=str(cs), ) subplots.append({"objects": [c1, s], "col": i}) diff --git a/tests/test_obj_BaseGeo.py b/tests/test_obj_BaseGeo.py index 44fb80106..1e9ae3f19 100644 --- a/tests/test_obj_BaseGeo.py +++ b/tests/test_obj_BaseGeo.py @@ -706,8 +706,8 @@ def test_describe_with_exclude_None(): " legend=Legend(show=None, text=None), model3d=Model3d(data=[], showdefault=True)," " opacity=None, path=Path(frames=None, line=Line(color=None, style=None, width=None)," " marker=Marker(color=None, size=None, symbol=None), numbering=None, show=None)," - " pixel=Pixel(color=None, field=PixelField(colorscale=None," - " shownull=None, sizemode=None, symbol=None, source=None), size=1," + " pixel=Pixel(color=None, field=PixelField(colormap=None, colorscaling=None, shownull=None," + " sizemin=None, sizescaling=None, source=None, symbol=None), size=1," " sizemode=None, symbol=None), size=None, sizemode=None)" ), " • volume: 0.0", From ec8583611cc08be3837f53f9fa83a664dbfb9a19 Mon Sep 17 00:00:00 2001 From: Alexandre Boisselet Date: Tue, 16 Sep 2025 16:45:41 +0200 Subject: [PATCH 211/211] fix: update .gitignore to ignore all temporary Jupyter Notebook files --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 68c4eac13..0147b9213 100644 --- a/.gitignore +++ b/.gitignore @@ -158,7 +158,7 @@ Thumbs.db *~ *.swp __temp*.py -__temp.ipynb +__temp*.ipynb # uv uv.lock