From 8683da1edb617e178c6be6d893c7bd50ff54443f Mon Sep 17 00:00:00 2001 From: MatthewFlamm <39341281+MatthewFlamm@users.noreply.github.com> Date: Tue, 11 Oct 2022 12:00:46 -0400 Subject: [PATCH] Add other views to `Camera.tight` (#3391) * refactor view_xyz, allow reuse of calculating view_vectors * add multiple views to tight * Typo fix Co-authored-by: Andras Deak * fix naming to fix high variance image regression filtering * Apply suggestions from code review Co-authored-by: Andras Deak * fix return types * better description of view planes * fix negative issue for view_* * move view_vectors in helpers and fix circular import * use objects center as focal point, and offset by 1 * simplify absolute and dot products * move test_tight_direction to be near other tight_* tests * test for multiple objects when using tight * Apply suggestions from code review: Comment clarifications Co-authored-by: Andras Deak * Use parallel projection in docstring in tight * add tests specifically for view_vectors * don't use names in returns section * Update pyvista/plotting/helpers.py Co-authored-by: Andras Deak Co-authored-by: Alex Kaszynski --- pyvista/plotting/camera.py | 53 ++++++++++--- pyvista/plotting/helpers.py | 55 ++++++++++++- pyvista/plotting/renderer.py | 37 ++------- tests/plotting/conftest.py | 7 ++ .../image_cache/tight_direction[False-xy].png | Bin 0 -> 3266 bytes .../image_cache/tight_direction[False-xz].png | Bin 0 -> 3310 bytes .../image_cache/tight_direction[False-yx].png | Bin 0 -> 3332 bytes .../image_cache/tight_direction[False-yz].png | Bin 0 -> 3235 bytes .../image_cache/tight_direction[False-zx].png | Bin 0 -> 3258 bytes .../image_cache/tight_direction[False-zy].png | Bin 0 -> 3307 bytes .../image_cache/tight_direction[True-xy].png | Bin 0 -> 3297 bytes .../image_cache/tight_direction[True-xz].png | Bin 0 -> 3311 bytes .../image_cache/tight_direction[True-yx].png | Bin 0 -> 3335 bytes .../image_cache/tight_direction[True-yz].png | Bin 0 -> 3258 bytes .../image_cache/tight_direction[True-zx].png | Bin 0 -> 3248 bytes .../image_cache/tight_direction[True-zy].png | Bin 0 -> 3311 bytes .../image_cache/tight_multiple_objects.png | Bin 0 -> 10119 bytes .../image_cache/view_xyz[False-xy].png | Bin 0 -> 3364 bytes .../image_cache/view_xyz[False-xz].png | Bin 0 -> 3368 bytes .../image_cache/view_xyz[False-yx].png | Bin 0 -> 3404 bytes .../image_cache/view_xyz[False-yz].png | Bin 0 -> 3362 bytes .../image_cache/view_xyz[False-zx].png | Bin 0 -> 3364 bytes .../image_cache/view_xyz[False-zy].png | Bin 0 -> 3399 bytes .../image_cache/view_xyz[True-xy].png | Bin 0 -> 3347 bytes .../image_cache/view_xyz[True-xz].png | Bin 0 -> 3433 bytes .../image_cache/view_xyz[True-yx].png | Bin 0 -> 3400 bytes .../image_cache/view_xyz[True-yz].png | Bin 0 -> 3326 bytes .../image_cache/view_xyz[True-zx].png | Bin 0 -> 3336 bytes .../image_cache/view_xyz[True-zy].png | Bin 0 -> 3416 bytes tests/plotting/test_helpers.py | 20 +++++ tests/plotting/test_plotting.py | 73 +++++++++++++++--- 31 files changed, 189 insertions(+), 56 deletions(-) create mode 100644 tests/plotting/image_cache/tight_direction[False-xy].png create mode 100644 tests/plotting/image_cache/tight_direction[False-xz].png create mode 100644 tests/plotting/image_cache/tight_direction[False-yx].png create mode 100644 tests/plotting/image_cache/tight_direction[False-yz].png create mode 100644 tests/plotting/image_cache/tight_direction[False-zx].png create mode 100644 tests/plotting/image_cache/tight_direction[False-zy].png create mode 100644 tests/plotting/image_cache/tight_direction[True-xy].png create mode 100644 tests/plotting/image_cache/tight_direction[True-xz].png create mode 100644 tests/plotting/image_cache/tight_direction[True-yx].png create mode 100644 tests/plotting/image_cache/tight_direction[True-yz].png create mode 100644 tests/plotting/image_cache/tight_direction[True-zx].png create mode 100644 tests/plotting/image_cache/tight_direction[True-zy].png create mode 100644 tests/plotting/image_cache/tight_multiple_objects.png create mode 100644 tests/plotting/image_cache/view_xyz[False-xy].png create mode 100644 tests/plotting/image_cache/view_xyz[False-xz].png create mode 100644 tests/plotting/image_cache/view_xyz[False-yx].png create mode 100644 tests/plotting/image_cache/view_xyz[False-yz].png create mode 100644 tests/plotting/image_cache/view_xyz[False-zx].png create mode 100644 tests/plotting/image_cache/view_xyz[False-zy].png create mode 100644 tests/plotting/image_cache/view_xyz[True-xy].png create mode 100644 tests/plotting/image_cache/view_xyz[True-xz].png create mode 100644 tests/plotting/image_cache/view_xyz[True-yx].png create mode 100644 tests/plotting/image_cache/view_xyz[True-yz].png create mode 100644 tests/plotting/image_cache/view_xyz[True-zx].png create mode 100644 tests/plotting/image_cache/view_xyz[True-zy].png create mode 100644 tests/plotting/test_helpers.py diff --git a/pyvista/plotting/camera.py b/pyvista/plotting/camera.py index 9fbf9f1348..f905839e00 100644 --- a/pyvista/plotting/camera.py +++ b/pyvista/plotting/camera.py @@ -8,6 +8,8 @@ from pyvista import _vtk from pyvista.utilities.misc import PyVistaDeprecationWarning +from .helpers import view_vectors + class Camera(_vtk.vtkCamera): """PyVista wrapper for the VTK Camera class. @@ -645,9 +647,18 @@ def copy(self): return new_camera - def tight(self, padding=0.0, adjust_render_window=True): + def tight(self, padding=0.0, adjust_render_window=True, view='xy', negative=False): """Adjust the camera position so that the actors fill the entire renderer. + The camera view direction is reoriented to be normal to the ``view`` + plane. When ``negative=False``, The first letter of ``view`` refers + to the axis that points to the right. The second letter of ``view`` + refers to axis that points up. When ``negative=True``, the first + letter refers to the axis that points left. The up direction is + unchanged. + + Parallel projection is enabled when using this function. + Parameters ---------- padding : float, optional @@ -658,9 +669,15 @@ def tight(self, padding=0.0, adjust_render_window=True): Adjust the size of the render window as to match the dimensions of the visible actors. + view : {'xy', 'yx', 'xz', 'zx', 'yz', 'zy'} + Plane to which the view is oriented. Default 'xy'. + + negative : bool + Whether to view in opposite direction. Default ``False``. + Notes ----- - This resets the view direction to look at the XY plane. + This resets the view direction to look at a plane with parallel projection. Examples -------- @@ -690,15 +707,29 @@ def tight(self, padding=0.0, adjust_render_window=True): self._renderer.ComputeAspect() aspect = self._renderer.GetAspect() - angle = np.pi * self.view_angle / 180.0 - dx, dy = (x1 - x0), (y1 - y0) - dist = max(dx / aspect[0], dy) / np.sin(angle / 2) / 2 - self.SetViewUp(0, 1, 0) - self.SetPosition(x0 + dx / 2, y0 + dy / 2, dist * (1 + padding)) - self.SetFocalPoint(x0 + dx / 2, y0 + dy / 2, 0) + position0 = np.array([x0, y0, z0]) + position1 = np.array([x1, y1, z1]) + objects_size = position1 - position0 + position = position0 + objects_size / 2 + + direction, viewup = view_vectors(view, negative) + horizontal = np.cross(direction, viewup) + + vert_dist = abs(objects_size @ viewup) + horiz_dist = abs(objects_size @ horizontal) + + # set focal point to objects' center + # offset camera position from objects center by dist in opposite of viewing direction + # (actual distance doesn't matter due to parallel projection) + dist = 1 + camera_position = position + dist * direction + + self.SetViewUp(*viewup) + self.SetPosition(*camera_position) + self.SetFocalPoint(*position) - ps = max(dx / aspect[0], dy) / 2 + ps = max(horiz_dist / aspect[0], vert_dist) / 2 self.parallel_scale = ps * (1 + padding) self._renderer.ResetCameraClippingRange(x0, x1, y0, y1, z0, z1) @@ -706,7 +737,7 @@ def tight(self, padding=0.0, adjust_render_window=True): ren_win = self._renderer.GetRenderWindow() size = list(ren_win.GetSize()) size_ratio = size[0] / size[1] - tight_ratio = dx / dy + tight_ratio = horiz_dist / vert_dist resize_ratio = tight_ratio / size_ratio if resize_ratio < 1: size[0] = round(size[0] * resize_ratio) @@ -717,4 +748,4 @@ def tight(self, padding=0.0, adjust_render_window=True): # simply call tight again to reset the parallel scale due to the # resized window - self.tight(padding=padding, adjust_render_window=False) + self.tight(padding=padding, adjust_render_window=False, view=view, negative=negative) diff --git a/pyvista/plotting/helpers.py b/pyvista/plotting/helpers.py index f2f1e66bc6..928217ed9f 100644 --- a/pyvista/plotting/helpers.py +++ b/pyvista/plotting/helpers.py @@ -1,12 +1,12 @@ """This module contains some convenience helper functions.""" +from typing import Tuple + import numpy as np import pyvista from pyvista.utilities import is_pyvista_dataset -from .plotting import Plotter - def plot( var_item, @@ -227,7 +227,7 @@ def plot( show_grid = kwargs.pop('show_grid', False) auto_close = kwargs.get('auto_close') - pl = Plotter( + pl = pyvista.Plotter( window_size=window_size, off_screen=off_screen, notebook=notebook, @@ -462,3 +462,52 @@ def plot_itk(mesh, color=None, scalars=None, opacity=1.0, smooth_shading=False): else: pl.add_mesh(mesh, color, scalars, opacity, smooth_shading) return pl.show() + + +def view_vectors(view: str, negative: bool = False) -> Tuple[np.ndarray, np.ndarray]: + """Given a plane to view, return vectors for setting up camera. + + Parameters + ---------- + view : {'xy', 'yx', 'xz', 'zx', 'yz', 'zy'} + Plane to return vectors for. + + negative : bool + Whether to view from opposite direction. Default ``False``. + + Returns + ------- + vec : numpy.ndarray + ``[x, y, z]`` vector that points in the viewing direction + + viewup : numpy.ndarray + ``[x, y, z]`` vector that points to the viewup direction + + """ + if view == 'xy': + vec = np.array([0, 0, 1]) + viewup = np.array([0, 1, 0]) + elif view == 'yx': + vec = np.array([0, 0, -1]) + viewup = np.array([1, 0, 0]) + elif view == 'xz': + vec = np.array([0, -1, 0]) + viewup = np.array([0, 0, 1]) + elif view == 'zx': + vec = np.array([0, 1, 0]) + viewup = np.array([1, 0, 0]) + elif view == 'yz': + vec = np.array([1, 0, 0]) + viewup = np.array([0, 0, 1]) + elif view == 'zy': + vec = np.array([-1, 0, 0]) + viewup = np.array([0, 1, 0]) + else: + raise ValueError( + f"Unexpected value for direction {view}\n" + " Expected: 'xy', 'yx', 'xz', 'zx', 'yz', 'zy'" + ) + + if negative: + vec *= -1 + return vec, viewup diff --git a/pyvista/plotting/renderer.py b/pyvista/plotting/renderer.py index 6bb83a18dc..f74f7a7e6a 100644 --- a/pyvista/plotting/renderer.py +++ b/pyvista/plotting/renderer.py @@ -17,6 +17,7 @@ from .camera import Camera from .charts import Charts from .colors import Color +from .helpers import view_vectors from .render_passes import RenderPasses from .tools import create_axes_marker, create_axes_orientation_box, parse_font_family @@ -2385,11 +2386,7 @@ def view_xy(self, negative=False): >>> pl.show() """ - vec = np.array([0, 0, 1]) - viewup = np.array([0, 1, 0]) - if negative: - vec *= -1 - self.view_vector(vec, viewup) + self.view_vector(*view_vectors('xy', negative=negative)) def view_yx(self, negative=False): """View the YX plane. @@ -2412,11 +2409,7 @@ def view_yx(self, negative=False): >>> pl.show() """ - vec = np.array([0, 0, -1]) - viewup = np.array([1, 0, 0]) - if negative: - vec *= -1 - self.view_vector(vec, viewup) + self.view_vector(*view_vectors('yx', negative=negative)) def view_xz(self, negative=False): """View the XZ plane. @@ -2439,11 +2432,7 @@ def view_xz(self, negative=False): >>> pl.show() """ - vec = np.array([0, -1, 0]) - viewup = np.array([0, 0, 1]) - if negative: - vec *= -1 - self.view_vector(vec, viewup) + self.view_vector(*view_vectors('xz', negative=negative)) def view_zx(self, negative=False): """View the ZX plane. @@ -2466,11 +2455,7 @@ def view_zx(self, negative=False): >>> pl.show() """ - vec = np.array([0, 1, 0]) - viewup = np.array([1, 0, 0]) - if negative: - vec *= -1 - self.view_vector(vec, viewup) + self.view_vector(*view_vectors('zx', negative=negative)) def view_yz(self, negative=False): """View the YZ plane. @@ -2493,11 +2478,7 @@ def view_yz(self, negative=False): >>> pl.show() """ - vec = np.array([1, 0, 0]) - viewup = np.array([0, 0, 1]) - if negative: - vec *= -1 - self.view_vector(vec, viewup) + self.view_vector(*view_vectors('yz', negative=negative)) def view_zy(self, negative=False): """View the ZY plane. @@ -2520,11 +2501,7 @@ def view_zy(self, negative=False): >>> pl.show() """ - vec = np.array([-1, 0, 0]) - viewup = np.array([0, 1, 0]) - if negative: - vec *= -1 - self.view_vector(vec, viewup) + self.view_vector(*view_vectors('zy', negative=negative)) def disable(self): """Disable this renderer's camera from being interactive.""" diff --git a/tests/plotting/conftest.py b/tests/plotting/conftest.py index 1827f07ae4..2f9b2b00f5 100644 --- a/tests/plotting/conftest.py +++ b/tests/plotting/conftest.py @@ -41,3 +41,10 @@ def check_gc(request): assert len(after) == 0, 'Not all objects GCed:\n' + '\n'.join( sorted(o.__class__.__name__ for o in after) ) + + +@pytest.fixture() +def colorful_tetrahedron(): + mesh = pyvista.Tetrahedron() + mesh.cell_data["colors"] = [[255, 255, 255], [255, 0, 0], [0, 255, 0], [0, 0, 255]] + return mesh diff --git a/tests/plotting/image_cache/tight_direction[False-xy].png b/tests/plotting/image_cache/tight_direction[False-xy].png new file mode 100644 index 0000000000000000000000000000000000000000..a1a4be4f58fe90bb79c669c2dfa4e40976fdefe4 GIT binary patch literal 3266 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 literal 0 HcmV?d00001 diff --git a/tests/plotting/image_cache/tight_direction[False-xz].png b/tests/plotting/image_cache/tight_direction[False-xz].png new file mode 100644 index 0000000000000000000000000000000000000000..7d7e1da5174f788f6f4305559f73ac33ac38d7e3 GIT binary patch literal 3310 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 J?3rki`adNb)ARrU literal 0 HcmV?d00001 diff --git a/tests/plotting/image_cache/tight_direction[False-yx].png b/tests/plotting/image_cache/tight_direction[False-yx].png new file mode 100644 index 0000000000000000000000000000000000000000..7957692f68df3f42f15c4d70154c361ae0a894c0 GIT binary patch literal 3332 zcmW-kdt40bAIFQ`&TflSTTR8Gq*!OiAttv|>9*PK92z^nTvjn=<$j6d6wc5^6BVK+ zx++VHIc5zJHLPZDKN_F2K)w@y-)(9t0)j811iguc@(^I@yO*Ry)}! zh>C^sqmV(;XePGwX3f@BJ3=K%NYM6$`<;xkUef5dv}`A)G_%%8@*R~CEv*)UsAaN) zs>Rlizf50tt!CBq<6ZA7yDom&J>pg@b#*{DbYd(1d;nj*r?=Wf#=bsx`b5Sqv%TrJ z{P*Lgip&R}LiBqFxwl^f^m}h{5D=pi}@MsXW z*EPV7GwOr@-8BD({@4PLdx|wc!wW%|a(#+A9ybj*XbaX({;|)77CKK40Cmm3sON$nAdk-JJo3t&JBmjQ*>6EtPvP-z=!G1h zwp}2w;mmG;ww?Y2&{%sXfNagoL7?Fg2n=4+0MH`4xnQqTQUO0_rjiD0Pl6zRPId5P z5Ro!rGng~I=zGvh!=N|C@!O8_n=;T_`X0nGWv>B($6p5#)J+7S@$X0SXcMCYNk2G# z8|Ld0FA$g{a{)7X^Jhjr&j5!-M63iRAp@Ke5uOgr#Ej9vgt5TX932ZxKsPXWiv=*g zF2ISW!uma}CGAVClD|~_Z z$6x~twiTF2gB>u73V|7B7z0d5GcW~Zx>@-2i7#>*Y zZWB;X2y^Ka)*xqJW#Zm@1SP-GLJv#bavpdy{RLRV9QIW@?){gbWCbl8E7d*JK-&~d zLLSy2W=ALCY>yy%HZ5Ev)p={6U|%Mo7@OwG272k$)5(kkoD~S<_8hrcj0V!eC`;Wn zMB+b5^-=?+D4EhcY??V+8;`Te0{H}5SZAgCn}A?nrnC@atl8RhoGlQ@7tz8*sV-In z!Hz1d8J?Y{eio`%&tre&KZYk6ZpM)oI+B1yXaGXhh|!e@bxe%@icq*1O-HDiV)P6` znTb&rp;|@gzX(+3;~2SU9Pqu~g3NsO*XsAMr3k5K;;qbCvS zM=@$ZsD2U3AylmheTGo92>pUkYelFPLh-Mi9HGobs4qe_iO~pzDiEVv5o(JVr4Y(T zj20r4RE%CmsK+9-8KFu=XeUCEB8XPF3Mdg*U_n;5A=IE4YHxt2Pg4Ehr@xV<{v!=f zpTb63(uy1bRjq;SrSP#+*i(N-bqG(lVIzgK!c#zHXrL?$*uMaK>c!Y);OQsSu4bGQ z-{(#%e8}oM2(?&11rShx2(oH|6DFyGL-lr%yJ zjrLr@MpAJcp_YrGvCVM*1l6`M{fh(YMhRE&J*ilMP`Aa9M-zO>Mb#6ef03qc{Fy6| zlhqao6)J*;H^Rk}R3ql=GY_j>WnAQFvbq7G4u~N!0Ufb~n;PJWjwy^3$tw)akZdq&=yKL8u}TG^YuMTvV$9^|Ozv z)2DKgrmRymUH!X&y03u-#E`H7{%8r;=3)EQ3oSSwMs@&q3uR;}xFML4rQ&WujO;LO z2w-FxxSNuZW#R^ZMwX4cDHvG}Zt!KazvFH`jCMb6@M5%ycz772O~#EOjP@WN9?WRd zaAP2&J%Wb^Fxq3daXzEX!o&R;?FroI$7pl$a9@TXaicdw#N**!43UIqgfaw$+k`O0 zAv`09A<}W1K!!MqXDAusIBqkaA!s~9!4M~L8$ZTNpFCb=k&ne&zg`3 zZVj5qgVWeDOW2OYxAS{A(rz9s`G{yeDv+2JVa*n>9gT+sGmfSlouc+0O}m-0(w7&>(tn;?a6koZ9##?h8GII(03(fVE>d0&9lS->|A;Zqch<9ym6 zW65AmYd#N(Fo_6S6`~*ItV;WtyBo&jnb3w*wYNPY7f8$tFjDBE`J2~x%|%|HY5wF@ zu~yG((OQOAVe~m(S4W@awL1DVuWrOCUNeY%UVF8byoR5-%&Xx{Ireg2?-Tj?JD&5t zR(z;WO}g5q`~2qi$yx5bEw|S7vw2GmGv#r%LmzKU=&Ilztjs?mz07SqwR{p)t#-)Q!l-!U4JjM;@v-&r&jho`QB6MVcn8fiE~Rcc9BW5 zV>!CLs=H=kblby<%}=UwVyE}cUXYQ!JkGUObTXjoYI0IksQYH)E8~Y1yFWj#n|eA& zxOP#qr#y~n)kW-haA@oW_kq_Pxv{0Y>yEWN@rpmIK_9ERaWQu;jEn2hr+V&EHy2lV zzPoZUd)A)L%&4YAg7CA2*nxf9U#|Zv?$c|1SH;uAVeP(zYTlyp&Wj`UQbF{GePP!vOP(YdvmIi0^_?C*VAH1S*)!YRc`>RNNdC8E z0k5)R{_y>*n{+*F|4X;Fb-B6ipSIuYypUS?ZcW6WgWX5MP={Yv`Nejm%osN~_+iGZ zbuZQjYgY_$feyL{^&UIgi;fR{?(gjA=vcAy@qtF$p{*M>7#}6(Zh83Yj2Sbk%D)cn zaUUxG)I?5R{ZJQv=DQ@1%Q0{MHFWl0y!f^9)+qp@jW0_jlD|{|;5H>{lzUh3)=a$M4_wU`|Ku$L{Mp9z+-ge{+3`C{& zx{g8Q^?E*d*~Rtu27deay8PKOaqI4Ptr3>pw@&Ve@vu&d(o4VVyw7EaMN|z{Ps*7c z_od%qX>50SUFy8vmZZM=+b2Cz%vQDOuI*6GyIVHdY3BWHi~Ron^gMei#~m~b_BDt8 zwx>R)qO0;=-6k*m6Q+5%dE0H>uZUA@VO{p|q;t+X3E|IjI^|NK!9U3F(b;}`q!?Zb)-6<@BlyWj04uGC5&t||I= zCAW0P#={-MnuE&g13yIklNjmgbUrz2vu)+3>(6GQY5SZ9V24xY!9*W!6Z3M^)2Kdu zzS{K2m~#H!2d}bOF-2AP(JF4SMf$3T+J%w!HBgq0A&Y2$FL*(FUDSEBEjRE zDfeJ@*e|0?_#)?-yZGl(x$zobnijthjPnz^jxVyuz}Ljn)mZ?XECS#V1a{4uTLwV1 rH{W;T?(duwcHA)lwlMwZ*15;6M|p)^dV2={@5UrR5$bo|M@{}8mh}A4 literal 0 HcmV?d00001 diff --git a/tests/plotting/image_cache/tight_direction[False-yz].png b/tests/plotting/image_cache/tight_direction[False-yz].png new file mode 100644 index 0000000000000000000000000000000000000000..d5387f21afe1eb3f9252c6a30d14a76686ad8e9a GIT binary patch literal 3235 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 MR2~)hqd%bk4`NK|w*UYD literal 0 HcmV?d00001 diff --git a/tests/plotting/image_cache/tight_direction[True-xy].png b/tests/plotting/image_cache/tight_direction[True-xy].png new file mode 100644 index 0000000000000000000000000000000000000000..ec434cc7ce1367e7f0bcb307d9c49a9a41e43fe4 GIT binary patch literal 3297 zcmW+(dt6NE9}Z_~W|EYhk+O@KA-|c?Ws_^ENhhgPQ#y{Zn|E_bZ`u?}s5l7aQmdQj zhEj7n%x;dfxpbD?!WyQqOFk;fCApN`{m#38%=hzop6C00zR&x9-apRl3=N)RCAJrv znVDJ5_4f@kGaHnRe!{^#WBs7~fSK9Qs=2v%(iUEe7Un z1%v8mE})02$FA;*l~97t7k}xtfkF3l5r_*Jc}Iy^UcOnxin+mwwULaEVN=b@P$Z3U z_)ofU0kuyrtR%*fjopT(a4om2$bzXpkI$}$i$%A z)if!Qfk}TBfjm7rgXw510?U-hz;xs#0`B_b2$XL_Kwysya*q`wU@Ss$a%mQUa(iTu zTXh|Qgd!9tx8gAZ8hd1r>%*VDObFNR0h*VlXC53?Q{A!+vwTxQ&_e0b0LEzonJs5^ z`+z3N1U)H1ik7zG1z%!rG0^nt*yE{ zM^`bPyg8B$2sV_Bge?{v)o0Q>Qi7e;5$Tv^SQs5Ck}3`psUy_>vl;WTWcDVV)ocTZ zgzk16RbSPTjamK~PHz@T*Bl|vk5G5}Fn;_}H`YE2a4SvFmlC*z(g`AIP$1*yNV-Va ztD6D06y}LIN@P-wp#%((SCiPQ z2LU(Lq)ev-HZVfS4Q7=Yz&L|d?f}NgtTGE2omk}_V4TP*bAVCCDszExG^;ECMk%W- z0>URRI8>`<1w3Ar%!op0Tbz$LdpjEOk8)y|Q+y}HjurMEJ z?O3=UXl+?|5NL<8K8A@~bT$-jW6E5OW!U-`WpYC4YON|mL9RJU3=J}L`!jYWz_?B4D(0e=!zL2Tx>qHU+p3qB5xW8nh50(y z8C;YS;={14E2hjKp>#x*7@h4bTJU=l)Ei+~M2&E8r#ptyV*I;xE#1~@p&k#?*Xf4EdVl)o%a*Uo1@p_D& z1aTuqkAwJAjFv!LfYBm|e~-~=5O>GuM2OGB=;aV!hS55Rr($$4#PcxP2jUDyPl0$7 zM)RQ`VDt|V@5g9ch+AT`ImG1{y$<3tF?uD$!!a5_JQkzpLwpNH`$PNyMteZK7NcDt z-i*--h<9ML9TZRz<}5Y5Mph*`C@1T~RntNYe^e5y#&K5*bexjP`yWeXiHJQWajSy7 zr&W=A!DE~OL#R9(mf9^MoJ`^gwl(T1NziP=#iNAFc+P&mj_bo>gP_38rp8z$xfWo! zSWevB40d}nWe%Kukxmm$xld%N6k+QsllX~(9HLbfmI5mcGgibsE7ob0REsl9ZN=z0 zP!J;`7MsMsji`yNlJsc|x58E3JHhx$;^r7GU@lX(fXdsY(>%mfRxCA0NDPL8^TTUW zswG4H3{MUbE(-2hFarS9lB45ZVYDSnX@#xVOyY|&vR13I%K_KD8SoS3K8dA_qSpB) zapG8VU$tbZk6}Wn>hg9F=gW*$QLGb7-50k0V-o+UAY*x9A7Cnp>`C0mVJvk})LO?2 zj^smLCsQ3wUcuJ@QxxJ`enNZ;f%w)?#NP?vtMaBV zU!R4h^Hr}+;VTSVjrj05#D_;CJ{LEPhyl-6%{_NszBtWa zF7t=5H9ByNvy)R~>h*U!PAz*_99TN~%jepVKPOcXp})^t5Z0e%Zoe<~6-!vaA5a)hEXKs-4r_pO@)0Gx-L| zqLU>aDeZmL;coM)C6mV&6ug`>Y|OO8_l-evC}2i)iJs>aly2;N?AW!C-=*pB_$BT^ z@_COAD2TInBnx`(+S??YY_8F1YW=3!mUst^`H$V*k8U3g z`T1OIZ$tcHd=q!Nne5 zFQq0c?hg$uUCQZ5@>I{9frFl_pA^?E{`9`P{CV<&Q%`R-SB^TJcBd`w-{Tuz{=N6h zx^G`gJwLC~e=+Nyo5Vb-JP_aTMo%wJ@2{whzA<|G##MJp4kY!~KfTEfOc)kfw>sJP z^E2Zdd3){b?U5-@_Rn85Sh-J4T3DY>ebxAH*Q`>Hl+P6-OAaKy8u&N)$Uj3u>vH1% zY~aj-;@iN3Z+%OOqg%ve;2FmCz4QbEq({6mSp?(a$%~md1+fJ2yY)xbN=z1_$cO^uJqfg z*})&PXYs9liUj_Fb%$K#2X4|!`GKn_q5C<_*1XoVDVG{huZvA>P#_o_OJ}_=|0W8gsu|3#dc(;{zS#{9hNdxp=Ve IF&{wvANan{Y5)KL literal 0 HcmV?d00001 diff --git a/tests/plotting/image_cache/tight_direction[True-xz].png b/tests/plotting/image_cache/tight_direction[True-xz].png new file mode 100644 index 0000000000000000000000000000000000000000..f4929b2a7de64464e639074c21b6674ce4c3e5da GIT binary patch literal 3311 zcmW-kdsIy88^@CwCUasgwdLNGE<2J*Na;3}N`x{K@}AU~Dfi0dcc|=gRFf1+HmMwn z+A`VFiNfZTRJ+;}lS^^jj-w>Pi73DQ`eUB8KF|02e4qE7*=yF?Y0H9q4aZCzqo=25 zxY*Boxt`vLEcoH+vz>8WMJM$1ez~&P+hgUflf7L{7uSYNx%pw;#Z?ZT8RJYTQM`GP z{j%fd7M70OZF1Y&%4hwqGY36W>x(SMW(@OFoU1au^NTEY2mVr@vTF57r9PfoV^(Qt ztZ%tyblvjJeJ@V#)jjF?{57z}Ejeds(q2+`-R1RW^*n)|lkCy8zLw58dd-nG<`Vw7 zTiS|ow0>h%+;@L6>6U%|7b%%^*#5%Ta=CkjZj_ybZ+(9OHHOwtznq})B$N6#nh1 zA(cHG0-kC(l;@AZp(B1`*xPd#V|^KD6!guu8XKxa9Pm$YVf}1>*b`=JXM38w#n6X>Zn(oMiU;%jPC@wCgusPC^P!>HA{GW6 ze+7daPME_(G#4I)zSTBA^NJhCz`Tm*P}*4d7nFKzByiQ@MnhJ5?;#z{UT2=i8+eN0 zi$8BA3=V*~>2Rp4%!YNhRW(AGQZ@@hnJwJDw$uqiK{|x|^DYpMbVKM;nn5_=^K(Wy z1H#o}2uot@A(W4Twu8}gAe>e}pjGoB_%g^40NNF$k9NJPK#RSf(u?` zVIWq?3i<}R-z9v13)u+)#K zG!|?S8i8|P2#HS;zK^-=k2cgK861?7rt_(Z*$R&^%xNZ#rEp^6aPE1Y&Pc*PEFjX9 z2pXg*{zI-YrSPK)%A6AujdPO?LPz1;+q}@JICms3bS}>QC?ZZu`2U#8j;oO7AWeTe znwJfXJxG9HA!BIF-XPRN!k;@s7R8_sQh>292`sP>a~g{`2rZKEgQm+~X;GP%CcRj` z)ts`;S5VuqkP$Sto>Mj!=bFik8B{>vN+e%QG%68SF)^q_x|LW_xFC9+9O=#+?|m>8u(E{KS^DrAX>P^gez zA(5*>4ho5S6=E+W{!<~efSAep1w=UO7Z90Bq*6>=S0W)|;++!tEFz|=kQ@;aq(YoT zM1l&rFC@xUNW74EqC$*?s6-vjLxi~0ilZJ-BCo{glM=a6kmidXeL51W3&W)q9Cf@B zi4vhYR`An2$WjDPq$1|v(qN9-o}Cb&SBm9Eo|?QgMX){<5sFK9V0Duv>Kcyvs}h-D zfW)?=+lA=wZRjNdI!cQc&yf96A`cAI$Wj%vt*D4#ye^WX=19~k9->krVgY)XLF=c> z&YY2F_-p(ENs~h$`;=m~h>9@6>r6Q63MF#a0I|@bS`k`*R&Hr2%LpRyW7Py2o3Dh*WlO{fz1~1aYUDM!0<{bmsM-;QiQ|5E%h#itv;{^TVwnwPA2 zWhHZ%MmPFtz-By04JZMgvma3IxRWb|J(I*lU|c>!*cc$FKRMk(mX)Mf!k)vB#*=`D zBknYp!j4K}R$|;Vm2MY@uWcu?c}RvQS#K(HKxqFU4e-Wuasl=}mI@(c0Z?wQY}OYj^u5wwB)80Q>iUg?-&>*w=-? ze#cU_hP5qb>qN$jt&f;JY{j)ZV84AUd8M~&;CAPnzgFEC%;_l~8m{Q+2>-3Or0P4` zx3Dc~$jpmT>Lr)xnqhlB@6RLnPI$w&t=~HScd7SvvJW zW$Ychi#7lIF?6HVb*$uct-@GHr2hHxuzF|T^{r7qE4mfuObyG)D;6;gwL&2Ss8 z?MrxlXxzdthZ4Wf89>|cTs*{Ev-!{As}{cDH+~E+dO4Nz=w2Y%KRTxMR6y&Z#EyL< zN6(s<*dbl_Apf_?$`zC7uohSMJ#PZmWu%r}9QN^^?DoAN`M{}0SK(z<-*uOm#EzoW z0Zr1~m0iR_-&^c;`qov?Z@N$v8&Y5x>w5dqlxN$FUj}a>`xnKHE?%V~9XUN;er-E1 za4fBmPrxd7KJAT}nS_?c+rn)v^Ivzy4otZ=tH$9OxQRAy z32g+fga58SFmBrQ{`4k`h`uM2a*r*F8|WG+FE8I*{l2ZptEs8!b;58bo3?gm@4&Rg z?`b8&gB>Z!Bj(uFu{wS7^SWjAmf9iO`RU21XHBzi^gmb6 zde>RGzV%d7%YvTfZwVi-rK}hcYf~*xEBMv5zoFpit``TJW?p-F>bKDFJ#WrF96xp8 zr+d=zd!ON35*>l9mM@n@b83 z{;9ZA;O8Q8a6eA_PaxWZTzY*MUH!Tx@!L0-zM7Ap%gRs2^!8l5F;zIu?bFslO4!wEVKdim!9( z*wYhR@a^rUs;&>Z)mvP@w0Q*t1gu&!T>0?WmZ#T;8nP{X4-GrtU+6B9I@z_(%6zx3 z+RpsHch|NJt{yqksNd!6lep1WLL1xyG)c#gwh_|g%1fW#CWXB2+WvWW)tcJBFYHT; z+M>I;L1q`wTK}*hdnKweF=&uA&K)pe$~`sc+|rUUwun&y0<$wWeZG{gJcmHaeGN8O6enxQS755yBA4| zP}6-X+)Cy?Q7mDP6Is7G7mTnu_=q)$CS8(E;OA%RII#W5?tqKqGM~nNgG=)9j{`oFD0wk)P{}! zu>)C8GuZ4x9tjVyeB(pbH0BcgZ?SHg4uyG>oLE70;V~5Aw?m-=hmZedF}uk9O{Oy| fkC_~!`=M8tp|_whx}}GGkJP*dNVz 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 SiNb$yEF#0#gnb(d;Qs*F-T9pW literal 0 HcmV?d00001 diff --git a/tests/plotting/image_cache/tight_direction[True-yz].png b/tests/plotting/image_cache/tight_direction[True-yz].png new file mode 100644 index 0000000000000000000000000000000000000000..bcfca06cdf560cc25497bb7fb7089f30d2b719b1 GIT binary patch literal 3258 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 CN43lV literal 0 HcmV?d00001 diff --git a/tests/plotting/image_cache/tight_direction[True-zx].png b/tests/plotting/image_cache/tight_direction[True-zx].png new file mode 100644 index 0000000000000000000000000000000000000000..61193e19a8fb2d090cb9a2959a5930a8a6754720 GIT binary patch literal 3248 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 literal 0 HcmV?d00001 diff --git a/tests/plotting/image_cache/tight_direction[True-zy].png b/tests/plotting/image_cache/tight_direction[True-zy].png new file mode 100644 index 0000000000000000000000000000000000000000..b2fa5323a7f4a0ce949d4d0b21518c259807bf78 GIT binary patch literal 3311 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 literal 0 HcmV?d00001 diff --git a/tests/plotting/image_cache/tight_multiple_objects.png b/tests/plotting/image_cache/tight_multiple_objects.png new file mode 100644 index 0000000000000000000000000000000000000000..984b90edb51532f51085ce1c85d0d0e25e202b5d GIT binary patch literal 10119 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 T+cIMo*kQpG)gk5bmLLBI*3jiI literal 0 HcmV?d00001 diff --git a/tests/plotting/image_cache/view_xyz[False-xy].png b/tests/plotting/image_cache/view_xyz[False-xy].png new file mode 100644 index 0000000000000000000000000000000000000000..584a400079c03eee08b77901db286f7da93ac008 GIT binary patch literal 3364 zcmds4`B&5U7Do+`7Aq8Nb?Q^F3JNJI3OFvHC>23KXlaa*8RCKiVNqw~sW@%{87(3* ziZWJ_wbCULgpA@IMo^gRZ&d%pL3@A=%%{oI`7 zXh^Uhk1OJunVIqYSNqD$%*LD;eZaBoiFJLh%FJwho4>D5*zR-f^%+qX&G@lX2h7ZZ zI6|8gY|KXR|9`9cy~NsV=f`Iyw<89lUuRd2NRB6-KF$#Wy?!dE_7@A@_*jS$o2pfN zt_2>Y0|@gy_+z#IVUr6-cr5;sXAmmaRqQ{M30S2VcBq^(2jUYBVLlOwk7^?WiWRn! zmb*1^XTyBRUooEz@2*74rjDkV@~7L{Ga5DQPrcbSrp{fXMje^F;OQ^iqyIoNuSBmV zq&)6}+DMnZSFSCmW(WMnW{6}n@YlJrR?Mg+y~)C;>sHa+-bu-Z!?1* zxz!PwC!x4 zH+nGmJ@p~AMX{oDU9vxwGwBuCKOL#@pj*>0pNj_VTEe_ORF};W?(`-5XCbav#amox zQ8LE7oL{8isZwSl^NPpg3TuW~RAi(8tF47_lAR>$D4OO&<#^GeqnJlz?HwuZF^wTS zFY6VKqaigbPSaW?=Cc6L9K#S61{Z6>TotN|1%)wx`^7=@8#TUaoWh6T0~?L~M8 zC`^#+LV#4IM&V9KNrQ_6Qi;bEE1mLqhO=~i%rm7%&HIl{^}lj{~Q zH*5!~t#_Zvhzpc4ibafAL~FA!z7jPCQAbvi+F1yY3xlR>v7*cQunxb)aw9dvD_t1z zHoQ_qNUIFWH5_5N3~~a6>t&E>2GZz9X04#+{7^fORpzCxpp~|gt~@w)HFZA)E%}BK zTjSDkgw(>I+zOUjr9Lhav~z@;L!hlpC4&YKhAT?VfV0G4C0PhT-TGG(R9!#D+ zF0}^Q#Hy4z8pXwM{%|nWau$6&g~^lS(hERpN0GqGPO>-;?paH<5U3l-1UwMDJ!eqn zg2HZAg3sOc?A-Z~lTTxA5WQ(TQ5k4Zx`D!WjbH{}g36$(8Hgt@u1Jt?D-p?c%yakf zRaDd}^8P{W@j*1hlG(HXmwE!JJdI!xU!s;n^W}S~Sdm($D=8PB3)@Q}7tjnxW)p#C zKum)SmsSC(9tPzNj!)I8uQ20YX%U>P*haCF&41<|I0Nwrg$O%6UL@$`z*7xMF$kL*lrj+h zU{DfaB0cKK!v!ax3La~_6bUN%`V|_1qpjXnBRFiUZzvKp+3GJB38Z#{C5QvN zrx6M|pRP%nnNf?Q5*3V~KT8-@B4DhpPyP=!+~7hZ~+$AEB^fjh?$VFi}u zfUp8X(y=B#65}$}$53Xcz#O`x_95}e+L{n4Q+*y~wgQkfZq5T?3j_BoU(X86-3iH; zK~edqv8LTDGc__-rusNqQmxKi#E6nmCJ>0(j+>X->NjcxfB8@r1@Jt3Mx;cUms-%& z$KoO8gz@zm8bR%I_cAf!C5Kv$W1s!W964c}LKBxb@G=88(E;%afm-~&GNQ!V9N7K6 zk|Mj3JZ95`HwWIu`kj!ep-{^OEWwAwYzU8qG?6=Tn*LQWXyjUi?WRWM%&0e75FQXs zFdS2$fm=nzeH;fAu;&YzJs`XWmu{{zEMoALWL9vtMaYlT;#clP0$o|O#L-f>23J6F z)k@4G2TrI_4{}Uf4cd^di5XbjYEqdKRB5CCz`ljzTvS+4F3i6#k5lqY;cRWy>7E(f z38s$*JhtwxJCWc_i_R^5d=4XXVXs=J_cIZlK`XEGwFjWW0=WCvSt-*I+<4s6EpL93 zaT8l;ZM0pv^8zGDV|0lVCo7W_JIKbPIXDmYpr1Ge$Ra5&ndupNqn}U&unw+ZvOet+ zxY-n-dP9s&@=zqB(RQ&pXR*lj&>jMAWxK|PWkr}Xq8o4>;N|Rv3_T6V#^y;ab#3g` zW4bbIs3bb8n00>R;)+b7HJP416CEvL{y-nt-OZFzy&d%feecqj^*-ASLD0h2KX>bj zZ}m5%&fVYt;bQ6Fh8VmsC?rclBnIMCY(s<@A+`*$@NdSmh}1@{Fxo6Dcf$i74{g{ zMWpSsafm1f+SID}#R;tj>t%!UMz6%J4=)>MwrO%RudV0MhG6@vk*Crv8mgP1>37tt zK+~ip!4dT40mYKv50t#?`RBrfyB-zWdx}Sfy35-FP&zg_KhnX+r|&&Eu!_Z}SVezfiR<-+EZV>efe5w?ik zUz^TE92olC-TY|o+_?+)H2%Rt93J>&zo#+d)RP5|mX^l7_`R^OkoAB0S%w9!2in?- zZ-37&1nKLz{^?a>8|joj*xy#{cl=-FZI`ZRvyFJc(p!_ea@kOi{B<)>#kNfr@a6S^ zk&gQ75qp|4*_D!hV`O+>*>K;xan?(zva+3BjSs$0w`_D^OL$iD?#`icpKf$NJQK11 z`JiS>{MEPBQ1M{l`@|0)pO=o-*`S1`?eBZL ze=TPVcJB7Ki5)c^r=A!sM?41o#_dQONinaf`IhO&Ha@kqy1sSy_K`>LtwM_Vw``{^ z`S+VI7arLU|8V`6N0$l~jI41UYJWYvE2`*taq{xX?*^X?Rje^JG)#%Je>u|q;K1OA sxnAc$@Xp8@F!?Ps{eS$mUo|pj(x&|%tsLhm*}oq%e`&Dqr4<+#oOw?4kWjg>l$%+OuC@`lyA7vDIvf zvxF+sr}daT$LVEVJ&qkGrd?>9vea19PSwE@eNu28X;lSm_dtvM4m(Se3XCqk|C``d8O$~F7aMi9bxc* z3%p&2i-g8o{jf0;T;y(C>Pq8fu-ebGo<}T@Ns~jR;g!&8tj39nJ$^iA9qH0Spq0>ipxTa!DoE=I*~@ALmd5jv5oQh57j*Bi zHMF-4%q@v(;u2yRziGoY&OlScu`Kgi_m8uS{jeGf1{=|Ce<74_i@)Ri$7EWa#GII# z^W|g^g{;k)6$jv)QXXM0elx_y9*WsL$Di3H?gi%m4Shrm5aQ$9Eu5BZH^5XjxR}l^yhM0_M27NK(R5Te8D_~&|iM4>? zR?vt{dUcc0P-QJ5z8If(8UBSul2w!}3*oQ>A2O;9#4VxcG5kR;VJ72e$OO>Oo7i_m zxa7s>T~#6~f2!gVA`w#+1&GRrs>nkmzEnjHqVl6E&LNTjs$yL!UA5ihbLoj@g^2+!^Odv z%7(GDq+>6jyi7zCNTrI&@GCITx{t&gY%UhVoMmdV^m2;Qk+B5m7jBH=2&OC&%I|6O zlS<(1wPaoyY!pCtB%|vux2J5o8R>-Q6tWv!oh6?ul(%Z}DH&hP1ILTu>{Vn(0lHp` zRv0o0027C?ZEbSG5NL|NKVK-n1IRzg_;a=SY#Z+3f&3CUdJzQrQl>@74QD1Q8dHV{ z<78Ize*7L z=ErwfLAu_QDTWA)7{vihc}yrz)aKuB1rL7@=>}1KazvoXgrAe&TZ)ZYpVv!i1#_*T z^feT84iVTgQFAe6hfsb(n?F~^m-E2UW{__IMVG>R1?nsy4tsd=Yz%)d4_wv;))|7M zZJ>(*m{tt$TLfi$Qyu4#^;{;(k;Y#s9PAmKj!r?=&u5~XF!5=je1SIqL@Rh%o8Qw4 zT50jcZ6KRpb`Zq|?CPKnHe)*5Cs+Y51w9MMJ%u{7r2!Lr5#gnyHEYS#H5C2>bo}ui zD*UdE5mA^QZxhkP#O5NrJhaA#Obw*i4m*AY9^`_t#c&1}v@L;`a*55gHo8{|QIV_K z0tziJL~H!WiVRe;maND^*+Wxt9+j{&xu|LlS&@%Qd`MKF4o(g)Q1woS-pB$ATA__g zX3+{`Trz`JEW(WokrqBPJCKwGiI~`TiePdaxmn_`5>|^aajDSGl2&ZSjWdxJA(JL1 zWrZlm5-Nrxwc5Kj8QrpwQQ-ygT+rEGHXZOgYsU5>LPyA?4*?yk80if_XMZug%>eAk zM~!_+7lFF@GM9;sz3D|Fxhyz^(B{JG`4}gmjquju?^D1(aKS!*>ZT!>w<@2Bea%Kw zw@m$O?y>@v7LC=$NPomQ@@4`AbogcPOG6O4h-R!MktMjuipI9(G!s5n^MJTHR`WUn zwVBvt#LGh%2Vk6r7NSI(|G|&a`~hlS&X{E)UQ@z23rw`o$q_3%%ismtQjINXHJ(%*m&l6$t*Q)8Fdzqc#RVJPPzWZ(?3;&?X(Y@%!ZB~0~8=Py<_xG>p>P& z;7?O)o`AH%HY1c!quTtj>QQGkN&H{}-+S=UeEX3UnXCa?YLMcVJ?2?LKSH!Mt?h#acX=waFG+(v$@-TQh= z($}#kIy2I8J)nP7xjNAyt4T*EC;j=(yYA~b5d?A3dH0LL16_xP8$O~QqwO1a z9vxGK>ASu2^nX)%=fb2ff=7pw-O{w$Ul%2Pdvm48-2KQzUrXsMee)wM z|KpKYx4RQJMnp7@wQnpsGWxJ!N8OuGuZyOhpIYbx*=DWh(f&)e@7U3G=yjp~$`8$U z*YAuD-tOLi=+&S3%e#}NzOMZEgt~QWT>Vp#UW2zqeF!!-R6lI)cJN(_zWc$+!P~Cx zdsLFJ1TMVF>fMVq%7M3d+_e=4 zhMpYgKKgghDYn|r-(IU9I$^S9g3Y-7@4xNq`V^DHjY)mRGu1txzDwMgq#O71*xivv zv()PB1^izx0XkZXA=3O)%N^ri>|Q4^D~=8{Kl%5U4l;a5TOx*S#(7dgHtask$VLcK?f8;a6}NqQoix~PwWr-L-KrH=Q-z<&pFRK z$vOYrD*MJ_p6xs%BO{AVf&QUJMsrSnzSzc0i&aliF4NB2_RbHtLOYF=~Tr?i)rF6-_cD3^^Kc=Rms%HAulD6#2i`?>^0Vr5oCMRs;J zi%X3@{le(ra!ABSO^z=89|(01yhKfgu~%y!&mMl!U$91IJig~~LxXhmZ`0$s*PnUJ zWYy7A_F?8P%H5!^O1fxl$u6!WpOPLBMq~dHr$%w)LzRlQF!QnU4Uj4Y3EH-rA2dKo zFAAd3qm*dKO5V_dt6WSQqaC2K%+Klbn_VesiSTpU+``1wM5Pnhqy^cSx^{Fj9Rt!Z zj=cP`g6EhyRL#f3_L7&%`0gqJR95nNFdDTEDjPw9PP+LjJ)lh_61rNtZ8vcmu?WyU z2qZ#V@scwBpIkgzp!weV9+x%jgt-fBe%ORgti{~DZ7zCJ*l&uiP5dYG@s&z>YFK92 zK4!4HNE^NkdeVw#IO2OycQw)>)|M}YJe%?GGRPmTUQ0(EJ(?X%c(mY185F|OxY92? zY#K{m!prFhe;1)Kg=HZv`9~*Y#LG(x&`*1IDWq-&&zA1sbmk|foP1<3C`acPO3>;h zH2Tg=_d=kK)DJZ6-k-${9-yXQ-T8h{z_}Op3lUJLaI>X`QW0uBOJk3jEaT$Olz@2< zG5wpu?ecV*`?%yei!S!ewRm6d1O3?s@-tuyUlL}c?h9!2nVBv{z?ohS-E9R2Pr(*4 z@;oJZz5`?H9^_iI2{;KY{)DtpL2RUKvk>YuD>@7_Y2@NnDgfLtN?v?EJS4UMS!Q z&E)2o$tJ?M1?1v^0`)yJxf>>FWVwDxmuIW%?c5jQ8K38%7BVVI30PR;cLZu3TONZ+ zwy|6{(#3Y@_Alt-`72E|C)D+3*!H=(79;~uxC-dt;pIvomWOvM0UI7ZPX$z4;~pwt zyEPuA0wx%?w(k*cX~Q#Ognu+EiS8mryFW2hstEHVutG(Rl?p%NjH-Rg6mr zej2j!q2&1rYWkmax>yA?^1yo+72qa|fsqjKQ+S%~{)f?YO%R38p;hQ1}cw%$IQ+W}GzZgkXfcz!P8E+N>#WcO02T}0Y0 zg~EKv@Fmcb{ULmrCmj{XIJqok#2Gkb5nX;B4q3`D3x_z-<)`70m2`O)9I}=!&xGj+ zvdFkvsG%7r#Yv11qY?%TOH|@2&={iD6FGTQUs6OLHx4IRq|+- zIzT1&MP{oMXhzNcFX@CD6}7&7TeTIbqw^Q)od8 ze%cJ!(uzlz0Wo5-!4V?dX_u35EMq2UDb~@Bq`?%(2uljJQ_456I1F6JxF7?UbP3d) zjYK*@ZvR-5+wq8T6B|jU21N=r^HGxnZTJor2Pjf7c!7Z=gBP)$w#|X5P(kz-)TGg+ zNO3$y$kr{65fb^1+VaDW`KDh$$ZV+KzisDO!Wygt5B04n(^=0K<1A}k?qM$u?~=3ck1)VvyPCP z3mu*gQ=Nk7U1)Vias?h^IG4yRZpF2Fhe@NVpStkg+6mp%8SbO5UVAU*uQqVOflm$f z9@IK!u2ku2F!f-ho9D^P(hl>2Wn;M7Zq!v=q1Z-T$@hQ<*_7Xrv9~7cJ}^;=*_71 zTCMD5iGqQ2!}^TlTgVk`pfR*ctkNB4sm1a6Z%!dQouJI$#W8=wsvm}bp$(}T`J)4O zS+^*U0iEoO%OhE8{^12r+T$5<8S~1hehN~>F2}?0F2oF&(2T`irI8!Uk48JlW8%o6 zo6ZO8(P)R;vTJdVtikgo`o|A1Va#F{7+Xb*2sRUibGux1fh3EQzGiIrM-FWb@|&9H zRt@DwUYR5P_ZID*7YsVV2>V-{t8{WSmo4)iuJe9Ni z!pG_1%J(vp15YJ_?&MW?D1b)J>S+I7--1; zhka6fZ0y9DVDE=smRm17ps|fBufOTJIeFhcxi%A2f6}M+TJh^|u&hzI!(X&%25losFym8;Bk?TIQ z`uDwu-_zaQ-50zPzf62nRl97CwxLdE)Eshwr_24us`i(5jlEle-o9s!M*|o4F?>36 zuDvDDqNI;$vCr#|E&MM2dC9r& zY7!=frl%9`mkNc#52HPa_w5e7>8>6wE4`5L_SU5LR9~9-73*rFJ)Y$~tvqsM=E13D z1xG$~MOWU^y(@4=F_{*35D* z%i6gA@y$(4(Fy)i@M}p+o?}vt%QAIDXLb<3^Y`fe%Lb&gR{=t3bDVX@e0+DemCv9l@FiGxy&O07%ja4MT? zvDeWQ(>>1UD9K4>S0$2jx=13_5f$HY{)zA7@%>>Q?|IDo{ds@h@7Mb|pLxu&h_FBt zL$;xgj*iLdApb}mohc_KFUC~*iD_qmU>%1Ym3$l0wWUY0``OW+rV$&n6fQ@E9+UmpF_A?dy+~wqqSW<309kK;x`$p#@ zp>R$XUo)Q*dUEuax3vRl11sJxdpn|f@ut~JTawl_>{9*HrcE|e{E5XQIyxH+SY}6% zDVrGo|K?6r$26T4o+*8=dNb{Icnx-*X-&y|cM9=E#0l*^jkCkEm)%^74%dWvlEIj+xM@dg08dN16C_V7b2v|wwM9ql;hNH1FTAzA zTI)oWI|=B#9^wKZ>ndB+8t`Wu9n5!=%JvAW=yD9t^VW%O(n%Xbq}QcNNDyPrp<>qkY#*MY&<0@K;P&XbWP3j19w=>E z5{ILmq99DLBE|4-wHCkxrU}XeLLLXU5k(bf&~+H|fEVe5UpG@~dsD~M1fF<8xEcmM}>u_M_f2<5DCGNLerLa+eS78L103PAv-8}&mql=JVB z{wB2`3NTvES6MJv+rn`}8<;R5oiY*19u>@>djAOXldjSzi@lLO_lFKnMaXFZlr`u z#Geu#wu9Y*aa#*@!c|-KNujO->?SJ|l9yXg09kF(Q7R7umI+_g17tyRfi956kqfMV ztTBba9S~c1nlR-gWHJdu`F65RxfbJ+8s$oiTclA2W8A|UC4_MkG|E_vE6^ynW2A$p zNp}sMb8-OuoFr7ch$`1ZwG7JEi$pUKbE(jsOE5xlp&cyU&4pKz=n2F;@;-?s$!rW* z=HzcUXw80C=8k944Tc|_& z+>C?q(xG=@XX!jv24(vYJqLxZ)2ZNl%r9I4y1W^Z=HQQ28X5Pg=4!b{qUSzSy}XK{m3YuMhH?Sk=e8|`!1$n$1Lw(^ zIhJY{jUfQ)k(fPfBWJ2n5H?R{Yn0|yj2rPF+%0FW4Y{7e`b^X#FGHANII<2C03@~m0KG{p7XTNNSU&(dl9-~#LOt~Y zLu**64JK%m)fZbI79m?oA(z<{TPmcQ0dX{{OCM%5Va=XnZKP+Ftr$W~Xq+>Pj{JwwmaQ?o;|SA` zHO8*#pYj(UeACTKoQt_zk>#EVy+sJm7eDP&91yXa80!>8fNk+n3*7ZpfvDCw!AXK7 zgyZZo-fK&B06ame(V^ssbT_*KAFTNF`!v&zeIuP0ZVolIcu$;7W0kHS%^>4iie<&AyFw7r=<&M;w?mcKeC`x`}a1$FPpn_xO($;;L(Jv}-o* z>pna)sqd-lsHXdN=J9#n>7TW0Wck~#zpJdMsJPL8U7Wr1;NBtq_qRq~eEsM7j(I7s z^70?=Zdq|f{G_U(p`mO4#J(X#K|w+1jpVLf_vd>i^({^P)T2Ld@5e`h^Kup~Ji!}B zzK^}X5E2rS{37LTb<4`M=LuJCefcZPd;H7amu0o%WA7K%ecLrL{ylTLRr{44UGFc{ zt*n>(#EfPXM5c~(CbyJ$PrS@9U9e!mWNlXAxLVzjHgGF2cTUO&@=5K)_*Y*?AUMLG z_@}?~M%qY!SNhiv!!6ze>Akm2y*ucHiYVEO{S)7*fN6#&z2PS@X_M}W!MpP&hVC!S zG@aL<{;}iQ?jI}Y38WE^4qVziz3oAf=W#2~r0)8|bdQsDKP>ZmvLSiH-RdPBiGIN% zW#%I5nr15X+u+?DwWDuN#iYKYnGp(w*L#(!x#?fJbK`d09K2H<*E0U`wrNHfBj2uN z-p6&{e}avS_RpSJGi~SViRnhAcGT4RMoV?e+*5Bu}1&sxt~-?i5MKF?k|J2co& zU)M}mM@L6Lz~47qN9U&#lMizWtuc66TBM_+*Aw9D6|v`B-^=A$=UUC~44f)FY=8Ey z_Y~v#%}j@=(J721q=Iog<~n5ZU$G}IUJ6$C*YnrN2kO=Go{Xu zXQB6huynW%>3BXEzczCGi|Me($m_bgv`q7gNQ`kPt~!PqGf3@tKX1&C$K2#CUE**V z3?M8*9zAzaQm~B%(>!Xa2wUB*B%Fwoh}U^-T#Fp*$JbwyKGtx?suGmJ>jZS$T&7@SOrQ;{i@$)R>%qj=zNKufMdJ#c74rV#CIJHkJQvN;Z zyxUs}mxHr_oRk=0CG`=-8m3n(wxDD-van#8eh|Kr#c_xcrc!7SCNhs}>^w(0CRSRq zz=1A@*~6d-6LhOq=%B7=kR#;+ez+=*1?mh&OeIloVz5k*7_Q0yVx6^rEG5xk;(LkU zXvEfq-fBj0y#u&vyRSlD~I|zs8K~0tntiA7ssZyDohuloKm6(kG zF5d_LXbCyHlON9@nxm954P#shRe3Qvs|0w46(o2TgA~L1{sf|%(xyCFoI&HSlafj? z;$@9WrfRT0g~%3|R#OUoGvpQe;+L(UV;wPaVHVt);9CexyUPkwX_=gDUijcVh&TgB z2N8eK3|OqexRhf8#yG7IjRUd!lFU%UYEabYGEaj|uL0S{JhT!##N>#CDhSBgs}TK$ z@nw{wl}4LkU1y~bg<||fu|gE*t{*_i1q(^#DJ0B@6bBRXBQV>OkYljKi?BZrvwaBL zOD&-X!(&CSjW!zd8bK6S+CbBT@J4GWKL8icgQolAfi_V7N?g|#n$E`?ZJ|xiVwjau zxb@m3`=ThJ>MV<66RHYia$YM$%YmE@O6iF45mYowqdjX~H>waF0dh{DRU&dSohlOGeGX_-T~bjn&3Z zGFvJGABGU!>F}fb!SzcuWeF&MEs(Qa!Jco-TUriQ2NB(3_$h5LLHVXY&mwpI`QfT0 zH>(#GQ1vRjI~RFsOO^>Sek>)fVsZLHxqE4YC*GZj$hxw2tU&qkK+ZL}sJ+*PuClNg ze!5r_wG!n|06A;q>~uq3MFptGCkk`ng%+C2EzS%w3c~n8wAI61zlg~>CTF`D@@gu< z&E7;u2ApT0i83awxL5;(^0%V~1;rUVDRf6J)30?7ucjRA3LrXG;r9xVo%*EJ7Oa7d z^4|eD4=C{{eYO>BuLyIVyM7Pl=#ykt6Ol;xqkMZzXIP z@q}`@RRs5q@>hsH+lIX^N39`t7`Mzs4a?aKL$#xv9c`!{RInQi)pZKCjlu&m`N&&;90|fC<|MWg z;5wlUlZff+(Mb>#Y!2B_ju#$prodIkHT5App1=xnF?mkhU0aQLHqt94fC1+O$6H80MCWZz*4}1AF8h}q|7k)x6vr?2wd@l!^ z95m=L*sC2-nWK#5hH8$SJ>)~YlYvb|b?L2Nj7njz^STCLB_&RwJ9-Ftw+0u{-vePN*Y-r^oc!79B)WF7zSbrGWO}O=sVrC$%_nHi zNt!A~S#3)wWyIk0JVa0iMmJSNG20-Nowr0HAZjW=%X`8&v3}b!I#Y>doE3Yv`i!FW zuj=fbK#v(s;gm8r&2?}5dWGO&0I@)*N{TUwG*stP==MQh4RQ#mWRHN}DlqyOKun4MPaq_CTpc6%YH;H#h5%fmRIubGIQK z2iZ{jhP3%kPMrsaUpn3Vr>;2p)i-VI#j(K$PCf>V&2~A6EPuuL$lvGF#=qtH%~=D( z*LS?GYx-Nqti~_@wRHqpJ~q_yi@}`zV_(|S ze)L^^`}S>5)s0UBf6kq|*WSW!a`4NL{#25;@e>hj{w(=p*83I6(s~c$DK0Lag!J1N zZ*8)VHo1QBZSB=570#Z-s~h8O)yW~+8}Dm-;`=5pPTiR@5BRTn@hA^VeDg>4DZ7wQ z&#u_XcGHkfbQ=<$EI;MsmO473nAkV`GI`%jlNk_414l-_tlc+U>XVt&+cEGW;mLuo z&$evXKhV$>^jNz5$K6@+H^;s{KfNFlUbE)ImS6;01N0Qd-}?5w=c2*f75jTTE{**d zzWw>J`}6g?#z((NB$E0}gUKrUZ%?Ee_)JNE@W$?>Fi@pZ87%wf&aq!#jkK+e9~=4m zxL`rb$m`7h+Tm9X4GkXSBNuuG4$j`ZGgA`&ef0B_;r`CFuf5MgJjSZ;|DfUCZ8?A7 zYuEi#?;jWU>|J7Eat-LooSW+JaA4@EpMK{A?XltJo`H0O72Uh+Eu3iUokLR{WEr=Q zk9J=;{wlFOlFQ}#<<7p=f9uEfV!eAS7j$lXne;r))M@?bhsyJ3Z+`23dci?vcYgmO z+0fW<=f$e3q@}Y?WN%Ep(@zc1k^X#qu74tA>dv=={!C&%J(th0g_75ee9WD;;n9xQ zA6opLOBu{f2m6Wfgzo0MJqhtrX`c^=Gbc7?wuRpD!=5wh&ly*BZZ;ns&W&+ecHnz= zUEOW%TxQmt2^*m9AAjayOUQEu#`s??10KIF=~#8Rv3-F4`_T#D2m4leBiMfcuP9d=!<;4Lo_rr3%(83ELt;X;B+aiHxPOA!+t3n9&rC{tJwU{(IT^I zfoXQ-F(K30^6;p**Es91|@3S zxtW7JBRov_&3sp01j|E8X)`R%MvG8x>@g{st(#dC6Gv~X=2J{3@qK)Sv2Z*>FTCy| zR2X&`5XuqCHVDDw*G3U|`H7U~n3^&8>NlJJbM!(s8tV+hYv6|orX@4|C! z@tr6y59#5n>a0Qc4m{#4=#4h6q+$*oDhg5}RS*@@P{mT?Tv>o)@kWaD!&C>u;xtg6 z6&00etac-@Qlvp|?&fUR*^2-x_Bg})-)VZS!3+i$YDU@L8p0(K50z?%;r5=}n2 zwPSE<{|AdT6lyJAh-*qXdP3!zO2|cz9Lh#W4TfSR#!NNAmql|v)=k6Xslls-L`gZ7 zeW1q*e?}|4l}V?e4sCKshVWl96h0Vpz!*=9<|OzklWHOVXH~nG1u$ZtQrRMmSuU{w z?K%Lk0@n8-U=hl5pwJyGbqANtSpv?NZ~&oltOIcEi!0gcM7CY)a}g16WIaRSk1_We z;di-g#2%cC=G^sFN@;{_(lHAmkC^L*XUxmm##KPB7RdeYm0le{iI-AZ4Jj>2$D;^Y z%usxfF$)=rEf{kfLm|PK^J1L9!CkKYUAV9}u0*hz)b%6aOjuP36)>C(sad4dn~;>j z%xdTlf93N|Jfg|rQSe?;dg&V=N$6g(E*t4wMC$qzk~~;d191h)>)pUZYmnCgn0H1g zhb}oRsD}0_`&_ol$hsmVcpX_MMS@q6b$Lke3bL*M33eju3XxztvaT2jJ|)Z)4#>Xv&4t`;fqW43%RmO zv~-6nt7IsGF@ZPQvy8G?K*nH*kqmAOBv@x&!@T5gMbq6*{J1edTNZ!`Sg7g%CYWT% zJS3bf6JXk#a5xFC2qYYe;RYsE;! zWs}3(0%RWzY6)324-;51WY;8|auXow43w}@`RWAHX-!t`#{`=gGHZ$Y*cQ{BhPX#> z+^Zs_VJ#W88dDu($oSEmJBC1Z4FvcrZ+jBpVfbhc(x5@wSWuXZ%C-f!#kuPF6D2bE z=t+dWrZyf_ln@mdab*yTBkuqbZ9!9Sq9jmxv&rG^MxsX9w+J-#A$pI%!8TOXMpST` zD-)rDCa!D+D(K|O*g70}H{hzH=ES)k7ZR?#YqY~(m5?oIV@P=^bG-?3dyr8LIhz1< zk0Cl7>&8cT@p4^eY^W(P8Apn4-9svECiah^qoyEA0wlJLb0nV%$_&4}H+ zO!r1~Ekx~fWpTu`@Ut-xQw_~E0UXajjmE&x8Axml)XAZ7BOs;*Dl)>O<6Ofk)ktF# zjpY7$HNx{%N>G|=l#(n&?5ULGA_9Bx4*}t20$`y5g!xqmQ{1vQ?za#g6_W>dI#5#D z;RKSk7~}>JQAR*SEtJ9HNW#r%f|{4*%zB8cT`d^wcJ{+>fWPnwU3>7oJtqE+MB_0r zK%z9`on){t)IdyQ{A6#OBs3S{HPT>Q0&@fgpAMCB570fSvE_9D#t z;tX-O-ZrdS4m)b727E?pTFu#SX*nl#dyYX`@jvk*_V-30#Xky~8-w;uV7JF}d#4(txbSY3PNtJa-ohl=uUiCkCzLmTm8cU?v0HxOGl|+%ZSE^lwGrEin1Q(6*KO?b3kT!dA0C4nobwA0M5}Gd zC@6Ei0_U>n(Qid#Jb*}RU!WE3ITkO}swvLLYGP(C)~;qyf9aQ|Dy`g0y_A zRoxDu%IsXIRp!xjVt<&ORu*@f-gD#i=SAVE1kUsPwfJmr z7F8EVkUDI?Kkh>KbNX<;8PQ^@XoTp8Q9+2G&yfXg@z4Ky+?*Wh_aHKPcxY&-{^DaS z*@5-6zf&@H>*jLHfSj>*b&gFSXdhIuHtFLl{Z)_NkKVHK7`wfAq-AD0$11HP*&#QE zfU3iK*m#()^4j#&o8>KE#-5Uyo3_NOGPJZSlHWBwGSReiv;mjO3+;m*$KSI2{AoCO za_|Hl;q#-vHS8RpTZa3+&YZJ;_3o#Co(-*ioIKL}h|tJ#v;%)?FB2_op8Th@Nn5i` z?58|;ZEEOv*UMAs70HH`TjY#4SnN5s)TxhiJiZis(@e)07z!&))F-z+D0fTTT6})? zbH~A>hOp0kbo}-7%H)ZW{wwKEYCqr8n;G`pGN0o!GxemUY+!%u&7ka=#6`>U4|$rQ z%tO}Te=PtxD^HkjB4rhMxAXj(mWBF zHaXbsvFF~piAO0Ps5fukV@rcIlcUw&2f zd88$M%E!QJeOXA-ds6#U($HDDseZ{_nlbCehS=zY!$M*j_h)c(c* literal 0 HcmV?d00001 diff --git a/tests/plotting/image_cache/view_xyz[True-xy].png b/tests/plotting/image_cache/view_xyz[True-xy].png new file mode 100644 index 0000000000000000000000000000000000000000..c69194dde8f2a4151cf009fd7c0a7e606ad7fef0 GIT binary patch literal 3347 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 literal 0 HcmV?d00001 diff --git a/tests/plotting/image_cache/view_xyz[True-xz].png b/tests/plotting/image_cache/view_xyz[True-xz].png new file mode 100644 index 0000000000000000000000000000000000000000..3abde185f57a61f465cbe02483a56390ff928d7a GIT binary patch literal 3433 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 literal 0 HcmV?d00001 diff --git a/tests/plotting/image_cache/view_xyz[True-yx].png b/tests/plotting/image_cache/view_xyz[True-yx].png new file mode 100644 index 0000000000000000000000000000000000000000..27b687bae5964dcc480b5a6b37b762f499e0d90c GIT binary patch literal 3400 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 ABme*a literal 0 HcmV?d00001 diff --git a/tests/plotting/image_cache/view_xyz[True-yz].png b/tests/plotting/image_cache/view_xyz[True-yz].png new file mode 100644 index 0000000000000000000000000000000000000000..ed456fe47aa87582ef1a42a4da42e8a37033827e GIT binary patch literal 3326 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 JsPco+{{oB3&42&^ literal 0 HcmV?d00001 diff --git a/tests/plotting/image_cache/view_xyz[True-zx].png b/tests/plotting/image_cache/view_xyz[True-zx].png new file mode 100644 index 0000000000000000000000000000000000000000..4e7c391c6cb19d0fedb57ea1c499ca665ce0f69f GIT binary patch literal 3336 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 Q`ol2`6@&+#TP{Wa3s;rgW&i*H literal 0 HcmV?d00001 diff --git a/tests/plotting/image_cache/view_xyz[True-zy].png b/tests/plotting/image_cache/view_xyz[True-zy].png new file mode 100644 index 0000000000000000000000000000000000000000..191e4cd6f7a32c28291b056d6cf2c5e23be77d80 GIT binary patch literal 3416 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 literal 0 HcmV?d00001 diff --git a/tests/plotting/test_helpers.py b/tests/plotting/test_helpers.py new file mode 100644 index 0000000000..bf03d84368 --- /dev/null +++ b/tests/plotting/test_helpers.py @@ -0,0 +1,20 @@ +"""Tests for plotting helpers.""" + +import numpy as np +import pytest + +from pyvista.plotting.helpers import view_vectors + + +def test_view_vectors(): + views = ('xy', 'yx', 'xz', 'zx', 'yz', 'zy') + + for view in views: + vec, viewup = view_vectors(view) + assert isinstance(vec, np.ndarray) + assert np.array_equal(vec.shape, (3,)) + assert isinstance(viewup, np.ndarray) + assert np.array_equal(viewup.shape, (3,)) + + with pytest.raises(ValueError, match="Unexpected value for direction"): + view_vectors('invalid') diff --git a/tests/plotting/test_plotting.py b/tests/plotting/test_plotting.py index bd94019fab..5ecbdcdec1 100644 --- a/tests/plotting/test_plotting.py +++ b/tests/plotting/test_plotting.py @@ -4,6 +4,7 @@ See the image regression notes in doc/extras/developer_notes.rst """ +from functools import partial import inspect import io import os @@ -167,7 +168,12 @@ def get_cmd_opt(pytestconfig): glb_fail_extra_image_cache = pytestconfig.getoption('fail_extra_image_cache') -def verify_cache_image(plotter): +@pytest.fixture() +def test_name(request): + return request.node.name + + +def verify_cache_image(plotter, name=None): """Either store or validate an image. This is function should only be called within a pytest @@ -178,6 +184,11 @@ def verify_cache_image(plotter): Assign this only once for each test you'd like to validate the previous image of. This will not work with parameterized tests. + Parameters + ---------- + name : str, optional + Provide a test name to use for the filename to store. + Example Usage: plotter = pyvista.Plotter() plotter.add_mesh(sphere) @@ -192,18 +203,21 @@ def verify_cache_image(plotter): # since each test must contain a unique name, we can simply # use the function test to name the image - stack = inspect.stack() - for item in stack: - if item.function == 'check_gc': - return - if item.function[:5] == 'test_': - test_name = item.function - break + if name is None: + stack = inspect.stack() + for item in stack: + if item.function == 'check_gc': + return + if item.function[:5] == 'test_': + test_name = item.function + break + else: + raise RuntimeError( + 'Unable to identify calling test function. This function ' + 'should only be used within a pytest environment.' + ) else: - raise RuntimeError( - 'Unable to identify calling test function. This function ' - 'should only be used within a pytest environment.' - ) + test_name = name if test_name in HIGH_VARIANCE_TESTS: allowed_error = VER_IMAGE_REGRESSION_ERROR @@ -2945,6 +2959,29 @@ def test_tight_wide(): pl.show(before_close_callback=verify_cache_image) +@pytest.mark.parametrize('view', ['xy', 'yx', 'xz', 'zx', 'yz', 'zy']) +@pytest.mark.parametrize('negative', [False, True]) +def test_tight_direction(view, negative, colorful_tetrahedron, test_name): + """Test camera.tight() with various views like xy.""" + + pl = pyvista.Plotter() + pl.add_mesh(colorful_tetrahedron, scalars="colors", rgb=True, preference="cell") + pl.camera.tight(view=view, negative=negative) + pl.add_axes() + pl.show(before_close_callback=partial(verify_cache_image, name=test_name)) + + +def test_tight_multiple_objects(): + pl = pyvista.Plotter() + pl.add_mesh( + pyvista.Cone(center=(0.0, -2.0, 0.0), direction=(0.0, -1.0, 0.0), height=1.0, radius=1.0) + ) + pl.add_mesh(pyvista.Sphere(center=(0.0, 0.0, 0.0))) + pl.camera.tight() + pl.add_axes() + pl.show(before_close_callback=verify_cache_image) + + def test_backface_params(): mesh = pyvista.ParametricCatalanMinimal() @@ -3029,6 +3066,18 @@ def test_wireframe_color(sphere): ) +@pytest.mark.parametrize('direction', ['xy', 'yx', 'xz', 'zx', 'yz', 'zy']) +@pytest.mark.parametrize('negative', [False, True]) +def test_view_xyz(direction, negative, colorful_tetrahedron, test_name): + """Test various methods like view_xy.""" + + pl = pyvista.Plotter() + pl.add_mesh(colorful_tetrahedron, scalars="colors", rgb=True, preference="cell") + getattr(pl, f"view_{direction}")(negative=negative) + pl.add_axes() + pl.show(before_close_callback=partial(verify_cache_image, name=test_name)) + + @skip_windows def test_add_point_scalar_labels_fmt(): mesh = examples.load_uniform().slice()